Spade

Mini Shell

Directory:~$ /proc/self/root/home/lmsyaran/public_html/css/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ //proc/self/root/home/lmsyaran/public_html/css/com_fabrik.tar

controllers/cron.php000064400000007656151165346160010612 0ustar00<?php
/**
 * Cron Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Factory;
use Fabrik\Helpers\Html;
use Fabrik\Helpers\Worker;


/**
 * Cron Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.7
 */
class FabrikControllerCron extends BaseController
{
	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * View name
	 *
	 * @var string
	 */
	protected $viewName = null;

	/**
	 * Display the view
	 *
	 * @param   boolean          $cachable   If true, the view output will be
cached - NOTE not actually used to control caching!!!
	 * @param   array|boolean    $urlparams  An array of safe url parameters
and their variable types, for valid values see {@link
InputFilter::clean()}.
	 *
	 * @return  JController  A JController object to support chaining.
	 */
	public function display($cachable = false, $urlparams = false)
	{
		$document = Factory::getDocument();
		$viewName = $this->getViewName();
		$viewType = $document->getType();

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		// Push a model into the view
		if ($model = $this->getModel($viewName))
		{
			$view->setModel($model, true);
		}
		// Display the view
		$view->error = $this->getError();

		$input = Factory::getApplication()->input;
		$task = $input->getCmd('task');

		if (!strstr($task, '.'))
		{
			$task = 'display';
		}
		else
		{
			$task = explode('.', $task);
			$task = array_pop($task);
		}

		// F3 cache with raw view gives error
		if (!Worker::useCache())
		{
			$view->$task();
		}
		else
		{
			$post = $input->get('post');

			// Build unique cache id on url, post and user id
			$user = Factory::getUser();

			$uri = JURI::getInstance();
			$uri = $uri->toString(array('path', 'query'));
			$cacheId = serialize(array($uri, $post, $user->get('id'),
get_class($view), 'display', $this->cacheId));
			$cache = Factory::getCache('com_fabrik', 'view');
			$cache->get($view, 'display', $cacheId);
			Html::addToSessionCacheIds($cacheId);
		}
	}

	/**
	 * If loading via id then we want to get the view name and add the plugin
view and model paths
	 *
	 * @return   string  view name
	 */
	protected function getViewName()
	{
		if (!isset($this->viewName))
		{
			$app = Factory::getApplication();
			$input = $app->getInput();
			$item = FabTable::getInstance('Cron',
'FabrikTable');
			$item->load($input->getInt('id'));
			$this->viewName = $item->plugin;
			$this->addViewPath(JPATH_SITE . '/plugins/fabrik_cron/' .
$this->viewName . '/views');
			$this->addModelPath(JPATH_SITE . '/plugins/fabrik_cron/' .
$this->viewName . '/models');
			BaseDatabaseModel::addIncludePath(JPATH_SITE .
'/plugins/fabrik_cron/' . $this->viewName .
'/models');
		}

		return $this->viewName;
	}

	/**
	 * Override of j!'s getView
	 *
	 * Method to get a reference to the current view and load it if necessary.
	 *
	 * @param   string  $name    The view name. Optional, defaults to the
controller name.
	 * @param   string  $type    The view type. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for view. Optional.
	 *
	 * @return  object  Reference to the view or an error.
	 */
	public function getView($name = '', $type = '',
$prefix = '', $config = array())
	{
		$viewName = str_replace('FabrikControllerCron', '',
get_class($this));
		$viewName = $viewName == '' ? $this->getViewName() : $name;

		return parent::getView($viewName, $type, $prefix, $config);
	}
}
controllers/details.php000064400000032761151165346160011271
0ustar00<?php
/**
 * Fabrik Details Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Factory;
use \Joomla\Utilities\ArrayHelper;
use \Fabrik\Helpers\Html;
use \Fabrik\Helpers\Worker;

jimport('joomla.application.component.controller');

/**
 * Fabrik Details Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
class FabrikControllerDetails extends BaseController
{
	/**
	 * Is the view rendered from the J content plugin
	 *
	 * @var  bool
	 */
	public $isMambot = false;

	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered)
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * Display the view
	 *
	 * @param   boolean          $cachable   If true, the view output will be
cached - NOTE not actually used to control caching!!!
	 * @param   array|boolean    $urlparams  An array of safe url parameters
and their variable types, for valid values see {@link
InputFilter::clean()}.
	 *
	 * @return  JController  A JController object to support chaining.
	 */
	public function display($cachable = false, $urlparams = false)
	{
		$session = Factory::getSession();
		$document = Factory::getDocument();
		$app = Factory::getApplication();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$input = $app->getInput();
		$viewName = 'form';
		$modelName = 'form';

		$viewType = $document->getType();

		if ($viewType == 'pdf')
		{
			// In PDF view only shown the main component content.
			$input->set('tmpl', 'component');
		}

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		// Push a model into the view
		/** @var FabrikFEModelForm $model */
		$model = !isset($this->_model) ? $this->getModel($modelName,
'FabrikFEModel') : $this->_model;

		// If errors made when submitting from a J plugin they are stored in the
session lets get them back and insert them into the form model
		if (!empty($model->errors))
		{
			$context = 'com_' . $package . '.form.' .
$input->getInt('formid');
			$model->errors = $session->get($context . '.errors',
array());
			$session->clear($context . '.errors');
		}

		$view->setModel($model, true);
		$view->isMambot = $this->isMambot;

		// Get data as it will be needed for ACL when testing if current row is
editable.
		// $model->getData();

		// Display the view
		//$view->error = $this->getError();

		// $$$ hugh - added disable caching option, and no caching if not logged
in (unless we can come up with a unique cacheid for guests)
		// NOTE - can't use IP of client, as could be two users behind same
NAT'ing proxy / firewall.
		$listModel = $model->getListModel();
		$listParams = $listModel->getParams();

		$user = Factory::getUser();

		// don't cache for certain formats, or if used in social profile
(CB, JomSocial)
		if (!Worker::useCache($listModel)
			|| $input->get('fabrik_social_profile_hash', '')
!== ''
		)
		{
			$view->display();
		}
		else
		{
			$user = Factory::getUser();
			$uri = JURI::getInstance();
			$uri = $uri->toString(array('path', 'query'));
			$cacheId = serialize(array($uri, $input->post,
$user->get('id'), get_class($view), 'display',
$this->cacheId));
			$cache = Factory::getCache('com_' . $package,
'view');
			Html::addToSessionCacheIds($cacheId);
			$cache->get($view, 'display', $cacheId);
		}
	}

	/**
	 * Process the form
	 *
	 * @return  null
	 */
	public function process()
	{
		@set_time_limit(300);
		$app = Factory::getApplication();
		$session = Factory::getSession();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$input = $app->getInput();
		$document = Factory::getDocument();
		$viewName = $input->get('view', 'form');
		$viewType = $document->getType();
		$view = $this->getView($viewName, $viewType);

		/** @var FabrikFEModelForm $model */
		if ($model = $this->getModel('form',
'FabrikFEModel'))
		{
			$view->setModel($model, true);
		}

		$model->setId($input->getInt('formid', 0));

		$this->isMambot = $input->get('isMambot', 0);
		$model->getForm();
		$model->setRowId($input->get('rowid', '',
'string'));

		// Check for request forgeries
		$fbConfig = ComponentHelper::getParams('com_fabrik');

		if ($model->getParams()->get('spoof_check',
$fbConfig->get('spoofcheck_on_formsubmission', true)) == true)
		{
			Session::checkToken() or die('Invalid Token');
		}

		if ($input->getBool('fabrik_ignorevalidation', false) !=
true)
		{
			// Put in when saving page of form
			if (!$model->validate())
			{
				// If its in a module with ajax or in a package
				if ($input->getInt('packageId') !== 0)
				{
					$data = array('modified' =>
$model->modifiedValidationData);

					// Validating entire group when navigating form pages
					$data['errors'] = $model->errors;
					echo json_encode($data);

					return;
				}

				if ($this->isMambot)
				{
					// Store errors in session
					$context = 'com_' . $package . '.form.' .
$model->get('id') . '.';
					$session->set($context . 'errors', $model->errors);
					/**
					 * $$$ hugh - testing way of preserving form values after validation
fails with form plugin
					 * might as well use the 'savepage' mechanism, as it's
already there!
					 */
					$session->set($context . 'session.on', true);
					$this->savepage();
					$this->makeRedirect($model, '');
				}
				else
				{
					/**
					 * $$$ rob - http://fabrikar.com/forums/showthread.php?t=17962
					 * couldn't determine the exact set up that triggered this, but
we need to reset the rowid to -1
					 * if reshowing the form, otherwise it may not be editable, but rather
show as a detailed view
					 */
					if ($input->get('usekey', '') !== '')
					{
						$input->set('rowid', -1);
					}

					$view->display();
				}

				return;
			}
		}

		// Reset errors as validate() now returns ok validations as empty arrays
		$model->errors = array();
		$model->process();

		// Check if any plugin has created a new validation error
		if (!empty($model->errors))
		{
			FabrikWorker::getPluginManager()->runPlugins('onError',
$model);
			$view->display();

			return;
		}

		/**
		 * $$$ rob 31/01/2011
		 * Now redirect always occurs even with redirect thx message,
$this->setRedirect
		 * will look up any redirect url specified in the session by a plugin and
use that or
		 * fall back to the url defined in $this->makeRedirect()
		 */

		$listModel = $model->getListModel();
		$listModel->set('_table', null);

		$msg = $model->getSuccessMsg();

		if ($input->getInt('packageId') !== 0)
		{
			echo json_encode(array('msg' => $msg));

			return;
		}

		if ($input->get('format') == 'raw')
		{
			$input->set('view', 'list');
			$this->display();

			return;
		}
		else
		{
			$this->makeRedirect($model, $msg);
		}
	}

	/**
	 * Set the redirect url
	 *
	 * @param   string  $url   Default url
	 * @param   string  $msg   Optional message to apply on redirect
	 * @param   string  $type  Optional message type
	 *
	 * @return  null
	 */
	public function setRedirect($url, $msg = null, $type =
'message')
	{
		$session = Factory::getSession();
		$app = Factory::getApplication();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$formData = $session->get('com_' . $package .
'.form.data');
		$context = 'com_' . $package . '.form.' .
$formData['fabrik'] . '.redirect.';

		// If the redirect plug-in has set a url use that in preference to the
default url
		$sUrl = $session->get($context . 'url', array($url));

		if (!is_array($sUrl))
		{
			$sUrl = array($sUrl);
		}

		if (empty($sUrl))
		{
			$sUrl[] = $url;
		}

		$sMsg = $session->get($context . 'msg', array($msg));

		if (!is_array($sMsg))
		{
			$sMsg = array($sMsg);
		}

		if (empty($sMsg))
		{
			$sMsg[] = $msg;
		}

		$url = array_shift($sUrl);
		$msg = array_shift($sMsg);

		$app = Factory::getApplication();
		$q = $app->getMessageQueue();
		$found = false;

		foreach ($q as $m)
		{
			// Custom message already queued - unset default msg
			if ($m['type'] == 'message' &&
trim($m['message']) !== '')
			{
				$found = true;
				break;
			}
		}

		if ($found)
		{
			$msg = null;
		}

		$session->set($context . 'url', $sUrl);
		$session->set($context . 'msg', $sMsg);
		$showMsg = array_shift($session->get($context .
'showsystemmsg', array(true)));
		$msg = $showMsg ? $msg : null;
		parent::setRedirect($url, $msg, $type);
	}

	/**
	 * Generic function to redirect
	 *
	 * @param   object  &$model  Form model
	 * @param   string  $msg     Redirection message to show
	 *
	 * @return  null
	 */
	protected function makeRedirect(&$model, $msg = null)
	{
		$app = Factory::getApplication();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$input = $app->getInput();
		$formId = $input->getInt('formid');
		$listId = $input->getInt('listid');
		$rowId = $input->getString('rowid');

		if (is_null($msg))
		{
			$msg = Text::_('COM_FABRIK_RECORD_ADDED_UPDATED');
		}

		if ($app->isClient('administrator'))
		{
			// Admin links use com_fabrik over package option
			if (array_key_exists('apply', $model->formData))
			{
				$url =
'index.php?option=com_fabrik&c=form&task=form&formid='
. $formId . '&listid=' . $listId . '&rowid=' .
$rowId;
			}
			else
			{
				$url =
'index.php?option=com_fabrik&c=table&task=viewTable&cid[]='
. $model->getTable()->id;
			}

			$this->setRedirect($url, $msg);
		}
		else
		{
			if (array_key_exists('apply', $model->formData))
			{
				$url = 'index.php?option=com_' . $package .
'&c=form&view=form&formid=' . $formId .
'&rowid=' . $rowId . '&listid=' . $listId;
			}
			else
			{
				if ($this->isMambot)
				{
					// Return to the same page
					$url = filter_var(ArrayHelper::getValue($_SERVER,
'HTTP_REFERER', 'index.php'), FILTER_SANITIZE_URL);
				}
				else
				{
					// Return to the page that called the form
					$url = urldecode($input->post->get('fabrik_referrer',
'index.php', 'string'));
				}

				$itemId = FabrikWorker::itemId();

				if ($url == '')
				{
					$url = 'index.php?option=com_' . $package .
'&Itemid=' . $itemId;
				}
			}

			$config = Factory::getApplication()->getConfig();

			if ($config->get('sef'))
			{
				$url = Route::_($url);
			}

			$this->setRedirect($url, $msg);
		}
	}

	/**
	 * Validate via ajax
	 *
	 * @return  null
	 */
	public function ajax_validate()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$model = $this->getModel('form', 'FabrikFEModel');
		$model->setId($input->getInt('formid', 0));
		$model->getForm();
		$model->setRowId($input->get('rowid', '',
'string'));
		$model->validate();
		$data = array('modified' =>
$model->modifiedValidationData);

		// Validating entire group when navigating form pages
		$data['errors'] = $model->errors;
		echo json_encode($data);
	}

	/**
	 * Save a form's page to the session table
	 *
	 * @return  null
	 */
	public function savepage()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$model = $this->getModel('Formsession',
'FabrikFEModel');
		$formModel = $this->getModel('Form',
'FabrikFEModel');
		$formModel->setId($input->getInt('formid'));
		$model->savePage($formModel);
	}

	/**
	 * Clear down any temp db records or cookies
	 * containing partially filled in form data
	 *
	 * @return  null
	 */
	public function removeSession()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$sessionModel = $this->getModel('Formsession',
'FabrikFEModel');
		$sessionModel->setFormId($input->getInt('formid', 0));
		$sessionModel->setRowId($input->get('rowid',
'', 'string'));
		$sessionModel->remove();
		$this->display();
	}

	/**
	 * Called via ajax to page through form records
	 *
	 * @return  null
	 */
	public function paginate()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$model = $this->getModel('Form', 'FabrikFEModel');
		$model->setId($input->getInt('formid'));
		$model->paginateRowId($input->get('dir'));
		$this->display();
	}

	/**
	 * Delete a record from a form
	 *
	 * @return  null
	 */
	public function delete()
	{
		// Check for request forgeries
		Session::checkToken() or die('Invalid Token');
		$app = Factory::getApplication();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$input = $app->getInput();
		$model = $this->getModel('list', 'FabrikFEModel');
		$ids = array($input->get('rowid', 0, 'string'));

		$listId = $input->getInt('listid');
		$limitStart = $input->getInt('limitstart' . $listId);
		$length = $input->getInt('limit' . $listId);

		$oldTotal = $model->getTotalRecords();
		$model->setId($listId);
		$model->deleteRows($ids);

		$total = $oldTotal - count($ids);

		$ref = $input->get('fabrik_referrer',
"index.php?option=com_' . $package .
'&view=table&listid=$listId", 'string');

		if ($total >= $limitStart)
		{
			$newLimitStart = $limitStart - $length;

			if ($newLimitStart < 0)
			{
				$newLimitStart = 0;
			}

			$ref = str_replace("limitstart$listId=$limitStart",
"limitstart$listId=$newLimitStart", $ref);
			$app = Factory::getApplication();
			$context = 'com_' . $package . '.list.' .
$model->getRenderContext() . '.';
			$app->setUserState($context . 'limitstart',
$newLimitStart);
		}

		if ($input->get('format') == 'raw')
		{
			$input->set('view', 'list');
			$this->display();
		}
		else
		{
			// @TODO: test this
			$app->enqueueMessage(count($ids) . " " .
Text::_('COM_FABRIK_RECORDS_DELETED'));
			$app->redirect($ref);
		}
	}
}
controllers/element.php000064400000004100151165346160011257
0ustar00<?php
/**
 * Fabrik Element Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Factory;

jimport('joomla.application.component.controller');

/**
 * Fabrik Element Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
class FabrikControllerElement extends BaseController
{
	/**
	 * Is the view rendered from the J content plugin
	 *
	 * @var  bool
	 */
	public $isMambot = false;

	/**
	 * Should the element be rendered as readonly
	 *
	 * @var  string
	 */
	public $mode = false;

	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * Display the view
	 *
	 * @return  null
	 */
	public function display()
	{
		$document = Factory::getDocument();
		$app = Factory::getApplication();
		$input = $app->getInput();
		$viewName = $input->get('view', 'element',
'cmd');
		$viewType = $document->getType();

		// Set the default view name from the Request
		$view = &$this->getView($viewName, $viewType);

		// $$$ rob 04/06/2011 don't assign a model to the element as its
only a plugin

		$view->editable = ($this->mode == 'readonly') ? false :
true;

		// Display the view
		$view->error = $this->getError();

		return $view->display();
	}

	/**
	 * Save an individual element value to the fabrik db
	 * used in inline edit table plugin
	 *
	 * @return  null
	 */
	public function save()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$listModel = $this->getModel('list',
'FabrikFEModel');
		$listModel->setId($input->getInt('listid'));
		$rowId = $input->get('rowid');
		$key = $input->get('element');
		$key = array_pop(explode('___', $key));
		$value = $input->get('value');
		$listModel->storeCell($rowId, $key, $value);
		$this->mode = 'readonly';
		$this->display();
	}
}
controllers/emailform.php000064400000003177151165346160011616
0ustar00<?php
/**
 * Fabrik Email Form Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Factory;

jimport('joomla.application.component.controller');

/**
 * Fabrik Email Form Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
class FabrikControllerEmailform extends BaseController
{
	/**
	 * Display the view
	 *
	 * @param   boolean          $cachable    If true, the view output will be
cached - NOTE not actually used to control caching!!!
	 * @param   array|boolean    $urlparams  An array of safe url parameters
and their variable types, for valid values see {@link
InputFilter::clean()}.
	 *
	 * @return  JController  A JController object to support chaining.
	 */
	public function display($cachable = false, $urlparams = array())
	{
		$document = Factory::getDocument();
		$app = Factory::getApplication();
		$input = $app->getInput();
		$viewName = $input->get('view', 'emailform');
		$modelName = 'form';

		$viewType = $document->getType();

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		// Test for failed validation then page refresh
		if ($model = $this->getModel($modelName, 'FabrikFEModel'))
		{
			$view->setModel($model, true);
		}
		// Display the view
		$view->error = $this->getError();
		$view->display();

		return $this;
	}
}
controllers/FabrikController.php000064400000002707151165346160013103
0ustar00<?php
/**
 * Created by PhpStorm.
 * User: rob
 * Date: 24/05/2016
 * Time: 09:56
 */
defined('_JEXEC') or die;

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Document\Document;
use Joomla\CMS\Session\Session;
use Joomla\CMS\User\User;
use Joomla\CMS\Factory;

class FabrikController extends BaseController
{
	/**
	 * @var JApplicationCMS
	 */
	protected $app;

	/**
	 * @var User
	 */
	protected $user;

	/**
	 * @var string
	 */
	protected $package;

	/**
	 * @var Session
	 */
	protected $session;

	/**
	 * @var Document
	 */
	protected $doc;

	/**
	 * @var JDatabaseDriver
	 */
	protected $db;

	/**
	 * @var Registry
	 */
	protected $config;

	/**
	 * Constructor
	 *
	 * @param   array $config A named configuration array for object
construction.
	 *
	 */
	public function __construct($config = array())
	{
		$this->app     = ArrayHelper::getValue($config, 'app',
Factory::getApplication());
		$this->user    = ArrayHelper::getValue($config, 'user',
Factory::getUser());
		$this->package =
$this->app->getUserState('com_fabrik.package',
'fabrik');
		$this->session = ArrayHelper::getValue($config, 'session',
Factory::getSession());
		$this->doc     = ArrayHelper::getValue($config, 'doc',
Factory::getDocument());
		$this->db      = ArrayHelper::getValue($config, 'db',
Factory::getContainer()->get('DatabaseDriver'));
		$this->config  = ArrayHelper::getValue($config, 'config',
Factory::getApplication()->getConfig());
		parent::__construct($config);
	}
}controllers/form.php000064400000047234151165346160010610 0ustar00<?php
/**
 * Fabrik From Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Factory;
use Fabrik\Helpers\Html;
use Fabrik\Helpers\Worker;

/**
 * Fabrik From Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
#[\AllowDynamicProperties]
class FabrikControllerForm extends BaseController
{
	/**
	 * Is the view rendered from the J content plugin
	 *
	 * @var  bool
	 */
	public $isMambot = false;

	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * @var boolean
	 */
	protected $baseRedirect = false;

	/**
	 * Magic method to convert the object to a string gracefully.
	 *
	 * $$$ hugh - added 08/05/2012.  No idea what's going on, but I had
to add this to stop
	 * the class name 'FabrikControllerForm' being output at the
bottom of the form, when rendered
	 * through a Fabrik form module.  See:
	 *
	 * https://github.com/Fabrik/fabrik/issues/398
	 *
	 * @return  string  empty string.
	 */
	public function __toString()
	{
		return '';
	}

	/**
	 * Inline edit control
	 *
	 * @since   3.0b
	 *
	 * @return  null
	 */
	public function inlineedit()
	{
		$model =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('FormInlineEdit',
'FabrikFEModel');
		$model->render();
	}

	/**
	 * Display the view
	 *
	 * @param   boolean  $cachable   If true, the view output will be cached -
NOTE not actually used to control caching!!!
	 * @param   array    $urlparams  An array of safe url parameters and their
variable types, for valid values see {@link InputFilter::clean()}.
	 *
	 * @return  JController|void  A JController object to support chaining.
	 */
	public function display($cachable = false, $urlparams = array())
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$document = Factory::getDocument();
		$viewName = $input->get('view', 'form');
		$modelName = $viewName;

		if ($input->get('clearsession', '') ===
'1')
		{
			$this->clearSession();
		}

		if ($viewName == 'emailform')
		{
			$modelName = 'form';
		}

		$extraQS =
FabrikWorker::getMenuOrRequestVar('extra_query_string',
'', $this->isMambot, 'menu');
		$extraQS = ltrim($extraQS, '&?');
		$extraQS = FabrikString::encodeqs($extraQS);

		if (!empty($extraQS))
		{
			foreach (explode('&', $extraQS) as $qsStr)
			{
				$parts = explode('=', $qsStr);
				$input->set($parts[0], $parts[1]);
				$_REQUEST[$parts[0]] = $parts[1];
			}
		}

		$viewType = $document->getType();

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		// Push a model into the view (may have been set in content plugin
already)
		/** @var FabrikFEModelForm $model */
		$model = !isset($this->_model) ? $this->getModel($modelName,
'FabrikFEModel') : $this->_model;
		$model->isMambot = $this->isMambot;
		$model->packageId =
$app->getInput()->getInt('packageId');

		$view->setModel($model, true);
		$view->isMambot = $this->isMambot;

		FabrikWorker::getPluginManager()->runPlugins('onBeforeGetData',
$model);

		// Get data as it will be needed for ACL when testing if current row is
editable.
		$model->getData();

		// If we can't edit the record redirect to details view
		if (!$this->isMambot &&
$model->checkAccessFromListSettings() <= 1)
		{
			$app = Factory::getApplication();
			$input = $app->getInput();

			if ($app->isClient('administrator'))
			{
				$url =
'index.php?option=com_fabrik&task=details.view&formid=' .
$input->getInt('formid') . '&rowid=' .
$input->get('rowid', '', 'string');
			}
			else
			{
				$url = 'index.php?option=com_' . $package .
'&view=details&formid=' .
$input->getInt('formid') . '&rowid=' .
$input->get('rowid', '', 'string');

				if (!empty($extraQS))
				{
					$url .= '&' . $extraQS;
				}
			}

			// So we can determine in form PHP plugin's that the original
request was for a form.
			$url .= '&fromForm=1';
			$msg = $model->aclMessage();
			$this->setRedirect(Route::_($url), $msg, 'notice');

			return;
		}
		// Display the view
		//$view->error = $this->getError();

		// Redirect plugin message if coming from content plugin - reloading in
same page
		$model->applyMsgOnce();

		// $$$ hugh - added disable caching option, and no caching if not logged
in (unless we can come up with a unique cacheid for guests)
		// NOTE - can't use IP of client, as could be two users behind same
NAT'ing proxy / firewall.
		$listModel = $model->getListModel();
		$listParams = $listModel->getParams();

		$user = Factory::getUser();

		if (!Worker::useCache($listModel)
			|| $input->get('fabrik_social_profile_hash', '')
!== ''
		)
		{
			$view->display();
		}
		else
		{
			$uri = JURI::getInstance();
			$uri = $uri->toString(array('path', 'query'));
			$cacheId = serialize(array($uri, $input->post,
$user->get('id'), get_class($view), 'display',
$this->cacheId));
			$cache = Factory::getCache('com_' . $package,
'view');
			ob_start();
			$cache->get($view, 'display', $cacheId);
			Html::addToSessionCacheIds($cacheId);
			$contents = ob_get_contents();
			ob_end_clean();

			// Workaround for token caching
			$token = Session::getFormToken();
			$search = '#<input type="hidden"
name="[0-9a-f]{32}" value="1" />#';
			$replacement = '<input type="hidden" name="'
. $token . '" value="1" />';
			echo preg_replace($search, $replacement, $contents);
		}

		return $this;
	}

	/**
	 * Process the form
	 * Inline edit save routed here (not in raw)
	 *
	 * @return  null
	 */
	public function process()
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('controller process: start') :
null;

		$app   = Factory::getApplication();
		$input = $app->getInput();

		if ($input->get('format', '') == 'raw')
		{
			error_reporting(error_reporting() ^ (E_WARNING | E_NOTICE));
		}

		$viewName = $input->get('view', 'form');
		$view = $this->getView($viewName,
Factory::getDocument()->getType());

		/** @var FabrikFEModelForm $model */
		if ($model = $this->getModel('form',
'FabrikFEModel'))
		{
			$view->setModel($model, true);
		}

		$model->setId($input->getInt('formid', 0));
		$model->packageId = $input->getInt('packageId');
		$this->isMambot   = $input->get('isMambot', 0);
		$model->rowId     = $input->get('rowid', '',
'string');
		$listModel        = $model->getListModel();

		/**
		 * Do some ACL sanity checks.  Without this check, if spoof checking is
disabled, a form can be submitted
		 * with no ACL checks being performed.  With spoof checking, we do the
ACL checks on form load, so can't get the
		 * token without having access.
		 *
		 * Don't bother checking if not recording to database, as no list or
list ACLs.
		 */
		if ($model->recordInDatabase())
		{
			$aclOK    = false;

			if ($model->isNewRecord() && $listModel->canAdd())
			{
				$aclOK = true;
			}
			else
			{
				/*
				 * Need to set up form data here so we can pass it to canEdit(),
remembering to
				 * add encrypted vars, so things like user elements which have ACLs on
them get
				 * included in data for canUserDo() checks.  Nay also need to do
copyToFromRaw(),
				 * but leave that until we find a need for it.
				 *
				 * Note that canEdit() expects form data as an object, and $formData is
an array,
				 * but the actual canUserDo() helper func it calls with the data will
accept either.
				 */
				$formData = $model->setFormData();
				$model->addEncrytedVarsToArray($formData);

				if (!$model->isNewRecord() &&
$listModel->canEdit($formData))
				{
					$aclOK = true;
				}
			}

			if (!$aclOK)
			{
				$msg = $model->aclMessage(true);
				$app->enqueueMessage($msg);

				return;
			}
		}

		/**
		 * $$$ hugh - need this in plugin manager to be able to treat a
"Copy" form submission
		 * as 'new' for purposes of running plugins.  Rob's
comment in model process() seems to
		 * indicate that origRowId was for this purposes, but it doesn't
work, 'cos always has a value.
		 */
		if ($input->get('Copy', 'no') !== 'no')
		{
			$model->copyingRow(true);
		}

		// Check for request forgeries
		if ($model->spoofCheck())
		{
			Session::checkToken() or die('Invalid Token');
		}

		JDEBUG ? $profiler->mark('controller process validate:
start') : null;

		if (!$model->validate())
		{
			$this->handleError($view, $model);

			return;
		}
		JDEBUG ? $profiler->mark('controller process validate: end')
: null;

		// Reset errors as validate() now returns ok validations as empty arrays
		$model->clearErrors();

		try
		{
			$model->process();
		}
		catch (Exception $e)
		{
			$model->errors['process_error'] = true;
			$app->enqueueMessage($e->getMessage(), 'error');
		}

		if ($input->getInt('elid', 0) !== 0)
		{
			// Inline edit show the edited element - ignores validations for now
			$inlineModel = $this->getModel('forminlineedit',
'FabrikFEModel');
			$inlineModel->setFormModel($model);
			echo $inlineModel->showResults();

			return;
		}

		// Check if any plugin has created a new validation error
		if ($model->hasErrors())
		{
			FabrikWorker::getPluginManager()->runPlugins('onError',
$model);
			$this->handleError($view, $model);

			return;
		}

		$url = $this->getRedirectURL($model);
		$msg = $this->getRedirectMessage($model);

		/**
		 * If debug submit is requested (&fabrikdebug=2, and J! debug on, and
Fabrik debug allowed),
		 * bypass any and all redirects, so we can see the profile for the submit
		 */
		if (Html::isDebugSubmit())
		{
			echo '<p>' . $msg . '</p>';
			echo '<p>Form submission profiling has stopped the automatic
redirect. </p>';
			echo '<a href="' . $url . '">continue to
redirect URL</a>';
			return;
		}

		$listModel = $model->getListModel();
		$listModel->set('_table', null);

		// @todo -should get handed off to the json view to do this
		if ($input->getInt('fabrik_ajax') == 1)
		{
			// $$$ hugh - adding some options for what to do with redirect when in
content plugin
			// Should probably do this elsewhere, but for now ...
			$redirect_opts = array(
					'msg' => $msg,
					'url' => $url,
					'baseRedirect' => $this->baseRedirect,
					'rowid' => $input->get('rowid',
'', 'string'),
					'suppressMsg' => !$model->showSuccessMsg()
			);

			if (!$this->baseRedirect && $this->isMambot)
			{
				$session = Factory::getSession();
				$context = $model->getRedirectContext();
				$redirect_opts['redirect_how'] = $session->get($context .
'redirect_content_how', 'popup');
				$redirect_opts['width'] = (int) $session->get($context .
'redirect_content_popup_width', '300');
				$redirect_opts['height'] = (int) $session->get($context .
'redirect_content_popup_height', '300');
				$redirect_opts['x_offset'] = (int) $session->get($context
. 'redirect_content_popup_x_offset', '0');
				$redirect_opts['y_offset'] = (int) $session->get($context
. 'redirect_content_popup_y_offset', '0');
				$redirect_opts['title'] = $session->get($context .
'redirect_content_popup_title', '');
				$redirect_opts['reset_form'] = $session->get($context .
'redirect_content_reset_form', '1') == '1';
			}
			elseif (!$this->baseRedirect && !$this->isMambot)
			{
				/**
				 * $$$ hugh - I think this case only happens when we're a popup
form from a list
				 * in which case I don't think "popup" is realy a valid
option.  Anyway, need to set something,
				 * so for now just do the same as we do for isMambot, but default
redirect_how to 'samepage'
				 */
				$session = Factory::getSession();
				$context = $model->getRedirectContext();
				$redirect_opts['redirect_how'] = $session->get($context .
'redirect_content_how', 'samepage');
				$redirect_opts['width'] = (int) $session->get($context .
'redirect_content_popup_width', '300');
				$redirect_opts['height'] = (int) $session->get($context .
'redirect_content_popup_height', '300');
				$redirect_opts['x_offset'] = (int) $session->get($context
. 'redirect_content_popup_x_offset', '0');
				$redirect_opts['y_offset'] = (int) $session->get($context
. 'redirect_content_popup_y_offset', '0');
				$redirect_opts['title'] = $session->get($context .
'redirect_content_popup_title', '');
				$redirect_opts['reset_form'] = $session->get($context .
'redirect_content_reset_form', '1') == '1';

			}
			elseif ($this->isMambot)
			{
				// $$$ hugh - special case to allow custom code to specify that
				// the form should not be cleared after a failed AJAX submit
				$session = Factory::getSession();
				$context = 'com_fabrik.form.' .
$model->get('id') . '.redirect.';
				$redirect_opts['reset_form'] = $session->get($context .
'redirect_content_reset_form', '1') == '1';
			}
			// Let form.js handle the redirect logic
			echo json_encode($redirect_opts);

			// Stop require.js being added to output
			exit;
		}

		if ($input->get('format') == 'raw')
		{
			$input->set('view', 'list');
			$this->display();

			return;
		}
		else
		{

			// If no msg, set to null, so J! doesn't create an empty
"Message" area
			if (empty($msg))
			{
				$msg = null;
			}

			$this->setRedirect($url, $msg);
		}
	}

	/**
	 * Handle the view error
	 *
	 * @param   HtmlView        $view   View
	 * @param   FabrikFEModelForm  $model  Form Model
	 *
	 * @since   3.1b
	 *
	 * @return  void
	 */
	protected function handleError($view, $model)
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$validated = false;

		// If its in a module with ajax or in a package or inline edit
		if ($input->get('fabrik_ajax'))
		{
			if ($input->getInt('elid', 0) !== 0)
			{
				// Inline edit
				$messages = array();
				$errs = $model->getErrors();

				// Only raise errors for fields that are present in the inline edit
plugin
				$toValidate = array_keys($input->get('toValidate',
array(), 'array'));

				foreach ($errs as $errorKey => $e)
				{
					if (in_array($errorKey, $toValidate) && count($e[0]) > 0)
					{
						array_walk_recursive($e, array('FabrikString',
'forHtml'));
						$messages[] = count($e[0]) === 1 ? '<li>' . $e[0][0]
. '</li>' : '<ul><li>' .
implode('</li><li>', $e[0]) .
'</ul>';
					}
				}

				if (!empty($messages))
				{
					$messages = '<ul>' .
implode('</li><li>', $messages) .
'</ul>';
					header('HTTP/1.1 500 ' .
Text::_('COM_FABRIK_FAILED_VALIDATION') . $messages);
					jexit();
				}
				else
				{
					$validated = true;
				}
			}
			else
			{
				// Package / model
				echo $model->getJsonErrors();
			}

			if (!$validated)
			{
				return;
			}
		}

		if (!$validated)
		{
			if ($this->isMambot)
			{
				$this->savepage();
				$this->setRedirect($this->getRedirectURL($model, false));
			}
			else
			{
				/**
				 * $$$ rob - http://fabrikar.com/forums/showthread.php?t=17962
				 * couldn't determine the exact set up that triggered this, but we
need to reset the rowid to -1
				 * if reshowing the form, otherwise it may not be editable, but rather
show as a detailed view
				 */
				if ($input->get('usekey', '') !== '')
				{
					$input->set('rowid', -1);
				}
				// Meant that the form's data was in different format - so
redirect to ensure that its showing the same data.
				$input->set('task', '');
				$view->display();
			}

			return;
		}
	}

	/**
	 * Get redirect message
	 *
	 * @param   object  $model  form model
	 *
	 * @since   3.0
	 *
	 * @deprecated - use form model getRedirectMessage instead
	 *
	 * @return  string  redirect message
	 */
	protected function getRedirectMessage($model)
	{
		return $model->getRedirectMessage();
	}

	/**
	 * Get redirect URL
	 *
	 * @param   FabrikFEModelForm  $model       Form model
	 * @param   bool               $incSession  Set url in session?
	 *
	 * @since 3.0
	 *
	 * @deprecated - use form model getRedirectUrl() instead
	 *
	 * @return   string  redirect url
	 */
	protected function getRedirectURL($model, $incSession = true)
	{
		$res = $model->getRedirectURL($incSession, $this->isMambot);
		$this->baseRedirect = $res['baseRedirect'];

		return $res['url'];
	}

	/**
	 * Validate via ajax
	 *
	 * @return  null
	 */
	public function ajax_validate()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();

		/** @var FabrikFEModelForm $model */
		$model = $this->getModel('form', 'FabrikFEModel');
		$model->setId($input->getInt('formid', 0));
		$model->getForm();
		$model->setRowId($input->get('rowid', '',
'string'));
		$model->validate();
		$data = array('modified' =>
$model->modifiedValidationData);

		// Validating entire group when navigating form pages
		$data['errors'] = $model->errors;
		echo json_encode($data);
	}

	/**
	 * Save a form's page to the session table
	 *
	 * @return  null
	 */
	public function savepage()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$model = $this->getModel('Formsession',
'FabrikFEModel');
		$formModel = $this->getModel('Form',
'FabrikFEModel');
		$formModel->setId($input->getInt('formid'));
		$model->savePage($formModel);
	}

	/**
	 * Clear down any temp db records or cookies
	 * containing partially filled in form data
	 *
	 * This is the controller task, which then does display as well
	 *
	 * @return  null
	 */
	public function removeSession()
	{
		$this->clearSession();
		$this->display();
	}

	/**
	 * Clear down any temp db records or cookies
	 * containing partially filled in form data
	 *
	 * @return  null
	 */
	public function clearSession()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();

		// clean the cache, just for good measure
		$cache = Factory::getCache($input->get('option'));
		$cache->clean();

		// remove the formsession row
		$sessionModel = $this->getModel('formsession',
'FabrikFEModel');
		$sessionModel->setFormId($input->getInt('formid', 0));
		$sessionModel->setRowId($input->get('rowid',
'', 'string'));
		$sessionModel->remove();
	}

	/**
	 * Called via ajax to page through form records
	 *
	 * @return  null
	 */
	public function paginate()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$model = $this->getModel('Form', 'FabrikFEModel');
		$model->setId($input->getInt('formid'));
		$model->paginateRowId($input->get('dir'));
		$this->display();
	}

	/**
	 * Delete a record from a form
	 *
	 * @return  null
	 */
	public function delete()
	{
		// Check for request forgeries
		Session::checkToken() or die('Invalid Token');
		$app = Factory::getApplication();
		$input = $app->getInput();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$model = $this->getModel('list', 'FabrikFEModel');
		$ids = array($input->get('rowid', 0));

		$listId = $input->getInt('listid');
		$limitStart = $input->getInt('limitstart' . $listId);
		$length = $input->getInt('limit' . $listId);

		$oldTotal = $model->getTotalRecords();
		$model->setId($listId);
		$ok = $model->deleteRows($ids);

		$total = $oldTotal - count($ids);

		$ref = $input->get('fabrik_referrer',
'index.php?option=com_' . $package .
'&view=list&listid=' . $listId, 'string');

		if ($total >= $limitStart)
		{
			$newLimitStart = $limitStart - $length;

			if ($newLimitStart < 0)
			{
				$newLimitStart = 0;
			}

			$ref = str_replace("limitstart$listId=$limitStart",
"limitstart$listId=$newLimitStart", $ref);
			$context = 'com_' . $package . '.list.' .
$model->getRenderContext() . '.';
			$app->setUserState($context . 'limitstart',
$newLimitStart);
		}

		if ($input->get('format') == 'raw')
		{
			$app->redirect('index.php?option=com_fabrik&view=list&listid='
. $listId . '&format=raw');
		}
		else
		{
			$msg = $ok ? count($ids) . ' ' .
Text::_('COM_FABRIK_RECORDS_DELETED') : '';
			$app->enqueueMessage($msg);
			$app->redirect($ref);
		}
	}
}
controllers/form.raw.php000064400000015211151165346160011366
0ustar00<?php
/**
 * Fabrik Raw From Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Factory;

jimport('joomla.application.component.controller');

/**
 * Fabrik Raw From Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 *
 * @deprecated? Don't think this is used, code seems out of date,
certainly for process anyway - redirect urls are
 * for Fabrik 2 !
 */
class FabrikControllerForm extends BaseController
{
	/**
	 * Is the view rendered from the J content plugin
	 *
	 * @var  bool
	 */
	public $isMambot = false;

	/**
	 * Display the view
	 *
	 * @return  null
	 */
	public function display()
	{
		$app = Factory::getApplication();
		$session = Factory::getSession();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$document = Factory::getDocument();
		$input = $app->getInput();
		$viewName = $input->get('view', 'form');
		$modelName = $viewName;

		if ($viewName == 'details')
		{
			$viewName = 'form';
		}

		$viewType = $document->getType();

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		// Push a model into the view
		if ($model = $this->getModel($modelName, 'FabrikFEModel'))
		{
			$view->setModel($model, true);
		}

		/**
		 * If errors made when submitting from a J plugin they are stored in the
session
		 * lets get them back and insert them into the form model
		 */
		if (!$model->hasErrors())
		{
			$context = 'com_' . $package . '.form.' .
$input->getInt('formid');
			$model->errors = $session->get($context . '.errors',
array());
			$session->clear($context . '.errors');
		}

		$view->isMambot = $this->isMambot;

		// Display the view
		$view->error = $this->getError();

		// run the view (no caching)
		return $view->display();
	}

	/**
	 * Process the form
	 *
	 * @return  null
	 */
	public function process()
	{
		$app = Factory::getApplication();
		$session = Factory::getSession();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$document = Factory::getDocument();
		$input = $app->getInput();
		$viewName = $input->get('view', 'form');
		$viewType = $document->getType();
		$view = $this->getView($viewName, $viewType);

		if ($model = $this->getModel('form',
'FabrikFEModel'))
		{
			$view->setModel($model, true);
		}

		$model->setId($input->getInt('formid', 0));
		$this->isMambot = $input->get('isMambot', 0);
		$model->getForm();
		$model->rowId = $input->get('rowid', '',
'string');

		// Check for request forgeries
		if ($model->spoofCheck())
		{
			Session::checkToken() or die('Invalid Token');
		}

		if ($input->getBool('fabrik_ignorevalidation', false) !=
true)
		{
			// Put in when saving page of form
			if (!$model->validate())
			{
				// If its in a module with ajax or in a package
				if ($input->getInt('packageId') !== 0)
				{
					$data = array('modified' =>
$model->modifiedValidationData);

					// Validating entire group when navigating form pages
					$data['errors'] = $model->errors;
					echo json_encode($data);

					return;
				}

				if ($this->isMambot)
				{
					// Store errors in session
					$context = 'com_' . $package . '.form.' .
$model->get('id') . '.';
					$session->set($context . 'errors', $model->errors);

					/**
					 * $$$ hugh - testing way of preserving form values after validation
fails with form plugin
					 * might as well use the 'savepage' mechanism, as it's
already there!
					 */
					$session->set($context . 'session.on', true);
					$this->savepage();
					$this->makeRedirect($model, '');
				}
				else
				{
					echo $view->display();
				}

				return;
			}
		}

		// Reset errors as validate() now returns ok validations as empty arrays
		$model->errors = array();
		$defaultAction = $model->process();

		// Check if any plugin has created a new validation error
		if (!empty($model->errors))
		{
			$pluginManager = FabrikWorker::getPluginManager();
			$pluginManager->runPlugins('onError', $model);
			echo $view->display();

			return;
		}

		// One of the plugins returned false stopping the default redirect action
from taking place
		if (!$defaultAction)
		{
			return;
		}

		$msg = $model->getSuccessMsg();

		if ($input->getInt('elid') !== 0)
		{
			// Inline edit show the edited element
			$inlineModel = $this->getModel('forminlineedit',
'FabrikFEModel');
			$inlineModel->setFormModel($model);
			echo $inlineModel->showResults();

			return;
		}

		if ($input->getInt('packageId') !== 0)
		{
			echo json_encode(array('msg' => $msg));

			return;
		}

		$input->set('view', 'list');
		echo $this->display();
	}

	/**
	 * Generic function to redirect
	 *
	 * @param   object  &$model  form model
	 * @param   string  $msg     redirection message to show
	 *
	 * @return  string  redirect url
	 */

	protected function makeRedirect(&$model, $msg = null)
	{
		$app = Factory::getApplication();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$input = $app->getInput();
		$formId = $input->getInt('formid');
		$listId = $input->getInt('listid');
		$rowId = $input->getString('rowid', '',
'string');

		if (is_null($msg))
		{
			$msg = Text::_('COM_FABRIK_RECORD_ADDED_UPDATED');
		}

		if ($app->isClient('administrator'))
		{
			// Admin option is always com_fabrik
			if (array_key_exists('apply', $model->formData))
			{
				$url =
'index.php?option=com_fabrik&c=form&task=form&formid='
. $formId . '&listid=' . $listId . '&rowid=' .
$rowId;
			}
			else
			{
				$url =
'index.php?option=com_fabrik&c=table&task=viewTable&cid[]='
. $model->getTable()->id;
			}

			$this->setRedirect($url, $msg);
		}
		else
		{
			if (array_key_exists('apply', $model->formData))
			{
				$url = 'index.php?option=com_' . $package .
'&c=form&view=form&formid=' . $formId .
'&rowid=' . $rowId . '&listid=' . $listId;
			}
			else
			{
				if ($this->isMambot)
				{
					// Return to the same page
					$url = filter_var(ArrayHelper::getValue($_SERVER,
'REQUEST_URI', 'index.php'), FILTER_SANITIZE_URL);
				}
				else
				{
					// Return to the page that called the form
					$url = $input->get('fabrik_referrer',
'index.php', 'string');
				}

				$itemId = FabrikWorker::itemId();

				if ($url == '')
				{
					$url = 'index.php?option=com_' . $package .
'&Itemid=' . $itemId;
				}
			}

			$config = Factory::getApplication()->getConfig();

			if ($config->get('sef'))
			{
				$url = Route::_($url);
			}

			$this->setRedirect($url, $msg);
		}
	}
}
controllers/import.php000064400000006413151165346160011151 0ustar00<?php
/**
 * Fabrik Import Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Factory;

jimport('joomla.application.component.controller');

/**
 * Fabrik Import Controller
 *
 * @package  Fabrik
 * @since    3.0
 */
class FabrikControllerImport extends BaseController
{
	/**
	 * Display the view
	 *
	 * @param   boolean $cachable  If true, the view output will be cached -
NOTE not actually used to control
	 *                             caching!!!
	 * @param   array   $urlparams An array of safe url parameters and their
variable types, for valid values see
	 *                             {@link InputFilter::clean()}.
	 *
	 * @return  JController  A JController object to support chaining.
	 */

	public function display($cachable = false, $urlparams = array())
	{
		$app   = Factory::getApplication();
		$input = $app->getInput();
		$this->getModel('Importcsv',
'FabrikFEModel')->clearSession();
		$this->listid = $input->getInt('listid', 0);
		$listModel    = $this->getModel('list',
'FabrikFEModel');
		$listModel->setId($this->listid);
		$this->table = $listModel->getTable();
		$document    = Factory::getDocument();
		$viewName    = $input->get('view', 'form');
		$viewType    = $document->getType();

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		/** @var FabrikFEModelImportcsv $model */
		$model = $this->getModel('Importcsv',
'FabrikFEModel');
		$view->setModel($model, true);
		$view->display();
	}

	/**
	 * Perform the file upload and set the session state
	 * Unlike back end import if there are unmatched headings we bail out
	 *
	 * @return null
	 */
	public function doimport()
	{
		$app   = Factory::getApplication();
		$input = $app->getInput();

		/** @var FabrikFEModelImportcsv $model */
		$model     = $this->getModel('Importcsv',
'FabrikFEModel');
		$listModel = $model->getListModel();

		if (!$listModel->canCSVImport())
		{
			throw new RuntimeException('Naughty naughty!', 400);
		}

		$menus	= $app->getMenu();
		$itemId = $input->getInt('Itemid', '');

		if (!empty($itemId))
		{
			$menus = $app->getMenu();
			$menus->setActive($itemId);
		}

		if (!$model->checkUpload())
		{
			$this->display();

			return;
		}

		$id       = $listModel->getId();
		$document = Factory::getDocument();
		$viewName = $input->get('view', 'form');
		$viewType = $document->getType();

		// Set the default view name from the Request
		$this->getView($viewName, $viewType);
		$model->import();

		if (!empty($model->newHeadings))
		{
			// As opposed to admin you can't alter table structure with a CSV
import from the front end
			$app->enqueueMessage($model->makeError(), 'notice');
			$this->setRedirect('index.php?option=com_fabrik&view=import&filetype=csv&listid='
. $id . '&Itemid=' . $itemId);
		}
		else
		{
			$input->set('fabrik_list', $id);
			$model->insertData();
			$msg = $model->updateMessage();
			$this->setRedirect('index.php?option=com_fabrik&view=list&listid='
. $id . "&resetfilters=1&Itemid=" . $itemId, $msg);
		}
	}
}
controllers/index.html000064400000000054151165346170011117
0ustar00<html><body
bgcolor="#FFFFFF"></body></html>controllers/list.php000064400000023077151165346170010620
0ustar00<?php
/**
 * Fabrik List Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Factory;
use Fabrik\Helpers\Html;
use Fabrik\Helpers\Worker;

/**
 * Fabrik List Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
class FabrikControllerList extends BaseController
{
	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * Display the view
	 *
	 * @param   object|boolean  $model      List model
	 * @param   array|boolean   $urlparams  An array of safe url parameters
and their variable types, for valid values see {@link
InputFilter::clean()}.
	 *
	 * @return  null
	 */

	public function display($model = false, $urlparams = false)
	{
		$document = Factory::getDocument();
		$app = Factory::getApplication();
		$input = $app->getInput();
		$viewName = $input->get('view', 'list');
		$modelName = $viewName;
		$layout = $input->getWord('layout', 'default');
		$viewType = $document->getType();

		if ($viewType == 'pdf')
		{
			// In PDF view only shown the main component content.
			$input->set('tmpl', 'component');
		}
		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);
		$view->setLayout($layout);

		$extraQS =
FabrikWorker::getMenuOrRequestVar('list_extra_query_string',
'', false, 'menu');
		$extraQS = ltrim($extraQS, '&?');
		$extraQS = FabrikString::encodeqs($extraQS);

		if (!empty($extraQS))
		{
			foreach (explode('&', $extraQS) as $qsStr)
			{
				$parts = explode('=', $qsStr);
				$input->set($parts[0], $parts[1]);
				$_GET[$parts[0]] = $parts[1];
			}
		}

		// Push a model into the view
		if (is_null($model) || $model == false)
		{
			/** @var FabrikFEModelList $model */
			$model = $this->getModel($modelName, 'FabrikFEModel');
		}

		$view->setModel($model, true);

		// Display the view
		//$view->error = $this->getError();

		/**
		 * F3 cache with raw view gives error
		 * $$$ hugh - added list_disable_caching option, to disable caching on a
per list basis, due to some funky behavior
		 * with pre-filtered lists and user ID's, which should be handled by
the ID being in the $cacheId, but happens anyway.
		 * $$$ hugh @TODO - we really shouldn't cache for guests (user ID
0), unless we can come up with a way of creating a unique
		 * cache ID for guests.  We can't use their IP, as it could be two
different machines behind a NAT'ing firewall.
		 */
		if (!Worker::useCache($model))
		{
			$view->display();
		}
		else
		{
			// Build unique cache id on url, post and user id
			$user = Factory::getUser();
			$uri = JURI::getInstance();
			$uri = $uri->toString(array('path', 'query'));
			$cacheId = serialize(array($uri, $input->post,
$user->get('id'), get_class($view), 'display',
$this->cacheId));
			$cache = Factory::getCache('com_fabrik', 'view');
			$cache->get($view, 'display', $cacheId);
			Html::addToSessionCacheIds($cacheId);
		}
	}

	/**
	 * Reorder the data in the list
	 *
	 * @return  null
	 */
	public function order()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$modelName = $input->get('view', 'list');
		$model = $this->getModel($modelName, 'FabrikFEModel');
		$model->setId($input->getInt('listid'));
		$model->setOrderByAndDir();

		// $$$ hugh - unset 'resetfilters' in case it was set on QS of
original list load.
		$input->set('resetfilters', 0);
		$input->set('clearfilters', 0);
		$this->display();
	}

	/**
	 * Clear filters
	 *
	 * @return  null
	 */
	public function clearfilter()
	{
		$app = Factory::getApplication();
		$msg = Text::_('COM_FABRIK_FILTERS_CLEARED');

		if (!empty($msg))
		{
			$app->enqueueMessage($msg);
		}

		/**
		 * $$$ rob 28/12/20111 changed from clearfilters as clearfilters removes
jpluginfilters (filters
		 * set by content plugin which we want to remain sticky. Otherwise list
clear button removes the
		 * content plugin filters
		 * $app->getInput()->set('resetfilters', 1);
		 */

		/**
		 * $$$ rob 07/02/2012 if reset filters set in the menu options then
filters not cleared
		 * so instead use replacefilters which doesn't look at the menu item
parameters.
		 */
		$app->getInput()->set('replacefilters', 1);
		$this->filter();
	}

	/**
	 * Filter the list data
	 *
	 * @return null
	 */
	public function filter()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$modelName = $input->get('view', 'list');
		$model = $this->getModel($modelName, 'FabrikFEModel');
		$model->setId($input->getInt('listid'));
		FabrikHelperHTML::debug('', 'list model:
getRequestData');
		$request = $model->getRequestData();
		$model->storeRequestData($request);

		// $$$ rob pass in the model otherwise display() rebuilds it and the
request data is rebuilt
		return $this->display($model);
	}

	/**
	 * Delete rows from list
	 *
	 * @return  null
	 */
	public function delete()
	{
		// Check for request forgeries
		Session::checkToken() or die('Invalid Token');
		$app = Factory::getApplication();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$input = $app->getInput();
		$model = $this->getModel('list', 'FabrikFEModel');
		$ids = $input->get('ids', array(), 'array');
		$listId = $input->getInt('listid');
		$limitStart = $input->getInt('limitstart' . $listId);
		$length = $input->getInt('limit' . $listId);

		$model->setId($listId);
		$oldTotal = $model->getTotalRecords();

		try
		{
			$ok = $model->deleteRows($ids);
			$msg = $ok ? count($ids) . ' ' .
Text::_('COM_FABRIK_RECORDS_DELETED') : '';
			$msgType = 'message';
		}
		catch (Exception $e)
		{
			$msg = $e->getMessage();
			$msgType = 'error';
			$ids = array();
		}

		$total = $oldTotal - count($ids);

		$ref = $input->get('fabrik_referrer',
'index.php?option=com_' . $package .
'&view=list&listid=' . $listId, 'string');

		// $$$ hugh - for some reason fabrik_referrer is sometimes empty, so a
little defensive coding ...
		if (empty($ref))
		{
			$ref = $input->server->get('HTTP_REFERER',
'index.php?option=com_' . $package .
'&view=list&listid=' . $listId, '',
'string');
		}

		if ($total >= $limitStart)
		{
			$newLimitStart = $limitStart - $length;

			if ($newLimitStart < 0)
			{
				$newLimitStart = 0;
			}

			$ref = str_replace('limitstart' . $listId . '=  .
$limitStart', 'limitstart' . $listId . '=' .
$newLimitStart, $ref);
			$context = 'com_' . $package . '.list.' .
$model->getRenderContext() . '.';
			$app->setUserState($context . 'limitstart',
$newLimitStart);
		}

		if ($input->get('format') == 'raw')
		{
			$input->set('view', 'list');
			$this->display();
		}
		else
		{
			// @TODO: test this
			$app->enqueueMessage($msg, $msgType);
			$app->redirect($ref);
		}
	}

	/**
	 * Empty a table of records and reset its key to 0
	 *
	 * @return  null
	 */
	public function doempty()
	{
		$model = $this->getModel('list', 'FabrikFEModel');
		$model->truncate();
		$this->display();
	}

	/**
	 * Run a list plugin
	 *
	 * @return  null
	 */
	public function doPlugin()
	{
		$app = Factory::getApplication();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');
		$input = $app->getInput();
		$cid = $input->get('cid', array(0), 'array');
		$cid = $cid[0];
		$model = $this->getModel('list', 'FabrikFEModel');
		$model->setId($input->getInt('listid', $cid));
		/**
		 * $$$ rob need to ask the model to get its data here as if the plugin
calls $model->getData
		 * then the other plugins are recalled which makes the current plugins
params incorrect.
		 */
		$model->setLimits();
		$model->getData();

		// If showing n tables in article page then ensure that only activated
table runs its plugin
		if ($input->getInt('id') == $model->get('id')
|| $input->get('origid', '') == '')
		{
			$messages = $model->processPlugin();

			if ($input->get('format') == 'raw')
			{
				$input->set('view', 'list');
				$model->setRenderContext($model->getId());
				$context = 'com_' . $package . '.list' .
$model->getRenderContext() . '.msg';
				$session = Factory::getSession();
				$session->set($context, implode("\n", $messages));
			}
			else
			{
				foreach ($messages as $msg)
				{
					$app->enqueueMessage($msg);
				}
			}
		}
		// 3.0 use redirect rather than calling view() as that gave an sql error
(joins seemed not to be loaded for the list)
		$format = $input->get('format', 'html');
		$defaultRef = 'index.php?option=com_' . $package .
'&view=list&listid=' . $model->getId() .
'&format=' . $format;

		$itemid = $input->get('Itemid', '');

		if (!empty($itemid))
		{
			$defaultRef .= '&Itemid=' . $itemid;
		}

		if ($format !== 'raw')
		{
			$ref = $input->post->get('fabrik_referrer', $defaultRef,
'string');

			// For some reason fabrik_referrer is sometimes empty, so a little
defensive coding ...
			if (empty($ref))
			{
				$ref = $input->server->get('HTTP_REFERER', $defaultRef,
'string');
			}
		}
		else
		{
			$ref = $defaultRef .
'&setListRefFromRequest=1&listref=' .
$model->getRenderContext();
		}

		$app->redirect($ref);
	}

	/**
	 * Called via ajax when element selected in advanced search popup window
	 *
	 * @return  null
	 */
	public function elementFilter()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$id = $input->getInt('id');
		$model = $this->getModel('list', 'FabrikFEModel');
		$model->setId($id);
		echo $model->getAdvancedElementFilter();
	}
}
controllers/oai.php000064400000012264151165346170010411 0ustar00<?php
/**
 * Fabrik Open Archive Initiative Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Factory;
use \Joomla\Utilities\ArrayHelper;

jimport('joomla.application.component.controller');

/**
 * Fabrik Open Archive Initiative Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.4
 */
class FabrikControllerOai extends BaseController
{
	/**
	 * Display the view
	 *
	 * @param   boolean $cachable  If true, the view output will be cached -
NOTE not actually used to control
	 *                             caching!!!
	 * @param   array   $urlparams An array of safe url parameters and their
variable types, for valid values see
	 *                             {@link InputFilter::clean()}.
	 *
	 * @throws Exception
	 * @return  JController|void  A JController object to support chaining.
	 */

	public function display($cachable = false, $urlparams = array())
	{
		$doc = Factory::getDocument();
		$doc->setMimeEncoding('application/xml');
		$this->app   = Factory::getApplication();
		$this->input = $this->app->getInput();
		$verb        = strtolower($this->input->get('verb'));

		/** @var FabrikFEModelOai $model */
		$this->model = $model = $this->getModel('oai',
'FabrikFEModel');

		switch ($verb)
		{
			case 'identify':
				//
http://localhost:81/fabrik31x/public_html/index.php?option=com_fabrik&controller=oai&verb=Identify
				$view = $this->getView('identity', 'oai');
				$view->setModel($model, true);
				$view->display();
				break;
			case 'listsets':
				$this->listSets();
				break;
			case 'listmetadataformats':
				$this->listMetaDataFormats();
				break;
			case 'listrecords':
				// E.g.
http://localhost:81/fabrik31x/public_html/index.php?option=com_fabrik&controller=oai&verb=ListRecords&set=setname&format=oai&limitstart17=0&from=2012-01-01&until=2015-01-01
				$this->listRecords();
				break;
			case 'getrecord':
				//
http://localhost:81/fabrik31x/public_html/index.php?option=com_fabrik&controller=oai&verb=GetRecord&identifier
				$this->getRecord();
				break;
			case 'listidentifiers':
				$this->listRecords();
				break;


			default:
				echo $this->model->generateError(array('code' =>
'badVerb',
						'msg' => 'Value of the verb argument is not a legal
OAI-PMH verb, the
						verb argument is missing, or the verb argument is repeated.'));
				break;
		}

		return $this;
	}

	/**
	 * Get record
	 */
	private function getRecord()
	{
		$identifier = $this->input->getString('identifier',
'');
		$metaDataPrefix =
$this->input->getString('metadataPrefix', '');

		if ($identifier === '' ||
!$this->model->checkIdentifier($identifier))
		{
			echo $this->model->generateError(array('code' =>
'idDoesNotExist',
					'msg' => 'Get Record: No matching
identifier'));

			return;
		}

		if (!$this->model->supportMetaDataPrefix($metaDataPrefix))
		{
			echo $this->model->generateError(array('code' =>
'cannotDisseminateFormat',
					'msg' => 'Cant use the prefix: ' .
$metaDataPrefix));

			return;
		}

		$url =
'index.php?option=com_fabrik&view=details&format=oai';
		list($listId, $rowId) =
$this->model->getListRowIdFromIdentifier($identifier);

		/** @var FabrikFEModelList $listModel */
		$listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$listModel->setId($listId);
		$formId = $listModel->getFormModel()->getId();
		$url .= '&formid=' . $formId . '&rowid=' .
$rowId;
		$this->app->redirect($url);
	}

	/**
	 * List records
	 *
http://localhost:81/fabrik31x/public_html/index.php?option=com_fabrik&controller=oai&format=oai&verb=ListRecords&set=testdata
	 */
	private function listRecords()
	{
		$url    =
'index.php?option=com_fabrik&view=list&format=oai';
		$set = $this->input->get('set');
		$listId = (int) $this->model->listIdFromSetName($set);

		if ($listId === 0)
		{
			echo $this->model->generateError(array('code' =>
'badArgument', 'msg' => 'ListRecords - no set
found'));

			return;
		}

		$url .= '&listid=' . $listId;

		$resumptionToken =
urldecode($this->input->getString('resumptionToken'));
		parse_str($resumptionToken, $token);
		$from  = ArrayHelper::getValue($token, 'from',
$this->input->get('from', ''));
		$until = ArrayHelper::getValue($token, 'until',
$this->input->get('until', ''));
		$start = ArrayHelper::getValue($token, 'limitstart' . $listId,
$this->input->get('limitstart' . $listId));

		if ($from !== '')
		{
			$url .= '&from=' . $from;
		}

		if ($until !== '')
		{
			$url .= '&until=' . $until;
		}

		if ($start !== '')
		{
			$url .= '&limitstart' . $listId . '=' . $start;
		}

		$this->app->redirect($url);
	}

	/**
	 * List sets
	 */
	protected function listSets()
	{
		$listSet = $this->model->listSets();
		echo $listSet->saveXML();
	}

	/**
	 * List Meta data formats.
	 */
	protected function listMetaDataFormats()
	{
		$identifier = $this->input->getString('identifier');
		$xml = $this->model->listMetaDataFormats($identifier);
		echo $xml->saveXML();
	}

}
controllers/plugin.php000064400000011060151165346170011130 0ustar00<?php
/**
 * Fabrik Plugin Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Factory;
use \Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;

jimport('joomla.application.component.controller');

/**
 * Fabrik Plugin Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
class FabrikControllerPlugin extends BaseController
{
	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * Ajax action called from element
	 * 11/07/2011 - I've updated things so that any plugin ajax call uses
'view=plugin' rather than controller=plugin
	 * this means that the controller used is now plugin.php and not
plugin.raw.php
	 *
	 * @return  null
	 */
	public function pluginAjax()
	{
		$app    = Factory::getApplication();
		$input  = $app->getInput();
		$plugin = $input->get('plugin', '');
		$method = $input->get('method', '');
		$group  = $input->get('g', 'element');

		$pluginManager = FabrikWorker::getPluginManager();

		try
		{
			// First lets try the fabrik plugin manager - needed when loading
namespaced plugins
			$pluginManager->loadPlugIn($plugin, $group);
		} catch (Exception $e)
		{
			if (!PluginHelper::importPlugin('fabrik_' . $group, $plugin))
			{
				$o      = new stdClass;
				$o->err = 'unable to import plugin fabrik_' . $group .
' ' . $plugin;
				echo json_encode($o);

				return;
			}
		}

		if (substr($method, 0, 2) !== 'on')
		{
			$method = 'on' . StringHelper::ucfirst($method);
		}

//		$dispatcher = JEventDispatcher::getInstance();
//		$dispatcher    = Factory::getApplication()->getDispatcher();
//		$dispatcher->triggerEvent($method);
		$dispatcher = Factory::getApplication()->triggerEvent($method);
	}

	/**
	 * Custom user ajax class handling as per F1.0.x
	 *
	 * @return  null
	 */
	public function userAjax()
	{
		$db = FabrikWorker::getDbo();
		require_once COM_FABRIK_FRONTEND . '/user_ajax.php';
		$app      = Factory::getApplication();
		$input    = $app->getInput();
		$method   = $input->get('method', '');
		$userAjax = new userAjax($db);

		if (method_exists($userAjax, $method))
		{
			$userAjax->$method();
		}
	}

	/**
	 * Run the cron job
	 *
	 * @param   object &$pluginManager Fabrik plugin manager
	 *
	 * @return  null
	 */
	public function doCron(&$pluginManager)
	{
		$db    = FabrikWorker::getDbo();
		$app   = Factory::getApplication();
		$input = $app->getInput();
		$cid   = $input->get('element_id', array(),
'array');
		$cid   = ArrayHelper::toInteger($cid);

		if (empty($cid))
		{
			return;
		}

		$query = $db->getQuery();
		$query->select('id,
plugin')->from('#__fabrik_cron');

		if (!empty($cid))
		{
			$query->where(' id IN (' . implode(',', $cid) .
')');
		}

		$db->setQuery($query);
		$rows      = $db->loadObjectList();
		$listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$c         = 0;

		foreach ($rows as $row)
		{
			// Load in the plugin
			/** @var PlgFabrik_Cron $plugin */
			$plugin = $pluginManager->getPlugIn($row->plugin,
'cron');
			$plugin->setId($row->id);
			$params        = $plugin->getParams();
			$thisListModel = clone ($listModel);
			$thisListModel->setId($params->get('table'));
			$table = $listModel->getTable();
			/**
			 * $$$ hugh @TODO - really think we need to add two more options to the
cron plugins
			 * 1) "Load rows?" because it really may not be practical to
load ALL rows into $data
			 * on large tables, and the plugin itself may not need all data.
			 * 2) "Bypass prefilters" - I think we need a way of bypassing
pre-filters for cron
			 * jobs, as they are run with access of whoever happened to hit the page
at the time
			 * the cron was due to run, so it's pot luck as to what pre-filters
get applied.
			 */
			$total = $thisListModel->getTotalRecords();
			$nav   = $thisListModel->getPagination($total, 0, $total);
			$data  = $thisListModel->getData();

			// $$$ hugh - added table model param, in case plugin wants to do
further table processing
			$c = $c + $plugin->process($data, $thisListModel);
		}

		$query = $db->getQuery();
		$query->update('#__fabrik_cron')->set('lastrun=NOW()')->where('id
IN (' . implode(',', $cid) . ')');
		$db->setQuery($query);
		$db->execute();
	}
}
controllers/plugin.raw.php000064400000007141151165346170011725
0ustar00<?php
/**
 * Fabrik Plugin Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Factory;
use Joomla\String\StringHelper;

jimport('joomla.application.component.controller');

/**
 * Fabrik Plugin Controller
 * DEPRECIATED SEE NOTE FROM 11/07/2011
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
class FabrikControllerPlugin extends BaseController
{
	/**
	 * Means that any method in Fabrik 2, e.e. 'ajax_upload' should
	 * now be changed to 'onAjax_upload'
	 * ajax action called from element
	 *
	 * 11/07/2011 - I've updated things so that any plugin ajax call uses
'view=plugin' rather than controller=plugin
	 * this means that the controller used is now plugin.php and not
plugin.raw.php
	 *
	 * @return  null
	 */

	public function pluginAjax()
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$plugin = $input->get('plugin', '');
		$method = $input->get('method', '');
		$group = $input->get('g', 'element');

		if (!PluginHelper::importPlugin('fabrik_' . $group, $plugin))
		{
			$o = new stdClass;
			$o->err = 'unable to import plugin fabrik_' . $group .
' ' . $plugin;
			echo json_encode($o);

			return;
		}

		if (substr($method, 0, 2) !== 'on')
		{
			$method = 'on' . StringHelper::ucfirst($method);
		}

//		$dispatcher = JEventDispatcher::getInstance();
//		$dispatcher    = Factory::getApplication()->getDispatcher();
//		$dispatcher->triggerEvent($method);
		$dispatcher = Factory::getApplication()->triggerEvent($method);
	}

	/**
	 * Custom user ajax class handling as per F1.0.x
	 *
	 * @return  null
	 */

	public function userAjax()
	{
		$db = FabrikWorker::getDbo();
		require_once COM_FABRIK_FRONTEND . '/user_ajax.php';
		$app = Factory::getApplication();
		$method = $app->getInput()->get('method', '');
		$userAjax = new userAjax($db);

		if (method_exists($userAjax, $method))
		{
			$userAjax->$method();
		}
	}

	/**
	 * Do Cron task
	 *
	 * @param   object  &$pluginManager  pluginmanager
	 *
	 * @return  null
	 */

	public function doCron(&$pluginManager)
	{
		$db = FabrikWorker::getDbo();
		$app = Factory::getApplication();
		$cid = $app->getInput()->get('element_id', array(),
'array');
		$query = $db->getQuery(true);
		$query->select('id,
plugin')->from('#__fabrik_cron');

		if (!empty($cid))
		{
			$query->where(' id IN (' . implode(',', $cid) .
')');
		}

		$db->setQuery($query);
		$rows = $db->loadObjectList();
		// FabrikFEModelview does not exsist !!
		$viewModel = BaseDatabaseModel::getInstance('view',
'FabrikFEModel');
		$c = 0;

		foreach ($rows as $row)
		{
			// Load in the plugin
			$plugin = $pluginManager->getPlugIn($row->plugin,
'cron');
			$plugin->setId($row->id);
			$params = $plugin->getParams();

			$thisViewModel = clone ($viewModel);
			$thisViewModel->setId($params->get('table'));
			$table = $viewModel->getTable();
			$total = $thisViewModel->getTotalRecords();
			$nav = $thisViewModel->getPagination($total, 0, $total);
			$data = $thisViewModel->getData();

			// $$$ hugh - added table model param, in case plugin wants to do
further table processing
			$c = $c + $plugin->process($data, $thisViewModel);
		}

		$query = $db->getQuery();
		$query->update('#__fabrik_cron')->set('lastrun=NOW()')->where('id
IN (' . implode(',', $cid) . ')');
		$db->setQuery($query);
		$db->execute();
	}
}
controllers/visualization.php000064400000010333151165346170012535
0ustar00<?php
/**
 * Abstract Visualization Controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Factory;
use Fabrik\Controllers\Controller;
use Fabrik\Helpers\Html;
use Fabrik\Helpers\Worker;

jimport('joomla.application.component.controller');


/**
 * Abstract Visualization Controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */
class FabrikControllerVisualization extends BaseController
{
	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * Display the view
	 *
	 * @param   boolean  $cachable   If true, the view output will be cached -
NOTE not actually used to control caching!!
	 * @param   array    $urlparams  An array of safe url parameters and their
variable types, for valid values see {@link InputFilter::clean()}.
	 *
	 * @return  BaseController  A BaseController object to support chaining.
	 *
	 * @since   12.2
	 */
	public function display($cachable = false, $urlparams = array())
	{
		$document = Factory::getDocument();
		$input = $this->input;
		$viewName = str_replace('FabrikControllerVisualization',
'', get_class($this));

		if ($viewName == '')
		{
			/**
			 * if we are using a url like
http://localhost/fabrik3.0.x/index.php?option=com_fabrik&view=visualization&id=6
			 * then we need to ascertain which viz to use
			 */
			$viewName = $this->getViewName();
		}

		$viewType = $document->getType();

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		$extraQS =
FabrikWorker::getMenuOrRequestVar('viz_extra_query_string',
'', false, 'menu');
		$extraQS = ltrim($extraQS, '&?');
		$extraQS = FabrikString::encodeqs($extraQS);

		if (!empty($extraQS))
		{
			foreach (explode('&', $extraQS) as $qsStr)
			{
				$parts = explode('=', $qsStr);
				$input->set($parts[0], $parts[1]);
				$_GET[$parts[0]] = $parts[1];
			}
		}

		// Push a model into the view
		if ($model = $this->getModel($viewName))
		{
			$view->setModel($model, true);
		}
		// Display the view
		//$view->error = $this->getError();

		// F3 cache with raw view gives error
		if (!Worker::useCache())
		{
			$view->display();
		}
		else
		{
			// Build unique cache id on url, post and user id
			$user = Factory::getUser();
			$uri = JURI::getInstance();
			$uri = $uri->toString(array('path', 'query'));
			$cacheId = serialize(array($uri, $input->post,
$user->get('id'), get_class($view), 'display',
$this->cacheId));
			$cache = Factory::getCache('com_fabrik', 'view');
			$cache->get($view, 'display', $cacheId);
			Html::addToSessionCacheIds($cacheId);
		}

		return $this;
	}

	/**
	 * If loading via id then we want to get the view name and add the plugin
view and model paths
	 *
	 * @return   string  view name
	 */
	protected function getViewName()
	{
		$viz = FabTable::getInstance('Visualization',
'FabrikTable');
		$viz->load($this->input->getInt('id'));
		$viewName = $viz->plugin;
		$this->addViewPath(JPATH_SITE .
'/plugins/fabrik_visualization/' . $viewName .
'/views');
		BaseDatabaseModel::addIncludePath(JPATH_SITE .
'/plugins/fabrik_visualization/' . $viewName .
'/models');

		return $viewName;
	}

	/**
	 * Override of j!'s getView
	 *
	 * Method to get a reference to the current view and load it if necessary.
	 *
	 * @param   string  $name    The view name. Optional, defaults to the
controller name.
	 * @param   string  $type    The view type. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for view. Optional.
	 *
	 * @return  object  Reference to the view or an error.
	 */
	public function getView($name = '', $type = '',
$prefix = '', $config = array())
	{
		$viewName = str_replace('FabrikControllerVisualization',
'', get_class($this));
		$viewName = $viewName == '' ? $this->getViewName() : $name;

		return parent::getView($viewName, $type, $prefix, $config);
	}
}
helpers/legacy/aliases.php000064400000004142151165346170011616
0ustar00<?php
/**
 * Legacy Fabrik 3.5 Fabrik\Helpers\Html FabrikHelperHTML
 *
 * @package     Joomla
 * @subpackage  Fabrik.helpers
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

class_alias('Fabrik\Document\Renderer\Pdf\ComponentRenderer',
'JDocumentRendererPdfComponent');
class_alias('Fabrik\Document\Renderer\Pdf\HeadRenderer',
'JDocumentRendererPdfHead');
class_alias('Fabrik\Document\Renderer\Pdf\MessageRenderer',
'JDocumentRendererPdfMessage');
class_alias('Fabrik\Document\Renderer\Pdf\ModuleRenderer',
'JDocumentRendererPdfModule');
class_alias('Fabrik\Document\Renderer\Pdf\ModulesRenderer',
'JDocumentRendererPdfModules');
class_alias('Fabrik\Document\PdfDocument',
'JDocumentPdf');
class_alias('Fabrik\Document\Renderer\Partial\ComponentRenderer',
'JDocumentRendererPartialComponent');
class_alias('Fabrik\Document\Renderer\Partial\HeadRenderer',
'JDocumentRendererPartialHead');
class_alias('Fabrik\Document\Renderer\Partial\MessageRenderer',
'JDocumentRendererPartialMessage');
class_alias('Fabrik\Document\Renderer\Partial\ModuleRenderer',
'JDocumentRendererPartialModule');
class_alias('Fabrik\Document\Renderer\Partial\ModulesRenderer',
'JDocumentRendererPartialModules');
class_alias('Fabrik\Document\PartialDocument',
'JDocumentPartial');
class_alias('Fabrik\Helpers\Worker', 'FabrikWorker');
class_alias('Fabrik\Helpers\Pdf', 'FabrikPDFHelper');
class_alias('Fabrik\Helpers\ArrayHelper',
'FArrayHelper');
class_alias('Fabrik\Helpers\StringHelper',
'FabrikString');
class_alias('Fabrik\Helpers\Element',
'FabrikHelperElement');
class_alias('Fabrik\Helpers\Html', 'FabrikHelperHTML');
//class_alias('Fabrik\Helpers\LayoutFile',
'FabrikLayoutFile');
class_alias('Fabrik\Helpers\Image', 'FabimageHelper');
//class_alias('Fabrik\Helpers\Pagination',
'FPagination');
class_alias('Fabrik\Helpers\Googlemap',
'FabGoogleMapHelper');

if (file_exists(JPATH_LIBRARIES .
'/fabrik/fabrik/fabrik/Helpers/Custom.php'))
{
	class_alias('Fabrik\Helpers\Custom', 'FabrikCustom');
}language/ar-AA/ar-AA.com_fabrik.ini000064400000027613151165346200012701
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="اضافة"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="اضافة خيار
جديد الى ما سبق"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="بحث متقدم"
COM_FABRIK_ALL="الكل"
COM_FABRIK_ALL_OF_THESE_TERMS="مل الخيارات"
COM_FABRIK_AND="و"
COM_FABRIK_ANY_OF_THESE_TERMS="اي من الخيارات"
COM_FABRIK_APPLY="تطبيق"
COM_FABRIK_AVERAGE="المعدل"
COM_FABRIK_BEGINS_WITH="البدء ب"
COM_FABRIK_BETWEEN="بين"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="استعراض المجلدات"
COM_FABRIK_CANCEL="الغاء"
COM_FABRIK_CLEAR="تفريغ حقول التصفية"
COM_FABRIK_CLOSE_WINDOW="اغلاق"
COM_FABRIK_CONDITION="الشرط"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="هل أنت متأكد أنك تريد
حذف هذه السجلات؟"
COM_FABRIK_CONFIRM_DROP="هل تريد حقا حذف جميع
السجلات وإعادة تعيين هذا المفتاح إلى 0
الجداول؟"
COM_FABRIK_CONTAINS="المحتوى"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="العدد"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="CSV تم  عملية التصدير"
COM_FABRIK_CSV_DOWNLOADING="CSV تم تحميل ملف "
COM_FABRIK_CSV_DOWNLOAD_HERE="حمل هنل"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="عذرا لم يتم العثور
على الحقول التالية في ملف CSV في هذا
الجدول:"
COM_FABRIK_CSV_FILE="CSV ملف"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="و"
COM_FABRIK_DATE_RANGE_BETWEEN="بين"
COM_FABRIK_DELETE="حذف"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="اظهار #"
COM_FABRIK_DROP_EXISTING_DATA="حذف الداتا
الحالية"
COM_FABRIK_EDIT="تحريح"
COM_FABRIK_ELEMENT="عنصر"
COM_FABRIK_EMAIL_MSG=". قد أرسلت لك الصفحة
التالية من موقع٪ S من قبل :٪ S (٪ S) يمكن \n\n
يمكنك الوصول إليه على العنوان التالي: \n٪
S"
COM_FABRIK_EMPTY="فارغ"
COM_FABRIK_END="النهاية"
COM_FABRIK_ENDS_WITH="النهاية ب"
COM_FABRIK_EQUALS="يساوي"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="العبارة بالضبط"
COM_FABRIK_EXPORT="تصدير"
COM_FABRIK_EXPORT_TO_CSV="CSV تصدير الى "
COM_FABRIK_FAILED_VALIDATION="حقول التحقق"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV ملف "
COM_FABRIK_FIELD_CSV_FILE_DESC="  CSV الرجاء اختيار ملف
"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="خذف
االبيانات"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="سيتم إزالة
البيانات الموجودة من القائمة قبل استيراد
البيانات من CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="الحقل
المحدد"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="الحرف
المستخدمة في ملف CSV لفصل بيانات
الخلايا"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="تنسيق"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="التطبيق
المستخدم في تصدير ملف CSV (لازمة لضمان يتم
استخدام الترميز الصحيح"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="استبدال"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="الكتابة فوق
أية سجلات متطابقة مع البيانات CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL=" Tab او 
محدد"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="إذا دققت قد
تم تجاهل محدد الحقل ويتم تعيين حرف TAB 
بدلا من ذلك."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="محدد
نصي"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="الحرف
المستخدمة في ملف CSV إلى سيحتوى على قيم
نصية."
COM_FABRIK_FIELD_DELIMITER="الحقل المحدد"
COM_FABRIK_FILE_TYPE="نوع الملف"
COM_FABRIK_FILTER="التصفية"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="الكل"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="تفريغ حقول التصفية"
COM_FABRIK_FORM="من"
COM_FABRIK_FORM_FIELDS="من الحقول"
COM_FABRIK_FORM_NOT_PUBLISHED="عذرا النموذج غير
منشور"
COM_FABRIK_FORM_SAVED="تم حفظ النموذج"
COM_FABRIK_GO="اذهب"
COM_FABRIK_GREATER_THAN="اكبر من"
COM_FABRIK_GROUP_BY="مجمع حسب"
COM_FABRIK_IMPORT_CSV=" CSV استيراد"
COM_FABRIK_IMPORT_CSV_FILE=" CSV استيراد ملف "
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="لم يتم تحديد اي
ملف "
COM_FABRIK_IMPORT_FROM_CSV=" CSV استيراد  من ملف "
COM_FABRIK_INCLUDE_CALCULATIONS="يحتوي العمليات
الحسابية"
COM_FABRIK_INCLUDE_DATA=":يحتوي البيانات"
COM_FABRIK_INCLUDE_FILTERS="يحتوي حقول التصفية:"
COM_FABRIK_INCLUDE_RAW_DATA=":يحتوي السجلات "
COM_FABRIK_INCORRECT_LIST_ID="رقم القائمة خاطئ"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="هذا النموذج
يستخدم بيانات المتصل، ولكن خارجيتها٪ S
الرئيسية، لا يتم نشر. وهذا يسبب مشاكل عند
حفظ النموذج. الرجاء الاتصال مع صاحب
الموقع فيما يتعلق بهذه المسألة"
COM_FABRIK_LABEL="عنوان"
COM_FABRIK_LESS_THAN="اصغر من"
COM_FABRIK_LINKED_FORM_ADD="اضافة"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="معرف الجدول لم
يتم تعيين - لا يمكن أن يتم  تصحيحه"
COM_FABRIK_LIST_NO_DATA_MSG="لا سجلات"
COM_FABRIK_LIST_NOT_PUBLISHED="عذرا  الجدول غير
منشور "
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE=" cookie  التحميل من "
COM_FABRIK_LOADING_FROM_DATABASE="التحميل من قاعدة
البيانات"
COM_FABRIK_MEDIAN="متوسط"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="يرجى التأكد من أنك
قمت بتحديد مفتاح أساسي للجدول، لا يمكن
لبرمجية معالجة هذا الانضمام حتى كنت قد
فعلت ذلك"
COM_FABRIK_NEXT="التالي"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="لم بتم  العثور
على اي مفتاح لجدوال"
COM_FABRIK_NO_RECORDS="لم يتم العثور على اي
سجلات"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="لم يتم العثور على
اي سجلات"
COM_FABRIK_NO_REPEAT_GROUP_DATA="لايوجد اي بيانات"
COM_FABRIK_NONE="لا شيء"
COM_FABRIK_NONE_OF_THESE_TERMS="أيا من هذه الشروط"
COM_FABRIK_NOT_EQUALS="لايساوي"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="او"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="الكتابة فوق
سجلات متطابقة"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="الرجاء الاختيار"
COM_FABRIK_PLEASE_SELECT_A_ROW="يرجى تحديد صف"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="الرجاء
اختيار جميع حقول التصفية المطلوبة"
COM_FABRIK_PREV="السابق"
COM_FABRIK_PREVIOUS="السابق"
COM_FABRIK_PRINT="طباعة"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="وقد تم تشكيل
مرشح الاستعلام مسبقا ولكنها لم تقدم قيمة
/ الاستعلام"
COM_FABRIK_RECORDS="سجلات"
COM_FABRIK_RECORDS_DELETED="تم حذف السجلات"
COM_FABRIK_RECORD_ADDED_UPDATED="تم اضافة /تحديث
السجل"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="يبدو أنك بدأت
بالفعل في تعبئة هذا النموذج. بك بدءا من
الصفحة الأخيرة التي قمت بزيارتها. إذا كنت
ترغب في إعادة تشغيل شكل اضغط على زر
'تفريغ' "
COM_FABRIK_SAVE="ححفظ"
COM_FABRIK_SAVING_TO="حفظ الى"
COM_FABRIK_SEARCH="بحث"
COM_FABRIK_SELECT="تحديد"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="الرجاء اختيار
حقل تصفية واحد على الاقل"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="حدد الاعمدة
لتصدير"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="حدد بعض الحقول
لحذف"
COM_FABRIK_SEND_EMAIL="ارسال البريد
الالكتروني"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="عذرا
الرسم التوضيحي غير منشور"
COM_FABRIK_START="ابداء"
COM_FABRIK_SUBSCRIBE_RSS="RSS"
COM_FABRIK_SUCCESS="نجاح"
COM_FABRIK_SUM="مجموع"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="الرجاء التاكد من
انك قد قمت بتركيب جميع اللوحق المطلوبة
لبرمجيةn"
COM_FABRIK_TEXT_DELIMITER="محدد نصي"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="تم ارسال
العنصر"
COM_FABRIK_TOGGLE="تبديل"
COM_FABRIK_TOTAL="الاجمالي"
COM_FABRIK_VALIDATING="تحقق من الصحة"
COM_FABRIK_VALIDATION_ERROR="خطا في ادخال"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="استعراض"
COM_FABRIK_VIEW_ALL="استعراض الكل"
COM_FABRIK_WHERE="المكان"
COM_FABRIK_YOUR_EMAIL="بريدك الالكتروني"
COM_FABRIK_YOUR_FRIENDS_EMAIL="بريداصدقاءك"
COM_FABRIK_YOUR_NAME="اسمك "
COM_FABRIK_MESSAGE_SUBJECT="العنوان"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/ar-AA/ar-AA.com_fabrik.sys.ini000064400000027267151165346200013523
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="اضافة"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="اضافة خيار
جديد الى ما سبق"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="بحث متقدم"
COM_FABRIK_ALL="الكل"
COM_FABRIK_ALL_OF_THESE_TERMS="مل الخيارات"
COM_FABRIK_AND="و"
COM_FABRIK_ANY_OF_THESE_TERMS="اي من الخيارات"
COM_FABRIK_APPLY="تطبيق"
COM_FABRIK_AVERAGE="المعدل"
COM_FABRIK_BEGINS_WITH="البدء ب"
COM_FABRIK_BETWEEN="بين"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="استعراض المجلدات"
COM_FABRIK_CANCEL="الغاء"
COM_FABRIK_CLEAR="تفريغ حقول التصفية"
COM_FABRIK_CLOSE_WINDOW="اغلاق"
COM_FABRIK_CONDITION="الشرط"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="هل أنت متأكد أنك تريد
حذف هذه السجلات؟"
COM_FABRIK_CONFIRM_DROP="هل تريد حقا حذف جميع
السجلات وإعادة تعيين هذا المفتاح إلى 0
الجداول؟"
COM_FABRIK_CONTAINS="المحتوى"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="العدد"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="CSV تم  عملية التصدير"
COM_FABRIK_CSV_DOWNLOADING="CSV تم تحميل ملف "
COM_FABRIK_CSV_DOWNLOAD_HERE="حمل هنل"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="عذرا لم يتم العثور
على الحقول التالية في ملف CSV في هذا
الجدول:"
COM_FABRIK_CSV_FILE="CSV ملف"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="و"
COM_FABRIK_DATE_RANGE_BETWEEN="بين"
COM_FABRIK_DELETE="حذف"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="اظهار #"
COM_FABRIK_DROP_EXISTING_DATA="حذف الداتا
الحالية"
COM_FABRIK_EDIT="تحريح"
COM_FABRIK_ELEMENT="عنصر"
COM_FABRIK_EMAIL_MSG=". قد أرسلت لك الصفحة
التالية من موقع٪ S من قبل :٪ S (٪ S) يمكن \n\n
يمكنك الوصول إليه على العنوان التالي: \n٪
S"
COM_FABRIK_EMPTY="فارغ"
COM_FABRIK_END="النهاية"
COM_FABRIK_ENDS_WITH="النهاية ب"
COM_FABRIK_EQUALS="يساوي"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="العبارة بالضبط"
COM_FABRIK_EXPORT="تصدير"
COM_FABRIK_EXPORT_TO_CSV="CSV تصدير الى "
COM_FABRIK_FAILED_VALIDATION="حقول التحقق"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV ملف "
COM_FABRIK_FIELD_CSV_FILE_DESC="  CSV الرجاء اختيار ملف
"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="خذف
االبيانات"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="سيتم إزالة
البيانات الموجودة من القائمة قبل استيراد
البيانات من CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="الحقل
المحدد"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="الحرف
المستخدمة في ملف CSV لفصل بيانات
الخلايا"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="تنسيق"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="التطبيق
المستخدم في تصدير ملف CSV (لازمة لضمان يتم
استخدام الترميز الصحيح"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="استبدال"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="الكتابة فوق
أية سجلات متطابقة مع البيانات CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL=" Tab او 
محدد"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="إذا دققت قد
تم تجاهل محدد الحقل ويتم تعيين حرف TAB 
بدلا من ذلك."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="محدد
نصي"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="الحرف
المستخدمة في ملف CSV إلى سيحتوى على قيم
نصية."
COM_FABRIK_FIELD_DELIMITER="الحقل المحدد"
COM_FABRIK_FILE_TYPE="نوع الملف"
COM_FABRIK_FILTER="التصفية"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="الكل"
COM_FABRIK_FILTERS_CLEARED="تفريغ حقول التصفية"
COM_FABRIK_FORM="من"
COM_FABRIK_FORM_FIELDS="من الحقول"
COM_FABRIK_FORM_NOT_PUBLISHED="عذرا النموذج غير
منشور"
COM_FABRIK_FORM_SAVED="تم حفظ النموذج"
COM_FABRIK_GO="اذهب"
COM_FABRIK_GREATER_THAN="اكبر من"
COM_FABRIK_GROUP_BY="مجمع حسب"
COM_FABRIK_IMPORT_CSV=" CSV استيراد"
COM_FABRIK_IMPORT_CSV_FILE=" CSV استيراد ملف "
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="لم يتم تحديد اي
ملف "
COM_FABRIK_IMPORT_FROM_CSV=" CSV استيراد  من ملف "
COM_FABRIK_INCLUDE_CALCULATIONS="يحتوي العمليات
الحسابية"
COM_FABRIK_INCLUDE_DATA=":يحتوي البيانات"
COM_FABRIK_INCLUDE_FILTERS="يحتوي حقول التصفية:"
COM_FABRIK_INCLUDE_RAW_DATA=":يحتوي السجلات "
COM_FABRIK_INCORRECT_LIST_ID="رقم القائمة خاطئ"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="هذا النموذج
يستخدم بيانات المتصل، ولكن خارجيتها٪ S
الرئيسية، لا يتم نشر. وهذا يسبب مشاكل عند
حفظ النموذج. الرجاء الاتصال مع صاحب
الموقع فيما يتعلق بهذه المسألة"
COM_FABRIK_LABEL="عنوان"
COM_FABRIK_LESS_THAN="اصغر من"
COM_FABRIK_LINKED_FORM_ADD="اضافة"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="معرف الجدول لم
يتم تعيين - لا يمكن أن يتم  تصحيحه"
COM_FABRIK_LIST_NO_DATA_MSG="لا سجلات"
COM_FABRIK_LIST_NOT_PUBLISHED="عذرا  الجدول غير
منشور "
COM_FABRIK_LOADING=" التحميل "
COM_FABRIK_LOADING_FROM_COOKIE=" cookie  التحميل من "
COM_FABRIK_LOADING_FROM_DATABASE="التحميل من قاعدة
البيانات"
COM_FABRIK_MEDIAN="متوسط"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="يرجى التأكد من أنك
قمت بتحديد مفتاح أساسي للجدول، لا يمكن
لبرمجية معالجة هذا الانضمام حتى كنت قد
فعلت ذلك"
COM_FABRIK_NEXT="التالي"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="لم بتم  العثور
على اي مفتاح لجدوال"
COM_FABRIK_NO_RECORDS="لم يتم العثور على اي
سجلات"
COM_FABRIK_NO_REPEAT_GROUP_DATA="لايوجد اي بيانات"
COM_FABRIK_NONE="لا شيء"
COM_FABRIK_NONE_OF_THESE_TERMS="أيا من هذه الشروط"
COM_FABRIK_NOT_EQUALS="لايساوي"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="او"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="الكتابة فوق
سجلات متطابقة"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="الرجاء الاختيار"
COM_FABRIK_PLEASE_SELECT_A_ROW="يرجى تحديد صف"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="الرجاء
اختيار جميع حقول التصفية المطلوبة"
COM_FABRIK_PREV="السابق"
COM_FABRIK_PREVIOUS="السابق"
COM_FABRIK_PRINT="طباعة"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="وقد تم تشكيل
مرشح الاستعلام مسبقا ولكنها لم تقدم قيمة
/ الاستعلام"
COM_FABRIK_RECORDS="سجلات"
COM_FABRIK_RECORDS_DELETED="تم حذف السجلات"
COM_FABRIK_RECORD_ADDED_UPDATED="تم اضافة /تحديث
السجل"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="ححفظ"
COM_FABRIK_SAVING_TO="حفظ الى"
COM_FABRIK_SEARCH="بحث"
COM_FABRIK_SELECT="تحديد"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="الرجاء اختيار
حقل تصفية واحد على الاقل"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="حدد الاعمدة
لتصدير"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="حدد بعض الحقول
لحذف"
COM_FABRIK_SEND_EMAIL="ارسال البريد
الالكتروني"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="عذرا
الرسم التوضيحي غير منشور"
COM_FABRIK_START="ابداء"
COM_FABRIK_SUBSCRIBE_RSS="RSS"
COM_FABRIK_SUCCESS="نجاح"
COM_FABRIK_SUM="مجموع"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="الرجاء التاكد من
انك قد قمت بتركيب جميع اللوحق المطلوبة
لبرمجيةn"
COM_FABRIK_TEXT_DELIMITER="محدد نصي"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="تم ارسال
العنصر"
COM_FABRIK_TOGGLE="تبديل"
COM_FABRIK_TOTAL="الاجمالي"
COM_FABRIK_VALIDATING="تحقق من الصحة"
COM_FABRIK_VALIDATION_ERROR="خطا في ادخال"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="استعراض"
COM_FABRIK_VIEW_ALL="استعراض الكل"
COM_FABRIK_WHERE="المكان"
COM_FABRIK_YOUR_EMAIL="بريدك الالكتروني"
COM_FABRIK_YOUR_FRIENDS_EMAIL="بريداصدقاءك"
COM_FABRIK_YOUR_NAME="اسمك "
COM_FABRIK_MESSAGE_SUBJECT="العنوان"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/da-DK/da-DK.com_fabrik.ini000064400000024760151165346200012677
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Tilføj"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Tilføj en ny mulighed til
de ovenstående."
COM_FABRIK_ADD_GROUP="Tilføj&nbsp;gruppe"
COM_FABRIK_ADVANCED_SEARCH="Avanceret søgning"
COM_FABRIK_ALL="alle"
COM_FABRIK_ALL_OF_THESE_TERMS="Alle disse termer"
COM_FABRIK_AND="Og"
COM_FABRIK_ANY_OF_THESE_TERMS="Enhver af disse termer"
COM_FABRIK_APPLY="Anvend"
COM_FABRIK_AVERAGE="Gennemsnit"
COM_FABRIK_BEGINS_WITH="BEGYNDER MED"
COM_FABRIK_BETWEEN="Imellem"
COM_FABRIK_BIRTHDAY_TODAY="Er fødselsdag"
COM_FABRIK_BROWSE_FOLDERS="Gennemse mapper"
COM_FABRIK_CANCEL="Annuller"
COM_FABRIK_CLEAR="Ryd filtre"
COM_FABRIK_CLOSE_WINDOW="Luk"
COM_FABRIK_CONDITION="Betingelse"
COM_FABRIK_CONFIRM_DELETE_1="Er du sikker på at du vil slette denne
post?"
COM_FABRIK_CONFIRM_DELETE="Er du sikker på at du vil slette %s
poster?"
COM_FABRIK_CONFIRM_DROP="Ønsker du virkelig at slette alle poster og
nulstille tabellens nøgle til 0?"
COM_FABRIK_CONTAINS="INDEHOLDER"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Vi kan ikke finde denne
post."
COM_FABRIK_COUNT="Antal"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV poster tilføjet og %s poster
opdateret."
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nye elementer
tilføjet, %s CSV poster tilføjet og %s poster opdateret."
COM_FABRIK_CSV_COMPLETE="CSV eksport færdig."
COM_FABRIK_CSV_DOWNLOADING="CSV fil downloades."
COM_FABRIK_CSV_DOWNLOAD_HERE="Download her."
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Ingen poster tilgængelige til CSV
eksport."
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Desværre - de følgende felter i
CSV filen, kan ikke findes i denne tabel:"
COM_FABRIK_CSV_FILE="CSV fil"
COM_FABRIK_CSV_IMPORT_HEADING="Importer: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel(format gemt fra Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format eksporteret fra
Fabrik eller fra Excel med indstillingen 'Filtype= unicode
tekst')"
COM_FABRIK_DATE_RANGE_AND="og"
COM_FABRIK_DATE_RANGE_BETWEEN="Imellem"
COM_FABRIK_DELETE="Slet"
COM_FABRIK_DELETE_GROUP="Slet&nbsp;gruppe"
COM_FABRIK_DISPLAY_NUM="Vis #"
COM_FABRIK_DROP_EXISTING_DATA="Slet eksisterende data"
COM_FABRIK_EDIT="Rediger"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Den følgende side fra webstedet %s er blevet
sendt til dig fra %s (%s).\n\nDu kan tilgå det på den følgende
URL:\n%s"
COM_FABRIK_EMPTY="Tøm"
COM_FABRIK_END="Slut"
COM_FABRIK_ENDS_WITH="SLUTTER MED"
COM_FABRIK_EQUALS="LIG MED"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Desværre - admin
skabelonen er kun til brug på Joomla's administrationssider. Vælg
venligst en anden skabelon."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Curl biblioteket er ikke
installeret og dele af denne side er ikke blevet kørt."
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="Fane
skabelonen er inkompatibel med multi side formularer. Anvend enten
bootstrap skabelonen, eller vær sikker på at alle grupper har deres egen
'Sideskift' indstilling sat til off."
COM_FABRIK_ERR_UPLOADS_DISABLED="Installeren kan ikke fortsætte inden
fil upload er aktiveret. Brug venligst metoden Installer fra mappe."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="Et prefilter er blevet sat op
på et afpubliceret element, og vil ikke bliva anvendt: %s."
COM_FABRIK_EXACT_TERMS="Præcis frase"
COM_FABRIK_EXPORT="Eksporter"
COM_FABRIK_EXPORT_TO_CSV="Eksporter til CSV"
COM_FABRIK_FAILED_VALIDATION="Validering fejlede"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV fil"
COM_FABRIK_FIELD_CSV_FILE_DESC="Vælg en CSV fil der skal
uploades"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Slet data"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Fjerner eksisterende data
fra listen inden import af data fra CSV fil."
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Felt
afgrænser"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Karakteren der
anvendes i CSV filen til at adskille celle data."
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Hvilken applikation har
eksporteret CSV filen (skal bruges til at sikre at den korrekte kodning
anvendes)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overskriv"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overskriver alle matchende
poster med CSV filens data."
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="eller Tab
afgrænser"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Hvis markeret, så vil
feltafgrænseren blive ignoreret og tab karakteren bliver tildelt i
stedet."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Tekst
afgrænser"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Karakteren der
anvendes i CSV filen til at afgrænse tekstværdier."
COM_FABRIK_FIELD_DELIMITER="Felt afgrænser"
COM_FABRIK_FILE_TYPE="Filtype"
COM_FABRIK_FILTER="Filter"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Filteret %s indstillinger er
blevet afskåret, da de indeholder flere poster end Fabrik's globale
'Filter liste maks' indstilling tillader."
COM_FABRIK_FILTER_PLEASE_SELECT="Alle"
COM_FABRIK_FILTERS_ACTIVE="Filter er aktivt"
COM_FABRIK_FILTERS_CLEARED="Filter ryddet"
COM_FABRIK_FORM="Formular"
COM_FABRIK_FORM_FIELDS="Formularfelter"
COM_FABRIK_FORM_NOT_PUBLISHED="Desværre - denne formular er ikke
publiceret."
COM_FABRIK_FORM_SAVED="Formular gemt"
COM_FABRIK_GO="Kør"
COM_FABRIK_GREATER_THAN="STØRRE END"
COM_FABRIK_GROUP_BY="Grupperet efter"
COM_FABRIK_IMPORT_CSV="Importer CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importer CSV fil"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Ingen fil vlagt"
COM_FABRIK_IMPORT_FROM_CSV="Importer fra CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Inkluder beregninger"
COM_FABRIK_INCLUDE_DATA="Inkluder data:"
COM_FABRIK_INCLUDE_FILTERS="Inkluder filtre:"
COM_FABRIK_INCLUDE_RAW_DATA="Inkluder rå data:"
COM_FABRIK_INCORRECT_LIST_ID="Fejlagtigt liste id"
COM_FABRIK_IS_EMPTY="ER TOM"
COM_FABRIK_IS_NOT_EMPTY="ER IKKE TOM"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Denne formular anvender
joinede data, men dets fjern nøgle %s, er ikke publiceret. Dette vil give
problemer når du gemmer formularen. Kontakt venligst websteds ejeren
omkring dette problem."
COM_FABRIK_LABEL="Label"
COM_FABRIK_LESS_THAN="MINDRE END"
COM_FABRIK_LINKED_FORM_ADD="Tilføj"
COM_FABRIK_LIST_SHORTCUTS_ADD="t"
COM_FABRIK_LIST_SHORTCUTS_EDIT="r"
COM_FABRIK_LIST_SHORTCUTS_DELETE="s"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Liste"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Liste id ikke sat - kan ikke
køre"
COM_FABRIK_LIST_NO_DATA_MSG="Ingen poster"
COM_FABRIK_LIST_NOT_PUBLISHED="Desværre - denne liste er ikke
publiceret."
COM_FABRIK_LOADING="Indlæser..."
COM_FABRIK_LOADING_FROM_COOKIE="Indlæser fra cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Indlæser fra database"
COM_FABRIK_MEDIAN="Median"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Vær venligst sikker på, at du
har valgt en primær nøgle til din tabel. Fabrik kan ikke gennemføre
denne join, hvis du ikke har gjort dette."
COM_FABRIK_NEXT="Næste"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Utilstrækkelige
adgangsrettigheder. Log venligst på."
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Intet element fundet som
matcher %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Ingen nøgle fundet til denne
liste"
COM_FABRIK_NO_RECORDS="Ingen poster fundet"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Ingen poster fundet"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Ingen data"
COM_FABRIK_NONE="Ingen"
COM_FABRIK_NONE_OF_THESE_TERMS="Ingen af disse termer"
COM_FABRIK_NOT_EQUALS="IKKE LIG MED"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Desværre, men du har ikke
tilladelse til at tilføje denne post"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Desværre, men du har ikke
tilladelse til at redigere denne post"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf bibliotek ikke
fundet."
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Ingen elementer er valgt
til inkludering i søg alle"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Din søgefrase er for kort
til at søge i listen. Prøv venligst at søge efter en længere
frase."
COM_FABRIK_OR="eller"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overskriv matchende
poster"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Vælg venligst"
COM_FABRIK_PLEASE_SELECT_A_ROW="Vælg venligst en række."
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Vælg venligst alle
krævede filtre."
COM_FABRIK_PREV="Forr"
COM_FABRIK_PREVIOUS="Forrige"
COM_FABRIK_PRINT="Udskriv"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Et forespørgsels prefilter
er blevet sat, men uden en værdi/forespørgsel."
COM_FABRIK_RECORDS="poster"
COM_FABRIK_RECORDS_DELETED="Poster slettet"
COM_FABRIK_RECORD_ADDED_UPDATED="Post tilføjet/opdateret"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Det ser ud til at du allerede er
begyndt på at udfylde denne formular. Du starter fra den sidste side du
besøgte. Hvis du ønsker at genstarte formularen, så tryk venligst på
knappen 'Ryd'"
COM_FABRIK_SAVE="Gem"
COM_FABRIK_SAVING_TO="gemmer til"
COM_FABRIK_SEARCH="Søg"
COM_FABRIK_SELECT="Vælg"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Vælg venligst mindst et
filter"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Vælg kolonner der skal
eksporteres"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Vælg nogle rækker der skal
slettes"
COM_FABRIK_SEND_EMAIL="Send email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Desværre - denne
visualisering er afpubliceret."
COM_FABRIK_START="Start"
COM_FABRIK_SUBSCRIBE_RSS="Abonner på RSS"
COM_FABRIK_SUCCESS="Succes"
COM_FABRIK_SUM="Sum"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Vær venligst sikker på at du
har installeret og publiceret Fabrik system programudvidelsen."
COM_FABRIK_TEXT_DELIMITER="Tekst afgrænser"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Dette element er blevet sendt
til"
COM_FABRIK_TOGGLE="Skift"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validerer"
COM_FABRIK_VALIDATION_ERROR="Valideringsfejl"
COM_FABRIK_VALUE="Værdi"
COM_FABRIK_VIEW="Visning"
COM_FABRIK_VIEW_ALL="Vis alle"
COM_FABRIK_WHERE="Hvor"
COM_FABRIK_YOUR_EMAIL="Din email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Din vens email"
COM_FABRIK_YOUR_NAME="Dit navn"
COM_FABRIK_MESSAGE_SUBJECT="Emne"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Ugyldig underindstillinger angivet
for elementet '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Kør"
COM_FABRIK_VALIDATION="Validering"
COM_FABRIK_EVAL_ERROR_USER_WARNING="En fejl er opstået med et
evalueret felt - informer venligst ejeren af webstedet."
COM_FABRIK_LIST_TABS_ALL="Alle"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Gem"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Anvend"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Gå tilbage"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Slet"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Nulstil"
language/de-DE/de-DE.com_fabrik.ini000064400000025513151165346210012671
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM

COM_FABRIK_ADD="Hinzufügen"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Eine neue Option zu den
obigen hinzufügen"
COM_FABRIK_ADD_GROUP="Gruppe&nbsp;hinzufügen"
COM_FABRIK_ADVANCED_SEARCH="Erweiterte Suche"
COM_FABRIK_ALL="Alle"
COM_FABRIK_ALL_OF_THESE_TERMS="Nach allen Begriffen"
COM_FABRIK_AND="und"
COM_FABRIK_ANY_OF_THESE_TERMS="Nach jedem dieser Begriffe"
COM_FABRIK_APPLY="Ausführen"
COM_FABRIK_AVERAGE="Durchschnitt"
COM_FABRIK_BEGINS_WITH="Beginnt mit"
COM_FABRIK_BETWEEN="zwischen"
COM_FABRIK_BIRTHDAY_TODAY="Ist Geburtstag"
COM_FABRIK_BROWSE_FOLDERS="Ordner durchsuchen"
COM_FABRIK_CANCEL="Abbrechen"
COM_FABRIK_CLEAR="Filter löschen"
COM_FABRIK_CLOSE_WINDOW="Schließen"
COM_FABRIK_CONDITION="Bedingung"
COM_FABRIK_CONFIRM_DELETE_1="Sind sie sicher, dass Sie diesen Eintrag
löschen wollen?"
COM_FABRIK_CONFIRM_DELETE="Sind sie sicher, dass Sie %s Einträge
löschen wollen?"
COM_FABRIK_CONFIRM_DROP="Möchten Sie wirklich alle Einträge löschen
und den PK auf 0 setzen?"
COM_FABRIK_CONTAINS="Enthält"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Dieser Eintrag konnte
nicht gefunden werden."
COM_FABRIK_COUNT="Anzahl"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV Datensätze hinzugefügt und
%s Datensätze aktualisiert."
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s neue Elemente
hinzugefügt, %s CSV Datensätze hinzugefügt und %s Datensätze
aktualisiert."
COM_FABRIK_CSV_COMPLETE="CSV-Export fertig"
COM_FABRIK_CSV_DOWNLOADING="CSV-Datei lädt herunter"
COM_FABRIK_CSV_DOWNLOAD_HERE="Hier herunterladen"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Keine Daten für den CSV-Export
verfügbar."
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Die folgenden Felder in der
CSV-Datei konnten in der Tabelle nicht gefunden werden:"
COM_FABRIK_CSV_FILE="CSV Datei"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (Format von Excel
übernommen)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (Format exportiert von
Fabrik oder von Excel mit der Option 'File type = unicode
text')"
COM_FABRIK_DATE_RANGE_AND="und"
COM_FABRIK_DATE_RANGE_BETWEEN="zwischen"
COM_FABRIK_DELETE="Löschen"
COM_FABRIK_DELETE_GROUP="Gruppe&nbsp;löschen"
COM_FABRIK_DISPLAY_NUM="Anzeigen #"
COM_FABRIK_DROP_EXISTING_DATA="Vorhandene Daten löschen"
COM_FABRIK_EDIT="Bearbeiten"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Die folgende Seite der Website %s wurde Ihnen
von %s ( %s ) empfohlen.\n\nSie können sie unter folgender URL aufrufen:\n
%s"
COM_FABRIK_EMPTY="Leeren"
COM_FABRIK_END="Ende"
COM_FABRIK_ENDS_WITH="Endet mit"
COM_FABRIK_EQUALS="Ist gleich"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Das Admin Template kann
nur auf Joomla Administrationsseiten genutzt werden. Bitte ein anderes
Template auswählen."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Die Curl Library ist nicht
installiert, einige Teile der Seite konnten nicht ausgeführt werden"
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="Die
Tab-Vorlage ist inkompatibel mit mehrseitigen Formularen. Verwenden Sie die
Bootstrap-Vorlage oder stellen Sie sicher, dass alle Gruppen ihre
Seitenwechsel-Option deaktiviert haben"
COM_FABRIK_ERR_UPLOADS_DISABLED="Die Installation kann nicht
fortgesetzt werden solange Datei uploads nicht aktiviert wurden. Bitte
verwenden Sie die Aus Verzeichnis installieren Methode."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="Ein Vorfilter auf einem
unveröffentlichten Element wurde eingerichtet und wird nicht angewendet:
%s"
COM_FABRIK_EXACT_TERMS="Exakte Übereinstimmung"
COM_FABRIK_EXPORT="Export"
COM_FABRIK_EXPORT_TO_CSV="Export zu CSV"
COM_FABRIK_FAILED_VALIDATION="Überprüfung fehlgeschlagen"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV Datei"
COM_FABRIK_FIELD_CSV_FILE_DESC="Wählen Sie eine CSV Datei"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Daten löschen"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Vor dem CSV Import werden
die in der Tabelle vorhandenen Daten gelöscht"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Feld-Trennzeichen"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Dieses Zeichen
trennt in der CSV Datei Feld-Daten"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Mit welcher Anwendung wurde
die CSV-Datei erstellt (wird zum korrekten Dekodieren benötigt)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Überschreiben"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Identische Datensätzte
werden überschrieben"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="oder Tab
Trennzeichen"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Falls angewählt, gilt
der Tabulator als Feld-Trennzeichen"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text-Trennzeichen"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Dieses Zeichen
schließt in der CSV-Datei Texte ein"
COM_FABRIK_FIELD_DELIMITER="Feld-Trennzeichen"
COM_FABRIK_FILE_TYPE="Dateityp"
COM_FABRIK_FILTER="Filter"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Die Optionen eines Filters wurden
beschränkt, da es mehr Einträge gibt als die Fabrik-Option 'Filter
List Max' zulässt."
COM_FABRIK_FILTER_PLEASE_SELECT="Alle"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filter gelöscht"
COM_FABRIK_FORM="Formular"
COM_FABRIK_FORM_FIELDS="Felder"
COM_FABRIK_FORM_NOT_PUBLISHED="Dieses Formular wurde noch nicht
veröffentlicht!"
COM_FABRIK_FORM_SAVED="Formular gespeichert"
COM_FABRIK_GO="Los"
COM_FABRIK_GREATER_THAN="Größer als"
COM_FABRIK_GROUP_BY="Gruppieren"
COM_FABRIK_IMPORT_CSV="CSV Importieren"
COM_FABRIK_IMPORT_CSV_FILE="CSV Datei Importieren"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Keine Datei ausgewählt"
COM_FABRIK_IMPORT_FROM_CSV="Aus CSV Importieren"
COM_FABRIK_INCLUDE_CALCULATIONS="Berechnungen berücksichtigen"
COM_FABRIK_INCLUDE_DATA="Daten berücksichtigen:"
COM_FABRIK_INCLUDE_FILTERS="Filter berücksichtigen:"
COM_FABRIK_INCLUDE_RAW_DATA="Raw Daten berücksichtigen:"
COM_FABRIK_INCORRECT_LIST_ID="Falsche Listen ID"
COM_FABRIK_IS_EMPTY="Ist leer"
COM_FABRIK_IS_NOT_EMPTY="Ist nicht leer"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Dieses Formular nutzt
verknüpfte Daten aber der Fremdschlüssel %s ist nicht veröffentlicht.
Dies verursacht Fehler beim Speichern des Formulars. Bitte melden Sie das
Problem dem Betreiber der Website."
COM_FABRIK_LABEL="Beschriftung"
COM_FABRIK_LESS_THAN="Kleiner als"
COM_FABRIK_LINKED_FORM_ADD="Hinzufügen"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Liste"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Tabellen ID nicht festgelegt -
Darstellung nicht möglich"
COM_FABRIK_LIST_NO_DATA_MSG="Keine Daten"
COM_FABRIK_LIST_NOT_PUBLISHED="Diese Tabelle wurde noch nicht
veröffentlicht!"
COM_FABRIK_LOADING="Lädt..."
COM_FABRIK_LOADING_FROM_COOKIE="Aus Cookie laden"
COM_FABRIK_LOADING_FROM_DATABASE="Aus der Datenbank laden"
COM_FABRIK_MEDIAN="Median"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Bitte stellen Sie sicher, dass ein
Primärschlüssel für ihre Tabelle ausgewählt wurde. Fabrik kann diesen
Join nicht fertig stellen bis ein Primärschlüssel gewählt wurde"
COM_FABRIK_NEXT="Nächstes"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Ungenügende Rechte. Bitte
einloggen"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Kein Schlüssel für diese
Liste gefunden"
COM_FABRIK_NO_RECORDS="Keine Einträge"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Keine Einträge"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Keine Daten"
COM_FABRIK_NONE="Kein"
COM_FABRIK_NONE_OF_THESE_TERMS="nach keinem dieser Begriffe"
COM_FABRIK_NOT_EQUALS="Ist ungleich"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sie haben nicht die erforderlichen
Rechte um diesen Eintrag hinzuzufügen"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sie haben nicht die
erforderlichen Rechte um diesen Eintrag zu bearbeiten"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Die DomPDF-Bibliothek wurde nicht
gefunden"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Keine Elemente in
'Alles suchen' eingeschlossen"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Der Suchbegriff ist zu
kurz, bitte einen längeren Begriff eingeben"
COM_FABRIK_OR="oder"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Identische Datensätzte
überschreiben"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Bitte wählen"
COM_FABRIK_PLEASE_SELECT_A_ROW="Bitte Datensatz auswählen"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Bitte wählen Sie alle
erforderlichen Filter"
COM_FABRIK_PREV="Vor"
COM_FABRIK_PREVIOUS="Vorheriges"
COM_FABRIK_PRINT="Drucken"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Ein Query-Prefilter wurde
definiert ohne Wert/Abfrage"
COM_FABRIK_RECORDS="Sätze"
COM_FABRIK_RECORDS_DELETED="Einträge gelöscht"
COM_FABRIK_RECORD_ADDED_UPDATED="Eintrag hinzugefügt/geändert"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Es scheint so, als hätten sie
schon begonnen das Formular auszufüllen. Sie starten von der letzten
Seite, die sie besucht haben. Wollen sie von Neuem beginnen, klicken sie
den 'Löschen' Button"
COM_FABRIK_SAVE="Speichern"
COM_FABRIK_SAVING_TO="Speichern in"
COM_FABRIK_SEARCH="Suchen"
COM_FABRIK_SELECT="Auswählen"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Bitte wählen Sie mindestens
einen Filter"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Spalten für den Export
wählen"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Zeilen zum Löschen wählen"
COM_FABRIK_SEND_EMAIL="Mail abschicken"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Diese
Visiualisierung wurde noch nicht veröffentlicht!"
COM_FABRIK_START="Start"
COM_FABRIK_SUBSCRIBE_RSS="RSS abonnieren"
COM_FABRIK_SUCCESS="Erfolg"
COM_FABRIK_SUM="Summe"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Bitte stellen Sie sicher, dass
das Fabrik System-Plugin installiert ist."
COM_FABRIK_TEXT_DELIMITER="Text-Trennzeichen"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Dieser Eintrag wurde gesendet
an"
COM_FABRIK_TOGGLE="Ein-/Ausblenden"
COM_FABRIK_TOTAL="Gesamt"
COM_FABRIK_VALIDATING="Prüfen"
COM_FABRIK_VALIDATION_ERROR="Überprüfung fehlgeschlagen"
COM_FABRIK_VALUE="Wert"
COM_FABRIK_VIEW="Ansehen"
COM_FABRIK_VIEW_ALL="Alle ansehen"
COM_FABRIK_WHERE="Wo"
COM_FABRIK_YOUR_EMAIL="Ihre E-Mail-Adresse"
COM_FABRIK_YOUR_FRIENDS_EMAIL="E-Mail des Freundes"
COM_FABRIK_YOUR_NAME="Ihr Name"
COM_FABRIK_MESSAGE_SUBJECT="Betreff"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Ungültige Unteroptionen für
Element '%s' angegeben: %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Ausführen"
COM_FABRIK_VALIDATION="Hinweis"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Ein Fehler mit einem berechneten
eval-Feld ist aufgetreten. Bitte informieren Sie den Betreiber der
Website."
COM_FABRIK_LIST_TABS_ALL="Alle"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Speichern"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Anwenden"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="zurück"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Löschen"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Zurücksetzen"
language/el-GR/el-GR.com_fabrik.ini000064400000035626151165346220012760
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Προσθήκη"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Προσθέστε μια
νέα επιλογή στα παραπάνω."
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Σύνθετη αναζήτηση"
COM_FABRIK_ALL="Όλα"
COM_FABRIK_ALL_OF_THESE_TERMS="Όλα αυτά"
COM_FABRIK_AND="Και"
COM_FABRIK_ANY_OF_THESE_TERMS="Οποιοδήποτε από
αυτά"
COM_FABRIK_APPLY="Εφαρμογή"
COM_FABRIK_AVERAGE="Μέσος όρος"
COM_FABRIK_BEGINS_WITH="Ξεκινά με"
COM_FABRIK_BETWEEN="Ανάμεσα"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Αναζήτηση φακέλων"
COM_FABRIK_CANCEL="Ακύρωση"
COM_FABRIK_CLEAR="Καθαρισμός"
COM_FABRIK_CLOSE_WINDOW="Κλείσιμο"
COM_FABRIK_CONDITION="Συνθήκη"
COM_FABRIK_CONFIRM_DELETE_1="Είστε σίγουροι για τη
διαγραφή αυτής της εγγραφής;"
COM_FABRIK_CONFIRM_DELETE="Είστε βέβαιοι ότι
θέλετε να διαγράψετε αυτές τις
εγγραφές;"
COM_FABRIK_CONFIRM_DROP="Θέλετε πραγματικά να
διαγράψετε όλες τις εγγραφές και να
επαναφέρετε τον πίνακα στο 0;"
COM_FABRIK_CONTAINS="Περιέχει"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Υπολογισμός"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV εγγραφή(-ές)
προστέθηκε(-αν) και %s εγγραφή(-ές)
ενημερώθηκε(-αν)."
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s νέο(-α)
στοιχείο(-α) προστέθηκε(-αν), %s CSV
εγγραφή(-ές) προστέθηκε(-αν) και %s
εγγραφή(-ές) ενημερώθηκε(-αν)."
COM_FABRIK_CSV_COMPLETE="Η εξαγωγή του πίνακα σε
μορφή CSV ολοκληρώθηκε."
COM_FABRIK_CSV_DOWNLOADING="Το αρχείο CSV
μεταφορτώνεται..."
COM_FABRIK_CSV_DOWNLOAD_HERE="Κατεβάστε το CSV."
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Δεν υπάρχουν
διαθέσιμες εγγραφές για εξαγωγή CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Λυπούμαστε αλλά τα
ακόλουθα πεδία στο CSV αρχείο δεν βρέθηκαν
σε αυτόν τον πίνακα:"
COM_FABRIK_CSV_FILE="CSV αρχείο"
COM_FABRIK_CSV_IMPORT_HEADING="Εισαγωγή: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="Και"
COM_FABRIK_DATE_RANGE_BETWEEN="Μεταξύ"
COM_FABRIK_DELETE="Διαγραφή"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Προβολή ανά"
COM_FABRIK_DROP_EXISTING_DATA="Διαγραφή υπάρχοντων
δεδομένων"
COM_FABRIK_EDIT="Επεξεργασία"
COM_FABRIK_ELEMENT="Στοιχείο"
COM_FABRIK_EMAIL_MSG="Η ακόλουθη σελίδα από το
site "_QQ_"%s"_QQ_" σας εστάλη από
τον/την %s ( %s).\n\nΜπορείτε να την
επισκεφτείτε στην παρακάτω διεύθυνση
URL:\n %s"
COM_FABRIK_EMPTY="Άδειασμα"
COM_FABRIK_END="Τέλος"
COM_FABRIK_ENDS_WITH="Τελειώνει με"
COM_FABRIK_EQUALS="Ισούται"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Συγγνώμη αλλά
το πρότυπο admin είναι μόνο για χρήση εντός
των σελίδων διαχείρισης του Joomla.
Παρακαλώ επιλέξτε ένα διαφορετικό
πρότυπο."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Η βιβλιοθήκη Curl δεν
έχει εγκατασταθεί και ορισμένα τμήματα
αυτής της σελίδας έχουν αποτύχει να
εκτελεστούν."
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Το πρόγραμμα
εγκατάστασης δεν μπορεί να συνεχίσει
πριν ενεργοποιηθούν η επιλογή
ανεβάσματος αρχείων. Παρακαλούμε
χρησιμοποιήστε την μέθοδο μέσω των
φακέλων."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Ακριβώς αυτά"
COM_FABRIK_EXPORT="Εξαγωγή"
COM_FABRIK_EXPORT_TO_CSV="Εξαγωγή σε CSV"
COM_FABRIK_FAILED_VALIDATION="Ο έλεγχος απέτυχε"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Αρχείο CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Επιλέξτε το αρχείο CSV
που θα εισάγεται."
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Άδειασμα
δεδομένων"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Θα διαγράψει
όλα τα δεδομένα στον πίνακα πριν την
εισαγωγή του CSV."
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Οριοθέτης
πεδίου"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Ο
χαρακτήρας που χωρίζει τις κολώνες των
δεδομένων μεταξύ τους στο CSV αρχείο."
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Μορφοποίηση"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Με ποια
εφαρμογή δημιουργήσατε το CSV (είναι
απαραίτητο για την ορθή κωδικοποίηση του
CSV)."
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Αντικατάσταση"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Υπάρχουσες
εγγραφές θα αντικατασταθούν από τις
εγγραφές του CSV."
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="ή οριοθέτης
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Αν το
επιλέξετε τότε οι κολώνες των δεδομένων
του CSV θα πρέπει να χωρίζονται με τον
χαρακτήρα tab."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Οριοθέτης
Text"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Ο
χαρακτήρας που εξασφαλίζει την αρχή και
το τέλος ενός πεδίου με δεδομένα."
COM_FABRIK_FIELD_DELIMITER="οριοθέτης πεδίου"
COM_FABRIK_FILE_TYPE="Τύπος αρχείου"
COM_FABRIK_FILTER="Φίλτρο"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Οι επιλογές του
φίλτρου έχουν περιοριστεί καθώς
περιέχει περισσότερες εγγραφές από την
κεντρική Filter List Max τιμή στην διαμόρφωση
του Fabrik."
COM_FABRIK_FILTER_PLEASE_SELECT="Όλα"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Ο καθαρισμός των
φίλτρων ολοκληρώθηκε."
COM_FABRIK_FORM="Φόρμα"
COM_FABRIK_FORM_FIELDS="Πεδία φόρμας"
COM_FABRIK_FORM_NOT_PUBLISHED="Λυπούμαστε, αυτή η
φόρμα δεν είναι δημοσιευμένη."
COM_FABRIK_FORM_SAVED="Η φόρμα αποθηκεύτηκε."
COM_FABRIK_GO="Αναζήτηση"
COM_FABRIK_GREATER_THAN="Μεγαλύτερο από"
COM_FABRIK_GROUP_BY="Ομαδοποίηση κατά:"
COM_FABRIK_IMPORT_CSV="Εισαγωγή CSV"
COM_FABRIK_IMPORT_CSV_FILE="Εισαγωγή CSV αρχείου"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Δεν έχει
επιλεγεί αρχείο."
COM_FABRIK_IMPORT_FROM_CSV="Εισαγωγή από CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Περιλαμβάνουν
υπολογισμούς"
COM_FABRIK_INCLUDE_DATA="Περιλαμβάνουν
στοιχεία:"
COM_FABRIK_INCLUDE_FILTERS="Περιλαμβάνουν
φίλτρα:"
COM_FABRIK_INCLUDE_RAW_DATA="Περιλαμβάνουν
ανεπεξέργαστα δεδομένα:"
COM_FABRIK_INCORRECT_LIST_ID="Λάθος list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Αυτή η φόρμα
χρησιμοποιεί συνδεδεμένα δεδομένα (joined
data) αλλά το foreign key %s δεν είναι
δημοσιευμένο. Αυτό μπορεί να
δημιουργήσει προβλήματα κατά την
αποθήκευση της φόρμας. Επικοινωνήστε με
τον διαχειριστή της σελίδας για το θέμα
αυτό."
COM_FABRIK_LABEL="Ετικέτα"
COM_FABRIK_LESS_THAN="Μικρότερο από"
COM_FABRIK_LINKED_FORM_ADD="Προσθήκη"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Δεν έχει
καθοριστεί id στον Πίνακα - Δήλωση
αδύνατη"
COM_FABRIK_LIST_NO_DATA_MSG="Δεν βρέθηκαν
αποτελέσματα!"
COM_FABRIK_LIST_NOT_PUBLISHED="Λυπούμαστε αυτός ο
πίνακας δεν είναι δημοσιευμένος."
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Φόρτωση από cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Φόρτωση από Βάση
Δεδομένων"
COM_FABRIK_MEDIAN="Διάμεσος"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Παρακαλούμε
σιγουρευτείτε πως έχετε επιλέξει ένα
πρωτεύον κλειδί για τον πίνακα, το Fabrik
δεν μπορεί να καταχωρήσει αυτή την
ενοποίηση μέχρι να το κάνετε."
COM_FABRIK_NEXT="Επόμενο"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Ανεπαρκή
δικαιώματα πρόσβασης. Παρακαλούμε
συνδεθείτε."
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Δεν βρέθηκε
κλειδί για αυτόν τον πίνακα."
COM_FABRIK_NO_RECORDS="Καμία καταχώρηση"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Καμία
καταχώρηση"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Κανένα δεδομένο"
COM_FABRIK_NONE="Κανένα"
COM_FABRIK_NONE_OF_THESE_TERMS="Κανένα από αυτά"
COM_FABRIK_NOT_EQUALS="Δεν ισούται"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Δεν σας
επιτρέπεται να προσθέσετε αρχεία"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Δεν σας
επιτρέπεται να τροποποιήσετε αρχεία"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Η βιβλιοθήκη Dompdf
δεν βρέθηκε."
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Δεν υπάρχουν
στοιχεία που πρέπει να συμπεριληφθούν
στην αναζήτηση σε όλα."
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Η φράση
αναζήτησης είναι πολύ μικρή για να
αναζητήσετε στη λίστα, δοκιμάστε την
αναζήτηση σε επιπλέον φράση."
COM_FABRIK_OR="ή"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Αντικατάσταση
ίδιων καταχωρήσεων"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Παρακαλούμε
επιλέξτε"
COM_FABRIK_PLEASE_SELECT_A_ROW="Παρακαλούμε
επιλέξτε μια γραμμή."
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Παρακαλούμε
επιλέξτε όλα τα απαιτούμενα φίλτρα."
COM_FABRIK_PREV="Προηγούμενο"
COM_FABRIK_PREVIOUS="Προηγούμενο"
COM_FABRIK_PRINT="Εκτύπωση"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Ένα ερώτημα
προ-φίλτρου (prefilter) έχει καθοριστεί αλλά
δεν έχει δοθεί τιμή/ερώτημα."
COM_FABRIK_RECORDS="καταχώρηση(-ήσεις)"
COM_FABRIK_RECORDS_DELETED="καταχώρηση(-ήσεις)
διαγράφηκε(-αν)"
COM_FABRIK_RECORD_ADDED_UPDATED="Η καταχώρηση
αποθηκεύτηκε/ανανεώθηκε."
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Φαίνεται πως
έχετε ήδη αρχίσει να συμπληρώνετε αυτή
τη φόρμα. Αρχίζετε από την τελευταία
σελίδα που επισκεφτήκατε. Αν θέλετε να
συμπληρώσετε από την αρχή τη φόρμα,
πατήστε το κουμπί 'Καθαρισμός'"
COM_FABRIK_SAVE="Αποθήκευση"
COM_FABRIK_SAVING_TO="αποθήκευση σε"
COM_FABRIK_SEARCH="Αναζήτηση"
COM_FABRIK_SELECT="Επιλογή"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Παρακαλώ
επιλέξτε τουλάχιστον ένα φίλτρο."
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Επιλέξτε στήλες
για την εξαγωγή."
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Επιλέξτε κάποιες
γραμμές για διαγραφή."
COM_FABRIK_SEND_EMAIL="Αποστολή email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Λυπούμαστε
αλλά αυτό το visualization δεν είναι
δημοσιευμένο"
COM_FABRIK_START="Αρχή"
COM_FABRIK_SUBSCRIBE_RSS="Συνδρομή σε RSS"
COM_FABRIK_SUCCESS="Επιτυχία"
COM_FABRIK_SUM="Άθροισμα"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Παρακαλώ
βεβαιωθείτε ότι έχετε εγκαταστήσει και
δημοσιεύσει το πρόσθετο σύστημα Fabrik."
COM_FABRIK_TEXT_DELIMITER="οριοθέτης κειμένου"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Αυτό το στοιχείο
έχει σταλεί"
COM_FABRIK_TOGGLE="Εναλλαγή"
COM_FABRIK_TOTAL="Σύνολο"
COM_FABRIK_VALIDATING="Αναμονή έγκρισης"
COM_FABRIK_VALIDATION_ERROR="Σφάλμα επικύρωσης"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Προβολή"
COM_FABRIK_VIEW_ALL="Προβολή όλων"
COM_FABRIK_WHERE="όπου"
COM_FABRIK_YOUR_EMAIL="Το email σου"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Το email του φίλου
σας"
COM_FABRIK_YOUR_NAME="Το όνομα σου"
COM_FABRIK_MESSAGE_SUBJECT="Θέμα"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/el-GR/el-GR.com_fabrik.sys.ini000064400000035147151165346220013573
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Προσθήκη"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Προσθέστε μια
νέα επιλογή στα παραπάνω."
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Σύνθετη αναζήτηση"
COM_FABRIK_ALL="Όλα"
COM_FABRIK_ALL_OF_THESE_TERMS="Όλα αυτά"
COM_FABRIK_AND="Και"
COM_FABRIK_ANY_OF_THESE_TERMS="Οποιοδήποτε από
αυτά"
COM_FABRIK_APPLY="Εφαρμογή"
COM_FABRIK_AVERAGE="Μέσος όρος"
COM_FABRIK_BEGINS_WITH="Ξεκινά με"
COM_FABRIK_BETWEEN="Ανάμεσα"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Αναζήτηση φακέλων"
COM_FABRIK_CANCEL="Ακύρωση"
COM_FABRIK_CLEAR="Καθαρισμός"
COM_FABRIK_CLOSE_WINDOW="Κλείσιμο"
COM_FABRIK_CONDITION="Συνθήκη"
COM_FABRIK_CONFIRM_DELETE_1="Είστε σίγουροι για τη
διαγραφή αυτής της εγγραφής;"
COM_FABRIK_CONFIRM_DELETE="Είστε βέβαιοι ότι
θέλετε να διαγράψετε αυτές τις
εγγραφές;"
COM_FABRIK_CONFIRM_DROP="Θέλετε πραγματικά να
διαγράψετε όλες τις εγγραφές και να
επαναφέρετε τον πίνακα στο 0;"
COM_FABRIK_CONTAINS="Περιέχει"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Υπολογισμός"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV εγγραφή(-ές)
προστέθηκε(-αν) και %s εγγραφή(-ές)
ενημερώθηκε(-αν)."
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s νέο(-α)
στοιχείο(-α) προστέθηκε(-αν), %s CSV
εγγραφή(-ές) προστέθηκε(-αν) και %s
εγγραφή(-ές) ενημερώθηκε(-αν)."
COM_FABRIK_CSV_COMPLETE="Η εξαγωγή του πίνακα σε
μορφή CSV ολοκληρώθηκε."
COM_FABRIK_CSV_DOWNLOADING="Το αρχείο CSV
μεταφορτώνεται..."
COM_FABRIK_CSV_DOWNLOAD_HERE="Κατεβάστε το CSV."
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Δεν υπάρχουν
διαθέσιμες εγγραφές για εξαγωγή CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Λυπούμαστε αλλά τα
ακόλουθα πεδία στο CSV αρχείο δεν βρέθηκαν
σε αυτόν τον πίνακα:"
COM_FABRIK_CSV_FILE="CSV αρχείο"
COM_FABRIK_CSV_IMPORT_HEADING="Εισαγωγή: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="Και"
COM_FABRIK_DATE_RANGE_BETWEEN="Μεταξύ"
COM_FABRIK_DELETE="Διαγραφή"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Προβολή ανά"
COM_FABRIK_DROP_EXISTING_DATA="Διαγραφή υπάρχοντων
δεδομένων"
COM_FABRIK_EDIT="Επεξεργασία"
COM_FABRIK_ELEMENT="Στοιχείο"
COM_FABRIK_EMAIL_MSG="Η ακόλουθη σελίδα από το
site "_QQ_"%s"_QQ_" σας εστάλη από
τον/την %s ( %s).\n\nΜπορείτε να την
επισκεφτείτε στην παρακάτω διεύθυνση
URL:\n %s"
COM_FABRIK_EMPTY="Άδειασμα"
COM_FABRIK_END="Τέλος"
COM_FABRIK_ENDS_WITH="Τελειώνει με"
COM_FABRIK_EQUALS="Ισούται"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Συγγνώμη αλλά
το πρότυπο admin είναι μόνο για χρήση εντός
των σελίδων διαχείρισης του Joomla.
Παρακαλώ επιλέξτε ένα διαφορετικό
πρότυπο."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Η βιβλιοθήκη Curl δεν
έχει εγκατασταθεί και ορισμένα τμήματα
αυτής της σελίδας έχουν αποτύχει να
εκτελεστούν."
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Το πρόγραμμα
εγκατάστασης δεν μπορεί να συνεχίσει
πριν ενεργοποιηθούν η επιλογή
ανεβάσματος αρχείων. Παρακαλούμε
χρησιμοποιήστε την μέθοδο μέσω των
φακέλων."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Ακριβώς αυτά"
COM_FABRIK_EXPORT="Εξαγωγή"
COM_FABRIK_EXPORT_TO_CSV="Εξαγωγή σε CSV"
COM_FABRIK_FAILED_VALIDATION="Ο έλεγχος απέτυχε"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Αρχείο CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Επιλέξτε το αρχείο CSV
που θα εισάγεται."
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Άδειασμα
δεδομένων"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Θα διαγράψει
όλα τα δεδομένα στον πίνακα πριν την
εισαγωγή του CSV."
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Οριοθέτης
πεδίου"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Ο
χαρακτήρας που χωρίζει τις κολώνες των
δεδομένων μεταξύ τους στο CSV αρχείο."
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Μορφοποίηση"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Με ποια
εφαρμογή δημιουργήσατε το CSV (είναι
απαραίτητο για την ορθή κωδικοποίηση του
CSV)."
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Αντικατάσταση"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Υπάρχουσες
εγγραφές θα αντικατασταθούν από τις
εγγραφές του CSV."
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="ή οριοθέτης
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Αν το
επιλέξετε τότε οι κολώνες των δεδομένων
του CSV θα πρέπει να χωρίζονται με τον
χαρακτήρα tab."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Οριοθέτης
Text"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Ο
χαρακτήρας που εξασφαλίζει την αρχή και
το τέλος ενός πεδίου με δεδομένα."
COM_FABRIK_FIELD_DELIMITER="οριοθέτης πεδίου"
COM_FABRIK_FILE_TYPE="Τύπος αρχείου"
COM_FABRIK_FILTER="Φίλτρο"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Οι επιλογές του
φίλτρου έχουν περιοριστεί καθώς
περιέχει περισσότερες εγγραφές από την
κεντρική Filter List Max τιμή στην διαμόρφωση
του Fabrik."
COM_FABRIK_FILTER_PLEASE_SELECT="Όλα"
COM_FABRIK_FILTERS_CLEARED="Ο καθαρισμός των
φίλτρων ολοκληρώθηκε."
COM_FABRIK_FORM="Φόρμα"
COM_FABRIK_FORM_FIELDS="Πεδία φόρμας"
COM_FABRIK_FORM_NOT_PUBLISHED="Λυπούμαστε, αυτή η
φόρμα δεν είναι δημοσιευμένη."
COM_FABRIK_FORM_SAVED="Η φόρμα αποθηκεύτηκε."
COM_FABRIK_GO="Αναζήτηση"
COM_FABRIK_GREATER_THAN="Μεγαλύτερο από"
COM_FABRIK_GROUP_BY="Ομαδοποίηση κατά:"
COM_FABRIK_IMPORT_CSV="Εισαγωγή CSV"
COM_FABRIK_IMPORT_CSV_FILE="Εισαγωγή CSV αρχείου"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Δεν έχει
επιλεγεί αρχείο."
COM_FABRIK_IMPORT_FROM_CSV="Εισαγωγή από CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Περιλαμβάνουν
υπολογισμούς"
COM_FABRIK_INCLUDE_DATA="Περιλαμβάνουν
στοιχεία:"
COM_FABRIK_INCLUDE_FILTERS="Περιλαμβάνουν
φίλτρα:"
COM_FABRIK_INCLUDE_RAW_DATA="Περιλαμβάνουν
ανεπεξέργαστα δεδομένα:"
COM_FABRIK_INCORRECT_LIST_ID="Λάθος list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Αυτή η φόρμα
χρησιμοποιεί συνδεδεμένα δεδομένα (joined
data) αλλά το foreign key %s δεν είναι
δημοσιευμένο. Αυτό μπορεί να
δημιουργήσει προβλήματα κατά την
αποθήκευση της φόρμας. Επικοινωνήστε με
τον διαχειριστή της σελίδας για το θέμα
αυτό."
COM_FABRIK_LABEL="Ετικέτα"
COM_FABRIK_LESS_THAN="Μικρότερο από"
COM_FABRIK_LINKED_FORM_ADD="Προσθήκη"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Δεν έχει
καθοριστεί id στον Πίνακα - Δήλωση
αδύνατη"
COM_FABRIK_LIST_NO_DATA_MSG="Δεν βρέθηκαν
αποτελέσματα!"
COM_FABRIK_LIST_NOT_PUBLISHED="Λυπούμαστε αυτός ο
πίνακας δεν είναι δημοσιευμένος."
COM_FABRIK_LOADING="Φόρτωση"
COM_FABRIK_LOADING_FROM_COOKIE="Φόρτωση από cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Φόρτωση από Βάση
Δεδομένων"
COM_FABRIK_MEDIAN="Διάμεσος"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Παρακαλούμε
σιγουρευτείτε πως έχετε επιλέξει ένα
πρωτεύον κλειδί για τον πίνακα, το Fabrik
δεν μπορεί να καταχωρήσει αυτή την
ενοποίηση μέχρι να το κάνετε."
COM_FABRIK_NEXT="Επόμενο"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Ανεπαρκή
δικαιώματα πρόσβασης. Παρακαλούμε
συνδεθείτε."
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Δεν βρέθηκε
κλειδί για αυτόν τον πίνακα."
COM_FABRIK_NO_RECORDS="Καμία καταχώρηση"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Κανένα δεδομένο"
COM_FABRIK_NONE="Κανένα"
COM_FABRIK_NONE_OF_THESE_TERMS="Κανένα από αυτά"
COM_FABRIK_NOT_EQUALS="Δεν ισούται"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Δεν σας
επιτρέπεται να προσθέσετε αρχεία"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Δεν σας
επιτρέπεται να τροποποιήσετε αρχεία"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Η βιβλιοθήκη Dompdf
δεν βρέθηκε."
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Δεν υπάρχουν
στοιχεία που πρέπει να συμπεριληφθούν
στην αναζήτηση σε όλα."
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Η φράση
αναζήτησης είναι πολύ μικρή για να
αναζητήσετε στη λίστα, δοκιμάστε την
αναζήτηση σε επιπλέον φράση."
COM_FABRIK_OR="ή"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Αντικατάσταση
ίδιων καταχωρήσεων"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Παρακαλούμε
επιλέξτε"
COM_FABRIK_PLEASE_SELECT_A_ROW="Παρακαλούμε
επιλέξτε μια γραμμή."
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Παρακαλούμε
επιλέξτε όλα τα απαιτούμενα φίλτρα."
COM_FABRIK_PREV="Προηγούμενο"
COM_FABRIK_PREVIOUS="Προηγούμενο"
COM_FABRIK_PRINT="Εκτύπωση"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Ένα ερώτημα
προ-φίλτρου (prefilter) έχει καθοριστεί αλλά
δεν έχει δοθεί τιμή/ερώτημα."
COM_FABRIK_RECORDS="καταχώρηση(-ήσεις)"
COM_FABRIK_RECORDS_DELETED="καταχώρηση(-ήσεις)
διαγράφηκε(-αν)"
COM_FABRIK_RECORD_ADDED_UPDATED="Η καταχώρηση
αποθηκεύτηκε/ανανεώθηκε."
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Αποθήκευση"
COM_FABRIK_SAVING_TO="αποθήκευση σε"
COM_FABRIK_SEARCH="Αναζήτηση"
COM_FABRIK_SELECT="Επιλογή"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Παρακαλώ
επιλέξτε τουλάχιστον ένα φίλτρο."
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Επιλέξτε στήλες
για την εξαγωγή."
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Επιλέξτε κάποιες
γραμμές για διαγραφή."
COM_FABRIK_SEND_EMAIL="Αποστολή email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Λυπούμαστε
αλλά αυτό το visualization δεν είναι
δημοσιευμένο"
COM_FABRIK_START="Αρχή"
COM_FABRIK_SUBSCRIBE_RSS="Συνδρομή σε RSS"
COM_FABRIK_SUCCESS="Επιτυχία"
COM_FABRIK_SUM="Άθροισμα"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Παρακαλώ
βεβαιωθείτε ότι έχετε εγκαταστήσει και
δημοσιεύσει το πρόσθετο σύστημα Fabrik."
COM_FABRIK_TEXT_DELIMITER="οριοθέτης κειμένου"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Αυτό το στοιχείο
έχει σταλεί"
COM_FABRIK_TOGGLE="Εναλλαγή"
COM_FABRIK_TOTAL="Σύνολο"
COM_FABRIK_VALIDATING="Αναμονή έγκρισης"
COM_FABRIK_VALIDATION_ERROR="Σφάλμα επικύρωσης"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Προβολή"
COM_FABRIK_VIEW_ALL="Προβολή όλων"
COM_FABRIK_WHERE="όπου"
COM_FABRIK_YOUR_EMAIL="Το email σου"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Το email του φίλου
σας"
COM_FABRIK_YOUR_NAME="Το όνομα σου"
COM_FABRIK_MESSAGE_SUBJECT="Θέμα"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/en-GB/en-GB.com_fabrik.ini000064400000025112151165346220012711
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Add"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to those
above"
COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Advanced search"
COM_FABRIK_ALL="all"
COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
COM_FABRIK_AND="And"
COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="Apply"
COM_FABRIK_AVERAGE="Average"
COM_FABRIK_BEGINS_WITH="BEGINS WITH"
COM_FABRIK_BETWEEN="Between"
COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Browse folders"
COM_FABRIK_CANCEL="Cancel"
COM_FABRIK_CLEAR="Clear filters"
COM_FABRIK_CLEAR_MULTI_PAGE_SESSION="Clear"
COM_FABRIK_CLOSE_WINDOW="Close"
COM_FABRIK_CONDITION="Condition"
COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records and
reset this tables key to 0?"
COM_FABRIK_CONTAINS="CONTAINS"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Count"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s records
updated"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="CSV export complete"
COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in the
CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV File"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="and"
COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="Delete"
COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Display #"
COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Edit"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="The following page from the %s website has been
sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
COM_FABRIK_EMPTY="Empty"
COM_FABRIK_END="End"
COM_FABRIK_ENDS_WITH="ENDS WITH"
COM_FABRIK_EQUALS="EQUALS"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Exact phrase"
COM_FABRIK_EXPORT="Export"
COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
COM_FABRIK_FAILED_VALIDATION="Validation failed"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing data
from the list before importing the CSV's data"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used). Use CSV for
CSV-UTF8 Excel files."
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text delimiter"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used in
the CSV file to encase text values. Use / for no delimiter (e.g. Excel
files)"
COM_FABRIK_FIELD_DELIMITER="Field delimiter"
COM_FABRIK_FILE_TYPE="File type"
COM_FABRIK_FILTER="Filter"
COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="All"
COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filters cleared"
COM_FABRIK_FORM="Form"
COM_FABRIK_FORM_FIELDS="Form fields"
COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not published"
COM_FABRIK_FORM_SAVED="Form saved"
COM_FABRIK_GO="Go"
COM_FABRIK_GREATER_THAN="GREATER THAN"
COM_FABRIK_GROUP_BY="Group by"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
COM_FABRIK_INCLUDE_DATA="Include data:"
COM_FABRIK_INCLUDE_FILTERS="Include filters:"
COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_IS_NOT_EMPTY="IS NOT EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Label"
COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Add"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
COM_FABRIK_LIST_NO_DATA_MSG="No records"
COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not published"
COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
COM_FABRIK_MEDIAN="Median"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected a
primary key for your table, Fabrik can not process this join until you have
done so"
COM_FABRIK_NEXT="Next"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights. Please
login"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
COM_FABRIK_NO_RECORDS="No records found"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
COM_FABRIK_NONE="None"
COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
COM_FABRIK_NOT_EQUALS="NOT EQUALS"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not authorised
to add this record"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not authorised
to edit this record"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found, did you
install the libraries package?"
COM_FABRIK_NOTICE_MPDF_NOT_FOUND="Mpdf library not found, did you
install the libraries package?"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="or"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Please select"
COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
COM_FABRIK_PREV="Prev"
COM_FABRIK_PREVIOUS="Previous"
COM_FABRIK_PRINT="Print"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
COM_FABRIK_RECORDS="records"
COM_FABRIK_RECORDS_DELETED="Records deleted"
COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Save"
COM_FABRIK_SAVING_TO="saving to"
COM_FABRIK_SEARCH="Search"
COM_FABRIK_SELECT="Select"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
COM_FABRIK_SEND_EMAIL="Send email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
COM_FABRIK_START="Start"
COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
COM_FABRIK_SUCCESS="Success"
COM_FABRIK_SUM="Sum"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have installed
and published the Fabrik system plugin"
COM_FABRIK_TEXT_DELIMITER="Text delimiter"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
COM_FABRIK_TOGGLE="Toggle"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validating"
COM_FABRIK_VALIDATION_ERROR="Validation error"
COM_FABRIK_MUST_VALIDATE="Must validate"
COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="View"
COM_FABRIK_VIEW_ALL="View All"
COM_FABRIK_WHERE="Where"
COM_FABRIK_YOUR_EMAIL="Your email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="Subject"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Run"
COM_FABRIK_VALIDATION="Validation"
COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
COM_FABRIK_LIST_TABS_ALL="All"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"

; 3.5
COM_FABRIK_ELEMENT_PARAMS_TOO_BIG="Element params too big to save,
probably calculation data, for element ID %s"

; 3.6
COM_FABRIK_LIBRARY_NOT_INSTALLED="To use this feature, you must
install the Fabrik Library package"
COM_FABRIK_STILL_LOADING="Page is still loading. Please wait a few
moments."language/en/en.com_fabrik.ini000064400000023707151165346220012145
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Add"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to those
above"
COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Advanced search"
COM_FABRIK_ALL="all"
COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
COM_FABRIK_AND="And"
COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="Apply"
COM_FABRIK_AVERAGE="Average"
COM_FABRIK_BEGINS_WITH="BEGINS WITH"
COM_FABRIK_BETWEEN="Between"
COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Browse folders"
COM_FABRIK_CANCEL="Cancel"
COM_FABRIK_CLEAR="Clear filters"
COM_FABRIK_CLOSE_WINDOW="Close"
COM_FABRIK_CONDITION="Condition"
COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records and
reset this tables key to 0?"
COM_FABRIK_CONTAINS="CONTAINS"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Count"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s records
updated"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="CSV export complete"
COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in the
CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV File"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="and"
COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="Delete"
COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Display #"
COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Edit"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="The following page from the %s website has been
sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
COM_FABRIK_EMPTY="Empty"
COM_FABRIK_END="End"
COM_FABRIK_ENDS_WITH="ENDS WITH"
COM_FABRIK_EQUALS="EQUALS"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Exact phrase"
COM_FABRIK_EXPORT="Export"
COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
COM_FABRIK_FAILED_VALIDATION="Validation failed"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing data
from the list before importing the CSV's data"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text delimiter"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used in
the CSV file to encase text values"
COM_FABRIK_FIELD_DELIMITER="Field delimiter"
COM_FABRIK_FILE_TYPE="File type"
COM_FABRIK_FILTER="Filter"
COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="All"
COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filters cleared"
COM_FABRIK_FORM="Form"
COM_FABRIK_FORM_FIELDS="Form fields"
COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not published"
COM_FABRIK_FORM_SAVED="Form saved"
COM_FABRIK_GO="Go"
COM_FABRIK_GREATER_THAN="GREATER THAN"
COM_FABRIK_GROUP_BY="Group by"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
COM_FABRIK_INLCUDE_CALCULATIONS="Include calculations"
COM_FABRIK_INCLUDE_DATA="Include data:"
COM_FABRIK_INCLUDE_FILTERS="Include filters:"
COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Label"
COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Add"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
COM_FABRIK_LIST_NO_DATA_MSG="No records"
COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not published"
COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
COM_FABRIK_MEDIAN="Median"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected a
primary key for your table, Fabrik can not process this join until you have
done so"
COM_FABRIK_NEXT="Next"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights. Please
login"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
COM_FABRIK_NO_RECORDS="No records found"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
COM_FABRIK_NONE="None"
COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
COM_FABRIK_NOT_EQUALS="NOT EQUALS"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not authorised
to add this record"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not authorised
to edit this record"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="or"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Please select"
COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
COM_FABRIK_PREV="Prev"
COM_FABRIK_PREVIOUS="Previous"
COM_FABRIK_PRINT="Print"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
COM_FABRIK_RECORDS="records"
COM_FABRIK_RECORDS_DELETED="Records deleted"
COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Save"
COM_FABRIK_SAVING_TO="saving to"
COM_FABRIK_SEARCH="Search"
COM_FABRIK_SELECT="Select"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
COM_FABRIK_SEND_EMAIL="Send email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
COM_FABRIK_START="Start"
COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
COM_FABRIK_SUCCESS="Success"
COM_FABRIK_SUM="Sum"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have installed
and published the Fabrik system plugin"
COM_FABRIK_TEXT_DELIMITER="Text delimiter"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
COM_FABRIK_TOGGLE="Toggle"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validating"
COM_FABRIK_VALIDATION_ERROR="Validation error"
COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="View"
COM_FABRIK_VIEW_ALL="View All"
COM_FABRIK_WHERE="Where"
COM_FABRIK_YOUR_EMAIL="Your email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="Subject"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Run"
COM_FABRIK_VALIDATION="Validation"
COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
COM_FABRIK_LIST_TABS_ALL="All"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/eo-XX/eo-XX.com_fabrik.ini000064400000024446151165346220013042
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Aldoni"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Aldoni novan opcion al la
supraj"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Altnivela serĉo"
COM_FABRIK_ALL="ĉiuj"
COM_FABRIK_ALL_OF_THESE_TERMS="Ĉiuj tiuj kondiĉoj"
COM_FABRIK_AND="Kaj"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="Apliki"
COM_FABRIK_AVERAGE="Meznombra"
COM_FABRIK_BEGINS_WITH="KOMENCAS PER"
COM_FABRIK_BETWEEN="Inter"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Foliumi dosierujojn"
COM_FABRIK_CANCEL="Ĉesi"
COM_FABRIK_CLEAR="Viŝi filtrojn"
COM_FABRIK_CLOSE_WINDOW="Fermi"
COM_FABRIK_CONDITION="Postulo"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
COM_FABRIK_CONFIRM_DROP="Ĉu vi vere volas forigi ĉiujn rikordojn kaj
nuligi tiun ĉi tabulan ŝlosilon?"
COM_FABRIK_CONTAINS="ENHAVAS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Nombro"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV-dosieroj aldonitaj kaj %s
dosieroj ĝisdatigitaj"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
COM_FABRIK_DATE_RANGE_BETWEEN="Inter"
; COM_FABRIK_DELETE="Delete"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
; COM_FABRIK_EDIT="Edit"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Aldoni"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="Temo"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/eo-XX/eo-XX.com_fabrik.sys.ini000064400000024301151165346220013645
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Aldoni"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Aldoni novan opcion al la
supraj"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Altnivela serĉo"
COM_FABRIK_ALL="ĉiuj"
COM_FABRIK_ALL_OF_THESE_TERMS="Ĉiuj tiuj kondiĉoj"
COM_FABRIK_AND="Kaj"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="Apliki"
COM_FABRIK_AVERAGE="Meznombra"
COM_FABRIK_BEGINS_WITH="KOMENCAS PER"
COM_FABRIK_BETWEEN="Inter"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Foliumi dosierujojn"
COM_FABRIK_CANCEL="Ĉesi"
COM_FABRIK_CLEAR="Viŝi filtrojn"
COM_FABRIK_CLOSE_WINDOW="Fermi"
COM_FABRIK_CONDITION="Postulo"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
COM_FABRIK_CONFIRM_DROP="Ĉu vi vere volas forigi ĉiujn rikordojn kaj
nuligi tiun ĉi tabulan ŝlosilon?"
COM_FABRIK_CONTAINS="ENHAVAS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Nombro"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV-dosieroj aldonitaj kaj %s
dosieroj ĝisdatigitaj"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
COM_FABRIK_DATE_RANGE_BETWEEN="Inter"
; COM_FABRIK_DELETE="Delete"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
; COM_FABRIK_EDIT="Edit"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Aldoni"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="Temo"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/eo-XX/eo.com_fabrik.ini000064400000022070151165346220012474
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
; 

COM_FABRIK_ADD="Aldoni"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Aldoni novan opcion al la
supraj"
COM_FABRIK_ADD_GROUP="Aldoni grupon"
COM_FABRIK_ADVANCED_SEARCH="Altnivela serĉo"
COM_FABRIK_ALL="ĉiuj"
COM_FABRIK_ALL_OF_THESE_TERMS="Ĉiuj tiuj kondiĉoj"
COM_FABRIK_AND="Kaj"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="Apliki"
COM_FABRIK_AVERAGE="Meznombra"
COM_FABRIK_BEGINS_WITH="KOMENCAS PER"
COM_FABRIK_BETWEEN="Inter"
COM_FABRIK_BROWSE_FOLDERS="Foliumi dosierujojn"
COM_FABRIK_CANCEL="Ĉesi"
COM_FABRIK_CLEAR="Viŝi filtrojn"
COM_FABRIK_CLOSE_WINDOW="Fermi"
COM_FABRIK_CONDITION="Postulo"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
COM_FABRIK_CONFIRM_DROP="Ĉu vi vere volas forigi ĉiujn rikordojn kaj
nuligi tiun ĉi tabulan ŝlosilon?"
COM_FABRIK_CONTAINS="ENHAVAS"
COM_FABRIK_COUNT="Nombro"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV-dosieroj aldonitaj kaj %s
dosieroj ĝisdatigitaj"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel <small>(format saved
from Excel)</small>"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel <small>(format
exported by Fabrik or by Excel with option 'File type= unicode
text')</small>" 
; COM_FABRIK_DATE_RANGE_AND="and"
COM_FABRIK_DATE_RANGE_BETWEEN="Inter"
; COM_FABRIK_DELETE="Delete"
; COM_FABRIK_DELETE_GROUP="Delete group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
; COM_FABRIK_EDIT="Edit"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Aldoni"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="Table"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="Download current view as PDF file"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="Temo"
language/es-ES/es-ES.com_fabrik.ini000064400000025166151165346220012772
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Añadir"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Añadir una opción a las
anteriores"
COM_FABRIK_ADD_GROUP="Añadir&nbsp;grupo"
COM_FABRIK_ADVANCED_SEARCH="Búsqueda avanzada"
COM_FABRIK_ALL="todo"
COM_FABRIK_ALL_OF_THESE_TERMS="Todos los términos"
COM_FABRIK_AND="y"
COM_FABRIK_ANY_OF_THESE_TERMS="Alguno de los términos"
COM_FABRIK_APPLY="Aplicar"
COM_FABRIK_AVERAGE="Promedio"
COM_FABRIK_BEGINS_WITH="EMPIEZA POR"
COM_FABRIK_BETWEEN="Entre"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Ver carpetas"
COM_FABRIK_CANCEL="Cancelar"
COM_FABRIK_CLEAR="Limpiar"
COM_FABRIK_CLOSE_WINDOW="Cerrar"
COM_FABRIK_CONDITION="Condición"
COM_FABRIK_CONFIRM_DELETE_1="¿Está seguro que desea eliminar este
registro?"
COM_FABRIK_CONFIRM_DELETE="¿Está seguro de querer borrar estos
registros?"
COM_FABRIK_CONFIRM_DROP="¿Realmente está seguro de querer borrar
todos los registros y poner estas tablas a 0?"
COM_FABRIK_CONTAINS="CONTIENE"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="No podemos encontrar
este registro"
COM_FABRIK_COUNT="Contar"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV registros añadidos y %s
registros modificados"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nuevos
elementos añadidos, %s CSV registros añadidos y %s registros
modificados"
COM_FABRIK_CSV_COMPLETE="CSV creado"
COM_FABRIK_CSV_DOWNLOADING="Se está descargando el Fichero CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Descargar aqui"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="No existe registros disponibles para
exportar CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Lo sentimos, no se encontraron en
la tabla los campos siguientes del archivo CSV:"
COM_FABRIK_CSV_FILE="Archivo CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importado:%s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formato guardado de
Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formato exportado por
Fabrik o por Excel con la opción 'File type= unicode
text')"
COM_FABRIK_DATE_RANGE_AND="y"
COM_FABRIK_DATE_RANGE_BETWEEN="entre"
COM_FABRIK_DELETE="Borrar"
COM_FABRIK_DELETE_GROUP="Eliminar&nbsp;grupo"
COM_FABRIK_DISPLAY_NUM="Mostrar #"
COM_FABRIK_DROP_EXISTING_DATA="Descartar datos existentes"
COM_FABRIK_EDIT="Modificar"
COM_FABRIK_ELEMENT="Elemento"
COM_FABRIK_EMAIL_MSG="La página siguiente del sitio web
"_QQ_"%s"_QQ_" se la ha enviado %s ( %s).\n\nPuede
acceder a la misma en la URL siguiente:\n %s"
COM_FABRIK_EMPTY="Vacío"
COM_FABRIK_END="Fin"
COM_FABRIK_ENDS_WITH="TERMINA EN"
COM_FABRIK_EQUALS="IGUAL"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Perdón, la plantilla
admin sólo puede usarse en páginas de administración de Joomla. Por
favor elija una plantilla diferente."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="El instalador no puede continuar
hasta que este permitido subir archivos. Por favor utilice el metodo
directo para instalar."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Frase exacta"
COM_FABRIK_EXPORT="Exportar"
COM_FABRIK_EXPORT_TO_CSV="Exportar a CSV"
COM_FABRIK_FAILED_VALIDATION="Falló la comprobación"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Archivo CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Elija un archivo CSV para subir"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Eliminará los datos
existentes de la lista antes de importar los datos del CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Campo
delimitador"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Caracter utilizado
en el archivo CSV para separar los datos de celda"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formato"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Aplicación para exportar el
archivo CSV (asegurese de usar el codificador correcto)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Sobreescribir"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Sobreescribir cualquier
registro con los datos del CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="o dilimitador
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Elejir para ignorar el
delimitador de campo y asignar el caracter Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Delimitador de
texto"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Caracter utilizado en
el archivo CSV para delimitar texto"
COM_FABRIK_FIELD_DELIMITER="Delimitador de campos"
COM_FABRIK_FILE_TYPE="Tipo de archivo"
COM_FABRIK_FILTER="Filtro"
COM_FABRIK_FILTER_LIST_MAX_REACHED="El filtro %s ha sido cortado
debido a su tamaño. Por favor contactar con el administrador"
COM_FABRIK_FILTER_PLEASE_SELECT="Todos"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filters cleared"
COM_FABRIK_FORM="Formulario"
COM_FABRIK_FORM_FIELDS="Campos del formulario"
COM_FABRIK_FORM_NOT_PUBLISHED="Lo sentimos, este formulario no está
publicado"
COM_FABRIK_FORM_SAVED="Formulario guardado"
COM_FABRIK_GO="Ir"
COM_FABRIK_GREATER_THAN="MAYOR QUE"
COM_FABRIK_GROUP_BY="Agrupar por"
COM_FABRIK_IMPORT_CSV="Importar CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importar archivo CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Ningún archivo
seleccionado"
COM_FABRIK_IMPORT_FROM_CSV="Importar desde CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Incluir cálculos:"
COM_FABRIK_INCLUDE_DATA="Incluir datos:"
COM_FABRIK_INCLUDE_FILTERS="Incluir filtros:"
COM_FABRIK_INCLUDE_RAW_DATA="Incluir datos en bruto:"
COM_FABRIK_INCORRECT_LIST_ID="No se puede encontrar la tabla para el
id dado"
COM_FABRIK_IS_EMPTY="ESTÁ VACÍO"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Este formulario usa datos
de una unión, pero su clave externa %s, no está publicada. Ésto puede
producir problemas al guardar el formulario. Contacte con el propietario
del sitio acerca de este problema."
COM_FABRIK_LABEL="etiqueta"
COM_FABRIK_LESS_THAN="MENOR QUE"
COM_FABRIK_LINKED_FORM_ADD="Añadir"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Lista"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="No se a definido el id de la
tabla - no se puede generar"
COM_FABRIK_LIST_NO_DATA_MSG="No hay registros"
COM_FABRIK_LIST_NOT_PUBLISHED="Lo sentimos, esta tabla no está
publicada"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Leyendo de la cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Leyendo de la base de datos"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Asegúrese de haber seleccionado
una clave primaria para la tabla. Fabrik no podrá procesar esta unión
hasta que lo haya hecho"
COM_FABRIK_NEXT="Siguiente"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Permisos de acceso insuficientes.
Por favor logeese"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No se ha encontrado ningún
elemento que coincida con %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="no se encontró una clave para
esta tabla"
COM_FABRIK_NO_RECORDS="Sin registros"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Sin registros"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Sin datos"
COM_FABRIK_NONE="Ninguno"
COM_FABRIK_NONE_OF_THESE_TERMS="Ninguno de los términos"
COM_FABRIK_NOT_EQUALS="DISTINTO"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Perdón, Usted no está autorizado
para añadir registros"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Perdón, Usted no está
autorizado para editar registros"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Libreria Dompdf no
encontrada"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No hay elementos para
incluir en la busqueda"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Su frase de búsqueda es
demasiado corta para buscar en la lista, por favor intente buscar en una
frase más larga"
COM_FABRIK_OR="o"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Sobreescribir registros
coincidentes"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Seleccione"
COM_FABRIK_PLEASE_SELECT_A_ROW="Seleccione una fila"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Seleccione todos los
filtros necesarios"
COM_FABRIK_PREV="Anterior"
COM_FABRIK_PREVIOUS="Anterior"
COM_FABRIK_PRINT="Imprimir"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Se ha elegido un prefiltor
para la consulta pero no ha dado ningún resultado"
COM_FABRIK_RECORDS="Registros"
COM_FABRIK_RECORDS_DELETED="Registros borrados"
COM_FABRIK_RECORD_ADDED_UPDATED="Registro añadido/actualizado"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Parece que ya ha empezado a
rellenar el formulario. Volverá a empezar desde la última página que
haya visitado. Si desea reiniciar el formulario, pulse el botón
'Limpiar'"
COM_FABRIK_SAVE="Grabar"
COM_FABRIK_SAVING_TO="grabar en"
COM_FABRIK_SEARCH="Buscar"
COM_FABRIK_SELECT="Seleccione"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Por favor selecciones al menos
un filtro"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Seleccione las columnas a
exportar"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Seleccione algunas filas que
borrar"
COM_FABRIK_SEND_EMAIL="Enviar correo"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Lo sentimos, esta
visualización no está publicada"
COM_FABRIK_START="Empezar"
COM_FABRIK_SUBSCRIBE_RSS="Subscribir RSS"
COM_FABRIK_SUCCESS="Éxito"
COM_FABRIK_SUM="Suma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Por favor asegurese de que tiene
instalado y publicado el plugin Fabrik system"
COM_FABRIK_TEXT_DELIMITER="Delimitador de texto"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Este elemento ha sido enviado
a"
COM_FABRIK_TOGGLE="Toggle"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Comprobando"
COM_FABRIK_VALIDATION_ERROR="Error de Validación"
COM_FABRIK_VALUE="Valor"
COM_FABRIK_VIEW="Ver"
COM_FABRIK_VIEW_ALL="Ver todo"
COM_FABRIK_WHERE="Donde"
COM_FABRIK_YOUR_EMAIL="Su correo"
COM_FABRIK_YOUR_FRIENDS_EMAIL="El correo de su amigo"
COM_FABRIK_YOUR_NAME="Su nombre"
COM_FABRIK_MESSAGE_SUBJECT="Asunto"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Subopciones no válidas
especificadas para el elemento '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Registro"
COM_FABRIK_RUN="Ejecutar"
COM_FABRIK_VALIDATION="Validación"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Ha ocurrido un error con un campo
evaluado - por favor informe al propietario de la página web."
COM_FABRIK_LIST_TABS_ALL="Todos"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Guardar"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Aplicar"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Ir atrás"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Eliminar"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Restablecer"
language/et-EE/et-EE.com_fabrik.ini000064400000024300151165346220012725
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Lisa"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Lisa uus valik"
COM_FABRIK_ADD_GROUP="Lisa grupp"
COM_FABRIK_ADVANCED_SEARCH="Täpsem otsing"
COM_FABRIK_ALL="kõik"
COM_FABRIK_ALL_OF_THESE_TERMS="Kõik need sõnad"
COM_FABRIK_AND="Ja"
COM_FABRIK_ANY_OF_THESE_TERMS="Mõni nendest sõnadest"
COM_FABRIK_APPLY="Rakenda"
COM_FABRIK_AVERAGE="Keskmine"
COM_FABRIK_BEGINS_WITH="ALGUSES ON"
COM_FABRIK_BETWEEN="Vahemik"
COM_FABRIK_BIRTHDAY_TODAY="On sünnipäev"
COM_FABRIK_BROWSE_FOLDERS="Sirvi kaustu"
COM_FABRIK_CANCEL="Loobu"
COM_FABRIK_CLEAR="Puhasta filtrid"
COM_FABRIK_CLOSE_WINDOW="Sule"
COM_FABRIK_CONDITION="Tingimus"
COM_FABRIK_CONFIRM_DELETE_1="Oled kindel, et tahad seda kirjet
kustutada?"
COM_FABRIK_CONFIRM_DELETE="Kas oled kindel, et tahad need kirjed
kustutada?"
COM_FABRIK_CONFIRM_DROP="Kas sa ikka tahad kustutada kõik kirjed ja
lülitada tabeli primaarvõtme algseisu 0?"
COM_FABRIK_CONTAINS="SISALDAB"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Kahjuks sellist kirjet
ei leitud"
COM_FABRIK_COUNT="Arv/Kogus"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV rida lisatud ja %s rida
uuendatud"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s uut elementi
lisatud, %s CSV rida lisatud ja %s rida uuendatud"
COM_FABRIK_CSV_COMPLETE="CSV on eksporditud"
COM_FABRIK_CSV_DOWNLOADING="CSV faili allalaadimine"
COM_FABRIK_CSV_DOWNLOAD_HERE="Lae alla siia"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="CSV ekspordiks pole ühtegi
rida"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Vabandust, aga selles tabelis ei
ole neid CSV andmevälju:"
COM_FABRIK_CSV_FILE="CSV-fail"
COM_FABRIK_CSV_IMPORT_HEADING="Importimine: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (Exceli salvestatud
formaat)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (Fabriku eksporditud
formaat seadega 'Faili tüüp=unicode text')"
COM_FABRIK_DATE_RANGE_AND="ja"
COM_FABRIK_DATE_RANGE_BETWEEN="Vahemikus"
COM_FABRIK_DELETE="Kustuta"
COM_FABRIK_DELETE_GROUP="Kustuta grupp"
COM_FABRIK_DISPLAY_NUM="Näita #"
COM_FABRIK_DROP_EXISTING_DATA="Kustuta olemasolevad andmed"
COM_FABRIK_EDIT="Muuda"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Järgneva lehekülje veebilehest %s saatis teile
kasutaja %s ( %s).\n\nLehekülje avab viide:\n %s"
COM_FABRIK_EMPTY="Tühjenda"
COM_FABRIK_END="Lõpp"
COM_FABRIK_ENDS_WITH="LÕPUS ON"
COM_FABRIK_EQUALS="ON TÄPSELT"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Admin kujundus on mõeldud
kasutamiseks ainult Joomla administraatori lehel. Palun vali muu
kujundus."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Curl library pole mõnel selle lehe
osal lubatud ja sellepärast ei suudetud seda lehte käivitada"
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="Sakkidega
kujundus ei ühildu mitmelehelise vormiga. Kasuta kas bootstrap kujundust
või veendu, et kõigil gruppidel oleks 'Reavahetus' välja
lülitatud."
COM_FABRIK_ERR_UPLOADS_DISABLED="Paigaldaja ei saa jätkata enne, kui
failide üleslaadimine on lubatud. Palun kasuta meetodit 'Paigalda
kaustast'."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="Avalikustamata elemendile on
määratud eelfilter ja seda ei saa seetõttu rakendada: %s"
COM_FABRIK_EXACT_TERMS="Täpne fraas"
COM_FABRIK_EXPORT="Ekspordi"
COM_FABRIK_EXPORT_TO_CSV="Ekspordi CSV-faili"
COM_FABRIK_FAILED_VALIDATION="Väljad ei ole õigesti sisestatud"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV-fail"
COM_FABRIK_FIELD_CSV_FILE_DESC="Vali üleslaadimiseks CSV fail"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Kustuta andmed"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Kustutab enne CSV-failist
andmete importimist olemasolevad andmed nimistust"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Väljade
eraldaja"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Andmete eraldusmärk
CSV-failis"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Esitus"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Milline rakendus eksportis
CVS andmed (vajalik korrektseks andmete esituseks)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Kirjuta üle"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Kirjutab vastavad kirjed
üle CSV-failist pärilt andmetega"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="või tabulaator"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Aktiveerimise korral
ignoreerib andmete eraldusmärki ning kasutab eraldusmärgina
tabulaatorit."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Teksti
eraldaja"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Märk, millega
eristatakse CVS-failis tekstandmeid"
COM_FABRIK_FIELD_DELIMITER="Väljade eraldaja"
COM_FABRIK_FILE_TYPE="Faili tüüp"
COM_FABRIK_FILTER="Filtreeri"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Filtri %s andmed on kärbitud,
kuna filtris on rohkem andmeid kui on lubatud Fabrik'u seadetes. Vaata
seadetest määrangut 'Filter List Max'."
COM_FABRIK_FILTER_PLEASE_SELECT="Kõik"
COM_FABRIK_FILTERS_ACTIVE="Filtrid aktiivsed"
COM_FABRIK_FILTERS_CLEARED="Filtrid puhastatud"
COM_FABRIK_FORM="Vorm"
COM_FABRIK_FORM_FIELDS="Vormi väljad"
COM_FABRIK_FORM_NOT_PUBLISHED="Vabandust, kuid see vorm pole
avaldatud"
COM_FABRIK_FORM_SAVED="Vorm salvestatud"
COM_FABRIK_GO="Näita tulemust"
COM_FABRIK_GREATER_THAN="SUUREM KUI"
COM_FABRIK_GROUP_BY="Rühmita"
COM_FABRIK_IMPORT_CSV="Impordi CSV"
COM_FABRIK_IMPORT_CSV_FILE="Impordi CSV fail"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Ühtegi faili pole
valitud"
COM_FABRIK_IMPORT_FROM_CSV="Impordi CSV-failist"
COM_FABRIK_INCLUDE_CALCULATIONS="Kaasa arvutused"
COM_FABRIK_INCLUDE_DATA="Kaasa andmed:"
COM_FABRIK_INCLUDE_FILTERS="Kaasa filtrid:"
COM_FABRIK_INCLUDE_RAW_DATA="Kaasa toorandmed:"
COM_FABRIK_INCORRECT_LIST_ID="Vigane nimistu identifikaator"
COM_FABRIK_IS_EMPTY="ON TÜHI"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="See vorm sisaldab andmete
sidumist, kuid lähteandmete 'foreign key' %s, ei ole nähtav.
Tõenäoliselt tekib tõrge andmete salvestamisega. Vea parandamiseks palun
võta ühendust portaali omanikuga."
COM_FABRIK_LABEL="Silt"
COM_FABRIK_LESS_THAN="VÄIKSEM KUI"
COM_FABRIK_LINKED_FORM_ADD="Lisa"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Loetelu"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Loetelu 'id' on
määramata - andmeid ei saa esitada"
COM_FABRIK_LIST_NO_DATA_MSG="Andmed puuduvad"
COM_FABRIK_LIST_NOT_PUBLISHED="Vabandust, aga see loetelu pole
avaldatud"
COM_FABRIK_LOADING="Laadimine..."
COM_FABRIK_LOADING_FROM_COOKIE="Laadimine brauseri küpsisest"
COM_FABRIK_LOADING_FROM_DATABASE="Laadimine andmebaasist"
COM_FABRIK_MEDIAN="Mediaan"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Palun kontrolli, et tabelil oleks
primaarvõti määratud. Ilma selleta ei saa andmeid siduda."
COM_FABRIK_NEXT="Järgmine"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Liiga vähe õigusi. Palun logi
sisse"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Ei leitud elementi mis
vastaks %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Tabeli võtit ei leitud"
COM_FABRIK_NO_RECORDS="Ühtegi rida pole"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Ühtegi rida pole"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Andmed puuduvad"
COM_FABRIK_NONE="Mitte ükski"
COM_FABRIK_NONE_OF_THESE_TERMS="Mitte ükski neist sõnadest"
COM_FABRIK_NOT_EQUALS="EI OLE"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Vabandust, aga sul pole õigust
siia kirjet lisada"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Vabandust, aga sul pole õigust
seda kirjet muuta"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf teeki ei leitud"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Otsingusse kõigist
andmetest pole kaasatud ühtki elementi"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Sinu otsingusõna on liiga
lühike, palun proovi pikemat otsingusõna"
COM_FABRIK_OR="või"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Kirjuta samasisulised kirjed
üle"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Vali..."
COM_FABRIK_PLEASE_SELECT_A_ROW="Vali rida"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Palun vali
filtreerimise tingimused"
COM_FABRIK_PREV="Eelmine"
COM_FABRIK_PREVIOUS="Eelmine"
COM_FABRIK_PRINT="Trüki"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Päringu eelfilter on
määratud, aga väärtust/päringut pole antud"
COM_FABRIK_RECORDS="kirjet"
COM_FABRIK_RECORDS_DELETED="Kirjed on kustutatud"
COM_FABRIK_RECORD_ADDED_UPDATED="Kirje on lisatud/uuendatud"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Sa oled selle vormi täitmisega
juba algust teinud. Seetõttu alustad sa viimase külastuse lehelt. Kui
tahad alustada algusest, vajuta 'tühjenda' nuppu."
COM_FABRIK_SAVE="Salvesta"
COM_FABRIK_SAVING_TO="Salvestan:"
COM_FABRIK_SEARCH="Otsi"
COM_FABRIK_SELECT="Vali"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Palun vali vähemalt üks
filtreerimise tingimus"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Vali eksporditavad veerud"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Vali read, mida tahad
kustutada"
COM_FABRIK_SEND_EMAIL="Saada e-mail"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Vabandust, aga see
erivaade pole avaldatud"
COM_FABRIK_START="Algus"
COM_FABRIK_SUBSCRIBE_RSS="Liitu RSS uudisvooga"
COM_FABRIK_SUCCESS="Valmis"
COM_FABRIK_SUM="Summa"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Palun kontrolli, et Fabriku
süsteemiplugin oleks paigaldatud ja avaldatud"
COM_FABRIK_TEXT_DELIMITER="Teksti eraldaja"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Saadetud adressaadile:"
COM_FABRIK_TOGGLE="Lülita"
COM_FABRIK_TOTAL="Kokku"
COM_FABRIK_VALIDATING="Andmete kontrollimine"
COM_FABRIK_VALIDATION_ERROR="Andmete kontrolli viga"
COM_FABRIK_VALUE="Väärtus"
COM_FABRIK_VIEW="Vaata"
COM_FABRIK_VIEW_ALL="Näita kõiki"
COM_FABRIK_WHERE="Kus"
COM_FABRIK_YOUR_EMAIL="Teie e-maili aadress"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Teie sõbra e-maili aadress"
COM_FABRIK_YOUR_NAME="Teie nimi"
COM_FABRIK_MESSAGE_SUBJECT="Teema"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Vigane alamseade elemendile
'%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Logi"
COM_FABRIK_RUN="Käivita"
COM_FABRIK_VALIDATION="Valideerimine"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Viga täiustusega väljas - palun
teavitage kodulehe omanikku."
COM_FABRIK_LIST_TABS_ALL="Kõik"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Salvesta"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Rakenda"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Mine tagasi"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Kustuta"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Tühjenda"
language/fa-IR/fa-IR.com_fabrik.ini000064400000025417151165346220012735
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="اضافه کردن"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="اضافه کردن یک
گزینه به موارد بالا"
COM_FABRIK_ADD_GROUP="اضافه& به گروه"
COM_FABRIK_ADVANCED_SEARCH="جستجوی پیشرفته"
COM_FABRIK_ALL="همه"
COM_FABRIK_ALL_OF_THESE_TERMS="همه شرایط"
COM_FABRIK_AND="و"
COM_FABRIK_ANY_OF_THESE_TERMS="هر یک از شرط ها"
COM_FABRIK_APPLY="ثبت"
COM_FABRIK_AVERAGE="میانگین"
COM_FABRIK_BEGINS_WITH="شروع با"
COM_FABRIK_BETWEEN="بین"
COM_FABRIK_BIRTHDAY_TODAY="تولد است"
COM_FABRIK_BROWSE_FOLDERS="فراخوانی پوشه ها"
COM_FABRIK_CANCEL="بازگشت"
COM_FABRIK_CLEAR="پاک کردن فیلترها"
COM_FABRIK_CLOSE_WINDOW="بستن"
COM_FABRIK_CONDITION="شرایط"
COM_FABRIK_CONFIRM_DELETE_1="آیا برای حذف رکورد
مطمئن هستید؟"
COM_FABRIK_CONFIRM_DELETE="آیا برای حذف %sرکوردها
مطمئن هستید؟"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
COM_FABRIK_CONTAINS="دربردارنده"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="قادر به یافتن
رکورد نیستیم"
COM_FABRIK_COUNT="تعداد"
COM_FABRIK_CSV_ADDED_AND_UPDATED="تعداد %s رکورد
CSVاضافه و %s رکورد آپدیت شد"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="خروجی CSV تکمیل شد"
COM_FABRIK_CSV_DOWNLOADING="دانلود فایل CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="دانلود از اینجا"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="رکوردی برای گرفتن
خروجی CSV وجود ندارد"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="فایل CSV"
COM_FABRIK_CSV_IMPORT_HEADING="وارد کردن %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="اکسل(فرمت برای خروجی
اکسل ذخیره شد)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="و"
COM_FABRIK_DATE_RANGE_BETWEEN="بین"
COM_FABRIK_DELETE="حذف"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="نمایش"
COM_FABRIK_DROP_EXISTING_DATA="خالی کردن اطلاعات
موجود"
COM_FABRIK_EDIT="ویرایش"
COM_FABRIK_ELEMENT="عنصر"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
COM_FABRIK_EMPTY="خالی"
COM_FABRIK_END="پایان"
COM_FABRIK_ENDS_WITH="پایان با"
COM_FABRIK_EQUALS="برابر با "
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="عین عبارت"
COM_FABRIK_EXPORT="خروجی"
COM_FABRIK_EXPORT_TO_CSV="خروجی به CSV"
COM_FABRIK_FAILED_VALIDATION="اعتبار سنجی شکست
خورده"
COM_FABRIK_FIELD_CSV_FILE_LABEL="فایل CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="برای آپلود یک فایل CSV
انتخاب کنید"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="حذف
اطلاعات"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="اضافه کردن"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
COM_FABRIK_TEXT_DELIMITER="ذخیره متن"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="آیتم فرستاده شد
به"
COM_FABRIK_TOGGLE="تغییر وضعیت"
COM_FABRIK_TOTAL="همه"
COM_FABRIK_VALIDATING="اعتبارسنجی"
COM_FABRIK_VALIDATION_ERROR="خطای اعتبارسنجی"
COM_FABRIK_VALUE="ارزش"
COM_FABRIK_VIEW="نمایش"
COM_FABRIK_VIEW_ALL="نمایش همه"
COM_FABRIK_WHERE="کجا"
COM_FABRIK_YOUR_EMAIL="ایمیل شما"
COM_FABRIK_YOUR_FRIENDS_EMAIL="ایمیل دوست شما"
COM_FABRIK_YOUR_NAME="نام شما"
COM_FABRIK_MESSAGE_SUBJECT="موضوع"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="اجرا"
COM_FABRIK_VALIDATION="اعتبارسنجی"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
COM_FABRIK_LIST_TABS_ALL="همه"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="ذخیره"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="ثبت"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="بازگشت"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="حذف"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="پاک کردن"
language/fa-IR/fa-IR.com_fabrik.sys.ini000064400000024414151165346220013546
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="افزودن"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="جستجوی پیشرفته"
COM_FABRIK_ALL="همه"
COM_FABRIK_ALL_OF_THESE_TERMS="همه شرایط"
COM_FABRIK_AND="و"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="حذف"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="ویرایش"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="اضافه کردن"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
 COM_FABRIK_NOTICE_CANT_ADD_RECORDS="شما مجوز اضافه
کردن این رکورد را ندارید."
 COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="شما مجوز ویرایش
این رکورد را ندارید."
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="نمایش"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/fa/fa.com_fabrik.ini000064400000024533151165346230012114 0ustar00;
License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="اضافه کردن"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
; COM_FABRIK_DELETE="Delete"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="ویرایش"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="برچسب"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="اضافه کردن"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
COM_FABRIK_SELECT="انتخاب"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="موضوع"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/fi-FI/fi-FI.com_fabrik.ini000064400000024407151165346230012724
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Lisää"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Lisää uusi
vaihtoehto"
COM_FABRIK_ADD_GROUP="Lisää&nbsp;ryhmä"
COM_FABRIK_ADVANCED_SEARCH="Edistynyt haku"
COM_FABRIK_ALL="kaikki"
COM_FABRIK_ALL_OF_THESE_TERMS="Kaikki hakusanat"
COM_FABRIK_AND="ja"
COM_FABRIK_ANY_OF_THESE_TERMS="Mikä tahansa seuraavista
termeistä"
COM_FABRIK_APPLY="Käytä"
COM_FABRIK_AVERAGE="Keskiarvo"
COM_FABRIK_BEGINS_WITH="ALKAEN"
COM_FABRIK_BETWEEN="Välillä"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Selaa kansioita"
COM_FABRIK_CANCEL="Peru"
COM_FABRIK_CLEAR="Tyhjennä suodatus"
COM_FABRIK_CLOSE_WINDOW="Sulje"
COM_FABRIK_CONDITION="Ehdot"
COM_FABRIK_CONFIRM_DELETE_1="Haluatko varmasti poistaa tiedot?"
COM_FABRIK_CONFIRM_DELETE="Haluatko varmasti poistaa %s tiedot?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
COM_FABRIK_CONTAINS="SISÄLTÄEN"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Tietueita ei
löydy"
COM_FABRIK_COUNT="Määrä"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="CSV vienti valmis"
COM_FABRIK_CSV_DOWNLOADING="CSV tiedoston lataus"
COM_FABRIK_CSV_DOWNLOAD_HERE="Lataa tästä"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV-tiedosto"
COM_FABRIK_CSV_IMPORT_HEADING="Tuo: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="ja"
COM_FABRIK_DATE_RANGE_BETWEEN="Välillä"
COM_FABRIK_DELETE="Poista"
COM_FABRIK_DELETE_GROUP="Poista&nbsp;ryhmä"
COM_FABRIK_DISPLAY_NUM="Näytä #"
COM_FABRIK_DROP_EXISTING_DATA="Pudota olemassaoleva data"
COM_FABRIK_EDIT="Muokkaa"
COM_FABRIK_ELEMENT="Elementti"
COM_FABRIK_EMAIL_MSG="Sinulle on lähetetty sivu %s nettisivustolta,
lähettäjänä %s ( %s).\n\nVoit avata sivun linkistä:\n%s"
COM_FABRIK_EMPTY="Tyhjä"
COM_FABRIK_END="Loppu"
COM_FABRIK_ENDS_WITH="LOPPUEN"
COM_FABRIK_EQUALS="YHTÄKUIN"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Ylläpitosivupohja on
käytettävissä vain Joomlan hallintasivustolla. Ole hyvä ja valitse
toinen sivupohja."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Tarkka fraasi"
COM_FABRIK_EXPORT="Vie"
COM_FABRIK_EXPORT_TO_CSV="Vie CSV-tiedostona"
COM_FABRIK_FAILED_VALIDATION="Tarkistus epäonnistui"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV-tiedosto"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Pudota data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Kentän
erotin"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Muoto"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Ylikirjoita"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Tekstin erotin"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
COM_FABRIK_FILE_TYPE="Tiedostotyyppi"
COM_FABRIK_FILTER="Suodatus"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="Kaikki"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Suodattimet poistetu"
COM_FABRIK_FORM="Kaavake"
COM_FABRIK_FORM_FIELDS="Kaavakkeen kentät"
COM_FABRIK_FORM_NOT_PUBLISHED="Kaavaketta ei ole julkaistu"
COM_FABRIK_FORM_SAVED="Kaavake tallennettu"
COM_FABRIK_GO="Mene"
COM_FABRIK_GREATER_THAN="SUUREMPI KUIN"
COM_FABRIK_GROUP_BY="Ryhmitä"
COM_FABRIK_IMPORT_CSV="Tuo CSV"
COM_FABRIK_IMPORT_CSV_FILE="Tuo CSV-tiedosto"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Tiedostoa ei ole valittu"
COM_FABRIK_IMPORT_FROM_CSV="Tuo CSV-tiedostosta"
COM_FABRIK_INCLUDE_CALCULATIONS="Sisällytä laskutoimitukset"
COM_FABRIK_INCLUDE_DATA="Sisällytä tiedot:"
COM_FABRIK_INCLUDE_FILTERS="Sisällytä suodattimet:"
COM_FABRIK_INCLUDE_RAW_DATA="Sisällytä raakadata:"
COM_FABRIK_INCORRECT_LIST_ID="Virheellisen listan id"
COM_FABRIK_IS_EMPTY="ON TYHJÄ"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Etiketti"
COM_FABRIK_LESS_THAN="VÄHEMMÄN KUIN"
COM_FABRIK_LINKED_FORM_ADD="Lisää"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Lista"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Listan id:tä ei ole valittu -
ei voida muuntaa"
COM_FABRIK_LIST_NO_DATA_MSG="Ei tietoja"
COM_FABRIK_LIST_NOT_PUBLISHED="Listaa ei ole julkaistu"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Ladataan evästeestä"
COM_FABRIK_LOADING_FROM_DATABASE="Ladataan tietokannasta"
COM_FABRIK_MEDIAN="Mediaani"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
COM_FABRIK_NEXT="Seuraava"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Käyttäjäoikeudet eivät riitä.
Ole hyvä ja kirjaudu sisään"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Sopivia elementtejä ei
löytynyt %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Listalle ei löytynyt
avainta"
COM_FABRIK_NO_RECORDS="Tietoja ei löytynyt"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Tietoja ei löytynyt"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Ei tietoja"
COM_FABRIK_NONE="Ei mitään"
COM_FABRIK_NONE_OF_THESE_TERMS="Ei mikään termeistä"
COM_FABRIK_NOT_EQUALS="EI YHTÄKUIN"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sinulla ei ole oikeutta lisätä
tietoa"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sinulla ei ole oikeutta muokata
tietoa"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf-kirjastoa ei löydy"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Hae kaikki -hakuun ei
ole liitetty elementtejä"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="tai"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Ylikirjoita täsmäävät
tiedot"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Valitse"
COM_FABRIK_PLEASE_SELECT_A_ROW="Valitse rivi"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Valitse kaikki
vaadittavat suodatukset"
COM_FABRIK_PREV="Edellinen"
COM_FABRIK_PREVIOUS="Edellinen"
COM_FABRIK_PRINT="Tulosta"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
COM_FABRIK_RECORDS="tiedot"
COM_FABRIK_RECORDS_DELETED="Tietoja poistettu"
COM_FABRIK_RECORD_ADDED_UPDATED="Tietoa lisätty/päivitetty"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Tallenna"
COM_FABRIK_SAVING_TO="tallennetaan"
COM_FABRIK_SEARCH="Haku"
COM_FABRIK_SELECT="Valitse"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Ole hyvä ja valitse
vähintään yksi suodatus"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Valitse vietävät
sarakkeet"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Valitse poistettavat rivit"
COM_FABRIK_SEND_EMAIL="Lähetä sähköpostia"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Visualisointia ei
ole julkaistu"
COM_FABRIK_START="Aloita"
COM_FABRIK_SUBSCRIBE_RSS="Tilaa RSS"
COM_FABRIK_SUCCESS="Onnistui"
COM_FABRIK_SUM="Summa"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Varmista että olet asentanut ja
julkaisut Fabrik järjestelmä lisäosan"
COM_FABRIK_TEXT_DELIMITER="Tekstin erotin"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Tämä tietue on lähetetty
vastaanottajalle"
COM_FABRIK_TOGGLE="Valitse"
COM_FABRIK_TOTAL="Yhteensä"
COM_FABRIK_VALIDATING="Tarkistetaan"
COM_FABRIK_VALIDATION_ERROR="Tarkistus epäonnistui"
COM_FABRIK_VALUE="Arvo"
COM_FABRIK_VIEW="Näytä"
COM_FABRIK_VIEW_ALL="Näytä kaikki"
COM_FABRIK_WHERE="Missä"
COM_FABRIK_YOUR_EMAIL="Sähköpostiosoitteesi"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Ystävän sähköpostiosoite"
COM_FABRIK_YOUR_NAME="Nimesi"
COM_FABRIK_MESSAGE_SUBJECT="Aihe"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Loki"
COM_FABRIK_RUN="Suorita"
COM_FABRIK_VALIDATION="Tarkistus"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
COM_FABRIK_LIST_TABS_ALL="Kaikki"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Tallenna"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Käytä"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Takaisin"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Poista"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Nollaa"
language/fr-CA/fr-CA.com_fabrik.ini000064400000026253151165346230012721
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Ajouter"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Ajouter une nouvelle
option à celles ci-dessus"
COM_FABRIK_ADD_GROUP="Ajouter un groupe"
COM_FABRIK_ADVANCED_SEARCH="Recherche avancée"
COM_FABRIK_ALL="tous"
COM_FABRIK_ALL_OF_THESE_TERMS="Tous ces termes"
COM_FABRIK_AND="Et"
COM_FABRIK_ANY_OF_THESE_TERMS="Au moins un de ces termes"
COM_FABRIK_APPLY="Appliquer"
COM_FABRIK_AVERAGE="Moyenne"
COM_FABRIK_BEGINS_WITH="DEBUTE PAR"
COM_FABRIK_BETWEEN="Entre"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Naviguer dans les répertoires"
COM_FABRIK_CANCEL="Annuler"
COM_FABRIK_CLEAR="Effacer filtres"
COM_FABRIK_CLOSE_WINDOW="Fermer"
COM_FABRIK_CONDITION="Condition"
COM_FABRIK_CONFIRM_DELETE_1="Êtes-vous sûr(e) de vouloir supprimer
cette entrée ?"
COM_FABRIK_CONFIRM_DELETE="Etes-vous certain(e) de vouloir supprimer
%s enregistrements ?"
COM_FABRIK_CONFIRM_DROP="Etes-vous certain(e) de vouloir supprimer ces
enregistrements et de remettre la clé de cette table à la valeur 0
?"
COM_FABRIK_CONTAINS="CONTIENT"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Nous sommes incapables
de trouver cet enregistrement"
COM_FABRIK_COUNT="Nombre"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s enregistrements CSV ajoutés et
%s enregistrements mis à jour"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nouveaux
éléments ajoutés, %s enregistrements CSV ajoutés et %s enregistrements
mis à jour"
COM_FABRIK_CSV_COMPLETE="Export CSV complet"
COM_FABRIK_CSV_DOWNLOADING="Téléchargement fichier CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Télécharger ici"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Aucun enregistrement disponible pour
l'exportation CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Désolé, les champs suivants du
fichier CSV n'ont pas été trouvés dans cette table :"
COM_FABRIK_CSV_FILE="Fichier CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importer: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (enregistré depuis)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exporté par
Fabrik ou par Excel avec l'option 'Type de fichier= texte unicode
')"
COM_FABRIK_DATE_RANGE_AND="et"
COM_FABRIK_DATE_RANGE_BETWEEN="Entre"
COM_FABRIK_DELETE="Supprimer"
COM_FABRIK_DELETE_GROUP="Supprimer le groupe"
COM_FABRIK_DISPLAY_NUM="Afficher "
COM_FABRIK_DROP_EXISTING_DATA="Effacer les données existantes"
COM_FABRIK_EDIT="Editer"
COM_FABRIK_ELEMENT="Elément"
COM_FABRIK_EMAIL_MSG="La page suivante du site WEB %s vous a été
adressée par %s ( %s).\n\nVous pouvez y accéder à l'adresse
suivante :\n %s"
COM_FABRIK_EMPTY="Vide"
COM_FABRIK_END="Fin"
COM_FABRIK_ENDS_WITH="SE TERMINE PAR"
COM_FABRIK_EQUALS="EST EGAL A"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Désolé, le template
admin est seulement pour un usage dans les pages d'administration de
Joomla. Veuillez sélectionner un template different."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="La librairie Curl n'est pas
installée. Certaines parties de cette page n'ont pu être
exécutées"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="L'installateur ne peut pas
continuer avant que le chargement de fichiers soit activé. Veuillez
utiliser la méthode d'installation depuis un répertoire."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Phrase exacte"
COM_FABRIK_EXPORT="Exporter"
COM_FABRIK_EXPORT_TO_CSV="Exporter vers CSV"
COM_FABRIK_FAILED_VALIDATION="Le validation c'est
bollocksed"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Fichier CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Sélectionnez un fichier CSV à
télécharger"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Effacer données"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Effacera les données
existantes de la liste avant d'importer les données CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Délimiteur de
champ"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Le caractère
utilisé dans le fichier CSV pour séparer les cellules de données"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Quelle application a exporté
le fichier CSV (nécessaire afin de s'assurer qu'un encodage
correct est utilisé"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Ecraser"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Ecraser tous les
enregistrements correspondants avec les données CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="ou délimiteur
tabulation"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Si coché, alors le
champ délimiteur est ignoré et le caractère tabulation est assigné à
la place."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Délimiteur de
texte"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Le caractère
utilisé dans le fichier CSV pour encadrer les valeurs au format
texte"
COM_FABRIK_FIELD_DELIMITER="Délimiteur de champ"
COM_FABRIK_FILE_TYPE="Type de fichier"
COM_FABRIK_FILTER="Filtre"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Les options du filtre %s ont été
tronquées car elles contiennent plus d'enregistrements que la valeur
de la configuration globale de Fabrik 'Filter List Max'."
COM_FABRIK_FILTER_PLEASE_SELECT="Tous"
COM_FABRIK_FILTERS_CLEARED="Filtres effacés"
COM_FABRIK_FORM="Formulaire"
COM_FABRIK_FORM_FIELDS="Champs du formulaire"
COM_FABRIK_FORM_NOT_PUBLISHED="Désolé, ce formulaire n'a pas
été publié"
COM_FABRIK_FORM_SAVED="Formulaire sauvegardé"
COM_FABRIK_GO="Aller"
COM_FABRIK_GREATER_THAN="PLUS GRAND QUE"
COM_FABRIK_GROUP_BY="Grouper par"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importer fichier CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Aucun fichier
sélectionné"
COM_FABRIK_IMPORT_FROM_CSV="Import depuis CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Inclure calculs"
COM_FABRIK_INCLUDE_DATA="Inclure données :"
COM_FABRIK_INCLUDE_FILTERS="Inclure filtres :"
COM_FABRIK_INCLUDE_RAW_DATA="Inclure données brutes :"
COM_FABRIK_INCORRECT_LIST_ID="ID liste incorrecte"
COM_FABRIK_IS_EMPTY="EST VIDE"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Ce formulaire utilise des
données jointes, mais sa clé distante %s, n'est pas publiée. Ceci
provoquera des problèmes lors de la sauvegarde du formulaire. Veuillez
prendre contact avec le propriétaire du site distant au sujet de ce
problème."
COM_FABRIK_LABEL="Intitulé"
COM_FABRIK_LESS_THAN="MOINS QUE"
COM_FABRIK_LINKED_FORM_ADD="Ajouter"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Liste"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="La table n'est pas
définie - ne peut restituer"
COM_FABRIK_LIST_NO_DATA_MSG="Aucun enregistrement"
COM_FABRIK_LIST_NOT_PUBLISHED="Désolé, la table n'est pas
publiée"
COM_FABRIK_LOADING="Chargement"
COM_FABRIK_LOADING_FROM_COOKIE="Chargement depuis le cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Chargement depuis la base de
données"
COM_FABRIK_MEDIAN="Médiane"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Veuillez vous assurer que vous
avez sélectionné une clé primaire pour votre table, Fabrik ne peut pas
traiter cette jointure tant que vous n'aurez pas choisi une clé
primaire."
COM_FABRIK_NEXT="Suivant"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Droits d'accès insuffisants.
Veuillez vous connecter"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Aucun éléments ne
correspond à %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Aucune clé trouvée pour
cette liste"
COM_FABRIK_NO_RECORDS="Aucun enregistrement trouvé"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Aucun enregistrement trouvé"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Aucune donnée"
COM_FABRIK_NONE="Aucun"
COM_FABRIK_NONE_OF_THESE_TERMS="Aucun de ces termes"
COM_FABRIK_NOT_EQUALS="DIFFERENT"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Désolé mais vous n’êtes pas
autorisé à ajouter"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Désolé mais vous n’êtes pas
autorisé à modifier cette page"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Librairie Dompdf introuvable"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Aucun élément
n'est inclu dans la recherche globale"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Votre phrase de recherche
est trop courte pour effectuer une recherche dans la liste, essayez de
rechercher une phrase plus longue"
COM_FABRIK_OR="ou"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Ecraser les enregistrements
correspondants"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Veuillez choisir"
COM_FABRIK_PLEASE_SELECT_A_ROW="Veuillez sélectionner une ligne"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Veuillez sélectionner
tous les filtres requis"
COM_FABRIK_PREV="Préc."
COM_FABRIK_PREVIOUS="Précédent"
COM_FABRIK_PRINT="Imprimer"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Une requête de
pré-filtrage a été définie mais aucune valeur donnée"
COM_FABRIK_RECORDS="enregistrements"
COM_FABRIK_RECORDS_DELETED="Enregistrements supprimés"
COM_FABRIK_RECORD_ADDED_UPDATED="Enregistrement ajouté/mis à
jour"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Sauvegarder"
COM_FABRIK_SAVING_TO="sauvegarder vers"
COM_FABRIK_SEARCH="Chercher"
COM_FABRIK_SELECT="Sélectionner"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Veuillez sélectionner au moins
un filtre"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Sélectionnez les colonnes à
exporter"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Sélectionnez les lignes à
supprimer"
COM_FABRIK_SEND_EMAIL="Envoyer email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Désolé, ce rendu
n'est pas publié"
COM_FABRIK_START="Début"
COM_FABRIK_SUBSCRIBE_RSS="S'abonner en RSS"
COM_FABRIK_SUCCESS="Succès"
COM_FABRIK_SUM="Somme"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Veuillez vous assurer que vous
avez installé et publié le plugin système de Fabrik."
COM_FABRIK_TEXT_DELIMITER="Délimiteur de texte"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Cet élément a été envoyé
à"
COM_FABRIK_TOGGLE="Basculer"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validation"
COM_FABRIK_VALIDATION_ERROR="Erreur de validation"
COM_FABRIK_VALUE="Valeur"
COM_FABRIK_VIEW="Voir"
COM_FABRIK_VIEW_ALL="Tout voir"
COM_FABRIK_WHERE="Où"
COM_FABRIK_YOUR_EMAIL="Votre email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="L'email de votre ami"
COM_FABRIK_YOUR_NAME="Votre nom"
COM_FABRIK_MESSAGE_SUBJECT="Sujet"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Les sous-options spécifiées ne
sont pas valides pour l'élément '%s' : %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Exécuter"
COM_FABRIK_VALIDATION="Validation"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Une erreur s'est produite
avec un champ d'évaluation - Informez le webmestre du site,
SVP."
COM_FABRIK_LIST_TABS_ALL="Tous"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Sauvegarder"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Appliquer"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Retour"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Effacer"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Remise à zéro"
language/fr-FR/fr-FR.com_fabrik.ini000064400000027530151165346230012770
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Ajouter"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Ajouter une nouvelle
option à celles ci-dessus"
COM_FABRIK_ADD_GROUP="Ajouter un groupe"
COM_FABRIK_ADVANCED_SEARCH="Recherche avancée"
COM_FABRIK_ALL="tout"
COM_FABRIK_ALL_OF_THESE_TERMS="Tous ces termes"
COM_FABRIK_AND="Et"
COM_FABRIK_ANY_OF_THESE_TERMS="Au moins un de ces termes"
COM_FABRIK_APPLY="Appliquer"
COM_FABRIK_AVERAGE="Moyenne"
COM_FABRIK_BEGINS_WITH="DÉBUTE PAR"
COM_FABRIK_BETWEEN="Entre"
COM_FABRIK_BIRTHDAY_TODAY="Est un anniversaire"
COM_FABRIK_BROWSE_FOLDERS="Parcourir les répertoires"
COM_FABRIK_CANCEL="Annuler"
COM_FABRIK_CLEAR="Effacer les filtres"
COM_FABRIK_CLEAR_MULTI_PAGE_SESSION="Effacer"
COM_FABRIK_CLOSE_WINDOW="Fermer"
COM_FABRIK_CONDITION="Condition"
COM_FABRIK_CONFIRM_DELETE_1="Êtes-vous sûr(e) de vouloir supprimer
cet enregistrement ?"
COM_FABRIK_CONFIRM_DELETE="Êtes-vous sûr(e) de vouloir supprimer les
enregistrements %s ?"
COM_FABRIK_CONFIRM_DROP="Voulez-vous vraiment supprimer tous les
enregistrements et réinitialiser ces clés de table à 0 ?"
COM_FABRIK_CONTAINS="CONTIENT"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Nous ne sommes pas en
mesure de trouver cet enregistrement"
COM_FABRIK_COUNT="Nombre"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s enregistrements CSV ajoutés et
%s enregistrements mis à jour"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nouveaux
éléments ajoutés, %s enregistrements CSV ajoutés et %s enregistrements
mis à jour"
COM_FABRIK_CSV_COMPLETE="Export CSV terminé"
COM_FABRIK_CSV_DOWNLOADING="Téléchargement du fichier CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Télécharger ici"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Aucun enregistrement disponible pour
l'exportation CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Désolé, les champs suivants du
fichier CSV ne se trouvent pas dans cette table :"
COM_FABRIK_CSV_FILE="Fichier CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importer: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format enregistré depuis
Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exporté par
Fabrik ou par Excel avec l'option 'Type de fichier = texte
unicode')"
COM_FABRIK_DATE_RANGE_AND="et"
COM_FABRIK_DATE_RANGE_BETWEEN="Entre"
COM_FABRIK_DELETE="Supprimer"
COM_FABRIK_DELETE_GROUP="Supprimer le groupe"
COM_FABRIK_DISPLAY_NUM="Afficher "
COM_FABRIK_DROP_EXISTING_DATA="Supprimer les données existantes"
COM_FABRIK_EDIT="Modifier"
COM_FABRIK_ELEMENT="Élément"
COM_FABRIK_EMAIL_MSG="La page suivante du site web %s vous a été
envoyée par %s ( %s).\n\nVous pouvez y accéder à l'adresse suivante
:\n %s"
COM_FABRIK_EMPTY="Vide"
COM_FABRIK_END="Fin"
COM_FABRIK_ENDS_WITH="SE TERMINE PAR"
COM_FABRIK_EQUALS="EST EGAL A"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Désolé, le template
d'administration ne doit être utilisé que dans les pages
d'administration de Joomla. Veuillez sélectionner un template
différent."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="La bibliothèque Curl n'est
pas installée certaines parties de cette page n'ont pas pu être
exécutées"
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="Le
template d'onglets est incompatible avec les formulaires multipages.
Utilisez à la place le template bootstrap ou assurez-vous que tous les
groupes ont l'option 'Saut de page' désactivée"
COM_FABRIK_ERR_UPLOADS_DISABLED="Le programme d'installation ne
peut pas continuer tant que le téléchargement de fichiers n'est pas
activé. Veuillez utiliser la méthode d'installation à partir
d'un répertoire."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="Un pré-filtre a été
configuré sur un élément non publié et ne sera pas appliqué : %s"
COM_FABRIK_EXACT_TERMS="Phrase exacte"
COM_FABRIK_EXPORT="Exporter"
COM_FABRIK_EXPORT_TO_CSV="Exporter au format CSV"
COM_FABRIK_FAILED_VALIDATION="Échec de la validation"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Fichier CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Sélectionnez un fichier CSV à
télécharger"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Effacer les
données"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Supprime les données
existantes de la liste avant d'importer les données CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Délimiteur de
champ"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Le caractère
utilisé dans le fichier CSV pour séparer les données de la cellule"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Quelle application a exporté
le fichier CSV (nécessaire pour s'assurer que l'encodage correct
soit utilisé)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Écraser"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Écrase tous les
enregistrements correspondants aux les données CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="ou délimiteur
tabulation"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Si cette case est
cochée, le délimiteur de champ est ignoré et le caractère de tabulation
est affecté à la place."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Délimiteur de
texte"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Le caractère
utilisé dans le fichier CSV pour encadrer les valeurs de texte"
COM_FABRIK_FIELD_DELIMITER="Délimiteur de champ"
COM_FABRIK_FILE_TYPE="Type de fichier"
COM_FABRIK_FILTER="Filtre"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Les options du filtre %s ont été
tronquées car elles contiennent plus d'enregistrements que la valeur
de configuration globale 'Liste de filtres Max' de Fabrik."
COM_FABRIK_FILTER_PLEASE_SELECT="Tous"
COM_FABRIK_FILTERS_ACTIVE="Filtres actifs"
COM_FABRIK_FILTERS_CLEARED="Filtres effacés"
COM_FABRIK_FORM="Formulaire"
COM_FABRIK_FORM_FIELDS="Champs du formulaire"
COM_FABRIK_FORM_NOT_PUBLISHED="Désolé ce formulaire n'est pas
publié"
COM_FABRIK_FORM_SAVED="Formulaire sauvegardé"
COM_FABRIK_GO="Aller"
COM_FABRIK_GREATER_THAN="PLUS GRAND QUE"
COM_FABRIK_GROUP_BY="Grouper par"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importer fichier CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Aucun fichier
sélectionné"
COM_FABRIK_IMPORT_FROM_CSV="Import depuis CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Inclure les calculs"
COM_FABRIK_INCLUDE_DATA="Inclure les données :"
COM_FABRIK_INCLUDE_FILTERS="Inclure les filtres :"
COM_FABRIK_INCLUDE_RAW_DATA="Inclure les données brutes :"
COM_FABRIK_INCORRECT_LIST_ID="ID de liste incorrecte"
COM_FABRIK_IS_EMPTY="EST VIDE"
COM_FABRIK_IS_NOT_EMPTY="N'EST PAS VIDE"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Ce formulaire utilise des
données jointes, mais sa clé étrangère %s n'est pas publiée. Cela
entraînera des problèmes lors de l'enregistrement du formulaire.
Veuillez contacter le propriétaire du site à propos de ce
problème."
COM_FABRIK_LABEL="Étiquette"
COM_FABRIK_LESS_THAN="MOINS QUE"
COM_FABRIK_LINKED_FORM_ADD="Ajouter"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Liste"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="L'ID de liste n'est
pas défini - impossible de faire un rendu"
COM_FABRIK_LIST_NO_DATA_MSG="Pas d'enregistrements"
COM_FABRIK_LIST_NOT_PUBLISHED="Désolé cette liste n'est pas
publiée"
COM_FABRIK_LOADING="Chargement..."
COM_FABRIK_LOADING_FROM_COOKIE="Chargement à partir du cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Chargement depuis la base de
données"
COM_FABRIK_MEDIAN="Médiane"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Veuillez vous assurer que vous
avez sélectionné une clé primaire pour votre table, Fabrik ne peut pas
traiter cette jointure tant que vous ne l'avez pas fait"
COM_FABRIK_NEXT="Suivant"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Droits d'accès insuffisants
Veuillez vous connecter"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Aucun élément trouvé
correspondant à %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Aucune clé trouvée pour
cette liste"
COM_FABRIK_NO_RECORDS="Aucun enregistrement trouvé"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Aucun enregistrement trouvé"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Pas de données"
COM_FABRIK_NONE="Aucun"
COM_FABRIK_NONE_OF_THESE_TERMS="Aucun de ces termes"
COM_FABRIK_NOT_EQUALS="DIFFÉRENT DE"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Désolé, mais vous n'êtes
pas autorisé à ajouter cet enregistrement"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Désolé, mais vous n'êtes
pas autorisé à modifier cet enregistrement"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Bibliothèque Dompdf
introuvable"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Aucun élément défini
pour être inclus dans la recherche"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Votre phrase de recherche
est trop courte pour effectuer une recherche dans la liste. Essayez
d'effectuer une recherche sur une phrase plus longue"
COM_FABRIK_OR="ou"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Écraser les enregistrements
correspondants"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Veuillez choisir"
COM_FABRIK_PLEASE_SELECT_A_ROW="Veuillez sélectionner une ligne"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Veuillez sélectionner
tous les filtres requis"
COM_FABRIK_PREV="Préc."
COM_FABRIK_PREVIOUS="Précédent"
COM_FABRIK_PRINT="Imprimer"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Un pré-filtre de requête a
été défini mais aucune valeur/requête donnée"
COM_FABRIK_RECORDS="enregistrements"
COM_FABRIK_RECORDS_DELETED="Enregistrements supprimés"
COM_FABRIK_RECORD_ADDED_UPDATED="Enregistrement ajouté/mis à
jour"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Il semble que vous ayez déjà
commencé à remplir ce formulaire. Vous partez de la dernière page que
vous avez visitée. Si vous souhaitez redémarrer le formulaire, appuyez
sur le bouton 'Effacer'."
COM_FABRIK_SAVE="Sauvegarder"
COM_FABRIK_SAVING_TO="sauvegarder vers"
COM_FABRIK_SEARCH="Chercher"
COM_FABRIK_SELECT="Sélectionner"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Veuillez sélectionner au moins
un filtre"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Sélectionnez les colonnes à
exporter"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Sélectionnez des lignes à
supprimer"
COM_FABRIK_SEND_EMAIL="Envoyer un email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Désolé cette
visualisation est non publiée"
COM_FABRIK_START="Début"
COM_FABRIK_SUBSCRIBE_RSS="S'abonner au flux RSS"
COM_FABRIK_SUCCESS="Succès"
COM_FABRIK_SUM="Somme"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Veuillez vous assurer que vous
avez installé et publié le plugin système Fabrik"
COM_FABRIK_TEXT_DELIMITER="Délimiteur de texte"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Cet élément a été envoyé
à"
COM_FABRIK_TOGGLE="Basculer"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validation"
COM_FABRIK_VALIDATION_ERROR="Erreur de validation"
COM_FABRIK_VALUE="Valeur"
COM_FABRIK_VIEW="Afficher"
COM_FABRIK_VIEW_ALL="Tout voir"
COM_FABRIK_WHERE="Où"
COM_FABRIK_YOUR_EMAIL="Votre e-mail"
COM_FABRIK_YOUR_FRIENDS_EMAIL="L'e-mail de votre ami"
COM_FABRIK_YOUR_NAME="Votre nom"
COM_FABRIK_MESSAGE_SUBJECT="Sujet"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Sous-options incorrectes
spécifiées pour l'élément '%s' : %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Rapport"
COM_FABRIK_RUN="Exécuter"
COM_FABRIK_VALIDATION="Validation"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Une erreur s'est produite
avec un champ évalué - veuillez en informer le propriétaire du site
web."
COM_FABRIK_LIST_TABS_ALL="Tous"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Sauvegarder"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Appliquer"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Retour"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Effacer"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Réinitialiser"

; 3.5
COM_FABRIK_ELEMENT_PARAMS_TOO_BIG="Les paramètres de l'élément
sont trop gros pour être sauvegardés, probablement les données de
calcul, pour l'ID de l'élément %s"

; 3.6
COM_FABRIK_LIBRARY_NOT_INSTALLED="Pour utiliser cette fonctionnalité,
vous devez installer le paquet Fabrik Library"
language/hi-IN/hi-IN.com_fabrik.ini000064400000024477151165346230012757
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="ज़ोर"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
; COM_FABRIK_DELETE="Delete"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
; COM_FABRIK_EDIT="Edit"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="ज़ोर"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/hi-IN/hi-IN.com_fabrik.sys.ini000064400000024332151165346230013562
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="ज़ोर"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
; COM_FABRIK_DELETE="Delete"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
; COM_FABRIK_EDIT="Edit"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="ज़ोर"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/it-IT/it-IT.com_fabrik.ini000064400000025107151165346230013012
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Aggiungi"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Aggiungi una nuova opzione
a quelle sopra"
COM_FABRIK_ADD_GROUP="Aggiungi&nbsp;gruppo"
COM_FABRIK_ADVANCED_SEARCH="Ricerca avanzata"
COM_FABRIK_ALL="Tutto"
COM_FABRIK_ALL_OF_THESE_TERMS="Tutti questi termini"
COM_FABRIK_AND="e"
COM_FABRIK_ANY_OF_THESE_TERMS="Alcuni di questi termini"
COM_FABRIK_APPLY="Applica"
COM_FABRIK_AVERAGE="Media"
COM_FABRIK_BEGINS_WITH="Inizia con"
COM_FABRIK_BETWEEN="Tra"
COM_FABRIK_BIRTHDAY_TODAY="È l'anniversario"
COM_FABRIK_BROWSE_FOLDERS="Sfoglia cartelle"
COM_FABRIK_CANCEL="Cancella"
COM_FABRIK_CLEAR="Pulisci"
COM_FABRIK_CLOSE_WINDOW="Chiudi finestra"
COM_FABRIK_CONDITION="Condizione"
COM_FABRIK_CONFIRM_DELETE_1="Sei sicuro di voler cancellare questa
registrazione?"
COM_FABRIK_CONFIRM_DELETE="Sei sicuro di voler cancellare %s
record?"
COM_FABRIK_CONFIRM_DROP="Sei sicuro di voler realmente cancellare
tutti i record e resettare a zero?"
COM_FABRIK_CONTAINS="Contiene"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Impossibile trovare
questo inserimento"
COM_FABRIK_COUNT="Conta"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV aggiunti e %s
modificati"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nuovi elementi
aggiunti, %s CSV aggiunti e %s modificati"
COM_FABRIK_CSV_COMPLETE="Esportazione CSV completata"
COM_FABRIK_CSV_DOWNLOADING="Sto scaricando il file CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Scarica qui"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Non ci sono dati CSV da
esportare"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Spiacente i seguenti campi del
file CSV non trovano corrispondenza nella tabella:"
COM_FABRIK_CSV_FILE="File CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importa: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formato salvato con
Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formato esportato da
Fabrik o da Excel con il 'testo Tipo di file = unicode'
opzione)"
COM_FABRIK_DATE_RANGE_AND="e"
COM_FABRIK_DATE_RANGE_BETWEEN="Tra"
COM_FABRIK_DELETE="Cancella"
COM_FABRIK_DELETE_GROUP="Elimina&nbsp;Gruppo"
COM_FABRIK_DISPLAY_NUM="Visualizza #"
COM_FABRIK_DROP_EXISTING_DATA="Elimina dati esistenti"
COM_FABRIK_EDIT="Modifica"
COM_FABRIK_ELEMENT="Elemento"
COM_FABRIK_EMAIL_MSG="La seguente pagina del sito
"_QQ_"%s"_QQ_" ti è stata inviata da %s (
%s).⏎\n⏎\nPuoi accedervi dal seguente URL:⏎\n %s"
COM_FABRIK_EMPTY="Svuota"
COM_FABRIK_END="Fine"
COM_FABRIK_ENDS_WITH="Finisce con"
COM_FABRIK_EQUALS="Uguale"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Spiacenti il tema di
amministrazione è solo per l'uso all'interno delle pagine di
amministrazione Joomla. Si prega di selezionare un tema diverso."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="La libreria Curl non è installata
e alcune parti di questa pagina non sono riusciti ad essere eseguite"
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="Il
modello a schede non è compatibile con i formulari multipagina. Usare il
modello del bootstrap, o assicurarsi che tutti i gruppi abbiano la propria
opzione 'salto di pagina' spenta"
COM_FABRIK_ERR_UPLOADS_DISABLED="Il programma di installazione non
può proseguire prima che il caricamento del file è abilitato. Si prega di
utilizzare l'installazione dal metodo directory."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="Un pre-filtro è stato allestito
su un elemento inedito, e non sarà applicato: % s"
COM_FABRIK_EXACT_TERMS="Frase esatta"
COM_FABRIK_EXPORT="Esporta"
COM_FABRIK_EXPORT_TO_CSV="Esporta CSV"
COM_FABRIK_FAILED_VALIDATION="Validazione fallita"
COM_FABRIK_FIELD_CSV_FILE_LABEL="File CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Seleziona un file CSV da
caricare"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Elimina dati"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Saranno rimossi i dati
esistenti dalla tabella prima di importare i dati CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Delimitatore di
campo"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Il carattere usato
nel file CSV per separare i dati"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formato"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Applicazione usata per
esportare il file CSV (necessario per assicurare la codifica usata)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Sovrascrivi"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Sovrascrivi i dati
corrispondenti con i dati CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="Delimitatore di
Tababulazione"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Se selezionato, il
delimitatore di campo è ignorato e il carattere di tabulazione tab è
invece assegnato"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Delimitatore di
testo"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Il carattere usato
nel file CSV per racchiudere valori di testo"
COM_FABRIK_FIELD_DELIMITER="Delimitatore di campo"
COM_FABRIK_FILE_TYPE="Tipo di File"
COM_FABRIK_FILTER="Filtro"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Le opzioni di filtro %s sono stati
troncate quanto contiene più record dalla configurazione globale di fabrik
'Filter List Max'"
COM_FABRIK_FILTER_PLEASE_SELECT="Tutti"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filtri svuotati"
COM_FABRIK_FORM="Modulo"
COM_FABRIK_FORM_FIELDS="Campi del Modulo"
COM_FABRIK_FORM_NOT_PUBLISHED="Questo Form non risulta
pubblicato"
COM_FABRIK_FORM_SAVED="Form salvato"
COM_FABRIK_GO="Vai"
COM_FABRIK_GREATER_THAN="Maggiore di"
COM_FABRIK_GROUP_BY="Raggruppato per"
COM_FABRIK_IMPORT_CSV="Importa CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importa file CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nessun file selezionato"
COM_FABRIK_IMPORT_FROM_CSV="Importa da CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Includi calcoli"
COM_FABRIK_INCLUDE_DATA="Includi dati:"
COM_FABRIK_INCLUDE_FILTERS="Includi filtri:"
COM_FABRIK_INCLUDE_RAW_DATA="Includi dati grezzi:"
COM_FABRIK_INCORRECT_LIST_ID="id tabella non corretto"
COM_FABRIK_IS_EMPTY="E' VUOTO"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Questo Form contiene dati
con Join, ma la sua chiave esterna %s, non è pubblicata. Questo causerà
problemi al salvataggio del form. Contatta il responsabile del sito per
questo problema"
COM_FABRIK_LABEL="Etichetta"
COM_FABRIK_LESS_THAN="Minore di"
COM_FABRIK_LINKED_FORM_ADD="Aggiungi"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Lista"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="L'id della tabella non è
settato - Impossibile mostrare"
COM_FABRIK_LIST_NO_DATA_MSG="Non ci sono record"
COM_FABRIK_LIST_NOT_PUBLISHED="Questa tabella non risulta
pubblicata"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Caricamento dal cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Caricamento dal database"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Assicurati di aver selezionato
Chiave Primaria per la tabella, Fabrik non può processare il join senza di
essa."
COM_FABRIK_NEXT="Successivo"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Diritti di accesso insufficienti.
Effettua il login"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Nessun elemento trovato che
corrisponde a %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nessuna chiave trovata per
questa tabella"
COM_FABRIK_NO_RECORDS="Nessun record"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Nessun record"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Nessun dato"
COM_FABRIK_NONE="Nessuno"
COM_FABRIK_NONE_OF_THESE_TERMS="Nessuno di questi termini"
COM_FABRIK_NOT_EQUALS="Diverso"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Ci dispiace, ma non sei
autorizzato ad aggiungere questo record"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Ci dispiace, ma non sei
autorizzato a modificare questo record"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="La libreria Dompdf non è stata
trovata"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Non ci sono elementi
indicati da includere nella ricerca totale"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="La tua frase di ricerca è
troppo breve per cercare la lista, prova a cercare su una frase più
lunga"
COM_FABRIK_OR="oppure"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Sovrascrivi records
corrispondenti"
COM_FABRIK_PDF="Pdf"
COM_FABRIK_PLEASE_SELECT="Seleziona"
COM_FABRIK_PLEASE_SELECT_A_ROW="Seleziona una riga"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Seleziona tutti i
filtri obbligatori"
COM_FABRIK_PREV="Prev"
COM_FABRIK_PREVIOUS="Precedente"
COM_FABRIK_PRINT="Stampa"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Un prefiltro di query è
stato settato ma nessun valore restituito"
COM_FABRIK_RECORDS="record"
COM_FABRIK_RECORDS_DELETED="Record cancellato"
COM_FABRIK_RECORD_ADDED_UPDATED="Record aggiunto/aggiornato"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Sembra che il tuo modulo è in
compilazione. Dovresti iniziare dall'ultima pagina visitata. Se
desideri ricomimciare la compilazione, premi il pulsante Pulisci"
COM_FABRIK_SAVE="Salva"
COM_FABRIK_SAVING_TO="salva su"
COM_FABRIK_SEARCH="Cerca"
COM_FABRIK_SELECT="Seleziona"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Prego, seleziona almeno un
filtro"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Seleziona Colonne da
esportare"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Seleziona le righe da
eliminare"
COM_FABRIK_SEND_EMAIL="Invia email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Questa
visualizzazione non è pubblicata"
COM_FABRIK_START="Inizia"
COM_FABRIK_SUBSCRIBE_RSS="Sottoscrivi RSS"
COM_FABRIK_SUCCESS="Effettuato"
COM_FABRIK_SUM="Somma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Assicurati di aver installato e
pubblicato i plugin di sistema di Fabrik"
COM_FABRIK_TEXT_DELIMITER="Delimitatore di testo"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Questo oggetto è stato inviato
a"
COM_FABRIK_TOGGLE="Interruttore"
COM_FABRIK_TOTAL="Totale"
COM_FABRIK_VALIDATING="In validazione"
COM_FABRIK_VALIDATION_ERROR="Errore di validazione"
COM_FABRIK_VALUE="Valore"
COM_FABRIK_VIEW="Dettaglio"
COM_FABRIK_VIEW_ALL="Vedi tutti"
COM_FABRIK_WHERE="Dove"
COM_FABRIK_YOUR_EMAIL="Tua email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="email dei tuoi amici"
COM_FABRIK_YOUR_NAME="Tuo nome"
COM_FABRIK_MESSAGE_SUBJECT="Soggetto"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Sotto-opzioni non valide
specificate per l'elemento '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Carica"
COM_FABRIK_VALIDATION="Validazione"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Si è verificato un errore con un
eval'd di campo - si prega di informare il proprietario del
sito."
COM_FABRIK_LIST_TABS_ALL="Tutto"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Salva"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Applica"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Indietro"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Elimina"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/ja-JP/ja-JP.com_fabrik.ini000064400000030265151165346230012741
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="追加"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="上記のものに新しいオプションを追加します。"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="詳細検索"
COM_FABRIK_ALL="すべて"
COM_FABRIK_ALL_OF_THESE_TERMS="これらすべての用語"
COM_FABRIK_AND="と"
COM_FABRIK_ANY_OF_THESE_TERMS="これらの言葉の任意の"
COM_FABRIK_APPLY="適用"
COM_FABRIK_AVERAGE="平均"
COM_FABRIK_BEGINS_WITH="で始まる"
COM_FABRIK_BETWEEN="間"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="フォルダの参照"
COM_FABRIK_CANCEL="キャンセル"
COM_FABRIK_CLEAR="クリアフィルター"
COM_FABRIK_CLOSE_WINDOW="閉じる"
COM_FABRIK_CONDITION="条件"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="これらのレコードを削除してもよろしいですか?"
COM_FABRIK_CONFIRM_DROP="本当にすべてのレコードを削除し、テーブルの主キーをリセットしますか?"
COM_FABRIK_CONTAINS="含んでいる"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="カウント"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="CSVのエクスポートが完了しました"
COM_FABRIK_CSV_DOWNLOADING="CSVファイルのダウンロード"
COM_FABRIK_CSV_DOWNLOAD_HERE="ダウンロードはこちら"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="CSVファイル内の次のフィールドは、このリストに記載されていません"
COM_FABRIK_CSV_FILE="CSVファイル"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="と"
COM_FABRIK_DATE_RANGE_BETWEEN="間"
COM_FABRIK_DELETE="削除"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="頁"
COM_FABRIK_DROP_EXISTING_DATA="exisitngのデータを削除"
COM_FABRIK_EDIT="編集​​"
COM_FABRIK_ELEMENT="エレメント"
COM_FABRIK_EMAIL_MSG="%sのウェブサイトから以下のページは%s(%s)でお客様に送信されました\nを\n削除すると、以下のURLでアクセスできます:\nは%sの"
COM_FABRIK_EMPTY="空"
COM_FABRIK_END="終了"
COM_FABRIK_ENDS_WITH="で終わります"
COM_FABRIK_EQUALS="等しい"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="残念ですが、adminテンプレートはJoomlaの管理者専用のものですので、どうか別のテンプレートを選択してください。"
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Curlライブラリがインストールされていない為に、いくつかのページで実行に失敗しています。"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="ファイルをアップロードするためのサーバー環境が、このアップロードを実行するに足りる設定がされていないとこの方法ではインストールができませんので、ディレクトからインストールする方法を実行してみてください。"
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="正確なフレーズ"
COM_FABRIK_EXPORT="エクスポート"
COM_FABRIK_EXPORT_TO_CSV="CSVへのエクスポート"
COM_FABRIK_FAILED_VALIDATION="検証に失敗しました"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSVファイル"
COM_FABRIK_FIELD_CSV_FILE_DESC="アップロードするCSVファイルを選択します。"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="データを削除"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="CSVデータをインポートする前に、リストから既存のデータが削除されます"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="フィールド区切り文字"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="セルのデータを分離するために使用される文字"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="フォーマット"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="エクスポートに使ったアプリケーションは何でしたか?(正しい区切り記号が使用されていることを確認するために必要です)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="上書き"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="CSVのデータと一致するレコードを上書きします"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="またはタブ区切り"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="チェックした場合、フィールド区切り文字は無視され、タブ文字が代わりに割り当てられています。"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="テキスト区切り文字"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="CSVファイルでテキストの値を識別するために使用される区切り文字"
COM_FABRIK_FIELD_DELIMITER="フィールド区切り文字"
COM_FABRIK_FILE_TYPE="ファイルタイプ"
COM_FABRIK_FILTER="フィルタ"
COM_FABRIK_FILTER_LIST_MAX_REACHED="フィルタ %s
オプションではFabrik
Global設定にあるリスト最大値を超過した行を切り捨てています。そのフィルタリングでは設定値を超えたレコードを含むことになります。"
COM_FABRIK_FILTER_PLEASE_SELECT="すべて"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="フィルタはクリア"
COM_FABRIK_FORM="フォーム"
COM_FABRIK_FORM_FIELDS="フォームフィールド"
COM_FABRIK_FORM_NOT_PUBLISHED="申し訳ありませんがこのフォームは公開されていない"
COM_FABRIK_FORM_SAVED="保存されたフォーム"
COM_FABRIK_GO="移動"
COM_FABRIK_GREATER_THAN="より大きい"
COM_FABRIK_GROUP_BY="グループで"
COM_FABRIK_IMPORT_CSV="インポートCSV"
COM_FABRIK_IMPORT_CSV_FILE="インポートCSVファイル"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="いいえファイルが選択されていません"
COM_FABRIK_IMPORT_FROM_CSV="CSVのインポート"
COM_FABRIK_INCLUDE_CALCULATIONS="計算を含める"
COM_FABRIK_INCLUDE_DATA="データを含める。"
COM_FABRIK_INCLUDE_FILTERS="フィルタを含める。"
COM_FABRIK_INCLUDE_RAW_DATA="生データを含める。"
COM_FABRIK_INCORRECT_LIST_ID="誤ったリストID"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="このフォームは、結合されたデータを使用していますが、その外部キー%sは、公開されていません。フォームを保存するときにこの問題が発生します。サイトの所有者に連絡してください"
COM_FABRIK_LABEL="ラベル"
COM_FABRIK_LESS_THAN="より小さい"
COM_FABRIK_LINKED_FORM_ADD="追加"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="設定されていないテーブルのidは出力することができません"
COM_FABRIK_LIST_NO_DATA_MSG="いいえレコードがありません"
COM_FABRIK_LIST_NOT_PUBLISHED="申し訳ありませんが、この表が公開されていない"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="クッキーからのロード"
COM_FABRIK_LOADING_FROM_DATABASE="データベースからのロード"
COM_FABRIK_MEDIAN="中央値"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="テーブルの主キーを選択していることを確認してください、そうしないとこの結合処理ができません。"
COM_FABRIK_NEXT=">"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="不十分なアクセス権限です。ログインを済ませてください。"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="このテーブルのキーが見つかりません"
COM_FABRIK_NO_RECORDS="情報はありません"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="情報はありません"
COM_FABRIK_NO_REPEAT_GROUP_DATA="データなし"
COM_FABRIK_NONE="なし"
COM_FABRIK_NONE_OF_THESE_TERMS="これらの用語なし"
COM_FABRIK_NOT_EQUALS="等しくない"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="残念ですが、あなたはこのデータ入力をすることを承認されていません。"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="残念ですが、あなたはこのデータ編集をすることを承認されていません"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf
のライブラリファイルが見つかりません"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="全文検索と照合する箇所はありません"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="その語句は短すぎですからもう少し長いフレーズで検索してみてください。"
COM_FABRIK_OR="または"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="一致する​​レコードを上書きします。"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="選択してください"
COM_FABRIK_PLEASE_SELECT_A_ROW="行を選択してください"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="必要なすべてのフィルタを選択してください"
COM_FABRIK_PREV="<"
COM_FABRIK_PREVIOUS="最初"
COM_FABRIK_PRINT="印刷"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="クエリーのプレフィルターはセットされていますが、値/クエリーが与えられていません"
COM_FABRIK_RECORDS="記録"
COM_FABRIK_RECORDS_DELETED="レコードは削除されました"
COM_FABRIK_RECORD_ADDED_UPDATED="レコードを追加/更新"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="入力し直したい場合はクリアボタンを押してください。ただしこのフォームで既に入力されたデータは失われます"
COM_FABRIK_SAVE="保存"
COM_FABRIK_SAVING_TO="に保存"
COM_FABRIK_SEARCH="検索"
COM_FABRIK_SELECT="選択"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="少なくとも一つのフィルタを選択してください"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="エクスポートする列を選択します。"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="削除のためのいくつかの行を選択します。"
COM_FABRIK_SEND_EMAIL="電子メールを送ってください"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="この可視化ページは未公開です。"
COM_FABRIK_START="開始"
COM_FABRIK_SUBSCRIBE_RSS="RSSを登録"
COM_FABRIK_SUCCESS="成功"
COM_FABRIK_SUM="合計"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="あなたは、Fabrikのシステムプラグインをインストールし、それを公開していることを確認してください"
COM_FABRIK_TEXT_DELIMITER="テキスト区切り文字"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="このアイテムを送信しました"
COM_FABRIK_TOGGLE="トグル"
; COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="検証"
COM_FABRIK_VALIDATION_ERROR="検証エラー"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="表示"
COM_FABRIK_VIEW_ALL="全て表示"
COM_FABRIK_WHERE="どこに"
COM_FABRIK_YOUR_EMAIL="メールアドレス"
COM_FABRIK_YOUR_FRIENDS_EMAIL="お友達のメールアドレス"
COM_FABRIK_YOUR_NAME="お名前"
COM_FABRIK_MESSAGE_SUBJECT="件名"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/ja-JP/ja-JP.com_fabrik.sys.ini000064400000030127151165346240013554
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="追加"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="上記のものに新しいオプションを追加します。"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="詳細検索"
COM_FABRIK_ALL="すべて"
COM_FABRIK_ALL_OF_THESE_TERMS="これらすべての用語"
COM_FABRIK_AND="と"
COM_FABRIK_ANY_OF_THESE_TERMS="これらの言葉の任意の"
COM_FABRIK_APPLY="適用"
COM_FABRIK_AVERAGE="平均"
COM_FABRIK_BEGINS_WITH="で始まる"
COM_FABRIK_BETWEEN="間"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="フォルダの参照"
COM_FABRIK_CANCEL="キャンセル"
COM_FABRIK_CLEAR="クリアフィルター"
COM_FABRIK_CLOSE_WINDOW="閉じる"
COM_FABRIK_CONDITION="条件"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="これらのレコードを削除してもよろしいですか?"
COM_FABRIK_CONFIRM_DROP="本当にすべてのレコードを削除し、テーブルの主キーをリセットしますか?"
COM_FABRIK_CONTAINS="含んでいる"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="カウント"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="CSVのエクスポートが完了しました"
COM_FABRIK_CSV_DOWNLOADING="CSVファイルのダウンロード"
COM_FABRIK_CSV_DOWNLOAD_HERE="ダウンロードはこちら"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="CSVファイル内の次のフィールドは、このリストに記載されていません"
COM_FABRIK_CSV_FILE="CSVファイル"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="と"
COM_FABRIK_DATE_RANGE_BETWEEN="間"
COM_FABRIK_DELETE="削除"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="頁"
COM_FABRIK_DROP_EXISTING_DATA="exisitngのデータを削除"
COM_FABRIK_EDIT="編集​​"
COM_FABRIK_ELEMENT="エレメント"
COM_FABRIK_EMAIL_MSG="%sのウェブサイトから以下のページは%s(%s)でお客様に送信されました\nを\n削除すると、以下のURLでアクセスできます:\nは%sの"
COM_FABRIK_EMPTY="空"
COM_FABRIK_END="終了"
COM_FABRIK_ENDS_WITH="で終わります"
COM_FABRIK_EQUALS="等しい"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="残念ですが、adminテンプレートはJoomlaの管理者専用のものですので、どうか別のテンプレートを選択してください。"
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Curlライブラリがインストールされていない為に、いくつかのページで実行に失敗しています。"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="ファイルをアップロードするためのサーバー環境が、このアップロードを実行するに足りる設定がされていないとこの方法ではインストールができませんので、ディレクトからインストールする方法を実行してみてください。"
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="正確なフレーズ"
COM_FABRIK_EXPORT="エクスポート"
COM_FABRIK_EXPORT_TO_CSV="CSVへのエクスポート"
COM_FABRIK_FAILED_VALIDATION="検証に失敗しました"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSVファイル"
COM_FABRIK_FIELD_CSV_FILE_DESC="アップロードするCSVファイルを選択します。"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="データを削除"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="CSVデータをインポートする前に、リストから既存のデータが削除されます"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="フィールド区切り文字"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="セルのデータを分離するために使用される文字"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="フォーマット"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="エクスポートに使ったアプリケーションは何でしたか?(正しい区切り記号が使用されていることを確認するために必要です)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="上書き"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="CSVのデータと一致するレコードを上書きします"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="またはタブ区切り"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="チェックした場合、フィールド区切り文字は無視され、タブ文字が代わりに割り当てられています。"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="テキスト区切り文字"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="CSVファイルでテキストの値を識別するために使用される区切り文字"
COM_FABRIK_FIELD_DELIMITER="フィールド区切り文字"
COM_FABRIK_FILE_TYPE="ファイルタイプ"
COM_FABRIK_FILTER="フィルタ"
COM_FABRIK_FILTER_LIST_MAX_REACHED="フィルタ %s
オプションではFabrik
Global設定にあるリスト最大値を超過した行を切り捨てています。そのフィルタリングでは設定値を超えたレコードを含むことになります。"
COM_FABRIK_FILTER_PLEASE_SELECT="すべて"
COM_FABRIK_FILTERS_CLEARED="フィルタはクリア"
COM_FABRIK_FORM="フォーム"
COM_FABRIK_FORM_FIELDS="フォームフィールド"
COM_FABRIK_FORM_NOT_PUBLISHED="申し訳ありませんがこのフォームは公開されていない"
COM_FABRIK_FORM_SAVED="保存されたフォーム"
COM_FABRIK_GO="移動"
COM_FABRIK_GREATER_THAN="より大きい"
COM_FABRIK_GROUP_BY="グループで"
COM_FABRIK_IMPORT_CSV="インポートCSV"
COM_FABRIK_IMPORT_CSV_FILE="インポートCSVファイル"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="いいえファイルが選択されていません"
COM_FABRIK_IMPORT_FROM_CSV="CSVのインポート"
COM_FABRIK_INCLUDE_CALCULATIONS="計算を含める"
COM_FABRIK_INCLUDE_DATA="データを含める。"
COM_FABRIK_INCLUDE_FILTERS="フィルタを含める。"
COM_FABRIK_INCLUDE_RAW_DATA="生データを含める。"
COM_FABRIK_INCORRECT_LIST_ID="誤ったリストID"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="このフォームは、結合されたデータを使用していますが、その外部キー%sは、公開されていません。フォームを保存するときにこの問題が発生します。サイトの所有者に連絡してください"
COM_FABRIK_LABEL="ラベル"
COM_FABRIK_LESS_THAN="より小さい"
COM_FABRIK_LINKED_FORM_ADD="追加"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="設定されていないテーブルのidは出力することができません"
COM_FABRIK_LIST_NO_DATA_MSG="いいえレコードがありません"
COM_FABRIK_LIST_NOT_PUBLISHED="申し訳ありませんが、この表が公開されていない"
COM_FABRIK_LOADING="読み込み中"
COM_FABRIK_LOADING_FROM_COOKIE="クッキーからのロード"
COM_FABRIK_LOADING_FROM_DATABASE="データベースからのロード"
COM_FABRIK_MEDIAN="中央値"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="テーブルの主キーを選択していることを確認してください、そうしないとこの結合処理ができません。"
COM_FABRIK_NEXT=">"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="不十分なアクセス権限です。ログインを済ませてください。"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="このテーブルのキーが見つかりません"
COM_FABRIK_NO_RECORDS="情報はありません"
COM_FABRIK_NO_REPEAT_GROUP_DATA="データなし"
COM_FABRIK_NONE="なし"
COM_FABRIK_NONE_OF_THESE_TERMS="これらの用語なし"
COM_FABRIK_NOT_EQUALS="等しくない"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="残念ですが、あなたはこのデータ入力をすることを承認されていません。"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="残念ですが、あなたはこのデータ編集をすることを承認されていません"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf
のライブラリファイルが見つかりません"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="全文検索と照合する箇所はありません"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="その語句は短すぎですからもう少し長いフレーズで検索してみてください。"
COM_FABRIK_OR="または"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="一致する​​レコードを上書きします。"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="選択してください"
COM_FABRIK_PLEASE_SELECT_A_ROW="行を選択してください"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="必要なすべてのフィルタを選択してください"
COM_FABRIK_PREV="<"
COM_FABRIK_PREVIOUS="最初"
COM_FABRIK_PRINT="印刷"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="クエリーのプレフィルターはセットされていますが、値/クエリーが与えられていません"
COM_FABRIK_RECORDS="記録"
COM_FABRIK_RECORDS_DELETED="レコードは削除されました"
COM_FABRIK_RECORD_ADDED_UPDATED="レコードを追加/更新"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="保存"
COM_FABRIK_SAVING_TO="に保存"
COM_FABRIK_SEARCH="検索"
COM_FABRIK_SELECT="選択"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="少なくとも一つのフィルタを選択してください"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="エクスポートする列を選択します。"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="削除のためのいくつかの行を選択します。"
COM_FABRIK_SEND_EMAIL="電子メールを送ってください"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="この可視化ページは未公開です。"
COM_FABRIK_START="開始"
COM_FABRIK_SUBSCRIBE_RSS="RSSを登録"
COM_FABRIK_SUCCESS="成功"
COM_FABRIK_SUM="合計"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="あなたは、Fabrikのシステムプラグインをインストールし、それを公開していることを確認してください"
COM_FABRIK_TEXT_DELIMITER="テキスト区切り文字"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="このアイテムを送信しました"
COM_FABRIK_TOGGLE="トグル"
; COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="検証"
COM_FABRIK_VALIDATION_ERROR="検証エラー"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="表示"
COM_FABRIK_VIEW_ALL="全て表示"
COM_FABRIK_WHERE="どこに"
COM_FABRIK_YOUR_EMAIL="メールアドレス"
COM_FABRIK_YOUR_FRIENDS_EMAIL="お友達のメールアドレス"
COM_FABRIK_YOUR_NAME="お名前"
COM_FABRIK_MESSAGE_SUBJECT="件名"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/lt-LT/lt-LT.com_fabrik.ini000064400000025213151165346240013025
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Pridėti"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Pridėti naują parinktį
esantiems aukščiau"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Išplėstinė paieška"
COM_FABRIK_ALL="visi"
COM_FABRIK_ALL_OF_THESE_TERMS="Visos sąlygos"
COM_FABRIK_AND="ir"
COM_FABRIK_ANY_OF_THESE_TERMS="Bet kuri sąlyga"
COM_FABRIK_APPLY="Pritaikyti"
COM_FABRIK_AVERAGE="Vidurkis"
COM_FABRIK_BEGINS_WITH="PRASIDEDA"
COM_FABRIK_BETWEEN="Tarp"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Naršyti aplankus"
COM_FABRIK_CANCEL="Atšaukti"
COM_FABRIK_CLEAR="Išvalyti"
COM_FABRIK_CLOSE_WINDOW="Uždaryti langą"
COM_FABRIK_CONDITION="Sąlyga"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Ar tikrai norite pašalinti šiuos
įrašus?"
COM_FABRIK_CONFIRM_DROP="Ar tikrai norite pašalinti visus įrašus ir
grąžinti lentelės indekso reikšmę į 0?"
COM_FABRIK_CONTAINS="SUDĖTYJE YRA"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Skaičiuoti"
COM_FABRIK_CSV_ADDED_AND_UPDATED="Pridėti %s CSV įrašai (-ų),
atnaujinti %s įrašai (-ų)"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="Pridėti %s nauji
elementai (-ų), pridėti %s CSV įrašai (-ų), atnaujinti %s įrašai
(-ų)"
COM_FABRIK_CSV_COMPLETE="CSV sukurtas"
COM_FABRIK_CSV_DOWNLOADING="CSV failas siunčiamas"
COM_FABRIK_CSV_DOWNLOAD_HERE="atsisiųsti iš čia"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Nėra eksportuoti į CSV galimų
įrašų"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Atsiprašome, šie CSV failo
laukai buvo nerasti šioje lentelėje:"
COM_FABRIK_CSV_FILE="CSV failas"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="ir"
COM_FABRIK_DATE_RANGE_BETWEEN="Tarp"
COM_FABRIK_DELETE="Šalinti"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Rodyti Nr. "
COM_FABRIK_DROP_EXISTING_DATA="Pašalinti turimus duomenis"
COM_FABRIK_EDIT="Redaguoti"
COM_FABRIK_ELEMENT="Elementas"
COM_FABRIK_EMAIL_MSG="Iš interneto svetainės
"_QQ_"%s"_QQ_" %s (% s) Jums atsiuntė puslapį. Jį
peržvelgti galite čia: %s"
COM_FABRIK_EMPTY="Tuščias"
COM_FABRIK_END="Pabaiga"
COM_FABRIK_ENDS_WITH="BAIGIASI"
COM_FABRIK_EQUALS="LYGUS"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Deja, administratoriaus
šablonas skirtas naudoti tik „Joomla“ administravimo tinklalapiuose.
Pasirinkite kitą šabloną."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Neįdiegta „Curl“ biblioteka,
todėl kai kurių šio tinklalapio dalių įvykdyti nepavyko."
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Įdiegimo negalima tęsti, kol
neįgalinti failų įkėlimai. Prašom pasinaudoti įdiegimo iš aplanko
metodu."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Tiksli frazė"
COM_FABRIK_EXPORT="Eksportuoti"
COM_FABRIK_EXPORT_TO_CSV="Eksportuoti į CSV"
COM_FABRIK_FAILED_VALIDATION="Nepavyko patikrinti"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV failas"
COM_FABRIK_FIELD_CSV_FILE_DESC="Pasirinkite įkeltiną CSV
failą"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Išvalyti duomenis"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Išvalyti iš sąrašo
esamus duomenis prieš importuojant duomenis iš CSV failo"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Laukų
skirtukas"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Simbolis, naudojamas
CSV faile skirtingų laukų reikšmėms atskirti"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formatas"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Nurodykite, kuria programa
CSV failas eksportuotas (tai būtina teisingai koduotei parinkti)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Perrašyti"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Perrašyti visus
sutampančius įrašus jų atitikmenimis iš CSV failo"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="skyriklis –
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Pažymėjus, įvestas
skirtuko simbolis bus ignoruojamas; vietoje jo bus naudojamas tabuliacijos
simbolis"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Teksto
skirtukas"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Simbolis, naudojamas
CSV faile tekstinių laukų reikšmėms apskliausti"
COM_FABRIK_FIELD_DELIMITER="Laukų skyriklis"
COM_FABRIK_FILE_TYPE="Failo tipas"
COM_FABRIK_FILTER="Filtras"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Filtras %s buvo sutrumpintas dėl
jo ilgio. Prašome susisiekti su svetainės administratoriumi"
COM_FABRIK_FILTER_PLEASE_SELECT="Visi"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filtrai išvalyti"
COM_FABRIK_FORM="Forma"
COM_FABRIK_FORM_FIELDS="Formos laukai"
COM_FABRIK_FORM_NOT_PUBLISHED="Atsiprašome, ši forma nėra
paskelbta"
COM_FABRIK_FORM_SAVED="Forma išsaugota"
COM_FABRIK_GO="Ieškoti"
COM_FABRIK_GREATER_THAN="DIDESNIS NEI"
COM_FABRIK_GROUP_BY="Grupuoti pagal"
COM_FABRIK_IMPORT_CSV="Importuoti CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importuoti CSV failą"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nepasirinkote failo"
COM_FABRIK_IMPORT_FROM_CSV="Importuoti iš CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Įtraukti skaičiavimus"
COM_FABRIK_INCLUDE_DATA="Įtraukti duomenis:"
COM_FABRIK_INCLUDE_FILTERS="Įtraukti filtrus:"
COM_FABRIK_INCLUDE_RAW_DATA="Įtraukti duomenis:"
COM_FABRIK_INCORRECT_LIST_ID="Sąrašas su nurodytu id nerastas"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Ši forma naudoja
sujungtus duomenis, bet išorinis raktas %s nėra paskelbtas. Tai sukels
problemų įrašant formą. Prašome susisiekti su svetainės
savininku."
COM_FABRIK_LABEL="antraštė"
COM_FABRIK_LESS_THAN="MAŽESNIS NEI"
COM_FABRIK_LINKED_FORM_ADD="Pridėti"
COM_FABRIK_LIST_SHORTCUTS_ADD="p"
COM_FABRIK_LIST_SHORTCUTS_EDIT="r"
COM_FABRIK_LIST_SHORTCUTS_DELETE="š"
COM_FABRIK_LIST_SHORTCUTS_FILTER="t"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Nenurodytas sąrašo id –
negalime rodyti"
COM_FABRIK_LIST_NO_DATA_MSG="Įrašų nėra"
COM_FABRIK_LIST_NOT_PUBLISHED="Atsiprašome, šis sąrašas nėra
paskelbtas"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Įkeliama iš slapuko"
COM_FABRIK_LOADING_FROM_DATABASE="Įkeliama iš duomenų bazės"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Prašome įsitikinti, kad
pasirinkote pirminį raktą lentelei, iki tol Fabrik negali įvykdyti šio
sujungimo"
COM_FABRIK_NEXT="Kitas"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Nepakankamos prieigos teisės.
Prašom prisijungti"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="šiam sąrašui nerastas
raktas"
COM_FABRIK_NO_RECORDS="Nėra įrašų"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Nėra įrašų"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Nėra duomenų"
COM_FABRIK_NONE="Nieko"
COM_FABRIK_NONE_OF_THESE_TERMS="Nė viena iš šių sąlygų"
COM_FABRIK_NOT_EQUALS="NĖRA LYGUS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Nerasta „Dompdf“
biblioteka"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Įvesta paieškos frazė
per trumpa paieškai sąraše. Prašom įvesti ilgesnę frazę"
COM_FABRIK_OR="arba"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Perrašyti vienodus
įrašus"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Prašome pasirinkti"
COM_FABRIK_PLEASE_SELECT_A_ROW="Prašome pasirinkti eilutę"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Prašome pasirinkti
visus reikiamus filtrus"
COM_FABRIK_PREV="Ankstesnis"
COM_FABRIK_PREVIOUS="Ankstesnis"
COM_FABRIK_PRINT="spausdinti"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Nurodytas užklausos
išankstinis filtras, tačiau nepateikta reikšmė arba užklausa"
COM_FABRIK_RECORDS="įrašai"
COM_FABRIK_RECORDS_DELETED="Įrašai ištrinti"
COM_FABRIK_RECORD_ADDED_UPDATED="Įrašas pridėtas/atnaujintas"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Atrodo Jūs jau pradėjote
pildyti šią formą. Pradedate nuo paskutinio puslapio kurį aplankėte.
Jei norite pildyti iš naujo, paspauskite mygtuką
"_QQ_"Valyti"_QQ_""
COM_FABRIK_SAVE="Išsaugoti"
COM_FABRIK_SAVING_TO="įrašoma į"
COM_FABRIK_SEARCH="Paieška"
COM_FABRIK_SELECT="Parinkti"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Prašome pasirinkti bent vieną
filtrą"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Pasirinkite stulpelius
eksportavimui"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Pasirinkite kelias eilutes
pašalinimui"
COM_FABRIK_SEND_EMAIL="Siųsti el. laišką"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Atsiprašome, ši
vizualizacija yra nepaskelbta"
COM_FABRIK_START="Pradžia"
COM_FABRIK_SUBSCRIBE_RSS="Prenumeruoti RSS"
COM_FABRIK_SUCCESS="Pavyko"
COM_FABRIK_SUM="Suma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Prašom įsitikinti, jog yra
įdiegtas ir įgalintas „Fabrik“ sistemos įskiepis"
COM_FABRIK_TEXT_DELIMITER="Teksto skirtukas"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Šis įrašas buvo išsiųstas
į"
COM_FABRIK_TOGGLE="Įjungti / išjungti"
COM_FABRIK_TOTAL="Iš viso"
COM_FABRIK_VALIDATING="Tikrinama"
COM_FABRIK_VALIDATION_ERROR="Tikrinimo klaida"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Peržiūrėti"
COM_FABRIK_VIEW_ALL="Peržiūrėti visus"
COM_FABRIK_WHERE="Kur"
COM_FABRIK_YOUR_EMAIL="Jūsų el. pašto adresas"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Jūsų draugo el. pašto adresas"
COM_FABRIK_YOUR_NAME="Jūsų vardas"
COM_FABRIK_MESSAGE_SUBJECT="Žinutės tema"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/lt-LT/lt-LT.com_fabrik.sys.ini000064400000025043151165346240013643
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Pridėti"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Pridėti naują parinktį
esantiems aukščiau"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Išplėstinė paieška"
COM_FABRIK_ALL="visi"
COM_FABRIK_ALL_OF_THESE_TERMS="Visos sąlygos"
COM_FABRIK_AND="ir"
COM_FABRIK_ANY_OF_THESE_TERMS="Bet kuri sąlyga"
COM_FABRIK_APPLY="Pritaikyti"
COM_FABRIK_AVERAGE="Vidurkis"
COM_FABRIK_BEGINS_WITH="PRASIDEDA"
COM_FABRIK_BETWEEN="Tarp"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Naršyti aplankus"
COM_FABRIK_CANCEL="Atšaukti"
COM_FABRIK_CLEAR="Išvalyti"
COM_FABRIK_CLOSE_WINDOW="Uždaryti langą"
COM_FABRIK_CONDITION="Sąlyga"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Ar tikrai norite pašalinti šiuos
įrašus?"
COM_FABRIK_CONFIRM_DROP="Ar tikrai norite pašalinti visus įrašus ir
grąžinti lentelės indekso reikšmę į 0?"
COM_FABRIK_CONTAINS="SUDĖTYJE YRA"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Skaičiuoti"
COM_FABRIK_CSV_ADDED_AND_UPDATED="Pridėti %s CSV įrašai (-ų),
atnaujinti %s įrašai (-ų)"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="Pridėti %s nauji
elementai (-ų), pridėti %s CSV įrašai (-ų), atnaujinti %s įrašai
(-ų)"
COM_FABRIK_CSV_COMPLETE="CSV sukurtas"
COM_FABRIK_CSV_DOWNLOADING="CSV failas siunčiamas"
COM_FABRIK_CSV_DOWNLOAD_HERE="atsisiųsti iš čia"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Nėra eksportuoti į CSV galimų
įrašų"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Atsiprašome, šie CSV failo
laukai buvo nerasti šioje lentelėje:"
COM_FABRIK_CSV_FILE="CSV failas"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="ir"
COM_FABRIK_DATE_RANGE_BETWEEN="Tarp"
COM_FABRIK_DELETE="Šalinti"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Rodyti Nr. "
COM_FABRIK_DROP_EXISTING_DATA="Pašalinti turimus duomenis"
COM_FABRIK_EDIT="Redaguoti"
COM_FABRIK_ELEMENT="Elementas"
COM_FABRIK_EMAIL_MSG="Iš interneto svetainės
"_QQ_"%s"_QQ_" %s (% s) Jums atsiuntė puslapį. Jį
peržvelgti galite čia: %s"
COM_FABRIK_EMPTY="Tuščias"
COM_FABRIK_END="Pabaiga"
COM_FABRIK_ENDS_WITH="BAIGIASI"
COM_FABRIK_EQUALS="LYGUS"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Deja, administratoriaus
šablonas skirtas naudoti tik „Joomla“ administravimo tinklalapiuose.
Pasirinkite kitą šabloną."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Neįdiegta „Curl“ biblioteka,
todėl kai kurių šio tinklalapio dalių įvykdyti nepavyko."
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Įdiegimo negalima tęsti, kol
neįgalinti failų įkėlimai. Prašom pasinaudoti įdiegimo iš aplanko
metodu."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Tiksli frazė"
COM_FABRIK_EXPORT="Eksportuoti"
COM_FABRIK_EXPORT_TO_CSV="Eksportuoti į CSV"
COM_FABRIK_FAILED_VALIDATION="Nepavyko patikrinti"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV failas"
COM_FABRIK_FIELD_CSV_FILE_DESC="Pasirinkite įkeltiną CSV
failą"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Išvalyti duomenis"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Išvalyti iš sąrašo
esamus duomenis prieš importuojant duomenis iš CSV failo"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Laukų
skirtukas"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Simbolis, naudojamas
CSV faile skirtingų laukų reikšmėms atskirti"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formatas"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Nurodykite, kuria programa
CSV failas eksportuotas (tai būtina teisingai koduotei parinkti)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Perrašyti"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Perrašyti visus
sutampančius įrašus jų atitikmenimis iš CSV failo"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="skyriklis –
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Pažymėjus, įvestas
skirtuko simbolis bus ignoruojamas; vietoje jo bus naudojamas tabuliacijos
simbolis"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Teksto
skirtukas"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Simbolis, naudojamas
CSV faile tekstinių laukų reikšmėms apskliausti"
COM_FABRIK_FIELD_DELIMITER="Laukų skyriklis"
COM_FABRIK_FILE_TYPE="Failo tipas"
COM_FABRIK_FILTER="Filtras"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Filtras %s buvo sutrumpintas dėl
jo ilgio. Prašome susisiekti su svetainės administratoriumi"
COM_FABRIK_FILTER_PLEASE_SELECT="Visi"
COM_FABRIK_FILTERS_CLEARED="Filtrai išvalyti"
COM_FABRIK_FORM="Forma"
COM_FABRIK_FORM_FIELDS="Formos laukai"
COM_FABRIK_FORM_NOT_PUBLISHED="Atsiprašome, ši forma nėra
paskelbta"
COM_FABRIK_FORM_SAVED="Forma išsaugota"
COM_FABRIK_GO="Ieškoti"
COM_FABRIK_GREATER_THAN="DIDESNIS NEI"
COM_FABRIK_GROUP_BY="Grupuoti pagal"
COM_FABRIK_IMPORT_CSV="Importuoti CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importuoti CSV failą"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nepasirinkote failo"
COM_FABRIK_IMPORT_FROM_CSV="Importuoti iš CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Įtraukti skaičiavimus"
COM_FABRIK_INCLUDE_DATA="Įtraukti duomenis:"
COM_FABRIK_INCLUDE_FILTERS="Įtraukti filtrus:"
COM_FABRIK_INCLUDE_RAW_DATA="Įtraukti duomenis:"
COM_FABRIK_INCORRECT_LIST_ID="Sąrašas su nurodytu id nerastas"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Ši forma naudoja
sujungtus duomenis, bet išorinis raktas %s nėra paskelbtas. Tai sukels
problemų įrašant formą. Prašome susisiekti su svetainės
savininku."
COM_FABRIK_LABEL="antraštė"
COM_FABRIK_LESS_THAN="MAŽESNIS NEI"
COM_FABRIK_LINKED_FORM_ADD="Pridėti"
COM_FABRIK_LIST_SHORTCUTS_ADD="p"
COM_FABRIK_LIST_SHORTCUTS_EDIT="r"
COM_FABRIK_LIST_SHORTCUTS_DELETE="š"
COM_FABRIK_LIST_SHORTCUTS_FILTER="t"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Nenurodytas sąrašo id –
negalime rodyti"
COM_FABRIK_LIST_NO_DATA_MSG="Įrašų nėra"
COM_FABRIK_LIST_NOT_PUBLISHED="Atsiprašome, šis sąrašas nėra
paskelbtas"
COM_FABRIK_LOADING="Įkeliama..."
COM_FABRIK_LOADING_FROM_COOKIE="Įkeliama iš slapuko"
COM_FABRIK_LOADING_FROM_DATABASE="Įkeliama iš duomenų bazės"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Prašome įsitikinti, kad
pasirinkote pirminį raktą lentelei, iki tol Fabrik negali įvykdyti šio
sujungimo"
COM_FABRIK_NEXT="Kitas"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Nepakankamos prieigos teisės.
Prašom prisijungti"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="šiam sąrašui nerastas
raktas"
COM_FABRIK_NO_RECORDS="Nėra įrašų"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Nėra duomenų"
COM_FABRIK_NONE="Nieko"
COM_FABRIK_NONE_OF_THESE_TERMS="Nė viena iš šių sąlygų"
COM_FABRIK_NOT_EQUALS="NĖRA LYGUS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Nerasta „Dompdf“
biblioteka"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Įvesta paieškos frazė
per trumpa paieškai sąraše. Prašom įvesti ilgesnę frazę"
COM_FABRIK_OR="arba"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Perrašyti vienodus
įrašus"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Prašome pasirinkti"
COM_FABRIK_PLEASE_SELECT_A_ROW="Prašome pasirinkti eilutę"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Prašome pasirinkti
visus reikiamus filtrus"
COM_FABRIK_PREV="Ankstesnis"
COM_FABRIK_PREVIOUS="Ankstesnis"
COM_FABRIK_PRINT="spausdinti"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Nurodytas užklausos
išankstinis filtras, tačiau nepateikta reikšmė arba užklausa"
COM_FABRIK_RECORDS="įrašai"
COM_FABRIK_RECORDS_DELETED="Įrašai ištrinti"
COM_FABRIK_RECORD_ADDED_UPDATED="Įrašas pridėtas/atnaujintas"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Išsaugoti"
COM_FABRIK_SAVING_TO="įrašoma į"
COM_FABRIK_SEARCH="Paieška"
COM_FABRIK_SELECT="Parinkti"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Prašome pasirinkti bent vieną
filtrą"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Pasirinkite stulpelius
eksportavimui"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Pasirinkite kelias eilutes
pašalinimui"
COM_FABRIK_SEND_EMAIL="Siųsti el. laišką"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Atsiprašome, ši
vizualizacija yra nepaskelbta"
COM_FABRIK_START="Pradžia"
COM_FABRIK_SUBSCRIBE_RSS="Prenumeruoti RSS"
COM_FABRIK_SUCCESS="Pavyko"
COM_FABRIK_SUM="Suma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Prašom įsitikinti, jog yra
įdiegtas ir įgalintas „Fabrik“ sistemos įskiepis"
COM_FABRIK_TEXT_DELIMITER="Teksto skirtukas"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Šis įrašas buvo išsiųstas
į"
COM_FABRIK_TOGGLE="Įjungti / išjungti"
COM_FABRIK_TOTAL="Iš viso"
COM_FABRIK_VALIDATING="Tikrinama"
COM_FABRIK_VALIDATION_ERROR="Tikrinimo klaida"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Peržiūrėti"
COM_FABRIK_VIEW_ALL="Peržiūrėti visus"
COM_FABRIK_WHERE="Kur"
COM_FABRIK_YOUR_EMAIL="Jūsų el. pašto adresas"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Jūsų draugo el. pašto adresas"
COM_FABRIK_YOUR_NAME="Jūsų vardas"
COM_FABRIK_MESSAGE_SUBJECT="Žinutės tema"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/ms-MY/ms-MY.com_fabrik.ini000064400000024450151165346240013043
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Tambah"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="Padam"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Ubah"
COM_FABRIK_ELEMENT="Elemen"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Tambah"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Lihat"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/ms-MY/ms-MY.com_fabrik.sys.ini000064400000024303151165346240013655
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Tambah"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="Padam"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Ubah"
COM_FABRIK_ELEMENT="Elemen"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Tambah"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Lihat"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/my-MM/my-MM.com_fabrik.ini000064400000024560151165346250013032
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="ထည့်"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="ပယ်ဖျက်"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="တည်းဖြတ်"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="ထည့်"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="ကြည့်ရှု"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/my-MM/my-MM.com_fabrik.sys.ini000064400000024413151165346250013644
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="ထည့်"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="ပယ်ဖျက်"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="တည်းဖြတ်"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="ထည့်"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="ကြည့်ရှု"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/nl-NL/nl-NL.com_fabrik.ini000064400000025152151165346250013000
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="toevoegen"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="nieuwe optie toevoegen aan
bovenstaande"
COM_FABRIK_ADD_GROUP="Add&nbsp;groep"
COM_FABRIK_ADVANCED_SEARCH="geavanceerd zoeken"
COM_FABRIK_ALL="alles"
COM_FABRIK_ALL_OF_THESE_TERMS="op alle begrippen"
COM_FABRIK_AND="en"
COM_FABRIK_ANY_OF_THESE_TERMS="op één van deze begrippen"
COM_FABRIK_APPLY="toepassen"
COM_FABRIK_AVERAGE="gemiddeld"
COM_FABRIK_BEGINS_WITH="begint met"
COM_FABRIK_BETWEEN="tussen"
COM_FABRIK_BIRTHDAY_TODAY="Is verjaardag"
COM_FABRIK_BROWSE_FOLDERS="Browse folders"
COM_FABRIK_CANCEL="Annuleren"
COM_FABRIK_CLEAR="filters verwijderen"
COM_FABRIK_CLOSE_WINDOW="Sluiten"
COM_FABRIK_CONDITION="voorwaarde"
COM_FABRIK_CONFIRM_DELETE_1="Weet u zeker dat u dit record wil
verwijderen?"
COM_FABRIK_CONFIRM_DELETE="Weet u zeker dat u %s records wilt
verwijderen?"
COM_FABRIK_CONFIRM_DROP="Wilt u echt alle gegevens verwijderen en de
key's op 0 zetten?"
COM_FABRIK_CONTAINS="bevat"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Dit record kunnen we
niet terugvinden"
COM_FABRIK_COUNT="Aantal"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records tegevoegd en %s
records gewijzigd"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nieuwe velden
toegevoegd, %s CSV records toegevoegd en %s records gewijzigd"
COM_FABRIK_CSV_COMPLETE="CSV export voltooid"
COM_FABRIK_CSV_DOWNLOADING="CSV wordt gedownload"
COM_FABRIK_CSV_DOWNLOAD_HERE="klik hier om te downloaden"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Geen gegevens beschikbaar om te
exporteren"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry, de volgende velden in het
CSV-bestand zijn niet gevonden:"
COM_FABRIK_CSV_FILE="CSV bestand"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel <small>(bewaard met
Excel)</small>"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel
<small>(geëxporteerd door Fabrik of bewaard met Excel met de optie
'File type= unicode text')</small>"
COM_FABRIK_DATE_RANGE_AND="en"
COM_FABRIK_DATE_RANGE_BETWEEN="tussen"
COM_FABRIK_DELETE="verwijderen"
COM_FABRIK_DELETE_GROUP="Delete&nbsp;groep"
COM_FABRIK_DISPLAY_NUM="aantal "
COM_FABRIK_DROP_EXISTING_DATA="Verwijder alle bestaande gegevens"
COM_FABRIK_EDIT="wijzig"
COM_FABRIK_ELEMENT="element"
COM_FABRIK_EMAIL_MSG="Onderstaande pagina van de website
"_QQ_"%s"_QQ_" werd u toegestuurd door %s (%s).\n\nKlik
hiervoor op:\n %s"
COM_FABRIK_EMPTY="leeg"
COM_FABRIK_END="einde"
COM_FABRIK_ENDS_WITH="eindigt op"
COM_FABRIK_EQUALS="is gelijk aan"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Fout: de template
'admin' kan alleen gebruikt worden in de back-end.  Selecteer een
andere template."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="De Curl library is niet
geïnstalleerd Niet alles op deze pagina kon worden geladen."
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="De
tabs template is niet compatibel met met een formulier van meerdere
pagina's. Gebruik ofwel een bootstrap template of zorg dat de
'page break' optie van alle groepen af staat."
COM_FABRIK_ERR_UPLOADS_DISABLED="Installatie kan niet doorgaan zolang
het uploaden van bestanden niet mogelijk is. U dient de installatie te
herstarten met de methode 'Installeer van directory'."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="Voor een niet gepublideerd
elements is een prefilter geactiveerd, deze wordt niet toegepast: %s"
COM_FABRIK_EXACT_TERMS="exacte woorden"
COM_FABRIK_EXPORT="exporteer"
COM_FABRIK_EXPORT_TO_CSV="exporteer naar CSV"
COM_FABRIK_FAILED_VALIDATION="Validatie is mislukt"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV bestand"
COM_FABRIK_FIELD_CSV_FILE_DESC="Selecteer een CSV bestand om te
uploaden"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Verwijder alle
gegevens"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Bestaande gegevens worden
verwijderd voor het importeren van het CSV bestand"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Veldscheidingsteken"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Het scheidingsteken
in het CSV bestand om de verschillende velden van elkaar te scheiden"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formaat"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Welk programma exporteerde
het CSV bestand (dit is van belang voor het gebruik van de correcte
codering)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overschrijf"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overschrijft alle
overeenkomstige records met de CSV gegevens"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="Gebruik een tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Vink hier aan om het
veld hierboven niet te gebruiken, maar een tab als
veldscheidingsteken."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Tekstscheidingsteken"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="De te gebruiken
aanhalingstekens, die het begin en het einde aanduiden van elk veld."
COM_FABRIK_FIELD_DELIMITER="Veldscheidingsteken"
COM_FABRIK_FILE_TYPE="Bestandstype"
COM_FABRIK_FILTER="Filter"
COM_FABRIK_FILTER_LIST_MAX_REACHED="De filter %s opties zijn afgekapt
en niet allemaal weerhouden. Er het aantal records is groter dan de globale
Fabrik optie 'Filter List Max'."
COM_FABRIK_FILTER_PLEASE_SELECT="alle"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Alle filters zijn verwijderd"
COM_FABRIK_FORM="Formulier"
COM_FABRIK_FORM_FIELDS="Formulier velden"
COM_FABRIK_FORM_NOT_PUBLISHED="Dit formulier is niet
gepubliceerd."
COM_FABRIK_FORM_SAVED="Formulier is bewaard"
COM_FABRIK_GO="Doen"
COM_FABRIK_GREATER_THAN="groter dan"
COM_FABRIK_GROUP_BY="groepeer op"
COM_FABRIK_IMPORT_CSV="Importeer CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importeer CSV bestand"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Geen bestand
geselecteerd"
COM_FABRIK_IMPORT_FROM_CSV="Importeer van CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Toe te voegen berekeningen:"
COM_FABRIK_INCLUDE_DATA="Toe te voegen gegevens:"
COM_FABRIK_INCLUDE_FILTERS="Toe te voegen filters:"
COM_FABRIK_INCLUDE_RAW_DATA="Toe te voegen onbewerkte gegevens:"
COM_FABRIK_INCORRECT_LIST_ID="De lijst id is niet geldig."
COM_FABRIK_IS_EMPTY="Is leeg"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Dit formulier gebruikt
'joins', maar de 'foreign key' %s, is niet
gepubliceerd. Hierdoor ontstaan problemen bij het opslaan van het
formulier. Neem contact op met de webmaster van deze site."
COM_FABRIK_LABEL="Label"
COM_FABRIK_LESS_THAN="kleiner dan"
COM_FABRIK_LINKED_FORM_ADD="toevoegen"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Lijst"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Er is geen lijst id
opgegeven."
COM_FABRIK_LIST_NO_DATA_MSG="Geen gegevens beschikbaar"
COM_FABRIK_LIST_NOT_PUBLISHED="Deze lijst is niet gepubliceerd."
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="laden met behulp van een  cookie"
COM_FABRIK_LOADING_FROM_DATABASE="laden vanuit een database"
COM_FABRIK_MEDIAN="mediaan"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Verzeker u dat u een primairy key
voor deze tabel geselecteerd hebt, anders kan Fabrik deze join niet
verwerken."
COM_FABRIK_NEXT="volgende"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Onvoldoende toegangsrechten.
Opnieuw aanmelden a.u.b."
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Geen overeenkomstig element
%s gevonden"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="geen key gevonden voor deze
tabel"
COM_FABRIK_NO_RECORDS="geen records gevonden"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="geen records gevonden"
COM_FABRIK_NO_REPEAT_GROUP_DATA="geen gegevens"
COM_FABRIK_NONE="geen"
COM_FABRIK_NONE_OF_THESE_TERMS="geen van deze begrippen"
COM_FABRIK_NOT_EQUALS="is niet gelijk aan"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="U bent niet geautoriseerd om dit
gegeven toe te voegen"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="U bent niet geautoriseerd om dit
gegeven aan te passen"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="geen velden aangegeven
voor deze zoek actie"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="uw zoek argument is te
kort, probeer een langer zoek argument"
COM_FABRIK_OR="of"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="overschrijf de overeenkomende
records"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="selecteer"
COM_FABRIK_PLEASE_SELECT_A_ROW="selecteer een rij"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="selecteer de gewenste
filters"
COM_FABRIK_PREV="vorige"
COM_FABRIK_PREVIOUS="vorige"
COM_FABRIK_PRINT="print"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Er is een query prefilter
gedefinieerd, maar er zijn geen waardes opgenomen"
COM_FABRIK_RECORDS="records"
COM_FABRIK_RECORDS_DELETED="records verwijderd"
COM_FABRIK_RECORD_ADDED_UPDATED="record toegevoegd/aangepast"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="U hebt al velden ingevuld voor
dit formulier. U begint bij de laastst bezochte pagina. Druk op de
'herstel' knop als u opnieuw wilt beginnen."
COM_FABRIK_SAVE="opslaan"
COM_FABRIK_SAVING_TO="opslaan als"
COM_FABRIK_SEARCH="zoek"
COM_FABRIK_SELECT="selecteer"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="selecteer tenminste één
filter"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="selecteer kollommen om te
exporteren"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="selecteer rij(en) om te
verwijderen"
COM_FABRIK_SEND_EMAIL="stuur email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry, deze
visualisatie is niet gepubliceerd"
COM_FABRIK_START="begin"
COM_FABRIK_SUBSCRIBE_RSS="abonneer op RSS"
COM_FABRIK_SUCCESS="geslaagd"
COM_FABRIK_SUM="som"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Zorg dat je de de Fabrik system
plugin geinstalleerd en gepubliceerd hebt"
COM_FABRIK_TEXT_DELIMITER="tekst delimiter"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="dit item is gestuurd naar"
COM_FABRIK_TOGGLE="toggle"
COM_FABRIK_TOTAL="totaal"
COM_FABRIK_VALIDATING="gegevens controleren"
COM_FABRIK_VALIDATION_ERROR="validatie fout"
COM_FABRIK_VALUE="Waarde"
COM_FABRIK_VIEW="zie"
COM_FABRIK_VIEW_ALL="alles zien"
COM_FABRIK_WHERE="als"
COM_FABRIK_YOUR_EMAIL="uw email adres"
COM_FABRIK_YOUR_FRIENDS_EMAIL="het email adres van uw vriend"
COM_FABRIK_YOUR_NAME="uw naam"
COM_FABRIK_MESSAGE_SUBJECT="onderwerp"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="foute suboptie gekozen voor
element '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Start"
COM_FABRIK_VALIDATION="Validatie"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Er is een fout opgetreden in het
veld Eval - Gelieve contact op te nemen met de eigenaar van de
website."
COM_FABRIK_LIST_TABS_ALL="alle"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="opslaan"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="toepassen"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Terug"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Verwijder"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/pl-PL/pl-PL.com_fabrik.ini000064400000025213151165346250013006
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Dodaj"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Dodaj kolejną
opcję"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Zaawanasowane wyszukiwanie"
COM_FABRIK_ALL="wszystkie"
COM_FABRIK_ALL_OF_THESE_TERMS="Wszystkie z tych warunków"
COM_FABRIK_AND="i"
COM_FABRIK_ANY_OF_THESE_TERMS="Którekolwiek z tych warunków"
COM_FABRIK_APPLY="Zatwierdź"
COM_FABRIK_AVERAGE="Średnio"
COM_FABRIK_BEGINS_WITH="ZACZYNA SIĘ "
COM_FABRIK_BETWEEN="pomiędzy"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Przeglądaj foldery"
COM_FABRIK_CANCEL="Anuluj"
COM_FABRIK_CLEAR="Wyczyść filtry"
COM_FABRIK_CLOSE_WINDOW="Zamknij"
COM_FABRIK_CONDITION="Warunek"
COM_FABRIK_CONFIRM_DELETE_1="Jesteś pewien że chcesz skasować ten
rekord?"
COM_FABRIK_CONFIRM_DELETE="Jesteś pewien że chcesz skasować rekordy
%s ?"
COM_FABRIK_CONFIRM_DROP="Naprawdę chcesz skasować wszystkie rekordy
i zresetować ten klucz tabeli do 0?"
COM_FABRIK_CONTAINS="ZAWIERA"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Liczność"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s rekordów z CSV dodanych i %s
rekordów uaktualnionych"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nowych
elementów dodanych, %s rekordów z CSV dodanych i %s rekordów
uaktualnionych"
COM_FABRIK_CSV_COMPLETE="Export z CSV zakończony"
COM_FABRIK_CSV_DOWNLOADING="pobieranie pliku CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Pobierz"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Brak dostępnych rekordów do
eksportu CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Przepraszam, następujące pola w
pliku CSV nie zostały znalezione w tej tabeli:"
COM_FABRIK_CSV_FILE="Plik CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="i"
COM_FABRIK_DATE_RANGE_BETWEEN="pomiędzy"
COM_FABRIK_DELETE="Usuń"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Wyświetl #"
COM_FABRIK_DROP_EXISTING_DATA="Skasuj istniejące dane"
COM_FABRIK_EDIT="Edytuj"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Następująca podstrona z adresu %s została
wysłana do ciebie przez %s ( %s).\n\nMożesz obejrzeć ją pod
następującym adresem URL:\n %s"
COM_FABRIK_EMPTY="Pusty"
COM_FABRIK_END="Koniec"
COM_FABRIK_ENDS_WITH="KOŃCZY SIĘ NA"
COM_FABRIK_EQUALS="ZAWIERA"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Przepraszam, szablon
administratora może być użyty tylko ze stronami panelu administratora
Joomla. Proszę wybrać inny szablon."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Biblioteka Curl nie jest
zainstalowana, niektóre elementy strony nie zostały przetworzone"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Instalator nie może kontynuować gdy
uploadowanie plików nie jest włączone. Proszę wybrać metodę
instalacji z katalogu."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="dokładne wyrażenie"
COM_FABRIK_EXPORT="Eksport"
COM_FABRIK_EXPORT_TO_CSV="Eksport do CSV"
COM_FABRIK_FAILED_VALIDATION="Validacja nieudana"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Plik CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Wybierz plik CSV do wgrania"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Wyczyść dane"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Istniejące dane zostaną
usunięte z listy przed importem danych CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Separator
pola"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Znak użyty w pliku
CSV do separacji komórek danych"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Która aplikacja
wyeksportowała plik CSV (potrzebne do określenia prawidłowego
kodowania)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Nadpisz"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Nadpisuje wszystkie
pasujące rekordy z danymi CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="lub separator
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Gdy zaznaczone
separator pól jest pomijany a zamiast niego przypisany jest znak
tabulatora"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Separator
tekstu"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Znak użyty w pliku
CSV do zastępowania wartości tekstu"
COM_FABRIK_FIELD_DELIMITER="Separator pola"
COM_FABRIK_FILE_TYPE="Typ pliku"
COM_FABRIK_FILTER="Filtr"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Opcje filtru %s zostały obcięte
gdyż zawierają więcej rekordów niż wartość "_QQ_"Max lista
filtru' w globalnych ustawieniach Fabrik."
COM_FABRIK_FILTER_PLEASE_SELECT="Wszystko"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filtry wyczyszczone"
COM_FABRIK_FORM="Formularz"
COM_FABRIK_FORM_FIELDS="Pola formularza"
COM_FABRIK_FORM_NOT_PUBLISHED="Przepraszam ten formularz nie jest
opublikowany"
COM_FABRIK_FORM_SAVED="Formularz zapisany"
COM_FABRIK_GO="Start"
COM_FABRIK_GREATER_THAN="WIĘKSZE NIŻ"
COM_FABRIK_GROUP_BY="Pogrupowane przez"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Import pliku CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nie wybrano pliku"
COM_FABRIK_IMPORT_FROM_CSV="Import z CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Zawiera kalkulacje"
COM_FABRIK_INCLUDE_DATA="Zawiera dane:"
COM_FABRIK_INCLUDE_FILTERS="Zawiera filtry:"
COM_FABRIK_INCLUDE_RAW_DATA="Zawiera dane raw:"
COM_FABRIK_INCORRECT_LIST_ID="Nieprawidłowy id listy"
COM_FABRIK_IS_EMPTY="JEST PUSTE"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Ten formularz używa
połączonych danych, ale jego klucz obcy %s nie jest opublikowany. To
wywoła nieprawidłowości przy zapisie formularza. Skontaktuj się z
właścicielem strony w sprawie usunięcia nieprawidłowości."
COM_FABRIK_LABEL="Etykieta"
COM_FABRIK_LESS_THAN="MNIEJ NIŻ"
COM_FABRIK_LINKED_FORM_ADD="Dodaj"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Lista"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id listy nie ustawione - nie
można wygenerować"
COM_FABRIK_LIST_NO_DATA_MSG="Brak rekordów"
COM_FABRIK_LIST_NOT_PUBLISHED="Przepraszam ta lista nie jest
opublikowana"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Ładowanie z pliku cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Ładowanie z bazy danych"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Upewnij się, że zaznaczyłeś
klucz główny dla swojej tabeli, Fabrik nie może przetworzyć tego
złączenia dopóki tego nie zrobisz"
COM_FABRIK_NEXT="Następny"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Niewystarczające prawa dostępu.
Zaloguj się"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nie znaleziono klucza dla tej
listy"
COM_FABRIK_NO_RECORDS="Nie znaleziono rekordów"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Nie znaleziono rekordów"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Brak danych"
COM_FABRIK_NONE="Nic"
COM_FABRIK_NONE_OF_THESE_TERMS="Żaden z tych warunków"
COM_FABRIK_NOT_EQUALS="NIE JEST RÓWNE"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Przepraszam, nie masz autoryzacji
aby dodać ten rekord"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Przepraszam, nie masz autoryzacji
by edytować ten rekord"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Biblioteka Dompdf nie
znaleziona"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Brak ustawionych
elementów zawartych do szukania wszystkiego"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Ta fraza jest za krótka do
przeszukania listy, proszę spróbuj użyć dłuższej frazy do
przeszukania"
COM_FABRIK_OR="lub"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Nadpisz pasujące rekordy"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Proszę wybrać"
COM_FABRIK_PLEASE_SELECT_A_ROW="Proszę wybrać rząd"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Proszę wybrać
wszystkie wymagane filtry"
COM_FABRIK_PREV="Wstecz"
COM_FABRIK_PREVIOUS="Poprzedni"
COM_FABRIK_PRINT="Drukuj"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Filtr zapytania został
ustawiony ale nie podano wartości/zapytania"
COM_FABRIK_RECORDS="rekordy"
COM_FABRIK_RECORDS_DELETED="Rekordy usunięte"
COM_FABRIK_RECORD_ADDED_UPDATED="Rekord dodany/uaktualniony"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Wygląda na to że już
zacząłeś wypełniać ten formularz. Dane są wpisane od ostatniej twojej
wizyty na stronie. Jeśli chcesz wpisywać od początku, wciśnij przycisk
'Wyczyść'"
COM_FABRIK_SAVE="Zapisz"
COM_FABRIK_SAVING_TO="Zapisane do"
COM_FABRIK_SEARCH="Szukaj"
COM_FABRIK_SELECT="Wybierz"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Proszę wybrać co najmniej
jeden filtr"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Wybierz kolumny do eksportu"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Wybierz kilka rzędów do
wykasowania"
COM_FABRIK_SEND_EMAIL="Wyślij email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Przepraszam ta
wizualizacja jest nieopublikowana"
COM_FABRIK_START="Start"
COM_FABRIK_SUBSCRIBE_RSS="Subskrybcja RSS"
COM_FABRIK_SUCCESS="Sukces"
COM_FABRIK_SUM="Suma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Upewnij się że zainstalowałeś
i opublikowałeś plugin systemowy Fabrik"
COM_FABRIK_TEXT_DELIMITER="Separator tekstu"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Ten element został wysłany
do"
COM_FABRIK_TOGGLE="Przełącznik"
COM_FABRIK_TOTAL="Całkowite"
COM_FABRIK_VALIDATING="Sprawdzanie poprawności"
COM_FABRIK_VALIDATION_ERROR="Błąd poprawności"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Widok"
COM_FABRIK_VIEW_ALL="Zobacz wszystkie"
COM_FABRIK_WHERE="Gdzie"
COM_FABRIK_YOUR_EMAIL="Twój email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Email twojego przyjaciela"
COM_FABRIK_YOUR_NAME="Twoje imię"
COM_FABRIK_MESSAGE_SUBJECT="Temat"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
COM_FABRIK_LIST_TABS_ALL="Wszystko"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Zapisz"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Usuń"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Zresetuj"
language/pl-PL/pl-PL.com_fabrik.sys.ini000064400000024226151165346250013626
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Dodaj"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Dodaj kolejną
opcję"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Zaawanasowane wyszukiwanie"
COM_FABRIK_ALL="wszystkie"
COM_FABRIK_ALL_OF_THESE_TERMS="Wszystkie z tych warunków"
COM_FABRIK_AND="i"
COM_FABRIK_ANY_OF_THESE_TERMS="Którekolwiek z tych warunków"
COM_FABRIK_APPLY="Zatwierdź"
COM_FABRIK_AVERAGE="Średnio"
COM_FABRIK_BEGINS_WITH="ZACZYNA SIĘ "
COM_FABRIK_BETWEEN="pomiędzy"
COM_FABRIK_BROWSE_FOLDERS="Przeglądaj foldery"
COM_FABRIK_CANCEL="Anuluj"
COM_FABRIK_CLEAR="Wyczyść filtry"
COM_FABRIK_CLOSE_WINDOW="Zamknij"
COM_FABRIK_CONDITION="Warunek"
COM_FABRIK_CONFIRM_DELETE_1="Jesteś pewien że chcesz skasować ten
rekord?"
COM_FABRIK_CONFIRM_DELETE="Jesteś pewien że chcesz skasować rekordy
%s ?"
COM_FABRIK_CONFIRM_DROP="Naprawdę chcesz skasować wszystkie rekordy
i zresetować ten klucz tabeli do 0?"
COM_FABRIK_CONTAINS="ZAWIERA"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Liczność"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s rekordów z CSV dodanych i %s
rekordów uaktualnionych"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nowych
elementów dodanych, %s rekordów z CSV dodanych i %s rekordów
uaktualnionych"
COM_FABRIK_CSV_COMPLETE="Export z CSV zakończony"
COM_FABRIK_CSV_DOWNLOADING="pobieranie pliku CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Pobierz"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Brak dostępnych rekordów do
eksportu CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Przepraszam, następujące pola w
pliku CSV nie zostały znalezione w tej tabeli:"
COM_FABRIK_CSV_FILE="Plik CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="i"
COM_FABRIK_DATE_RANGE_BETWEEN="pomiędzy"
COM_FABRIK_DELETE="Usuń"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Wyświetl #"
COM_FABRIK_DROP_EXISTING_DATA="Skasuj istniejące dane"
COM_FABRIK_EDIT="Edytuj"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Następująca podstrona z adresu %s została
wysłana do ciebie przez %s ( %s).\n\nMożesz obejrzeć ją pod
następującym adresem URL:\n %s"
COM_FABRIK_EMPTY="Pusty"
COM_FABRIK_END="Koniec"
COM_FABRIK_ENDS_WITH="KOŃCZY SIĘ NA"
COM_FABRIK_EQUALS="ZAWIERA"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Przepraszam, szablon
administratora może być użyty tylko ze stronami panelu administratora
Joomla. Proszę wybrać inny szablon."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Biblioteka Curl nie jest
zainstalowana, niektóre elementy strony nie zostały przetworzone"
COM_FABRIK_ERR_UPLOADS_DISABLED="Instalator nie może kontynuować gdy
uploadowanie plików nie jest włączone. Proszę wybrać metodę
instalacji z katalogu."
COM_FABRIK_EXACT_TERMS="dokładne wyrażenie"
COM_FABRIK_EXPORT="Eksport"
COM_FABRIK_EXPORT_TO_CSV="Eksport do CSV"
COM_FABRIK_FAILED_VALIDATION="Validacja nieudana"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Plik CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Wybierz plik CSV do wgrania"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Wyczyść dane"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Istniejące dane zostaną
usunięte z listy przed importem danych CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Separator
pola"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Znak użyty w pliku
CSV do separacji komórek danych"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Która aplikacja
wyeksportowała plik CSV (potrzebne do określenia prawidłowego
kodowania)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Nadpisz"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Nadpisuje wszystkie
pasujące rekordy z danymi CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="lub separator
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Gdy zaznaczone
separator pól jest pomijany a zamiast niego przypisany jest znak
tabulatora"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Separator
tekstu"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Znak użyty w pliku
CSV do zastępowania wartości tekstu"
COM_FABRIK_FIELD_DELIMITER="Separator pola"
COM_FABRIK_FILE_TYPE="Typ pliku"
COM_FABRIK_FILTER="Filtr"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Opcje filtru %s zostały obcięte
gdyż zawierają więcej rekordów niż wartość "_QQ_"Max lista
filtru' w globalnych ustawieniach Fabrik."
COM_FABRIK_FILTER_PLEASE_SELECT="Wszystko"
COM_FABRIK_FILTERS_CLEARED="Filtry wyczyszczone"
COM_FABRIK_FORM="Formularz"
COM_FABRIK_FORM_FIELDS="Pola formularza"
COM_FABRIK_FORM_NOT_PUBLISHED="Przepraszam ten formularz nie jest
opublikowany"
COM_FABRIK_FORM_SAVED="Formularz zapisany"
COM_FABRIK_GO="Start"
COM_FABRIK_GREATER_THAN="WIĘKSZE NIŻ"
COM_FABRIK_GROUP_BY="Pogrupowane przez"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Import pliku CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nie wybrano pliku"
COM_FABRIK_IMPORT_FROM_CSV="Import z CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Zawiera kalkulacje"
COM_FABRIK_INCLUDE_DATA="Zawiera dane:"
COM_FABRIK_INCLUDE_FILTERS="Zawiera filtry:"
COM_FABRIK_INCLUDE_RAW_DATA="Zawiera dane raw:"
COM_FABRIK_INCORRECT_LIST_ID="Nieprawidłowy id listy"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Ten formularz używa
połączonych danych, ale jego klucz obcy %s nie jest opublikowany. To
wywoła nieprawidłowości przy zapisie formularza. Skontaktuj się z
właścicielem strony w sprawie usunięcia nieprawidłowości."
COM_FABRIK_LABEL="Etykieta"
COM_FABRIK_LESS_THAN="MNIEJ NIŻ"
COM_FABRIK_LINKED_FORM_ADD="Dodaj"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id listy nie ustawione - nie
można wygenerować"
COM_FABRIK_LIST_NO_DATA_MSG="Brak rekordów"
COM_FABRIK_LIST_NOT_PUBLISHED="Przepraszam ta lista nie jest
opublikowana"
COM_FABRIK_LOADING="Ładowanie..."
COM_FABRIK_LOADING_FROM_COOKIE="Ładowanie z pliku cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Ładowanie z bazy danych"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Upewnij się, że zaznaczyłeś
klucz główny dla swojej tabeli, Fabrik nie może przetworzyć tego
złączenia dopóki tego nie zrobisz"
COM_FABRIK_NEXT="Następny"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Niewystarczające prawa dostępu.
Zaloguj się"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nie znaleziono klucza dla tej
listy"
COM_FABRIK_NO_RECORDS="Nie znaleziono rekordów"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Brak danych"
COM_FABRIK_NONE="Nic"
COM_FABRIK_NONE_OF_THESE_TERMS="Żaden z tych warunków"
COM_FABRIK_NOT_EQUALS="NIE JEST RÓWNE"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Przepraszam, nie masz autoryzacji
aby dodać ten rekord"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Przepraszam, nie masz autoryzacji
by edytować ten rekord"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Biblioteka Dompdf nie
znaleziona"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Brak ustawionych
elementów zawartych do szukania wszystkiego"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Ta fraza jest za krótka do
przeszukania listy, proszę spróbuj użyć dłuższej frazy do
przeszukania"
COM_FABRIK_OR="lub"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Nadpisz pasujące rekordy"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Proszę wybrać"
COM_FABRIK_PLEASE_SELECT_A_ROW="Proszę wybrać rząd"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Proszę wybrać
wszystkie wymagane filtry"
COM_FABRIK_PREV="Wstecz"
COM_FABRIK_PREVIOUS="Poprzedni"
COM_FABRIK_PRINT="Drukuj"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Filtr zapytania został
ustawiony ale nie podano wartości/zapytania"
COM_FABRIK_RECORDS="rekordy"
COM_FABRIK_RECORDS_DELETED="Rekordy usunięte"
COM_FABRIK_RECORD_ADDED_UPDATED="Rekord dodany/uaktualniony"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Wygląda na to że już
zacząłeś wypełniać ten formularz. Dane są wpisane od ostatniej twojej
wizyty na stronie. Jeśli chcesz wpisywać od początku, wciśnij przycisk
'Wyczyść'"
COM_FABRIK_SAVE="Zapisz"
COM_FABRIK_SAVING_TO="Zapisane do"
COM_FABRIK_SEARCH="Szukaj"
COM_FABRIK_SELECT="Wybierz"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Proszę wybrać co najmniej
jeden filtr"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Wybierz kolumny do eksportu"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Wybierz kilka rzędów do
wykasowania"
COM_FABRIK_SEND_EMAIL="Wyślij email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Przepraszam ta
wizualizacja jest nieopublikowana"
COM_FABRIK_START="Start"
COM_FABRIK_SUBSCRIBE_RSS="Subskrybcja RSS"
COM_FABRIK_SUCCESS="Sukces"
COM_FABRIK_SUM="Suma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Upewnij się że zainstalowałeś
i opublikowałeś plugin systemowy Fabrik"
COM_FABRIK_TEXT_DELIMITER="Separator tekstu"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Ten element został wysłany
do"
COM_FABRIK_TOGGLE="Przełącznik"
COM_FABRIK_TOTAL="Całkowite"
COM_FABRIK_VALIDATING="Sprawdzanie poprawności"
COM_FABRIK_VALIDATION_ERROR="Błąd poprawności"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Widok"
COM_FABRIK_VIEW_ALL="Zobacz wszystkie"
COM_FABRIK_WHERE="Gdzie"
COM_FABRIK_YOUR_EMAIL="Twój email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Email twojego przyjaciela"
COM_FABRIK_YOUR_NAME="Twoje imię"
COM_FABRIK_MESSAGE_SUBJECT="Temat"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/pt-BR/pt-BR.com_fabrik.ini000064400000025622151165346250013012
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Adicionar"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Adicionar uma nova opção
para aqueles acima."
COM_FABRIK_ADD_GROUP="Incluir&nbsp;grupo"
COM_FABRIK_ADVANCED_SEARCH="Pesquisa avançada"
COM_FABRIK_ALL="Todos"
COM_FABRIK_ALL_OF_THESE_TERMS="Todos estes termos"
COM_FABRIK_AND="E"
COM_FABRIK_ANY_OF_THESE_TERMS="Qualquer destes termos"
COM_FABRIK_APPLY="Aplicar"
COM_FABRIK_AVERAGE="Média"
COM_FABRIK_BEGINS_WITH="INICIAR COM"
COM_FABRIK_BETWEEN="Entre"
COM_FABRIK_BIRTHDAY_TODAY="É aniversário"
COM_FABRIK_BROWSE_FOLDERS="Navegar pastas"
COM_FABRIK_CANCEL="Cancelar"
COM_FABRIK_CLEAR="Limpar filtros"
COM_FABRIK_CLOSE_WINDOW="Fechar"
COM_FABRIK_CONDITION="Condição"
COM_FABRIK_CONFIRM_DELETE_1="Tem certeza que deseja excluir este
registro?"
COM_FABRIK_CONFIRM_DELETE="Tem certeza de que deseja excluir %s
registros?"
COM_FABRIK_CONFIRM_DROP="Você realmente deseja excluir todos os
registros e resetar esta chave da tabela para 0?"
COM_FABRIK_CONTAINS="CONTÉM"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Não conseguimos
encontrar esse dado"
COM_FABRIK_COUNT="Contar"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s registros CSV adicionados e %s
registros atualizados "
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s novos
elementos adicionados, %s registros CSV acrescentados e %s registros
atualizados"
COM_FABRIK_CSV_COMPLETE="Exportação CSV completa!"
COM_FABRIK_CSV_DOWNLOADING="Baixando arquivo CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Download aqui"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Não há registros disponíveis para
exportar CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Desculpe os seguintes campos no
arquivo CSV não são encontrados nesta tabela:"
COM_FABRIK_CSV_FILE="Arquivo CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importar: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formato salvo em Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formato exportado pelo
Fabrik ou pelo Excel com a opção 'File type= unicode
text')"
COM_FABRIK_DATE_RANGE_AND="e"
COM_FABRIK_DATE_RANGE_BETWEEN="Entre"
COM_FABRIK_DELETE="Excluir"
COM_FABRIK_DELETE_GROUP="Excluir&nbsp;grupo"
COM_FABRIK_DISPLAY_NUM="Exibir #"
COM_FABRIK_DROP_EXISTING_DATA="Excluir dados existentes"
COM_FABRIK_EDIT="Editar"
COM_FABRIK_ELEMENT="Elemento"
COM_FABRIK_EMAIL_MSG="A seguinte página do site %s foi enviada a
você por %s ( %s).\n\nVocê pode acessá-la na seguinte URL:\n %s"
COM_FABRIK_EMPTY="Vazio"
COM_FABRIK_END="End"
COM_FABRIK_ENDS_WITH="FINALIZAR COM"
COM_FABRIK_EQUALS="IGUAL"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Desculpe o modelo admin é
apenas para uso dentro de páginas de administração do Joomla. Por favor
seleccione um modelo diferente."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="A biblioteca Curl não está
instalada, algumas partes desta página falharam ao executar"
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="As
abas do template não são compatíveis com formulários multi-páginas.
Use um template bootstrap ou assegure que todos os grupos tenham a opção
'Quebra de Página' desabilitada.  "
COM_FABRIK_ERR_UPLOADS_DISABLED="O instalador não pode continuar
antes de enviar os arquivos selecionados. Por favor, use a o método
instalar a partir do diretório."
COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="Um prefiltro foi adicionado a um
elemento não publicado e não será aplicado: %s"
COM_FABRIK_EXACT_TERMS="Frase exata"
COM_FABRIK_EXPORT="Exportar"
COM_FABRIK_EXPORT_TO_CSV="Exportar para CSV"
COM_FABRIK_FAILED_VALIDATION="Validação falhou!"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Arquivo CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Selecione um arquivo CSS para
carregar"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Excluir dados"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Removerá os dados
existentes a partir da lista antes de importar os dados do CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Delimitador de
campo"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="O caracter usado no
arquivo CSV para separar dados das células"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formato"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Qual aplicativo exportará o
arquivo CSV (necessário para garantir a codificação correta a ser
usada)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Sobrescrever"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Substitui quaisquer
registos correspondentes com os dados do CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="Ou delimitador de
guia"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Se marcada, o
delimitador de campo é ignorado e o caractere de tabulação é atribuído
de vez."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Delimitador de
texto"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="O caractere usado no
arquivo CSV para envolver valores de texto"
COM_FABRIK_FIELD_DELIMITER="Delimitador de campo"
COM_FABRIK_FILE_TYPE="Tipo do arquivo"
COM_FABRIK_FILTER="Filtro"
COM_FABRIK_FILTER_LIST_MAX_REACHED="As opções do filtro %s devem ter
sido truncadas pois contém mais registros do que Fabrik's global
'Filter \nList Max' do valor da configuração."
COM_FABRIK_FILTER_PLEASE_SELECT="Todos"
COM_FABRIK_FILTERS_ACTIVE="Filtros ativos"
COM_FABRIK_FILTERS_CLEARED="Limpar filtros"
COM_FABRIK_FORM="Formulário"
COM_FABRIK_FORM_FIELDS="Campos dos formulário"
COM_FABRIK_FORM_NOT_PUBLISHED="Desculpe este formulário não está
publicado"
COM_FABRIK_FORM_SAVED="Salvar formulário"
COM_FABRIK_GO="Ir"
COM_FABRIK_GREATER_THAN="MAIOR QUE"
COM_FABRIK_GROUP_BY="Agrupar por"
COM_FABRIK_IMPORT_CSV="Importar CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importa arquivo CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nenhum arquivo
selecionado"
COM_FABRIK_IMPORT_FROM_CSV="Importar do CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Incluir cálculos"
COM_FABRIK_INCLUDE_DATA="Incluir dados:"
COM_FABRIK_INCLUDE_FILTERS="Incluir filtros:"
COM_FABRIK_INCLUDE_RAW_DATA="Incluir dados bruto:"
COM_FABRIK_INCORRECT_LIST_ID="ID da lista incorreta"
COM_FABRIK_IS_EMPTY="ESTÁ VAZIO"
COM_FABRIK_IS_NOT_EMPTY="NÃO É VAZIO"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Este formulário usa
dados associados, mas a chave externa %s, não está publicada. Isto
causará problemas quando salvar o formulário. Por favor, contate o
administrador do site sobre este problema"
COM_FABRIK_LABEL="Rótulo"
COM_FABRIK_LESS_THAN="MENOR QUE"
COM_FABRIK_LINKED_FORM_ADD="Adicionar"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Lista"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="ID da tabela não definida -
não é possível renderizar"
COM_FABRIK_LIST_NO_DATA_MSG="Sem registros"
COM_FABRIK_LIST_NOT_PUBLISHED="Desculpe esta tabela não está
publicada!"
COM_FABRIK_LOADING="Carregando..."
COM_FABRIK_LOADING_FROM_COOKIE="Carregando cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Carregando do banco de dados"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Por favor assegure-se que
selecionou uma chave principal para a sua tabela, Fabrik não pode
processar este join enquanto não se certificar disso"
COM_FABRIK_NEXT="Próximo"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Direitos de acesso insuficientes.
Faça o login"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Não foram encontrados
elementos correspondentes a %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="nenhuma chave foi encontrada
para esta tabela"
COM_FABRIK_NO_RECORDS="Nenhum registro encontrado"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Nenhum registro encontrado"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Sem dados"
COM_FABRIK_NONE="Nenhum"
COM_FABRIK_NONE_OF_THESE_TERMS="Nenhum destes termos"
COM_FABRIK_NOT_EQUALS="DIFERENTE"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Desculpe, mas você não está
autorizado a adicionar este registro"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Desculpe, mas você não está
autorizado a editar este registro"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Biblioteca Dompdf não
encontrada"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Nenhum elemento definido
para ser incluído em todas as pesquisas"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Sua frase de pesquisa é
muito curta para pesquisar a lista, por favor, tente pesquisar sobre uma
frase mais longa"
COM_FABRIK_OR="ou"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Sobrescrever registros
correspondentes"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Por favor selecione"
COM_FABRIK_PLEASE_SELECT_A_ROW="Por favor selecione uma linha"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Por favor selecione
todos os filtros necessários"
COM_FABRIK_PREV="Ant"
COM_FABRIK_PREVIOUS="Anterior"
COM_FABRIK_PRINT="Imprimir"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Um pré-filtro de consulta
foi definido, mas nenhum valor/consulta foi dado"
COM_FABRIK_RECORDS="registros"
COM_FABRIK_RECORDS_DELETED="Excluir registros"
COM_FABRIK_RECORD_ADDED_UPDATED="Registros adicionado/atualizado"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Parece que você já começou a
preencher este formulário. Você está recomeçando da última página que
visitou. Se desejar voltar a preencher o formulário do início, clique no
botão "_QQ_"limpar"_QQ_"."
COM_FABRIK_SAVE="Salvar"
COM_FABRIK_SAVING_TO="salvar em"
COM_FABRIK_SEARCH="Pesquisar"
COM_FABRIK_SELECT="Selecionar"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Por favor selecione ao menos um
filtro"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Selecione as colunas para
exportar"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Selecione algumas linhas para
exclusão"
COM_FABRIK_SEND_EMAIL="Enviar email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Desculpe esta
visualização está despublicada!"
COM_FABRIK_START="Iniciar"
COM_FABRIK_SUBSCRIBE_RSS="Assinar RSS"
COM_FABRIK_SUCCESS="Sucesso"
COM_FABRIK_SUM="Soma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Por favor, certifique-se de ter
instalado e publicado o plugin de sistema do Fabrik"
COM_FABRIK_TEXT_DELIMITER="Delimitador de texto"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Este ítem foi enviado"
COM_FABRIK_TOGGLE="Alternar"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validando"
COM_FABRIK_VALIDATION_ERROR="Erro de validação"
COM_FABRIK_VALUE="Valor"
COM_FABRIK_VIEW="Visualizar"
COM_FABRIK_VIEW_ALL="Ver todos"
COM_FABRIK_WHERE="Onde"
COM_FABRIK_YOUR_EMAIL="Seu email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="O endereço de email do seu amigo"
COM_FABRIK_YOUR_NAME="Seu nome"
COM_FABRIK_MESSAGE_SUBJECT="Assunto"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Subopções inválidas para o
elemento '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Iniciar"
COM_FABRIK_VALIDATION="Validação"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Um erro ocorreu com o campo de
avaliação - por favor informe o administrador do site. "
COM_FABRIK_LIST_TABS_ALL="Todos"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Salvar"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Aplicar"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Voltar"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Excluir"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/pt-PT/pt-PT.com_fabrik.ini000064400000025447151165346250013057
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Adicionar"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Adicionar nova opção às
de cima"
COM_FABRIK_ADD_GROUP="Adicionar&nbsp;Grupo"
COM_FABRIK_ADVANCED_SEARCH="Pesquisa avançada"
COM_FABRIK_ALL="todos"
COM_FABRIK_ALL_OF_THESE_TERMS="Todos estes termos"
COM_FABRIK_AND="E"
COM_FABRIK_ANY_OF_THESE_TERMS="Qualquer um destes termos"
COM_FABRIK_APPLY="Aplicar"
COM_FABRIK_AVERAGE="Média"
COM_FABRIK_BEGINS_WITH="COMEÇA COM"
COM_FABRIK_BETWEEN="Entre"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Procurar Pastas"
COM_FABRIK_CANCEL="Cancelar"
COM_FABRIK_CLEAR="Limpar filtros"
COM_FABRIK_CLOSE_WINDOW="Fechar"
COM_FABRIK_CONDITION="Condição"
COM_FABRIK_CONFIRM_DELETE_1="Tem a certeza que deseja eliminar este
registo?"
COM_FABRIK_CONFIRM_DELETE="Tem a certeza que deseja eliminar %s
registos?"
COM_FABRIK_CONFIRM_DROP="Tem a certeza que deseja eliminar todos os
registos e restabelecer a chave da tabela para 0?"
COM_FABRIK_CONTAINS="CONTÉM"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Foi impossível
encontrar este registo."
COM_FABRIK_COUNT="Contagem"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s registos CSV adicionados e %s
registos actualizados."
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s novos
elementos adicionados, %s registos CSV adicionados e %s registos
actualizados."
COM_FABRIK_CSV_COMPLETE="Exportação CSV completa."
COM_FABRIK_CSV_DOWNLOADING="Download de CSV em progresso."
COM_FABRIK_CSV_DOWNLOAD_HERE="Download aqui"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Não existem registos disponíveis
para exportar CSV."
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Lamentamos mas os seguintes campos
do ficheiro CSV não se encontram nesta tabela:"
COM_FABRIK_CSV_FILE="Ficheiro CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importar: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formatação guardada a partir
do Excel)"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (formato exportado por
Fabrik ou Excel com opção 'File Type=unicode text')"
COM_FABRIK_DATE_RANGE_AND="e"
COM_FABRIK_DATE_RANGE_BETWEEN="Entre"
COM_FABRIK_DELETE="Apagar"
COM_FABRIK_DELETE_GROUP="Apagar&nbsp;Grupo"
COM_FABRIK_DISPLAY_NUM="Mostrar n.º"
COM_FABRIK_DROP_EXISTING_DATA="Eliminar dados existentes"
COM_FABRIK_EDIT="Editar»"
COM_FABRIK_ELEMENT="Elemento"
COM_FABRIK_EMAIL_MSG="A seguinte página do website %s foi enviada
para si por %s ( %s).\n\nPode aceder seguindo o URL:\n%s"
COM_FABRIK_EMPTY="Esvaziar"
COM_FABRIK_END="Fim"
COM_FABRIK_ENDS_WITH="TERMINA COM"
COM_FABRIK_EQUALS="IGUAL"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="O Modelo admin é apenas
para uso entre as páginas de Administração Joomla!. Por favor seleccione
um Modelo diferente."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="A Biblioteca Curl não está
instalada. Algumas partes desta página falharam a sua execução."
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="O instalador não pode continuar
antes de os carregamentos de ficheiros serem activados. Por favor, use o
método 'Instalar a partir de uma Pasta'."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Frase exata"
COM_FABRIK_EXPORT="Exportar"
COM_FABRIK_EXPORT_TO_CSV="Exportar para CSV"
COM_FABRIK_FAILED_VALIDATION="A validação falhou"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Ficheiro CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Seleccione um ficheiro CSV para
carregar"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Eliminar dados"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Eliminará dados
existentes da Lista antes de importar os dados do CSV."
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Delimitador de
Campos"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="O caractere
utilizado no ficheiro CSV para separar dados das células"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formato"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Que aplicação exportou o
ficheiro CSV (necessário para assegurar que a codificação correcta é
utilizada)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Sobrescrever"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Sobrescreve quaisquer
resultados correspondentes com os dados do CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="ou delimitador de
Tabulações"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Se escolhido então o
delimitador de campo é ignorado e o caractere de tabulação é
utilizado."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Delimitador de
Texto"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
COM_FABRIK_FIELD_DELIMITER="Delimitador de Campos"
COM_FABRIK_FILE_TYPE="Tipo de ficheiro"
COM_FABRIK_FILTER="Filtro"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="Todos"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filtros removidos"
COM_FABRIK_FORM="Formulário"
COM_FABRIK_FORM_FIELDS="Campos de Formulário"
COM_FABRIK_FORM_NOT_PUBLISHED="Lamentamos mas este Formulário não
está Publicado."
COM_FABRIK_FORM_SAVED="Formulário guardado"
COM_FABRIK_GO="Aplicar"
COM_FABRIK_GREATER_THAN="MAIOR QUE"
COM_FABRIK_GROUP_BY="Agrupar por"
COM_FABRIK_IMPORT_CSV="Importar CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importar ficheiro CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nenhum ficheiro
escolhido"
COM_FABRIK_IMPORT_FROM_CSV="Importação de CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Incluir calculos"
COM_FABRIK_INCLUDE_DATA="Incluir dados:"
COM_FABRIK_INCLUDE_FILTERS="Incluir filtros:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
COM_FABRIK_INCORRECT_LIST_ID="id de Lista incorrecto"
COM_FABRIK_IS_EMPTY="É VAZIO"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Rótulo"
COM_FABRIK_LESS_THAN="MENOR QUE"
COM_FABRIK_LINKED_FORM_ADD="Adicionar"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Lista"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="id da Lista não definido -
impossível processar."
COM_FABRIK_LIST_NO_DATA_MSG="Sem registos"
COM_FABRIK_LIST_NOT_PUBLISHED="Lamentamos mas esta Lista não está
Publicada."
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="A processar a partir de Cookie"
COM_FABRIK_LOADING_FROM_DATABASE="A processar a partir da Base de
Dados"
COM_FABRIK_MEDIAN="Mediana"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Por favor certifique-se de que
seleccionou uma chave-primária para a sua tabela. O Fabrik não pode
processar esta relação enquanto não o fizer."
COM_FABRIK_NEXT="Seguinte"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Permissões de Acesso
insuficientes. Por favor faça o Login."
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Nenhum elemento encontrado
que corresponda a %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nenhuma chave encontrada para
esta Lista."
COM_FABRIK_NO_RECORDS="Nenhum registo encontrado"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Nenhum registo encontrado"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Sem dados"
COM_FABRIK_NONE="Nenhum"
COM_FABRIK_NONE_OF_THESE_TERMS="Nenhum destes termos"
COM_FABRIK_NOT_EQUALS="DIFERENTE"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Lamentamos mas não está
autorizado a adicionar este registo."
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Lamentamos mas não está
autorizado a editar este registo."
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Biblioteca Dompdf não foi
encontrada."
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="A sua pesquisa é
demasiadamente pequena. Por favor, tente novamente introduzindo um
critério maior."
COM_FABRIK_OR="ou"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Sobrescrever registos
correspondentes"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Por favor escolha"
COM_FABRIK_PLEASE_SELECT_A_ROW="Seleccione uma linha, por favor."
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Seleccione todos os
filtros obrigatórios, por favor."
COM_FABRIK_PREV="Anterior"
COM_FABRIK_PREVIOUS="Anterior"
COM_FABRIK_PRINT="Imprimir"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
COM_FABRIK_RECORDS="registos"
COM_FABRIK_RECORDS_DELETED="Registos eliminados"
COM_FABRIK_RECORD_ADDED_UPDATED="Registo adicionado/actualizado"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Guardar"
; COM_FABRIK_SAVING_TO="saving to"
COM_FABRIK_SEARCH="Pesquisa"
COM_FABRIK_SELECT="Escolher"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Seleccione pelo menos um
filtro, por favor"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Seleccione colunas para
exportação"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Seleccione linhas para
eliminação."
COM_FABRIK_SEND_EMAIL="Enviar email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Lamentamos mas
esta Visualização não está publicada"
COM_FABRIK_START="Início"
COM_FABRIK_SUBSCRIBE_RSS="Subscrever RSS"
COM_FABRIK_SUCCESS="Enviado com sucesso"
COM_FABRIK_SUM="Somar"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Por favor certifique-se de que
instalou e publicou o Plugin de Sistema Fabrik."
COM_FABRIK_TEXT_DELIMITER="Delimitador de Texto"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Este item foi enviado
para"
COM_FABRIK_TOGGLE="Alterar"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="a Validar"
COM_FABRIK_VALIDATION_ERROR="Erro na Validação"
COM_FABRIK_VALUE="Valor"
COM_FABRIK_VIEW="Ver"
COM_FABRIK_VIEW_ALL="Ver todos"
COM_FABRIK_WHERE="Onde"
COM_FABRIK_YOUR_EMAIL="O seu email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="email do seu amigo"
COM_FABRIK_YOUR_NAME="O seu nome"
COM_FABRIK_MESSAGE_SUBJECT="Assunto"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Log"
COM_FABRIK_RUN="Processar"
COM_FABRIK_VALIDATION="Validação"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
COM_FABRIK_LIST_TABS_ALL="Todos"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Guardar"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Aplicar"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Retroceder"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Eliminar"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Limpar"
language/ro-RO/ro-RO.com_fabrik.ini000064400000025263151165346250013037
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Adauga"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Adauga o optiune noua la
cele de mai sus"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Cautare avansata"
COM_FABRIK_ALL="toate"
COM_FABRIK_ALL_OF_THESE_TERMS="Toti acesti termeni"
COM_FABRIK_AND="Si"
COM_FABRIK_ANY_OF_THESE_TERMS="Fiecare din acesti termeni"
COM_FABRIK_APPLY="Aplica"
COM_FABRIK_AVERAGE="Medie"
COM_FABRIK_BEGINS_WITH="INCEPE CU"
COM_FABRIK_BETWEEN="Intre"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Vezi folderele"
COM_FABRIK_CANCEL="Opreste"
COM_FABRIK_CLEAR="Sterge filtrele"
COM_FABRIK_CLOSE_WINDOW="Inchide"
COM_FABRIK_CONDITION="Conditie"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Sigur vrei sa stergi aceste
inregistrari?"
COM_FABRIK_CONFIRM_DROP="Sigur vrei sa stergi toate aceste
inregistrari si sa resetezi tabela la 0?"
COM_FABRIK_CONTAINS="CONTIN"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Numara"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s inregistrari CSV adaugate si %s
inregistrari actualizate"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s elemente noi
adaugate, %s inregistrari noi si %s inregistrari actualizate"
COM_FABRIK_CSV_COMPLETE="Export CSV complet"
COM_FABRIK_CSV_DOWNLOADING="Descarcare fisier CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Descarca aici"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Nu sunt inregistrari disponibile
pentru a fi exportate in CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Ne pare rau, urmatoarele campuri
din fisierul CSV nu au fost gasite in tabela:"
COM_FABRIK_CSV_FILE="Fisier CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importa: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="si"
COM_FABRIK_DATE_RANGE_BETWEEN="Intre"
COM_FABRIK_DELETE="Sterge"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Afiseaza #"
COM_FABRIK_DROP_EXISTING_DATA="Arunca datele existente"
COM_FABRIK_EDIT="Editeaza"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Urmatoarea pagina din site-ul %s ti-a fost
trimisa de catre %s ( %s).⏎ ⏎ O poti accesa la urmatoarea adresa:⏎
%s"
COM_FABRIK_EMPTY="Gol"
COM_FABRIK_END="Sfarsit"
COM_FABRIK_ENDS_WITH="SE TERMINA CU"
COM_FABRIK_EQUALS="EGAL CU"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Ne pare rau, dar sablonul
admin este disponibil doar in cadrul paginilor de administrare. Te rugam
selecteaza un sablon diferit."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Libraria Curl nu este instalata,
unele parti din acesta pagina nu s-au executat."
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Programul de instalare nu poate
continua inainte ca incarcarea fisierelor sa fie activata. Te rugam
foloseste optiune de incarcare din director."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Fraza exacta"
COM_FABRIK_EXPORT="Exporta"
COM_FABRIK_EXPORT_TO_CSV="Exporta catre CSV"
COM_FABRIK_FAILED_VALIDATION="Validare esuata"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Fisier CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Selecteaza un fisier CSV pentru a fi
incarcat"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Arunca datele"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Va sterge datele existente
inainte de a importa datele din fisierul CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Delimitator
camp"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Caracterul folosit
in fisierul CSV pentru a separa datele din celule"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Ce aplicatie a exportat
fisierul CSV (necesara pentru a te asigura daca este folosita codarea
corecta)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Suprascrie"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Suprascrie orice
inregistrare care se potriveste cu cele din fisierul CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="sau delimitator
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Daca este bifat,
atunci delimitatorul campului este ignorat si caracterul tab este alocat in
loc"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Delimitator
text"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Caracterul folosit in
fisierul CSV pentru a grupa valorile text"
COM_FABRIK_FIELD_DELIMITER="Delimitator camp"
COM_FABRIK_FILE_TYPE="Tip camp"
COM_FABRIK_FILTER="Filtru"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Optiunea filtrului %s a fost
impartita deoarece contine mai multe inregistrari decat numarul setat in
fisierul de configurare in Optiuni/Numar maxim filtru"
COM_FABRIK_FILTER_PLEASE_SELECT="Toate"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filtre sterse"
COM_FABRIK_FORM="Formular"
COM_FABRIK_FORM_FIELDS="Campuri formular"
COM_FABRIK_FORM_NOT_PUBLISHED="Ne pare rau, formularul nu este
activ"
COM_FABRIK_FORM_SAVED="Formular salvat"
COM_FABRIK_GO="Mergi"
COM_FABRIK_GREATER_THAN="MAI MARE CA"
COM_FABRIK_GROUP_BY="Grupat dupa"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importa fisierul CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nu ai selectat niciun
fisier"
COM_FABRIK_IMPORT_FROM_CSV="Importa din CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Include calculele"
COM_FABRIK_INCLUDE_DATA="Include datele"
COM_FABRIK_INCLUDE_FILTERS="Include filtrele"
COM_FABRIK_INCLUDE_RAW_DATA="Include legaturile cu alte tabele"
COM_FABRIK_INCORRECT_LIST_ID="Id lista incorect"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Formularul foloseste date
legate, dar cheia %s nu este publicata. Asta va duce la probleme cand se va
salva formularul. Te rugam contacteaza administratorul pentru aceasta
problema."
COM_FABRIK_LABEL="Eticheta"
COM_FABRIK_LESS_THAN="MAI MIC CA"
COM_FABRIK_LINKED_FORM_ADD="Adauga"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id listei nu este setat- nu se
poate reda"
COM_FABRIK_LIST_NO_DATA_MSG="Fara inregistrari"
COM_FABRIK_LIST_NOT_PUBLISHED="Ne pare rau, lista nu este activa"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Incarca din cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Incarca din baza de date"
COM_FABRIK_MEDIAN="Median"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Te rugam asigura-te ca ai selectat
o cheie primara pentru tabela ta, Fabrik nu poate procesa aceasta legatura
pana nu rezolvi aceasta solicitare"
COM_FABRIK_NEXT="Inainte"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Drepturi de acces insuficiente. Te
rugam autentifica-te"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nu am gasit nicio cheie pentru
aceasta lista"
COM_FABRIK_NO_RECORDS="Nu am gasit inregistrari"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Nu am gasit inregistrari"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Nu sunt date"
COM_FABRIK_NONE="Nimic"
COM_FABRIK_NONE_OF_THESE_TERMS="Niciunul din acesti termeni"
COM_FABRIK_NOT_EQUALS="NU ESTE EGAL"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Ne pare rau, dar nu esti autorizat
sa adaug aceasta inregistrare"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Ne pare rau, dar nu esti
autorizat sa editezi aceasta inregistrare"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Libraria Dompdf nu a fost
gasita"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Nu sunt elemente setate
pentru a fi incluse in cautarea generala"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Fraza de cautare este prea
scurta pentru a cauta lista, incearca o fraza mai lunga"
COM_FABRIK_OR="sau"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Suprascrie inregistrarile care
se potrivesc"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Te rugam selecteaza"
COM_FABRIK_PLEASE_SELECT_A_ROW="Te rugam selecteaza un rand"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Te rugam selecteaza
toate filtrele obligatorii"
COM_FABRIK_PREV="Inapoi"
COM_FABRIK_PREVIOUS="Inapoi"
COM_FABRIK_PRINT="Tipareste"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A fost adaugata o interogare
pentru prefiltrare, dar fara valori adaugate"
COM_FABRIK_RECORDS="inregistrari"
COM_FABRIK_RECORDS_DELETED="Inregistrari sterse"
COM_FABRIK_RECORD_ADDED_UPDATED="Inregistrare
adaugata/actualizata"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Se pare ca deja ai inceput
completarea acestui formular. Vei porni de la ultima pagina vizitata. Daca
vrei sa completezi din nou formularul, te rugam apasa pe butonul de
stergere."
COM_FABRIK_SAVE="Salveaza"
COM_FABRIK_SAVING_TO="salveaza catre"
COM_FABRIK_SEARCH="Cauta"
COM_FABRIK_SELECT="Selecteaza"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Te rugam selecteaza cel putin
un formular"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Selecteaza coloanele pentru a fi
exportate"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Selecteaza ce randuri vrei sa
stergi"
COM_FABRIK_SEND_EMAIL="Trimite email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Ne pare rau,
vizualizarea nu este publicata"
COM_FABRIK_START="Incepe"
COM_FABRIK_SUBSCRIBE_RSS="Subscrie la RSS"
COM_FABRIK_SUCCESS="Succes"
COM_FABRIK_SUM="Suma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Te rugam verifica daca ai
instalat si activat plugin-ul de sistem pentru Fabrik"
COM_FABRIK_TEXT_DELIMITER="Delimitator text"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Articolul a fost trimis
catre"
COM_FABRIK_TOGGLE="Comuta"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validare"
COM_FABRIK_VALIDATION_ERROR="Eroare la validare"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Afiseaza"
COM_FABRIK_VIEW_ALL="Afiseaza tot"
COM_FABRIK_WHERE="Unde"
COM_FABRIK_YOUR_EMAIL="Email-ul tau"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Email-ul prietenului tau"
COM_FABRIK_YOUR_NAME="Numele tau"
COM_FABRIK_MESSAGE_SUBJECT="Subiect"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/ro-RO/ro-RO.com_fabrik.sys.ini000064400000025066151165346250013655
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Adauga"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Adauga o optiune noua la
cele de mai sus"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Cautare avansata"
COM_FABRIK_ALL="toate"
COM_FABRIK_ALL_OF_THESE_TERMS="Toti acesti termeni"
COM_FABRIK_AND="Si"
COM_FABRIK_ANY_OF_THESE_TERMS="Fiecare din acesti termeni"
COM_FABRIK_APPLY="Aplica"
COM_FABRIK_AVERAGE="Medie"
COM_FABRIK_BEGINS_WITH="INCEPE CU"
COM_FABRIK_BETWEEN="Intre"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Vezi folderele"
COM_FABRIK_CANCEL="Opreste"
COM_FABRIK_CLEAR="Sterge filtrele"
COM_FABRIK_CLOSE_WINDOW="Inchide"
COM_FABRIK_CONDITION="Conditie"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Sigur vrei sa stergi aceste
inregistrari?"
COM_FABRIK_CONFIRM_DROP="Sigur vrei sa stergi toate aceste
inregistrari si sa resetezi tabela la 0?"
COM_FABRIK_CONTAINS="CONTIN"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Numara"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s inregistrari CSV adaugate si %s
inregistrari actualizate"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s elemente noi
adaugate, %s inregistrari noi si %s inregistrari actualizate"
COM_FABRIK_CSV_COMPLETE="Export CSV complet"
COM_FABRIK_CSV_DOWNLOADING="Descarcare fisier CSV"
COM_FABRIK_CSV_DOWNLOAD_HERE="Descarca aici"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Nu sunt inregistrari disponibile
pentru a fi exportate in CSV"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Ne pare rau, urmatoarele campuri
din fisierul CSV nu au fost gasite in tabela:"
COM_FABRIK_CSV_FILE="Fisier CSV"
COM_FABRIK_CSV_IMPORT_HEADING="Importa: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="si"
COM_FABRIK_DATE_RANGE_BETWEEN="Intre"
COM_FABRIK_DELETE="Sterge"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Afiseaza #"
COM_FABRIK_DROP_EXISTING_DATA="Arunca datele existente"
COM_FABRIK_EDIT="Editeaza"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Urmatoarea pagina din site-ul %s ti-a fost
trimisa de catre %s ( %s).⏎ ⏎ O poti accesa la urmatoarea adresa:⏎
%s"
COM_FABRIK_EMPTY="Gol"
COM_FABRIK_END="Sfarsit"
COM_FABRIK_ENDS_WITH="SE TERMINA CU"
COM_FABRIK_EQUALS="EGAL CU"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Ne pare rau, dar sablonul
admin este disponibil doar in cadrul paginilor de administrare. Te rugam
selecteaza un sablon diferit."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Libraria Curl nu este instalata,
unele parti din acesta pagina nu s-au executat."
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Programul de instalare nu poate
continua inainte ca incarcarea fisierelor sa fie activata. Te rugam
foloseste optiune de incarcare din director."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Fraza exacta"
COM_FABRIK_EXPORT="Exporta"
COM_FABRIK_EXPORT_TO_CSV="Exporta catre CSV"
COM_FABRIK_FAILED_VALIDATION="Validare esuata"
COM_FABRIK_FIELD_CSV_FILE_LABEL="Fisier CSV"
COM_FABRIK_FIELD_CSV_FILE_DESC="Selecteaza un fisier CSV pentru a fi
incarcat"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Arunca datele"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Va sterge datele existente
inainte de a importa datele din fisierul CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Delimitator
camp"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Caracterul folosit
in fisierul CSV pentru a separa datele din celule"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Ce aplicatie a exportat
fisierul CSV (necesara pentru a te asigura daca este folosita codarea
corecta)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Suprascrie"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Suprascrie orice
inregistrare care se potriveste cu cele din fisierul CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="sau delimitator
Tab"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Daca este bifat,
atunci delimitatorul campului este ignorat si caracterul tab este alocat in
loc"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Delimitator
text"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Caracterul folosit in
fisierul CSV pentru a grupa valorile text"
COM_FABRIK_FIELD_DELIMITER="Delimitator camp"
COM_FABRIK_FILE_TYPE="Tip camp"
COM_FABRIK_FILTER="Filtru"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Optiunea filtrului %s a fost
impartita deoarece contine mai multe inregistrari decat numarul setat in
fisierul de configurare in Optiuni/Numar maxim filtru"
COM_FABRIK_FILTER_PLEASE_SELECT="Toate"
COM_FABRIK_FILTERS_CLEARED="Filtre sterse"
COM_FABRIK_FORM="Formular"
COM_FABRIK_FORM_FIELDS="Campuri formular"
COM_FABRIK_FORM_NOT_PUBLISHED="Ne pare rau, formularul nu este
activ"
COM_FABRIK_FORM_SAVED="Formular salvat"
COM_FABRIK_GO="Mergi"
COM_FABRIK_GREATER_THAN="MAI MARE CA"
COM_FABRIK_GROUP_BY="Grupat dupa"
COM_FABRIK_IMPORT_CSV="Import CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importa fisierul CSV"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nu ai selectat niciun
fisier"
COM_FABRIK_IMPORT_FROM_CSV="Importa din CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Include calculele"
COM_FABRIK_INCLUDE_DATA="Include datele"
COM_FABRIK_INCLUDE_FILTERS="Include filtrele"
COM_FABRIK_INCLUDE_RAW_DATA="Include legaturile cu alte tabele"
COM_FABRIK_INCORRECT_LIST_ID="Id lista incorect"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Formularul foloseste date
legate, dar cheia %s nu este publicata. Asta va duce la probleme cand se va
salva formularul. Te rugam contacteaza administratorul pentru aceasta
problema."
COM_FABRIK_LABEL="Eticheta"
COM_FABRIK_LESS_THAN="MAI MIC CA"
COM_FABRIK_LINKED_FORM_ADD="Adauga"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id listei nu este setat- nu se
poate reda"
COM_FABRIK_LIST_NO_DATA_MSG="Fara inregistrari"
COM_FABRIK_LIST_NOT_PUBLISHED="Ne pare rau, lista nu este activa"
COM_FABRIK_LOADING="Incarca..."
COM_FABRIK_LOADING_FROM_COOKIE="Incarca din cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Incarca din baza de date"
COM_FABRIK_MEDIAN="Median"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Te rugam asigura-te ca ai selectat
o cheie primara pentru tabela ta, Fabrik nu poate procesa aceasta legatura
pana nu rezolvi aceasta solicitare"
COM_FABRIK_NEXT="Inainte"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Drepturi de acces insuficiente. Te
rugam autentifica-te"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nu am gasit nicio cheie pentru
aceasta lista"
COM_FABRIK_NO_RECORDS="Nu am gasit inregistrari"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Nu sunt date"
COM_FABRIK_NONE="Nimic"
COM_FABRIK_NONE_OF_THESE_TERMS="Niciunul din acesti termeni"
COM_FABRIK_NOT_EQUALS="NU ESTE EGAL"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Ne pare rau, dar nu esti autorizat
sa adaug aceasta inregistrare"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Ne pare rau, dar nu esti
autorizat sa editezi aceasta inregistrare"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Libraria Dompdf nu a fost
gasita"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Nu sunt elemente setate
pentru a fi incluse in cautarea generala"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Fraza de cautare este prea
scurta pentru a cauta lista, incearca o fraza mai lunga"
COM_FABRIK_OR="sau"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Suprascrie inregistrarile care
se potrivesc"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Te rugam selecteaza"
COM_FABRIK_PLEASE_SELECT_A_ROW="Te rugam selecteaza un rand"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Te rugam selecteaza
toate filtrele obligatorii"
COM_FABRIK_PREV="Inapoi"
COM_FABRIK_PREVIOUS="Inapoi"
COM_FABRIK_PRINT="Tipareste"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A fost adaugata o interogare
pentru prefiltrare, dar fara valori adaugate"
COM_FABRIK_RECORDS="inregistrari"
COM_FABRIK_RECORDS_DELETED="Inregistrari sterse"
COM_FABRIK_RECORD_ADDED_UPDATED="Inregistrare
adaugata/actualizata"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Salveaza"
COM_FABRIK_SAVING_TO="salveaza catre"
COM_FABRIK_SEARCH="Cauta"
COM_FABRIK_SELECT="Selecteaza"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Te rugam selecteaza cel putin
un formular"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Selecteaza coloanele pentru a fi
exportate"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Selecteaza ce randuri vrei sa
stergi"
COM_FABRIK_SEND_EMAIL="Trimite email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Ne pare rau,
vizualizarea nu este publicata"
COM_FABRIK_START="Incepe"
COM_FABRIK_SUBSCRIBE_RSS="Subscrie la RSS"
COM_FABRIK_SUCCESS="Succes"
COM_FABRIK_SUM="Suma"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Te rugam verifica daca ai
instalat si activat plugin-ul de sistem pentru Fabrik"
COM_FABRIK_TEXT_DELIMITER="Delimitator text"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Articolul a fost trimis
catre"
COM_FABRIK_TOGGLE="Comuta"
COM_FABRIK_TOTAL="Total"
COM_FABRIK_VALIDATING="Validare"
COM_FABRIK_VALIDATION_ERROR="Eroare la validare"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Afiseaza"
COM_FABRIK_VIEW_ALL="Afiseaza tot"
COM_FABRIK_WHERE="Unde"
COM_FABRIK_YOUR_EMAIL="Email-ul tau"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Email-ul prietenului tau"
COM_FABRIK_YOUR_NAME="Numele tau"
COM_FABRIK_MESSAGE_SUBJECT="Subiect"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/ru-RU/ru-RU.com_fabrik.ini000064400000033201151165346250013056
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Добавить"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Добавить
новый параметр к предыдущим"
COM_FABRIK_ADD_GROUP="Добавить группу"
COM_FABRIK_ADVANCED_SEARCH="Расширенный поиск"
COM_FABRIK_ALL="все"
COM_FABRIK_ALL_OF_THESE_TERMS="все слова"
COM_FABRIK_AND="и"
COM_FABRIK_ANY_OF_THESE_TERMS="любое из слов"
COM_FABRIK_APPLY="Применить"
COM_FABRIK_AVERAGE="Среднее"
COM_FABRIK_BEGINS_WITH="начинается с"
COM_FABRIK_BETWEEN="Между"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Просмотр папок"
COM_FABRIK_CANCEL="Отменить"
COM_FABRIK_CLEAR="Сбросить фильтры"
COM_FABRIK_CLOSE_WINDOW="Закрыть"
COM_FABRIK_CONDITION="Условие"
COM_FABRIK_CONFIRM_DELETE_1="Вы уверены, что хотите
удалить запись?"
COM_FABRIK_CONFIRM_DELETE="Вы уверены, что хотите
удалить %s записей?"
COM_FABRIK_CONFIRM_DROP="Точно хотите удалить все
записи и сбросить ключи таблиц?"
COM_FABRIK_CONTAINS="содержит"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="Мы не можем
найти эту запись"
COM_FABRIK_COUNT="Кол-во"
COM_FABRIK_CSV_ADDED_AND_UPDATED="Добавлено %s
CSV-записей  и обновлено %s записей "
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="Добавлено
%s новых элементов, добавлено %s CSV-записей 
и обновлено %s записей"
COM_FABRIK_CSV_COMPLETE="Экспорт в CSV завершен"
COM_FABRIK_CSV_DOWNLOADING="Загрузка CSV-файла"
COM_FABRIK_CSV_DOWNLOAD_HERE="Скачать отсюда"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Нет доступных
записей для  CSV-экспорта"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Извините,
следующие поля из CSV-файла не найдены в
этой таблице:"
COM_FABRIK_CSV_FILE="CSV-файл"
COM_FABRIK_CSV_IMPORT_HEADING="Импорт: %s"
COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel
<small>(сохраненный с Excel)</small>"
COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel
(экспортированный из Fabrik или Excel в режиме
'Тип файла= текст в Unicode')"
COM_FABRIK_DATE_RANGE_AND="и"
COM_FABRIK_DATE_RANGE_BETWEEN="Между"
COM_FABRIK_DELETE="Удалить"
COM_FABRIK_DELETE_GROUP="Удалить&nbsp;группу"
COM_FABRIK_DISPLAY_NUM="Отображать по"
COM_FABRIK_DROP_EXISTING_DATA="Удалить сyществyющие
данные"
COM_FABRIK_EDIT="Изменить"
COM_FABRIK_ELEMENT="Поле"
COM_FABRIK_EMAIL_MSG="Следующая страница с
сайта %s была отправлена вам от %s ( %s).\n\nВы
можете перейти на нее по следующей
ссылке:\n %s"
COM_FABRIK_EMPTY="Очистить"
COM_FABRIK_END="Конец"
COM_FABRIK_ENDS_WITH="заканчивается на"
COM_FABRIK_EQUALS="равно"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Извините,
шаблон admin только  для адимнистративной
панели  Joomla. Пожалуйста, выберите другой
шаблон."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Бибилотека Curl не
установлена,  некоторые части этой
страницы не удалось выполнить"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Установщик не может
продолжить, пока не разрешена загрузка
файлов. Пожалуйста, используйте метод
«Установить из каталога»."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="точная фраза"
COM_FABRIK_EXPORT="Экспорт"
COM_FABRIK_EXPORT_TO_CSV="Экспорт в CSV"
COM_FABRIK_FAILED_VALIDATION="Неверное значение"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV-файл"
COM_FABRIK_FIELD_CSV_FILE_DESC="Выберите CSV для
загрузки"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Удалить
данные"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Удаляет из
таблицы старые данные перед импортом
данных из CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Разделитель
полей"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Символ,
разделяющий ячейки в CSV-файле"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Формат"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Какой
программой создан CSV-файл (нужно для
установки правильной кодировки
символов)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Перезаписать"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Имеющиеся
записи перезаписываются данными из
CSV-файла"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="или
разделенные табулятором"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Если
установлено, вместо указанного
разделителя полей используется
табулятор"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Ограничитель
текста"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Символ для
выделения текстовых значений в
CSV-файле"
COM_FABRIK_FIELD_DELIMITER="Разделитель полей"
COM_FABRIK_FILE_TYPE="Тип файла"
COM_FABRIK_FILTER="Фильтр"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Список опций
фильтра %s были усечен, т. к. он содержит
больше записей, чем установлено
глобальным параметром Fabrik «Максимальная
длина списка в фильтре»"
COM_FABRIK_FILTER_PLEASE_SELECT="Все"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Фильтры сброшены"
COM_FABRIK_FORM="Форма"
COM_FABRIK_FORM_FIELDS="Поля формы"
COM_FABRIK_FORM_NOT_PUBLISHED="Извините, эта форма
не опyбликована"
COM_FABRIK_FORM_SAVED="Форма сохранена"
COM_FABRIK_GO="Начать"
COM_FABRIK_GREATER_THAN="больше"
COM_FABRIK_GROUP_BY="Группировать по"
COM_FABRIK_IMPORT_CSV="Импортировать CSV"
COM_FABRIK_IMPORT_CSV_FILE="CSV-файл для импорта"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Файл не
выбран"
COM_FABRIK_IMPORT_FROM_CSV="Импорт из CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Включить
вычисления"
COM_FABRIK_INCLUDE_DATA="Включить данные:"
COM_FABRIK_INCLUDE_FILTERS="Включить фильтры:"
COM_FABRIK_INCLUDE_RAW_DATA="Включить данные в
исходном виде:"
COM_FABRIK_INCORRECT_LIST_ID="Неверный id cписка"
COM_FABRIK_IS_EMPTY="ПУСТ"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Форма
использует объединение таблиц, но их
внешние ключи %s не опубликованы. При
сохранении формы возможны проблемы.
Свяжитесь с владельцем сайта по поводу
этой ошибки"
COM_FABRIK_LABEL="Метка"
COM_FABRIK_LESS_THAN="меньше"
COM_FABRIK_LINKED_FORM_ADD="Добавить"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Список"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id списка не
установлен - обработка невозможна"
COM_FABRIK_LIST_NO_DATA_MSG="Нет записей"
COM_FABRIK_LIST_NOT_PUBLISHED="К сожалению, этот
список не опубликован"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Загрyзка из cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Загрyзка из базы
данных"
COM_FABRIK_MEDIAN="Медиана"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Убедитесь, что для
вашей таблицы указан первичный ключ –
без этого Fabrik не сможет обработать
объединение таблиц"
COM_FABRIK_NEXT="След."
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Недостаточно прав
доступа. Пожалуйста, авторизируйтесь."
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="Ни один
соответствующий элемент не найден %s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Ключ для этого
списка не найден"
COM_FABRIK_NO_RECORDS="Записи не найдены"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Записи не
найдены"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Нет данных"
COM_FABRIK_NONE="Нет"
COM_FABRIK_NONE_OF_THESE_TERMS="ни одно из слов"
COM_FABRIK_NOT_EQUALS="не равно"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Извините,  но у вас
нет прав на добавление этой записи"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Извините,  но у вас
нет прав на редактирование этой
записи"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Библиотека Dompdf не
найдена"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Ни один
элемент не в ключен в поиск по всем
полям"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Ваша поисковая
фраза слишком коротка для поиска в
списке, пожалуйста, попробуйте поиск по
более длинной фразе."
COM_FABRIK_OR="или"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Перезаписать
совпадающие записи"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Пожалуйста, выберите"
COM_FABRIK_PLEASE_SELECT_A_ROW="Выберите строку"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Пожалуйста,
выберите все необходимые фильтры"
COM_FABRIK_PREV="Пред."
COM_FABRIK_PREVIOUS="Предыдущее"
COM_FABRIK_PRINT="Печать"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Включен
пре-фильтр запроса, но значение/запрос не
заданы"
COM_FABRIK_RECORDS="записи"
COM_FABRIK_RECORDS_DELETED="Записи yдалены"
COM_FABRIK_RECORD_ADDED_UPDATED="Запись
добавлена/обновлена"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Похоже, вы уже
начинали заполнять эту форму. Продолжим
с той страницы, до которой вы дошли. Чтобы
начать с самого начала, нажмите кнопку
'Сброс'"
COM_FABRIK_SAVE="Сохранить"
COM_FABRIK_SAVING_TO="сохранение в"
COM_FABRIK_SEARCH="Поиск"
COM_FABRIK_SELECT="Выбрать"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Пожалуйста,
установите хотя бы один фильтр"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Выберите столбцы
для экспорта"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Выберите строки
для удаления"
COM_FABRIK_SEND_EMAIL="Отправить email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Извините,
эта визyализация не опyбликована"
COM_FABRIK_START="Начало"
COM_FABRIK_SUBSCRIBE_RSS="Подписка RSS"
COM_FABRIK_SUCCESS="Успешно"
COM_FABRIK_SUM="Сумма"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Проверьте, что у
вас установлен и включен Fabrik system plugin"
COM_FABRIK_TEXT_DELIMITER="Ограничитель текста"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Этот элемент
отправлен на"
COM_FABRIK_TOGGLE="Переключить"
COM_FABRIK_TOTAL="Всего"
COM_FABRIK_VALIDATING="Проверка ввода"
COM_FABRIK_VALIDATION_ERROR="Ошибка при
проверке"
COM_FABRIK_VALUE="Значение"
COM_FABRIK_VIEW="Просмотр"
COM_FABRIK_VIEW_ALL="Просмотреть все"
COM_FABRIK_WHERE="Где"
COM_FABRIK_YOUR_EMAIL="Ваш email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Email вашего друга"
COM_FABRIK_YOUR_NAME="Ваше имя"
COM_FABRIK_MESSAGE_SUBJECT="Тема"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Недопустимые
дополнительные параметры указанные для
элемента '%s': %s"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="Лог"
COM_FABRIK_RUN="Пуск"
COM_FABRIK_VALIDATION="Проверка"
COM_FABRIK_EVAL_ERROR_USER_WARNING="Произошла ошибка с
полем Eval - пожалуйста, сообщите владелецу
веб-сайта."
COM_FABRIK_LIST_TABS_ALL="Все"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Сохранить"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Применить"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Назад"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Удалить"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Сброс"
language/sk-SK/sk-SK.com_fabrik.ini000064400000025447151165346250013027
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Pridať"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Pridať novú možnosť k
týmto hore"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Rozšírené vyhľadávanie"
COM_FABRIK_ALL="všetko"
COM_FABRIK_ALL_OF_THESE_TERMS="Všetky tieto podmienky"
COM_FABRIK_AND="A"
COM_FABRIK_ANY_OF_THESE_TERMS="Ktorákoľvek z týchto podmienok"
COM_FABRIK_APPLY="Použiť"
COM_FABRIK_AVERAGE="Priemer"
COM_FABRIK_BEGINS_WITH="ZAČÍNA NA"
COM_FABRIK_BETWEEN="Medzi"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Prechádzať zložky"
COM_FABRIK_CANCEL="Zrušiť"
COM_FABRIK_CLEAR="Vymazať filtre"
COM_FABRIK_CLOSE_WINDOW="Zavrieť"
COM_FABRIK_CONDITION="Stav"
COM_FABRIK_CONFIRM_DELETE_1="Ste si istý, že chcete vymazať tento
záznam?"
COM_FABRIK_CONFIRM_DELETE="Ste si istý, že chcete vymazať %s
záznamov?"
COM_FABRIK_CONFIRM_DROP="Skutočne si prajete vymazať všetky
záznamy a nastaviť kľuč v tejto tabuľke na 0?"
COM_FABRIK_CONTAINS="OBSAHUJE"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Počet"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s záznamov z CSV bolo pridaných a
%s záznamov bolo aktualizovaných"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nových
elementov bolo pridaných, %s záznamov z CSV bolo pridaných a %s
záznamov bolo aktualizovaných"
COM_FABRIK_CSV_COMPLETE="Export do CSV bol dokončený"
COM_FABRIK_CSV_DOWNLOADING="Stiahnutie CSV súboru"
COM_FABRIK_CSV_DOWNLOAD_HERE="Stiahnuť tu"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Žiadne záznamy nie sú dostupné
pre CSV export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Prepáčte, nasledujúce položky
z CSV súboru sa nenachádzajú v tejto tabuľke:"
COM_FABRIK_CSV_FILE="CSV súbor"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="a"
COM_FABRIK_DATE_RANGE_BETWEEN="Medzi"
COM_FABRIK_DELETE="Vymazať"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Ukázať #"
COM_FABRIK_DROP_EXISTING_DATA="Zahodiť existujúce dáta"
COM_FABRIK_EDIT="Editovať"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Nasledujúca stránka z webstránky %s Vám bola
odoslaná od %s ( %s).\n\nMôžte na ňu prejsť cez nasledujúcu URL:\n
%s"
COM_FABRIK_EMPTY="Prázdne"
COM_FABRIK_END="Koniec"
COM_FABRIK_ENDS_WITH="KONČÍ NA"
COM_FABRIK_EQUALS="JE ROVNÉ"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Prepáčte, admin
šablóna je len pre použitie s Joomla administrátorskými stránkami.
Prosím, vyberte si inú šablónu."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Knižnica Curl nie je
nainštalovaná, niektoré časti tejto stránky sa nespustili"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Inštalátor nemôže pokračovať
kým je povolený upload súborov. Prosím použite inštaláciu zo
zložky."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Presná fráza"
COM_FABRIK_EXPORT="Export"
COM_FABRIK_EXPORT_TO_CSV="Export do CSV"
COM_FABRIK_FAILED_VALIDATION="Overenie zlyhalo"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV súbor"
COM_FABRIK_FIELD_CSV_FILE_DESC="Vybrať CSV súbor na upload"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Zahodiť dáta"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Pred importom CSV dát
vymaže existujúce dáta zo zoznamu"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Oddeľovač
položiek"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Znak použitý v CSV
súbore na oddelenie dát buniek"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formát"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Ktorá aplikácia exportovala
CSV súbor (potrebné pre potvrdenie správneho kódovania)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Prepísať"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Prepíše všetky
vyhovujúce záznamy dátami z CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="alebo TAB
oddeľovať"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Ak je zaškrtnuté,
tak sa oddeľovač ignoruje a namiesto neho sa použije TAB."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Textový
oddeľovač"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Znak použitý v CSV
súbore na uzavretie textových hodnôt"
COM_FABRIK_FIELD_DELIMITER="Oddeľovač položiek"
COM_FABRIK_FILE_TYPE="Typ súboru"
COM_FABRIK_FILTER="Filter"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Možnosť filtra %s bola orezaná
nakoľko obsahovala viac záznamov ako umožňuje Fabrik globálna
konfiguračná premenná 'Filter List Max'."
COM_FABRIK_FILTER_PLEASE_SELECT="Všetky"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Filtre vymazané"
COM_FABRIK_FORM="Formulár"
COM_FABRIK_FORM_FIELDS="Formulárové položky"
COM_FABRIK_FORM_NOT_PUBLISHED="Prepáčte, tento formulár nie je
publikovaný"
COM_FABRIK_FORM_SAVED="Formulár uložený"
COM_FABRIK_GO="Ísť"
COM_FABRIK_GREATER_THAN="VÄČŠÍ AKO"
COM_FABRIK_GROUP_BY="Zoskupiť podľa"
COM_FABRIK_IMPORT_CSV="Importovať CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importovať CSV súbor"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nie je vybraný žiaden
súbor"
COM_FABRIK_IMPORT_FROM_CSV="Importovať z CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Vrátane kalkulácií"
COM_FABRIK_INCLUDE_DATA="Pripojiť dáta:"
COM_FABRIK_INCLUDE_FILTERS="Pripojiť filtre:"
COM_FABRIK_INCLUDE_RAW_DATA="Pripojiť surové dáta:"
COM_FABRIK_INCORRECT_LIST_ID="Chybné id zoznamu"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Tento formulár používa
pripojené dáta, ale ich cudzí kľúč %s nie je publikovaný. To
spôsobí problém pri ukladaní formulára. Prosím kontaktujte majiteľa
stránky ohľadne tohto problému."
COM_FABRIK_LABEL="Označenie"
COM_FABRIK_LESS_THAN="MENEJ AKO"
COM_FABRIK_LINKED_FORM_ADD="Pridať"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id zoznamu nie je nastavené -
nemôžem vykresliť"
COM_FABRIK_LIST_NO_DATA_MSG="Žiadne záznamy"
COM_FABRIK_LIST_NOT_PUBLISHED="Prepáčte, tento zoznam nie je
publikovaný"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Nahrávam z cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Nahrávam z databázy"
COM_FABRIK_MEDIAN="Medián"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Prosím uistite sa sa, že ste
vybrali primárny kľúč pre vašu tabuľku, Fabrik nemôže spracovať
prepojenie kým tak neurobíte"
COM_FABRIK_NEXT="Ďalej"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Nedostatočné prístupové práva.
Prosím prihlaste sa"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nenájdený žiaden kľúč
pre tento zoznam"
COM_FABRIK_NO_RECORDS="Nenájdené žiadne záznamy"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Nenájdené žiadne záznamy"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Žiadne dáta"
COM_FABRIK_NONE="Žiadna"
COM_FABRIK_NONE_OF_THESE_TERMS="Žiadna z týchto podmienok"
COM_FABRIK_NOT_EQUALS="NIE JE ROVNÉ"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Prepáčte, ale nemáte
oprávnenie na pridanie tohto záznamu"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Prepáčte, ale nie ste
oprávnený na editáciu tohto záznamu"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Knižnica Dompdf nenájdená"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Žiadne prvky neboli
nastavené vo vyhľadávaní všetkého"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Vaša vyhľadávacia fráza
je príliš krátka na vyhľadanie zoznamu, prosím, vyskúšajte hladať
podľa dlhšej frázy"
COM_FABRIK_OR="alebo"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Prepísa vyhovujúce
záznamy"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Prosím vyberte"
COM_FABRIK_PLEASE_SELECT_A_ROW="Prosím vyberte riadok"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Prosím vyberte všetky
povinné filtre"
COM_FABRIK_PREV="Predch"
COM_FABRIK_PREVIOUS="Predchádzajúce"
COM_FABRIK_PRINT="Tlačiť"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Dotaz na predfiltrovanie bol
nastaveny, alebo nebola nastavená žiadna hodnota/dotaz"
COM_FABRIK_RECORDS="záznamov"
COM_FABRIK_RECORDS_DELETED="Záznamov vymazaných"
COM_FABRIK_RECORD_ADDED_UPDATED="Záznamov
pridaných/aktualizovaných"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Zdá sa, že ste už začali
vypĺňať formulár. Začali ste z naposledy navštívenej stránky. Ak
chcete reštartovať formulár stlačte tlačidlo
"_QQ_"vyčistiť"_QQ_"."
COM_FABRIK_SAVE="Uložiť"
COM_FABRIK_SAVING_TO="ukladám do"
COM_FABRIK_SEARCH="Vyhľadať"
COM_FABRIK_SELECT="Vybrať"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Prosím vyberte aspoň jeden
filter"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Vyberte stĺpec na export"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Vyberte nejaké riadky na
vymazanie"
COM_FABRIK_SEND_EMAIL="Odoslať email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Prepáčte, ale
táto vizualizácia nie je publikovaná"
COM_FABRIK_START="Štart"
COM_FABRIK_SUBSCRIBE_RSS="Prihlásiť RSS"
COM_FABRIK_SUCCESS="Úspešné"
COM_FABRIK_SUM="Súčet"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Prosím uistite sa, že máte
nainštalovaný a publikovaný systémový plugin Fabrik"
COM_FABRIK_TEXT_DELIMITER="Textový oddeľovač"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Táto položka bola odoslaná
na"
COM_FABRIK_TOGGLE="Prepnúť"
COM_FABRIK_TOTAL="Celkom"
COM_FABRIK_VALIDATING="Overujem"
COM_FABRIK_VALIDATION_ERROR="Overujem chybu"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Zobraziť"
COM_FABRIK_VIEW_ALL="Zobraziť všetko"
COM_FABRIK_WHERE="Kde"
COM_FABRIK_YOUR_EMAIL="Váš email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Email Vášho priateľa"
COM_FABRIK_YOUR_NAME="Vaše meno"
COM_FABRIK_MESSAGE_SUBJECT="Predmet"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/sk-SK/sk-SK.com_fabrik.sys.ini000064400000025254151165346250013640
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Pridať"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Pridať novú možnosť k
týmto hore"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Rozšírené vyhľadávanie"
COM_FABRIK_ALL="všetko"
COM_FABRIK_ALL_OF_THESE_TERMS="Všetky tieto podmienky"
COM_FABRIK_AND="A"
COM_FABRIK_ANY_OF_THESE_TERMS="Ktorákoľvek z týchto podmienok"
COM_FABRIK_APPLY="Použiť"
COM_FABRIK_AVERAGE="Priemer"
COM_FABRIK_BEGINS_WITH="ZAČÍNA NA"
COM_FABRIK_BETWEEN="Medzi"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Prechádzať zložky"
COM_FABRIK_CANCEL="Zrušiť"
COM_FABRIK_CLEAR="Vymazať filtre"
COM_FABRIK_CLOSE_WINDOW="Zavrieť"
COM_FABRIK_CONDITION="Stav"
COM_FABRIK_CONFIRM_DELETE_1="Ste si istý, že chcete vymazať tento
záznam?"
COM_FABRIK_CONFIRM_DELETE="Ste si istý, že chcete vymazať %s
záznamov?"
COM_FABRIK_CONFIRM_DROP="Skutočne si prajete vymazať všetky
záznamy a nastaviť kľuč v tejto tabuľke na 0?"
COM_FABRIK_CONTAINS="OBSAHUJE"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Počet"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s záznamov z CSV bolo pridaných a
%s záznamov bolo aktualizovaných"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s nových
elementov bolo pridaných, %s záznamov z CSV bolo pridaných a %s
záznamov bolo aktualizovaných"
COM_FABRIK_CSV_COMPLETE="Export do CSV bol dokončený"
COM_FABRIK_CSV_DOWNLOADING="Stiahnutie CSV súboru"
COM_FABRIK_CSV_DOWNLOAD_HERE="Stiahnuť tu"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="Žiadne záznamy nie sú dostupné
pre CSV export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Prepáčte, nasledujúce položky
z CSV súboru sa nenachádzajú v tejto tabuľke:"
COM_FABRIK_CSV_FILE="CSV súbor"
COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="a"
COM_FABRIK_DATE_RANGE_BETWEEN="Medzi"
COM_FABRIK_DELETE="Vymazať"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Ukázať #"
COM_FABRIK_DROP_EXISTING_DATA="Zahodiť existujúce dáta"
COM_FABRIK_EDIT="Editovať"
COM_FABRIK_ELEMENT="Element"
COM_FABRIK_EMAIL_MSG="Nasledujúca stránka z webstránky %s Vám bola
odoslaná od %s ( %s).\n\nMôžte na ňu prejsť cez nasledujúcu URL:\n
%s"
COM_FABRIK_EMPTY="Prázdne"
COM_FABRIK_END="Koniec"
COM_FABRIK_ENDS_WITH="KONČÍ NA"
COM_FABRIK_EQUALS="JE ROVNÉ"
COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Prepáčte, admin
šablóna je len pre použitie s Joomla administrátorskými stránkami.
Prosím, vyberte si inú šablónu."
COM_FABRIK_ERR_CURL_NOT_INSTALLED="Knižnica Curl nie je
nainštalovaná, niektoré časti tejto stránky sa nespustili"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
COM_FABRIK_ERR_UPLOADS_DISABLED="Inštalátor nemôže pokračovať
kým je povolený upload súborov. Prosím použite inštaláciu zo
zložky."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Presná fráza"
COM_FABRIK_EXPORT="Export"
COM_FABRIK_EXPORT_TO_CSV="Export do CSV"
COM_FABRIK_FAILED_VALIDATION="Overenie zlyhalo"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV súbor"
COM_FABRIK_FIELD_CSV_FILE_DESC="Vybrať CSV súbor na upload"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Zahodiť dáta"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Pred importom CSV dát
vymaže existujúce dáta zo zoznamu"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Oddeľovač
položiek"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Znak použitý v CSV
súbore na oddelenie dát buniek"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Formát"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Ktorá aplikácia exportovala
CSV súbor (potrebné pre potvrdenie správneho kódovania)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Prepísať"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Prepíše všetky
vyhovujúce záznamy dátami z CSV"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="alebo TAB
oddeľovať"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Ak je zaškrtnuté,
tak sa oddeľovač ignoruje a namiesto neho sa použije TAB."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Textový
oddeľovač"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Znak použitý v CSV
súbore na uzavretie textových hodnôt"
COM_FABRIK_FIELD_DELIMITER="Oddeľovač položiek"
COM_FABRIK_FILE_TYPE="Typ súboru"
COM_FABRIK_FILTER="Filter"
COM_FABRIK_FILTER_LIST_MAX_REACHED="Možnosť filtra %s bola orezaná
nakoľko obsahovala viac záznamov ako umožňuje Fabrik globálna
konfiguračná premenná 'Filter List Max'."
COM_FABRIK_FILTER_PLEASE_SELECT="Všetky"
COM_FABRIK_FILTERS_CLEARED="Filtre vymazané"
COM_FABRIK_FORM="Formulár"
COM_FABRIK_FORM_FIELDS="Formulárové položky"
COM_FABRIK_FORM_NOT_PUBLISHED="Prepáčte, tento formulár nie je
publikovaný"
COM_FABRIK_FORM_SAVED="Formulár uložený"
COM_FABRIK_GO="Ísť"
COM_FABRIK_GREATER_THAN="VÄČŠÍ AKO"
COM_FABRIK_GROUP_BY="Zoskupiť podľa"
COM_FABRIK_IMPORT_CSV="Importovať CSV"
COM_FABRIK_IMPORT_CSV_FILE="Importovať CSV súbor"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Nie je vybraný žiaden
súbor"
COM_FABRIK_IMPORT_FROM_CSV="Importovať z CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Vrátane kalkulácií"
COM_FABRIK_INCLUDE_DATA="Pripojiť dáta:"
COM_FABRIK_INCLUDE_FILTERS="Pripojiť filtre:"
COM_FABRIK_INCLUDE_RAW_DATA="Pripojiť surové dáta:"
COM_FABRIK_INCORRECT_LIST_ID="Chybné id zoznamu"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Tento formulár používa
pripojené dáta, ale ich cudzí kľúč %s nie je publikovaný. To
spôsobí problém pri ukladaní formulára. Prosím kontaktujte majiteľa
stránky ohľadne tohto problému."
COM_FABRIK_LABEL="Označenie"
COM_FABRIK_LESS_THAN="MENEJ AKO"
COM_FABRIK_LINKED_FORM_ADD="Pridať"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id zoznamu nie je nastavené -
nemôžem vykresliť"
COM_FABRIK_LIST_NO_DATA_MSG="Žiadne záznamy"
COM_FABRIK_LIST_NOT_PUBLISHED="Prepáčte, tento zoznam nie je
publikovaný"
COM_FABRIK_LOADING="Nahrávam..."
COM_FABRIK_LOADING_FROM_COOKIE="Nahrávam z cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Nahrávam z databázy"
COM_FABRIK_MEDIAN="Medián"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Prosím uistite sa sa, že ste
vybrali primárny kľúč pre vašu tabuľku, Fabrik nemôže spracovať
prepojenie kým tak neurobíte"
COM_FABRIK_NEXT="Ďalej"
COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Nedostatočné prístupové práva.
Prosím prihlaste sa"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Nenájdený žiaden kľúč
pre tento zoznam"
COM_FABRIK_NO_RECORDS="Nenájdené žiadne záznamy"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Žiadne dáta"
COM_FABRIK_NONE="Žiadna"
COM_FABRIK_NONE_OF_THESE_TERMS="Žiadna z týchto podmienok"
COM_FABRIK_NOT_EQUALS="NIE JE ROVNÉ"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Prepáčte, ale nemáte
oprávnenie na pridanie tohto záznamu"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Prepáčte, ale nie ste
oprávnený na editáciu tohto záznamu"
COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Knižnica Dompdf nenájdená"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="Žiadne prvky neboli
nastavené vo vyhľadávaní všetkého"
COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Vaša vyhľadávacia fráza
je príliš krátka na vyhľadanie zoznamu, prosím, vyskúšajte hladať
podľa dlhšej frázy"
COM_FABRIK_OR="alebo"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Prepísa vyhovujúce
záznamy"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Prosím vyberte"
COM_FABRIK_PLEASE_SELECT_A_ROW="Prosím vyberte riadok"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Prosím vyberte všetky
povinné filtre"
COM_FABRIK_PREV="Predch"
COM_FABRIK_PREVIOUS="Predchádzajúce"
COM_FABRIK_PRINT="Tlačiť"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Dotaz na predfiltrovanie bol
nastaveny, alebo nebola nastavená žiadna hodnota/dotaz"
COM_FABRIK_RECORDS="záznamov"
COM_FABRIK_RECORDS_DELETED="Záznamov vymazaných"
COM_FABRIK_RECORD_ADDED_UPDATED="Záznamov
pridaných/aktualizovaných"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Uložiť"
COM_FABRIK_SAVING_TO="ukladám do"
COM_FABRIK_SEARCH="Vyhľadať"
COM_FABRIK_SELECT="Vybrať"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Prosím vyberte aspoň jeden
filter"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Vyberte stĺpec na export"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Vyberte nejaké riadky na
vymazanie"
COM_FABRIK_SEND_EMAIL="Odoslať email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Prepáčte, ale
táto vizualizácia nie je publikovaná"
COM_FABRIK_START="Štart"
COM_FABRIK_SUBSCRIBE_RSS="Prihlásiť RSS"
COM_FABRIK_SUCCESS="Úspešné"
COM_FABRIK_SUM="Súčet"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Prosím uistite sa, že máte
nainštalovaný a publikovaný systémový plugin Fabrik"
COM_FABRIK_TEXT_DELIMITER="Textový oddeľovač"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Táto položka bola odoslaná
na"
COM_FABRIK_TOGGLE="Prepnúť"
COM_FABRIK_TOTAL="Celkom"
COM_FABRIK_VALIDATING="Overujem"
COM_FABRIK_VALIDATION_ERROR="Overujem chybu"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Zobraziť"
COM_FABRIK_VIEW_ALL="Zobraziť všetko"
COM_FABRIK_WHERE="Kde"
COM_FABRIK_YOUR_EMAIL="Váš email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Email Vášho priateľa"
COM_FABRIK_YOUR_NAME="Vaše meno"
COM_FABRIK_MESSAGE_SUBJECT="Predmet"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/sr-YU/sr-YU.com_fabrik.ini000064400000024457151165346250013105
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Dodaj"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="Obriši"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Uredi"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
COM_FABRIK_FORM="Forma"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Dodaj"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Pregled"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/sr-YU/sr-YU.com_fabrik.sys.ini000064400000024312151165346260013711
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Dodaj"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
; COM_FABRIK_ADVANCED_SEARCH="Advanced search"
; COM_FABRIK_ALL="all"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
; COM_FABRIK_APPLY="Apply"
; COM_FABRIK_AVERAGE="Average"
; COM_FABRIK_BEGINS_WITH="BEGINS WITH"
; COM_FABRIK_BETWEEN="Between"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
; COM_FABRIK_BROWSE_FOLDERS="Browse folders"
; COM_FABRIK_CANCEL="Cancel"
; COM_FABRIK_CLEAR="Clear filters"
; COM_FABRIK_CLOSE_WINDOW="Close"
; COM_FABRIK_CONDITION="Condition"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
; COM_FABRIK_CONTAINS="CONTAINS"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
; COM_FABRIK_CSV_DOWNLOAD_HERE="Download here"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
; COM_FABRIK_CSV_FILE="CSV File"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
; COM_FABRIK_DATE_RANGE_BETWEEN="Between"
COM_FABRIK_DELETE="Obriši"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Uredi"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
; COM_FABRIK_EXPORT="Export"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
; COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV File"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
; COM_FABRIK_FILTER_PLEASE_SELECT="All"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
COM_FABRIK_FORM="Forma"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
; COM_FABRIK_GO="Go"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
; COM_FABRIK_LABEL="Label"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="Dodaj"
; COM_FABRIK_LIST_SHORTCUTS_ADD="a"
; COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
; COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
; COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
; COM_FABRIK_LOADING_FROM_DATABASE="Loading from database"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
; COM_FABRIK_NEXT="Next"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Pregled"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
; COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/tr-TR/tr-TR.com_fabrik.ini000064400000024373151165346260013065
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Ekle"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Gelişmiş arama"
COM_FABRIK_ALL="tümü"
COM_FABRIK_ALL_OF_THESE_TERMS="Bu şartların hepsi"
COM_FABRIK_AND="Ve"
COM_FABRIK_ANY_OF_THESE_TERMS="Bu şartlardan herhangibiri"
COM_FABRIK_APPLY="Uygula"
COM_FABRIK_AVERAGE="Ortalama"
COM_FABRIK_BEGINS_WITH="BİRLİKTE BAŞLA"
COM_FABRIK_BETWEEN="Arasında"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Klasörlere gözat"
COM_FABRIK_CANCEL="İptal"
COM_FABRIK_CLEAR="Flitreleri temizle"
COM_FABRIK_CLOSE_WINDOW="Kapat"
COM_FABRIK_CONDITION="Durum"
COM_FABRIK_CONFIRM_DELETE_1="Bu kayıtı silmek istediğinden emin
misin?"
COM_FABRIK_CONFIRM_DELETE="%s kayıtı silmek istediğinden emin
misin?"
COM_FABRIK_CONFIRM_DROP="Tüm kayıtları silmek ve bu tabloları
varsayılan olarak 0lamak mı istiyorsunuz ?"
COM_FABRIK_CONTAINS="İÇERİK"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV kayıt eklendi ve %s kayıt
güncellendi"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
COM_FABRIK_CSV_DOWNLOAD_HERE="Buradan indir"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV Dosyası"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="Ve"
COM_FABRIK_DATE_RANGE_BETWEEN="Arasında"
COM_FABRIK_DELETE="Sil"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Göster #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Düzenle"
COM_FABRIK_ELEMENT="Eleman"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
COM_FABRIK_EMPTY="Boş"
COM_FABRIK_END="son"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
COM_FABRIK_EXPORT="Dışa aktar"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV Dosyası"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="Tümü"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
COM_FABRIK_GO="Git"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Etiket"
COM_FABRIK_LESS_THAN="DAHA AZ"
COM_FABRIK_LINKED_FORM_ADD="Ekle"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
COM_FABRIK_LIST_NO_DATA_MSG="Kayıt yok"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Çerezlerden yükleniyor"
COM_FABRIK_LOADING_FROM_DATABASE="Veritabanından yükleniyor"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
COM_FABRIK_NEXT="İleri"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Bu liste için anahtar
bulunamadı"
COM_FABRIK_NO_RECORDS="Kayıt bulunamadı"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Veri yok"
COM_FABRIK_NONE="Hiç"
COM_FABRIK_NONE_OF_THESE_TERMS="Bu öğelerden hiçbiri değil"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="Veya"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Lütfen seçin"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
COM_FABRIK_RECORDS="kayıtlar"
COM_FABRIK_RECORDS_DELETED="Kayıtlar silindi"
COM_FABRIK_RECORD_ADDED_UPDATED="Kayıt eklendi/güncellendi"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Kaydet"
COM_FABRIK_SAVING_TO="Kaydediliyor"
COM_FABRIK_SEARCH="Ara"
COM_FABRIK_SELECT="Seç"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Lütfen en az bir filtre
seçin"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
COM_FABRIK_SEND_EMAIL="E-posta gönder"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
COM_FABRIK_START="Başla"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
COM_FABRIK_SUCCESS="Başarılı"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Görünüm"
COM_FABRIK_VIEW_ALL="Hepsini göster"
COM_FABRIK_WHERE="Yer"
COM_FABRIK_YOUR_EMAIL="Senin e-postan"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Arkadaşının e-postası"
COM_FABRIK_YOUR_NAME="Senin ismin"
COM_FABRIK_MESSAGE_SUBJECT="Konu"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/tr-TR/tr.com_fabrik.ini000064400000022157151165346260012540
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
; 

COM_FABRIK_ADD="Ekle"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
COM_FABRIK_ADD_GROUP="Grup ekle"
COM_FABRIK_ADVANCED_SEARCH="Gelişmiş arama"
COM_FABRIK_ALL="tümü"
COM_FABRIK_ALL_OF_THESE_TERMS="Bu şartların hepsi"
COM_FABRIK_AND="Ve"
COM_FABRIK_ANY_OF_THESE_TERMS="Bu şartlardan herhangibiri"
COM_FABRIK_APPLY="Uygula"
COM_FABRIK_AVERAGE="Ortalama"
COM_FABRIK_BEGINS_WITH="BİRLİKTE BAŞLA"
COM_FABRIK_BETWEEN="Arasında"
COM_FABRIK_BROWSE_FOLDERS="Klasörlere gözat"
COM_FABRIK_CANCEL="İptal"
COM_FABRIK_CLEAR="Flitreleri temizle"
COM_FABRIK_CLOSE_WINDOW="Kapat"
COM_FABRIK_CONDITION="Durum"
COM_FABRIK_CONFIRM_DELETE_1="Bu kayıtı silmek istediğinden emin
misin?"
COM_FABRIK_CONFIRM_DELETE="%s kayıtı silmek istediğinden emin
misin?"
COM_FABRIK_CONFIRM_DROP="Tüm kayıtları silmek ve bu tabloları
varsayılan olarak 0lamak mı istiyorsunuz ?"
COM_FABRIK_CONTAINS="İÇERİK"
; COM_FABRIK_COUNT="Count"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV kayıt eklendi ve %s kayıt
güncellendi"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
COM_FABRIK_CSV_DOWNLOAD_HERE="Buradan indir"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV Dosyası"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel <small>(format saved
from Excel)</small>"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel <small>(format
exported by Fabrik or by Excel with option 'File type= unicode
text')</small>" 
COM_FABRIK_DATE_RANGE_AND="Ve"
COM_FABRIK_DATE_RANGE_BETWEEN="Arasında"
COM_FABRIK_DELETE="Sil"
COM_FABRIK_DELETE_GROUP="Grubu sil"
COM_FABRIK_DISPLAY_NUM="Göster #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="Düzenle"
COM_FABRIK_ELEMENT="Eleman"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
COM_FABRIK_EMPTY="Boş"
COM_FABRIK_END="son"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_EXACT_TERMS="Exact phrase"
COM_FABRIK_EXPORT="Dışa aktar"
; COM_FABRIK_EXPORT_TO_CSV="Export to CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV Dosyası"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Format"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Overwrite"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
; COM_FABRIK_FILE_TYPE="File type"
; COM_FABRIK_FILTER="Filter"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="Tümü"
; COM_FABRIK_FILTERS_CLEARED="Filters cleared"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
COM_FABRIK_GO="Git"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
; COM_FABRIK_IMPORT_CSV="Import CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="Etiket"
COM_FABRIK_LESS_THAN="DAHA AZ"
COM_FABRIK_LINKED_FORM_ADD="Ekle"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="Tabl"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
COM_FABRIK_LIST_NO_DATA_MSG="Kayıt yok"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
COM_FABRIK_LOADING="Yükleniyor"
COM_FABRIK_LOADING_FROM_COOKIE="Çerezlerden yükleniyor"
COM_FABRIK_LOADING_FROM_DATABASE="Veritabanından yükleniyor"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
COM_FABRIK_NEXT="İleri"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Bu liste için anahtar
bulunamadı"
COM_FABRIK_NO_RECORDS="Kayıt bulunamadı"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Kayıt bulunamadı"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Veri yok"
COM_FABRIK_NONE="Hiç"
COM_FABRIK_NONE_OF_THESE_TERMS="Bu öğelerden hiçbiri değil"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="Veya"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="Download current view as PDF file"
COM_FABRIK_PLEASE_SELECT="Lütfen seçin"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
COM_FABRIK_RECORDS="kayıtlar"
COM_FABRIK_RECORDS_DELETED="Kayıtlar silindi"
COM_FABRIK_RECORD_ADDED_UPDATED="Kayıt eklendi/güncellendi"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Kaydet"
COM_FABRIK_SAVING_TO="Kaydediliyor"
COM_FABRIK_SEARCH="Ara"
COM_FABRIK_SELECT="Seç"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Lütfen en az bir filtre
seçin"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
COM_FABRIK_SEND_EMAIL="E-posta gönder"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
COM_FABRIK_START="Başla"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
COM_FABRIK_SUCCESS="Başarılı"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
COM_FABRIK_VALUE="Değer"
COM_FABRIK_VIEW="Görünüm"
COM_FABRIK_VIEW_ALL="Hepsini göster"
COM_FABRIK_WHERE="Yer"
COM_FABRIK_YOUR_EMAIL="Senin e-postan"
COM_FABRIK_YOUR_FRIENDS_EMAIL="Arkadaşının e-postası"
COM_FABRIK_YOUR_NAME="Senin ismin"
COM_FABRIK_MESSAGE_SUBJECT="Konu"
language/uk-UA/uk-UA.com_fabrik.ini000064400000030726151165346260013010
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Додати"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Додати новий
параметр до попередніх"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Розширений пошук"
COM_FABRIK_ALL="усі"
COM_FABRIK_ALL_OF_THESE_TERMS="Усі вони"
COM_FABRIK_AND="і"
COM_FABRIK_ANY_OF_THESE_TERMS="Один з них"
COM_FABRIK_APPLY="Застосувати"
COM_FABRIK_AVERAGE="Середнє"
COM_FABRIK_BEGINS_WITH="Починається з"
COM_FABRIK_BETWEEN="Між"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Перегляд каталогів"
COM_FABRIK_CANCEL="Скасувати"
COM_FABRIK_CLEAR="Скасувати фільтри"
COM_FABRIK_CLOSE_WINDOW="Закрити"
COM_FABRIK_CONDITION="Умова"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Точно хочете видалити
ці записи?"
COM_FABRIK_CONFIRM_DROP="Точно хочете видалити
ВСІ записи та скинути ключі таблиць?"
COM_FABRIK_CONTAINS="Містить"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Лічильник"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="Експорт в CSV
завершений"
COM_FABRIK_CSV_DOWNLOADING="Завантаження
CSV-файлу"
COM_FABRIK_CSV_DOWNLOAD_HERE="Завантажити сюди"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Вибачте, наступні
поля CSV-файлу не знайдені в цій
таблиці:"
COM_FABRIK_CSV_FILE="CSV-файл"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="і"
COM_FABRIK_DATE_RANGE_BETWEEN="Між"
COM_FABRIK_DELETE="Видалити"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Відображати по"
COM_FABRIK_DROP_EXISTING_DATA="Видалити існуючі
дані"
COM_FABRIK_EDIT="Змінити"
COM_FABRIK_ELEMENT="Елемент"
COM_FABRIK_EMAIL_MSG="Наступна сторінка з
web-сайту "_QQ_"%s"_QQ_" була
відправлена Вам від %s ( %s).\n\nВи можете
перейти за наступним посиланням:\n %s"
COM_FABRIK_EMPTY="Пyсто"
COM_FABRIK_END="Кінець"
COM_FABRIK_ENDS_WITH="Закінчується"
COM_FABRIK_EQUALS="Дорівнює"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Точна фраза"
COM_FABRIK_EXPORT="Експорт"
COM_FABRIK_EXPORT_TO_CSV="Експорт в CSV"
COM_FABRIK_FAILED_VALIDATION="Невірне значення"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV-файл"
COM_FABRIK_FIELD_CSV_FILE_DESC="Оберіть CSV для
вивантаження"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Видалити
дані"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Видаляє із
таблиці старі дані перед імпортом даних
із CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Роздільник
полів"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Символ, що
розділяє комірки в CSV-файлі"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Формат"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Якою програмою
створений CSV-файл (необхідно для
встановлення правильного кодування
символів)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Перезаписати"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Наявні записи
перезаписуються даними з CSV-файлу"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="або
розділені табулятором"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Якщо
встановлено, замість вказанного
роздільника полів використовується
табулятор."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Обмежувач
тексту"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Символ для
виділення текстових значень в
CSV-файлі"
COM_FABRIK_FIELD_DELIMITER="Роздільник полів"
COM_FABRIK_FILE_TYPE="Тип файлу"
COM_FABRIK_FILTER="Фільтр"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="Усі"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="Фільтри скинуті"
COM_FABRIK_FORM="Форма"
COM_FABRIK_FORM_FIELDS="Поля форми"
COM_FABRIK_FORM_NOT_PUBLISHED="Вибачте, ця форма не
опyблікована"
COM_FABRIK_FORM_SAVED="Форма збережена"
COM_FABRIK_GO="Почати"
COM_FABRIK_GREATER_THAN="Більше"
COM_FABRIK_GROUP_BY="Групувати за"
COM_FABRIK_IMPORT_CSV="Імпортувати CSV"
COM_FABRIK_IMPORT_CSV_FILE="CSV-файл для імпорту"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Файл не
обраний"
COM_FABRIK_IMPORT_FROM_CSV="Імпорт із CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Включити
обчислення"
COM_FABRIK_INCLUDE_DATA="Включити дані:"
COM_FABRIK_INCLUDE_FILTERS="Включити фільтри:"
COM_FABRIK_INCLUDE_RAW_DATA="Включити дані в
початковому вигляді:"
COM_FABRIK_INCORRECT_LIST_ID="Невірний id
таблиці/списку"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Форма
використовує об'єднання таблиць, але
їх зовнішні ключі %s не опубліковані. При
збереженні форми можливі проблеми.
Зв'яжіться з власником сайту з приводу
цієї помилки"
COM_FABRIK_LABEL="Мітка"
COM_FABRIK_LESS_THAN="Менше"
COM_FABRIK_LINKED_FORM_ADD="Додати"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id таблиці не
встановлений - обробка неможлива"
COM_FABRIK_LIST_NO_DATA_MSG="Немає записів"
COM_FABRIK_LIST_NOT_PUBLISHED="На жаль, ця таблиця не
опублікована"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="Завантаження із
cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Завантаження із
бази даних"
COM_FABRIK_MEDIAN="Медіана"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Переконайтеся, що
для вашої таблиці вказано первинний ключ
- без цього Fabrik не зможе обробити
об'єднання таблиць"
COM_FABRIK_NEXT="Наст."
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Ключ для цієї
таблиці не знайдений"
COM_FABRIK_NO_RECORDS="Немає записів"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="Немає записів"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Немає данних"
COM_FABRIK_NONE="Жодний"
COM_FABRIK_NONE_OF_THESE_TERMS="Жоден з них"
COM_FABRIK_NOT_EQUALS="Не дорівнює"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="або"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Перезаписати
співпадаючі записи"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Будь ласка, оберіть"
COM_FABRIK_PLEASE_SELECT_A_ROW="Оберіть рядок"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Будь ласка,
оберіть всі необхідні фільтри"
COM_FABRIK_PREV="Поперед."
COM_FABRIK_PREVIOUS="Попередні"
COM_FABRIK_PRINT="Друк"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Включений
пре-фільтр запиту, але значення / запит не
задані"
COM_FABRIK_RECORDS="записи"
COM_FABRIK_RECORDS_DELETED="Записи видалені"
COM_FABRIK_RECORD_ADDED_UPDATED="Записи
додані/оновлені"
COM_FABRIK_RESTARTING_MULTIPAGE_FORM="Здається, ви вже
починали заповнювати цю форму.
Продовжимо з тієї сторінки, до якої ви
дійшли. Щоб почати з самого початку,
натисніть кнопку 'Скидання'"
COM_FABRIK_SAVE="Зберегти"
COM_FABRIK_SAVING_TO="збереження в"
COM_FABRIK_SEARCH="Пошук"
COM_FABRIK_SELECT="Обрати"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Встановіть хоча
б один фільтр"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Оберіть стовпці
для експорту"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Оберіть кільеа
рядків для видалення"
COM_FABRIK_SEND_EMAIL="Надіслати email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Вибачте,
ця візуалізація не опублікована"
COM_FABRIK_START="Початок"
COM_FABRIK_SUBSCRIBE_RSS="Підписка RSS"
COM_FABRIK_SUCCESS="Успішно"
COM_FABRIK_SUM="Сума"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Перевірте, що у
вас встановлений та включений Fabrik system
plugin"
COM_FABRIK_TEXT_DELIMITER="Обмежувач тексту"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Цей елемент
відправлений на"
COM_FABRIK_TOGGLE="Переключити"
COM_FABRIK_TOTAL="Усього"
COM_FABRIK_VALIDATING="Перевірка введення"
COM_FABRIK_VALIDATION_ERROR="Помилка при
перевірці"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Перегляд"
COM_FABRIK_VIEW_ALL="Переглянути все"
COM_FABRIK_WHERE="Де"
COM_FABRIK_YOUR_EMAIL="Ваш email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="email ваших друзів"
COM_FABRIK_YOUR_NAME="Ваше і'мя"
COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/uk-UA/uk-UA.com_fabrik.sys.ini000064400000030410151165346260013613
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="Додати"
COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Додати новий
параметр до попередніх"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="Розширений пошук"
COM_FABRIK_ALL="усі"
COM_FABRIK_ALL_OF_THESE_TERMS="Усі вони"
COM_FABRIK_AND="і"
COM_FABRIK_ANY_OF_THESE_TERMS="Один з них"
COM_FABRIK_APPLY="Застосувати"
COM_FABRIK_AVERAGE="Середнє"
COM_FABRIK_BEGINS_WITH="Починається з"
COM_FABRIK_BETWEEN="Між"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="Перегляд каталогів"
COM_FABRIK_CANCEL="Скасувати"
COM_FABRIK_CLEAR="Скасувати фільтри"
COM_FABRIK_CLOSE_WINDOW="Закрити"
COM_FABRIK_CONDITION="Умова"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
COM_FABRIK_CONFIRM_DELETE="Точно хочете видалити
ці записи?"
COM_FABRIK_CONFIRM_DROP="Точно хочете видалити
ВСІ записи та скинути ключі таблиць?"
COM_FABRIK_CONTAINS="Містить"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
COM_FABRIK_COUNT="Лічильник"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
COM_FABRIK_CSV_COMPLETE="Експорт в CSV
завершений"
COM_FABRIK_CSV_DOWNLOADING="Завантаження
CSV-файлу"
COM_FABRIK_CSV_DOWNLOAD_HERE="Завантажити сюди"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Вибачте, наступні
поля CSV-файлу не знайдені в цій
таблиці:"
COM_FABRIK_CSV_FILE="CSV-файл"
; COM_FABRIK_CSV_IMPORT_HEADING="Import: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="і"
COM_FABRIK_DATE_RANGE_BETWEEN="Між"
COM_FABRIK_DELETE="Видалити"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
COM_FABRIK_DISPLAY_NUM="Відображати по"
COM_FABRIK_DROP_EXISTING_DATA="Видалити існуючі
дані"
COM_FABRIK_EDIT="Змінити"
COM_FABRIK_ELEMENT="Елемент"
COM_FABRIK_EMAIL_MSG="Наступна сторінка з
web-сайту "_QQ_"%s"_QQ_" була
відправлена Вам від %s ( %s).\n\nВи можете
перейти за наступним посиланням:\n %s"
COM_FABRIK_EMPTY="Пyсто"
COM_FABRIK_END="Кінець"
COM_FABRIK_ENDS_WITH="Закінчується"
COM_FABRIK_EQUALS="Дорівнює"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
COM_FABRIK_EXACT_TERMS="Точна фраза"
COM_FABRIK_EXPORT="Експорт"
COM_FABRIK_EXPORT_TO_CSV="Експорт в CSV"
COM_FABRIK_FAILED_VALIDATION="Невірне значення"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV-файл"
COM_FABRIK_FIELD_CSV_FILE_DESC="Оберіть CSV для
вивантаження"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Видалити
дані"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Видаляє із
таблиці старі дані перед імпортом даних
із CSV"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Роздільник
полів"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="Символ, що
розділяє комірки в CSV-файлі"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="Формат"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Якою програмою
створений CSV-файл (необхідно для
встановлення правильного кодування
символів)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="Перезаписати"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Наявні записи
перезаписуються даними з CSV-файлу"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="або
розділені табулятором"
COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="Якщо
встановлено, замість вказанного
роздільника полів використовується
табулятор."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Обмежувач
тексту"
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="Символ для
виділення текстових значень в
CSV-файлі"
COM_FABRIK_FIELD_DELIMITER="Роздільник полів"
COM_FABRIK_FILE_TYPE="Тип файлу"
COM_FABRIK_FILTER="Фільтр"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="Усі"
COM_FABRIK_FILTERS_CLEARED="Фільтри скинуті"
COM_FABRIK_FORM="Форма"
COM_FABRIK_FORM_FIELDS="Поля форми"
COM_FABRIK_FORM_NOT_PUBLISHED="Вибачте, ця форма не
опyблікована"
COM_FABRIK_FORM_SAVED="Форма збережена"
COM_FABRIK_GO="Почати"
COM_FABRIK_GREATER_THAN="Більше"
COM_FABRIK_GROUP_BY="Групувати за"
COM_FABRIK_IMPORT_CSV="Імпортувати CSV"
COM_FABRIK_IMPORT_CSV_FILE="CSV-файл для імпорту"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="Файл не
обраний"
COM_FABRIK_IMPORT_FROM_CSV="Імпорт із CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="Включити
обчислення"
COM_FABRIK_INCLUDE_DATA="Включити дані:"
COM_FABRIK_INCLUDE_FILTERS="Включити фільтри:"
COM_FABRIK_INCLUDE_RAW_DATA="Включити дані в
початковому вигляді:"
COM_FABRIK_INCORRECT_LIST_ID="Невірний id
таблиці/списку"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="Форма
використовує об'єднання таблиць, але
їх зовнішні ключі %s не опубліковані. При
збереженні форми можливі проблеми.
Зв'яжіться з власником сайту з приводу
цієї помилки"
COM_FABRIK_LABEL="Мітка"
COM_FABRIK_LESS_THAN="Менше"
COM_FABRIK_LINKED_FORM_ADD="Додати"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="Id таблиці не
встановлений - обробка неможлива"
COM_FABRIK_LIST_NO_DATA_MSG="Немає записів"
COM_FABRIK_LIST_NOT_PUBLISHED="На жаль, ця таблиця не
опублікована"
COM_FABRIK_LOADING="Завантаження"
COM_FABRIK_LOADING_FROM_COOKIE="Завантаження із
cookie"
COM_FABRIK_LOADING_FROM_DATABASE="Завантаження із
бази даних"
COM_FABRIK_MEDIAN="Медіана"
COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Переконайтеся, що
для вашої таблиці вказано первинний ключ
- без цього Fabrik не зможе обробити
об'єднання таблиць"
COM_FABRIK_NEXT="Наст."
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="Ключ для цієї
таблиці не знайдений"
COM_FABRIK_NO_RECORDS="Немає записів"
COM_FABRIK_NO_REPEAT_GROUP_DATA="Немає данних"
COM_FABRIK_NONE="Жодний"
COM_FABRIK_NONE_OF_THESE_TERMS="Жоден з них"
COM_FABRIK_NOT_EQUALS="Не дорівнює"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="або"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Перезаписати
співпадаючі записи"
; COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="Будь ласка, оберіть"
COM_FABRIK_PLEASE_SELECT_A_ROW="Оберіть рядок"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Будь ласка,
оберіть всі необхідні фільтри"
COM_FABRIK_PREV="Поперед."
COM_FABRIK_PREVIOUS="Попередні"
COM_FABRIK_PRINT="Друк"
COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="Включений
пре-фільтр запиту, але значення / запит не
задані"
COM_FABRIK_RECORDS="записи"
COM_FABRIK_RECORDS_DELETED="Записи видалені"
COM_FABRIK_RECORD_ADDED_UPDATED="Записи
додані/оновлені"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="Зберегти"
COM_FABRIK_SAVING_TO="збереження в"
COM_FABRIK_SEARCH="Пошук"
COM_FABRIK_SELECT="Обрати"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Встановіть хоча
б один фільтр"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Оберіть стовпці
для експорту"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="Оберіть кільеа
рядків для видалення"
COM_FABRIK_SEND_EMAIL="Надіслати email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Вибачте,
ця візуалізація не опублікована"
COM_FABRIK_START="Початок"
COM_FABRIK_SUBSCRIBE_RSS="Підписка RSS"
COM_FABRIK_SUCCESS="Успішно"
COM_FABRIK_SUM="Сума"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Перевірте, що у
вас встановлений та включений Fabrik system
plugin"
COM_FABRIK_TEXT_DELIMITER="Обмежувач тексту"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="Цей елемент
відправлений на"
COM_FABRIK_TOGGLE="Переключити"
COM_FABRIK_TOTAL="Усього"
COM_FABRIK_VALIDATING="Перевірка введення"
COM_FABRIK_VALIDATION_ERROR="Помилка при
перевірці"
; COM_FABRIK_VALUE="Value"
COM_FABRIK_VIEW="Перегляд"
COM_FABRIK_VIEW_ALL="Переглянути все"
COM_FABRIK_WHERE="Де"
COM_FABRIK_YOUR_EMAIL="Ваш email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="email ваших друзів"
COM_FABRIK_YOUR_NAME="Ваше і'мя"
COM_FABRIK_MESSAGE_SUBJECT="Subject"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/zh_TW.Big5/zh_TW.Big5.com_fabrik.ini000064400000024112151165346270014575
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="新增"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
COM_FABRIK_ADD_GROUP="新增&nbsp;群組"
COM_FABRIK_ADVANCED_SEARCH="進階搜尋"
COM_FABRIK_ALL="全部"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
COM_FABRIK_AND="以及"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="套用"
COM_FABRIK_AVERAGE="平均"
COM_FABRIK_BEGINS_WITH="開始於"
COM_FABRIK_BETWEEN="中間"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="查閱文件夾"
COM_FABRIK_CANCEL="取消"
COM_FABRIK_CLEAR="清除過濾條件"
COM_FABRIK_CLOSE_WINDOW="關閉"
COM_FABRIK_CONDITION="條件"
COM_FABRIK_CONFIRM_DELETE_1="您確定要刪除此紀錄?"
COM_FABRIK_CONFIRM_DELETE="您確定想刪除 %s 紀錄?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
COM_FABRIK_CONTAINS="包含"
COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="我們無法找到此紀錄"
; COM_FABRIK_COUNT="Count"
COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV 紀錄已新增 以及 %s
紀錄已更新"
COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s
新元素已新增, %s CSV 紀錄已新增 以及 %s
紀錄已更新"
COM_FABRIK_CSV_COMPLETE="CSV 匯出完成"
COM_FABRIK_CSV_DOWNLOADING="CSV 檔案下載中"
COM_FABRIK_CSV_DOWNLOAD_HERE="下載這裡"
COM_FABRIK_CSV_EXPORT_NO_RECORDS="CSV
的匯出結果沒有可提供的紀錄"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV 檔案"
COM_FABRIK_CSV_IMPORT_HEADING="匯入: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
COM_FABRIK_DATE_RANGE_AND="以及"
COM_FABRIK_DATE_RANGE_BETWEEN="中間"
COM_FABRIK_DELETE="刪除"
COM_FABRIK_DELETE_GROUP="刪除&nbsp;群組"
COM_FABRIK_DISPLAY_NUM="顯示 #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="編輯"
COM_FABRIK_ELEMENT="元素"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
COM_FABRIK_EMPTY="空"
COM_FABRIK_END="結束"
COM_FABRIK_ENDS_WITH="結束於"
COM_FABRIK_EQUALS="等於"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
COM_FABRIK_EXPORT="匯出"
COM_FABRIK_EXPORT_TO_CSV="匯出檔案CSV"
COM_FABRIK_FAILED_VALIDATION="驗證失敗"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV檔案"
COM_FABRIK_FIELD_CSV_FILE_DESC="選擇一個 CSV 檔案來上傳"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="丟掉資料"
COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="在匯入 CSV
的資料前,將會刪除已存在此列表的資料"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="這是在 CSV
檔中,用來分隔各個資料的符號"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="格式"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="覆寫"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="覆寫任何與 CSV
的資料重複到的紀錄"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="文字分隔符"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
COM_FABRIK_FILE_TYPE="檔案類型"
COM_FABRIK_FILTER="過濾條件"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="全部"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="清除過濾條件"
COM_FABRIK_FORM="表單"
COM_FABRIK_FORM_FIELDS="表單欄位"
COM_FABRIK_FORM_NOT_PUBLISHED="很抱歉,此表單尚未發佈"
COM_FABRIK_FORM_SAVED="表單已儲存"
COM_FABRIK_GO="執行"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
COM_FABRIK_GROUP_BY="群組排序依"
COM_FABRIK_IMPORT_CSV="匯入 CSV"
COM_FABRIK_IMPORT_CSV_FILE="匯入 CSV 檔"
COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="未選擇任何檔案"
COM_FABRIK_IMPORT_FROM_CSV="從 CSV 匯入"
COM_FABRIK_INCLUDE_CALCULATIONS="包含計算"
COM_FABRIK_INCLUDE_DATA="包含資料:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="標籤"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="新增"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
COM_FABRIK_LIST="列表"
COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="列表 ID 尚未設定 -
無法產生"
COM_FABRIK_LIST_NO_DATA_MSG="無紀錄"
COM_FABRIK_LIST_NOT_PUBLISHED="抱歉,此列表尚未發佈"
; COM_FABRIK_LOADING="Loading..."
COM_FABRIK_LOADING_FROM_COOKIE="正在從 cookie 載入"
COM_FABRIK_LOADING_FROM_DATABASE="正在從資料庫載入"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
COM_FABRIK_NEXT="下一頁"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="沒有元素和 %s
相符"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
COM_FABRIK_NO_RECORDS="沒找到記錄"
COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="沒找到記錄"
COM_FABRIK_NO_REPEAT_GROUP_DATA="無資料"
COM_FABRIK_NONE="無"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
COM_FABRIK_NOT_EQUALS="不等於"
COM_FABRIK_NOTICE_CANT_ADD_RECORDS="很抱歉,但您沒有權限來新增此紀錄"
COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="很抱歉,但您沒有權限來編輯此紀錄"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="沒有任何元素被設定包含在
'搜尋全部' 中"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
COM_FABRIK_OR="或"
COM_FABRIK_OVERWRITE_MATCHING_RECORDS="覆寫重複的紀錄"
COM_FABRIK_PDF="PDF"
COM_FABRIK_PLEASE_SELECT="請選擇"
COM_FABRIK_PLEASE_SELECT_A_ROW="請選擇一個行列"
COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="請選擇所有必要的篩選條件"
COM_FABRIK_PREV="上一頁"
COM_FABRIK_PREVIOUS="前一個"
COM_FABRIK_PRINT="列印"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
COM_FABRIK_RECORDS="紀錄"
COM_FABRIK_RECORDS_DELETED="紀錄已刪除"
COM_FABRIK_RECORD_ADDED_UPDATED="紀錄已新增/更新"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
COM_FABRIK_SAVE="儲存"
COM_FABRIK_SAVING_TO="儲存到"
COM_FABRIK_SEARCH="搜尋"
COM_FABRIK_SELECT="選擇"
COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="請選擇至少一個的過濾條件"
COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="選擇一個欄位來匯出"
COM_FABRIK_SELECT_ROWS_FOR_DELETION="選擇一些行列來刪除"
COM_FABRIK_SEND_EMAIL="寄送 Email"
COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="很抱歉,此視覺化圖表尚未發佈"
COM_FABRIK_START="開始"
COM_FABRIK_SUBSCRIBE_RSS="訂閱 RSS"
COM_FABRIK_SUCCESS="成功"
COM_FABRIK_SUM="總和"
COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="請確認您已安裝並已成功發佈此
Fabrik 系統外掛"
COM_FABRIK_TEXT_DELIMITER="文字分隔符"
COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="此項目已傳送到"
COM_FABRIK_TOGGLE="切換"
COM_FABRIK_TOTAL="總共"
COM_FABRIK_VALIDATING="驗證"
COM_FABRIK_VALIDATION_ERROR="驗證錯誤"
COM_FABRIK_VALUE="值"
COM_FABRIK_VIEW="查看"
COM_FABRIK_VIEW_ALL="查看全部"
COM_FABRIK_WHERE="哪裡"
COM_FABRIK_YOUR_EMAIL="您的 Email"
COM_FABRIK_YOUR_FRIENDS_EMAIL="您朋友的 Email"
COM_FABRIK_YOUR_NAME="您的名稱"
COM_FABRIK_MESSAGE_SUBJECT="主題"
COM_FABRIK_ELEMENT_SUBOPTION_ERROR="指定到元素 '%s': %s
的子選項無效"

; 3.1
COM_FABRIK_CSV="CSV"
COM_FABRIK_LOG="日誌"
COM_FABRIK_RUN="運行"
COM_FABRIK_VALIDATION="驗證"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
COM_FABRIK_LIST_TABS_ALL="全部"
COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="儲存"
COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="套用"
COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="返回"
COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="刪除"
COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="重置"
language/zh-TW/zh-TW.com_fabrik.ini000064400000024405151165346270013064
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="新增"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="進階搜尋"
COM_FABRIK_ALL="全部"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="採用"
COM_FABRIK_AVERAGE="平均"
COM_FABRIK_BEGINS_WITH="開始於"
COM_FABRIK_BETWEEN="中間"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="查閱文件夾"
COM_FABRIK_CANCEL="取消"
COM_FABRIK_CLEAR="清除過濾條件"
COM_FABRIK_CLOSE_WINDOW="關閉"
COM_FABRIK_CONDITION="條件"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
COM_FABRIK_CONTAINS="包含"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
COM_FABRIK_CSV_DOWNLOAD_HERE="下載這裡"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV檔案"
COM_FABRIK_CSV_IMPORT_HEADING="匯入: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
COM_FABRIK_DATE_RANGE_BETWEEN="中間"
COM_FABRIK_DELETE="刪除"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="編輯"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
COM_FABRIK_EXPORT="匯出"
COM_FABRIK_EXPORT_TO_CSV="匯出檔案CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV檔案"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="格式"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="覆蓋寫入"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
COM_FABRIK_FILE_TYPE="檔案類型"
COM_FABRIK_FILTER="過濾條件"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="全部"
; COM_FABRIK_FILTERS_ACTIVE="Filters active"
COM_FABRIK_FILTERS_CLEARED="清除過濾條件"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
COM_FABRIK_GO="執行"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
COM_FABRIK_GROUP_BY="群組排序依"
COM_FABRIK_IMPORT_CSV="匯入 CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
COM_FABRIK_INCLUDE_CALCULATIONS="包含計算"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="標籤"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="新增"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
; COM_FABRIK_LOADING="Loading..."
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
COM_FABRIK_LOADING_FROM_DATABASE="正在從資料庫載入"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
COM_FABRIK_NEXT="下一頁"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_AUTOCOMPLETE_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="主題"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
language/zh-TW/zh-TW.com_fabrik.sys.ini000064400000024242151165346270013700
0ustar00; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see
LICENSE.php
; Note : All ini files need to be saved as UTF-8 - No BOM
;

COM_FABRIK_ADD="新增"
; COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE="Add a new option to
those above"
; COM_FABRIK_ADD_GROUP="Add&nbsp;group"
COM_FABRIK_ADVANCED_SEARCH="進階搜尋"
COM_FABRIK_ALL="全部"
; COM_FABRIK_ALL_OF_THESE_TERMS="All of these terms"
; COM_FABRIK_AND="And"
; COM_FABRIK_ANY_OF_THESE_TERMS="Any of these terms"
COM_FABRIK_APPLY="採用"
COM_FABRIK_AVERAGE="平均"
COM_FABRIK_BEGINS_WITH="開始於"
COM_FABRIK_BETWEEN="中間"
; COM_FABRIK_BIRTHDAY_TODAY="Is birthday"
COM_FABRIK_BROWSE_FOLDERS="查閱文件夾"
COM_FABRIK_CANCEL="取消"
COM_FABRIK_CLEAR="清除過濾條件"
COM_FABRIK_CLOSE_WINDOW="關閉"
COM_FABRIK_CONDITION="條件"
; COM_FABRIK_CONFIRM_DELETE_1="Are you sure you want to delete this
record?"
; COM_FABRIK_CONFIRM_DELETE="Are you sure you want to delete %s
records?"
; COM_FABRIK_CONFIRM_DROP="Do you really want to delete all records
and reset this tables key to 0?"
COM_FABRIK_CONTAINS="包含"
; COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE="We are unable to find
this record"
; COM_FABRIK_COUNT="Count"
; COM_FABRIK_CSV_ADDED_AND_UPDATED="%s CSV records added and %s
records updated"
; COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED="%s new elements
added, %s CSV records added and %s records updated"
; COM_FABRIK_CSV_COMPLETE="CSV export complete"
; COM_FABRIK_CSV_DOWNLOADING="CSV file downloading"
COM_FABRIK_CSV_DOWNLOAD_HERE="下載這裡"
; COM_FABRIK_CSV_EXPORT_NO_RECORDS="No records available for CSV
export"
; COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE="Sorry the following fields in
the CSV File are not found in this table:"
COM_FABRIK_CSV_FILE="CSV檔案"
COM_FABRIK_CSV_IMPORT_HEADING="匯入: %s"
; COM_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format saved from
Excel)"
; COM_FABRIK_FABRIK_EXCEL_IMPORT_FORMAT="Excel (format exported by
Fabrik or by Excel with option 'File type= unicode text')"
; COM_FABRIK_DATE_RANGE_AND="and"
COM_FABRIK_DATE_RANGE_BETWEEN="中間"
COM_FABRIK_DELETE="刪除"
; COM_FABRIK_DELETE_GROUP="Delete&nbsp;group"
; COM_FABRIK_DISPLAY_NUM="Display #"
; COM_FABRIK_DROP_EXISTING_DATA="Drop existing data"
COM_FABRIK_EDIT="編輯"
; COM_FABRIK_ELEMENT="Element"
; COM_FABRIK_EMAIL_MSG="The following page from the %s website has
been sent to you by %s ( %s).\n\nYou can access it at the following URL:\n
%s"
; COM_FABRIK_EMPTY="Empty"
; COM_FABRIK_END="End"
; COM_FABRIK_ENDS_WITH="ENDS WITH"
; COM_FABRIK_EQUALS="EQUALS"
; COM_FABRIK_ERR_ADMIN_LIST_TMPL_IN_FRONTEND="Sorry the admin template
is only for use within Joomla's administration pages. Please select a
different template."
; COM_FABRIK_ERR_CURL_NOT_INSTALLED="The Curl library is not installed
some parts of this page have failed to execute"
;
COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS="The
tabs template is incompatible with multi page forms. Either use the
bootstrap template, or ensure that all groups have their 'Page
break' option turned off"
; COM_FABRIK_ERR_UPLOADS_DISABLED="The installer can't continue
before file uploads are enabled. Please use the install from directory
method."
; COM_FABRIK_ERR_PREFILTER_NOT_APPLIED="A prefilter has been set up on
an unpublished element, and will not be applied: %s"
; COM_FABRIK_EXACT_TERMS="Exact phrase"
COM_FABRIK_EXPORT="匯出"
COM_FABRIK_EXPORT_TO_CSV="匯出檔案CSV"
; COM_FABRIK_FAILED_VALIDATION="Validation failed"
COM_FABRIK_FIELD_CSV_FILE_LABEL="CSV檔案"
; COM_FABRIK_FIELD_CSV_FILE_DESC="Select a CSV file to upload"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_LABEL="Drop data"
; COM_FABRIK_FIELD_CSV_IMPORT_DROP_DATA_DESC="Will remove existing
data from the list before importing the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_LABEL="Field
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_FIELD_DELIMITER_DESC="The character used
in the CSV file to separate cell data"
COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_LABEL="格式"
; COM_FABRIK_FIELD_CSV_IMPORT_FORMAT_DESC="Which application exported
the CSV file (needed to ensure the correct encoding is used)"
COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL="覆蓋寫入"
; COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC="Overwrites any matching
records with the CSV's data"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_LABEL="or Tab
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TAB_DELIMITER_DESC="If checked then the
field delimiter is ignored and the tab character is assigned instead."
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_LABEL="Text
delimiter"
; COM_FABRIK_FIELD_CSV_IMPORT_TEXT_DELIMITER_DESC="The character used
in the CSV file to encase text values"
; COM_FABRIK_FIELD_DELIMITER="Field delimiter"
COM_FABRIK_FILE_TYPE="檔案類型"
COM_FABRIK_FILTER="過濾條件"
; COM_FABRIK_FILTER_LIST_MAX_REACHED="The filter %s options have been
truncate as they contains more records than Fabrik's global
'Filter List Max' configuration value."
COM_FABRIK_FILTER_PLEASE_SELECT="全部"
COM_FABRIK_FILTERS_CLEARED="清除過濾條件"
; COM_FABRIK_FORM="Form"
; COM_FABRIK_FORM_FIELDS="Form fields"
; COM_FABRIK_FORM_NOT_PUBLISHED="Sorry this form is not
published"
; COM_FABRIK_FORM_SAVED="Form saved"
COM_FABRIK_GO="執行"
; COM_FABRIK_GREATER_THAN="GREATER THAN"
; COM_FABRIK_GROUP_BY="Group by"
COM_FABRIK_IMPORT_CSV="匯入 CSV"
; COM_FABRIK_IMPORT_CSV_FILE="Import CSV file"
; COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED="No file selected"
; COM_FABRIK_IMPORT_FROM_CSV="Import from CSV"
; COM_FABRIK_INCLUDE_CALCULATIONS="Include calculations"
; COM_FABRIK_INCLUDE_DATA="Include data:"
; COM_FABRIK_INCLUDE_FILTERS="Include filters:"
; COM_FABRIK_INCLUDE_RAW_DATA="Include raw data:"
; COM_FABRIK_INCORRECT_LIST_ID="Incorrect list id"
; COM_FABRIK_IS_EMPTY="IS EMPTY"
; COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED="This form uses joined
data, but its foreign key %s, is not published. This will cause issues when
saving the form. Please contact the site owner regarding this issue."
COM_FABRIK_LABEL="標籤"
; COM_FABRIK_LESS_THAN="LESS THAN"
COM_FABRIK_LINKED_FORM_ADD="新增"
COM_FABRIK_LIST_SHORTCUTS_ADD="a"
COM_FABRIK_LIST_SHORTCUTS_EDIT="e"
COM_FABRIK_LIST_SHORTCUTS_DELETE="d"
COM_FABRIK_LIST_SHORTCUTS_FILTER="f"
; COM_FABRIK_LIST="List"
; COM_FABRIK_LIST_ID_NOT_SET_CANT_RENDER="List id not set - can not
render"
; COM_FABRIK_LIST_NO_DATA_MSG="No records"
; COM_FABRIK_LIST_NOT_PUBLISHED="Sorry this list is not
published"
COM_FABRIK_LOADING="載入中"
; COM_FABRIK_LOADING_FROM_COOKIE="Loading from cookie"
COM_FABRIK_LOADING_FROM_DATABASE="正在從資料庫載入"
; COM_FABRIK_MEDIAN="Median"
; COM_FABRIK_MUST_SELECT_PRIMARY_KEY="Please ensure you have selected
a primary key for your table, Fabrik can not process this join until you
have done so"
COM_FABRIK_NEXT="下一頁"
; COM_FABRIK_NO_ACCESS_PLEASE_LOGIN="Insufficient access rights.
Please login"
; COM_FABRIK_ERR_NO_ELEMENTS_MATCHED_FILTER="No element found matching
%s"
; COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE="No key found for this
list"
; COM_FABRIK_NO_RECORDS="No records found"
; COM_FABRIK_NO_REPEAT_GROUP_DATA="No data"
; COM_FABRIK_NONE="None"
; COM_FABRIK_NONE_OF_THESE_TERMS="None of these terms"
; COM_FABRIK_NOT_EQUALS="NOT EQUALS"
; COM_FABRIK_NOTICE_CANT_ADD_RECORDS="Sorry, but you are not
authorised to add this record"
; COM_FABRIK_NOTICE_CANT_EDIT_RECORDS="Sorry, but you are not
authorised to edit this record"
; COM_FABRIK_NOTICE_DOMPDF_NOT_FOUND="Dompdf library not found"
; COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS="No elements set to be
included in search all"
; COM_FABRIK_NOTICE_SEARCH_STRING_TOO_SHORT="Your search phrase is too
short to search the list, please try searching on a longer phrase"
; COM_FABRIK_OR="or"
; COM_FABRIK_OVERWRITE_MATCHING_RECORDS="Overwrite matching
records"
; COM_FABRIK_PDF="PDF"
; COM_FABRIK_PLEASE_SELECT="Please select"
; COM_FABRIK_PLEASE_SELECT_A_ROW="Please select a row"
; COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS="Please select all
required filters"
; COM_FABRIK_PREV="Prev"
; COM_FABRIK_PREVIOUS="Previous"
; COM_FABRIK_PRINT="Print"
; COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE="A query prefilter has been
set but no value/query given"
; COM_FABRIK_RECORDS="records"
; COM_FABRIK_RECORDS_DELETED="Records deleted"
; COM_FABRIK_RECORD_ADDED_UPDATED="Record added/updated"
; COM_FABRIK_RESTARTING_MULTIPAGE_FORM="It appears you have already
started filling in this form. Your starting from the last page you visited.
If you wish to restart the form press the 'clear' button."
; COM_FABRIK_SAVE="Save"
; COM_FABRIK_SAVING_TO="saving to"
; COM_FABRIK_SEARCH="Search"
; COM_FABRIK_SELECT="Select"
; COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER="Please select at least one
filter"
; COM_FABRIK_SELECT_COLUMNS_TO_EXPORT="Select columns to export"
; COM_FABRIK_SELECT_ROWS_FOR_DELETION="Select some rows for
deletion"
; COM_FABRIK_SEND_EMAIL="Send email"
; COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED="Sorry this
visualization is unpublished"
; COM_FABRIK_START="Start"
; COM_FABRIK_SUBSCRIBE_RSS="Subscribe RSS"
; COM_FABRIK_SUCCESS="Success"
; COM_FABRIK_SUM="Sum"
; COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE="Please ensure you have
installed and published the Fabrik system plugin"
; COM_FABRIK_TEXT_DELIMITER="Text delimiter"
; COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO="This item has been sent
to"
; COM_FABRIK_TOGGLE="Toggle"
; COM_FABRIK_TOTAL="Total"
; COM_FABRIK_VALIDATING="Validating"
; COM_FABRIK_VALIDATION_ERROR="Validation error"
; COM_FABRIK_VALUE="Value"
; COM_FABRIK_VIEW="View"
; COM_FABRIK_VIEW_ALL="View All"
; COM_FABRIK_WHERE="Where"
; COM_FABRIK_YOUR_EMAIL="Your email"
; COM_FABRIK_YOUR_FRIENDS_EMAIL="Your friend's email"
; COM_FABRIK_YOUR_NAME="Your name"
COM_FABRIK_MESSAGE_SUBJECT="主題"
; COM_FABRIK_ELEMENT_SUBOPTION_ERROR="Invalid suboptions specified for
element '%s': %s"

; 3.1
; COM_FABRIK_CSV="CSV"
; COM_FABRIK_LOG="Log"
; COM_FABRIK_RUN="Run"
; COM_FABRIK_VALIDATION="Validation"
; COM_FABRIK_EVAL_ERROR_USER_WARNING="An error has occurred with a
eval'd field - please inform the web-site owner."
; COM_FABRIK_LIST_TABS_ALL="All"
; COM_FABRIK_FIELD_SUBMIT_BUTTON_LABEL_DEFAULT="Save"
; COM_FABRIK_FIELD_APPLY_BUTTON_LABEL_DEFAULT="Apply"
; COM_FABRIK_FIELD_GO_BACK_BUTTON_LABEL_DEFAULT="Go back"
; COM_FABRIK_FIELD_DELETE_BUTTON_LABEL_DEFAULT="Delete"
; COM_FABRIK_FIELD_RESET_BUTTON_LABEL_DEFAULT="Reset"
layouts/element/fabrik-element-addoptions.php000064400000002300151165346310015435
0ustar00<?php
defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;
?>

<a href="#" title="<?php echo
Text::_('COM_FABRIK_ADD'); ?>" class="btn btn-info
toggle-addoption mt-1">
	<?php echo $d->add_image; ?>
</a>
<div style="clear:left">
	<div class="addoption">
		<div><?php echo
Text::_('COM_FABRIK_ADD_A_NEW_OPTION_TO_THOSE_ABOVE');
?></div>

		<?php
		if (!$d->allowadd_onlylabel && $d->savenewadditions) :
?>
			<label for="<?php echo $d->id; ?>_ddVal">
				<?php echo Text::_('COM_FABRIK_VALUE'); ?>
			</label>
			<input class="inputbox text" id="<?php echo
$d->id; ?>_ddVal" name="addPicklistValue" />

			<?php if (!$d->onlylabel) : ?>
				<label for="<?php echo $d->id; ?>_ddLabel">
					<?php echo Text::_('COM_FABRIK_LABEL'); ?>
				</label>
				<input class="inputbox text" id="<?php echo
$d->id; ?>_ddLabel" name="addPicklistLabel" />
			<?php endif; ?>
		<?php else : ?>
			<input class="inputbox text" id="<?php echo
$d->id; ?>_ddLabel" name="addPicklistLabel" />
		<?php endif; ?>

		<input class="button btn btn-success"
			type="button" id="<?php echo $d->id;
?>_dd_add_entry" value="<?php echo
Text::_('COM_FABRIK_ADD'); ?>" />
		<?php echo $d->hidden_field; ?>
	</div>
</div>

layouts/element/fabrik-element-custom-icon-link.php000064400000001576151165346310016502
0ustar00<?php
/**
 * Layout: element custom details link on icon
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.3
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
$d = $displayData;

?>
<a data-loadmethod="<?php echo $d->loadMethod;?>"
	class="<?php echo $d->class; ?> fabrikTip"
	data-list="<?php echo $d->dataList; ?>"
	data-isajax="<?php echo $d->isAjax; ?>"
	data-rowid="<?php echo $d->rowId; ?>"
	data-iscustom="<?php if ($d->isCustom) echo '1'; else
echo '0'; ?>"
	href="<?php echo $d->link; ?>"
	<?php if ($d->target !== '') : ?>
		target="<?php echo $d->target; ?>"
	<?php endif; ?>
	opts='<?php echo $d->opts; ?>'
	title="<?php echo $d->title; ?>"
	data-bs-trigger="hover"
>
<?php echo $d->data; ?>
</a>
layouts/element/fabrik-element-custom-link.php000064400000001421151165346310015541
0ustar00<?php
/**
 * Layout: element custom details link
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.3
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
$d = $displayData;

?>
<a data-loadmethod="<?php echo $d->loadMethod;?>"
	class="<?php echo $d->class; ?>"
	data-list="<?php echo $d->dataList; ?>"
	data-isajax="<?php echo $d->isAjax; ?>"
	data-rowid="<?php echo $d->rowId; ?>"
	data-iscustom="<?php if ($d->isCustom) echo '1'; else
echo '0'; ?>"
	href="<?php echo $d->link; ?>"
	<?php if ($d->target !== '') : ?>
		target="<?php echo $d->target; ?>"
	<?php endif; ?>
>
<?php echo $d->data; ?>
</a>
layouts/element/fabrik-element-details-link.php000064400000000443151165346310015657
0ustar00<?php

/**
 * Allows overriding the details link for an element.  Default is just to
echo the already built
 * link.  For details of what gets passed in $displayData, see the
linkHref() method in main front end list model
 */
defined('JPATH_BASE') or die;

$d = $displayData;

echo
$d->link;layouts/element/fabrik-element-elementlist-details.php000064400000001304151165346310017244
0ustar00<?php
defined('JPATH_BASE') or die;

$d = $displayData;

$condensed = array();
$d->addHtml = $d->addHtml && count($d->uls)>1;
if ($d->condense) :
	foreach ($d->uls as $ul) :
		$condensed[] = $ul[0];
	endforeach;

	echo $d->addHtml ? '<ul
class="fabrikRepeatData"><li>' .
implode('</li><li>', $condensed) .
'</li></ul>' : implode($d->sepChar, $condensed);
else:
	if ($d->addHtml) : ?>
		<ul class="fabrikRepeatData"><li>
	<?php endif;?>

	<?php foreach ($d->uls as $ul) :
	if ($d->addHtml) :?>
		<ul class="fabrikRepeatData"><li>
		<?php echo implode('</li><li>', $ul);
		echo '</li></ul>';
	else:
		echo implode($d->sepChar, $ul);
	endif;

	endforeach;
	if ($d->addHtml) :?>
	 </li></ul>
	<?php endif;
endif;layouts/element/fabrik-element-error.php000064400000001357151165346310014435
0ustar00<?php
/**
 * Element error LayoutInterface
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */
defined('JPATH_BASE') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Layout\LayoutInterface;

$d = $displayData;
$usersConfig = ComponentHelper::getParams('com_fabrik');
$icon        = $usersConfig->get('error_icon',
'warning');
?>
<span class="fabrikErrorMessage">

<?php
if ($d->err !== '') :
	?>
	<a href="#" class="fabrikTip"
title="<span><?php echo $d->err;?></span>"
opts='{"notice":true}'>
	<?php echo FabrikHelperHTML::image($icon, 'form',
$d->tmpl);?>
	</a>
<?php
endif;
?>

</span>
layouts/element/fabrik-element-label.php000064400000003432151165346310014357
0ustar00<?php
defined('JPATH_BASE') or die;

use Joomla\Utilities\ArrayHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Factory;

HTMLHelper::_('bootstrap.tooltip','[data-bs-toggle="tooltip"]');

$d         = $displayData;
$labelText = Text::_($d->label);
$labelText = $labelText == '' ? '&nbsp;' :
$labelText;
$l  = $d->icons . $labelText;
$tip = '';
$d->style = "";
if ($d->labelPosition == 0) {
	$d->labelClass .= ' col-sm-2 col-form-label';
	if (Factory::getApplication()->input->getBool('ajax',
false) == true) {
		$d->style = " style='width:16.6%;'";
	}
}
if ($d->tipText !== '')
{
	switch ($d->tipOpts->position)
	{
		default;
		case 'left':
			$placement = 'left';
			break;
		case 'top-left':
		case 'top-right':
		case 'top-left':
		case 'top':
			$placement = 'top';
			break;
		case 'right':
		case 'bottom-right':
			$placement = 'right';
			break;
		case 'bottom':
		case 'bottom-left':
			$placement = 'bottom';
			break;

	}
	$heading = isset($d->tipOpts->heading) ? $d->tipOpts->heading
: '';
	$tip = ' data-bs-toggle="tooltip"
data-bs-html="true" data-bs-trigger="' .
$d->tipOpts->trigger . '"  data-bs-placement="' .
$placement . '" title="'  . $d->tipText .
'"';
}

if ($d->view == 'form' && !($d->canUse ||
$d->canView))
{
	return '';
}

if ($d->view == 'details' && !$d->canView)
{
	return '';
}

if ($d->canView || $d->canUse)
{
	if ($d->hasLabel && !$d->hidden)
	{
		?>

		<label for="<?php echo $d->id; ?>"
class="<?php echo $d->labelClass; ?>" <?php echo
$tip; echo $d->style;?>>
<?php
	}
	elseif (!$d->hasLabel && !$d->hidden)
	{
		?>
		<span class="<?php echo $d->labelClass; ?>
faux-label">
<?php
	}
	?>
	<?php echo $l;?>
<?php
	if ($d->hasLabel && !$d->hidden)
	{
	?>
		</label>
	<?php
	}
	elseif (!$d->hasLabel && !$d->hidden)
	{
	?>
		</span>
	<?php
	}
}
?>
layouts/element/fabrik-element-listicon-tip.php000064400000000453151165346310015716
0ustar00<?php
defined('JPATH_BASE') or die;

$d = $displayData;

?>

<a
		class="fabrikTip"
   		onclick="return false" 
		<?php echo $d->target; ?>
		href="<?php echo $d->href; ?>"
		opts='<?php echo $d->opts; ?>'
		title="<?php echo $d->title; ?>"
		data-bs-trigger="hover"
>
	<?php echo $d->img; ?>
</a>
layouts/element/fabrik-element-tip.php000064400000001652151165346310014076
0ustar00<?php
defined('JPATH_BASE') or die;

$d = $displayData;
$tip = $d->tipText;

if ($d->tipTitle !== '')
{
    switch ($d->tipOpts->position)
    {
        default;
        case 'top-left':
            $placement = 'left';
            break;
        case 'top-right':
        case 'top-left':
        case 'top':
            $placement = 'top';
            break;
        case 'right':
        case 'bottom-right':
            $placement = 'right';
            break;
        case 'bottom':
        case 'bottom-left':
            $placement = 'bottom';
            break;

    }
    $heading = isset($d->tipOpts->heading) ?
$d->tipOpts->heading : '';
    $tip = ' data-bs-toggle="popover"
data-bs-trigger="' . $d->tipOpts->trigger . '" 
data-bs-placement="' . $placement . '"
data-title="' . $heading . '"
data-bs-content="' . $d->tipTitle . '"';
    $tip = '<span class="fabrikTip" ' . $tip .
'>' . $d->tipText . '</span>';

}

echo $tip;
layouts/fabrik-bootstrap-grid.php000064400000002310151165346310013152
0ustar00<?php
/**
 * Bootstrap grid layout
 *
 * NOTE - this layout must implode the grid with \n, as the calling func in
HTML helper has an 'explode' arg,
 * which controls whether grid gets reutrned as string, or an array.
 */

defined('JPATH_BASE') or die;

$d = $displayData;

// a void potential divide by 0 if something went wrong and $d->columns
is 0 or empty
$span = empty($d->columns) ? 12 : floor(12 / $d->columns);
$i    = 0;
$id   = is_null($d->spanId) ? '' : ' id="' .
$d->spanId . '"';
$grid = array();

foreach ($d->items as $i => $s)
{
    $endLine = ($i !== 0 && (($i) % $d->columns == 0));
    $newLine = ($i % $d->columns == 0);
	if (is_object($s) ) {
		$id   = isset($s->spanId) ? ' id="' . $s->spanId .
'"' : '';
		$rowdata = $s->rowdata;
	}
	else {
		$rowdata = $s;
	}


    if ($endLine)
    {
        $grid[] = '</div><!-- grid close row -->';
    }

    if ($newLine)
    {
        $grid[] = '<div class="row">';
    }

    $grid[] = '<div class="' . $d->spanClass . '
col-sm-' . $span . '"' . $id . '>' .
$rowdata . '</div>';
}

if (!empty($d->items))
{
    // Close opened row, last row-fluid is always open if there's data
    $grid[] = '</div><!-- grid close end row -->';
}

echo implode("\n", $grid);
layouts/fabrik-button.php000064400000001251151165346310011530
0ustar00<?php
/**
 * Button layout
 */

defined('JPATH_BASE') or die;

$d          = $displayData;
$attributes = isset($d->attributes) ? $d->attributes : '';
$type       = isset($d->type) ? 'type="' . $d->type .
'"' : 'type="button"';
$tag        = isset($d->tag) ? $d->tag : 'button'; //
button or a
$name       = isset($d->name) ? 'name="' . $d->name .
'"' : '';
$aria       = isset($d->aria) ? $d->aria : '';
$id 	    = isset($d->id) ? 'id="' . $d->id
.'"' : '';
?>

<<?php echo $tag; ?> <?php echo $type; ?> class="btn
<?php echo $d->class; ?>" <?php echo $attributes; ?>
	<?php echo $name; ?> <?php echo $id; ?> <?php echo $aria;
?>>
	<?php echo $d->label; ?>
</<?php echo $tag; ?>>

layouts/fabrik-content-type-compare.php000064400000006017151165346310014277
0ustar00<?php
/**
 * Content type compare view levels layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\Utilities\ArrayHelper;

$d                     = $displayData;
$viewLevels            = $d->viewLevels;
$contentTypeViewLevels = $d->contentTypeViewLevels;

$max = max(count($viewLevels), count($contentTypeViewLevels));

?>
	<hr />
<?php if ($d->versionMismatch) : ?>
	<div class="alert alert-warning"><span
class="icon-stack"></span>
		<?php echo
Text::sprintf('COM_FABRIK_CONTENT_TYPE_VERSION_MISMATCH',
$d->contentTypeVersion, $d->siteVersion); ?>
	</div>
<?php endif; ?>
<?php if (!empty($d->alteredGroups)) : ?>
	<div class="alert alert-warning"><span
class="icon-stack"></span>
		<?php echo
Text::_('COM_FABRIK_CONTENT_TYPE_ACL_GROUP_MISMATCH'); ?>
		<hr />
		<p><?php echo
Text::_('COM_FABRIK_CONTENT_TYPE_ACL_GROUP_MISMATCH_FOLLOWING');
?></p>

		<div>
			<?php
			foreach ($d->alteredGroups as $group) :?>
				<span class="label label-warning"><?php echo
$group['title']; ?></span>
				<?php
			endforeach ?>
		</div>
	</div>
	<hr />
	<?php
endif; ?>

<?php
if (!empty($d->missingElementTypes)) :
    ?>
    <div class="alert alert-warning"><span
class="icon-warning"></span>
        <?php echo
Text::sprintf('COM_FABRIK_CONTENT_TYPE_MISSING_ELEMENTS',
implode(', ', $d->missingElementTypes)); ?>
    </div>
    <?php
endif; ?>

<?php
if ($d->match) :
	?>
	<div class="alert alert-info"><span
class="icon-ok"></span>
		<?php echo Text::_('COM_FABRIK_CONTENT_TYPE_ACL_MATCH');
?>
	</div>
	<?php
else:
	?>
	<div class="alert alert-warning"><span
class="icon-warning"></span>
		<?php echo Text::_('COM_FABRIK_CONTENT_TYPE_ACL_MISMATCH');
?>
	</div>

	<div class="alert alert-info"><span
class="icon-question"></span>
		<?php echo
Text::_('COM_FABRIK_CONTENT_TYPE_ACL_MISMATCH_INFO'); ?>
	</div>

	<table class="table table-striped">
		<thead>
		<tr>
			<th><?php echo
Text::_('COM_FABRIK_CONTENT_TYPE_ACCESS_LEVEL'); ?></th>
			<th class="muted"><?php echo
Text::_('COM_FABRIK_GROUPS'); ?></th>
			<th><?php echo
Text::_('COM_FABRIK_CONTENT_TYPE_SITE_ACCESS_LEVEL');
?></th>
		</tr>
		<tbody>
		<?php
		for ($i = 0; $i < $max; $i++) :
			$viewLevel            = ArrayHelper::getValue($viewLevels, $i, array());
			$level                = ArrayHelper::getValue($contentTypeViewLevels,
$i, array());
			$viewRules            = ArrayHelper::getValue($viewLevel,
'rules', '');
			$contentTypeViewRules = ArrayHelper::getValue($level, 'rules',
'N/A');
			$matched              = $viewRules === $contentTypeViewRules;
			$aclId                = ArrayHelper::getValue($level, 'id',
'');
			if (!$matched) :
				?>
				<tr>
					<td>
						<?php echo ArrayHelper::getValue($level, 'title',
'N/A'); ?>
					</td>
					<td class="muted">
						<?php echo ArrayHelper::getValue($level, 'rules_labels',
'N/A'); ?>
					</td>
					<td>
						<?php echo HTMLHelper::_('access.level',
'aclMap[' . $aclId . ']', '', '',
array()); ?>
					</td>
				</tr>
				<?php
			endif;
		endfor;
		?>
		</tbody>
		</thead>
	</table>
	<?php
endif;
layouts/fabrik-csv-filename.php000064400000001012151165346310012561
0ustar00<?php
/**
 * PDF document title for form view
 *
 */

defined('JPATH_BASE') or die;

use Fabrik\Helpers\Worker;

$d = $displayData;

// Set the download file name based on the document title and rowid

$fileName = $d->filename;

if ($fileName == '')
{
	$table    = $d->model->getTable();
	$fileName = $table->db_table_name . '-export.csv';
}
else
{
	$w = new Worker;
	$fileName = $w->parseMessageForPlaceholder($fileName);
	$w->replaceRequest($fileName);
	$fileName = sprintf($fileName, date('Y-m-d'));
}

echo $fileName;
layouts/fabrik-element-list.php000064400000000321151165346320012615
0ustar00<?php
/**
 * Default list element render
 * Override this file in
plugins/fabrik_element/{plugin}/layouts/fabrik-element-{plugin}-list.php
 */

defined('JPATH_BASE') or die;

$d = $displayData;
echo $d->text;
layouts/fabrik-grid-item.php000064400000002304151165346320012077
0ustar00<?php
/**
 * Tabs layout
 */

defined('JPATH_BASE') or die;

$d = $displayData;

$thisName = $d->type === 'checkbox' ?
FabrikString::rtrimword($d->name, '[]') . '[' .
$d->i . ']' : $d->name;
$thisId = str_replace(array('[', ']'),
array('_', '_'), $thisName);
$thisId = rtrim($thisId, '_');
$thisId .=  '_input_' . $d->i;

$labelSpan    = '<span>' . $d->label .
'</span>';
$labelClass = $d->buttonGroup ? 'btn ' :
'form-check-label';
$inputClass = $d->buttonGroup ? 'btn-check' :
'form-check-input';


if (array_key_exists('input', $d->classes))
{
	$inputClass .= ' ' . implode(' ',
$d->classes['input']);
}

$chx = '<input type="' . $d->type . '"
class="fabrikinput ' . $inputClass . '" ' .
$d->inputDataAttributes .
	' name="' . $thisName . '" id="' .
$thisId . '" value="' . $d->value . '"
';

$sel = in_array($d->value, $d->selected);
$chx .= $sel ? ' checked="checked" />' : '
/>';

if (array_key_exists('label', $d->classes))
{
	$labelClass .= ' ' . implode(' ',
$d->classes['label']);
}
$label = '<label for="'.$thisId.'"
class="'.$labelClass.'
fabrikgrid_'.FabrikString::clean($d->value).'">'.$labelSpan.'</label>';
$html = $d->elementBeforeLabel == '1' ? $chx . $label : $label
. $chx; 
?>

<?php echo $html; ?>
layouts/fabrik-grid-span.php000064400000000214151165346320012100
0ustar00<?php
/**
 * Create appropriate bootstrap grid class
 */

defined('JPATH_BASE') or die;

$d = $displayData;

echo 'col-sm-' . $d->spanSize;
layouts/fabrik-icon.php000064400000003151151165346320011147
0ustar00<?php
/**
 * Layoutfile for Icon rendering
 */

defined('JPATH_BASE') or die;

$d = $displayData;
$props = isset($d->properties) ? $d->properties : '';

/**
 * Handle cases where additional classes are in the $d->icon string,
like the calendar
 * uses "icon-clock timeButton".  Also handle multiple icon-foo,
like "icon-spinner icon-spin"
 */

$iconParts = explode(' ', trim($d->icon));
$spareParts = array();

foreach ($iconParts as $key => $part) {
	if (!strstr($part, 'icon-')) {
		unset($iconParts[$key]);
		$spareParts[] = $part;
	}
	else if (empty($part)) {
		unset($iconParts[$key]);
	}
}

/**
 * Now test for any icon-xy names that you want to change
 * In J!4 joomla-fontawesome.css the following icon-xy are defined, but
slightly different from the now used fa-xyz
 */

foreach ($iconParts as $key => $part)
{

	$test = str_replace('icon-', '', trim($part));

	switch ($test) {
		case 'question-sign':
			$iconParts[$key] = 'fa-question-circle';
			break;
		case 'next':
 			$iconParts[$key] = 'fa-angle-right';
 			break;
 		case 'previous':
 			$iconParts[$key] = 'fa-angle-left';
 			break;
		default :
			$iconParts[$key] = $part;
			break;
	}
}

$d->icon = implode(' ', $iconParts);

/*
 * Some code just needs the icon name itself (eg. passing to JS code so it
knows what icon class to add/remove,
 * like in the rating element.
 */
if (isset($d->nameOnly) && $d->nameOnly)
{
	echo $d->icon;
	return;
}

/**
 * Add any additional non-icon classes back
 */

if (!empty($spareParts))
{
	$d->icon .= ' ' . implode(' ', $spareParts);
}

?>

<span data-isicon="true" class="fa <?php echo
$d->icon;?>" <?php echo $props;?>></span>
layouts/fabrik-modal.php000064400000003373151165346320011321
0ustar00<?php
/**
 * Created by PhpStorm.
 * User: rob
 * Date: 21/01/2016
 * Time: 16:49
 */

$d = $displayData;

$handleClass = 'handlelabel';

if (!$d->modal)
{
	$handleClass .= ' draggable';
	$windowClass = 'fabrikWindow modal';
} else {
	$windowClass = 'fabrikWindow-modal modal';
}

$templateStyle = "position: fixed; border: 1px solid rgba(0,0,0,0.3);
border-radius: 6px;box-shadow: 0 3px 7px rgba(0,0,0,0.3); background-color:
#fff;";

$footer = isset($d->footer) ? $d->footer : '';

?>

<div id="<?php echo $d->id; ?>" class="<?php
echo $windowClass;?>" style="<?php echo $templateStyle;
?>">
	<div class="modal-header">
		<h3 class="<?php echo $handleClass; ?>"
data-role="title">
			<?php echo $d->title; ?>
		</h3>
		<?php if (!$d->modal && $d->expandable !== false) :
?>
			<a class="expand" href="#"
data-role="expand">
				<span class="fa fa-expand"></span>
			</a>
		<?php endif; ?>
		<a href="#" class="closeFabWin"
data-role="close">
			<span class="fa fa-times"></span>
		</a>
	</div>
	<div class="contentWrapper">
		<div class="itemContent">
			<div class="itemContentPadder">
				<?php echo $d->content; ?>
			</div>
		</div>
	</div>
	<?php if (!$d->modal || $footer !== '') : ?>
		<div class="bottomBar modal-footer">
			<?php echo $footer;?>
		</div>
		<?php if (!$d->modal) : ?>
		<div class="ui-resizable-n
ui-resizable-handle"></div>
		<div class="ui-resizable-s
ui-resizable-handle"></div>
		<div class="ui-resizable-e
ui-resizable-handle"></div>
		<div class="ui-resizable-w
ui-resizable-handle"></div>
		<div class="ui-resizable-nw
ui-resizable-handle"></div>
		<div class="ui-resizable-ne
ui-resizable-handle"></div>
		<div class="ui-resizable-se
ui-resizable-handle"></div>
		<div class="ui-resizable-sw
ui-resizable-handle"></div>
	<?php endif;
	endif; ?>
</div>
layouts/fabrik-nav-dropdown.php000064400000001370151165346320012636
0ustar00<?php
/**
 * Layout: Bootstrap dropdown
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2015 fabrikar.com - All rights reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.3
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
$d = $displayData;

?>

<li role="presentation" class="dropdown">
  <a href="#" class="dropdown-toggle groupBy btn"
data-bs-toggle="dropdown" role="button"
aria-haspopup="true" aria-expanded="false">
    <?php echo $d->icon;?>
    <?php echo $d->label; ?>
    <b class="caret"></b>
  </a>
  <ul class="dropdown-menu">
    <?php foreach ($d->links as $link) :?>
      <li ><?php echo $link;?></li>
      <?php
    endforeach;?>
  </ul>
</li>layouts/fabrik-progress-bar.php000064400000002206151165346320012625
0ustar00<?php
/**
 * Default list element render
 * Override this file in
plugins/fabrik_element/{plugin}/layouts/fabrik-element-{plugin}-list.php
 */

defined('JPATH_BASE') or die;

$d = $displayData;
$klass = '';
$stripped = isset($d->stripped) && $d->stripped === true ?
'progress-bar-striped': '';
$animated = isset($d->animated) && $d->animated === true ?
'active' : '';
$extraClass = isset($d->extraClass) ? $d->extraClass : '';
$extraStyle = isset($d->extraStyle) ? $d->extraStyle : '';
$value = isset($d->value) ? (int) $d->value : 0;

if (isset($d->context)) {
	switch ($d->context) {
		case 'success':
			$klass = 'progress-bar-success';
			break;
		case 'info':
			$klass = 'progress-bar-info';
			break;
		case 'warning':
			$klass = 'progress-bar-warning';
			break;
		case 'danger':
			$klass = 'progress-bar-danger';
			break;

	}
}
?>
<div class="progress <?php echo $extraClass;?>"
style="<?php echo $extraStyle; ?>">
	<div class="progress-bar bar <?php echo $klass;?> <?php
echo $stripped; ?> <?php echo $animated;?>"
role="progressbar"
		aria-valuenow="0" aria-valuemin="0"
aria-valuemax="100" style="width:<?php echo
$value;?>%;">
	</div>
</div>
layouts/fabrik-responsive-class.php000064400000001210151165346320013511
0ustar00<?php
/**
 * Responsive class mapping layout, based on Bootstrap v2 names,
 * hidden-phone, hidden-tablet, hidden-desktop
 * ... so in default, just echo those.  In other frameworks, map to
equivalent
 */

defined('JPATH_BASE') or die;

$d = $displayData;

$responsiveClasses = explode(' ', $d->responsiveClass);

foreach ($responsiveClasses as &$responsiveClass)
{
	switch ($responsiveClass)
	{
		case 'hidden-phone':
			$responsiveClass = 'hidden-xs';
			break;
		case 'hidden-tablet':
			$responsiveClass = 'hidden-sm';
			break;
		case 'hidden-desktop':
			$responsiveClass = 'hidden-md';
			break;
	}
}

echo implode(' ', $responsiveClasses);
layouts/fabrik-tabs.php000064400000001725151165346320011155
0ustar00<?php
/**
 * Tabs layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;
$i = 0;
?>

<ul class="nav nav-tabs" role="tablist">
	<?php foreach ($d->tabs as $tab) :
		$style = array();
		$style[] = isset($tab->css) && $tab->css !== '' ?
'style="' . $tab->css . '"': '';
		$tab_class = isset($tab->class) && $tab->class !==
'' ? $tab->class : '';
		$href = isset($tab->href) ? $tab->href : $tab->id;
		$i==0 ? $active = ' active ' : $active = '';
		$i==0 ? $selected = 'true' : $selected = 'false';
		?>
		<li role="presentation" class="nav-item" <?php
echo implode(' ', $style); ?>>
			<button class="nav-link <?php echo $active . $tab_class;
?>" id="<?php echo $tab->id; ?>"
data-bs-toggle="tab" data-bs-target="#<?php echo $href;
?>" type="button" role="tab"
aria-controls="<?php echo $tab->href; ?>"
aria-selected="<?php echo $selected;?>">
				<?php echo Text::_($tab->label); ?>
			</button>
		</li>

		<?php
		$i++;
	endforeach;
	?>
</ul>

layouts/form/fabrik-control-group.php000064400000001225151165346320013774
0ustar00<?php
/**
 * Form element grid row
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2015 fabrikar.com - All rights reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */
defined('JPATH_BASE') or die;
$d = $displayData;

$class = explode(' ', $d->class);

if (in_array('error', $class))
{
	$class[] = 'has-error';

}
$class[] = 'form-group';
if ($d->column) {
    if ($d->startRow) {
        echo "<div class='row'>";
    }
    $class[] = $d->column;
}
?>
<div class="<?php echo implode(' ',
$class);?>" > 
<?php echo $d->row;?>
</div>
<?php
if ($d->column && $d->endRow) echo "</div>";
layouts/form/fabrik-custom-button.php000064400000001153151165346320014005
0ustar00<?php
/**
 * Do-nothing layout, which can be overridden to create custom button(s)
that will be rendered
 * next to the Submit button on a form.  Just a convenience so custom
buttons can be added without
 * using a custom template.
 *
 * $displayData is:
 *
 * 'formModel' => $model,
 * 'row' => $row,
 * 'rowid' => $thisRowId,
 * 'itemid' => $itemId
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.6
 */
defined('JPATH_BASE') or die;
$d = $displayData;
?>layouts/form/fabrik-custom-css-qs.php000064400000000660151165346320013705
0ustar00<?php
/**
 * Form control group
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */
defined('JPATH_BASE') or die;
$d = $displayData;
$path = 'components/com_fabrik/views/' . $d->view .
'/' . $d->jTmplFolder . '/' . $d->tmpl .
'/custom_css.php' . $d->qs;
echo $path;

layouts/form/fabrik-email-form.php000064400000003325151165346330013216
0ustar00<?php
/**
 * Email form layout
 */

defined('JPATH_BASE') or die;
use Joomla\CMS\Language\Text;
use Joomla\CMS\HTML\HTMLHelper;

$d = $displayData;
?>
<form method="post" action="index.php"
name="frontendForm">
	<table>
		<tr>
			<td><label for="email"><?php echo
Text::_('COM_FABRIK_YOUR_FRIENDS_EMAIL') ?>:</label>
			</td>
			<td><input class="input" type="text"
size="25" name="email" id="email"
/></td>
		</tr>
		<tr>
			<td><label for="yourname"><?php echo
Text::_('COM_FABRIK_YOUR_NAME'); ?>:</label>
			</td>
			<td><input class="input" type="text"
size="25" name="yourname" id="yourname"
/></td>
		</tr>
		<tr>
			<td><label for="youremail"><?php echo
Text::_('COM_FABRIK_YOUR_EMAIL'); ?>:</label>
			</td>
			<td><input class="input" type="text"
size="25" name="youremail" id="youremail"
/></td>
		</tr>
		<tr>
			<td><label for="subject"><?php echo
Text::_('COM_FABRIK_MESSAGE_SUBJECT'); ?>:</label>
			</td>
			<td><input class="input" type="text"
size="40" maxlength="40" name="subject"
					id="subject" /></td>
		</tr>
		<tr>
			<td colspan="2">
				<input type="submit" name="submit"
class="button btn btn-primary"
					value="<?php echo Text::_('COM_FABRIK_SEND_EMAIL');
?>" />
				<?php

				if (!$d->j3) :?>
				<input type="button" name="cancel"
					value="<?php echo Text::_('COM_FABRIK_CANCEL');
?>" class="button btn"
					onclick="window.close();" /></td>
			<?php
			endif;
			?>
		</tr>
	</table>
	<input name="referrer"
		value="<?php echo $d->referrer; ?>"
		type="hidden" /> <input type="hidden"
name="option"
		value="com_<?php echo $d->package; ?>" /> <input
type="hidden"
		name="view" value="emailform" /> <input
type="hidden" name="tmpl"
		value="component" />

	<?php echo HTMLHelper::_('form.token'); ?>
</form>
layouts/form/fabrik-email-icon.php000064400000000634151165346330013203
0ustar00<?php
/**
 * Email form layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;

if (!$d->popup):

?>

	<a class="btn btn-default fabrikWin"
rel='{"title":"<?php echo
Text::_('JGLOBAL_EMAIL'); ?>",
"loadMethod":"iframe",
"height":"300px"}' href="<?php echo
$d->link;?>">
		<?php echo FabrikHelperHTML::icon('icon-envelope',
Text::_('JGLOBAL_EMAIL'));?>
	</a>

	<?php
endif;

layouts/form/fabrik-input-group.php000064400000001006151165346330013451
0ustar00<?php
/**
 * Form input group
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2015 fabrikar.com - All rights reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       4.0
 */
defined('JPATH_BASE') or die;
$d = $displayData;

$class = explode(' ', $d->class);

if (in_array('error', $class))
{
    $class[] = 'has-error';

}
?>
<div class="i<?php echo implode(' ', $class);?>
<?php echo $d->span;?>" <?php echo $d->style;?>>
<?php echo $d->row;?>
</div>
layouts/form/fabrik-pdf-icon.php000064400000000447151165346330012667
0ustar00<?php
/**
 * Email form layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;
?>
<a href="<?php echo $d->pdfURL; ?>"
data-role="open-form-pdf" class="btn btn-default">
	<?php echo FabrikHelperHTML::icon('icon-file',
Text::_('COM_FABRIK_PDF'));?>
</a>&nbsp;layouts/form/fabrik-pdf-title.php000064400000000542151165346330013054
0ustar00<?php
/**
 * PDF document title for form view
 *
 */

defined('JPATH_BASE') or die;

$d = $displayData;

/**
 * Set the download file name based on the document title and rowid
 *
 * For overriding, you can access form data in
$d->model->data['yourtable____yourelement'];
 *
 */

echo $d->doc->getTitle() . '-' .
$d->model->getRowId();
layouts/form/fabrik-print-icon.php000064400000000432151165346330013244
0ustar00<?php
/**
 * Email form layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;

?>
<a class="btn btn-default" data-fabrik-print
href="<?php echo $d->link;?>">
	<?php echo FabrikHelperHTML::icon('icon-print',
Text::_('COM_FABRIK_PRINT'));?>
</a>layouts/form/fabrik-repeat-group-add.php000064400000000547151165346330014331
0ustar00<?php
/**
 * Repeat group add button
 */
use Joomla\CMS\Language\Text;
defined('JPATH_BASE') or die;

$d = $displayData;
?>
<a class="addGroup btn btn-small btn-success"
href="#" data-bs-toggle="tooltip" title="<?php
echo Text::_('COM_FABRIK_ADD_GROUP');?>">
	<?php echo  FabrikHelperHTML::icon('icon-plus', '',
'data-role="fabrik_duplicate_group"');?>
</a>

layouts/form/fabrik-repeat-group-delete.php000064400000000554151165346330015041
0ustar00<?php
/**
 * Repeat group delete button
 */
use Joomla\CMS\Language\Text;
defined('JPATH_BASE') or die;

$d = $displayData;
?>
<a class="deleteGroup btn btn-small btn-danger"
href="#"  data-bs-toggle="tooltip" title="<?php
echo Text::_('COM_FABRIK_DELETE_GROUP');?>">
	<?php echo FabrikHelperHTML::icon('icon-minus', '',
'data-role="fabrik_delete_group"'); ?>
</a>layouts/form/fabrik-repeat-group-row-add.php000064400000000601151165346340015126
0ustar00<?php
/**
 * Repeat group add button for table format
 */
use Joomla\CMS\Language\Text;
defined('JPATH_BASE') or die;

$d = $displayData;
?>
<a class="addGroup btn btn-small btn-success"
href="#" data-bs-toggle="tooltip" title="<?php
echo Text::_('COM_FABRIK_ADD_GROUP');?>">
	<?php echo  FabrikHelperHTML::icon('icon-plus', '',
'data-role="fabrik_duplicate_group"');?>
</a>layouts/form/fabrik-repeat-group-row-delete.php000064400000000610151165346340015640
0ustar00<?php
/**
 * Repeat group delete button for table format
 */
use Joomla\CMS\Language\Text;
defined('JPATH_BASE') or die;

$d = $displayData;
?>
<a class="deleteGroup btn btn-small btn-danger"
href="#"  data-bs-toggle="tooltip" title="<?php
echo Text::_('COM_FABRIK_DELETE_GROUP');?>">
	<?php echo FabrikHelperHTML::icon('icon-minus', '',
'data-role="fabrik_delete_group"'); ?>
</a>layouts/grid/fabrik-grid-end.php000064400000000371151165346340012640
0ustar00<?php
/**
 * Grid end
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */
?>
</div>
layouts/grid/fabrik-grid-start.php000064400000000406151165346340013226
0ustar00<?php
/**
 * Grid start
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */
?>
<div class="row">
layouts/list/fabrik-advanced-search-button.php000064400000000756151165346340015525
0ustar00<?php
/**
 * List advanced search button layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;
$title = '<span>' .
Text::_('COM_FABRIK_ADVANCED_SEARCH') .
'</span>';
$opts = array('alt' =>
Text::_('COM_FABRIK_ADVANCED_SEARCH'), 'class' =>
'fabrikTip', 'opts' =>
'{"notice":true}', 'title' => $title);

$img = FabrikHelperHTML::image('find', 'list',
$d->tmpl, $opts);

?>
<a href="<?php echo $d->url; ?>"
class="advanced-search-link"><?php echo
$img;?></a>layouts/list/fabrik-clear-button.php000064400000000710151165346340013571
0ustar00<?php
/**
 * List clear filters button layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;
$title = '<span>' . Text::_('COM_FABRIK_CLEAR') .
'</span>';
$opts = array('alt' => Text::_('COM_FABRIK_CLEAR'),
'class' => 'fabrikTip', 'opts' =>
'{"notice":true}', 'title' => $title);
$img = FabrikHelperHTML::image('filter_delete.png',
'list', $d->tmpl, $opts);

?>
<a href="#" class="clearFilters"><?php echo
$img;
?></a>layouts/list/fabrik-custom-css-qs.php000064400000001015151165346340013712
0ustar00<?php
/**
 * Custom CSS link
 *
 * In a layout so people can add additional QS args that can then be used
to set attributes dynamically
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */
defined('JPATH_BASE') or die;
$d = $displayData;
$path = 'components/com_fabrik/views/list/' . $d->jTmplFolder
. '/' . $d->tmpl . '/custom_css.php' . $d->qs;

echo $path;

layouts/list/fabrik-extra-row-class.php000064400000000733151165346340014232
0ustar00<?php
/**
 * Layout: List filters
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$d             = $displayData;

$extraClass = '';

switch ($d->tmpl)
{
	case 'div':
		$extraClass = 'fabrik_row well row-striped';
}

return $extraClass;

layouts/list/fabrik-filters-bootstrap.php000064400000006467151165346400014671
0ustar00<?php
/**
 * Layout: List filters bootstrap
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2022  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 * called if filter columns >1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Fabrik\Helpers\ArrayHelper;
use Joomla\CMS\Language\Text;

$d             = $displayData;
$underHeadings = $d->filterMode === 3 || $d->filterMode === 4;
$clearFiltersClass = $d->gotOptionalFilters ? "clearFilters
hasFilters" : "clearFilters";
$style = $d->toggleFilters ? 'style="display:none"'
: '';

?>
<?php
if (!$underHeadings) :
?>
<div class=" fabrikFilterContainer p-3 bg-light  mb-3"
<?php echo $style ?>>

        <div class="row d-flex justify-content-between">
            <div class="col-auto fabrik___heading"><?php
echo Text::_('COM_FABRIK_SEARCH'); ?>:</div>
            <div class="col-auto fabrik___heading" >
                <?php if ($d->showClearFilters) : ?>
                    <a class="<?php echo $clearFiltersClass;
?>" href="#">
                        <?php echo
FabrikHelperHTML::icon('icon-undo',
Text::_('COM_FABRIK_CLEAR')); ?>
                    </a>
                <?php endif; ?>
            </div>
        </div>
        <div class="row">
        <?php
            $chunkedFilters = array();
            $span = floor(12 / $d->filterCols);
            foreach ($d->filters as $key => $filter) :
                if ($key !== 'all') :
                    $required = $filter->required == 1 ? '
notempty' : '';
                    if ($d->filterCols === 1) :
                        $chunkedFilters[] = <<<EOT
                    <div class="row mt-3"
data-filter-row="$key">
                        <div class="col-sm-2 "><label
for={$filter->id} >{$filter->label}</label></div>
                        <div
class="col-sm-10">{$filter->element}</div>
                    </div>
EOT;
                    else :
                        $chunkedFilters[] = <<<EOT
                    <div class="row mt-3"
data-filter-row="$key">
                        <div class="col-sm-12"><label
for={$filter->id} >{$filter->label}</label></div>
                        <div
class="col-sm-12">{$filter->element}</div>
                    </div>
EOT;
                    endif;
                endif;
            endforeach;

            // last arg controls whether rows and cols are flipped (pivot)
            $chunkedFilters = ArrayHelper::chunk($chunkedFilters,
$d->filterCols, true);

            foreach ($chunkedFilters as $chunk) :
                foreach ($chunk as $filter) :
                    ?>
                    <div class="col-sm-<?php echo $span;
?>">
                    <?php
                        echo $filter;
                    ?>
                    </div>
                    <?php
                endforeach;
            endforeach;
        ?>
        </div>
            <?php

		if ($d->filter_action != 'onchange') :
        ?>
        <div class="row d-flex justify-content-end">
            
                <input type="button" class="col-auto 
btn-info btn fabrik_filter_submit button"
                        value="<?php echo
Text::_('COM_FABRIK_GO'); ?>" name="filter">
          
        </div>
        <?php
	    endif;
		?>
	</div>
	<?php
    endif;
   
?>layouts/list/fabrik-filters-modal-state-label.php000064400000001230151165346400016122
0ustar00<?php
/**
 * Layout for modal filter state, per element
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */
defined('_JEXEC') or die;

$d = $displayData;
?>
<button class="btn btn-sm btn-info m-1">
	<span data-modal-state-label><?php echo
$d->label;?></span>:
	<span data-modal-state-value><?php echo $d->displayValue .
' '; ?></span>
	<a data-filter-clear="<?php echo $d->key; ?>"
href="#" style="color: white;">
		<?php echo FabrikHelperHTML::icon('icon-cancel',
'', 'style="text-align: right; "'); ?>
	</a>
</button>layouts/list/fabrik-filters-modal.php000064400000007166151165346400013745
0ustar00<?php
/**
 * Layout: List filters
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2022 fabrikar.com - All rights reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Fabrik\Helpers\Html;
use Joomla\CMS\Language\Text;
use Fabrik\Helpers\ArrayHelper;

$d = $displayData;

$showClearFilters = false;
foreach ($d->filters as $key => $filter) :
	if ($filter->displayValue !== '') :
		$showClearFilters = true;
	endif;
endforeach;

?>
  <script>
  $( function() {
    jQuery( ".modal-content.draggable" ).draggable();
  } );
  </script>
<div data-modal-state-container style="display:<?php echo
$showClearFilters ? '' : 'none'; ?>">
	<?php echo Text::_('COM_FABRIK_FILTERS_ACTIVE'); ?>
	<span data-modal-state-display>
	<?php $layout =
Html::getLayout('list.fabrik-filters-modal-state-label');

	foreach ($d->filters as $key => $filter) :
		if ($filter->displayValue !== '') :

			$layoutData = (object) array(
				'label' => $filter->label,
				'displayValue' => $filter->displayValue,
				'key' => $key
			);
			echo $layout->render($layoutData);
		endif;
	endforeach;
	?>
	</span>
</div>
<div class="fabrikFilterContainer modal fade"
id="filter_modal">

	<div class="modal-dialog modal-lg">
		<div class="modal-content draggable">

			<div class="modal-header ">
					<h5 class="modal-title"><?php echo
Html::icon('icon-filter',
Text::_('COM_FABRIK_FILTER')); ?></h5>
					<button type="button" class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
			</div>
			
			<div class="modal-body p-3">

					<div class="row">
					<?php /*Filter block as in fabrik-filters-bootstrap*/
						$chunkedFilters = array();
						$span = floor(12 / $d->filterCols);
						foreach ($d->filters as $key => $filter) :
							if ($key !== 'all') :
								$required = $filter->required == 1 ? ' notempty' :
'';
								if ($d->filterCols === 1) :
									$chunkedFilters[] = <<<EOT
								<div class="row mt-3"
data-filter-row="$key">
									<div class="col-sm-2 "><label
for={$filter->id} >{$filter->label}</label></div>
									<div
class="col-sm-10">{$filter->element}</div>
								</div>
			EOT;
								else :
									$chunkedFilters[] = <<<EOT
								<div class="row mt-3"
data-filter-row="$key">
									<div class="col-sm-12"><label
for={$filter->id} >{$filter->label}</label></div>
									<div
class="col-sm-12">{$filter->element}</div>
								</div>
			EOT;
								endif;
							endif;
						endforeach;

						// last arg controls whether rows and cols are flipped (pivot)
						$chunkedFilters = ArrayHelper::chunk($chunkedFilters,
$d->filterCols, true);

						foreach ($chunkedFilters as $chunk) :
							foreach ($chunk as $filter) :
								?>
								<div class="col-sm-<?php echo $span; ?>">
								<?php
									echo $filter;
								?>
								</div>
								<?php
							endforeach;
						endforeach;
					?>
					</div>
			</div>
			<div class="modal-footer justify-content-between">
				<?php
				if ($d->filter_action != 'onchange') :
					?>
					<input type="button" data-bs-dismiss="modal"
class="btn btn-primary fabrik_filter_submit"
						value="<?php echo Text::_('COM_FABRIK_GO');
?>" name="filter">
					<?php
				endif;
				?>
				<?php
				if ($d->showClearFilters) :
					$clearFiltersClass = $d->gotOptionalFilters ? "btn
btn-outline-secondary clearFilters hasFilters" : "btn
btn-outline-secondary clearFilters";
				?>
					<input type="button" class="<?php echo
$clearFiltersClass; ?>"
						value="<?php echo Text::_('COM_FABRIK_CLEAR');
?>" />
				<?php endif ?>
			</div>
		</div>

	</div>

</div>
layouts/list/fabrik-filters.php000064400000001162151165346400012641
0ustar00<?php
/**
 * Layout: List filters
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
/*Use only one file for 1 and >1 filter columns. 
* view.html.php is doing $layoutFile = $this->filterCols > 1 ?
'fabrik-filters-bootstrap' : 'fabrik-filters';
* Leaving this and keep this fabrik-filters.php in case of existing layout
overrides (Fabrik3 upgrades).
*/
include
'fabrik-filters-bootstrap.php';layouts/list/fabrik-group-by-heading.php000064400000002206151165346400014332
0ustar00<?php
/**
 * Layout: List group by headings
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2015 fabrikar.com - All rights reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.4
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\Language\Text;

$d = $displayData;
$imgProps = array('alt' =>
Text::_('COM_FABRIK_TOGGLE'), 'data-role' =>
'toggle', 'data-expand-icon' =>
'icon-arrow-down', 'data-collapse-icon' =>
'icon-arrow-right');
?>

<?php if ($d->emptyDataMessage != '') : ?>
<a href="#" class="toggle">
    <?php else: ?>
    <a href="#" class="toggle fabrikTip"
title="<?php echo $d->emptyDataMessage ?>"
opts='{trigger: "hover"}'>
        <?php endif; ?>
        <?php echo FabrikHelperHTML::image('arrow-down',
'list', $d->tmpl, $imgProps); ?>
        <span class="groupTitle">
		<?php echo $d->title; ?> 
		<?php $d->group_by_show_count = isset($d->group_by_show_count) ?
$d->group_by_show_count : '1'; 
		if ($d->group_by_show_count) : ?>
			<span class="groupCount">( <?php echo $d->count
?> )</span>
		<?php endif; ?>	
	</span>
    </a>
layouts/list/fabrik-list-tabs.php000064400000001364151165346400013077
0ustar00<?php
/**
 * List tabs layout
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;
$i = 0;
?>

<ul class="nav nav-tabs fabrik-list-tabs"
role="tablist">
	<?php foreach ($d->tabs as $tab) :
		$style = array();
		$style[] = isset($tab->class) && $tab->class !==
'' ? 'class="' . $tab->class .
'"' : '';
		$style[] = isset($tab->css) && $tab->css !== '' ?
'style="' . $tab->css . '"': '';
		$href = isset($tab->href) ? $tab->href : $tab->id;

		?>
		<li role="presentation" data-role="fabrik_tab
nav-item" <?php echo implode(' ', $style); ?>>
			<a class="nav-link" href="<?php echo $href;
?>"
					id="<?php echo $tab->id; ?>">
					<?php echo Text::_($tab->label); ?>
			</a>
		</li>
		<?php
		$i++;
	endforeach;
	?>
</ul>

layouts/list/fabrik-order-heading.php000064400000003667151165346400013715
0ustar00<?php
/**
 * Default list element render
 * Override this file in
plugins/fabrik_element/{plugin}/layouts/fabrik-element-{plugin}-list.php
 */

defined('JPATH_BASE') or die;
use Joomla\CMS\Language\Text;

$d = $displayData;
$d->class = '';
$heading = '';
$img = '';
$headingProperties = array(
    'data-sort-asc-icon' => 'fa-sort-down',
    'data-sort-desc-icon' => 'fa-sort-up',
    'data-sort-icon' => 'fa-sort'
);
$imgProperties = array();

switch ($d->orderDir)
{
    case 'desc':
        $d->orderDir = '-';
        $d->class = 'class="fabrikorder-desc"';
        $imgProperties['alt'] =
Text::_('COM_FABRIK_ORDER');
        $img = FabrikHelperHTML::image('fa fa-sort-up',
'list', $d->tmpl, $imgProperties);
        break;
    case 'asc':
        $d->orderDir = 'desc';
        $d->class = 'class="fabrikorder-asc"';
        $imgProperties['alt'] =
Text::_('COM_FABRIK_ORDER');
        $img = FabrikHelperHTML::image('fa fa-sort-down',
'list', $d->tmpl, $imgProperties);
        break;
    case '':
    case '-':
        $d->orderDir = 'asc';
        $d->class = 'class="fabrikorder"';
        $imgProperties['alt'] =
Text::_('COM_FABRIK_ORDER');
        $img = FabrikHelperHTML::image('sort', 'list',
$d->tmpl, $imgProperties);
        break;
}

if ($d->class === '')
{
    if (in_array($d->key, $d->orderBys))
    {
        if ($d->item->order_dir === 'desc')
        {
            $d->class = 'class="fabrikorder-desc"';
            $imgProperties['alt'] =
Text::_('COM_FABRIK_ORDER');
            $img = FabrikHelperHTML::image('arrow-up.png',
'list', $d->tmpl, $imgProperties);
        }
    }
}

if ($d->elementParams->get('can_order', false))
{
    $heading = '<a ' . $d->class . ' ' .
FabrikHelperHTML::propertiesFromArray($headingProperties) . '
href="#">' . $img . $d->label .
'</a>';
}
else
{
    $img = $d->orderDir === 'asc' ? '' : $img;
    $heading = $img . $d->label;
}

echo $heading;
layouts/list/fabrik-related-data-add-button.php000064400000001266151165346400015564
0ustar00<?php
/**
 * List related data add button.
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d = $displayData;
$trigger = $d->popUp ? 'data-fabrik-view="form"' :
'';
?>

<?php if ($d->canAdd) :?>
<span class="addbutton">
	<a <?php echo $trigger; ?> href="<?php echo $d->url
;?>" title="<?php echo $d->label; ?>">
	<?php echo FabrikHelperHTML::icon('icon-plus', $d->label);
?>
	</a>
</span></a>
<?php else :?>
	<div style="text-align:center">
		<a title="<?php echo
Text::_('JERROR_ALERTNOAUTHOR'); ?>">
			<img src="<?php echo COM_FABRIK_LIVESITE;
?>media/com_fabrik/images/login.png"
				alt="<?php echo Text::_('JERROR_ALERTNOAUTHOR');
?>" />
		</a>
	</div>
<?php endif; ?>
layouts/list/fabrik-related-data-view-button.php000064400000002123151165346400015777
0ustar00<?php
/**
 * List related data view list data button.
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

$d       = $displayData;
$trigger = $d->popUp ? 'data-fabrik-view="list"' :
'';
$label   = '<span
class="fabrik_related_data_count">(' . $d->count .
')</span> ' . $d->label;
$icon    = FabrikHelperHTML::icon('icon-list-view', $label);
?>

<?php if ($d->canView) :
	if ($d->count === 0) : ?>
		<div style="text-align:center"
class="related_data_norecords">
			<?php echo $d->totalLabel; ?>
		</div>
		<?php
	endif;

	if ($d->showRelated) :
		?>
		<a class="related_data" <?php echo $trigger; ?>
href="<?php echo $d->url; ?>" title="<?php echo
$d->label; ?>"><?php echo $icon; ?></a>
		<?php
	endif;

	if ($d->showAddLink) :
		?>
		<div><?php echo $d->addLink; ?></div>
		<?php
	endif;
else :?>
	<div style="text-align:center">
		<a title="<?php echo
Text::_('COM_FABRIK_NO_ACCESS_PLEASE_LOGIN'); ?>">
			<img src="<?php echo COM_FABRIK_LIVESITE;
?>media/com_fabrik/images/login.png"
				alt="<?php echo
Text::_('COM_FABRIK_NO_ACCESS_PLEASE_LOGIN'); ?>" />
		</a>
	</div>
<?php endif; ?>
layouts/list/fabrik-search-all.php000064400000001627151165346400013212
0ustar00<?php
/**
 * Layout: Search all
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\HTML\HTMLHelper;

$d = $displayData;

?>
<div class="col-auto pe-0 input-group-sm">
	<input
		type="search"
		size="20"
		placeholder="<?php echo $d->searchLabel; ?>"
		title="<?php echo $d->searchLabel; ?>"
		value="<?php echo $d->v; ?>"
		class="fabrik_filter <?php echo $d->class; ?>"
		name="<?php echo $d->requestKey; ?>"
		id="<?php echo $d->id; ?>"
	/>
</div>
<?php
if ($d->advanced) :
	echo '<div class="col-sm-7 ps-1">';
	echo HTMLHelper::_('select.genericList', $d->searchOpts,
'search-mode-advanced',
"class='form-select'", 'value',
'text', $d->mode);
	echo '</div>';
endif;
layouts/list/filter/fabrik-filter-checkbox.php000064400000000667151165346400015540
0ustar00<?php
defined('JPATH_BASE') or die;

$d    = $displayData;
$inputDataAttribs = array('data-filter-name="' .
$d->elementName . '"');
?>
<div class="fabrikListFilterCheckbox">
<?php
echo implode("\n",
				FabrikHelperHTML::grid($d->values, $d->labels, $d->default,
$d->name, 'checkbox', false, 1, 
					['input' => ['fabrik_filter',
'form-check-input']], /* Classes */
					false, array(), $inputDataAttribs)
						);
?>
</div>layouts/listactions/dropdown.php000064400000001611151165346400013151
0ustar00<?php
/**
 * Layout: list row buttons - rendered as a Bootstrap dropdown
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$ulclass = 'dropdown-menu ';

if ($displayData['align'] == 'right')
{
	$ulclass .= ' dropdown-menu-end';
}
else
{
	$ulclass .= ' dropdown-menu-start';
}

?>
<div class="dropdown  fabrik_action ">
	<button class="btn btn-default btn-mini dropdown-toggle "
type="button" data-bs-toggle="dropdown"
aria-haspopup="true" aria-expanded="true">
		<span class="caret"></span>
	</button>
	<ul class="<?php echo $ulclass; ?>">
		<li class="nav-link"><?php echo
implode('</li>' . "\n" . '<li
class="nav-link">', $displayData['items']);
?></li>
	</ul>
</div>layouts/listactions/fabrik-delete-button.php000064400000001170151165346400015324
0ustar00<?php
/**
 * Layout: list row buttons - rendered as a Bootstrap dropdown
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
$d = $displayData;

?>
<a href="#" class="<?php echo
$d->btnClass;?>delete" data-listRef="list_<?php echo
$d->renderContext;?>"
	title="<?php echo Text::_('COM_FABRIK_DELETE');
?>">
	<span class="fa fa-trash"></span> <?php echo
$d->text;?></a>layouts/listactions/fabrik-edit-button.php000064400000001535151165346400015014
0ustar00<?php
/**
 * Layout: list row buttons - rendered as a Bootstrap dropdown
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
$d = $displayData;

?>
<a data-loadmethod="<?php echo $d->loadMethod; ?>" 
    class="<?php echo $d->class;?> btn-default" <?php
echo $d->editAttributes;?>
    data-isajax="<?php echo $d->isAjax; ?>"
    data-list="<?php echo $d->dataList;?>" 
    data-rowid="<?php echo $d->rowId; ?>"
    data-iscustom="<?php if ($d->isCustom) echo '1';
else echo '0'; ?>"
    href="<?php echo $d->editLink;?>" 
    title="<?php echo $d->editLabel;?>">
	<span class="fa fa-edit"></span> <?php echo
$d->editText;
?></a>layouts/listactions/fabrik-view-button.php000064400000001557151165346400015045
0ustar00<?php
/**
 * Layout: list edit button
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.3
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
$d = $displayData;

?>
<a data-loadmethod="<?php echo $d->loadMethod;?>" 
    class="<?php echo $d->class;?> btn-default" <?php
echo $d->detailsAttributes; ?>
	data-list="<?php echo $d->dataList; ?>" 
    data-isajax="<?php echo $d->isAjax; ?>"
    data-rowid="<?php echo $d->rowId; ?>"
    data-iscustom="<?php if ($d->isCustom) echo '1';
else echo '0'; ?>"
    href="<?php echo $d->link; ?>" 
    title="<?php echo $d->viewLabel;?>" 
    target="<?php echo $d->viewLinkTarget; ?>">
    <span class="fa fa-search"></span> <?php echo
$d->viewText;
?></a>layouts/listactions/inline.php000064400000000710151165346400012572
0ustar00<?php
/**
 * Layout: list row buttons - rendered 'inline' as a Bootstrap
button group
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
?>
<div class="btn-group">
<?php echo implode(' ', $displayData['items']);
?>
</div>
layouts/modal/fabrik-close.php000064400000000272151165346400012420
0ustar00<?php
/**
 * Email form layout
 */

defined('JPATH_BASE') or die;

$d = $displayData;
?>
<a href="#" class="closeFabWin"
data-role="close">
	<span class="fa fa-times-circle"></span>
</a>layouts/pagination/fabrik-pagination-footer.php000064400000002230151165346410015772
0ustar00<?php
/**
 * Layout: List Pagination Footer
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2015 fabrikar.com - All rights reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.3
 */

$d = $displayData;

if ($d->showNav) :
?>
<div class="list-footer container">
	<div class="limit row input-group pb-2">
			<div class="col col-sm-2"
style="text-align:right;">
				<label for="<?php echo $d->listName;?>">
					<p style="margin-top: 0.5rem; margin-bottom: 0.5rem;">
						<?php echo $d->label; ?>
					</p>
				</label>
			</div>
			<?php echo $d->list; ?>
			<div class="col col-sm-3 ms-auto" 
style="text-align:right;">
				<p style="margin-top: 0.5rem; margin-bottom: 0.5rem;">
					<?php echo $d->pagesCounter; ?>
				</p>
			</div>
	</div>
	<?php echo $d->links; ?>
	<input type="hidden" name="limitstart<?php echo
$d->id; ?>" id="limitstart<?php echo $d->id;
?>" value="<?php echo $d->value; ?>" />
</div>
	<?php
else :
	if ($d->showTotal) : ?>
		<div class="list-footer">
			<div class="input-group">
				<p>
					<?php echo $d->pagesCounter; ?>
				</p>
			</div>
		</div>
		<?php
	endif;
endif;
layouts/pagination/fabrik-pagination-item-active.php000064400000000657151165346410016716
0ustar00<?php
/**
 * Layout: List Pagination Active Item
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4.2
 */

$d = $displayData;
$item = $d->item;

?>
<a title="<?php echo $item->text; ?>"
href="<?php echo $item->link; ?>"
class="pagenav"><?php echo $item->text; ?></a>


layouts/pagination/fabrik-pagination-item-inactive.php000064400000001043151165346410017233
0ustar00<?php

use Joomla\CMS\Factory;

/**
 * Layout: List Pagination Inactive Item
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4.2
 */

$d    = $displayData;
$item = $d->item;
$app  = Factory::getApplication();

if ($app->isClient('administrator')) :
	?>
	<span><?php echo $item->text; ?></span>
	<?php
else :
	?>

	<span class="pagenav"><?php echo $item->text;
?></span>
	<?php
endif;
layouts/pagination/fabrik-pagination-limitbox.php000064400000002075151165346410016332
0ustar00<?php
/**
 * Layout: List Limit Box
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.3
 */

use Joomla\CMS\Language\Text;
use Joomla\CMS\HTML\HTMLHelper;

$d = $displayData;

// Initialize variables
$limits = array();
$values = array();

for ($i = 5; $i <= 30; $i += 5)
{
	$values[] = $i;
}

$values[] = 50;
$values[] = 100;

if (!in_array($d->startLimit, $values))
{
	$values[] = $d->startLimit;
}

asort($values);

foreach ($values as $v)
{
	$limits[] = HTMLHelper::_('select.option', $v);
}

if ($d->showAllOption == true)
{
	$limits[] = HTMLHelper::_('select.option', '-1',
Text::_('COM_FABRIK_ALL'));
}

$selected   = $d->viewAll ? '-1' : $d->limit;
$js         = '';
$attributes = 'class="inputbox form-select"
size="1" onchange="' . $js . '"';
$html       = HTMLHelper::_('select.genericlist', $limits,
'limit' . $d->id, $attributes, 'value',
'text', $selected);

echo '<div class="col
col-sm-2">'.$html.'</div>';
layouts/pagination/fabrik-pagination-links.php000064400000002307151165346410015621
0ustar00<?php
/**
 * Layout: List Pagination Footer
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2015 fabrikar.com - All rights reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.3.3
 */

$d = $displayData;
$list = $d->list;

$startClass = $list['start']['active'] == 1 ? '
active' : ' ';
$prevClass = $list['previous']['active'] == 1 ? '
active' : ' ';
$nextClass = $list['next']['active'] == 1 ? '
active' : ' ';
$endClass = $list['end']['active'] == 1 ? '
active' : ' ';

?>

<nav aria-label="Pagination">
	<ul class="pagination">
		<li class="page-item<?php echo $startClass; ?>">
			<?php echo $list['start']['data']; ?>
		</li>
		<li class="page-item<?php echo $prevClass; ?>">
			<?php echo $list['previous']['data']; ?>
		</li>
		<?php
		foreach ($list['pages'] as $page) :
			$class = $page['active'] == 1 ? ' active' :
''; ?>
			<li class="page-item<?php echo $class; ?>">
				<?php echo $page['data']; ?>
			</li>
		<?php endforeach ;?>

		<li class="page-item<?php echo $nextClass; ?>">
			<?php echo $list['next']['data'];?>
		</li>
		<li class="page-item<?php echo $endClass; ?>">
			<?php echo $list['end']['data'];?>
		</li>
	</ul>
</nav>libs/.gitignore000064400000000017151165346410007471
0ustar00/authorize.net
libs/amazons3/S3.php000064400000232756151165346410010253 0ustar00<?php
/**
 * $Id$
 *
 * Copyright (c) 2013, Donovan Schönknecht.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * Amazon S3 is a trademark of Amazon.com, Inc. or its affiliates.
 */

/**
 * Amazon S3 PHP class
 *
 * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
 * @version 0.5.1
 */
class S3
{
	// ACL flags
	const ACL_PRIVATE = 'private';
	const ACL_PUBLIC_READ = 'public-read';
	const ACL_PUBLIC_READ_WRITE = 'public-read-write';
	const ACL_AUTHENTICATED_READ = 'authenticated-read';

	const STORAGE_CLASS_STANDARD = 'STANDARD';
	const STORAGE_CLASS_RRS = 'REDUCED_REDUNDANCY';
	const STORAGE_CLASS_STANDARD_IA = 'STANDARD_IA';

	const SSE_NONE = '';
	const SSE_AES256 = 'AES256';

	/**
	 * The AWS Access key
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__accessKey = null;

	/**
	 * AWS Secret Key
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__secretKey = null;

	/**
	 * SSL Client key
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__sslKey = null;

	/**
	 * Default delimiter to be used, for example while getBucket().
	 * @var string
	 * @access public
	 * @static
	 */
	public static $defDelimiter = null;

	/**
	 * AWS URI
	 *
	 * @var string
	 * @acess public
	 * @static
	 */
	public static $endpoint = 's3.amazonaws.com';

	/**
	 * AWS Region
	 *
	 * @var string
	 * @acess public
	 * @static
	 */
	public static $region = '';

	/**
	 * Proxy information
	 *
	 * @var null|array
	 * @access public
	 * @static
	 */
	public static $proxy = null;

	/**
	 * Connect using SSL?
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $useSSL = false;

	/**
	 * Use SSL validation?
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $useSSLValidation = true;

	/**
	 * Use SSL version
	 *
	 * @var const
	 * @access public
	 * @static
	 */
	public static $useSSLVersion = CURL_SSLVERSION_TLSv1;

	/**
	 * Use PHP exceptions?
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $useExceptions = false;

	/**
	 * Time offset applied to time()
	 * @access private
	 * @static
	 */
	private static $__timeOffset = 0;

	/**
	 * SSL client key
	 *
	 * @var bool
	 * @access public
	 * @static
	 */
	public static $sslKey = null;

	/**
	 * SSL client certfificate
	 *
	 * @var string
	 * @acess public
	 * @static
	 */
	public static $sslCert = null;

	/**
	 * SSL CA cert (only required if you are having problems with your system
CA cert)
	 *
	 * @var string
	 * @access public
	 * @static
	 */
	public static $sslCACert = null;

	/**
	 * AWS Key Pair ID
	 *
	 * @var string
	 * @access private
	 * @static
	 */
	private static $__signingKeyPairId = null;

	/**
	 * Key resource, freeSigningKey() must be called to clear it from memory
	 *
	 * @var bool
	 * @access private
	 * @static
	 */
	private static $__signingKeyResource = false;

	/**
	 * AWS Signature Version
	 *
	 * @var string
	 * @acess public
	 * @static
	 */
	public static $signVer = 'v2';

	/**
	 * Constructor - if you're not using the class statically
	 *
	 * @param string $accessKey Access key
	 * @param string $secretKey Secret key
	 * @param boolean $useSSL Enable SSL
	 * @param string $endpoint Amazon URI
	 * @return void
	 */
	public function __construct($accessKey = null, $secretKey = null, $useSSL
= false, $endpoint = 's3.amazonaws.com', $region = '')
	{
		if ($accessKey !== null && $secretKey !== null)
			self::setAuth($accessKey, $secretKey);
		self::$useSSL = $useSSL;
		self::$endpoint = $endpoint;
		self::$region = $region;
	}


	/**
	 * Set the service endpoint
	 *
	 * @param string $host Hostname
	 * @return void
	 */
	public function setEndpoint($host)
	{
		self::$endpoint = $host;
	}


	/**
	 * Set the service region
	 *
	 * @param string $region
	 * @return void
	 */
	public function setRegion($region)
	{
		self::$region = $region;
	}


	/**
	 * Get the service region
	 *
	 * @return string $region
	 * @static
	 */
	public static function getRegion()
	{
		$region = self::$region;

		// parse region from endpoint if not specific
		if (empty($region)) {
			if
(preg_match("/s3[.-](?:website-|dualstack\.)?(.+)\.amazonaws\.com/i",self::$endpoint,$match)
!== 0 && strtolower($match[1]) !== "external-1") {
				$region = $match[1];
			}
		}

		return empty($region) ? 'us-east-1' : $region;
	}


	/**
	 * Set AWS access key and secret key
	 *
	 * @param string $accessKey Access key
	 * @param string $secretKey Secret key
	 * @return void
	 */
	public static function setAuth($accessKey, $secretKey)
	{
		self::$__accessKey = $accessKey;
		self::$__secretKey = $secretKey;
	}


	/**
	 * Check if AWS keys have been set
	 *
	 * @return boolean
	 */
	public static function hasAuth() {
		return (self::$__accessKey !== null && self::$__secretKey !==
null);
	}


	/**
	 * Set SSL on or off
	 *
	 * @param boolean $enabled SSL enabled
	 * @param boolean $validate SSL certificate validation
	 * @return void
	 */
	public static function setSSL($enabled, $validate = true)
	{
		self::$useSSL = $enabled;
		self::$useSSLValidation = $validate;
	}


	/**
	 * Set SSL client certificates (experimental)
	 *
	 * @param string $sslCert SSL client certificate
	 * @param string $sslKey SSL client key
	 * @param string $sslCACert SSL CA cert (only required if you are having
problems with your system CA cert)
	 * @return void
	 */
	public static function setSSLAuth($sslCert = null, $sslKey = null,
$sslCACert = null)
	{
		self::$sslCert = $sslCert;
		self::$sslKey = $sslKey;
		self::$sslCACert = $sslCACert;
	}


	/**
	 * Set proxy information
	 *
	 * @param string $host Proxy hostname and port (localhost:1234)
	 * @param string $user Proxy username
	 * @param string $pass Proxy password
	 * @param constant $type CURL proxy type
	 * @return void
	 */
	public static function setProxy($host, $user = null, $pass = null, $type =
CURLPROXY_SOCKS5)
	{
		self::$proxy = array('host' => $host, 'type' =>
$type, 'user' => $user, 'pass' => $pass);
	}


	/**
	 * Set the error mode to exceptions
	 *
	 * @param boolean $enabled Enable exceptions
	 * @return void
	 */
	public static function setExceptions($enabled = true)
	{
		self::$useExceptions = $enabled;
	}


	/**
	 * Set AWS time correction offset (use carefully)
	 *
	 * This can be used when an inaccurate system time is generating
	 * invalid request signatures.  It should only be used as a last
	 * resort when the system time cannot be changed.
	 *
	 * @param string $offset Time offset (set to zero to use AWS server time)
	 * @return void
	 */
	public static function setTimeCorrectionOffset($offset = 0)
	{
		if ($offset == 0)
		{
			$rest = new S3Request('HEAD');
			$rest = $rest->getResponse();
			$awstime = $rest->headers['date'];
			$systime = time();
			$offset = $systime > $awstime ? -($systime - $awstime) : ($awstime -
$systime);
		}
		self::$__timeOffset = $offset;
	}


	/**
	 * Set signing key
	 *
	 * @param string $keyPairId AWS Key Pair ID
	 * @param string $signingKey Private Key
	 * @param boolean $isFile Load private key from file, set to false to load
string
	 * @return boolean
	 */
	public static function setSigningKey($keyPairId, $signingKey, $isFile =
true)
	{
		self::$__signingKeyPairId = $keyPairId;
		if ((self::$__signingKeyResource = openssl_pkey_get_private($isFile ?
				file_get_contents($signingKey) : $signingKey)) !== false) return true;
		self::__triggerError('S3::setSigningKey(): Unable to open load
private key: '.$signingKey, __FILE__, __LINE__);
		return false;
	}


	/**
	 * Set Signature Version
	 *
	 * @param string $version of signature ('v4' or 'v2')
	 * @return void
	 */
	public static function setSignatureVersion($version = 'v2')
	{
		self::$signVer = $version;
	}


	/**
	 * Free signing key from memory, MUST be called if you are using
setSigningKey()
	 *
	 * @return void
	 */
	public static function freeSigningKey()
	{
		if (self::$__signingKeyResource !== false)
			openssl_free_key(self::$__signingKeyResource);
	}


	/**
	 * Internal error handler
	 *
	 * @internal Internal error handler
	 * @param string $message Error message
	 * @param string $file Filename
	 * @param integer $line Line number
	 * @param integer $code Error code
	 * @return void
	 */
	private static function __triggerError($message, $file, $line, $code = 0)
	{
		if (self::$useExceptions)
			throw new S3Exception($message, $file, $line, $code);
		else
			trigger_error($message, E_USER_WARNING);
	}


	/**
	 * Get a list of buckets
	 *
	 * @param boolean $detailed Returns detailed bucket list when true
	 * @return array | false
	 */
	public static function listBuckets($detailed = false)
	{
		$rest = new S3Request('GET', '', '',
self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::listBuckets(): [%s] %s",
$rest->error['code'],
				$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		$results = array();
		if (!isset($rest->body->Buckets)) return $results;

		if ($detailed)
		{
			if (isset($rest->body->Owner, $rest->body->Owner->ID,
$rest->body->Owner->DisplayName))
				$results['owner'] = array(
					'id' => (string)$rest->body->Owner->ID,
'name' => (string)$rest->body->Owner->DisplayName
				);
			$results['buckets'] = array();
			foreach ($rest->body->Buckets->Bucket as $b)
				$results['buckets'][] = array(
					'name' => (string)$b->Name, 'time' =>
strtotime((string)$b->CreationDate)
				);
		} else
			foreach ($rest->body->Buckets->Bucket as $b) $results[] =
(string)$b->Name;

		return $results;
	}


	/**
	 * Get contents for a bucket
	 *
	 * If maxKeys is null this method will loop through truncated result sets
	 *
	 * @param string $bucket Bucket name
	 * @param string $prefix Prefix
	 * @param string $marker Marker (last file listed)
	 * @param string $maxKeys Max keys (maximum number of keys to return)
	 * @param string $delimiter Delimiter
	 * @param boolean $returnCommonPrefixes Set to true to return
CommonPrefixes
	 * @return array | false
	 */
	public static function getBucket($bucket, $prefix = null, $marker = null,
$maxKeys = null, $delimiter = null, $returnCommonPrefixes = false)
	{
		$rest = new S3Request('GET', $bucket, '',
self::$endpoint);
		if ($maxKeys == 0) $maxKeys = null;
		if ($prefix !== null && $prefix !== '')
$rest->setParameter('prefix', $prefix);
		if ($marker !== null && $marker !== '')
$rest->setParameter('marker', $marker);
		if ($maxKeys !== null && $maxKeys !== '')
$rest->setParameter('max-keys', $maxKeys);
		if ($delimiter !== null && $delimiter !== '')
$rest->setParameter('delimiter', $delimiter);
		else if (!empty(self::$defDelimiter))
$rest->setParameter('delimiter', self::$defDelimiter);
		$response = $rest->getResponse();
		if ($response->error === false && $response->code !== 200)
			$response->error = array('code' => $response->code,
'message' => 'Unexpected HTTP status');
		if ($response->error !== false)
		{
			self::__triggerError(sprintf("S3::getBucket(): [%s] %s",
				$response->error['code'],
$response->error['message']), __FILE__, __LINE__);
			return false;
		}

		$results = array();

		$nextMarker = null;
		if (isset($response->body, $response->body->Contents))
			foreach ($response->body->Contents as $c)
			{
				$results[(string)$c->Key] = array(
					'name' => (string)$c->Key,
					'time' => strtotime((string)$c->LastModified),
					'size' => (int)$c->Size,
					'hash' => substr((string)$c->ETag, 1, -1)
				);
				$nextMarker = (string)$c->Key;
			}

		if ($returnCommonPrefixes && isset($response->body,
$response->body->CommonPrefixes))
			foreach ($response->body->CommonPrefixes as $c)
				$results[(string)$c->Prefix] = array('prefix' =>
(string)$c->Prefix);

		if (isset($response->body, $response->body->IsTruncated)
&&
			(string)$response->body->IsTruncated == 'false') return
$results;

		if (isset($response->body, $response->body->NextMarker))
			$nextMarker = (string)$response->body->NextMarker;

		// Loop through truncated results if maxKeys isn't specified
		if ($maxKeys == null && $nextMarker !== null &&
(string)$response->body->IsTruncated == 'true')
			do
			{
				$rest = new S3Request('GET', $bucket, '',
self::$endpoint);
				if ($prefix !== null && $prefix !== '')
$rest->setParameter('prefix', $prefix);
				$rest->setParameter('marker', $nextMarker);
				if ($delimiter !== null && $delimiter !== '')
$rest->setParameter('delimiter', $delimiter);

				if (($response = $rest->getResponse()) == false ||
$response->code !== 200) break;

				if (isset($response->body, $response->body->Contents))
					foreach ($response->body->Contents as $c)
					{
						$results[(string)$c->Key] = array(
							'name' => (string)$c->Key,
							'time' => strtotime((string)$c->LastModified),
							'size' => (int)$c->Size,
							'hash' => substr((string)$c->ETag, 1, -1)
						);
						$nextMarker = (string)$c->Key;
					}

				if ($returnCommonPrefixes && isset($response->body,
$response->body->CommonPrefixes))
					foreach ($response->body->CommonPrefixes as $c)
						$results[(string)$c->Prefix] = array('prefix' =>
(string)$c->Prefix);

				if (isset($response->body, $response->body->NextMarker))
					$nextMarker = (string)$response->body->NextMarker;

			} while ($response !== false &&
(string)$response->body->IsTruncated == 'true');

		return $results;
	}


	/**
	 * Put a bucket
	 *
	 * @param string $bucket Bucket name
	 * @param constant $acl ACL flag
	 * @param string $location Set as "EU" to create buckets hosted
in Europe
	 * @return boolean
	 */
	public static function putBucket($bucket, $acl = self::ACL_PRIVATE,
$location = false)
	{
		$rest = new S3Request('PUT', $bucket, '',
self::$endpoint);
		$rest->setAmzHeader('x-amz-acl', $acl);

		if ($location === false) $location = self::getRegion();

		if ($location !== false)
		{
			$dom = new DOMDocument;
			$createBucketConfiguration =
$dom->createElement('CreateBucketConfiguration');
			$locationConstraint =
$dom->createElement('LocationConstraint', $location);
			$createBucketConfiguration->appendChild($locationConstraint);
			$dom->appendChild($createBucketConfiguration);
			$rest->data = $dom->saveXML();
			$rest->size = strlen($rest->data);
			$rest->setHeader('Content-Type',
'application/xml');
		}
		$rest = $rest->getResponse();

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::putBucket({$bucket}, {$acl},
{$location}): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Delete an empty bucket
	 *
	 * @param string $bucket Bucket name
	 * @return boolean
	 */
	public static function deleteBucket($bucket)
	{
		$rest = new S3Request('DELETE', $bucket, '',
self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 204)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::deleteBucket({$bucket}): [%s]
%s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Create input info array for putObject()
	 *
	 * @param string $file Input file
	 * @param mixed $md5sum Use MD5 hash (supply a string if you want to use
your own)
	 * @return array | false
	 */
	public static function inputFile($file, $md5sum = true)
	{
		if (!file_exists($file) || !is_file($file) || !is_readable($file))
		{
			self::__triggerError('S3::inputFile(): Unable to open input file:
'.$file, __FILE__, __LINE__);
			return false;
		}
		clearstatcache(false, $file);
		return array('file' => $file, 'size' =>
filesize($file), 'md5sum' => $md5sum !== false ?
			(is_string($md5sum) ? $md5sum : base64_encode(md5_file($file, true))) :
'', 'sha256sum' => hash_file('sha256',
$file));
	}


	/**
	 * Create input array info for putObject() with a resource
	 *
	 * @param string $resource Input resource to read from
	 * @param integer $bufferSize Input byte size
	 * @param string $md5sum MD5 hash to send (optional)
	 * @return array | false
	 */
	public static function inputResource(&$resource, $bufferSize = false,
$md5sum = '')
	{
		if (!is_resource($resource) || (int)$bufferSize < 0)
		{
			self::__triggerError('S3::inputResource(): Invalid resource or
buffer size', __FILE__, __LINE__);
			return false;
		}

		// Try to figure out the bytesize
		if ($bufferSize === false)
		{
			if (fseek($resource, 0, SEEK_END) < 0 || ($bufferSize =
ftell($resource)) === false)
			{
				self::__triggerError('S3::inputResource(): Unable to obtain
resource size', __FILE__, __LINE__);
				return false;
			}
			fseek($resource, 0);
		}

		$input = array('size' => $bufferSize, 'md5sum'
=> $md5sum);
		$input['fp'] =& $resource;
		return $input;
	}


	/**
	 * Put an object
	 *
	 * @param mixed $input Input data
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param constant $acl ACL constant
	 * @param array $metaHeaders Array of x-amz-meta-* headers
	 * @param array $requestHeaders Array of request headers or content type
as a string
	 * @param constant $storageClass Storage class constant
	 * @param constant $serverSideEncryption Server-side encryption
	 * @return boolean
	 */
	public static function putObject($input, $bucket, $uri, $acl =
self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(),
$storageClass = self::STORAGE_CLASS_STANDARD, $serverSideEncryption =
self::SSE_NONE)
	{
		if ($input === false) return false;
		$rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);

		if (!is_array($input)) $input = array(
			'data' => $input, 'size' => strlen($input),
			'md5sum' => base64_encode(md5($input, true)),
			'sha256sum' => hash('sha256', $input)
		);

		// Data
		if (isset($input['fp']))
			$rest->fp =& $input['fp'];
		elseif (isset($input['file']))
			$rest->fp = @fopen($input['file'], 'rb');
		elseif (isset($input['data']))
			$rest->data = $input['data'];

		// Content-Length (required)
		if (isset($input['size']) && $input['size']
>= 0)
			$rest->size = $input['size'];
		else {
			if (isset($input['file'])) {
				clearstatcache(false, $input['file']);
				$rest->size = filesize($input['file']);
			}
			elseif (isset($input['data']))
				$rest->size = strlen($input['data']);
		}

		// Custom request headers (Content-Type, Content-Disposition,
Content-Encoding)
		if (is_array($requestHeaders))
			foreach ($requestHeaders as $h => $v)
				strpos($h, 'x-amz-') === 0 ? $rest->setAmzHeader($h, $v) :
$rest->setHeader($h, $v);
		elseif (is_string($requestHeaders)) // Support for legacy contentType
parameter
			$input['type'] = $requestHeaders;

		// Content-Type
		if (!isset($input['type']))
		{
			if (isset($requestHeaders['Content-Type']))
				$input['type'] =&
$requestHeaders['Content-Type'];
			elseif (isset($input['file']))
				$input['type'] =
self::__getMIMEType($input['file']);
			else
				$input['type'] = 'application/octet-stream';
		}

		if ($storageClass !== self::STORAGE_CLASS_STANDARD) // Storage class
			$rest->setAmzHeader('x-amz-storage-class', $storageClass);

		if ($serverSideEncryption !== self::SSE_NONE) // Server-side encryption
			$rest->setAmzHeader('x-amz-server-side-encryption',
$serverSideEncryption);

		// We need to post with Content-Length and Content-Type, MD5 is optional
		if ($rest->size >= 0 && ($rest->fp !== false ||
$rest->data !== false))
		{
			$rest->setHeader('Content-Type', $input['type']);
			if (isset($input['md5sum']))
$rest->setHeader('Content-MD5', $input['md5sum']);

			if (isset($input['sha256sum']))
$rest->setAmzHeader('x-amz-content-sha256',
$input['sha256sum']);

			$rest->setAmzHeader('x-amz-acl', $acl);
			foreach ($metaHeaders as $h => $v)
$rest->setAmzHeader('x-amz-meta-'.$h, $v);
			$rest->getResponse();
		} else
			$rest->response->error = array('code' => 0,
'message' => 'Missing input parameters');

		if ($rest->response->error === false &&
$rest->response->code !== 200)
			$rest->response->error = array('code' =>
$rest->response->code, 'message' => 'Unexpected
HTTP status');
		if ($rest->response->error !== false)
		{
			self::__triggerError(sprintf("S3::putObject(): [%s] %s",
				$rest->response->error['code'],
$rest->response->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Put an object from a file (legacy function)
	 *
	 * @param string $file Input file path
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param constant $acl ACL constant
	 * @param array $metaHeaders Array of x-amz-meta-* headers
	 * @param string $contentType Content type
	 * @return boolean
	 */
	public static function putObjectFile($file, $bucket, $uri, $acl =
self::ACL_PRIVATE, $metaHeaders = array(), $contentType = null)
	{
		return self::putObject(self::inputFile($file), $bucket, $uri, $acl,
$metaHeaders, $contentType);
	}


	/**
	 * Put an object from a string (legacy function)
	 *
	 * @param string $string Input data
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param constant $acl ACL constant
	 * @param array $metaHeaders Array of x-amz-meta-* headers
	 * @param string $contentType Content type
	 * @return boolean
	 */
	public static function putObjectString($string, $bucket, $uri, $acl =
self::ACL_PRIVATE, $metaHeaders = array(), $contentType =
'text/plain')
	{
		return self::putObject($string, $bucket, $uri, $acl, $metaHeaders,
$contentType);
	}


	/**
	 * Get an object
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param mixed $saveTo Filename or resource to write to
	 * @return mixed
	 */
	public static function getObject($bucket, $uri, $saveTo = false)
	{
		$rest = new S3Request('GET', $bucket, $uri, self::$endpoint);
		if ($saveTo !== false)
		{
			if (is_resource($saveTo))
				$rest->fp =& $saveTo;
			else
				if (($rest->fp = @fopen($saveTo, 'wb')) !== false)
					$rest->file = realpath($saveTo);
				else
					$rest->response->error = array('code' => 0,
'message' => 'Unable to open save file for writing:
'.$saveTo);
		}
		if ($rest->response->error === false) $rest->getResponse();

		if ($rest->response->error === false &&
$rest->response->code !== 200)
			$rest->response->error = array('code' =>
$rest->response->code, 'message' => 'Unexpected
HTTP status');
		if ($rest->response->error !== false)
		{
			self::__triggerError(sprintf("S3::getObject({$bucket}, {$uri}):
[%s] %s",
				$rest->response->error['code'],
$rest->response->error['message']), __FILE__, __LINE__);
			return false;
		}
		return $rest->response;
	}


	/**
	 * Get object information
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param boolean $returnInfo Return response information
	 * @return mixed | false
	 */
	public static function getObjectInfo($bucket, $uri, $returnInfo = true)
	{
		$rest = new S3Request('HEAD', $bucket, $uri, self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && ($rest->code !== 200
&& $rest->code !== 404))
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getObjectInfo({$bucket}, {$uri}):
[%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return $rest->code == 200 ? $returnInfo ? $rest->headers : true :
false;
	}


	/**
	 * Copy an object
	 *
	 * @param string $srcBucket Source bucket name
	 * @param string $srcUri Source object URI
	 * @param string $bucket Destination bucket name
	 * @param string $uri Destination object URI
	 * @param constant $acl ACL constant
	 * @param array $metaHeaders Optional array of x-amz-meta-* headers
	 * @param array $requestHeaders Optional array of request headers (content
type, disposition, etc.)
	 * @param constant $storageClass Storage class constant
	 * @return mixed | false
	 */
	public static function copyObject($srcBucket, $srcUri, $bucket, $uri, $acl
= self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(),
$storageClass = self::STORAGE_CLASS_STANDARD)
	{
		$rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);
		$rest->setHeader('Content-Length', 0);
		foreach ($requestHeaders as $h => $v)
			strpos($h, 'x-amz-') === 0 ? $rest->setAmzHeader($h, $v) :
$rest->setHeader($h, $v);
		foreach ($metaHeaders as $h => $v)
$rest->setAmzHeader('x-amz-meta-'.$h, $v);
		if ($storageClass !== self::STORAGE_CLASS_STANDARD) // Storage class
			$rest->setAmzHeader('x-amz-storage-class', $storageClass);
		$rest->setAmzHeader('x-amz-acl', $acl);
		$rest->setAmzHeader('x-amz-copy-source',
sprintf('/%s/%s', $srcBucket, rawurlencode($srcUri)));
		if (sizeof($requestHeaders) > 0 || sizeof($metaHeaders) > 0)
			$rest->setAmzHeader('x-amz-metadata-directive',
'REPLACE');

		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::copyObject({$srcBucket},
{$srcUri}, {$bucket}, {$uri}): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return isset($rest->body->LastModified, $rest->body->ETag) ?
array(
			'time' =>
strtotime((string)$rest->body->LastModified),
			'hash' => substr((string)$rest->body->ETag, 1, -1)
		) : false;
	}


	/**
	 * Set up a bucket redirection
	 *
	 * @param string $bucket Bucket name
	 * @param string $location Target host name
	 * @return boolean
	 */
	public static function setBucketRedirect($bucket = NULL, $location = NULL)
	{
		$rest = new S3Request('PUT', $bucket, '',
self::$endpoint);

		if( empty($bucket) || empty($location) ) {
			self::__triggerError("S3::setBucketRedirect({$bucket},
{$location}): Empty parameter.", __FILE__, __LINE__);
			return false;
		}

		$dom = new DOMDocument;
		$websiteConfiguration =
$dom->createElement('WebsiteConfiguration');
		$redirectAllRequestsTo =
$dom->createElement('RedirectAllRequestsTo');
		$hostName = $dom->createElement('HostName', $location);
		$redirectAllRequestsTo->appendChild($hostName);
		$websiteConfiguration->appendChild($redirectAllRequestsTo);
		$dom->appendChild($websiteConfiguration);
		$rest->setParameter('website', null);
		$rest->data = $dom->saveXML();
		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type',
'application/xml');
		$rest = $rest->getResponse();

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::setBucketRedirect({$bucket},
{$location}): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Set logging for a bucket
	 *
	 * @param string $bucket Bucket name
	 * @param string $targetBucket Target bucket (where logs are stored)
	 * @param string $targetPrefix Log prefix (e,g; domain.com-)
	 * @return boolean
	 */
	public static function setBucketLogging($bucket, $targetBucket,
$targetPrefix = null)
	{
		// The S3 log delivery group has to be added to the target bucket's
ACP
		if ($targetBucket !== null && ($acp =
self::getAccessControlPolicy($targetBucket, '')) !== false)
		{
			// Only add permissions to the target bucket when they do not exist
			$aclWriteSet = false;
			$aclReadSet = false;
			foreach ($acp['acl'] as $acl)
				if ($acl['type'] == 'Group' &&
$acl['uri'] ==
'http://acs.amazonaws.com/groups/s3/LogDelivery')
				{
					if ($acl['permission'] == 'WRITE') $aclWriteSet =
true;
					elseif ($acl['permission'] == 'READ_ACP')
$aclReadSet = true;
				}
			if (!$aclWriteSet) $acp['acl'][] = array(
				'type' => 'Group', 'uri' =>
'http://acs.amazonaws.com/groups/s3/LogDelivery',
'permission' => 'WRITE'
			);
			if (!$aclReadSet) $acp['acl'][] = array(
				'type' => 'Group', 'uri' =>
'http://acs.amazonaws.com/groups/s3/LogDelivery',
'permission' => 'READ_ACP'
			);
			if (!$aclReadSet || !$aclWriteSet)
self::setAccessControlPolicy($targetBucket, '', $acp);
		}

		$dom = new DOMDocument;
		$bucketLoggingStatus =
$dom->createElement('BucketLoggingStatus');
		$bucketLoggingStatus->setAttribute('xmlns',
'http://s3.amazonaws.com/doc/2006-03-01/');
		if ($targetBucket !== null)
		{
			if ($targetPrefix == null) $targetPrefix = $bucket . '-';
			$loggingEnabled = $dom->createElement('LoggingEnabled');
			$loggingEnabled->appendChild($dom->createElement('TargetBucket',
$targetBucket));
			$loggingEnabled->appendChild($dom->createElement('TargetPrefix',
$targetPrefix));
			// TODO: Add TargetGrants?
			$bucketLoggingStatus->appendChild($loggingEnabled);
		}
		$dom->appendChild($bucketLoggingStatus);

		$rest = new S3Request('PUT', $bucket, '',
self::$endpoint);
		$rest->setParameter('logging', null);
		$rest->data = $dom->saveXML();
		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type',
'application/xml');
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::setBucketLogging({$bucket},
{$targetBucket}): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Get logging status for a bucket
	 *
	 * This will return false if logging is not enabled.
	 * Note: To enable logging, you also need to grant write access to the log
group
	 *
	 * @param string $bucket Bucket name
	 * @return array | false
	 */
	public static function getBucketLogging($bucket)
	{
		$rest = new S3Request('GET', $bucket, '',
self::$endpoint);
		$rest->setParameter('logging', null);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getBucketLogging({$bucket}): [%s]
%s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		if (!isset($rest->body->LoggingEnabled)) return false; // No
logging
		return array(
			'targetBucket' =>
(string)$rest->body->LoggingEnabled->TargetBucket,
			'targetPrefix' =>
(string)$rest->body->LoggingEnabled->TargetPrefix,
		);
	}


	/**
	 * Disable bucket logging
	 *
	 * @param string $bucket Bucket name
	 * @return boolean
	 */
	public static function disableBucketLogging($bucket)
	{
		return self::setBucketLogging($bucket, null);
	}


	/**
	 * Get a bucket's location
	 *
	 * @param string $bucket Bucket name
	 * @return string | false
	 */
	public static function getBucketLocation($bucket)
	{
		$rest = new S3Request('GET', $bucket, '',
self::$endpoint);
		$rest->setParameter('location', null);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getBucketLocation({$bucket}):
[%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return (isset($rest->body[0]) && (string)$rest->body[0] !==
'') ? (string)$rest->body[0] : 'US';
	}


	/**
	 * Set object or bucket Access Control Policy
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param array $acp Access Control Policy Data (same as the data returned
from getAccessControlPolicy)
	 * @return boolean
	 */
	public static function setAccessControlPolicy($bucket, $uri =
'', $acp = array())
	{
		$dom = new DOMDocument;
		$dom->formatOutput = true;
		$accessControlPolicy =
$dom->createElement('AccessControlPolicy');
		$accessControlList =
$dom->createElement('AccessControlList');

		// It seems the owner has to be passed along too
		$owner = $dom->createElement('Owner');
		$owner->appendChild($dom->createElement('ID',
$acp['owner']['id']));
		$owner->appendChild($dom->createElement('DisplayName',
$acp['owner']['name']));
		$accessControlPolicy->appendChild($owner);

		foreach ($acp['acl'] as $g)
		{
			$grant = $dom->createElement('Grant');
			$grantee = $dom->createElement('Grantee');
			$grantee->setAttribute('xmlns:xsi',
'http://www.w3.org/2001/XMLSchema-instance');
			if (isset($g['id']))
			{ // CanonicalUser (DisplayName is omitted)
				$grantee->setAttribute('xsi:type',
'CanonicalUser');
				$grantee->appendChild($dom->createElement('ID',
$g['id']));
			}
			elseif (isset($g['email']))
			{ // AmazonCustomerByEmail
				$grantee->setAttribute('xsi:type',
'AmazonCustomerByEmail');
				$grantee->appendChild($dom->createElement('EmailAddress',
$g['email']));
			}
			elseif ($g['type'] == 'Group')
			{ // Group
				$grantee->setAttribute('xsi:type', 'Group');
				$grantee->appendChild($dom->createElement('URI',
$g['uri']));
			}
			$grant->appendChild($grantee);
			$grant->appendChild($dom->createElement('Permission',
$g['permission']));
			$accessControlList->appendChild($grant);
		}

		$accessControlPolicy->appendChild($accessControlList);
		$dom->appendChild($accessControlPolicy);

		$rest = new S3Request('PUT', $bucket, $uri, self::$endpoint);
		$rest->setParameter('acl', null);
		$rest->data = $dom->saveXML();
		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type',
'application/xml');
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::setAccessControlPolicy({$bucket},
{$uri}): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Get object or bucket Access Control Policy
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @return mixed | false
	 */
	public static function getAccessControlPolicy($bucket, $uri =
'')
	{
		$rest = new S3Request('GET', $bucket, $uri, self::$endpoint);
		$rest->setParameter('acl', null);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getAccessControlPolicy({$bucket},
{$uri}): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}

		$acp = array();
		if (isset($rest->body->Owner, $rest->body->Owner->ID,
$rest->body->Owner->DisplayName))
			$acp['owner'] = array(
				'id' => (string)$rest->body->Owner->ID,
'name' => (string)$rest->body->Owner->DisplayName
			);

		if (isset($rest->body->AccessControlList))
		{
			$acp['acl'] = array();
			foreach ($rest->body->AccessControlList->Grant as $grant)
			{
				foreach ($grant->Grantee as $grantee)
				{
					if (isset($grantee->ID, $grantee->DisplayName)) // CanonicalUser
						$acp['acl'][] = array(
							'type' => 'CanonicalUser',
							'id' => (string)$grantee->ID,
							'name' => (string)$grantee->DisplayName,
							'permission' => (string)$grant->Permission
						);
					elseif (isset($grantee->EmailAddress)) // AmazonCustomerByEmail
						$acp['acl'][] = array(
							'type' => 'AmazonCustomerByEmail',
							'email' => (string)$grantee->EmailAddress,
							'permission' => (string)$grant->Permission
						);
					elseif (isset($grantee->URI)) // Group
						$acp['acl'][] = array(
							'type' => 'Group',
							'uri' => (string)$grantee->URI,
							'permission' => (string)$grant->Permission
						);
					else continue;
				}
			}
		}
		return $acp;
	}


	/**
	 * Delete an object
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @return boolean
	 */
	public static function deleteObject($bucket, $uri)
	{
		$rest = new S3Request('DELETE', $bucket, $uri,
self::$endpoint);
		$rest = $rest->getResponse();
		if ($rest->error === false && $rest->code !== 204)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::deleteObject(): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Get a query string authenticated URL
	 *
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param integer $lifetime Lifetime in seconds
	 * @param boolean $hostBucket Use the bucket name as the hostname
	 * @param boolean $https Use HTTPS ($hostBucket should be false for SSL
verification)
	 * @return string
	 */
	public static function getAuthenticatedURL($bucket, $uri, $lifetime,
$hostBucket = false, $https = false)
	{
		$expires = self::__getTime() + $lifetime;
		$uri = str_replace(array('%2F', '%2B'),
array('/', '+'), rawurlencode($uri));
		return sprintf(($https ? 'https' :
'http').'://%s/%s?AWSAccessKeyId=%s&Expires=%u&Signature=%s',
			// $hostBucket ? $bucket : $bucket.'.s3.amazonaws.com', $uri,
self::$__accessKey, $expires,
			$hostBucket ? $bucket : self::$endpoint.'/'.$bucket, $uri,
self::$__accessKey, $expires,
			urlencode(self::__getHash("GET\n\n\n{$expires}\n/{$bucket}/{$uri}")));
	}


	/**
	 * Get a CloudFront signed policy URL
	 *
	 * @param array $policy Policy
	 * @return string
	 */
	public static function getSignedPolicyURL($policy)
	{
		$data = json_encode($policy);
		$signature = '';
		if (!openssl_sign($data, $signature, self::$__signingKeyResource)) return
false;

		$encoded = str_replace(array('+', '='),
array('-', '_', '~'), base64_encode($data));
		$signature = str_replace(array('+', '='),
array('-', '_', '~'),
base64_encode($signature));

		$url = $policy['Statement'][0]['Resource'] .
'?';
		foreach (array('Policy' => $encoded, 'Signature'
=> $signature, 'Key-Pair-Id' => self::$__signingKeyPairId)
as $k => $v)
			$url .= $k.'='.str_replace('%2F', '/',
rawurlencode($v)).'&';
		return substr($url, 0, -1);
	}


	/**
	 * Get a CloudFront canned policy URL
	 *
	 * @param string $url URL to sign
	 * @param integer $lifetime URL lifetime
	 * @return string
	 */
	public static function getSignedCannedURL($url, $lifetime)
	{
		return self::getSignedPolicyURL(array(
			'Statement' => array(
				array('Resource' => $url, 'Condition' =>
array(
					'DateLessThan' => array('AWS:EpochTime' =>
self::__getTime() + $lifetime)
				))
			)
		));
	}


	/**
	 * Get upload POST parameters for form uploads
	 *
	 * @param string $bucket Bucket name
	 * @param string $uriPrefix Object URI prefix
	 * @param constant $acl ACL constant
	 * @param integer $lifetime Lifetime in seconds
	 * @param integer $maxFileSize Maximum filesize in bytes (default 5MB)
	 * @param string $successRedirect Redirect URL or 200 / 201 status code
	 * @param array $amzHeaders Array of x-amz-meta-* headers
	 * @param array $headers Array of request headers or content type as a
string
	 * @param boolean $flashVars Includes additional "Filename"
variable posted by Flash
	 * @return object
	 */
	public static function getHttpUploadPostParams($bucket, $uriPrefix =
'', $acl = self::ACL_PRIVATE, $lifetime = 3600,
		$maxFileSize = 5242880, $successRedirect = "201", $amzHeaders =
array(), $headers = array(), $flashVars = false)
	{
		// Create policy object
		$policy = new stdClass;
		$policy->expiration = gmdate('Y-m-d\TH:i:s\Z',
(self::__getTime() + $lifetime));
		$policy->conditions = array();
		$obj = new stdClass; $obj->bucket = $bucket;
array_push($policy->conditions, $obj);
		$obj = new stdClass; $obj->acl = $acl;
array_push($policy->conditions, $obj);

		$obj = new stdClass; // 200 for non-redirect uploads
		if (is_numeric($successRedirect) &&
in_array((int)$successRedirect, array(200, 201)))
			$obj->success_action_status = (string)$successRedirect;
		else // URL
			$obj->success_action_redirect = $successRedirect;
		array_push($policy->conditions, $obj);

		if ($acl !== self::ACL_PUBLIC_READ)
			array_push($policy->conditions, array('eq',
'$acl', $acl));

		array_push($policy->conditions, array('starts-with',
'$key', $uriPrefix));
		if ($flashVars) array_push($policy->conditions,
array('starts-with', '$Filename', ''));
		foreach (array_keys($headers) as $headerKey)
			array_push($policy->conditions, array('starts-with',
'$'.$headerKey, ''));
		foreach ($amzHeaders as $headerKey => $headerVal)
		{
			$obj = new stdClass;
			$obj->{$headerKey} = (string)$headerVal;
			array_push($policy->conditions, $obj);
		}
		array_push($policy->conditions,
array('content-length-range', 0, $maxFileSize));
		$policy = base64_encode(str_replace('\/', '/',
json_encode($policy)));

		// Create parameters
		$params = new stdClass;
		$params->AWSAccessKeyId = self::$__accessKey;
		$params->key = $uriPrefix.'${filename}';
		$params->acl = $acl;
		$params->policy = $policy; unset($policy);
		$params->signature = self::__getHash($params->policy);
		if (is_numeric($successRedirect) &&
in_array((int)$successRedirect, array(200, 201)))
			$params->success_action_status = (string)$successRedirect;
		else
			$params->success_action_redirect = $successRedirect;
		foreach ($headers as $headerKey => $headerVal)
$params->{$headerKey} = (string)$headerVal;
		foreach ($amzHeaders as $headerKey => $headerVal)
$params->{$headerKey} = (string)$headerVal;
		return $params;
	}


	/**
	 * Create a CloudFront distribution
	 *
	 * @param string $bucket Bucket name
	 * @param boolean $enabled Enabled (true/false)
	 * @param array $cnames Array containing CNAME aliases
	 * @param string $comment Use the bucket name as the hostname
	 * @param string $defaultRootObject Default root object
	 * @param string $originAccessIdentity Origin access identity
	 * @param array $trustedSigners Array of trusted signers
	 * @return array | false
	 */
	public static function createDistribution($bucket, $enabled = true,
$cnames = array(), $comment = null, $defaultRootObject = null,
$originAccessIdentity = null, $trustedSigners = array())
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::createDistribution({$bucket},
".(int)$enabled.", [], '$comment'): %s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}
		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('POST', '',
'2010-11-01/distribution', 'cloudfront.amazonaws.com');
		$rest->data = self::__getCloudFrontDistributionConfigXML(
			$bucket.'.s3.amazonaws.com',
			$enabled,
			(string)$comment,
			(string)microtime(true),
			$cnames,
			$defaultRootObject,
			$originAccessIdentity,
			$trustedSigners
		);

		$rest->size = strlen($rest->data);
		$rest->setHeader('Content-Type',
'application/xml');
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 201)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::createDistribution({$bucket},
".(int)$enabled.", [], '$comment'): [%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		} elseif ($rest->body instanceof SimpleXMLElement)
			return self::__parseCloudFrontDistributionConfig($rest->body);
		return false;
	}


	/**
	 * Get CloudFront distribution info
	 *
	 * @param string $distributionId Distribution ID from listDistributions()
	 * @return array | false
	 */
	public static function getDistribution($distributionId)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::getDistribution($distributionId):
%s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}
		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '',
'2010-11-01/distribution/'.$distributionId,
'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::getDistribution($distributionId):
[%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		elseif ($rest->body instanceof SimpleXMLElement)
		{
			$dist = self::__parseCloudFrontDistributionConfig($rest->body);
			$dist['hash'] = $rest->headers['hash'];
			$dist['id'] = $distributionId;
			return $dist;
		}
		return false;
	}


	/**
	 * Update a CloudFront distribution
	 *
	 * @param array $dist Distribution array info identical to output of
getDistribution()
	 * @return array | false
	 */
	public static function updateDistribution($dist)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::updateDistribution({$dist['id']}):
%s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}

		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('PUT', '',
'2010-11-01/distribution/'.$dist['id'].'/config',
'cloudfront.amazonaws.com');
		$rest->data = self::__getCloudFrontDistributionConfigXML(
			$dist['origin'],
			$dist['enabled'],
			$dist['comment'],
			$dist['callerReference'],
			$dist['cnames'],
			$dist['defaultRootObject'],
			$dist['originAccessIdentity'],
			$dist['trustedSigners']
		);

		$rest->size = strlen($rest->data);
		$rest->setHeader('If-Match', $dist['hash']);
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::updateDistribution({$dist['id']}):
[%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		} else {
			$dist = self::__parseCloudFrontDistributionConfig($rest->body);
			$dist['hash'] = $rest->headers['hash'];
			return $dist;
		}
		return false;
	}


	/**
	 * Delete a CloudFront distribution
	 *
	 * @param array $dist Distribution array info identical to output of
getDistribution()
	 * @return boolean
	 */
	public static function deleteDistribution($dist)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::deleteDistribution({$dist['id']}):
%s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}

		$useSSL = self::$useSSL;

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('DELETE', '',
'2008-06-30/distribution/'.$dist['id'],
'cloudfront.amazonaws.com');
		$rest->setHeader('If-Match', $dist['hash']);
		$rest = self::__getCloudFrontResponse($rest);

		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 204)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::deleteDistribution({$dist['id']}):
[%s] %s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		return true;
	}


	/**
	 * Get a list of CloudFront distributions
	 *
	 * @return array
	 */
	public static function listDistributions()
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::listDistributions(): [%s]
%s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}

		$useSSL = self::$useSSL;
		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '',
'2010-11-01/distribution', 'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);
		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			self::__triggerError(sprintf("S3::listDistributions(): [%s]
%s",
				$rest->error['code'],
$rest->error['message']), __FILE__, __LINE__);
			return false;
		}
		elseif ($rest->body instanceof SimpleXMLElement &&
isset($rest->body->DistributionSummary))
		{
			$list = array();
			if (isset($rest->body->Marker, $rest->body->MaxItems,
$rest->body->IsTruncated))
			{
				//$info['marker'] = (string)$rest->body->Marker;
				//$info['maxItems'] = (int)$rest->body->MaxItems;
				//$info['isTruncated'] =
(string)$rest->body->IsTruncated == 'true' ? true : false;
			}
			foreach ($rest->body->DistributionSummary as $summary)
				$list[(string)$summary->Id] =
self::__parseCloudFrontDistributionConfig($summary);

			return $list;
		}
		return array();
	}

	/**
	 * List CloudFront Origin Access Identities
	 *
	 * @return array
	 */
	public static function listOriginAccessIdentities()
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::listOriginAccessIdentities():
[%s] %s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}

		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '',
'2010-11-01/origin-access-identity/cloudfront',
'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);
		$useSSL = self::$useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			trigger_error(sprintf("S3::listOriginAccessIdentities(): [%s]
%s",
				$rest->error['code'],
$rest->error['message']), E_USER_WARNING);
			return false;
		}

		if (isset($rest->body->CloudFrontOriginAccessIdentitySummary))
		{
			$identities = array();
			foreach ($rest->body->CloudFrontOriginAccessIdentitySummary as
$identity)
				if (isset($identity->S3CanonicalUserId))
					$identities[(string)$identity->Id] = array('id' =>
(string)$identity->Id, 's3CanonicalUserId' =>
(string)$identity->S3CanonicalUserId);
			return $identities;
		}
		return false;
	}


	/**
	 * Invalidate objects in a CloudFront distribution
	 *
	 * Thanks to Martin Lindkvist for S3::invalidateDistribution()
	 *
	 * @param string $distributionId Distribution ID from listDistributions()
	 * @param array $paths Array of object paths to invalidate
	 * @return boolean
	 */
	public static function invalidateDistribution($distributionId, $paths)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::invalidateDistribution(): [%s]
%s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}

		$useSSL = self::$useSSL;
		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('POST', '',
'2010-08-01/distribution/'.$distributionId.'/invalidation',
'cloudfront.amazonaws.com');
		$rest->data = self::__getCloudFrontInvalidationBatchXML($paths,
(string)microtime(true));
		$rest->size = strlen($rest->data);
		$rest = self::__getCloudFrontResponse($rest);
		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 201)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			trigger_error(sprintf("S3::invalidate('{$distributionId}',{$paths}):
[%s] %s",
				$rest->error['code'],
$rest->error['message']), E_USER_WARNING);
			return false;
		}
		return true;
	}


	/**
	 * Get a InvalidationBatch DOMDocument
	 *
	 * @internal Used to create XML in invalidateDistribution()
	 * @param array $paths Paths to objects to invalidateDistribution
	 * @param int $callerReference
	 * @return string
	 */
	private static function __getCloudFrontInvalidationBatchXML($paths,
$callerReference = '0')
	{
		$dom = new DOMDocument('1.0', 'UTF-8');
		$dom->formatOutput = true;
		$invalidationBatch =
$dom->createElement('InvalidationBatch');
		foreach ($paths as $path)
			$invalidationBatch->appendChild($dom->createElement('Path',
$path));

		$invalidationBatch->appendChild($dom->createElement('CallerReference',
$callerReference));
		$dom->appendChild($invalidationBatch);
		return $dom->saveXML();
	}


	/**
	 * List your invalidation batches for invalidateDistribution() in a
CloudFront distribution
	 *
	 *
http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListInvalidation.html
	 * returned array looks like this:
	 *	Array
	 *	(
	 *		[I31TWB0CN9V6XD] => InProgress
	 *		[IT3TFE31M0IHZ] => Completed
	 *		[I12HK7MPO1UQDA] => Completed
	 *		[I1IA7R6JKTC3L2] => Completed
	 *	)
	 *
	 * @param string $distributionId Distribution ID from listDistributions()
	 * @return array
	 */
	public static function getDistributionInvalidationList($distributionId)
	{
		if (!extension_loaded('openssl'))
		{
			self::__triggerError(sprintf("S3::getDistributionInvalidationList():
[%s] %s",
				"CloudFront functionality requires SSL"), __FILE__,
__LINE__);
			return false;
		}

		$useSSL = self::$useSSL;
		self::$useSSL = true; // CloudFront requires SSL
		$rest = new S3Request('GET', '',
'2010-11-01/distribution/'.$distributionId.'/invalidation',
'cloudfront.amazonaws.com');
		$rest = self::__getCloudFrontResponse($rest);
		self::$useSSL = $useSSL;

		if ($rest->error === false && $rest->code !== 200)
			$rest->error = array('code' => $rest->code,
'message' => 'Unexpected HTTP status');
		if ($rest->error !== false)
		{
			trigger_error(sprintf("S3::getDistributionInvalidationList('{$distributionId}'):
[%s]",
				$rest->error['code'],
$rest->error['message']), E_USER_WARNING);
			return false;
		}
		elseif ($rest->body instanceof SimpleXMLElement &&
isset($rest->body->InvalidationSummary))
		{
			$list = array();
			foreach ($rest->body->InvalidationSummary as $summary)
				$list[(string)$summary->Id] = (string)$summary->Status;

			return $list;
		}
		return array();
	}


	/**
	 * Get a DistributionConfig DOMDocument
	 *
	 *
http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?PutConfig.html
	 *
	 * @internal Used to create XML in createDistribution() and
updateDistribution()
	 * @param string $bucket S3 Origin bucket
	 * @param boolean $enabled Enabled (true/false)
	 * @param string $comment Comment to append
	 * @param string $callerReference Caller reference
	 * @param array $cnames Array of CNAME aliases
	 * @param string $defaultRootObject Default root object
	 * @param string $originAccessIdentity Origin access identity
	 * @param array $trustedSigners Array of trusted signers
	 * @return string
	 */
	private static function __getCloudFrontDistributionConfigXML($bucket,
$enabled, $comment, $callerReference = '0', $cnames = array(),
$defaultRootObject = null, $originAccessIdentity = null, $trustedSigners =
array())
	{
		$dom = new DOMDocument('1.0', 'UTF-8');
		$dom->formatOutput = true;
		$distributionConfig =
$dom->createElement('DistributionConfig');
		$distributionConfig->setAttribute('xmlns',
'http://cloudfront.amazonaws.com/doc/2010-11-01/');

		$origin = $dom->createElement('S3Origin');
		$origin->appendChild($dom->createElement('DNSName',
$bucket));
		if ($originAccessIdentity !== null)
$origin->appendChild($dom->createElement('OriginAccessIdentity',
$originAccessIdentity));
		$distributionConfig->appendChild($origin);

		if ($defaultRootObject !== null)
$distributionConfig->appendChild($dom->createElement('DefaultRootObject',
$defaultRootObject));

		$distributionConfig->appendChild($dom->createElement('CallerReference',
$callerReference));
		foreach ($cnames as $cname)
			$distributionConfig->appendChild($dom->createElement('CNAME',
$cname));
		if ($comment !== '')
$distributionConfig->appendChild($dom->createElement('Comment',
$comment));
		$distributionConfig->appendChild($dom->createElement('Enabled',
$enabled ? 'true' : 'false'));

		$trusted = $dom->createElement('TrustedSigners');
		foreach ($trustedSigners as $id => $type)
			$trusted->appendChild($id !== '' ?
$dom->createElement($type, $id) : $dom->createElement($type));
		$distributionConfig->appendChild($trusted);

		$dom->appendChild($distributionConfig);
		//var_dump($dom->saveXML());
		return $dom->saveXML();
	}


	/**
	 * Parse a CloudFront distribution config
	 *
	 * See
http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?GetDistribution.html
	 *
	 * @internal Used to parse the CloudFront DistributionConfig node to an
array
	 * @param object &$node DOMNode
	 * @return array
	 */
	private static function __parseCloudFrontDistributionConfig(&$node)
	{
		if (isset($node->DistributionConfig))
			return
self::__parseCloudFrontDistributionConfig($node->DistributionConfig);

		$dist = array();
		if (isset($node->Id, $node->Status, $node->LastModifiedTime,
$node->DomainName))
		{
			$dist['id'] = (string)$node->Id;
			$dist['status'] = (string)$node->Status;
			$dist['time'] = strtotime((string)$node->LastModifiedTime);
			$dist['domain'] = (string)$node->DomainName;
		}

		if (isset($node->CallerReference))
			$dist['callerReference'] = (string)$node->CallerReference;

		if (isset($node->Enabled))
			$dist['enabled'] = (string)$node->Enabled ==
'true' ? true : false;

		if (isset($node->S3Origin))
		{
			if (isset($node->S3Origin->DNSName))
				$dist['origin'] = (string)$node->S3Origin->DNSName;

			$dist['originAccessIdentity'] =
isset($node->S3Origin->OriginAccessIdentity) ?
				(string)$node->S3Origin->OriginAccessIdentity : null;
		}

		$dist['defaultRootObject'] = isset($node->DefaultRootObject)
? (string)$node->DefaultRootObject : null;

		$dist['cnames'] = array();
		if (isset($node->CNAME))
			foreach ($node->CNAME as $cname)
				$dist['cnames'][(string)$cname] = (string)$cname;

		$dist['trustedSigners'] = array();
		if (isset($node->TrustedSigners))
			foreach ($node->TrustedSigners as $signer)
			{
				if (isset($signer->Self))
					$dist['trustedSigners'][''] = 'Self';
				elseif (isset($signer->KeyPairId))
					$dist['trustedSigners'][(string)$signer->KeyPairId] =
'KeyPairId';
				elseif (isset($signer->AwsAccountNumber))
					$dist['trustedSigners'][(string)$signer->AwsAccountNumber]
= 'AwsAccountNumber';
			}

		$dist['comment'] = isset($node->Comment) ?
(string)$node->Comment : null;
		return $dist;
	}


	/**
	 * Grab CloudFront response
	 *
	 * @internal Used to parse the CloudFront S3Request::getResponse() output
	 * @param object &$rest S3Request instance
	 * @return object
	 */
	private static function __getCloudFrontResponse(&$rest)
	{
		$rest->getResponse();
		if ($rest->response->error === false &&
isset($rest->response->body) &&
			is_string($rest->response->body) &&
substr($rest->response->body, 0, 5) == '<?xml')
		{
			$rest->response->body =
simplexml_load_string($rest->response->body);
			// Grab CloudFront errors
			if (isset($rest->response->body->Error,
$rest->response->body->Error->Code,
				$rest->response->body->Error->Message))
			{
				$rest->response->error = array(
					'code' =>
(string)$rest->response->body->Error->Code,
					'message' =>
(string)$rest->response->body->Error->Message
				);
				unset($rest->response->body);
			}
		}
		return $rest->response;
	}


	/**
	 * Get MIME type for file
	 *
	 * To override the putObject() Content-Type, add it to $requestHeaders
	 *
	 * To use fileinfo, ensure the MAGIC environment variable is set
	 *
	 * @internal Used to get mime types
	 * @param string &$file File path
	 * @return string
	 */
	private static function __getMIMEType(&$file)
	{
		static $exts = array(
			'jpg' => 'image/jpeg', 'jpeg' =>
'image/jpeg', 'gif' => 'image/gif',
			'png' => 'image/png', 'ico' =>
'image/x-icon', 'pdf' =>
'application/pdf',
			'tif' => 'image/tiff', 'tiff' =>
'image/tiff', 'svg' => 'image/svg+xml',
			'svgz' => 'image/svg+xml', 'swf' =>
'application/x-shockwave-flash',
			'zip' => 'application/zip', 'gz' =>
'application/x-gzip',
			'tar' => 'application/x-tar', 'bz'
=> 'application/x-bzip',
			'bz2' => 'application/x-bzip2',  'rar'
=> 'application/x-rar-compressed',
			'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
			'cab' => 'application/vnd.ms-cab-compressed',
'txt' => 'text/plain',
			'asc' => 'text/plain', 'htm' =>
'text/html', 'html' => 'text/html',
			'css' => 'text/css', 'js' =>
'text/javascript',
			'xml' => 'text/xml', 'xsl' =>
'application/xsl+xml',
			'ogg' => 'application/ogg', 'mp3' =>
'audio/mpeg', 'wav' => 'audio/x-wav',
			'avi' => 'video/x-msvideo', 'mpg' =>
'video/mpeg', 'mpeg' => 'video/mpeg',
			'mov' => 'video/quicktime', 'flv' =>
'video/x-flv', 'php' => 'text/x-php'
		);

		$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
		if (isset($exts[$ext])) return $exts[$ext];

		// Use fileinfo if available
		if (extension_loaded('fileinfo') &&
isset($_ENV['MAGIC']) &&
			($finfo = finfo_open(FILEINFO_MIME, $_ENV['MAGIC'])) !==
false)
		{
			if (($type = finfo_file($finfo, $file)) !== false)
			{
				// Remove the charset and grab the last content-type
				$type = explode(' ', str_replace('; charset=',
';charset=', $type));
				$type = array_pop($type);
				$type = explode(';', $type);
				$type = trim(array_shift($type));
			}
			finfo_close($finfo);
			if ($type !== false && strlen($type) > 0) return $type;
		}

		return 'application/octet-stream';
	}


	/**
	 * Get the current time
	 *
	 * @internal Used to apply offsets to sytem time
	 * @return integer
	 */
	public static function __getTime()
	{
		return time() + self::$__timeOffset;
	}


	/**
	 * Generate the auth string: "AWS AccessKey:Signature"
	 *
	 * @internal Used by S3Request::getResponse()
	 * @param string $string String to sign
	 * @return string
	 */
	public static function __getSignature($string)
	{
		return 'AWS
'.self::$__accessKey.':'.self::__getHash($string);
	}


	/**
	 * Creates a HMAC-SHA1 hash
	 *
	 * This uses the hash extension if loaded
	 *
	 * @internal Used by __getSignature()
	 * @param string $string String to sign
	 * @return string
	 */
	private static function __getHash($string)
	{
		return base64_encode(extension_loaded('hash') ?
			hash_hmac('sha1', $string, self::$__secretKey, true) :
pack('H*', sha1(
				(str_pad(self::$__secretKey, 64, chr(0x00)) ^ (str_repeat(chr(0x5c),
64))) .
				pack('H*', sha1((str_pad(self::$__secretKey, 64, chr(0x00)) ^
						(str_repeat(chr(0x36), 64))) . $string)))));
	}


	/**
	 * Generate the headers for AWS Signature V4
	 * @internal Used by S3Request::getResponse()
	 * @param array $aheaders amzHeaders
	 * @param array $headers
	 * @param string $method
	 * @param string $uri
	 * @param string $data
	 * @return array $headers
	 */
	public static function __getSignatureV4($aHeaders, $headers,
$method='GET', $uri='', $data = '')
	{
		$service = 's3';
		$region = S3::getRegion();

		$algorithm = 'AWS4-HMAC-SHA256';
		$amzHeaders = array();
		$amzRequests = array();

		$amzDate =  gmdate( 'Ymd\THis\Z' );
		$amzDateStamp = gmdate( 'Ymd' );

		// amz-date ISO8601 format ? for aws request
		$amzHeaders['x-amz-date'] = $amzDate;

		// CanonicalHeaders
		foreach ( $headers as $k => $v ) {
			$amzHeaders[ strtolower( $k ) ] = trim( $v );
		}
		foreach ( $aHeaders as $k => $v ) {
			$amzHeaders[ strtolower( $k ) ] = trim( $v );
		}
		uksort( $amzHeaders, 'strcmp' );

		// payload
		$payloadHash = isset($amzHeaders['x-amz-content-sha256']) ?
$amzHeaders['x-amz-content-sha256'] :  hash('sha256',
$data);

		// parameters
		$parameters = array();
		if (strpos($uri, '?')) {
			list ($uri, $query_str) = @explode("?", $uri);
			parse_str($query_str, $parameters);
		}

		// CanonicalRequests
		$amzRequests[] = $method;
		$amzRequests[] = $uri;
		$amzRequests[] = http_build_query($parameters);
		// add header as string to requests
		foreach ( $amzHeaders as $k => $v ) {
			$amzRequests[] = $k . ':' . $v;
		}
		// add a blank entry so we end up with an extra line break
		$amzRequests[] = '';
		// SignedHeaders
		$amzRequests[] = implode( ';', array_keys( $amzHeaders ) );
		// payload hash
		$amzRequests[] = $payloadHash;
		// request as string
		$amzRequestStr = implode("\n", $amzRequests);

		// CredentialScope
		$credentialScope = array();
		$credentialScope[] = $amzDateStamp;
		$credentialScope[] = $region;
		$credentialScope[] = $service;
		$credentialScope[] = 'aws4_request';

		// stringToSign
		$stringToSign = array();
		$stringToSign[] = $algorithm;
		$stringToSign[] = $amzDate;
		$stringToSign[] = implode('/', $credentialScope);
		$stringToSign[] =  hash('sha256', $amzRequestStr);
		// as string
		$stringToSignStr = implode("\n", $stringToSign);

		// Make Signature
		$kSecret = 'AWS4' . self::$__secretKey;
		$kDate = hash_hmac( 'sha256', $amzDateStamp, $kSecret, true );
		$kRegion = hash_hmac( 'sha256', $region, $kDate, true );
		$kService = hash_hmac( 'sha256', $service, $kRegion, true );
		$kSigning = hash_hmac( 'sha256', 'aws4_request',
$kService, true );

		$signature = hash_hmac( 'sha256', $stringToSignStr, $kSigning
);

		$authorization = array(
			'Credential=' . self::$__accessKey . '/' . implode(
'/', $credentialScope ),
			'SignedHeaders=' . implode( ';', array_keys(
$amzHeaders ) ),
			'Signature=' . $signature,
		);

		$authorizationStr = $algorithm . ' ' . implode( ',',
$authorization );

		$resultHeaders = array(
			'X-AMZ-DATE' => $amzDate,
			'Authorization' => $authorizationStr
		);
		if (!isset($aHeaders['x-amz-content-sha256']))
$resultHeaders['x-amz-content-sha256'] = $payloadHash;

		return $resultHeaders;
	}


}

/**
 * S3 Request class
 *
 * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
 * @version 0.5.0-dev
 */
final class S3Request
{
	/**
	 * AWS URI
	 *
	 * @var string
	 * @access private
	 */
	private $endpoint;

	/**
	 * Verb
	 *
	 * @var string
	 * @access private
	 */
	private $verb;

	/**
	 * S3 bucket name
	 *
	 * @var string
	 * @access private
	 */
	private $bucket;

	/**
	 * Object URI
	 *
	 * @var string
	 * @access private
	 */
	private $uri;

	/**
	 * Final object URI
	 *
	 * @var string
	 * @access private
	 */
	private $resource = '';

	/**
	 * Additional request parameters
	 *
	 * @var array
	 * @access private
	 */
	private $parameters = array();

	/**
	 * Amazon specific request headers
	 *
	 * @var array
	 * @access private
	 */
	private $amzHeaders = array();

	/**
	 * HTTP request headers
	 *
	 * @var array
	 * @access private
	 */
	private $headers = array(
		'Host' => '', 'Date' => '',
'Content-MD5' => '', 'Content-Type' =>
''
	);

	/**
	 * Use HTTP PUT?
	 *
	 * @var bool
	 * @access public
	 */
	public $fp = false;

	/**
	 * PUT file size
	 *
	 * @var int
	 * @access public
	 */
	public $size = 0;

	/**
	 * PUT post fields
	 *
	 * @var array
	 * @access public
	 */
	public $data = false;

	/**
	 * S3 request respone
	 *
	 * @var object
	 * @access public
	 */
	public $response;


	/**
	 * Constructor
	 *
	 * @param string $verb Verb
	 * @param string $bucket Bucket name
	 * @param string $uri Object URI
	 * @param string $endpoint AWS endpoint URI
	 * @return mixed
	 */
	function __construct($verb, $bucket = '', $uri = '',
$endpoint = 's3.amazonaws.com')
	{

		$this->endpoint = $endpoint;
		$this->verb = $verb;
		$this->bucket = $bucket;
		$this->uri = $uri !== '' ?
'/'.str_replace('%2F', '/',
rawurlencode($uri)) : '/';

		//if ($this->bucket !== '')
		//	$this->resource = '/'.$this->bucket.$this->uri;
		//else
		//	$this->resource = $this->uri;

		if ($this->bucket !== '')
		{
			if ($this->__dnsBucketName($this->bucket))
			{
				$this->headers['Host'] =
$this->bucket.'.'.$this->endpoint;
				$this->resource = '/'.$this->bucket.$this->uri;
			}
			else
			{
				$this->headers['Host'] = $this->endpoint;
				$this->uri = $this->uri;
				if ($this->bucket !== '') $this->uri =
'/'.$this->bucket.$this->uri;
				$this->bucket = '';
				$this->resource = $this->uri;
			}
		}
		else
		{
			$this->headers['Host'] = $this->endpoint;
			$this->resource = $this->uri;
		}


		$this->headers['Date'] = gmdate('D, d M Y H:i:s
T');
		$this->response = new STDClass;
		$this->response->error = false;
		$this->response->body = null;
		$this->response->headers = array();
	}


	/**
	 * Set request parameter
	 *
	 * @param string $key Key
	 * @param string $value Value
	 * @return void
	 */
	public function setParameter($key, $value)
	{
		$this->parameters[$key] = $value;
	}


	/**
	 * Set request header
	 *
	 * @param string $key Key
	 * @param string $value Value
	 * @return void
	 */
	public function setHeader($key, $value)
	{
		$this->headers[$key] = $value;
	}


	/**
	 * Set x-amz-meta-* header
	 *
	 * @param string $key Key
	 * @param string $value Value
	 * @return void
	 */
	public function setAmzHeader($key, $value)
	{
		$this->amzHeaders[$key] = $value;
	}


	/**
	 * Get the S3 response
	 *
	 * @return object | false
	 */
	public function getResponse()
	{
		$query = '';
		if (sizeof($this->parameters) > 0)
		{
			$query = substr($this->uri, -1) !== '?' ? '?' :
'&';
			foreach ($this->parameters as $var => $value)
				if ($value == null || $value == '') $query .=
$var.'&';
				else $query .=
$var.'='.rawurlencode($value).'&';
			$query = substr($query, 0, -1);
			$this->uri .= $query;

			if (array_key_exists('acl', $this->parameters) ||
				array_key_exists('location', $this->parameters) ||
				array_key_exists('torrent', $this->parameters) ||
				array_key_exists('website', $this->parameters) ||
				array_key_exists('logging', $this->parameters))
				$this->resource .= $query;
		}
		$url = (S3::$useSSL ? 'https://' : 'http://') .
($this->headers['Host'] !== '' ?
$this->headers['Host'] : $this->endpoint) . $this->uri;

		//var_dump('bucket: ' . $this->bucket, 'uri: ' .
$this->uri, 'resource: ' . $this->resource, 'url:
' . $url);

		// Basic setup
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_USERAGENT, 'S3/php');

		if (S3::$useSSL)
		{
			// Set protocol version
			curl_setopt($curl, CURLOPT_SSLVERSION, S3::$useSSLVersion);

			// SSL Validation can now be optional for those with broken OpenSSL
installations
			curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, S3::$useSSLValidation ? 2 :
0);
			curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, S3::$useSSLValidation ? 1 :
0);

			if (S3::$sslKey !== null) curl_setopt($curl, CURLOPT_SSLKEY,
S3::$sslKey);
			if (S3::$sslCert !== null) curl_setopt($curl, CURLOPT_SSLCERT,
S3::$sslCert);
			if (S3::$sslCACert !== null) curl_setopt($curl, CURLOPT_CAINFO,
S3::$sslCACert);
		}

		curl_setopt($curl, CURLOPT_URL, $url);

		if (S3::$proxy != null && isset(S3::$proxy['host']))
		{
			curl_setopt($curl, CURLOPT_PROXY, S3::$proxy['host']);
			curl_setopt($curl, CURLOPT_PROXYTYPE, S3::$proxy['type']);
			if (isset(S3::$proxy['user'], S3::$proxy['pass'])
&& S3::$proxy['user'] != null &&
S3::$proxy['pass'] != null)
				curl_setopt($curl, CURLOPT_PROXYUSERPWD, sprintf('%s:%s',
S3::$proxy['user'], S3::$proxy['pass']));
		}

		// Headers
		$headers = array(); $amz = array();
		foreach ($this->amzHeaders as $header => $value)
			if (strlen($value) > 0) $headers[] = $header.': '.$value;
		foreach ($this->headers as $header => $value)
			if (strlen($value) > 0) $headers[] = $header.': '.$value;

		// Collect AMZ headers for signature
		foreach ($this->amzHeaders as $header => $value)
			if (strlen($value) > 0) $amz[] =
strtolower($header).':'.$value;

		// AMZ headers must be sorted
		if (sizeof($amz) > 0)
		{
			//sort($amz);
			usort($amz, array(&$this, '__sortMetaHeadersCmp'));
			$amz = "\n".implode("\n", $amz);
		} else $amz = '';

		if (S3::hasAuth())
		{
			// Authorization string (CloudFront stringToSign should only contain a
date)
			if ($this->headers['Host'] ==
'cloudfront.amazonaws.com')
				$headers[] = 'Authorization: ' .
S3::__getSignature($this->headers['Date']);
			else
			{
				if (S3::$signVer == 'v2')
				{
					$headers[] = 'Authorization: ' . S3::__getSignature(
							$this->verb."\n".
							$this->headers['Content-MD5']."\n".
							$this->headers['Content-Type']."\n".
							$this->headers['Date'].$amz."\n".
							$this->resource
						);
				} else {
					$amzHeaders = S3::__getSignatureV4(
						$this->amzHeaders,
						$this->headers,
						$this->verb,
						$this->uri,
						$this->data
					);
					foreach ($amzHeaders as $k => $v) {
						$headers[] = $k .': '. $v;
					}
				}
			}
		}

		curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
		curl_setopt($curl, CURLOPT_HEADER, false);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
		curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this,
'__responseWriteCallback'));
		curl_setopt($curl, CURLOPT_HEADERFUNCTION, array(&$this,
'__responseHeaderCallback'));
		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

		// Request types
		switch ($this->verb)
		{
			case 'GET': break;
			case 'PUT': case 'POST': // POST only used for
CloudFront
			if ($this->fp !== false)
			{
				curl_setopt($curl, CURLOPT_PUT, true);
				curl_setopt($curl, CURLOPT_INFILE, $this->fp);
				if ($this->size >= 0)
					curl_setopt($curl, CURLOPT_INFILESIZE, $this->size);
			}
			elseif ($this->data !== false)
			{
				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb);
				curl_setopt($curl, CURLOPT_POSTFIELDS, $this->data);
			}
			else
				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb);
			break;
			case 'HEAD':
				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');
				curl_setopt($curl, CURLOPT_NOBODY, true);
				break;
			case 'DELETE':
				curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
				break;
			default: break;
		}

		// Execute, grab errors
		if (curl_exec($curl))
			$this->response->code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
		else
			$this->response->error = array(
				'code' => curl_errno($curl),
				'message' => curl_error($curl),
				'resource' => $this->resource
			);

		@curl_close($curl);

		// Parse body into XML
		if ($this->response->error === false &&
isset($this->response->headers['type']) &&
			$this->response->headers['type'] ==
'application/xml' && isset($this->response->body))
		{
			$this->response->body =
simplexml_load_string($this->response->body);

			// Grab S3 errors
			if (!in_array($this->response->code, array(200, 204, 206))
&&
				isset($this->response->body->Code,
$this->response->body->Message))
			{
				$this->response->error = array(
					'code' => (string)$this->response->body->Code,
					'message' =>
(string)$this->response->body->Message
				);
				if (isset($this->response->body->Resource))
					$this->response->error['resource'] =
(string)$this->response->body->Resource;
				unset($this->response->body);
			}
		}

		// Clean up file resources
		if ($this->fp !== false && is_resource($this->fp))
fclose($this->fp);

		return $this->response;
	}

	/**
	 * Sort compare for meta headers
	 *
	 * @internal Used to sort x-amz meta headers
	 * @param string $a String A
	 * @param string $b String B
	 * @return integer
	 */
	private function __sortMetaHeadersCmp($a, $b)
	{
		$lenA = strpos($a, ':');
		$lenB = strpos($b, ':');
		$minLen = min($lenA, $lenB);
		$ncmp = strncmp($a, $b, $minLen);
		if ($lenA == $lenB) return $ncmp;
		if (0 == $ncmp) return $lenA < $lenB ? -1 : 1;
		return $ncmp;
	}

	/**
	 * CURL write callback
	 *
	 * @param resource &$curl CURL resource
	 * @param string &$data Data
	 * @return integer
	 */
	private function __responseWriteCallback(&$curl, &$data)
	{
		if (in_array($this->response->code, array(200, 206)) &&
$this->fp !== false)
			return fwrite($this->fp, $data);
		else
			$this->response->body .= $data;
		return strlen($data);
	}


	/**
	 * Check DNS conformity
	 *
	 * @param string $bucket Bucket name
	 * @return boolean
	 */
	private function __dnsBucketName($bucket)
	{
		if (strlen($bucket) > 63 || preg_match("/[^a-z0-9\.-]/",
$bucket) > 0) return false;
		if (S3::$useSSL && strstr($bucket, '.') !== false)
return false;
		if (strstr($bucket, '-.') !== false) return false;
		if (strstr($bucket, '..') !== false) return false;
		if (!preg_match("/^[0-9a-z]/", $bucket)) return false;
		if (!preg_match("/[0-9a-z]$/", $bucket)) return false;
		return true;
	}


	/**
	 * CURL header callback
	 *
	 * @param resource $curl CURL resource
	 * @param string $data Data
	 * @return integer
	 */
	private function __responseHeaderCallback($curl, $data)
	{
		if (($strlen = strlen($data)) <= 2) return $strlen;
		if (substr($data, 0, 4) == 'HTTP')
			$this->response->code = (int)substr($data, 9, 3);
		else
		{
			$data = trim($data);
			if (strpos($data, ': ') === false) return $strlen;
			list($header, $value) = explode(': ', $data, 2);
			if ($header == 'Last-Modified')
				$this->response->headers['time'] = strtotime($value);
			elseif ($header == 'Date')
				$this->response->headers['date'] = strtotime($value);
			elseif ($header == 'Content-Length')
				$this->response->headers['size'] = (int)$value;
			elseif ($header == 'Content-Type')
				$this->response->headers['type'] = $value;
			elseif ($header == 'ETag')
				$this->response->headers['hash'] = $value{0} ==
'"' ? substr($value, 1, -1) : $value;
			elseif (preg_match('/^x-amz-meta-.*$/', $header))
				$this->response->headers[$header] = $value;
		}
		return $strlen;
	}

}

/**
 * S3 exception class
 *
 * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
 * @version 0.5.0-dev
 */

class S3Exception extends Exception {
	/**
	 * Class constructor
	 *
	 * @param string $message Exception message
	 * @param string $file File in which exception was created
	 * @param string $line Line number on which exception was created
	 * @param int $code Exception code
	 */
	function __construct($message, $file, $line, $code = 0)
	{
		parent::__construct($message, $code);
		$this->file = $file;
		$this->line = $line;
	}
}
libs/bitly/bitly.php000064400000004317151165346410010467 0ustar00<?php

// No direct access
defined('_JEXEC') or die('Restricted access');

class bitly {

	/**
	 * A PHP class to utilize the bitly API
	 * through the Bitly API. Handles:
	 * - Shorten
	 *
	 * Requires PHP5, CURL, JSON and a Bitly account http://bit.ly/
	 *
	 * Bitly API documentation:
http://code.google.com/p/bitly-api/wiki/ApiDocumentation
	 *
	 * History:
	 * 10/20/2010: Updated to API v3 by <hugh.messenger@gmail.com>
	 *
	 */

	var $status_code = '200';
	var $status_txt = 'OK';

	protected $appkey;
	protected $login;
	protected $version;

	/**
	* Contruct the Bitly Class
	*
* @param string, your Bitly account key
* @param string, your Bitly account login
	*/
	public function __construct($login, $appkey, $version='v3') {
		$this->login = $login;
		$this->appkey = $appkey;
		$this->version = $version;
	}

	/**
	 * Was there an error on the last shorten attempt, return code or 0 for no
error
	 *
	 * @return integer, status code
	 */
	public function getError() {
		if ($this->status_code == '200') {
			return 0;
		}
		else {
			return (int) $this->status_code;
		}
	}

	/**
	 * Return error status msg from last shorten attempt
	 *
	 * @return string, status code + txt
	 */
	public function getErrorMsg() {
		return $this->status_code . ': ' . $this->status_txt;
	}

	/**
	* Retrieve a shortened URL
	*
* @param string, url to shorten
	*/
	public function shorten($url) {
		//create the URL
		$api_url =
'http://api.bit.ly/'.$this->version.'/shorten?longUrl='.urlencode($url).'&format=xml&login='.$this->login.'&apiKey='.$this->appkey;
		//call the API
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL, $api_url);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		$response = curl_exec($curl);
		curl_close($curl);

		//parse the XML response and return the url
		$xml_object = new SimpleXMLElement($response);
		if ($xml_object->status_code == '200') {
			// success, set OK status and return the shortened URL
			$this->status_code = '200';
			$this->status_txt = 'OK';
			return $xml_object->data->url;
		}
		else {
			// ooops, set status to returned values from bit.ly, and return the
original URL
			$this->status_code = $xml_object->status_code;
			$this->status_txt = $xml_object->status_txt;
			return $url;
		}
	}

}
?>libs/googlemaps/distancewidget.js000064400000021117151165346420013177
0ustar00/**
 * $$$ hugh - from Google example code:
 *
http://code.google.com/intl/fr/apis/maps/articles/mvcfun/distancewidget.js
 *
 * A distance widget that will display a circle that can be resized and
will
 * provide the radius in km.
 *
 * @param {Object} opt_options Options such as map, position etc.
 *
 * @constructor
 */
	
function DistanceWidget(opt_options) {
  var options = opt_options || {};

  this.setValues(options);

  if (!this.get('position')) {
    this.set('position', this.map.getCenter());
  }

  // Add a marker to the page at the map center or specified position
  /* $$$ hugh - we use marker from Fabrik element
  var marker = new google.maps.Marker({
    draggable: true,
    title: 'Move me!'
  });
  */

  this.marker.bindTo('map', this);
  this.marker.bindTo('zIndex', this);
  this.marker.bindTo('position', this);
  this.marker.bindTo('icon', this);

  // Create a new radius widget
  var radiusWidget = new RadiusWidget(options['distance'] || 50);

  // Bind the radius widget properties.
  radiusWidget.bindTo('center', this, 'position');
  radiusWidget.bindTo('map', this);
  radiusWidget.bindTo('zIndex', this.marker);
  radiusWidget.bindTo('maxDistance', this);
  radiusWidget.bindTo('minDistance', this);
  radiusWidget.bindTo('color', this);
  radiusWidget.bindTo('activeColor', this);
  radiusWidget.bindTo('sizerIcon', this);
  radiusWidget.bindTo('activeSizerIcon', this);

  // Bind to the radius widget distance property
  this.bindTo('distance', radiusWidget);
  // Bind to the radius widget bounds property
  this.bindTo('bounds', radiusWidget);
  this.bindTo('sizer_position', radiusWidget);
  this.bindTo('center', radiusWidget);
  // $$$ hugh - added active binding so we can see when move / drag is
finished
  // and fire our 'change' events for the Fabrik map element(s)
  this.bindTo('active', radiusWidget);
  
  var me = this;
  google.maps.event.addListener(this.marker, 'dblclick',
function() {
    // When a user double clicks on the icon fit to the map to the bounds
    this.map.fitBounds(me.get('bounds'));
  });
}
DistanceWidget.prototype = new google.maps.MVCObject();

/**
 * A radius widget that add a circle to a map and centers on a marker.
 *
 * @param {number} opt_distance Optional starting distance.
 * @constructor
 */
function RadiusWidget(opt_distance) {
  var circle = new google.maps.Circle({
    strokeWeight: 2
  });

  this.set('distance', opt_distance);
  this.set('active', false);
  this.bindTo('bounds', circle);

  circle.bindTo('center', this);
  circle.bindTo('zIndex', this);
  circle.bindTo('map', this);
  circle.bindTo('strokeColor', this);
  circle.bindTo('radius', this);

  this.addSizer_();
}
RadiusWidget.prototype = new google.maps.MVCObject();


/**
 * Add the sizer marker to the map.
 *
 * @private
 */
RadiusWidget.prototype.addSizer_ = function() {
  var sizer = new google.maps.Marker({
    draggable: true,
    title: 'Drag me!',
    raiseOnDrag: false
  });

  sizer.bindTo('zIndex', this);
  sizer.bindTo('map', this);
  sizer.bindTo('icon', this);
  sizer.bindTo('position', this, 'sizer_position');

  var me = this;
  google.maps.event.addListener(sizer, 'dragstart', function() {
    me.set('active', true);
  });

  google.maps.event.addListener(sizer, 'drag', function() {
    // Set the circle distance (radius)
    me.setDistance_();
  });

  google.maps.event.addListener(sizer, 'dragend', function() {
    me.set('active', false);
  });
};


/**
 * Update the radius when the distance has changed.
 */
RadiusWidget.prototype.distance_changed = function() {
  this.set('radius', this.get('distance') * 1000);
};

/**
 * Update the radius when the min distance has changed.
 */
RadiusWidget.prototype.minDistance_changed = function() {
  if (this.get('minDistance') &&
      this.get('distance') <
this.get('minDistance')) {
    this.setDistance_();
  }
};


/**
 * Update the radius when the max distance has changed.
 */
RadiusWidget.prototype.maxDistance_changed = function() {
  if (this.get('maxDistance') &&
      this.get('distance') >
this.get('maxDistance')) {
    this.setDistance_();
  }
};


/**
 * Update the stroke color when the color is changed.
 */
RadiusWidget.prototype.color_changed = function() {
  this.active_changed();
};


/**
 * Update the active stroke color when the color is changed.
 */
RadiusWidget.prototype.activeColor_changed = function() {
  this.active_changed();
};


/**
 * Update the active stroke color when the color is changed.
 */
RadiusWidget.prototype.sizerIcon_changed = function() {
  this.active_changed();
};


/**
 * Update the active stroke color when the color is changed.
 */
RadiusWidget.prototype.activeSizerIcon_changed = function() {
  this.active_changed();
};


/**
 * Update the center of the circle and position the sizer back on the line.
 *
 * Position is bound to the DistanceWidget so this is expected to change
when
 * the position of the distance widget is changed.
 */
RadiusWidget.prototype.center_changed = function() {
  var sizerPos = this.get('sizer_position');
  var position;
  if (sizerPos) {
    position = this.getSnappedPosition_(sizerPos);
  } else {
    var bounds = this.get('bounds');
    if (bounds) {
      var lng = bounds.getNorthEast().lng();
      position = new google.maps.LatLng(this.get('center').lat(),
lng);
    }
  }

  if (position) {
    this.set('sizer_position', position);
  }
};

/**
 * Update the center of the circle and position the sizer back on the line.
 */
RadiusWidget.prototype.active_changed = function() {
  var strokeColor;
  var icon;

  if (this.get('active')) {
    if (this.get('activeColor')) {
      strokeColor = this.get('activeColor');
    }

    if (this.get('activeSizerIcon')) {
      icon = this.get('activeSizerIcon');
    }
  } else {
    strokeColor = this.get('color');

    icon = this.get('sizerIcon');
  }

  if (strokeColor) {
    this.set('strokeColor', strokeColor);
  }

  if (icon) {
    this.set('icon', icon);
  }
};


/**
 * Set the distance of the circle based on the position of the sizer.
 * @private
 */
RadiusWidget.prototype.setDistance_ = function() {
  // As the sizer is being dragged, its position changes.  Because the
  // RadiusWidget's sizer_position is bound to the sizer's
position, it will
  // change as well.
  var pos = this.get('sizer_position');
  var center = this.get('center');
  var distance = this.distanceBetweenPoints_(center, pos);

  if (this.get('maxDistance') && distance >
this.get('maxDistance')) {
    distance = this.get('maxDistance');
  }

  if (this.get('minDistance') && distance <
this.get('minDistance')) {
    distance = this.get('minDistance');
  }

  // Set the distance property for any objects that are bound to it
  this.set('distance', distance);

  var newPos = this.getSnappedPosition_(pos);
  this.set('sizer_position', newPos);
};


/**
 * Finds the closest left or right of the circle to the position.
 *
 * @param {google.maps.LatLng} pos The position to check against.
 * @return {google.maps.LatLng} The closest point to the circle.
 * @private.
 */
RadiusWidget.prototype.getSnappedPosition_ = function(pos) {
  var bounds = this.get('bounds');
  var center = this.get('center');
  var left = new google.maps.LatLng(center.lat(),
      bounds.getSouthWest().lng());
  var right = new google.maps.LatLng(center.lat(),
      bounds.getNorthEast().lng());

  var leftDist = this.distanceBetweenPoints_(pos, left);
  var rightDist = this.distanceBetweenPoints_(pos, right);

  if (leftDist < rightDist) {
    return left;
  } else {
    return right;
  }
};


/**
 * Calculates the distance between two latlng points in km.
 * @see http://www.movable-type.co.uk/scripts/latlong.html
 *
 * @param {google.maps.LatLng} p1 The first lat lng point.
 * @param {google.maps.LatLng} p2 The second lat lng point.
 * @return {number} The distance between the two points in km.
 * @private
 */
RadiusWidget.prototype.distanceBetweenPoints_ = function(p1, p2) {
  if (!p1 || !p2) {
    return 0;
  }

  var R = 6371; // Radius of the Earth in km
  var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
  var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180)
*
    Math.sin(dLon / 2) * Math.sin(dLon / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d;
};

/**
 * $$$ hugh
 * 
 * had to add this callback to solve asyncronous loading issues with the
main google maps code
 * in the Fabrik map element, which loads the maps code with a
document.createElement('script') async load.
 * 
 * Should probably redo this so the callback func is a CGI arg, rather than
hard coded, but for now this
 * will do.
 * 
 */

googleradiusloaded();
libs/googlemaps/geocomplete/jquery.geocomplete-min.js000064400000017031151165346430017107
0ustar00/**
 * jQuery Geocoding and Places Autocomplete Plugin - V 1.6.5
 *
 * @author Martin Kleppe <kleppe@ubilabs.net>, 2014
 * @author Ubilabs http://ubilabs.net, 2014
 * @license MIT License
<http://www.opensource.org/licenses/mit-license.php>
 */// # $.geocomplete()
// ## jQuery Geocoding and Places Autocomplete Plugin
//
// * https://github.com/ubilabs/geocomplete/
// * by Martin Kleppe <kleppe@ubilabs.net>
(function(e,t,n,r){function
u(t,n){this.options=e.extend(!0,{},i,n),this.input=t,this.$input=e(t),this._defaults=i,this._name="geocomplete",this.init()}var
i={bounds:!0,country:null,map:!1,details:!1,detailsAttribute:"name",detailsScope:null,autoselect:!0,location:!1,mapOptions:{zoom:14,scrollwheel:!1,mapTypeId:"roadmap"},markerOptions:{draggable:!1},maxZoom:16,types:["geocode"],blur:!1,geocodeAfterResult:!1,restoreValueAfterBlur:!1},s="street_address
route intersection political country administrative_area_level_1
administrative_area_level_2 administrative_area_level_3 colloquial_area
locality sublocality neighborhood premise subpremise postal_code
natural_feature airport park point_of_interest post_box street_number floor
room lat lng viewport location formatted_address location_type
bounds".split(" "),o="id place_id url website vicinity
reference name rating international_phone_number icon
formatted_phone_number".split("
");e.extend(u.prototype,{init:function(){this.initMap(),this.initMarker(),this.initGeocoder(),this.initDetails(),this.initLocation()},initMap:function(){if(!this.options.map)return;if(typeof
this.options.map.setCenter=="function"){this.map=this.options.map;return}this.map=new
google.maps.Map(e(this.options.map)[0],this.options.mapOptions),google.maps.event.addListener(this.map,"click",e.proxy(this.mapClicked,this)),google.maps.event.addListener(this.map,"dragend",e.proxy(this.mapDragged,this)),google.maps.event.addListener(this.map,"idle",e.proxy(this.mapIdle,this)),google.maps.event.addListener(this.map,"zoom_changed",e.proxy(this.mapZoomed,this))},initMarker:function(){if(!this.map)return;var
t=e.extend(this.options.markerOptions,{map:this.map});if(t.disabled)return;this.marker=new
google.maps.Marker(t),google.maps.event.addListener(this.marker,"dragend",e.proxy(this.markerDragged,this))},initGeocoder:function(){var
t=!1,n={types:this.options.types,bounds:this.options.bounds===!0?null:this.options.bounds,componentRestrictions:this.options.componentRestrictions};this.options.country&&(n.componentRestrictions={country:this.options.country}),this.autocomplete=new
google.maps.places.Autocomplete(this.input,n),this.geocoder=new
google.maps.Geocoder,this.map&&this.options.bounds===!0&&this.autocomplete.bindTo("bounds",this.map),google.maps.event.addListener(this.autocomplete,"place_changed",e.proxy(this.placeChanged,this)),this.$input.on("keypress."+this._name,function(e){if(e.keyCode===13)return!1}),this.options.geocodeAfterResult===!0&&this.$input.bind("keypress."+this._name,e.proxy(function(){event.keyCode!=9&&this.selected===!0&&(this.selected=!1)},this)),this.$input.bind("geocode."+this._name,e.proxy(function(){this.find()},this)),this.$input.bind("geocode:result."+this._name,e.proxy(function(){this.lastInputVal=this.$input.val()},this)),this.options.blur===!0&&this.$input.on("blur."+this._name,e.proxy(function(){if(this.options.geocodeAfterResult===!0&&this.selected===!0)return;this.options.restoreValueAfterBlur===!0&&this.selected===!0?setTimeout(e.proxy(this.restoreLastValue,this),0):this.find()},this))},initDetails:function(){function
i(e){r[e]=t.find("["+n+"="+e+"]")}if(!this.options.details)return;if(this.options.detailsScope)var
t=e(this.input).parents(this.options.detailsScope).find(this.options.details);else
var t=e(this.options.details);var
n=this.options.detailsAttribute,r={};e.each(s,function(e,t){i(t),i(t+"_short")}),e.each(o,function(e,t){i(t)}),this.$details=t,this.details=r},initLocation:function(){var
e=this.options.location,t;if(!e)return;if(typeof
e=="string"){this.find(e);return}e instanceof
Array&&(t=new google.maps.LatLng(e[0],e[1])),e instanceof
google.maps.LatLng&&(t=e),t&&(this.map&&this.map.setCenter(t),this.marker&&this.marker.setPosition(t))},destroy:function(){this.map&&(google.maps.event.clearInstanceListeners(this.map),google.maps.event.clearInstanceListeners(this.marker)),this.autocomplete.unbindAll(),google.maps.event.clearInstanceListeners(this.autocomplete),google.maps.event.clearInstanceListeners(this.input),this.$input.removeData(),this.$input.off(this._name),this.$input.unbind("."+this._name)},find:function(e){this.geocode({address:e||this.$input.val()})},geocode:function(t){if(!t.address)return;this.options.bounds&&!t.bounds&&(this.options.bounds===!0?t.bounds=this.map&&this.map.getBounds():t.bounds=this.options.bounds),this.options.country&&(t.region=this.options.country),this.geocoder.geocode(t,e.proxy(this.handleGeocode,this))},selectFirstResult:function(){var
t="";e(".pac-item-selected")[0]&&(t="-selected");var
n=e(".pac-container:last .pac-item"+t+":first
span:nth-child(2)").text(),r=e(".pac-container:last
.pac-item"+t+":first span:nth-child(3)").text(),i=n;return
r&&(i+=" -
"+r),this.$input.val(i),i},restoreLastValue:function(){this.lastInputVal&&this.$input.val(this.lastInputVal)},handleGeocode:function(e,t){if(t===google.maps.GeocoderStatus.OK){var
n=e[0];this.$input.val(n.formatted_address),this.update(n),e.length>1&&this.trigger("geocode:multiple",e)}else
this.trigger("geocode:error",t)},trigger:function(e,t){this.$input.trigger(e,[t])},center:function(e){e.viewport?(this.map.fitBounds(e.viewport),this.map.getZoom()>this.options.maxZoom&&this.map.setZoom(this.options.maxZoom)):(this.map.setZoom(this.options.maxZoom),this.map.setCenter(e.location)),this.marker&&(this.marker.setPosition(e.location),this.marker.setAnimation(this.options.markerOptions.animation))},update:function(e){this.map&&this.center(e.geometry),this.$details&&this.fillDetails(e),this.trigger("geocode:result",e)},fillDetails:function(t){var
n={},r=t.geometry,i=r.viewport,s=r.bounds;e.each(t.address_components,function(t,r){var
i=r.types[0];e.each(r.types,function(e,t){n[t]=r.long_name,n[t+"_short"]=r.short_name})}),e.each(o,function(e,r){n[r]=t[r]}),e.extend(n,{formatted_address:t.formatted_address,location_type:r.location_type||"PLACES",viewport:i,bounds:s,location:r.location,lat:r.location.lat(),lng:r.location.lng()}),e.each(this.details,e.proxy(function(e,t){var
r=n[e];this.setDetail(t,r)},this)),this.data=n},setDetail:function(e,t){t===r?t="":typeof
t.toUrlValue=="function"&&(t=t.toUrlValue()),e.is(":input")?e.val(t):e.text(t)},markerDragged:function(e){this.trigger("geocode:dragged",e.latLng)},mapClicked:function(e){this.trigger("geocode:click",e.latLng)},mapDragged:function(e){this.trigger("geocode:mapdragged",this.map.getCenter())},mapIdle:function(e){this.trigger("geocode:idle",this.map.getCenter())},mapZoomed:function(e){this.trigger("geocode:zoom",this.map.getZoom())},resetMarker:function(){this.marker.setPosition(this.data.location),this.setDetail(this.details.lat,this.data.location.lat()),this.setDetail(this.details.lng,this.data.location.lng())},placeChanged:function(){var
e=this.autocomplete.getPlace();this.selected=!0;if(!e.geometry){if(this.options.autoselect){var
t=this.selectFirstResult();this.find(t)}}else
this.update(e)}}),e.fn.geocomplete=function(t){var
n="plugin_geocomplete";if(typeof t=="string"){var
r=e(this).data(n)||e(this).geocomplete().data(n),i=r[t];return typeof
i=="function"?(i.apply(r,Array.prototype.slice.call(arguments,1)),e(this)):(arguments.length==2&&(i=arguments[1]),i)}return
this.each(function(){var r=e.data(this,n);r||(r=new
u(this,t),e.data(this,n,r))})}})(jQuery,window,document);libs/googlemaps/geocomplete/jquery.geocomplete.js000064400000046642151165346430016340
0ustar00/**
 * jQuery Geocoding and Places Autocomplete Plugin - V 1.6.5
 *
 * @author Martin Kleppe <kleppe@ubilabs.net>, 2014
 * @author Ubilabs http://ubilabs.net, 2014
 * @license MIT License
<http://www.opensource.org/licenses/mit-license.php>
 */

// # $.geocomplete()
// ## jQuery Geocoding and Places Autocomplete Plugin
//
// * https://github.com/ubilabs/geocomplete/
// * by Martin Kleppe <kleppe@ubilabs.net>

(function($, window, document, undefined){

  // ## Options
  // The default options for this plugin.
  //
  // * `map` - Might be a selector, an jQuery object or a DOM element.
Default is `false` which shows no map.
  // * `details` - The container that should be populated with data.
Defaults to `false` which ignores the setting.
  // * 'detailsScope' - Allows you to scope the
'details' container and have multiple geocomplete fields on one
page. Must be a parent of the input. Default is 'null'
  // * `location` - Location to initialize the map on. Might be an address
`string` or an `array` with [latitude, longitude] or a
`google.maps.LatLng`object. Default is `false` which shows a blank map.
  // * `bounds` - Whether to snap geocode search to map bounds. Default:
`true` if false search globally. Alternatively pass a custom `LatLngBounds
object.
  // * `autoselect` - Automatically selects the highlighted item or the
first item from the suggestions list on Enter.
  // * `detailsAttribute` - The attribute's name to use as an
indicator. Default: `"name"`
  // * `mapOptions` - Options to pass to the `google.maps.Map` constructor.
See the full list
[here](http://code.google.com/apis/maps/documentation/javascript/reference.html#MapOptions).
  // * `mapOptions.zoom` - The inital zoom level. Default: `14`
  // * `mapOptions.scrollwheel` - Whether to enable the scrollwheel to zoom
the map. Default: `false`
  // * `mapOptions.mapTypeId` - The map type. Default:
`"roadmap"`
  // * `markerOptions` - The options to pass to the `google.maps.Marker`
constructor. See the full list
[here](http://code.google.com/apis/maps/documentation/javascript/reference.html#MarkerOptions).
  // * `markerOptions.draggable` - If the marker is draggable. Default:
`false`. Set to true to enable dragging.
  // * `markerOptions.disabled` - Do not show marker. Default: `false`. Set
to true to disable marker.
  // * `maxZoom` - The maximum zoom level too zoom in after a geocoding
response. Default: `16`
  // * `types` - An array containing one or more of the supported types for
the places request. Default: `['geocode']` See the full list
[here](http://code.google.com/apis/maps/documentation/javascript/places.html#place_search_requests).
  // * `blur` - Trigger geocode when input loses focus.
  // * `geocodeAfterResult` - If blur is set to true, choose whether to
geocode if user has explicitly selected a result before blur.
  // * `restoreValueAfterBlur` - Restores the input's value upon
blurring. Default is `false` which ignores the setting.

  var defaults = {
    bounds: true,
    country: null,
    map: false,
    details: false,
    detailsAttribute: "name",
    detailsScope: null,
    autoselect: true,
    location: false,

    mapOptions: {
      zoom: 14,
      scrollwheel: false,
      mapTypeId: "roadmap"
    },

    markerOptions: {
      draggable: false
    },

    maxZoom: 16,
    types: ['geocode'],
    blur: false,
    geocodeAfterResult: false,
    restoreValueAfterBlur: false
  };

  // See: [Geocoding
Types](https://developers.google.com/maps/documentation/geocoding/#Types)
  // on Google Developers.
  var componentTypes = ("street_address route intersection political
" +
    "country administrative_area_level_1 administrative_area_level_2
" +
    "administrative_area_level_3 colloquial_area locality sublocality
" +
    "neighborhood premise subpremise postal_code natural_feature
airport " +
    "park point_of_interest post_box street_number floor room " +
    "lat lng viewport location " +
    "formatted_address location_type bounds").split("
");

  // See: [Places Details
Responses](https://developers.google.com/maps/documentation/javascript/places#place_details_responses)
  // on Google Developers.
  var placesDetails = ("id place_id url website vicinity reference
name rating " +
    "international_phone_number icon
formatted_phone_number").split(" ");

  // The actual plugin constructor.
  function GeoComplete(input, options) {

    this.options = $.extend(true, {}, defaults, options);

    this.input = input;
    this.$input = $(input);

    this._defaults = defaults;
    this._name = 'geocomplete';

    this.init();
  }

  // Initialize all parts of the plugin.
  $.extend(GeoComplete.prototype, {
    init: function(){
      this.initMap();
      this.initMarker();
      this.initGeocoder();
      this.initDetails();
      this.initLocation();
    },

    // Initialize the map but only if the option `map` was set.
    // This will create a `map` within the given container
    // using the provided `mapOptions` or link to the existing map
instance.
    initMap: function(){
      if (!this.options.map){ return; }

      if (typeof this.options.map.setCenter == "function"){
        this.map = this.options.map;
        return;
      }

      this.map = new google.maps.Map(
        $(this.options.map)[0],
        this.options.mapOptions
      );

      // add click event listener on the map
      google.maps.event.addListener(
        this.map,
        'click',
        $.proxy(this.mapClicked, this)
      );
 
      // add dragend even listener on the map
      google.maps.event.addListener(
        this.map,
        'dragend',
        $.proxy(this.mapDragged, this)
      );
      
      // add idle even listener on the map
      google.maps.event.addListener(
        this.map,
        'idle',
        $.proxy(this.mapIdle, this)
      );

      google.maps.event.addListener(
        this.map,
        'zoom_changed',
        $.proxy(this.mapZoomed, this)
      );
    },

    // Add a marker with the provided `markerOptions` but only
    // if the option was set. Additionally it listens for the `dragend`
event
    // to notify the plugin about changes.
    initMarker: function(){
      if (!this.map){ return; }
      var options = $.extend(this.options.markerOptions, { map: this.map
});

      if (options.disabled){ return; }

      this.marker = new google.maps.Marker(options);

      google.maps.event.addListener(
        this.marker,
        'dragend',
        $.proxy(this.markerDragged, this)
      );
    },

    // Associate the input with the autocompleter and create a geocoder
    // to fall back when the autocompleter does not return a value.
    initGeocoder: function(){

      // Indicates is user did select a result from the dropdown.
      var selected = false;

      var options = {
        types: this.options.types,
        bounds: this.options.bounds === true ? null : this.options.bounds,
        componentRestrictions: this.options.componentRestrictions
      };

      if (this.options.country){
        options.componentRestrictions = {country: this.options.country};
      }

      this.autocomplete = new google.maps.places.Autocomplete(
        this.input, options
      );

      this.geocoder = new google.maps.Geocoder();

      // Bind autocomplete to map bounds but only if there is a map
      // and `options.bindToMap` is set to true.
      if (this.map && this.options.bounds === true){
        this.autocomplete.bindTo('bounds', this.map);
      }

      // Watch `place_changed` events on the autocomplete input field.
      google.maps.event.addListener(
        this.autocomplete,
        'place_changed',
        $.proxy(this.placeChanged, this)
      );

      // Prevent parent form from being submitted if user hit enter.
      this.$input.on('keypress.' + this._name, function(event){
        if (event.keyCode === 13){ return false; }
      });

      // Assume that if user types anything after having selected a result,
      // the selected location is not valid any more.
      if (this.options.geocodeAfterResult === true){
        this.$input.bind('keypress.' + this._name,
$.proxy(function(){
          if (event.keyCode != 9 && this.selected === true){
              this.selected = false;
          }
        }, this));
      }

      // Listen for "geocode" events and trigger find action.
      this.$input.bind('geocode.' + this._name,
$.proxy(function(){
        this.find();
      }, this));

      // Saves the previous input value
      this.$input.bind('geocode:result.' + this._name,
$.proxy(function(){
        this.lastInputVal = this.$input.val();
      }, this));

      // Trigger find action when input element is blurred out and user has
      // not explicitly selected a result.
      // (Useful for typing partial location and tabbing to the next field
      // or clicking somewhere else.)
      if (this.options.blur === true){
        this.$input.on('blur.' + this._name, $.proxy(function(){
          if (this.options.geocodeAfterResult === true &&
this.selected === true) { return; }

          if (this.options.restoreValueAfterBlur === true &&
this.selected === true) {
            setTimeout($.proxy(this.restoreLastValue, this), 0);
          } else {
            this.find();
          }
        }, this));
      }
    },

    // Prepare a given DOM structure to be populated when we got some data.
    // This will cycle through the list of component types and map the
    // corresponding elements.
    initDetails: function(){
      if (!this.options.details){ return; }

      if(this.options.detailsScope) {
        var $details =
$(this.input).parents(this.options.detailsScope).find(this.options.details);
      } else {
        var $details = $(this.options.details);
      }

      var attribute = this.options.detailsAttribute,
        details = {};

      function setDetail(value){
        details[value] = $details.find("[" +  attribute +
"=" + value + "]");
      }

      $.each(componentTypes, function(index, key){
        setDetail(key);
        setDetail(key + "_short");
      });

      $.each(placesDetails, function(index, key){
        setDetail(key);
      });

      this.$details = $details;
      this.details = details;
    },

    // Set the initial location of the plugin if the `location` options was
set.
    // This method will care about converting the value into the right
format.
    initLocation: function() {

      var location = this.options.location, latLng;

      if (!location) { return; }

      if (typeof location == 'string') {
        this.find(location);
        return;
      }

      if (location instanceof Array) {
        latLng = new google.maps.LatLng(location[0], location[1]);
      }

      if (location instanceof google.maps.LatLng){
        latLng = location;
      }

      if (latLng){
        if (this.map){ this.map.setCenter(latLng); }
        if (this.marker){ this.marker.setPosition(latLng); }
      }
    },

    destroy: function(){
      if (this.map) {
        google.maps.event.clearInstanceListeners(this.map);
        google.maps.event.clearInstanceListeners(this.marker);
      }

      this.autocomplete.unbindAll();
      google.maps.event.clearInstanceListeners(this.autocomplete);
      google.maps.event.clearInstanceListeners(this.input);
      this.$input.removeData();
      this.$input.off(this._name);
      this.$input.unbind('.' + this._name);
    },

    // Look up a given address. If no `address` was specified it uses
    // the current value of the input.
    find: function(address){
      this.geocode({
        address: address || this.$input.val()
      });
    },

    // Requests details about a given location.
    // Additionally it will bias the requests to the provided bounds.
    geocode: function(request){
      // Don't geocode if the requested address is empty
      if (!request.address) {
        return;
      }
      if (this.options.bounds && !request.bounds){
        if (this.options.bounds === true){
          request.bounds = this.map && this.map.getBounds();
        } else {
          request.bounds = this.options.bounds;
        }
      }

      if (this.options.country){
        request.region = this.options.country;
      }

      this.geocoder.geocode(request, $.proxy(this.handleGeocode, this));
    },

    // Get the selected result. If no result is selected on the list, then
get
    // the first result from the list.
    selectFirstResult: function() {
      //$(".pac-container").hide();

      var selected = '';
      // Check if any result is selected.
      if ($(".pac-item-selected")[0]) {
        selected = '-selected';
      }

      // Get the first suggestion's text.
      var $span1 = $(".pac-container:last .pac-item" + selected +
":first span:nth-child(2)").text();
      var $span2 = $(".pac-container:last .pac-item" + selected +
":first span:nth-child(3)").text();

      // Adds the additional information, if available.
      var firstResult = $span1;
      if ($span2) {
        firstResult += " - " + $span2;
      }

      this.$input.val(firstResult);

      return firstResult;
    },

    // Restores the input value using the previous value if it exists
    restoreLastValue: function() {
      if (this.lastInputVal){ this.$input.val(this.lastInputVal); }
    },

    // Handles the geocode response. If more than one results was found
    // it triggers the "geocode:multiple" events. If there was an
error
    // the "geocode:error" event is fired.
    handleGeocode: function(results, status){
      if (status === google.maps.GeocoderStatus.OK) {
        var result = results[0];
        this.$input.val(result.formatted_address);
        this.update(result);

        if (results.length > 1){
          this.trigger("geocode:multiple", results);
        }

      } else {
        this.trigger("geocode:error", status);
      }
    },

    // Triggers a given `event` with optional `arguments` on the input.
    trigger: function(event, argument){
      this.$input.trigger(event, [argument]);
    },

    // Set the map to a new center by passing a `geometry`.
    // If the geometry has a viewport, the map zooms out to fit the bounds.
    // Additionally it updates the marker position.
    center: function(geometry){
      if (geometry.viewport){
        this.map.fitBounds(geometry.viewport);
        if (this.map.getZoom() > this.options.maxZoom){
          this.map.setZoom(this.options.maxZoom);
        }
      } else {
        this.map.setZoom(this.options.maxZoom);
        this.map.setCenter(geometry.location);
      }

      if (this.marker){
        this.marker.setPosition(geometry.location);
        this.marker.setAnimation(this.options.markerOptions.animation);
      }
    },

    // Update the elements based on a single places or geocoding response
    // and trigger the "geocode:result" event on the input.
    update: function(result){

      if (this.map){
        this.center(result.geometry);
      }

      if (this.$details){
        this.fillDetails(result);
      }

      this.trigger("geocode:result", result);
    },

    // Populate the provided elements with new `result` data.
    // This will lookup all elements that has an attribute with the given
    // component type.
    fillDetails: function(result){

      var data = {},
        geometry = result.geometry,
        viewport = geometry.viewport,
        bounds = geometry.bounds;

      // Create a simplified version of the address components.
      $.each(result.address_components, function(index, object){
        var name = object.types[0];

        $.each(object.types, function(index, name){
          data[name] = object.long_name;
          data[name + "_short"] = object.short_name;
        });
      });

      // Add properties of the places details.
      $.each(placesDetails, function(index, key){
        data[key] = result[key];
      });

      // Add infos about the address and geometry.
      $.extend(data, {
        formatted_address: result.formatted_address,
        location_type: geometry.location_type || "PLACES",
        viewport: viewport,
        bounds: bounds,
        location: geometry.location,
        lat: geometry.location.lat(),
        lng: geometry.location.lng()
      });

      // Set the values for all details.
      $.each(this.details, $.proxy(function(key, $detail){
        var value = data[key];
        this.setDetail($detail, value);
      }, this));

      this.data = data;
    },

    // Assign a given `value` to a single `$element`.
    // If the element is an input, the value is set, otherwise it updates
    // the text content.
    setDetail: function($element, value){

      if (value === undefined){
        value = "";
      } else if (typeof value.toUrlValue == "function"){
        value = value.toUrlValue();
      }

      if ($element.is(":input")){
        $element.val(value);
      } else {
        $element.text(value);
      }
    },

    // Fire the "geocode:dragged" event and pass the new
position.
    markerDragged: function(event){
      this.trigger("geocode:dragged", event.latLng);
    },

    mapClicked: function(event) {
        this.trigger("geocode:click", event.latLng);
    },
   
    // Fire the "geocode:mapdragged" event and pass the current
position of the map center.
    mapDragged: function(event) {
      this.trigger("geocode:mapdragged", this.map.getCenter());
    },

    // Fire the "geocode:idle" event and pass the current
position of the map center.
    mapIdle: function(event) {
      this.trigger("geocode:idle", this.map.getCenter());
    },

    mapZoomed: function(event) {
      this.trigger("geocode:zoom", this.map.getZoom());
    },

    // Restore the old position of the marker to the last knwon location.
    resetMarker: function(){
      this.marker.setPosition(this.data.location);
      this.setDetail(this.details.lat, this.data.location.lat());
      this.setDetail(this.details.lng, this.data.location.lng());
    },

    // Update the plugin after the user has selected an autocomplete entry.
    // If the place has no geometry it passes it to the geocoder.
    placeChanged: function(){
      var place = this.autocomplete.getPlace();
      this.selected = true;

      if (!place.geometry){
        if (this.options.autoselect) {
          // Automatically selects the highlighted item or the first item
from the
          // suggestions list.
          var autoSelection = this.selectFirstResult();
          this.find(autoSelection);
        }
      } else {
        // Use the input text if it already gives geometry.
        this.update(place);
      }
    }
  });

  // A plugin wrapper around the constructor.
  // Pass `options` with all settings that are different from the default.
  // The attribute is used to prevent multiple instantiations of the
plugin.
  $.fn.geocomplete = function(options) {

    var attribute = 'plugin_geocomplete';

    // If you call `.geocomplete()` with a string as the first parameter
    // it returns the corresponding property or calls the method with the
    // following arguments.
    if (typeof options == "string"){

      var instance = $(this).data(attribute) ||
$(this).geocomplete().data(attribute),
        prop = instance[options];

      if (typeof prop == "function"){
        prop.apply(instance, Array.prototype.slice.call(arguments, 1));
        return $(this);
      } else {
        if (arguments.length == 2){
          prop = arguments[1];
        }
        return prop;
      }
    } else {
      return this.each(function() {
        // Prevent against multiple instantiations.
        var instance = $.data(this, attribute);
        if (!instance) {
          instance = new GeoComplete( this, options );
          $.data(this, attribute, instance);
        }
      });
    }
  };

})( jQuery, window, document );
libs/googlemaps/markerclustererplus/images/conv30.png000064400000002006151165346430017041
0ustar00�PNG


IHDRk�?sRGB���bKGD�������	pHYs��tIME�5lHE��IDATHǵ�Oh]E�g��%/[[�Y�&��M�B7�EAh]h�7.�Ѕ��Q,U����B܈�UBQT�.\��e�OQAbh�@��;w��{c$��}0�̜�;g���[��9���I��sH�$>Q���0����'�Q17'�?���cKn�kS�q�{$

(�5�,�P'8�7{+���<�^w��x��9J@Ld��*�j��UjYS����y^��|�y�L�h�DPQ���N�A�Pj�����i�+,�e�t#ÃVx�STg-��I�ؤ������R��n�"!�GH]�8r�N�ԺC���ђ��&-i���=P)�p�"
�)��h�h����!��b֤�#��)bA�Ç#�m�)�NR�MZ��mg��R�ܬ��Z,��h��eJ{��Vs���K�1'E.Z��b�g@]�*{�D0�ԓzkiV-Y�k/�����x�8��Z�")1Z
�����J�ߓa��Z��'K�2�79"	�E|z+�Ю��y��V��*u�#ӝ���)��@�'�]�_5}��|wo2p���Z&b����e-��M�qR�M�'o�(�x�D�f��걶\��WGޙڔ���/��o�^�u>�)U���[�f͈��G�S�J��x�'k6���'�ҥ8ٓ�~c�3�aݟ�f֥��BevȨ`T	��`�&O�rY�!���N?1F~����l̦Y8��ܵ�C'xi�Ư�z��]��bR��x������X�r�-�/�1?��+C��k}�nlm�<
����n1��я�c��T��cO�)jA�9�������čF�F���9/���G����l�•���1���L�
m�����������!}tj��w����G��F��u�9IEND�B`�libs/googlemaps/markerclustererplus/images/conv40.png000064400000002750151165346430017050
0ustar00�PNG


IHDR($�<xsRGB���bKGD�������	pHYs��tIME�9|�8�hIDATX�ŗۋ�W�?k��3�Nҡ1����3FM�h#���!>>��cE�A}�Q����UT���K���X�*��њ6��I2��9�ۗ�|8�˹8�YO�}�Y���k}�Eس��=��懱i�)⫀WD��ڈ;m
���h<i.����=w�;x��=�]y&ԺRU�	f�sX1P�"6(|%)M�/�\~���G��\�x���_/.�+�yO�-��aj��\{�tL�
#�bh4��U�.v#��^X��~)�ҙ��x���]2�+x�$a��28`qԟ༣�iIm��^�������'ec�V��d˔Ԃ���̦G�8c��DP5�����f�\��
��I{̍����x\#7Bm{�Z��ww<X����0�t�ٔ<�"r�38�FL	f-���y�c\M���Zf��`�+	s�O��T����P�P	�n-��B�i��G����u�v#�5�'�P%e��F�`��-	7m�ނH��8j�LВ�Ԣ٠��kM(�	X���c����Z�0d�Y&�F\բ��"��1��M�"��3JB����;�9�9L�LT�87&�B��Y�ԁ謊�����#)�C0�Yi��a�A'�^"�MB;3��{S�DТFh{
�ꈩӻ�bR�^?�>������:hFI������Z4����I�������*C�AL��aa龧�/���w7�a0���9���AZoa"6&�w�84G�yb^��<�V��}����":΄�h5th�I/sL��
-Bɠو	���s�p�'>y�‹���I_�Pw�9Lݾvӂӂ�!����P�Rn0w3pʼn���{��V���_���W�m���/~��7yѪ���O}�4�DA<�[B��*�{
�q�!�(��U����N�7�:�҉G�zmbf��>����Zn����2��G�]�hƙa%���Nۜ}$�;�H���E322{���g���G݆у��Od���(o믜�g�ʑ_I��G�
q�E���yi��m9�����&;z���������gS�+�Z��	�R����+s����~r�;��J�}��oTK
8G)�fñ�������z�峟~t���4�V���8q�o)�{I��>��;���v�����}����[q�aaq�j)#�9T������;�Q{ף?���z�-��Ͻ�bcM��"do�K�x��L�~��=���UN=�suY-�G�������Cϝ;7�����X[[�ף,����Sߜ;t��Y��W��ܟ���z���T�Y]�V�KW�j�]������O���Ͽs�	��=��e.IEND�B`�libs/googlemaps/markerclustererplus/images/conv50.png000064400000004232151165346430017046
0ustar00�PNG


IHDR2-�8�sRGB���bKGD�������	pHYs��tIME�
IW��IDATh�͙]�]U�k�}νsg��tZZ���ъ�T1h|QC�G�0��@�Q|1)oFc��DMLHl|P���HbB��B�P�H�ҏ�3�_gv�N;m�-Ӂ��=�͹'���Z�>�W���	�r��h���{�n�~���P��%�S��LA����eж`��H��Jp��c)A7|���ӿ�u^����>Ѹ���x��c�MF
4��h6�Y�b���.��t�t��_��J���vC��{��&����ٚ��H��OJ�s��-i�)���3����c��=���G�֯
e���:�����rND
g%��a�E�Q��Qo�\��A<wZ���ȑ�F����\?�I��]]�x8��=&�c�I�H�"~b|Qa�I�6i��VvO�R�X����4�sV�r������""�W0p���*�f�"u'(Z_,.mU�)�l��3������.��DȎ&�
�H�*,+f��
��=E��!�af�N�*'���f�*��j��~��{���\��&��xȉ@�h�7�
fCH�N/lH��T��V����-B	�I]�0�#����XwP/#��X�6"�`�ĥaR�PK�
!ƺ2��LGrAl�-�"��\gg]'��##!X���M������x'X�O0�u�0���#�ݨPyș�*�b�a��z2Ps&X�5�����	�3��N�H���f�c�>b����g�8�pa���6|�T	v���upA��c�n(1�uղ1q���5�!Q
�L@V�zVO���ej��zD:��*n��f,%p������R���&H��(c�T�*�
�r����Vb��UT5��]2r��`H7a�/�̑�(����zJ
�D�e��c�A�A����r��&,��B\��t�-�ό#~M.01:琔���!U/���)-R`�&�_w-��ؐ���y��
�(�گ����X�!T�T�9�Զ�oƗ^�+���k,�����t&Ûqs��c�;��W����L6z�I&6���3�ﮟ��:�t}щ�����2��|��X-�
�;�UP��(�CC[�.�O�/�:|x����,��{e�x��g���{��f�F6H���(�jH�4�TPrK��a��#~�����}+4R)�߰?u:W�*~ʥ���*dd
:�s��U�7�|�z簁$j��A��_���L��,�S���V�U:�z[��O����ީ�1�)W�/�[3�ӭ�/�����Y����E���䋳V�Qb�Y%�>@̈f,QE
oX	�$bZk�d*��́,^s%彩W	ᠵ�=o�OZ켵��gϐ�W��gt�z�T���ӷn&Z�xJ�p�W��:(�5T���Z����#L,�g���HZ��g���}0���3����b����+�,ߤ(�͛f�5����,��S�v��w���S�r��B�L�
 "�wu9ϊ��-u8z��_����ݾ�iJ�¡��׮�FW9�v����n�ᏺ�n��,o��o�Kn���ث�&����\x�
w"��+�yBC�azɗ�T'O��F�XS[��oGX?�W����y�\G�RC�m�n.1���WlּI}���ܲe��qvo����Zk�+���#��kvf'��w�Z���/�ݍ����f��BԇSk�ɍ�3E7�%h�Σ	\�G�����‡��9�~ٺ�̀�Cw|�?=Ӯ����p�V;Seգ�	��@R�\U�u�����MDV�5��s���sUk���>�d�1{�)5���++���=���J�a6���d�ݵ��;�x�W���KH��%E���^~��*��U>���
�=
��<�ݱ�`7Li�I)S7L4�N�?2��s��_?�xw��uQsgs�Uo�ٙ}���X��
��s��v�K��t������M�;�;t���Ir�;�rǕ���U7ݼoa�'Y�Yԩ鶬�X-;k�
�Ng0�>����;��w�x�����l�~kܺuV�����ۅs6�4b|���XIEND�B`�libs/googlemaps/markerclustererplus/images/heart30.png000064400000002650151165346430017204
0ustar00�PNG


IHDR���sRGB���bKGD�������	pHYs��tIME����x(IDATHǭU[lU��33{�v���M�v�Rk�	)/�)0��`�����Lx��K�G"A��
`L�`b@+T��$��W��������������̜�����w�C�Kѫ8�z��3��G��>_�=f����2��fV�(��jW]i�>mq�1�=�S��"����=�ĜC��Ή
���É����x��XF���xZS���`��)=��m��ǹ��Y�v�.���~=5F�7PS�Om��'uE�0@$8�.xسj�/�xe�t�#>�cF8��Ҭ��"�3!���`B��r#���^��t���7���W�����@8�YA�ux�ȸ�	o��^��t��4յ\^ӭm9�ZQ���RC�td{��	ZhA܌��[7މwJ)0D`Q2/V����r�6w���-��z��N�p:V���'��f�`%L�l��v8�ĭh����(���b��D
#�+�]����뷯W�Z"�	�ý���p�;���[��'q�3��@S�v����^���FV��eF*�FqK����%��/���E_PÁS7b8^��H�d=��[F
-9�
^�!���e��s��t���A�qHiC�Jﶻ��l�q�Ai�4
:��3z���!^�(%)bj̡��`�J�x#�'��=n˵��z<L��qj��~�ȹnY���	O��l���V��(�@��%&@X1�@�'��ҩQ}f�Lg����]�2ʹ����=��)�$�%����ȯ�盻����.����0�����/E�+x��.wMY�~�]���O�/������^
&�c9���(MAHJ���g�|f��4�aé�eG/;���|�o��&a��H��V���>y���,�MW����*�m�=�jv�:PB��^"W�$�J�UrH�uϗ]%oy�=\7��쇚���mC{>+XCr��Pr"@)8†&4عg��ʪ�Wl�u�
I�`ۜϏW<Z�b�fff��RJ�5�PEN�����ґ�q
��ސ��[�����S&"�d��s7/*���i�͑&�x����o���5�^�m`��5��E
^�ӝ�
�(����}j4�����������5���$s�4hJ@��)�w�#���wf���]S���3"�4�{�ﭼ�����a���q�BWAה�)��^r�9�S�X�Q�6|�v���-�w6ZM�H0�8�����Wl����AD"
��M�B��%��ךe�|P��-�7ُ�pb�B��웛��?�a�7��B�IEND�B`�libs/googlemaps/markerclustererplus/images/heart40.png000064400000004161151165346430017204
0ustar00�PNG


IHDR(#�9H�sRGB���bKGD�������	pHYs��tIME�8���IDATX��Wk�U�����{�c^8�ÌCy�[pJ@�R��BT�mRPc,�-jiZk�DM�m*i"�M����*�SJ�Tk�3�P)D��a���y�W���af`�)I�d�{���Zg����������kN*�#0���/�񂐉ө�a��9�@���s�[�S�J<��N()�
󼊥�+�j{��F���t鍦�w&u�e��B!�!!dR)A�a�@��)�|�be/%K�j��n��';k��)��O%�x�P�4�Z�E{1o���ꆝ���~<q��������t<\Y�&����0A0
BƠ�8�X�e��u����y�f�,�_r��j�`�C>��a�E�-���@)!%�	�|�C&M�W��k�j��֣�����zE��T<��{��,���#,BD��X1��C�8.E�Q7��}�í*�s��/9�0*�s��H
��`$�J8H']��z���U��.�Hw;x��m�|G�%���B!��D���
0��8��T�p�v�UOX�i?5VڟW�>9���Z�c���X'��`C��E���<�,~�m�&52����]�}.���s��5��D�E�H�VC�+^u�Z��ްp�/<�/�`�aPJ���'�:�����J��M9vh��R�L-xE�Ap�p�ќG�	��������cf��=C��R��ueԥ�����`�"�[�N��P;r���~}
4/��6`Q�/��8
4Q7�!/ׁ2)(��k:#—:� 0�B
�B.@y�D.�<��:G
������<6�`!�}�1G��N�T0	t�?kѹ��;�Q*zyxB�A
r����Z[�ש���{m�̅ޅ'����r?w	��\�@ћ��H���[Z�r��gT,L�������1,������rJsE�0����ߤ�~0+
����Gm�>Nv߆��,��@��?T�|�.�XF6���t���	
87�
D�iA�[/&ҥ��fʱ�i=���U���H|Al�q8)@���E?u`Tʹj�m������	<{���(�k�^�Z�[�"��a��DU]�Ά�_;���qn:�z't���Qh�*ʵ>��	�L1hJ�>�hQ�NI����m�	�|�7/�K�R	?yXM�cn:����)g��?����`X�@��,CCJ��}qY�D��!�~zܨO��uA������{���⹏���,r>�2A�����(GQs�С��HT�a�ܟ4uͫ������
wk�;T/0V�;��—��{ɑ�#,<_�b�7}q��m϶��?Ƹ#e,��yѶ�O�Հ@6TU�n��;��̕[7<���;~&M{��H�zzÖ`MO�#J6%��~��?���yUM��Ǝ��K+\kj
kCXk`��e}�a8����a�����P��ND+����#}�h_7g|y��T������-6H[P@�Q�x�}�Y�23�р5����Bs��v䄵c�>�:zҼ�ؼn�ʖO�-g�FlI(@V{X@
G	�l�ڱ�|�#k6_6U��9|Ĩg�f>�9~L�`_�{G�vHXh+9�+Ύ�:g����޾�o�{����])���8fPK�*_�1y��'^�?��6P�o�2n��R���
`�H�{Pg7$�=f�%h#<'��U�������?p5�JlX�`z���9}�2��0@�yI�Y���0`#
�
�a��n]���?]�du���~���_�<z`�ә�-�iVQ�cX�-#&5$��M�aX�gn����3��_}=$����n{땇���+�ɔIE=�D��t�7��q���S�����!�ܩ=��Y����OS<�D�c`,�8X��;u��W,]��Pl��,����+kǮ�4}�=N�zo!���.�Ԉ�"��F�폽��ڦ�&���,/�����kI�b^u2.^O&�
�����2T���f�/CSI��
�IEND�B`�libs/googlemaps/markerclustererplus/images/heart50.png000064400000005667151165346430017221
0ustar00�PNG


IHDR2,'��ZsRGB���bKGD�������	pHYs��tIME�zIW.7IDATh��Xp\�u�ν������FZ�X��F`��MC+7014q=��B;�P�̄��H05-�f�N�%��4��_th�&��L=�`�
��X�زdI�j�w߻��]+�-ّ-
���Ѿw��9����90���͕��K�$nr��!���|�^�&KW��pc.WέY3�9��3;��WUFGU��c<�6�MJi�'��o�
3�-XthA����l�l?����y�+<�n�O�����AA�(H��F�jm}i�o����B���lv�T*�G���
"`f@
�RG�����zvi���s"R��ݽ�B���8�1�|��*J�`(a(�4X�֨*[E�5�:~�g��Z/��4���{�/����b�T�.�!��#a��DPJA)'•�UC�d��ۗ,�f�}G�J���7��cC7U��ޡ�pms�kJy���uI�
Pu�1�Zk�����
�)��q�z��~���~'��J�29I~�"\��H–+�DZ)h�A���;��j�{�o�Z��N|t�oo�Z��Nd��Ừ##��є	Z��R���_���r@"����i��
iI�>��G�{������N�f�Re�_���^�R��"�1N�D6I
"P��r����-����v8�5e2_0vFD
�>wu�Ё�=����8U*
ǵE˙��D5C�c<����R.���|��G�tr���W,n�˓AV!�
X��=A 
Ԧ��$,!�H!�f�y�0����k�岾>;Ed��W�~10�U�d?�ˈ�!
��/#p��bDT�Pm�oh.�
�9�…����dzqX�s"@�#0���"0~�w2�,Ҿ���Ri�����o��B�wh��[�cǾ�ޔ]X�T(�V���xʦ���D�<Y#""f�������2J"�22Ҋ�$,3Pw�LΙ	"2��
���Q�*,Z��\eb�?Myb�b8�Շ,�Je��2kc�Ejv�f��M��J!�-��1d��3lq����7D���4��^�	�V&����҂�&����v_��)�?��r)�!Eaylc�Q`f�&��毩��$¢��2|�CFH����i_�,�QT�]-LjJed�F���c��5CG���g��!
�c�h��Y���S�
�]my��΁�@P�kv��/��=:�R*�)�F�G����ʏ�}gt׮��
���_��_�����$5{N�jivT��
�����8�.��cw���#��uɒ~�Q1��Z$��YI�1"p�R����bB'n�At�٤uވbb�R`k���1�8�a�7BO)���~���k�?�q��SUrfJ��:4wU��ޜ栚̧�B*���LcM!T�(�cT�1�\?�.D��I�l'�"��vZ��4$v��cfqo�{_��jd7�T�	p\;��X�CI
)U+��z�0
��|a������͒
����K;$�٨&'RS���I=є�Ј@��8�1��9
�vtv�˯���^ݷg����T�\��g�E��J#Җ�GE�8��`?�D)����{��S�|OϞ����ȡ��Q�Zɬ
.�@k5��y2�`�Z�$\D]�\�Ƃ믯Li�볅�^{�7z���UZ����Ӏ0���?(0Cկ��Hh����r�CS%�ɇ|_��~��c�؂�U$I�8I�q�3����8W�%ah�\m��;��)w���;L~�O�[\���j�v�Y�94���|��������FZ��J���'z�c���*��ұ�]GI�[��j�%����#E�")�^����������rξ�S<pW�*3<�a"8��|Q���!&�jg��o��{�������k7n|��$\1���n��Pa�={>��W=�k��!D�64�׸r�Wf"q�f��ܺu�-�͏n�Xs��H&7/�Ğ1�%���i�1��ӻhѝ7l����Kn�䑮���._��I�����j✃c�d�#���\#⦏�����f��~\�R���>������g���7��!��0��iX��_nM���X���D{`m*m��W���ʆ
³���?~�ミ�y㛑��CC�)"$�Pv���e9�	�L��w	�6(�}dW�z����kkn��x�{���@oi߾�O�ٳڈd(�����h���,�>Vб�@P�6��ʏ<ٵn��k?��؅�Ȍ��7:�ݹ�sc{�v]N<=?��+
���c�}����_�ݴy�B�pV����;_��S��ؿ���}J�Ia
ij�ooEϷo���h�:;�~V���'���g���>�
�]w/p�dW]9�0��V�ٴ��t��G����8�Y@@��3C��؁���72dTM
	a�Ҷؒ���_�Ɔ�"q������O�_����;�!�5�h�Z��1C��e�-��1άX�U���}Wݱ�p!��J�{/����wO=�E�͋�4D@��-fԛ"��#$"��V4����M�������l>'߽�]k������m6[F"������[���Z�梋�v�^~����}y����3�w���W_m:�絇'��C���$�!B��R)pK�{�?��ϙ�ƭ�}js�\z��Z��g��:����ѣ�(�e
llZ�^4

�7>�h��e�����
"ED�����X�޶�kժ;�ϟ�|DM��/y>���ytd�X(�z_zx���hjiy*��$�鏶o?�~�S(����罟CIEND�B`�libs/googlemaps/markerclustererplus/images/m1.png000064400000005673151165346430016263
0ustar00�PNG


IHDR54*�p�sRGB���bKGD�������	pHYs��tIME�*���;IDATh޽�[�]gu��}f�c���qb�@���0XܡJ��pၶRQ�@��<p	�9�PU�y��*5*���J�&�@(1!�nH�8������~������ۙ[�9���o}k}��_���;��
��
�v���]��yֻ��
Ma�w�
ꉔ�G�Q��0$C�€x��R��E�b�
-���F�U��DS�Q
�1`g���qm�ψ�j�¿��,�T/Z�n�Q=�2���;��1�Մ;aT����@'^t�2�Mͯ5,��pkۑvY�R^�G�=�#u.:���ކ�{{oF�q�X�i��j����l����;��y�!��n�	���HL���`i�N`[M�@�b�`ϑg���4hi"&��r�ij���c�#11���W��`/!Mc%�fi{�
���%�)���T������E`�
�-���p!ī!¬�7�!`x<��i�L��ӗ2l�HږA�8����aptj��:3��l�5{i{,���0z�J��b?��d���
#5������s	�uɳIھ��U7BQ�Y�)��	��vGH��d�!��
<���R쫀G�{��yS4��h��s�"p+p]Xa�1`��[����,�F��HG�'���������$�#H'�!�/���F8�镵��8���>�
��$���d�=�·���8�=��
�Q�<L��ֵ���.
=
þ���Sfr+����I.*��b߃�$p��P�%M��F�ś�g��n��"WU`2�4�x�E`>V�8;uN�2�!ϾC�8�
Ϧ�B���Rf�Xa'@q�7��7#ݎ}c
�	������xx7���m�����Xz�m�	�3��ҽ�s���w7�B��9
�����"܁��:Jߢ��]+��X����]���>��ߑ�%��{zܮ��^����m���zڸQ=�@��bB��]!�9��a��<[�H��E�Z�G�>���$i�[��^�9Eb��ԥ)��K�߻��V}�J��`�D�=��hYE�ʺfw�X�V�Tg��/Z���e�g�(�H��?Т�����+��,xU#~4�`.��w�%��d��@jo�xS�Œg�6�vJb{-M=E��f��(�nD��H~/�yM0�!����D�4�$�q�'�n�AU�KS^�4�L�:���{

��&�J�ʒM��tU�,M�`���H��8��^��b}�*�G���^�򿋴�}v��
ˀ�놫G��T�xM�O�V]U�j�
5�~*�nA:W��Ґ�`�u�Ɋ��4+�B�c�
��E�3$�԰r�OE5�x�xE���\�����.���X_NaO�-[��}�:tA�K�]�ʁ�%�QG�ŗ�ջ�/��0j�r�q�ȳ�$T3`[(;[l����믦N�R}����S卫=W¦�S;�31����ƂxK<TN�Ҷ�N�4Mۣ��+ĝ}Ft���b�I�9�Gc#��"Q[�!!�6T��X��X̧Z��Tl�
H�µ���#��I$�Z���Z
��}���B����I��g��$�{i����,ఛ�{>�J�w7Oԟ���K���y�:BS?F����>A�=\�>E����匦�ݭ-/c���̖{���r��t0��@��n�^�"5io��q3�G��]��$��U�9�4t���.��
{���2D��CM������lxo�X�ױ�tWh�
�a?��s��I��6��TF�'�``p,��ʃ/#��u��]z�_���׆t�>�2ҧ��}*��,&���9��ɞ#�|�:i1�QCulC#�I���g�ٺ�#��G�v�H���N��,�5��<��}���{�o�ӏ�~
��O9�"yF��*�Ip���x_
�<��'te8���
�E�s�W�+��w�>̿��ߤUD�U�8L�g'�W�:%��\�A�k�4
j�9OG���$L��
�V�I*�@�A����!��޳��'���nx��=HK	0,`+�r�M�҃�;k��\���,���|{o��ms����Q��"�PS��N��Is�*QƞB�xp}0�"Y�Y��õ���ǑN{�HX���,1�'P^�=Z3X��)ھ��\6��+zM�V�}��h��Ě��}
�����(XE�/�g��K����l�|�ެ��T�h�(m��~(m�W
���ۑ>�}p��{2����"�����$����7"���x�$y�(���\���t~�Q)F���ͼ38؏�j��P��M��Hy��s�����%��o��/-��3!�܉tm_�d�紽/N�a���uK]B�C���d�D��0���L���q,:��+�7�xT���kx=�D����4u�V�7J���=E���+N��Ώc�Jv{)ʐ?^YKg�v^i�ZBo���?��I�H4��}�^��y�t!=2���9�$M��H���D�
o*I�ӫR�{��FK�X���ϑg?�0ޟ4ƫ�\�#�8R��T���Pt
�Lhp/���(�Oɳ��=�{c	8
�9iO�z
9G#{�R�l
*�gا�w���@��M�<�t��^JCО�?����g"�\2]zީ$��1hp��ײi����:,Ճ�%`{q�R�h�d0Z�E����V�9�̃��=�:
�g��S�U�.�*Xe*��{{8Y(�]y{ivP�6��-'5�r�����>�a�����|�uYcGq�Dz�]yp.�ڋ��${�k9<�������:Z��iGaN�IEND�B`�libs/googlemaps/markerclustererplus/images/m2.png000064400000006273151165346430016261
0ustar00�PNG


IHDR87YЉ�sRGB���bKGD�������	pHYs��tIME�)5�.4�;IDATh�Ś[l�gu�����a{�I���H20��V��
(a��$�		�U���EOR+����Z!�h�^D�!�;B$@
!��!�d�ę�=>�����^x}{>��{�I���>������w���O\��j��l�5@}@�fY���$:6����r�n���_�����E�I?0F�}}���H�����YG�
,�6�������x)��a�ˀZ�o��Z�96���l��%��xT��!`P�eL���C�X��3��XSzв�ZE�uCu1pt�]�e6�idz�+�oK��M����g3
1��ȼ�]��-J��\ِ��m�cܘ�PS�EI���,%T
����^����
�����*J���$Fc�ݟ�E�̎y0W5�I��z,ڶ�	���V�J`4��D09|�w�S6�$Ɓ{%Y\;[�Ĵ�T��6C$U�A`_@˱�hIL�7ؼ
����	|$�gƶm&��K����9[s[bBu:9�mك�+3�9He�(�u��mn�����.(�f���d��v�(�S`�f�ԍ����f�(�Ey0��Mv#ILT�
qЦ��!�h� 1a3#q& �넷�H���]��s�I�x
FR|g��ō`���-1��9
q�f8*Ka��%~LmI\g3(�7<�Ĵ�i�E�����k��N|'%��f�9[���V��A�;�YH��Tg�M�����y����|�(y�M��9�:MXHDu�T��V.U�[$e�Dz�3�3h�A��@+��Eƈݢ
>����J���6��:���f��*����u��?^e�q���)%(X�&QDhG�]���Y�+�e��m�
K�9
�GUg|#��v��y����ܛA0O����G����H�&qs��-@��~���!<7R��zEj�d��\�eVGa�؜���������%�n����#���(����)�S�?js4�t�2��y��m^��ڪ<�-I�
�
�o�;��π/%�_�n��O���%��2"�p�2":�
>�{Q��[��c��=6_H)`�>p��-�n��ă���BY�*2f��R���6_�����i��}����F��6�ޱ�`�M�6�ujʋ
�Xˡ����J(��q0$ъ�����ݠjp
J�=;)\!}��Dk�M�p
��Z�z-�?E�\��U���)ՙ˚������s����6��α����1��B�*��dXߪ�kEo�2l��UU��o�y�f�M���ܝ�d;��(�>ܛ��Ч:KU����%F#�|Ϧ/~0PK-I�V�X�HmK��p�ͻ����~]b	���R��V
����f�M�)ʽ�L����"�VQv��jYW"���D��X�Co�Q�v�HO�js�+d�~��s�EZ*B+jE���&z�Ʀ��S'.1Z�l���w*�^
O�8숯��U�i�Ùc�����Z2�G���$1cw�W��s��e��u�Zg�z���uڱ����f����. �%�t����]�:ѳ�v�Ɣ������
]!��go-���U�˭�lz�z��|�h@��hl���b���gCw%�}�׊����f�U�2	�P��dtܱy�@x�R5���
Y�1)jO�(5���aS��a��,�c��$��]�����E��%���7%E�f�f1�Ub�
��lq�vv��,�T'i�#�x�ћ��/I~Pw�]5�	�&����a$խDTd�]��p|�R�@:�j�P����֝���l�R��i�~�^�V�m���*S��_J���Bu�YN�d��&/$F�ݺ��;�,O���7���N���8\���8�L�(/S�=+�+H�K,'%+
9j�RLyR��(������?�P�tv�X�/�#�
�A��CY6S��E��
�:EX{.I�h��O���,�<v�G�=?�&�$b�g��$>	�ͼtRu��l�	Ə��<O.�TEW\i7��ĉ����}M|��J���wI<�hz�U������G�7FW�H��&m����tt7{9?�7�T�+�mr�L�m��f����La��i����N+�ټ���d&
z�T1�3�R⯀Oۼ3�gDqTSo�>5m�	�>���tg]��F�]3U�G�cٔ�!��V�|����\�o��;�8p���1��B�1�������(��:���ߗ�g��Ğ4.$,�H��2�=�B��H�oN��x�ӀR'��%�(?1]擥j�(�ҭ6G����l���.q���Ј���I��E��-��y���F�C�9ascx�es�ͨ�WlJ�E;SI,��,q�-���P�n�<�ׅU@�c�5�Gm�(��	���+�
g�l�T�
I�Yu��N���D��}����M��
��s6�Q��D�I��I<�=
�*���J��J�S�aϒ�當b
Y�!t	Gb�j��(�Q(W	ޖ8�)1'�y�cVX�߯��0��N$�89��H�M��;��8	��<��w6s��RC69�����͛���\L~��l�P�b��%�l$W
�"���	�٨��2��P�s�y`�n�g��V�N�:�����pNu&��&�׭5D��?'��+�p���^�8��{!yx��r�ZVd�5��V$�/N@T٬�yn�����@�3)�I|c#�ͼ+ڴN�~�UR8F�*���ՙ[oHSl��E�C2���8[vE$�G��Xy�^9����͋=�3��x(��Plb�\���W\w��������`W'�-�tT�͔�4m�99�t��W@"+�&$�W�<,WӒ����(J��;ra8��$�������
��dy���p��X��Lb8��lv��3���	�
�9��g�'���DJ;ۉD?���5�p$�*"�5BśOeئ���R�
���d2��Ɏ�t&6ڬqYE�Yd�sb�e�Ӫ3��~��"���B}��+I����jnih��E�6'1�T�t:��q�N��&��t���f�/3t0��V[�k뛟4�u�
���-rIEND�B`�libs/googlemaps/markerclustererplus/images/m3.png000064400000007564151165346430016266
0ustar00�PNG


IHDRBAe�rFsRGB���bKGD�������	pHYs��tIME�*,�hτ�IDATx�Ŝݏ��U�?��7ۻ��$NS�I�4NJr�6�T
R������r�%R��
-�H)BBT�R�T
N�$vb�I��!~�י��pq��}�<ǻ�]{$kvgg��;�s��{�猍Mx�@�=?�z��ߗ
�������z�n��6q�f`����0f0�7T~�+��@ߡ,Y�\[��p��F��r�L:L��}�r�N1��
zK�"0�����q�<¡L'?!Opm�������Q��1�6p�Yd�d����^O��"[�-��}��]��u?ݴ�6=�!��ǵy��y�`
��
������#�l'��ڧ�ʺ�K/9�Օ�q��N�5��5a�q��.T��M1D���l)���=���ì������>�����K��3	l�x��qi��\�׊�Z/�a0�����
�y�P~��~��ƫ��cWǍ��7�3�0c0�AՆb��Z���`��4���i�&vw�x��V�e�fa���-��y|Z���8�P����ڐ�e��i,!wt���`�H�{��l�V��Td<��%�m��7EƦP[��u]Yۘ��3��b,8��{֖@��@*-n����ٿ]a�8�s-���X<�,��d���1ޱ��3Dٱ���V[y��־���k����X�M��E�-*���f+�su|n����–�@G����4xY�ّ��e��j�B#��G���{�|�c3�+7�&x��b
�����vk2�̂��w��Gv:
��h_���x�Y��-�V��JP�u�J���r�%/�qxI�a�_v�~w���0�s���x��߀�X���`�|�9���{���fB�r�EV��L������y�ly򢜞3�S�<n��<��$a�1��f���
�e�'��9<fp@5��N<3�A�@��&.���kp��0pG��q�c�)��]k$}���<�'�/(e
hj�J���]���Y��mS�e�:�:��l�=��e�C�����*t#���	�_>�3Tb��GE�jmzF`���'�ma��{d�b��O�t��8�.ů���e�1�-/�9�	��Q�wܦ�����G�y��	��>!�Y�F�Z����Mf^�;|���2F��D<�_wx��xUL#�Y�y�S��g���Zc�����������u�NױX��:]n~�u�'>��v
�t��Q���z��:X
�
�u��������^w_MސӬ7�Z��ƍ_�3�u�sC=�����H#��n�1T?T5l�a��.Oq��Zq`���Eۯm�{lt���y���zDj��rq�C5�Ro�Z�p���q̓�G��P۷�0Viz����~��~�}�zU��K|
�s��V�=��E�B���ž�u��M��!2��p�.�y�����N��{�)�^�9���}�P�7푤�q�O;����6���gn�`�S�-ݷTnju�'�+c,y�
�"�sw_tx���?<��G�{6�=9���
�3U#>�p��S���T��[��pG����.7J�oѣد6^�B9z��?�CV�M&yI���!��7�"�J������(;	�'��U�����Ldžo�d�
�V,�����)�7�aM��j��ſeBѺ�ƒ�P'�3$�VI,��U��Ζ���@�̎�q�1��f��$�-&�ڵ�ڇ7lj]�w���c�ʬ�,��('��;��&��xG�%�S�	��n�B>�eײx�H���j������@"Ϩ6�o��Ze�9�By�#uyAu��_7�a-���Q���ȑ��cL
Rχ�Q�	s�kt��a_V�=B�bJ�+=�Qת��E=M}�|�q5k�V��
4_�&>o��F���S�E`jw[�}9���#��1�4�^-��	b䴈I���>���ϲ������e��i��ւ��k�ZӊXi��)��H=�|8�L���7��!��;~�����y���b���ǒ��6e75��bp��-2�"7��aq�,�`,�r���Gm���Ր)�'^�;���Z�Sl�G��,���ҫ����Y�i�	J=OT�H��{bs#���{�R�z��S���`�;�|��~%��lإ���?��2�����)��*�>a�M�lC#e�q����j)��/O���x�3���R�J�(���p��M����A�-����
�_
:N_�LIQVx�����t�tϷN�k��LUb*W�OSA,�ֿ*U��~U���~4��U�X�a��U��F$���TQ~և���o��-M�:m(�x��+���h]��q�.!e�H.Y��A�^�3B��������Nv=�"��Y�B����1HR[�Z|�b�螖��|��-�VߌmW@K;�GE˜w�$��_��䦥,�I��}�/8�ޞ�[���g<ԗ�}��c�÷�h%�G�<�5�m��_�����fr�~R��Rlad}����(o��p������74���Jc�
=���P���IZ���9|ۢ��@)����1���̊�]VN�06:�
kC���	��NuE�(t��{�tD���2����2�SJyE�F�y�B�e�?6�p��79�d��f�51��Ayq�1�s�Q���\�L�V#��Tz�.iqG����Y
�'
>��[��$��rxZ����!��\3zt�?%b��������;�}�b<�þ����Y��mO����8T�6��B��,���K�[�;Y��>f!�w��!���U4qǼq��u���昪4��]�!��<����y�4m4s۽��|Q*�d��.0S
�ޛf�
����?I���"2��Qf'��H���{��H'�����a�s>�A�HƯ	�}N�\%�q�6�F��/�\Li)]��Kd�&���1��
�g<U��]����D�̇u�%����#�����e�7����!���-�6bh�;�CTE����a٦0��r��d�e�>�	�o���W��;��/\�=g����-uA����{�(�i0�������?��
����ݺ'u�w�[y�@l��~��S�1O��;/�|���k�Fk��sD��E��[¨���T�UqOsZ[Ty1���KU��ظ��S�]ƨ��,.)"�I[�u��*8O��Y��5�5�<#}�ԣ�C�SU2MjW�9�\�I���i�q�R���ՆP�Z=5-j�&�ꔇ]9��t��
��
y�>����d��E�qoK*ZYCW�y�c;˷}R=Q���6"$�F�-�x��ߧHs�}�����h�W2qA�$��PcT�
����i���%�$�I�6{��M
���仫��&��T5f�s*�O�'Ak��~�%�_�y̙�y��W�$��ɶ$!ړ����zk���jv�X�+��t��MLx�*�_���_�N�s*��?s8^��x�LR��W#\��]�a͆h���M�JE�	�S�xcuǂ��j�c���$��@L��7��f��
��Yؤ�1&-r�x�.Y�2I�^����s/�tBs
�EO`�z`o�C�R�ӉU�
�w��3���x������	�&�SG~N"����gv�c���k��%k���I�.���AWa�8/����YɌ�k	�
1D��k}5Y��mJ�E���US�*�K@�®_0��\ϼҺ
A��S�a�yb�����8L��+Ӹ�A��z��_OW���P�%dcIEND�B`�libs/googlemaps/markerclustererplus/images/m4.png000064400000013111151165346430016250
0ustar00�PNG


IHDRNM>R�	pHYs��9iCCPPhotoshop ICC
profilexڭ��J�P��EšV��p'QPl��I[�
X�C��IC��$�ܪ}G�.�>��������!Hp�o����p��bם�Q�A�U��H����3L@'�R��:��8�'>_ϛv�i�7��Ti`lw�,Q�:�
ƀ�S
�0�I��(�rJA�o@I���0{��1�A�+���K
PKґ:�jY�,K��$���(��
��q��4Qu��?��vӑkU��[�q=_�~���c��Cu�݅��\�/��-LO�l�
n6`��V�Pނ��³O�	�'
cHRMz%������RX:�o�Z��IDATx�ԜYl\�u�����(j�e˖m��fM�8��8-�:�n�"O}-P�-Rh��O}�sЇ�E����.@\'v�I��ulǒWY�)Ѣr8��{�0�C^�(E��Q�;�~�;�ﳒ���2ǯ�۠+��ߩ�Ԁ0�[8^z�u�O(�so4�<&�o8�l����\044��������u�t���O�vN�vW�p�aX#�˰��"�x�ݗ��8s�!�+���a���+p�j�UK��駬�t�H\�P�̡+�뤟�f�X�D�F�:�7���pMK�/�$K*l�{����Ԁ�a#��m��6��.lԸ@k��!U��
�>s�LN����x�����^�ˊ=,b�/��U$xK�35���IXa�z@۰E`Q�B-��P�+�9>���e+]�g�t�8ph�4W&
MF>K��Jv��n�e��0���2٪0�5����u��
�^�!�aS�7�9��7�Ɏ�
�dY�n؂ږz��펏6"�[O�Wb+�G��g��b�I��ac/�_�g�q�vg��a��#�b�R�ђ:�^`�a;�m��I�JM�o�Jj-ɋ��W��v��YI�l\Ͱ2�������K��K��QJ����u����T-ƽ����HY��&��K�y�\�$^��Ǥ�����.���0^׆L�BҦ4h�W
������#�Aٟ�<g)�.<�B\WH�kA��YJ��pM��s��.�+����P��\���33��MH͊�B&c?,8�
8
6l�
������v
:R��9���7�H�7Z�C*4�y���ˡ�hl�����Z��֑���T�K���Îw:>��IBB5��8~ٰyk�wv)��9~E���2l7���1ٮn,L��]���]�y��Q*��w��0��z�C��&;�\H�?lS��E���ag%���~�9�������?'�>+)i��ث�"�.4���y�am`70*I��8��UՇp*�����h�Nh⣡>������]��:�[vs*�tN�z�|˰K���ޑ��p|���bݲ���M;�&pհ��m�z>d2q+q\�SM�n�T6�u��|��T��#�����7��yի&���K���c�$�<�Q��u䨦E�[�~ug��C�I�d�j�ev�������m���{9^��K�WPNR�{
�(0
<�`؛�Yǁ�2=�cA�k��`��z#6�F���M�NG"�s�I��a:��aw*�o#�X���4S2"[e�.��agڰ����z��
y�2ë1۫����'��~�v�q�s
1�F�&)���ѿ��4�ݎ��p|Bq���g;X��}x��K���!�v'��7�R_7p�\cr�-�%�|\lm'ٯQI�4�&��g��)n*��,/��gۀ�}Di������x�+�wd.��J�Xp��P��f"���Q�ׁO)[h�{�@S�]�_�Tr�.�ҧ�mw|�aӲ�W��_0�������GJ[`�Ɂ����*��-���[]ԿM
b��6�=�yq�8�i�gDlS|�H��.T�
�E���uI������)wmIb7��V�n��鞽�c�=*�������0�	�	�O�^
��U[���J��;�0�p@^��3��5��o��J���'��c�g�?>_gPEkM�#�������*'��ܬf�Z�u��ð�”���a�
��P�!��X�s����x���H��WyQ
�sþ����r��s���Ju�,i�Wl�����[�}��#�X���D�~�My�M-�	�6��#�e�s.�-��p���A�+M��O_UR�fH�
�{��~n�V�^7�ڌ��b�IIN+�����o8�0[s}xB!˵u�={	�Z���I�<�hjbq����%���bB�zU�<��[Xx�:��5��+cTKYj/��R�1`L�&L�z�D�V6cJLÔҖS"�输	q�A�Ӵ
u�}w�i��TMt�;�
Gq��R<��rj��
#�t�"�
y=��G�!u�Gu�"��/��]��G�߷���G�S��ò�5����h�D�6��j�x����_"�k�C�t���j=�۰Cb[v�g�ێ�k�n7Jꂅ>*��4�E��II،r�i�a#�(�"A�D�=9��~�t�h
QL_P��ny�h���QC��\'5���6Î9���ػ�����-�]&;X�
��!�T�k����j5��Ӱ���&e8� w���<
��햶J@����аî���T-��:���NsE/K�o����iXO���v��5VV�;*4�v||��Ms���k2G�K�da��}w���1ϧX�q@�t���������l�u
�
�[vi.�\s�CXH-9��(�gpR��-W��Y�)�`I�;�]�`��e��O�����K�Y����߿ڢė�^U��,w
�~������eU�~<j
��V�+��v}G7Oe�j�@Q|�U�+�+e;̶Xcen
z�F5n�j^ſ�.,���#��h6�t]/^���{Ю��N�M��E/]�?�4�{j<"{��
e	y�LRej
���ga����ZT��v|F��[�����?V-��T�
����W�U�T�2R��j7�K�\�í�2�J�f�Z�i������q\�W
{إ�2�]�;'��%AYT:V!�|5�bUc���
h�B��aӒH�čv�Z���1�햶�{������)Ԛ��q���F�{%:GS����Jڭ$�K�puK�$�L9~Q
˹hҤ߅��?P�4�;�K��/v�O��}s���cB9y���^��`�ʁn�n�`��ްZ����_�lb;&�}�~k���W��~ݰ�+=�F�X��.:��|����+�J�s8�w�`B���;�㭔z��	�}���w�)��'�([@N�[����ؖ�p^c�4l{�=�k[�I�E%L��E'Q�:;0'Ov8j��~�u·���Iþk�[S�׷������S)����3����6]dy?m�IK`��*�,w���4r;W�wX��fػ��u�<&����������Iþ�S�Y
��w���K��-g���)����_G��%G0�/\2�ð���~x���?bY�@���?�-Y�nFܦ�}Ͱ��n�)�;Z�F
{ɰ���[`�B�9K"2<ͻ��q|Q)���Z���i�${vL���oʐR��a�8��
�~W�����V��:��m��u�#�?�V��v�����&�|�~�fQN�Ib��J~l��J�:�O+
�}Ѱ�bT�
�g�a�4��N�G�����IJ�z�Vz���;�uǏ8�ˆ2lA���?
�&j���+h�[
��A5U��aÖ@��/��o�;�"�T���g
�!pxT�/(����Y�"5�m��2ʱ�y��N��<�����b�K���a/��ޓA��[�Y���ͤ��U>.��ד=
���k�A����R�r'��]��џ�g�e�;�.}N%�#��u�~{����(4zX��Ws���^w�)��*�o�!�����v	�^�b.1V�r����ٻ��W��wvo�"
�а9�ǰ/:�I��b��e�W�#�g
���(���.+,NGD����oi^�D��o\�q��t��a�t�}I䑠�d�k��&GW׶а{�
WDA
.*?;bi�\����Ow��e*N;�}��f�D�w���r��k���{ߔ=9$
?i�Q�$�v���vY�П7�~Iu/U��m��dث����E:�=e/K���0/�oY�Q=h/�i"�)��T����~������ٓ����Ζ'{��)��>��H���O�F�RlVo�Sq�cJ�vi��t8B8�1�ǿi�)I�A�1[�k�[�ǀ��M�)�j5¹�9�*��,�2��#p��w��oHR~%�4��M�{�&�٥��	���e�H[7]jg�@���Vxq��E��_S��,pV6A~���_K��+i�J�J0#�z�;�;uO���+D�?���ԛ{����5�m��5�!]����wS��!�6���'D<
@��iC\�y��&cS�4ǀ���Mh�yм��.i��T���ث�|�ш�1������K��܃W�}�]�'mo;>'�)�w�Q�:��2#8~P���l��­
9+�y�
|��XK"�)�s	8)�t��=�BM���7�h�Q����	���ӲW-�g�wL��2���i�)Ęָg呛I�"�^��Ov`p�����
��$���J7$Iw�]j^Q@=#F��O���Z7���k;��
��k
OJy�ÆH6u�b�JW�IW=��-*d�.��Yo]�x�En�д�W$�Ǥ�����hs����a�7�ծ�mW�B?Iw�.����p!i-I�[���~����]�g�FE�a�3a�0�i�T8��v�ID0��N\p9��
n�V]������@�ʧ���pMM|Z�1ڹ&R@��TO���絶@��,tHK-1$��a�~G����p�ԡ�)+�c
	��t����)5��oHc��N����,�����lp���JL�0�d�O-
��T����I�O��xE4>�XB��T4/}M��
OJ-�D����5�1l�M)�D��`9&�گ��3-��hF^0�rY�I���6�G�ee7Ӓ�������R�3h�.@
�4!fa�
�H�yA�yW�^q�{o뼑�:%���x�H�3i�d�#eR2R��$w�v����
r�4/�
�T����nPأ2諞�u���ŽR�8��F�A����U��99��{�6��+c��rK�W'/�N�79=�&����|�躲�8��`�q��z���mG��S*aS鰑ZC�e��W�Ё9�T��%
"~�5lA�����I,��+�$�ʞ7x�8t#����c�R�F=��v6b���.Z$MQS�lE�W���%��8հ-RtC�,�B����ZpL���ZTe
�&��Т8�t�]��+�}�t���印�3y�0�^����(u\��omc���IEND�B`�libs/googlemaps/markerclustererplus/images/m5.png000064400000015267151165346430016267
0ustar00�PNG


IHDRZY�<3�	pHYs��9iCCPPhotoshop ICC
profilexڭ��J�P��EšV��p'QPl��I[�
X�C��IC��$�ܪ}G�.�>��������!Hp�o����p��bם�Q�A�U��H����3L@'�R��:��8�'>_ϛv�i�7��Ti`lw�,Q�:�
ƀ�S
�0�I��(�rJA�o@I���0{��1�A�+���K
PKґ:�jY�,K��$���(��
��q��4Qu��?��vӑkU��[�q=_�~���c��Cu�݅��\�/��-LO�l�
n6`��V�Pނ��³O�	�'
cHRMz%������RX:�o�Z��IDATx�ܝI�e�U�����]���n�;m�!&vB
�8#D(�B ,@bK���b����
vH�&qlL�8���N:=����T����{ޭW�U�����T��ޝ�=���x�����駯�Q/����_4�?����
†}��&��&�鷸��u��j�u^
�O�&�"\x�lH�Q"��@B��g)o��n	�$�,�FM��J�!��J�կ	��W�ق.�n�����1�F�����/m[	F�nV��}�.x��7�o]-oLB.�$=w0��bg�`#�xhہ�c:��x�w%��0���	�H�eL��̃���̓��
uT�񼏢�^�a�v}�"�VC��O�.��Yt��60.A_5����A�]��{QF��'MǍ��_��.��ww�5�y��<Li���W�-�Q��J�,ch?mW�cE
%T+���[�2DY�|��恹��F�
6�.Л���pzJO�v!	ֺ5�7����l��qv!���7�M`�-تk�SG&���%`q#Js��-���\����.�w����o؄��
��Gx=�E-���s^�Y��j�Q��+��f�m�w[Ѕ�=P�AX�V�[,_�IӦ�w��i�/co6f~��j،n�5�*���u�Y	zB�n5N��ƴ
ݰ�z��v�OʢSYx��O��Ҵ�pP�)D}�:�K�V�=�kl�>	��Y��d����̃Q�p�L��
�vw��
˻N._h�8ļ�pW�;�M��S	*���@7+jZ1��C�1R�@�L��`�
�[�~�
؍��>	>�JdF
�'���f	:c��#Ԫ��v�%�ҦA0d��H9HTS��H���Gv�M�cZ�#	��u	�W����L�q�~-���
:P�eF�#�ߑq۟l�e��bV��b
2n��	�"^7��c�c�*�����t,	ڧ�}�i�w���d��*�գWj���ua{?i�t�a��!��ۣ�7ѹH��y�<��
��d�lA7.��6a~C7a!��L��v���S:F��5��m�����g�~mF��N�����z�#S�9}��
��`������

��Mi���Z����)�}2����$0	�9i�l����'�,v��M����rT���h�2�o'�i}`�����o6��.��aྊ�.�^ԍ��#��������[�py6�~f�3	������MI��mMkJ�qR���J�WP��Q�u	�Z�<<�%*c��^J˔�J'�>vT��s)*�#vC^&`��X�O��W��������.V�!\�#|�mK���悻��@�-UX�E`'��71;�O�?�8/3�b5�=?����_��6�����a�u�;��`�����H�����vH�����F%���u,h�N���Y�5	������	&L�������(F�}Dօ5���K��W�W�	��h��J�:�˂!��m�.�
�Aa]�*�)a���vDۆ�B+�=�swCBVT����m�k�g�2�����MP⋂��ڏ���s{ڼ*�u�P��	;�]�.�>
��`H=��r̒�P$γ�sM��	&f7��5���tXu�jC�S���5�9A�^)�1�K!�
�h񻻖�1t:Ұ~�E�O�	�K�^�1������:��H�5yK�e�x���M�N:�<�2�
Ѿ׀��/*�%�;�ʺ.H������6!������W���<�q�gZ��G�9/�x#�T�N��*�Gv�V�8�ݘ�mm��ERYk�O{����Y��ܐ�����%��/�U��'��I�
�Kp׵�������q����MY+t]�iݸ��ѭ��]
~Ҽ�o{RFiI�:�<�ui��~�1i�PR�D��0��n��O��6�0���^>�U�K�'��+`�Mli5��u�M)7��������_M�l���k�c���h���g\8}�h�����?_K��>	�d���7��K���I[�$,�Ya�a	�����S�r��]���~E�#�_���B+����}y$s��[��}d̴<�Si��g`��ł����5�ݫ��CWh���kP����M,	��F|����c��mv��	��>/;�%ѹuC���/`����6��^�[)��~�ؗ�x6�U�H��n3������je1��+^>+���n�j��~�@4˖��f�9P<�k�A�b�>���L�Q�̆m����3w�&�U�~G��;�j
u2F���i��(�3)n�c�"h��m�)�3#(��z�~]1�!,�cԐ�Z/�oJ�K����+�`u9G�т\�kz�tO-
_R���޽�!+s�c���
�K��m��RVw�)����b=2U�|Y��Vj����NyV'�/�`{D���8������o=,o{TJ�Ul�=ϝI��V�ͅ�+3=�P�m`
��z����@������Z���IaN�Q��+
tC>�h�v�'R���&ѹ�:5Jw��7���-�U��`�B�>��˒�f3wQ�R�h䲯���ܮ�#:9�	�H�=r����^��nR����l�~R��dq#�lcf_�y�S%y��]3�+�aTna���/��4S�Ln�-�P
�����*��ͧt��c�f$�	�7�)��
܂꼌f���oJ��f9��9s�
׫ZMŋ��[�-��^��������i��B��J�����][W�5�ʊ���5桶$B��}PG�"��ƃ{���mY�I%V��	1@�}��eL��k���v;�{_+�%X�'�TK�~�Gwgd�H��\q���ө_ě#¢K�⩤վ�=��bO8�Q<�*�ejٛ�}[)�Y���m���'|@�NQT�k�%v�����/�Iq��2��䡀��v<��po��Qw9{�e���,��q�V�M؞J���_;�Vҍ��VpÛb+��3��t��#XwA�z�9д�J�~P��p�;ԍz��@X=Y��\��N�
���
��׹4 
2�^e7}0�d�ղ%��%�����=���͆��U�\&\������_6D$���U�ѱ�?_�G��g�b"���s2*W��ul�|�Br����t�J���Xv�n{�:˝x��F����ʼ��g��#s4oP�>7�\!�le�qFnv.B�S�y��5ۈ�,2\h?JЙ�xl�)B�cT�uns�.�tx��˒�og��o5ϰ��Wk�.E�⫓b6vA�]mGl��2zKmѡW�3�u�u��gS#�P)�&����.�fj3�G�o%�3t�!#{p~J���Z/b�̥r1W��7j~^/q�2L�
f.��0�e3�-�̑��d�o��D���XGY�ӡ�r��z�%�?��Q?���5�˂É@
�d�`�A3����1����>/R�g�PM��K��^�GAj�~��[�D��{Sѷ�d�7�3�TC"�$�A�Z��=��-��|ʜX��Y���W���:C�t���g�:2���n`y��S��=j
	k�\�fW�*��%��SևXsD���E�g�Š����7p<Ә)�u�^�����p�_�w�.#G��&M��+�hM[��X��J7"'\�e����x!���^-�F�p)�fK.�;
~�Z����=��{u��|k����_J�Ŏ
�-ؑ�$���9��D_��!k�X�}	:o�ZL"[�	��!��#U����ȿ�R�#���B�[���a������?���	ʱBy�%g�Mj�(��4�®��GQ��qF�~Q�|�&��F[�'�Z���lƀ�O��r�.�؁TZ��j)��ct�\���w��~
��f���ǒ��7�Z�{��vYMpdb�>�S�w��i�K�u�[�N��IS���B�aP��e{�?���7��<�ps7J�>L�|�	�S�u���/l^�Jo&�����.�S��v�sݾj��!AgLչ�qEw�@�����|��x�q��z"]��&��[D
o'�:
���|���ۨz��<�&�D_�o7U�}f���/
k#�ӹ9iY�NF�a�
�
��SW��K2��
��dD���oW�w�����Wf��L��6
eH�]���:֟'��?�Iy����ԕ�{>y�J�)"t�p4���gl�M��A�c�,��1��Բ�輈ْ�ͻ*]6Mn����&��2��`<��\^^�R˫����6-�E�7����>M�
ߥ��f���3��������=�t���|JED�[�@
QّaTR5��5��]n���o�B��)��G�d^Q���=]A�Q-��B}�yR�ԣ`?_قQ�G��-����x�;������U����W��d����
my�g�_ay��K�)'笜��п�����g���>Ϲ�to���
��˱јz���ߋ�ơ�	�~>��m�Mm�|��Ks�j��Pl�e�`:�z���Ąz������w	6!��~�4���ר��г^i�(A�Ec�\�x�|R��fթ�b\{���)���I�ة�����X>�8���/���T*l��߯e�C�Ͽ'��ua�����S�)��M9hy�������}*K���j�����g��]�z��¦˲Z���t�F����j�|]<�c)�h�è�~P�7��&���{�U��Z�`�A�f�$\��Ͻ��)�~h���R:_M>��vu�8ؖ��J㕉q�E-��}�8����*���cb�c\'~N�gJ$?��q3��
/%5�tC�<�w��?���?�a�p�S�󔌞b�؇A5��Z����˗��}2l^͝�F�;��G��Ԩ�9'K���͕#\�ܺQ��r���Մ^�Ṥ��'����,d�XJ^����n����S�=��m
t���~<����b��Y�]Լ��Q�X΀�Y���6�9�����&�0����PM�"���C��j�[ˢ�z���u��|��ʼnF��a�4K�8��	�f��5U�ZH2[��q=��_J7�'���y��*�����ՠ����Q��h�#��hT˵���Dۘ{�w5ÿ/5��.A�
&�ܭ�b�kk�����Yw���7���ޡĎ|�fzj�/�?{�cR�����嶚,Dx�DYm�s�ۥ-�I���d�&~RDCT-O�9���+�ia�d�ޟ⦳3F�07���:�S���I��6�_�c{u�C�z�apJ�X�-�ǒsk��l�n]�b0����ɺ�*��g|�C9�U�i�Z�V����5IZƄ�����gS�����현|Y��70����CL��\�G�7S֖�N,��s�tf!���o�ڪ���&ͦ��9�d�-��/g�z�~�!Et+\����'�h|�¡;ԬT�'�B�P���h�]�L���VZ�Z��U��Xj�&l3ŗs�̶LV1h;��|D�m���0�F7�ڢd{'9Ɋ�z7Ȓ�s���֍�Tx��,z�=�3�c�Й���
�e���F
:��sT#�k�v%�jh������v�a�~����ϳ�g�d�����p�bD��p9�=�ն���s�a��z�veŭ�U��f���f��5��%�$kgQej�d���י�"����f�H$�2x��5A},ܸ�1)�q�5�Zo}tW��P<$T<�`��>�!$���G��kT�1�_����V�6����U�
Q�k�U!!��fh^k٫����l��ĩf6��r��5iH����4g���v9:sZ-�SO��P�d	�����z�B��k��F���J�����Q��ܨ�iK����s�~p�畋Z&us���1/���D�È�cx����Z��t���>�*w}h.R��v��؂�w$l��n7A���j���+���>�W��K��e
_���t^�z�Ifa��$_P��w�|*��܎�υՕ�g�D�<8]�P�Z�	ϋ������74����A
NZ�Cl<,͍(7�p�չ�G��A������<�
{8�F���lwGTi\Έ�;ʇ�D�m�~#s]�d�A�ٱ�U{[
m��S��rK��v�<�`�s����vo�J�*��m&�jʉ�
��n��Ui1_�)�f�iD�k[mXt��������u���]�񷞠C-k7c!!Ь2kZϭc�˺���~��6�r�[�!v��z������ʂ�\*`j@���;���F�Q<u�IEND�B`�libs/googlemaps/markerclustererplus/images/people35.png000064400000002560151165346430017372
0ustar00�PNG


IHDR##ٳYsRGB���bKGD�������	pHYs��tIME�9I��tEXtCommentCreated
with GIMPW��IDATX��X[lU������nK�-�Z
�k�A�!ꃢ(`�
0��`4FM�Ő
�o^�!}�M�ED/T�Ɔ�������\�}���tY`�,FO�er2g��|�?��M�e��b��Ӫ��)!Wd�n�D9�'ޚ�4c�Ǿ�W�,zg�#m�IU�',	i3��UG8V8P�IU���ፃ�W�L�ۍ�����
�f�����T�$!�R�F��i{��O{�'��p�s;3F�˴"�3d�`
 (���
0Wf�t|�q��3�r���W�ޔɂ�E�����ͭq�Q�[n�x~wEɬ���H2���b	�pe�j'I#�O�W�L\�/��f�s��<.���ٺ�r�h�,J��3a�y��
p��ņ�8:��e"u�8��gۮ��B�
4E��%���i'�C.(Yw��m%�cG�pk���C�]��K�6R{�fV�X�S;:;�9�ɿ9;ˋ�@��n9���@���=3x\m��I�P�-��B͌�nj�(��g��k��`����ֲ��(v��9�5tE6�E�x�|򪐙�ZP�\�~G�xb���],�bij�4�M��^�~����-��'���M�����䬙���|���=]�P懾'���-ӴYm��ԁ�Up\}A�U���#z7%F��S-Y��2���̲�g�]�A�A	b.�s܄%a�9�{6\{f��ߦLFo۔:�^�_�`�*
Tl�H5>�{;��H�N�y�F�	~�*�ƥ�Ud�Z[�HqG�ن�Sҙ�)s��t4�=o-}�'k0v"�t���N_dzޝݦ�L��gS���7�$
mn�:V�"s�`l�������xJ������G|�3��N���,]�w)g��X�B�e�����^^�}(��p�WH	��q{]ٖQ4%ȢH��Z�R.�UU	h�`�E�\�ؑ	iϻ���e"�=������]���T�Ni%@b���)�H,ͪ�+f��~�R��JѲRY}1�"�D�%��/2��ƪ��C`���y�`O���\�mbr�К���[���]�2?�Ջa�C����I
�"+H�B{���)$��t��k���M�P��qκ����;!�\Rރ�D%���
"'0M�\ܺ�y��~>V��7��6��ӫxXk��W�8dwXY+��BC��Tk5	di_�3�6��Zz�������m�Bb�k-��IEND�B`�libs/googlemaps/markerclustererplus/images/people45.png000064400000004034151165346430017371
0ustar00�PNG


IHDR--:�sRGB���bKGD�������	pHYs��tIME�
:���tEXtCommentCreated with
GIMPW�wIDATX��Yk�Tg~��9�3;3��.����pIlC)M7֢���6E���h��Z�	)��������&��^�Z���J�%B���
�}�z��}�?Ι����Ɠ��9��9����{��`�����J��E�N)�o�]5
B������E2���3����
�/�=s��f�_&��
�s"AXJJ��?������|�?
zߣ�]��|�����f�0MJI��q��MMw�Fkk��RZ?ٵ�<y}���'��N%Ǹ��*�pul�<��n
4
H��M,�l�ahk���PKK����l��#O���t��4�O�P
h�VJw��5•���4�dr׏��񮆂N&���egߛN����
E��М3�6
,��]����́����__=x䩻�
==3�Y!,$A(g�R�R:A*S���6-��8��'�/�6�w��ce&ShO�
�A�X�
��T4�R)�X��چ��fSw�|���
Ms(@�`���'�*��lQH|�!��M�T^S
�
� �J��뉜���o���6��g
�˸�.8�-�T��]�o�z��9��EN��+WTê�\\���w�!���#?O$��傕W�r>W�RsyM��0pdr����w�>�|Y�,�b�Q	ή�Ds���S�K
�鎎�ݡ�n�XI8հJ�.�+�
Ɵ�^�r�a�����we�c�XE��uz�y����M��t����j�m�:��bG{�5)�&RUVQ�鳤�kk��𶣓^k�녿y-�����|:�-mZ+�tԺҔ�J:�˻#�+���Ǿ���)���_xvK`6��jz�,��Ҋ*A�`3&3�d@zb���M���=���8pu�ܚJ������OP��Ê��W[#��M�醃��[�l���?��m�b�e9���⟮ыpX�`��~���tӪ�-a��r6v�8��Ol����Ʋ=J9��
����Q��r�-�m
����x����+'�V]A?}pP۰.���h��L��
)�9�EG�>���x�V���}�ݟ~`��K�/����u]4zn��P,�����D�m�K�L���6��\����ϧ��������71i.��r�t�G����G2�*iS''ǿ��ћ{����-31�W�N�༜ټ��=,�y�m��rɕ��/-��M�x2%�$QQ�-�p��\t���|��gA�f0�x�Ru�ޞ��
�ƚ���Cg.k_�Ny��m룇�p�k��2���e��Bᖝ{w�j��n�:=�Q./���i����=Π���x��DB�:�V��\rܘ�8������/<��������f�2��E�#c�{���)�f�s����qg*���[߽�=��XA�X�F�����]�_��q�rFk��3�@��S�t!�]R�fs��
t��a'^9;��m=B��"��&**M���Rs�����+b��Լg����4VN��ڨ�X1.l��b�˗�?�]��<��x����Q�,>��e�Us���2`��9/�c�5�ç'"}�s;_�AwG���nv_k�)6��м�N��Ms�KszĊ�c����u�������%/ץ�����tzV�1g-�cBZ�4�JT��P3��v��Ϝ�]�P�&`���6�7�l�1�&�����?U�J+�B��V�~������Mw��͐�����u�\��~ػ������k��;���6U���igm�u0h���E�:�����������_��#�C�na##5ÿȷ4�Srk��@6��ŝ�a�4
�8Z"��1
�[R��3gGb����U������O-��w׸�IEND�B`�libs/googlemaps/markerclustererplus/images/people55.png000064400000005560151165346430017377
0ustar00�PNG


IHDR77���FsRGB���bKGD�������	pHYs��tIME�	/�y��tEXtCommentCreated
with GIMPW�
�IDATh��Z{�\U��9�5sgf;�����n閂I��6Vë�6�P�bA
�ĄD!H���h�@c@����bk�%��7حZaK�������9�󏽳�Ng�ng�[orr���{��^�s	,���;!�}�������
��l[�wua��Y4����'�\��'q�g6n�V���m[�d�}��t禦��ҙ���|
ġb>�7	�����v�{o��w߽(��w���x���K�r۶"���n'�ޏ�'(�Y�l�{�mm���va#��y���}Ʋ�M�Ba;�t;"�᜷KD
���|�M
�W!����/�R���љ����i�o��]��%�m
c��s��ABJ@D@ ��F)(���i�)
p�AF�Cן���^P�{d͚�����]�4W*��`{x�C�9x���9�(@����\�֛W���ѣ����~{Gaf�)�](e{�uI�T�s@�u!�	!�T	��`{DPS�����M����7�E��[oU&FFV{���s�Wrj{p)!���1sLj
��PJ�)���9:<<����?|X�3?Z��V��)��$8_e;�q]���!�
+����P�/��Pt�|>�iw;��W��z.4!mR����H	9�(&��A�T�6˶��;g�={�mF&�]��u9W�"dX�ڐ5F
%�A�i3�Z��4�cY�J���JW�O'����#>77��>�
{(↡�>j]Z��r��v]��yL}���$�N�%9��|)��8�KNMN*�.�}�|�A�Q��k\ʓ"�|*
�sR%dq|.�H�j��!��(!
���Ui�bE@)�x,&3MM�N7Ne\�d4P�8]@��s�E�I���===��X.��J����eP�Vy\9�%�2-	H!��
8زt�Ԣ����+��yC���3�N��D<�+AE��0&�>�Iy|���/�����\�a��2v€R�T�]$�W����HNS�7;�ۇ�BI�f�0�א�u�|3�\/����X�����(�R/fo577��Z���Π.�=��"��~�$�c\ӆ��*y
��2���ʹ��������K|Q������bq�F�
�e���\f�j�-��J���;:�nw��<t�|<1���k�5�/��%!���d����;�^p��m۔V)�ɶ��W(�R
��X�;�r�ڑJ��Lf��ý�ľC�Ģ����C��d<oY����WG&&�Qp�+<�u
��k��O@���t��K���r�iN�=9�--_x�!�~��}���
q�i�He�̧�
lh�A�j%u�=]Q~��ٹw�#�=�?��{�����������
��-�[��"–k�����@" Bf���
���R�P���w�c��y����鉑��&�'�Ż���%��D��	�&$B˹��a�]0!D��+�H)�o��~chH,(�g6n���_Zp����6=OEDZ�K��g(��
��s��GSՋR�T��u�F�~�Ἲ�yU(� H�
�O
�P��Z��
#
,��0�ϯ�b����_0�uSz�P>�`�u[��z�X��"cN׌�ӾԲ�>3�����>(Κ�g]�<�a�V�\�W"-��9dTދ�2DxG.%8��bI��e+W^�
�[��[�,�.�s�����u.k��F�r�G�Ӯe������P�=�~�->�3����7�8��+@�ї�������馎�Y��뮣�Y���;$�&C��*MgÂJ��uB.����}��k�xm`붜�y�	]�2B��L�\=�JDp�d>c}%��l-'K��)��`DŝhK#O��ȳ�U�t.!dVUC�q,���!y�'�P��>_[β̒�
gs>[VQ�IE�}��+�9�s�{:�0����m۔���,!D���Q�)+��6��˹Q���A�g���Z��.#�����4N'ʐ�������_mݺ�.Z2Ơ,��0�Ԓ���r;T,"�$`��(�.p�%�H>�/�t
�!@��qG���qX(

�R��L)-�.f�|p||9�h�x��܃�98�ܿg���羾s'd4M��"N'�7�:9�����a��
�����T꟔^�`�L�g��O)��$,����������블r�F�7���T�+��y5�<�����jH��#G�ږ�P
�v �$�P��֐bE%];
���9.rm����X�����_>��@�ZSUf�	SQ>
�,�G']Y�*���X���ߎ�*!͊�;�L�cAt�k2��B��X�p�����rA�H��S��.|򪢸	Ǝ2�������k祡��d��q\78O2J3\J�ܜV�R��&V#�+��)�`k2�z[,����?�yll^�����bQnY���)�i��@�T�&J�]��VŤ�ё�VcLU�4Ey?�믵���;R��Z[<�}^���֮%�1'l�U
�+|Մe-	(m�kZh)ۤ���צ")�c�*
cc���#�󑔮�t]��Og"�oI&��8pNB[]u�O7o&##��Ԕq�P�͙L�I�;A�$��&��L��b΢TJ!��`�:h�QEu8�gMS.M���W]�߿g��,��P��]*Q��m�.�<��EZ�'�
�i����1������mh=�?�0[��ǔ�IEND�B`�libs/googlemaps/markerclustererplus/src/markerclusterer_packed.js000064400000044542151165346430021637
0ustar00function ClusterIcon(t, e) {
t.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView),
this.cluster_ = t, this.className_ =
t.getMarkerClusterer().getClusterClass(), this.styles_ = e, this.center_ =
null, this.div_ = null, this.sums_ = null, this.visible_ = !1,
this.setMap(t.getMap()) } function Cluster(t) { this.markerClusterer_ = t,
this.map_ = t.getMap(), this.gridSize_ = t.getGridSize(),
this.minClusterSize_ = t.getMinimumClusterSize(), this.averageCenter_ =
t.getAverageCenter(), this.markers_ = [], this.center_ = null, this.bounds_
= null, this.clusterIcon_ = new ClusterIcon(this, t.getStyles()) } function
MarkerClusterer(t, e, r) { this.extend(MarkerClusterer,
google.maps.OverlayView), e = e || [], r = r || {}, this.markers_ = [],
this.clusters_ = [], this.listeners_ = [], this.activeMap_ = null,
this.ready_ = !1, this.gridSize_ = r.gridSize || 60, this.minClusterSize_ =
r.minimumClusterSize || 2, this.maxZoom_ = r.maxZoom || null, this.styles_
= r.styles || [], this.title_ = r.title || "", this.zoomOnClick_
= !0, void 0 !== r.zoomOnClick && (this.zoomOnClick_ =
r.zoomOnClick), this.averageCenter_ = !1, void 0 !== r.averageCenter
&& (this.averageCenter_ = r.averageCenter), this.ignoreHidden_ =
!1, void 0 !== r.ignoreHidden && (this.ignoreHidden_ =
r.ignoreHidden), this.enableRetinaIcons_ = !1, void 0 !==
r.enableRetinaIcons && (this.enableRetinaIcons_ =
r.enableRetinaIcons), this.imagePath_ = r.imagePath ||
MarkerClusterer.IMAGE_PATH, this.imageExtension_ = r.imageExtension ||
MarkerClusterer.IMAGE_EXTENSION, this.imageSizes_ = r.imageSizes ||
MarkerClusterer.IMAGE_SIZES, this.calculator_ = r.calculator ||
MarkerClusterer.CALCULATOR, this.batchSize_ = r.batchSize ||
MarkerClusterer.BATCH_SIZE, this.batchSizeIE_ = r.batchSizeIE ||
MarkerClusterer.BATCH_SIZE_IE, this.clusterClass_ = r.clusterClass ||
"cluster", -1 !==
navigator.userAgent.toLowerCase().indexOf("msie") &&
(this.batchSize_ = this.batchSizeIE_), this.setupStyles_(),
this.addMarkers(e, !0), this.setMap(t) } ClusterIcon.prototype.onAdd =
function () { var t, e, r = this, s =
google.maps.version.split("."); s = parseInt(100 * s[0], 10) +
parseInt(s[1], 10), this.div_ = document.createElement("div"),
this.div_.className = this.className_, this.visible_ &&
this.show(), this.getPanes().overlayMouseTarget.appendChild(this.div_),
this.boundsChangedListener_ = google.maps.event.addListener(this.getMap(),
"bounds_changed", function () { e = t }),
google.maps.event.addDomListener(this.div_, "mousedown", function
() { t = !0, e = !1 }), s >= 332 &&
google.maps.event.addDomListener(this.div_, "touchstart",
function (t) { t.stopPropagation() }),
google.maps.event.addDomListener(this.div_, "click", function (s)
{ if (t = !1, !e) { var i, o, n = r.cluster_.getMarkerClusterer();
google.maps.event.trigger(n, "click", r.cluster_),
google.maps.event.trigger(n, "clusterclick", r.cluster_),
n.getZoomOnClick() && (o = n.getMaxZoom(), i =
r.cluster_.getBounds(), n.getMap().fitBounds(i), setTimeout(function () {
n.getMap().fitBounds(i), null !== o && n.getMap().getZoom() > o
&& n.getMap().setZoom(o + 1) }, 100)), s.cancelBubble = !0,
s.stopPropagation && s.stopPropagation() } }),
google.maps.event.addDomListener(this.div_, "mouseover", function
() { var t = r.cluster_.getMarkerClusterer(); google.maps.event.trigger(t,
"mouseover", r.cluster_) }),
google.maps.event.addDomListener(this.div_, "mouseout", function
() { var t = r.cluster_.getMarkerClusterer(); google.maps.event.trigger(t,
"mouseout", r.cluster_) }) }, ClusterIcon.prototype.onRemove =
function () { this.div_ && this.div_.parentNode &&
(this.hide(),
google.maps.event.removeListener(this.boundsChangedListener_),
google.maps.event.clearInstanceListeners(this.div_),
this.div_.parentNode.removeChild(this.div_), this.div_ = null) },
ClusterIcon.prototype.draw = function () { if (this.visible_) { var t =
this.getPosFromLatLng_(this.center_); this.div_.style.top = t.y +
"px", this.div_.style.left = t.x + "px",
this.div_.style.zIndex = google.maps.Marker.MAX_ZINDEX + 1 } },
ClusterIcon.prototype.hide = function () { this.div_ &&
(this.div_.style.display = "none"), this.visible_ = !1 },
ClusterIcon.prototype.show = function () { if (this.div_) { var t =
"", e = this.backgroundPosition_.split(" "), r =
parseInt(e[0].replace(/^\s+|\s+$/g, ""), 10), s =
parseInt(e[1].replace(/^\s+|\s+$/g, ""), 10), i =
this.getPosFromLatLng_(this.center_); this.div_.style.cssText =
this.createCss(i), t = "<img src='" + this.url_ +
"' style='position: absolute; top: " + s + "px;
left: " + r + "px; ",
this.cluster_.getMarkerClusterer().enableRetinaIcons_ ? t += "width:
" + this.width_ + "px; height: " + this.height_ +
"px;" : t += "clip: rect(" + -1 * s + "px, "
+ (-1 * r + this.width_) + "px, " + (-1 * s + this.height_) +
"px, " + -1 * r + "px);", t += "'>",
this.div_.innerHTML = t + "<div style='position: absolute;top:
" + this.anchorText_[0] + "px;left: " + this.anchorText_[1]
+ "px;color: " + this.textColor_ + ";font-size: " +
this.textSize_ + "px;font-family: " + this.fontFamily_ +
";font-weight: " + this.fontWeight_ + ";font-style: " +
this.fontStyle_ + ";text-decoration: " + this.textDecoration_ +
";text-align: center;width: " + this.width_ +
"px;line-height:" + this.height_ + "px;'>" +
this.sums_.text + "</div>", void 0 === this.sums_.title ||
"" === this.sums_.title ? this.div_.title =
this.cluster_.getMarkerClusterer().getTitle() : this.div_.title =
this.sums_.title, this.div_.style.display = "" } this.visible_ =
!0 }, ClusterIcon.prototype.useStyle = function (t) { this.sums_ = t; var e
= Math.max(0, t.index - 1); e = Math.min(this.styles_.length - 1, e); var r
= this.styles_[e]; this.url_ = r.url, this.height_ = r.height, this.width_
= r.width, this.anchorText_ = r.anchorText || [0, 0], this.anchorIcon_ =
r.anchorIcon || [parseInt(this.height_ / 2, 10), parseInt(this.width_ / 2,
10)], this.textColor_ = r.textColor || "black", this.textSize_ =
r.textSize || 11, this.textDecoration_ = r.textDecoration ||
"none", this.fontWeight_ = r.fontWeight || "bold",
this.fontStyle_ = r.fontStyle || "normal", this.fontFamily_ =
r.fontFamily || "Arial,sans-serif", this.backgroundPosition_ =
r.backgroundPosition || "0 0" }, ClusterIcon.prototype.setCenter
= function (t) { this.center_ = t }, ClusterIcon.prototype.createCss =
function (t) { var e = []; return e.push("cursor: pointer;"),
e.push("position: absolute; top: " + t.y + "px; left: "
+ t.x + "px;"), e.push("width: " + this.width_ +
"px; height: " + this.height_ + "px;"),
e.push("-webkit-user-select: none;"),
e.push("-khtml-user-select: none;"),
e.push("-moz-user-select: none;"), e.push("-o-user-select:
none;"), e.push("user-select: none;"), e.join("")
}, ClusterIcon.prototype.getPosFromLatLng_ = function (t) { var e =
this.getProjection().fromLatLngToDivPixel(t); return e.x -=
this.anchorIcon_[1], e.y -= this.anchorIcon_[0], e.x = parseInt(e.x, 10),
e.y = parseInt(e.y, 10), e }, Cluster.prototype.getSize = function () {
return this.markers_.length }, Cluster.prototype.getMarkers = function () {
return this.markers_ }, Cluster.prototype.getCenter = function () { return
this.center_ }, Cluster.prototype.getMap = function () { return this.map_
}, Cluster.prototype.getMarkerClusterer = function () { return
this.markerClusterer_ }, Cluster.prototype.getBounds = function () { var t,
e = new google.maps.LatLngBounds(this.center_, this.center_), r =
this.getMarkers(); for (t = 0; t < r.length;
t++)e.extend(r[t].getPosition()); return e }, Cluster.prototype.remove =
function () { this.clusterIcon_.setMap(null), this.markers_ = [], delete
this.markers_ }, Cluster.prototype.addMarker = function (t) { var e, r, s;
if (this.isMarkerAlreadyAdded_(t)) return !1; if (this.center_) { if
(this.averageCenter_) { var i = this.markers_.length + 1, o =
(this.center_.lat() * (i - 1) + t.getPosition().lat()) / i, n =
(this.center_.lng() * (i - 1) + t.getPosition().lng()) / i; this.center_ =
new google.maps.LatLng(o, n), this.calculateBounds_() } } else this.center_
= t.getPosition(), this.calculateBounds_(); if (t.isAdded = !0,
this.markers_.push(t), r = this.markers_.length, null !== (s =
this.markerClusterer_.getMaxZoom()) && this.map_.getZoom() > s)
t.getMap() !== this.map_ && t.setMap(this.map_); else if (r <
this.minClusterSize_) t.getMap() !== this.map_ &&
t.setMap(this.map_); else if (r === this.minClusterSize_) for (e = 0; e
< r; e++)this.markers_[e].setMap(null); else t.setMap(null); return
this.updateIcon_(), !0 }, Cluster.prototype.isMarkerInClusterBounds =
function (t) { return this.bounds_.contains(t.getPosition()) },
Cluster.prototype.calculateBounds_ = function () { var t = new
google.maps.LatLngBounds(this.center_, this.center_); this.bounds_ =
this.markerClusterer_.getExtendedBounds(t) }, Cluster.prototype.updateIcon_
= function () { var t = this.markers_.length, e =
this.markerClusterer_.getMaxZoom(); if (null !== e &&
this.map_.getZoom() > e) this.clusterIcon_.hide(); else if (t <
this.minClusterSize_) this.clusterIcon_.hide(); else { var r =
this.markerClusterer_.getStyles().length, s =
this.markerClusterer_.getCalculator()(this.markers_, r);
this.clusterIcon_.setCenter(this.center_), this.clusterIcon_.useStyle(s),
this.clusterIcon_.show() } }, Cluster.prototype.isMarkerAlreadyAdded_ =
function (t) { var e; if (this.markers_.indexOf) return -1 !==
this.markers_.indexOf(t); for (e = 0; e < this.markers_.length; e++)if
(t === this.markers_[e]) return !0; return !1 },
MarkerClusterer.prototype.onAdd = function () { var t = this;
this.activeMap_ = this.getMap(), this.ready_ = !0, this.repaint(),
this.prevZoom_ = this.getMap().getZoom(), this.listeners_ =
[google.maps.event.addListener(this.getMap(), "zoom_changed",
function () { var t = this.getMap().getZoom(), e = this.getMap().minZoom ||
0, r = Math.min(this.getMap().maxZoom || 100,
this.getMap().mapTypes[this.getMap().getMapTypeId()].maxZoom); t =
Math.min(Math.max(t, e), r), this.prevZoom_ != t && (this.prevZoom_
= t, this.resetViewport_(!1)) }.bind(this)),
google.maps.event.addListener(this.getMap(), "idle", function ()
{ t.redraw_() })] }, MarkerClusterer.prototype.onRemove = function () { var
t; for (t = 0; t < this.markers_.length; t++)this.markers_[t].getMap()
!== this.activeMap_ && this.markers_[t].setMap(this.activeMap_);
for (t = 0; t < this.clusters_.length; t++)this.clusters_[t].remove();
for (this.clusters_ = [], t = 0; t < this.listeners_.length;
t++)google.maps.event.removeListener(this.listeners_[t]); this.listeners_ =
[], this.activeMap_ = null, this.ready_ = !1 },
MarkerClusterer.prototype.draw = function () { },
MarkerClusterer.prototype.setupStyles_ = function () { var t, e; if
(!(this.styles_.length > 0)) for (t = 0; t < this.imageSizes_.length;
t++)e = this.imageSizes_[t], this.styles_.push({ url: this.imagePath_ + (t
+ 1) + "." + this.imageExtension_, height: e, width: e }) },
MarkerClusterer.prototype.fitMapToMarkers = function () { var t, e =
this.getMarkers(), r = new google.maps.LatLngBounds; for (t = 0; t <
e.length; t++)!e[t].getVisible() && this.getIgnoreHidden() ||
r.extend(e[t].getPosition()); this.getMap().fitBounds(r) },
MarkerClusterer.prototype.getGridSize = function () { return this.gridSize_
}, MarkerClusterer.prototype.setGridSize = function (t) { this.gridSize_ =
t }, MarkerClusterer.prototype.getMinimumClusterSize = function () { return
this.minClusterSize_ }, MarkerClusterer.prototype.setMinimumClusterSize =
function (t) { this.minClusterSize_ = t },
MarkerClusterer.prototype.getMaxZoom = function () { return this.maxZoom_
}, MarkerClusterer.prototype.setMaxZoom = function (t) { this.maxZoom_ = t
}, MarkerClusterer.prototype.getStyles = function () { return this.styles_
}, MarkerClusterer.prototype.setStyles = function (t) { this.styles_ = t },
MarkerClusterer.prototype.getTitle = function () { return this.title_ },
MarkerClusterer.prototype.setTitle = function (t) { this.title_ = t },
MarkerClusterer.prototype.getZoomOnClick = function () { return
this.zoomOnClick_ }, MarkerClusterer.prototype.setZoomOnClick = function
(t) { this.zoomOnClick_ = t }, MarkerClusterer.prototype.getAverageCenter =
function () { return this.averageCenter_ },
MarkerClusterer.prototype.setAverageCenter = function (t) {
this.averageCenter_ = t }, MarkerClusterer.prototype.getIgnoreHidden =
function () { return this.ignoreHidden_ },
MarkerClusterer.prototype.setIgnoreHidden = function (t) {
this.ignoreHidden_ = t }, MarkerClusterer.prototype.getEnableRetinaIcons =
function () { return this.enableRetinaIcons_ },
MarkerClusterer.prototype.setEnableRetinaIcons = function (t) {
this.enableRetinaIcons_ = t }, MarkerClusterer.prototype.getImageExtension
= function () { return this.imageExtension_ },
MarkerClusterer.prototype.setImageExtension = function (t) {
this.imageExtension_ = t }, MarkerClusterer.prototype.getImagePath =
function () { return this.imagePath_ },
MarkerClusterer.prototype.setImagePath = function (t) { this.imagePath_ = t
}, MarkerClusterer.prototype.getImageSizes = function () { return
this.imageSizes_ }, MarkerClusterer.prototype.setImageSizes = function (t)
{ this.imageSizes_ = t }, MarkerClusterer.prototype.getCalculator =
function () { return this.calculator_ },
MarkerClusterer.prototype.setCalculator = function (t) { this.calculator_ =
t }, MarkerClusterer.prototype.getBatchSizeIE = function () { return
this.batchSizeIE_ }, MarkerClusterer.prototype.setBatchSizeIE = function
(t) { this.batchSizeIE_ = t }, MarkerClusterer.prototype.getClusterClass =
function () { return this.clusterClass_ },
MarkerClusterer.prototype.setClusterClass = function (t) {
this.clusterClass_ = t }, MarkerClusterer.prototype.getMarkers = function
() { return this.markers_ }, MarkerClusterer.prototype.getTotalMarkers =
function () { return this.markers_.length },
MarkerClusterer.prototype.getClusters = function () { return this.clusters_
}, MarkerClusterer.prototype.getTotalClusters = function () { return
this.clusters_.length }, MarkerClusterer.prototype.addMarker = function (t,
e) { this.pushMarkerTo_(t), e || this.redraw_() },
MarkerClusterer.prototype.addMarkers = function (t, e) { var r; for (r in
t) t.hasOwnProperty(r) && this.pushMarkerTo_(t[r]); e ||
this.redraw_() }, MarkerClusterer.prototype.pushMarkerTo_ = function (t) {
if (t.getDraggable()) { var e = this; google.maps.event.addListener(t,
"dragend", function () { e.ready_ && (this.isAdded = !1,
e.repaint()) }) } t.isAdded = !1, this.markers_.push(t) },
MarkerClusterer.prototype.removeMarker = function (t, e) { var r =
this.removeMarker_(t); return !e && r && this.repaint(), r
}, MarkerClusterer.prototype.removeMarkers = function (t, e) { var r, s, i
= !1; for (r = 0; r < t.length; r++)s = this.removeMarker_(t[r]), i = i
|| s; return !e && i && this.repaint(), i },
MarkerClusterer.prototype.removeMarker_ = function (t) { var e, r = -1; if
(this.markers_.indexOf) r = this.markers_.indexOf(t); else for (e = 0; e
< this.markers_.length; e++)if (t === this.markers_[e]) { r = e; break }
return -1 !== r && (t.setMap(null), this.markers_.splice(r, 1), !0)
}, MarkerClusterer.prototype.clearMarkers = function () {
this.resetViewport_(!0), this.markers_ = [] },
MarkerClusterer.prototype.repaint = function () { var t =
this.clusters_.slice(); this.clusters_ = [], this.resetViewport_(!1),
this.redraw_(), setTimeout(function () { var e; for (e = 0; e <
t.length; e++)t[e].remove() }, 0) },
MarkerClusterer.prototype.getExtendedBounds = function (t) { var e =
this.getProjection(), r = new google.maps.LatLng(t.getNorthEast().lat(),
t.getNorthEast().lng()), s = new google.maps.LatLng(t.getSouthWest().lat(),
t.getSouthWest().lng()), i = e.fromLatLngToDivPixel(r); i.x +=
this.gridSize_, i.y -= this.gridSize_; var o = e.fromLatLngToDivPixel(s);
o.x -= this.gridSize_, o.y += this.gridSize_; var n =
e.fromDivPixelToLatLng(i), a = e.fromDivPixelToLatLng(o); return
t.extend(n), t.extend(a), t }, MarkerClusterer.prototype.redraw_ = function
() { this.createClusters_(0) }, MarkerClusterer.prototype.resetViewport_ =
function (t) { var e, r; for (e = 0; e < this.clusters_.length;
e++)this.clusters_[e].remove(); for (this.clusters_ = [], e = 0; e <
this.markers_.length; e++)(r = this.markers_[e]).isAdded = !1, t &&
r.setMap(null) }, MarkerClusterer.prototype.distanceBetweenPoints_ =
function (t, e) { var r = (e.lat() - t.lat()) * Math.PI / 180, s = (e.lng()
- t.lng()) * Math.PI / 180, i = Math.sin(r / 2) * Math.sin(r / 2) +
Math.cos(t.lat() * Math.PI / 180) * Math.cos(e.lat() * Math.PI / 180) *
Math.sin(s / 2) * Math.sin(s / 2); return 6371 * (2 *
Math.atan2(Math.sqrt(i), Math.sqrt(1 - i))) },
MarkerClusterer.prototype.isMarkerInBounds_ = function (t, e) { return
e.contains(t.getPosition()) },
MarkerClusterer.prototype.addToClosestCluster_ = function (t) { var e, r,
s, i, o = 4e4, n = null; for (e = 0; e < this.clusters_.length; e++)(i =
(s = this.clusters_[e]).getCenter()) && (r =
this.distanceBetweenPoints_(i, t.getPosition())) < o && (o = r,
n = s); n && n.isMarkerInClusterBounds(t) ? n.addMarker(t) : ((s =
new Cluster(this)).addMarker(t), this.clusters_.push(s)) },
MarkerClusterer.prototype.createClusters_ = function (t) { var e, r, s, i =
this; if (this.ready_) { 0 === t &&
(google.maps.event.trigger(this, "clusteringbegin", this), void 0
!== this.timerRefStatic && (clearTimeout(this.timerRefStatic),
delete this.timerRefStatic)), s = this.getMap().getZoom() > 3 ? new
google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),
this.getMap().getBounds().getNorthEast()) : new
google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,
-178.48388434375), new google.maps.LatLng(-85.08136444384544,
178.00048865625)); var o = this.getExtendedBounds(s), n = Math.min(t +
this.batchSize_, this.markers_.length); for (e = t; e < n; e++)!(r =
this.markers_[e]).isAdded && this.isMarkerInBounds_(r, o)
&& (!this.ignoreHidden_ || this.ignoreHidden_ &&
r.getVisible()) && this.addToClosestCluster_(r); n <
this.markers_.length ? this.timerRefStatic = setTimeout(function () {
i.createClusters_(n) }, 0) : (delete this.timerRefStatic,
google.maps.event.trigger(this, "clusteringend", this)) } },
MarkerClusterer.prototype.extend = function (t, e) { return function (t) {
var e; for (e in t.prototype) this.prototype[e] = t.prototype[e]; return
this }.apply(t, [e]) }, MarkerClusterer.CALCULATOR = function (t, e) { for
(var r = 0, s = t.length.toString(), i = s; 0 !== i;)i = parseInt(i / 10,
10), r++; return { text: s, index: r = Math.min(r, e), title: ""
} }, MarkerClusterer.BATCH_SIZE = 2e3, MarkerClusterer.BATCH_SIZE_IE = 500,
MarkerClusterer.IMAGE_PATH
="https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m",MarkerClusterer.IMAGE_EXTENSION="png",MarkerClusterer.IMAGE_SIZES=[53,56,66,78,90];
libs/googlemaps/markerclustererplus/src/markerclusterer.js000064400000145740151165346440020333
0ustar00/**
 * @name MarkerClustererPlus for Google Maps V3
 * @version 2.1.11
 * @author Gary Little
 * @fileoverview
 * The library creates and manages per-zoom-level clusters for large
amounts of markers.
 * <p>
 * This is an enhanced V3 implementation of the V2 MarkerClusterer by
Xiaoxi Wu. It is
 * based on the V3 MarkerClusterer port by Luke Mahe. MarkerClustererPlus
was created
 * by Gary Little.
 * <p>
 * v2.0 release: MarkerClustererPlus v2.0 is backward compatible with
MarkerClusterer v1.0. It
 *  adds support for the <code>ignoreHidden</code>,
<code>title</code>, <code>batchSizeIE</code>,
 *  and <code>calculator</code> properties as well as support
for four more events. It also allows
 *  greater control over the styling of the text that appears on the
cluster marker. The
 *  documentation has been significantly improved and the overall code has
been simplified and
 *  polished. Very large numbers of markers can now be managed without
causing Javascript timeout
 *  errors on Internet Explorer. Note that the name of the
<code>clusterclick</code> event has been
 *  deprecated. The new name is <code>click</code>, so please
change your application code now.
 */

/**
 * Licensed under the Apache License, Version 2.0 (the
"License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS"
BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


/**
 * @name ClusterIconStyle
 * @class This class represents the object for values in the
<code>styles</code> array passed
 *  to the {@link MarkerClusterer} constructor. The element in this array
that is used to
 *  style the cluster icon is determined by calling the
<code>calculator</code> function.
 *
 * @property {string} url The URL of the cluster icon image file. Required.
 * @property {number} height The display height (in pixels) of the cluster
icon. Required.
 * @property {number} width The display width (in pixels) of the cluster
icon. Required.
 * @property {Array} [anchorText] The position (in pixels) from the center
of the cluster icon to
 *  where the text label is to be centered and drawn. The format is
<code>[yoffset, xoffset]</code>
 *  where <code>yoffset</code> increases as you go down from
center and <code>xoffset</code>
 *  increases to the right of center. The default is <code>[0,
0]</code>.
 * @property {Array} [anchorIcon] The anchor position (in pixels) of the
cluster icon. This is the
 *  spot on the cluster icon that is to be aligned with the cluster
position. The format is
 *  <code>[yoffset, xoffset]</code> where
<code>yoffset</code> increases as you go down and
 *  <code>xoffset</code> increases to the right of the top-left
corner of the icon. The default
 *  anchor position is the center of the cluster icon.
 * @property {string} [textColor="black"] The color of the label
text shown on the
 *  cluster icon.
 * @property {number} [textSize=11] The size (in pixels) of the label text
shown on the
 *  cluster icon.
 * @property {string} [textDecoration="none"] The value of the
CSS <code>text-decoration</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [fontWeight="bold"] The value of the CSS
<code>font-weight</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [fontStyle="normal"] The value of the CSS
<code>font-style</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [fontFamily="Arial,sans-serif"] The value
of the CSS <code>font-family</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [backgroundPosition="0 0"] The position of
the cluster icon image
 *  within the image defined by <code>url</code>. The format is
<code>"xpos ypos"</code>
 *  (the same format as for the CSS
<code>background-position</code> property). You must set
 *  this property appropriately when the image defined by
<code>url</code> represents a sprite
 *  containing multiple images. Note that the position
<i>must</i> be specified in px units.
 */
/**
 * @name ClusterIconInfo
 * @class This class is an object containing general information about a
cluster icon. This is
 *  the object that a <code>calculator</code> function returns.
 *
 * @property {string} text The text of the label to be shown on the cluster
icon.
 * @property {number} index The index plus 1 of the element in the
<code>styles</code>
 *  array to be used to style the cluster icon.
 * @property {string} title The tooltip to display when the mouse moves
over the cluster icon.
 *  If this value is <code>undefined</code> or
<code>""</code>, <code>title</code> is
set to the
 *  value of the <code>title</code> property passed to the
MarkerClusterer.
 */
/**
 * A cluster icon.
 *
 * @constructor
 * @extends google.maps.OverlayView
 * @param {Cluster} cluster The cluster with which the icon is to be
associated.
 * @param {Array} [styles] An array of {@link ClusterIconStyle} defining
the cluster icons
 *  to use for various cluster sizes.
 * @private
 */
function ClusterIcon(cluster, styles) {
  cluster.getMarkerClusterer().extend(ClusterIcon,
google.maps.OverlayView);

  this.cluster_ = cluster;
  this.className_ = cluster.getMarkerClusterer().getClusterClass();
  this.styles_ = styles;
  this.center_ = null;
  this.div_ = null;
  this.sums_ = null;
  this.visible_ = false;

  this.setMap(cluster.getMap()); // Note: this causes onAdd to be called
}


/**
 * Adds the icon to the DOM.
 */
ClusterIcon.prototype.onAdd = function () {
  var cClusterIcon = this;
  var cMouseDownInCluster;
  var cDraggingMapByCluster;
  var gmVersion = google.maps.version.split(".");

  gmVersion = parseInt(gmVersion[0] * 100, 10) + parseInt(gmVersion[1],
10);

  this.div_ = document.createElement("div");
  this.div_.className = this.className_;
  if (this.visible_) {
    this.show();
  }

  this.getPanes().overlayMouseTarget.appendChild(this.div_);

  // Fix for Issue 157
  this.boundsChangedListener_ =
google.maps.event.addListener(this.getMap(), "bounds_changed",
function () {
    cDraggingMapByCluster = cMouseDownInCluster;
  });

  google.maps.event.addDomListener(this.div_, "mousedown",
function () {
    cMouseDownInCluster = true;
    cDraggingMapByCluster = false;
  });

// March 1, 2018: Fix for this 3.32 exp bug,
https://issuetracker.google.com/issues/73571522
// But it doesn't work with earlier releases so do a version check.
  if (gmVersion >= 332) { // Ugly version-dependent code
    google.maps.event.addDomListener(this.div_, "touchstart",
function (e) {
      e.stopPropagation();
    });
  }

  google.maps.event.addDomListener(this.div_, "click", function
(e) {
    cMouseDownInCluster = false;
    if (!cDraggingMapByCluster) {
      var theBounds;
      var mz;
      var mc = cClusterIcon.cluster_.getMarkerClusterer();
      /**
       * This event is fired when a cluster marker is clicked.
       * @name MarkerClusterer#click
       * @param {Cluster} c The cluster that was clicked.
       * @event
       */
      google.maps.event.trigger(mc, "click",
cClusterIcon.cluster_);
      google.maps.event.trigger(mc, "clusterclick",
cClusterIcon.cluster_); // deprecated name

      // The default click handler follows. Disable it by setting
      // the zoomOnClick property to false.
      if (mc.getZoomOnClick()) {
        // Zoom into the cluster.
        mz = mc.getMaxZoom();
        theBounds = cClusterIcon.cluster_.getBounds();
        mc.getMap().fitBounds(theBounds);
        // There is a fix for Issue 170 here:
        setTimeout(function () {
          mc.getMap().fitBounds(theBounds);
          // Don't zoom beyond the max zoom level
          if (mz !== null && (mc.getMap().getZoom() > mz)) {
            mc.getMap().setZoom(mz + 1);
          }
        }, 100);
      }

      // Prevent event propagation to the map:
      e.cancelBubble = true;
      if (e.stopPropagation) {
        e.stopPropagation();
      }
    }
  });

  google.maps.event.addDomListener(this.div_, "mouseover",
function () {
    var mc = cClusterIcon.cluster_.getMarkerClusterer();
    /**
     * This event is fired when the mouse moves over a cluster marker.
     * @name MarkerClusterer#mouseover
     * @param {Cluster} c The cluster that the mouse moved over.
     * @event
     */
    google.maps.event.trigger(mc, "mouseover",
cClusterIcon.cluster_);
  });

  google.maps.event.addDomListener(this.div_, "mouseout",
function () {
    var mc = cClusterIcon.cluster_.getMarkerClusterer();
    /**
     * This event is fired when the mouse moves out of a cluster marker.
     * @name MarkerClusterer#mouseout
     * @param {Cluster} c The cluster that the mouse moved out of.
     * @event
     */
    google.maps.event.trigger(mc, "mouseout",
cClusterIcon.cluster_);
  });
};


/**
 * Removes the icon from the DOM.
 */
ClusterIcon.prototype.onRemove = function () {
  if (this.div_ && this.div_.parentNode) {
    this.hide();
    google.maps.event.removeListener(this.boundsChangedListener_);
    google.maps.event.clearInstanceListeners(this.div_);
    this.div_.parentNode.removeChild(this.div_);
    this.div_ = null;
  }
};


/**
 * Draws the icon.
 */
ClusterIcon.prototype.draw = function () {
  if (this.visible_) {
    var pos = this.getPosFromLatLng_(this.center_);
    this.div_.style.top = pos.y + "px";
    this.div_.style.left = pos.x + "px";
    this.div_.style.zIndex = google.maps.Marker.MAX_ZINDEX + 1; // Put
above all unclustered markers
  }
};


/**
 * Hides the icon.
 */
ClusterIcon.prototype.hide = function () {
  if (this.div_) {
    this.div_.style.display = "none";
  }
  this.visible_ = false;
};


/**
 * Positions and shows the icon.
 */
ClusterIcon.prototype.show = function () {
  if (this.div_) {
    var img = "";
    // NOTE: values must be specified in px units
    var bp = this.backgroundPosition_.split(" ");
    var spriteH = parseInt(bp[0].replace(/^\s+|\s+$/g, ""), 10);
    var spriteV = parseInt(bp[1].replace(/^\s+|\s+$/g, ""), 10);
    var pos = this.getPosFromLatLng_(this.center_);
    this.div_.style.cssText = this.createCss(pos);
    img = "<img src='" + this.url_ + "'
style='position: absolute; top: " + spriteV + "px; left:
" + spriteH + "px; ";
    if (this.cluster_.getMarkerClusterer().enableRetinaIcons_) {
      img += "width: " + this.width_ + "px; height: " +
this.height_ + "px;";
    } else {
      img += "clip: rect(" + (-1 * spriteV) + "px, " +
((-1 * spriteH) + this.width_) + "px, " +
          ((-1 * spriteV) + this.height_) + "px, " + (-1 *
spriteH) + "px);";
    }
    img += "'>";
    this.div_.innerHTML = img + "<div style='" +
        "position: absolute;" +
        "top: " + this.anchorText_[0] + "px;" +
        "left: " + this.anchorText_[1] + "px;" +
        "color: " + this.textColor_ + ";" +
        "font-size: " + this.textSize_ + "px;" +
        "font-family: " + this.fontFamily_ + ";" +
        "font-weight: " + this.fontWeight_ + ";" +
        "font-style: " + this.fontStyle_ + ";" +
        "text-decoration: " + this.textDecoration_ +
";" +
        "text-align: center;" +
        "width: " + this.width_ + "px;" +
        "line-height:" + this.height_ + "px;" +
        "'>" + this.sums_.text +
"</div>";
    if (typeof this.sums_.title === "undefined" ||
this.sums_.title === "") {
      this.div_.title = this.cluster_.getMarkerClusterer().getTitle();
    } else {
      this.div_.title = this.sums_.title;
    }
    this.div_.style.display = "";
  }
  this.visible_ = true;
};


/**
 * Sets the icon styles to the appropriate element in the styles array.
 *
 * @param {ClusterIconInfo} sums The icon label text and styles index.
 */
ClusterIcon.prototype.useStyle = function (sums) {
  this.sums_ = sums;
  var index = Math.max(0, sums.index - 1);
  index = Math.min(this.styles_.length - 1, index);
  var style = this.styles_[index];
  this.url_ = style.url;
  this.height_ = style.height;
  this.width_ = style.width;
  this.anchorText_ = style.anchorText || [0, 0];
  this.anchorIcon_ = style.anchorIcon || [parseInt(this.height_ / 2, 10),
parseInt(this.width_ / 2, 10)];
  this.textColor_ = style.textColor || "black";
  this.textSize_ = style.textSize || 11;
  this.textDecoration_ = style.textDecoration || "none";
  this.fontWeight_ = style.fontWeight || "bold";
  this.fontStyle_ = style.fontStyle || "normal";
  this.fontFamily_ = style.fontFamily || "Arial,sans-serif";
  this.backgroundPosition_ = style.backgroundPosition || "0 0";
};


/**
 * Sets the position at which to center the icon.
 *
 * @param {google.maps.LatLng} center The latlng to set as the center.
 */
ClusterIcon.prototype.setCenter = function (center) {
  this.center_ = center;
};


/**
 * Creates the cssText style parameter based on the position of the icon.
 *
 * @param {google.maps.Point} pos The position of the icon.
 * @return {string} The CSS style text.
 */
ClusterIcon.prototype.createCss = function (pos) {
  var style = [];
  style.push("cursor: pointer;");
  style.push("position: absolute; top: " + pos.y + "px;
left: " + pos.x + "px;");
  style.push("width: " + this.width_ + "px; height: " +
this.height_ + "px;");
  style.push("-webkit-user-select: none;");
  style.push("-khtml-user-select: none;");
  style.push("-moz-user-select: none;");
  style.push("-o-user-select: none;");
  style.push("user-select: none;");
  return style.join("");
};


/**
 * Returns the position at which to place the DIV depending on the latlng.
 *
 * @param {google.maps.LatLng} latlng The position in latlng.
 * @return {google.maps.Point} The position in pixels.
 */
ClusterIcon.prototype.getPosFromLatLng_ = function (latlng) {
  var pos = this.getProjection().fromLatLngToDivPixel(latlng);
  pos.x -= this.anchorIcon_[1];
  pos.y -= this.anchorIcon_[0];
  pos.x = parseInt(pos.x, 10);
  pos.y = parseInt(pos.y, 10);
  return pos;
};


/**
 * Creates a single cluster that manages a group of proximate markers.
 *  Used internally, do not call this constructor directly.
 * @constructor
 * @param {MarkerClusterer} mc The <code>MarkerClusterer</code>
object with which this
 *  cluster is associated.
 */
function Cluster(mc) {
  this.markerClusterer_ = mc;
  this.map_ = mc.getMap();
  this.gridSize_ = mc.getGridSize();
  this.minClusterSize_ = mc.getMinimumClusterSize();
  this.averageCenter_ = mc.getAverageCenter();
  this.markers_ = [];
  this.center_ = null;
  this.bounds_ = null;
  this.clusterIcon_ = new ClusterIcon(this, mc.getStyles());
}


/**
 * Returns the number of markers managed by the cluster. You can call this
from
 * a <code>click</code>, <code>mouseover</code>, or
<code>mouseout</code> event handler
 * for the <code>MarkerClusterer</code> object.
 *
 * @return {number} The number of markers in the cluster.
 */
Cluster.prototype.getSize = function () {
  return this.markers_.length;
};


/**
 * Returns the array of markers managed by the cluster. You can call this
from
 * a <code>click</code>, <code>mouseover</code>, or
<code>mouseout</code> event handler
 * for the <code>MarkerClusterer</code> object.
 *
 * @return {Array} The array of markers in the cluster.
 */
Cluster.prototype.getMarkers = function () {
  return this.markers_;
};


/**
 * Returns the center of the cluster. You can call this from
 * a <code>click</code>, <code>mouseover</code>, or
<code>mouseout</code> event handler
 * for the <code>MarkerClusterer</code> object.
 *
 * @return {google.maps.LatLng} The center of the cluster.
 */
Cluster.prototype.getCenter = function () {
  return this.center_;
};


/**
 * Returns the map with which the cluster is associated.
 *
 * @return {google.maps.Map} The map.
 * @ignore
 */
Cluster.prototype.getMap = function () {
  return this.map_;
};


/**
 * Returns the <code>MarkerClusterer</code> object with which
the cluster is associated.
 *
 * @return {MarkerClusterer} The associated marker clusterer.
 * @ignore
 */
Cluster.prototype.getMarkerClusterer = function () {
  return this.markerClusterer_;
};


/**
 * Returns the bounds of the cluster.
 *
 * @return {google.maps.LatLngBounds} the cluster bounds.
 * @ignore
 */
Cluster.prototype.getBounds = function () {
  var i;
  var bounds = new google.maps.LatLngBounds(this.center_, this.center_);
  var markers = this.getMarkers();
  for (i = 0; i < markers.length; i++) {
    bounds.extend(markers[i].getPosition());
  }
  return bounds;
};


/**
 * Removes the cluster from the map.
 *
 * @ignore
 */
Cluster.prototype.remove = function () {
  this.clusterIcon_.setMap(null);
  this.markers_ = [];
  delete this.markers_;
};


/**
 * Adds a marker to the cluster.
 *
 * @param {google.maps.Marker} marker The marker to be added.
 * @return {boolean} True if the marker was added.
 * @ignore
 */
Cluster.prototype.addMarker = function (marker) {
  var i;
  var mCount;
  var mz;

  if (this.isMarkerAlreadyAdded_(marker)) {
    return false;
  }

  if (!this.center_) {
    this.center_ = marker.getPosition();
    this.calculateBounds_();
  } else {
    if (this.averageCenter_) {
      var l = this.markers_.length + 1;
      var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat())
/ l;
      var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng())
/ l;
      this.center_ = new google.maps.LatLng(lat, lng);
      this.calculateBounds_();
    }
  }

  marker.isAdded = true;
  this.markers_.push(marker);

  mCount = this.markers_.length;
  mz = this.markerClusterer_.getMaxZoom();
  if (mz !== null && this.map_.getZoom() > mz) {
    // Zoomed in past max zoom, so show the marker.
    if (marker.getMap() !== this.map_) {
      marker.setMap(this.map_);
    }
  } else if (mCount < this.minClusterSize_) {
    // Min cluster size not reached so show the marker.
    if (marker.getMap() !== this.map_) {
      marker.setMap(this.map_);
    }
  } else if (mCount === this.minClusterSize_) {
    // Hide the markers that were showing.
    for (i = 0; i < mCount; i++) {
      this.markers_[i].setMap(null);
    }
  } else {
    marker.setMap(null);
  }

  this.updateIcon_();
  return true;
};


/**
 * Determines if a marker lies within the cluster's bounds.
 *
 * @param {google.maps.Marker} marker The marker to check.
 * @return {boolean} True if the marker lies in the bounds.
 * @ignore
 */
Cluster.prototype.isMarkerInClusterBounds = function (marker) {
  return this.bounds_.contains(marker.getPosition());
};


/**
 * Calculates the extended bounds of the cluster with the grid.
 */
Cluster.prototype.calculateBounds_ = function () {
  var bounds = new google.maps.LatLngBounds(this.center_, this.center_);
  this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);
};


/**
 * Updates the cluster icon.
 */
Cluster.prototype.updateIcon_ = function () {
  var mCount = this.markers_.length;
  var mz = this.markerClusterer_.getMaxZoom();

  if (mz !== null && this.map_.getZoom() > mz) {
    this.clusterIcon_.hide();
    return;
  }

  if (mCount < this.minClusterSize_) {
    // Min cluster size not yet reached.
    this.clusterIcon_.hide();
    return;
  }

  var numStyles = this.markerClusterer_.getStyles().length;
  var sums = this.markerClusterer_.getCalculator()(this.markers_,
numStyles);
  this.clusterIcon_.setCenter(this.center_);
  this.clusterIcon_.useStyle(sums);
  this.clusterIcon_.show();
};


/**
 * Determines if a marker has already been added to the cluster.
 *
 * @param {google.maps.Marker} marker The marker to check.
 * @return {boolean} True if the marker has already been added.
 */
Cluster.prototype.isMarkerAlreadyAdded_ = function (marker) {
  var i;
  if (this.markers_.indexOf) {
    return this.markers_.indexOf(marker) !== -1;
  } else {
    for (i = 0; i < this.markers_.length; i++) {
      if (marker === this.markers_[i]) {
        return true;
      }
    }
  }
  return false;
};


/**
 * @name MarkerClustererOptions
 * @class This class represents the optional parameter passed to
 *  the {@link MarkerClusterer} constructor.
 * @property {number} [gridSize=60] The grid size of a cluster in pixels.
The grid is a square.
 * @property {number} [maxZoom=null] The maximum zoom level at which
clustering is enabled or
 *  <code>null</code> if clustering is to be enabled at all
zoom levels.
 * @property {boolean} [zoomOnClick=true] Whether to zoom the map when a
cluster marker is
 *  clicked. You may want to set this to <code>false</code> if
you have installed a handler
 *  for the <code>click</code> event and it deals with zooming
on its own.
 * @property {boolean} [averageCenter=false] Whether the position of a
cluster marker should be
 *  the average position of all markers in the cluster. If set to
<code>false</code>, the
 *  cluster marker is positioned at the location of the first marker added
to the cluster.
 * @property {number} [minimumClusterSize=2] The minimum number of markers
needed in a cluster
 *  before the markers are hidden and a cluster marker appears.
 * @property {boolean} [ignoreHidden=false] Whether to ignore hidden
markers in clusters. You
 *  may want to set this to <code>true</code> to ensure that
hidden markers are not included
 *  in the marker count that appears on a cluster marker (this count is the
value of the
 *  <code>text</code> property of the result returned by the
default <code>calculator</code>).
 *  If set to <code>true</code> and you change the visibility
of a marker being clustered, be
 *  sure to also call <code>MarkerClusterer.repaint()</code>.
 * @property {string} [title=""] The tooltip to display when the
mouse moves over a cluster
 *  marker. (Alternatively, you can use a custom
<code>calculator</code> function to specify a
 *  different tooltip for each cluster marker.)
 * @property {function} [calculator=MarkerClusterer.CALCULATOR] The
function used to determine
 *  the text to be displayed on a cluster marker and the index indicating
which style to use
 *  for the cluster marker. The input parameters for the function are (1)
the array of markers
 *  represented by a cluster marker and (2) the number of cluster icon
styles. It returns a
 *  {@link ClusterIconInfo} object. The default
<code>calculator</code> returns a
 *  <code>text</code> property which is the number of markers
in the cluster and an
 *  <code>index</code> property which is one higher than the
lowest integer such that
 *  <code>10^i</code> exceeds the number of markers in the
cluster, or the size of the styles
 *  array, whichever is less. The <code>styles</code> array
element used has an index of
 *  <code>index</code> minus 1. For example, the default
<code>calculator</code> returns a
 *  <code>text</code> value of
<code>"125"</code> and an
<code>index</code> of <code>3</code>
 *  for a cluster icon representing 125 markers so the element used in the
<code>styles</code>
 *  array is <code>2</code>. A
<code>calculator</code> may also return a
<code>title</code>
 *  property that contains the text of the tooltip to be used for the
cluster marker. If
 *   <code>title</code> is not defined, the tooltip is set to
the value of the <code>title</code>
 *   property for the MarkerClusterer.
 * @property {string} [clusterClass="cluster"] The name of the
CSS class defining general styles
 *  for the cluster markers. Use this class to define CSS styles that are
not set up by the code
 *  that processes the <code>styles</code> array.
 * @property {Array} [styles] An array of {@link ClusterIconStyle} elements
defining the styles
 *  of the cluster markers to be used. The element to be used to style a
given cluster marker
 *  is determined by the function defined by the
<code>calculator</code> property.
 *  The default is an array of {@link ClusterIconStyle} elements whose
properties are derived
 *  from the values for <code>imagePath</code>,
<code>imageExtension</code>, and
 *  <code>imageSizes</code>.
 * @property {boolean} [enableRetinaIcons=false] Whether to allow the use
of cluster icons that
 * have sizes that are some multiple (typically double) of their actual
display size. Icons such
 * as these look better when viewed on high-resolution monitors such as
Apple's Retina displays.
 * Note: if this property is <code>true</code>, sprites cannot
be used as cluster icons.
 * @property {number} [batchSize=MarkerClusterer.BATCH_SIZE] Set this
property to the
 *  number of markers to be processed in a single batch when using a
browser other than
 *  Internet Explorer (for Internet Explorer, use the batchSizeIE property
instead).
 * @property {number} [batchSizeIE=MarkerClusterer.BATCH_SIZE_IE] When
Internet Explorer is
 *  being used, markers are processed in several batches with a small delay
inserted between
 *  each batch in an attempt to avoid Javascript timeout errors. Set this
property to the
 *  number of markers to be processed in a single batch; select as high a
number as you can
 *  without causing a timeout error in the browser. This number might need
to be as low as 100
 *  if 15,000 markers are being managed, for example.
 * @property {string} [imagePath=MarkerClusterer.IMAGE_PATH]
 *  The full URL of the root name of the group of image files to use for
cluster icons.
 *  The complete file name is of the form
<code>imagePath</code>n.<code>imageExtension</code>
 *  where n is the image file number (1, 2, etc.).
 * @property {string} [imageExtension=MarkerClusterer.IMAGE_EXTENSION]
 *  The extension name for the cluster icon image files (e.g.,
<code>"png"</code> or
 *  <code>"jpg"</code>).
 * @property {Array} [imageSizes=MarkerClusterer.IMAGE_SIZES]
 *  An array of numbers containing the widths of the group of
 * 
<code>imagePath</code>n.<code>imageExtension</code>
image files.
 *  (The images are assumed to be square.)
 */
/**
 * Creates a MarkerClusterer object with the options specified in {@link
MarkerClustererOptions}.
 * @constructor
 * @extends google.maps.OverlayView
 * @param {google.maps.Map} map The Google map to attach to.
 * @param {Array.<google.maps.Marker>} [opt_markers] The markers to
be added to the cluster.
 * @param {MarkerClustererOptions} [opt_options] The optional parameters.
 */
function MarkerClusterer(map, opt_markers, opt_options) {
  // MarkerClusterer implements google.maps.OverlayView interface. We use
the
  // extend function to extend MarkerClusterer with google.maps.OverlayView
  // because it might not always be available when the code is defined so
we
  // look for it at the last possible moment. If it doesn't exist now
then
  // there is no point going ahead :)
  this.extend(MarkerClusterer, google.maps.OverlayView);

  opt_markers = opt_markers || [];
  opt_options = opt_options || {};

  this.markers_ = [];
  this.clusters_ = [];
  this.listeners_ = [];
  this.activeMap_ = null;
  this.ready_ = false;

  this.gridSize_ = opt_options.gridSize || 60;
  this.minClusterSize_ = opt_options.minimumClusterSize || 2;
  this.maxZoom_ = opt_options.maxZoom || null;
  this.styles_ = opt_options.styles || [];
  this.title_ = opt_options.title || "";
  this.zoomOnClick_ = true;
  if (opt_options.zoomOnClick !== undefined) {
    this.zoomOnClick_ = opt_options.zoomOnClick;
  }
  this.averageCenter_ = false;
  if (opt_options.averageCenter !== undefined) {
    this.averageCenter_ = opt_options.averageCenter;
  }
  this.ignoreHidden_ = false;
  if (opt_options.ignoreHidden !== undefined) {
    this.ignoreHidden_ = opt_options.ignoreHidden;
  }
  this.enableRetinaIcons_ = false;
  if (opt_options.enableRetinaIcons !== undefined) {
    this.enableRetinaIcons_ = opt_options.enableRetinaIcons;
  }
  this.imagePath_ = opt_options.imagePath || MarkerClusterer.IMAGE_PATH;
  this.imageExtension_ = opt_options.imageExtension ||
MarkerClusterer.IMAGE_EXTENSION;
  this.imageSizes_ = opt_options.imageSizes || MarkerClusterer.IMAGE_SIZES;
  this.calculator_ = opt_options.calculator || MarkerClusterer.CALCULATOR;
  this.batchSize_ = opt_options.batchSize || MarkerClusterer.BATCH_SIZE;
  this.batchSizeIE_ = opt_options.batchSizeIE ||
MarkerClusterer.BATCH_SIZE_IE;
  this.clusterClass_ = opt_options.clusterClass || "cluster";

  if (navigator.userAgent.toLowerCase().indexOf("msie") !== -1) {
    // Try to avoid IE timeout when processing a huge number of markers:
    this.batchSize_ = this.batchSizeIE_;
  }

  this.setupStyles_();

  this.addMarkers(opt_markers, true);
  this.setMap(map); // Note: this causes onAdd to be called
}


/**
 * Implementation of the onAdd interface method.
 * @ignore
 */
MarkerClusterer.prototype.onAdd = function () {
  var cMarkerClusterer = this;

  this.activeMap_ = this.getMap();
  this.ready_ = true;

  this.repaint();

  this.prevZoom_ = this.getMap().getZoom();

  // Add the map event listeners
  this.listeners_ = [
    google.maps.event.addListener(this.getMap(), "zoom_changed",
function () {
      // Fix for bug #407
      // Determines map type and prevents illegal zoom levels
      var zoom = this.getMap().getZoom();
      var minZoom = this.getMap().minZoom || 0;
      var maxZoom = Math.min(this.getMap().maxZoom || 100,
                            
this.getMap().mapTypes[this.getMap().getMapTypeId()].maxZoom);
      zoom = Math.min(Math.max(zoom, minZoom), maxZoom);

      if (this.prevZoom_ != zoom) {
        this.prevZoom_ = zoom;
        this.resetViewport_(false);
      }
    }.bind(this)),
    google.maps.event.addListener(this.getMap(), "idle", function
() {
      cMarkerClusterer.redraw_();
    })
  ];
};


/**
 * Implementation of the onRemove interface method.
 * Removes map event listeners and all cluster icons from the DOM.
 * All managed markers are also put back on the map.
 * @ignore
 */
MarkerClusterer.prototype.onRemove = function () {
  var i;

  // Put all the managed markers back on the map:
  for (i = 0; i < this.markers_.length; i++) {
    if (this.markers_[i].getMap() !== this.activeMap_) {
      this.markers_[i].setMap(this.activeMap_);
    }
  }

  // Remove all clusters:
  for (i = 0; i < this.clusters_.length; i++) {
    this.clusters_[i].remove();
  }
  this.clusters_ = [];

  // Remove map event listeners:
  for (i = 0; i < this.listeners_.length; i++) {
    google.maps.event.removeListener(this.listeners_[i]);
  }
  this.listeners_ = [];

  this.activeMap_ = null;
  this.ready_ = false;
};


/**
 * Implementation of the draw interface method.
 * @ignore
 */
MarkerClusterer.prototype.draw = function () {};


/**
 * Sets up the styles object.
 */
MarkerClusterer.prototype.setupStyles_ = function () {
  var i, size;
  if (this.styles_.length > 0) {
    return;
  }

  for (i = 0; i < this.imageSizes_.length; i++) {
    size = this.imageSizes_[i];
    this.styles_.push({
      url: this.imagePath_ + (i + 1) + "." +
this.imageExtension_,
      height: size,
      width: size
    });
  }
};


/**
 *  Fits the map to the bounds of the markers managed by the clusterer.
 */
MarkerClusterer.prototype.fitMapToMarkers = function () {
  var i;
  var markers = this.getMarkers();
  var bounds = new google.maps.LatLngBounds();
  for (i = 0; i < markers.length; i++) {
    // March 3, 2018: Bug fix -- honor the ignoreHidden property
    if (markers[i].getVisible() || !this.getIgnoreHidden()) {
      bounds.extend(markers[i].getPosition());
    }
  }

  this.getMap().fitBounds(bounds);
};


/**
 * Returns the value of the <code>gridSize</code> property.
 *
 * @return {number} The grid size.
 */
MarkerClusterer.prototype.getGridSize = function () {
  return this.gridSize_;
};


/**
 * Sets the value of the <code>gridSize</code> property.
 *
 * @param {number} gridSize The grid size.
 */
MarkerClusterer.prototype.setGridSize = function (gridSize) {
  this.gridSize_ = gridSize;
};


/**
 * Returns the value of the <code>minimumClusterSize</code>
property.
 *
 * @return {number} The minimum cluster size.
 */
MarkerClusterer.prototype.getMinimumClusterSize = function () {
  return this.minClusterSize_;
};

/**
 * Sets the value of the <code>minimumClusterSize</code>
property.
 *
 * @param {number} minimumClusterSize The minimum cluster size.
 */
MarkerClusterer.prototype.setMinimumClusterSize = function
(minimumClusterSize) {
  this.minClusterSize_ = minimumClusterSize;
};


/**
 *  Returns the value of the <code>maxZoom</code> property.
 *
 *  @return {number} The maximum zoom level.
 */
MarkerClusterer.prototype.getMaxZoom = function () {
  return this.maxZoom_;
};


/**
 *  Sets the value of the <code>maxZoom</code> property.
 *
 *  @param {number} maxZoom The maximum zoom level.
 */
MarkerClusterer.prototype.setMaxZoom = function (maxZoom) {
  this.maxZoom_ = maxZoom;
};


/**
 *  Returns the value of the <code>styles</code> property.
 *
 *  @return {Array} The array of styles defining the cluster markers to be
used.
 */
MarkerClusterer.prototype.getStyles = function () {
  return this.styles_;
};


/**
 *  Sets the value of the <code>styles</code> property.
 *
 *  @param {Array.<ClusterIconStyle>} styles The array of styles to
use.
 */
MarkerClusterer.prototype.setStyles = function (styles) {
  this.styles_ = styles;
};


/**
 * Returns the value of the <code>title</code> property.
 *
 * @return {string} The content of the title text.
 */
MarkerClusterer.prototype.getTitle = function () {
  return this.title_;
};


/**
 *  Sets the value of the <code>title</code> property.
 *
 *  @param {string} title The value of the title property.
 */
MarkerClusterer.prototype.setTitle = function (title) {
  this.title_ = title;
};


/**
 * Returns the value of the <code>zoomOnClick</code> property.
 *
 * @return {boolean} True if zoomOnClick property is set.
 */
MarkerClusterer.prototype.getZoomOnClick = function () {
  return this.zoomOnClick_;
};


/**
 *  Sets the value of the <code>zoomOnClick</code> property.
 *
 *  @param {boolean} zoomOnClick The value of the zoomOnClick property.
 */
MarkerClusterer.prototype.setZoomOnClick = function (zoomOnClick) {
  this.zoomOnClick_ = zoomOnClick;
};


/**
 * Returns the value of the <code>averageCenter</code>
property.
 *
 * @return {boolean} True if averageCenter property is set.
 */
MarkerClusterer.prototype.getAverageCenter = function () {
  return this.averageCenter_;
};


/**
 *  Sets the value of the <code>averageCenter</code> property.
 *
 *  @param {boolean} averageCenter The value of the averageCenter property.
 */
MarkerClusterer.prototype.setAverageCenter = function (averageCenter) {
  this.averageCenter_ = averageCenter;
};


/**
 * Returns the value of the <code>ignoreHidden</code> property.
 *
 * @return {boolean} True if ignoreHidden property is set.
 */
MarkerClusterer.prototype.getIgnoreHidden = function () {
  return this.ignoreHidden_;
};


/**
 *  Sets the value of the <code>ignoreHidden</code> property.
 *
 *  @param {boolean} ignoreHidden The value of the ignoreHidden property.
 */
MarkerClusterer.prototype.setIgnoreHidden = function (ignoreHidden) {
  this.ignoreHidden_ = ignoreHidden;
};


/**
 * Returns the value of the <code>enableRetinaIcons</code>
property.
 *
 * @return {boolean} True if enableRetinaIcons property is set.
 */
MarkerClusterer.prototype.getEnableRetinaIcons = function () {
  return this.enableRetinaIcons_;
};


/**
 *  Sets the value of the <code>enableRetinaIcons</code>
property.
 *
 *  @param {boolean} enableRetinaIcons The value of the enableRetinaIcons
property.
 */
MarkerClusterer.prototype.setEnableRetinaIcons = function
(enableRetinaIcons) {
  this.enableRetinaIcons_ = enableRetinaIcons;
};


/**
 * Returns the value of the <code>imageExtension</code>
property.
 *
 * @return {string} The value of the imageExtension property.
 */
MarkerClusterer.prototype.getImageExtension = function () {
  return this.imageExtension_;
};


/**
 *  Sets the value of the <code>imageExtension</code> property.
 *
 *  @param {string} imageExtension The value of the imageExtension
property.
 */
MarkerClusterer.prototype.setImageExtension = function (imageExtension) {
  this.imageExtension_ = imageExtension;
};


/**
 * Returns the value of the <code>imagePath</code> property.
 *
 * @return {string} The value of the imagePath property.
 */
MarkerClusterer.prototype.getImagePath = function () {
  return this.imagePath_;
};


/**
 *  Sets the value of the <code>imagePath</code> property.
 *
 *  @param {string} imagePath The value of the imagePath property.
 */
MarkerClusterer.prototype.setImagePath = function (imagePath) {
  this.imagePath_ = imagePath;
};


/**
 * Returns the value of the <code>imageSizes</code> property.
 *
 * @return {Array} The value of the imageSizes property.
 */
MarkerClusterer.prototype.getImageSizes = function () {
  return this.imageSizes_;
};


/**
 *  Sets the value of the <code>imageSizes</code> property.
 *
 *  @param {Array} imageSizes The value of the imageSizes property.
 */
MarkerClusterer.prototype.setImageSizes = function (imageSizes) {
  this.imageSizes_ = imageSizes;
};


/**
 * Returns the value of the <code>calculator</code> property.
 *
 * @return {function} the value of the calculator property.
 */
MarkerClusterer.prototype.getCalculator = function () {
  return this.calculator_;
};


/**
 * Sets the value of the <code>calculator</code> property.
 *
 * @param {function(Array.<google.maps.Marker>, number)} calculator
The value
 *  of the calculator property.
 */
MarkerClusterer.prototype.setCalculator = function (calculator) {
  this.calculator_ = calculator;
};


/**
 * Returns the value of the <code>batchSizeIE</code> property.
 *
 * @return {number} the value of the batchSizeIE property.
 */
MarkerClusterer.prototype.getBatchSizeIE = function () {
  return this.batchSizeIE_;
};


/**
 * Sets the value of the <code>batchSizeIE</code> property.
 *
 *  @param {number} batchSizeIE The value of the batchSizeIE property.
 */
MarkerClusterer.prototype.setBatchSizeIE = function (batchSizeIE) {
  this.batchSizeIE_ = batchSizeIE;
};


/**
 * Returns the value of the <code>clusterClass</code> property.
 *
 * @return {string} the value of the clusterClass property.
 */
MarkerClusterer.prototype.getClusterClass = function () {
  return this.clusterClass_;
};


/**
 * Sets the value of the <code>clusterClass</code> property.
 *
 *  @param {string} clusterClass The value of the clusterClass property.
 */
MarkerClusterer.prototype.setClusterClass = function (clusterClass) {
  this.clusterClass_ = clusterClass;
};


/**
 *  Returns the array of markers managed by the clusterer.
 *
 *  @return {Array} The array of markers managed by the clusterer.
 */
MarkerClusterer.prototype.getMarkers = function () {
  return this.markers_;
};


/**
 *  Returns the number of markers managed by the clusterer.
 *
 *  @return {number} The number of markers.
 */
MarkerClusterer.prototype.getTotalMarkers = function () {
  return this.markers_.length;
};


/**
 * Returns the current array of clusters formed by the clusterer.
 *
 * @return {Array} The array of clusters formed by the clusterer.
 */
MarkerClusterer.prototype.getClusters = function () {
  return this.clusters_;
};


/**
 * Returns the number of clusters formed by the clusterer.
 *
 * @return {number} The number of clusters formed by the clusterer.
 */
MarkerClusterer.prototype.getTotalClusters = function () {
  return this.clusters_.length;
};


/**
 * Adds a marker to the clusterer. The clusters are redrawn unless
 *  <code>opt_nodraw</code> is set to
<code>true</code>.
 *
 * @param {google.maps.Marker} marker The marker to add.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to
prevent redrawing.
 */
MarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {
  this.pushMarkerTo_(marker);
  if (!opt_nodraw) {
    this.redraw_();
  }
};


/**
 * Adds an array of markers to the clusterer. The clusters are redrawn
unless
 *  <code>opt_nodraw</code> is set to
<code>true</code>.
 *
 * @param {Array.<google.maps.Marker>} markers The markers to add.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to
prevent redrawing.
 */
MarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {
  var key;
  for (key in markers) {
    if (markers.hasOwnProperty(key)) {
      this.pushMarkerTo_(markers[key]);
    }
  }
  if (!opt_nodraw) {
    this.redraw_();
  }
};


/**
 * Pushes a marker to the clusterer.
 *
 * @param {google.maps.Marker} marker The marker to add.
 */
MarkerClusterer.prototype.pushMarkerTo_ = function (marker) {
  // If the marker is draggable add a listener so we can update the
clusters on the dragend:
  if (marker.getDraggable()) {
    var cMarkerClusterer = this;
    google.maps.event.addListener(marker, "dragend", function ()
{
      if (cMarkerClusterer.ready_) {
        this.isAdded = false;
        cMarkerClusterer.repaint();
      }
    });
  }
  marker.isAdded = false;
  this.markers_.push(marker);
};


/**
 * Removes a marker from the cluster.  The clusters are redrawn unless
 *  <code>opt_nodraw</code> is set to
<code>true</code>. Returns <code>true</code> if the
 *  marker was removed from the clusterer.
 *
 * @param {google.maps.Marker} marker The marker to remove.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to
prevent redrawing.
 * @return {boolean} True if the marker was removed from the clusterer.
 */
MarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) {
  var removed = this.removeMarker_(marker);

  if (!opt_nodraw && removed) {
    this.repaint();
  }

  return removed;
};


/**
 * Removes an array of markers from the cluster. The clusters are redrawn
unless
 *  <code>opt_nodraw</code> is set to
<code>true</code>. Returns <code>true</code> if
markers
 *  were removed from the clusterer.
 *
 * @param {Array.<google.maps.Marker>} markers The markers to remove.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to
prevent redrawing.
 * @return {boolean} True if markers were removed from the clusterer.
 */
MarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) {
  var i, r;
  var removed = false;

  for (i = 0; i < markers.length; i++) {
    r = this.removeMarker_(markers[i]);
    removed = removed || r;
  }

  if (!opt_nodraw && removed) {
    this.repaint();
  }

  return removed;
};


/**
 * Removes a marker and returns true if removed, false if not.
 *
 * @param {google.maps.Marker} marker The marker to remove
 * @return {boolean} Whether the marker was removed or not
 */
MarkerClusterer.prototype.removeMarker_ = function (marker) {
  var i;
  var index = -1;
  if (this.markers_.indexOf) {
    index = this.markers_.indexOf(marker);
  } else {
    for (i = 0; i < this.markers_.length; i++) {
      if (marker === this.markers_[i]) {
        index = i;
        break;
      }
    }
  }

  if (index === -1) {
    // Marker is not in our list of markers, so do nothing:
    return false;
  }

  marker.setMap(null);
  this.markers_.splice(index, 1); // Remove the marker from the list of
managed markers
  return true;
};


/**
 * Removes all clusters and markers from the map and also removes all
markers
 *  managed by the clusterer.
 */
MarkerClusterer.prototype.clearMarkers = function () {
  this.resetViewport_(true);
  this.markers_ = [];
};


/**
 * Recalculates and redraws all the marker clusters from scratch.
 *  Call this after changing any properties.
 */
MarkerClusterer.prototype.repaint = function () {
  var oldClusters = this.clusters_.slice();
  this.clusters_ = [];
  this.resetViewport_(false);
  this.redraw_();

  // Remove the old clusters.
  // Do it in a timeout to prevent blinking effect.
  setTimeout(function () {
    var i;
    for (i = 0; i < oldClusters.length; i++) {
      oldClusters[i].remove();
    }
  }, 0);
};


/**
 * Returns the current bounds extended by the grid size.
 *
 * @param {google.maps.LatLngBounds} bounds The bounds to extend.
 * @return {google.maps.LatLngBounds} The extended bounds.
 * @ignore
 */
MarkerClusterer.prototype.getExtendedBounds = function (bounds) {
  var projection = this.getProjection();

  // Turn the bounds into latlng.
  var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),
      bounds.getNorthEast().lng());
  var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),
      bounds.getSouthWest().lng());

  // Convert the points to pixels and the extend out by the grid size.
  var trPix = projection.fromLatLngToDivPixel(tr);
  trPix.x += this.gridSize_;
  trPix.y -= this.gridSize_;

  var blPix = projection.fromLatLngToDivPixel(bl);
  blPix.x -= this.gridSize_;
  blPix.y += this.gridSize_;

  // Convert the pixel points back to LatLng
  var ne = projection.fromDivPixelToLatLng(trPix);
  var sw = projection.fromDivPixelToLatLng(blPix);

  // Extend the bounds to contain the new bounds.
  bounds.extend(ne);
  bounds.extend(sw);

  return bounds;
};


/**
 * Redraws all the clusters.
 */
MarkerClusterer.prototype.redraw_ = function () {
  this.createClusters_(0);
};


/**
 * Removes all clusters from the map. The markers are also removed from the
map
 *  if <code>opt_hide</code> is set to
<code>true</code>.
 *
 * @param {boolean} [opt_hide] Set to <code>true</code> to also
remove the markers
 *  from the map.
 */
MarkerClusterer.prototype.resetViewport_ = function (opt_hide) {
  var i, marker;
  // Remove all the clusters
  for (i = 0; i < this.clusters_.length; i++) {
    this.clusters_[i].remove();
  }
  this.clusters_ = [];

  // Reset the markers to not be added and to be removed from the map.
  for (i = 0; i < this.markers_.length; i++) {
    marker = this.markers_[i];
    marker.isAdded = false;
    if (opt_hide) {
      marker.setMap(null);
    }
  }
};


/**
 * Calculates the distance between two latlng locations in km.
 *
 * @param {google.maps.LatLng} p1 The first lat lng point.
 * @param {google.maps.LatLng} p2 The second lat lng point.
 * @return {number} The distance between the two points in km.
 * @see http://www.movable-type.co.uk/scripts/latlong.html
*/
MarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {
  var R = 6371; // Radius of the Earth in km
  var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
  var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180)
*
    Math.sin(dLon / 2) * Math.sin(dLon / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d;
};


/**
 * Determines if a marker is contained in a bounds.
 *
 * @param {google.maps.Marker} marker The marker to check.
 * @param {google.maps.LatLngBounds} bounds The bounds to check against.
 * @return {boolean} True if the marker is in the bounds.
 */
MarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {
  return bounds.contains(marker.getPosition());
};


/**
 * Adds a marker to a cluster, or creates a new cluster.
 *
 * @param {google.maps.Marker} marker The marker to add.
 */
MarkerClusterer.prototype.addToClosestCluster_ = function (marker) {
  var i, d, cluster, center;
  var distance = 40000; // Some large number
  var clusterToAddTo = null;
  for (i = 0; i < this.clusters_.length; i++) {
    cluster = this.clusters_[i];
    center = cluster.getCenter();
    if (center) {
      d = this.distanceBetweenPoints_(center, marker.getPosition());
      if (d < distance) {
        distance = d;
        clusterToAddTo = cluster;
      }
    }
  }

  if (clusterToAddTo &&
clusterToAddTo.isMarkerInClusterBounds(marker)) {
    clusterToAddTo.addMarker(marker);
  } else {
    cluster = new Cluster(this);
    cluster.addMarker(marker);
    this.clusters_.push(cluster);
  }
};


/**
 * Creates the clusters. This is done in batches to avoid timeout errors
 *  in some browsers when there is a huge number of markers.
 *
 * @param {number} iFirst The index of the first marker in the batch of
 *  markers to be added to clusters.
 */
MarkerClusterer.prototype.createClusters_ = function (iFirst) {
  var i, marker;
  var mapBounds;
  var cMarkerClusterer = this;
  if (!this.ready_) {
    return;
  }

  // Cancel previous batch processing if we're working on the first
batch:
  if (iFirst === 0) {
    /**
     * This event is fired when the
<code>MarkerClusterer</code> begins
     *  clustering markers.
     * @name MarkerClusterer#clusteringbegin
     * @param {MarkerClusterer} mc The MarkerClusterer whose markers are
being clustered.
     * @event
     */
    google.maps.event.trigger(this, "clusteringbegin", this);

    if (typeof this.timerRefStatic !== "undefined") {
      clearTimeout(this.timerRefStatic);
      delete this.timerRefStatic;
    }
  }

  // Get our current map view bounds.
  // Create a new bounds object so we don't affect the map.
  //
  // See Comments 9 & 11 on Issue 3651 relating to this workaround for
a Google Maps bug:
  if (this.getMap().getZoom() > 3) {
    mapBounds = new
google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),
      this.getMap().getBounds().getNorthEast());
  } else {
    mapBounds = new google.maps.LatLngBounds(new
google.maps.LatLng(85.02070771743472, -178.48388434375), new
google.maps.LatLng(-85.08136444384544, 178.00048865625));
  }
  var bounds = this.getExtendedBounds(mapBounds);

  var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length);

  for (i = iFirst; i < iLast; i++) {
    marker = this.markers_[i];
    if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds))
{
      if (!this.ignoreHidden_ || (this.ignoreHidden_ &&
marker.getVisible())) {
        this.addToClosestCluster_(marker);
      }
    }
  }

  if (iLast < this.markers_.length) {
    this.timerRefStatic = setTimeout(function () {
      cMarkerClusterer.createClusters_(iLast);
    }, 0);
  } else {
    delete this.timerRefStatic;

    /**
     * This event is fired when the
<code>MarkerClusterer</code> stops
     *  clustering markers.
     * @name MarkerClusterer#clusteringend
     * @param {MarkerClusterer} mc The MarkerClusterer whose markers are
being clustered.
     * @event
     */
    google.maps.event.trigger(this, "clusteringend", this);
  }
};


/**
 * Extends an object's prototype by another's.
 *
 * @param {Object} obj1 The object to be extended.
 * @param {Object} obj2 The object to extend with.
 * @return {Object} The new extended object.
 * @ignore
 */
MarkerClusterer.prototype.extend = function (obj1, obj2) {
  return (function (object) {
    var property;
    for (property in object.prototype) {
      this.prototype[property] = object.prototype[property];
    }
    return this;
  }).apply(obj1, [obj2]);
};


/**
 * The default function for determining the label text and style
 * for a cluster icon.
 *
 * @param {Array.<google.maps.Marker>} markers The array of markers
represented by the cluster.
 * @param {number} numStyles The number of marker styles available.
 * @return {ClusterIconInfo} The information resource for the cluster.
 * @constant
 * @ignore
 */
MarkerClusterer.CALCULATOR = function (markers, numStyles) {
  var index = 0;
  var title = "";
  var count = markers.length.toString();

  var dv = count;
  while (dv !== 0) {
    dv = parseInt(dv / 10, 10);
    index++;
  }

  index = Math.min(index, numStyles);
  return {
    text: count,
    index: index,
    title: title
  };
};


/**
 * The number of markers to process in one batch.
 *
 * @type {number}
 * @constant
 */
MarkerClusterer.BATCH_SIZE = 2000;


/**
 * The number of markers to process in one batch (IE only).
 *
 * @type {number}
 * @constant
 */
MarkerClusterer.BATCH_SIZE_IE = 500;


/**
 * The default root name for the marker cluster images.
 *
 * @type {string}
 * @constant
 */
MarkerClusterer.IMAGE_PATH = "../images/m";


/**
 * The default extension name for the marker cluster images.
 *
 * @type {string}
 * @constant
 */
MarkerClusterer.IMAGE_EXTENSION = "png";


/**
 * The default array of sizes for the marker cluster images.
 *
 * @type {Array.<number>}
 * @constant
 */
MarkerClusterer.IMAGE_SIZES = [53, 56, 66, 78, 90];

if (typeof module == 'object') {
  module.exports = MarkerClusterer;
}
libs/googlemaps/polyline_encoder/class.polylineEncoder.php000064400000015737151165346440020162
0ustar00<?php
/**
 * PolylineEncoder based on Mark McClure's Javascript PolylineEncoder
 * and Jim Hribar's PHP version. All nicely melted into a proper PHP5
class.
 *
 * @package     Google Maps Helpers
 * @since       2008-12-02
 * @author      Matthias Bauer <matthias@pulpmedia.at>
 * @see 		    http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/
 * @copyright	  Original file: 2008, Pulpmedia Medientechnik und -design
GmbH
 *              Enhancements and fixes:  Copyright (C) 2005-2020  Media
A-Team, Inc. - All rights reserved.
 */

 /**
 * $$$ hugh - hacked around for Fabrik use, to allow using the 'radius
widget' in static maps.
 * Fixed a bunch of undefined notices, and added the GMapCircle() method.
 */
class PolylineEncoder
{
	private $numLevels = 18;
	private $zoomFactor = 2;
	private $verySmall = 0.00001;
	private $forceEndpoints = true;
	private $zoomLevelBreaks = array();

	/**
	 * All parameters are set with useful defaults.
	 * If you actually want to understand them, see Mark McClure's
detailed description.
	 *
	 *
@see	http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/algorithm.html
	 */
	public function __construct($numLevels = 18, $zoomFactor = 2, $verySmall =
0.00001, $forceEndpoints = true)
	{
		$this->numLevels = $numLevels;
		$this->zoomFactor = $zoomFactor;
		$this->verySmall = $verySmall;
		$this->forceEndpoints = $forceEndpoints;

		for($i = 0; $i < $this->numLevels; $i++)
		{
			$this->zoomLevelBreaks[$i] = $this->verySmall *
pow($this->zoomFactor, $this->numLevels-$i-1);
		}
	}

	/**
	 * Generates all values needed for the encoded Google Maps GPolyline.
	 *
	 * @param array		Multidimensional input array in the form of
	 * 					array(array(latitude, longitude), array(latitude, longitude),...)
	 *
	 * @return stdClass	Simple object containing three public parameter:
	 * 					- points: the points string with escaped backslashes
   *          - levels: the encoded levels ready to use
   *          - rawPoints: the points right out of the encoder
   *          - numLevels: should be used for creating the polyline
   *          - zoomFactor: should be used for creating the polyline
	 */
	public function encode($points)
	{
		$dists = array();
    if(count($points) > 2)
    {
      $stack[] = array(0, count($points)-1);
      while(count($stack) > 0)
      {
          $current = array_pop($stack);
          $maxDist = $absMaxDist = 0;
          for($i = $current[0]+1; $i < $current[1]; $i++)
          {
            $temp = $this->distance($points[$i], $points[$current[0]],
$points[$current[1]]);
        if($temp > $maxDist)
        {
            $maxDist = $temp;
            $maxLoc = $i;
            if($maxDist > $absMaxDist)
            {
                $absMaxDist = $maxDist;
            }
        }
          }
          if($maxDist > $this->verySmall)
          {
            $dists[$maxLoc] = $maxDist;
            array_push($stack, array($current[0], $maxLoc));
            array_push($stack, array($maxLoc, $current[1]));
          }
      }
    }

    $polyline = new stdClass();
    $polyline->rawPoints = $this->createEncodings($points, $dists);
    $polyline->levels = $this->encodeLevels($points, $dists,
$absMaxDist);
    $polyline->points = str_replace("\\","\\\\",
$polyline->rawPoints);
    $polyline->numLevels = $this->numLevels;
    $polyline->zoomFactor = $this->zoomFactor;

    return $polyline;
	}

	private function computeLevel($dd)
	{
	    if($dd > $this->verySmall)
	    {
	        $lev = 0;
	        while($dd < $this->zoomLevelBreaks[$lev])
		{
		    $lev++;
		}
	    }
	    return $lev;
	}

	private function distance($p0, $p1, $p2)
	{
	    if($p1[0] == $p2[0] && $p1[1] == $p2[1])
	    {
	        $out = sqrt(pow($p2[0]-$p0[0],2) + pow($p2[1]-$p0[1],2));
	    }
	    else
	    {
	        $u = (($p0[0]-$p1[0])*($p2[0]-$p1[0]) + ($p0[1]-$p1[1]) *
($p2[1]-$p1[1])) / (pow($p2[0]-$p1[0],2) + pow($p2[1]-$p1[1],2));
	        if($u <= 0)
	        {
	            $out = sqrt(pow($p0[0] - $p1[0],2) + pow($p0[1] - $p1[1],2));
	        }
	        if($u >= 1)
		{
	            $out = sqrt(pow($p0[0] - $p2[0],2) + pow($p0[1] - $p2[1],2));
	        }
	        if(0 < $u && $u < 1)
		{
	            $out = sqrt(pow($p0[0]-$p1[0]-$u*($p2[0]-$p1[0]),2) +
pow($p0[1]-$p1[1]-$u*($p2[1]-$p1[1]),2));
	        }
	    }
	    return $out;
	}

	private function encodeSignedNumber($num)
	{
	   $sgn_num = $num << 1;
	   if ($num < 0)
	   {
	       $sgn_num = ~($sgn_num);
	   }
	   return $this->encodeNumber($sgn_num);
	}

	private function createEncodings($points, $dists)
	{
		$plat = $plng = 0;
		$encoded_points = '';
	    for($i=0; $i<count($points); $i++)
	    {
	        if(isset($dists[$i]) || $i == 0 || $i == count($points)-1)
		{
		    $point = $points[$i];
		    $lat = $point[0];
		    $lng = $point[1];
		    $late5 = floor($lat * 1e5);
		    $lnge5 = floor($lng * 1e5);
		    $dlat = $late5 - $plat;
		    $dlng = $lnge5 - $plng;
		    $plat = $late5;
		    $plng = $lnge5;
		    $encoded_points .= $this->encodeSignedNumber($dlat) .
$this->encodeSignedNumber($dlng);
		}
	    }
	    return $encoded_points;
	}

	private function encodeLevels($points, $dists, $absMaxDist)
	{
		$encoded_levels = '';
	    if($this->forceEndpoints)
	    {
	        $encoded_levels .= $this->encodeNumber($this->numLevels-1);
	    }
	    else
	    {
	        $encoded_levels .=
$this->encodeNumber($this->numLevels-$this->computeLevel($absMaxDist)-1);
	    }
	    for($i=1; $i<count($points)-1; $i++)
	    {
	        if(isset($dists[$i]))
		{
		    $encoded_levels .=
$this->encodeNumber($this->numLevels-$this->computeLevel($dists[$i])-1);
		}
	    }
	    if($this->forceEndpoints)
	    {
	        $encoded_levels .= $this->encodeNumber($this->numLevels -1);
	    }
	    else
	    {
	        $encoded_levels .=
$this->encodeNumber($this->numLevels-$this->computeLevel($absMaxDist)-1);
	    }
	    return $encoded_levels;
	}

	private function encodeNumber($num)
	{
		$encodeString = '';
	    while($num >= 0x20)
	    {
	        $nextValue = (0x20 | ($num & 0x1f)) + 63;
	        $encodeString .= chr($nextValue);
		$num >>= 5;
	    }
	    $finalValue = $num + 63;
	    $encodeString .= chr($finalValue);
	    return $encodeString;
	}

	/**
	 * Code to build a polyline circle, stolen from:
	 *
http://stackoverflow.com/questions/7316963/drawing-a-circle-google-static-maps
	 * Needed for drawing radius circle on static maps
	 *
	 * @param unknown_type $Lat
	 * @param unknown_type $Lng
	 * @param unknown_type $Rad
	 * @param unknown_type $Detail
	 */
	public function GMapCircle($Lat,$Lng,$Rad,$Detail=8){
		$R    = 6371;

		$pi   = pi();

		$Lat  = ($Lat * $pi) / 180;
		$Lng  = ($Lng * $pi) / 180;
		$d    = $Rad / $R;

		$points = array();
		$i = 0;

		for ($i = 0; $i <= 360; $i+=$Detail)
		{
			$brng = $i * $pi / 180;

			$pLat = asin(sin($Lat)*cos($d) + cos($Lat)*sin($d)*cos($brng));
			$pLng = (($Lng + atan2(sin($brng)*sin($d)*cos($Lat),
cos($d)-sin($Lat)*sin($pLat))) * 180) / $pi;
			$pLat = ($pLat * 180) /$pi;

			$points[] = array($pLat,$pLng);
		}

		$EncString = $this->encode($points);

		return $EncString->points;
	}
}
?>libs/googlemaps/polyline_encoder/example.php000064400000003427151165346440015347
0ustar00<?php

require_once('class.polylineEncoder.php');

// read points from file (bristish shoreline from
http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/BritishCoastline.html
$points = file('BritishShoreline.txt', FILE_IGNORE_NEW_LINES |
FILE_SKIP_EMPTY_LINES);
foreach ($points as $key => $point)
{
  $points[$key] = explode(',', $point);
}

$encoder = new PolylineEncoder();
$polyline = $encoder->encode($points);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html;
charset=utf-8"/>
    <title>Google Maps JavaScript API Example</title>
    <script
src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAANE0WF4ORtlpNk94qhyLbixTU4XYMib-DjEpB6gWbEqPTdmn-qhTJDTeEJNLFrmU7IWoTLQxpGVxRqg"
      type="text/javascript"></script>
    <script type="text/javascript">

    //<![CDATA[

    function load() {
      if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.addControl(new GScaleControl());

        map.setCenter(new GLatLng(54.3, -2.23), 4);
        
        var encodedPolyline = new GPolyline.fromEncoded({
          color: "#FF0000",
          weight: 5,
          points: "<?= $polyline->points ?>",
          levels: "<?= $polyline->levels ?>",
          zoomFactor: <?= $polyline->zoomFactor ?>,
          numLevels: <?= $polyline->numLevels ?>
        });
        map.addOverlay(encodedPolyline);
      }
    }

    //]]>
    </script>
  </head>
  <body onload="load()" onunload="GUnload()">
    <div id="map"
style="width:500px;height:280px"></div>
  </body>
</html>libs/jsqrcode/qr_packed-min.js000064400000130553151165346440012377
0ustar00/* Packed with Google Closure
*
* Ported to JavaScript by Lazar Laszlo 2011 
* lazarsoft@gmail.com, www.lazarsoft.info
*
* Copyright 2007 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS"
BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var qrcode=function(){"use strict";function
a(h,b){this.count=h;this.dataCodewords=b;this.__defineGetter__("Count",function(){return
this.count});this.__defineGetter__("DataCodewords",function(){return
this.dataCodewords})}function
f(h,b,e){this.ecCodewordsPerBlock=h;this.ecBlocks=e?[b,e]:Array(b);this.__defineGetter__("ECCodewordsPerBlock",function(){return
this.ecCodewordsPerBlock});this.__defineGetter__("TotalECCodewords",function(){return
this.ecCodewordsPerBlock*this.NumBlocks});this.__defineGetter__("NumBlocks",
function(){for(var
d=0,c=0;c<this.ecBlocks.length;c++)d+=this.ecBlocks[c].length;return
d});this.getECBlocks=function(){return this.ecBlocks}}function
k(h,b,e,d,c,a){this.versionNumber=h;this.alignmentPatternCenters=b;this.ecBlocks=[e,d,c,a];h=0;b=e.ECCodewordsPerBlock;e=e.getECBlocks();for(d=0;d<e.length;d++)c=e[d],h+=c.Count*(c.DataCodewords+b);this.totalCodewords=h;this.__defineGetter__("VersionNumber",function(){return
this.versionNumber});this.__defineGetter__("AlignmentPatternCenters",function(){return
this.alignmentPatternCenters});
this.__defineGetter__("TotalCodewords",function(){return
this.totalCodewords});this.__defineGetter__("DimensionForVersion",function(){return
17+4*this.versionNumber});this.buildFunctionPattern=function(){var
d=this.DimensionForVersion,c=new
I(d);c.setRegion(0,0,9,9);c.setRegion(d-8,0,8,9);c.setRegion(0,d-8,9,8);for(var
e=this.alignmentPatternCenters.length,b=0;b<e;b++)for(var
a=this.alignmentPatternCenters[b]-2,h=0;h<e;h++)0==b&&(0==h||h==e-1)||b==e-1&&0==h||c.setRegion(this.alignmentPatternCenters[h]-
2,a,5,5);c.setRegion(6,9,1,d-17);c.setRegion(9,6,d-17,1);6<this.versionNumber&&(c.setRegion(d-11,0,3,6),c.setRegion(0,d-11,6,3));return
c};this.getECBlocksForLevel=function(c){return
this.ecBlocks[c.ordinal()]}}function
z(h,b,e,d,c,a,l,m,f){this.a11=h;this.a12=d;this.a13=l;this.a21=b;this.a22=c;this.a23=m;this.a31=e;this.a32=a;this.a33=f;this.transformPoints1=function(c){for(var
d=c.length,e=this.a11,b=this.a12,h=this.a13,a=this.a21,l=this.a22,p=this.a23,m=this.a31,f=this.a32,g=this.a33,y=0;y<d;y+=
2){var
q=c[y],k=c[y+1],n=h*q+p*k+g;c[y]=(e*q+a*k+m)/n;c[y+1]=(b*q+l*k+f)/n}};this.transformPoints2=function(c,d){for(var
e=c.length,b=0;b<e;b++){var
h=c[b],a=d[b],l=this.a13*h+this.a23*a+this.a33;c[b]=(this.a11*h+this.a21*a+this.a31)/l;d[b]=(this.a12*h+this.a22*a+this.a32)/l}};this.buildAdjoint=function(){return
new
z(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*
this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)};this.times=function(c){return
new
z(this.a11*c.a11+this.a21*c.a12+this.a31*c.a13,this.a11*c.a21+this.a21*c.a22+this.a31*c.a23,this.a11*c.a31+this.a21*c.a32+this.a31*c.a33,this.a12*c.a11+this.a22*c.a12+this.a32*c.a13,this.a12*c.a21+this.a22*c.a22+this.a32*c.a23,this.a12*c.a31+this.a22*c.a32+this.a32*c.a33,this.a13*c.a11+this.a23*c.a12+this.a33*c.a13,this.a13*c.a21+
this.a23*c.a22+this.a33*c.a23,this.a13*c.a31+this.a23*c.a32+this.a33*c.a33)}}function
P(h,b){this.bits=h;this.points=b}function
Q(h){this.image=h;this.resultPointCallback=null;this.sizeOfBlackWhiteBlackRun=function(b,e,d,c){var
h=Math.abs(c-e)>Math.abs(d-b);if(h){var a=b;b=e;e=a;a=d;d=c;c=a}for(var
m=Math.abs(d-b),f=Math.abs(c-e),q=-m>>1,k=e<c?1:-1,x=b<d?1:-1,v=0,t=b,a=e;t!=d;t+=x){var
J=h?a:t,n=h?t:a;1==v?this.image[J+n*g.width]&&v++:this.image[J+n*g.width]||v++;if(3==v)return
c=t-b,e=a-e,Math.sqrt(c*
c+e*e);q+=f;if(0<q){if(a==c)break;a+=k;q-=m}}b=d-b;e=c-e;return
Math.sqrt(b*b+e*e)};this.sizeOfBlackWhiteBlackRunBothWays=function(b,e,d,c){var
a=this.sizeOfBlackWhiteBlackRun(b,e,d,c),h=1;d=b-(d-b);0>d?(h=b/(b-d),d=0):d>=g.width&&(h=(g.width-1-b)/(d-b),d=g.width-1);c=Math.floor(e-(c-e)*h);h=1;0>c?(h=e/(e-c),c=0):c>=g.height&&(h=(g.height-1-e)/(c-e),c=g.height-1);d=Math.floor(b+(d-b)*h);a+=this.sizeOfBlackWhiteBlackRun(b,e,d,c);return
a-1};this.calculateModuleSizeOneWay=function(b,e){var
d=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(b.X),
Math.floor(b.Y),Math.floor(e.X),Math.floor(e.Y)),c=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(e.X),Math.floor(e.Y),Math.floor(b.X),Math.floor(b.Y));return
isNaN(d)?c/7:isNaN(c)?d/7:(d+c)/14};this.calculateModuleSize=function(b,e,d){return(this.calculateModuleSizeOneWay(b,e)+this.calculateModuleSizeOneWay(b,d))/2};this.distance=function(b,e){var
d=b.X-e.X,c=b.Y-e.Y;return
Math.sqrt(d*d+c*c)};this.computeDimension=function(b,e,d,c){e=Math.round(this.distance(b,e)/c);b=Math.round(this.distance(b,
d)/c);b=(e+b>>1)+7;switch(b&3){case 0:b++;break;case
2:b--;break;case 3:throw"Error";}return
b};this.findAlignmentInRegion=function(b,e,d,c){c=Math.floor(c*b);var
h=Math.max(0,e-c);e=Math.min(g.width-1,e+c);if(e-h<3*b)throw"Error";var
a=Math.max(0,d-c);return(new
R(this.image,h,a,e-h,Math.min(g.height-1,d+c)-a,b,this.resultPointCallback)).find()};this.createTransform=function(b,e,d,c,h){h-=3.5;var
a;if(null!=c){var p=c.X;c=c.Y;var f=a=h-3}else
p=e.X-b.X+d.X,c=e.Y-b.Y+d.Y,f=a=h;return
z.quadrilateralToQuadrilateral(3.5,
3.5,h,3.5,f,a,3.5,h,b.X,b.Y,e.X,e.Y,p,c,d.X,d.Y)};this.sampleGrid=function(b,e,d){return
F.sampleGrid3(b,d,e)};this.processFinderPatternInfo=function(b){var
e=b.TopLeft,d=b.TopRight;b=b.BottomLeft;var
c=this.calculateModuleSize(e,d,b);if(1>c)throw"Error";var
h=this.computeDimension(e,d,b,c),a=k.getProvisionalVersionForDimension(h),m=a.DimensionForVersion-7,f=null;if(0<a.AlignmentPatternCenters.length)for(a=1-3/m,f=Math.floor(e.X+a*(d.X-e.X+b.X-e.X)),a=Math.floor(e.Y+a*(d.Y-e.Y+b.Y-e.Y));;){f=this.findAlignmentInRegion(c,
f,a,4);break}c=this.createTransform(e,d,b,f,h);h=this.sampleGrid(this.image,c,h);return
new P(h,null==f?[b,e,d]:[b,e,d,f])};this.detect=function(){var b=(new
S).findFinderPattern(this.image);return
this.processFinderPatternInfo(b)}}function
r(h){this.errorCorrectionLevel=C.forBits(h>>3&3);this.dataMask=h&7;this.__defineGetter__("ErrorCorrectionLevel",function(){return
this.errorCorrectionLevel});this.__defineGetter__("DataMask",function(){return
this.dataMask});this.GetHashCode=function(){return
this.errorCorrectionLevel.ordinal()<<
3|this.dataMask};this.Equals=function(b){return
this.errorCorrectionLevel==b.errorCorrectionLevel&&this.dataMask==b.dataMask}}function
C(h,b,e){this.ordinal_Renamed_Field=h;this.bits=b;this.name=e;this.__defineGetter__("Bits",function(){return
this.bits});this.__defineGetter__("Name",function(){return
this.name});this.ordinal=function(){return
this.ordinal_Renamed_Field}}function
I(h,b){b||(b=h);if(1>h||1>b)throw"Both dimensions must be
greater than 0";this.width=h;this.height=b;var e=h>>5;0!=(h&
31)&&e++;this.rowSize=e;this.bits=Array(e*b);for(e=0;e<this.bits.length;e++)this.bits[e]=0;this.__defineGetter__("Width",function(){return
this.width});this.__defineGetter__("Height",function(){return
this.height});this.__defineGetter__("Dimension",function(){if(this.width!=this.height)throw"Can't
call getDimension() on a non-square matrix";return
this.width});this.get_Renamed=function(d,c){return
0!=(u(this.bits[c*this.rowSize+(d>>5)],d&31)&1)};this.set_Renamed=function(d,c){this.bits[c*this.rowSize+
(d>>5)]|=1<<(d&31)};this.flip=function(d,c){this.bits[c*this.rowSize+(d>>5)]^=1<<(d&31)};this.clear=function(){for(var
d=this.bits.length,c=0;c<d;c++)this.bits[c]=0};this.setRegion=function(d,c,e,b){if(0>c||0>d)throw"Left
and top must be nonnegative";if(1>b||1>e)throw"Height and
width must be at least
1";e=d+e;b=c+b;if(b>this.height||e>this.width)throw"The
region must fit inside the matrix";for(;c<b;c++)for(var
h=c*this.rowSize,a=d;a<e;a++)this.bits[h+(a>>5)]|=1<<(a&31)}}function
G(a,b){this.numDataCodewords=
a;this.codewords=b;this.__defineGetter__("NumDataCodewords",function(){return
this.numDataCodewords});this.__defineGetter__("Codewords",function(){return
this.codewords})}function T(a){var
b=a.Dimension;if(21>b||1!=(b&3))throw"Error
BitMatrixParser";this.bitMatrix=a;this.parsedFormatInfo=this.parsedVersion=null;this.copyBit=function(e,d,c){return
this.bitMatrix.get_Renamed(e,d)?c<<1|1:c<<1};this.readFormatInformation=function(){if(null!=this.parsedFormatInfo)return
this.parsedFormatInfo;for(var e=
0,d=0;6>d;d++)e=this.copyBit(d,8,e);e=this.copyBit(7,8,e);e=this.copyBit(8,8,e);e=this.copyBit(8,7,e);for(d=5;0<=d;d--)e=this.copyBit(8,d,e);this.parsedFormatInfo=r.decodeFormatInformation(e);if(null!=this.parsedFormatInfo)return
this.parsedFormatInfo;for(var
c=this.bitMatrix.Dimension,e=0,b=c-8,d=c-1;d>=b;d--)e=this.copyBit(d,8,e);for(d=c-7;d<c;d++)e=this.copyBit(8,d,e);this.parsedFormatInfo=r.decodeFormatInformation(e);if(null!=this.parsedFormatInfo)return
this.parsedFormatInfo;throw"Error readFormatInformation";
};this.readVersion=function(){if(null!=this.parsedVersion)return
this.parsedVersion;var
e=this.bitMatrix.Dimension,d=e-17>>2;if(6>=d)return
k.getVersionForNumber(d);for(var d=0,c=e-11,b=5;0<=b;b--)for(var
a=e-9;a>=c;a--)d=this.copyBit(a,b,d);this.parsedVersion=k.decodeVersionInformation(d);if(null!=this.parsedVersion&&this.parsedVersion.DimensionForVersion==e)return
this.parsedVersion;d=0;for(a=5;0<=a;a--)for(b=e-9;b>=c;b--)d=this.copyBit(a,b,d);this.parsedVersion=k.decodeVersionInformation(d);if(null!=
this.parsedVersion&&this.parsedVersion.DimensionForVersion==e)return
this.parsedVersion;throw"Error
readVersion";};this.readCodewords=function(){var
b=this.readFormatInformation(),d=this.readVersion(),c=H.forReference(b.DataMask),b=this.bitMatrix.Dimension;c.unmaskBitMatrix(this.bitMatrix,b);for(var
c=d.buildFunctionPattern(),a=!0,h=Array(d.TotalCodewords),m=0,f=0,g=0,k=b-1;0<k;k-=2){6==k&&k--;for(var
x=0;x<b;x++)for(var
v=a?b-1-x:x,t=0;2>t;t++)c.get_Renamed(k-t,v)||(g++,f<<=1,this.bitMatrix.get_Renamed(k-
t,v)&&(f|=1),8==g&&(h[m++]=f,f=g=0));a^=1}if(m!=d.TotalCodewords)throw"Error
readCodewords";return h}}function
w(a,b){if(null==b||0==b.length)throw"System.ArgumentException";this.field=a;var
e=b.length;if(1<e&&0==b[0]){for(var
d=1;d<e&&0==b[d];)d++;if(d==e)this.coefficients=a.Zero.coefficients;else{this.coefficients=Array(e-d);for(e=0;e<this.coefficients.length;e++)this.coefficients[e]=0;for(e=0;e<this.coefficients.length;e++)this.coefficients[e]=b[d+e]}}else
this.coefficients=b;this.__defineGetter__("Zero",
function(){return
0==this.coefficients[0]});this.__defineGetter__("Degree",function(){return
this.coefficients.length-1});this.__defineGetter__("Coefficients",function(){return
this.coefficients});this.getCoefficient=function(c){return
this.coefficients[this.coefficients.length-1-c]};this.evaluateAt=function(c){if(0==c)return
this.getCoefficient(0);var d=this.coefficients.length;if(1==c){for(var
b=c=0;b<d;b++)c=n.addOrSubtract(c,this.coefficients[b]);return c}for(var
e=this.coefficients[0],b=1;b<
d;b++)e=n.addOrSubtract(this.field.multiply(c,e),this.coefficients[b]);return
e};this.addOrSubtract=function(c){if(this.field!=c.field)throw"GF256Polys
do not have same GF256 field";if(this.Zero)return c;if(c.Zero)return
this;var d=this.coefficients;c=c.coefficients;if(d.length>c.length){var
b=d,d=c;c=b}for(var
b=Array(c.length),e=c.length-d.length,h=0;h<e;h++)b[h]=c[h];for(h=e;h<c.length;h++)b[h]=n.addOrSubtract(d[h-e],c[h]);return
new
w(a,b)};this.multiply1=function(c){if(this.field!=c.field)throw"GF256Polys
do not have same GF256 field";
if(this.Zero||c.Zero)return this.field.Zero;var
d=this.coefficients,b=d.length;c=c.coefficients;for(var
e=c.length,a=Array(b+e-1),h=0;h<b;h++)for(var
f=d[h],g=0;g<e;g++)a[h+g]=n.addOrSubtract(a[h+g],this.field.multiply(f,c[g]));return
new w(this.field,a)};this.multiply2=function(c){if(0==c)return
this.field.Zero;if(1==c)return this;for(var
d=this.coefficients.length,b=Array(d),e=0;e<d;e++)b[e]=this.field.multiply(this.coefficients[e],c);return
new w(this.field,b)};this.multiplyByMonomial=function(c,
d){if(0>c)throw"System.ArgumentException";if(0==d)return
this.field.Zero;for(var
b=this.coefficients.length,e=Array(b+c),a=0;a<e.length;a++)e[a]=0;for(a=0;a<b;a++)e[a]=this.field.multiply(this.coefficients[a],d);return
new
w(this.field,e)};this.divide=function(c){if(this.field!=c.field)throw"GF256Polys
do not have same GF256 field";if(c.Zero)throw"Divide by
0";for(var
d=this.field.Zero,b=this,e=c.getCoefficient(c.Degree),e=this.field.inverse(e);b.Degree>=c.Degree&&!b.Zero;)var
a=b.Degree-c.Degree,
h=this.field.multiply(b.getCoefficient(b.Degree),e),f=c.multiplyByMonomial(a,h),a=this.field.buildMonomial(a,h),d=d.addOrSubtract(a),b=b.addOrSubtract(f);return[d,b]}}function
n(a){this.expTable=Array(256);this.logTable=Array(256);for(var
b=1,e=0;256>e;e++)this.expTable[e]=b,b<<=1,256<=b&&(b^=a);for(e=0;255>e;e++)this.logTable[this.expTable[e]]=e;a=Array(1);a[0]=0;this.zero=new
w(this,Array(a));a=Array(1);a[0]=1;this.one=new
w(this,Array(a));this.__defineGetter__("Zero",function(){return
this.zero});
this.__defineGetter__("One",function(){return
this.one});this.buildMonomial=function(d,c){if(0>d)throw"System.ArgumentException";if(0==c)return
this.zero;for(var b=Array(d+1),e=0;e<b.length;e++)b[e]=0;b[0]=c;return
new w(this,b)};this.exp=function(d){return
this.expTable[d]};this.log=function(d){if(0==d)throw"System.ArgumentException";return
this.logTable[d]};this.inverse=function(d){if(0==d)throw"System.ArithmeticException";return
this.expTable[255-this.logTable[d]]};this.multiply=function(d,c){return 0==
d||0==c?0:1==d?c:1==c?d:this.expTable[(this.logTable[d]+this.logTable[c])%255]}}function
u(a,b){return 0<=a?a>>b:(a>>b)+(2<<~b)}function
U(a,b,e){this.x=a;this.y=b;this.count=1;this.estimatedModuleSize=e;this.__defineGetter__("EstimatedModuleSize",function(){return
this.estimatedModuleSize});this.__defineGetter__("Count",function(){return
this.count});this.__defineGetter__("X",function(){return
this.x});this.__defineGetter__("Y",function(){return
this.y});this.incrementCount=function(){this.count++};
this.aboutEquals=function(d,c,b){return
Math.abs(c-this.y)<=d&&Math.abs(b-this.x)<=d?(d=Math.abs(d-this.estimatedModuleSize),1>=d||1>=d/this.estimatedModuleSize):!1}}function
V(a){this.bottomLeft=a[0];this.topLeft=a[1];this.topRight=a[2];this.__defineGetter__("BottomLeft",function(){return
this.bottomLeft});this.__defineGetter__("TopLeft",function(){return
this.topLeft});this.__defineGetter__("TopRight",function(){return
this.topRight})}function
S(){this.image=null;this.possibleCenters=[];this.hasSkipped=
!1;this.crossCheckStateCount=[0,0,0,0,0];this.resultPointCallback=null;this.__defineGetter__("CrossCheckStateCount",function(){this.crossCheckStateCount[0]=0;this.crossCheckStateCount[1]=0;this.crossCheckStateCount[2]=0;this.crossCheckStateCount[3]=0;this.crossCheckStateCount[4]=0;return
this.crossCheckStateCount});this.foundPatternCross=function(a){for(var
b=0,e=0;5>e;e++){var
d=a[e];if(0==d)return!1;b+=d}if(7>b)return!1;b=Math.floor((b<<D)/7);e=Math.floor(b/2);return
Math.abs(b-(a[0]<<D))<e&&Math.abs(b-
(a[1]<<D))<e&&Math.abs(3*b-(a[2]<<D))<3*e&&Math.abs(b-(a[3]<<D))<e&&Math.abs(b-(a[4]<<D))<e};this.centerFromEnd=function(a,b){return
b-a[4]-a[3]-a[2]/2};this.crossCheckVertical=function(a,b,e,d){for(var
c=this.image,h=g.height,l=this.CrossCheckStateCount,m=a;0<=m&&c[b+m*g.width];)l[2]++,m--;if(0>m)return
NaN;for(;0<=m&&!c[b+m*g.width]&&l[1]<=e;)l[1]++,m--;if(0>m||l[1]>e)return
NaN;for(;0<=m&&c[b+m*g.width]&&l[0]<=e;)l[0]++,m--;if(l[0]>e)return
NaN;for(m=a+1;m<h&&c[b+m*g.width];)l[2]++,m++;if(m==h)return
NaN;
for(;m<h&&!c[b+m*g.width]&&l[3]<e;)l[3]++,m++;if(m==h||l[3]>=e)return
NaN;for(;m<h&&c[b+m*g.width]&&l[4]<e;)l[4]++,m++;return
l[4]>=e||5*Math.abs(l[0]+l[1]+l[2]+l[3]+l[4]-d)>=2*d?NaN:this.foundPatternCross(l)?this.centerFromEnd(l,m):NaN};this.crossCheckHorizontal=function(a,b,e,d){for(var
c=this.image,h=g.width,l=this.CrossCheckStateCount,m=a;0<=m&&c[m+b*g.width];)l[2]++,m--;if(0>m)return
NaN;for(;0<=m&&!c[m+b*g.width]&&l[1]<=e;)l[1]++,m--;if(0>m||l[1]>e)return
NaN;for(;0<=m&&c[m+b*g.width]&&l[0]<=
e;)l[0]++,m--;if(l[0]>e)return
NaN;for(m=a+1;m<h&&c[m+b*g.width];)l[2]++,m++;if(m==h)return
NaN;for(;m<h&&!c[m+b*g.width]&&l[3]<e;)l[3]++,m++;if(m==h||l[3]>=e)return
NaN;for(;m<h&&c[m+b*g.width]&&l[4]<e;)l[4]++,m++;return
l[4]>=e||5*Math.abs(l[0]+l[1]+l[2]+l[3]+l[4]-d)>=d?NaN:this.foundPatternCross(l)?this.centerFromEnd(l,m):NaN};this.handlePossibleCenter=function(a,b,e){var
d=a[0]+a[1]+a[2]+a[3]+a[4];e=this.centerFromEnd(a,e);b=this.crossCheckVertical(b,Math.floor(e),a[2],d);if(!isNaN(b)&&(e=this.crossCheckHorizontal(Math.floor(e),
Math.floor(b),a[2],d),!isNaN(e))){a=d/7;for(var
d=!1,c=this.possibleCenters.length,h=0;h<c;h++){var
l=this.possibleCenters[h];if(l.aboutEquals(a,b,e)){l.incrementCount();d=!0;break}}d||(e=new
U(e,b,a),this.possibleCenters.push(e),null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(e));return!0}return!1};this.selectBestPatterns=function(){var
a=this.possibleCenters.length;if(3>a)throw"Couldn't find
enough finder patterns (found "+a+")";if(3<a){for(var
b=0,e=0,d=0;d<a;d++)var c=
this.possibleCenters[d].EstimatedModuleSize,b=b+c,e=e+c*c;var
p=b/a;this.possibleCenters.sort(function(c,d){var
b=Math.abs(d.EstimatedModuleSize-p),e=Math.abs(c.EstimatedModuleSize-p);return
b<e?-1:b==e?0:1});a=Math.max(.2*p,Math.sqrt(e/a-p*p));for(d=this.possibleCenters.length-1;0<=d;d--)Math.abs(this.possibleCenters[d].EstimatedModuleSize-p)>a&&this.possibleCenters.splice(d,1)}3<this.possibleCenters.length&&this.possibleCenters.sort(function(c,d){return
c.count>d.count?-1:c.count<d.count?1:0});
return[this.possibleCenters[0],this.possibleCenters[1],this.possibleCenters[2]]};this.findRowSkip=function(){var
a=this.possibleCenters.length;if(1>=a)return 0;for(var
b=null,e=0;e<a;e++){var
d=this.possibleCenters[e];if(d.Count>=K)if(null==b)b=d;else return
this.hasSkipped=!0,Math.floor((Math.abs(b.X-d.X)-Math.abs(b.Y-d.Y))/2)}return
0};this.haveMultiplyConfirmedCenters=function(){for(var
a,b=0,e=0,d=this.possibleCenters.length,c=0;c<d;c++)a=this.possibleCenters[c],a.Count>=K&&(b++,e+=a.EstimatedModuleSize);
if(3>b)return!1;for(var
b=e/d,p=0,c=0;c<d;c++)a=this.possibleCenters[c],p+=Math.abs(a.EstimatedModuleSize-b);return
p<=.05*e};this.findFinderPattern=function(a){var b;this.image=a;var
e=g.height,d=g.width,c=Math.floor(3*e/(4*W));c<L&&(c=L);for(var
h=!1,l=Array(5),m=c-1;m<e&&!h;m+=c){l[0]=0;l[1]=0;l[2]=0;l[3]=0;for(var
f=b=l[4]=0;f<d;f++)if(a[f+m*g.width])1==(b&1)&&b++,l[b]++;else
if(0==(b&1))if(4==b)if(this.foundPatternCross(l)){if(b=this.handlePossibleCenter(l,m,f))c=2,this.hasSkipped?h=this.haveMultiplyConfirmedCenters():
(b=this.findRowSkip(),b>l[2]&&(m+=b-l[2]-c,f=d-1));else{do
f++;while(f<d&&!a[f+m*g.width]);f--}b=0;l[0]=0;l[1]=0;l[2]=0;l[3]=0;l[4]=0}else
l[0]=l[2],l[1]=l[3],l[2]=l[4],l[3]=1,l[4]=0,b=3;else l[++b]++;else
l[b]++;this.foundPatternCross(l)&&(b=this.handlePossibleCenter(l,m,d))&&(c=l[0],this.hasSkipped&&(h=this.haveMultiplyConfirmedCenters()))}a=this.selectBestPatterns();g.orderBestPatterns(a);return
new V(a)}}function
M(a,b,e){this.x=a;this.y=b;this.count=1;this.estimatedModuleSize=e;this.__defineGetter__("EstimatedModuleSize",
function(){return
this.estimatedModuleSize});this.__defineGetter__("Count",function(){return
this.count});this.__defineGetter__("X",function(){return
Math.floor(this.x)});this.__defineGetter__("Y",function(){return
Math.floor(this.y)});this.incrementCount=function(){this.count++};this.aboutEquals=function(d,c,b){return
Math.abs(c-this.y)<=d&&Math.abs(b-this.x)<=d?(d=Math.abs(d-this.estimatedModuleSize),1>=d||1>=d/this.estimatedModuleSize):!1}}function
R(a,b,e,d,c,f,l){this.image=a;this.possibleCenters=
[];this.startX=b;this.startY=e;this.width=d;this.height=c;this.moduleSize=f;this.crossCheckStateCount=[0,0,0];this.resultPointCallback=l;this.centerFromEnd=function(c,d){return
d-c[2]-c[1]/2};this.foundPatternCross=function(c){for(var
d=this.moduleSize,b=d/2,a=0;3>a;a++)if(Math.abs(d-c[a])>=b)return!1;return!0};this.crossCheckVertical=function(c,d,b,a){var
e=this.image,h=g.height,f=this.crossCheckStateCount;f[0]=0;f[1]=0;f[2]=0;for(var
l=c;0<=l&&e[d+l*g.width]&&f[1]<=b;)f[1]++,l--;if(0>l||f[1]>b)return
NaN;
for(;0<=l&&!e[d+l*g.width]&&f[0]<=b;)f[0]++,l--;if(f[0]>b)return
NaN;for(l=c+1;l<h&&e[d+l*g.width]&&f[1]<=b;)f[1]++,l++;if(l==h||f[1]>b)return
NaN;for(;l<h&&!e[d+l*g.width]&&f[2]<=b;)f[2]++,l++;return
f[2]>b||5*Math.abs(f[0]+f[1]+f[2]-a)>=2*a?NaN:this.foundPatternCross(f)?this.centerFromEnd(f,l):NaN};this.handlePossibleCenter=function(c,d,b){var
a=c[0]+c[1]+c[2];b=this.centerFromEnd(c,b);d=this.crossCheckVertical(d,Math.floor(b),2*c[1],a);if(!isNaN(d)){c=(c[0]+c[1]+c[2])/3;for(var
a=this.possibleCenters.length,
e=0;e<a;e++)if(this.possibleCenters[e].aboutEquals(c,d,b))return new
M(b,d,c);b=new
M(b,d,c);this.possibleCenters.push(b);null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(b)}return
null};this.find=function(){for(var
c,b=this.startX,h=this.height,f=b+d,l=e+(h>>1),p=[0,0,0],k=0;k<h;k++){var
n=l+(0==(k&1)?k+1>>1:-(k+1>>1));p[0]=0;p[1]=0;p[2]=0;for(var
A=b;A<f&&!a[A+g.width*n];)A++;for(c=0;A<f;){if(a[A+n*g.width])if(1==c)p[c]++;else
if(2==c){if(this.foundPatternCross(p)&&
(c=this.handlePossibleCenter(p,n,A),null!=c))return
c;p[0]=p[2];p[1]=1;p[2]=0;c=1}else p[++c]++;else
1==c&&c++,p[c]++;A++}if(this.foundPatternCross(p)&&(c=this.handlePossibleCenter(p,n,f),null!=c))return
c}if(0!=this.possibleCenters.length)return
this.possibleCenters[0];throw"Couldn't find enough alignment
patterns";}}function
X(a,b,e){this.blockPointer=0;this.bitPointer=7;this.dataLength=0;this.blocks=a;this.numErrorCorrectionCode=e;9>=b?this.dataLengthMode=0:10<=b&&26>=b?this.dataLengthMode=1:27<=
b&&40>=b&&(this.dataLengthMode=2);this.getNextBits=function(b){var
c,d;if(b<this.bitPointer+1){var
a=0;for(d=0;d<b;d++)a+=1<<d;a<<=this.bitPointer-b+1;d=(this.blocks[this.blockPointer]&a)>>this.bitPointer-b+1;this.bitPointer-=b;return
d}if(b<this.bitPointer+1+8){for(d=c=0;d<this.bitPointer+1;d++)c+=1<<d;d=(this.blocks[this.blockPointer]&c)<<b-(this.bitPointer+1);this.blockPointer++;d+=this.blocks[this.blockPointer]>>8-(b-(this.bitPointer+1));this.bitPointer-=b%8;0>this.bitPointer&&(this.bitPointer=
8+this.bitPointer);return
d}if(b<this.bitPointer+1+16){for(d=a=c=0;d<this.bitPointer+1;d++)c+=1<<d;c=(this.blocks[this.blockPointer]&c)<<b-(this.bitPointer+1);this.blockPointer++;var
e=this.blocks[this.blockPointer]<<b-(this.bitPointer+1+8);this.blockPointer++;for(d=0;d<b-(this.bitPointer+1+8);d++)a+=1<<d;a<<=8-(b-(this.bitPointer+1+8));d=(this.blocks[this.blockPointer]&a)>>8-(b-(this.bitPointer+1+8));this.bitPointer-=(b-8)%8;0>this.bitPointer&&(this.bitPointer=8+this.bitPointer);return
c+e+d}return 0};
this.NextMode=function(){return
this.blockPointer>this.blocks.length-this.numErrorCorrectionCode-2?0:this.getNextBits(4)};this.getDataLength=function(b){for(var
c=0;1!=b>>c;)c++;return
this.getNextBits(g.sizeOfDataLengthInfo[this.dataLengthMode][c])};this.getRomanAndFigureString=function(b){var
c="",d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
$%*+-./:".split("");do if(1<b){var
a=this.getNextBits(11);var
e=a%45,c=c+d[Math.floor(a/45)],c=c+d[e];b-=2}else
1==b&&(a=this.getNextBits(6),c+=d[a],--b);while(0<
b);return c};this.getFigureString=function(b){var c=0,d="";do
3<=b?(c=this.getNextBits(10),100>c&&(d+="0"),10>c&&(d+="0"),b-=3):2==b?(c=this.getNextBits(7),10>c&&(d+="0"),b-=2):1==b&&(c=this.getNextBits(4),--b),d+=c;while(0<b);return
d};this.get8bitByteArray=function(b){var c=[];do{var
d=this.getNextBits(8);c.push(d);b--}while(0<b);return
c};this.getKanjiString=function(b){var c="";do{var
d=this.getNextBits(13);d=(d/192<<8)+d%192;c+=String.fromCharCode(40956>=d+33088?d+33088:d+49472);b--}while(0<
b);return c};this.parseECIValue=function(){var
b=0,c=this.getNextBits(8);0==(c&128)&&(b=c&127);128==(c&192)&&(b=this.getNextBits(8),b|=(c&63)<<8);192==(c&224)&&(b=this.getNextBits(8),b|=(c&31)<<16);return
b};this.__defineGetter__("DataByte",function(){var b=[];do{var
c=this.NextMode();if(0==c)if(0<b.length)break;else throw"Empty data
block";if(1!=c&&2!=c&&4!=c&&8!=c&&7!=c)throw"Invalid
mode: "+c+" in (block:"+this.blockPointer+"
bit:"+this.bitPointer+")";if(7==c)this.parseECIValue();else{var
a=this.getDataLength(c);
if(1>a)throw"Invalid data length: "+a;switch(c){case
1:c=this.getFigureString(a);for(var
a=Array(c.length),e=0;e<c.length;e++)a[e]=c.charCodeAt(e);b.push(a);break;case
2:c=this.getRomanAndFigureString(a);a=Array(c.length);for(e=0;e<c.length;e++)a[e]=c.charCodeAt(e);b.push(a);break;case
4:c=this.get8bitByteArray(a);b.push(c);break;case
8:c=this.getKanjiString(a),b.push(c)}}}while(1);return b})}var
F={checkAndNudgePoints:function(a,b){for(var
e,d,c=g.width,h=g.height,f=!0,m=0;m<b.length&&f;m+=2){d=
Math.floor(b[m]);e=Math.floor(b[m+1]);if(-1>d||d>c||-1>e||e>h)throw"Error.checkAndNudgePoints
";f=!1;-1==d?(b[m]=0,f=!0):d==c&&(b[m]=c-1,f=!0);-1==e?(b[m+1]=0,f=!0):e==h&&(b[m+1]=h-1,f=!0)}f=!0;for(m=b.length-2;0<=m&&f;m-=2){d=Math.floor(b[m]);e=Math.floor(b[m+1]);if(-1>d||d>c||-1>e||e>h)throw"Error.checkAndNudgePoints
";f=!1;-1==d?(b[m]=0,f=!0):d==c&&(b[m]=c-1,f=!0);-1==e?(b[m+1]=0,f=!0):e==h&&(b[m+1]=h-1,f=!0)}},sampleGrid3:function(a,b,e){for(var
d=new I(b),c=Array(b<<1),h=0;h<b;h++){for(var f=
c.length,m=h+.5,k=0;k<f;k+=2)c[k]=(k>>1)+.5,c[k+1]=m;e.transformPoints1(c);F.checkAndNudgePoints(a,c);try{for(k=0;k<f;k+=2)a[Math.floor(c[k])+g.width*Math.floor(c[k+1])]&&d.set_Renamed(k>>1,h)}catch(q){throw"Error.checkAndNudgePoints";}}return
d},sampleGridx:function(a,b,e,d,c,f,l,g,k,q,n,x,v,t,r,A,u,w){e=z.quadrilateralToQuadrilateral(e,d,c,f,l,g,k,q,n,x,v,t,r,A,u,w);return
F.sampleGrid3(a,b,e)}};k.VERSION_DECODE_INFO=[31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,
84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017];k.VERSIONS=[new
k(1,[],new f(7,new a(1,19)),new f(10,new a(1,16)),new f(13,new a(1,13)),new
f(17,new a(1,9))),new k(2,[6,18],new f(10,new a(1,34)),new f(16,new
a(1,28)),new f(22,new a(1,22)),new f(28,new a(1,16))),new k(3,[6,22],new
f(15,new a(1,55)),new f(26,new a(1,44)),new f(18,new a(2,17)),new f(22,new
a(2,13))),new k(4,[6,26],new f(20,new a(1,80)),new f(18,
new a(2,32)),new f(26,new a(2,24)),new f(16,new a(4,9))),new k(5,[6,30],new
f(26,new a(1,108)),new f(24,new a(2,43)),new f(18,new a(2,15),new
a(2,16)),new f(22,new a(2,11),new a(2,12))),new k(6,[6,34],new f(18,new
a(2,68)),new f(16,new a(4,27)),new f(24,new a(4,19)),new f(28,new
a(4,15))),new k(7,[6,22,38],new f(20,new a(2,78)),new f(18,new a(4,31)),new
f(18,new a(2,14),new a(4,15)),new f(26,new a(4,13),new a(1,14))),new
k(8,[6,24,42],new f(24,new a(2,97)),new f(22,new a(2,38),new a(2,39)),new
f(22,
new a(4,18),new a(2,19)),new f(26,new a(4,14),new a(2,15))),new
k(9,[6,26,46],new f(30,new a(2,116)),new f(22,new a(3,36),new a(2,37)),new
f(20,new a(4,16),new a(4,17)),new f(24,new a(4,12),new a(4,13))),new
k(10,[6,28,50],new f(18,new a(2,68),new a(2,69)),new f(26,new a(4,43),new
a(1,44)),new f(24,new a(6,19),new a(2,20)),new f(28,new a(6,15),new
a(2,16))),new k(11,[6,30,54],new f(20,new a(4,81)),new f(30,new a(1,50),new
a(4,51)),new f(28,new a(4,22),new a(4,23)),new f(24,new a(3,12),new
a(8,13))),
new k(12,[6,32,58],new f(24,new a(2,92),new a(2,93)),new f(22,new
a(6,36),new a(2,37)),new f(26,new a(4,20),new a(6,21)),new f(28,new
a(7,14),new a(4,15))),new k(13,[6,34,62],new f(26,new a(4,107)),new
f(22,new a(8,37),new a(1,38)),new f(24,new a(8,20),new a(4,21)),new
f(22,new a(12,11),new a(4,12))),new k(14,[6,26,46,66],new f(30,new
a(3,115),new a(1,116)),new f(24,new a(4,40),new a(5,41)),new f(20,new
a(11,16),new a(5,17)),new f(24,new a(11,12),new a(5,13))),new
k(15,[6,26,48,70],new f(22,new a(5,
87),new a(1,88)),new f(24,new a(5,41),new a(5,42)),new f(30,new a(5,24),new
a(7,25)),new f(24,new a(11,12),new a(7,13))),new k(16,[6,26,50,74],new
f(24,new a(5,98),new a(1,99)),new f(28,new a(7,45),new a(3,46)),new
f(24,new a(15,19),new a(2,20)),new f(30,new a(3,15),new a(13,16))),new
k(17,[6,30,54,78],new f(28,new a(1,107),new a(5,108)),new f(28,new
a(10,46),new a(1,47)),new f(28,new a(1,22),new a(15,23)),new f(28,new
a(2,14),new a(17,15))),new k(18,[6,30,56,82],new f(30,new a(5,120),new
a(1,121)),
new f(26,new a(9,43),new a(4,44)),new f(28,new a(17,22),new a(1,23)),new
f(28,new a(2,14),new a(19,15))),new k(19,[6,30,58,86],new f(28,new
a(3,113),new a(4,114)),new f(26,new a(3,44),new a(11,45)),new f(26,new
a(17,21),new a(4,22)),new f(26,new a(9,13),new a(16,14))),new
k(20,[6,34,62,90],new f(28,new a(3,107),new a(5,108)),new f(26,new
a(3,41),new a(13,42)),new f(30,new a(15,24),new a(5,25)),new f(28,new
a(15,15),new a(10,16))),new k(21,[6,28,50,72,94],new f(28,new a(4,116),new
a(4,117)),new f(26,
new a(17,42)),new f(28,new a(17,22),new a(6,23)),new f(30,new a(19,16),new
a(6,17))),new k(22,[6,26,50,74,98],new f(28,new a(2,111),new a(7,112)),new
f(28,new a(17,46)),new f(30,new a(7,24),new a(16,25)),new f(24,new
a(34,13))),new k(23,[6,30,54,74,102],new f(30,new a(4,121),new
a(5,122)),new f(28,new a(4,47),new a(14,48)),new f(30,new a(11,24),new
a(14,25)),new f(30,new a(16,15),new a(14,16))),new
k(24,[6,28,54,80,106],new f(30,new a(6,117),new a(4,118)),new f(28,new
a(6,45),new a(14,46)),new f(30,
new a(11,24),new a(16,25)),new f(30,new a(30,16),new a(2,17))),new
k(25,[6,32,58,84,110],new f(26,new a(8,106),new a(4,107)),new f(28,new
a(8,47),new a(13,48)),new f(30,new a(7,24),new a(22,25)),new f(30,new
a(22,15),new a(13,16))),new k(26,[6,30,58,86,114],new f(28,new
a(10,114),new a(2,115)),new f(28,new a(19,46),new a(4,47)),new f(28,new
a(28,22),new a(6,23)),new f(30,new a(33,16),new a(4,17))),new
k(27,[6,34,62,90,118],new f(30,new a(8,122),new a(4,123)),new f(28,new
a(22,45),new a(3,46)),new f(30,
new a(8,23),new a(26,24)),new f(30,new a(12,15),new a(28,16))),new
k(28,[6,26,50,74,98,122],new f(30,new a(3,117),new a(10,118)),new f(28,new
a(3,45),new a(23,46)),new f(30,new a(4,24),new a(31,25)),new f(30,new
a(11,15),new a(31,16))),new k(29,[6,30,54,78,102,126],new f(30,new
a(7,116),new a(7,117)),new f(28,new a(21,45),new a(7,46)),new f(30,new
a(1,23),new a(37,24)),new f(30,new a(19,15),new a(26,16))),new
k(30,[6,26,52,78,104,130],new f(30,new a(5,115),new a(10,116)),new f(28,new
a(19,47),new a(10,
48)),new f(30,new a(15,24),new a(25,25)),new f(30,new a(23,15),new
a(25,16))),new k(31,[6,30,56,82,108,134],new f(30,new a(13,115),new
a(3,116)),new f(28,new a(2,46),new a(29,47)),new f(30,new a(42,24),new
a(1,25)),new f(30,new a(23,15),new a(28,16))),new
k(32,[6,34,60,86,112,138],new f(30,new a(17,115)),new f(28,new a(10,46),new
a(23,47)),new f(30,new a(10,24),new a(35,25)),new f(30,new a(19,15),new
a(35,16))),new k(33,[6,30,58,86,114,142],new f(30,new a(17,115),new
a(1,116)),new f(28,new a(14,46),
new a(21,47)),new f(30,new a(29,24),new a(19,25)),new f(30,new a(11,15),new
a(46,16))),new k(34,[6,34,62,90,118,146],new f(30,new a(13,115),new
a(6,116)),new f(28,new a(14,46),new a(23,47)),new f(30,new a(44,24),new
a(7,25)),new f(30,new a(59,16),new a(1,17))),new
k(35,[6,30,54,78,102,126,150],new f(30,new a(12,121),new a(7,122)),new
f(28,new a(12,47),new a(26,48)),new f(30,new a(39,24),new a(14,25)),new
f(30,new a(22,15),new a(41,16))),new k(36,[6,24,50,76,102,128,154],new
f(30,new a(6,121),new a(14,
122)),new f(28,new a(6,47),new a(34,48)),new f(30,new a(46,24),new
a(10,25)),new f(30,new a(2,15),new a(64,16))),new
k(37,[6,28,54,80,106,132,158],new f(30,new a(17,122),new a(4,123)),new
f(28,new a(29,46),new a(14,47)),new f(30,new a(49,24),new a(10,25)),new
f(30,new a(24,15),new a(46,16))),new k(38,[6,32,58,84,110,136,162],new
f(30,new a(4,122),new a(18,123)),new f(28,new a(13,46),new a(32,47)),new
f(30,new a(48,24),new a(14,25)),new f(30,new a(42,15),new a(32,16))),new
k(39,[6,26,54,82,110,138,
166],new f(30,new a(20,117),new a(4,118)),new f(28,new a(40,47),new
a(7,48)),new f(30,new a(43,24),new a(22,25)),new f(30,new a(10,15),new
a(67,16))),new k(40,[6,30,58,86,114,142,170],new f(30,new a(19,118),new
a(6,119)),new f(28,new a(18,47),new a(31,48)),new f(30,new a(34,24),new
a(34,25)),new f(30,new a(20,15),new
a(61,16)))];k.getVersionForNumber=function(a){if(1>a||40<a)throw"ArgumentException";return
k.VERSIONS[a-1]};k.getProvisionalVersionForDimension=function(a){if(1!=a%4)throw"Error
getProvisionalVersionForDimension";
try{return k.getVersionForNumber(a-17>>2)}catch(b){throw"Error
getVersionForNumber";}};k.decodeVersionInformation=function(a){for(var
b=4294967295,e=0,d=0;d<k.VERSION_DECODE_INFO.length;d++){var
c=k.VERSION_DECODE_INFO[d];if(c==a)return
this.getVersionForNumber(d+7);c=r.numBitsDiffering(a,c);c<b&&(e=d+7,b=c)}return
3>=b?this.getVersionForNumber(e):null};z.quadrilateralToQuadrilateral=function(a,b,e,d,c,f,g,m,k,q,n,x,v,t,r,u){a=this.quadrilateralToSquare(a,b,e,d,c,f,g,m);return
this.squareToQuadrilateral(k,
q,n,x,v,t,r,u).times(a)};z.squareToQuadrilateral=function(a,b,e,d,c,f,g,m){var
h=m-f,l=b-d+f-m;if(0==h&&0==l)return new
z(e-a,c-e,a,d-b,f-d,b,0,0,1);var p=e-c,k=g-c;c=a-e+c-g;f=d-f;var
n=p*h-k*f,h=(c*h-k*l)/n,l=(p*l-c*f)/n;return new
z(e-a+h*e,g-a+l*g,a,d-b+h*d,m-b+l*m,b,h,l,1)};z.quadrilateralToSquare=function(a,b,e,d,c,f,g,m){return
this.squareToQuadrilateral(a,b,e,d,c,f,g,m).buildAdjoint()};var
N=[[21522,0],[20773,1],[24188,2],[23371,3],[17913,4],[16590,5],[20375,6],[19104,7],[30660,8],[29427,
9],[32170,10],[30877,11],[26159,12],[25368,13],[27713,14],[26998,15],[5769,16],[5054,17],[7399,18],[6608,19],[1890,20],[597,21],[3340,22],[2107,23],[13663,24],[12392,25],[16177,26],[14854,27],[9396,28],[8579,29],[11994,30],[11245,31]],B=[0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4];r.numBitsDiffering=function(a,b){a^=b;return
B[a&15]+B[u(a,4)&15]+B[u(a,8)&15]+B[u(a,12)&15]+B[u(a,16)&15]+B[u(a,20)&15]+B[u(a,24)&15]+B[u(a,28)&15]};r.decodeFormatInformation=function(a){var
b=r.doDecodeFormatInformation(a);return null!=
b?b:r.doDecodeFormatInformation(a^21522)};r.doDecodeFormatInformation=function(a){for(var
b=4294967295,e=0,d=0;d<N.length;d++){var c=N[d],h=c[0];if(h==a)return
new
r(c[1]);h=this.numBitsDiffering(a,h);h<b&&(e=c[1],b=h)}return
3>=b?new
r(e):null};C.forBits=function(a){if(0>a||a>=O.length)throw"ArgumentException";return
O[a]};var Y=new C(0,1,"L"),Z=new C(1,0,"M"),aa=new
C(2,3,"Q"),ba=new
C(3,2,"H"),O=[Z,Y,ba,aa];G.getDataBlocks=function(a,b,e){if(a.length!=b.TotalCodewords)throw"ArgumentException";
var d=b.getECBlocksForLevel(e);e=0;var
c=d.getECBlocks();for(b=0;b<c.length;b++)e+=c[b].Count;e=Array(e);for(var
h=0,f=0;f<c.length;f++){var g=c[f];for(b=0;b<g.Count;b++){var
k=g.DataCodewords,q=d.ECCodewordsPerBlock+k;e[h++]=new
G(k,Array(q))}}b=e[0].codewords.length;for(c=e.length-1;0<=c&&e[c].codewords.length!=b;)c--;c++;d=b-d.ECCodewordsPerBlock;for(b=g=0;b<d;b++)for(f=0;f<h;f++)e[f].codewords[b]=a[g++];for(f=c;f<h;f++)e[f].codewords[d]=a[g++];k=e[0].codewords.length;for(b=d;b<k;b++)for(f=0;f<
h;f++)e[f].codewords[f<c?b:b+1]=a[g++];return e};var
H={forReference:function(a){if(0>a||7<a)throw"System.ArgumentException";return
H.DATA_MASKS[a]}};H.DATA_MASKS=[new
function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(a+b&1)}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(a&1)}},
new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==b%3}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(a+b)%3}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(u(a,
1)+b/3&1)}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){var
e=a*b;return 0==(e&1)+e%3}},new
function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){var
e=a*b;return 0==((e&1)+e%3&1)}},new
function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,
e)};this.isMasked=function(a,b){return
0==((a+b&1)+a*b%3&1)}}];n.QR_CODE_FIELD=new
n(285);n.DATA_MATRIX_FIELD=new n(301);n.addOrSubtract=function(a,b){return
a^b};var E={};E.rsDecoder=new
function(a){this.field=a;this.decode=function(a,e){for(var b=new
w(this.field,a),c=Array(e),f=0;f<c.length;f++)c[f]=0;for(var
h=!0,f=0;f<e;f++){var
g=b.evaluateAt(this.field.exp(f));c[c.length-1-f]=g;0!=g&&(h=!1)}if(!h)for(f=new
w(this.field,c),b=this.runEuclideanAlgorithm(this.field.buildMonomial(e,1),f,e),f=b[1],
b=this.findErrorLocations(b[0]),c=this.findErrorMagnitudes(f,b,!1),f=0;f<b.length;f++){h=a.length-1-this.field.log(b[f]);if(0>h)throw"ReedSolomonException
Bad error
location";a[h]=n.addOrSubtract(a[h],c[f])}};this.runEuclideanAlgorithm=function(a,e,d){if(a.Degree<e.Degree){var
b=a;a=e;e=b}for(var
b=this.field.One,f=this.field.Zero,h=this.field.Zero,g=this.field.One;e.Degree>=Math.floor(d/2);){var
k=a,q=b,n=h;a=e;b=f;h=g;if(a.Zero)throw"r_{i-1} was
zero";e=k;g=this.field.Zero;f=a.getCoefficient(a.Degree);
for(f=this.field.inverse(f);e.Degree>=a.Degree&&!e.Zero;){var
k=e.Degree-a.Degree,r=this.field.multiply(e.getCoefficient(e.Degree),f),g=g.addOrSubtract(this.field.buildMonomial(k,r));e=e.addOrSubtract(a.multiplyByMonomial(k,r))}f=g.multiply1(b).addOrSubtract(q);g=g.multiply1(h).addOrSubtract(n)}d=g.getCoefficient(0);if(0==d)throw"ReedSolomonException
sigmaTilde(0) was
zero";d=this.field.inverse(d);a=g.multiply2(d);d=e.multiply2(d);return[a,d]};this.findErrorLocations=function(a){var
b=a.Degree;if(1==
b)return Array(a.getCoefficient(1));for(var
d=Array(b),c=0,f=1;256>f&&c<b;f++)0==a.evaluateAt(f)&&(d[c]=this.field.inverse(f),c++);if(c!=b)throw"Error
locator degree does not match number of roots";return
d};this.findErrorMagnitudes=function(a,e,d){for(var
b=e.length,f=Array(b),h=0;h<b;h++){for(var
g=this.field.inverse(e[h]),k=1,q=0;q<b;q++)h!=q&&(k=this.field.multiply(k,n.addOrSubtract(1,this.field.multiply(e[q],g))));f[h]=this.field.multiply(a.evaluateAt(g),this.field.inverse(k));d&&(f[h]=this.field.multiply(f[h],
g))}return f}}(n.QR_CODE_FIELD);E.correctErrors=function(a,b){for(var
e=a.length,d=Array(e),c=0;c<e;c++)d[c]=a[c]&255;e=a.length-b;try{E.rsDecoder.decode(d,e)}catch(p){throw
p;}for(c=0;c<b;c++)a[c]=d[c]};E.decode=function(a){var b=new
T(a);a=b.readVersion();for(var
e=b.readFormatInformation().ErrorCorrectionLevel,b=b.readCodewords(),b=G.getDataBlocks(b,a,e),d=0,c=0;c<b.length;c++)d+=b[c].NumDataCodewords;for(var
d=Array(d),f=0,h=0;h<b.length;h++){var
c=b[h],g=c.Codewords,k=c.NumDataCodewords;E.correctErrors(g,
k);for(c=0;c<k;c++)d[f++]=g[c]}return new
X(d,a.VersionNumber,e.Bits)};var
g={imagedata:null,width:0,height:0,qrCodeSymbol:null,debug:!1,maxImgSize:1048576,sizeOfDataLengthInfo:[[10,9,8,8],[12,11,16,10],[14,13,16,12]],callback:null,vidSuccess:function(a){g.localstream=a;g.webkit?g.video.src=window.webkitURL.createObjectURL(a):g.moz?(g.video.mozSrcObject=a,g.video.play()):g.video.src=a;g.gUM=!0;g.canvas_qr2=document.createElement("canvas");g.canvas_qr2.id="qr-canvas";g.qrcontext2=g.canvas_qr2.getContext("2d");
g.canvas_qr2.width=g.video.videoWidth;g.canvas_qr2.height=g.video.videoHeight;setTimeout(g.captureToCanvas,500)},vidError:function(a){g.gUM=!1},captureToCanvas:function(){if(g.gUM)try{if(0==g.video.videoWidth)setTimeout(g.captureToCanvas,500);else{g.canvas_qr2.width=g.video.videoWidth;g.canvas_qr2.height=g.video.videoHeight;g.qrcontext2.drawImage(g.video,0,0);try{g.decode()}catch(h){console.log(h),setTimeout(g.captureToCanvas,500)}}}catch(h){console.log(h),setTimeout(g.captureToCanvas,500)}},setWebcam:function(a){var
b=
navigator;g.video=document.getElementById(a);var
e=!0;if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices)try{navigator.mediaDevices.enumerateDevices().then(function(a){a.forEach(function(a){console.log("deb1");"videoinput"===a.kind&&-1<a.label.toLowerCase().search("back")&&(e=[{sourceId:a.deviceId}]);console.log(a.kind+":
"+a.label+" id =
"+a.deviceId)})})}catch(d){console.log(d)}else console.log("no
navigator.mediaDevices.enumerateDevices");b.getUserMedia?b.getUserMedia({video:e,
audio:!1},g.vidSuccess,g.vidError):b.webkitGetUserMedia?(g.webkit=!0,b.webkitGetUserMedia({video:e,audio:!1},g.vidSuccess,g.vidError)):b.mozGetUserMedia&&(g.moz=!0,b.mozGetUserMedia({video:e,audio:!1},g.vidSuccess,g.vidError))},decode:function(a){if(0==arguments.length){if(g.canvas_qr2){var
b=g.canvas_qr2;var e=g.qrcontext2}else
b=document.getElementById("qr-canvas"),e=b.getContext("2d");g.width=b.width;g.height=b.height;g.imagedata=e.getImageData(0,0,g.width,g.height);g.result=g.process(e);null!=
g.callback&&g.callback(g.result);return g.result}var d=new
Image;d.crossOrigin="Anonymous";d.onload=function(){var
a=document.getElementById("out-canvas");null!=a&&(a=a.getContext("2d"),a.clearRect(0,0,320,240),a.drawImage(d,0,0,320,240));var
a=document.createElement("canvas"),b=a.getContext("2d"),e=d.height,f=d.width;d.width*d.height>g.maxImgSize&&(f=d.width/d.height,e=Math.sqrt(g.maxImgSize/f),f*=e);a.width=f;a.height=e;b.drawImage(d,0,0,a.width,a.height);g.width=a.width;g.height=a.height;try{g.imagedata=
b.getImageData(0,0,a.width,a.height)}catch(y){g.result=Error("Cross
domain image reading not supported in your browser! Save it to your
computer then drag and drop the
file!");null!=g.callback&&g.callback(g.result);return}try{g.result=g.process(b)}catch(y){console.log(y),g.result=Error("error
decoding QR
Code")}null!=g.callback&&g.callback(g.result)};d.onerror=function(){null!=g.callback&&g.callback(Error("Failed
to load the
image"))};d.src=a},isUrl:function(a){return/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/.test(a)},
decode_url:function(a){var
b="";try{b=escape(a)}catch(e){console.log(e),b=a}a="";try{a=decodeURIComponent(b)}catch(e){console.log(e),a=b}return
a},decode_utf8:function(a){return
g.isUrl(a)?g.decode_url(a):a},process:function(a){var b=(new
Date).getTime(),e=g.grayScaleToBitmap(g.grayscale());if(g.debug){for(var
d=0;d<g.height;d++)for(var c=0;c<g.width;c++){var
f=4*c+d*g.width*4;g.imagedata.data[f]=0;g.imagedata.data[f+1]=0;g.imagedata.data[f+2]=e[c+d*g.width]?255:0}a.putImageData(g.imagedata,0,0)}e=
(new
Q(e)).detect();if(g.debug){for(d=0;d<e.bits.Height;d++)for(c=0;c<e.bits.Width;c++)f=8*c+2*d*g.width*4,g.imagedata.data[f]=(e.bits.get_Renamed(c,d),0),g.imagedata.data[f+1]=(e.bits.get_Renamed(c,d),0),g.imagedata.data[f+2]=e.bits.get_Renamed(c,d)?255:0;a.putImageData(g.imagedata,0,0)}f=E.decode(e.bits).DataByte;a="";for(d=0;d<f.length;d++)for(c=0;c<f[d].length;c++)a+=String.fromCharCode(f[d][c]);f=(new
Date).getTime();console.log(f-b);return
g.decode_utf8(a)},getPixel:function(a,b){if(g.width<
a)throw"point error";if(g.height<b)throw"point
error";var
e=4*a+b*g.width*4;return(33*g.imagedata.data[e]+34*g.imagedata.data[e+1]+33*g.imagedata.data[e+2])/100},binarize:function(a){for(var
b=Array(g.width*g.height),e=0;e<g.height;e++)for(var
d=0;d<g.width;d++){var
c=g.getPixel(d,e);b[d+e*g.width]=c<=a?!0:!1}return
b},getMiddleBrightnessPerArea:function(a){for(var
b=Math.floor(g.width/4),e=Math.floor(g.height/4),d=Array(4),c=0;4>c;c++){d[c]=Array(4);for(var
f=0;4>f;f++)d[c][f]=[0,0]}for(c=0;4>c;c++)for(f=
0;4>f;f++){d[f][c][0]=255;for(var h=0;h<e;h++)for(var
m=0;m<b;m++){var
k=a[b*f+m+(e*c+h)*g.width];k<d[f][c][0]&&(d[f][c][0]=k);k>d[f][c][1]&&(d[f][c][1]=k)}}a=Array(4);for(b=0;4>b;b++)a[b]=Array(4);for(c=0;4>c;c++)for(f=0;4>f;f++)a[f][c]=Math.floor((d[f][c][0]+d[f][c][1])/2);return
a},grayScaleToBitmap:function(a){for(var
b=g.getMiddleBrightnessPerArea(a),e=b.length,d=Math.floor(g.width/e),c=Math.floor(g.height/e),f=new
ArrayBuffer(g.width*g.height),f=new Uint8Array(f),h=0;h<e;h++)for(var
m=0;m<e;m++)for(var k=
0;k<c;k++)for(var
n=0;n<d;n++)f[d*m+n+(c*h+k)*g.width]=a[d*m+n+(c*h+k)*g.width]<b[m][h]?!0:!1;return
f},grayscale:function(){for(var a=new ArrayBuffer(g.width*g.height),a=new
Uint8Array(a),b=0;b<g.height;b++)for(var e=0;e<g.width;e++){var
d=g.getPixel(e,b);a[e+b*g.width]=d}return
a}},L=3,W=57,D=8,K=2;g.orderBestPatterns=function(a){function b(a,b){var
c=a.X-b.X,d=a.Y-b.Y;return Math.sqrt(c*c+d*d)}var
e=b(a[0],a[1]),d=b(a[1],a[2]),c=b(a[0],a[2]);d>=e&&d>=c?(d=a[0],e=a[1],c=a[2]):c>=d&&c>=e?(d=a[1],
e=a[0],c=a[2]):(d=a[2],e=a[0],c=a[1]);if(0>function(a,b,c){var
d=b.x;b=b.y;return(c.x-d)*(a.y-b)-(c.y-b)*(a.x-d)}(e,d,c))var
f=e,e=c,c=f;a[0]=e;a[1]=d;a[2]=c};return g}();
libs/jsqrcode/qr_packed.js000064400000130553151165346440011616 0ustar00/*
Packed with Google Closure
*
* Ported to JavaScript by Lazar Laszlo 2011 
* lazarsoft@gmail.com, www.lazarsoft.info
*
* Copyright 2007 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS"
BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var qrcode=function(){"use strict";function
a(h,b){this.count=h;this.dataCodewords=b;this.__defineGetter__("Count",function(){return
this.count});this.__defineGetter__("DataCodewords",function(){return
this.dataCodewords})}function
f(h,b,e){this.ecCodewordsPerBlock=h;this.ecBlocks=e?[b,e]:Array(b);this.__defineGetter__("ECCodewordsPerBlock",function(){return
this.ecCodewordsPerBlock});this.__defineGetter__("TotalECCodewords",function(){return
this.ecCodewordsPerBlock*this.NumBlocks});this.__defineGetter__("NumBlocks",
function(){for(var
d=0,c=0;c<this.ecBlocks.length;c++)d+=this.ecBlocks[c].length;return
d});this.getECBlocks=function(){return this.ecBlocks}}function
k(h,b,e,d,c,a){this.versionNumber=h;this.alignmentPatternCenters=b;this.ecBlocks=[e,d,c,a];h=0;b=e.ECCodewordsPerBlock;e=e.getECBlocks();for(d=0;d<e.length;d++)c=e[d],h+=c.Count*(c.DataCodewords+b);this.totalCodewords=h;this.__defineGetter__("VersionNumber",function(){return
this.versionNumber});this.__defineGetter__("AlignmentPatternCenters",function(){return
this.alignmentPatternCenters});
this.__defineGetter__("TotalCodewords",function(){return
this.totalCodewords});this.__defineGetter__("DimensionForVersion",function(){return
17+4*this.versionNumber});this.buildFunctionPattern=function(){var
d=this.DimensionForVersion,c=new
I(d);c.setRegion(0,0,9,9);c.setRegion(d-8,0,8,9);c.setRegion(0,d-8,9,8);for(var
e=this.alignmentPatternCenters.length,b=0;b<e;b++)for(var
a=this.alignmentPatternCenters[b]-2,h=0;h<e;h++)0==b&&(0==h||h==e-1)||b==e-1&&0==h||c.setRegion(this.alignmentPatternCenters[h]-
2,a,5,5);c.setRegion(6,9,1,d-17);c.setRegion(9,6,d-17,1);6<this.versionNumber&&(c.setRegion(d-11,0,3,6),c.setRegion(0,d-11,6,3));return
c};this.getECBlocksForLevel=function(c){return
this.ecBlocks[c.ordinal()]}}function
z(h,b,e,d,c,a,l,m,f){this.a11=h;this.a12=d;this.a13=l;this.a21=b;this.a22=c;this.a23=m;this.a31=e;this.a32=a;this.a33=f;this.transformPoints1=function(c){for(var
d=c.length,e=this.a11,b=this.a12,h=this.a13,a=this.a21,l=this.a22,p=this.a23,m=this.a31,f=this.a32,g=this.a33,y=0;y<d;y+=
2){var
q=c[y],k=c[y+1],n=h*q+p*k+g;c[y]=(e*q+a*k+m)/n;c[y+1]=(b*q+l*k+f)/n}};this.transformPoints2=function(c,d){for(var
e=c.length,b=0;b<e;b++){var
h=c[b],a=d[b],l=this.a13*h+this.a23*a+this.a33;c[b]=(this.a11*h+this.a21*a+this.a31)/l;d[b]=(this.a12*h+this.a22*a+this.a32)/l}};this.buildAdjoint=function(){return
new
z(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*
this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)};this.times=function(c){return
new
z(this.a11*c.a11+this.a21*c.a12+this.a31*c.a13,this.a11*c.a21+this.a21*c.a22+this.a31*c.a23,this.a11*c.a31+this.a21*c.a32+this.a31*c.a33,this.a12*c.a11+this.a22*c.a12+this.a32*c.a13,this.a12*c.a21+this.a22*c.a22+this.a32*c.a23,this.a12*c.a31+this.a22*c.a32+this.a32*c.a33,this.a13*c.a11+this.a23*c.a12+this.a33*c.a13,this.a13*c.a21+
this.a23*c.a22+this.a33*c.a23,this.a13*c.a31+this.a23*c.a32+this.a33*c.a33)}}function
P(h,b){this.bits=h;this.points=b}function
Q(h){this.image=h;this.resultPointCallback=null;this.sizeOfBlackWhiteBlackRun=function(b,e,d,c){var
h=Math.abs(c-e)>Math.abs(d-b);if(h){var a=b;b=e;e=a;a=d;d=c;c=a}for(var
m=Math.abs(d-b),f=Math.abs(c-e),q=-m>>1,k=e<c?1:-1,x=b<d?1:-1,v=0,t=b,a=e;t!=d;t+=x){var
J=h?a:t,n=h?t:a;1==v?this.image[J+n*g.width]&&v++:this.image[J+n*g.width]||v++;if(3==v)return
c=t-b,e=a-e,Math.sqrt(c*
c+e*e);q+=f;if(0<q){if(a==c)break;a+=k;q-=m}}b=d-b;e=c-e;return
Math.sqrt(b*b+e*e)};this.sizeOfBlackWhiteBlackRunBothWays=function(b,e,d,c){var
a=this.sizeOfBlackWhiteBlackRun(b,e,d,c),h=1;d=b-(d-b);0>d?(h=b/(b-d),d=0):d>=g.width&&(h=(g.width-1-b)/(d-b),d=g.width-1);c=Math.floor(e-(c-e)*h);h=1;0>c?(h=e/(e-c),c=0):c>=g.height&&(h=(g.height-1-e)/(c-e),c=g.height-1);d=Math.floor(b+(d-b)*h);a+=this.sizeOfBlackWhiteBlackRun(b,e,d,c);return
a-1};this.calculateModuleSizeOneWay=function(b,e){var
d=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(b.X),
Math.floor(b.Y),Math.floor(e.X),Math.floor(e.Y)),c=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(e.X),Math.floor(e.Y),Math.floor(b.X),Math.floor(b.Y));return
isNaN(d)?c/7:isNaN(c)?d/7:(d+c)/14};this.calculateModuleSize=function(b,e,d){return(this.calculateModuleSizeOneWay(b,e)+this.calculateModuleSizeOneWay(b,d))/2};this.distance=function(b,e){var
d=b.X-e.X,c=b.Y-e.Y;return
Math.sqrt(d*d+c*c)};this.computeDimension=function(b,e,d,c){e=Math.round(this.distance(b,e)/c);b=Math.round(this.distance(b,
d)/c);b=(e+b>>1)+7;switch(b&3){case 0:b++;break;case
2:b--;break;case 3:throw"Error";}return
b};this.findAlignmentInRegion=function(b,e,d,c){c=Math.floor(c*b);var
h=Math.max(0,e-c);e=Math.min(g.width-1,e+c);if(e-h<3*b)throw"Error";var
a=Math.max(0,d-c);return(new
R(this.image,h,a,e-h,Math.min(g.height-1,d+c)-a,b,this.resultPointCallback)).find()};this.createTransform=function(b,e,d,c,h){h-=3.5;var
a;if(null!=c){var p=c.X;c=c.Y;var f=a=h-3}else
p=e.X-b.X+d.X,c=e.Y-b.Y+d.Y,f=a=h;return
z.quadrilateralToQuadrilateral(3.5,
3.5,h,3.5,f,a,3.5,h,b.X,b.Y,e.X,e.Y,p,c,d.X,d.Y)};this.sampleGrid=function(b,e,d){return
F.sampleGrid3(b,d,e)};this.processFinderPatternInfo=function(b){var
e=b.TopLeft,d=b.TopRight;b=b.BottomLeft;var
c=this.calculateModuleSize(e,d,b);if(1>c)throw"Error";var
h=this.computeDimension(e,d,b,c),a=k.getProvisionalVersionForDimension(h),m=a.DimensionForVersion-7,f=null;if(0<a.AlignmentPatternCenters.length)for(a=1-3/m,f=Math.floor(e.X+a*(d.X-e.X+b.X-e.X)),a=Math.floor(e.Y+a*(d.Y-e.Y+b.Y-e.Y));;){f=this.findAlignmentInRegion(c,
f,a,4);break}c=this.createTransform(e,d,b,f,h);h=this.sampleGrid(this.image,c,h);return
new P(h,null==f?[b,e,d]:[b,e,d,f])};this.detect=function(){var b=(new
S).findFinderPattern(this.image);return
this.processFinderPatternInfo(b)}}function
r(h){this.errorCorrectionLevel=C.forBits(h>>3&3);this.dataMask=h&7;this.__defineGetter__("ErrorCorrectionLevel",function(){return
this.errorCorrectionLevel});this.__defineGetter__("DataMask",function(){return
this.dataMask});this.GetHashCode=function(){return
this.errorCorrectionLevel.ordinal()<<
3|this.dataMask};this.Equals=function(b){return
this.errorCorrectionLevel==b.errorCorrectionLevel&&this.dataMask==b.dataMask}}function
C(h,b,e){this.ordinal_Renamed_Field=h;this.bits=b;this.name=e;this.__defineGetter__("Bits",function(){return
this.bits});this.__defineGetter__("Name",function(){return
this.name});this.ordinal=function(){return
this.ordinal_Renamed_Field}}function
I(h,b){b||(b=h);if(1>h||1>b)throw"Both dimensions must be
greater than 0";this.width=h;this.height=b;var e=h>>5;0!=(h&
31)&&e++;this.rowSize=e;this.bits=Array(e*b);for(e=0;e<this.bits.length;e++)this.bits[e]=0;this.__defineGetter__("Width",function(){return
this.width});this.__defineGetter__("Height",function(){return
this.height});this.__defineGetter__("Dimension",function(){if(this.width!=this.height)throw"Can't
call getDimension() on a non-square matrix";return
this.width});this.get_Renamed=function(d,c){return
0!=(u(this.bits[c*this.rowSize+(d>>5)],d&31)&1)};this.set_Renamed=function(d,c){this.bits[c*this.rowSize+
(d>>5)]|=1<<(d&31)};this.flip=function(d,c){this.bits[c*this.rowSize+(d>>5)]^=1<<(d&31)};this.clear=function(){for(var
d=this.bits.length,c=0;c<d;c++)this.bits[c]=0};this.setRegion=function(d,c,e,b){if(0>c||0>d)throw"Left
and top must be nonnegative";if(1>b||1>e)throw"Height and
width must be at least
1";e=d+e;b=c+b;if(b>this.height||e>this.width)throw"The
region must fit inside the matrix";for(;c<b;c++)for(var
h=c*this.rowSize,a=d;a<e;a++)this.bits[h+(a>>5)]|=1<<(a&31)}}function
G(a,b){this.numDataCodewords=
a;this.codewords=b;this.__defineGetter__("NumDataCodewords",function(){return
this.numDataCodewords});this.__defineGetter__("Codewords",function(){return
this.codewords})}function T(a){var
b=a.Dimension;if(21>b||1!=(b&3))throw"Error
BitMatrixParser";this.bitMatrix=a;this.parsedFormatInfo=this.parsedVersion=null;this.copyBit=function(e,d,c){return
this.bitMatrix.get_Renamed(e,d)?c<<1|1:c<<1};this.readFormatInformation=function(){if(null!=this.parsedFormatInfo)return
this.parsedFormatInfo;for(var e=
0,d=0;6>d;d++)e=this.copyBit(d,8,e);e=this.copyBit(7,8,e);e=this.copyBit(8,8,e);e=this.copyBit(8,7,e);for(d=5;0<=d;d--)e=this.copyBit(8,d,e);this.parsedFormatInfo=r.decodeFormatInformation(e);if(null!=this.parsedFormatInfo)return
this.parsedFormatInfo;for(var
c=this.bitMatrix.Dimension,e=0,b=c-8,d=c-1;d>=b;d--)e=this.copyBit(d,8,e);for(d=c-7;d<c;d++)e=this.copyBit(8,d,e);this.parsedFormatInfo=r.decodeFormatInformation(e);if(null!=this.parsedFormatInfo)return
this.parsedFormatInfo;throw"Error readFormatInformation";
};this.readVersion=function(){if(null!=this.parsedVersion)return
this.parsedVersion;var
e=this.bitMatrix.Dimension,d=e-17>>2;if(6>=d)return
k.getVersionForNumber(d);for(var d=0,c=e-11,b=5;0<=b;b--)for(var
a=e-9;a>=c;a--)d=this.copyBit(a,b,d);this.parsedVersion=k.decodeVersionInformation(d);if(null!=this.parsedVersion&&this.parsedVersion.DimensionForVersion==e)return
this.parsedVersion;d=0;for(a=5;0<=a;a--)for(b=e-9;b>=c;b--)d=this.copyBit(a,b,d);this.parsedVersion=k.decodeVersionInformation(d);if(null!=
this.parsedVersion&&this.parsedVersion.DimensionForVersion==e)return
this.parsedVersion;throw"Error
readVersion";};this.readCodewords=function(){var
b=this.readFormatInformation(),d=this.readVersion(),c=H.forReference(b.DataMask),b=this.bitMatrix.Dimension;c.unmaskBitMatrix(this.bitMatrix,b);for(var
c=d.buildFunctionPattern(),a=!0,h=Array(d.TotalCodewords),m=0,f=0,g=0,k=b-1;0<k;k-=2){6==k&&k--;for(var
x=0;x<b;x++)for(var
v=a?b-1-x:x,t=0;2>t;t++)c.get_Renamed(k-t,v)||(g++,f<<=1,this.bitMatrix.get_Renamed(k-
t,v)&&(f|=1),8==g&&(h[m++]=f,f=g=0));a^=1}if(m!=d.TotalCodewords)throw"Error
readCodewords";return h}}function
w(a,b){if(null==b||0==b.length)throw"System.ArgumentException";this.field=a;var
e=b.length;if(1<e&&0==b[0]){for(var
d=1;d<e&&0==b[d];)d++;if(d==e)this.coefficients=a.Zero.coefficients;else{this.coefficients=Array(e-d);for(e=0;e<this.coefficients.length;e++)this.coefficients[e]=0;for(e=0;e<this.coefficients.length;e++)this.coefficients[e]=b[d+e]}}else
this.coefficients=b;this.__defineGetter__("Zero",
function(){return
0==this.coefficients[0]});this.__defineGetter__("Degree",function(){return
this.coefficients.length-1});this.__defineGetter__("Coefficients",function(){return
this.coefficients});this.getCoefficient=function(c){return
this.coefficients[this.coefficients.length-1-c]};this.evaluateAt=function(c){if(0==c)return
this.getCoefficient(0);var d=this.coefficients.length;if(1==c){for(var
b=c=0;b<d;b++)c=n.addOrSubtract(c,this.coefficients[b]);return c}for(var
e=this.coefficients[0],b=1;b<
d;b++)e=n.addOrSubtract(this.field.multiply(c,e),this.coefficients[b]);return
e};this.addOrSubtract=function(c){if(this.field!=c.field)throw"GF256Polys
do not have same GF256 field";if(this.Zero)return c;if(c.Zero)return
this;var d=this.coefficients;c=c.coefficients;if(d.length>c.length){var
b=d,d=c;c=b}for(var
b=Array(c.length),e=c.length-d.length,h=0;h<e;h++)b[h]=c[h];for(h=e;h<c.length;h++)b[h]=n.addOrSubtract(d[h-e],c[h]);return
new
w(a,b)};this.multiply1=function(c){if(this.field!=c.field)throw"GF256Polys
do not have same GF256 field";
if(this.Zero||c.Zero)return this.field.Zero;var
d=this.coefficients,b=d.length;c=c.coefficients;for(var
e=c.length,a=Array(b+e-1),h=0;h<b;h++)for(var
f=d[h],g=0;g<e;g++)a[h+g]=n.addOrSubtract(a[h+g],this.field.multiply(f,c[g]));return
new w(this.field,a)};this.multiply2=function(c){if(0==c)return
this.field.Zero;if(1==c)return this;for(var
d=this.coefficients.length,b=Array(d),e=0;e<d;e++)b[e]=this.field.multiply(this.coefficients[e],c);return
new w(this.field,b)};this.multiplyByMonomial=function(c,
d){if(0>c)throw"System.ArgumentException";if(0==d)return
this.field.Zero;for(var
b=this.coefficients.length,e=Array(b+c),a=0;a<e.length;a++)e[a]=0;for(a=0;a<b;a++)e[a]=this.field.multiply(this.coefficients[a],d);return
new
w(this.field,e)};this.divide=function(c){if(this.field!=c.field)throw"GF256Polys
do not have same GF256 field";if(c.Zero)throw"Divide by
0";for(var
d=this.field.Zero,b=this,e=c.getCoefficient(c.Degree),e=this.field.inverse(e);b.Degree>=c.Degree&&!b.Zero;)var
a=b.Degree-c.Degree,
h=this.field.multiply(b.getCoefficient(b.Degree),e),f=c.multiplyByMonomial(a,h),a=this.field.buildMonomial(a,h),d=d.addOrSubtract(a),b=b.addOrSubtract(f);return[d,b]}}function
n(a){this.expTable=Array(256);this.logTable=Array(256);for(var
b=1,e=0;256>e;e++)this.expTable[e]=b,b<<=1,256<=b&&(b^=a);for(e=0;255>e;e++)this.logTable[this.expTable[e]]=e;a=Array(1);a[0]=0;this.zero=new
w(this,Array(a));a=Array(1);a[0]=1;this.one=new
w(this,Array(a));this.__defineGetter__("Zero",function(){return
this.zero});
this.__defineGetter__("One",function(){return
this.one});this.buildMonomial=function(d,c){if(0>d)throw"System.ArgumentException";if(0==c)return
this.zero;for(var b=Array(d+1),e=0;e<b.length;e++)b[e]=0;b[0]=c;return
new w(this,b)};this.exp=function(d){return
this.expTable[d]};this.log=function(d){if(0==d)throw"System.ArgumentException";return
this.logTable[d]};this.inverse=function(d){if(0==d)throw"System.ArithmeticException";return
this.expTable[255-this.logTable[d]]};this.multiply=function(d,c){return 0==
d||0==c?0:1==d?c:1==c?d:this.expTable[(this.logTable[d]+this.logTable[c])%255]}}function
u(a,b){return 0<=a?a>>b:(a>>b)+(2<<~b)}function
U(a,b,e){this.x=a;this.y=b;this.count=1;this.estimatedModuleSize=e;this.__defineGetter__("EstimatedModuleSize",function(){return
this.estimatedModuleSize});this.__defineGetter__("Count",function(){return
this.count});this.__defineGetter__("X",function(){return
this.x});this.__defineGetter__("Y",function(){return
this.y});this.incrementCount=function(){this.count++};
this.aboutEquals=function(d,c,b){return
Math.abs(c-this.y)<=d&&Math.abs(b-this.x)<=d?(d=Math.abs(d-this.estimatedModuleSize),1>=d||1>=d/this.estimatedModuleSize):!1}}function
V(a){this.bottomLeft=a[0];this.topLeft=a[1];this.topRight=a[2];this.__defineGetter__("BottomLeft",function(){return
this.bottomLeft});this.__defineGetter__("TopLeft",function(){return
this.topLeft});this.__defineGetter__("TopRight",function(){return
this.topRight})}function
S(){this.image=null;this.possibleCenters=[];this.hasSkipped=
!1;this.crossCheckStateCount=[0,0,0,0,0];this.resultPointCallback=null;this.__defineGetter__("CrossCheckStateCount",function(){this.crossCheckStateCount[0]=0;this.crossCheckStateCount[1]=0;this.crossCheckStateCount[2]=0;this.crossCheckStateCount[3]=0;this.crossCheckStateCount[4]=0;return
this.crossCheckStateCount});this.foundPatternCross=function(a){for(var
b=0,e=0;5>e;e++){var
d=a[e];if(0==d)return!1;b+=d}if(7>b)return!1;b=Math.floor((b<<D)/7);e=Math.floor(b/2);return
Math.abs(b-(a[0]<<D))<e&&Math.abs(b-
(a[1]<<D))<e&&Math.abs(3*b-(a[2]<<D))<3*e&&Math.abs(b-(a[3]<<D))<e&&Math.abs(b-(a[4]<<D))<e};this.centerFromEnd=function(a,b){return
b-a[4]-a[3]-a[2]/2};this.crossCheckVertical=function(a,b,e,d){for(var
c=this.image,h=g.height,l=this.CrossCheckStateCount,m=a;0<=m&&c[b+m*g.width];)l[2]++,m--;if(0>m)return
NaN;for(;0<=m&&!c[b+m*g.width]&&l[1]<=e;)l[1]++,m--;if(0>m||l[1]>e)return
NaN;for(;0<=m&&c[b+m*g.width]&&l[0]<=e;)l[0]++,m--;if(l[0]>e)return
NaN;for(m=a+1;m<h&&c[b+m*g.width];)l[2]++,m++;if(m==h)return
NaN;
for(;m<h&&!c[b+m*g.width]&&l[3]<e;)l[3]++,m++;if(m==h||l[3]>=e)return
NaN;for(;m<h&&c[b+m*g.width]&&l[4]<e;)l[4]++,m++;return
l[4]>=e||5*Math.abs(l[0]+l[1]+l[2]+l[3]+l[4]-d)>=2*d?NaN:this.foundPatternCross(l)?this.centerFromEnd(l,m):NaN};this.crossCheckHorizontal=function(a,b,e,d){for(var
c=this.image,h=g.width,l=this.CrossCheckStateCount,m=a;0<=m&&c[m+b*g.width];)l[2]++,m--;if(0>m)return
NaN;for(;0<=m&&!c[m+b*g.width]&&l[1]<=e;)l[1]++,m--;if(0>m||l[1]>e)return
NaN;for(;0<=m&&c[m+b*g.width]&&l[0]<=
e;)l[0]++,m--;if(l[0]>e)return
NaN;for(m=a+1;m<h&&c[m+b*g.width];)l[2]++,m++;if(m==h)return
NaN;for(;m<h&&!c[m+b*g.width]&&l[3]<e;)l[3]++,m++;if(m==h||l[3]>=e)return
NaN;for(;m<h&&c[m+b*g.width]&&l[4]<e;)l[4]++,m++;return
l[4]>=e||5*Math.abs(l[0]+l[1]+l[2]+l[3]+l[4]-d)>=d?NaN:this.foundPatternCross(l)?this.centerFromEnd(l,m):NaN};this.handlePossibleCenter=function(a,b,e){var
d=a[0]+a[1]+a[2]+a[3]+a[4];e=this.centerFromEnd(a,e);b=this.crossCheckVertical(b,Math.floor(e),a[2],d);if(!isNaN(b)&&(e=this.crossCheckHorizontal(Math.floor(e),
Math.floor(b),a[2],d),!isNaN(e))){a=d/7;for(var
d=!1,c=this.possibleCenters.length,h=0;h<c;h++){var
l=this.possibleCenters[h];if(l.aboutEquals(a,b,e)){l.incrementCount();d=!0;break}}d||(e=new
U(e,b,a),this.possibleCenters.push(e),null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(e));return!0}return!1};this.selectBestPatterns=function(){var
a=this.possibleCenters.length;if(3>a)throw"Couldn't find
enough finder patterns (found "+a+")";if(3<a){for(var
b=0,e=0,d=0;d<a;d++)var c=
this.possibleCenters[d].EstimatedModuleSize,b=b+c,e=e+c*c;var
p=b/a;this.possibleCenters.sort(function(c,d){var
b=Math.abs(d.EstimatedModuleSize-p),e=Math.abs(c.EstimatedModuleSize-p);return
b<e?-1:b==e?0:1});a=Math.max(.2*p,Math.sqrt(e/a-p*p));for(d=this.possibleCenters.length-1;0<=d;d--)Math.abs(this.possibleCenters[d].EstimatedModuleSize-p)>a&&this.possibleCenters.splice(d,1)}3<this.possibleCenters.length&&this.possibleCenters.sort(function(c,d){return
c.count>d.count?-1:c.count<d.count?1:0});
return[this.possibleCenters[0],this.possibleCenters[1],this.possibleCenters[2]]};this.findRowSkip=function(){var
a=this.possibleCenters.length;if(1>=a)return 0;for(var
b=null,e=0;e<a;e++){var
d=this.possibleCenters[e];if(d.Count>=K)if(null==b)b=d;else return
this.hasSkipped=!0,Math.floor((Math.abs(b.X-d.X)-Math.abs(b.Y-d.Y))/2)}return
0};this.haveMultiplyConfirmedCenters=function(){for(var
a,b=0,e=0,d=this.possibleCenters.length,c=0;c<d;c++)a=this.possibleCenters[c],a.Count>=K&&(b++,e+=a.EstimatedModuleSize);
if(3>b)return!1;for(var
b=e/d,p=0,c=0;c<d;c++)a=this.possibleCenters[c],p+=Math.abs(a.EstimatedModuleSize-b);return
p<=.05*e};this.findFinderPattern=function(a){var b;this.image=a;var
e=g.height,d=g.width,c=Math.floor(3*e/(4*W));c<L&&(c=L);for(var
h=!1,l=Array(5),m=c-1;m<e&&!h;m+=c){l[0]=0;l[1]=0;l[2]=0;l[3]=0;for(var
f=b=l[4]=0;f<d;f++)if(a[f+m*g.width])1==(b&1)&&b++,l[b]++;else
if(0==(b&1))if(4==b)if(this.foundPatternCross(l)){if(b=this.handlePossibleCenter(l,m,f))c=2,this.hasSkipped?h=this.haveMultiplyConfirmedCenters():
(b=this.findRowSkip(),b>l[2]&&(m+=b-l[2]-c,f=d-1));else{do
f++;while(f<d&&!a[f+m*g.width]);f--}b=0;l[0]=0;l[1]=0;l[2]=0;l[3]=0;l[4]=0}else
l[0]=l[2],l[1]=l[3],l[2]=l[4],l[3]=1,l[4]=0,b=3;else l[++b]++;else
l[b]++;this.foundPatternCross(l)&&(b=this.handlePossibleCenter(l,m,d))&&(c=l[0],this.hasSkipped&&(h=this.haveMultiplyConfirmedCenters()))}a=this.selectBestPatterns();g.orderBestPatterns(a);return
new V(a)}}function
M(a,b,e){this.x=a;this.y=b;this.count=1;this.estimatedModuleSize=e;this.__defineGetter__("EstimatedModuleSize",
function(){return
this.estimatedModuleSize});this.__defineGetter__("Count",function(){return
this.count});this.__defineGetter__("X",function(){return
Math.floor(this.x)});this.__defineGetter__("Y",function(){return
Math.floor(this.y)});this.incrementCount=function(){this.count++};this.aboutEquals=function(d,c,b){return
Math.abs(c-this.y)<=d&&Math.abs(b-this.x)<=d?(d=Math.abs(d-this.estimatedModuleSize),1>=d||1>=d/this.estimatedModuleSize):!1}}function
R(a,b,e,d,c,f,l){this.image=a;this.possibleCenters=
[];this.startX=b;this.startY=e;this.width=d;this.height=c;this.moduleSize=f;this.crossCheckStateCount=[0,0,0];this.resultPointCallback=l;this.centerFromEnd=function(c,d){return
d-c[2]-c[1]/2};this.foundPatternCross=function(c){for(var
d=this.moduleSize,b=d/2,a=0;3>a;a++)if(Math.abs(d-c[a])>=b)return!1;return!0};this.crossCheckVertical=function(c,d,b,a){var
e=this.image,h=g.height,f=this.crossCheckStateCount;f[0]=0;f[1]=0;f[2]=0;for(var
l=c;0<=l&&e[d+l*g.width]&&f[1]<=b;)f[1]++,l--;if(0>l||f[1]>b)return
NaN;
for(;0<=l&&!e[d+l*g.width]&&f[0]<=b;)f[0]++,l--;if(f[0]>b)return
NaN;for(l=c+1;l<h&&e[d+l*g.width]&&f[1]<=b;)f[1]++,l++;if(l==h||f[1]>b)return
NaN;for(;l<h&&!e[d+l*g.width]&&f[2]<=b;)f[2]++,l++;return
f[2]>b||5*Math.abs(f[0]+f[1]+f[2]-a)>=2*a?NaN:this.foundPatternCross(f)?this.centerFromEnd(f,l):NaN};this.handlePossibleCenter=function(c,d,b){var
a=c[0]+c[1]+c[2];b=this.centerFromEnd(c,b);d=this.crossCheckVertical(d,Math.floor(b),2*c[1],a);if(!isNaN(d)){c=(c[0]+c[1]+c[2])/3;for(var
a=this.possibleCenters.length,
e=0;e<a;e++)if(this.possibleCenters[e].aboutEquals(c,d,b))return new
M(b,d,c);b=new
M(b,d,c);this.possibleCenters.push(b);null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(b)}return
null};this.find=function(){for(var
c,b=this.startX,h=this.height,f=b+d,l=e+(h>>1),p=[0,0,0],k=0;k<h;k++){var
n=l+(0==(k&1)?k+1>>1:-(k+1>>1));p[0]=0;p[1]=0;p[2]=0;for(var
A=b;A<f&&!a[A+g.width*n];)A++;for(c=0;A<f;){if(a[A+n*g.width])if(1==c)p[c]++;else
if(2==c){if(this.foundPatternCross(p)&&
(c=this.handlePossibleCenter(p,n,A),null!=c))return
c;p[0]=p[2];p[1]=1;p[2]=0;c=1}else p[++c]++;else
1==c&&c++,p[c]++;A++}if(this.foundPatternCross(p)&&(c=this.handlePossibleCenter(p,n,f),null!=c))return
c}if(0!=this.possibleCenters.length)return
this.possibleCenters[0];throw"Couldn't find enough alignment
patterns";}}function
X(a,b,e){this.blockPointer=0;this.bitPointer=7;this.dataLength=0;this.blocks=a;this.numErrorCorrectionCode=e;9>=b?this.dataLengthMode=0:10<=b&&26>=b?this.dataLengthMode=1:27<=
b&&40>=b&&(this.dataLengthMode=2);this.getNextBits=function(b){var
c,d;if(b<this.bitPointer+1){var
a=0;for(d=0;d<b;d++)a+=1<<d;a<<=this.bitPointer-b+1;d=(this.blocks[this.blockPointer]&a)>>this.bitPointer-b+1;this.bitPointer-=b;return
d}if(b<this.bitPointer+1+8){for(d=c=0;d<this.bitPointer+1;d++)c+=1<<d;d=(this.blocks[this.blockPointer]&c)<<b-(this.bitPointer+1);this.blockPointer++;d+=this.blocks[this.blockPointer]>>8-(b-(this.bitPointer+1));this.bitPointer-=b%8;0>this.bitPointer&&(this.bitPointer=
8+this.bitPointer);return
d}if(b<this.bitPointer+1+16){for(d=a=c=0;d<this.bitPointer+1;d++)c+=1<<d;c=(this.blocks[this.blockPointer]&c)<<b-(this.bitPointer+1);this.blockPointer++;var
e=this.blocks[this.blockPointer]<<b-(this.bitPointer+1+8);this.blockPointer++;for(d=0;d<b-(this.bitPointer+1+8);d++)a+=1<<d;a<<=8-(b-(this.bitPointer+1+8));d=(this.blocks[this.blockPointer]&a)>>8-(b-(this.bitPointer+1+8));this.bitPointer-=(b-8)%8;0>this.bitPointer&&(this.bitPointer=8+this.bitPointer);return
c+e+d}return 0};
this.NextMode=function(){return
this.blockPointer>this.blocks.length-this.numErrorCorrectionCode-2?0:this.getNextBits(4)};this.getDataLength=function(b){for(var
c=0;1!=b>>c;)c++;return
this.getNextBits(g.sizeOfDataLengthInfo[this.dataLengthMode][c])};this.getRomanAndFigureString=function(b){var
c="",d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
$%*+-./:".split("");do if(1<b){var
a=this.getNextBits(11);var
e=a%45,c=c+d[Math.floor(a/45)],c=c+d[e];b-=2}else
1==b&&(a=this.getNextBits(6),c+=d[a],--b);while(0<
b);return c};this.getFigureString=function(b){var c=0,d="";do
3<=b?(c=this.getNextBits(10),100>c&&(d+="0"),10>c&&(d+="0"),b-=3):2==b?(c=this.getNextBits(7),10>c&&(d+="0"),b-=2):1==b&&(c=this.getNextBits(4),--b),d+=c;while(0<b);return
d};this.get8bitByteArray=function(b){var c=[];do{var
d=this.getNextBits(8);c.push(d);b--}while(0<b);return
c};this.getKanjiString=function(b){var c="";do{var
d=this.getNextBits(13);d=(d/192<<8)+d%192;c+=String.fromCharCode(40956>=d+33088?d+33088:d+49472);b--}while(0<
b);return c};this.parseECIValue=function(){var
b=0,c=this.getNextBits(8);0==(c&128)&&(b=c&127);128==(c&192)&&(b=this.getNextBits(8),b|=(c&63)<<8);192==(c&224)&&(b=this.getNextBits(8),b|=(c&31)<<16);return
b};this.__defineGetter__("DataByte",function(){var b=[];do{var
c=this.NextMode();if(0==c)if(0<b.length)break;else throw"Empty data
block";if(1!=c&&2!=c&&4!=c&&8!=c&&7!=c)throw"Invalid
mode: "+c+" in (block:"+this.blockPointer+"
bit:"+this.bitPointer+")";if(7==c)this.parseECIValue();else{var
a=this.getDataLength(c);
if(1>a)throw"Invalid data length: "+a;switch(c){case
1:c=this.getFigureString(a);for(var
a=Array(c.length),e=0;e<c.length;e++)a[e]=c.charCodeAt(e);b.push(a);break;case
2:c=this.getRomanAndFigureString(a);a=Array(c.length);for(e=0;e<c.length;e++)a[e]=c.charCodeAt(e);b.push(a);break;case
4:c=this.get8bitByteArray(a);b.push(c);break;case
8:c=this.getKanjiString(a),b.push(c)}}}while(1);return b})}var
F={checkAndNudgePoints:function(a,b){for(var
e,d,c=g.width,h=g.height,f=!0,m=0;m<b.length&&f;m+=2){d=
Math.floor(b[m]);e=Math.floor(b[m+1]);if(-1>d||d>c||-1>e||e>h)throw"Error.checkAndNudgePoints
";f=!1;-1==d?(b[m]=0,f=!0):d==c&&(b[m]=c-1,f=!0);-1==e?(b[m+1]=0,f=!0):e==h&&(b[m+1]=h-1,f=!0)}f=!0;for(m=b.length-2;0<=m&&f;m-=2){d=Math.floor(b[m]);e=Math.floor(b[m+1]);if(-1>d||d>c||-1>e||e>h)throw"Error.checkAndNudgePoints
";f=!1;-1==d?(b[m]=0,f=!0):d==c&&(b[m]=c-1,f=!0);-1==e?(b[m+1]=0,f=!0):e==h&&(b[m+1]=h-1,f=!0)}},sampleGrid3:function(a,b,e){for(var
d=new I(b),c=Array(b<<1),h=0;h<b;h++){for(var f=
c.length,m=h+.5,k=0;k<f;k+=2)c[k]=(k>>1)+.5,c[k+1]=m;e.transformPoints1(c);F.checkAndNudgePoints(a,c);try{for(k=0;k<f;k+=2)a[Math.floor(c[k])+g.width*Math.floor(c[k+1])]&&d.set_Renamed(k>>1,h)}catch(q){throw"Error.checkAndNudgePoints";}}return
d},sampleGridx:function(a,b,e,d,c,f,l,g,k,q,n,x,v,t,r,A,u,w){e=z.quadrilateralToQuadrilateral(e,d,c,f,l,g,k,q,n,x,v,t,r,A,u,w);return
F.sampleGrid3(a,b,e)}};k.VERSION_DECODE_INFO=[31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,
84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017];k.VERSIONS=[new
k(1,[],new f(7,new a(1,19)),new f(10,new a(1,16)),new f(13,new a(1,13)),new
f(17,new a(1,9))),new k(2,[6,18],new f(10,new a(1,34)),new f(16,new
a(1,28)),new f(22,new a(1,22)),new f(28,new a(1,16))),new k(3,[6,22],new
f(15,new a(1,55)),new f(26,new a(1,44)),new f(18,new a(2,17)),new f(22,new
a(2,13))),new k(4,[6,26],new f(20,new a(1,80)),new f(18,
new a(2,32)),new f(26,new a(2,24)),new f(16,new a(4,9))),new k(5,[6,30],new
f(26,new a(1,108)),new f(24,new a(2,43)),new f(18,new a(2,15),new
a(2,16)),new f(22,new a(2,11),new a(2,12))),new k(6,[6,34],new f(18,new
a(2,68)),new f(16,new a(4,27)),new f(24,new a(4,19)),new f(28,new
a(4,15))),new k(7,[6,22,38],new f(20,new a(2,78)),new f(18,new a(4,31)),new
f(18,new a(2,14),new a(4,15)),new f(26,new a(4,13),new a(1,14))),new
k(8,[6,24,42],new f(24,new a(2,97)),new f(22,new a(2,38),new a(2,39)),new
f(22,
new a(4,18),new a(2,19)),new f(26,new a(4,14),new a(2,15))),new
k(9,[6,26,46],new f(30,new a(2,116)),new f(22,new a(3,36),new a(2,37)),new
f(20,new a(4,16),new a(4,17)),new f(24,new a(4,12),new a(4,13))),new
k(10,[6,28,50],new f(18,new a(2,68),new a(2,69)),new f(26,new a(4,43),new
a(1,44)),new f(24,new a(6,19),new a(2,20)),new f(28,new a(6,15),new
a(2,16))),new k(11,[6,30,54],new f(20,new a(4,81)),new f(30,new a(1,50),new
a(4,51)),new f(28,new a(4,22),new a(4,23)),new f(24,new a(3,12),new
a(8,13))),
new k(12,[6,32,58],new f(24,new a(2,92),new a(2,93)),new f(22,new
a(6,36),new a(2,37)),new f(26,new a(4,20),new a(6,21)),new f(28,new
a(7,14),new a(4,15))),new k(13,[6,34,62],new f(26,new a(4,107)),new
f(22,new a(8,37),new a(1,38)),new f(24,new a(8,20),new a(4,21)),new
f(22,new a(12,11),new a(4,12))),new k(14,[6,26,46,66],new f(30,new
a(3,115),new a(1,116)),new f(24,new a(4,40),new a(5,41)),new f(20,new
a(11,16),new a(5,17)),new f(24,new a(11,12),new a(5,13))),new
k(15,[6,26,48,70],new f(22,new a(5,
87),new a(1,88)),new f(24,new a(5,41),new a(5,42)),new f(30,new a(5,24),new
a(7,25)),new f(24,new a(11,12),new a(7,13))),new k(16,[6,26,50,74],new
f(24,new a(5,98),new a(1,99)),new f(28,new a(7,45),new a(3,46)),new
f(24,new a(15,19),new a(2,20)),new f(30,new a(3,15),new a(13,16))),new
k(17,[6,30,54,78],new f(28,new a(1,107),new a(5,108)),new f(28,new
a(10,46),new a(1,47)),new f(28,new a(1,22),new a(15,23)),new f(28,new
a(2,14),new a(17,15))),new k(18,[6,30,56,82],new f(30,new a(5,120),new
a(1,121)),
new f(26,new a(9,43),new a(4,44)),new f(28,new a(17,22),new a(1,23)),new
f(28,new a(2,14),new a(19,15))),new k(19,[6,30,58,86],new f(28,new
a(3,113),new a(4,114)),new f(26,new a(3,44),new a(11,45)),new f(26,new
a(17,21),new a(4,22)),new f(26,new a(9,13),new a(16,14))),new
k(20,[6,34,62,90],new f(28,new a(3,107),new a(5,108)),new f(26,new
a(3,41),new a(13,42)),new f(30,new a(15,24),new a(5,25)),new f(28,new
a(15,15),new a(10,16))),new k(21,[6,28,50,72,94],new f(28,new a(4,116),new
a(4,117)),new f(26,
new a(17,42)),new f(28,new a(17,22),new a(6,23)),new f(30,new a(19,16),new
a(6,17))),new k(22,[6,26,50,74,98],new f(28,new a(2,111),new a(7,112)),new
f(28,new a(17,46)),new f(30,new a(7,24),new a(16,25)),new f(24,new
a(34,13))),new k(23,[6,30,54,74,102],new f(30,new a(4,121),new
a(5,122)),new f(28,new a(4,47),new a(14,48)),new f(30,new a(11,24),new
a(14,25)),new f(30,new a(16,15),new a(14,16))),new
k(24,[6,28,54,80,106],new f(30,new a(6,117),new a(4,118)),new f(28,new
a(6,45),new a(14,46)),new f(30,
new a(11,24),new a(16,25)),new f(30,new a(30,16),new a(2,17))),new
k(25,[6,32,58,84,110],new f(26,new a(8,106),new a(4,107)),new f(28,new
a(8,47),new a(13,48)),new f(30,new a(7,24),new a(22,25)),new f(30,new
a(22,15),new a(13,16))),new k(26,[6,30,58,86,114],new f(28,new
a(10,114),new a(2,115)),new f(28,new a(19,46),new a(4,47)),new f(28,new
a(28,22),new a(6,23)),new f(30,new a(33,16),new a(4,17))),new
k(27,[6,34,62,90,118],new f(30,new a(8,122),new a(4,123)),new f(28,new
a(22,45),new a(3,46)),new f(30,
new a(8,23),new a(26,24)),new f(30,new a(12,15),new a(28,16))),new
k(28,[6,26,50,74,98,122],new f(30,new a(3,117),new a(10,118)),new f(28,new
a(3,45),new a(23,46)),new f(30,new a(4,24),new a(31,25)),new f(30,new
a(11,15),new a(31,16))),new k(29,[6,30,54,78,102,126],new f(30,new
a(7,116),new a(7,117)),new f(28,new a(21,45),new a(7,46)),new f(30,new
a(1,23),new a(37,24)),new f(30,new a(19,15),new a(26,16))),new
k(30,[6,26,52,78,104,130],new f(30,new a(5,115),new a(10,116)),new f(28,new
a(19,47),new a(10,
48)),new f(30,new a(15,24),new a(25,25)),new f(30,new a(23,15),new
a(25,16))),new k(31,[6,30,56,82,108,134],new f(30,new a(13,115),new
a(3,116)),new f(28,new a(2,46),new a(29,47)),new f(30,new a(42,24),new
a(1,25)),new f(30,new a(23,15),new a(28,16))),new
k(32,[6,34,60,86,112,138],new f(30,new a(17,115)),new f(28,new a(10,46),new
a(23,47)),new f(30,new a(10,24),new a(35,25)),new f(30,new a(19,15),new
a(35,16))),new k(33,[6,30,58,86,114,142],new f(30,new a(17,115),new
a(1,116)),new f(28,new a(14,46),
new a(21,47)),new f(30,new a(29,24),new a(19,25)),new f(30,new a(11,15),new
a(46,16))),new k(34,[6,34,62,90,118,146],new f(30,new a(13,115),new
a(6,116)),new f(28,new a(14,46),new a(23,47)),new f(30,new a(44,24),new
a(7,25)),new f(30,new a(59,16),new a(1,17))),new
k(35,[6,30,54,78,102,126,150],new f(30,new a(12,121),new a(7,122)),new
f(28,new a(12,47),new a(26,48)),new f(30,new a(39,24),new a(14,25)),new
f(30,new a(22,15),new a(41,16))),new k(36,[6,24,50,76,102,128,154],new
f(30,new a(6,121),new a(14,
122)),new f(28,new a(6,47),new a(34,48)),new f(30,new a(46,24),new
a(10,25)),new f(30,new a(2,15),new a(64,16))),new
k(37,[6,28,54,80,106,132,158],new f(30,new a(17,122),new a(4,123)),new
f(28,new a(29,46),new a(14,47)),new f(30,new a(49,24),new a(10,25)),new
f(30,new a(24,15),new a(46,16))),new k(38,[6,32,58,84,110,136,162],new
f(30,new a(4,122),new a(18,123)),new f(28,new a(13,46),new a(32,47)),new
f(30,new a(48,24),new a(14,25)),new f(30,new a(42,15),new a(32,16))),new
k(39,[6,26,54,82,110,138,
166],new f(30,new a(20,117),new a(4,118)),new f(28,new a(40,47),new
a(7,48)),new f(30,new a(43,24),new a(22,25)),new f(30,new a(10,15),new
a(67,16))),new k(40,[6,30,58,86,114,142,170],new f(30,new a(19,118),new
a(6,119)),new f(28,new a(18,47),new a(31,48)),new f(30,new a(34,24),new
a(34,25)),new f(30,new a(20,15),new
a(61,16)))];k.getVersionForNumber=function(a){if(1>a||40<a)throw"ArgumentException";return
k.VERSIONS[a-1]};k.getProvisionalVersionForDimension=function(a){if(1!=a%4)throw"Error
getProvisionalVersionForDimension";
try{return k.getVersionForNumber(a-17>>2)}catch(b){throw"Error
getVersionForNumber";}};k.decodeVersionInformation=function(a){for(var
b=4294967295,e=0,d=0;d<k.VERSION_DECODE_INFO.length;d++){var
c=k.VERSION_DECODE_INFO[d];if(c==a)return
this.getVersionForNumber(d+7);c=r.numBitsDiffering(a,c);c<b&&(e=d+7,b=c)}return
3>=b?this.getVersionForNumber(e):null};z.quadrilateralToQuadrilateral=function(a,b,e,d,c,f,g,m,k,q,n,x,v,t,r,u){a=this.quadrilateralToSquare(a,b,e,d,c,f,g,m);return
this.squareToQuadrilateral(k,
q,n,x,v,t,r,u).times(a)};z.squareToQuadrilateral=function(a,b,e,d,c,f,g,m){var
h=m-f,l=b-d+f-m;if(0==h&&0==l)return new
z(e-a,c-e,a,d-b,f-d,b,0,0,1);var p=e-c,k=g-c;c=a-e+c-g;f=d-f;var
n=p*h-k*f,h=(c*h-k*l)/n,l=(p*l-c*f)/n;return new
z(e-a+h*e,g-a+l*g,a,d-b+h*d,m-b+l*m,b,h,l,1)};z.quadrilateralToSquare=function(a,b,e,d,c,f,g,m){return
this.squareToQuadrilateral(a,b,e,d,c,f,g,m).buildAdjoint()};var
N=[[21522,0],[20773,1],[24188,2],[23371,3],[17913,4],[16590,5],[20375,6],[19104,7],[30660,8],[29427,
9],[32170,10],[30877,11],[26159,12],[25368,13],[27713,14],[26998,15],[5769,16],[5054,17],[7399,18],[6608,19],[1890,20],[597,21],[3340,22],[2107,23],[13663,24],[12392,25],[16177,26],[14854,27],[9396,28],[8579,29],[11994,30],[11245,31]],B=[0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4];r.numBitsDiffering=function(a,b){a^=b;return
B[a&15]+B[u(a,4)&15]+B[u(a,8)&15]+B[u(a,12)&15]+B[u(a,16)&15]+B[u(a,20)&15]+B[u(a,24)&15]+B[u(a,28)&15]};r.decodeFormatInformation=function(a){var
b=r.doDecodeFormatInformation(a);return null!=
b?b:r.doDecodeFormatInformation(a^21522)};r.doDecodeFormatInformation=function(a){for(var
b=4294967295,e=0,d=0;d<N.length;d++){var c=N[d],h=c[0];if(h==a)return
new
r(c[1]);h=this.numBitsDiffering(a,h);h<b&&(e=c[1],b=h)}return
3>=b?new
r(e):null};C.forBits=function(a){if(0>a||a>=O.length)throw"ArgumentException";return
O[a]};var Y=new C(0,1,"L"),Z=new C(1,0,"M"),aa=new
C(2,3,"Q"),ba=new
C(3,2,"H"),O=[Z,Y,ba,aa];G.getDataBlocks=function(a,b,e){if(a.length!=b.TotalCodewords)throw"ArgumentException";
var d=b.getECBlocksForLevel(e);e=0;var
c=d.getECBlocks();for(b=0;b<c.length;b++)e+=c[b].Count;e=Array(e);for(var
h=0,f=0;f<c.length;f++){var g=c[f];for(b=0;b<g.Count;b++){var
k=g.DataCodewords,q=d.ECCodewordsPerBlock+k;e[h++]=new
G(k,Array(q))}}b=e[0].codewords.length;for(c=e.length-1;0<=c&&e[c].codewords.length!=b;)c--;c++;d=b-d.ECCodewordsPerBlock;for(b=g=0;b<d;b++)for(f=0;f<h;f++)e[f].codewords[b]=a[g++];for(f=c;f<h;f++)e[f].codewords[d]=a[g++];k=e[0].codewords.length;for(b=d;b<k;b++)for(f=0;f<
h;f++)e[f].codewords[f<c?b:b+1]=a[g++];return e};var
H={forReference:function(a){if(0>a||7<a)throw"System.ArgumentException";return
H.DATA_MASKS[a]}};H.DATA_MASKS=[new
function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(a+b&1)}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(a&1)}},
new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==b%3}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(a+b)%3}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){return
0==(u(a,
1)+b/3&1)}},new function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){var
e=a*b;return 0==(e&1)+e%3}},new
function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var
d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,e)};this.isMasked=function(a,b){var
e=a*b;return 0==((e&1)+e%3&1)}},new
function(){this.unmaskBitMatrix=function(a,b){for(var
e=0;e<b;e++)for(var d=0;d<b;d++)this.isMasked(e,d)&&a.flip(d,
e)};this.isMasked=function(a,b){return
0==((a+b&1)+a*b%3&1)}}];n.QR_CODE_FIELD=new
n(285);n.DATA_MATRIX_FIELD=new n(301);n.addOrSubtract=function(a,b){return
a^b};var E={};E.rsDecoder=new
function(a){this.field=a;this.decode=function(a,e){for(var b=new
w(this.field,a),c=Array(e),f=0;f<c.length;f++)c[f]=0;for(var
h=!0,f=0;f<e;f++){var
g=b.evaluateAt(this.field.exp(f));c[c.length-1-f]=g;0!=g&&(h=!1)}if(!h)for(f=new
w(this.field,c),b=this.runEuclideanAlgorithm(this.field.buildMonomial(e,1),f,e),f=b[1],
b=this.findErrorLocations(b[0]),c=this.findErrorMagnitudes(f,b,!1),f=0;f<b.length;f++){h=a.length-1-this.field.log(b[f]);if(0>h)throw"ReedSolomonException
Bad error
location";a[h]=n.addOrSubtract(a[h],c[f])}};this.runEuclideanAlgorithm=function(a,e,d){if(a.Degree<e.Degree){var
b=a;a=e;e=b}for(var
b=this.field.One,f=this.field.Zero,h=this.field.Zero,g=this.field.One;e.Degree>=Math.floor(d/2);){var
k=a,q=b,n=h;a=e;b=f;h=g;if(a.Zero)throw"r_{i-1} was
zero";e=k;g=this.field.Zero;f=a.getCoefficient(a.Degree);
for(f=this.field.inverse(f);e.Degree>=a.Degree&&!e.Zero;){var
k=e.Degree-a.Degree,r=this.field.multiply(e.getCoefficient(e.Degree),f),g=g.addOrSubtract(this.field.buildMonomial(k,r));e=e.addOrSubtract(a.multiplyByMonomial(k,r))}f=g.multiply1(b).addOrSubtract(q);g=g.multiply1(h).addOrSubtract(n)}d=g.getCoefficient(0);if(0==d)throw"ReedSolomonException
sigmaTilde(0) was
zero";d=this.field.inverse(d);a=g.multiply2(d);d=e.multiply2(d);return[a,d]};this.findErrorLocations=function(a){var
b=a.Degree;if(1==
b)return Array(a.getCoefficient(1));for(var
d=Array(b),c=0,f=1;256>f&&c<b;f++)0==a.evaluateAt(f)&&(d[c]=this.field.inverse(f),c++);if(c!=b)throw"Error
locator degree does not match number of roots";return
d};this.findErrorMagnitudes=function(a,e,d){for(var
b=e.length,f=Array(b),h=0;h<b;h++){for(var
g=this.field.inverse(e[h]),k=1,q=0;q<b;q++)h!=q&&(k=this.field.multiply(k,n.addOrSubtract(1,this.field.multiply(e[q],g))));f[h]=this.field.multiply(a.evaluateAt(g),this.field.inverse(k));d&&(f[h]=this.field.multiply(f[h],
g))}return f}}(n.QR_CODE_FIELD);E.correctErrors=function(a,b){for(var
e=a.length,d=Array(e),c=0;c<e;c++)d[c]=a[c]&255;e=a.length-b;try{E.rsDecoder.decode(d,e)}catch(p){throw
p;}for(c=0;c<b;c++)a[c]=d[c]};E.decode=function(a){var b=new
T(a);a=b.readVersion();for(var
e=b.readFormatInformation().ErrorCorrectionLevel,b=b.readCodewords(),b=G.getDataBlocks(b,a,e),d=0,c=0;c<b.length;c++)d+=b[c].NumDataCodewords;for(var
d=Array(d),f=0,h=0;h<b.length;h++){var
c=b[h],g=c.Codewords,k=c.NumDataCodewords;E.correctErrors(g,
k);for(c=0;c<k;c++)d[f++]=g[c]}return new
X(d,a.VersionNumber,e.Bits)};var
g={imagedata:null,width:0,height:0,qrCodeSymbol:null,debug:!1,maxImgSize:1048576,sizeOfDataLengthInfo:[[10,9,8,8],[12,11,16,10],[14,13,16,12]],callback:null,vidSuccess:function(a){g.localstream=a;g.webkit?g.video.src=window.webkitURL.createObjectURL(a):g.moz?(g.video.mozSrcObject=a,g.video.play()):g.video.src=a;g.gUM=!0;g.canvas_qr2=document.createElement("canvas");g.canvas_qr2.id="qr-canvas";g.qrcontext2=g.canvas_qr2.getContext("2d");
g.canvas_qr2.width=g.video.videoWidth;g.canvas_qr2.height=g.video.videoHeight;setTimeout(g.captureToCanvas,500)},vidError:function(a){g.gUM=!1},captureToCanvas:function(){if(g.gUM)try{if(0==g.video.videoWidth)setTimeout(g.captureToCanvas,500);else{g.canvas_qr2.width=g.video.videoWidth;g.canvas_qr2.height=g.video.videoHeight;g.qrcontext2.drawImage(g.video,0,0);try{g.decode()}catch(h){console.log(h),setTimeout(g.captureToCanvas,500)}}}catch(h){console.log(h),setTimeout(g.captureToCanvas,500)}},setWebcam:function(a){var
b=
navigator;g.video=document.getElementById(a);var
e=!0;if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices)try{navigator.mediaDevices.enumerateDevices().then(function(a){a.forEach(function(a){console.log("deb1");"videoinput"===a.kind&&-1<a.label.toLowerCase().search("back")&&(e=[{sourceId:a.deviceId}]);console.log(a.kind+":
"+a.label+" id =
"+a.deviceId)})})}catch(d){console.log(d)}else console.log("no
navigator.mediaDevices.enumerateDevices");b.getUserMedia?b.getUserMedia({video:e,
audio:!1},g.vidSuccess,g.vidError):b.webkitGetUserMedia?(g.webkit=!0,b.webkitGetUserMedia({video:e,audio:!1},g.vidSuccess,g.vidError)):b.mozGetUserMedia&&(g.moz=!0,b.mozGetUserMedia({video:e,audio:!1},g.vidSuccess,g.vidError))},decode:function(a){if(0==arguments.length){if(g.canvas_qr2){var
b=g.canvas_qr2;var e=g.qrcontext2}else
b=document.getElementById("qr-canvas"),e=b.getContext("2d");g.width=b.width;g.height=b.height;g.imagedata=e.getImageData(0,0,g.width,g.height);g.result=g.process(e);null!=
g.callback&&g.callback(g.result);return g.result}var d=new
Image;d.crossOrigin="Anonymous";d.onload=function(){var
a=document.getElementById("out-canvas");null!=a&&(a=a.getContext("2d"),a.clearRect(0,0,320,240),a.drawImage(d,0,0,320,240));var
a=document.createElement("canvas"),b=a.getContext("2d"),e=d.height,f=d.width;d.width*d.height>g.maxImgSize&&(f=d.width/d.height,e=Math.sqrt(g.maxImgSize/f),f*=e);a.width=f;a.height=e;b.drawImage(d,0,0,a.width,a.height);g.width=a.width;g.height=a.height;try{g.imagedata=
b.getImageData(0,0,a.width,a.height)}catch(y){g.result=Error("Cross
domain image reading not supported in your browser! Save it to your
computer then drag and drop the
file!");null!=g.callback&&g.callback(g.result);return}try{g.result=g.process(b)}catch(y){console.log(y),g.result=Error("error
decoding QR
Code")}null!=g.callback&&g.callback(g.result)};d.onerror=function(){null!=g.callback&&g.callback(Error("Failed
to load the
image"))};d.src=a},isUrl:function(a){return/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/.test(a)},
decode_url:function(a){var
b="";try{b=escape(a)}catch(e){console.log(e),b=a}a="";try{a=decodeURIComponent(b)}catch(e){console.log(e),a=b}return
a},decode_utf8:function(a){return
g.isUrl(a)?g.decode_url(a):a},process:function(a){var b=(new
Date).getTime(),e=g.grayScaleToBitmap(g.grayscale());if(g.debug){for(var
d=0;d<g.height;d++)for(var c=0;c<g.width;c++){var
f=4*c+d*g.width*4;g.imagedata.data[f]=0;g.imagedata.data[f+1]=0;g.imagedata.data[f+2]=e[c+d*g.width]?255:0}a.putImageData(g.imagedata,0,0)}e=
(new
Q(e)).detect();if(g.debug){for(d=0;d<e.bits.Height;d++)for(c=0;c<e.bits.Width;c++)f=8*c+2*d*g.width*4,g.imagedata.data[f]=(e.bits.get_Renamed(c,d),0),g.imagedata.data[f+1]=(e.bits.get_Renamed(c,d),0),g.imagedata.data[f+2]=e.bits.get_Renamed(c,d)?255:0;a.putImageData(g.imagedata,0,0)}f=E.decode(e.bits).DataByte;a="";for(d=0;d<f.length;d++)for(c=0;c<f[d].length;c++)a+=String.fromCharCode(f[d][c]);f=(new
Date).getTime();console.log(f-b);return
g.decode_utf8(a)},getPixel:function(a,b){if(g.width<
a)throw"point error";if(g.height<b)throw"point
error";var
e=4*a+b*g.width*4;return(33*g.imagedata.data[e]+34*g.imagedata.data[e+1]+33*g.imagedata.data[e+2])/100},binarize:function(a){for(var
b=Array(g.width*g.height),e=0;e<g.height;e++)for(var
d=0;d<g.width;d++){var
c=g.getPixel(d,e);b[d+e*g.width]=c<=a?!0:!1}return
b},getMiddleBrightnessPerArea:function(a){for(var
b=Math.floor(g.width/4),e=Math.floor(g.height/4),d=Array(4),c=0;4>c;c++){d[c]=Array(4);for(var
f=0;4>f;f++)d[c][f]=[0,0]}for(c=0;4>c;c++)for(f=
0;4>f;f++){d[f][c][0]=255;for(var h=0;h<e;h++)for(var
m=0;m<b;m++){var
k=a[b*f+m+(e*c+h)*g.width];k<d[f][c][0]&&(d[f][c][0]=k);k>d[f][c][1]&&(d[f][c][1]=k)}}a=Array(4);for(b=0;4>b;b++)a[b]=Array(4);for(c=0;4>c;c++)for(f=0;4>f;f++)a[f][c]=Math.floor((d[f][c][0]+d[f][c][1])/2);return
a},grayScaleToBitmap:function(a){for(var
b=g.getMiddleBrightnessPerArea(a),e=b.length,d=Math.floor(g.width/e),c=Math.floor(g.height/e),f=new
ArrayBuffer(g.width*g.height),f=new Uint8Array(f),h=0;h<e;h++)for(var
m=0;m<e;m++)for(var k=
0;k<c;k++)for(var
n=0;n<d;n++)f[d*m+n+(c*h+k)*g.width]=a[d*m+n+(c*h+k)*g.width]<b[m][h]?!0:!1;return
f},grayscale:function(){for(var a=new ArrayBuffer(g.width*g.height),a=new
Uint8Array(a),b=0;b<g.height;b++)for(var e=0;e<g.width;e++){var
d=g.getPixel(e,b);a[e+b*g.width]=d}return
a}},L=3,W=57,D=8,K=2;g.orderBestPatterns=function(a){function b(a,b){var
c=a.X-b.X,d=a.Y-b.Y;return Math.sqrt(c*c+d*d)}var
e=b(a[0],a[1]),d=b(a[1],a[2]),c=b(a[0],a[2]);d>=e&&d>=c?(d=a[0],e=a[1],c=a[2]):c>=d&&c>=e?(d=a[1],
e=a[0],c=a[2]):(d=a[2],e=a[0],c=a[1]);if(0>function(a,b,c){var
d=b.x;b=b.y;return(c.x-d)*(a.y-b)-(c.y-b)*(a.x-d)}(e,d,c))var
f=e,e=c,c=f;a[0]=e;a[1]=d;a[2]=c};return g}();
libs/jsqrcode/README000064400000000242151165346440010176 0ustar00Code from
this repo:

https://github.com/sitepoint-editors/jsqrcode/

Described in this tutorial:

https://www.sitepoint.com/create-qr-code-reader-mobile-website/libs/masked_input/jquery.maskedinput-min.js000064400000010352151165346440015153
0ustar00/*
    jQuery Masked Input Plugin
    Copyright (c) 2007 - 2015 Josh Bush (digitalbush.com)
    Licensed under the MIT license
(http://digitalbush.com/projects/masked-input-plugin/#license)
    Version: 1.4.1
*/
!function(a){"function"==typeof
define&&define.amd?define(["jquery"],a):a("object"==typeof
exports?require("jquery"):jQuery)}(function(a){var
b,c=navigator.userAgent,d=/iphone/i.test(c),e=/chrome/i.test(c),f=/android/i.test(c);a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},autoclear:!0,dataName:"rawMaskFn",placeholder:"_"},a.fn.extend({caret:function(a,b){var
c;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof
a?(b="number"==typeof
b?b:a,this.each(function(){this.setSelectionRange?this.setSelectionRange(a,b):this.createTextRange&&(c=this.createTextRange(),c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select())})):(this[0].setSelectionRange?(a=this[0].selectionStart,b=this[0].selectionEnd):document.selection&&document.selection.createRange&&(c=document.selection.createRange(),a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length),{begin:a,end:b})},unmask:function(){return
this.trigger("unmask")},mask:function(c,g){var
h,i,j,k,l,m,n,o;if(!c&&this.length>0){h=a(this[0]);var
p=h.data(a.mask.dataName);return p?p():void 0}return
g=a.extend({autoclear:a.mask.autoclear,placeholder:a.mask.placeholder,completed:null},g),i=a.mask.definitions,j=[],k=n=c.length,l=null,a.each(c.split(""),function(a,b){"?"==b?(n--,k=a):i[b]?(j.push(new
RegExp(i[b])),null===l&&(l=j.length-1),k>a&&(m=j.length-1)):j.push(null)}),this.trigger("unmask").each(function(){function
h(){if(g.completed){for(var
a=l;m>=a;a++)if(j[a]&&C[a]===p(a))return;g.completed.call(B)}}function
p(a){return g.placeholder.charAt(a<g.placeholder.length?a:0)}function
q(a){for(;++a<n&&!j[a];);return a}function
r(a){for(;--a>=0&&!j[a];);return a}function s(a,b){var
c,d;if(!(0>a)){for(c=a,d=q(b);n>c;c++)if(j[c]){if(!(n>d&&j[c].test(C[d])))break;C[c]=C[d],C[d]=p(d),d=q(d)}z(),B.caret(Math.max(l,a))}}function
t(a){var
b,c,d,e;for(b=a,c=p(a);n>b;b++)if(j[b]){if(d=q(b),e=C[b],C[b]=c,!(n>d&&j[d].test(e)))break;c=e}}function
u(){var
a=B.val(),b=B.caret();if(o&&o.length&&o.length>a.length){for(A(!0);b.begin>0&&!j[b.begin-1];)b.begin--;if(0===b.begin)for(;b.begin<l&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}else{for(A(!0);b.begin<n&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}h()}function
v(){A(),B.val()!=E&&B.change()}function
w(a){if(!B.prop("readonly")){var
b,c,e,f=a.which||a.keyCode;o=B.val(),8===f||46===f||d&&127===f?(b=B.caret(),c=b.begin,e=b.end,e-c===0&&(c=46!==f?r(c):e=q(c-1),e=46===f?q(e):e),y(c,e),s(c,e-1),a.preventDefault()):13===f?v.call(this,a):27===f&&(B.val(E),B.caret(0,A()),a.preventDefault())}}function
x(b){if(!B.prop("readonly")){var
c,d,e,g=b.which||b.keyCode,i=B.caret();if(!(b.ctrlKey||b.altKey||b.metaKey||32>g)&&g&&13!==g){if(i.end-i.begin!==0&&(y(i.begin,i.end),s(i.begin,i.end-1)),c=q(i.begin-1),n>c&&(d=String.fromCharCode(g),j[c].test(d))){if(t(c),C[c]=d,z(),e=q(c),f){var
k=function(){a.proxy(a.fn.caret,B,e)()};setTimeout(k,0)}else
B.caret(e);i.begin<=m&&h()}b.preventDefault()}}}function
y(a,b){var
c;for(c=a;b>c&&n>c;c++)j[c]&&(C[c]=p(c))}function
z(){B.val(C.join(""))}function A(a){var
b,c,d,e=B.val(),f=-1;for(b=0,d=0;n>b;b++)if(j[b]){for(C[b]=p(b);d++<e.length;)if(c=e.charAt(d-1),j[b].test(c)){C[b]=c,f=b;break}if(d>e.length){y(b+1,n);break}}else
C[b]===e.charAt(d)&&d++,k>b&&(f=b);return
a?z():k>f+1?g.autoclear||C.join("")===D?(B.val()&&B.val(""),y(0,n)):z():(z(),B.val(B.val().substring(0,f+1))),k?b:l}var
B=a(this),C=a.map(c.split(""),function(a,b){return"?"!=a?i[a]?p(b):a:void
0}),D=C.join(""),E=B.val();B.data(a.mask.dataName,function(){return
a.map(C,function(a,b){return
j[b]&&a!=p(b)?a:null}).join("")}),B.one("unmask",function(){B.off(".mask").removeData(a.mask.dataName)}).on("focus.mask",function(){if(!B.prop("readonly")){clearTimeout(b);var
a;E=B.val(),a=A(),b=setTimeout(function(){B.get(0)===document.activeElement&&(z(),a==c.replace("?","").length?B.caret(0,a):B.caret(a))},10)}}).on("blur.mask",v).on("keydown.mask",w).on("keypress.mask",x).on("input.mask
paste.mask",function(){B.prop("readonly")||setTimeout(function(){var
a=A(!0);B.caret(a),h()},0)}),e&&f&&B.off("input.mask").on("input.mask",u),A()})}})});libs/masked_input/jquery.maskedinput.js000064400000024402151165346450014374
0ustar00/*
    jQuery Masked Input Plugin
    Copyright (c) 2007 - 2015 Josh Bush (digitalbush.com)
    Licensed under the MIT license
(http://digitalbush.com/projects/masked-input-plugin/#license)
    Version: 1.4.1
*/
!function(factory) {
    "function" == typeof define && define.amd ? define([
"jquery" ], factory) : factory("object" == typeof
exports ? require("jquery") : jQuery);
}(function($) {
    var caretTimeoutId, ua = navigator.userAgent, iPhone =
/iphone/i.test(ua), chrome = /chrome/i.test(ua), android =
/android/i.test(ua);
    $.mask = {
        definitions: {
            "9": "[0-9]",
            a: "[A-Za-z]",
            "*": "[A-Za-z0-9]"
        },
        autoclear: !0,
        dataName: "rawMaskFn",
        placeholder: "_"
    }, $.fn.extend({
        caret: function(begin, end) {
            var range;
            if (0 !== this.length && !this.is(":hidden"))
return "number" == typeof begin ? (end = "number" ==
typeof end ? end : begin, 
            this.each(function() {
                this.setSelectionRange ? this.setSelectionRange(begin, end)
: this.createTextRange && (range = this.createTextRange(), 
                range.collapse(!0), range.moveEnd("character",
end), range.moveStart("character", begin), 
                range.select());
            })) : (this[0].setSelectionRange ? (begin =
this[0].selectionStart, end = this[0].selectionEnd) : document.selection
&& document.selection.createRange && (range =
document.selection.createRange(), 
            begin = 0 - range.duplicate().moveStart("character",
-1e5), end = begin + range.text.length), 
            {
                begin: begin,
                end: end
            });
        },
        unmask: function() {
            return this.trigger("unmask");
        },
        mask: function(mask, settings) {
            var input, defs, tests, partialPosition, firstNonMaskPos,
lastRequiredNonMaskPos, len, oldVal;
            if (!mask && this.length > 0) {
                input = $(this[0]);
                var fn = input.data($.mask.dataName);
                return fn ? fn() : void 0;
            }
            return settings = $.extend({
                autoclear: $.mask.autoclear,
                placeholder: $.mask.placeholder,
                completed: null
            }, settings), defs = $.mask.definitions, tests = [],
partialPosition = len = mask.length, 
            firstNonMaskPos = null, $.each(mask.split(""),
function(i, c) {
                "?" == c ? (len--, partialPosition = i) : defs[c]
? (tests.push(new RegExp(defs[c])), 
                null === firstNonMaskPos && (firstNonMaskPos =
tests.length - 1), partialPosition > i &&
(lastRequiredNonMaskPos = tests.length - 1)) : tests.push(null);
            }), this.trigger("unmask").each(function() {
                function tryFireCompleted() {
                    if (settings.completed) {
                        for (var i = firstNonMaskPos;
lastRequiredNonMaskPos >= i; i++) if (tests[i] && buffer[i] ===
getPlaceholder(i)) return;
                        settings.completed.call(input);
                    }
                }
                function getPlaceholder(i) {
                    return settings.placeholder.charAt(i <
settings.placeholder.length ? i : 0);
                }
                function seekNext(pos) {
                    for (;++pos < len && !tests[pos]; ) ;
                    return pos;
                }
                function seekPrev(pos) {
                    for (;--pos >= 0 && !tests[pos]; ) ;
                    return pos;
                }
                function shiftL(begin, end) {
                    var i, j;
                    if (!(0 > begin)) {
                        for (i = begin, j = seekNext(end); len > i; i++)
if (tests[i]) {
                            if (!(len > j &&
tests[i].test(buffer[j]))) break;
                            buffer[i] = buffer[j], buffer[j] =
getPlaceholder(j), j = seekNext(j);
                        }
                        writeBuffer(),
input.caret(Math.max(firstNonMaskPos, begin));
                    }
                }
                function shiftR(pos) {
                    var i, c, j, t;
                    for (i = pos, c = getPlaceholder(pos); len > i; i++)
if (tests[i]) {
                        if (j = seekNext(i), t = buffer[i], buffer[i] = c,
!(len > j && tests[j].test(t))) break;
                        c = t;
                    }
                }
                function androidInputEvent() {
                    var curVal = input.val(), pos = input.caret();
                    if (oldVal && oldVal.length &&
oldVal.length > curVal.length) {
                        for (checkVal(!0); pos.begin > 0 &&
!tests[pos.begin - 1]; ) pos.begin--;
                        if (0 === pos.begin) for (;pos.begin <
firstNonMaskPos && !tests[pos.begin]; ) pos.begin++;
                        input.caret(pos.begin, pos.begin);
                    } else {
                        for (checkVal(!0); pos.begin < len &&
!tests[pos.begin]; ) pos.begin++;
                        input.caret(pos.begin, pos.begin);
                    }
                    tryFireCompleted();
                }
                function blurEvent() {
                    checkVal(), input.val() != focusText &&
input.change();
                }
                function keydownEvent(e) {
                    if (!input.prop("readonly")) {
                        var pos, begin, end, k = e.which || e.keyCode;
                        oldVal = input.val(), 8 === k || 46 === k || iPhone
&& 127 === k ? (pos = input.caret(), 
                        begin = pos.begin, end = pos.end, end - begin === 0
&& (begin = 46 !== k ? seekPrev(begin) : end = seekNext(begin - 1),

                        end = 46 === k ? seekNext(end) : end),
clearBuffer(begin, end), shiftL(begin, end - 1), 
                        e.preventDefault()) : 13 === k ?
blurEvent.call(this, e) : 27 === k && (input.val(focusText), 
                        input.caret(0, checkVal()), e.preventDefault());
                    }
                }
                function keypressEvent(e) {
                    if (!input.prop("readonly")) {
                        var p, c, next, k = e.which || e.keyCode, pos =
input.caret();
                        if (!(e.ctrlKey || e.altKey || e.metaKey || 32 >
k) && k && 13 !== k) {
                            if (pos.end - pos.begin !== 0 &&
(clearBuffer(pos.begin, pos.end), shiftL(pos.begin, pos.end - 1)), 
                            p = seekNext(pos.begin - 1), len > p
&& (c = String.fromCharCode(k), tests[p].test(c))) {
                                if (shiftR(p), buffer[p] = c,
writeBuffer(), next = seekNext(p), android) {
                                    var proxy = function() {
                                        $.proxy($.fn.caret, input,
next)();
                                    };
                                    setTimeout(proxy, 0);
                                } else input.caret(next);
                                pos.begin <= lastRequiredNonMaskPos
&& tryFireCompleted();
                            }
                            e.preventDefault();
                        }
                    }
                }
                function clearBuffer(start, end) {
                    var i;
                    for (i = start; end > i && len > i; i++)
tests[i] && (buffer[i] = getPlaceholder(i));
                }
                function writeBuffer() {
                    input.val(buffer.join(""));
                }
                function checkVal(allow) {
                    var i, c, pos, test = input.val(), lastMatch = -1;
                    for (i = 0, pos = 0; len > i; i++) if (tests[i]) {
                        for (buffer[i] = getPlaceholder(i); pos++ <
test.length; ) if (c = test.charAt(pos - 1), 
                        tests[i].test(c)) {
                            buffer[i] = c, lastMatch = i;
                            break;
                        }
                        if (pos > test.length) {
                            clearBuffer(i + 1, len);
                            break;
                        }
                    } else buffer[i] === test.charAt(pos) && pos++,
partialPosition > i && (lastMatch = i);
                    return allow ? writeBuffer() : partialPosition >
lastMatch + 1 ? settings.autoclear || buffer.join("") ===
defaultBuffer ? (input.val() && input.val(""), 
                    clearBuffer(0, len)) : writeBuffer() : (writeBuffer(),
input.val(input.val().substring(0, lastMatch + 1))), 
                    partialPosition ? i : firstNonMaskPos;
                }
                var input = $(this), buffer =
$.map(mask.split(""), function(c, i) {
                    return "?" != c ? defs[c] ? getPlaceholder(i)
: c : void 0;
                }), defaultBuffer = buffer.join(""), focusText =
input.val();
                input.data($.mask.dataName, function() {
                    return $.map(buffer, function(c, i) {
                        return tests[i] && c != getPlaceholder(i) ?
c : null;
                    }).join("");
                }), input.one("unmask", function() {
                   
input.off(".mask").removeData($.mask.dataName);
                }).on("focus.mask", function() {
                    if (!input.prop("readonly")) {
                        clearTimeout(caretTimeoutId);
                        var pos;
                        focusText = input.val(), pos = checkVal(),
caretTimeoutId = setTimeout(function() {
                            input.get(0) === document.activeElement
&& (writeBuffer(), pos == mask.replace("?",
"").length ? input.caret(0, pos) : input.caret(pos));
                        }, 10);
                    }
                }).on("blur.mask",
blurEvent).on("keydown.mask",
keydownEvent).on("keypress.mask",
keypressEvent).on("input.mask paste.mask", function() {
                    input.prop("readonly") ||
setTimeout(function() {
                        var pos = checkVal(!0);
                        input.caret(pos), tryFireCompleted();
                    }, 0);
                }), chrome && android &&
input.off("input.mask").on("input.mask",
androidInputEvent), 
                checkVal();
            });
        }
    });
});libs/masked_input/README000064400000000400151165346450011044
0ustar00Used by the field element.

From:

http://digitalbush.com/projects/masked-input-plugin/

Github:

https://github.com/digitalBush/jquery.maskedinput

NOTE - renamed compressed from .min.js to -min.js, do our script helped can
detect the compressed version.
libs/mediabox-advanced/images/80.png000064400000000222151165346450013240
0ustar00�PNG


IHDR��
gAMA���OX2tEXtSoftwareAdobe
ImageReadyq�e<$IDATx�ba``8�@E��@e0jਁ��8j�P1
����c�IEND�B`�libs/mediabox-advanced/images/loading-dark.gif000064400000027572151165346450015347
0ustar00GIF89a$$�&&&666GGGVVVfffvvv����������������������������!�NETSCAPE2.0!�
,$$�  �di�hj
j|Kd/���6F��HG��(r��ѷl.�Ɨv��x�M܈���|_���0���;Uxؽ��
Eޞ
wxf|ro{&vv	G�o�"��G<�����
�:���%
�������"

���"��"������#�
�ğ��f��ϻ���
�����"��ذ,�.������<���-�P��`�q�ZH��y�Ѣ�BZ�$�N@�
EԨ��D
{��X`��
6�Tpल�,�
@r���i3@g�%�L�3�6-[�j�%�K�>E��@��(0��J�&p��װS�!�t�V��5`U��\��s��\�z�k�0�X�"}LyD!�
,!"� 
�$)EAe붆E4�����̵����H�d�=��[F�N������lR��'_	�@��.����:vh%}a^/w�$��	S#�x]

�
��h�9��
�S�,	��$��,
������������¸����˸��<���7����������������G��
�C���Ǣ���
�� 0�!�-H<穡Æ#Hܨ��B
Uɪ��
h$�xd�ȑQ��LG�t)r�X��Jq`�.���*Tp@�ʟr��j��Q�xU*U��XڒkԩTT
;�SrxU������NL�k�؏���+�#!�
, !� 
���<P���Rd,��Fi���;��)�v��'C8�E�w�`���I��

��s:�P#�@(Ā|�<�q�V$u
zg
~?W�c��y	L2��4��
�3������4�0	�
����V�����������V������Ƶ�ɂ�����������"�
��"��������	
��������	rU@��z<V���$H��A0�7��DGd�Hr�;\"Hp@��`���6m8�`��1g�`�͜:w0��O�=�y
�ΦN��3��եM��$z*@��J�2kZi���l<qd=�!�
,""� 
�$)Ae뺅�<��Ro�����G"0BڰvD.XL@:�QmՈ#A�"Pn�[�(v�Cc��2�C�qd<K-Nst
�#w�-
�
�%�?����
Y��$���
��?�#���Y��{������K����<ɷ	Ú�,��
�Ӌ�����?������"����������
�������
&r��)���Cv���a%�ШK�
C�˂�#>Bv^L�䀗}l�0sb!1`e�<2�SA`@ї;I�y
�Rl4J��Q�/`����Ha���K�x���dU`�2��Z�n��E�bڻy��]��쀯m���Ԯ[ɓ�B!�
,""� 
�$)Ae�E�<4d?K�<��a�E�ĮG",Aa
�#S�:�B��zD0�w����N��`��
K%N�v
�-n
:�#�u
�-	;���f[�.���	���>$�����#��r�"��
�ɼ��"����$��
���ֶ�"�����	�Z����
��>����		�����_�fLȧP�	�#�p��%
FD�c�ǁ>�у��G�$r�Yr��',^y`LN��ɢ��{
�K!�Gy6+`�P�Ca.Tq4��/0u�ԀWV�R�z&\��;iٞL��Z�m
�fg ���ػ*@RD�5�߼��UűD!�
,! � 
�$P$��>�(EP�sp0��PE��6#,�ܪ勸Dҭ�K.!�_dAD�Wu�xY�6A�����q8$X5�[2.�bcC$6zNP#
�	�4js$��_#	N
	C�l����#��
��3a��52�
�Ƕ��#��|�%�
	�0�4��޿څ��	����������	�	��������J��q�A��	���A:�<-(�`���0qD�t\)�Hr#!�]��H��K[B�1p���d��0�d��(P�@O�:���Y�@͚B�%@ըўG��TjѪ����i@ԡR�ZU�@�S�^%���ע_{~	!�
,"!� 
�$)D*�l�	�8��4J�<YcH{�b�#��x|
���Ȱ�
�V+d� �����Ύ�k���q��C�8de�f-
j�jL$s��%���	�-���
�jZ"	��u"��|����LO���Ze7
	+����#i	L		�½��L��gʏ;������<���>�	�	Y�#������@@��|��
,HК��E����^:��P<��a�l�"��C�ŇBmj#Q����=��Lً���8B�O��X������\�����:�O�J�6uA�Q�SS��Z��&O�N
��Y�Ky����@[�n���.޷'��H���جMB!�
,"!�  �$P
Ӭ��(EP�t`,���N�4�6P,p8ݪ����1��=�D����#2Ųf�Hj0����`@(��$ҝnb13iiz%	�nA^
��B"
��r^$	��k"���}����"	��	��{�_����$�"	ú�$�i�	�%

G�����ܵ��O�������P��������r�$��9��b`��N1��ň�ꉴ׫����h�q�t0��6rʓ0�lD�f	(s�[W㚀vHI�`@h:u��J���ZM��:`݀�S�^娕�W�쨎%!�,�ug٥mǭ�[�_�R�w�n׼i��k,!�
,!!� 
�$�,�4+�)�b`���6��7�m6H�������$�b1=�V��c{���i������#1������Ph�HAL(�aa03
jyO#u�aBC
z���	�~	^$	�|��]����&	��2����Č�#��κ��$�ʎ���#�����	����[����#��	���@��<
�#$�
UIl�p��z�bL0@���i��qN�Em��x�$�_�9�eÓr��H���^�,@�����)c�NP	�tfҫKy�p��Q�R�����Q�H�,S/�B%�v,U�Z���.ټ����7b���B!�
,""�  �$)�0e�ı�S/	�<
��(6��îG$�!�h<6��Ψk�A>0
�g�K�����^K��8��r-	�j
K$p��Y���
	�.
�����Z"���>���f�>
��K����#��{�������J�"��������+����	��������y������;g�-���`�
����{P�I�`G�@���
Eq�ܤj�K�D~���3g�h	�e��8	�٣�K�-
t��P{�@!�i��f����)��8!�l֭Q{�b,ֲ߸"m�E�o�Ɲ��D[�f�4���V��|���*!�
,!"� 
�$)�0e�ġ(K�0KB���͆c^o4@(���h�KQ
��n�j��8,
�7:���d�UH��O���0��f%Miv:J#c
�$�	vIK	��J��Y#��s����"
��,�����
��u���#���֊����յ�#�{X�#	����������zz����맇ٽ#0*`��Aw�hH��
P�c�X�@��;q�p7`Isp���^u�h��#�l�`PA��Q�(Bfa��Σ)R(-�4Ӡ.DU��կ`�6%��,��+v׮Ҧek5�۸r�
�,-^�k�Z��W�����"!�
,!"�  �$)C�l��"+� ��A�$3�b�
.��hp����᰸(E�J`F��"�Z�,j7���L
�B3,7d%g�Z9,D~
�$���HJ	���IL�gW#��q"���#
��+�������z��V�#��xx�I���Ϻ��$��x��"	��������y��������D��G�
<�`�C��
`��$܈/��("D�Q�(j�pШq���4���%K�0�`��@$�L�"����ʹr(�-VH�GW��@q�*կSET5:Eѭ'
��u��\�vU˶��W;��][7챴s���660]�K�!�
," � 
�$0I��J�A)���*�.�bij���r�o�K�b��)�F���Ec�z�.��Ó@K����C3�
�L`8��02
vx%�~~?]	x

@"��]$���z"}}��$��
�@'���������}N����������ʧ��#���qq��"����#�����"����!�@��2�Ơ
�n�"b'B�c�8@�C2!
��n�rX��2�'���lA˖�d�������9�g��nB�9"O;2K4-����XE�U@�1�6����
P�v�*��دx|���+Xi��:qn]�n�M�6p^���6<UF!�
,"!�  �$0�$
�CP�t@���*��(�&@R���S�%��T.y�l��)R����T��8�f,�Y��c3gYvO$�|~A]��B"'|�]$�
j#����	���B���%�

�_���#��
"q����
��ț�$
��1��$�����������"�����@x@0ޮ������1J�&N��e��ў�/.�N��Nv�BKQ&N�L�i�ː�lԩ��������LHQr�%T��"M*mH�����*J��R
�ٴ�U��V����PK��
�,�
�f��;�-3pU�ׯ%�>���x��4B!�
,!"�  �$�l�"#	���q3["�
&��H`����aQQ(E���٦T� ���n�^�.3�+���x�g�Kg�M9,	n|�V#���I-�|I���W#��p"v������+wv�������0��$�

Ͷ�����=�w��$

������#�޵���
�=����(����!x��&�m���&l@����؈O�,
�Iw{x$�S�L�bA˖u�L!�."܄��Dϙ>�XA�P�O=���M��p�J�UÒ\20�S�,}�*vʼn
�6�lX�c�4���ݶc	$ڴ�(�������ἐ{pL�\!�
,""�  �$�
e�CqH�$�1�o��v�%�^�$((��;Z���)R���b\�ƸP��x���ٙ�xY��P,�-MNt:J$b|~X&��eKc���M��Y#}�$y���"��<x����~����$��	"������?�x��#	�
+���#�
(����
�I�������)�"
��JA0�bA��6"Jd���
vHt��U
��(9x@R�*Nx�Ħ���J*���*p>@�d�Pܼ�ӁAV+�N���Tb�U1
0�
u�͎/T^�u���\�F]�'V-6�v�-V	ȅpR�[&�Up��J
"8HP�߈B�!�
,""�  �$��l�
�aRư�|0�8�
AD$ޫ
�h��!P�Lf%&�	ER�-d����x�s�@�3��B�"�ff*-Fy{
%u�fV��;"0��V"�
o#���#���
;�u�&
���0��U�#��	"Ż�&��>Ű��"	�*Ʈ����'ٽ�������������
�
�)(��
�*���P��9Dl�@�	~}��c��T0��I��;rZb֐$�b�t�`�ȑ�,x!���.�t�R������
KX�0�!�Ҟ�\��kŠ��tAN�&̉
K�jES]p��m�
�qEР.�A�
@�`m*zK��T!�
,!"�  �$B�l�
�!G}��P3�
A<v/����Ĩ)�-��g��w��ֶ��7I/�ᰁ�N��Q��.(s-\\v	
&a||Tw�v:=qm�T"
�

#���z��
+����z�������
��ú&���(¢S�#�ѵÀ�"���)���(������ݹ���(��"
��9���w�߉o2P���	w�H���Ã�4p0����u%p@��`zh��@��%0h�r����Y�b��"ف����x�L��f0"H��4�N�H&
��T�U$e��"��T#}p���ЪE���.	��m���5B��"!�
," �  �$ Ea��aB)�@
�)۶GOд��@��T����"N�S؟���X�+[r�)a�.*�	D�,��DA`Fc�	%vCx�N�	�	{#�lMN"��t"���$��
	��6������Z'���#
��"������6���%
�1�6���Աû����?z��$������"�?��پ	����������?x	

��_��֘h,��e�h��LJ
r}�X/�>c>�����@�e��+	Q�
�J<Z3eʄ@�d�iS @ Zԁ�TjAu
U�ԡj"�4A�h�z�sց�\�~}��嬲�v����!!�
,!"�  ���l�
CA�Qӂ�(1�7��04v�����lB!�C���Z<x��6Xf��.\p��M_yY��x1	5�V-CwxU"|oeHxx	x�<0d�H���m"�����	�	+(��H,����)�,�
�)���&�������
��)*��$��
�'�$��'��#������"�
�ؿ�	�����<���
0���?q(\0Ѐ�t",��]
`�@��.P��hBA��+l&��8��$G[0R�
��xA���њ';"���O�.]>xpi;8x
5�ԩT�6(��׮_�m���h�Bx07l�cH �*�+x�	
0H�!!�
,!!�  ��
(Q�!�p<瀶la�!���ͦR�x��o$oF��w0K���LE���'�6��A�I[p�D3;����8
�"ukj�@q~t&�&Y$}��L���3�	x4�����	X���0��		����0��	��x�$��
����#�
�ɢ�#�����"��	���
��ا����/���
�����������i
���A1��+�A���@���)�ddPk��f DXP
F�6mjT
ՂbF�*�G
���p�H�1!@X@�ς�9wf�grP�B�>x�A�:u&XB�iTS�VE���PgF
K+��(�����
@Р.�����J�?B!�
, !� 
����l[��@�D1n~ƄLۅ��0Ƚ��oWF��ՂB��Pt��*��n	��T_͆CM:I�H(k���q&)x�:r��$�jF$��t���u���*���"���(z�"�����"����%	�	+��%��*�#	��������
	�
�-��	���
��1���
��
���
�
�	
DX��>t+0��a_�,��o��P6T`�E�(��c@���`	0��eK���P�M�1Ƞ�ː!�XP3�>pࠁS�.�KC���K�6��Rh�G�*�ʴ�֞���*֬e}6@�1
��o�2�XWD!�
,""�  �$�g��l
�@�s���9�1���:	^<��,lD�븋�hA��0
�`�R�-po_p2<К
�s%��Y���G^zqs()Qp��&�����PR6(�&���]9��%��9R��%���)��������$������	�	��+��ǝɲ	��]F2���~z

ؖ	
��"	���	���	��U&@�@�
d�K�������[q@]BL@x8R��p,X�6#@���@;V2X�a��#g�|�@Q
�ܹ�%�"d
%Jԁ�
dU�t�>4
�R����K�22
��ղ\w��r���p�((K��zV�bU�W܈q��,!�
,"!�  �$�0���pl�����|���
�ӽz�-�"
��9S��]a;���A8�n
]�i��	���Hb�����7��tTr}i&U'Tu|��/��%��I���"���"t��"��G������%��b`��#��}�����9


�#	����Ԩ��b�ܵH	��"
�Ӿ�������	
�" D(P����%��`A+P@��?I
<Ԩ��	-F$a`�@ e4X�؂�
T$#�F�r:p����/eʤX/F7u>���
�yΦΝ�8�*fQ*r.��T�S�
�yB�4�֨/�%�3�f�FBE�.*�!�
,"!�  �$B*+�pl��:�8���y
�7�^����Z�n�(�
H��X���/����7|=�VRtYz���A!�.��&�V"z}kJ���"��s=�$��U���$��"@��$���{;�#���

	~�"�������������ˠ�	��+�ڢ�@�t���"�Ѩ��"�6U
�A��JՃ�P�	����E	��0�@W�]�0|@��uj(��FK>hp奕8;&H#AI@4h�`����r��#���A�2��k�U�+�5�	���[T�^M�@�ƨC�N]PUA.^��U��킚�Z��k5���V�1�0�!�
,!"� 
�$�Y��,̴��/,σ0��[+���|��
G,�zI€
���'�'�Q��Q��΅*.�,���s�[�B�
��hzR#1usB��'iu&z�U

	�}���
�}�����,�����	�+����%����$�����"�����"����8���������j�
8�)
$|�@A1	�H����FH�AG|Dp���	�o8�ѣ�%,�<ɀ��
��ȑT	�'m��A��6*X���>
f%Z�������Y�E��]`�V���ʀ�X�L����زW�ȸB��U�n�nDE���
!�
,"!�  �����
j�&���0�p;zδۀ��Ԋ5h6E�:o����Y���"��e�3L@�m�;�&�	%D#ahEGuvd;c#b�m"�
�$w�d������x������������	������"���ţ���}�ٿ��6������'�sQ��"�Ӥ����=h�*�<�R	p��yC؏Dw"������3����{8q�8�
H�n�<�`��2�l	2U�0`��A��<&P���Ǒe�*�(�
�2e�ӥ�Zt�Y�
���зeϦM�4��x��E��f�gY�fM����N�QI"!�
,!!� 
����p�lkh��B-����,۷�F��h��`��1�E�	�������:�`p�T�8���LCa�H�0l��0a@
!�rt}B"y`{A���${�;�o�||�;��%���q�c�"���r�%������#|���������"��	��������������:p��;Z
p�a�q�8�ؠ7W�
����k�AÆ�`|��Ƞ�H!�<i�M�-0XP�E2�09��:u.ع�$�*s�-$@�t��
�*H0v�T��\@���c�R��UH��L߆%+U*��B�~�o_v�xW����&kd�!�
,!"� 
�dg����p�΢����2-:.��D�!��v�hp��@�����H��ؑ
�n͢8�
b1Dilu�^��#|/l�$}b
G5��u}�#x�m��n>��fV��$x����u�"������#��Y��?��{����Y����������������Y�
�������϶���=z
�Z���4HH1��|�H0�AB%�J8p�@��jz0�r%��"L�4i�G��+0PPSE%I�P�$9(U��xBH%Z2��t*]��i	
4h�l���X�S�(�UAW�`ݎ�j��x݆݋
�/�_�~
{�07�
�9"!�
,""� 
�d9f��(��*��/
�\����ʽx>Q"�|
�(O�Rg
&�(����x��2��f�����,��շ�pD�Z_)loP$s�
I4z�{"��"���-���I��8"���#�������#���������NÜ���հ�������������U
������0��I���A���B'�2X@	Ҵ0H��Ǐ�6��(P�Ǐ�x�
`�eF�*}\@s�$0p��T��(
‡���G
�I�@MBH݉�(��;��A�4��`
�ziF5�zUV�زI�(�V�װo�`:��W�x�@�l:����=Px\�r���!�
,!"�  �$�h�����xƫ Q���Z���E
��p�\!`{�Z�=������\nB����!d~�A�%^
8�iy(p�$ss
N2��1���K�Y���B��'
���$�������$�������#��
������Ӯ�?���
�
����������
�	�������B���c��0$���@��t�8�@�.�x��„
G �Hr�H

xP,F�Ɨ
L�Q��J�	���@�%}00�f���z���"����-j3a�K�6M��_��i����&h���װc��B@-[�^Ŏm��Z�m���K`�
�m��EP�p_q���;libs/mediabox-advanced/images/loading-light.gif000064400000026170151165346450015526
0ustar00GIF89a$$�  
KKKlll������������������������������!�NETSCAPE2.0!�
,$$���I��8W��bZx-H1���l��
���jI<˄zg�AL7��.���H#XeM'`�8Rr֘@�$��4ma„�6P�ؔ�U2kjioo}O6!x�M�����7�ln�&�G����?��l	��v7�����^���
ïŌ!Ҵh
��
Gҿ�
��'�-���b?�
��
�(f�
���˧�4��!����$2
��!�Eo�*0�FHn#m,^�v����4H`C��	��!�������3�K����
�g>R<q�L�a#�P_�th����^(&�������Ϙ`�*�f�,Z�W�L�����g�SWR�_!�
,""���I'S(�U��RCYʧR�A��@ܪ&�2R��NW*
�aN&����� �e
�\.��B
jG]aF#�6jH06�'E�Hlzno#�?`"�[��
T��o�R`���o���w�T�M���a��	���	��M������zHywT
�<��x�jϿ<�Uxy͔�0����
��&)�
��a�|2���ĵ3��@?
(��,�=|4a���B���,ȇOԛvW$�I�I��:�<��%�V��i0�!�-]��1�Ʌ���I4�̟�l�(:��Ņ@�
�`��S�P�}*ɕ�ׄY�QJhU�E�b'�$!�
,!!���I'[	������`�C��l�$!%jtm��s�
�#GAb=����#�$X������b��u08s�o	
_�3�Q��a��g$ZO0vxb\�a[�#�a�9C�.��+����gN�������8�ß~�����	���rOÞ
�'�\Ԟ
��5���C�0%���]��4����C�፤�ȧ�����lqA��&�$8�����m�)ظ����SF�B�����[YA�����ܐR�3a�K�!J�+J�I3E���ka�'J)���GD�S�V7JU���S�Z��[��ؒ,"!�
,!"���I'[)������P��P�2GA̧�ެ[%2]��a��

���, Z�Xr6X@
�"��#I�j��@A���%3z�CA?�n	<	Ezze
mxyzVDE:	y{���.�����/�$���
�)��.	�U�-�

��)����7����
��T�����=�݃������
��H�����#{��`�C�(NjZ
�C�ʸQ���Bw�:<���T�y�5�˖r��%�5а�&<}*_ZTh�C�h��P�O��r})2dB�
9)ʴ�է�M]:�jBgBVul��8E!�
,!!���I2�h2�9%�sd�ƭH�I�n]=��R��Ϛg�5z>BF�M��#]0��	p>��[ᰀ����~��"$b�w�VpH01oeVxLU#]~$&w��/vs/	x��Ft$��	F�%��Z����C��/
�C
�!�
��5�Fȸ���t�H����'J����
�2��	�=٤�
����#�W��0XlB��B�����C��VN�.P���qK$9򞿑
8r��ɗ�&&L��#ď�^��s�}�PҬ�rcǛ8�lZt�Q��c���ը�t�z�a�?iE!�
, !���92�d‰9%����֭
9&h�m�@�6�Nv�+�m`�!
�� 4���tP %XlA
`2��`J)������N�8A9>W<8�WpQtww[]:$p
!%�Xc�.O��
W�7c;���vR��
$vvQU���G7��������*Ͷ�3���
�G(��<ڋ��!�%ۉX��V�Y�ў�
	���%"��عx����z	����s�%T8���^-��#D
F&&����H(7r�h&a=��&���`C�'Q�̩�!�8u^��c͆
��Ri�a�k�f2�H鎍D�Z-��X!�
,!"���I'[)�U��LbEA�a
��6I��G�N�X�%�-5 
v
�HF3��E�+����V+��Gt0�
�@v�����+�����^�Gv$]y

=~�E�w���o^b���:n~]E-
�q�H�'+��7	H�m	-��)�#ȍ��A�э�<�N����V�.
�1?��J���	������
���!�A3�
K�JA��8!�g�a�B�V����xV�qiMC�u�6X`�2�?�(�9��
�����&M�i.��r���2e"�r�P�C�^`I拡P�N�juDž�R]V�w��X���D!�
,!"���I�R)�U��LrEY��0_�
�!���K)�\�'���5�Q�,݆"I%��;��H)���v���;��|T��j-
��fEsrfv

<{{�cr�	|�ffa�00^,-�v�,q�'�F�{�Q�0'�F/��/��4���m/�3��ZI��S4��I,	�=������.����0I����w��.�+����{��,2vX�A�y	S�`�ѣ�����1]�}
/�����t�\���c���$��ù���t�Q���@q2}I�aR�S��K�T�׬N�p��S"<��"!�
,"!���I�R*�U��LrIŁ0_+��h�%j�n��L�(BA�Ƚx���
9�g �������bz
�؀Z0z��y48��@^��cc~u


�jz}	�#\m	y��`��A,-Y��f�
�*$B�.�zuup	��(�F
��m��c%p�
����0����	ք��	�u߾	I�j^�=�4�
!�;<��Q8�^%��y��&�2HT�b�=��cP��X����q|wrC
l�TD�drb̹'����:�gρ@mZ
j�P�32mz��̨F�5Ez��V��z%h�f�!�
,"!���I)S*�U���q�Q��|����X���V��Y��B�&Q�D��+���4��A3H
X
"%�V�׀@�u���xl0[��u`/�b�\A

!{|N]	�c@B{lfp���4+,k�~��K�D��p	�%�D
�U�.�b$����U��H��
Ϫ�	�R��	�UU�/c����s�������
j@7@E�P��-�R�v%|7m��"V\����DT"mܸ��RV3y^J�ZV�"�i���₞|N�ѧE�G���ϧC��l��ԥ+���9��V��Bz�JV&֝hYD!�
,""���I)SX��;��a��1"��JIx�cl��Z-oN�F�	�D��t2��p�)F��0T��v�T��C�@�Z����,�.m������$Z-b[

wwzk)
�!J�	v�ddM3��Y���	%�B�����$�B�jdC�.}B�TT)	�_��θ�	ԁ�,��j(_�����`��X�o-�
	����HܸѠA�5!�n����EQ�l0@P�
5�Y��6��
�H�C���aiJ�(�ɜ)�&N�83ڜ���Ȣ)��[`�)SPIm��U��*\��t�W�X�f�pUj׳c��M�j�!�
,""���I)[J�U�
Gy'�0_+�i��a�n���\�6C��ȽFH���
9�g
�A�-�E"�	�V�`�����|�
i6[h�EccfBC	|~^,
��C
	�xx`�	�	4�l�w��b�L�-�h��tF
�Vx/��#�}�,H��й�R��	�WW��rP�
�ZV��*����bc��i�2��k�
��2�Ȇ
��&���6�����5X^H�����-��c��Ç'�%02�v%sn`0+��X
X�@�!ў �ps$ϧP���!�ӒRY
m��i�v`�6��u��pe�)�6��ToѾ�!�
,""���I)[K��;g
��a�	㭒��"y�F�V<�q��M�H�^0�D�B�ءP
�B�=��F#�[�^X-���d�-����(\.cL	
uwz�*	�&>
	vuTT^�.2��x��
�1�C�YY���"�C
	�VU-�H}��e*b����Y
�G��	�VV)a����.��
�WVN��������/�^��2�ς�4�c�N>CFKw@!4b$0�x�_�^���K~;�R���%u#s>��a�k6�����C2�&fQ9��Z0�&K�Q�"�y�U�����
YŲq6�zPվ�K�n�!�
, 
���I'[K-V��W��r�H�"�c\�G±���i�'�A�[�v��x"V�c�i(֦�
�d\�D�j�!��%���K8�u���(�aL
wy\{7_�>D	wi{m_16,��Uq7��e��/8	��)}��WVG��ƣeʩ��
Ƽt���tʎ�fܧ�
��uX�ͷ������H�={1|;�4LID8l��<��T�N��$��G��4�s&M��&K�c��HD�@ډ�Z]75V�@��Q��F�P�'D.����BM�G5A�ߪ~��!!�
,"!���I)[x��;�I���Q&��NK�""iɶZ����[���H��q#�B#��0��|����E?i�@
S�ڏ��=��d �v�7�C(
ssvY6z]<�
rsRSL,�:7�T�6�-:�[�TT��.�+	�cS�_AB�Sc�^�7î
�z]�+
�pxȍ������eL���	������*��K�z�����AuH�#���x�
[@b@��`&8Ը��D�@�
��%V�C����8+(pRa!9�*��̟2	�ِ%G
2�o�r�*`U�P��r���@���
e��@��d=(�"!�
,!"���I麌��+[J��"2*]*�I���)+�:1J���>�
�ӽ`%p�[��@���XDr*�SCalb����RDŽ!�-�-�\�Dkdqsu5
z$
r�eZ+�GB)��S�9-���U�~E�*	�~�E6�bb���6 �4����
d	����ܤ���cc���������*�؂���G�Z�qƌ�cL݁�s���_D(��Bne�h�M��$�U�x���#�.m͙��^�.I��i	͋~u�	!��6nZ�D���P�j��*=�~����lE*��l��h�vB&�"!�
,!"���I)c����UJ"&	v����H��0�ņ�X��!�
�b�ʉv<_"%\���!�DP;'f����J^zh"�
�S���F�J����8�	b]>4{u.
�^fAv85q_�B8�L��ScAY �5
�`_�N�@�`��h���3�i�@
о	4����K���aa�A��
��bb���o3�����
�6/{���,��@�g�E���u[�i���#��<0@P`#��"�1׫�8a�dD�C�
|2�$�I���5�sSѣ��Eթ&�
L���QO�|Jq��K��ͦ�� !�
,"!���ISX%���`2�Rf[�*��^剩	Rߋ;.|�i�Ц��z&
q`��e3Q�:Q���RE�c	[����H�T'lT
�5�ٚX�<3,.iy\O_FI9E
iM���t���_-�<}�
��M�����ggF
�$��\\a��
hh���Ⱥ���������#�ԩ����ѧ��j�~����i}�ѽ��1@����!��N����`���x[��J�
T��`ɗ$G@�ga��#aƜ��Ӂu�0�\��g0�����U��)��t�S6�},Pk�O�V�D��+�n,JX`A�"!�
,!"���I)���]�ZJ�$��p��|
(�I|�ۊe#�L���)R�+�C�h�@y����ɕB��E28*:h��	}�'N�i0���
E0�qw.jj\U*,4
O����H�kh�v�W�4
h\*vI����������'�q�Ǔ�tp��p�z��������
���G����jjo����������a�	`���;cV�d��:�%���-$
�Kp!��|]��T����\2d��$���ȲfHZ�T��!A��V&Ė3�%�5fA;֋��T��V�t@S�N+!p��1lU��j�N�R�V�p�o�4$�E!�
,""���I+����]����t��c�*ənön��ڶ��Ku�OtL
�M'u�2^F�q����Ն�>h�!�h�A�#���Z����4h]OanU5>��O�}t)��\Zo�U>��	*���\h���]]2����w����w��ε
Ҏh��
��i���
ӄm������������(���H=2h��
�o�P
���`@�L�]�((@�I�%9v�8h��h<i2��W�
h7a��Ҥm�	�cNR;S�
�4��WP��p��6e���<�j�U�X�e"JALeh��vn�5d9D!�
,!"���I)k���[࢈
gJ����.��~,���鼶���[�p�d�H*L��1�@T���F�Q��!��'Q̇f�4U�p�}���p�"�[);bsVhjy;
�aa������V(���c�2�	���0w�bb���ccOv��||�������g�
ӽ�n�	��z��ӏ�	2���������0
�]
B��`�	`/�,|�(0�m�B��XR�8�>�*
0M�D�E5����Xz	�"�U�C�s3f�f͢�Qh��G�&�Ŵ�
���:U�y;6j�*
XX�JpVC!�
, "���I+�8k�V_
xi$gv_�(#I�^*�J�ҥ�2H+�[�����2����0AeN��'Gv�"�/�X`t�Xe�
#��	z�iY‡p��A�xUT9ZOy`q�$�z_�����`a�$	�yzfr�n��/��nM��y����x|�NJ������v
	�	ی�9	�����M	��kܓ����
Ѐ`>�呠`��&���`��2���mY8��E��&a���#K�C�*�@-�{Y�h5Eّ����c�p�R���
֎"U��馕80:�ׄ�\,x��*a!-�%m�!�
,!!���I�x�[����]�����yj
�V+[��6[��+�El�Ij/
0T;����LX�J�bWQLVv����)F�f��icc�V��Q�q8��er3}WLP�}kk�3
�a	z�4��p��bb��ll�g����"B��	�||0l��������~~����*��e����ۅ~^�����܍}�LP���;(�@��uR��t���a���8��C�OMM�gѠ��Ĉ
�h�JV6��T�pa��9^�d	U���g�:�����Ym�P����tS�S�i��C!�
,"!���I%k,��s�
u���qaJjf��h��%{—��(�
p���n@��5�l��O�PJ��^n��&�S��'c|_%�X<W�
��@��U"�lG{�{2	T_�2
�~_[�F�_	z\��	L^��l���?���t���	���	�}�����}Żt
�����*�€���e��[�����
	�ϜhQP�c(���\��:���c�\	��aBB�L`Q�f�a>�8&��(���/7�L����d��g�'0`��nʩ�@Or�
1��|�J��@�X��*e�	R[殆�!�
,""���I��8O�8��&n]�����,o�����0'����pF�
�6Z�hT�䥬�4	]\E�D"I�3�Vqֈc����#�sl;��+�	q1z`}w
��bb��t��	��������D�������g	�||��g���̹3
�vp��Πs���vf���*���<����G�ҡ]����S�5P�h��!�"�b�~�W��J'����@�c'�"E��$K�%�lt�$�U�j�L�Aˁ<9:&M����*=+V͕)������Nu[:
�<:��I�"!�
,"!���I)k�i\��R�m�'���-d�r��^�D��,�mm���,�+�vB�0'd�LLe�Y�}XlSa}v���D�pv_�V*)�٘�/�J�`@�	^
qjY
{{^	q`���O�Y	���^��Z���s%dd�|����jj�{����uu||�^���ˣ�>
op�u}}Œ�o�e~��Fn��7�}��:$0P�
/I�����Y�W`*]L�8����S���Ey�#0��K��*��8������{���Ip�1c�b�z����m�&��D=�F��
�aAS�G��4e��</"!�
,"!���I)k7�ʻ����fbL*�䩦�g����r7�����M	c+8,V��b�*���b0(I��JN\A}X���&!p@��1�	sfwz8
		W�
�z�
�pd�z�`�S�v��	`qW��T1��H��}���q�v���
��I�������д��1�׍�����>��n��������+��0�N@
���E��"���I# �P
h\��-VC�)��/�QH��1�1J;�`�R2*�b�/q7o�����,[�0_�F�%U�Ԧ�*���Jզ�jr��4�
�e�!�
,!!���I'���ʻ��'JZfjL8�g��])�p�ˊ�5���B�J�Ƥ�1h	"��D&)�fS0@�D�p�J�,�
0H��U����QX17
hv,||q
�w�f
�p
@@��
	�chh�n�	��L�����b��R#	^����
���|�����ϓ�����Ϻ�������۟����7��g��l�$P���)@��
vm<(8�π�S�&,(H�`�'Hx2`��g�W��
��[;AMX��2A�	=�D�ju�ց�G�Y�$��N�rd��i�rGs)e�T��]/�$mHU^9��n��
U�+
&�ʸ"!�
,"!���I�d��ͻo�adS~�����q�Zi��1��֮��+�~6������A0@p�X�(x
N�2�TNP�,<�2K�fޟ�^�
K
i]^-{}KO1���
|!o
�S�&���R^	�
�{!��S������Sa	��|	��
������Û���+������טæ-�ߩ���R����"���I`��A	��)`�!�y�YPP�
2U4��bb�0`PB�C�T	`�k�T���,�
)�d�c<��v!�0R��`dJ�9���P
(�oi�o-D�$)�jP�7�
�*u�Y|	^�zv*���JI�!�
,!!���9�8kv��`�C�|��6(x��J�f�����דn
83����j�l�)@ Y*ŀ�
���n����:@3���f�w34zs[k���n
sg���o�M�4���sM	�
'��������a��I 
���
Ơ�;��������	צx�D�
��x�Ҭ��	��J��D�	�	������
A�^}@`�!"Y�aX��
�`�9lh&�Bq]92\�	6(@b���$\l�L6Y^����k��i���Jr/
�N��P;\��Pv���H��Ul�(Ɣ��j�zH�M��m��
E!�
,!
���I�)h��;e1��2����J,[$���*��g"��D�`Ix�R��`���6�%��)5p(n���7<>��[���I���%uxw{(}��
txdO�q�S���
��n�}����	���	����������f:

���?N�º�������
���a����1�?V�		ر�
�<#�
�ٲ
���;�;g��ѻ��@f�D�.ۄdt4�D��U 8
�]�
	4�TS�[�0K��fƛ�j�SiФ;0���0f;��P
J��Dv���P��Ȓ=��|b��U�P��bP�jA�	:��;libs/mediabox-advanced/images/loading-minimal.gif000064400000036606151165346500016046
0ustar00GIF89a$$�///EEEUUUsss������!�NETSCAPE2.0!�
,$$���0�I��!��
��A\�Y�0�[�
U���:�c�9i���D���Q
��D�:�܀W0\���F2��������x��P|y�~�8q�c�;
V�U�zn���~>��r0{<}��h���m'�T�"���"�U��0r
��
���@�M����f��[ּ!����ǫ��a�
�������KϦ���qD���d�tD��1�(�À<��)��VNFo<��W(
�>�@�E����:�r%�.^�!2����8��s��JH4?��$Zc)�"�`��V{��@Ճ�_=�K���	!�
,
���0!Z�lZ1s��i��P�@؀��2�W��A���*�4�����FLz�Ai#�R�k�p0#F�3J.����
 ��T!j5�9Oaww�)���a�5����Qm�al~w��{\�w�OO58`�
sY���O�?�p��,��=s��\a�[RB)^>��K^o���KA����#���2o�p�9\	!�
,
���,J&��ݬ��V$60C�T��8�*(C���̠�(��A6�Fd/$`��R��ő\Q��`8$���u�t��evk����Li	:Hp'�7lyp4�G
dp�#nI
Qp��yG�G�������,>o�8Gy\�*�/:�"��Q7`J�Z{b��1sd�`�C.�@Fp�I$y
��Xg�V��PH�*��@r
�W�EawD�g�A������ԃI4�8��'h����!�
,!���!�I�x@Y;!j��]"1p�9�Z���
J�P@�le��@"^��j�����i^�6��x.T	VB0އ�P��`�
?WiL<|;hEG"VAo-�wyan��#x<m5?d&K3V<L6QN��@��]��B��?��Va"��xYx$&�oЄ��ETmp�N�t>��j�`ف�q�B�*H*�Lr�_��7WA���{��1,y���3$,��^��DA���<:�!/���2tyCJA��tH!�
,"���-��B�ɕ�ĕA]�D�=d�Xiغ,{Q���>��`(w�%G����n�`)�>��|�Gŗ�F3
�7؁d!�w�z	2�x�IP>�wMv{U!kE�Z�=*BEf�3V9>:$a%lkM:�4����UH�N4a���fVU'��L&03�>��r��Dx��!&���F��`&�P�=��L�h�d�Z<�j��X!�$;caG)YT(a��C
yzE I�*��2�d�-6T�9����UZb	S�+	!�
,
"�����)�x�_�@��E�`d�Ah�\��]�tQ�8�N��$�0��F�QI5�n�(�"�a�s�hMi����8�x#��^o
,BtMIx{�7"vHQbLy|&#>l�M
%M%mP)V~
"�\X�p[�N���
��£
N\;�
>�)b��O{ɀ�D#�6ċ�}�K@�
��~�H�e����S�����7I
��/Ɠ#`�uI�,^^�,�H�-Ê�J����P?
=!��A`lx���-8�d&�	�;}�Ñ!�
,
"�����)�8�W�@�$�u_`$1l�2W��_�uQ�HD�r�,f�Q0�dZ��	1(�*��Y0JjO��2����!$���?T?F�"Ob>(I}/�5�}��Q�){i&�
)|�
!"f���rb,��rJ���
o�"�.ǩ|���/*}�*��!�9�#����N�@�@yi��e�>EG;�
v�420
ϝi�MHxg�	K���6�KDt�pQ�!4�2�}`��K�-D�CP"�P�NH�:��9)D�*]��`"OO�f$!�
, 
��20B���
�;�&�7����<��^�����E�	7K�$�0H`ਬ.m�
A�[�X��@���B��p�V������m�O(fb,=ev3s
$�8>�5Zf!�zE_8S["��,�0etH��3���B���'�{�BmE�p��'�`,��
a�)����s2�Ej��d��?OF=|��B�XSKOቭ��+9�6U�A�B7�lA�
m�X�r�/ܣj6&j���a���#��FE
��>bpSƒ�`NH��C!�
," �����9�8c�_�@�$�u_`�
���r)(ʨdq�T�P
����(�0�)V��(�
=ʍ9��i�I�U�Kx1��=�\R���)Xo4HiQ�1aElpiu_7T�OkpI�*����DZ�
��Fp/p���m�G0�g4���!q4,���aХ���W�"oN��ó��
2:O��_l#:����zX�d�y�*��'^�{�PP\tSm)�B6
J�y�B�+��ҩ��:P�#B�
,�RD��3��7fm��ʕ%�ʢ�!�
,"��+3$J�F`8����C}����ei2��AEA|
+��
9�aH,r=
'�	��PH�
���c
��Ft|a���k��ځ�
R�
	I�X�A�TIOh�9�V�Db38]��
�C}@-��&�
wH�;�����5��]5���'��<
Q�����<�.�@�����'i�Fq������Y=��7����y��������x1);+��4Lc��B)�(�8�9
�)l��
O"����aY��x8�-%XTj��C��7dhlPa��kC}��P��!�
,"��+3$���G�w]�a`4��f
��碮�6x-	����0��r�Y�7
�Q`:�-����P����E2v�@��#Uq����-_1cww]fC�/`kw^,O�MQ���}t@vl#BB�(N���w'�.�w���|�fN��#������z�/@E���i�/"�ű�xF6����x(�1��
N~I&.��dP��ȅ5('��a&�O��@��a�x�Bd/Rq<<��E;n���⌂+5p�p���b�9��J��=:qe!�
,
��1C�Aŋ.��-֜�@Y�x�X���!*��@��X��B3��`(45��
M"�8X;/��7r����L���a}0��B�ֺT
�v��6IV8Gxk|
FV3R�jkO&`�[E3l�&�nPS5�PcE�E�EsJ�&SZ)P��a�HK������l��c>�rˆ�D{�WS�l��Z=��QDy�L@�KS�
�m���-���]y��ʿ0���p��N��
�B�7pD4a#�&o�9H����&%��*!�
, ��2�#�	��������}�}�s
�Q�	zS���
��Fϧ��BF��Y\A�u���Ȃ.@cF� R8��Zp��I��L7�Hø�%#%sfIG&:k�Ig'E=y�p8�(�{G:<�H(�l�r�������=�v(���8�H�����f����6p&,g?�}�y�t�jz���Z�ߨ�a<�\K�UM��./�LQ�|
tP��CDfD�P4_6�����l�.�BQ�E�"(.H!�
,�
2D#�I�������Z
��)���8�D�"4k��;���1
O��Yt�I"�����p�z���Im��mw?I�
�]����w
0i(�'isX�h'f&IsX=(#I�X��(����kY�x��L���s?��[����H`Cq�T�a^�$i���/f��ln"q�eFwЗn���T8G;eCLb27#�-$PBF(4�tS!
2
԰���Mp���+�!�
, �
2C#� D�K�E^��mE1X�"�G5�P%���
a���0
���,`6�xD�`!g8x��#k��|M�`��z�d��px�KI��i89_[@#Fhf�|AI8v��4A�@=��)��DE�v3���B��I{�)�JF�[^�A���A{6
W
�4.sU5�m4W��)�,6
����PI�*e��aK��)@��
��V��!��������-��b�D�!�
,
��2Cd�EAxp�JCs�E�rex�E�Q��"��7	p,Ӝ)�
���Y{�+�|�*��w�F�Pd�!�
���{0��"�ӣ��l��`��gNlh/HEqfdIJ6l2da=+CKk1|�=E1v]�K�]�6��2+��N'p��/���1d6q<3�m�
>
�C���ȴpI�v�����]2��iV�
��2��L��1�
�9�8��
���Q����JDDHq!
���wa�C!!�
,!��"#�(B��E»�@C7<OiV���f�*nW�H@Y��9�t��ai��"�-0��SZ�b�e��C2��X��J�K
\�Qs_~�mpmsK8dI�C7
bYm�u0 }���:
Sa:�y�,?y0e
���
�@�H:�#������������x#F$�V5K�g=��rya�1�[��#��pr�x��`R���A��bR�?^0D�@E���؏3�ma�4���@��#�"��Q���Aq�˗"�s�c�	7)�,��Ç!�
,"��!#�(B�XI��T&>Q7(�E��d�m��.p�E_2�t{�Ȥ�gL͛�����NSK4MdU�����m#��k�R��a�!��j
n�r6H_hxX��q��
y-G����t<���6l�2n����N(ac()��p��y�0!����=�l���K����8̗�*��ph�����/�0I�.�2d��^���F��t5�Q��=^����D0��*�
6PD���J�a���7�
�)B��cV:(Q#EK�:�@���!�
,"
��"c�Ig,k�TE�f^������E]BɺpL�
�0(	x=��
lF��r�j�%`U�k�AJ/M�i((7��!����`��g2
5{|Ej^c�G7|r,DvJX��+lg(t�9�&�is^%����h�����J$;��_��);�@���:o�Dr�n4\(�"rJd,��mn�
�
G�CԾ2����F޽z"�,�dE�	�`��>+�Դ���8�(I�A|��I��sZ(���"��HE�!>�����
@�L� �Q�Xj��`,d!�
," ��!b�9Dh8��"� !	Z�pP

�t�W�W��C|AX��
w��ȣ�"��p�Br�,���W)Z�R��f�����wa
Oc�B0V�N�
�8Lsvw?
"@n_
+�?22���2�0�do�(�4��Z�Y4��O�G
M^��
G�q���,�}^���n@���C5�é�/)�,(˦�ќ_ۦ�M�>����fǜ\
ZC�>�N0�U��@Df�P27ϴ5H�H�"��LR��XBԱ���YfX4񪅊�l�����N"�(��!!�
,  ��B�9Eh8�'�_��
E8]d�)1�+E^��ε�@,w���F��b���2§�`-9����Q�䘐�C;x����
�C�~��Wdwy[]|�n2+�<�9Kx-o!o��.��<
OAd7�L�r��c#0���W$O����M�o)>�x�
�g�
���02�Z0O���)Z�x�n3,�
����?I*�*1,�xxp�&/�k�D����F��@p!��p6rTqL$�^
���P�F��2��؈��-!�
,
"�����I�#�@�WF��gB�H��*����D��Ĥ�k�3�G�}�r��1Y����c�J��`���W2'`�hx�a�peprPy�}FpM2-�x=8I|FM5#`Iu�
oeM�`|q�BZ?�<|8,=�B6
%��s�/s��2.�ZêD�1���_���e�n|R�EyޤNqpG�����X2n�%�рN1Um�dڇ%M$g��hj4���3FB*bzA	�1�?$:�y�@BM�\*]�l	섈��w�	��;od��1h��&!�
,"����-��vj���OG���,(�*Wa����̔�Z�@$�V��Hс,:�a�X%S+�E簔^RCU�ӆ4�@:�a@��@�
���u�+Rxn0qOIIu.F{0x.N.KO�R"1�\bxD�'"��"�bd96�Yb�"6��37��D:�-eW���C�]��E�u���@=�D��w�?)}�D���
�'����?
).a�(ik�f�@-a`(�e���M��✥s�j��&���hP'��32b�A��@XB�4�P�ܔ�Df!�
,"����)D��Q1����DwI�d�5�DQ��ëV'
�f0�.4����Պ��'9�tzQ!:�X�p�.�%�4��bk��J:K0
��tr`V=l||p:Ev,e7anat^6�o�f�8Ezl
��e�t�U��4��;���o�k�a���o>�6�r��p�C�jtUF�
c:%xρ��R{�h,��Pڍ��%`:���!$�,�O��>	G�<N
D��&N�&B@���o�9
1��+q1���d�|0��̙����3C!�
, ����ɹ���F
�æ@�&ė�PV��v*��;�DQ�S
��
|C!#���A!�dڢ�E!�.�HjƐ�T��}���|0D���+	�,IA�,d
tik@?+u��I1In��k����I��q����1����J`I@��e(�i]I��;b�z�tK:{~����on@�T�UZ5)k�\�#35�,��A)(׃��1�#�ފ#?rL���E��G?(
�c=r��e�!�
,
���+���/\I���q�0��b��A�J�%=	2߮�CC(j=Y*05���빌3�C��~�nA9]
R�0@,d&Z�&���A��Thc;n�v]8m�d���
&���tR
]L��)��s�����������lh��8���
�h��
���.�h�SU.���oʔq8]v1xilz��Lk{�<F_2@\R7���@2C�>N�i��ÄA*:Z�`�0K�'h�Ș0��OD�����[�l�!�
,��0�hOBǞ`�U�5Đe#�|b름E�n��LP0�T�i8)e���u��`0J�WA�����N���W�
(���P�kPk~w-k
~�q#k��������k~�w��b`q���{}F]2=5M��s�m�\��|N|IUs;�6gO.��ZoEC9�p�7K6��7)!�+'Y�/���Q%e�$�	!�
,
��,�(�p3�0���2BG��<cy�52�%.�EA|�M�38����pL:ARY�9!�߯15��#U$@���ay��ہ�P;�
��
�Navv)=sjvmngJmrx��$}J
�w�T
S��v_��J����K������_>��8�ȹ5A
v�SG�=����K_{_�w�x}f?�RJ�S�/`4�HT7EEm��8/:���_�Oҹ)���`�L�ф�G,T�	X���1�h�0F�ȉ&$!�
,
��!p�9Ÿ.�
�%ĥq��9���>+�����a�K�x�t�����&�@��J�u��8�R8�تC��]pv7�&7fC\
Kzg_`un>\�*-@m>~$Lz>�iB�J(����)Wf�<��g��!�}mJ_Og-L�C
=s���j�]}hm��\�
IL:&��T�Gv�T�-/�O�JA)�6�4�3�����B��`j
!�
,"����-�&Ĩpje��B�5�G�D(������
DQ��H�A�@$�.=G�t����x��@%��R���E3�7�dc�G�@�����<(>u�xA5�P@�t;C_([Fu@yWJ'|Df:�cXZD1���[Z�1+�:�@9�2��Zo,%*��ja#�X^���sҊ�8�gÃ�����f}�u1E�e���҉F��b�h�@e�0۴��
�jt[q
G�(~��O�Q%���"�W�p�!aM�}Ƭ��a��2F��sʕ��gX$!�
,"�����ɂX�H;�!f�7�8j��\��L�
\�@�>��`(
�
%���(O�X�>��}�A��
O�3��f�u���|a_h�BFy�xT9!tE>C�HDy}7"D�XEk1BIb�BM�{.�_�
4/e�^�l�h}�O7�����Va��/���>#�yX_��7���x�F�!��p��
P{m,�p(b9F����"ΐ.q��%��0Q�di�aȖ#<ܬ��e!��Lz�:qE�.J��f���F�I9M���&!�
,
"�����ق�W�@���}R��İ�'�\��2��]-$"��a�\2�HP6�N�(X�Ƈ��j4h�y�q���"�ݬ���p��*.<RP^K7*J~~]Z]"7?G��|~g�u�r~����}��"T1d�
R�
��h���6�=�FJPQcu����uH�
}(%��!��F�3q�r�����O�OҾ'��Gx��3H�!ڔ"�Lxެ��+�(
��\�8f0
�����J?���d��-]�y���1����Qg�
L����!�
, 
��20!�x�A�'SeeY}!�#�<��b��r�(���$�0L�_ਬ.g�O@50E��@��S*�1Q���c��F��a�z	
Oh0Ab{,=,,0�X�{�
P�
5.�"��f�A�X�e�9${M7'��H�{�
����H���m
�$P�a��.Y>�O5��@�2ݨ�����>�aO�C
>u�G��y���'�2p��i��%q��S؅#p�$��2J�R��\x�qL#��T�a�`�j6؍đR�*h	��0�|b#A	!�
,"
��!#�(B�X�A��T�eA�
B���52�7��#�KL�W;����	��a�\�!�
�ͬ�@�L�W�% 4�L
06\&w4u�jf�CN�]fN0�7���%[��
SO]��?�p;N���)i��z�3)�-
���.���m��Š36����m;�m��J]~��e@̈́5I�
C.?�ߝ�x(I[{Q�@�A,���醕Rj�!�)�%�#2�q�=�6y84j93���(�����d�(v�"��e$����
	*t��P
d�,�`���$!�
,"
��+3$J�F`8����=¥e�hf�S�'�Z�Xķ|\CA�P0�����D�2H�,�N@(O���Гh��i�FkxU�ݗ��pr�19�*7�"mia2Sht@��;�tG�
�m�Id=:<q�'� 7��
!2����9�/����'���-%=DV����K�4fDB�ϞWi���#,S����9����4;j�y��-k�fC;1S��xLGSB�p��^L
R�Ro7�?&#r�r�aX���RF���
n�d��B�̡��͝xڳ	��Qe>}�B	2!�
,"��!#�(D�X�A��T�XU\G"y���P��[�Q5���]t¡�`h
E�ؠ����,�D)�cZ�l���+:Rw���%P���WxM|.,E1}MC,�wZQNi,�3[�G��@��M�U�?������cR2��i
�v�cp[����>������E!�T�tP���,!UҰF$���A��j�~5�3'����"HE�3X�dأl��3��$r�5
�3\�pӠbN1D>B)@EE)D���!%������Q	�'R�p����
nfH!�
,!��20B���
»�X@�`>�P�ʩ�F��/�+(�^�]cD(���A��d���xDV���
��]�Q�L+A��]��c�p�kLow��uQxGf/
�qnG@&I�]U��cE;�"��YT�!(G�!T���*�,�Gmr��H��3ǟ�j��s�����HJ��5��E|�
���Y2��ؓs�W'�mP�G��6<�8�@�"7.��5Ơ�����b	4�gm��!RUh9�
0r�l
�$�3��h�i�Ζ'~�ق���40$!�
,
��2�#�	����%
��Y�0dG�Z8���w��@�F!Y��´��43���	$�Y	z�ޏڈE�p(��l��!m.�"i�l
Jde+]X=G�kvHY8cd��z��
�{��JsH�&�-?K�JP�6^����
�>����)�����fs�F�J,$���N�����u�
;1�Vm�>p�e�:�'m�����
&��+�d�+Ql=�A�M�8�C"x�Pisa
�E0[\�8!!�
, �
2D#�I�����2����b9�%��xI�M
����`�ARw���
�������p�v
J'��Ǘ���m�(�㓈
v�@�F�jjOd1
r)iC
�PJ�XM>��Y�X��qQ�P������g����)�U(���p>���X�OQ�_���*�xqn^�raftWc
�pX�T$C�v7AR(0$:�A|"C6�+�&=�nԸ�B����ӱ+]-�%!�
,�*C4A���lO��th�-ΠUcB�":���
Zk4N���1��
�Eub5����2 y
�a�5W�mɬ��6D���Lr��=���J��}XMkEWg;�#d<_;E#u�9;_�;�?v~W1��u)+���h�H�#��(�c\�r;�v�m.���(��Jlm_���AV.׽���cE-'�B�90�xI986��a.B�@�/ީiQЇ�9�UH!�
,
��1Cd�EA�QTڞ��#Lܓm`�D�#*@�VB,F_���,d&�����7$�P
�jщ�ƙ�a| 0rK$]!�8�`@B4�b`���._81oM
bi<xGn\Mc�aiGE|��c8=f(SOE������%G�|c_�H���d���x�ƊJ��G�GsT5E��p*&����$�=l�Z9{��T(���"
�T�L��죲��δPR%+U���F�!'�X��g��&!0|���!�
,
��!C�A]�#��ۓ��$�5d@C�|�6Z�<<�
�&
�o���''�t�B��j('ۃ�Qv����r=��p8BF�0�9$tv#-+HqR
�kzdp1�uH>H�f��6uF]ky��[uNq7G�uk(��#G0w�b<
<�A�0Nu�Pk<�X+H&���8K�,�-�VS�#c�#����"�}v�L��[�P�H��h�\,邐�y�,��N�%���
_J!1!��,��0	 !�
,"���$J���
7=A�mUy�e6�PnDa��x��5�p��<�BP:
8�ңz1�RM�
@�+��d}L�&t�<&�P�}�3>-�Evn_=KBm�
_�rF�x�
�]$?
j���%�R�%7o���Z21%���&�6���F�q�B��yg�����yB�
����`jޤdՂ=4��+_n�u��3�B^�R�)f�
A"�4��3L��%��2��'c�(�#��DڌRB҈�Et�X����ЁG�)v.�9�,	!�
,"��2��9�`8+��`W
�f\��w��	Da�P�.�5�p(,4�Ƿ�P��HR}�aA7�)_V�S��}d��r5.�ט��1�U!a��b�|c:R|4n1_2Yn��Nuo26��e��U\{�v�$)����G(%�(�%�����}:,kM��(��j���N[�
-��G��OڻH��9sO�yR+ӷ|@BoC���o��+�8�-��B	`"�h���1Z\`a#,
�]iD2&�&"=��0q�"�8L�L!Z|�	*
,�L!�
,"
�����9�8c�g�5dIl�"ˎ%֥NT��@KQ��
t;��l2����fA'=�<V�6���O٠}@BgD�\͏��\��i_@�B,3t3
#[����9
!dz�}�c�.D��R�EuD�L�R(���
�������"ȻL���
�E'A��d.s$<���Q,�#o_�׷Vݨ�t������sF0Q`�+S�0��0�l�6-�`�h3�7�N����a,2₁��I3��q�G�YI��P��FNY&����1g+&b�
!�
, 
��!b�)B�X�'��������GH�2A�
�<D�D��4[
g(�<�`V	
Ǩ� Z�Z��t�z@��Yf��<���
HK�eR}�\T�o6vwTX:=mW&]�u+>7�}4�
vMY�3!�/����#�K�
E�g��)�CyE�+��Xu��/v�2.�Ǚ)J�7'vp�g�r]Z���D�?�w�d��n_x��AB�UN��
�1�I���E4
(<R�$�E qR(zcC��K���ĉW*5��PeBT�!�
,
"�����I�#�w6$�	��Xi]*�Hn�E_�
'��$��P*�r�D9M1Z�&-��cp�
�������ծ���y?n4u:z�}Hfr!Y
�y?G@Kz�!1<p7r=�$q/@�3V��Z9hN�k��d�d�5A��W��=r6n�i�y�
/-�f;����'\�I���$�����1t
-�ĀK��ײlX8�€#?������)LR����)�/96Jl�����HQ��~�V2�T���4\�)��	!�
,
"�����)�c�H;WFd��A�@��f��%�D���4�
�3��n$l���qZ.]�*�le���4���2l�T5҄p��6>@v�uBlo#/am�uF{�3��lB+@�OhNVF�*@B
[?m�8�o�0:��*�:�&r��9M�f����?�?[*��G�ax
>
+���F�v=8��N��oG������y���ʐ�6��y��̙V&�`a���88�2J/\�\��QGI���b.�6ZҰ�^D�,(Bܸ�
B��	�		!�
,"����
j�x�:��
D�]�H�`39Q̄p��L��ˆ��@�X
��u,�Б00�`�����N�!
پP�S$px�L�����km<;2@}]%�8q\
&_%c�pA�f2^C6]�A7(zW�G�ZU=�5�A6N)4���o��+hA�p�Tm\��5e�>7��B�}C�
�����Tey\�
��݂�_���R�D���=�R���3_V����̣�b�E�l�B�
y=J6�&�A�I*��)�e�!�
,!������c��Y0A�b��Eހ
b��y��5|A���F����	҈�MG�L2�͔�Hʫk�-,���
����G���HI�<?wjz`K(X=x�I[I}0"�j�~��p���VXU�t
j}���j���K����2Q�~��X�.�I��%<��UɅ?,g�o)�I�Q
s~qmJ"�yL�C)[U�
^�\�iQ'�_R%���1��c#@a�`G
�ݠ�!��sX��EF�'��0S�ÜL-K��f�!�
, ������qB
�C�xe����%6P�,��Q��Z�F�9
��Rճ�T��`��5[dž9*U�@�(�S�S�B��va4���6p/Twn`U8?;�}*dUkV���j
T�kv!��U����}��
��������b
���m����wGqk����w�P�Īvj۞b{E�s�jt=JoZ}�;'�DL��GQA��cs&BX<���L����V9RT�paی.8Ę�Q
�'$;libs/mediabox-advanced/loading-dark.gif000064400000027572151165346500014076
0ustar00GIF89a$$�&&&666GGGVVVfffvvv����������������������������!�NETSCAPE2.0!�
,$$�  �di�hj
j|Kd/���6F��HG��(r��ѷl.�Ɨv��x�M܈���|_���0���;Uxؽ��
Eޞ
wxf|ro{&vv	G�o�"��G<�����
�:���%
�������"

���"��"������#�
�ğ��f��ϻ���
�����"��ذ,�.������<���-�P��`�q�ZH��y�Ѣ�BZ�$�N@�
EԨ��D
{��X`��
6�Tpल�,�
@r���i3@g�%�L�3�6-[�j�%�K�>E��@��(0��J�&p��װS�!�t�V��5`U��\��s��\�z�k�0�X�"}LyD!�
,!"� 
�$)EAe붆E4�����̵����H�d�=��[F�N������lR��'_	�@��.����:vh%}a^/w�$��	S#�x]

�
��h�9��
�S�,	��$��,
������������¸����˸��<���7����������������G��
�C���Ǣ���
�� 0�!�-H<穡Æ#Hܨ��B
Uɪ��
h$�xd�ȑQ��LG�t)r�X��Jq`�.���*Tp@�ʟr��j��Q�xU*U��XڒkԩTT
;�SrxU������NL�k�؏���+�#!�
, !� 
���<P���Rd,��Fi���;��)�v��'C8�E�w�`���I��

��s:�P#�@(Ā|�<�q�V$u
zg
~?W�c��y	L2��4��
�3������4�0	�
����V�����������V������Ƶ�ɂ�����������"�
��"��������	
��������	rU@��z<V���$H��A0�7��DGd�Hr�;\"Hp@��`���6m8�`��1g�`�͜:w0��O�=�y
�ΦN��3��եM��$z*@��J�2kZi���l<qd=�!�
,""� 
�$)Ae뺅�<��Ro�����G"0BڰvD.XL@:�QmՈ#A�"Pn�[�(v�Cc��2�C�qd<K-Nst
�#w�-
�
�%�?����
Y��$���
��?�#���Y��{������K����<ɷ	Ú�,��
�Ӌ�����?������"����������
�������
&r��)���Cv���a%�ШK�
C�˂�#>Bv^L�䀗}l�0sb!1`e�<2�SA`@ї;I�y
�Rl4J��Q�/`����Ha���K�x���dU`�2��Z�n��E�bڻy��]��쀯m���Ԯ[ɓ�B!�
,""� 
�$)Ae�E�<4d?K�<��a�E�ĮG",Aa
�#S�:�B��zD0�w����N��`��
K%N�v
�-n
:�#�u
�-	;���f[�.���	���>$�����#��r�"��
�ɼ��"����$��
���ֶ�"�����	�Z����
��>����		�����_�fLȧP�	�#�p��%
FD�c�ǁ>�у��G�$r�Yr��',^y`LN��ɢ��{
�K!�Gy6+`�P�Ca.Tq4��/0u�ԀWV�R�z&\��;iٞL��Z�m
�fg ���ػ*@RD�5�߼��UűD!�
,! � 
�$P$��>�(EP�sp0��PE��6#,�ܪ勸Dҭ�K.!�_dAD�Wu�xY�6A�����q8$X5�[2.�bcC$6zNP#
�	�4js$��_#	N
	C�l����#��
��3a��52�
�Ƕ��#��|�%�
	�0�4��޿څ��	����������	�	��������J��q�A��	���A:�<-(�`���0qD�t\)�Hr#!�]��H��K[B�1p���d��0�d��(P�@O�:���Y�@͚B�%@ըўG��TjѪ����i@ԡR�ZU�@�S�^%���ע_{~	!�
,"!� 
�$)D*�l�	�8��4J�<YcH{�b�#��x|
���Ȱ�
�V+d� �����Ύ�k���q��C�8de�f-
j�jL$s��%���	�-���
�jZ"	��u"��|����LO���Ze7
	+����#i	L		�½��L��gʏ;������<���>�	�	Y�#������@@��|��
,HК��E����^:��P<��a�l�"��C�ŇBmj#Q����=��Lً���8B�O��X������\�����:�O�J�6uA�Q�SS��Z��&O�N
��Y�Ky����@[�n���.޷'��H���جMB!�
,"!�  �$P
Ӭ��(EP�t`,���N�4�6P,p8ݪ����1��=�D����#2Ųf�Hj0����`@(��$ҝnb13iiz%	�nA^
��B"
��r^$	��k"���}����"	��	��{�_����$�"	ú�$�i�	�%

G�����ܵ��O�������P��������r�$��9��b`��N1��ň�ꉴ׫����h�q�t0��6rʓ0�lD�f	(s�[W㚀vHI�`@h:u��J���ZM��:`݀�S�^娕�W�쨎%!�,�ug٥mǭ�[�_�R�w�n׼i��k,!�
,!!� 
�$�,�4+�)�b`���6��7�m6H�������$�b1=�V��c{���i������#1������Ph�HAL(�aa03
jyO#u�aBC
z���	�~	^$	�|��]����&	��2����Č�#��κ��$�ʎ���#�����	����[����#��	���@��<
�#$�
UIl�p��z�bL0@���i��qN�Em��x�$�_�9�eÓr��H���^�,@�����)c�NP	�tfҫKy�p��Q�R�����Q�H�,S/�B%�v,U�Z���.ټ����7b���B!�
,""�  �$)�0e�ı�S/	�<
��(6��îG$�!�h<6��Ψk�A>0
�g�K�����^K��8��r-	�j
K$p��Y���
	�.
�����Z"���>���f�>
��K����#��{�������J�"��������+����	��������y������;g�-���`�
����{P�I�`G�@���
Eq�ܤj�K�D~���3g�h	�e��8	�٣�K�-
t��P{�@!�i��f����)��8!�l֭Q{�b,ֲ߸"m�E�o�Ɲ��D[�f�4���V��|���*!�
,!"� 
�$)�0e�ġ(K�0KB���͆c^o4@(���h�KQ
��n�j��8,
�7:���d�UH��O���0��f%Miv:J#c
�$�	vIK	��J��Y#��s����"
��,�����
��u���#���֊����յ�#�{X�#	����������zz����맇ٽ#0*`��Aw�hH��
P�c�X�@��;q�p7`Isp���^u�h��#�l�`PA��Q�(Bfa��Σ)R(-�4Ӡ.DU��կ`�6%��,��+v׮Ҧek5�۸r�
�,-^�k�Z��W�����"!�
,!"�  �$)C�l��"+� ��A�$3�b�
.��hp����᰸(E�J`F��"�Z�,j7���L
�B3,7d%g�Z9,D~
�$���HJ	���IL�gW#��q"���#
��+�������z��V�#��xx�I���Ϻ��$��x��"	��������y��������D��G�
<�`�C��
`��$܈/��("D�Q�(j�pШq���4���%K�0�`��@$�L�"����ʹr(�-VH�GW��@q�*կSET5:Eѭ'
��u��\�vU˶��W;��][7챴s���660]�K�!�
," � 
�$0I��J�A)���*�.�bij���r�o�K�b��)�F���Ec�z�.��Ó@K����C3�
�L`8��02
vx%�~~?]	x

@"��]$���z"}}��$��
�@'���������}N����������ʧ��#���qq��"����#�����"����!�@��2�Ơ
�n�"b'B�c�8@�C2!
��n�rX��2�'���lA˖�d�������9�g��nB�9"O;2K4-����XE�U@�1�6����
P�v�*��دx|���+Xi��:qn]�n�M�6p^���6<UF!�
,"!�  �$0�$
�CP�t@���*��(�&@R���S�%��T.y�l��)R����T��8�f,�Y��c3gYvO$�|~A]��B"'|�]$�
j#����	���B���%�

�_���#��
"q����
��ț�$
��1��$�����������"�����@x@0ޮ������1J�&N��e��ў�/.�N��Nv�BKQ&N�L�i�ː�lԩ��������LHQr�%T��"M*mH�����*J��R
�ٴ�U��V����PK��
�,�
�f��;�-3pU�ׯ%�>���x��4B!�
,!"�  �$�l�"#	���q3["�
&��H`����aQQ(E���٦T� ���n�^�.3�+���x�g�Kg�M9,	n|�V#���I-�|I���W#��p"v������+wv�������0��$�

Ͷ�����=�w��$

������#�޵���
�=����(����!x��&�m���&l@����؈O�,
�Iw{x$�S�L�bA˖u�L!�."܄��Dϙ>�XA�P�O=���M��p�J�UÒ\20�S�,}�*vʼn
�6�lX�c�4���ݶc	$ڴ�(�������ἐ{pL�\!�
,""�  �$�
e�CqH�$�1�o��v�%�^�$((��;Z���)R���b\�ƸP��x���ٙ�xY��P,�-MNt:J$b|~X&��eKc���M��Y#}�$y���"��<x����~����$��	"������?�x��#	�
+���#�
(����
�I�������)�"
��JA0�bA��6"Jd���
vHt��U
��(9x@R�*Nx�Ħ���J*���*p>@�d�Pܼ�ӁAV+�N���Tb�U1
0�
u�͎/T^�u���\�F]�'V-6�v�-V	ȅpR�[&�Up��J
"8HP�߈B�!�
,""�  �$��l�
�aRư�|0�8�
AD$ޫ
�h��!P�Lf%&�	ER�-d����x�s�@�3��B�"�ff*-Fy{
%u�fV��;"0��V"�
o#���#���
;�u�&
���0��U�#��	"Ż�&��>Ű��"	�*Ʈ����'ٽ�������������
�
�)(��
�*���P��9Dl�@�	~}��c��T0��I��;rZb֐$�b�t�`�ȑ�,x!���.�t�R������
KX�0�!�Ҟ�\��kŠ��tAN�&̉
K�jES]p��m�
�qEР.�A�
@�`m*zK��T!�
,!"�  �$B�l�
�!G}��P3�
A<v/����Ĩ)�-��g��w��ֶ��7I/�ᰁ�N��Q��.(s-\\v	
&a||Tw�v:=qm�T"
�

#���z��
+����z�������
��ú&���(¢S�#�ѵÀ�"���)���(������ݹ���(��"
��9���w�߉o2P���	w�H���Ã�4p0����u%p@��`zh��@��%0h�r����Y�b��"ف����x�L��f0"H��4�N�H&
��T�U$e��"��T#}p���ЪE���.	��m���5B��"!�
," �  �$ Ea��aB)�@
�)۶GOд��@��T����"N�S؟���X�+[r�)a�.*�	D�,��DA`Fc�	%vCx�N�	�	{#�lMN"��t"���$��
	��6������Z'���#
��"������6���%
�1�6���Աû����?z��$������"�?��پ	����������?x	

��_��֘h,��e�h��LJ
r}�X/�>c>�����@�e��+	Q�
�J<Z3eʄ@�d�iS @ Zԁ�TjAu
U�ԡj"�4A�h�z�sց�\�~}��嬲�v����!!�
,!"�  ���l�
CA�Qӂ�(1�7��04v�����lB!�C���Z<x��6Xf��.\p��M_yY��x1	5�V-CwxU"|oeHxx	x�<0d�H���m"�����	�	+(��H,����)�,�
�)���&�������
��)*��$��
�'�$��'��#������"�
�ؿ�	�����<���
0���?q(\0Ѐ�t",��]
`�@��.P��hBA��+l&��8��$G[0R�
��xA���њ';"���O�.]>xpi;8x
5�ԩT�6(��׮_�m���h�Bx07l�cH �*�+x�	
0H�!!�
,!!�  ��
(Q�!�p<瀶la�!���ͦR�x��o$oF��w0K���LE���'�6��A�I[p�D3;����8
�"ukj�@q~t&�&Y$}��L���3�	x4�����	X���0��		����0��	��x�$��
����#�
�ɢ�#�����"��	���
��ا����/���
�����������i
���A1��+�A���@���)�ddPk��f DXP
F�6mjT
ՂbF�*�G
���p�H�1!@X@�ς�9wf�grP�B�>x�A�:u&XB�iTS�VE���PgF
K+��(�����
@Р.�����J�?B!�
, !� 
����l[��@�D1n~ƄLۅ��0Ƚ��oWF��ՂB��Pt��*��n	��T_͆CM:I�H(k���q&)x�:r��$�jF$��t���u���*���"���(z�"�����"����%	�	+��%��*�#	��������
	�
�-��	���
��1���
��
���
�
�	
DX��>t+0��a_�,��o��P6T`�E�(��c@���`	0��eK���P�M�1Ƞ�ː!�XP3�>pࠁS�.�KC���K�6��Rh�G�*�ʴ�֞���*֬e}6@�1
��o�2�XWD!�
,""�  �$�g��l
�@�s���9�1���:	^<��,lD�븋�hA��0
�`�R�-po_p2<К
�s%��Y���G^zqs()Qp��&�����PR6(�&���]9��%��9R��%���)��������$������	�	��+��ǝɲ	��]F2���~z

ؖ	
��"	���	���	��U&@�@�
d�K�������[q@]BL@x8R��p,X�6#@���@;V2X�a��#g�|�@Q
�ܹ�%�"d
%Jԁ�
dU�t�>4
�R����K�22
��ղ\w��r���p�((K��zV�bU�W܈q��,!�
,"!�  �$�0���pl�����|���
�ӽz�-�"
��9S��]a;���A8�n
]�i��	���Hb�����7��tTr}i&U'Tu|��/��%��I���"���"t��"��G������%��b`��#��}�����9


�#	����Ԩ��b�ܵH	��"
�Ӿ�������	
�" D(P����%��`A+P@��?I
<Ԩ��	-F$a`�@ e4X�؂�
T$#�F�r:p����/eʤX/F7u>���
�yΦΝ�8�*fQ*r.��T�S�
�yB�4�֨/�%�3�f�FBE�.*�!�
,"!�  �$B*+�pl��:�8���y
�7�^����Z�n�(�
H��X���/����7|=�VRtYz���A!�.��&�V"z}kJ���"��s=�$��U���$��"@��$���{;�#���

	~�"�������������ˠ�	��+�ڢ�@�t���"�Ѩ��"�6U
�A��JՃ�P�	����E	��0�@W�]�0|@��uj(��FK>hp奕8;&H#AI@4h�`����r��#���A�2��k�U�+�5�	���[T�^M�@�ƨC�N]PUA.^��U��킚�Z��k5���V�1�0�!�
,!"� 
�$�Y��,̴��/,σ0��[+���|��
G,�zI€
���'�'�Q��Q��΅*.�,���s�[�B�
��hzR#1usB��'iu&z�U

	�}���
�}�����,�����	�+����%����$�����"�����"����8���������j�
8�)
$|�@A1	�H����FH�AG|Dp���	�o8�ѣ�%,�<ɀ��
��ȑT	�'m��A��6*X���>
f%Z�������Y�E��]`�V���ʀ�X�L����زW�ȸB��U�n�nDE���
!�
,"!�  �����
j�&���0�p;zδۀ��Ԋ5h6E�:o����Y���"��e�3L@�m�;�&�	%D#ahEGuvd;c#b�m"�
�$w�d������x������������	������"���ţ���}�ٿ��6������'�sQ��"�Ӥ����=h�*�<�R	p��yC؏Dw"������3����{8q�8�
H�n�<�`��2�l	2U�0`��A��<&P���Ǒe�*�(�
�2e�ӥ�Zt�Y�
���зeϦM�4��x��E��f�gY�fM����N�QI"!�
,!!� 
����p�lkh��B-����,۷�F��h��`��1�E�	�������:�`p�T�8���LCa�H�0l��0a@
!�rt}B"y`{A���${�;�o�||�;��%���q�c�"���r�%������#|���������"��	��������������:p��;Z
p�a�q�8�ؠ7W�
����k�AÆ�`|��Ƞ�H!�<i�M�-0XP�E2�09��:u.ع�$�*s�-$@�t��
�*H0v�T��\@���c�R��UH��L߆%+U*��B�~�o_v�xW����&kd�!�
,!"� 
�dg����p�΢����2-:.��D�!��v�hp��@�����H��ؑ
�n͢8�
b1Dilu�^��#|/l�$}b
G5��u}�#x�m��n>��fV��$x����u�"������#��Y��?��{����Y����������������Y�
�������϶���=z
�Z���4HH1��|�H0�AB%�J8p�@��jz0�r%��"L�4i�G��+0PPSE%I�P�$9(U��xBH%Z2��t*]��i	
4h�l���X�S�(�UAW�`ݎ�j��x݆݋
�/�_�~
{�07�
�9"!�
,""� 
�d9f��(��*��/
�\����ʽx>Q"�|
�(O�Rg
&�(����x��2��f�����,��շ�pD�Z_)loP$s�
I4z�{"��"���-���I��8"���#�������#���������NÜ���հ�������������U
������0��I���A���B'�2X@	Ҵ0H��Ǐ�6��(P�Ǐ�x�
`�eF�*}\@s�$0p��T��(
‡���G
�I�@MBH݉�(��;��A�4��`
�ziF5�zUV�زI�(�V�װo�`:��W�x�@�l:����=Px\�r���!�
,!"�  �$�h�����xƫ Q���Z���E
��p�\!`{�Z�=������\nB����!d~�A�%^
8�iy(p�$ss
N2��1���K�Y���B��'
���$�������$�������#��
������Ӯ�?���
�
����������
�	�������B���c��0$���@��t�8�@�.�x��„
G �Hr�H

xP,F�Ɨ
L�Q��J�	���@�%}00�f���z���"����-j3a�K�6M��_��i����&h���װc��B@-[�^Ŏm��Z�m���K`�
�m��EP�p_q���;libs/mediabox-advanced/loading-light.gif000064400000026170151165346500014255
0ustar00GIF89a$$�  
KKKlll������������������������������!�NETSCAPE2.0!�
,$$���I��8W��bZx-H1���l��
���jI<˄zg�AL7��.���H#XeM'`�8Rr֘@�$��4ma„�6P�ؔ�U2kjioo}O6!x�M�����7�ln�&�G����?��l	��v7�����^���
ïŌ!Ҵh
��
Gҿ�
��'�-���b?�
��
�(f�
���˧�4��!����$2
��!�Eo�*0�FHn#m,^�v����4H`C��	��!�������3�K����
�g>R<q�L�a#�P_�th����^(&�������Ϙ`�*�f�,Z�W�L�����g�SWR�_!�
,""���I'S(�U��RCYʧR�A��@ܪ&�2R��NW*
�aN&����� �e
�\.��B
jG]aF#�6jH06�'E�Hlzno#�?`"�[��
T��o�R`���o���w�T�M���a��	���	��M������zHywT
�<��x�jϿ<�Uxy͔�0����
��&)�
��a�|2���ĵ3��@?
(��,�=|4a���B���,ȇOԛvW$�I�I��:�<��%�V��i0�!�-]��1�Ʌ���I4�̟�l�(:��Ņ@�
�`��S�P�}*ɕ�ׄY�QJhU�E�b'�$!�
,!!���I'[	������`�C��l�$!%jtm��s�
�#GAb=����#�$X������b��u08s�o	
_�3�Q��a��g$ZO0vxb\�a[�#�a�9C�.��+����gN�������8�ß~�����	���rOÞ
�'�\Ԟ
��5���C�0%���]��4����C�፤�ȧ�����lqA��&�$8�����m�)ظ����SF�B�����[YA�����ܐR�3a�K�!J�+J�I3E���ka�'J)���GD�S�V7JU���S�Z��[��ؒ,"!�
,!"���I'[)������P��P�2GA̧�ެ[%2]��a��

���, Z�Xr6X@
�"��#I�j��@A���%3z�CA?�n	<	Ezze
mxyzVDE:	y{���.�����/�$���
�)��.	�U�-�

��)����7����
��T�����=�݃������
��H�����#{��`�C�(NjZ
�C�ʸQ���Bw�:<���T�y�5�˖r��%�5а�&<}*_ZTh�C�h��P�O��r})2dB�
9)ʴ�է�M]:�jBgBVul��8E!�
,!!���I2�h2�9%�sd�ƭH�I�n]=��R��Ϛg�5z>BF�M��#]0��	p>��[ᰀ����~��"$b�w�VpH01oeVxLU#]~$&w��/vs/	x��Ft$��	F�%��Z����C��/
�C
�!�
��5�Fȸ���t�H����'J����
�2��	�=٤�
����#�W��0XlB��B�����C��VN�.P���qK$9򞿑
8r��ɗ�&&L��#ď�^��s�}�PҬ�rcǛ8�lZt�Q��c���ը�t�z�a�?iE!�
, !���92�d‰9%����֭
9&h�m�@�6�Nv�+�m`�!
�� 4���tP %XlA
`2��`J)������N�8A9>W<8�WpQtww[]:$p
!%�Xc�.O��
W�7c;���vR��
$vvQU���G7��������*Ͷ�3���
�G(��<ڋ��!�%ۉX��V�Y�ў�
	���%"��عx����z	����s�%T8���^-��#D
F&&����H(7r�h&a=��&���`C�'Q�̩�!�8u^��c͆
��Ri�a�k�f2�H鎍D�Z-��X!�
,!"���I'[)�U��LbEA�a
��6I��G�N�X�%�-5 
v
�HF3��E�+����V+��Gt0�
�@v�����+�����^�Gv$]y

=~�E�w���o^b���:n~]E-
�q�H�'+��7	H�m	-��)�#ȍ��A�э�<�N����V�.
�1?��J���	������
���!�A3�
K�JA��8!�g�a�B�V����xV�qiMC�u�6X`�2�?�(�9��
�����&M�i.��r���2e"�r�P�C�^`I拡P�N�juDž�R]V�w��X���D!�
,!"���I�R)�U��LrEY��0_�
�!���K)�\�'���5�Q�,݆"I%��;��H)���v���;��|T��j-
��fEsrfv

<{{�cr�	|�ffa�00^,-�v�,q�'�F�{�Q�0'�F/��/��4���m/�3��ZI��S4��I,	�=������.����0I����w��.�+����{��,2vX�A�y	S�`�ѣ�����1]�}
/�����t�\���c���$��ù���t�Q���@q2}I�aR�S��K�T�׬N�p��S"<��"!�
,"!���I�R*�U��LrIŁ0_+��h�%j�n��L�(BA�Ƚx���
9�g �������bz
�؀Z0z��y48��@^��cc~u


�jz}	�#\m	y��`��A,-Y��f�
�*$B�.�zuup	��(�F
��m��c%p�
����0����	ք��	�u߾	I�j^�=�4�
!�;<��Q8�^%��y��&�2HT�b�=��cP��X����q|wrC
l�TD�drb̹'����:�gρ@mZ
j�P�32mz��̨F�5Ez��V��z%h�f�!�
,"!���I)S*�U���q�Q��|����X���V��Y��B�&Q�D��+���4��A3H
X
"%�V�׀@�u���xl0[��u`/�b�\A

!{|N]	�c@B{lfp���4+,k�~��K�D��p	�%�D
�U�.�b$����U��H��
Ϫ�	�R��	�UU�/c����s�������
j@7@E�P��-�R�v%|7m��"V\����DT"mܸ��RV3y^J�ZV�"�i���₞|N�ѧE�G���ϧC��l��ԥ+���9��V��Bz�JV&֝hYD!�
,""���I)SX��;��a��1"��JIx�cl��Z-oN�F�	�D��t2��p�)F��0T��v�T��C�@�Z����,�.m������$Z-b[

wwzk)
�!J�	v�ddM3��Y���	%�B�����$�B�jdC�.}B�TT)	�_��θ�	ԁ�,��j(_�����`��X�o-�
	����HܸѠA�5!�n����EQ�l0@P�
5�Y��6��
�H�C���aiJ�(�ɜ)�&N�83ڜ���Ȣ)��[`�)SPIm��U��*\��t�W�X�f�pUj׳c��M�j�!�
,""���I)[J�U�
Gy'�0_+�i��a�n���\�6C��ȽFH���
9�g
�A�-�E"�	�V�`�����|�
i6[h�EccfBC	|~^,
��C
	�xx`�	�	4�l�w��b�L�-�h��tF
�Vx/��#�}�,H��й�R��	�WW��rP�
�ZV��*����bc��i�2��k�
��2�Ȇ
��&���6�����5X^H�����-��c��Ç'�%02�v%sn`0+��X
X�@�!ў �ps$ϧP���!�ӒRY
m��i�v`�6��u��pe�)�6��ToѾ�!�
,""���I)[K��;g
��a�	㭒��"y�F�V<�q��M�H�^0�D�B�ءP
�B�=��F#�[�^X-���d�-����(\.cL	
uwz�*	�&>
	vuTT^�.2��x��
�1�C�YY���"�C
	�VU-�H}��e*b����Y
�G��	�VV)a����.��
�WVN��������/�^��2�ς�4�c�N>CFKw@!4b$0�x�_�^���K~;�R���%u#s>��a�k6�����C2�&fQ9��Z0�&K�Q�"�y�U�����
YŲq6�zPվ�K�n�!�
, 
���I'[K-V��W��r�H�"�c\�G±���i�'�A�[�v��x"V�c�i(֦�
�d\�D�j�!��%���K8�u���(�aL
wy\{7_�>D	wi{m_16,��Uq7��e��/8	��)}��WVG��ƣeʩ��
Ƽt���tʎ�fܧ�
��uX�ͷ������H�={1|;�4LID8l��<��T�N��$��G��4�s&M��&K�c��HD�@ډ�Z]75V�@��Q��F�P�'D.����BM�G5A�ߪ~��!!�
,"!���I)[x��;�I���Q&��NK�""iɶZ����[���H��q#�B#��0��|����E?i�@
S�ڏ��=��d �v�7�C(
ssvY6z]<�
rsRSL,�:7�T�6�-:�[�TT��.�+	�cS�_AB�Sc�^�7î
�z]�+
�pxȍ������eL���	������*��K�z�����AuH�#���x�
[@b@��`&8Ը��D�@�
��%V�C����8+(pRa!9�*��̟2	�ِ%G
2�o�r�*`U�P��r���@���
e��@��d=(�"!�
,!"���I麌��+[J��"2*]*�I���)+�:1J���>�
�ӽ`%p�[��@���XDr*�SCalb����RDŽ!�-�-�\�Dkdqsu5
z$
r�eZ+�GB)��S�9-���U�~E�*	�~�E6�bb���6 �4����
d	����ܤ���cc���������*�؂���G�Z�qƌ�cL݁�s���_D(��Bne�h�M��$�U�x���#�.m͙��^�.I��i	͋~u�	!��6nZ�D���P�j��*=�~����lE*��l��h�vB&�"!�
,!"���I)c����UJ"&	v����H��0�ņ�X��!�
�b�ʉv<_"%\���!�DP;'f����J^zh"�
�S���F�J����8�	b]>4{u.
�^fAv85q_�B8�L��ScAY �5
�`_�N�@�`��h���3�i�@
о	4����K���aa�A��
��bb���o3�����
�6/{���,��@�g�E���u[�i���#��<0@P`#��"�1׫�8a�dD�C�
|2�$�I���5�sSѣ��Eթ&�
L���QO�|Jq��K��ͦ�� !�
,"!���ISX%���`2�Rf[�*��^剩	Rߋ;.|�i�Ц��z&
q`��e3Q�:Q���RE�c	[����H�T'lT
�5�ٚX�<3,.iy\O_FI9E
iM���t���_-�<}�
��M�����ggF
�$��\\a��
hh���Ⱥ���������#�ԩ����ѧ��j�~����i}�ѽ��1@����!��N����`���x[��J�
T��`ɗ$G@�ga��#aƜ��Ӂu�0�\��g0�����U��)��t�S6�},Pk�O�V�D��+�n,JX`A�"!�
,!"���I)���]�ZJ�$��p��|
(�I|�ۊe#�L���)R�+�C�h�@y����ɕB��E28*:h��	}�'N�i0���
E0�qw.jj\U*,4
O����H�kh�v�W�4
h\*vI����������'�q�Ǔ�tp��p�z��������
���G����jjo����������a�	`���;cV�d��:�%���-$
�Kp!��|]��T����\2d��$���ȲfHZ�T��!A��V&Ė3�%�5fA;֋��T��V�t@S�N+!p��1lU��j�N�R�V�p�o�4$�E!�
,""���I+����]����t��c�*ənön��ڶ��Ku�OtL
�M'u�2^F�q����Ն�>h�!�h�A�#���Z����4h]OanU5>��O�}t)��\Zo�U>��	*���\h���]]2����w����w��ε
Ҏh��
��i���
ӄm������������(���H=2h��
�o�P
���`@�L�]�((@�I�%9v�8h��h<i2��W�
h7a��Ҥm�	�cNR;S�
�4��WP��p��6e���<�j�U�X�e"JALeh��vn�5d9D!�
,!"���I)k���[࢈
gJ����.��~,���鼶���[�p�d�H*L��1�@T���F�Q��!��'Q̇f�4U�p�}���p�"�[);bsVhjy;
�aa������V(���c�2�	���0w�bb���ccOv��||�������g�
ӽ�n�	��z��ӏ�	2���������0
�]
B��`�	`/�,|�(0�m�B��XR�8�>�*
0M�D�E5����Xz	�"�U�C�s3f�f͢�Qh��G�&�Ŵ�
���:U�y;6j�*
XX�JpVC!�
, "���I+�8k�V_
xi$gv_�(#I�^*�J�ҥ�2H+�[�����2����0AeN��'Gv�"�/�X`t�Xe�
#��	z�iY‡p��A�xUT9ZOy`q�$�z_�����`a�$	�yzfr�n��/��nM��y����x|�NJ������v
	�	ی�9	�����M	��kܓ����
Ѐ`>�呠`��&���`��2���mY8��E��&a���#K�C�*�@-�{Y�h5Eّ����c�p�R���
֎"U��馕80:�ׄ�\,x��*a!-�%m�!�
,!!���I�x�[����]�����yj
�V+[��6[��+�El�Ij/
0T;����LX�J�bWQLVv����)F�f��icc�V��Q�q8��er3}WLP�}kk�3
�a	z�4��p��bb��ll�g����"B��	�||0l��������~~����*��e����ۅ~^�����܍}�LP���;(�@��uR��t���a���8��C�OMM�gѠ��Ĉ
�h�JV6��T�pa��9^�d	U���g�:�����Ym�P����tS�S�i��C!�
,"!���I%k,��s�
u���qaJjf��h��%{—��(�
p���n@��5�l��O�PJ��^n��&�S��'c|_%�X<W�
��@��U"�lG{�{2	T_�2
�~_[�F�_	z\��	L^��l���?���t���	���	�}�����}Żt
�����*�€���e��[�����
	�ϜhQP�c(���\��:���c�\	��aBB�L`Q�f�a>�8&��(���/7�L����d��g�'0`��nʩ�@Or�
1��|�J��@�X��*e�	R[殆�!�
,""���I��8O�8��&n]�����,o�����0'����pF�
�6Z�hT�䥬�4	]\E�D"I�3�Vqֈc����#�sl;��+�	q1z`}w
��bb��t��	��������D�������g	�||��g���̹3
�vp��Πs���vf���*���<����G�ҡ]����S�5P�h��!�"�b�~�W��J'����@�c'�"E��$K�%�lt�$�U�j�L�Aˁ<9:&M����*=+V͕)������Nu[:
�<:��I�"!�
,"!���I)k�i\��R�m�'���-d�r��^�D��,�mm���,�+�vB�0'd�LLe�Y�}XlSa}v���D�pv_�V*)�٘�/�J�`@�	^
qjY
{{^	q`���O�Y	���^��Z���s%dd�|����jj�{����uu||�^���ˣ�>
op�u}}Œ�o�e~��Fn��7�}��:$0P�
/I�����Y�W`*]L�8����S���Ey�#0��K��*��8������{���Ip�1c�b�z����m�&��D=�F��
�aAS�G��4e��</"!�
,"!���I)k7�ʻ����fbL*�䩦�g����r7�����M	c+8,V��b�*���b0(I��JN\A}X���&!p@��1�	sfwz8
		W�
�z�
�pd�z�`�S�v��	`qW��T1��H��}���q�v���
��I�������д��1�׍�����>��n��������+��0�N@
���E��"���I# �P
h\��-VC�)��/�QH��1�1J;�`�R2*�b�/q7o�����,[�0_�F�%U�Ԧ�*���Jզ�jr��4�
�e�!�
,!!���I'���ʻ��'JZfjL8�g��])�p�ˊ�5���B�J�Ƥ�1h	"��D&)�fS0@�D�p�J�,�
0H��U����QX17
hv,||q
�w�f
�p
@@��
	�chh�n�	��L�����b��R#	^����
���|�����ϓ�����Ϻ�������۟����7��g��l�$P���)@��
vm<(8�π�S�&,(H�`�'Hx2`��g�W��
��[;AMX��2A�	=�D�ju�ց�G�Y�$��N�rd��i�rGs)e�T��]/�$mHU^9��n��
U�+
&�ʸ"!�
,"!���I�d��ͻo�adS~�����q�Zi��1��֮��+�~6������A0@p�X�(x
N�2�TNP�,<�2K�fޟ�^�
K
i]^-{}KO1���
|!o
�S�&���R^	�
�{!��S������Sa	��|	��
������Û���+������טæ-�ߩ���R����"���I`��A	��)`�!�y�YPP�
2U4��bb�0`PB�C�T	`�k�T���,�
)�d�c<��v!�0R��`dJ�9���P
(�oi�o-D�$)�jP�7�
�*u�Y|	^�zv*���JI�!�
,!!���9�8kv��`�C�|��6(x��J�f�����דn
83����j�l�)@ Y*ŀ�
���n����:@3���f�w34zs[k���n
sg���o�M�4���sM	�
'��������a��I 
���
Ơ�;��������	צx�D�
��x�Ҭ��	��J��D�	�	������
A�^}@`�!"Y�aX��
�`�9lh&�Bq]92\�	6(@b���$\l�L6Y^����k��i���Jr/
�N��P;\��Pv���H��Ul�(Ɣ��j�zH�M��m��
E!�
,!
���I�)h��;e1��2����J,[$���*��g"��D�`Ix�R��`���6�%��)5p(n���7<>��[���I���%uxw{(}��
txdO�q�S���
��n�}����	���	����������f:

���?N�º�������
���a����1�?V�		ر�
�<#�
�ٲ
���;�;g��ѻ��@f�D�.ۄdt4�D��U 8
�]�
	4�TS�[�0K��fƛ�j�SiФ;0���0f;��P
J��Dv���P��Ȓ=��|b��U�P��bP�jA�	:��;libs/mediabox-advanced/mediabox-Dark.css000064400000007036151165346500014225
0ustar00		/*	mediaboxAdvanced Dark theme	*/
		/*	version 2.6 - June 2011			*/
		/*	for mediaboxAdvanced v.1.5.x	*/

		/*	Overlay background styling	*/

#mbOverlay {
	position: fixed;
	z-index: 9998;
	top: 0;
	left: 0;
	width: 100%;
	height: 150%;
	background-color: #000;
	cursor: pointer;
}

		/*	Fixes for older or limited browsers	*/

#mbOverlay.mbOverlayOpaque {
	background: transparent url(80.png) repeat;
}

#mbOverlay.mbOverlayAbsolute {
	position: absolute;
}

#mbOverlay.mbMobile {
	position: absolute;
	background-color: transparent;
}

#mbBottom.mbMobile {
	line-height: 24px;
	font-size: 16px;
}

		/*	Overlay panel styling	*/

#mbCenter {
	position: absolute;
	z-index: 9999;
	left: 50%;
	padding: 10px;
	background-color: #000;
	-webkit-border-radius: 10px;
	-khtml-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5,
Direction=180, Color='#000000'); /* For IE 5.5 - 7 */
	-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5,
Direction=180, Color='#000000')"; /* For IE 8 */
	-webkit-box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
	-khtml-box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
	-moz-box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
	box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
}

#mbCenter.mbLoading {
	background: #000 url(loading-dark.gif) no-repeat center;
		/*	This style is applied only during animation.	*/
		/*	For example, the next lines turn off shadows	*/
		/*	improving browser performance on slow systems.	*/
		/*	To leave shadows on, just remove the following:	*/
	-webkit-box-shadow: none;
	-khtml-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}

#mbMedia {
	position: relative;
	left: 0;
	top: 0;

		/*	Inline content styling	*/

	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #fff;
	text-align: left;
	background-position: center center;
	background-repeat: no-repeat;
}

		/*	Title, Caption and Button styling	*/

#mbBottom {
	line-height: 20px;
	font-size: 12px;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	text-align: left;
	color: #999;
	min-height: 20px;
	padding: 10px 0 0;
}

#mbTitle, #mbPrevLink, #mbNextLink, #mbCloseLink {
	display: inline;
	color: #fff;
	font-weight: bold;
}

#mbNumber {
	display: inline;
	color: #999;
/*	line-height: 0.8em; */
	font-size: 0.8em;
	margin: auto 10px;
}

#mbCaption {
	display: block;
	color: #999;
	line-height: 1.6em;
	font-size: 0.8em;
}

#mbPrevLink, #mbNextLink, #mbCloseLink {
	float: right;
	outline: none;
	margin: 0 0 0 10px;
	font-weight: normal;
}

#mbPrevLink b, #mbNextLink b, #mbCloseLink b {
	color: #eee;
	font-weight: bold;
	text-decoration: underline;
}

#mbPrevLink big, #mbNextLink big, #mbCloseLink big {
	color: #eee;
	font-size: 1.4em;
/*	line-height: 0.9em;*/
	font-weight: bold;
}

#mbBottom a, #mbBottom a:link, #mbBottom a:visited {	/* Thanks to Danny
Jung for feedback and corrections */
	text-decoration: none;
	color: #ddd;
}

#mbBottom a:hover, #mbBottom a:active {
	text-decoration: underline;
	color: #fff;
}

		/*	Error message styling	*/

#mbError {
	position: relative;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #fff;
	text-align: center;
	border: 10px solid #700;
	padding: 10px 10px 10px;
	margin: 20px;
	-webkit-border-radius: 5px;
	-khtml-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}

#mbError a, #mbError a:link, #mbError a:visited, #mbError a:hover, #mbError
a:active {
	color: #d00;
	font-weight: bold;
	text-decoration: underline;
}libs/mediabox-advanced/mediabox-Light.css000064400000007324151165346500014413
0ustar00		/*	mediaboxAdvanced Light theme	*/
		/*	version 2.6 - June 2011			*/
		/*	for mediaboxAdvanced v.1.5.x	*/

		/*	Overlay background styling	*/

#mbOverlay {
	position: fixed;
	z-index: 9998;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	background-color: #ccc;
	cursor: pointer;
}

		/*	Fixes for older or limited browsers	*/

#mbOverlay.mbOverlayOpaque {
	background: transparent url(80.png) repeat;
}

#mbOverlay.mbOverlayAbsolute {
	position: absolute;
}

#mbOverlay.mbMobile {
	position: absolute;
	background-color: transparent;
}

#mbBottom.mbMobile {
	line-height: 24px;
	font-size: 16px;
}

		/*	Overlay panel styling	*/

#mbCenter {
	position: absolute;
	z-index: 9999;
	left: 50%;
	padding: 10px;
	background-color: #fff;
	-webkit-border-radius: 10px;
	-khtml-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5,
Direction=180, Color='#000000'); /* For IE 5.5 - 7 */
	-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5,
Direction=180, Color='#000000')"; /* For IE 8 */
	-webkit-box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
	-khtml-box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
	-moz-box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
	box-shadow: 0px 5px 20px rgba(0,0,0,0.50);
}

#mbCenter.mbLoading {
	background: #fff url(loading-light.gif) no-repeat center;
		/*	This style is applied only during animation.	*/
		/*	For example, the next lines turn off shadows	*/
		/*	improving browser performance on slow systems.	*/
		/*	To leave shadows on, just remove the following:	*/
	-webkit-box-shadow: none;
	-khtml-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}

#mbMedia {
	position: relative;
	left: 0;
	top: 0;

		/*	Inline content styling	*/

	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #000;
	text-align: left;
	background-position: center center;
	background-repeat: no-repeat;
}

@mbMedia img {
	-webkit-border-radius: 4px;
	-khtml-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
}

#mbAudio {
	padding: 0 0 2px;
	background-color: #000;
}

		/*	Title, Caption and Button styling	*/

#mbBottom {
	line-height: 20px;
	font-size: 12px;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	text-align: left;
	color: #777;
	min-height: 20px;
	padding: 10px 0 0;
}

#mbTitle, #mbPrevLink, #mbNextLink, #mbCloseLink {
	display: inline;
	color: #000;
	font-weight: bold;
}

#mbNumber {
	display: inline;
	color: #777;
/*	line-height: 0.8em; */
	font-size: 0.8em;
	margin: auto 10px;
}

#mbCaption {
	display: block;
	color: #777;
	line-height: 1.6em;
	font-size: 0.8em;
}

#mbPrevLink, #mbNextLink, #mbCloseLink {
	float: right;
	outline: none;
	margin: 0 0 0 10px;
	font-weight: normal;
}

#mbPrevLink b, #mbNextLink b, #mbCloseLink b {
	color: #333;
	font-weight: bold;
	text-decoration: underline;
}

#mbPrevLink big, #mbNextLink big, #mbCloseLink big {
	color: #333;
	font-size: 1.4em;
/*	line-height: 0.9em;*/
	font-weight: bold;
}

#mbBottom a, #mbBottom a:link, #mbBottom a:visited {	/* Thanks to Danny
Jung for feedback and corrections */
	text-decoration: none;
	color: #333;
}

#mbBottom a:hover, #mbBottom a:active {
	text-decoration: underline;
	color: #000;
}

		/*	Error message styling	*/

#mbError {
	position: relative;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #fff;
	text-align: center;
	border: 10px solid #700;
	padding: 10px 10px 10px;
	margin: 20px;
	-webkit-border-radius: 5px;
	-khtml-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}

#mbError a, #mbError a:link, #mbError a:visited, #mbError a:hover, #mbError
a:active {
	color: #d00;
	font-weight: bold;
	text-decoration: underline;
}libs/mediabox-advanced/mediabox-Minimal.css000064400000006211151165346500014724
0ustar00		/*	mediaboxAdvanced Minimal theme	*/
		/*	version 2.6 - June 2011			*/
		/*	for mediaboxAdvanced v.1.5.x	*/

		/*	Overlay background styling	*/

#mbOverlay {
	position: fixed;
	z-index: 9998;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	background-color: #000;
	cursor: pointer;
}

		/*	Fixes for older or limited browsers	*/

#mbOverlay.mbOverlayOpaque {
	background: transparent url(80.png) repeat;
}

#mbOverlay.mbOverlayAbsolute {
	position: absolute;
}

#mbOverlay.mbMobile {
	position: absolute;
	background-color: transparent;
}

#mbBottom.mbMobile {
	line-height: 24px;
	font-size: 14px;
}

		/*	Overlay panel styling	*/

#mbCenter {
	position: absolute;
	z-index: 9999;
	left: 50%;
	background-color: rgba(0,0,0,0.4);
}

#mbCenter.mbLoading {
	background: rgba(0,0,0,0.4) url(loading-minimal.gif) no-repeat center;
}

#mbMedia {
	position: relative;
	left: 0;
	top: 0;
	-webkit-box-shadow: 0px 5px 20px rgba(0,0,0,0.60);
	-khtml-box-shadow: 0px 5px 20px rgba(0,0,0,0.60);
	-moz-box-shadow: 0px 5px 20px rgba(0,0,0,0.60);
	box-shadow: 0px 5px 20px rgba(0,0,0,0.60);
	filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5,
Direction=180, Color='#000000'); /* For IE 5.5 - 7 */
	-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5,
Direction=180, Color='#000000')"; /* For IE 8 */

		/*	Inline content styling	*/

	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #fff;
	text-align: left;
	background-position: center center;
	background-repeat: no-repeat;
}

		/*	Title, Caption and Button styling	*/

#mbBottom {
	line-height: 20px;
	font-size: 12px;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	text-align: left;
	color: #999;
	min-height: 20px;
	padding: 10px 6px 4px;
}

#mbTitle, #mbPrevLink, #mbNextLink, #mbCloseLink {
	display: inline;
	color: #fff;
	font-weight: bold;
}

#mbNumber {
	display: inline;
	color: #999;
/*	line-height: 0.8em; */
	font-size: 0.8em;
	margin: auto 10px;
}

#mbCaption {
	display: block;
	color: #999;
	line-height: 1.6em;
	font-size: 0.8em;
}

#mbPrevLink, #mbNextLink, #mbCloseLink {
	float: right;
	outline: none;
	margin: 0 0 0 10px;
	font-weight: normal;
}

#mbPrevLink b, #mbNextLink b, #mbCloseLink b {
	color: #eee;
	font-weight: bold;
	text-decoration: underline;
}

#mbPrevLink big, #mbNextLink big, #mbCloseLink big {
	color: #eee;
	font-size: 1.4em;
/*	line-height: 0.9em;*/
	font-weight: bold;
}

#mbBottom a, #mbBottom a:link, #mbBottom a:visited {	/* Thanks to Danny
Jung for feedback and corrections */
	text-decoration: none;
	color: #ddd;
}

#mbBottom a:hover, #mbBottom a:active {
	text-decoration: underline;
	color: #fff;
}

		/*	Error message styling	*/

#mbError {
	position: relative;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #fff;
	text-align: center;
	border: 10px solid #700;
	padding: 10px 10px 10px;
	margin: 20px;
	-webkit-border-radius: 5px;
	-khtml-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}

#mbError a, #mbError a:link, #mbError a:visited, #mbError a:hover, #mbError
a:active {
	color: #d00;
	font-weight: bold;
	text-decoration: underline;
}libs/mediabox-advanced/mediabox-Smooth.css000064400000013705151165346500014615
0ustar00		/*	mediaboxAdvanced Smooth theme	*/
		/*	version 2.6 - June 2011			*/
		/*	for mediaboxAdvanced v.1.5.x	*/

		/*	Overlay background styling	*/

#mbOverlay {
	position: fixed;
	z-index: 9998;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	background-color: #222;
	cursor: pointer;
}

		/*	Fixes for older or limited browsers	*/

#mbOverlay.mbOverlayOpaque {
	background: transparent url(80.png) repeat;
}

#mbOverlay.mbOverlayAbsolute {
	position: absolute;
}

#mbOverlay.mbMobile {
	position: absolute;
	background-color: transparent;
}

#mbBottom.mbMobile {
	line-height: 24px;
	font-size: 16px;
}

		/*	Overlay panel styling	*/

#mbCenter {
	position: absolute;
	z-index: 9999;
	left: 50%;
	-webkit-border-radius: 10px;
	-khtml-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	background-color: #bbb;	/* for non-css3 browsers */
	filter:
progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd',
endColorstr='#aaaaaa'); /* IE 5.5 - 7 */
	-ms-filter:
progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd',
endColorstr='#aaaaaa'); /* IE 8 */
	background: -webkit-gradient(linear, left top, left bottom, from(#ddd),
to(#aaa));
	background: -khtml-gradient(linear, left top, left bottom, from(#ddd),
to(#aaa));
	background: -moz-linear-gradient(top,  #ddd,  #aaa);
	background: -o-linear-gradient(top,  #ddd,  #aaa);
	background: linear-gradient(top,  #ddd,  #aaa);
	border: 1px solid #fff;
	border-top-color: #fff;
	border-bottom-color: #ccc;
	border-right-width: 0px;
	border-left-width: 0px;
	-webkit-box-shadow: 0px 4px 24px rgba(0,0,0,0.4);
	-khtml-box-shadow: 0px 4px 24px rgba(0,0,0,0.4);
	-moz-box-shadow: 0px 4px 24px rgba(0,0,0,0.4);
	box-shadow: 0px 4px 24px rgba(0,0,0,0.4);
	padding: 10px;
	text-shadow: rgba(255,255,255,0.5) 0 1px 1px;
}

#mbCenter.mbLoading {
/*	background: #000 url(/images/mediabox/MinimalLoading.gif) no-repeat
center;
/*	This style is applied only during animation.	*/
/*	For example, the next lines turn off shadows	*/
/*	improving browser performance on slow systems.	*/
/*	To leave shadows on, just remove the following:	*/
	-webkit-box-shadow: none;
	-khtml-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}

#mbMedia {
	position: relative;
	left: 0;
	top: 0;
	-webkit-border-radius: 4px;
	-khtml-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;

		/*	Inline content styling	*/

	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #000;
	text-align: left;
	background-position: center center;
	background-repeat: no-repeat;
}


#mbAudio {
	padding: 0 0 2px;
	-webkit-border-radius: 4px;
	-khtml-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	background-color: #999;	/* for non-css3 browsers */
	filter:
progid:DXImageTransform.Microsoft.gradient(startColorstr='#999999',
endColorstr='#cccccc'); /* IE 5.5 - 7 */
	-ms-filter:
progid:DXImageTransform.Microsoft.gradient(startColorstr='#999999',
endColorstr='#cccccc'); /* IE 8 */
	background: -webkit-gradient(linear, left top, left bottom, from(#888),
to(#aaa));
	background: -khtml-gradient(linear, left top, left bottom, from(#888),
to(#aaa));
	background: -moz-linear-gradient(top,  #999,  #ccc);
	background: -o-linear-gradient(top,  #999,  #ccc);
	background: linear-gradient(top,  #999,  #ccc);
	border: 1px solid #fff;
	border-top-color: #777;
	border-bottom-color: #eee;
	border-right-width: 0px;
	border-left-width: 0px;
	height: 20px;
}

		/*	Title, Caption and Button styling	*/

#mbBottom {
	line-height: 20px;
	font-size: 12px;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	text-align: left;
	color: #444;
	min-height: 20px;
	padding: 10px 0 0;
}

#mbTitle, #mbPrevLink, #mbNextLink, #mbCloseLink {
	display: inline;
	color: #000;
	font-weight: bold;
}

#mbNumber {
	display: inline;
	color: #444;
/*	line-height: 0.8em; */
	font-size: 0.8em;
	margin: auto 10px;
}

#mbCaption {
	display: block;
	color: #444;
	line-height: 1.6em;
	font-size: 0.8em;
}

#mbPrevLink, #mbNextLink, #mbCloseLink {
	float: right;
	outline: none;
	font-weight: normal;
	margin: 0 0 0 10px;
	padding: 4px 2px;
}

#mbPrevLink b, #mbNextLink b, #mbCloseLink b {
	color: #222;
	font-weight: bold;
	text-decoration: underline;
}

#mbPrevLink big, #mbNextLink big, #mbCloseLink big {
	color: #222;
	font-size: 1.6em;
	line-height: 0.6em;
	font-weight: bold;
}

#mbBottom a, #mbBottom a:link, #mbBottom a:visited {
	text-decoration: none;
	color: #222;
	-webkit-border-radius: 4px;
	-khtml-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
}

#mbBottom a:hover {
	color: #000;
	text-shadow: rgba(255,255,255,1.0) 0 1px 1px;
	background-color: #ccc;	/* for non-css3 browsers */
}

#mbBottom a:active {
	color: #000;
	text-shadow: rgba(255,255,255,1.0) 0 1px 1px;
	background-color: #999;	/* for non-css3 browsers */
	filter:
progid:DXImageTransform.Microsoft.gradient(startColorstr='#999999',
endColorstr='#cccccc'); /* IE 5.5 - 7 */
	-ms-filter:
progid:DXImageTransform.Microsoft.gradient(startColorstr='#999999',
endColorstr='#cccccc'); /* IE 8 */
	background: -webkit-gradient(linear, left top, left bottom, from(#888),
to(#aaa));
	background: -khtml-gradient(linear, left top, left bottom, from(#888),
to(#aaa));
	background: -moz-linear-gradient(top,  #999,  #ccc);
	background: -o-linear-gradient(top,  #999,  #ccc);
	background: linear-gradient(top,  #999,  #ccc);
	border: 1px solid #fff;
	border-top-color: #777;
	border-bottom-color: #eee;
	border-right-width: 0px;
	border-left-width: 0px;
}

		/*	Error message styling	*/

#mbError {
	position: relative;
	font-family: Myriad, Verdana, Arial, Helvetica, sans-serif;
	line-height: 20px;
	font-size: 12px;
	color: #000;
	text-align: center;
	border: 10px solid #700;
	padding: 10px 10px 10px;
	margin: 20px;
	-webkit-border-radius: 5px;
	-khtml-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}

#mbError a, #mbError a:link, #mbError a:visited, #mbError a:hover, #mbError
a:active {
	color: #d00;
	font-weight: bold;
	text-decoration: underline;
}libs/mediabox-advanced/mediaboxAdv.js000064400000127322151165346500013626
0ustar00/*
mediaboxAdvanced v1.5.4 - The ultimate extension of Slimbox and Mediabox;
an all-media script
updated 2011.2.19
	(c) 2007-2011 John Einselen - http://iaian7.com
based on Slimbox v1.64 - The ultimate lightweight Lightbox clone
	(c) 2007-2008 Christophe Beyls - http://www.digitalia.be

description: The ultimate extension of Slimbox and Mediabox; an all-media
script

license: MIT-style

authors:
- John Einselen
- Christophe Beyls
- Contributions from many others

requires:
- core/1.3.2: [Core, Array, String, Number, Function, Object, Event,
Browser, Class, Class.Extras, Slick.*, Element.*, FX.*, DOMReady, Swiff]
- Quickie/2.1: '*'

provides: [Mediabox.open, Mediabox.close, Mediabox.recenter,
Mediabox.scanPage]
*/

var Mediabox;

(function() {
	// Global variables, accessible to Mediabox only
	var options, mediaArray, activeMedia, prevMedia, nextMedia, top, mTop,
left, mLeft, winWidth, winHeight, fx, preload, preloadPrev = new Image(),
preloadNext = new Image(),
	// DOM elements
	overlay, center, media, bottom, captionSplit, title, caption, number,
prevLink, nextLink,
	// Mediabox specific vars
	URL, WH, WHL, elrel, mediaWidth, mediaHeight, mediaType =
"none", mediaSplit, mediaId = "mediaBox", margin,
marginBottom;

	/*	Initialization	*/

	window.addEvent("domready", function() {
		// Create and append the Mediabox HTML code at the bottom of the document
		document.id(document.body).adopt(
			$$([
				overlay = new Element("div", {id:
"mbOverlay"}).addEvent("click", close),
				center = new Element("div", {id: "mbCenter"})
			]).setStyle("display", "none")
		);

		container = new Element("div", {id:
"mbContainer"}).inject(center, "inside");
			media = new Element("div", {id:
"mbMedia"}).inject(container, "inside");
		bottom = new Element("div", {id:
"mbBottom"}).inject(center, "inside").adopt(
			closeLink = new Element("a", {id: "mbCloseLink",
href: "#"}).addEvent("click", close),
			nextLink = new Element("a", {id: "mbNextLink", href:
"#"}).addEvent("click", next),
			prevLink = new Element("a", {id: "mbPrevLink", href:
"#"}).addEvent("click", previous),
			title = new Element("div", {id: "mbTitle"}),
			number = new Element("div", {id: "mbNumber"}),
			caption = new Element("div", {id: "mbCaption"})
			);

		fx = {
			overlay: new Fx.Tween(overlay, {property: "opacity", duration:
360}).set(0),
			media: new Fx.Tween(media, {property: "opacity", duration:
360, onComplete: captionAnimate}),
			bottom: new Fx.Tween(bottom, {property: "opacity", duration:
240}).set(0)
		};
	});

	/*	API		*/

	Mediabox = {
		close: function(){
			close();	// Thanks to Yosha on the google group for fixing the close
function API!
		},

		recenter: function(){	// Thanks to Garo Hussenjian (Xapnet Productions
http://www.xapnet.com) for suggesting this addition
			if (center && !Browser.Platform.ios) {
				left = window.getScrollLeft() + (window.getWidth()/2);
				center.setStyles({left: left, marginLeft: -(mediaWidth/2)-margin});
//				top = window.getScrollTop() + (window.getHeight()/2);
//				margin =
center.getStyle('padding-left').toInt()+media.getStyle('margin-left').toInt()+media.getStyle('padding-left').toInt();
//				center.setStyles({top: top, left: left, marginTop:
-(mediaHeight/2)-margin, marginLeft: -(mediaWidth/2)-margin});
			}
		},

		open: function(_mediaArray, startMedia, _options) {
			options = {
//			Text options (translate as needed)
				buttonText:
['<big>&laquo;</big>','<big>&raquo;</big>','<big>&times;</big>'],		//
Array defines "previous", "next", and "close"
button content (HTML code should be written as entity codes or properly
escaped)
//				buttonText:
['<big>«</big>','<big>»</big>','<big>×</big>'],
//				buttonText:
['<b>P</b>rev','<b>N</b>ext','<b>C</b>lose'],
				counterText: '({x} of {y})',	// Counter text, {x} = current
item number, {y} = total gallery length
				linkText: '<a href="{x}"
target="_new">{x}</a><br/>open in a new
tab</div>',	// Text shown on iOS devices for non-image links
				flashText: '<b>Error</b><br/>Adobe Flash is
either not installed or not up to date, please visit <a
href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash"
title="Get Flash" target="_new">Adobe.com</a>
to download the free player.',	// Text shown if Flash is not
installed.
//			General overlay options
				center: true,					// Set to false for use with custom CSS layouts
				loop: false,					// Navigate from last to first elements in a gallery
				keyboard: true,					// Enables keyboard control; escape key, left
arrow, and right arrow
				keyboardAlpha: false,			// Adds 'x', 'c',
'p', and 'n' when keyboard control is also set to true
				keyboardStop: false,			// Stops all default keyboard actions while
overlay is open (such as up/down arrows)
												// Does not apply to iFrame content, does not affect mouse
scrolling
				overlayOpacity: 0.8,			// 1 is opaque, 0 is completely transparent
(change the color in the CSS file)
				resizeOpening: true,			// Determines if box opens small and grows
(true) or starts at larger size (false)
				resizeDuration: 240,			// Duration of each of the box resize animations
(in milliseconds)
				initialWidth: 320,				// Initial width of the box (in pixels)
				initialHeight: 180,				// Initial height of the box (in pixels)
				defaultWidth: 640,				// Default width of the box (in pixels) for
undefined media (MP4, FLV, etc.)
				defaultHeight: 360,				// Default height of the box (in pixels) for
undefined media (MP4, FLV, etc.)
				showCaption: true,				// Display the title and caption, true / false
				showCounter: true,				// If true, a counter will only be shown if there
is more than 1 image to display
				countBack: false,				// Inverts the displayed number (so instead of the
first element being labeled 1/10, it's 10/10)
				clickBlock: true,				// Adds an event on right-click to block saving of
images from the context menu in most browsers (this can't prevent
other ways of downloading, but works as a casual deterent)
								// due to less than ideal code ordering, clickBlock on links must
be removed manually around line 250
//			iOS device options
//				iOSenable: false,				// When set to false, disables overlay entirely
(links open in new tab)
												// IMAGES and INLINE content will display normally,
												// while ALL OTHER content will display a direct link (this is
required so as to not break mixed-media galleries)
				iOShtml: true,					// If set to true, HTML content is displayed
normally as well (useful if your HTML content is minimal and UI oriented
instead of external sites)
//			Image options
				imgBackground: false,		// Embed images as CSS background (true) or
<img> tag (false)
											// CSS background is naturally non-clickable, preventing
downloads
											// IMG tag allows automatic scaling for smaller screens
											// (all images have no-click code applied, albeit not Opera
compatible. To remove, comment lines 212 and 822)
				imgPadding: 100,			// Clearance necessary for images larger than the
window size (only used when imgBackground is false)
											// Change this number only if the CSS style is significantly
divergent from the original, and requires different sizes
//			Inline options
				overflow: 'auto',			// If set, overides CSS settings for
inline content only, set to "false" to leave CSS settings intact.
				inlineClone: false,			// Clones the inline element instead of moving it
from the page to the overlay
//			Global media options
				html5: 'true',				// HTML5 settings for YouTube and Vimeo,
false = off, true = on
				scriptaccess: 'true',		// Allow script access to flash files
				fullscreen: 'true',			// Use fullscreen
				fullscreenNum: '1',			// 1 = true
				autoplay: 'true',			// Plays the video as soon as it's
opened
				autoplayNum: '1',			// 1 = true
				autoplayYes: 'yes',			// yes = true
				volume: '100',				// 0-100, used for NonverBlaster and
Quicktime players
				medialoop: 'true',			// Loop video playback, true / false,
used for NonverBlaster and Quicktime players
				bgcolor: '#000000',			// Background color, used for flash and
QT media
				wmode: 'transparent',			// Background setting for Adobe Flash
('opaque' and 'transparent' are most common)
//			NonverBlaster
				playerpath:
'components/com_fabrik/libs/mediabox-advanced/NonverBlaster.swf',	//
Path to NonverBlaster.swf
				showTimecode: 'false',		// turn timecode display off or on
(true, false)
				controlColor: '0xFFFFFF',	// set the control color
				controlBackColor: '0x0000000',	// set the bakcground color
(video only)
//				playerBackColor: '0x0000FF',	// set the player background
color (leave blank to allow CSS styles to show through for audio)
				playerBackColor: '',	// set the player background color
(leave blank to allow CSS styles to show through)
				wmodeNB: 'transparent',			// Background setting for Adobe
Flash (set to 'transparent' for a blank background,
'opaque' in other situations)
//				autoAdvance: 'false',		// placeholder setting only - not
currently implemented (intending to add auto gallery list navigation on
play-end)
//			Quicktime options
				controller: 'true',			// Show controller, true / false
//			Flickr options
				flInfo: 'true',				// Show title and info at video start
//			Revver options
				revverID: '187866',			// Revver affiliate ID, required for ad
revinue sharing
				revverFullscreen: 'true',	// Fullscreen option
				revverBack: '000000',		// Background color
				revverFront: 'ffffff',		// Foreground color
				revverGrad: '000000',		// Gradation color
//			Ustream options
				usViewers: 'true',			// Show online viewer count (true,
false)
//			Youtube options
				ytBorder: '0',				// Outline				(1=true, 0=false)
				ytColor1: '000000',			// Outline color
				ytColor2: '333333',			// Base interface color (highlight
colors stay consistent)
				ytRel: '0',					// Show related videos	(1=true, 0=false)
				ytInfo: '1',				// Show video info		(1=true, 0=false)
				ytSearch: '0',				// Show search field	(1=true, 0=false)
//			Viddyou options
				vuPlayer: 'basic',			// Use 'full' or
'basic' players
//			Vimeo options
				vmTitle: '1',				// Show video title
				vmByline: '1',				// Show byline
				vmPortrait: '1',			// Show author portrait
				vmColor: 'ffffff'			// Custom controller colors, hex value
minus the # sign, defult is 5ca0b5
			};

			prevLink.set('html', options.buttonText[0]);
			nextLink.set('html', options.buttonText[1]);
			closeLink.set('html', options.buttonText[2]);

			if (Browser.firefox2) {	// Fixes Firefox 2 and Camino 1.6
incompatibility with opacity + flash
				options.overlayOpacity = 1;
				overlay.className = 'mbOverlayOpaque';
			}

			if (Browser.Platform.ios) {
				options.keyboard = false;
				options.resizeOpening = false;	// Speeds up interaction on small
devices (mobile) or older computers (IE6)
				overlay.className = 'mbMobile';
				bottom.className = 'mbMobile';
//				options.overlayOpacity = 0.001;	// Helps ameliorate the issues with
CSS overlays in iOS, leaving a clickable background, but avoiding the
visible issues
				position();
			}

			if (Browser.ie6) {
				options.resizeOpening = false;	// Speeds up interaction on small
devices (mobile) or older computers (IE6)
				overlay.className = 'mbOverlayAbsolute';
				position();
			}

			if (typeof _mediaArray == "string") {	// Used for single
mediaArray only, with URL and Title as first two arguments
				_mediaArray = [[_mediaArray,startMedia,_options]];
				startMedia = 0;
			}

			mediaArray = _mediaArray;
			options.loop = options.loop && (mediaArray.length > 1);

			size();
			setup(true);
			top = window.getScrollTop() + (window.getHeight()/2);
			left = window.getScrollLeft() + (window.getWidth()/2);
			/**
			 * $$$ hugh - patch to fix margin in IE11
			 */
			//margin =
center.getStyle('padding-left').toInt()+media.getStyle('margin-left').toInt()+media.getStyle('padding-left').toInt();
			margin = (center.getStyle('padding-left').toInt() || 0) +
(media.getStyle('margin-left').toInt() || 0) +
(media.getStyle('padding-left').toInt() || 0);
			marginBottom =
bottom.getStyle('margin-left').toInt()+bottom.getStyle('padding-left').toInt()+bottom.getStyle('margin-right').toInt()+bottom.getStyle('padding-right').toInt();

/****/		center.setStyles({top: top, left: left, width:
options.initialWidth, height: options.initialHeight, marginTop:
-(options.initialHeight/2)-margin, marginLeft:
-(options.initialWidth/2)-margin, display: ""});
			fx.resize = new Fx.Morph(center, {duration: options.resizeDuration,
onComplete: mediaAnimate});
			fx.overlay.start(options.overlayOpacity);
			return changeMedia(startMedia);
		}
	};

	Element.implement({
		mediabox: function(_options, linkMapper) {
			$$(this).mediabox(_options, linkMapper);	// The processing of a single
element is similar to the processing of a collection with a single element

			return this;
		}
	});

	Elements.implement({
		/*
			options:	Optional options object, see Mediabox.open()
			linkMapper:	Optional function taking a link DOM element and an index as
arguments and returning an array containing 3 elements:
						the image URL and the image caption (may contain HTML)
			linksFilter:Optional function taking a link DOM element and an index as
arguments and returning true if the element is part of
						the image collection that will be shown on click, false if not.
"this" refers to the element that was clicked.
						This function must always return true when the DOM element argument
is "this".
		*/
		mediabox: function(_options, linkMapper, linksFilter) {
			linkMapper = linkMapper || function(el) {
				elrel = el.rel.split(/[\[\]]/);
				elrel = elrel[1];
				return [el.get('href'), el.title, elrel];	// thanks to Dušan
Medlín for figuring out the URL bug!
			};

			linksFilter = linksFilter || function() {
				return true;
			};

			var links = this;

/*  clickBlock code - remove the following three lines to enable
right-clicking on links to images  */
			links.addEvent('contextmenu', function(e){
				if (this.toString().match(/\.gif|\.jpg|\.jpeg|\.png/i)) e.stop();
			});

			links.removeEvents("click").addEvent("click",
function() {
				// Build the list of media that will be displayed
				var filteredArray = links.filter(linksFilter, this);
				var filteredLinks = [];
				var filteredHrefs = [];

				filteredArray.each(function(item, index){
					if(filteredHrefs.indexOf(item.toString()) < 0) {
						filteredLinks.include(filteredArray[index]);
						filteredHrefs.include(filteredArray[index].toString());
					}
				});

				return Mediabox.open(filteredLinks.map(linkMapper),
filteredHrefs.indexOf(this.toString()), _options);
			});

			return links;
		}
	});

	/*	Internal functions	*/

	function position() {
		overlay.setStyles({top: window.getScrollTop(), left:
window.getScrollLeft()});
	}

	function size() {
		winWidth = window.getWidth();
		winHeight = window.getHeight();
		overlay.setStyles({width: winWidth, height: winHeight});
	}

	function setup(open) {
		// Hides on-page objects and embeds while the overlay is open, nessesary
to counteract Firefox stupidity
		if (Browser.firefox) {
			["object", window.ie ? "select" :
"embed"].forEach(function(tag) {
				Array.forEach($$(tag), function(el) {
					if (open) el._mediabox = el.style.visibility;
					el.style.visibility = open ? "hidden" : el._mediabox;
				});
			});
		}

		overlay.style.display = open ? "" : "none";

		var fn = open ? "addEvent" : "removeEvent";
		if (Browser.Platform.ios || Browser.ie6) window[fn]("scroll",
position);	// scroll position is updated only after movement has stopped
		window[fn]("resize", size);
		if (options.keyboard) document[fn]("keydown", keyDown);
	}

	function keyDown(event) {
		if (options.keyboardAlpha) {
			switch(event.code) {
				case 27:	// Esc
				case 88:	// 'x'
				case 67:	// 'c'
					close();
					break;
				case 37:	// Left arrow
				case 80:	// 'p'
					previous();
					break;
				case 39:	// Right arrow
				case 78:	// 'n'
					next();
			}
		} else {
			switch(event.code) {
				case 27:	// Esc
					close();
					break;
				case 37:	// Left arrow
					previous();
					break;
				case 39:	// Right arrow
					next();
			}
		}
		if (options.keyboardStop) { return false; }
	}

	function previous() {
		return changeMedia(prevMedia);
	}

	function next() {
		return changeMedia(nextMedia);
	}

	function changeMedia(mediaIndex) {
		if (mediaIndex >= 0) {
//			if (Browser.Platform.ios && !options.iOSenable) {
//				window.open(mediaArray[mediaIndex][0], "_blank");
//				close();
//				return false;
//			}
			media.set('html', '');
			activeMedia = mediaIndex;
			prevMedia = ((activeMedia || !options.loop) ? activeMedia :
mediaArray.length) - 1;
			nextMedia = activeMedia + 1;
			if (nextMedia == mediaArray.length) nextMedia = options.loop ? 0 : -1;
			stop();
			center.className = "mbLoading";
			if (preload && mediaType == "inline" &&
!options.inlineClone) preload.adopt(media.getChildren());	// prevents loss
of adopted data

	/*	mediaboxAdvanced link formatting and media support	*/

			if (!mediaArray[mediaIndex][2]) mediaArray[mediaIndex][2] =
'';	// Thanks to Leo Feyer for offering this fix
			WH = mediaArray[mediaIndex][2].split(' ');
			WHL = WH.length;
			if (WHL>1) {
//				mediaWidth = (WH[WHL-2].match("%")) ?
(window.getWidth()*((WH[WHL-2].replace("%",
""))*0.01))+"px" : WH[WHL-2]+"px";
				mediaWidth = (WH[WHL-2].match("%")) ?
(window.getWidth()*((WH[WHL-2].replace("%", ""))*0.01))
: WH[WHL-2];
//				mediaHeight = (WH[WHL-1].match("%")) ?
(window.getHeight()*((WH[WHL-1].replace("%",
""))*0.01))+"px" : WH[WHL-1]+"px";
				mediaHeight = (WH[WHL-1].match("%")) ?
(window.getHeight()*((WH[WHL-1].replace("%",
""))*0.01)) : WH[WHL-1];
			} else {
				mediaWidth = "";
				mediaHeight = "";
			}
			URL = mediaArray[mediaIndex][0];
//			URL =
encodeURI(URL).replace("(","%28").replace(")","%29");
//			URL =
encodeURI(URL).replace("(","%28").replace(")","%29").replace("%20","
");
			captionSplit = mediaArray[activeMedia][1].split('::');

// Quietube and yFrog support
			if (URL.match(/quietube\.com/i)) {
				mediaSplit = URL.split('v.php/');
				URL = mediaSplit[1];
			} else if (URL.match(/\/\/yfrog/i)) {
				mediaType = (URL.substring(URL.length-1));
				if (mediaType.match(/b|g|j|p|t/i)) mediaType = 'image';
				if (mediaType == 's') mediaType = 'flash';
				if (mediaType.match(/f|z/i)) mediaType = 'video';
				URL = URL+":iphone";
			}

	/*	Specific Media Types	*/

// GIF, JPG, PNG
			if (URL.match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i) || mediaType ==
'image') {
				mediaType = 'img';
				URL = URL.replace(/twitpic\.com/i, "twitpic.com/show/full");
				preload = new Image();
				preload.onload = startEffect;
				preload.src = URL;
// FLV, MP4
			} else if (URL.match(/\.flv|\.mp4/i) || mediaType == 'video')
{
				mediaType = 'obj';
				mediaWidth = mediaWidth || options.defaultWidth;
				mediaHeight = mediaHeight || options.defaultHeight;
				preload = new
Swiff(''+options.playerpath+'?mediaURL='+URL+'&allowSmoothing=true&autoPlay='+options.autoplay+'&buffer=6&showTimecode='+options.showTimecode+'&loop='+options.medialoop+'&controlColor='+options.controlColor+'&controlBackColor='+options.controlBackColor+'&playerBackColor='+options.playerBackColor+'&defaultVolume='+options.volume+'&scaleIfFullScreen=true&showScalingButton=true&crop=false',
{
					id: 'mbVideo',
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmodeNB, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// MP3, AAC
			} else if (URL.match(/\.mp3|\.aac|tweetmic\.com|tmic\.fm/i) || mediaType
== 'audio') {
				mediaType = 'obj';
				mediaWidth = mediaWidth || options.defaultWidth;
				mediaHeight = mediaHeight || "17";
				if (URL.match(/tweetmic\.com|tmic\.fm/i)) {
					URL = URL.split('/');
					URL[4] = URL[4] || URL[3];
					URL =
"http://media4.fjarnet.net/tweet/tweetmicapp-"+URL[4]+'.mp3';
				}
				preload = new
Swiff(''+options.playerpath+'?mediaURL='+URL+'&allowSmoothing=true&autoPlay='+options.autoplay+'&buffer=6&showTimecode='+options.showTimecode+'&loop='+options.medialoop+'&controlColor='+options.controlColor+'&controlBackColor='+options.controlBackColor+'&defaultVolume='+options.volume+'&scaleIfFullScreen=true&showScalingButton=true&crop=false',
{
					id: 'mbAudio',
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// SWF
			} else if (URL.match(/\.swf/i) || mediaType == 'flash') {
				mediaType = 'obj';
				mediaWidth = mediaWidth || options.defaultWidth;
				mediaHeight = mediaHeight || options.defaultHeight;
				preload = new Swiff(URL, {
					id: 'mbFlash',
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// MOV, M4V, M4A, MP4, AIFF, etc.
			} else if
(URL.match(/\.mov|\.m4v|\.m4a|\.aiff|\.avi|\.caf|\.dv|\.mid|\.m3u|\.mp3|\.mp2|\.mp4|\.qtz/i)
|| mediaType == 'qt') {
				mediaType = 'qt';
				mediaWidth = mediaWidth || options.defaultWidth;
//				mediaHeight = (parseInt(mediaHeight, 10)+16)+"px" ||
options.defaultHeight;
				mediaHeight = (parseInt(mediaHeight, 10)+16) || options.defaultHeight;
				preload = new Quickie(URL, {
					id: 'MediaboxQT',
					width: mediaWidth,
					height: mediaHeight,
					attributes: {controller: options.controller, autoplay:
options.autoplay, volume: options.volume, loop: options.medialoop, bgcolor:
options.bgcolor}
					});
				startEffect();

	/*	Social Media Sites	*/

// Blip.tv
			} else if (URL.match(/blip\.tv/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "640";
				mediaHeight = mediaHeight || "390";
				preload = new Swiff(URL, {
					src: URL,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Break.com
			} else if (URL.match(/break\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "464";
				mediaHeight = mediaHeight || "376";
				mediaId = URL.match(/\d{6}/g);
				preload = new Swiff('http://embed.break.com/'+mediaId, {
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// DailyMotion
			} else if (URL.match(/dailymotion\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "480";
				mediaHeight = mediaHeight || "381";
				preload = new Swiff(URL, {
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Facebook
			} else if (URL.match(/facebook\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "320";
				mediaHeight = mediaHeight || "240";
				mediaSplit = URL.split('v=');
				mediaSplit = mediaSplit[1].split('&');
				mediaId = mediaSplit[0];
				preload = new Swiff('http://www.facebook.com/v/'+mediaId, {
					movie: 'http://www.facebook.com/v/'+mediaId,
					classid: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Flickr
			} else if (URL.match(/flickr\.com(?!.+\/show\/)/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "500";
				mediaHeight = mediaHeight || "375";
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[5];
				preload = new
Swiff('http://www.flickr.com/apps/video/stewart.swf', {
					id: mediaId,
					classid: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
					width: mediaWidth,
					height: mediaHeight,
					params: {flashvars:
'photo_id='+mediaId+'&amp;show_info_box='+options.flInfo,
wmode: options.wmode, bgcolor: options.bgcolor, allowscriptaccess:
options.scriptaccess, allowfullscreen: options.fullscreen}
					});
				startEffect();
// GameTrailers Video
			} else if (URL.match(/gametrailers\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "480";
				mediaHeight = mediaHeight || "392";
				mediaId = URL.match(/\d{5}/g);
				preload = new
Swiff('http://www.gametrailers.com/remote_wrap.php?mid='+mediaId,
{
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Google Video
			} else if (URL.match(/google\.com\/videoplay/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "400";
				mediaHeight = mediaHeight || "326";
				mediaSplit = URL.split('=');
				mediaId = mediaSplit[1];
				preload = new
Swiff('http://video.google.com/googleplayer.swf?docId='+mediaId+'&autoplay='+options.autoplayNum,
{
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Megavideo - Thanks to Robert Jandreu for suggesting this code!
			} else if (URL.match(/megavideo\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "640";
				mediaHeight = mediaHeight || "360";
				mediaSplit = URL.split('=');
				mediaId = mediaSplit[1];
				preload = new
Swiff('http://wwwstatic.megavideo.com/mv_player.swf?v='+mediaId,
{
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Metacafe
			} else if (URL.match(/metacafe\.com\/watch/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "400";
				mediaHeight = mediaHeight || "345";
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[4];
				preload = new
Swiff('http://www.metacafe.com/fplayer/'+mediaId+'/.swf?playerVars=autoPlay='+options.autoplayYes,
{
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Myspace
			} else if (URL.match(/vids\.myspace\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "425";
				mediaHeight = mediaHeight || "360";
				preload = new Swiff(URL, {
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Revver
			} else if (URL.match(/revver\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "480";
				mediaHeight = mediaHeight || "392";
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[4];
				preload = new
Swiff('http://flash.revver.com/player/1.0/player.swf?mediaId='+mediaId+'&affiliateId='+options.revverID+'&allowFullScreen='+options.revverFullscreen+'&autoStart='+options.autoplay+'&backColor=#'+options.revverBack+'&frontColor=#'+options.revverFront+'&gradColor=#'+options.revverGrad+'&shareUrl=revver',
{
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Rutube
			} else if (URL.match(/rutube\.ru/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "470";
				mediaHeight = mediaHeight || "353";
				mediaSplit = URL.split('=');
				mediaId = mediaSplit[1];
				preload = new Swiff('http://video.rutube.ru/'+mediaId, {
					movie: 'http://video.rutube.ru/'+mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Tudou
			} else if (URL.match(/tudou\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "400";
				mediaHeight = mediaHeight || "340";
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[5];
				preload = new Swiff('http://www.tudou.com/v/'+mediaId, {
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Twitcam
			} else if (URL.match(/twitcam\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "320";
				mediaHeight = mediaHeight || "265";
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[3];
				preload = new
Swiff('http://static.livestream.com/chromelessPlayer/wrappers/TwitcamPlayer.swf?hash='+mediaId,
{
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Twitvid
			} else if (URL.match(/twitvid\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "600";
				mediaHeight = mediaHeight || "338";
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[3];
				preload = new Swiff('http://www.twitvid.com/player/'+mediaId,
{
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Ustream.tv
			} else if (URL.match(/ustream\.tv/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "400";
				mediaHeight = mediaHeight || "326";
				preload = new
Swiff(URL+'&amp;viewcount='+options.usViewers+'&amp;autoplay='+options.autoplay,
{
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// YouKu
			} else if (URL.match(/youku\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "480";
				mediaHeight = mediaHeight || "400";
				mediaSplit = URL.split('id_');
				mediaId = mediaSplit[1];
				preload = new
Swiff('http://player.youku.com/player.php/sid/'+mediaId+'=/v.swf',
{
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// YouTube Video (now includes HTML5 option)
			} else if (URL.match(/youtube\.com\/watch/i)) {
				mediaSplit = URL.split('v=');
				if (options.html5) {
					mediaType = 'url';
					mediaWidth = mediaWidth || "640";
					mediaHeight = mediaHeight || "385";
					mediaId = "mediaId_"+new Date().getTime();	// Safari may not
update iframe content with a static id.
					preload = new Element('iframe', {
						'src':
'http://www.youtube.com/embed/'+mediaSplit[1],
						'id': mediaId,
						'width': mediaWidth,
						'height': mediaHeight,
						'frameborder': 0
						});
					startEffect();
				} else {
					mediaType = 'obj';
					mediaId = mediaSplit[1];
					mediaWidth = mediaWidth || "480";
					mediaHeight = mediaHeight || "385";
					preload = new
Swiff('http://www.youtube.com/v/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch,
{
						id: mediaId,
						width: mediaWidth,
						height: mediaHeight,
						params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
						});
					startEffect();
				}
// YouTube Playlist
			} else if (URL.match(/youtube\.com\/view/i)) {
				mediaType = 'obj';
				mediaSplit = URL.split('p=');
				mediaId = mediaSplit[1];
				mediaWidth = mediaWidth || "480";
				mediaHeight = mediaHeight || "385";
				preload = new
Swiff('http://www.youtube.com/p/'+mediaId+'&autoplay='+options.autoplayNum+'&fs='+options.fullscreenNum+'&border='+options.ytBorder+'&color1=0x'+options.ytColor1+'&color2=0x'+options.ytColor2+'&rel='+options.ytRel+'&showinfo='+options.ytInfo+'&showsearch='+options.ytSearch,
{
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Veoh
			} else if (URL.match(/veoh\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "410";
				mediaHeight = mediaHeight || "341";
				URL = URL.replace('%3D','/');
				mediaSplit = URL.split('watch/');
				mediaId = mediaSplit[1];
				preload = new
Swiff('http://www.veoh.com/static/swf/webplayer/WebPlayer.swf?version=AFrontend.5.5.2.1001&permalinkId='+mediaId+'&player=videodetailsembedded&videoAutoPlay='+options.AutoplayNum+'&id=anonymous',
{
					id: mediaId,
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
					});
				startEffect();
// Viddler
			} else if (URL.match(/viddler\.com/i)) {
				mediaType = 'obj';
				mediaWidth = mediaWidth || "437";
				mediaHeight = mediaHeight || "370";
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[4];
				preload = new Swiff(URL, {
					id: 'viddler_'+mediaId,
					movie: URL,
					classid: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
					width: mediaWidth,
					height: mediaHeight,
					params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen, id: 'viddler_'+mediaId, movie: URL}
					});
				startEffect();
// Vimeo (now includes HTML5 option)
			} else if (URL.match(/vimeo\.com/i)) {
				mediaWidth = mediaWidth || "640";		// site defualt: 400px
				mediaHeight = mediaHeight || "360";		// site defualt: 225px
				mediaSplit = URL.split('/');
				mediaId = mediaSplit[3];

				if (options.html5) {
					mediaType = 'url';
					mediaId = "mediaId_"+new Date().getTime();	// Safari may not
update iframe content with a static id.
					preload = new Element('iframe', {
						'src':
'http://player.vimeo.com/video/'+mediaSplit[3]+'?portrait='+options.vmPortrait,
						'id': mediaId,
						'width': mediaWidth,
						'height': mediaHeight,
						'frameborder': 0
						});
					startEffect();
				} else {
					mediaType = 'obj';
					preload = new
Swiff('http://www.vimeo.com/moogaloop.swf?clip_id='+mediaId+'&amp;server=www.vimeo.com&amp;fullscreen='+options.fullscreenNum+'&amp;autoplay='+options.autoplayNum+'&amp;show_title='+options.vmTitle+'&amp;show_byline='+options.vmByline+'&amp;show_portrait='+options.vmPortrait+'&amp;color='+options.vmColor,
{
						id: mediaId,
						width: mediaWidth,
						height: mediaHeight,
						params: {wmode: options.wmode, bgcolor: options.bgcolor,
allowscriptaccess: options.scriptaccess, allowfullscreen:
options.fullscreen}
						});
					startEffect();
				}
// INLINE
			} else if (URL.match(/\#mb_/i)) {
				mediaType = 'inline';
				mediaWidth = mediaWidth || options.defaultWidth;
				mediaHeight = mediaHeight || options.defaultHeight;
				URLsplit = URL.split('#');
//				preload = new Element("div", {id:
"mbMediaInline"}).adopt(document.id(URLsplit[1]).getChildren().clone([true,true]));
				preload = document.id(URLsplit[1]);
				startEffect();
// HTML (applies to ALL links not recognised as a specific media type)
			} else {
				mediaType = 'url';
				mediaWidth = mediaWidth || options.defaultWidth;
				mediaHeight = mediaHeight || options.defaultHeight;
				mediaId = "mediaId_"+new Date().getTime();	// Safari may not
update iframe content with a static id.
				preload = new Element('iframe', {
					'src': URL,
					'id': mediaId,
					'width': mediaWidth,
					'height': mediaHeight,
					'frameborder': 0
					});
				startEffect();
			}
		}
		return false;
	}

	function startEffect() {
//		if (Browser.Platform.ios && (mediaType == "obj" ||
mediaType == "qt" || mediaType == "html"))
alert("this isn't gonna work");
//		if (Browser.Platform.ios && (mediaType == "obj" ||
mediaType == "qt" || mediaType == "html")) mediaType =
"ios";
		(mediaType == "img")?media.addEvent("click",
next):media.removeEvent("click", next);
		if (mediaType == "img"){
			mediaWidth = preload.width;
			mediaHeight = preload.height;
			if (options.imgBackground) {
				media.setStyles({backgroundImage: "url("+URL+")",
display: ""});
			} else {	// Thanks to Dusan Medlin for fixing large 16x9 image errors in
a 4x3 browser
				if (mediaHeight >= winHeight-options.imgPadding &&
(mediaHeight / winHeight) >= (mediaWidth / winWidth)) {
					mediaHeight = winHeight-options.imgPadding;
					mediaWidth = preload.width =
parseInt((mediaHeight/preload.height)*mediaWidth, 10);
					preload.height = mediaHeight;
				} else if (mediaWidth >= winWidth-options.imgPadding &&
(mediaHeight / winHeight) < (mediaWidth / winWidth)) {
					mediaWidth = winWidth-options.imgPadding;
					mediaHeight = preload.height =
parseInt((mediaWidth/preload.width)*mediaHeight, 10);
					preload.width = mediaWidth;
				}
				if (Browser.ie) preload = document.id(preload);
				if (options.clickBlock) preload.addEvent('mousedown',
function(e){ e.stop(); }).addEvent('contextmenu', function(e){
e.stop(); });
				media.setStyles({backgroundImage: "none", display:
""});
				preload.inject(media);
			}
//			mediaWidth += "px";
//			mediaHeight += "px";
		} else if (mediaType == "inline") {
//			if (options.overflow) media.setStyles({overflow: options.overflow});
			media.setStyles({backgroundImage: "none", display:
""});
//			preload.inject(media);
//			media.grab(preload.get('html'));
			(options.inlineClone)?media.grab(preload.get('html')):media.adopt(preload.getChildren());
		} else if (mediaType == "qt") {
			media.setStyles({backgroundImage: "none", display:
""});
			preload.inject(media);
//			preload;
		} else if (mediaType == "ios" || Browser.Platform.ios) {
			media.setStyles({backgroundImage: "none", display:
""});
			media.set('html', options.linkText.replace(/\{x\}/gi, URL));
			mediaWidth = options.DefaultWidth;
			mediaHeight = options.DefaultHeight;
		} else if (mediaType == "url") {
			media.setStyles({backgroundImage: "none", display:
""});
			preload.inject(media);
//			if (Browser.safari) options.resizeOpening = false;	// Prevents
occasional blank video display errors in Safari, thanks to Kris Gale for
the solution
		} else if (mediaType == "obj") {
			if (Browser.Plugins.Flash.version < "8") {
				media.setStyles({backgroundImage: "none", display:
""});
				media.set('html', '<div
id="mbError"><b>Error</b><br/>Adobe Flash is
either not installed or not up to date, please visit <a
href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash"
title="Get Flash" target="_new">Adobe.com</a>
to download the free player.</div>');
				mediaWidth = options.DefaultWidth;
				mediaHeight = options.DefaultHeight;
			} else {
				media.setStyles({backgroundImage: "none", display:
""});
				preload.inject(media);
//				if (Browser.safari) options.resizeOpening = false;	// Prevents
occasional blank video display errors in Safari, thanks to Kris Gale for
the solution
			}
		} else {
			media.setStyles({backgroundImage: "none", display:
""});
			media.set('html', options.flashText);
			mediaWidth = options.defaultWidth;
			mediaHeight = options.defaultHeight;
		}

		title.set('html', (options.showCaption) ? captionSplit[0] :
"");
		caption.set('html', (options.showCaption &&
(captionSplit.length > 1)) ? captionSplit[1] : "");
		number.set('html', (options.showCounter &&
(mediaArray.length > 1)) ? options.counterText.replace(/\{x\}/,
(options.countBack)?mediaArray.length-activeMedia:activeMedia+1).replace(/\{y\}/,
mediaArray.length) : "");

//		if (options.countBack) {
//			number.set('html', (options.showCounter &&
(mediaArray.length > 1)) ? options.counterText.replace(/{x}/,
activeMedia + 1).replace(/{y}/, mediaArray.length) : "");
//		} else {
//			number.set('html', (options.showCounter &&
(mediaArray.length > 1)) ? options.counterText.replace(/{x}/,
mediaArray.length - activeMedia).replace(/{y}/, mediaArray.length) :
"");
//		}

		if ((prevMedia >= 0) &&
(mediaArray[prevMedia][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i)))
preloadPrev.src = mediaArray[prevMedia][0].replace(/twitpic\.com/i,
"twitpic.com/show/full");
		if ((nextMedia >= 0) &&
(mediaArray[nextMedia][0].match(/\.gif|\.jpg|\.jpeg|\.png|twitpic\.com/i)))
preloadNext.src = mediaArray[nextMedia][0].replace(/twitpic\.com/i,
"twitpic.com/show/full");
		if (prevMedia >= 0) prevLink.style.display = "";
		if (nextMedia >= 0) nextLink.style.display = "";
		media.setStyles({width: mediaWidth+"px", height:
mediaHeight+"px"});
		bottom.setStyles({width: mediaWidth-marginBottom+"px"});
		caption.setStyles({width: mediaWidth-marginBottom+"px"});

		mediaWidth = media.offsetWidth;
		mediaHeight = media.offsetHeight+bottom.offsetHeight;
		if (mediaHeight >= top+top) { mTop = -top; } else { mTop =
-(mediaHeight/2); }
		if (mediaWidth >= left+left) { mLeft = -left; } else { mLeft =
-(mediaWidth/2); }
/****/	if (options.resizeOpening) { fx.resize.start({width: mediaWidth,
height: mediaHeight, marginTop: mTop-margin, marginLeft: mLeft-margin});
/****/	} else { center.setStyles({width: mediaWidth, height: mediaHeight,
marginTop: mTop-margin, marginLeft: mLeft-margin}); mediaAnimate(); }
//		center.setStyles({width: mediaWidth, height: mediaHeight, marginTop:
mTop-margin, marginLeft: mLeft-margin});
//		mediaAnimate();
	}

	function mediaAnimate() {
		fx.media.start(1);
	}

	function captionAnimate() {
		center.className = "";
//		if (prevMedia >= 0) prevLink.style.display = "";
//		if (nextMedia >= 0) nextLink.style.display = "";
		fx.bottom.start(1);
	}

	function stop() {
		if (preload) {
			if (mediaType == "inline" && !options.inlineClone)
preload.adopt(media.getChildren());	// prevents loss of adopted data
			preload.onload = function(){}; // $empty replacement
		}
		fx.resize.cancel();
		fx.media.cancel().set(0);
		fx.bottom.cancel().set(0);
		$$(prevLink, nextLink).setStyle("display", "none");
	}

	function close() {
		if (activeMedia >= 0) {
			if (mediaType == "inline" && !options.inlineClone)
preload.adopt(media.getChildren());	// prevents loss of adopted data
			preload.onload = function(){}; // $empty replacement
			media.empty();
			for (var f in fx) fx[f].cancel();
			center.setStyle("display", "none");
			fx.overlay.chain(setup).start(0);
		}
		return false;
	}
})();

	/*	Quicktime detection from Quickie.js	*/

Browser.Plugins.QuickTime = (function(){
	if (navigator.plugins) {
		for (var i = 0, l = navigator.plugins.length; i < l; i++) {
			if (navigator.plugins[i].name.indexOf('QuickTime') >= 0) {
				return true;
			}
		}
	} else {
		var test;
		try { test = new ActiveXObject('QuickTime.QuickTime'); }
		catch(e) {}

		if (test) { return true; }
	}
	return false;
})();

	/*	Autoload code block	*/

Mediabox.scanPage = function() {
//	if (Browser.Platform.ios &&
!(navigator.userAgent.match(/iPad/i))) return;	// this quits the process if
the visitor is using a non-iPad iOS device (iPhone or iPod Touch)
//	$$('#mb_').each(function(hide) { hide.set('display',
'none'); });
	var links = $$("a").filter(function(el) {
		return el.rel && el.rel.test(/^lightbox/i);
	});
//	$$(links).mediabox({/* Put custom options here */}, null, function(el) {
	links.mediabox({/* Put custom options here */}, null, function(el) {
		var rel0 = this.rel.replace(/[\[\]|]/gi," ");
		var relsize = rel0.split(" ");
//		return (this == el) || ((this.rel.length > 8) &&
el.rel.match(relsize[1]));

		var relsearch = "\\["+relsize[1]+"[ \\]]";
		var relregexp = new RegExp(relsearch);
		return (this == el) || ((this.rel.length > 8) &&
el.rel.match(relregexp));
	});
};

window.addEvents({domready: Mediabox.scanPage, resize: Mediabox.recenter});
// to recenter the overlay while scrolling, add "scroll:
Mediabox.recenter" to the
objectlibs/mediabox-advanced/NonverBlaster.swf000064400000453646151165346500014365
0ustar00CWS		wx���<U���Zl�M�%;�0�ʥ$����K�tA6R	�F5*IT��K������.�t��-i��m�T�MM35���3�;3�w��gμ���zO�����}�g�����G�}O�CJDd��?_�U�_�f-X�b��h��5gr��6�7m͂�A�SW�ZHS�'�}�0<`���D��������]�(��2����G���Qt�v}�
�F&�$(�zx��0$�Cq]h��0x�
���'�W�����F�0&
�� n��)��
Ǡ	��5��#������QDBX�-p͉V@1Cu�V9XX
��&�!�)p	�C��8��גH-�8�(��e�Ҭ�*
c��5���$�-��@ǖht�[�<�h
$�5x
^�������9���~2�^��#�c퉢�Ё(�c�p$�
"8�0g
��
S�4��9d8Mt!��A�h{�i�w���Q�0v���Id�F4Ν�)��@�g���D��!ğ��E������'`��q�QO�(#��!���s�΂�<���-��C[B(�Gz��4�5��<���!(���_�:��ED
���c��-Aq)Q6��`�p	!�
���@�r�h\�j���'��k�D_��`�
���3(���z�#�3Y�z�xx��Ѯ�3�Z�1��
Z�$���}�	`��p�$*���Et
~��D��n��F���%�
":
������?<�X�lB���8��x��	HN'�mF�CQt��-Da`���.L߆~�ۉra���d�9h��g�>�+���r�;蟂������}�
�����{�@/��>{�����
/a�>�-�$0m?��vXq��WcP�YD�`;P6���GX���:Ht��
?Dt�&J��G0�����|�}p�;��y���(��=p*B_�b�0�(�N�a	�.�sY��

�us�(�G\��`W�?a�	���$��!���i�_�B*�a�"�J�F�E��>�0~��k�:�-A��*"�y���C���
L�A���q�7�;�����K�A���@�e��
��@WQVh���s����7�a#�[�%o"*�f�x�[G�f�@��x+ڵ��8�D�`s��<��F��w3
�.�|��2�	C�QgP�;P�՟��}�'�	�l��!.��?��]H6t��>!�����<%��`�3��1�Ax/�
�D��	�@TC�/�p
���+��E��_�oAC�ߠ?�{���{�X��0?��	��V��XǠ�_V:��@�G�ۡ~�ԟЏa��b0���	F��	XmC���c�R9���3t�p��
yB!�>�	�: B�!-.C�-�Q�� Pe�4��k�,C�
TcHA��jX��P-��d�0�e�!di1d��5`u?��i3d
~y��0��3t�0���1��IPN���p�2����X6��Yx��=2`���M�<�!8	N��o�VE��\�1�J�e8C"�Kd�<�)j�P���i�ϔ���<�?��(d�1d1���P3�J����G#���Y0���1�;`8����j�P.��ch?�P�Y1�.¨	��\k����
�&�2�'2d�
p�F}�6�������O�n�t�z�
uD:S�3�2�N���:�o�0��]Ҟ���M���a�L�-h��OA$�!Ppgh\��hsP��v{X	@ɓ�0H�3/ԛ7�K|�V�>��e���aHm.�@~~�~����?C�A'�%��7}6����,`h��
�7�	��h�E}��1��å�f��I���a�AH���bx+
���
������
���x
����9,�p�LV��
����.pV�����?���0~
�<�p�N��_���L���Aa�:�g0�D;AK�o=��؀�ڈ�ї݂$C�am4�9�
�{,�n��eqU�c<��ZOaQ"��f�ؒ���-h/����hh�6�(��#xn;0��(�
��N�����
,w!�A9|r�1�`5�*x#SP^x����?�0كq'@9ׇRHۋ���q��������1V����P�01��f��B#h�`�B'xD_�\�#H<��8�|C���<\7��K�L��>���?�Q�"�BX!o�P���Q���04��	eàps,�JP>�|C.P9b?�^�9��W@�$�|
�`�)���LO�_�>x���3hcX[��4�bl��s���
�%��Q���8��8��qP�~�/2t��r�"~\�؂'u���1xmw��������_=C�
��D����[Ĕ&�'jFLiAZ}}f����o��M���xy��w����������a�Ж}��Co��!��G�ՏQߝ���X�f��	���>`�S��g�`��
3{QG/��_2t���k�@�
��j��{̭
|�P}�2��y�=b����Oh�3?~�\}��/�,`Xj��,K�Xj�Xy�l8,�����q�(��a�2K{A���@A��m����>���HK�:�U�������`��k�
!�/Koa�K��,=�~,-��
�͒d��Kհ�?KjX��Q�AH��ei�K�T�Q&���Yz�CX�̐�3�w(Kk����
�yF,5@�1K>&,����4��F�gf,=�R�9K�Y��/-X2�b
�ҵ�,}m�2�ci�x��o+�N����AxZ#/0�iB�-Kc&�d5	e��%/K_Lf)��g�'�3m;����ю����,����4aK�a�t���`Iy&����`��,��TO�vq]/��7K?�>��l��9,i�E=�C{���a>KW�Y:�vd)tK�X���%�E(�b�2��.��4*u����e(�r�/�Pj�,͆k��W���0lKgA����*�%�5�;T��01��Cpֲ�T#X�f��?��H��R�>�M๞�N��y���,�?��@$±�,����@>�
x	ʛpTDZ$�G�	,�Ndi�f\B�P�px�=�z�%��������#�V�=ȃ(T�3�G�e
�CP��o�;�^��v�����@��?��=p����1t�x
�a�N����F����`#��;�>Ka�:�������oBl�t��

ra�^�=��b�~�}�w����$���tf`)�A=(|��dXU0:�ؙ�����Wa�A�Cx��B8�R+,=���qy,%Ar>����e/d)�}�c�(�(a�D���
��+`�1�M|Bȕc��e{qn�H>��S����v�=�rU�gg�!�u{��6H=��֯W%��U8�<�I5��	\`IP�����]PjYZ���A������X8?��%�&ױWa�e�	���W�0��8G�!�\G�O�48�0��:A��l�F���%7��48���4�_�74�z3K�k��pm	����=0n��[`t}����a�m�	�wP��.�M��������%+bz&,O��6��OU]�
*�Agݻ�7'��ٗ��ݨ�D��;�6r���Z�����dQ�˸���W/8�t�$��a�������]����p��f�R����hs4�q��ݪ��`�3]�7���hm{`�z�Z���D�p�9G��������-�Onn�h�;:�A�ஃ��겓~Q����9���}�`,��h�yOQ�.}��tf�5�jQ���_��w��-"n�p�`���+巌MZUsI�"+��%I�V��ھW��K�oa��*�:��$�頯F��p�ٲ)ͳ�yڬ���gh�a5�Kw؜h�v<^I%SrȦ��p��g�Y�I:�Ӵ�İ��ݶY�!4��PKź
��VQa�jB��٢)��?�uͳ�bV6�g	-E̖��^&�rq0�fo�.��L��%�&�{�^/���fk^Ts`�s�zBK��l��iѼ��w9@@G�$D�0SP�!4��2b<[Ha��O~,1�|��@ڞk��	�Yc�i�{3�'J"}!���I	��L����M�FnD̚n	�vd�g�p5��B^B���iQ���jf�_z��<�	Mp��$�k���8���ܣ�G�fB�
�+K�
K��{8��Ƌ��o�U@����K�;�"�-J�����ζ�a�K��e��{y?k1���3]u�/�cr�����b�l��o��P[g'bs�H���U��"�ٻ�9��H��rk=���Hؼ�8һĔ�J�>�;�/���#�~^�]���êJ��-���c�.��c�hZ�!���{fJ�'ᵣ@-�PSe����A������eg��ˍ
f��y����y7��x���d���[4?�u��_�|�CT���;.�mG��%��L�f���vu�֎��}o��3��b��a����Ͷk?��>{lIq��*KC���d݉a_�5��4n�V�%��ɣO���1����>��]�3>ۚ��ps6_;��FҚ/⼛,+'�6�0�b����uPl���@-끱56j�=�sb�רi��@^(W1^�Y�k������ELw_)N��LC]kN��Aݷ-�7���]Lȱ��1��G���E����m�37kU���h�܄�I���湅YM�{l������k���y`z��#c,a����uL�o����&Iht�V��@m�b	���6\�m�rJDU�j']s2�^�OZ�!%���?�{-D��D�"?YO��,/�b�!
k�N[/��{��yܼgn�k�/���Y�E�8{���Y9�gEu�.�v�w)!��Dtt��*G�H��Ӓ�v�Jѧ~>I�#MI�'q��Dg�#�ɦk�՚�+͵}�����@Ze;��׻��9�T?���W�gЀ�=ٟx�W"E�]�x!��z�±�REr�-Aę�CYA����P��vi�I5ro!�	^�ћޚ�?�,���z�䴣�s�N~q�.!�ᕿ4��斊���͊�F�^�kd��s��?�Y1��\����~e�S^L鑶��H��K���D	�����vI2y/�b~h2i��bֱ	[���P��/K,��D��vp􈝁(f0�rFݫ�&1���X�j��
�ε7'�(}r;��o�A�
(!���ƣ�5�'d*V�1�^=���G	9�m��BX�N�f��0��d%T�o`-b<�Ia�H�q#JHkb�:q�q�+�˒�X�u"��g��xz-��x#�N�noLl��IW����gq�tL\�A��7���|[�p���Sw/)��M�{���{ްA��S�{1���I�v���������=<C�o;������3��w��1�
���<�5s���kfѺ��\�_��������Ӝ���f�d�-!�	_�
�b��~r�o�ZE��d�|@���B�8�#hNu��J+�ʃ��884k4��F�/:]���eX�pt]��v#Ý��5S�.%�@B�Z�<N%�.-W#q�й#+S52d����>`]�<F@�m"������M���}��<���ך@���0R��CfJ~�yͻ:�0���zRб}��g�KN���-��{�����wKH;����J����<Җ�֝�2^~#q��Ie���ٴRY�G�/;��E�
��[�G��5���&
?G�H�l���P��悹�utSB�L|`�-�y��'��:+x7��K#D�K)�J�ٶ�bHŰ�;�%��
�괬>���D�����@��S]랛�}62�Ȟ�j+�dL��`Ԏ0���^�D���륄"�6�R�5��V�<t�l�����v��=I/�U��0Y����2�]ʍd��:�>
n4��n��庉&��6��Q!�\<)"��W�>���\W��@��v�Ơ�.�CET�'��jvuQ�^y{�G��a��R֡{��$�sb�C�����������7΂��ϵf?�-p{�����!9Ǚ!Y��,$n�w
[L�><n��%���;�c�l=:Q��"!�C�ty+���D�-J�+�x���dN���NW�jZ�NGO�u#[vq�"v�;�����f{����I��S��bg}�͇�G]�{E������1��Eg��_�2/�x�;*F�&�6���U��aD��e��/A��Ի,�b�3�mYˌ0����}�\�վs����[����ҩ�1����V:}_�JL�xK�脘/�sJH~�Gg��D��"f���剣�k�5��oyh��H��
;��j�y��qĬ]�q|Q,a�x���_3gbC��%Ϲd5���N�y�ωΜ^��졄*�"����sq�6��$��l>
�N�r��ץ��(!o]}�_���]Ym{�O[�>b~��ĿG@^iY4�|�n���ۂo���9�3�g��<4Oc	�(�9�
�5�L��IñB�ׯo@��n�ı���8h���aV�4�Ç퍯~띰�s���ê���������	D��J�o�f���g�j�M.n߾��s�,�'�ҙ�7�k���z}�EdE��Op���F=�N��-��J0$.PsH�G�'$Y�)���K�K�a.QO�Z����(΍�X����F�>�r��%rD&�(��u�n�p��K���J�gm��R�V(
$��Q�������j��;/�WC�I+[���xo˼�U������.�Dw��Sܦ�����춉j���	^������s�:���,��G�
'������7G.�zO@B?XB�f��g�5�cU$>/bslI�_�`Mmĩ����њ��ܰh�2ۏ��\l�5��eK��o*W�����z�Tj��J�"R��Y�w����~��}����|w�Ac�������]g���*��ϩQ���ǖځ>�v�{o���D�/�;��.�
�Cd>!*�w�z}r�YBN�?�R��ƕ�'���X��c4ޤ��v�N�GY'�]n�s���ƙ�FJ]�;�HT��O�ۏ5�f��Iw"m��gJ�D���>YWu����GHA�7=��5�T'eu+�ڟ���;�9v��
�'��j�#���d��S<#?��c쪃�
*u��t�&��[�b�NP�^��{��!�^nW�M����=KLLH�w�tc�,�S|�Y��ܱ��̙�Yс�Ĝ�"ʜ�i׫�㣙������9@�a_��~����\�%t�K��9C����ր����dTWBFn�����l�O�o[�Ê҂�1E����n��;Ņ�p+��0�f����fU��`�gڎ���M�jZ��Y.7�	&E>d��ADa~S�u�hУw��v�(
��o=ģBi�����@�¹�[�u,�)�[;�\��E�N�`k�R�]`��Tcq���4����;Q�q��76nz�/kͪ�RU�v�\39gF��|I��&r/����'[=�TJ��/G��҈Xiy;C�\���J�	^����~IdI�Uu���7�״V�y.K1��+�8��W�L�rL��H@��|!W꩗����ǹV�+>n�8�mQq���?�krvD�C�s{��2�"��~\ۈ�|V��(��'m�ɒ;�'��/���k��ߜٰզ���G��$�����Z���լ>�{|n�0c��'��n���lld`2��둾��e
���.�m.X7f@]�;�Nu;j<f��6���{u=7D�-�t���}��gS��m�|p�р�5�''>)�;}���4cONI_+M�J8��fkX���h�
���A5E�_�•w��'c݊��KK�L(��.XIo�Hg���
:Cw�]x�SW���Y�|Y���M���o��J���<���Q��ew�eXmH{77��w7tW�e��V֓tT�.�K���M�JFP�5�/M
�葎�$�Pt��s7���G(�׬�/�Z輥�1BKR����g1�|�_>�D?/_���)�uL�@O�|�N�g1�g�).g�q�y�4=�,�k̃E���z>���6j]�Ȳ�ޙ��o���dz[;Wy�t���V%�>������d2ID�y���t���å���j�gE�0߽'ھE8��-X%��^�7��*�I�U�d\"��5��k��c=�&���h�g�%�}�x�3�q���,b}�=�#L�~n��n/u��DDη˻9D���O�O��/�*-�%��B�'�_�/�o=qSzi�y��[���q����/�(\T����=���e��~Lߢ�8.X8���5�toe�qk#���N#�sR�9�}��7��*e�N/̞����2	�^H/r�KW�
B���4~�-�Cy>�$#�{�R�z�ӗ�4E	��u��9����0g:T�J�8_D׼�\�$ƻ[��5/�+�������F
.]o
DWՔCM���L#n�;T=M������
u����L/���ʣ��E�&ˢ��$ul��z�"&j�G4�!��r��>
����>�,��o���Y@���g��V��BNَ2��`�=q�=
Ny^�����ku�).	]m0qNz,��h�X�����t{�O��&�o�O#=R��
���!V��&s�B
��&�e��&�Cݸ�V
���5�b"���� O���^E
����%"�<����u=)�1�e�o�_�`��%#_o��I	-Utt��U'�-��O	}�+2���ZW��_ۋJ��>�hΏ�c9BY"�$�I7I��K�S�k���ۙ[�ӡc�>�k�|F*Zo���Մ�o��׏�z��|�/E���WR�T2��~�G��v[7�a�Һo��^7v7�j�n����a���O8�\���4�Y�Y1eIs�F��&z�r�A�a���(!oGl�m`�g/�\��,�z�z
�.#N���E�)���eQ\RqZiĺ{�s���b³|���t��_����t�5����ƨ����+����>v?��YZiW����"�oY_P�^��ł�7���e��wB��Q�F5`Ց�_�H9��r��J�w�Fg�{e�X�T���y'̿�"`�E�pD?η$�>�}ɷS�*��-bd�d�liu���S���*�[�����'.������a�v�Fi�鍀=GU���G��%�����U>o"r�{��A!���Q�Z����/R��F|/}�m?�׻i�y���b��R0t�S5���}�d�[�/���N���(��6��q{[���W���m�Û����%�<��@Ma��X�Ӆ��$	y�Iho�՘?h�9]���y��a_��6�
J���$�%w��.���膻�N{%Nn�Q'>V��I�E3�M�������v&MӕHE�Gó��v��X��+����\Q�/��;{I�HH�+!Rjv#�U;�ގ;%4�`o��y�wf�)�t�"���m�ߓ��{�MkR�&�Sv�d%ӵ�{4�m\�&�Hc���*F�k�Y}x�M�}������9�5305}����G����"��uSrH�b;R=U�]vf��+.��Mز�#�PaE�v[s��d��%�j�v	5w���.�4������{�*Ԟ�<G(�\]y�#�έO�f���
�Ȇʝ��ށ[+w�}����^��#����1����C���xI�x�2,\��q!��5��9�c*&�ӽ3�qUϴ=��)�_�~YqgW��`�gk��,[�\ڃ.���c��;����[���\�[oZ޶��:z/��֗-
j���Z�Z��
�{s�����v:a�O�{���%V��e��S�9䆑^\'�8tz�j�6��Ϊ4l����X��<xQ�m/���x���h�'V�wk��l4V���H���h��kua#)>˥�jꅧ�,�9s�4��$e�F��x�o�N��
���l��Dի�Vj�۹�Y�qȣl!��Ȳ)�]j�V���p�}te�0YU�g�-��M��m��v�׬�Y��<�p���4���!��SD���ړ���_�
�b	���i��f8���${�O���`�x������J��GVͪ#vآr��fF�H��ҐǓ,wz��,��=��LVz��v1y��6��
�����Fl�?)���-��3E
��}vk�:���+�Y���V'���׿�LJ��J���d[��S&�Q҈ϫ�
o���\�w���7�=�Iy��-����T����.w�ɴtϝ��Y�����a��/�*,̰s�s�z���dk��H�A��Y���k�{�gk�=y�����X�
S�M���_t���q���l��
�}��n>B�oF���:���T�8��BbOX/8�j��Y�!��ݎ��ݕN��m����>V9�uRj���|�5��֧n4qϘ�qs���'�����+[Hw~{GV��f���'�3'��5��P@Yw��[����nٚx��*��g���m�jyl�R7�`�u{����ƟO�(�'���.���Ͻ���G���ww	i��)�h���^�Lw0W<h��$wϼCt_�1S'#�%�X�N�!E�M�ܧ"ٚ�z�/�ٌ`���M��ü�V������I�{{�Gv��8j��Ȕ�L��.�G��-��n=�+����u*�Ϗ�{j���C��a���Ȗ*yo��#V+Vg��)�%����,6͋^u{dKtyYރk�/'�ь�1)�4��J���?
�Ȣ�n���M^��LMN~:�㶿�/vym��
m����.s�'��i*(���9�{k}#1S��V��'�/���,Zf�qB���	I���j
�kV?����VP�a<q�;��M�ҖQ��J��goO���X�)��
�9+�#�S�Y�0���r���>O�D�n���YE?Y2."Rh'6�S!�>���$-�+��P,W��vk��֦���{騻Y�X�;*X��ј���k7ag�G��o�9pѸ��M=Ejð�����.#�e3�y���r��CrF>��D�e�w���֨$�)��
�z;`��a���R�e���[B6'����K��#\=*=�T�o�^p�Et��!�z�R=Ƒd[�Yf֎jjz���3���\Ξ^yJ�N�"�K	
RST��F��"�x�
�v7]��y+YqB��j�›'�fX�:���뚞���jl��5\Q�N���6d��!����)Έ8F20�&����"�}֖��<���ܥP���5SS4�󰪵)0���ٴ2��M���X�/NT�S����c���Άn�[�j��ֆ��ʦ�?x��9S��_@f�C��9�����^��=����4l�nx���,X���ڦ�Ħ�v�-�M?>�,'�e���ѣ�H%
5����f꽜��b���)�hZ�}�k%���C���rm�M�z�>�i���c}�7H����р�-!�d����./����}�ǃL[��wG�*RƁ
_��J��Hv���pH��Q��
���>�n��Du�2
���GȢcՋ.����[�L0#�[�(�m[:��̢�[3,�ʖ�!-�cYj�q"
�9�{Y�6y�ȴ�u�G�^&⌫��C�g̵�0�=Hse�eS�}��D��Xa��I�%o����[����4���I�&۾%]+��\�3�NU3��w��=<�^�O�(5��`	���M��P'/�qa�ͮ�j\��\B�3=�mek:�&G��։[MN��*&�g�bW'Y���;rɮCS�c��ދ[gJ
�F�W���?��pi*u�J7�s��ΝK�#&�\�qsծyy���ÇTS726^;y��Tbg��k���aq����<Z2�"�U�gZżW��_ng�݂>�|����=,��
����>����nI?�,��vʦu5{���Y�KZ-�L�8�i���t�����g%��Y�$DռC��R��Q�n��W_v4�}f�ʂ���9�{���н�=�^�f�c�:ID�e�}����&�1s�zaB
Ǥ�Mˇ@T�rG�G����*M�3�6���q3���n';�+o��d���˄@Sk�/����$קԣp\M;��!j������L�%z��X�t;&1�%��L�W��n�j���
~J/.}j�?��wJ�Iɯ�"�/��HV�{��]}�z��y�����i�ʬ�5S�=���T�t��y6y/ru�$~�L|;��MPq��;mY��)�#�@�����q/�Xt<dM��?��Ǜ:��q�΃��G�
�m6fOU�W+n�c}�KA��n����U�V��:�L��ɋ��i>ctš���ۈ�L�#��v�ϔ�+�
af\}j�l���`ġ��^u�o�%�8eQY��$���>�%��n�;4���Vij:"��B�ay��ݳz�������U	�'��5���׆M?Y��v������t��f���v9+�v(��צ��>F�*գ�t��ũ:1jYd��**�����0r�tQ��C���F��Y�lE|�d�[�>���ui�s��"��
Ο,����|}�H��쀸��^�^g�K���o��OF7�L��J��?�[3=��e��/*g�?�7������cmZ���n�y������`����XoPɯ[b�+l�~�,�M�иlf�mp~�'��Ӵ�k9�u��[�gJ̵]���Jz�mܣ=u56�$Nx#)�A賠�f�KO�v��̦7�C
�����Z"�~�����QA.�_�n����(zn�,	7��c�R�<^�/	sP+����}L��%��H�Y1,)	�5:��6�?�50��>>��T���������%�cbDCc���O�:|�	u���.�"ni�9>�


�2+���i���b�͟x�Y�_��c0qM$r^B����5o���K�~�Ҭ3Y�S����F#����̏}���q�z��]����Yc���3Z��	ˆGJ�C[�-�gڽ�O�Hn���$w8׽�Feh��M���4��M�q}��S⮨�������k�K���7ߟG�l�ݐ�&���S�_O�^OK_�|u��kg�����c�s�ZR}B_O{��3�%��w�߳8�J���E	�F��9O��-hB�g�6^�ۓl�*_���Ħx?�ܺy���v�1�~�Ս�cD�������8����?�8Y��Vq�u�):�fʷ��e�C�s'���[2M��'�t�Ɇ�nGprq�!���&a��~K��UB�m~��(�m����όhn\b��\���56T7)�O�e�E�P2������u�?z��D��0��w�f�0�]H�ɺ��`�cK?���S�p���
�@s�TT����8����Xߵ��`�"S�j[��+$�}PƱ݃B�Oh!�U�XP]��a��M�aUc��u����BS���E�D��T��TeȔM���H.g���y�dE���}�?<��Ϫ*:*yRߔI{��_gb����>��}��&-[��Ӑ'-c#��0)��]�7��V�)��<Y�LQ�Y�+�G]��_~�z���Y�SH�=H���U����*֏�|��?�)�z�]����y6טd���?��+y��.^�2%>��3��E7G�ά���/��l��]��e��݈�\O7rU8�E5f��mu��y}gD&�:G�B�/�^oB
.���(X(��q	�<����֮������7��P�P(����"�_���;=ke�2ma�[Y�C��udY,J'Ţ��SSv�<�jy�I�Y�u��ɻdt�S.}tk�.�s���w{�J��<f��BJ�Ϛ�'s��Wo����r�6{��$�mǥ���w6,:Fl9��CO��4��_�n�^�D�-��x�_��J�g�o��fkm�+�-�D�#2oz[#�('I�d(OCȩ\u�����}����#˰�?�T�ဈ���(�ie�������?Z����y��G����G�����~���ɂ�z�C6>����X8�L�P�D��	�8HB�K}H�����|@�D���{�ڻ$���'~��QDm��۠Ob	��n���=��=��\���dl׵�T��|]��H�����/�H���&�ynԷ����
�����4P�E���'$�|d��L�D�oy}W,7]��������;=����6Eڳ�Z>[�,Nq������|g�SEl�'�O$�/[Ky�ȣJU��F�u�X}2���]�,�t��h�{d�\��3���2p�n��o�$b\�H��ʀ�ƥ�]DV��v�8��N�f[6*N@���6�_��@�qD�������“s��O�tS�&�Ps�K�I܃Ѣ�����&�uX_��6�l/ϗhմ3sL��e����DII�G
�� �
	I9d�n&).w��f�Y>)�㤯E��d̦��ʣM��K��|����%lئ3v�qk���Dm	m5&��s�u��_�Bi+�����2�էoFd*K&��,�'�����z��۹%�f3���]�T�V7�<��J�q�4�l��~A���3�c�;/
&YO3٫�"�he�L6����ŭ=�/�ׇ�=*������Y���,q���w�ޤGt���j�Wb�D�V�u�#�WZ�s%���rb+=I�V�l���}u��^����f�.7���F��=r��1�%S�5�ƀ��*C��J�4}��������<��JbN[U�9o�i���"��Jg�W"�-[_�WNW�d�u��x5nk3��+'peC��8\Y��y���al���¦y�Z.R(�7;�Q�Vre��'=S���~)�_��E�������h���0�4K}z����Wc?	�}���j�L�|�L�s��<�e"����!F=���~k�㌞�'��Z*��;xy�;�!f*V�s�vZ�Y[1�w��U9�e��,�-q��6^���i��
�1.m�1�U��h���2r*1ƒM$���\b|�όII�����nr�Ilg�X-{0}R���u��}E�FvY����j���
Ħj�fU�j��YV�Rh�>e�W\�SX@��\��yM~��U�.#*��My�L����nn�PN�?S`��=�G|ً��ؗ��?���ɋ��}z��?T/��x��?�/�_����F�?z��i�8�
F��O�~yj?Ce�n����e���יD6#�o-�]h
?\-
b_ńNJ���^!�����{�-v��Yۉ��_�r�����"�1��Ȣ�C}H+;[���
��mE|�v�LY]�Z
��,.�]W�<��Q���L�%d��7O<����Kf���2��U�:y�&����,���	�U͛���4�}2�%�έ�?�pYY-�����i6ʷcz�&��*�3���{S;o���c�YP��_:M��;�����"��Y�w�Jut�$��~;��so�2��xz��qu�b�[��-��Ed��h���pGM��-�Y��u�jb1q7��i��o�y�O���{��O����y}I�cǷ�z�İ�ѯ�0�>�=�D��ݑU1���o�c�4�#��#��3m�Lÿ��
��򅧄����$�<�Ow�e�_�>"Ҕ����/��%Da��`�	�iA��.b>�*�)��RI#ng;r�أ������-�D���d@2���fkik�/�(���c�X��o*��+�(j��?�	O�sJb�`����ӎ�a%}H{(F�������/8��K����k��aPr'�C\�\�l�A���Oxb���Ւ?���b�����V�U:���ߍ�\�!��_V�S���+
���B�L|��+^|{��쬷�I�����b�u(�e����2Y7��yH������G���SG���_@�ӷ��_`�V��N��o�����_ߊ��^x�-�����oE&�˾��7;���"������}+������s��r;t��f�'��nI~��O�9���6�?D�L����b���]����	I�˷#B};��z#�
ޝ���'~�?S�ύ8n����4���tl�?��zl�l�1��$��SVǿ5E]��7-�XŖ�º����0
�PU3����Ɔ�29#�C�/�^�_WBcG�E��.b��'�Ͽ�{u��]�����r�g�Z:��th'LK����מ�ɷ��Zŕכ�(-:����I>�4�Y�����e�؟���4����Ba���֍�$����s|��z���Ъ¿#˞��n��f�
�HahP�Oj��"{���쫻�6QS�7���v�_������v,,;���y���dm"�'���x��~�yM����\&NX(��|w{+o�l����O����
����F�L�3�}������R��?o����Ɣn팮������x�|�EA�p�٣G��ۺ~ٯ��u�p�}3��(�Wɱ��>=U˫+X[���z`lAӤ��;~&��̓ʯ}a������5������z�9���y�q�3k
Q�,E�w��˧Y��A2'�g:���z�G���g�ҕ˟,_��ޤ���
��m"
2�ſ�,�}�`d�y:��i��r�[jjp�7��O츑I踿��g�ʜ�|���jʀ���ֱ>�aV,y?a!exPD�_t�#�f�^��KW���&np�^s�t�v�/bǪ$����P�U%ճ��eZ����<�GoE��~�#��IpH^��n��1�*}����5q	"�7#���k�>�L�����bVU�ϴo�Op�	�O���U]����;�E�:�ð��q��e�Z���Q.�Z�gE���ʥ�t�Q�lL�Xp�Ԇ�T\�o�]]���U�Z��fǧ���+%��x�Y%��������'�$|��Wf�O�����O��DL}-Jt>1
���S'b\'��%�ʸeK��0��ُ}ԉ�+���Y~�U��e'�l��f+�x��Ħ�'�����A�YsK�{*ƪ�u�Hny����2��џ���_��N[��&�L�	�+���N�)��/f�H�@`��9>���O�}��sj�W�'�{P�+�妸m�%��2	��뎻��ؚ�����n����Դ��~-WIH-a��vİo�}Eҝ���ݗ�ż���fk�IS�2��i��T�J��e�����H*-�o-J���"˝R��vJZ�dI���pC���w�3���Ͻ��y�����ۼ���9��|��z=_�83]��<ʽ��~_٦O�l���6�����_ܯ�,��0�[\�d�V.7��?W�3Xר�6.&��,�b�q��ͮ
.�$ՙ/�
�<X�(�k�J���ֆ����SR��u��ڙ��g�|�L��OEn"	5�g1��]�w�?蜻�J���ͼ��ƻ�W'�|�(H����O�{X
����b�C���?~f���w��W���鹥d�3
�D�����.ĀN�v�
�B�����Y'�����Y�ìX�ǵ�~��wF�H�y�PCB
Er5pp԰&���������筘§/�v���d���R��#/�\��[U�Z{"�ydK`w�(�X��&�Sh�[(
O���e3���E[���G>O�k�=���<�Msڙ:n\����?�]��L����$Ki���?��x��{q���g������=`��ҥ�B#��>�i�t_�?8����r����gm}a)�A�l86�p���Չ��V!�щ��1�3"U?��f�����)\��tVw��h�
��KGa��X�mRۅ�9q�2��w�_S�7�6���X��f����~�=��igK=�.�=�A��]Uåv�j�o��(ȭ]�
��y�;G�Nߋ0�І�������kl$����\Un`��}~�����1�'��_8!�ܭ�g�t*'�S�	Ԭn��B�.s�i��ɫо]�#O�����
W�����n�s�����8x��(id�(id��1Rn��q����/�T�GYY	w���A����>n3�+�"WS��
�er�pa��Ȭl��l�̬)�1�T�0�z��T����G��5�%Դ鑓;�WSt�̳�(n��s�F�	���#>R"�R���Mbo֍�F�n��Ua��Ƃ3�1(�p�ܯbq��2�
��3�)��8�E�n9��~����:�"��]������m�^Н������€xt;@�|r�d
1̵�œZ
�q��#�}ÁM�'��^�n	�&�-FFf��uM�k_�C��R)P\G@�t;���Y
���l촘�a�������neb��@�)�����'}��_}��EC����u|��6^`~e0Q��{B@|�O�T��c���*��Ŕ�&�-s&�2��C[�-�e~����o�E���H�?��x�?���Ւ��o�=���"�
H�،�:��`i��u����yK9��$��zx��<8ݔfU?�h
�T'pe	��Jb0��
�D&�1�}�$�P`d
��"�B�o�1�mE��L��Tl�w,f�"RN�i�U�쮻\�֗^}��'��P��n_��ϖ��K���L`��5���B*q�-[��,Pʿ;����=
Ѳ�h���˅I�
s���h�S!\E��_�G��-*	�h[�P}�n�(�}�
ֿF���{�QᑅBݿ�	���q��C-a9��T<��Z��_��6��x��V�r�HI\��l���V-�-M��Xlu�F�t��{���'.�������XEF`��Ȱc�Lx��
�����Ws�S�o$���0�d9�.�7M��=`���5��WՔ7OV辙��!���W��\����R�A!��q@��W�|�r��ӌ����&3	��Ԓ?�!v�_��#�o���Q�ɽ�$�qU��x����bD����}9y���_Uň���a#[>���Rg/�oJғ���cdVX[��tm��\Z���c��<0����)�s�G+f��l�3�sK�G�PӉIU<�e:�҇KXxT�N�L�
�a��}��&u´��p�($
"ҠTq�˖B�~:�=d��f�G�=���jZ	�-��o�@�˽m+�;���Э�"���ɛ.c��\0=���̽����m�%T@��G1��̱��a��[x�������t��LD��"�Yj.-#%0�Y�I��x�y�iu�Df������)5Dy�{�s�}�!��o����K��ܳ}�#��Ǜ��>.��,�����-��|�뿊��sL��V�75n^��uH�q�7���ʁ[��fɣ.W���&��x�x���K�s|}A�cB��ϻEUwK����S��W�
��:}�Gs��Sk�����7����ͥ�C��%�v��^U�3MC�eR��1p���i�vpG����B���Fa��HQ~�C�I�{��ӵG@yE�����+.����&ς���'�9��ݑ����!�dzs���n#�3L��;uQ>�}UBE�Q<�V��
P��Ĕi��#E��;#���]���f��!y�o]�rӓw�;����vR��֫�4Fq����.�."���!��-ˑ�w/��.�s�X���s��.���K�c��ȥ�D1H�n�0(:�ءE�V82�\�++�FM�j0�%2��~
�����a���JR_�}��\��4`��ɍۭ�&7�̀ɯ`EJ"{�

�e�&���x���W�sSaI��Ȝ.gu-��@�����.�s
���d���\�qO$y�K?ќ�ƣOɳ&X/�s�J��Q�i�t}��lK��q�=*�N���e[`a{�j��r�r���w���KpV��1L�K���vw��ĉ!%xX�G�[���+,v�Y3$���0ʋ��k��I�8u���~��NG
�J�򒌸��ڊ;t�;y! ۜ
lx�ƽ�5���YILp��ڪy��V�h	Xs�/vꨏ謹�ඃ	l,�V5�DO���t#B@����N��S�r��E\�
AD���S������!Kc��}<kғ1p��j�c]C��3��L#K*߃%U��Z�������J_ĵ�g��H�Y_ٍh}��Kl9�:>R�-�ܑ��y�
6C2���ρ�#��nP��G���?��ċ��ԇ����HREgu�k0+
8��0Yul�W�+��$��qj��~�H�{�@!�75�cF���2��r>Pb�^���r�-
��������@u�����*�Λ��W�����r`�p��k`�Q{��,���~%�,�>p/qRq߹�@���n��̓#C�m��Li��c��|�v��͡6��2��Z�u�<Äi:�x��tF)8��Y�qS5���y�ak$bbn�>@|�\q��&P��+j��W�ۮbZ��?@٤x�+��E�AoIQ���
��!��MTb��	�ym8"��`w�~��e�##��{V+x��X�qN��j\A|���t���WTir��D�M��΅�A��e��8瀻Q��`eP4ǯ��'���oI�`�ʿ5!
fM��FM�9��I�rJ3o��H|ZE�5�m?O@8�$���6�GS_ٽVN[�Y�G��	�	�}�"�54CB��:ǧ����*�PK��:�q��
�����<:0\�`_��RG�EыQ�����	$�B��VK�6������/FL���fب:�PX�����s�����=mZ��;U�y��=$�]�rr<�:U�8�q���)S-�w,1���h�͌qJ��.��F����ö@��1��66_Ek3�
V�tƳ�G�l
��ۙͲ�p��&a"��p$�=zq�1Gm�r�{�15ɻ��n�3w��r����;
���|5��^q��@蕣x�qc4��>O�i/���0i�5:�kT��	N.�
�9p|�`zsVPʆP��'�%��WI2��|�-�}Υ;mP˭JP��Q��������d�(7G��A�˂NR8�M��->�3Y
5�򭇳<j������^�ϰ���c��G����u���Z0~�EO����������������74�].
9O��UBo�5�qo:�M�v�թ�2��[�'`jz�,Eh`N|!	��t��)�٨?�ݟ��!x���K��i�PR�9\������q��F{�z.�@N�;�e���9�hxq�p��9@�tq,]�Z�8~�^g�~�f��Q���y����-MLQM�L�T��uT��R���r�(t����;M|���B@�]a�14�$��q�~��5[ޟ9n����㸏�=M��xc'op�t�/�"�ġ<(�Pn�-T�{��%ԖT����@{$��w���y�%��������yv�a]w��Jk�g�7���pX%��<����"ND��1g���V9%���3�o��u�XUXh�|GXY@\�!�z�����j�fJ�}PP���?����I�Qꘪt$��:[�4z��\Pxi몳p��#��Z߱r�h���m,�QԶgJ�m���j.��n���r@���~����0��s�^<����U޹eҳ�i�@NR��z��xv"���e(.�C-Q��z�0�4u����W4Ue��-_&m�F�_�``�Z�F//y��@�o�|��ӹ�7>�G��G�<�\�X_5U�\�u�ˁ�=u�g�[��׼_���;��xg�R���1Q���F)�>��\c��q͉g�Ƙ�Ͽ6�?��g_9G-�4�,4�.?����'܁�*A;�4�2���Wgr�W��6K�������ts�^�4$
�ԑ��3��f]K-E��i�»^q�S�Q����z�=�{v>����Lt���[�*�j)y��
2�7כȷt�QBB#OL}�����7�9W����J�([c�Br��7&w'�<\�k�{��ƀ����-�J���绅ܪ)�[�e�l���Gs�Kj���wڽ~����dE_�Ak�:��Ful�=�>h��WiF6u]|����Zu߆��|��f΁0�b�T����R�A[2�f5P���y����u1;��3L�#x�ҩ���y�VԌ9�;�0��Ϡ%3�%�ϫˌ��!	����挂�W�:8Eqj;Ӽ�J
_�}bg�0�K���3��bv/��^_0ʳ0Ⱦx��|/m�{Mvگͫ2�E2���tM
���a��od���x����x����y�$��0�g'�H�Q�>��y�/n�"����)i��
虤��J�O��	��`���q��C���o��h�H`�ZsV�,d�,S(O��c켜t����e�3�0:��oєs����:ma�������'4��As�f��͏�V�
�o��z�����
o�*�`�[zA�N���K�O��Dҳ��1�Q�Zφ�`P\v*��R�0�c��x��T��~#����[pa�Y��9�F��-�=P̢IV|Dy�����~fcW9�j�A,~�}�iȓ
RH=��hnzf�;G�y�Gٽ��tc/���_~�O��
=�u��I��d��&L�r�N��U�Rv�����=+�Gc
��r��٣<4��_Wp�}v��L��P*���Pl@&ܲES�P�W�"ǟ�MId���D&�c��E�O�/�
)����ʹ+�h5���b4�F�^�сxO9��Q���@՞���X0_/�WX�j�^�~Ք�i,�^��'r�*��Հ��Kg4e��@��q���5;�Ip���&���Hw�[9��n�VDW�P�Ɂ�J�q��%D��.g��Ϯ裍�u�#-�.H�C�Q�I^r��q:$����]����5
�nA��F�)�N��+<��V_���.�}����ȅ�`�d;�;X#��yUB*�HWW�S�Y�h=��	[(��72��1:Hoj��rnK�r
5Zv�q��|�<Y9�����;�K;x�
�O��*��F�j�|�����E=oxa;��������ˮ�����OU�z51�艨B��
�݄l�nBf�t���F��K�Jg��Ȟ�Ջ���90�Fv��bެ�~���#k,GǖH���Zg팊늋M�߹�{[��_%��5�����G�,�B�Q-���1X��ƛ�׉h�l��f���R}�~a�B����{K�����p˅�E:UI�j:v�l�<p����2�{"P_�#x/c_}��{�q�
P���T�|P�&����(�<K
�	I�|O�g5^��A��L�{��<	[�xd!����L��L!���,zr�
Vg����8�I>�4��tv����o��w���-Qh��i��O�m������\�-g5rh2R�.Lx:���FK=<�p���\(>+���*B�4���&R���"�Ĩ���EY�/�U߫��E-42=D�ҟx�j�p���I�

g&���"��Hs,8�$�?�3츝���2��ZI��(@N0e�O*�6b���N1Ҭ��a�k-�\�"ƹ�E��\��;��@gް�ݢ6`U`P�y��v;~Ҋ�nЭ4����7
%����g���\�b4�]6�m`��Gi/����}:�ft<u��¦�P����ϕ��4�pwb���`�H�'���\������W��Ģa���g<��L�_m��a^v����P\o�>��aMĵ��@�7����M���9�#j�Y��YAm�IS��^re
����Ȋ�����54θ���$FR1�U��h��Z��Mǘl�d��4�p�B���eN���
�u^mK��{=Z{o�I��f�y��ϕ�hg
lE�2ۃ���M��9�m�9H!WT���
A�$^jJ�|k�Z(��D�rM/��FV�)��r!
l
=[1�*;S<XC@�[�τ_ƿH���PZry�[a��g;r��0�Ǟ3n���7t�޿����1\a\�
i(��cץt�G0���4���(�A��/Ġ�#Xr��.ģ�3���:m�:���ͺ0	߮�#F�4kA��R5�VO)V�O	Ds������d�[���Ҕ�

#Nb,B#֪���<ƫ�$�!�\��Vx1L6K~$P7������s�f
��M�1�nD.�6����R��X�+��\���^��B�����{)#X5nT����;_����P�W���r�B�N�!�e5F�5�9֚�s��Bеd�x�s�vg��
�}˱|�q}�m4�Whnp�U=mS�N�_K%aO�m�Kot�lj�wj��}���NϪ���q�
�d�,VHV_��`�$厇56���2���H�+5:�>`�T�#�}qe��7l�ߺ��բ���$����>��~}����w�{U����@aD����I����a��00������k_���š���,�g��d�Gp�:x����g���	����k�:I:5�
�/��}��Z�r~6���]E
{X<��o�4���oF���1�{��_V��}�m`sIb�Ԝ�]V��f7$�T���Ȟ���b����XE��&�����b�b�<Ne��x��-@�B�\�����3���u��%��n�L�:Z�mO#�c@�D�Aw��=���=u��@�T���hCp���!
�ရ3�h���j�1��-�|Z-X����jI�͜���&Ce`���m�0���{�OJ	g.�61t��V���rW�p�yE�q��C>�����y�r3f{XV��zAT�>��=#�m�����AsR��c�k&0.����F�J:Z�v,�3�ŠĤ��a��<�:��I�ܹ��*QGl��h��鑼q�x2\!�0.��]=uvOl�C�L��9��"�˅@�S�9[�d1DH�aܕu�^��;M�Bh�[eʏ��j;&y�sFn��׬՝�~��_^X/zL
����	�F�S�ޚ���|Q��~�Í�i���u�[(��9��j��󊦚$�u�r3(�u�W���=��j�I����2��aݴ4�C�X?:6?�!8ԝӇ��U�_c��v{|˓‵�h��S�����=�7g��·�����|�ĩ��Br/X�V�h�W(�a��T_���:4��^���rzA6�Mmcq`bn9�?�zz��0~����\�b{_�H�֑��ΫE�j�Pd.��ZpxH*���RVS4
+K,G��0v��c`����h��!���z��P�pE���5��
�Y���a��ƹ��ڈ+��G9�yT
0�;��U�
&וZu�
�l'�L��kX
�\`5p��`�Qi�:ޔ��@�_��B�(FC�(�<i
g�@G��C���K���7�}�vy`���ɽ���g�r%��z)	z��
��Ef>��LW͈�,��u�����j��;��5#F���_QʉN̵����t\�iq���
5���Ue��fG��T��߹V��L��K����DS���ej�
�ʊ�)��y�DE4U,Sսs}��t�l��҃��af����K6)�ӈz�����f�
)B��T\Rj����U��ҤY�+
Uؚ��mk�3[�
[����@�'�����>I%��ڲ�����i�Oi�S6�͞7|b�,�vs�>��t��[OT�����9ZĒ(7.��n}�$H�:�=�!�`���[�O�LW|��
���6˪�N��B�`�mn/x��aɴm�Iu�$.|�6]�ѣ�L�g��wl:Dk�
�5�83���}?k�"7圬��%[5��I``V���n�1)�
{4D����x���VY
�R��k����
��Xg1�-���8\*,�TX/�~��!���P�l�*����tVBN�k
��ϐ�V����2�11��<Ñ��ﮎ�I��G���c�!�إȌ�zͥ-�ȷj���>�A��g�Eq*^���y��:n�X\
�{��f��x���M.V,�4/���4p�Yܵ�rt�+bh�[Nz��zz�@-��+?u�Ա��=�l�ӥ��
������F_�6'�6��<HI{ɚ���;�+�&���FX�#g%dzb�P��Y��hq6�n���R�e���
�S�=7��]ny�#,��Z��`ah9L|��˕}5O�ѸF�ڦ7�K>N`GOoA��R���c,�,���7Yu�ٺo�_���|�ʧ%�@u�]��)���j�X�J����.A�ʕх�^<����Z	�迓�b&����w\�[�a2�@���@�wJ�k�nO3(��֣��KD�\	�	)���ʹ�
�<�{%�-x��­�9�g
~ʼ�
P3�
c��3n��FYU�P3�f�h����3S�tӧx�̺R0��H\4��R
^��)n�)�K�,<]�
��	���'l$�ځ�*
�uң�}��_T��)gAe��{�S�_��Ba�;ߪ��U�@�b���2�;���x+c��4�6ܻ��D]��ۜ"�n�d/��ǕM
Al�����)��*�z-�0��^�,��)�Xy@NQ;�o���1�O�M�d{PYn�E�3�S�*�.t���9/��e
�90�]��c��z�]��"h\D�R�cȔ�e\�c��V�f�\����_Gq�U�;��*Z��P+?��
G�h�1Jnw\��_��l��ljxL�3����5��&��t��5�:�G:Y۰�������s�;�Äc���=r�ݸx޻\�&�c�F8�s�1GU���t�a2'U__�tܕ�±�뮲����YE��L�o��wZN����Y�
��K'֒v���$�gWl���A����I(jVw-F(�Ě	ߞq���,e4{�@��1��O&	�!.ڇ�.��Coڷ�]h/��©SpןQ�5=x�]/�P��*���TY�ӂV�!��9x���͹n�x�0��v�.m��3�<v�*��|����n�F�����r<�nM�'�uJx|](_GvO���5N»��d���3�6�d�I�΢�F���Ca�\���{���Z	u@�ůݳu�7�RZܿ�l͖�T�Nj�k��G
�[�2㗩Y�>\`���J�e�b5t` eȗ�[��I=g����Î`{2P��}���B#n�$�.0�GQk��K�jǞ䎤�ؘ��6��˚{f�qm��
vGo�)<����b�IO<;3l�1�����w
����n����9F�_y�>p��]4�*�Cv��]���bv����讧/X<.����6��Z%������.�Xs+9��.ʖ��3
���G�-D=?�ћ�4fm����v�\�1P�n��*o`�8�xEz��/�
��ȁ5|K��8+&��J��=�(,o��m����e��%r�
��A�Pe>=l�n>܋��<�Ϭ�L{�9*�(�Nm�P�K�g0�������P�B���hF;q"@!)
�ҁ�E(�J�y#*䰿Oq@��I(\x�~��&��so��v����"1�0�p���q1���b�K�#�⽉zۛ�4�G��s�F���]p�.�
9�O\�8�`�.&�]�����[+}>�#�^KS��7����Y"��ϣ���/Ë�_�P�p=T�x���<�Oj�5蔋��y8I<�֭�oF�j8�ͯx8��l�{vg%��45�'*��ou3.qC�˘��x�6D@?��vTT��^X��}&aR�i�َ�M�`ķ���0��$`,���j~%���t��FE�$=��G���񻪙K����s�M`b��7�ُC���}��;�U�O��u#ܡF]���i�!���wql�i`090�U���խ�_{��@��j�ۏ��V�f��Q>�9��[��'�M
c�n\���K+�f�ʓ���,] ��zt�i�J
�����]U��]W
������s�
yM��)	����N�ϫš��w�箴�XCKăt�F{�}{֌�1���}���a���HZ�z/���8�h3M���q���/�y<J���l�%���Bz`�?����z�J�4\����
��r�m�����7�X��>�Y@���^e�I�c*�}f?��P���qB�6ze%rIrS@�8.���6��>T��^�26��O���,�;�>���5���_^!��u�B�9d�r�Z'���&�iM�tǙ�#bŪ�Bf�rT��[��Y>x��|��K��՜���E]�Ws���l���D�q2P�i1�r������]��}ߏ��Y��+���`e�a�;�Jk
x��+e~�)7�=�W�D~Ȭ��R��#F(��~����|61ܭɒ�V��Hh�OxGr"q��1�C�S��"{i�u
�'Wl��8��������g�|�N7�x�h9����S��nx��%�S�����%�>Te��WQ뼹$j���5�ۢ�흴V�r��	�L�ت�-��/
��w5�|JH8�rD|��x�:lu�r�m�qނ�U+�8�
/��h���Ft���D	��'��c�a,�	���U26���N�됓�%h�޾��6�p��)mԇ�ޤ�-6��r��"xSs���v*F�2N��ѕ2R����*gY�g�P��Qd�N��
��U����#}@��
�6�&fW澹�F@	2BT�K���@�("	8���a���5qyjUGP=2(�tP+�j��h�Ш��H&�4���(��`8���n��Wf���B�MC%91~�-�Pd™*l�t)�Ȼ�@N����
�rw
��~jf��B�,�RnK}���Eq�����n������Β�v�3�6�W���v�5����.�=U�sJ�g����1�܏v�N������@;]��Д�[�Sf|����ˁ�\i�򍲜(�%���f���"u_�
�Pe��3��Ʉ�>��l��X�0
�W�XH��4/��;g�R�3�?G���s'�OW��:r+�m���6g�V�n�qں��UL�i�>��ث���)�]Q�u:x�t*��ݕҾm_�L&�j;����8Vv��6H�6	��
��V"_Z)��.5o��O�rߝ�����d�`d�ELx6i��Ufa��&��D��k�����1;j�ïQ�<�1�'j�=�1�U�Q��y���ѯ|Tq��;F�?�ɕr�c�/���h���ņ��4�7���rӍ�W��|9�Ə2�|�/�f�sC
�3p�lgv�X1P�ρ�NӾ�n
�:VO�@�=muB�s��4��A��Š#RӀ�Q�\�x�}����K��*o�E^Wwҙ�1@��K&M�����GיiJ��/Y���̝�@@�da��o��/�~-�O
���ʂpYCt���x�����E��2���ʙ�Y
�Ko�;�+��޷ҏ��B�PK�w^sA��4�9~ξ?g_���<��͙���N�b�En�e�չ<��C�mg̅F�O�ۻ�`=)��Ž��sp?��Ӊ���v�E�"��5F,te�A�%��u�i�"��	�3�(O���~�.�
��d�d�,������Jt��\�*#�%!'`�.{ҝ6�-�?P}0�\,�?�
)����]�1�;_�*�4(t"��\aW��
�#@<���K@�a�	����\ړp�k�������[tHe0�%��5���z	/��I1!:!�+Gj�E�����|롂�8�����`aڟT:��w̯����O��>�g�B��qþe"��^:1W��_?�n�s&d�8�s�e{=~��u��Ԡ����wϘ�鞘�s�GwZ�����:�ݫ.�+(�@L��v�٘2������)ڻ�����ƒ�als�R��蔮kԾ��픜���6�D�
�uȝ츑���#S8�g4ᖾK^���HG��o�<���#���U
�`����ΕO���.�t{R��?
�g
4���	��FWw]:�^�eH��
J����ÈyG�Ȕ�⩏�=�xɎ�rh�m頫;RX\&x[�4^T��$jNl'��d\��>;��.iL��)!*�蘏��)W�M�5��\֑�G�	/��l�df�
b"�Sĉ�N����C�ӗv���]��u����֓SJ=���?�CX�}�p*�
Q/q�ܽ/.�=h�
���0�3l�[һT����U�A�X�S�J������M�|��c��
��F����&n��V�^�w����sѩw�![��cE�6�{������ZDQww$��Q-�#��\+?1�ʈ�����դ~�ݦ|�]���={[kf�E��׷���+u�����@yN�AG��9ªy�����'V$����+�J�#x��E�t��*+dϕ
����hwG@��V	�����f�ӹ��E�
U���+�H��{	��o=6�=%��׽��~CU�un.�V��̃�5Gѿ��K{�w-�m���>j�#����4����:�y]u����]xW������s�PW+�]��=�9o�]��\�����eM�#����߱��G�&�̥�=�P���L�!����S3VL�7c��wڣ�
E>�9D��fq��$��y�����FU4#������O!�"
��f-�ͪ��)�w[P(x;:�D��*|���1[D�q�N�ػ��7���z�Z�
넵�̗���)y�]�nlh~���q���GYv l���҆}
�f���%>�h���V��^s�\�%�e�)um�����I&�up��o�A0�uz�_C�����f0=ڋ�?S'v��@v�'�w!��p�(�P��|�$�0
���I+��G�c�Y<yBRδe�~O5�x^��[��-�\ֲd�W�VmS����2��
�yDŽtf���v/;��g�����l��u�^��`�����Z����T��C�͐G߉��>X��E"=ڹ^{���r�ϫ�Yݥ�Q@q�%�[=����D
Bi��}G�D��&����L��z8O
��.��=��3�t�����U��U�K|��T�n�w�d.P�a��S�Z./���<�k�$dj�'��2����Y��?����^{�~��닌#��٠�7����<�8�6Dym�"@d���菾ӓF�|��Y�J��h�]��o�O~;�=r�O�������h��/�i�V+�O�G�f�XY�c��z�wt�M5�W�JW�8B��=��;sNG}OQl0F,�`ԇ+�	��s�7*������h*�B/㯋�|i�T]A�J���a�GW�su��M�d�}_��9I<�g��띩j]�柫�jpr�eC�:��8�?�wj��ur�B��N��z�('ʁD.u�v�画��¸}Ƚ�-jZ
K��N��s��>2��n�N�S.��uҢ����h�)�0�6	@L=K��e�JcW��Ja�9���[,���@Ȓ�<��IO��m~k��—�q��-�]^�./GH"����^ƽ��d��?wp��vo2w�/�K��kq��@�1el�A^>���/����f��JHK���D~w/�k���Y��ǜ�ow�_E'�uO��|��ko$������WWW�|�F=����n�;訮b�[;%�x���Q�������U7����*�<�toV�c���K[�W�b"hE�@�[�݁�*�fK[u��'S���IQ:��w�}����2
(�\`�c�W�Z?��"|Z��{b�U&|�z���L��29y����L��P�c��R�+��k�u��Z�G�Ϲtn��خ*#4�ƭ�'�~`T3�V\$��7Q9Fy鍓vasu�QFϩ�,K����,
� ��V�H�,t�qo
��������(����M.0�<��G��b�ܕˤ���9�>�F!~���@3�լ�7�A��g^��w��;.�@��o��FX���x��^������Jᮑ��H��֖��L�w�BA�{y��A������T����/�&�Nw^���.�nD�PՒgxj��g�κ֨�tm�d�T�rКf3o��6~�'�E�������
&xv�âO������4��2>p�Rv�ؽhf�c@��|O�JT��5*^�fy��#���ߺj/Fp��
�"�hp0�۸���j�d������e��A��C�g�6RK

:�z��l���"u��o��¦�k���Ӣ7�nT����̩���X@}�8���0{�"U��I	Ȥ��G�ڳ�j�@X�ԗE���F<���������C���I[[�P�sujb����o��!�"?�Sp�.)���=1l!�ܲ��\�4�&��=���$�k�@[��%3�B�1�i3O�����4fNVu��.��:4�h�U9�>��ѰX|��N)�D��q��m�M;�G(D�Aq��V����k
���w�߷��?���h��99��i=��S�Op��m�@�����<�+�|�X�X��p���O�z[�"6�LqybcW߳�7��=;�a>.N��ؖ�lL�1	�S�L|?�Cll�J"IC;��ؙ7^!����٘y,Mᙌ&'���EmF�I
T3�õ�~�fN[bIDL�QM���/�D����T��O��c��k�l{��g�9��~�+Qm�$��蠼����D��@M�DȦ�T	a#Yu
5;��۞���G<���b��9�_�"���V�累���_�6�9�yW�L�B�}2ǒsd��b�{�C��A�a��M9�f�
���*���.�9���{�D~���h38`����_�ZW�U�y?���k���(F��Osػ&������ϳ�c7(��hý�GqB���ܩc*�r�ca��
����=�W��DT+����
�Os�@�ov�/i14K��>���~+J�N�w΂�]ײq
�{[U�li��YI�=�BB������SJ��ei�-�w�f��:��R1��)Sg�b�>�CB?��a]Nq�c�]Xh�����8uF�
@�����U��S<��-C⼍��v�
�@by��kx�y�}:�g��fd���6;>l0�d,���Qpma�aG��b�H�X$�ƯܡV�O�-A���!l�$g��Cplo�d�
��	:��e4�Qi�*�R٢p�fW��:_
�!���#x][��9Tgm1V�|��v��<Ci�HT"8�;��	�Ȕ�1�!�Ӌj��	��-�ؕ@i7�UnO?w6{�*��*�����H�y�t�O�S���H��,��A�I��#�v
��Z
~z}CK����|��^\f[a�9��&��=��F�s�=�@C�և$N�߯f�XX�v�U��yM�ޣ5�#(1��d��!ʞ?��R����dm[�g�XM4E����H��[,���+����1	��Y0�F���ڽɾb���aS
�{��S�-w��m;��<�p5�Π?߻���~��(�6����@m)~l_/�ca��LaG)V�7@����ٍ\�MF�m���r�7��������%7�2K�|
l�V��J���@���{���{�f
����h�9�Vt~�,Y4���إ�Iу�s��G���w�w��5�w"�͖D�$�]���堷�⫵0��!
l��ըS���Bн>czh��u8���VF���#t���v�@;��	�_�z7��ejE�['�Þ1�?}k��E�+�tC�v�[�_?�7@B���J��G<�Ï`���e
>oN�����q1�
�۴�53*��7k���Z!pM�j��-]���,PIƼɫ[A�T���sD�`��U
�ȣ��|���5
b��)y@m�n{)�oB��H���:�Pv�DLĬ��]\�eؿ�@T���
r�'v����º�+X����c�wB)酘�Pe���cq���H�]cXy�G�V��Ѯ�hTJ��C��l�^��W�=$�td�ϻ�va�n�%D(h�Z�
��˶�B�h���/j6��W4�����3�w6�=��Z�&F��'l9	A>6�s��pQ,
�66�WONx�"k�S��r�b6�*�I���M\��j�g��|��T��4C���Z|�fY�J*aBi)�E�ֈb
��`�N�U����/]p��ޗ4�5�j�y����祅'`�)�z"7��MD�i��A�ɰ���wǣ�j��z,�.Z�<b���ѳb�UG�n��b8���\W����X��M"(��&�ў��(�-z�O���x�P�9b���q^�
z�
=+�?����}����\�A�!0E@�ve����i�B�_�b�ɫA'#,ֱc=;�7�`DW~OA���jb��p�h���EIۭ��3\�n�ӿP2�����EO���0z��){2��E*��@�_N=��Ġ��b�־�Oݳ<(ӵ��vAhCN�'�Ф�_�Y�-��?��Š�y������w��]���CHr�ʫ���Ž	�̻j�5��Ju5
\j�]r�b9���7R7U��!�{^����w���9�5�
�'�k~�
�0�o[s!M84|�9��S�_
��\�`�h*�ˣ��җ�"�L����
RkjeO'��2I!���$�*��!�Ƕ������]��3Db��.V�*
{c����O��ex��ˬ�`\i�����7��&{�q�D��$[��[n���5'����/��J]XV�h�_�g��4��N��_�ӹ]2S��؇��ȱ���L�Z:�_|u��X�
Q��'
��t���=8�2�C����C�Z�q��3��>�G�g�D�;KtЬ��b��nC�-���\&�G$.�:�=�*g��l$Dz'�PX�g�Ȍ�ЀLU�z��&���04��42&[���w|�v�3���p�<�!�DP�����q2~e��'^����q^��q6��?���S?9�ᣢ���z�(�F�m#i�X�V��>[�g�q�
���rTyCW��RF&k0�rńqm�ރuw�f-�e��F@|n�����6je
������@�4�ܼP��O�T�E.��r�n���5|���E0͢w�J4~Z�X�5�0.X�#@�=�ֽAG���Nv���0�Xs�6HT|��\BG����l'R*\�Z+��y��;��W�]<���K.-��c�x�p$�<݋+��3X@љ�͖������}!�>EF݄Tٯz�94_<��G|l�G٣���l�d4����Y^������K^W^]�~���Ė���W�8�o��y)W�&Ʈ��-�fk[9�
�u������1��2��3��@�9��03�BB�B�$B��+�·1ΑS5B!IJQiS�SE���}f�����y=�����q�^�r����u��~����z��s��bC�bQ�h�	q�y�x��[<|����M���$k�P�A�P��B{.��n�3����|�=k��g��_�6*x5Ɂ=Vc���������S2�n19��qs�
"�ܽrg±5c�#�#N}�K0|��迷��QSwy�q��ג�����}?�Qܔ��ܔ��8n�N>2�����y
��}@�����d����7��o���
�И��|yb�	)��&�!IJ�{{��h��Ė�WT�����4��&�61�w��e�H�7M��4��;�+U����?E��l�i�w���*r���5�Og^�%��.����O>-[�9W��	m�2]�/��򡎉OLf�J�p7��
5��a̝}�Ld��1���Gy
Kf�>s�ػʨG>ܝ+��9���'A6�Ct��Rt��o���k,�L�fh�Yvգ�s
(�nî�F�����!�*���zz^@Ѧ����F
p��!���)x�[�9٥�i��^���[�ŭ��nf����S'����=��Y�ءC�Ma�#;���GU$�׹H��}�Jכ�_i�KX���9�ͱG���!�!I�}�w�{Ҧſ�d|P�
��NW��Aqи�M��
td�:,�i#,�5P���}�@2��jɁ3�O���>I)^f�q%[J�3F
��@c���W�*��@x����+3Lm�-�ND-�(G�r\��PB!�EJ��x��׵T:�Zּ�㞐�s��w?��N6�us�m覷=��*�uW�Vu��7M�W��n�!�ԿM�~��f��X/-��#U_ͅ�&w	�}�
<��Lo�u}�Ԕ��E̡_��J���	D��
��c��ם1���"rǯ�=~�Xփ��S�T�
�F2OlNlN��rڥ��Ϧz=���j�2}L���l���1X�E��ڭS�*��L�,?:��>F=�J/(�h��2�`�:�J���8��PU�"��+/��9P��g2����D��	�
]?IM�r�7�,~g�4�˺6%��K��Ta���ђVR��\<B���t��%�@��V�]�N(��;o�_"�����)��G�9��Vq���޿X�o�~>vF�ϥ�{�tݧ~�P�
�ȧF�-��E�M�=*{,E����~��A�)G�)�8�����e�9&*h��r�vswj����X
�g��Y�d)N�nZS�~�����X�e�{�g��z��M��3��(Pa��3�*�Y�!q���&��������Q�DWL�raO�������xS��Z�
��[3��TI[���2��&t:�6�e_�>%@7�s��-:m�V�o���<͑���}:�\P��mG�T�k%Y�?.��!�",n2(H6L���4���+Im�~d���?�-�����˪�2���G����Xf@M�iq�p�����VրZ��I�j�u�K�@n���ƙ=X�'�uWÃ�A������P
W�ey��[���N>+��J�
��^ʹ&��OO��˰��*˶V[�i��"�w�K��ր�b'zֹ��C�r��쾦�C����q�/?/a}h.���5@��`_�~e���RJ�)�n��>>��[)��l����]g;o���}���R��s�H�(�Q�p�	2y���C���X�H����%(�T{�����+�܃��ܣ���L���(؀��Uk�'�3�>�(�?�:�ߜ�XLԘZ9�|�n[u�*�����uWq4z�vM��i�C�{�4Ar�>�a�ى��Sִm��Afen�R��kY��g�N$#[�#�lכ�ք�~C��U��
�Λ���e�����|�b7�j�W�K���6��?����S�W3E�<�Ҥ����]�q\a�=g�p�C�zJf�2�:ͩ�lr@
��̲��|�Iø�R:�i�ϸ�k"FC���绕�Kr�(�r4�%��!��ztW��4�:d��	#�A|��Q�����nr��o>���eE���
D۷�6〿�
�_���:���{)
"���}��TU(g�I���6}}�R���iu�'r
�ޡ��t��B=�dS,e�p$c����قS��.��lZ�Y���8<�}U+[3�7k�)�$��9�Mm�i��
�lU���M
�r\����*A?L�g�;�.�U9�Eg��.&i+�a""�
X=~�z�t�t|��":�ׁ�t�װ8ki��q1O���
�o�Ok��K�L���fe7�ɡ�M]���Uf�;\�[H�Fҩ�2��'U��җ�(�����}-�O��ئ�/#��K�#b�Krz�D�^�/���^$�%���l�׆�FDv=}�+���D�Wu�-�&#P+��&���u�3�@���I����	*���@�|Y�8x��:
�,�'/TC�B��-�8ԙ4@�%���VQ��bªz�n�0���w�Β�n;`�+V͑���H����y=��<��*��ջ��
�Q���]�����Wy5�� ��U�T�$&س�/��
�˕ae��nWw�s*��=��$H�'!��ɏ�r�./�U쉋��y����]��#^dw�\�9�ů�N=	�Y~[�&-r��d�Eמ=9�aB��+M�[���d�K�
6�0�S�C'��FڪUع��uf��?M~J�л�#/�j��N���~��㳧�q��R@%�֓?�,&��@U��܅X�;��}is=�#_�!�D3~�5���A޹`�X`��8փ�|�*{c���|��f�%|o��W<Y���A�Y��<�C�jyH��b�TFm1�@Y�J�h�;.�W�.Τ]t^!�^������J�<nCE�T�뜖fѭ�/�b�\'F�c\$��c�
_	9�fuR[��ʨ��F�@�P�M"��D���"%
�2����a|�Y�2kY
�6�F�!�;�EV�O���<A���2�����[��pǑmt�-$��(��t�
�L��Ӆ�
�4V�`�|,��(�AYL�e���b̗��
�7
-�|'��>���PP�J�/%ƺ�D#�
����m�T��4&/��Œ�>����
�+r
���c&l�*
��k�'�a����:V]"{
��m�'��X*<A��	TRr��1��(t[���
�+���#�F��۹�F�u�8����c(�M/p�DM�m����G)�P���	:�e�)��i\8}�Foc�j�
 5<3���2�FT=o�zA>����tQ�m^��_�oRPk��*�m-ULLj�#��3A��۲ub�>.�:�׉@ENO&
!�G)=�<p�q�5�e�lJ������;2�n���f��~Z�R�	\�v"Y|��>q��p�ڠ5۹���A�>*��8�G�����O�J_��@vR	p�z
��[y�g%l
�h!��u�W4�4�9jS�n9�T�A�d�>;�km�·tW�˩�I@p��C���x"�C�i��k���x*�6�V>���HC�n2�C�rPc���R⥇�pu
2IouC�l��v/��@E@�˅�Y.��B�?�?��\i��>܌���$.�ȴ��{�*OlY��r���L"eG�]��m����Ok@!{/�lpYT*�qJP�������
EҀ�W�H��٧DO�37��g�;SF�m�*���%wuu�g��E�K
�|�\e��\�b\H�q��)L��P8��*��b��S)vd�Z<`��'4�
*��鰌�׹‰��ߑ8ҧ��?�=I���:�q�>y��^��~�3G�ս&l:_�_
?�Z)��|��r���E��EY�-]�?����ڬ6��⎵��o��<��&w����"I
��q/�޼���r9r/��MW�8��U����,�`>#�kC��d��:���km�"X���U�k��)*����x����E��;NG㞰A‹����K��ؾ��x���N�NJ�O����E�[8?�v���
�'E�Vuu;�b��F�������c8 Qˀ�
���kw\	�c��N��55v8wJ�����Q�K��D^r)=�X��'��K���N�8"�������s�D`i�	`tf�;gK��|����
o/�gvZK,�/~hϿ�����~T��?�ס��3��w���+����I�	%}�w����eFIA�E�	�Ϝ�g�{Z�%'`h�<�^��=������7$쵆
��=L3����wV�^�6�@g��M}�
6�mC�Qܚ�Γ�`&ʃ����>��.8o��#�q����DQ&:
v�uF��]��]X
@g0Q��u"��4|f��������JE�ǯ��l3}��6�k)6q���C��9��}D���<��;
��&
�RÁ;�Rc#mT�#�j��F;�3f2�WJq���F��rB���`����&M��q6x�&,��K����o�F���v3`S�Hٓ$A���A
y���ܚ1
]�Ύ�v�!A)K�hW�,�C��|TX�c���u�W��ݴl�掚�O*~����R����Al�
(ʹ��?�lw��z�

�ʖg���Ӏb��b��X.��d���Nzw��_ug`^N+����Q�sl:��Oj|�ar��N��֎Ӂ�.D�H믺��[�gU�KK���r&��W�0ήLփ���+}�e��^9n��?�юt!"��<z�M9*��υ�FT�e����z������(��[�{�D�qlK�W��_e��`���˨����C�`*���U��?�^�{dz\(�H����7cK������5��uk-ELm�S�b./������ܥ2��c�e��'-�s�r�L����y���z�����t>&ss{��B�^38?���`3�
��b��^�	�f�N��o�\Xs����ڠpU
��6�D�ĥ�.o>b�mV"Eos9YyT^��ȩ"�����Ӹ*f�ro�<h�8kO>X��O��o�2�[��m�ԩ�|���
;˜��o�<�߮�
P��
��E��!�	6X+Ͳ�yqr@��Y���3�(#���<jIP8�go�z��MRPgc�}�O1��V��HthTYl�9�܄��Z%mŠ?�_��F�L
�G7�o��.�%��'�*�n3b�p��(�����nyo}�
�4�{|��PB
	w�K1ܝ���~��L
H�
>>IWh��������ZI�n	���}��̲�r
ǃvlZ���9\���*�
D&��'�]�h{����*Lzā��B`[Uo����2DU;r����ð?�mzd~����O[|�6��o�0Ā��/Օ�ߴ���?X=����u�0e���C?-x�ci�d��d�\��e��V(�E�!���T�]�O\~
h
�$?j?	PH�@���늎{��W��=/���5�R����`Y�)&G;��Z�&.G�@����Z��Z;ΥV�
fY���{82�
���Sj�2fs�My'%�b�)
����A��?�v\#;���˫�����P\ƽ�KDsܫ�߄w��6Gy��ɘ2�Äb%`��IK�Ҙ��M�E�w��,z����m��=�8�������2��ϱ�8�k��
'�c/TKC��~|�����Uh�S��s]Q
`��f�D���V&*��І�N��1��H�cp���C����_Koy�7��j
����-0��@@���Yhl�G�Qg7�c7�һz�?�Xi�㠜�SM/XA1F��+M����YɨUR)�l�m�d�Lq�WHj����&�?p`�Sj@���1@@�-����������<l���w�v����j�oqLЖ�Ah^�5�������߼b&k�c���\'|%.6�ǥVZO������Fbk��)��l�=��g
�zqR�������FT�v������zO�^^����b���Ҙ�e��8��8�s�m�b�A���wo�4{td�a��hoNq(�@2�Q��m����r`��r=�����+v����b���{���*�E�uHɝtf۱�݄�U��+�%/0�`߸�

���ru˗�{ލ�9]���Uxr?���	�f�>C�xK��/�hE[e�	S7��a��O�.��</I
����lYHmЧ䋃$���"�S!1���X)
JIL�b����{�?)y2��a�Ws�pJ��Y�s'J�\���]}0���ӗ�'ɰ4U4d˲/n�mfEr����
�_�C-��p(+:��9����+��	�;���zaщ�,��j���y9�E�]��j��0�9�����8(�!/��!�pG�����$�������쬹GR�ڐъ�;7��lz��|!�Z>��!)Y&1�����h���&!&���^YsY^�6X��h���\v�JI�
2�C���إ���FT?��׀
iA�Y=����R/����ٻ)���]>Q��Ѳ
�����L^�?��;�
PE������l$�h/���~��V��jʫ>B.Pl�UH���%z��\�K�o���/���Q���?������\�Sev�4Q>��\g�]g��#
�Y���8�v#<���`m��z��A�����Le�L�
q\0�5a�u)��fwoG&*����?Ix�:7��#.7خ��=��!.1��@$�}Z
ʔ�rD`FƬ�8�Ȁ�oڞ�_js^�em3�rFUU��W�a��뽭Yu*Q���50����5�u]�캮<�<
�a�s���y�$��w"�yy�q�o$Z��L���Ƕy��#��{�����Ȩl\uh�/uD�F��fd[�ʩ)3@�ѩ7���n�����s��	Ү����l���n��(�`��4��IL�O��Sn�d��.KҞ�D/�����6Q�h�y�ϥ��7��s&�2�̓���{^$�؂�d��I��N
{&�R�j�
Ⓘ�%i/0���+v׀P���-�mc��pkW�T;�lM�5��4bC�5�����ML�FU,�e���2d�����??:M?�o�b9�h����ờ�\�s%�-�KwӨ����N��aǛ�zo���ק�2��A�^Z�*����/���W�,%(�zZE|<�jU{T0�ꖜ	+�a�m��/b7E���e��,60��E���_`�n�iT��M+��w3���-Ql�g�}/�opb�z���4��eu)�e=k^��e�h��_�t���5ոS�6�#$ZD��rĊò`�$H�wy��%2G�%^I���{���Y^��n/y�Ҷf�������UoC���*�|<z�d�|���65�8/���Yd�A��P�[�yJmӯE��2�!k'����:�q��#���
�����u�kEU�Cu[{��	~j�e���3���<��Y��R}ED�Ɓ����f��9r�윃�8�|_��/��׉�-���4���e�j��t��]R��o���B�)-��ᬹ�&.AP����:�{�j��oD�oO�)6uv�jV���.�
8XJ�]S
�I6q[�4`DF,�t���ሾ��Vari�)���-����Hc��q�����h��35�
��R��)-0�S��;b�"�.���͐�RQh���o6X3��
"N�у��/z��jA��lG���pґD�t�B&��_���a,伪�����[9�Ǎ[U^:�^��|���e�'��zĐ����3��o>ۈ��*1�>�&���x���+N�M��Fk�{�����9�W��`��M)�x
�l��׀��X.�k_	I���"��쀢�q�������c�2d�?AT]p7����QW��=%�-I��]���R]y����Hz�WBYn���gO&${��uJ/���tt��z�2�>�&GC����=�����Q.�)t
P�8���ݹqp�v8�)!�^S"�P쾻+e�vz�@y#M��`+�A���ڐ�Zq�y�Yj�i�]~�ϫj�(�����a�2W��+�S�����;v)�)���d���2��1��Zx��{
�
^^���W�T��5�2�y*d�B�P
��n������o��<��
T�g�O܊���cdB$h|C�4^�LW�QF���r\YQƛ�h�ֽ�S9�C�q���P��b%6�@�]d+H'<�E\n��B�!�N��#��<T���p*���N�~�é�����Nz����
B�Y��ldX!��x����T���zSh���cV[�[�I;��n7̉]Y�U|yV����*�ߐDZ=��N
�.ϲ�Ҥ!��`nN��k�e���Jȗ�E=:��3D��_K�#�&�|�������J�:�h>T�G(�~�f����/��|�y�i�sצ�€Gb����z�i�
�kp�0��r�[�}���S
X�]*!��%����:���(��b�O��H}}��K��^�*�o{Lm�n�D1�<��hw�O��������D|Np��j���Ye�*�#�H�#"��~曵[��MH~��S>�
�l=��(��s����&����Ŀ�9]�KLY�F
ϊ9s���0�8�#�����M����ޗ�g����w��s%�dy/tN��2|Ƹɫ�b9@T�%sl����N%@o&����k�Sw�x�c�4S`MDynmD�z!o3�A��=���h;˄�4n%�
@�g�uC�LJ�x���[Y��(�y��",=�����j������1,󮞻��ʜ+̙r�U
0\��m�i��
rY�4�g�Ė	���$��1�N�7�#��E2��M����Inq�;ě@�	�Z:ju���N_+�
�
K1�ҭ}�+�6���Ĥ��670z�kɂ�x������!�Q&-'R�=�FbT��ػ	�q�q��1pL�m
L�1�R-w��ȡDDq�ݞ?�y���b�W��ےS�\�
Zz��AXj8�ڤ�-��>8PG��˾�7\&����""����O�Z�„��-+�T,/O��ߜ�C`��'��0���=�a�,#{��ѻ�kY��2�������4�:���^'
�K�O���-"�莣~����#��S�Ƈ�$�II7�V�<�>�>AN7D��y���믕]!�מP[��C,�v�]W��U�y�b勡3N����pι'�������4�6@���O,�r,��Svd��m\g�x��~�О�Wi�e�e�7��w���9ꍒt�2�&�M��\E��•V�9y�}I�whGr�Z2g֚��*|^ҠD'<+l�M�<`l��љCtҌ���R�HTQQ�J�
me��G��T]
 +ϧf�g
,W�G^��
��i�͗��71�*�u22%pi`W�G����Yo��_��Q|�v�l��D&����L�)e��F���]x���uti�Իb;kV4���<�e�m�Z�/�u4K�	vD���'�}��ߘv�<.z-
��+,��`B�)0�'#�U�&��A�R�Gu5�����9�J�9(A���`
Bp_��0!�pe��U�VV	��Hw�ܪ0q6���&�`L��l�`�6D�L�؝L�s)����T���@X�ş*^:�����K�w
*�;���7Q���M�E3��9P�aGa��3I��>C;&W��*�s��
��:��b2"dϺ[0,�����4r6��W^j&�@5b׶�qa��Q)gB?�hE?=P�3�綡=�u��C��X{��Ī�	��v�H[���vXkS܎��d��8�h�li�^���Bʎ$=M�v���0��"���T�8��z�S�?���9����3�����8{Cϛ4b��ht��iỶ�$�>���Wf(���>���9��u9=��˖�AeǺD��_r2��9{k�)�0�/�g7�^����n��Ј�����
�������+��t��^O�Q��dJ���lpOG��J�’�E_�t��j���N�N�Ҝ��eg�]����R`���	
���`\+�V�&.��V�m�
_ʅ���o���{T�'՛)��jN�jI��6=�����8�-(g�m޽���@(����{S�
s����!]ő���)�/W��NK�H�a�^Ho���]v�'LP�u��jZ�t�q+��Wl�Z�'�

$Mg*����:V�M���(�DN��Q�|lP�-W>y�pP9��/��~y�Jd�7����`��8��)Ч>V�]_*ܲ�>�1;�R��0��W�Q�f���ZC�跡w���-����xٛaa��Vn��ɠj�3ԡ��]		�}�v�����x�����g{��q�*#�؅�[����v�?��
�j��)���C�^+�.=���T�$�mQ�!�k��b�a9Y�{�#��zQ�xӧɼꖀ���!�!�
�}�L?�l�;#w}��/Q���r��`�\��史�~���S�<ϕ�-C2=Qc�����N+�ģ�����t^�Ƌ]�-�o�'�h_�.v��_�V��?��z̅%�o��0������<�?�ay�E.��ԉȗq~����м�\�7����$��I&=e�ʃ�s��Y�"�+*��C���-��'+Gy����W��H!Ow[
Љ�l���
�k��T�p���f�ATtϛ˂�S�ⵯ��Б<A8
��yX��m`;N=�?���j@�}��[�0�Tu��ɮ��n�W���Ĕ���u�c��;�g
̥��p�{��m���!G�9���ϗ��\�(w*�C����H	M����'F\�`N���ܤ��/����׭���XJr*RBB�O:6΍��}Ӥ�a��
�z@�)�Ga��YbO��rW��0Qjg��d�@yw��GSH��7"��U��HՒ�Tť6�7�'MJ�e1�+�b��d��
"��w,����}#yU��e�:��u:�-h�Dg��
o����{�A��ж����j�j)�\yޢ���`�Y>�o���������Cs�Y99��~�2�z����#��xB3ƭbX1�=熬.��@�(,}��^0��e�5�S�R}\�`D�À|9�����о4����hؖ�����7X
еn~�(�:
����\��u��)����A&����i�]�NBf�����1���~ܙ9�����?O��DjNe!Rs�����Λ�bݓ�"�E����.$�Q$��c��Bk
C
`���ID�Bn���@9��q�O�����%���O�uw蕘|BŎb�årzyũL�w[T���Wp�,�2�L9���7A!�Ѵ?�n2�1���Ǻ��K��l�3>�9�0D����$z�|U|��_�[a;BJ�WY|��Zc�jOc��?|�~š��U�
{��c`�@,a�
~nq�ܞ�B��Mhxk�PCtuKYҷ{��w�TǀT@���LD�3�����87��n����k@��{���*AX��<�5]ґen�S�b�jQ�ԎZ?yթ�
��
v�O;�7�q�^�!�����@[D䨤T���^��D���]J���}�@>�XD�������XrQ���F-���u�mѼ�F��I�:8
ʋ�j�rG�7�����㳗�c���0O2��;�!��ղط���
��_�xtK��l�:��*G�qכ���6�	�~բ��ϛT�^��S~X�
D(��~�kI���b�6�{!�~�yM�ot��)d��*��4����/I�t�s�i���r�륍?E��Ÿ{Y#�5a@E
�g���$he��b�׼�?%����`Ha�X'��#��f&_�S�Y�Zp��~��w@\{Z��,���8�K���[7%q"���]�\J�?���H�L[��k�"�
p��Qq�?
P۹��o�F׽���M��U$S��t�49),�	���|��1�3�9ΛB�U�Ё.{
���i�^��;"����A<,n;u!�\z��:D8xF���	�K��ۭ���[�=�Yk��̃|�C���u��ఇ�5�C�Иh���)
Ʀن����p/��~L:�~�y�*�"*R1��tWUX�|tų��d��\����L*�����q��9-q�ҷ�\R���`D���*}�?(}�0��-�Y��6��M��j����:��Zd�C(����L�\��!�}Ԑ
���ʵ��j���ڼ�u�@&�X�.R��yl�~}���R�5+�B��LE���͖&7�hG{XK��O�B�=m�a��5��v������:�c
��� ��
���{�l	���
:�t
PS�q���2��-]n��]M9�G>�9�t���i(�/9k�w@{�[60�T����E\~2W���N�]˯���Z�6�T����l
o�;�..���9���{;�2ޑ}:�/�Gݭ?*wv����c��p�k�M��"�}]�^�b����+�Bu�L���"J�\�t���ܶ�b���*��k/��I��҉)��c�����x��ۏ�+�ґ�w��SN�2��.
����W2��%3t`dW�}ܽ�[�̸�RU�ǐ�>]��q<���Ϝ#)��!*��
Q
�uU�T�9�{��)�ǓO���Ϣ��}�k��W�R�l�@��kX�lsq���=�y��z�3#eG�������
;]S
�.B{h{?�4CF�S��\H���&���'G��G��MTaYt(O�R���g�1��x��d����{�)X�xU\�H%d[:a>��K�6*\B!N
��{�n�����F�\j[�|���B��
#�1!W�$�.���G���kV��]l��\�x"k�G�ѻJrI����l�����3�0]�xs!W-di���
m��@2^e��M�H���쌲n�K��n���HY�S~�c�Q9r���H,6)�Y;��h`�cc^��1����/	x+�������������&�G��Xn5ZE�]-M�!�6���c�C��U��ɳ�zP�g�A�"r6J���,Ο�J����_E��oL:ڷ���g�Ԁ�^��w�:�y��.��G�ͽp�Ѝ�Հr�*)�����1+W���b��\dv��̒��c�Wj�6���6J�c�p/����uhba�p쓇\�������*��D
���;�m�A��(H:ƃ@�}�%���9���kD���Lf��0�'�<٩P��+?*xޑʭ��kTצx�G'��K�̛?�K��=��
�gf.����wр���T�!�P��sH��ů71\G�۞�M�[3��/�F�R/�7�QP3綩�ڑj
�>w���w��fŷ
3r�y/c�L<��~v�@s��񚹶��Am�qfR�5
ìje���×��[~�Դ+�Y
�P�
T���eq.۰�/�4��kr˱���-�z��i���e8���y��/�?���H'Wy�k���v=����fj�o:�a�䍳e�Զ��+��яo�]T�R'mZq��\�G�͜�ȌC7o\r{���p��`=�C�OG��z_O�����`˪uU[����f��.�Ep��Z���1$����V�3�YFv�&��=43l���ą�*�?/�:��x>L�D]�z�����r6O�g��	��\z'r�^˫A����z�ڟ*�s�0�V��{��L�]1�7�s���[��-��"u;�Q*\@�%k@C��d�~~���E޲�:܊�5���7��Z^�~t8�W�z4��3���
�
F�|�Ia\++��E}�3��ۤ�'���V����d7�~�;�@���_���ZP�k��]��Խh�3!*]IO�o�Mk�h>��u�ʾy����i��ʕ��P�M]7s/}f?:��Դ��������q�7�����E�x�����t�a�ș��dɒ�U���۾t%�{�Q'Ǹ��"7�<+��"o��ʭ3��B.�i��^��/<i�ݕĒ��F�U����q�7(�|Z}-��r�A�le�̎W	�u�v]P�	u6�~w?ny�o�a�lU��Κe�w�CF�ğ�(�f�K[xMZ�?���H)�ncn��\	�x兕z���	�����g���U�u�
�舚���l;q��q��R��_�&Y�&����E��w�?�d”.�;.��T���5
�Q-���-^���@��8�3�f�A0������{�"�ܚ���XXp����%���C[,���&�rX�зؤփ	䷖>��.b�;D6���c�z���qu3?݊�)��?���)q��c8OF^2�r0�FMX��a�=ֽ3�����
R1F8g��3�̄���M���;��v'������&��]Iچ��pJ��-�_�'_�7^*�la�"F�v�C�vP=�I��_�Y��/�!H:�~��(5�*w�_��Y:u_.>����"��m�,�W�<Ho
ҭ}���VM
ڝF�ߝ�n�qგ��4�C�p��J�[�`�1y[Xl�f�Q��hf�S�ـrt��y���\�F�|����2���śZ
�<�����{jO�촲�Ɇ'�����xx�q�����~��+Ș�$�JK)"��o#�R����G�@�_�.~��/�f�_ڲ��%\,�x&F��W�W
k'At���J��.�	�8P	�^�/KL�r�ϛ�M*���R!{Ci���JD@4��=D\fF�r�D��OA���*M�
�Eay+���5K�[����{��?gh|�[��423-o�M��"�($Wi8��
z��>�~�:�Ѧ����򦴆=����zc0/��Z
}S��K`o�źS[Ax�:`����;��ܩ��޵�h�u�3����Ąb*�a����n�n߇�/����{$*�s-����|���n���`
�(�𝺄���'�dz�w`G��mb�Gp�e�]�%�w���C�AP���V<�=��2�؛��#?�Q�F:T7`��R��ͲEz�I��ή^��J���^�~��D�`��6a���^�y�����#���
�=�r�/�t>�KO�j0����^�K�����>Fp�_�ה��fı�n�͂СI�	��.{�˦��w�~�\�w7>��5{��幠6�R�
�'EN<��̩H^cKd�i�t��KS�f���]?o�
S��Ե~�Ώi�>��#4������CT�b��_f�|[��i1V��B6��"9�D�p��9�z
��
��N�
j���:
"�87u���Qg���&6�>����^
PG)����U�p�td��!c׽o�)rP?Z-z|~�+'ҞI]s^�ۨ��u_t�%&�()l`pĺ�gqk��Ⱦsu�4i�}��|��n�av|��3�Z��̵�I������[(��PJ�\Y�"[<߳�{(%������$�3�C)3K�)�E��P�S/�"�=���漤��~	�l.��+y���˟[���:j���
�K�M��Kw�ܜ�6��|�f�3���N�۴'I��NK��Lv�f�ݭ4lO�9��Y	�Dp�}v���^w*��T��g�̙	X	��I�@�
���	�Ѭ���y@>ā�;j����`�������_ˌk��~9JB؛��6��m������E�z\����͎�uSr�Ei
x__Mӣ�4�a��,���7�h�q%W-�v̟N����0#�͛���*O��מN���W�Е�(�N�)�/�LjD�����~�i��o������4�YN]��u
a�*�L�Qu��?�ܝ�݀���
,)<���<=��ť��o��qinBs/#4W�w�ˇ���qu�n����M,c@'��&#��\^s�W�~܉�nd�k	hq���1Ĥ�Pd�9U���z�58����c����ńm7{`
��(�e
XS���ܖ��Ƭ��/���y#�+~j���r�/��7�;�;�2�%���U���3B��S��}�+��7�;���o�WZ|�O݈e��C#�������t�M�L]Z��L�*[�+8%_��*�ߺ�[oV5n�Nj��a
Nl��(�lv1^��F>�"q���H	�?,wu��;h��O�e���n�ϖ[v���&r7D���AZ�g��nB���O
��V�� �2G
��9��?4U��LY�T�|⢝9�5Q����=�}6��v�
u4��F0!T�=#����!z8���?��4n�%����%�"Շ�F��P�ŀR�ѺE�G��79@��5�NqH/#�vJ`��=�p�C���!&j�v`-�~G��Z'�/�	K
��0L�#}��)LM)(��{�̻�)��X��-K��BG�����o�Լ�wKnZ�ī��!q�٭6�s	�"�=W��;�B��o��/�>I���I��3p��Un|e��	��^qG\�^ou�:R,)�ʯck��>d��8�fq�E��9�1�8�����R��{�`�CD�}���[D�	�	����Q#G{)|�/V&\8XV�
�^L(/�=�W�`r��1|��B&�r*ڍ�3x���G%���q4L��fFǵ6�s����l���-/r�u�]�t�i�Q��^�����|��ll�x�hD��e���si�|&*e�
`s�ԭ]������3�"��m�6N���
���O�$��7�oG��j���
�~����[�$]����ǐ�?ym:�C��v{nv��ۙ�ʛ��c&��A#�L�Y�sE��-�ԓ�E���3X�-(������ʥ��D�]�w�]�c
���r)sw����s�rC�VA��a{N\7������H=D&]-~���-�#����zc�`Yf�_mW:l"�FMH��(��
��/�����V�O*��,Xp��Ƣ��&Ќ�wR�T����oQ'���[O�	�4�������7R)lX��:�J&�_?�͂(��b��&le��4ޝ%��i�+)���	�V��>N�:��IE�I��WX�~�Ӯ/�:�I�
,z�%�kk�-1&�0$q͖6W���I}���$'��lC\���{�av�OO��VlA�x�����vE-a��7�[�[�o�q:A>^��㤗�O�\|,�ʋ^OԬ�����U�}Q��_�]c�h'2���
�[��:�&P�P��*V�hK@��	PTSS�#�2-)E,]$D
��u�˥W��{1�g^Ѥ�ͲH�{�}F�kSBJ94�����BD��]M�	�q<	ؕ�?��]{
�i�?3fC�0�m�(%��Ҏkn�efȭ��$ɝjw�H*�K�u�qi(�K�H
I(���(J�m�v����T+v����}���1���9�y���<�|�n�!��x�t-��[̛�yk�]߸~!,��n>thgE���o��)ˀ�*:�[5c��[��PrUY�X�)o�Dd��F��c�I$�/��^����Y�V��v�U�J��i���,[��)=���Ƶ�[��+KO<��
~]�*Q�@��C��]�ę*v,�)��ϵ���Y8��c��U�)Ӥ}���u"��ѐ��3�:�1Q���y-V�ԭ�O��g�A��Іڟ+^.�=4i�˹�����E“���咲���Bqσ�3I�[.K���vK߭_�I���jV�N�����ҎD���k7���Բ)B��W�7�"��.۴����9k�4��-v��8x*�W��HZ���g���c�g�n�*	\��!�������ק�+%�,aV"o�(��
,ͱ3��ӄ���k�;�7J��M;6x�'��=�˙���
#!�u,��W�Rl��9�Y�3T�C�BR�n��.�%�w�v���y���9?��^���̇7FC.tSO�m��6�^e��&������
Lg�8���-N��#�
�GrA�|Ҟ�A>Ӆ���d�
3c6�ș�r�m��)n
��6~��w��&��DF��Y@[�Qt�Fa���b��-k�1��-
[StA�RWi�m�YH�����q;%��m��l���@a��#1��>�=��O�P^�u�K�TM�7���f+�@o�I1��yu�rd_�'�����?�\R3��k]���|b��k/��L1�b"�M!F�-F"�d��N����7��@�m:��Q����>4�,�����M'-A��G�1������|�Ks2�N��@Fr�z�S��>/���TMAYP�n�8�v��3�_d�^7Ѳ
n�洋���=ē�eA6hY����y��eA��;zn>�]BK6���4�A&Ѝe�[:�^�f�m��Vs���Z�+�<a�Vx�L�P��o���4��9���c��?�t�ث�G:RW%%E���.������=fXS��V��{��=���"Uf5M��<d���N7?q�3���X�l��ȷ���.&lJTL�բ0��C�T�q��A�kH���96�����,�m�鐰�է�/ccS�
1#��u\��l��x^���liW㢺%��0���H��d�!�J��o�����n�"���qV/�^i�
�5T~_u��gG>�5y�^J�4��*�
d��W~�1��y�
�.���Ń��[[��r��2}܆�;I'b�硧l���Iux'{��/�VkHn�y��}/����"���d��q�ЖM�C�A�W���ѐ񨉖�c���r>���>O�DEڽƜ
�p6�ƻP�$�O�B�>:3%�&C+E�sBO�X���f>߹�ԧnDI���.������\!�Gp����n�ѧΡB޵�*�������<�|�K��	њ�Nɳ]����I>�u�ۮ�.�mZ��ٶ�)mY���{�4T�s��J<!�xC��;:�O�W%�Q��~M\>�!�w��ዤ�O�}7�����K1�u�N1.G�,��j>�C�`i���vo�>�.߽�	(��q��:�]�u��Ú�x��HY?�F��}x5c|r�g��Ãd�9��Jg��Fs���+��=�U]+�<)�DE���XV\#��=�G����R��]��Mfن,s���.8?Ў�Y�<Д��2�%aZ�b��8�o�;��,C��6�:����0���us�k:����П�`a��~I�a�f��7t���������ړa�G}\IC�c�:
-y�N5jk"�5����>�ָ�6=��G�dɑ
C�\�
rkb�F�v�.L�����L݁z��<�/ē"�\�3Ͻj���Y�<j:u_��6�H(ݑ��޿������2>KR���?_hVn�`��0�w�`
{ѐ���e�|��^���O��V�t�+k��Q�>�́g���.����5����$#8Y(�}>F=��|g`�nd��'����=��${���}�EJ���e
��5]&哤��9���8$�i=��&��UJa=���0궰}ӗ_�T�ޞ!��5�����2ET��yk���=c��VS"28<(�����xV�
�,1�Q��M���l<7�D�-�Β	7O.���Sp�?�fP�&-��Q��xe��1���.��O}��󰗗�1.
�9���0�[$^��Y����Mdc����-b���1.�+��\����:#���ka�YN��`�?�����`l��ƼR�*6�:s�A��8��Ⱦ'��T+BG%dB��2)�����,ؘ刷8~�����@6�u�L[߃�!!����+v�4�S<G;��r��Adי<f�Ó{�EW�z�����o�^�
e�w��W�>�u��v6d����#��b'��Л�C@|�곓jq^n+��x��=�j��7��BM)�}o�l�(M�vL|f¥y^�����~�5`�q@����V:8�[���E�{x�U�Kkwb�
�p�����z	����,�ٝZ�x��&��~
ܨ\`�^������I����#aIG�OV�Vz��m��?Skl[��V��^�b��!<���BY��(-�}�
��i�/�F�K��⪯y6q���a�ilL�����*^���2�O��h��(���N�6�a�ccܽ�}�‹��k�h)Р�������B�!��Hl��mM���l�\7&8^mj�@	j�I���њ���]���JD>�`�g��`Zr�䃕4
[%Dy����<��^6�BX�K����l�s.m��Hݻ�	9��B�)��h,�ec�M�,.���2{6�u�>�Q=މ֨��5�%���0IW�e�FК���7������e�s@s��Vڝ��<�f�҉5�����!5�Y|���w��÷�s�����P�X5�/���l=���E��xˀԆE,��/
\�m�������i��r=��+�z�4�H:�#��c�R@�,x�=-ܥ���Hf�EM���W5�?g�k�xfu�,�
�5.�U�ګ�}P��g��!����_ݱ�R[�{��B[�M}�����s�Qu3�M�=���5��E
��r������)�|��
p��tǡ�#�i�넦�;(��O���6���{rh�C��#I�Jxc5�-�ESm��o�g'<E��5�Dw�xc\���L.ʤ�6�i,�{����<�i��-4j��ⷫ���Tx6�Z��-MiD��E��>�Y��CkY��{;0�-$R{b�
�I~�C��yMw���/�R�H%�g���u��6J
�W�x4�C����G#��;��D�f��~8�9q�w��*
�c��������^��g���$QL��X
�Q�ʲ�il%g!�_1��nڕW�"r-�5�6V�?�ٴ��A�5(�n���6RZ�+�^�+��(�ݝmi7,����_Z�ź��o�?مǵ��p
!X�"��Jxoyu�R���w��*q9cy��)�\���2מ?�V+s��Gb�c��V9��?�\���@�,�V��B>�+�ی���ikO��-�W=(�XJ�X���x�K��r|��Ԭ��*7�x��Zf4ƙ؞Ǚ�@�n-�v�*�����t�꨸�$����6C_�_�h�%�ZX�H��e��h�
ک��T>[eŌFD�>��^�����R�?�ѝ�-2���9��ذ�ʚ�g&�VZ���p՜7G���E���HU���T̥?7�.7��	���a��k�t�ڄ��KV�
�*�2�5K��&J��&�&��9c�E����U�'�Ջ�cc�ڈ�R먀�
ac�6���mZ��x�dz0��il��
s۰Х�FQ+��|���
�,2i��G=�t��n:�T��܀8�y�k���03?�Pv6kt�:Jw�1�3v?�����su�ɱ���b=Ȏ��${����Zb�p��$S�f�[Z
��oaSGPZ�x�7�\��~��>�Zǂ�T�Ep@��a��W+st����տ���
�'��U��j��
��W�J?m1}
f�Bl��m"�x��#�玥�<w���u2����l�s�vεo�aO��<]te9�*�
�LkP2rip�8(�ވ[K��2`���/�1/�<+z*�$�2�8��w��թ�I���-������af�@�V
��`�mix_y����#a^MHf1.)���Z=�^E58�4DiP��,�	���!�A�K�(ƜOS8�(&����7֦})�0Ѽa�.�#'�/�yOs6������	D1�5�%c��0�zD�L3��P���-�숥�]7s7ݡ�O�,�FUӚgy�w|:e����G-B����V2Ϭ��XH��dF�:�j�c�Y^=Y8t��V~0�����;�%�B��.��	sy�RՖt����K�.���Y)iW�a�u㡾U�("�n��Lʵ�,6o����p���I����
�ٟN�����m�>�7I�
e�8/�{�Kd~��g����d�,pXr�:���h��Y���TŦS
e-�>��\({L�_(���c��[9Z(�fb�,��a��´��2'�υ�ۤ�;R�LGeo�e�jFesK�tL.��(�O3,ݘ����u9�
e�)�pJ��7aa���d����8�3`�0
1e䋈�
[@?�BB�B4��E�O�t�	�3��	�>쯝	�cn__�|YM��
^�e��&��?#)<�T�3<�PX�"޽��������?����/lR"$�n�r̓l�b�
D��n��΍�65cw~�{�ė-h�I"8&
|�Z4���@oG��c"4�:��(�L${u�'5[&��1aɘ������%���u���<�m��p�ha�kM��6���ailL0����8�"��C)���yy(�ͼ�6���L��T���-[Ȑ�U0�p��P��Q��F���#4��j�_Y�m�l�y�+������)����t�����h�l�mԚ.<�Pvo\~�����gR�ڕ$��u<~���馶�;�m��R�b�Iv�JE602��ѫ��E_���
	�K����%����4%���߈��#��=�����H�9�و������,��.����4�u��[Q���os#�WH�\Vj'/#�Z���2pG���,Y����^��w�/^#g�"�YQn֑�
»CJf
_�%�^<<�:Χ�Y�8a�-�
V*���"*��:��-�<;Q5
��������t�͌�"����C�퉑wL����N�3�&LG
C�k��8���듖��<pk�)sl1�4l�6�)��9&}��n�W�ZT�X��lU�*(����;T-��#��t�jI2xUz���mu����}���<���?>Z��9�R�g.��Z��pJqM���_��7�Q��߸�7N�$5��iԧ��;?e`��`ٕ������8R���v�
&d�8;�q�C�&�	�Ê�5"����h�U<��na%]���|��{}3a�#��cR�$���4=��e����	�S��x�%↟��ԥy��ZE,䐰�|8��N�ء��%E��v%��SҺ�{�������rB���3hy�g�%!���/Hʟ���-�)�_���w´��;$L3������u�0L{��,��h��d���A�l��O2U�j�u��SXn�{/��4�T�KA����7��;��t_Z�Զ��'��
r�4"��~�^��MEb$�H��+Ӿ<��]
Qģ��q��;��I0�fM��l���F=��!���~¾:R��Qux�ԯ9"_+Pԯe�QV�|'Q�حֲro�9O�Rj����jR�H�E�D�6�f�q\��	:���	T�
���T����v�H���G:��r�U� r
�k~�ߣlخU��W4��+ył��s���6�@�ŋS��}���<��8��s���oJ�%@�X��ܝ�O��b$�++��;����n�͹�t�zT���s�����n��N����3�*R���Y!ĦS�G�r���m����Y|8����WS�_zzi)���K��ĵ1�������&�txG�L�8]ȯ��_�sE��)%����A�w��	�?`��n6�R��
��4���40��x
�'�A[���~C�mҍ��i����~b�;�F͡]���y2���L�>x���ƍ\�(.�~�ݷ��0����s	�&��K_Ό��NJ����FOm,�X�Z���A
�l���1<W��"i׉'�D��E9�/>o:�1}���BՑ�f�`M�w�|]�{I��>��;��n/�Ȧ�M	'��JN�f�4
3@�q@�����a��%�
����؋$l�����#Ӡ�`0���,x��ʃ]{|���}��;̎����@�xQ�u��@k�
�%ߛ�����΅��cut�|�
qW���QV�`���L��;�����c7�]�-��l�F��K����+F/
cxhIM��E���m\�3���)
��4C-�i��o�@��
W�v}�y�%��vkSr�7įȿ�k��ޜ[l8�N�Z�\�μ�K�5q���<�#y���ں���x��e�l�����\#:2¥�x'>�K��R#�6w���]�Q]z������q���O"y�a�ܗi�:��3"�O��ߩ���Ӵ^$�ͫR��Y�ʖ�ҷ�)_�����Jy$bTX�AV��!'��\�q�*���Y<sil<�;meS����b�����[���w����yҏ*��~�-�i��Io������8��bIV�`g��r��7S�j�*\����qz��A���v26�|��jVE0m�Q�n��2�~u�����>/:H��+�0�n\�c�`�����ƺ�z
��|۹4��'�nx�	��"�nc��Ԧۑ�A�͎�!kQ����	�Bk$�^ߎN�x���x
�9n�j��(�y[��OH9#˫���9KD�|ɵ
��'�p���ʤQB����ek�VFGܞ
$������}�&-�:�5M�D��
 ��\K*�g�|�@l����'n�q^���.�_'�N��?ǟ�wqa4�T����KPK$Q��.�޴<B�@zH�E�
GN�R;����]l�%��>ѫ6L�����j�_�Dʑ��nGv�����p���	!��x�۱�t����
[��
,�����
�"�=�7e��*7�v�7i��>�K���s��f�w"�4;W8�9���;�D"�"�"�?�{6��b[�0�Bm����M�
%!rm�=c���a�	�À5_�?Ƿ�����9v{��1x�&�;h?�P�0�~pL9
��IuC=�@i%I.�}�{�KG`/���@|@f�(�y���ސ��f�c%0��)x���E)M���e�G�MG!��>@K,'C���&Y�,�2o����h���S%�6��`�g��-�DFH�[þ-W)��C�k�.�RW!��ȟ��I׳X���/��
lw�k�f!��ȣ���=U�6��Y6"�6�ŧj
�v_�WJ�@fk]�=9����Iފ	~$�{�=��܍.K�#��_���2e2;�CV��{Kg	�]�CT�K1�&6`5�<7��j��w�����7��k����\�bB�^\�w4H����lL��d���|�Æ�#p�^
V·
��R!F�\a>	��Q����F����Ka��Z}��ܫÆI��X����y�	^n�	Hl�=�w��-��I������=)CN��r�S=����VhG���Ha�O����}:Y�!�2~[-j�W��,���TjǬO����i���S@|�l���o5�w3�<#��+*�ɣ
���b�V�oN*�(7J7k'�d�����_v`#z�l��󃲡�G��g)�ޖq��h�囗��y�_w2�5�>
�
%��
��RR����++�odӒ��e5]��
|����g�T�ž��38�>�B�O6��Ծ`�~�
+\�Z�(�&TpZ��&�v
�ѝ��l��.����0Ey�<LO)lwi��<V%A/�\���A��w�F�ZZ�X��
:#>:>��K���mYx����t~��s���S���0�����t�L���Ћ�[�Ȧ�8����j1�D��70�����|I��l�=�n�"~�enP��í�`��r,�D�,c�>��
X`���I�a�1��Q�-��*\���+����
�<���tg��"���>+�(�"�?&��{��L��{E�k�r4t�@���I����#)�v-e�$��M���prA��-m�>ro�Tke~�{��y`v�����.������Zﹷ�&�({Ȇu�
���A�-�rw[p�^��σ{���1��j0�96z�dŜ*��k�J%���	�Ϙ�w�K�4�$[��<�7�J�h�6n��F=��
��U���m<�:���r��竒��A�QS�Io���fn$f�آ�:X�������f�)/��hf��Ҹ��������g�/�}�,/'ZU��m�X��"|
�
v�Ыc��#�����˘��z($H�|�;��EܿlE���g�5J^pz���E
|�n�K�0��%�z��8�n2�PC���:;�!��>7�����؆@�l=�c��R-���{Q��Ν�q3��G��%�(d�����@�+q�c�xg��Uk��c��V΢�fY۳ۏ�Ž������K���c�m0�d�4��@Â5y����1���5�\�մެ՟'�Z������5,��p��"��;)6�'v����̾����S�=!"����5�A7P<�sַ�;���h��mv��P�
�ϵ\x@��'�z����D�Вf��9-O���`xw��l+ևO�>׼V��?���(9ڗ��ʥl\�'��(!~�S��h.0y3�*ro�����n��
㪃���pi޻���z[V�LF8Sժ�<A��x�� ��
`���s��Q��:�A��M�5a��	��'X���Qao��*�kgTv���6뚰��M�Da�;w��棰��CK�Z�9��E"��=H<Z~�3�A����%�{n���^=3=o<٨��X�H�_?���Hv���P���P�~�{�K�t�mz/<[жjQ��|+�O���A���%�,���p=��t�}��ƴ\
��?��I
��l�KG�P�`�3�xٴ_[<i8���#zS&,>���oUF���y�QCqO`��'%��6G�w���n|L��}��#%�g$�����z�4�
a�H�#��ָZXF�K���`����\b<y5:���-'&��a'�Z���؏�+�?�0l�`ZvU��'e
�T�Ɓ��`���cúgx��.l��8|LU�#�������
�.�U����Z���������APk�wȔ�L@s��X���^�f�cL���?4��q��X���q��
ʽ��'�fu�m����h�OWZ�&��E+����h<�8��(�d�-���c��]��{���Wpӏ���V
���,�C�cΪ���rR|k���tA���m_۹P���Ye�C���_��F	@���l����ЦA����~�8��,:��%�jG.�t3v�ؑ��ϙ�y��W��6{׺��#�ֱ��ah�*c
Ð�-:�6�Lb�U���.�ui,�6����Z��<Xx�	�9��_�*F��%[Z�"��V�-�@n�2�w�/�4:ҥK�e�d��%ހ)*A~.��^rOpm�?��2]���I='^���Y���K��2�.�%�5�qKo��"4-)��Ϋ2�H�O�r��+V��'��eA�ċ]T�}aZ[�,����k��,�7׷��
X*�$�	,��Ro~_�M�gE'_.��
�<)I~d)���&`��Kz!�޳���u+�����
\aJ�����ZC��ژ8u��<G�w�ݖ1O�G��F��b��٢���~���C,,͸`9n�+1Y�Ã@�n$+f�~zm[f0�4��I�p��r�O��6�>�q^�Z�yz.Ț��������*�՛H+�+jʤ�Г�4�#���2�g�%o��_[�+s�p/C�շ�ڒS���79���H��Z7вw���D>*Y��u횓aR9���9b�
d?];ý�e@�n��
Gb=`-;�������5�<ב�����y{m�;d�C��:3�
y��8H��v���<̴����o z�
���G��Ԣ�w��;�&��,4yt/J<칓�s6}�RKk8U�_dl.��ŭ
�iH�c=��coc��i/�V��Á��g�:�HLq�-!��׈�ي��N�f�V�w"`~�!��_�g@��0i�ގ(�T�
��}� �%'Ś
�h���/�zL٣�"���f��L�X�4;���*�E��E�t�A�AG�����qa�yYI?��ƲiA�˛�p�
��j�E%b:~��/�x�}�6y�r�Ld���l��V��t��͘k�ݳ
��v�O
v��`�㵌_
V��%��g.�6�b�ld��oW���8�v���x�����,�T�[�	b߶�2�
��3�>�[{R�{+ޙ��e�N��,X<G�a�D����G��h��	s�/�w�t܎�
21�|f@�!�Ϝ�p[�vb��0_���|AL����-�����M�ď;8����<]d�P��ԉ��ߛJ;���v.@쾁�s��#�O�P��m�նF�����<�ڜ���j���Z!\�e����O����q>���
cJ22�f��u\�G�'��>֬O�/�p�w�y��'C�F\:�׃s�W
�����>�o�1�^�Ec���\ט4^�Q\�{�e���TŨ��)')㩁���v$�$%wn��2�?�y�3��ٛ5��/���t_�R��3�E�aq�P��kh��c��F��'0FA�2��e#}y��_0x�7F*c��{!v��
@��&W��	)��sQ�<��eÌX|��&|RA�W�F|5l3F�
"PC��HD�<5�(m�W��:x"]�V���1�����|�Ia�p\��i,�a�T�;�]��P��)F���,Чͼ�+O�-}�2��"~����G=�gɍ�M14��7��>36�EB�Ӹ^�SЇ^�������ᔹ#��'}+���R�$��f��ur�_
���AG��(f��(��D1��A�!��7pR���Ow���͜s�5��X���f�f�O�ҥ�މp�ơ���	���}�W�$�\��L�0��@�4�����0��e�����J��T�x�f��9a4�8�\L�4�E��A�;s)nU<�fc/�j��H��<��	�]����s�3䟓�~ت���Q�^���w�y3�
���9@`%Nj�)�߁��f7C�ܼ��k�#��8�ɞwN��FX�!�������C�+�QIzy���x��pXd���`�D�1���
�:>v�I��P�K���@�#�b�
{
�^8n���|휬o���p8��CK»�ĭ�;Ż�Xj�rƙ�7H�@�iA��Y
L{��f���
:�X���0�t�n/��|�\��>,i�����M$��.>�4
�%�m�E��g�,Q,�h��"XV�!XXSF���E&��&���U�}�Z��W>Œ;�Z�)X<OI&)I��+�Hh��V��a��9~+��P�����͵�X��<�m��ջ�$w��S#u\�����|z�����x~ϥ���ҠR�G�
��hZa�g3�	��N�,p�W�t6�/�6��`��&�^���H�3|/'�^��/���p�FH��uWo�n���^��
���ϫ����NM���[=�L�WN�U]`Oè�����ƽi��Vf�
�4���1�L6��6,vcr�)ɠ��K�@Ӊ��/�D[O�e�bMGB��(��=!J@L��{ψ'�,Ͻp�h�,1?Vs���*1�I�:����|��a����w|b�&'��91�C�
2��M힍굏���~3��ϼ��p��A%Ȟ�������0d_9��8�-Ƞ����&���¬�8�Ʊd����h�����X+�b^x�P��R)�	3����K&]e	#��c|�-e��������ڥq`�X_i��3؟]k�i����5qM��f4aا��	�_#vU��RM`?�ퟦH���P����PZ��u�t���X��+�N%ubB
�)y���ʟ��E>e<0�tW�tWv+�
p�xp�ޏݕA�%���%α�����2"��	�8�w�usw@����z�УA�SA_7��}�0���0�G��
PU+�]���n���*�z�o���z�/���0�q�v�Y�=�[�J�
b]�?�L�rF��{��{]*�^����_#�in��pT�@-"�a{zv�������?O��ڵ�}՞/�-�;����f&�AbR��˯E
���o��w.�����͛�*�
����=��
_$^������
��;�:{�Ay�c*�/[P�k�~�K����=�S���g��P�/��'��!Y��E�$b9ĕ�(�$��})��3����Se��s��a��媵ui�@��Ɛ��k�'�uM��-�a��5�Xw�g�7�ŏQ�'}�����ۧP�5�2A��O���{�|sG'���v��B�Y�m+;�Loq�v�*���~���Z�0+���Z���T[��`~8'N��с+��J�P�tl�m�S_��cр�ü�	�����n!�]�8�6k��x@�o�ʴ4��ex�D��.�]��
��e�R�����H+к�ƀ��l6o��=xE�V+3I�C��%��t��kqةs�zb�n}~W,I�+�9m�5�5.�b)�b{m��hW,EDńG�U-�X��ș�{s��otź�,!����L��V�B������S��*�x[�=-��Ł-k"��ri�%1>�����y�pK�dN�A�qD�9
��'�i��Mt_j�l���V�����w�����#�];�%�H,$��H�������Vw����V�s#jq��
W�o�<��.���?7Sl��
S�w��*�l��N�8�|i�|�R
�B�0{�=E'w��H��Ѡ�'"�˂��E��z)�z�|f�n��=��#Ɂ�S^����
���@)��2
�K��h7f^Wp�{}�h���p���H�~��zE2���!�A"�k�H:t�\��&�|���H.��Y�л��w��$x+���T�����hׄ�X���G�0�����A#��E�^M�B�,<>�g�(?M�����U݌����t6F��ye�erx������%t��{
���f�j�r�r�B�K��<^K��|�J:G�_n*��$97��َVF��y9V�{�WV8�I}2�(���訽��)
P�(�>�]�U��o�WD���-�`x��@$r�v"c���I�23��f�;��#a��Is�$#�;�<�Ɨ�9��dn)�j*Q��(
�?�,c�{+���`|A�<���v[c���9g���h[S�й�,X#,��l�q��%���y�u��&�N�C�b%��5�qh$��h$��d^�������ܲ���Ea���gn�A��dn�������ꏛ��$�ӯ��b-��*��o���gyM.��}����j���r�@�Tˣ�y�nj�9��)�
td6�Hp���������
g�}_i�O����աkw�|��`�_�-A��ԋJׅH���owN�ZBg����J7�Q�&�����+N�Jm
>����[;:�}X�+�D,����H���i�g�����R��l��1��$��31�Bw�b�\��k����,��z���(�rl°_�&\��EؽD�V��'5�
qQ
�N�P�]
YTC�Hx��
%�������ZC3c?fʠ�@B�%�O3K?=��{�Z�x�I���-%�e����L��@���LZyϧZ�y��$B�u�M�
,F�_��̨��Z��{ُ���=q�)���'��u��v8
:�x�Š��u6A�)���9�l;�w�[#7���!6�i�?eH�&�ߴU�R���'V|[���`-��(�缏?x���}p?�}tr��-�_2����a�qf/!�W��i4�-�\_�m�1�xdžb�6��Α�]l���T�dd��^T���{@���ɪ�稷��m�l��Y�������Bv��
(5�C�)_��V4�^���ӣtߢ���97�5��2-ͼ[��F�2�(���4E��jٱy;g?2;�m{���jv��z0���Ŏo�:^
�;��Ll��
��DS��~җm���,3�*�~����_�A��a!��	��k����㶂���޷���N�ZH;$&=�=�^�����$�+f��
'V��^�[�p�F����h�F��Z�Z�Q����O.)�R>�B���t�h�h�q�h�h��f���b(M�s���=�\ާ���;&��ʏ�%��(��Oɍ�Ӡ�c&��(�?
����P�*\j�fL�=�Bs����K��5�T.�;ij.p�!������R��"2�y�s}ڵ��G"��w#Oَ
�|�Q~Vf/�5�&BS�s���`�0s�Q0k��?��:m���C��Mg|�����~�4��swLz��v3՝����?�$�����0'9�9C(=�>w�K�L��g
��0Q�)~"�ǧ�S¿���A<�,�r����vf�H\�~
J�u�ׇ,W~���l(�!I	<�G
h��8����tNjBJ�HZ��%�(t��\�>�>�t�"&Ž�x�~��ᔹ�ڞ��=�L�𔄯Gg�_��s,vr��^���%�1[��
f�]���.�c��,�4��O��^�>�8�_���f�Ä��	��򦆏C�f�}���)a�5)[�lV��o�]�<t79@�:[\�*`A��T]z
ӝ\r�xq*+��V0��	�)'��rT$�����ylp=ޢ��ĞY���흜\$X9��Y&���uђXp�d۞߱vi�[h&5L?�1ְö�3����<�өQ+A������ta�-Tт���g�&�ײ$��Y
;���B_&������&�BiFR�? ��1?�f$�-�^
�:Y����./�#D_����$�D�A��$2��-�2�_��wlBK��|�Q�
�n�^2��PZ����y��iN�#(3(�F��r_���L�mH��n���ml
>y��.Gѕv?�l"���6Ǝ��q�'��]�m�5�P#>Aw���gbr�c�/¤Ì�N��5�TW(��C�Ax�z��3�X9��O�0�I34O!�_������`�U�;�,��
���[y�U�s�@YQ}��e��A��!�2w���[��L�#O���)pX<���U�"�HtcZABl�UѾI(���~y_�W1
o�a�%�zq2�?����,�V�v������q�=4
��H#��W-l-Z�]���s�g-�mzn��8���g�,j�fݭʹ��\G0�!�o�O��ʵ��!�����<���`6S��.�F���M��P�@�BL�&���z�z)Fa[j��{&4x���F��#)�P��|�j�W�u+i�1��/��).!'���T
�+=D���^#_!N��i������
�
��Ӑ�]F-�IT��*�_�2Y��F���PU�q`�}-�ʄqf2g�zx��D�SQF�ʒSe�'�b��{�w���N�t5]b�L6op�c��L���H�)���
}�9��˚�g�b/�(!�ȗLUu˭H�q�M�~�*��C�f��ߞ�C��9�8t�<�*�W��W�㇏���
:rS��@�k�Un��Jt��g��l'�#�1��Yb>r��W6����j�z�W�NS���0(AØ2c�j9��]g�
���%n&N���V/S^�]�
�?��V�{ RyBL��(�����3
��$���o����	Z*�yb�5O��uh͓8��Қ�6	�O�6O9߫�M�ߗ?���D�I�G����dc��Лn�Cb�_�"���IWB���K���6��O�ȁ�UJb���t�(��!{�g���z�l����_�5c��i����
a�����I�p6��C����?*�藄��T���BĂ��0�N�Q��/	��T�R����B�g7�W%:�H,��%���uU�uJ�p-EȀF�,oɔ��[��.F�`ܷ"�cm��T{S����m��K��ڛ:1?�a����G���^9
�<�#h�NJ�}y�rL�p�^�����
à`1��aFdB��
�Ɲ�Ft��f�[�I���.�n����h6����/��?<���$�R���}�����hPl	8��K
��*4��XNEß�aʞ̓5U��VS�>�W�}��(�l
c����&l�{����{�'vodi�d��	��'1)%���Ha��M:F��(�2ʼAerPF���T���|��of�'}�Q��F�*��A1s)T�����m"yH����m��<$H%���)6���<��:��9VY���w�I�QĹ2�;���w~���X��C�Ò�s��0�w�﹡�P�,��_^�_Q4��_d%�T5�L�vY��S
����TF9�݆W٘�S�-eMɱ����~!�$����[�Y�r���R
[�&e���t�!������
��"2�E���
V8P*���DG`0$U����:��7��q_#���{��=dH\E3$4�a�J�.���\S��ZD�jq��G0}��5āI	K�cw��6&����[h�*T��^���]�J�!�RS�7
�0"lfQ�F�;�||�<��R	h&�ٺ$�n��IM�Ӗ6*�IQ���$�)��YV�����É�`d������~��7���м�7����Ų��jA;��ܓ�+�r�����7�J:[,
�p���rH��g����?J�!Vg
V��+�V�[��P7�<���Ku)�=a*����vR'�A����t;��N����8�)�����G���k���/��
���Ϋ���-��]��e�����鎰��Q�A����mn2"ev�W��v(��ᷘi��N#��!��i(JMAb�kJBfs��q9��vc�p>��
N��_�t�˟��b�,��.H_��*�ݒ�(`u�6*�4��#��d��P�;A&����WA��������	�XE%*��d~{et�H�<�1�=�džOfc�Lr%�A��..&�)Ds�w��l���5Y�`�_�ۚ�g2�н>)�I�(����aMȩߛT�����nF���Ű�O��,p2U_�l85��J��D�+3�'V.p;�[�0ʮn�a�
|��΍$�Зd3�AX���)�;7)��F\�p��_�4�w4���2믑�<�;JMٿ���!�JJ��+F����)���R��2�W�̂�b��+x>��$C�j!�C/J��
5��6յ�o+��l������1�G�X�ʿ*��A6�I$>�!`�V�b��*�}I��X
���%�]U.��a�o�9�q�[�P�ݛ�ņ�@�:?����u�6��=��ҟ��`ςe��$'��/�+�6�zf^#��p����.���w����W�<���3������8��lx~�)�h6,�y^���s�o@Fi�b�W�*b�j$P�%w���
+`��O���v'���}��_�8flr�M1j���@n�����Hů�,�@���q����ܨ"o�����AT�W���������Hh�0=��	"*.��,���8@:�f�"SNo:·���eC�ѳ�gX����.���s���<�\c���W���v6�,1_�Jݡf�j8z��N����L���x�ô�^.�ø
�c�}�����|d��ټ��𛰀����l�m��t�uk��\��w,�aN�PAI�xf�B�٨q�_��7��Z㏙zz�v�){���?�v��v��N����3�~�_�K��?Z�aI��ԁ�+m^fO������-�P���g�c0.��А��I���Tȸ%MJ�J��[�J�tݡ�qWJ�)�$�t]B!���n��?�A������}<Of��s���{.DW�NvP���#�&OE�
��E�ž�`���r��x��JfuV����:l9ƒ�l���O�b�W"=�ۑ�̫��3��R�(~��#�q`��JLJ/���B�:Q��}�%�Ǎ=n%O�ʅ�r\�w�y\��M�D��:P�%�;�0���D�n�>�[�I6��;}��Џ#C�c�{����k�F��P^����ٖOj�㝵��+
'��x�(��~�(dF{�8�y��.i��©�6���O�ƃU����P
Z��h��}�a&T蟒�?� �X�*{��

�n^�PyE_U�4����0u�:�#臼�Y咶�#mMC@�
��p�7rAz�|?�!�sy�.��;25�h@v��!+c���@�\)�xLvp':eW$z3�r	���31~�OL"�;�n�I���΍�n�1'�}�<m��5����F�rg�H儐%�������~+��,�Yi$.�<����F(���F��|��#:�lO4�C���I�����i!1���c���m�S����4�멧D�l���L�D�e{��%���V�S��Ϗf�9�}v�ZJO)��b�Ob1Xm����jv��(�==c�U;�x�
iW�����f���ڝ���Ȣ�wq���ډD�l���$�DC�&�?	�D�#:�y�q	9����}_��#����k�p��^2j�����c}����Y���ڜ'jZ2T���h���)
�U�[�����cdd?@�����E����;1�~f�4��%
��vMY�H暷����&�,�r����\�T,ar	K�Yw2
/
ӛZ��*�$rk��ƀST�͓�d(����A��M��Z3�ȓ)�Z������2��j�|�|��\�XFM�C�`�:�׃��VQΆ:6�A�69V��-���6f᳊��I
;r�lƛ��n6k+�^�+���jfG�
rG#<�d�{�&В��H��AT!H-(�[lD:ŵ7QU\���mJ_v_���~(��?�_�[}׮��_;�k�P4���>C�"���A�is���@��>OQ$dw`��/"'	܈�F�f�Y�7')�a����GLJt�����=ҩ���E�g�T|y������>e�jͬ9^�GR��V'��j�������/�@��%�/�E�G�jd	�܀iN��8��C$A<N��^"
͚�1ĉ��G���&�i�u��B��?��Sh��V&�:��k��~�^�6�Gf5���ǮX�%Y+����=<���
�XEI5����k_��D��N>�TY���^��+k.��i+?��L���:�4LHӖ3{˵�����R@�z�A-�+f�`�]q��N��
c`!��Ty�m�xL=��l�Qy���ƪ;�������ĥ��(\ZO
[�I���I�{{��f���x0V�+���qGNÿ�ѭ01�Z%�Q��V�r.TR�c�?��9p�{�wT��uX9��lPڵ
m�n���0�ʅj5|GϘ��X-������	G5e}N�/�YTa��O�o�[�6h'��;���MgܰW0�.�']
��{�5h�d��m���4J�F���b�a{��!�9�T$*���P�;�B���\���t�k�8�{�`�l:��kR�:|i��ݖ�VÂL��:���F�Z�6(�f��u�����+i��Hr�b��3�iw1�o(��C�rVFi$�8���ޱ�{+7�
)W��	2�����~E�@NT����x�9.��R��.���4��,��?�z��S�6���L\���D�-57mW�5muށ[��S���\p�����U��^m�Wm�f�I@�^�'��j����wȡ�Zh_���ʄ����<���Q�ۊ�D���VѰOˇb�g�d�X���+rn�ui���`^XBf����m���~';In*Wر�Q�h�"=���z,��3H]�����NC��H�i���g���MVx"*��mF��Fl�����{IeI�a0a%%�,��&�QiO��;�"%��h�ZS��	����>�&�-#9`NZ
X��d�h���&�6�k��M^R����n���=Q��@���[��	�N
����d�h���2��ԍQ����X
aW�|[�F�H�<,�윑c>��C1�e�$uu|�S�m�RnZ���2-J���K|6�3lؘ*nnC��&W�&��5��ߤ��_ܔ
�./�4�Ȼe�8�`{>�[�8 �+�s�m\�
\���Py5��E�5ݩ	�,���L
#>u�;ɋ<C-���h��"��K'��+ȑ��4e�d[>���~�'y%��h�+D
��t���|:֛}�-��	��bi�ű��Ò�m)��yQ����q�!A��T�'C���uMVs8#���'�
\Z����������=(Ub|�)��%ҙ'=�I��j��jL��$/J�柀�ZE��b���n���xo�����\�f�G@�i�Q�2U�ʹ&���;:u��B�Ɖ�@��b#��u�ڐr?N*����m���"c�=����$~K�D�����"�@gs�}�ݫwi�_���wr�drߋ`�$��Ȓm�A��C8�Cyw�5���-VJO�x4��,U�̝%��o'��ӂ�yCh��:�Ɋ�����(=VfZs�k)\����9�][�PF�����mRAy�I�$/��Ԯ�OI�pMJJ����9�&ܤ�L�M>��$��)��s�ߝ��9��������ΎU������D���1L�8�<c�S��@y�dgxA��h�P�u�6NgM�3�4�8��0�27��_�zC��a��2n�<�d�D��B]�hM�u�0V�γ�u�T=:�N�>�>j�7�8>/Y��h�5�`���8��,~i���R�9�tp���4����R��r__
3���
s�e�_���``2�~O���/�}�̥�>�)4a1�Y���G���H�t7���6�t%��{ۻ�������Z����\A���x}
o��U�Rr��f��ZL]��vx
�*��	���N^�2F��܌H�݄��,�
?������b�{�4��zlL��������R3��o���}}�d��Bߧ�+�,�
��ק���*�.��U��=������`%.�-8'�ƾݔ��a�X���*̸��
 �Rx"^���[Ο���E˥>��[�KNi3gosM��&�/��B�X�,�Y[
�$\�O�~
M��|�\��T����}Mxfj�N�@:)��F�Y߱���r}ڳo���@�L̘��w��Y�lN�5��EEܻ;n�2�3�=89#FT2/�kg#
띕��b���z�Ѷh�M)���A���J=Y��$Ь
Q�(��#Z&�@_t��n��ޠ�Rk!��f�3��A�/
囈�"A8�Ts�H�R�D��,�6���pӺ�H�F�7�Bmx��/	�`s؋ʳd;n
��Ǥ�)O�Y�|����Ŭ�;�[���4��
X׍*��^‹_��&��o^�H<m`�-��\�!䝯>��5oݹ��@�m
{ۈ)�	�[|g\�l��5��A�TI�T.�Dا��v�f̠�05h*�
����I}p"��P:����
ۍ��@a�(̭��Ŧ��qW��`�жd���[F�O�lPP�f�3�o��
���y{è?�Q25�@�XPt���r`lY_��[.��i�k�eg��\�2�=��s+{`�p	�vc<�H�y�3���O�G<�7��c�vR�ϊG��<<��?�#�W7�(�k�j��Ց-Љ)�dQc��c�����s�`��S�[�㐦Cm���V��ٕ�G�>Q��v43��L|z!!�D��ĵ�
���66��X�#�I��go��'W�Mt�Β����Y���B�+��?ɭD�>��X�ŷ�&�;���\�Cܼf�]��-G�4�V��@gh>�:���s�8Z��`4�H����“!�ѠtO?����Y��L�
�7��!p�
8�T��8.IN�w��
J��1\8��/�M�i,��8���D�����ְr�j=w4��cWd���M�N��8l�`c!��՜
y>��nY�l�w`���

���r�����}����z����uRX=��g�[�Ht�\g�����s�$�s����x��[��M>�������h�6�|�̾8�+
&t�q��|6S�E_�ϹkXO�O���P��&��|�n�8߇`爰+��f|v�E�<G��v-B���l&��9��]
�,�c��_�O~v{��Tq
�t|v�'�	@�OaE��ɇ���|�L]U���1�,�8��ģ��Y"˴�,�$�����~����@�l{��'�0r�]m���գM9~,�Bw|��嚘3�n�������~�y�I�k��ڧ[tkS��]T�E�ߦ��`ԁFi������˝���ã=�#F�^J8?�<����싑��*���c��:�/��7ٳ����^7PyȀ�	Ⱥ�8�KX�\k�ߜ+��[ݖ����'��C�ҵrɋiy���[��`nښT`}{�s�6@�˃iO;wV��-qGR4��m��辱�i*fw�'{w;ց�tW4)'|�K�a�3�~})-I�J��3�L�'*��T2G"K�����H���߀����K�a�lPt4h�5U*��NJ�|'�z>3*��+d�68/���D�	��\�t�����l��<�@��6�/۵f�9�	�K���2\b(��涵U���ɣ���%��uwL�Z���0o7��m���w#�H�0,�;��wq��p��t܋�	�Y���i���Ӽ�$��I�8���v�.�q0�{�8��p�	�,>¡,N$��P���S���z�M����9;��%�c�)��A�u��U�G�I��؀�w��3tm��m��6��Y�����^tm43�*
�6#ѵ)�A��2����n6���
��cצ�'ʵ!����k�����RS��Z
C�����ݥO�/���	�0C�*Sc��^«Ь-Y���Ŝ�Ԯ׮Y�"W��x��q���{���13�%2�@��!c��(�65��ԑRº�豴�b}R�t�t����l@����E;���<p'����
�X�����{��3l�
�_�r���SK��amL7dd#����d�t.!@Y����鵧�j���}��%��B�[����.����I�0��/9,�E
�@�ؘw�1�<p>���=:���\dZ�z��n��ćb62��sm^
����<��]]���7@D�]갃�,Ȧ)��6G:~�����$@�%c��O�F��P����:���Z�@���B5�\u��%IZ���G�1�1���)�G:�9ܚ&�-��\���Rq���
���mۭ��pf���9.���}���ɧ�̷��S�������W���\��N.��6�3��u�gpW�w�;�nC����U'
uŁ�Ts3/7&�d�o��")��67O*�����$0=y3u~�L���o)ƅtH�S���<�ʶ��A7�^�D�%�w����|>�o��|���=LEDX'���_
�5f��_��k���v�)a�v_	��{'��/V��by~ђqb��{i��j#�"�G��Iy
�Kye�7�tv]oʫa��5YM:�%π��l��
������*�.=Kv����W|��0�<1L�6��^J_�	��/&��o�ة��]	{���~�F�N;X������
��{�����u�^�"dV�;g���ڇ��2�Mػ�G=�r:h�)B
̦�� �] �z�������ϒ��>8���qln2V
F���ҙ~�o�3��3���������Jx�����#����$�Y�==v�w>��񒦐���x��["v
H
E6DyQ&��f�)�lV7{<�̴mi����#��W+�#R�*_D���2D�����-J:M6Q3]��WA�Fw�%ϱ�T�{JU�{�,�4�
�GC@�=M�J#N�z��v}�?M��^1�tE��q0TCu‚��Y.n60�Haۛ�g2�	@�̛�h��2(V0�m�Ɯ��U�j��Gt��%L�#�	c��0��/�?�9fK�2�,
���CI��c�b�Aљ����[�k:�
��]S�p�����������'��5Eq���ks]A'�%f�H�G��?�bmj��mj.aÖ'��M|I7���j�����z��NL<�d�^�ox�.��&�;.�4Z�&���e��|�v&�jl��e�<p	ei��M��Dmz�o�Ӊ`�w���:%�:l���yX�A��-t�x@��������x��`�����X�K�.(sz���i�����3���x��K
�I�t�Q6�Zw/�X�s�d�`����Q�s����C�H�ϗc�9�@V$Z�H�G.!�<�'Mpoۖ��X�����-�K�\ib��O����0�S��FY	��cGߡ�E!�{^�o{��H��V
a���R�(_�a�Y��m���+��8[H��K�6��-���0�<	�h_F`<��1�/	�z`�&;�\&�I��R`��[�L�~�:�|]�Q��b���0����Ο����n���6	̸�f��E�x�ܼh�Hg�y�]?�\�D��И3���
�-�J~��=#X=����8*h;�nV+���7S��@�Q]XUp^Ni�`w%�k�{4�W�9h8�斳�l�\bns'Ȳ�ln�>��C��b�œDA&�_��8|OR�#�vJ.��#g���!��
��i!����b��̎�
\�i)e�{�yY+��~&|�X}��x�Y.C�H�ӷY.[È��5-ӳM��k�E`N�S42���ڋ�x�_#�o��]a�`���I�0���		-FT��&��)�Q|R���U�.R�8[i���%t������I����@�G�����V�
�\q�Mn�Q�3�'�~����Z鍁k���	����9$�*',;��~�Y5�Ѷ:�K�0"�$y�zP�l��	�glo��N���/���'��[�_����e��Ia6w
�b�X�^���h���X��E�8��4��s�?���}��v��:x�<�5����}��)��⋮?_��3�9�sܛ���wx�C�A�W
�����(Z0hg�Q4���(Z�(Z����#�x�5^p7�/x�l�q�S﬿�v�{��lc
$�Z03�J�?�ug6�?i'��j���&Ǎ
۸���!�ď��mJ"<�es.�$<]u"��okU7
���/j%���7R߱��
������T��0v�}J>{��J��<y���Q�S��ڃ*O�|$��f���%����	�ۥ�o��}[�o��ط��X����`p�Lw7��X,��4R�s��E���U��_k`��kO�70�
47$�2s�57Z��l5��?��?�����{���
���Ɍ����z$­�a�^����
��D���]�5�n9Kvi
b^��g��@�P��^��W��B�^����:�Eh9�����D(�vm�y�k)����l�U۳��G��ԗ/Y��������;]{7
��K���W�
F?�!Z��R�yS����K����2O�~ޫ���#�އ��C��+^����A���]�p�q�A��Ui����[u�)��������>��N�E�l
Œ�u�Y�a&�A���x.N3�H���������?��"+�m}��j���
���<w�/���y�����x�!=��a�n��gx(}H}!F��#�}��_��!��J�(}���W���rK���I�z�������.�z;��}4��V���f!�@�Gn��H<=V���Dtu]0t#0tw~5�%bA��kw��F�/}*}�2�7�u��<�زeH�����4�lH���e����)%Ŀdu���ʏ�WG���	����f^r�����ai䬌c�t�!��Sp���<ыp�����C�;3����y�_j����S�\�T��j�k��c>b�h,���Ŗ��(|D�⁛�b�U��je��p5����p���kA�^V�}���0�������FkA��
{/�Sa��O�5',DF_Pw�S�}���Q���Sn
�9^H̳�������O�]�h�͇Y�+Ҵ�tjyq~��b�4���
0u����1��k(��b1�)����Fs��h"8_D�b��3�q�ު3��	O�&�Jm��-6�v��`�~w���1�͕�{%�Hx�;��*輲2���D�|ų
�s��2�\�n��q#�<wo^���g~��+�
\�9@�3.e���Y,焯�.�eM5���t`�埈H}}w&�Τ�Й|��$��d,�L.߉;����CD�uS-PP���!u<Ig`L�Z��`�[�Ě//΋�+��]]��ұer/_���Ep.��˶`-X�z3�v����HN�;Ү-x8U�"U��Z�ln��X��&�4S��b��潻�;��r��
�X|��{�m�|�޶��V��;�l7��}���'p�m�V��P��
���
�3���R�<�C��ɏb�%ѱª�e���t`
�S��Bx���I��^��gc�l7�����ޗ�&K���n�Vg-z�ۇ��>�yG�Z��t����u
�C3��h,��YHM����vS��WS��,Zdu6Hs�
A'W���%/�}�
�K��Ծ�@���`٬�3��}@�=�cEѾ�o��(��y�4���

�ۯ�6]%�fV�4GX7���n�=Y�o{ĸ��+Z+Z��ĭ|�ܵ/*{��i�����T�_��}}�쐥eڬ'�֑ĥ�~x���~�"��Ě��<+�@�hO1ֆk�+�\�o�=��I��Z��p
U�-YE\1g$����,�&=���K.'K��DjKQ����8?��z3�d��U�Q��������݁��	c����n#�U\�ޕV��#�?���?F���0�Z�s!s���p����{d���J��v
m[c[
�3�}3~���q�xˊ1�w2�W�O+�+ʨ���euM��14dyF��Kxי��6�ѮpЉ��j��m�O$|�	f��ea�]x�c�#�U�C��-�C�1��.ƶ������c6��1�q3~�#�1h�j,�@
m�D��
�􈂗a"u9��iOJJ������w��8��=���&Ux���|,��Z8��^�B���B�i����	Q���EY�:����e��ϑ�hew��n��cΌaNɠ�����E*�!��	)�VP��<+�WutyX1�7f�Y?��u�ú�}��}������X�R��X������U��d}(.�O��M�u�EضH�u�?'r��L�,�Pd9
E�V��-���
�K-{_��2�gnh����}�V��#����0�u��:������t��Nûr@���[���K$�TLBÈ/�����|qb�5
5�ԍfm;�Ey��I����@]ﻋ��=¾Z��j)����HS�uv�e��}7�u��tX�0�o�\�{�j�xP�i"���#�A��,o�q:-T}�ț�|QF��xq��6�;Ssd�p`�X��UY��]��7?v�����"��{�}1È"�u������$�>��Q���<)˘O����ތy�`_q]rD�',;R��C��42�����Ct�C�0~da�h���s�~l�`L����m��oǽ\��8�S
�V��?��~��g�֢�ӇAx/^;�/���|!�89���Cr�O�?a�k��H\e]��ޣ��A9���IaX�;��(L��'q���%�΁���w��G��[?��=}����{�:(L�����<�{�ߍ������-bH@��)~C���K:_l��B?|��“��$r����W'1�`�P%��?�!�3�1��H��K��t�z7�#M��[��/��2�Ϲc�5����ԅ)�y�����˅ӫ���e"7�$7�?��$��Sߠ��'4�"4y0�O��_)��/��ͦ��^����uc�#��tknG����9ֽѰ
�I'��3�(~�,�Q�x%��J�H��gI[��h�ݷjBfx6�<�
}�{W��h���%
�1�Ȟ�6Q�ȇ�b$Ė�
59�O�G읹���``g!�@M���\�}�r��s��q�����jp���ܣS��=���&�{ti�ܣJ�z�*��7����B'�������G��Q@U��X+��j-��zO;q{'Î/��쯇�M�Pw���0��>�G���	l
�/k��N�`i'O;���K��‘@�H����ci'La��O;�9��n�T���]�R�0�.����F֧��t2�X뾀N�u��@�N�=�F�"�2�����Z-}:r���p#.a�.p+�����\��K|�D���Fw��t�z.�T#
��X^�u8o)��9�Kֺ�S���%��ʹ�
Y��Q��N�ս��[R�Y�X�^�E8��ʑ6�i\�Ź�}�s�����}+�=
�c�A���G��?�{g��R���f�������ۿ})�<*�ю:\�jN���?�V"U���B�$����]D�m�z��c�M�d�^��:���6�zV;���޾Mv�mC�����4!�*�?[Q^wk��&������
�.*��pC����&K-/�$l_����;�"�.�X�d��
�j���dg,r_ꮊ��`��X��{$2L�
�_
k�x�<��l5
<���O��
h/�]�+2�s	���
1��)	-��O�ly�n�΍p�GE��w6r@U;�s%)�A�-��	��<��V1�u�K��~��ra�@�+��٨2��>��P�Py���Ql������@�/H���
��nr��Q^��+\A%g�!�m��`�t�8s��j�Kh7���-�7p	5W�)Z�8U.(�.WC�����R�Qsa�~��ͪ����8P�B��H!���п`
��_
�	p�Z0�v�<�ɯ��t[�
@�a��"YY��d^�i��q��1
�*��&���J�Bg�\�N��K"r�)K"jE��QPS�A��9�?�ͪ,���~#���Q�j��B�]��VY)Eӳ��z����z�����$Vy��`m��Ż��k�$N!��p�'�b��7��q�y�@u>�KL���q
�*
�p�aYX�e����F|�F;,��~͔\�[/,�;��%��$(���$���5���Da$z#�'���GJ�
\����+Rƹ�Z�c8�0pa�\��=�M�C7���wųc��R%��$mP��ճc��L+�x�	\Bl�g&G��,¨(���b�q�����Wպ��͂���RϨ�"��'4Pk��ŵH*�[��<O�G��.�W^>NWA܀S�:�v���V'[aa��@���b��:4�A��͎��4`ˆ/�w"t��`�šё@<��a���G����v���t�]��;�;�/Fj��B�����<�]��F�f'
�IL��!����a�C�`!լ���&�mct$�"U�Z&�&�fA�k��D���^��	��94<��Q
+�VR-���<�3V�}X�w
j���Lb�����2�X	�o�j:�}T[�����j��Ք�����¹����s�x��n)�\%�Oy�v�����3�t���lz�-��k5�~�����,�K��}\�����q���m*�1I����L�?5�\��2uvٖ�i^ie�M��(}�^u�[��IX�r�b3�j�P+�HA/z��=Zu�-�w��/i�	��^�뙮����?���O�*��կb���ګ����O�����xoG�R��&K�������Z/o�9�-�"�9+@fM������>���~:�zZ%7yw���l�Y��2����c�e����vw���n�?Z35�9�(��~FG��)6�b��f���Oa�A��.�W���>���ޖ��p���O\B��&�
���W��p�?^CS0_*qd�	
M�w�csR�[�r5χ?V���6���E�^���-��q/’KL���ǔ�|�Ӕ���e\1��9_0�{��Kp��
�@=�.a��( k3@��mz��
�rI�
�-�B0�yϑN�~��l�"&h�����Wӳf�
;�kԊS%��эU��N�J#䵻�#�f
P�~�X��/L��`�t����oS�##n5��4ZUuP��Ŋ�'8��[��M���-Ǘ
��c�͕1?[�7tm�Z=)&qi;��2o�i���sTN
�#o]a�J~��S�?W>�}*ӓD9�|�Z{B�P.Qy�|�iF�w��ٶ�f�l��v��᜽[��X��Gr�Z�s��y�.��������j����n�C�E?F��h����9����&�����LF�ڨT�񽚱�u?�yEq��;��^�O��=u�N�wwz�h?^��;ko�W�y��USV��j$U�	��N:�?��|�zہ��cj7�mU
�i�텫N�(��j��[�d8s��7���=��<��y��3+g��$,v���a�	l"ꐑ�i��a��"Y5���4���^k"X�O�����'LK�w�r�&>�e��x&:�B���{lE�4��y�2'�v�J�/kl��
�Vsc܉3	g����aN��p��ozlk`�F���P��|��f!_%ޕ�o�B���k�TL_-[��9/�58���V�˻��%En�2ޡH�Y��It���D��H
�#�&��%E^��6}�(��HH��!N<m��eA���#j�rAy�Pի����{d}�ꍁc%J�dq��CI������Z��&d�ĎWE���/�Ȃ�8�!�kmq�r�;z�����F;�	>�������q�Uw�:�ɒ��"r�{�F��t�G2��af�Ovg&�Lf�-�)�lP.;��l����ME�F��Q��Re{8���@����^�CL.�s����(���!#+��)��hW�n�W�:o�>�6,����ܼ|�Z���	0��x�ےE��ڌ_R�FН.��w.�(�	�1)�}\�U3����1[���j��C��cv�5�"�_�u��}ؿ�#ʧ�����a?X�Eěozc"$��D~��H;�H���6���~~i�����=<(@&F�U@�k�wb��8�W��r	�rމ/a��0�t���)��&�J�Q5A��
;�D��("�M�N/2Rf�[�K�:���5x�V�joL����Hr#����˒��Zˁא�N�$�֧h��eU�>�����pm"��,e��
f'�b�n�+��5\���c1���*�7~�\F|�:�����-�IE5��7��myw���v���[�{��0��`�V��P������^2�F)w��H�_*��,K���&m��#^���T(��=(�@
��4�9�n-h�S��1g����ݦ]Y���$�غ�(�qA����gPE��hoa(��������˪U�x�	z���:�p�K@2-~WY��@��Q��n����~�9r�9Ήy<�Hm7��ܚ�\{��u�
�X₼M�0��t;�tV�z�C:?^��?�s	�rq��x}�����A?*�,�nB]L�vN5��>�@w(}Ц?�ȫL@|�A|a��A�Ph�/�y��;�瘏$^�;��[��O�.��<%���6#���x\�!־�0�Gh�F|:hβ�W;��:`7��1�7?��'����D-M�EU�_��67�"@��������y��[]�Q\,s�O`Gc����xRP܂��;ϫ&Օ��n�
�n،�
�lS-�Mc�iVP!n��:5?�=�&������v��`�l䨳!�4��2!���FN[���_	G1
�MЉiJbݕĵ��e��m���d
8��9�&(�poؑ�>�����Y��̾|�T�2D��(�Ʒ���E&�˯З����o�VC�H����s�(�I��Ul���4�&����t0bP�KEϣ^�L�ⱕ��f�io�
M�č�N�r��k
g~w��U|���q$�n0��O�a�
�rr���W��(Np}��v�a��ڂ5�O��tM�E�b�G�w�ڷ�I����ILy�΅�U,���4Б�nX�0#��6�x�*?�)�Z(���b��$:�y�%�Y�k����Y��7�(S�����#�wE@k����oY3x�<���y���ޑEM����tu�TO.��,<M�	�P�����6���lm�5=*�&3F�6�v�<�e�}���R������~V�{eo33�<^`��u�H.kϿ�}R^�4���pM���U�=dK,�(�^���a<�ѝ]<�����2W<5�N��=�����A�}f�\��{-v@�D�h�~M�S������3��r�v$:������&�!�
_�=™"�T�~]9��T��3
$NHP�L��LK]On�IA��m��칎��!M�f��f�3�5mu@�f
�#��8������kN�x���̊�[��r���.[�J��1w2u,�M���lӵ�e�L���\Ⱦ���oLB=���7;T@X�)s-rkV�FỆ���:�U����2`�r"�e�6�q
v��ng�9���9��SU39�u���=i��v�қ��0(1f�?V�3n��Ꮥ�����j⡱q'�l5��y\�#13�l�ϡ�����셲V>�)�15*/��/����w�=�kzVd�pU_}?��jʆ?��!
'���9��C�a=V�w���nV�<./�n����ى^�r.[�ʦ\��W�]>H}'���@�����_:V��2k,p�ض�62!�#2�L���ĥ���`Y`k�M�8�+�o?%�l�|}�	,�1��`YxU��9���1�Ud���j�)�=�=
�.2��7mV񪔬�)w���<~+��bo�4D�^`�$v��$x��."��Z��������
�fv�i|�G���5O6�h�r|�J���R�(�$�M���05��VI3�
V�8�8S)�U5���H,��Ļ2%�d�eϿ�V��\�m��&h�;{���B��$	KF��(���cQ=�
N���
�k�
���<3��pM�"�x�Œ��-�0������S�9�d�&��dx��X�M��6
f\b���+� �~�V:�[��
fSNX�"����f�~9�:@ؿk���e\�[���c�X��$5��Vk<��M憧��[�ژ�'ۃa�<
Kr�B�2�Ђ��\G4u���A�d#�$}5&��1��;���!��˪9K��!z02�N(���;�{���t���H��5��sw��]�4�Qx�D�~���.f�%f���]�-Z�`����VXeɁ2�/d����Ic�.��<.�D���Ќo�O�������5,����S����F^�xR�}h�\p^�u;,��[���3��@LC?���;�:7vݐw��{8��-��&a��|
8��M��G�E��y�)�v�Ew��G�
���-s�K�j�zm,�t����F�$˽A�B��xD;�iK�5��
�F!������/z�ۑ�̄���E��e�T�a���Π��{��o��z��U��Y��z��Xt��G����H���"5����{+T��6<��ļ\��^wK�bŷ�S�k^:Z��%ŷf�]��	��@�k?��a`��9z��FN�L/lW;lc6�+g
��[:3$^���{����vANߍ_���yp���&����]�Y��G���:�M�3�?I#�2���=ٙU���/����
��������C8���V�w��X��
����~@���!v�GR3Yph$r�XZ�fq�7�N��m�7g�U��E-��.bA��h����͗,�}��v�7�<�KHh2ː�>%�庥����1rH��q	�i����$����J�%��2���ܚ۷��R�UbK��0a$�E.w�J�-I�(A�֔+�I�0.�;(�"�i�$R�mW������p����,�,sPe�U
,?`���qXE��t��3A@Md��9��e�S��
����8��6��O|,���X�v�����-VK�&��ɼb:����zf�1�h�[B��f��ʇ䙸Фp������WT�^ٱ�i�H�y��ϣ]����;�jFꚬ��fe]�%+��
���	�m���ɃkO�.L70�K��&�]�W�+�\M$�f�u��6V��[�"��ũ�N��u��&�-��lnz����ōj��G�r
��b�Hd��l���#!7���Vh6
���؅5�8;�Auv�S>���s�\����^�ԢX���`��7�P�|����s��$�<�A�ɖ��զ:q�������d�t:t��v���8�}H�FY�ƍ;�
尯�g�
G�����X���J��v.yZ��&�c-Mp|$RNז��M!#1q�[�ҭ�~m���j/Oo��;���ϼF�9�G�v�ha{�~����O�P�W���t3�|
�#�\
���%�d��V'p��7�8:�	���4{�i��e�[�3�W�qEqOVT4��Xn����,��տ�U�iQ1^*2U�9@ٟH���1N0�����W���@����5ڸ�GR��{�GU�r`�nN�%9�ڱ�����j��p�d�4=�Q7�aJ���	��ܘ���o@lە��_C?e�^p*A�+˫�>�L���Q�ӹsR���&~�f������o�)23h��R@̣�v�
n'oYjѧ_޷e�w]�%�|��\����]Ã�"��n�^���!ϛ@�����{�PG���sv�g�6�S���5��E~]E��Y�{�,����-���ߧb��hi��Ă�a\�Hm�[��๸`��T�ԭ�5z�^��^"�9���W
�6{����X4�m[k��<�'=���|�z]����
����#���2���l`�͹��y/f3`��cv�,!�{҈����~4f�����u9�q�By,��\�6А�lY����hn�A�x�ܐ��.��b�ކ�xp��V����F�����+\"w�3��=3�61@F#^��p�җ������/��LQ۵�J�KHJ��?��
ɯp�E0E��lWи�գ9s��=-$9�>˲�\
�a1�D*i�T�*/���K�Y��5
o�z�$g?�O��={����M��f���&޼�>l�
29�v��7;3�QU,�w��۰(�+^��*Mp4q��y	\r�p�JK�<;D�"P}��f��=�˹D�0j���΄���'�#<Q;�D�e�X�`�.~��Y�jح���ޙ�i��%�@u�A���<Ñ�������08��}d�s��f���<�H^�md8�b�ml�P/X��H;�u�W�QC�	Cl�\b2%=,5���e�n1�Xi��b9p}�"|;d<(^�j�AB��6�
Z�s��AB]O�ġ�.�T�	!�p$V�
q��]$>����[xs����\�۪Q��%�[9�D֢�j��G-��%��t��Y�t�q�yP|^�6�Ns�L����m��j%σ]�b��OuN���V
�F7͎�8Y'�F�3\Д��1d9ۃ�c�<��,�}��ys�y���Ϝe�j�������d�S
�U�0�������b�ʥ����
Y�cY�WÃ����M���8x��D1��[2�0ȋ�����n�icg2��+�6=�,k���ָ�%\�Q0x��7�f��`�
��w��o�S��R�(Y�����c�F�
^x�@v�2.V�m�,/��^H;�i��ۯ��r���4���j)��u�,N
��D����#3�j�s)W��?6�t��;�D�����o�%-�@�@
l��
��i�e���D||��֒�E]�HuE?��RЄt�2�KP&�G�[sy�ƃ���#7�&��3T�4r�]�Xd��G�lS祺MM0��c��P�䢟���"��%�
��v�d��f@-r�Y�9
�wu�y�6I���f�ȯP����jco���/U��L��2�Hwb�zMLuLu��L�h�;n�BN�>����h䧇-JC�3@�k
�l�Ɉ�鈾���S��t��[O�Z2rsFD��c�jS��;�λ>J;�$h桜�fO��`��k�k>6m��߫p��	��<�^��ӹ�@�7p�$�ւ��3|����:�[3!=œ.�Zh/ʥ��*�6����ʼnK�(ȍ��T"tt��y��
.����S�AE�0�2�I���	:�,
j@Nq00+�Y�E�JQ֔�ӡ�)�5~�<��=c�����{X�Z��[Jt�.�^M���E�ƭ��-�R��	��3qFr�'�s�%I��D�ڎ��K������E�~2�^._�ð�t{�5�2q���C����^tyD�}e��L<������]%�LT��;v�JP�wZX����|�
���'��
V��@7�-,�0z�/����L�L�,{�(�;��W�A�ĔP�1�����%8��E�I$|ʗ
@e�A������/RJ�tk��?�����m�>�4�PJ��D�y��ӀT�TBR*CB*�t�1$�V2��@e��pTHB�7s2���o�s:��~��~�}��ڟuzγ�zֳ�q�}��-%��ej���q��Ȇ�͸�$|�A������ꍻf���8��7����U�Q��1�0c7�~ePԺ��C�Y�`�斞�}��"�(�c�m�V�N�)�w���P�~��M2�O�[ҿ��������E
W�����RS��~G����x�\����&����,�Q�h�/����6�yZ>��U/�~r�,��@�#��R0y����$k��^��y�
/�̈�@<��(b�B�B.5G��̵y��̚���lh�z���^dH���F�uY��+���B�O���i��X��9�:9�]����q��A�1����}9�]
#��46�d�ș�'��wY/;�`�,�5){?����I
=>>a�sY�W�h��+&:i�W���/<�eVVۓJ�7'���<y2z��U��r��F��0D/#�M>�.�@�,ѐ�"����1�mУ��ÂU��E��|]�F�_sqp?�`W�c�c�@��0���;4�W���Z��e�|��q~͹��O�x^�u}�Gg͐W�9�B�\�VΩ9�6{���V�U�f�)M���<h��[C�S`��=�h����G��\�?A>h�F���&�Ap��N��4C�b�f}h��"�W/��v��N��T��~qe)ȮJ8.:��t�|��w:ΚZ�w�����6W����|Hx��{
���zۭ2�t!w���9��{R�t	�e��QPZnLQ_�򫓄w����]?��pO��ia���|Sw��;t{����y%V�u�kw���'(�8h���\>��B���hy�&��~}����ط�c�������5F��*�pw[��/�腥yݚ�͟�HU�z%�'�s��u��j�����8
Z&s���w)�ר�F��ѬJa&�	}�E-�!���W���*B\��p	A(c6�}E`,n~}��ͣ�����p\�~*���("�Oi����H
��
�c2v-75�7d����>���k�ސK�)��)��;*�Lu[��(�t�;
��<^�}@���e��-ᚌ�lnrх�ޞ�N�.�j��X������}�5��%��:��qݝ�}-�Gnhʑ{��������
�f�W5���W1�{�6�OI�
�����0���
���W:��Wz�>��KB��t'������K�w�)
�}CF��{�`c�y?��)�]#����M�~+Zk4��ќ�SkΡzvU�HE�g��[̚pEXӜQuϏ�.�oޛ�)��0E��O�.��=�I��e�*�T����eY����T���ն87�"�\�o���@��\|��
 �E�!�h��f��!hfm�������]�A��&v�g��`on�n���(.��q�Ǻk�u����Q��w�/�"E��/K~!��^�!�&��;��	!'V@�Zv�[���F(lp��_�ue>�����LV�y���A����p�G��>
eTm��C8%e,��B�7m����3�.����=�>ʷP^��!��������|�V��֟WՀat��b�=g�L��o������G�ا��3���_��^����^ƾ��35,�?-�1:x�=pʂ@>r�I�F�m>p�[@}�-�%lg8��
�c�xK�,G.Uq�+��Q��#����\!a�NG��WS����q�u%�x�'�Y�NJ
�O���Qlj��P���jH�f��_�%!O��y�d;�ii����`��S���	����2t�eS�-g�W[��uc�y�PI��8]�	��{�6o}��7=����悦��~	�?���gv��zZ�	�����Mɵy�H��U��G=��b������7��f��Y�ñ�V1h��E�u��Ę�9��Ǣ�g��ݤ
=���Xc�+5���e����x)e�}��?�E�h]�aG�Ϝ-z�w�-<�V�8cԁ�����Q������Uǩ5�
�&�%�Z+��·��jG6>�3/������W�Lx�I���֪���>�_ж�+c�(�w�5l�l���<�V�b�[��R��/�=X1h~�M�<0��C�fhdvd�������z��c��(dk.^���३"`{��ڣC�v�t�œ|4[���3!��]ҵ��=��:���ĜXr?�7F��{LMu	і��&l��C�{�%�BB3͓�[o�Hn���;I�b|�]�u�V�;�JQ�����f�܎l,9��2��R��|̰��2�j���@l�^�R���݈��o���w@3�Ch�C�)�W^�"�!t�B��ӎ4̹���9ŬA2�[�]
Kx�5�S!{!�\%�c��f�L�/{ծg���y5��(V���L1{��q1�\�8"��OL@�U
X��v�m�I��۠��[o��$l��![��*u7��rYY}�(�(�XX��`ع�1��ܗ�8�z�F�2��e�A~�?�׾*�ϲu�(#f��<������W����Ѡ΋c���~);C�bp����4�(��}KP��b*k��r��e��[�ح��Ҍ�1E1J�������y.~�z��@�E��2�B}pZAS7.����mW��C��7G�l�w<(��2f�ѵ�y���>(L3���ћ�f
���2
�|v�!NUC��ΡnA�9a�S4c,�`��'��)&c������<"8������S������oN:�<"�*Cl�i83��p�^s0���U�ծ�06�G�b����}Z
���PuW��V�5�bc����;��W!�Z�\��������=*�T5�^9�3~?��T!
f笅g��W1�mƌ��66��R�����ש�1�
Vc�JZҠf~
Ze��E����,�le�bM��4��M�h|6p_h����R��
���ƣ4Av�?��:2���@9��S�SS��
Q�_
c=e���B5���>�6��;bG�@�9yp�7�ij����1°��{��$�u�b#!��
�X;}X�n��ʊ%[��R���W��৪!{t`��݂
���q"��D���L�#Nd��O� ��/�wb{}
[���p̰@�<(��MdT�L�oY����ҝ�`XƇ��WDo
���bI��HR�C���~�����ᅓG�%R?%�=�Ji[��3�m�����	��
4�ݼ�wJ�)����
�����|�P��P�~�_@���b&�FH�^Wnw�Gм���G��0z>�:j!�a��u��B�`�S����B�x����+I�S�?7j~Z��8��;m��C8C��-b���<pB��`��=P�NNk�v�{8mL���׳��i�4q�E�~�o�h�ϗw�hy'r{��qF?@�9%�a��2"�TF:�U�]��N��=2���
���^?��H��=��9jf�@�zZ����r���vZ/����Vý���1��n�Ϥ;K�?��:/��?k�Խ�s:>h	��kԙ�9��["ӊ6)�jl�t�圂m��VSn�s׆�#��x4�<��R�����=�Nts�?������[*�8厜�P���@7g�묾�w�
K/*��z��ڜA���;=t��!�Ο!f������ѵhE�
[^s7p�J�sg.'�k�Irx�����wf�o�S��7��GBJ���։��^i�l�Sd�:	���{�<#����p�*2�����|>�1vn����Ӳ
a��"|�^m�px���	P�0J�Z!d-�C��
�]�s��4��ZX�{5��6\X
�^*.��m#/��:"zj��[�n]�H[���?dul&��o�{���nIՇ�iQ���w��;aϹ:\v�]��?�;�q(›�R?�ltҎ#5��Z�r
@�
�w�S�?�ծ�Z���_�4n���^~����-�׏
��|4��dm���'k�>l{VMV��r������6�;gl���%�%P��p���>���e��Ȝ
q,d��9�I����RF���}����|���4g���RE���!��ܻ�	"nϗ��}���?9T�����./������`q�
g�"M�����g�N(�u"'�D���H�;����Wk?�{�{�����p�7��K�y+�'�;�n�xp.X#��H���������?���es�����W���f���Ŏ8b��;�pa���WC����ֽ��&��Wvc�:�:1�Ц5�^N�~1��S|�c��T�y��]�λ��;Y��8I�Iw:|GԩyV�/�K��D�/�ĮL6��:����]�a��މ�Gd5ݽu����.��FO���
�=��ޜ'y���se,ܣ��Ϳ�6��=h�J�K��<2K�>
_l�΄��a�(��(~�%�¥[�͝��B�ڗ��<(]s�����ld*�H����S��n	܅�D�a}6��3{���>43��Q��9;>�l���9x%��;�x󍭞0�"�P}�W��G=��3_�(=m���KFeBp���`��p'���~^H����^�cU��y����l?��	o��R�
�В���Q,�����X���/5���A��|��"�Q�”�8$�v5���x�|T@��lt�<N�^��0?�5�ﳞ�/f
%E�m���il5����MCV���^��/BR������NydZ�<��"PV��~�.���c�S��:}��Q���A�`��l��꽆/k&�?�]̚�Зڿ���p�=X������2g��^x����z�_����6�D�)��z@��)ļ=��0rI��!8���r�L��4�}z�	�u�G�o�lꥥ�p�pp�*������^W�F!���wT..�:9��	4�+PQ�0�N+�	O�(�7e�����}W��d�,|�'̄>�CA�I�K�Q7�&�e�EX��	��f�����O���-�������'�Ə>4);9�L��B�}���y���l�k�gN8��tX��Qs#|pv�o��+��-�a���)�0|��<9��u�(�\Phn�U?@u���Z�{�<(Ės9�k�\�E`�U3�V8���
�Q���"��(��C�K�Z�n�F0���sQ"���`�4��Fr�K�x=��S���=�ʡx`�T�^�o�T��Xɇ`��|��n=N�F��J�/�'�#���b��=H��-��6��M��
�yO�|��7<0����Fj���E�֧M�\�~���y���Ҳ֭�oY��A�E
P������������r}Ct�	ϗ�n�Q^Ǽy[��Ѷf�-�_�6L(�lI�-EAW���5&Gw��EU�5URJofm��R�t�ZmϨ;�>回6���,g�SI�}��w���A��E�#�׊Z�	�Nb)��ٺ����ԕA���7\���9#K_Cp?�9��qy��<q߸e�w~?���.�ٰGd����T�bm]��7:u�H��)O��ŧ�@��`fYq���)>f8Fes�w�l���B4�A|��ޙaH���Ւз���¢}�wy�Ž���-���U�-�;,׃��EL����ձ�P��`~���OV�g⻬�nӜ��$墨����ͮ����O��c����Y��Z��%����(6M��/���U��z�k��U,`����Z��h��"�[3_�Kr�v�e��r��/r��F9\�D���ؖQ1k}��6���<�n��Ҷ:˰�d�����5"���ae�F,q��c'�Ȓ=��r9�b�دI�����o�T_
�TYzg�ݻɫp�[ˀʖ���w�L]���{�Ǟ�:��^XѨ�H�ppdL�+�5�tѫ�­��
׌gD�p��)���(���m�ڶ¤�'�-�t-Hu��V�o��{S=�՝8>�1~r�½��`�����vAO�1�3���X��e�E�Kek��yQۋc+yu�5�
��^�5�緐��(�P8(x�A!��4�ш�檰-K��?����ۃ�@��؀n��s+p`��LUTg8�s����_��3�2V
���~���w��ݠ0���}��ҀC�Fe��(�48�J��ķ��^���v
��f�R��4f�;�7�Q�>�"A��d�{V:����~��d�ˋ�)�\�M�1�^8��&��'���Igd�>doZEs㻭�5x�Rf��)��aI;s�V^q���"�,(ً	�~�s��������i�'�-ض�N7�;f�^-z�/荬�+�GM_#��3���ح�K���f{'���jyՉ�*^�ӈޕMA)L�Ȼ�%��+Kz�9�iKU��..�ys��2w��<�b���y�x�O�<��x�)c���蛅G�[�t���=��)1Ru$��uQ�*8!x۹��}�w��0W�5�~ҍ
�����"9{罈U�ܥE��[���Ysw˽�Ϯ�?�4cK�+G��T���j�G|Zv���]-�	�t��̣p��B�N��zm�οt�~�|>�����Ϻ:����!�M�fդ���
�|8&�xY6���Y�ugg�L?Q8��[����m(
|~q�+�{f95v�d�s|�y�ا
Pi�l����ի#D�������k�ވP8�%p�L�k�u�������
2=y��-��f:�x�
gs?�%Bpt���iǘcs�x��{�y>z�F��Z�wL�S��I��.�W�
������3���o�B�?��C��@s�(
�m��;�.{y��%o��{�Ƭ��'#w7ƃ��˱���^�B8T�P����5{�Z����{�S"�


��!8��;魏��R�$5qԖ-�j�싒�����T�Pb����|�W	��c�S�ر?gG�co�L�KW+�Ҽ4�N�y6%��?��yxz@�v̢�:Κ�����<�'��zs���^C��u!���UfU/��xU���jn
�|E�N"No��/�{ON�y�[�I|�Ů��U���I���Tb�i�ðWY䊯��Uꡓ{�����##��"l��y�䞖^pQF�<��Ψ���bѴ�mi[���K���^u��z�'���i&���6��O����f\�M�W1�xu���9��#DӦ���;n���O>�.Ide�x/x�5��2�|ƻU��
H�d+(߸�8/��	�)�7�W?��l����`
����._�Ln��y�RJ���q�4����t�b�h��wL�n�+�]q�2��]X;�F�C=�n<:����!u#��
�xƃ̤WCǐ���ܿ�LA
���3���L�컆a�K��,.��j9��C@�ܘx��d�f4yd��V�î��%���}��\C!,[1�"���{�Q��]x5�:5���NFWe˥O�e�7�,\(
e�D��Pʶ��Pv0C!��	5}�ְZ�ZT9]��E��q�
��fu�)A��
�)��z_�#��ٓm/��CF�l�.v�AP����U�77<��d��Rо��짗U1�5O�Κ�3�1�÷<\�l��M��pT�!�G
���Lf�l��^�)�%V�}u{=p��ك�F
�F�m��������
XH<�k����W�ly15���Ӗ�_�p��+�SY�m�ƨ�u���5��^)�[��H
q]�J�aL�y*W԰��7rFc@Uٲ;�����dL��t3�L�����B�RlXGe�4)/5o^��V�v�^���_7�tow��
蹫H�$�uJ�_	���ݺ#��vg��1�r�k����!l����+����vDm'�E>��M���9�v�Z|�t����-;:3�5Ma���&ֲv��XMe^�-�[�[Dv�(-󘆰���!}dm��JN�	ecK�[��A�6�}���N7W�l�9��z��'�B�i}g.U6|��Nm��xH��'����Q�/�w�ղ�+��~���,s̰�����O�m��Oڪ��s�НK9}��(�UK���6�D:ߔ��h�s�Oϋ��H]W�HpR���k�f.�-|��F�قK����fwh8�k�0پ�-?˿�os@}����GT.
��)|��K��+{�t�&{���,��8g��{���/ʎ��R��(��2�n����hأ�:t��W:�a�f�
Lv�	4���)d�4i�p�)�M�$���d_]a�C�x*��q��\X�cl���GA��9��^��bH��C��Z�H��xu���������
�f�
�r�b�Ku�����$�H�[�o��>������O��Ί��6�z�8m�9�
!�@�O
�T5P��9���Z��E�n/��@U;^;�P��W�4|Y�9{L�8O�*�^�ߤ�1zs}՞\P^�h��es�.�bLه7�v�
����A~巁oa�A�<Ѓ>����`�`�`�`�`�`�`��������|p�/�`0x��_�0��?@
�� �	�0
F����
"a<DA4���`2�����0
�C<̀H�$�	�0R`6́�0��O���6ȇ�vB�B(�b(�ݰJ��a/�p~��p����p����+�
��$���Pg��B���p��"\��p��5�
pn�-�
w�.��p��x��1<�&h���Z�9����
��5��������'�_�O��N��@D".�A�H�#���P7��T�*�z��H
��^Hi��Hi#��(D#��"}��Gh2DF��
Sd�̑�DV�� [d��rDN�� W��y
O��Ah0�FC��E~h(��#����Q�B�(4�Aah,
G�P�D�Q�F1h��&��(MAqh*����x4%�D��f�d4���h����'�3�h!Z��T����hJG�QZ�V�U(�Fk�/(e���uh=ڀ6�Mh3��-h+چ��v��Dh*DE����h*Ee��E��~t���C�0:�*�QtGBtU�*T�N�S�4�AgP-:���9t]@��"��.�+�*����t�D��mt�E��Ft�G�C�=FOPjFO�3Ԃ���%jE��k��E��{�}D�O�3���D��D�
	.!C�r�<�@(JD7B�P!T��D�'�F��
B��Mhڄ�KPM0��#�}	}�џ0
��aL���aNX��aM����OA�"��%f��t�q�8C�g�sD=�@�
n����"�3�3��g1'�����Y�Y�I�dpVrVq29�9k8�p�8ٜ�ZN.gg=gg#gg3�WNgg'�������S���)�q�9%�ݜ=�RN��������s���
��0���s�s�s�#��Tr�8՜��S�Ӝ�N-�,��s�s�SϹȹĹ̹¹ʹƹ�i��������������i���r^q^s�D$ArH��2�,)Gʓ
�"�Dv#�IR��N� {�j�:ً�
5�ޤ�Mꐺ$E�$C�H=�ٗ�'���IriH�Ƥ	iJ���iIZ�֤
iKڑ���H:�Τ�J��|ҝ�
=I/r 9�Lz�CHҗ�#�����?@�#�
2�!G���(r49�#ǒ��82��$ǓQd4CN
'����d,9��#�����d<9�L
�$r&�L�"S���r.9��O�D�L
��Br��L%����r2�\A�$W���jr
��Ef�9�Z2�\G�'7��M�f�W2��Bn%����vr��,
w��dYL����=d)YF��{�}�~��y�<D&���Q�y��'�J���&O����d
y��%ϒu�9�<Y�-�s�r�q�sp����Vp�r�q�s���Jn��[ϽȽĽ̽½ʽƽ�m��������������m�����>�>�>�>�>�6q��O���W���7ܷ\�EP����%K�Q��H)Q�(eJ�R��S=����N��4(M�7�EiS:�.EQ4�P<J��C���~Tʀ@RF�1eB�Rf�9eAYRV�5eC�Rv�=�@9RN�3�B�Rn�r�<(OʋH
�S��ʇ���0j8�OP��*�
�B��T(5�M��¨�T85���"��TM�P���$j2KM�⨩�4j:O͠�D*��I%S��j65��Kͣ�S?Q?Sj��ZD-�R�%T��ZF�S˩j��ZEeR��5�/T�M�Pk�\j���@�Q[���6*��N�vR�.��*���j7��*�ʨrj/���O�~�R������:J��SB�UIUQ��I�u����P��Y��:G��.P��E�u��B]��Qש�u��Eݦ�Pw�ߩF�u�z@=�Q��'T�L=��Q-�s���j�^Q��7�[����@}����F4Ash���2�,-G��
�"�Dw��iZ��N��{�j�:�I���hmZ�֥�G��}辴>ݏ�O�hCڈ6�MhSڌ6�-hKڊ��mh[ڎ��hGډv�]hWڍ����I{�ioz�C��~�Pڟ��tL��#�Q�z,=���#��tM����$z2KO����4z:OϠ�D:��I'ӳ�z6=��Kϣ��z��^D/�S�%t��^F����z��^Egҫ�5�/t�M��k�\z���@o�7ћ�_�<z���F�����N���E�Et1]B�Хt]N������!�0}�������㴐>AW�Ut5}�>M��g�Z�,]G�����z�"}��L_���
�
�&}��Cߥ��{�}���~D?���Mt3��~F�����K�5��~K��?��?�O�g��'�
b�Ð��ad9F�Q`%��̨0�Lw�ӓQcԙ^����f�mF��e(�f���1}���>ӏ��0Cƈ1fLSƌ1g,KƊ�fl[Ǝ�gGƉqf\Wƍ�3���x1�A�`ƛ�0��3��g��&��1#�&���Y�,d1��<f�����3ۙ�N����2EL1S��f�0�L^t#������x�^<
�cx<�O�׏ן7�g�3�Y�lx�<;�=ϑ��s�y�<y^<_�^/�����������y�x�H�x^/�Û��țě̋�M�������y3x	�D^o&/�7��›͛Û˛Ǜ���3O�[�[�[�����������E����^w=u=-=J�H/B/Z/F/O���
����O�տ�O6�l����g�ϖ��>[��l����g��N��?�~�v�����σ?{������md7$0Ik�$�S��q�z�z�׍N�=KuKuC��ݪ{jZU�t6ak:�=�{��Gu�b�&�hK9�x7%�V�R�8�L�ż:�L��y.��U-Zݝ�8�59�څz�ٴ�fZ��:����[�������M���M��5��:˚���ʳ$���fYkZ)�(�L��l�dY�Tz��z���ަJus��zKx�M���^���2L��XHӪT��-�_n?M�;�Vӊ���6��M��G����������n�$G��mwI�[U���rf�Gޠ,�FS�6���*K4��`�ʲ��J6��M�rf�"�eرĻm�c��(�7�v.�N��K�k�����M&�Ge1/_��>�2�2�&.Y�l�3�י�e-)���mwM+I���s��h+X�&��]#)M�Y�?*�ު[l�MY�{�I�mꋍ�s���M�c�����C�q��b�-����F�L�γ���$�sh�q�l
s�2(΁�:*��۲ܐV���g�1��s��,uR��r`�c�8�0�P�<K;��uVՍ���z��6��n��e�(���0V#�Xr�~4�F����%��z`��ȍ+��2[�\l�r-�#�,�!��6}Ih8��d.U"��8CV�o]�o��Y�����;��r���^o��%g����[?�i���Ϯ�:崃�o�Vm�6XX�Xݓq�p�w�O�_
�|�Q�#��8���ؾ�Y�/6��.pU������!]�l]�<�/a-�eY�PB�\�yV��y�Y��5�C3�;s�:SM�L�Ks3M��bsk/3gw���{��p�F�h��6ދm��2�6�s4��b�j�jr��ڨ����F�G���0#9�}&�7/���F4�#l���ƹb/�`g��W2����C��x<vFqxr�v�f���v����q��&��26rf�,���|{��2��|�a���l�q+�2M�xy����y1���8�al��L1a#�v#l�X�:���
βf̿�d�6h�]_'c�zo��j���`P��^)4i��E���ߙ�����[�'Dz��~l)�V�m	m]��Y��b�
5$D��m3M���=��d��,��q��e��\��[��.A���uɳdcR���z��]�y��[�,��v*�v�3t��ĖL��!�n�rfu.qtR����jǶ
���?���`4X�Y
����\��x�S��^�����
Cg������f��gg`�g�e6i�[S�b�,�"J��5K�Y���T��qTU��\~a[M�y��ڹ�^���%e��K�w�PI�_;GW���F�"����9�v���(��	���F��%��ˌ-lT����Ձ��r8*w�J�J���:��NQ�G��䝋d>l�\�٤��:~{|q�ı1�?�7�/�c��A�?9W���������|,9&�5�%�׌��?�o�W`
��b�j�ر���1���<ȴc�4�w83>)JV<���#ɧ>,4�z�pȷG�0g�����ɐ�`�w�G�v<Q�5�n�y���ǴL�O�:%.�+��\̧Lq���S�<͟Z�ft�xF^��%�iB,�4�5%�1��2��]�0nB<J��i����a���cY|_�|pn��a�f�q���K��M�M
�"�������Q�:���ϖ�Z�֍]s����+pMv��[�+���&e��]�X��
��ꞝc��ذ���M
\ş�:�����5�0]|dƣC�n�n���U�����B�IS1��Rr�-4�$mK�Jq��c�s���[����?�Yc�1�&�˳��3���p��x�l>m5��@ᐖ�xd:[�F'���Z��!J�Z�5Ƥ���fS�6~�)�B/�&��Z�z{	�r��iH���2x�ƫm�����-�����=�{HR8μ��x��K��s��#�(�(zP��\�z{�)ߴ�6�A|t���q��5�و��t于����:������:������:�
��=��
�����e�=���V�N����ƻJjm�9��
i�v謕�B�ҾWEP�+�����o�a�==��ō�|]��m�z�I
kǿk�#�Oċ>�¥P�v�nq��1H����������|�q/ݾm�T
�J��ĸբv��g;R�<�n�=�P���#��C‹��q��:S�#�n-��t��R�}��}�K����o'�hlk']%�e+�NZJ�87	tZ�k�}�}�w�+5I��H�=��I���&�ш�bt�a�&��K��q�TL�c1n�뷵�*�$��l��t�)�-��WOH���I�;�{�ٟ���Rq�Q�F�pz���x^;4Qd���:��A'�3�{,����l�C�D��.�߻�yh~�����=4��зʕ��-��v�t�TZ��)�V
]������I�'֌��?��R�n��>��R����A'��&��o�c�(ޟ����C�R�Z
��T(���H����B��.Jyi���R�=Z([u�-�V�陻�sh3�Q�âq�\;F�=Ҩ�#��dy'���n��i�(�Jju��k�&�.��'���}ho��x/�y�4���_{<m���Zڷ�v�Jq露
�q?Hq�����]�*��7E:n{F�tn3���v�R�QY�y\�F�f6&�pFv��Ӟ�Hut]��]��/�ݔ��~�ĸ�R�c)���E�=�6��=-��JҬ�Z����3)�.��R\{ܸ����e)NC�S���ǜv�a�v�M2���.�I�
w�M©���t5r��J�Ql�p��P�k�f_�~ɮd>���?\���'�ݒ�>t���D�vi��/��8}�MZ�}�S����Wݥ���K.Ic���nHq�Z�D�c��"\��JV3D�SRͰ�D��*s�G�h���87i��Hh������������?�{���,ǚ�p����
�EV&��?W�ӡK��^/��K}�Gѱ��ۣ@.��p5�/]���a��?�����tN��5�8ɮr��$Y����I��~���.�ꂺ�.�ꂺ�.�ꂺ�.�ꂺ�.�ꂺ�.�ꂺ�.�ꂺ�.�ꂺ�.�H���B�~	���ǿF������uA]P���H��z�@�M�~3�&GG2�"�E�0��sz���'%1��{�c�Ę�鳘~���1��̐iQ��{\#j��$�$�$$�D�2m''2�LRBdt��Ȅ)��	��H��891)&!&��<�I����0e�#�b�%1�)&HJd��	��bD��e;3arb�䨤�ӧ%J�N�3!7��I�<qZ"���E3�g3���d|���Ȅ8�1g
nr�u]�������l���B��q�l�ױ�Ĕ�n���%��v�1����������^ં*�܌���-_^T�o��K��}��N������ں�:/������w��S뽪{��|��mŒ��ք�D++K��>^�6x��y$�ys��;aaa	��Ɩ��
*.\�p{��6|n:�H�(�d̩sg�,3U��Gx�t��^|����Η��-���d�*e�\n���


��*R�?��q�h��-[�JJV�(�O��q����o7h��NK[{[ډ��E!�IM�e[��L��&����i��7cժߏ&>9
'�W�=�{�nm��X+{�e�:����>\^����܍7nܘ�aØ蔔�G���\"-�};v,�͓�ZL����/N}��i�֭[�޾}�(�
�w��އ633�<�{�Je�M�srd^[l��g3���`��H�i�p������1$_
���*r�y�:�d�	�<�l.��%22w>��U���2,v��2�3�,��	D���?e!�}�_�؈�
����EUI	,)u`�l�`9KJj���B�(����ʶ�\\U�B1��S��A�Y���+���_x
�|�jf�CI=J/���'�1g�GC�8��8/�Iw�Vp�NB��Z9�������K1QvHE0W�ò�T�jG]�qN�Z�MJ�i+J��������
��XJ��_3ar\\�<��2�F�X_�8z
s�m�7z+���������+6�=.Ê�ᱠI�˯nZE�>.��V����fpY�d�cr��'�c�o��?�C<�W��H$3U�3UH���Y�ƍ�Ou�4�C���"���ya�z���e^M�|w	���:�"��0�:�L)
�����2���q0�3Ѝ�U�7=2z��	�Zn�n�q����;eY<f������T�&G�$�mij�?{a;�c;���dg���3����g:�qeّ�+)m�А̢�d�5�m�:���F��Q(�PWQ�U�1��kW�@_����2�5�8"`P��t�+�m�hI��-'jccns'�Y�_f�̨�XP�T;뗐e-�l��5��GRg��#Q�m�ױ�B>R49%&:��b�}|Ҹ�$0�H�
��}4��N	U�r�^��c�G�7�N����i�
�n_���2J�.��e]��rw����$�)_.�M�Q��P����j�0�Z�eK����+N��)Z�"�5�h�s�ec�Al�`�
�0W
݊P>�
�r�n!���N8��y,��#cNj�~��x�sK!]��f���?
�f�#���a�����
̀�-�M��Tw1Mʐ������ܚ���)��\����/�c��+���PL��6V��Q�2�B<cI��i͋c	��䶰$��3gё@��݈P�
��8�''fG�5�$K��:wn���k��Ƴ��Bv�'��*��f�(�/�oE@���8���R�TT�sX�)��4���S�S�f��A,)��}
�d��J����(K��H6���A���	9�z��<��Y����]^E��Ͼ��~+���}�c���T�*�D#��!]a��x��f��v	�(���N���Q>���ZN	�E3��f?�l\����F
O˕��S
�:O�U;�<,v��Ă�%8c�c۝�P$�����\�@^�?������Y	Ø���V(҃���5���99v�֥�1J�W���ԡ�͌d�I�S��v$�
T��F��9��H�鷛Hx�+��+�EXC�\�5'cq8@)�U�f��+�q踘��ML������n���$�;�"tpf�B�5Nl#�(��
B�ԟ`$��-�z���	�4`��h�)x��
�B,�"ń�9W��["�e�oH�"O�Ř�z]��^/q4U��(i���)��p����X�Dp(pf
F��R�f��x��z�<�!�
†��IMZڂ1h�!Վ1~?��Xi"C�^|�c$"��b�Jl��)O����(/5�N�q�m��-IpY�X!�Jl�G�m��:�>K�[���,P�4=�d��]�|6�=�@�fj�X��W�j��H/�^�	��9�C��V���K�f�Wi[�d�j��
��Ͱ��WW�|��B��3C&�e{K�Q�>0�|���)�����B���(�F����q����])�^�.�R.h��8T	aYx����J���Bj�۴]ʹ�+HT�6Gv¥�N��X�(�.MVN�,7��!Ҷ�V
�d���$�CX76�t.��|[E�wȃR�|Z����I���v�`{X���D��y����o�&�BmQ.�C���e�qS��
Z�h��dv����uE��&�7�kַ�9ė�hn��:V��_��U��׺�A�
����w"vq�'��n�Dq���0.�Px%��i<��p@R��>�[
���?R�.��)�A���Nܗ�=�����+��q�R�Ѹ����!�x�/E\}�v�;�Ky�9"�����םx)��!>�x��)����U�}�bwx�
ن3k�,��	��'�FM�
?˳gS(Y��\Y�
]�cw�_A�g`i�ֈ��FDZ_0���8�d�
J��h)�ԗ�E�
��նi�I6��d��?�Dg$z�茄�1��}|v���D�Ȩ)m�Q���@#5N�<-(&%I�&1�걲�Ę�6�
���<P��DM��>�m<VH}D��'��o�	���Y�P�G~�0�<=n��q+]�
���'����
&̌��3�c&���@j�>��4YA|��	1���=�x��Z�ʞ�����+y��’���	�mI���xN��i;W��?��7:�Ğs��uX�&gw��}�������/�w_��Y)���U�S+W�����D�W���V�x��w�C�-��3H��<-�\R�i�h��UXH*�ҊQ�%�Pc+d%��)`k�$5�Қhq���FQZ�"����t��(��5��i����NR�]Z3Z\c/��)���8��!�.��&��0o���	�N(v�Ł��C`D[�8�9@$G�'
��sz¬5|9�؆�F&N�޸��X��A�+��������镯t�����l��4�YE�Q?����&@C6g���kc��C6M��9�ߤ�6�0���a�3R��'�*F��w�2�q{*Ѵ�����z��D�f",���`�xVR�0�p����Fi�4Q�!�d
mm%DN���$1>2�B�o3t�ƿ�-%�6�!.դ�x+	�m�é:��º����\znT�2Uh����2c���b�'V�XMl��j�����:6H.kH���=Z�+���M5��XHT��^+����o��ol����2�s��T�5���BB	i�)��zGJ���D�cĆ�(�(�����
�����u��{/�q�������[��;��>��i����L/�D�vfc�Ȍ��Q/���Ñ��<�@<�t�t��
D�1�hU�g�r���Uv�T́	�"��\$��@��<��B8�;�8@��y��Hba�G�	�Ŵ��kWH��?��T�.��+[G�K?�<g��42�n(:�)L��S�-�_
KJ@�?z$���0��ê?�.{-#wבޣ�h�?vo���ؑ����͹/��f������K�OR�b�W�0�;��WY�.�w��k�7ܘf-�V����a�!��Nv����<6����r�:y^'YF�m?�H�y�[��TY^����W�l;y�t���3˺7{Ъ�p�t��!���������ᴚY6�#�CI�N��f�1iO)���9���I�&[M���ʂ�߬�)�/�E�\ZO0��7��~L<�׮Yo|V��Jkl&\/�vl��L�
R��ZV0�v�1'>�Lb���*�K��]n���i��FIv����r�~�5p���k���Ò���A�ܝ���?=ʓz����G,="�G$�3V�}	��9r5A�x$���A���ҽ8��j?�Re�v`�pd���3�_=e���&�q���3�lWj��.����X)f��W��_ع����s�6�.���U�!?��\]��|��Æ����B��(���/=��`�����{fv�tEU��IO�z׵�?\m?22��i��ƃ��08��e�����_�U���o�<�Ѫ�ѭ�[+<�);�s�j�;�׉��:H�d��ݵ�·R�4-�x�$ף��ۜԵ����Y/
M��B����#Ӕ!��q�&��JN��{���i�1���l��gh�^_�h�s��%���Q�R����i�f�_�qd��V�Sտ7�%�iZ
�3�4�AN����Wՙ��`���8'�����G�.��v�����?Ϳ���N{��w⏿���B꧛;OjV�=�h4��*�W��ِuKg���?�Yw��tScH���Ub(sX����2�rxI��C��~E�ә_.ݟV�*6:Pny���u��tw������[���V��V�խɧ��]�sȥ_T:v�z+*��bŤc��/�j�ش��Yȼ����sG��|����ǜ^�E�N�8��ϣck_u����ᴀ����/,�p�ʪ٠Bf�v��U��y���
8��f=c/�k�}�M���W�-���ۏ8�O�X2�����kgV-�s={�FXgv��^�ֹ֏h����f���D�'�Umgt��:�U��.�s,��sN�juޤZ��T��)�0:]Ғl�o(wQ�v<%E����Ct�u�*m~E3f���	�ھh�v�9��(�2�����L�L,��D�%jH��B��+�8����ชop����
���`
�N�W��������`����/�(�cp<�_�<!�@�Z	�]缯��gP��q�7�MxDV�}`�l
�'�?a^ϔA�vq�~��b_,fm�q��0��
d�ƖWs���,�=���A�d]9N��B�N@ĩ{�3xB~4ן���e3��1?^��1ӊ����.�SUic.E��Ņ͋$ᄊll����P��'�T�.Rt��h/�t�W�J���2�L���ʞ��ɞ�\����7����_^W��%Q�IˑB�fEՀ�Ã��2tpOģWÈ�g�:?v&�
���U;��)6(�	F�l�<nF�lk�3G�s-���9���Ҋ���cg�	yI���TAJ*�yd&��4��%hj��8�Y�=y�1��K��2\Sӣ�'qӢ�K<�����;f��X��J�
�����H�C|�9�
)�3���R�R
R\�%b�9�B�#���ŏ;z0���A��f�t$���:�]'q''�b�n�M��H�=#�ɘ�U���?7�}|M
��U��>�я�6��|�E
���\��R�-e�"Bcx�[�P�"1���"����n��a�Ҵh��ɬ���hc��e9}?yΊ�s�]���|M���w14�{����tK���X��_�a�k�(����5����R�{���p�[X��10'5�J�'^�^W[^���b	J��q��jN0AVhj��4+�[����%�w�<�6�(���ܝOm��D�^
9��ʂ�	>e]~��J���酚K
5�1
 \�K��5Rݘ�m�1
�T�L���+.�i�,[��V[Bm�T��[��P�������V'.1u��v��Ԭ�tା�\����
~�nI�1�^�3ƈI�)i	�o�Z럕�H����L��_�?�|��:P�m�)	������ܢ@K
�<�;��_�j���Y�7���ʌ\��!�u�jV��kY��;���&����u.��UƂo���[�'�VO��)��N�6�!�9
�6wK����Ɲ}t��Bǻ�A����:�y�YJl��m�����\�_>�MT/{y�dhɲ�C1�s�]��f�0�^:"U\�/�ٗ�m�v�۶�ƿ��1������΢������4d����ޔ��D��A�ok�����O9X#�33,[�v�F��
�Q�K͏������<tD��)�yp���2_)�Ǘl�ln�_d.MfM$�����ZT�5�;�kVc]`�d�͚�YB����E���A�
�gZ�ʁ
����U�n]1��8t>;L��n�+١�1hyi���?\v�.;�Q*���r�A�[*���.��)c���y��F�z#��حհ��"S
*���>�%6�;���ʒ�n.^�-Ե8��1�۫oW��=47�{�,r�|�ʴx�/ŴH��=K%pD�B+k���f�*�}�0�-Ŵ/�c[0uU�=(�\�9����g�����y�8Qԅ����]����-0�ApL���u@�)����"}n���ˊ}h��/Ў2o\���w����Ӄ��&Q��Mqh�fޝ6U
�(�����Nt]�/�H��넋
��.��x��(_��.�.�]c�Ƴ��8�	�Qu��$��4�t��p|2c�py��2
�R3��^nW��yg�Эօ%�ʦ��"`����v�"馳3�4�D�����6xIDZPY&��޷�F[�^,/}�����:�ڙ�[�������^�'�7��^��AV3��_�+O\��.�T)qv}�@ZA;hK	���-~/R�W��p��>�9�?H�Qr�Y-�-9"z.AJ��J�!���v�g�
����}(�x�l���R��J�>�E��SRB9%"H��Av�T���SӽW��t���j�6�t�ч�G���"��{߯�")V'N��iS��^�k��+��v�ؔ��2��
��Iɕ"斠�m�y*�
�`��;������n	^RW���D���p�%���ζ�2x����8�-���z��CD��<��
+�s��{͎����v�a7�gUr�QR	;�ؤ2\!�q0���#w��<M��'�z|JZ�֗��[����^}S�kߝ!^�h�L�R&_T�V��E��O²��TF���S�C����>6?�C퍕��z���$m@�*���4'�l|�.�8��Be�{�H��v��N��V&���WxW�
�-����tl�Y`5]Et<�~OV��GB��10��Q��c���T�;g�׀�
Eb��W��_+`�z��;B
�t��!5��/�M@�q�����"�xk^����0=#!�z׽L�Β�ʋM����.��Q<��8�
L�$HF,�THC�����M�ll�o�~�FS�d�A
���CV���Ih�Tl���"��(���p�!X|Q��?r8��QB�a�|3�L�M',*�i�=��Ƿ!�vǍ5_~r
���R��Y��(OFJ*��XV��X~"��;�nR\"#:%I�M�����R��<F?�/�&&f1x���
I�b��ÍJ�1�Rb�+��<F,R�
5%&=���m^fO�=Nc$�y�iHva
#+%����K�d�R�Y���b�XFyǖ��f�%q�lBFJ�8�sFz��᧡��(��Ï�OF'���
4S��i��Tt�J�0>%]���������|�!�+@pgp���"��*���oM����/�L�ɸ@�l�!@Jz�:��
݀Wa�A�3��1��R�\Nο<ge�<S��/�9�tE���%�$�g28\���<�
������$*J
�����0���һ��9O�Ċ��Hwy�qG�v��c�vA��@���R���F�6��J@C�!�D�!t�!$$$.%��4�6�^
���ߗ��]���A��Eh\,�r�Tt�C�
5�����D�e���>�}J��{�]_�p-A^���N�$�-!�����f��P?
fB��࠮��v	���94���
I�__w����\�t]=''���{F/��u
f}�(����d��J���3��7%L_��ϝ��k>�6�JD8��q>�e�Cb��X	�sܾs�gI���|�S��\�k�NP���4:�G@���*tN
�
�K�i�~�GrJ�sM�
�@	�;�k�!TK��"��
�[DI�dDr
�!�ɥ�E�b���SiU���F��Y.S,�*�'�J�)�A~3]M�I!FAC�Y��ب�X��l�%JcJ<e�J�j���Z��y5uw���e��=�#���L�hl�P�<�i��N�S�B��6]����Z�}��鑌7]�W�K�~��G}3��_
����J��2zk�i�m|�X�$Ҥ��	�t�i+�&�gf��S3�Am��TI~w"�L<{J!�A��#}�v.�n/�u��&��"̮��Q�m�lQ�͇q[
D?�z��i-E|y��8���O�CI��um��_ݲ	E_?B.���~pU�k���
�xjc��2қJ�.�,�ݿ��?��▢��??h�Ӧ�|}��^sq��y�On�����X�r���)4.�D0R�v��^܉�R[�I��ݠ\��J5���ߣ>�UK���Y��^q��f'�v-)m�6o�Y>|m�[Cyf�Su��Ap�Z�M]Ɯ̾5���mW��4z�׊��<,-c��ږs�2��<jS�˭���Q�d�h��ao�T�#�udžp�H�Y9��bAۃ�}�����9�������u������"BPh+�W�j��7�#�i���F;�v.��S�ԯ.H��Z�W}9r\sSֱH���e���z��cb���p2�%5��ꇦ����7��ՙ���X��7W�&��o��Ȯ��������A���Յ"��X��:;��m�
�Ez��",�Yp�P��PDf7h]�0�l	�,\������
Qh;)�6�9P����c��L�
ą�/�.���mO�ܝ�D��&����A���
���}�l�x&�q��yq��:�ưH�=��{/̪�oغ�j�*
d��?�>X�/�9^W��:�8W@��G	+j�s���.K�:��N�uS�?U��p���
,C!�f�wo�_����?��b&P����,[
E��[@��3�����/_z��ᘸ�.�%x��I�Yt�BG�/���(5��UB�5�:-VgX����=&����n!���jX�B�ˣW�@]�68+b�+���c@�EQ�W.������W~k_���G�\|���'kv)'p�>��"��:�'��P/}��_քt��gKŶc���ww�t�=�<�Rt;����l�6�93V*�FP=��l�J/��S��|8��(z"��3lx��D������"�,mZ�hh��6����R���������z�n�G��ա������Z��"��o#P7=��0{j�v�3k�&��[x��넋]lC�z����y���͗WNi���N�X��`�7���4��x���Z�-�F\�ӿ�#���N�dz'L�_
�
��<3��k�INC;��Yf8��F̛��$����5��!�p�V�#�����!�@v�OY��qXX߰�f�Ms�|M2-Χ��"����Uʒ���*�o��ɼ��@�b�G*�b�n#[G�(䋳�q�s��'#.hh瀇m#�\��H�w�9\/e5���%@�֡F���W�9���JY�g�&�Β�V�b�.��0jk�ԟA�.���:���KWS�ʏ�T��
s�DѫHk�6��(�-n���춐��"
�d��A�!����D	��,��챐�a��ʸ�9�M�x�����8�[��v"k��*�r�pWA��䝖��*�4��^�0���qԺf�,
)��=������
j�+5�!���ȹ�~�ꏫ\���D�fyz���a��fF]?����|��w�/$2Y�mY�}�}�JU
�[Z�Ӫ�%�d�U��ۓ݌V�AI!U��an�9�����=����1������U�,*��<
jM�v�s��jq1Ȧ%0mg�M���pK�[8�@��@S�)�D�9@���
U*I�V���\��a��3Lw�Ȓb���M�p���q|T߀�4�\���a�hz�Z�C�w�A^%�����(k58J\��i��'j=2�*���w9T'�Rp�S���j^�A�ː�X��z�	��P��כ�u�]��KM��T-&>⨨��b��{��r����±�(��u��!X�aV�}�u�*�	��덹V<"��go~z�U�GKO�?�D�`f�C��
XC�]�� ���u���:����g�fa5�f���%
�<=�1#d_��1
Z
@�~SH�R��A����)����
�>�ʜ0V�◻p�i�?�T�9���
�C�mWz�Q��R�R�a��El��ő��P�Qd�S�l�E�mdk-��2�A��m/$�r���@-�k
�ĥ�`X&����L�j�:XS1��	��	U�_��6�|�Y�u��Y��C�k
R�C��W�s~i�4�u�k|n�C��B�I��ړ
�Go�6�%-��⡹iY6zM/�q�S�_��'���c���3�&�.A\���;�#�����z���U��U��c��2��e!��g�f,
iF8���>ʊ��Y��:q�ר��/����w(��t�Z�c2�%��T�9��-����
�Z�?۶x�-��EP5X�35��?�2k=���
�^enZl
x	2�\Klo���8#�7PA�M�Ѻ"�<L!V7�����u��}�/|_!c�%͐���ͯ��gh���5�KY�Dj@�の���m��8[\
WKp�@�rq��	X�LQ@S���������������Cd��m��2AV6��ƶU3?�;�v)��X����찜%d�4P
`��덫�[z���d��{����&��`l]��]v"|�u����M��D��S�g�f�j��Z3`�

t%���d�R�?�Hu�+
e"�q(��@����R�m��B���ıd��-���Z��W��\s�i�m;��t�M��e����a�>���f���.�n�}۳��U'k�=C�M2��W�cTWX�e/"<ޏ�hϪ|9,�ù��|�W��14WE<ݡ�T�;��Z�R���oL-vy
�-e��Y��!J��,�m��7޹�<����q�ٛ��=Iצּ�n؂#��~�����X�pe��c���^��]��Υ�5��
}�c4�OfY��zV��E/�Bۅ���ɷl�s�fZ�@����[���#����s��`��4vZGD��Mb�JZ�#3Poz4GC����ܫ5�"�:6���_���Ь��pN�fS�L�z`���^4��}Qv��:P�u`�dV��x�VZpY\sޔ�	f'D0\{ރ댏�w
H4�t����S���g�WB��(�!�lS���<S��=�Z���\�+�5�}
=���Q��i�Y�R���Q½vfC�@[�Ɔ�]�"\�A�r>-	j]©W�iR׈�n3?��82�w��P�E�P{����-)�j���WP$�ѱ!m�uc�_�c;VI�y.ifK�"�Қ��6鍋���Z��J�F���d�h���2��-���+5VEpFg,�?�3:On=0	�t��
�)T��gC�R>�S5
w?�g��Kp����D��/��$k����3���ޢ�X:�,=ꩠ�4�2�=�h��;6��&K�^<��9{!��!W�^�݉4����yL��w��Ŋ�~՜;��gE����gJ|��*5[G%
ְ�!Rtz��;�ʾ��[�D�S�n3[^�vu�W���_���N����"禇��Z�4h��w�VVl�<Ľ�J��,���&;T=���hU�Ah1��YRW/�T�u��{Mo�pШB���{�,�^���}>�����_����ǀ��.��E�v�_���q��E�#S�N��޳K6�0������f�JJ��Zz!��At(�fs��6u&PkH�nf�yƳ���*�^iU�q�E��b�׹:N������rvon���!">���x��M/h���{�]�I�
G�Jm�~W�Y|��3�V>����hW�__Y�9�W�-7�)X"A�*@�����dY�
�k�zv�9���Z��f�mzV����{Kp�
�=M�֍�^���f0�L��7�
��)Al�OA9���,v���R����˻�N�`��05��G���o��)�h��yHBC�{>�Fm$�-oJ�I��x������t/�e
���zfצ�%Ա_K*`�F3,-N	;]���}����.+�+H�~#2
R�j�����gc�P�����ͣ�;w9�����^q�l֖Ng�8q@Ҕɷl���P�w�_��V
}8*٦nn{L��MY3��O;#���-���&�aC�c�Q�NG�^�M��Q�Ñ�z�.?yJ��b��)oa<]C9�@t���?��
з�SR1�5�pާ�������D��s
e��ʔg�(¾T�_�K��v�DJ��@�E�s���p"��$&�&���6�>�P����Y�hI����ʾ|��>�i�V_E,�53)H-"ń�u��'H�`�Ę��1�㽇<�2��~�`<��K�z��H*/w˅��'EC��~�e�%c��ƪ���͒ο�&�A���6�cO�Q��*�Uj��m~�c�)����
��}m@��
�z��e~�\zl��6&�_�I�g��%S[�w�F2˟o)�����Z���\�����H��}(E�X�97�c«>����!��JU3+z�y;zE��
��7BU�.V�\���h;b$������#*C�M��M�;���^����yz��W8�5���.�VH��i���w.
��m��">_gԜYWy�-u��,[^s�r5x���w�=X�:ܞ��!��aU#i������qW߶Q7�M*�3�&8,��T����̾�S��Yf��C��=�e��r�B,ؗ�N\�
�}�2I�8�=k٥���������.-Q���p�ӱ�͑}ۥqC�ۢ��c
�9G�[B����<��+�ǣ�9�sv�
P=���sCE}�+F/h]r�j*�z��N^V�����L�E�y#㛁����Ȑ�յ�G���^�V1����X��]i�Z�~��֛�Fb1[;��X�_��d�4l��j���{:�@�ʞ̣N����,�$�N�+
�f��~�R�ڮ�DWĘy��V����
O�;�s�_M�8��ߪ�4�=����a��8
z�Ҷ;}GJ�=lk���-�P��(.��ȅ�>N���Ns��֌]{k8��˛�,Z���q��p�����1i&������ocO��VS�/
��_�z�����#_o2&�8|�)��m7�lt��K����Q@j�F�޼}��
�0oH�E��b��D'���wc�C�\7�~���W�g�4QڎܫA��u:��٨�Z!�L���10�F�/���5)�
V�@�
�r�a��+��k�W�?�����y�!�q(aT}>��ju��@�Py�����{u�ضs؟M�Z+e������)�kr,��}��ϼ9*rQ"�VK�ٝ��;*G�|��r�����W���	I�n��Y�,��-
��L
�G�5ݍ�w�k��j�u�d���}~X�J��A۔�k{�;�𻂮_:s���j��}x]�ֽCç*�Z�|b�&���~/�[�>	���U�<�`yGž���
�w(�x����>^޻w������C}�D{ǫ����J~~��_�����Q���Ƅ<m�̛�3M��Z��5̙��q�e{,�~�=zں���S�.�=w1f�V#��T$�{�J��i��0�š#&�&(WIV��s8�q���T��dN�#_;V=dz���Α�y�[?b��g78T+��^�p�UQ���_��~�����](��n�~��n����_t5��i��WV���\��d�m����L,�[6yl�ɀ���\�t<��g�*�-�V�>y�B�P
1��7���P-j�Dg7�%�T���9\��Os˨>�a���7�iE�i�駞6��<]����v��M�34��nD�5��E�3��e��w�u���56*%��
�=u{��A��A}E���ٻ}&j��c�ع�>1ޟbSyjE����C��7��[����$[�,f��-^�.��m&��v�UO��Bz=М�t���t�z'k����οڋ�)�pT
�sjB:��˥<��q�c�R:-2av������&>hˎ��2*݋�e	C��C�޹�G���NB<�LI�@�������ǀZR���g'J��j��H̫�z�Y
�#"��5w�"!��^C2vaȸ��yx��@���1����T
=ֹ��1	P/
�|��b�vh���6/��=�b+=�9v��'��/���E�ʼn5/J[
87��u�Y�����y=u=[M=g��]w�>F�����mx��S��F��X�6�
���Z���{.>Z�]泺u
hm��}n:@]��ͮ��G|���M�U^������.D���!�^�H��)Rdb��Oج/+�+���I����S8s��9ʀ����{xE���������\���@��4i,E�G@:dӴ��X#P_��C�kY�v��F�D�\��5�شx
�	��9�$���%�4�7�"�]��pTg�.kx��FZ�&ixf6/Ŷ���,���&`C|�����1@�A��I€?K�E�=�h�����9h�~T�]����e�?��ʺ���D�eq:��ʮ
x�
�
Į������
���,��+�����p���μ�.l�=�����2�#�a5���˖�Y��V�e���J�Q�CO�C>R�b/#�1���xfW�!=��(W�9p�~�9J��T�n?�2/S�N��ܚY�/�9")�F���)�*F���b�����Aʜ���)-��8N��:5��e��=�a6�b�AlӹE��F���`o�����i���R<b?����s�^g%r�$�X8?
��
�l4���>�2c��s�t�wm9�\��Q
:�mXҺأ�37�ߧQˬ�Qd`l2��K}����Υ#Liw*.��g7ґ>�Q��ڔ��$�o	��i�&o}�CL8bb��ڽ�����j��KGN�޻���m��ؾ���=a�7f`A��B��?��l.�L������Kο�[���{�M���qUp�����),x�df�н`��~
>�>A�uU�9�o��".ĭ9��8d���wn�,Q�|nl���?�v��Y
	�6�F�Y/���<�R�Y������c��o���;p�����z�k����L��
}�ٵ_�J�6�ϡ{����9#���8"�>�����@
��T��Rg|�n#(GX��sh�Y�$`�������$��|C1�i���Lq�@
��:F��[K�̭�Nb�C�n8v�O�~umQ&���@s6>d�����4A���xN��t��E�oz����@ǚJ����*�Q;��E=�R�fl�a���A�*��&W�J�El{���RΉ�@!1�ӫ�rg�B��g?�a��2�.#���̷(x
�/b[�>���"�߬�rT@��u��7kVl<,y�Ԧv��^��
½[Xy�AC�f׉��gQ�$���C�
��Lp�:��ցѽMf������o_���Up�-~S+���sZ%BHs!DFc'�C��"�e�zp�9	�Q%��w�)ލŧ7�
����W�W�_�a�۷`E��d����s��t!��x�˨�[ߺk�ɓEp�X��8�^Q�pb�	(�_\���U��
��u�B7��{=CK`�d���iޮ�%�?w�q���=<8J���[��;|���a[D��2o�%zU�q)	:~R�T#S;�d�[ڶv�29�y�
���0z貯Y�f�Sab�/;��z�{<�!>A�-w�cʏur��#VҚ�\FY��#�`�`�����hO�Y�\U͢��d�n0;;
sj�����Ɔ���L�E%��i@|w���/粥�R����ֱ~
�*�Y���q2�E���*��C�<�
���ql�!�9�(LY=�`�)"�0�M�`���
��HP�Y�/<jW��c��_r��^���2~_�Ry�!4�T�4nmc�o�]#5�?"Y86���a��]�~i�74�th��_�lW7����
�u^ּZĶ(duwd�����	�����(ט=ʘ��z����ێ�;�Ӌ�	O�����>{�ߺ��:���}gd�5K;jջ�w~�qZHv]�����i���o�{��z_�����uG����'ە~�����cPl�`�Y�ko�%_ɺ���q����w���m�0�w^��rt9Wǐ~�L񤷿2i�vn�k��:�y�U���ع��k���ˏ2*�r��l�
tf.`�ҁ[��K�%	���Y�����6��_5%$�V0O�����"�b���^�X�Q,�����$~�s���ew�'��[�t�\Nkzj���%t�+�G�c��KpoJ�aq#�
o�ߟO�3��#�
(g��"�s�r�:E<����U��v�v��Zx�m���Y���p~:�6&�H�����5�V4��Bϋ��%Ǖ�n�R�n�`8��[�Yۋ�{�&�ˉ��F�6�h�&��t��Y���E�L��}��?�������s�?`j��X�s�R~O���5̫a��$S�*��u9�5���om�G�
�
��]�렁K_79}:�=A�iށ��GѬ���9�
�:�=�8"@��Hh)��K`t9�8�ev�6g�]\��d���W��A��ؒ��ҿ�)2
?����d�ł�T*�|�n�+�$S�#��*
e��Y䆯�ﮱ�/F=R%�����Z�Ѩi	�>�[H�.
��d�k���Q��ď�@ni�8d�:�W�����[LI�m������Ω�o�/�̩K1q6@D�,�.�['˰^�"��=�����#g�B�K�Jݥ�
8t�̪ce3��	����Fo�k
0�#�y��cE�^0	@��jNz��U�#�<7�0�N�s�	�=�0,�m�M�IȜ�:h�":��MJ�Q_c:&�M��+C75�QA�k�F��9o�1;�ٜ��,m����V�D<
妢�[��n�'���Zu4�G�;�N<[�M|?33��;�4�.p3��9��:djSxz��g�to��Ѥ
w�f��IW��f�Ӽ��E�
�"1b�n���uj?�����ݒgM�o�ŤqƄ���7r������
���@Gst4��89��΄mw2*��q�z��ľ}璧��-}\9xV�8o������&�c�-�v�u�?�|s9�x�?�A�@�&�*�-��=~z�2s�m����Y�m�9���V����W{5�6ˇӵ�#�앻ԛщX��9�*��5�G�a�9�N���"�7��9F�>���I�����2��#��G莗Et�֓�Yz*ԁE�I��U/n^�����̙�@J��.��&��>�@="�4��kZ@Esw{�c��:g'.�	w��-��5�ΰtCF0����2y��(�gH�;Դ�7�BS�3�[��I·>�pd�[�ԏ/@?1�b�ځ�Zp�a�����t���p��	
�!˝B;/�ׁ�'�P�d,W�F�I%L
�V�"ƺɩ��A��6�(��
+�_�&q��&���
�¨{/7F?�[H���/�"��
�C�t>�1`Z�f��y��~��n����2���(����L����F��Vl�v�V��[����粣�U�pA��+�Jwg���{ĸ�K���_:へK"
-�v[=����Һ-b�z�b���|SO�)Z�=���@5x9c����>1`zTB��b�d��p?`�����o#��J��
핷�G�����C
[N�-_]�rh_�L��y�Q����R%���t��&#����~^��Q�JE_}���RHm���e��r��˂`P��L�0ZU�|K��e���EY�"��0�Q]��3��Z\X8�5���/ɩԱ��V��sg���Ս�0�8;����úM�g�#�F����H~H����k���.jp�
=�=!̷s�A~��<f��YOaM/]l�ew�\�V�=Ǒ]~�b���j��S�}�Ũ0���v�����U��u�
6ƪ3��}?�8�����x�x�����B�@�``B
�`�w�� z�I<�!�O%�
�8��!VB&dA��=`]�Gx%�2C�1����bh3t�.C�aİd�e�3z�����uxWUWU�V�y���G�m�|�F������h���>���#l#l{�΍��t]�;�UL"lͫ�xA�-�ơ�M>hj$�*�)5DRi��d/��U�U�^�j���5��CB�"U�|�5���5�g��"�h$��{���"��������AoS[)��R��Ѣ��<Ϝ	�OV-�O(f�Pi�d�=��l*�{��I(h�$�g?	���1	�'������/��|��k��~�6M�F;�w�
Ġi40�3����)޲�����Bӧb+��a,�j*ݖ)h��$�ƞ�ҽ���>�[ĿPo�@<���j!�ba��ҙ#a�XXɿ`Q�*�
���ڼ��I���Æ��9���f�8)��I(�j2��u�
;>U[fS�^Hخ(4w*�1�MA�beh��~6z�m��iS���T���E<}�2�_��a��O�Oj*l\V����%䨊J���ǜ�G�Y��@��Lt�8H�OI�/N���F�(󇕿ɪ���]�����z��sY���������Aq4��ĝ�3�m!�|QX�(du���lpBA�Lb[��)/����aaZL�e��"$��/s+x��)���!�V_A%��8ᬲ��m	:b;�RqpA��L&�
��E��ɢ���
3^��c�N��������s�X���x����]��ɉ��7�׮��&��v<�1��|�gNjd
��'E�R�2R�1���ܴ��g����Tn����[�����SRy�d��t�^�0�ꗒ��sCaR�0��'��O�����T�xV"�@):%if\�r~r2/ufR
Z�$�J/���'�R�T2^�P�a/�0?_Y^VT
75�w���{W����bSR�x4у�I�D�7ʨ�|aW��r�y�`!W��6��)-+9�[y�����T�0�[�%%�a?^r:
�����K�B��H����]�=B�M�`p&���H����������Kz?Z�?��`�r��M�I�2��y��")I�E	iB�N�;���H�B2Z�)i<��d6�˹a��}H��$�)+����R����&^)(n�0:^&8=J�&��YR��*S)�]���<�t�@�K���d?ޔ(�taJ҂eP
(E����O�G%�b��@�I�8R��y��d�7����0<�T^l"�vI�<�+$
�DIK�
H�а3�!��t^�4/9f"���� _h�'	�
���b^��ҹi�/%!܌KN�[@�ġb�e�y�	Ry|D!r˄(q���S	�&/�m�e���#/��}Ɛ���,�xh
�����I/C��R�4��S����N���|�I�H��d��I�2)���Є<"V�ҿ�M���-��
�C���Wٸ�gRL�z�߱*�g�j\\SA�	"���n"?%�M
Յ�Q�8��!O@*��i��0:'8��М���}�%���p�EX�F���u��D�L2��|џ�B�75��h�����t!?1��՛�x���M3����{��aV�B���������Fo�@�`�nE��B�V�2����I��^��z��8��1�=�}O�T8�P6��)z
\IK����]�9��{v�AL��
x�`�)��ʏ���]���Ђ���%�Λ����[��!bi��>�%�/
ĥ�J�������d2�h���&5*�-���MT��d0)%](HJ�7�����,
U�DLE�$��m�j*/���1�)I��n0V)���q���O6�?����d8%���C8rfR"�MHOM�!cY*�i
(hCF�O'Fv2+������KF/H��ĤrW���m֝��F��qVSR^BB,_(�4����)�6JZ|�J�<)�א�)�@:��"B�K
�م��c]{�l�h�7ap�����S�&���>�NA��4�0%..��0����"��b�YJjWHeO��I�
QIY�<j0���!
�e$R����&t	��C�2ˏ�a�Ve&��SY��qZ���13P
5��<��o��i^�l��'�e~�Tw'W��6��Ӿ�:����ߏB�`���'��n�@H��
I�>W.8%=9f*J:%1&KMŚ`:�����b<X����XSID��TzbL��8�d�P����*�X?�������ST~�d�J�#�X7�F[	Q�n�<T_��RS�Y�8�����O�E������C�~2&�
�y!h)�@�#u*��}��N�1|,�Y)���(y�7
�Ą�:Q�e�[!�Ӕ���v
.���&:2CD�x&�!ʑ�,$�#�N�i)Y�q�y���[��&;(-*=6�����D��7����'��U6!
�F.��E�J�0]�n!h4ƿ,��x�;"tʄ>J�A�.�\!�{�C�Eo1�A���,�P��Ȣ�ɤ�&���%��L|tB/I�I�a��ѐ�2b�b��88��H?��*V��!�H���Du�/��>�b�?3g�99��&�Ѡ!(w슈"$H.�\�⽿
��,���[��
H�Jh*U:�����M$T���+ba��3s�f�w�?�?�Ly�g��y�gfN��偐݋á�a�&�y#�$�op)��Ϥ���_��
5����R\�����3����J�?ܽa�q��7,/úq
�EĠ#�V�=�M����L#��9�<n$����)M^�c�R�H��\Ö����ŷ�J,K���m���eȻ�_"݇n�#��$��$�yU�u�����W��wJ9�5"����5��H�{Q�OP����F�����q��!}դg(['��)�Ƒ�TiC�}%���8���Y��a�Tm��Q�у���$��L�M��ڈT��Q�7n;��6Օ{�4+2�^���}�Ո�JZ�A�\|I��$��(W4��ڣ4<�+Z�[�EJ�������%O,N��Bֻ�չ�	���N�$�L�Q�<4bp���(�cRZf�a��ц}�
%%e�-�"Aؤl����C-J�$g�9��$~J4�ߴc'�xg���@���R�O�+H�@J]��B^������7�W~Ν%C�#MbծP�g&I���"OU�8�H�w�m#KK�F��fw$��=����v�H�z$.6{�kJ���D����sq��d2���5�s��:!��U�2�b�+w��ﳪ��+�q6��M�Δ�q�e���J}+`�Ӏ�'��&��PyqF�i%�Ð�o���B�c��L��:Aܙ4�AZ��iU�4�е����=���/��	GK��ۺ7�.g��%�bo)_d`RI��d�t�.S�J�<�^c���[�W\D8����ɏ4Օ�9L�+�r[�"����a�<E��TE����V��W���,"�S2X�Y��R���b�`OVm78�n�~#FK�>�7�<g��ón�*JY����xQy�t>��4쏰��n��E%;�ܳ.mȦ����!�«�ֺ�R1���m�T;>��\���
��?:��X�ww.QhA�w9�#܋6�jz(~���F�����#G�f�p�收�?|�]��`��%Z��|HY�6��>��W5<t/�-Y�U/8�e��JTD�k‚��[W["R�cv�p^if���y��רd&6�ËX�~i��щ^�s#P���L�p&I�3�=�Ս�(�Z�*��2�E��>���E�+�+��H:�yE�b�#s�w��4*N?��.����2��~��:���$p2޸ln�*N
.N���̕�0��g�s��tBU;�"!��a)�2�,1$J5���M���E!������Ç�f�b�C,OLtvo4d�b�؈v�q�M��J-��{vOVYi�S�%�j�W�#G(��K���G�[2:��k&��I&ԑ���!���v�?Y�*��[��H0$VY���>=�n#�Ѣ+.m��Qp�6%$�9q���{���Vc�d��0��y�E䟨,RI�_��T�p�F9�u<��_���6�������к������/�9�/��9�A8Y���=�/A��c�^������A��a���%)����\�v���u/

�t
)�$��<y<$h���#Q���s�:Hmx�*�ɐ�V&���=O��߷��y�mw�ڷgw3"���~����o�i3���z��μ�ކ<��y��'�Q����f�:�ן�-v�S'nJ��)��z���J�k�`g�妈9l��2��0v�w��e,�(V^2£�>j�s�M��[
�ݻN�)�ߡ�w�J蓩L�c:��~-<��T��K:��K������&�Sw�Sf��ѭ�:5���^i�B���w�w
9����g����b���o��+�^�`�6]����{�y��뱸=T�CEeFhبHfD>k�dyR�~�K��p�p��'�i��
���7�g��y��ʻazr'yql�k���o�sL.u����˝g��<��$5U��J�z����E���^;�+؜��z�&���������a�uD
K#���7Z��W��*U+��﷟�L�s����JA��ڡ{C%��9��9�u�V��G���(+�W���k]�隇,oV��zO��#�	�)�c}ff��@�̮#�^�J�]⊧~Wmyv\J��n���e��$ۧ�kِ!�d`<J�-u��D7�%��w).���L��b�S\:�TĹ:!�4����!�i1U���W�hT�&
��[]���i
a�dؐ��ICKC�"%���+M~ɰa��/]�a��<m��=v��;_�l�}�f�(VQz�ҴX�Ê3�#����S�ֳ�m�_U&�\�C�#bTEY�r�'�©�VyR5��[�\���=:��gV6ʐ��I=���$뤞�Ay}����t[�;e'�$yp�+���#m����QS����J�Y��{d�ѹ��K����~�%�c۝1��;t���
�DP4r��.͈`Hɽ�%Cn�xpH݁\�ţ_~y�D5�|,;�ݨl)�M[gc�o��_���\T
�F���xl���TS��ӹD��Q��-�5��a9�zջD]AR�|�0yU��y�Fcѽx��)�I��d��
�~�d�Y��@��"*�SM@H��Aɋ��il䈡�(�(zØ
J��3���(�[`���T�f�ߨ�*�4��L�`y��]2tD��dy��3*08���J�/�<;~~I9��z�����2{8v��C�}#K��	��ٛp�B'�!�����gp2���^0<e���t�4$54���밒P���Z�.Y8���70��~h������Y����{��z���ֵW�]�<��+
DR�A���H���)w8n���;ξ��*'��Ʊ`h�.���k��<�c��E���'@�^�����d�I��<#$�:��w-�gQ^ZQ,o1����v�7o��{c��F�P4�tdY�9��>,M�
������(��U�,���U�MiT��Rus1�ޔqb.-nqfP�J`�)ËF����9��Z��T-�f���zSdH^B����~Hq�z�������#J_�.��]^6�=�[�߸��{�P�h$���I�W_3�а�bS=���跸�����.��Ր�v[�r���<��%܋`�fmT#�/(s�r��s�XᑞQ!r�Ȉc��ERv#wW�^Q:L]�PB*�,(�9�Z]��O���N'\�Hn2��B~�D8��˞:}S^n����n��z		�t�p��`b�v���J������8��[�%�2aԤ'�P�L��""0�ItU=$T:�w�?].��0���A_�>��v*���}�0�lH7��x�w)���f&o�A�Ն�*H���9a�$����w�
�#5��PΎOK|Cqu{����)M���rW7�t�\��@ݕ.���H�x2Y�A��I(0{���޵W��VݓN�#OƔ��@ݥ��zv�k�cyk;��⑩^�5��%��N�i�E�Q@��iٗ&�C^�q|.�3s�ı�Mc��pi�yOT�c�:�I�&�yNp�]}d8�G��s�xW��7��+JS�v;e��6�}QhX�2�H~PPgS%:�ė��`l��f�{S.���ChY�\��t�j���K����?�������6�o�w)+�k��zwSi˹
��#3�(T^�_�zp�u�Gy���+oN
�p�:"to�P�\�.o�Aح��E�ˋ�do�xdZ�Z��ջ?��=2[����Ⱦ/T��=�u��+�(��20��])�w��U���*.z{Zf�U��H8`��R,�&uH�՞4��9ؼ��Gg��a�(�
����cKu|i��ֵ{����i*z�e�ͣ��;N���J���|�ЕN���<��6}�&S�v����OEp�H�K����v��&ߞ�{��~y����B��V���)oF�R�2��I��է2�{�ϻ���'��]\�7�,hKRк,�aڗ�׭��s�e��}�xHv���zO���F���T������o<�V\4l�P����C�:\qM��Y��i��zw��B��I�~��Y#FJ׎���.��sm��7
(�1xȵ}z_���#{>rxUjӻ������t�E�s�!�+��o��f3u�y΅f�b#���h�=g,�2kM��3��P�7�NnN~���+oK���Bq��t�NS��9�uR_BHb��l��\춶��P�*I�[G�b�c1}�͹��5IR/��/H�o�U�-7tg��r�"��7n
�����:3������b���q!�G�v�<Ț����ehMӚ6izA��^Լu�K�����_����6��В�����n>�5�5�Z�9<F�v
���7}�5=̚��͟����͟��_��sCkvA�C��O�X�$Mg���Sf3{)x^o�"��)����)8�7?�8��j��Fd��JIzV
����Ⱥ?�
鬇Y�Q�uLdY'D�	G�f=ƚ>`
&y���Y�X�)pY$Z��E�e�hY$WɕEre=O	�EBe�P�NS��~!ә`��T�˼�w��3��#�F���$1ѻO��w0�ے3ݺ�Cfiw��/�ӿOf�4�
��y����E�
v�{aH彭�`"H��Y9m�U�m�<m��ȸ�H�*�hϬ�A�ۗ�㠚\a�a�_�Ŵ;w�W1sq����W�t�_�FҴ���Kx��鹥@͸��6��Y��Co4C��L�l�{����.��07�v+ve��:�E�i�7��Afvk�x���q�?]\gֿ�@
�����=
�5�ap�c���86�1ٙ�&�Ȍ�\�O�؞�Ț$�qS�
�����m1�%�-�b驖��ҽ��n�Kϴ�Ɩ����,������,KoiY�,;۲/��+5�Jmk�^j�^f���R�`����˭�Vj�u�Ү��-v�Ů����b�,v��0V7Y�s��n�XW+�V+�����Jϳ���V�mVzO+��J�����J��J�m����>V��,��J�g����X���i����b����b���X�b�d���B+��Jl�Ŋ-��P�E,Vb��-v��b�-6�J��Ji����j��Z�eVz��^ae�g5m5���$d5	ZM��0�靖���̭fc��1+a���g�����0�?���jN�I�jT���(�򩈧!~0�Y-g.��LD�@6�Y��2+mb����.�Z-B�d�2�%�P�x)`�-�@�J�=x�'���_X��:��O!���	���eۘ�zDy�H?��.�w#�,�9�����x�x?�r^�����א~�Ym"�DՀ���C�Zf�A|��Ǒ>xp���
�.�=��G���G�O!��'�?E�h>|��}��k���-���1ԧ���?�ҿ~C�,�R+'�hV�Xn��Gzbm�D�@�Aē&��0`*`��t�����F~⹀y������E�ŀG��*A�����W<����UH�&ِ^�x��l@z#�M�̀-�oll��i�;?í���u�s���^@�K�j�ik�2��W�^�xptU��E\�|
�A�pppp�[W���_�)�����\q��	x��*������ܲ>@�!��Ϗ��S�gH��%�+�א���(���Gn]���:��'��π_���U�!���b�1:�n]300�k��---{P��{H�r'#��0⩈�!�A��tJ���P6�ss��[P!�!^�[�P�xvz��KW"^�[�2��a�-G���8ʟ@<��1��*īkP�k��!���ވx�-����I_t��v��3d�4�;���πnһ���ѭ.��u��N��:]P��tm�v�}гt떗HVfuݏ�e�
~�*�5��nu=�D�� ~pP888
8�[���h����-�O"~�;��n��{H��[
���X��N!�1�)s���s��aN�`<;|�[�|
��-͍n����.�@���s�����|{��y��n�<����2��4�7��~��cl��R�	+c<�&&LL�gff�70���(�1@%`)``9``%�q��'����J���}�h	�c-P��O6666����;��e75�?��O�EK�-{�}'�}��+�
��)~I�/R�5_�+"�~�p�	�
�?�@mI-m;*�-a5F��C�n���	�ۓ}�<�ర��d�-�^��,�~�'ۓ�9p'�=�������N>|��5���b<�S�W?�x2�;��2�^���c�ŀ#"��x`#``.O�$��o�����g3�h�>�R1��q�=�H�'&�Vу�M<�x�6#�*z驀i�G��t�33
{O�g�.���.aϡ�na�R���y�=�Hm����HM�j/Dc��h1*<j�7�ڕ@������V���7��T�q��Ȱ��NJ�*��T{�R��5�=F����%#
�����?�t
j�Ք�C�Z��Q�1�q�	�[������3�h���аg�F��O���爿0�/�F���
�z8��[�}���G�	e�6�2~F�W�f�����c�F�w��=�8���T*�F���0���r��i�?b���=陀Y�ل�cb��V�y�=����E�ŀG��*K��++��<	XX
XXXXx
0
2.lFz�[�c
*�ʹ�����r=mZ��lϘVx�J��z����EDwF��uĻ0R{@�<`����~�|����<��P|��i��~�.��n��z�^�
xpд�h��4흐�$x�Dm֚[/�����y�_��>�C���#f:�Lo��H�,�Ü���t��E|p0����z�=�H�w�t�t,�t,r�
��x�pu�D�:`��E�p��n���K&Fm~�QV�xG�R#~�D�!y���q�wL�K�`�@���{=�'��}���P���L��LhV&�τve�����md�ߙ�{z&����g�?�R<�Q�ش?1��qH�@�e触5�3�}n�+xc�ڙm6��bM,��_�|��=���D�i�2�f�	�7�Ϡ�x�'&��$`����ٴ;��<4�+��8�	F�Ϭ	��	�j�
�k�grЎ��q�,���C�7�5����Y-��ᦠnj?ʛBe��6��YM������>�z���f�kfϰ��^��(�e�ǀ�
��\�n��5+����07�b5ǐ
��Z�-�,(��B���7��f΀~ʯ_fُ�r���1[`xZ`�[@Z`�Z`�Z`����L-0-0-�O�Tda��?C�s��2�ʹo��,0ɲ7YY`�e�D�Q=
d�q��*�ىH�C�<f��|`��
��M,DF,��8�-�.-�.-1�-1b-�e�n�.���_`/��V�O��^��������p�-�y<��
N�"	��̆��f
����Oi�,J
�_E�I��mkI"%��)��ٚ�U����Ba��Jԕ��G/�87����l�@&�6�%'�=N�m]!�8g��83�e��xy���1���L
�D
wT�'t��X�
�1-��;(C嘜�8���+��*�n�ihΠ����%6VW�'R�$f�'��U^*g�`r�*�D��Kl��������5d�7A��S���Ǚw2�u�z�ߏ��u}�ߨ�VH�y���3'\��8����sk�Z����Z�W5TX�s(�}��[�_ݺ��Cs������\&5�حݤa��
�V}}<�c�+�T�5��TK\*�mZ/�����)>f����*W���q���kJ�Q�
M��<
�9���6ِ�V�'�	֑��4��$�on�lw-l;YKղl;E���Zi���y!��"�5��(�fZ��Q����aZV�ܤFZ+-�c{�l-����]�w)j&'_���i'��&}Ծ~�&礖�u�Whڕ�~�L_M��5\K�_G���	�@]�D7�6�Y]���]d�fJ�B�])�U6�M������S
n�Z��\�CO]�p��]k�G�u�ŵ��t�۹veo�]�[׮�s�>\����]�'�]�']��/��Ǵ�3����tD��i7D�w1�럙v�_�����=���B��bZ�
�n1�g�
3�C�֫�i����{(���)aڟ�ߝ���3��Z�?��6`Dk펑��;�4���3�+��*mk7ce�#�5�BC��Z�}Lt[�9+�њ���y��i����n�ʊ�Q��3m�6��Y���8��x�MP�D=���A�3	����Lu.�FYSP�0Ӧ*�i�a�t��u�ҙ�f!(�M5.��k>���e�=ϓ�2\�X,$��!\̴G%�cLN���������ߗ#��
�\��_�#��ư'�e��c��gk�m-���cԳ�$S���֣����A�f#�ML���l�)l+‡�6F]��Ƴ���KmR�%�,6�i%�N=�h�v#����F,�?G��0��{U�OE�#z�i/ʡxI��e��r
�R{EΫ_c���`�AŠ��RDeX���io"��E�^���ҩ=��(ӎ!:δ��b�IDo3�%��c��>`ڇ�&3�#���;��c�}��S�}�h�}�p6Ӿ@�%Ӿ�3����l�-�9��
�#��~@8���p;�H~b�	g.f?3R�_>�~E�������E���.cc`嗳�W�qW��g>�&"|�=�p{�j6	��µl2�ul
��a�O����n'}x�&6��R�@���D���B���F����s>��q҅��Ta�]l!'}X�I#|�=�p{�^��>V��y��l'X�IVpR����q��_aO"|��B�[�I	�
|���	�V����)��l���C}/�3�	�Z����0�2�m��0�z}�@�'�V*�A�6G�Ǿ��p9T"ݡ�����B�?-ݮ�\j�3r�7wqi�vs����d���b��?f�qR�=?e{9��>����9���d�Q��oX��0/�h��^V��h�^QR����T�
�a��%)-���$�F�����C�W���aN*~De�":Ƶ�Np�-�S�ou�;F��{v������G����]�?���a�#��}���!�_�Gc��e#��O��ac9
�8N�4��R{�7��'��g���sف/d������2��[v�;U�{p�ĩ'����D8��F�0�	�TNfs�>"e�.e����3��$����u$;�����"��U
�o��t_�ѹ<V����E���C���G�H6�X6��l�1~���V[�S'�k��k
zP�&!zH�&벅)�l�aD�T��t��2��.����3��3>�g!|�%�7h�y�lT��ks�ӵ�����BDc!�.�f�N�.���%�V�h��-��t.�5r���H��+��#|�?�p'K��?���[�p3_�p_�p+_�p_��*$+���E{��u��Ɋ=�ףt'붛?��,�s|�{�F�{�&���f���cX���X`[T�ꉊ�M��v�P]}ZE;uZP�(�]:-��:��guZ���(��&��$��"�G��A~�Z�I���ZQ5������_V�������M�*�C��Z��N+�u�G�:-���*��4�7k'y�(�T�Z���!�յ�*:���*:���*�I}���w�[��'���F�>��]��~��Gx���c�!�O�G?�tZ�o�X�b�X	�T�O~�k�#�B׾��V#�.�o�B~��;%�W���k��N����~�O��I�~�Z��Է�R�~�?鴀��~I�~����Դߤ������6F'M������&�c���Y�/jI�*;����WL�;F�53V�w���A}ғ���iۘ�O��'"|X�>M�@z�N[�#:�`�N��ЩO3�Q:K��4['���$�\�d�����u�}��}��}��D���c�g��k�!!��d!�0E�3+B��hi�>
a��¥�t����n�׵��ꩭ��YBzu���r��
�y��F��p���Bc���E�.�ta,�iK��ɄHi�?
��1 җ�U
��.��"ib��	������͇[!LaNl�0
b?.Lӄ�O�2gvq�'Ѱ���l}���$m�����:�r����,�)a&���
L�����K�$�ds�,������׶
-�ֶ	���m�%�E���!2�6;D����Ȱ���I���jт��D�����3�$y�oI��*<��6�k�\[�58Q�-c�ö[;�Fh%)�.$V�q�#�Ě��i��ڒe���6�ik�.4#b&�LZR����В����0�MF����l�i����Fۙ`�7ہ8��W&X�	oL��w�0���o	��+KhM�¾����]���m�q8��g�+:��eg�8�g'��������[�/Z���gc�,х�Ka����2f"��ř.Ҫ:.���BD:{0a�U�z�Q�s�toU�n�;�Z�H3�u��^ՑNۺ���:�D���v���CEF��,�W]y��D���̊�49�RљD׳�#�r��:n9,%Np�D��×�ː;�z�Ir{���*�x��7����F2LN�m���{�B4]����8_�ҧ֓>͕�9Gz�*��F:�O�<.�J�[P)Xd	M�W�ua�z��V~��"�b-�DD�{DW�P���#�"F�l�*iYU�
��ߊ���!LiU�`��X�9�˂-��2��+��4
E�Q�N�S�xU��'���\f^��x�Elϼ$���T�
�~4����-;|�'�ٟ�g"dP�	�¸�~Yd䒔�"�
��i��]���d�	����us+(M�E�â��";���z�V:̚�`�
�Hȥ��L�ЗP�AԜ��@}v�7v�,;���g�r��w9a��"���fi#�H��3�k�$k�j�뎆�"Y�_@z��G+�3����h�
o�
���h�*�e��¸j�T�&��RQ�L��e�p��=$"�E�
�""+D�J�*"+E�����<.
��"����*Pz\�S����A٬�4�l:�.����vW��KC�D�ZXZh�(\+|�Dd�(\'|?��:Q�^���zQ���-��D��D6�·DD6��M�7,�InmC�E�V��!r}Ov��Dh�(�&|��ߍ<m#�/qp�I��C��ohQp����Жhp�X��Tt��\/&N<ycx�=
��ГY�5�P�
W�@iA�Z-�����*��cky�^oj�n�h�H��_p?�y�U����,�j�
����u���hI��3��A�ؖf���Mvcl��N���RfC�{H_��y�^�)"�C[
�>-"�ê�U�`��^�hƴ�\�[���w	�]���t�ZS��-����[�{UAw��&�@�h��32>����C�◻ŷ�����!4򷪁�5�5*{y����_%���x�m���
#xENl��v�.v�����@��g���5�(���j���\1I�m���fnA�
�f.�k�-��$M�����
�c�v��[��x�k�m#ׂϕnծ�z���G�j��%ԛ|՛�h$?xm:�R�/��`gg��!@�̛��]��P�ޛ���O����w��R(�����z��D�I(5�(&B�k]�򐹎C��NK�-��N��Xa^4�I�w�{��"�.���ڹ��=����I@����=���Z��pt�`���]$j.�X�W�W?~���O�bI"�č4�P�@��ί��E��&Z��hԦF���n��)���A�/���q�LB��
 �Mu��%�gJ��k����ij20�W�Q�"W^�+��:ګmWn�^X�Kk�'�����;�[2�b��7EEm��7�e�����E�>�}�VH}^ѻkA�|=�à8�@q/֣8
�c	��e9�`��5��E�‰��j�5jH�4�]#I�CJ�Vس:�}���;��!ա�+�e��
o�T(�B��K+*j�3�m�{}�s����:�Z�_37��$E>��PuT�r7@Z=�>Hi�Ȳ!�t�+0x)�PaA�H��u�re>/�W�O&�u��Ճ�J�D���A_�׮�@������^ڎB���C7��'ټ9�&/,
o
v��T�9��n���Jɥ�.��Q�>r��3�ar��
(z�Y�ʱ�֬�4��`�v�'�@ܱ�g����T��;:�~E�’̩
4�"�l��.����H�j��z��JY�v�t�^�Dx�πu�.CZ�r��NS�!������:t.�C.��`���1$Ϛuj�52:i
x>��a����`b��6D^`Z�Y�Ȟ�����r]{H�Px5���N�5��^�®�N��"]iu����`|y
^����,Ľ�h�m>�+�
6�x�p*��wu��amj�'DM���k����y�m��A5�u����b�Ƒ�E�q�`�m`�hM��5��р�-�ݫ
\�Bj��v����C��$��fՙ�!���v��0�"Ȅ��Lh���.��fK]���~��r�w
v
�9�S��E�!���v�����s׻�c5�]$�UV6�W�#��A��	Qd�#��ץ?�Zd�h+���@MJ�5Zd(�����ьˀ�%��؜�I)|�L\[���ֈ�\�Vq��8���@�NǠ�t�q

�aڢk�:VG�:Vî�Ɏй������En�>�*�O�I��u��낛
��
^:9�d�����+��m�:��[����Q'�{�����'|{4��Ȯ�Hp2�+#xO4�?����4m�8/���;Ȉ_��g�Tա�7�23�o���g{.ھ������jLȳ�_�D��)ray�"�qA�����,��?���sO���|"�?���ZH#��fʣ�,��
���^���O�G���C���с��M������L��[�'Gs�q6/뿷�
�}����ߓ�$ޠ)TR�JqB+�R��+�/�ʿ�V¿ۻ���p.�t��sy�i���8�$ʲ&E�_��m�K_�!<@�����?_K���Dw4S�X��zq7c�'U�"�
�?�h,�с�
����7�N��X��p�\!�1�#eV&f�u3`3��t���	,�,�@���g���`�W��������p�۞Gaڼ+;��(r3i�>�����MSɟ���3��A�m�����oor�~���Eu�I��{)��89Fv����dx���i��@Z>����V�bc1d
�LU�e��_���u��������``J+�/2��vdݠ��u9��:SYud*+������Aj��`Z�4�Lc�i,;�l�4��w�;�չ������!�H�c�%R�;�R]��������[�XU�z��c��i������m���Yp
�}*��0kT�>��qk�Ľ�%K���w)qx�¯!zpo��㍝���ie�	:dNaQ�V`��,F�V.���n����X�Z��e���p���0�SYx��n��Z�{��]#��Th���'�$����}�b���uѓ��]��Dz회$U��a��ȟb�~�
�8�`���W��Us�,�OC�C�/�G
��>/�tЯ$ZB
iB3�3|�:<g!]�Ғ��:j�l�e�.	
/�����zi��I�Yn_
��ɡg�{Q���jΥ�z�&�_�G��˚��|�4A|
��]��yX�%5�"���B^�,�
wZ�����ONNZ�'gx�"���3�ݑ��p���"��S�$��<�̖Fa���čB�4
�Iz��X��b/�;�[���X�����؄��'�ƶ��U��yb1����>��g��7�[uJ��
��o�A_�-44���IYd�פ�:&e2-�{�L�}��JeR�n,`��̿�i�J毄1Yl��,6��X�"R��Уj�o���y,+����P�1��c����j�/��+
V�������K
Q�_fhQ�&���=�d�Q����,7E��v�C+��$=���G�BO�6�X�I#\e�W�5HCk�@
+��5���u��ա��o[Iv�E,��,��D�)�)����0o�nR֭p!.`�-����	.d����
�_�4��	���k}���F��@kؤE�����ˑo����fj8����ҥ�MjT�[�\�19��XN��V��R�U�6#���i����0�����c����z��p��k�7�6���6��;�q�k����z�>ׄwQnC[`%���mh��������Q^[�*�?khM��b��L[��ѡ����;��,�9<��P��4�@�73X�˥7�o
B��@2�^c�a�^�,�3X�I�^-TS���'�U��籂�:�?.����E����Q
o�=r�2�vz��9,��kD��GY�\X��W1LUd.�;�GY`
�a�
�[b��S9���	>�����߷���`�/̷�h�X�f���Ms��H�a�i��m��{l�:����
�I�_24�J#?x���
6��b�'5�=a��=iT"\%��2\#õ�t~0�T�8r����.20�h������RGa�BI�YBe�k���`:c�env���;
�SF�+���6���PG��]d�6EI��MFe�]��lTVB2��P7)��(�#$��L*:�U�%i�T��b�Z��l���"�r��"c�^m�hr�l�ƷM�vJ���`>&0򞂴Zj�|A�_7�oj�0�����'J맶:��Uc
�e,􌡲�Tv��Q~(��b�Io"#�օ�뢴?�9=`5rp���~�2�2��鼬��\e++j�x�#�u#�<h̍�(�1������3F(j�cWr7!!ʃ���Ͽ5�9[�lZM�X���#'��r�0�,��̿�6��&�dF���
�P�S������(���؇��։G}��7�j�^#t��F�֨�h�#��,��l��Ȃ�o��18%�n�MO�bԸ�WU�}kK����f�<~�Y�6m��Q#t�@N��q#t�r9<����ɺҷ
�C�j��;�ϩ��$zB���a�7`�|�@���=�}�����
}��U�!�O�h�B~LQ�#�6�
��O(Q^�B�R
=}fT!E[Ѽk�>'��ŧ���Ow#g��t?"�XM�t�=��7����A�X�}^�%�rn'�3�bGa|�g�X���Ya5s�W�����!Lf������~�_��/A�ܫ�p;�6�5�[E�����������f�$�I~R~���3�-_ud`�'#�1~o�����{Qx�>fC�S,x�U��EK��c$�#�1���s-�zڠj�18�
���1Vx������8a�'Y�m��F�$+<�o!�rH��?�z��c���*��	J�ɂ�X�eQ9G����B6�AzaT�y!3�T�H�y����F[�>|�?@������S+�2���Ѩj��N�3�M;���િ?�����l�EH�k�������.�xA��Lќ1|_�?�.D���t�q�q�D������E�E�J�0�s�	�:��_��#�������gP�����m����nWT��FpIT�΋����4ӂ1�i�Ը�cL�c������1K���l��5\����p����$���LX���8i�\�d��9���b�Ǜ��+�ߌ�	&���3�����b��]�>�דL�Ƅ0��F������$�D3���lJ�o�Iu}��j�T�&���3F�(ϗf��v3�$&{H�)}��gd�L7=��=�9{�j���M�m?`Ƒ�I4�MQɜF��$$��$'���N��搲�#u��u�3��t�S�Ь:��*����B?)��s������xί���INᡅuc��g,[��F�`�Efx�	3$�¸C��3F����{��ժ��l��hu���V�hҭ�Quk�^�M��W���&��&~�B�kT�h�1}��:��1�s�8�5(ZRWT٠���hi���4��hY��e4m�hy���&�Q="�\'�����W4����d��
�f�䫢�
�V�2���=Nʡ��hP���*z�Aѓ&�H��E�z��Tw/�+E��A��&�K�oP4��M�iP�Ƅ����
�֚�uN�E���SNцEhᩢ�
�6�X��hS��M�2U��E�M,
U��A�Z$�h�4�ꔢ��:"^3W~u!�$�f�)*���	���d�����|�Lwq�(���Q���k�B�Y	5���SQ��r.����g���+Wڎ�
�]�ړ<�ֱ��O�0Q����K`X��(�j�8�3Q:%^Z�mu+��
�2T��e��LYq����v���y��٘�j�N�}1Ӎd�=�jt8+<?7r�y�����N�gL�w/?g��ؿ����p��3X���&0��:��X�6���
�ej,E{gsO�
��<%�-��9̆/3�����r�B
'�s���19�;��2���潛��"҅������K���k�� E�Nфw�O��s�X��b1}Q,�D,�9C&����N�_��W쥇Y��t�p��F��Z�_ߡ�IX"�>t�2z,����V���ƒ�m�
���w9m�����_)�7�:
���M�r!�J���Y�eY�ɲD��$Mۆ4�%M���Τ�,�
�ې|�$�r9���,xL��1��>���d��NYG╲j7������Eygs��1�>��kX�ɕsD������
b�%.]`2�2��G
��;^y��2=���Wpb�\.�'�p�K7շ�$�aM<O*�'Y�'e����1���'��j'T����G]+<h�Fd_V���N�zR���%��J��\:���>׋�!����ߘ�7���%�$�A���!�g
�d�&����������1����Cn���:JJ�Pヲt8O��uܿ�}��y��ٙ��@��cR�婐̋-͋��DÕ���߹�
Tr%�z���\���;ܵp����$X8��+Y�yѣ����q��s��z��;�uL����>͜{��wp}�A\��Q=�"����u�����F?�LV��B�75y�'?��@��h�ɱ�-�c���MPhg9;��>��{Y��Q��,QQ��&t��?S�Sy�T�-w�6'�xE��"Y�qLs����Y4�)��#%��d�U2Hv
�O8l��8�8�����t<]�(�<(gp�$�%����zݤ�L��E�P�����c<���F�%��hQ*E�
3�q�\�RE�0��aݷ�e�Jr�J�Q	8�=��j�s�c���K*?�K��O�
4sZ��.܃���ID�\�c�'�ӝ����GW>�A#�1f8����PԌ��P���7������f�p��ڪP[�s�'�\��	�7�K�1vKc�HXd2VH����/����~��y�@�֘9�)M��
�5��G����&נ�1�6.R�v�e�Y\��96:j�s.��t�\G[F`���i[(s��ީW��,�(�9Z;���se��+Y�]��c��������8G�5ٴCz��IF?��ݑ���r�H�cJ��t�	ݑ�V#~�5s<�tC�"j$b�����3����I<���v3Cx�ߓ�^z8��y��k(���K�p?��!3�Z���wN��!KH��%VQ��*�o�S���5iч��r�����3>j�����VW\��k���:j&֤���4�'����eim]�	Z.�2C�$�7g�֮�U'�w��1#ɓ<��C�`�E�(�|P%�X�[����)��?a��#�*WO&-�7�B��\gpo��$B�2;q�ᖪ��Sr��̈́.�a�O9�XZd�F*[	��Ll]
)�H8�FH١g�Q(��8����v5bӡ>%���
�1B{��o�
iL��"��>i��6��*��A�W�ӏ�$��OZ�<��m���ͤ�΅��]��{M��q#�_'t��~^������ƭ;w�KO"�Z���S9�r?r\�����f9L}��d�Wt����^�=�K���63��������68���~�7~��f�(Nיqx�Z��搜�P`�6p��
|Yr�H��p<O�褌�
e��&�V:a�s˕ܿ�q@Q5��X��sƽ���-��ԕ*X���:��t}ה>��w�?}�|/��-�Jg�
�o&��W��	��ιL~�M5ڢ�w��|[�֩�V��5�3������_�IǶ���.�r����9��6�[�z���Z��~�F���V�=�ry*�I��k��l��X�5�p�*c\��ӵ���^���no���t{Ӥ�.�����Q��4ġ�{X��e�ҙC�5�S�$�A�����Fj5��y�`ʈ>u���'��-[�<��p�e�����Ss�d����h|���e&F�~TO�L/���W�W�,~kp
œck��58��	���N�Фw��L'M�B���
��L��dž�|�~B���%�Y���t6�J��;i��A
&KH&—����|�7��wc�yx���U����tmћ��Kb�����L¡���Z���9P��Zd��鏱�����c�f���^���F�u4��c��&��$��A���/��t��L��Jh���}���/�k춷�j����{r<����Ɲ��?����6q��J�>Lh�#ɜ~��i��c��G��;��
��Ӄ�AȄ��"G��@��lu3JriR���OLzl�A�}�no�B��#K?%]%���#����{�O䁷}��N1�>��?�����|�?�B��B��q��*���Y�y��
����ܫ?�m4��-Q�a���s��>�h�xUK^΀^��I�$�cZ���s����x��"e�����E_���6u'�K��	�F
y����L���xU�k�o7<ɥ�G�jyUu�u^Uz�W��!�	��N����2�D�.��a^x���c�����<p��@����m�×x�(h�[l��iM�w�XDF�
������mR�Wx�
�l��K�	��������Al�I؇8H�y,g��a�j=&?H&qd=�y��J�Oˍ�{�ܱ��s����?���
8
Z��4
�̃^M�oS�
-����<
=.×y�'C>#ße���e�y��*���4`(�#����~��Lj�I���:�ު�Ԉ��F?�|O�?2��~vy��ٕn6>��аf_s��`����U��;-'�5nj��&>.����fAr��K���~b\W������I��r�Y8�n��e�n:��?�Z�ci�uNz,�KU:<�j+���t+�O��N����|�r�P0H�y�}S���3}�<U��;���D�~�L>�C�ϝ]PHP$�-7�b�/���X�,[�!���`]r���tw�u$���j��?h1�*�Vf��C/��~�:�����z��^=�Gb�D�W�앁^-�Ō�؟c����b�c1���\(�I�Ꞅ>&Wq�l#�yF��KצEx���xN�P��F�y�
��!�]⏒$v��z��J��OH��Q�����Xl��Qo�@]�Gxnh���Y''Pm	���x��]��m)�H�)�[�)*���بX���$5E#�ứ�^��Ur��YӔ�r[�����(�\EG�(~O�WB݇���?;x6�R.��0L�L�#�aK��}wRMN�T>m:����i�t*��,ڔ���Y����c�P\}�t��OIS���
[��
6�<���NC���#V�~F�3��)�?%�[�*�oɍ�to|
�Kw��r:K����2���L?W*���O��tҬ�t~�/4�R�GM��F��P��U~s��=�Ͳ�m��+�Ţ�3�Vo5��o��E�:͡[XGw�	�vސ�٥�Y1�Ͷ����M>=��;��'@rK��[<ͣ���?��
�ℏ���7��;�9�p�S��iS2r3��`ɽ��+����7-�t�hg6�R"���ձ|�}k�K���H$QJ[�-��Y�wN�6�hnc���s������pʀn,7,O�C�[U���j3��s~j�0�}�p^�
���^T���A�-���L���ܿ
hreɋ�کr\V9�P�hb:-Va
�7�#<ǢcH��R�xu�
^Y���6(o���|��1���Y(���dYh��Z{��*�,����Q��QtfY�NX�+訵�U�c�UY�8��;U;��]4_]j���3�"
��
��3@��o���OePy���{���/�M
��**��ӧ_��9���&��e?--��"����>��DD!���u<v�b�=�	�]4�;Y��A9��Q�M�{1(̲���a�
�t�CY
���I����W#y�"Z��oY�t���&��w�nv��֧���]��H�����>Nt���L��_�jl/}Ps^�t�>
i7������{H�ʉڵ��
��QM�rګ�6�*+�C�Q�R�Qr�Ƹ7r���7F���R[@�,�G�fj�E��t��[Lo�c��BB��O�(U��t9-Mr��A)�E���W�L�b���li�V�0��٥��c8#�%�
��",�K��2h�Sls'Έ�Y�&�y���Y��C)��	2=W��D�PӖ:':�X����-d\��5�%�i��B��6{��ٛ��ٛ��Ɗ��/�Egd��k���\�U\�L��K©�}�w�A��!�p�����Y�g�fݟ������2�ޚҦ�1�6�ۃ�48S�)�!,z8�	����~��Q'K�{�)K�.�M��֥΋���<*S��\`�q��}/,z�L�rF��J�|ڬ�����μ$b+"N�$�A����^
�܇�h
>���]
y�}$l�Ua�	"gz0)#��$�PuQP^�Ӛ�\�_*GE��lJ��Qk����X���މ,��4��+)�CO�t!���̃�����O��p�{��x�{��p߻�˷���Xn����ʄW�ص<"���f)�)��d�z�^x��P�K.���R�ъ���Q�L�a��>Tv���R��`r�Ib%5,�H��7��K�����߯�������R���2�Q�f�ae���1,�d�f2u��[<��E��!�R75��l�RR)q]
Q��8X����1v#'�u��p_�_�s��s��t��e6�V���B�p�3���sB���"�-uq�R_�S��A&�(=[p&o	I�=��乪'���[3�o��/Q~q�p�f��t�e͜<�ZV�9w���ߝOҴ�[&S��L3�6S�f���gWh���g��MoǛ�L���]���J_|�T����
n�(�kȪ���]��F�O�Aƀ(ױ(?A�O@|4�+5
c
^��J�����r4�.�z�x�%��k��?q�S�H*!/�V�c�['��Չ,���W'1$1�e��뫩���.��g~H�XN�+��o��i&�
��z�5Jg2�lf����c�6�?�!1�Rc����Cl�l�t�b�0�;��B"�E�/�ҽi��4nx�ɍA�F��o�tn�0�_��$���-�,��E��XT3��S�o}fح���V\�*@��\�O'����#T���.�A6KL}�<5��65��N�n��Q-�렠���\����@���;(}�Ȟ[��
�D���͝�%�.�L�KH
\�4�����Ĥ��,H̄}�����veRE�Y��R�:�s��A=ű����7��u;drg$>��`%fC|��Fb�6�]��Rm
ħB�TD�8���{ܞ�N�.W|��{����O�򚤻�$�:�y㱌%�.�UC|�V0
9��h�H�/]}f���!�]C�D����vC�C�F@��S��buV���w��p/AY3����#j9{��j
�-g�>���ͅ`�����"�|$I*V_�x\�E���w��Qg�
ֺ�em5��)����1�]=rF=I�X�L}��u9�%�,�>�
՛����v7���Bk�IK+�H.��E�4I,פ�p��p���V��|m!��V��m�`_s
8��Qxο@,c����3
�S��@ҍ��tQ_g���]�8�lҳ�ι�&}�٤���c8$�G�y6{0��R��%��`���S���9�@��N�nb��q�
ZOӌ]���f1�����-\�.U�g�0�Ule�=[tw�a���g*��D��e"�J����C5�����C�$�У����lR�/e=a���!�t�_e���Y9�`�F�#s�^|%����i|��t�Hi��-��KJN�QҸH�i+���6�c�y��W��+b��3�H�L&�ɼ������dz����R|#C��
���1���b�8��0bw𲥾��׎�]����U�3�v�����4Þ��
���o]���F��k��&�y�����&k���Ԟ�­��Vp��F�@Љ��P�Q���ǣ4�h�UJ�j�32���g�{C}m�7B�V�8��}���M���]}�����ŷ��
,3X�r�n���?/-g��0q^4F�d�gp�����4�0���sg�A��]�A�}�Bt.�$}$�	�NM~,"�`�
)*��
Z�DnC�����
$yI�KLA��͂d%�o;�/uʯH��o�����zRi�(�G���36��x�kf|�0�ab�t�[����ݚ�����s��\��a�}���C��I'.��pakg.��S�;�4�
e�@t��r�H�C���PQ��p�u��J.�KK���|��ࡑE��c����~�2�C`��eX�>k7!:���`/}E�락�-�V:Z����IKgƛ!:�if�C<�3VLn��=���"-#C�u��z7d�R��2�D,�=ʴ`R@Y��J`	?
�v�t]�X猁�wi����E�!�MċM��/bл�y�o�h�9"�ޒ���q��ԅ5�z��q�~�?̠MŒ�]
ApT�*~
�����.9¦cO�8�����q���=��s^o{+q؇{�}�ϑ�QGy�0[������_'�o��������|���(8GQ��퍲���V+�6�፶�̦�1曽'�YN�~�}�[-R5R/P_�1��E����=o�]:�n�T��mF�V�t@����Oǂ��~���䍷�V��Z��l�KeC`��
���=�phܿ*܃��E�4��A�{L�b�ْq�C
���=�p3����"u�
Vȇ5�W�Ƈ��U���U�1E��"Gt��U�#\���T���U��W��
��厛%��G̖�+��pV��6i����I�&�̠AP�N2�o��M���?�lA�Ϊm��M�����4k`z��wű��!��0��孮�gFP�S�3A9˭?El0O����������P
.�w���	�/{�[t��28��n<�'�[��oi�O�A���j����^MY��}Z�=ϝa�[3=�وzXQ��ն���Fө�}l:]�(���E�t��f��V�t[[=3le��(���Y�3�F�gO�%fܺǯ�%w��oY>�;E�KGC�q��o�wp�OݽZ۽����ΑO�2WG����~�y�L�����Ez�\h,�+�݌Eݳ��^5�m�,��{>ſ�6�O5��ϩ'����]c��͠�|�`��k�f������^w��	�{^��cE�Xa�c�Mߪjc���XU�!��~�6c�*��R�N=$RZ!��h��eo�����A�����idoJ(v��.3l��׵`���ψ2#�]�ʸ�t�
q�w^�DƗ���3�~s�A�>{[�w�bd�z-%�P�
��T�����A����(GOF;z�kY��ٱ���o����1g�����옃6�B�66�|���f��K�Ӭ����"��Ȧgj۩�^:.���O������<X���\,�s䰻��egt���4���ֱĎ-��S���n'�^&ݲ`��2�-�O�GRĖ�x�t~���E�N�^U$u
(���~G*
r�o��Aߞt���2��ޱ��{ː����
�Ya[񕶻�vVڡ�j���P}��E|�M��]�[kSy������u��ζH_Z�X�vo�3Y��m�;G*�BR�Z-ݛ��s|��M��7�h��������_o[\�-
�E�(
�K�����:�h}�ߛ����<���G�@
�fE�{�(�F;��N�榫f&�:��˅
��DZ�M6�)�	�m�NL�Sh_��V���
�:�H������c�5Jg�
�U����*׃��tn�C�
O�G�n��_��"5Y���i~4JONt�T�g�[`�c_�����Z����f���۵z�f*}���f0��k~���VF��H�����L_���Z��5��(�;+�[g���(��Ly8Q6z�"�6!�q�L�RG3w�Ne8�?���l1��<�b\�3a?03^�����eCc�~`fL�]�;.L��%1A��x'���&��m;�!c�,�-�2�R�Qޛ�޷������!L�̡��
���UH�<��k
�|�����9�˹��G��[wb�ܴ��>�F
r���(�&��m�/V����e3��|��Bs�]x�taE������]��r�P4"��y�Ua�*l��f?�x�ϟ��;%������n��=��?�!��45�U4�nu8�z�b�:�i�.1S���pl����^�0[=�s��9RS��{�+�6=��)awjؙ¯�/����5�~n�4����kB��Z֐�C���xPQrXIa�J��%ϾQR2t�Av�s�=[b�[�c�
��W��z�y�d��!���{�Ǭ�;V�j���>u���(��=i=y�|U6��_,J)|�I���{arXa��xGp����~e���!%��[�X�v�{yh��UH(�C�^.,.�
Zw������O�y<�a=p���^����7���į�H��Ͼ�y���*,,�B�Ko*\RT���YVv]�3�?|��libs/params.js000064400000005337151165346500007334
0ustar00/**
 * Visualizations Repeating Groups Helper
 *
 * @copyright: Copyright (C) 2005-2016  Media A-Team, Inc. - All rights
reserved.
 * @license:   GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

/**
 * This deals with viz admin settings when viz parameters can have
repeating groups.
 * It's still not the same code base as the form and table code so
refactoring at some
 * point would be good.
 * Not here we clone the actual /admin/com_fabrik/elements/ js classes
 * where as for forms and tables we have a controller class - called
admin.js in the plugin folder
 * to deal with cloning
 */

var RepeatParams = new Class({

	initialize:function(el, opts){
		this.opts = opts;
		this.el = $(el);
		this.counter = this.el.getElements('.repeatGroup').length - 1;
		//addButton
		this.el.getElement('.addButton').addEvent('click',
function(e){
			new Event(e).stop();
			var div = this.el.getElements('.repeatGroup').pop();
			//var c = div.clone();
			var newc = this.counter + 1;
			var id = div.id.replace('-' + this.counter, '-' +
newc);
			var c = new Element('div',
{'class':'repeatGroup',
'id':id}).set('html', div.innerHTML);
			c.inject(div, 'after');
			this.counter = newc;
			//update params ids
			if (this.counter != 0){
				c.getElements('input[name^=params],
select[name^=params]').each(function(i){
					var newPlugin = false;
					var newid = '';
					var oldid = i.id;
					if (i.id !== '') {
						var a = i.id.split('-');
						a.pop();
						var newid = a.join('-') + '-' + this.counter;
						i.id = newid;
					}

					if (Fabrik.adminElements.has(oldid)){
						var plugin = Fabrik.adminElements.get(oldid);
						newPlugin = new CloneObject(plugin, true, []);
						try{
							newPlugin.cloned(newid, this.counter);
						}catch(err){
							fconsole('no clone method available for ' + i.id);
						}
					}
					if (newPlugin !== false){
						Fabrik.adminElements.set(i.id, newPlugin);
					}
				}.bind(this));

				c.getElements('img[src=components/com_fabrik/images/ajax-loader.gif]').each(function(i){
					i.id = i.id.replace('-0_loader',
'-'+this.counter+'_loader');
				}.bind(this));
			}


			this.watchDeleteParamsGroup();
		}.bind(this));
		this.watchDeleteParamsGroup();
	},

	watchDeleteParamsGroup:function(){
		var dels = this.el.getParent().getElements('.delete');
		if (typeOf(dels) !== 'null'){
				dels.each(function(del){
				del.removeEvents();
				del.addEvent('click', function(e){
					e = new Event(e);
					//var divs = this.el.getElements('.repeatGroup');
					var divs = this.el.getParent().getElements('.repeatGroup');
					if (divs.length -1 > this.opts.repeatMin){
						$(e.target).getParent('.repeatGroup').remove();
					}
					e.stop();
					this.watchDeleteParamsGroup();
				}.bind(this));
			}.bind(this));
		}
	}
});libs/phpmimetypeclass/class.mime.php000064400000065365151165346500013655
0ustar00<?php
/**
 * @package MIME Types Class
 * @version 1.0
 * @author  Robert Widdick
 * @copyright Copyright (c) 2009 Robert Widdick - codehelpers.com
 * @license GNU GPL
 * @desc    Defines the class for mime types
 * @param   None
 * @returns Nothing
 * @example See example.php
 *
 * If you use this, all I ask is that you let me know! I'd like to see
who all uses this!
 * Also, credits would be much appreciated or a link back to
codehelpers.com! Thanks :)
 */

class MIMETypes {
  # Define some private variables
  private $mimeTypes = array(
  '3dm'    => 'x-world/x-3dmf',
  '3dmf'   => 'x-world/x-3dmf',
  'a'      => 'application/octet-stream',
  'aab'    => 'application/x-authorware-bin',
  'aam'    => 'application/x-authorware-map',
  'aas'    => 'application/x-authorware-seg',
  'abc'    => 'text/vnd.abc',
  'acgi'   => 'text/html',
  'afl'    => 'video/animaflex',
  'ai'     => 'application/postscript',
  'aif'    => 'audio/aiff',
  'aif'    => 'audio/x-aiff',
  'aifc'   => 'audio/aiff',
  'aifc'   => 'audio/x-aiff',
  'aiff'   => 'audio/aiff',
  'aiff'   => 'audio/x-aiff',
  'aim'    => 'application/x-aim',
  'aip'    => 'text/x-audiosoft-intra',
  'ani'    => 'application/x-navi-animation',
  'aos'    =>
'application/x-nokia-9000-communicator-add-on-software',
  'aps'    => 'application/mime',
  'arc'    => 'application/octet-stream',
  'arj'    => 'application/arj',
  'arj'    => 'application/octet-stream',
  'art'    => 'image/x-jg',
  'asf'    => 'video/x-ms-asf',
  'asm'    => 'text/x-asm',
  'asp'    => 'text/asp',
  'asx'    => 'application/x-mplayer2',
  'asx'    => 'video/x-ms-asf',
  'asx'    => 'video/x-ms-asf-plugin',
  'au'     => 'audio/basic',
  'au'     => 'audio/x-au',
  'avi'    => 'application/x-troff-msvideo',
  'avi'    => 'video/avi',
  'avi'    => 'video/msvideo',
  'avi'    => 'video/x-msvideo',
  'avs'    => 'video/avs-video',
  'bcpio'  => 'application/x-bcpio',
  'bin'    => 'application/mac-binary',
  'bin'    => 'application/macbinary',
  'bin'    => 'application/octet-stream',
  'bin'    => 'application/x-binary',
  'bin'    => 'application/x-macbinary',
  'bm'     => 'image/bmp',
  'bmp'    => 'image/bmp',
  'bmp'    => 'image/x-windows-bmp',
  'boo'    => 'application/book',
  'book'   => 'application/book',
  'boz'    => 'application/x-bzip2',
  'bsh'    => 'application/x-bsh',
  'bz'     => 'application/x-bzip',
  'bz2'    => 'application/x-bzip2',
  'c'      => 'text/plain',
  'c'      => 'text/x-c',
  'c++'    => 'text/plain',
  'cat'    => 'application/vnd.ms-pki.seccat',
  'cc'     => 'text/plain',
  'cc'     => 'text/x-c',
  'ccad'   => 'application/clariscad',
  'cco'    => 'application/x-cocoa',
  'cdf'    => 'application/cdf',
  'cdf'    => 'application/x-cdf',
  'cdf'    => 'application/x-netcdf',
  'cer'    => 'application/pkix-cert',
  'cer'    => 'application/x-x509-ca-cert',
  'cha'    => 'application/x-chat',
  'chat'   => 'application/x-chat',
  'class'  => 'application/java',
  'class'  => 'application/java-byte-code',
  'class'  => 'application/x-java-class',
  'com'    => 'application/octet-stream',
  'com'    => 'text/plain',
  'conf'   => 'text/plain',
  'cpio'   => 'application/x-cpio',
  'cpp'    => 'text/x-c',
  'cpt'    => 'application/mac-compactpro',
  'cpt'    => 'application/x-compactpro',
  'cpt'    => 'application/x-cpt',
  'crl'    => 'application/pkcs-crl',
  'crl'    => 'application/pkix-crl',
  'crt'    => 'application/pkix-cert',
  'crt'    => 'application/x-x509-ca-cert',
  'crt'    => 'application/x-x509-user-cert',
  'csh'    => 'application/x-csh',
  'csh'    => 'text/x-script.csh',
  'css'    => 'application/x-pointplus',
  'css'    => 'text/css',
  'cxx'    => 'text/plain',
  'dcr'    => 'application/x-director',
  'deepv'  => 'application/x-deepv',
  'def'    => 'text/plain',
  'der'    => 'application/x-x509-ca-cert',
  'dif'    => 'video/x-dv',
  'dir'    => 'application/x-director',
  'dl'     => 'video/dl',
  'dl'     => 'video/x-dl',
  'doc'    => 'application/msword',
  'dot'    => 'application/msword',
  'dp'     => 'application/commonground',
  'drw'    => 'application/drafting',
  'dump'   => 'application/octet-stream',
  'dv'     => 'video/x-dv',
  'dvi'    => 'application/x-dvi',
  'dwf'    => 'model/vnd.dwf',
  'dwg'    => 'application/acad',
  'dwg'    => 'image/vnd.dwg',
  'dwg'    => 'image/x-dwg',
  'dxf'    => 'application/dxf',
  'dxf'    => 'image/vnd.dwg',
  'dxf'    => 'image/x-dwg',
  'dxr'    => 'application/x-director',
  'el'     => 'text/x-script.elisp',
  'elc'    => 'application/x-bytecode.elisp',
  'elc'    => 'application/x-elc',
  'env'    => 'application/x-envoy',
  'eps'    => 'application/postscript',
  'es'     => 'application/x-esrehber',
  'etx'    => 'text/x-setext',
  'evy'    => 'application/envoy',
  'evy'    => 'application/x-envoy',
  'exe'    => 'application/octet-stream',
  'f'      => 'text/plain',
  'f'      => 'text/x-fortran',
  'f77'    => 'text/x-fortran',
  'f90'    => 'text/plain',
  'f90'    => 'text/x-fortran',
  'fdf'    => 'application/vnd.fdf',
  'fif'    => 'application/fractals',
  'fif'    => 'image/fif',
  'fli'    => 'video/fli',
  'fli'    => 'video/x-fli',
  'flo'    => 'image/florian',
  'flx'    => 'text/vnd.fmi.flexstor',
  'fmf'    => 'video/x-atomic3d-feature',
  'for'    => 'text/plain',
  'for'    => 'text/x-fortran',
  'fpx'    => 'image/vnd.fpx',
  'fpx'    => 'image/vnd.net-fpx',
  'frl'    => 'application/freeloader',
  'funk'   => 'audio/make',
  'g'      => 'text/plain',
  'g3'     => 'image/g3fax',
  'gif'    => 'image/gif',
  'gl'     => 'video/gl',
  'gl'     => 'video/x-gl',
  'gsd'    => 'audio/x-gsm',
  'gsm'    => 'audio/x-gsm',
  'gsp'    => 'application/x-gsp',
  'gss'    => 'application/x-gss',
  'gtar'   => 'application/x-gtar',
  'gz'     => 'application/x-compressed',
  'gz'     => 'application/x-gzip',
  'gzip'   => 'application/x-gzip',
  'gzip'   => 'multipart/x-gzip',
  'h'      => 'text/plain',
  'h'      => 'text/x-h',
  'hdf'    => 'application/x-hdf',
  'help'   => 'application/x-helpfile',
  'hgl'    => 'application/vnd.hp-hpgl',
  'hh'     => 'text/plain',
  'hh'     => 'text/x-h',
  'hlb'    => 'text/x-script',
  'hlp'    => 'application/hlp',
  'hlp'    => 'application/x-helpfile',
  'hlp'    => 'application/x-winhelp',
  'hpg'    => 'application/vnd.hp-hpgl',
  'hpgl'   => 'application/vnd.hp-hpgl',
  'hqx'    => 'application/binhex',
  'hqx'    => 'application/binhex4',
  'hqx'    => 'application/mac-binhex',
  'hqx'    => 'application/mac-binhex40',
  'hqx'    => 'application/x-binhex40',
  'hqx'    => 'application/x-mac-binhex40',
  'hta'    => 'application/hta',
  'htc'    => 'text/x-component',
  'htm'    => 'text/html',
  'html'   => 'text/html',
  'htmls'  => 'text/html',
  'htt'    => 'text/webviewhtml',
  'htx'    => 'text/html',
  'ice'    => 'x-conference/x-cooltalk',
  'ico'    => 'image/x-icon',
  'idc'    => 'text/plain',
  'ief'    => 'image/ief',
  'iefs'   => 'image/ief',
  'iges'   => 'application/iges',
  'iges'   => 'model/iges',
  'igs'    => 'application/iges',
  'igs'    => 'model/iges',
  'ima'    => 'application/x-ima',
  'imap'   => 'application/x-httpd-imap',
  'inf'    => 'application/inf',
  'ins'    => 'application/x-internett-signup',
  'ip'     => 'application/x-ip2',
  'isu'    => 'video/x-isvideo',
  'it'     => 'audio/it',
  'iv'     => 'application/x-inventor',
  'ivr'    => 'i-world/i-vrml',
  'ivy'    => 'application/x-livescreen',
  'jam'    => 'audio/x-jam',
  'jav'    => 'text/plain',
  'jav'    => 'text/x-java-source',
  'java'   => 'text/plain',
  'java'   => 'text/x-java-source',
  'jcm'    => 'application/x-java-commerce',
  'jfif'   => 'image/jpeg',
  'jfif'   => 'image/pjpeg',
  'jfif-tbnl' => 'image/jpeg',
  'jpe'    => 'image/jpeg',
  'jpe'    => 'image/pjpeg',
  'jpeg'   => 'image/jpeg',
  'jpeg'   => 'image/pjpeg',
  'jpg'    => 'image/jpeg',
  'jpg'    => 'image/pjpeg',
  'jps'    => 'image/x-jps',
  'js'     => 'application/x-javascript',
  'jut'    => 'image/jutvision',
  'kar'    => 'audio/midi',
  'kar'    => 'music/x-karaoke',
  'ksh'    => 'application/x-ksh',
  'ksh'    => 'text/x-script.ksh',
  'la'     => 'audio/nspaudio',
  'la'     => 'audio/x-nspaudio',
  'lam'    => 'audio/x-liveaudio',
  'latex'  => 'application/x-latex',
  'lha'    => 'application/lha',
  'lha'    => 'application/octet-stream',
  'lha'    => 'application/x-lha',
  'lhx'    => 'application/octet-stream',
  'list'   => 'text/plain',
  'lma'    => 'audio/nspaudio',
  'lma'    => 'audio/x-nspaudio',
  'log'    => 'text/plain',
  'lsp'    => 'application/x-lisp',
  'lsp'    => 'text/x-script.lisp',
  'lst'    => 'text/plain',
  'lsx'    => 'text/x-la-asf',
  'ltx'    => 'application/x-latex',
  'lzh'    => 'application/octet-stream',
  'lzh'    => 'application/x-lzh',
  'lzx'    => 'application/lzx',
  'lzx'    => 'application/octet-stream',
  'lzx'    => 'application/x-lzx',
  'm'      => 'text/plain',
  'm'      => 'text/x-m',
  'm1v'    => 'video/mpeg',
  'm2a'    => 'audio/mpeg',
  'm2v'    => 'video/mpeg',
  'm3u'    => 'audio/x-mpequrl',
  'man'    => 'application/x-troff-man',
  'map'    => 'application/x-navimap',
  'mar'    => 'text/plain',
  'mbd'    => 'application/mbedlet',
  'mc$'    => 'application/x-magic-cap-package-1.0',
  'mcd'    => 'application/mcad',
  'mcd'    => 'application/x-mathcad',
  'mcf'    => 'image/vasa',
  'mcf'    => 'text/mcf',
  'mcp'    => 'application/netmc',
  'me'     => 'application/x-troff-me',
  'mht'    => 'message/rfc822',
  'mhtml'  => 'message/rfc822',
  'mid'    => 'application/x-midi',
  'mid'    => 'audio/midi',
  'mid'    => 'audio/x-mid',
  'mid'    => 'audio/x-midi',
  'mid'    => 'music/crescendo',
  'mid'    => 'x-music/x-midi',
  'midi'   => 'application/x-midi',
  'midi'   => 'audio/midi',
  'midi'   => 'audio/x-mid',
  'midi'   => 'audio/x-midi',
  'midi'   => 'music/crescendo',
  'midi'   => 'x-music/x-midi',
  'mif'    => 'application/x-frame',
  'mif'    => 'application/x-mif',
  'mime'   => 'message/rfc822',
  'mime'   => 'www/mime',
  'mjf'    =>
'audio/x-vnd.audioexplosion.mjuicemediafile',
  'mjpg'   => 'video/x-motion-jpeg',
  'mm'     => 'application/base64',
  'mm'     => 'application/x-meme',
  'mme'    => 'application/base64',
  'mod'    => 'audio/mod',
  'mod'    => 'audio/x-mod',
  'moov'   => 'video/quicktime',
  'mov'    => 'video/quicktime',
  'movie'  => 'video/x-sgi-movie',
  'mp2'    => 'audio/mpeg',
  'mp2'    => 'audio/x-mpeg',
  'mp2'    => 'video/mpeg',
  'mp2'    => 'video/x-mpeg',
  'mp2'    => 'video/x-mpeq2a',
  'mp3'    => 'audio/mpeg3',
  'mp3'    => 'audio/x-mpeg-3',
  'mp3'    => 'video/mpeg',
  'mp3'    => 'video/x-mpeg',
  'mpa'    => 'audio/mpeg',
  'mpa'    => 'video/mpeg',
  'mpc'    => 'application/x-project',
  'mpe'    => 'video/mpeg',
  'mpeg'   => 'video/mpeg',
  'mpg'    => 'audio/mpeg',
  'mpg'    => 'video/mpeg',
  'mpga'   => 'audio/mpeg',
  'mpp'    => 'application/vnd.ms-project',
  'mpt'    => 'application/x-project',
  'mpv'    => 'application/x-project',
  'mpx'    => 'application/x-project',
  'mrc'    => 'application/marc',
  'ms'     => 'application/x-troff-ms',
  'mv'     => 'video/x-sgi-movie',
  'my'     => 'audio/make',
  'mzz'    =>
'application/x-vnd.audioexplosion.mzz',
  'nap'    => 'image/naplps',
  'naplps' => 'image/naplps',
  'nc'     => 'application/x-netcdf',
  'ncm'    =>
'application/vnd.nokia.configuration-message',
  'nif'    => 'image/x-niff',
  'niff'   => 'image/x-niff',
  'nix'    => 'application/x-mix-transfer',
  'nsc'    => 'application/x-conference',
  'nvd'    => 'application/x-navidoc',
  'o'      => 'application/octet-stream',
  'oda'    => 'application/oda',
  'ogg'    => 'audio/ogg',
  'omc'    => 'application/x-omc',
  'omcd'   => 'application/x-omcdatamaker',
  'omcr'   => 'application/x-omcregerator',
  'p'      => 'text/x-pascal',
  'p10'    => 'application/pkcs10',
  'p10'    => 'application/x-pkcs10',
  'p12'    => 'application/pkcs-12',
  'p12'    => 'application/x-pkcs12',
  'p7a'    => 'application/x-pkcs7-signature',
  'p7c'    => 'application/pkcs7-mime',
  'p7c'    => 'application/x-pkcs7-mime',
  'p7m'    => 'application/pkcs7-mime',
  'p7m'    => 'application/x-pkcs7-mime',
  'p7r'    => 'application/x-pkcs7-certreqresp',
  'p7s'    => 'application/pkcs7-signature',
  'part'   => 'application/pro_eng',
  'pas'    => 'text/pascal',
  'pbm'    => 'image/x-portable-bitmap',
  'pcl'    => 'application/vnd.hp-pcl',
  'pcl'    => 'application/x-pcl',
  'pct'    => 'image/x-pict',
  'pcx'    => 'image/x-pcx',
  'pdb'    => 'chemical/x-pdb',
  'pdf'    => 'application/pdf',
  'pfunk'  => 'audio/make',
  'pfunk'  => 'audio/make.my.funk',
  'pgm'    => 'image/x-portable-graymap',
  'pgm'    => 'image/x-portable-greymap',
  'pic'    => 'image/pict',
  'pict'   => 'image/pict',
  'pkg'    => 'application/x-newton-compatible-pkg',
  'pko'    => 'application/vnd.ms-pki.pko',
  'pl'     => 'text/plain',
  'pl'     => 'text/x-script.perl',
  'plx'    => 'application/x-pixclscript',
  'pm'     => 'image/x-xpixmap',
  'pm'     => 'text/x-script.perl-module',
  'pm4'    => 'application/x-pagemaker',
  'pm5'    => 'application/x-pagemaker',
  'png'    => 'image/png',
  'pnm'    => 'application/x-portable-anymap',
  'pnm'    => 'image/x-portable-anymap',
  'pot'    => 'application/mspowerpoint',
  'pot'    => 'application/vnd.ms-powerpoint',
  'pov'    => 'model/x-pov',
  'ppa'    => 'application/vnd.ms-powerpoint',
  'ppm'    => 'image/x-portable-pixmap',
  'pps'    => 'application/mspowerpoint',
  'pps'    => 'application/vnd.ms-powerpoint',
  'ppt'    => 'application/mspowerpoint',
  'ppt'    => 'application/powerpoint',
  'ppt'    => 'application/vnd.ms-powerpoint',
  'ppt'    => 'application/x-mspowerpoint',
  'ppz'    => 'application/mspowerpoint',
  'pre'    => 'application/x-freelance',
  'prt'    => 'application/pro_eng',
  'ps'     => 'application/postscript',
  'psd'    => 'application/octet-stream',
  'pvu'    => 'paleovu/x-pv',
  'pwz'    => 'application/vnd.ms-powerpoint',
  'py'     => 'text/x-script.phyton',
  'pyc'    => 'applicaiton/x-bytecode.python',
  'qcp'    => 'audio/vnd.qcelp',
  'qd3'    => 'x-world/x-3dmf',
  'qd3d'   => 'x-world/x-3dmf',
  'qif'    => 'image/x-quicktime',
  'qt'     => 'video/quicktime',
  'qtc'    => 'video/x-qtc',
  'qti'    => 'image/x-quicktime',
  'qtif'   => 'image/x-quicktime',
  'ra'     => 'audio/x-pn-realaudio',
  'ra'     => 'audio/x-pn-realaudio-plugin',
  'ra'     => 'audio/x-realaudio',
  'ram'    => 'audio/x-pn-realaudio',
  'ras'    => 'application/x-cmu-raster',
  'ras'    => 'image/cmu-raster',
  'ras'    => 'image/x-cmu-raster',
  'rast'   => 'image/cmu-raster',
  'rexx'   => 'text/x-script.rexx',
  'rf'     => 'image/vnd.rn-realflash',
  'rgb'    => 'image/x-rgb',
  'rm'     => 'application/vnd.rn-realmedia',
  'rm'     => 'audio/x-pn-realaudio',
  'rmi'    => 'audio/mid',
  'rmm'    => 'audio/x-pn-realaudio',
  'rmp'    => 'audio/x-pn-realaudio',
  'rmp'    => 'audio/x-pn-realaudio-plugin',
  'rng'    => 'application/ringing-tones',
  'rng'    => 'application/vnd.nokia.ringing-tone',
  'rnx'    => 'application/vnd.rn-realplayer',
  'roff'   => 'application/x-troff',
  'rp'     => 'image/vnd.rn-realpix',
  'rpm'    => 'audio/x-pn-realaudio-plugin',
  'rt'     => 'text/richtext',
  'rt'     => 'text/vnd.rn-realtext',
  'rtf'    => 'application/rtf',
  'rtf'    => 'application/x-rtf',
  'rtf'    => 'text/richtext',
  'rtx'    => 'application/rtf',
  'rtx'    => 'text/richtext',
  'rv'     => 'video/vnd.rn-realvideo',
  's'      => 'text/x-asm',
  's3m'    => 'audio/s3m',
  'saveme' => 'application/octet-stream',
  'sbk'    => 'application/x-tbook',
  'scm'    => 'application/x-lotusscreencam',
  'scm'    => 'text/x-script.guile',
  'scm'    => 'text/x-script.scheme',
  'scm'    => 'video/x-scm',
  'sdml'   => 'text/plain',
  'sdp'    => 'application/sdp',
  'sdp'    => 'application/x-sdp',
  'sdr'    => 'application/sounder',
  'sea'    => 'application/sea',
  'sea'    => 'application/x-sea',
  'set'    => 'application/set',
  'sgm'    => 'text/sgml',
  'sgm'    => 'text/x-sgml',
  'sgml'   => 'text/sgml',
  'sgml'   => 'text/x-sgml',
  'sh'     => 'application/x-bsh',
  'sh'     => 'application/x-sh',
  'sh'     => 'application/x-shar',
  'sh'     => 'text/x-script.sh',
  'shar'   => 'application/x-bsh',
  'shar'   => 'application/x-shar',
  'shtml'  => 'text/html',
  'shtml'  => 'text/x-server-parsed-html',
  'sid'    => 'audio/x-psid',
  'sit'    => 'application/x-sit',
  'sit'    => 'application/x-stuffit',
  'skd'    => 'application/x-koan',
  'skm'    => 'application/x-koan',
  'skp'    => 'application/x-koan',
  'skt'    => 'application/x-koan',
  'sl'     => 'application/x-seelogo',
  'smi'    => 'application/smil',
  'smil'   => 'application/smil',
  'snd'    => 'audio/basic',
  'snd'    => 'audio/x-adpcm',
  'sol'    => 'application/solids',
  'spc'    => 'application/x-pkcs7-certificates',
  'spc'    => 'text/x-speech',
  'spl'    => 'application/futuresplash',
  'spr'    => 'application/x-sprite',
  'sprite' => 'application/x-sprite',
  'src'    => 'application/x-wais-source',
  'ssi'    => 'text/x-server-parsed-html',
  'ssm'    => 'application/streamingmedia',
  'sst'    => 'application/vnd.ms-pki.certstore',
  'step'   => 'application/step',
  'stl'    => 'application/sla',
  'stl'    => 'application/vnd.ms-pki.stl',
  'stl'    => 'application/x-navistyle',
  'stp'    => 'application/step',
  'sv4cpio'=> 'application/x-sv4cpio',
  'sv4crc' => 'application/x-sv4crc',
  'svf'    => 'image/vnd.dwg',
  'svf'    => 'image/x-dwg',
  'svr'    => 'application/x-world',
  'svr'    => 'x-world/x-svr',
  'swf'    => 'application/x-shockwave-flash',
  't'      => 'application/x-troff',
  'talk'   => 'text/x-speech',
  'tar'    => 'application/x-tar',
  'tbk'    => 'application/toolbook',
  'tbk'    => 'application/x-tbook',
  'tcl'    => 'application/x-tcl',
  'tcl'    => 'text/x-script.tcl',
  'tcsh'   => 'text/x-script.tcsh',
  'tex'    => 'application/x-tex',
  'texi'   => 'application/x-texinfo',
  'texinfo'=> 'application/x-texinfo',
  'text'   => 'application/plain',
  'text'   => 'text/plain',
  'tgz'    => 'application/gnutar',
  'tgz'    => 'application/x-compressed',
  'tif'    => 'image/tiff',
  'tif'    => 'image/x-tiff',
  'tiff'   => 'image/tiff',
  'tiff'   => 'image/x-tiff',
  'tr'     => 'application/x-troff',
  'tsi'    => 'audio/tsp-audio',
  'tsp'    => 'application/dsptype',
  'tsp'    => 'audio/tsplayer',
  'tsv'    => 'text/tab-separated-values',
  'turbot' => 'image/florian',
  'txt'    => 'text/plain',
  'uil'    => 'text/x-uil',
  'uni'    => 'text/uri-list',
  'unis'   => 'text/uri-list',
  'unv'    => 'application/i-deas',
  'uri'    => 'text/uri-list',
  'uris'   => 'text/uri-list',
  'ustar'  => 'application/x-ustar',
  'ustar'  => 'multipart/x-ustar',
  'uu'     => 'application/octet-stream',
  'uu'     => 'text/x-uuencode',
  'uue'    => 'text/x-uuencode',
  'vcd'    => 'application/x-cdlink',
  'vcs'    => 'text/x-vcalendar',
  'vda'    => 'application/vda',
  'vdo'    => 'video/vdo',
  'vew'    => 'application/groupwise',
  'viv'    => 'video/vivo',
  'viv'    => 'video/vnd.vivo',
  'vivo'   => 'video/vivo',
  'vivo'   => 'video/vnd.vivo',
  'vmd'    => 'application/vocaltec-media-desc',
  'vmf'    => 'application/vocaltec-media-file',
  'voc'    => 'audio/voc',
  'voc'    => 'audio/x-voc',
  'vos'    => 'video/vosaic',
  'vox'    => 'audio/voxware',
  'vqe'    => 'audio/x-twinvq-plugin',
  'vqf'    => 'audio/x-twinvq',
  'vql'    => 'audio/x-twinvq-plugin',
  'vrml'   => 'application/x-vrml',
  'vrml'   => 'model/vrml',
  'vrml'   => 'x-world/x-vrml',
  'vrt'    => 'x-world/x-vrt',
  'vsd'    => 'application/x-visio',
  'vst'    => 'application/x-visio',
  'vsw'    => 'application/x-visio',
  'w60'    => 'application/wordperfect6.0',
  'w61'    => 'application/wordperfect6.1',
  'w6w'    => 'application/msword',
  'wav'    => 'audio/wav',
  'wav'    => 'audio/x-wav',
  'wb1'    => 'application/x-qpro',
  'wbmp'   => 'image/vnd.wap.wbmp',
  'web'    => 'application/vnd.xara',
  'wiz'    => 'application/msword',
  'wk1'    => 'application/x-123',
  'wmf'    => 'windows/metafile',
  'wml'    => 'text/vnd.wap.wml',
  'wmlc'   => 'application/vnd.wap.wmlc',
  'wmls'   => 'text/vnd.wap.wmlscript',
  'wmlsc'  => 'application/vnd.wap.wmlscriptc',
  'word'   => 'application/msword',
  'wp'     => 'application/wordperfect',
  'wp5'    => 'application/wordperfect',
  'wp5'    => 'application/wordperfect6.0',
  'wp6'    => 'application/wordperfect',
  'wpd'    => 'application/wordperfect',
  'wpd'    => 'application/x-wpwin',
  'wq1'    => 'application/x-lotus',
  'wri'    => 'application/mswrite',
  'wri'    => 'application/x-wri',
  'wrl'    => 'application/x-world',
  'wrl'    => 'model/vrml',
  'wrl'    => 'x-world/x-vrml',
  'wrz'    => 'model/vrml',
  'wrz'    => 'x-world/x-vrml',
  'wsc'    => 'text/scriplet',
  'wsrc'   => 'application/x-wais-source',
  'wtk'    => 'application/x-wintalk',
  'xbm'    => 'image/x-xbitmap',
  'xbm'    => 'image/x-xbm',
  'xbm'    => 'image/xbm',
  'xdr'    => 'video/x-amt-demorun',
  'xgz'    => 'xgl/drawing',
  'xif'    => 'image/vnd.xiff',
  'xl'     => 'application/excel',
  'xla'    => 'application/excel',
  'xla'    => 'application/x-excel',
  'xla'    => 'application/x-msexcel',
  'xlb'    => 'application/excel',
  'xlb'    => 'application/vnd.ms-excel',
  'xlb'    => 'application/x-excel',
  'xlc'    => 'application/excel',
  'xlc'    => 'application/vnd.ms-excel',
  'xlc'    => 'application/x-excel',
  'xld'    => 'application/excel',
  'xld'    => 'application/x-excel',
  'xlk'    => 'application/excel',
  'xlk'    => 'application/x-excel',
  'xll'    => 'application/excel',
  'xll'    => 'application/vnd.ms-excel',
  'xll'    => 'application/x-excel',
  'xlm'    => 'application/excel',
  'xlm'    => 'application/vnd.ms-excel',
  'xlm'    => 'application/x-excel',
  'xls'    => 'application/excel',
  'xls'    => 'application/vnd.ms-excel',
  'xls'    => 'application/x-excel',
  'xls'    => 'application/x-msexcel',
  'xlt'    => 'application/excel',
  'xlt'    => 'application/x-excel',
  'xlv'    => 'application/excel',
  'xlv'    => 'application/x-excel',
  'xlw'    => 'application/excel',
  'xlw'    => 'application/vnd.ms-excel',
  'xlw'    => 'application/x-excel',
  'xlw'    => 'application/x-msexcel',
  'xm'     => 'audio/xm',
  'xml'    => 'application/xml',
  'xml'    => 'text/xml',
  'xmz'    => 'xgl/movie',
  'xpix'   => 'application/x-vnd.ls-xpix',
  'xpm'    => 'image/x-xpixmap',
  'xpm'    => 'image/xpm',
  'x-png'  => 'image/png',
  'xsr'    => 'video/x-amt-showrun',
  'xwd'    => 'image/x-xwd',
  'xwd'    => 'image/x-xwindowdump',
  'xyz'    => 'chemical/x-pdb',
  'z'      => 'application/x-compress',
  'z'      => 'application/x-compressed',
  'zip'    => 'application/x-compressed',
  'zip'    => 'application/x-zip-compressed',
  'zip'    => 'application/zip',
  'zip'    => 'multipart/x-zip',
  'zoo'    => 'application/octet-stream',
  'zsh'    => 'text/x-script.zsh',
  'txt'    => 'text/plain',
  'htm'    => 'text/html',
  'html'   => 'text/html',
  'php'    => 'application/x-httpd-php',
  'phps'   => 'application/x-httpd-phps',
  'css'    => 'text/css',
  'js'     => 'application/javascript',
  'json'   => 'application/json',
  'xml'    => 'application/xml',
  'swf'    => 'application/x-shockwave-flash',
  'flv'    => 'video/x-flv',
  'asc'    => 'text/plain',
  'atom'   => 'application/atom+xml',
  'bcpio'  => 'application/x-bcpio',
  'png'    => 'image/png',
  'jpe'    => 'image/jpeg',
  'jpeg'   => 'image/jpeg',
  'jpg'    => 'image/jpeg',
  'gif'    => 'image/gif',
  'bmp'    => 'image/bmp',
  'ico'    => 'image/vnd.microsoft.icon',
  'tiff'   => 'image/tiff',
  'tif'    => 'image/tiff',
  'svg'    => 'image/svg+xml',
  'svgz'   => 'image/svg+xml',
  'zip'    => 'application/zip',
  'rar'    => 'application/x-rar-compressed',
  'exe'    => 'application/x-msdownload',
  'msi'    => 'application/x-msdownload',
  'cab'    => 'application/vnd.ms-cab-compressed',
  'mp3'    => 'audio/mpeg',
  'qt'     => 'video/quicktime',
  'mov'    => 'video/quicktime',
  'au'     => 'audio/basic',
  'avi'    => 'video/x-msvideo',
  'pdf'    => 'application/pdf',
  'psd'    => 'image/vnd.adobe.photoshop',
  'ai'     => 'application/postscript',
  'eps'    => 'application/postscript',
  'ps'     => 'application/postscript',
  'aif'    => 'audio/x-aiff',
  'aifc'   => 'audio/x-aiff',
  'aiff'   => 'audio/x-aiff',
  'doc'    => 'application/msword',
  'rtf'    => 'application/rtf',
  'xls'    => 'application/vnd.ms-excel',
  'ppt'    => 'application/vnd.ms-powerpoint',
  'odt'    =>
'application/vnd.oasis.opendocument.text',
  'ods'    =>
'application/vnd.oasis.opendocument.spreadsheet',
  'swf'    => 'application/x-shockwave-flash',
  'swf'    =>
'application/x-shockwave-flash2-preview',
  'swf'    => 'application/futuresplash',
  'swf'    => 'image/vnd.rn-realflash'
);


  /**
  * @desc Initiate variables and include mime types
* @param String $MIMEFile The MIME File location, if not changed,
mime.types.php
  * @return Nothing
  */
  public function __construct($MIMEFile = "mime.types.php") {
    //require_once $MIMEFile;
    //$this -> mimeTypes = $types;
    //unset($types);
  }

  /**
  * @desc Free up some memory
* @param None
  * @returns Nothing
  */
  public function __destruct() {
    //unset($this);
  }

  /**
  * @desc Retrieve the corresponding MIME type, if one exists
* @param String $file File Name (relative location such as
"image_test.jpg" or full
"http://site.com/path/to/image_test.jpg")
  * @return String $MIMEType - The type of the file passed in the argument
  */
  public function getMimeType($file = NULL) {
    if(is_file($file)) {
      /**
      * Attempts to retrieve file info from FINFO
      * If FINFO functions are not available then try to retrieve MIME type
from pre-defined MIMEs
      * If MIME type doesn't exist, then try (as a last resort) to use
the (deprecated) mime_content_type function
      * If all else fails, just return application/octet-stream
      */
      if(!function_exists("finfo_open")) {
        $extension = $this -> getExtension($file);
        if(array_key_exists($extension, $this -> mimeTypes)) {
          return $this -> mimeTypes[$extension];
        } else {
          if(function_exists("mime_content_type")) {
            $type = mime_content_type($file);
            return !empty($type) ? $type :
"application/octet-stream";
          } else {
            return "application/octet-stream";
          }
        }
      } else {
        $finfo = finfo_open(FILEINFO_MIME);
        $MIMEType = finfo_file($finfo, $file);
        finfo_close($finfo);
        return $MIMEType;
      }
    } else return "##INVALID_FILE##FILE=".$file."##";
  }

  /**
  * @desc Gets the file extention from a string
* @param String $file The full file name
  * @return String $ext The file extension
  */
  private function getExtension($file = NULL) {
    if(!is_null($file)) {
    	$bits = explode('.', $file);
    	$ext = array_pop($bits);
      $ext = strtolower($ext);
      return $ext;
    } else return "##INVALID_FILE##FILE=".$file."##";
  }
}

?>libs/phpmimetypeclass/example.php000064400000003435151165346500013243
0ustar00<?php

/**
* @package MIME Types Class
* @version 1.0
* @author  Robert Widdick
* @copyright Copyright (c) 2009 Robert Widdick - codehelpers.com
* @license GNU GPL
* @desc    An example of how to use the class
* @param   None
* @returns Nothing
* @example This is the example!
*
* If you use this, all I ask is that you let me know! I'd like to see
who all uses this!
* Also, credits would be much appreciated or a link back to
codehelpers.com! Thanks :)
*/

# Include the MIME Type Class
include "class.mime.php";

# Set the directory to show files in
$dir = ".";
if(is_dir($dir)) {
  if($dh = opendir($dir)) {
    $buffer = '
<table width="100%" cellspacing="5"
cellpadding="5" border="0">
<tr>
  <td><strong><u>File
Name</u></strong></td>
  <td><strong><u>File
Size</u></strong></td>
  <td><strong><u>File
Type</u></strong></td>
</tr>';

    # Define some variables
    $totalSizes = 0;
    $totalFiles = 0;

    # Define the MIME Type class object
    $mime = new MIMETypes();

    while(($file = readdir($dh)) !== false) {
      # Check to see if the file isn't a directory
      if($file != "." && $file != ".."
&& is_file($file) && !is_dir($file)) {
        # Increment total number of files
        $totalFiles ++;

        # Increment total file sizes (combined file sizes)
        $totalSizes += filesize($file);
        $buffer .= '
<tr>
  <td>'.$file.'</td>
  <td>'.filesize($file).' bytes</td>
  <td>'.$mime -> getMimeType($file).'</td>
</tr>
';
      }
    }
    closedir($dh);
    $buffer .= '</table>';

    # Check to see if there were any files at all
    if($totalFiles > 0) {
      # Yes there are files, output the buffer
      echo $buffer;
    } else {
      # No, there are no files
      echo "There are no files in directory
&quot;$dir&quot;";
    }
  }
} else die("Invalid directory $dir");

?>libs/phpmimetypeclass/LICENSE.txt000064400000104513151165346500012721
0ustar00                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly
explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public
License.

  "Copyright" also means copyright-like laws that apply to other
kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under
this
License.  Each licensee is addressed as "you". 
"Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of
the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of
the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work
based
on the Program.

  To "propagate" a work means to do anything with it that,
without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables
other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal
Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the
work
for making modifications to it.  "Object code" means any
non-source
form of a work.

  A "Standard Interface" means an interface that either is an
official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything,
other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential
component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means
all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are
not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product",
which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to
a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any
methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of
this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control
of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under
this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor
version".

  A contributor's "essential patent claims" are all patent
claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to
grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any
express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license
to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you
have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include
within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is
found.

    <one line to give the program's name and a brief idea of what
it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see
<http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show
w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the
appropriate
parts of the General Public License.  Of course, your program's
commands
might be different; for a GUI interface, you would use an "about
box".

  You should also get your employer (if you work as a programmer) or
school,
if any, to sign a "copyright disclaimer" for the program, if
necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
libs/phpmimetypeclass/mime.types.php000064400000064624151165346500013711
0ustar00<?php

/**
* @package MIME Types Class
* @version 1.1
* @author  Robert Widdick
* @license GNU GPL
* @desc    Gather all known mime types (may be missing several and have
duplicates in which you can remove yourself)
* @param   None
* @returns Nothing
* @example See example.php
* @updated 10/19/2010
*
* If you use this, all I ask is that you let me know! I'd like to see
who all uses this! No credits necessary
*
* Please note, in $types there are duplicate entries -- it's up to you
to determine what type of file is what for duplicates.
* I would have done this, but in some cases, I could have been incorrect.
If duplicates aren't removed, the last occurances will take
precedence, even when displaying the list.
* Reason being, if the key has been set already, it will overwrite that
key.
*
* Oh, and, if you happen to add onto this list, please email me
robertark[-at-]gmail[-dot-]com and I'll add it to the package @
phpclasses!
*
* Thanks, Robert
*/
$types = array(
  '3dm'    => 'x-world/x-3dmf',
  '3dmf'   => 'x-world/x-3dmf',
  'a'      => 'application/octet-stream',
  'aab'    => 'application/x-authorware-bin',
  'aam'    => 'application/x-authorware-map',
  'aas'    => 'application/x-authorware-seg',
  'abc'    => 'text/vnd.abc',
  'acgi'   => 'text/html',
  'afl'    => 'video/animaflex',
  'ai'     => 'application/postscript',
  'aif'    => 'audio/aiff',
  'aif'    => 'audio/x-aiff',
  'aifc'   => 'audio/aiff',
  'aifc'   => 'audio/x-aiff',
  'aiff'   => 'audio/aiff',
  'aiff'   => 'audio/x-aiff',
  'aim'    => 'application/x-aim',
  'aip'    => 'text/x-audiosoft-intra',
  'ani'    => 'application/x-navi-animation',
  'aos'    =>
'application/x-nokia-9000-communicator-add-on-software',
  'aps'    => 'application/mime',
  'arc'    => 'application/octet-stream',
  'arj'    => 'application/arj',
  'arj'    => 'application/octet-stream',
  'art'    => 'image/x-jg',
  'asf'    => 'video/x-ms-asf',
  'asm'    => 'text/x-asm',
  'asp'    => 'text/asp',
  'asx'    => 'application/x-mplayer2',
  'asx'    => 'video/x-ms-asf',
  'asx'    => 'video/x-ms-asf-plugin',
  'au'     => 'audio/basic',
  'au'     => 'audio/x-au',
  'avi'    => 'application/x-troff-msvideo',
  'avi'    => 'video/avi',
  'avi'    => 'video/msvideo',
  'avi'    => 'video/x-msvideo',
  'avs'    => 'video/avs-video',
  'bcpio'  => 'application/x-bcpio',
  'bin'    => 'application/mac-binary',
  'bin'    => 'application/macbinary',
  'bin'    => 'application/octet-stream',
  'bin'    => 'application/x-binary',
  'bin'    => 'application/x-macbinary',
  'bm'     => 'image/bmp',
  'bmp'    => 'image/bmp',
  'bmp'    => 'image/x-windows-bmp',
  'boo'    => 'application/book',
  'book'   => 'application/book',
  'boz'    => 'application/x-bzip2',
  'bsh'    => 'application/x-bsh',
  'bz'     => 'application/x-bzip',
  'bz2'    => 'application/x-bzip2',
  'c'      => 'text/plain',
  'c'      => 'text/x-c',
  'c++'    => 'text/plain',
  'cat'    => 'application/vnd.ms-pki.seccat',
  'cc'     => 'text/plain',
  'cc'     => 'text/x-c',
  'ccad'   => 'application/clariscad',
  'cco'    => 'application/x-cocoa',
  'cdf'    => 'application/cdf',
  'cdf'    => 'application/x-cdf',
  'cdf'    => 'application/x-netcdf',
  'cer'    => 'application/pkix-cert',
  'cer'    => 'application/x-x509-ca-cert',
  'cha'    => 'application/x-chat',
  'chat'   => 'application/x-chat',
  'class'  => 'application/java',
  'class'  => 'application/java-byte-code',
  'class'  => 'application/x-java-class',
  'com'    => 'application/octet-stream',
  'com'    => 'text/plain',
  'conf'   => 'text/plain',
  'cpio'   => 'application/x-cpio',
  'cpp'    => 'text/x-c',
  'cpt'    => 'application/mac-compactpro',
  'cpt'    => 'application/x-compactpro',
  'cpt'    => 'application/x-cpt',
  'crl'    => 'application/pkcs-crl',
  'crl'    => 'application/pkix-crl',
  'crt'    => 'application/pkix-cert',
  'crt'    => 'application/x-x509-ca-cert',
  'crt'    => 'application/x-x509-user-cert',
  'csh'    => 'application/x-csh',
  'csh'    => 'text/x-script.csh',
  'css'    => 'application/x-pointplus',
  'css'    => 'text/css',
  'cxx'    => 'text/plain',
  'dcr'    => 'application/x-director',
  'deepv'  => 'application/x-deepv',
  'def'    => 'text/plain',
  'der'    => 'application/x-x509-ca-cert',
  'dif'    => 'video/x-dv',
  'dir'    => 'application/x-director',
  'dl'     => 'video/dl',
  'dl'     => 'video/x-dl',
  'doc'    => 'application/msword',
  'dot'    => 'application/msword',
  'dp'     => 'application/commonground',
  'drw'    => 'application/drafting',
  'dump'   => 'application/octet-stream',
  'dv'     => 'video/x-dv',
  'dvi'    => 'application/x-dvi',
  'dwf'    => 'model/vnd.dwf',
  'dwg'    => 'application/acad',
  'dwg'    => 'image/vnd.dwg',
  'dwg'    => 'image/x-dwg',
  'dxf'    => 'application/dxf',
  'dxf'    => 'image/vnd.dwg',
  'dxf'    => 'image/x-dwg',
  'dxr'    => 'application/x-director',
  'el'     => 'text/x-script.elisp',
  'elc'    => 'application/x-bytecode.elisp',
  'elc'    => 'application/x-elc',
  'env'    => 'application/x-envoy',
  'eps'    => 'application/postscript',
  'es'     => 'application/x-esrehber',
  'etx'    => 'text/x-setext',
  'evy'    => 'application/envoy',
  'evy'    => 'application/x-envoy',
  'exe'    => 'application/octet-stream',
  'f'      => 'text/plain',
  'f'      => 'text/x-fortran',
  'f77'    => 'text/x-fortran',
  'f90'    => 'text/plain',
  'f90'    => 'text/x-fortran',
  'fdf'    => 'application/vnd.fdf',
  'fif'    => 'application/fractals',
  'fif'    => 'image/fif',
  'fli'    => 'video/fli',
  'fli'    => 'video/x-fli',
  'flo'    => 'image/florian',
  'flx'    => 'text/vnd.fmi.flexstor',
  'fmf'    => 'video/x-atomic3d-feature',
  'for'    => 'text/plain',
  'for'    => 'text/x-fortran',
  'fpx'    => 'image/vnd.fpx',
  'fpx'    => 'image/vnd.net-fpx',
  'frl'    => 'application/freeloader',
  'funk'   => 'audio/make',
  'g'      => 'text/plain',
  'g3'     => 'image/g3fax',
  'gif'    => 'image/gif',
  'gl'     => 'video/gl',
  'gl'     => 'video/x-gl',
  'gsd'    => 'audio/x-gsm',
  'gsm'    => 'audio/x-gsm',
  'gsp'    => 'application/x-gsp',
  'gss'    => 'application/x-gss',
  'gtar'   => 'application/x-gtar',
  'gz'     => 'application/x-compressed',
  'gz'     => 'application/x-gzip',
  'gzip'   => 'application/x-gzip',
  'gzip'   => 'multipart/x-gzip',
  'h'      => 'text/plain',
  'h'      => 'text/x-h',
  'hdf'    => 'application/x-hdf',
  'help'   => 'application/x-helpfile',
  'hgl'    => 'application/vnd.hp-hpgl',
  'hh'     => 'text/plain',
  'hh'     => 'text/x-h',
  'hlb'    => 'text/x-script',
  'hlp'    => 'application/hlp',
  'hlp'    => 'application/x-helpfile',
  'hlp'    => 'application/x-winhelp',
  'hpg'    => 'application/vnd.hp-hpgl',
  'hpgl'   => 'application/vnd.hp-hpgl',
  'hqx'    => 'application/binhex',
  'hqx'    => 'application/binhex4',
  'hqx'    => 'application/mac-binhex',
  'hqx'    => 'application/mac-binhex40',
  'hqx'    => 'application/x-binhex40',
  'hqx'    => 'application/x-mac-binhex40',
  'hta'    => 'application/hta',
  'htc'    => 'text/x-component',
  'htm'    => 'text/html',
  'html'   => 'text/html',
  'htmls'  => 'text/html',
  'htt'    => 'text/webviewhtml',
  'htx'    => 'text/html',
  'ice'    => 'x-conference/x-cooltalk',
  'ico'    => 'image/x-icon',
  'idc'    => 'text/plain',
  'ief'    => 'image/ief',
  'iefs'   => 'image/ief',
  'iges'   => 'application/iges',
  'iges'   => 'model/iges',
  'igs'    => 'application/iges',
  'igs'    => 'model/iges',
  'ima'    => 'application/x-ima',
  'imap'   => 'application/x-httpd-imap',
  'inf'    => 'application/inf',
  'ins'    => 'application/x-internett-signup',
  'ip'     => 'application/x-ip2',
  'isu'    => 'video/x-isvideo',
  'it'     => 'audio/it',
  'iv'     => 'application/x-inventor',
  'ivr'    => 'i-world/i-vrml',
  'ivy'    => 'application/x-livescreen',
  'jam'    => 'audio/x-jam',
  'jav'    => 'text/plain',
  'jav'    => 'text/x-java-source',
  'java'   => 'text/plain',
  'java'   => 'text/x-java-source',
  'jcm'    => 'application/x-java-commerce',
  'jfif'   => 'image/jpeg',
  'jfif'   => 'image/pjpeg',
  'jfif-tbnl' => 'image/jpeg',
  'jpe'    => 'image/jpeg',
  'jpe'    => 'image/pjpeg',
  'jpeg'   => 'image/jpeg',
  'jpeg'   => 'image/pjpeg',
  'jpg'    => 'image/jpeg',
  'jpg'    => 'image/pjpeg',
  'jps'    => 'image/x-jps',
  'js'     => 'application/x-javascript',
  'jut'    => 'image/jutvision',
  'kar'    => 'audio/midi',
  'kar'    => 'music/x-karaoke',
  'ksh'    => 'application/x-ksh',
  'ksh'    => 'text/x-script.ksh',
  'la'     => 'audio/nspaudio',
  'la'     => 'audio/x-nspaudio',
  'lam'    => 'audio/x-liveaudio',
  'latex'  => 'application/x-latex',
  'lha'    => 'application/lha',
  'lha'    => 'application/octet-stream',
  'lha'    => 'application/x-lha',
  'lhx'    => 'application/octet-stream',
  'list'   => 'text/plain',
  'lma'    => 'audio/nspaudio',
  'lma'    => 'audio/x-nspaudio',
  'log'    => 'text/plain',
  'lsp'    => 'application/x-lisp',
  'lsp'    => 'text/x-script.lisp',
  'lst'    => 'text/plain',
  'lsx'    => 'text/x-la-asf',
  'ltx'    => 'application/x-latex',
  'lzh'    => 'application/octet-stream',
  'lzh'    => 'application/x-lzh',
  'lzx'    => 'application/lzx',
  'lzx'    => 'application/octet-stream',
  'lzx'    => 'application/x-lzx',
  'm'      => 'text/plain',
  'm'      => 'text/x-m',
  'm1v'    => 'video/mpeg',
  'm2a'    => 'audio/mpeg',
  'm2v'    => 'video/mpeg',
  'm3u'    => 'audio/x-mpequrl',
  'man'    => 'application/x-troff-man',
  'map'    => 'application/x-navimap',
  'mar'    => 'text/plain',
  'mbd'    => 'application/mbedlet',
  'mc$'    => 'application/x-magic-cap-package-1.0',
  'mcd'    => 'application/mcad',
  'mcd'    => 'application/x-mathcad',
  'mcf'    => 'image/vasa',
  'mcf'    => 'text/mcf',
  'mcp'    => 'application/netmc',
  'me'     => 'application/x-troff-me',
  'mht'    => 'message/rfc822',
  'mhtml'  => 'message/rfc822',
  'mid'    => 'application/x-midi',
  'mid'    => 'audio/midi',
  'mid'    => 'audio/x-mid',
  'mid'    => 'audio/x-midi',
  'mid'    => 'music/crescendo',
  'mid'    => 'x-music/x-midi',
  'midi'   => 'application/x-midi',
  'midi'   => 'audio/midi',
  'midi'   => 'audio/x-mid',
  'midi'   => 'audio/x-midi',
  'midi'   => 'music/crescendo',
  'midi'   => 'x-music/x-midi',
  'mif'    => 'application/x-frame',
  'mif'    => 'application/x-mif',
  'mime'   => 'message/rfc822',
  'mime'   => 'www/mime',
  'mjf'    =>
'audio/x-vnd.audioexplosion.mjuicemediafile',
  'mjpg'   => 'video/x-motion-jpeg',
  'mm'     => 'application/base64',
  'mm'     => 'application/x-meme',
  'mme'    => 'application/base64',
  'mod'    => 'audio/mod',
  'mod'    => 'audio/x-mod',
  'moov'   => 'video/quicktime',
  'mov'    => 'video/quicktime',
  'movie'  => 'video/x-sgi-movie',
  'mp2'    => 'audio/mpeg',
  'mp2'    => 'audio/x-mpeg',
  'mp2'    => 'video/mpeg',
  'mp2'    => 'video/x-mpeg',
  'mp2'    => 'video/x-mpeq2a',
  'mp3'    => 'audio/mpeg3',
  'mp3'    => 'audio/x-mpeg-3',
  'mp3'    => 'video/mpeg',
  'mp3'    => 'video/x-mpeg',
  'mpa'    => 'audio/mpeg',
  'mpa'    => 'video/mpeg',
  'mpc'    => 'application/x-project',
  'mpe'    => 'video/mpeg',
  'mpeg'   => 'video/mpeg',
  'mpg'    => 'audio/mpeg',
  'mpg'    => 'video/mpeg',
  'mpga'   => 'audio/mpeg',
  'mpp'    => 'application/vnd.ms-project',
  'mpt'    => 'application/x-project',
  'mpv'    => 'application/x-project',
  'mpx'    => 'application/x-project',
  'mrc'    => 'application/marc',
  'ms'     => 'application/x-troff-ms',
  'mv'     => 'video/x-sgi-movie',
  'my'     => 'audio/make',
  'mzz'    =>
'application/x-vnd.audioexplosion.mzz',
  'nap'    => 'image/naplps',
  'naplps' => 'image/naplps',
  'nc'     => 'application/x-netcdf',
  'ncm'    =>
'application/vnd.nokia.configuration-message',
  'nif'    => 'image/x-niff',
  'niff'   => 'image/x-niff',
  'nix'    => 'application/x-mix-transfer',
  'nsc'    => 'application/x-conference',
  'nvd'    => 'application/x-navidoc',
  'o'      => 'application/octet-stream',
  'oda'    => 'application/oda',
  'ogg'    => 'audio/ogg',
  'omc'    => 'application/x-omc',
  'omcd'   => 'application/x-omcdatamaker',
  'omcr'   => 'application/x-omcregerator',
  'p'      => 'text/x-pascal',
  'p10'    => 'application/pkcs10',
  'p10'    => 'application/x-pkcs10',
  'p12'    => 'application/pkcs-12',
  'p12'    => 'application/x-pkcs12',
  'p7a'    => 'application/x-pkcs7-signature',
  'p7c'    => 'application/pkcs7-mime',
  'p7c'    => 'application/x-pkcs7-mime',
  'p7m'    => 'application/pkcs7-mime',
  'p7m'    => 'application/x-pkcs7-mime',
  'p7r'    => 'application/x-pkcs7-certreqresp',
  'p7s'    => 'application/pkcs7-signature',
  'part'   => 'application/pro_eng',
  'pas'    => 'text/pascal',
  'pbm'    => 'image/x-portable-bitmap',
  'pcl'    => 'application/vnd.hp-pcl',
  'pcl'    => 'application/x-pcl',
  'pct'    => 'image/x-pict',
  'pcx'    => 'image/x-pcx',
  'pdb'    => 'chemical/x-pdb',
  'pdf'    => 'application/pdf',
  'pfunk'  => 'audio/make',
  'pfunk'  => 'audio/make.my.funk',
  'pgm'    => 'image/x-portable-graymap',
  'pgm'    => 'image/x-portable-greymap',
  'pic'    => 'image/pict',
  'pict'   => 'image/pict',
  'pkg'    => 'application/x-newton-compatible-pkg',
  'pko'    => 'application/vnd.ms-pki.pko',
  'pl'     => 'text/plain',
  'pl'     => 'text/x-script.perl',
  'plx'    => 'application/x-pixclscript',
  'pm'     => 'image/x-xpixmap',
  'pm'     => 'text/x-script.perl-module',
  'pm4'    => 'application/x-pagemaker',
  'pm5'    => 'application/x-pagemaker',
  'png'    => 'image/png',
  'pnm'    => 'application/x-portable-anymap',
  'pnm'    => 'image/x-portable-anymap',
  'pot'    => 'application/mspowerpoint',
  'pot'    => 'application/vnd.ms-powerpoint',
  'pov'    => 'model/x-pov',
  'ppa'    => 'application/vnd.ms-powerpoint',
  'ppm'    => 'image/x-portable-pixmap',
  'pps'    => 'application/mspowerpoint',
  'pps'    => 'application/vnd.ms-powerpoint',
  'ppt'    => 'application/mspowerpoint',
  'ppt'    => 'application/powerpoint',
  'ppt'    => 'application/vnd.ms-powerpoint',
  'ppt'    => 'application/x-mspowerpoint',
  'ppz'    => 'application/mspowerpoint',
  'pre'    => 'application/x-freelance',
  'prt'    => 'application/pro_eng',
  'ps'     => 'application/postscript',
  'psd'    => 'application/octet-stream',
  'pvu'    => 'paleovu/x-pv',
  'pwz'    => 'application/vnd.ms-powerpoint',
  'py'     => 'text/x-script.phyton',
  'pyc'    => 'applicaiton/x-bytecode.python',
  'qcp'    => 'audio/vnd.qcelp',
  'qd3'    => 'x-world/x-3dmf',
  'qd3d'   => 'x-world/x-3dmf',
  'qif'    => 'image/x-quicktime',
  'qt'     => 'video/quicktime',
  'qtc'    => 'video/x-qtc',
  'qti'    => 'image/x-quicktime',
  'qtif'   => 'image/x-quicktime',
  'ra'     => 'audio/x-pn-realaudio',
  'ra'     => 'audio/x-pn-realaudio-plugin',
  'ra'     => 'audio/x-realaudio',
  'ram'    => 'audio/x-pn-realaudio',
  'ras'    => 'application/x-cmu-raster',
  'ras'    => 'image/cmu-raster',
  'ras'    => 'image/x-cmu-raster',
  'rast'   => 'image/cmu-raster',
  'rexx'   => 'text/x-script.rexx',
  'rf'     => 'image/vnd.rn-realflash',
  'rgb'    => 'image/x-rgb',
  'rm'     => 'application/vnd.rn-realmedia',
  'rm'     => 'audio/x-pn-realaudio',
  'rmi'    => 'audio/mid',
  'rmm'    => 'audio/x-pn-realaudio',
  'rmp'    => 'audio/x-pn-realaudio',
  'rmp'    => 'audio/x-pn-realaudio-plugin',
  'rng'    => 'application/ringing-tones',
  'rng'    => 'application/vnd.nokia.ringing-tone',
  'rnx'    => 'application/vnd.rn-realplayer',
  'roff'   => 'application/x-troff',
  'rp'     => 'image/vnd.rn-realpix',
  'rpm'    => 'audio/x-pn-realaudio-plugin',
  'rt'     => 'text/richtext',
  'rt'     => 'text/vnd.rn-realtext',
  'rtf'    => 'application/rtf',
  'rtf'    => 'application/x-rtf',
  'rtf'    => 'text/richtext',
  'rtx'    => 'application/rtf',
  'rtx'    => 'text/richtext',
  'rv'     => 'video/vnd.rn-realvideo',
  's'      => 'text/x-asm',
  's3m'    => 'audio/s3m',
  'saveme' => 'application/octet-stream',
  'sbk'    => 'application/x-tbook',
  'scm'    => 'application/x-lotusscreencam',
  'scm'    => 'text/x-script.guile',
  'scm'    => 'text/x-script.scheme',
  'scm'    => 'video/x-scm',
  'sdml'   => 'text/plain',
  'sdp'    => 'application/sdp',
  'sdp'    => 'application/x-sdp',
  'sdr'    => 'application/sounder',
  'sea'    => 'application/sea',
  'sea'    => 'application/x-sea',
  'set'    => 'application/set',
  'sgm'    => 'text/sgml',
  'sgm'    => 'text/x-sgml',
  'sgml'   => 'text/sgml',
  'sgml'   => 'text/x-sgml',
  'sh'     => 'application/x-bsh',
  'sh'     => 'application/x-sh',
  'sh'     => 'application/x-shar',
  'sh'     => 'text/x-script.sh',
  'shar'   => 'application/x-bsh',
  'shar'   => 'application/x-shar',
  'shtml'  => 'text/html',
  'shtml'  => 'text/x-server-parsed-html',
  'sid'    => 'audio/x-psid',
  'sit'    => 'application/x-sit',
  'sit'    => 'application/x-stuffit',
  'skd'    => 'application/x-koan',
  'skm'    => 'application/x-koan',
  'skp'    => 'application/x-koan',
  'skt'    => 'application/x-koan',
  'sl'     => 'application/x-seelogo',
  'smi'    => 'application/smil',
  'smil'   => 'application/smil',
  'snd'    => 'audio/basic',
  'snd'    => 'audio/x-adpcm',
  'sol'    => 'application/solids',
  'spc'    => 'application/x-pkcs7-certificates',
  'spc'    => 'text/x-speech',
  'spl'    => 'application/futuresplash',
  'spr'    => 'application/x-sprite',
  'sprite' => 'application/x-sprite',
  'src'    => 'application/x-wais-source',
  'ssi'    => 'text/x-server-parsed-html',
  'ssm'    => 'application/streamingmedia',
  'sst'    => 'application/vnd.ms-pki.certstore',
  'step'   => 'application/step',
  'stl'    => 'application/sla',
  'stl'    => 'application/vnd.ms-pki.stl',
  'stl'    => 'application/x-navistyle',
  'stp'    => 'application/step',
  'sv4cpio'=> 'application/x-sv4cpio',
  'sv4crc' => 'application/x-sv4crc',
  'svf'    => 'image/vnd.dwg',
  'svf'    => 'image/x-dwg',
  'svr'    => 'application/x-world',
  'svr'    => 'x-world/x-svr',
  'swf'    => 'application/x-shockwave-flash',
  't'      => 'application/x-troff',
  'talk'   => 'text/x-speech',
  'tar'    => 'application/x-tar',
  'tbk'    => 'application/toolbook',
  'tbk'    => 'application/x-tbook',
  'tcl'    => 'application/x-tcl',
  'tcl'    => 'text/x-script.tcl',
  'tcsh'   => 'text/x-script.tcsh',
  'tex'    => 'application/x-tex',
  'texi'   => 'application/x-texinfo',
  'texinfo'=> 'application/x-texinfo',
  'text'   => 'application/plain',
  'text'   => 'text/plain',
  'tgz'    => 'application/gnutar',
  'tgz'    => 'application/x-compressed',
  'tif'    => 'image/tiff',
  'tif'    => 'image/x-tiff',
  'tiff'   => 'image/tiff',
  'tiff'   => 'image/x-tiff',
  'tr'     => 'application/x-troff',
  'tsi'    => 'audio/tsp-audio',
  'tsp'    => 'application/dsptype',
  'tsp'    => 'audio/tsplayer',
  'tsv'    => 'text/tab-separated-values',
  'turbot' => 'image/florian',
  'txt'    => 'text/plain',
  'uil'    => 'text/x-uil',
  'uni'    => 'text/uri-list',
  'unis'   => 'text/uri-list',
  'unv'    => 'application/i-deas',
  'uri'    => 'text/uri-list',
  'uris'   => 'text/uri-list',
  'ustar'  => 'application/x-ustar',
  'ustar'  => 'multipart/x-ustar',
  'uu'     => 'application/octet-stream',
  'uu'     => 'text/x-uuencode',
  'uue'    => 'text/x-uuencode',
  'vcd'    => 'application/x-cdlink',
  'vcs'    => 'text/x-vcalendar',
  'vda'    => 'application/vda',
  'vdo'    => 'video/vdo',
  'vew'    => 'application/groupwise',
  'viv'    => 'video/vivo',
  'viv'    => 'video/vnd.vivo',
  'vivo'   => 'video/vivo',
  'vivo'   => 'video/vnd.vivo',
  'vmd'    => 'application/vocaltec-media-desc',
  'vmf'    => 'application/vocaltec-media-file',
  'voc'    => 'audio/voc',
  'voc'    => 'audio/x-voc',
  'vos'    => 'video/vosaic',
  'vox'    => 'audio/voxware',
  'vqe'    => 'audio/x-twinvq-plugin',
  'vqf'    => 'audio/x-twinvq',
  'vql'    => 'audio/x-twinvq-plugin',
  'vrml'   => 'application/x-vrml',
  'vrml'   => 'model/vrml',
  'vrml'   => 'x-world/x-vrml',
  'vrt'    => 'x-world/x-vrt',
  'vsd'    => 'application/x-visio',
  'vst'    => 'application/x-visio',
  'vsw'    => 'application/x-visio',
  'w60'    => 'application/wordperfect6.0',
  'w61'    => 'application/wordperfect6.1',
  'w6w'    => 'application/msword',
  'wav'    => 'audio/wav',
  'wav'    => 'audio/x-wav',
  'wb1'    => 'application/x-qpro',
  'wbmp'   => 'image/vnd.wap.wbmp',
  'web'    => 'application/vnd.xara',
  'wiz'    => 'application/msword',
  'wk1'    => 'application/x-123',
  'wmf'    => 'windows/metafile',
  'wml'    => 'text/vnd.wap.wml',
  'wmlc'   => 'application/vnd.wap.wmlc',
  'wmls'   => 'text/vnd.wap.wmlscript',
  'wmlsc'  => 'application/vnd.wap.wmlscriptc',
  'word'   => 'application/msword',
  'wp'     => 'application/wordperfect',
  'wp5'    => 'application/wordperfect',
  'wp5'    => 'application/wordperfect6.0',
  'wp6'    => 'application/wordperfect',
  'wpd'    => 'application/wordperfect',
  'wpd'    => 'application/x-wpwin',
  'wq1'    => 'application/x-lotus',
  'wri'    => 'application/mswrite',
  'wri'    => 'application/x-wri',
  'wrl'    => 'application/x-world',
  'wrl'    => 'model/vrml',
  'wrl'    => 'x-world/x-vrml',
  'wrz'    => 'model/vrml',
  'wrz'    => 'x-world/x-vrml',
  'wsc'    => 'text/scriplet',
  'wsrc'   => 'application/x-wais-source',
  'wtk'    => 'application/x-wintalk',
  'xbm'    => 'image/x-xbitmap',
  'xbm'    => 'image/x-xbm',
  'xbm'    => 'image/xbm',
  'xdr'    => 'video/x-amt-demorun',
  'xgz'    => 'xgl/drawing',
  'xif'    => 'image/vnd.xiff',
  'xl'     => 'application/excel',
  'xla'    => 'application/excel',
  'xla'    => 'application/x-excel',
  'xla'    => 'application/x-msexcel',
  'xlb'    => 'application/excel',
  'xlb'    => 'application/vnd.ms-excel',
  'xlb'    => 'application/x-excel',
  'xlc'    => 'application/excel',
  'xlc'    => 'application/vnd.ms-excel',
  'xlc'    => 'application/x-excel',
  'xld'    => 'application/excel',
  'xld'    => 'application/x-excel',
  'xlk'    => 'application/excel',
  'xlk'    => 'application/x-excel',
  'xll'    => 'application/excel',
  'xll'    => 'application/vnd.ms-excel',
  'xll'    => 'application/x-excel',
  'xlm'    => 'application/excel',
  'xlm'    => 'application/vnd.ms-excel',
  'xlm'    => 'application/x-excel',
  'xls'    => 'application/excel',
  'xls'    => 'application/vnd.ms-excel',
  'xls'    => 'application/x-excel',
  'xls'    => 'application/x-msexcel',
  'xlt'    => 'application/excel',
  'xlt'    => 'application/x-excel',
  'xlv'    => 'application/excel',
  'xlv'    => 'application/x-excel',
  'xlw'    => 'application/excel',
  'xlw'    => 'application/vnd.ms-excel',
  'xlw'    => 'application/x-excel',
  'xlw'    => 'application/x-msexcel',
  'xm'     => 'audio/xm',
  'xml'    => 'application/xml',
  'xml'    => 'text/xml',
  'xmz'    => 'xgl/movie',
  'xpix'   => 'application/x-vnd.ls-xpix',
  'xpm'    => 'image/x-xpixmap',
  'xpm'    => 'image/xpm',
  'x-png'  => 'image/png',
  'xsr'    => 'video/x-amt-showrun',
  'xwd'    => 'image/x-xwd',
  'xwd'    => 'image/x-xwindowdump',
  'xyz'    => 'chemical/x-pdb',
  'z'      => 'application/x-compress',
  'z'      => 'application/x-compressed',
  'zip'    => 'application/x-compressed',
  'zip'    => 'application/x-zip-compressed',
  'zip'    => 'application/zip',
  'zip'    => 'multipart/x-zip',
  'zoo'    => 'application/octet-stream',
  'zsh'    => 'text/x-script.zsh',
  'txt'    => 'text/plain',
  'htm'    => 'text/html',
  'html'   => 'text/html',
  'php'    => 'application/x-httpd-php',
  'phps'   => 'application/x-httpd-phps',
  'css'    => 'text/css',
  'js'     => 'application/javascript',
  'json'   => 'application/json',
  'xml'    => 'application/xml',
  'swf'    => 'application/x-shockwave-flash',
  'flv'    => 'video/x-flv',
  'asc'    => 'text/plain',
  'atom'   => 'application/atom+xml',
  'bcpio'  => 'application/x-bcpio',
  'png'    => 'image/png',
  'jpe'    => 'image/jpeg',
  'jpeg'   => 'image/jpeg',
  'jpg'    => 'image/jpeg',
  'gif'    => 'image/gif',
  'bmp'    => 'image/bmp',
  'ico'    => 'image/vnd.microsoft.icon',
  'tiff'   => 'image/tiff',
  'tif'    => 'image/tiff',
  'svg'    => 'image/svg+xml',
  'svgz'   => 'image/svg+xml',
  'zip'    => 'application/zip',
  'rar'    => 'application/x-rar-compressed',
  'exe'    => 'application/x-msdownload',
  'msi'    => 'application/x-msdownload',
  'cab'    => 'application/vnd.ms-cab-compressed',
  'mp3'    => 'audio/mpeg',
  'qt'     => 'video/quicktime',
  'mov'    => 'video/quicktime',
  'au'     => 'audio/basic',
  'avi'    => 'video/x-msvideo',
  'pdf'    => 'application/pdf',
  'psd'    => 'image/vnd.adobe.photoshop',
  'ai'     => 'application/postscript',
  'eps'    => 'application/postscript',
  'ps'     => 'application/postscript',
  'aif'    => 'audio/x-aiff',
  'aifc'   => 'audio/x-aiff',
  'aiff'   => 'audio/x-aiff',
  'doc'    => 'application/msword',
  'rtf'    => 'application/rtf',
  'xls'    => 'application/vnd.ms-excel',
  'ppt'    => 'application/vnd.ms-powerpoint',
  'odt'    =>
'application/vnd.oasis.opendocument.text',
  'ods'    =>
'application/vnd.oasis.opendocument.spreadsheet',
  'swf'    => 'application/x-shockwave-flash',
  'swf'    =>
'application/x-shockwave-flash2-preview',
  'swf'    => 'application/futuresplash',
  'swf'    => 'image/vnd.rn-realflash'
);

/** This will allow users to visit mime.types.php and view all MIME types
**/
/** Sorry for the inline styles, I'm too lazy to include a stylesheet
heh **/
if(stristr(basename($_SERVER['PHP_SELF']),
"mime.types.php")) {
  echo <<< ENDL
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en" lang="en">
<head>
  <title>MIME Types List | MIME Types Class</title>
  <meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
  <style type="text/css">
  table, td, h1 {
    border: 5px double #DDD;
    color: #666;
    font-family: Tahoma, Arial, Verdana;
  }
  </style>
</head>
<body>
<table width="600" cellspacing="10"
cellpadding="10" border="1" style="border: 10px
double #DDD;margin: 10px auto;">
<tr>
  <td colspan="2" align="center">
    <h2 style="margin: 0;padding: 5px;">Get Mime Type
Class</h2>
  </td>
</tr>
<tr>
  <td
align="left"><strong><i>Extension</i></strong></td>
  <td align="left"><strong><i>MIME
Type</i></strong></td>
</tr>

ENDL;
  $totalTypes = 0;

  # Sort types by key
  ksort($types);

  foreach($types as $ext => $type) {
    $totalTypes++;
    echo <<< ENDL
<tr>
  <td align="left">.$ext</td>
  <td align="left">$type</td>
</tr>

ENDL;
  }
  $totalTypes = number_format($totalTypes);
  echo <<< ENDL
<tr>
  <td colspan="2" align="left">
    Total Types: $totalTypes
  </td>
</tr>
</table>
</body>
</html>
ENDL;
}
?>libs/phpmimetypeclass/ss.jpg000064400000233235151165346500012231
0ustar00���JFIFHH���ExifMM*bj(1r2��i��
��'
��'Adobe Photoshop CS4 Windows2009:01:07
12:15:44�����&(.�HH���JFIFHH��Adobe_CM��Adobed����			



��C�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE£t6�U�e���u��F'������������Vfv�������7GWgw�������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te����u��F������������Vfv�������'7GWgw������?�U��}h�8�̊�ӝ�p�}&��X��m�{?��w�s�P���������=��$��w�⒚�?Xr�ӫ�=;˚.smĵ���*c^�]�W�\����ŷ�};��A���\@���Ⱦ�_]W:�00���v��c��Oe�[��?�kV��?��������O�5������R~��(�f�B��m����a��?G���>��Y�Օد�x'���c����E�s�;wl�nw��$�.^߭F�^N;��q�Z����?��?��=^��}B˳��C��.�-qsݽ�K�{��9%5���k�0�q0�u�V����kmn4ﱛ��S�2hg���Һ��N�׍��j�6A~Ak=A[}0�U96��uޗ���뱏�����k7���$��I��&�Wծ�U̾�`-���v��sL���jJt�3�~6FC/������-ixݷݷDu���l�Ѻ�ZX��%�\=��IO1_���)��s�،˹��K�����Kun��e�WS?K�~�Ӧ�^���M�Pn�8Vg>��NHmN����+f��}]��~���e�#��^�ASﳿ�qE�T~�9���c�H%�s�$}���R��Z��f�2�j�f9�[^��i�~�l��cj�'�+��U�md7���fZwo0�|��?�����-t���I%)$�IO��U��߬�k�����\^�����k���Ueo��K������ĒS���7�o��i��
�ﵗ3�o����~��W~���O��c���^�U}�?x���!ދw�l�C�%��P��f�^�.n�F�8�cd~s,c����?�3������c
li��hm�:��Yo�g�[�]�Q��֏ѭ��ɺ��֊(���K����X�e����_�/SѮ����WUpq��1Ŏ-
Úv����c���JR����]e��Mud��@�q5��X�k{6��6�<����7�]���U�Q�m��ȬX�n��zn��l���z��INK:_Wu^��q��k�k��Zͷ�Xܚ��*�~��9�=i=�Z�XuD���puw�����z/��;�}��G���M&u^���kr����c����^�[d�6�>�����V���$��N�������.`�-�^��߳�{��p��@�1ޓI�]�]��"$��f������ٿ�uw�1O�M��w��uߢ̷����U�[h�m{X�m6�Ԗ�ξ�Y�?!�o�c�N�Z����$:/�"��C�mV
̱�Z�xs>�RS�S~�W���N�/|8�h�Z,eu����~�����Ы6�׬�.�.�>�k�^˞�=f2���_O�l�E��]�k�i�0~*6dQU/���ju�8�ֆO��[��������8=�<��
��0
�꯵�sl�����?Iw��S��_�l(w�<zo��.�#*�ִz���c�Vn��c1�Ƚ�d�]O�bސx*,��c+{^�\kA�ŭ�c�uޝ��G�����=Y��䆺�}϶����C����~������(UuW3ԥ���ina5���c\�)����U�w՜;m��m���,���ҳѲ�뫷�M��[?�����Y]x�cY�v?�j�����e������}����fʿ���SI�R���96�1�6��V�9ϭߢn�ѿc=M����R�}$w�V���Q��ۑ�nO�a����o��g�Y��}�����k��Q���}����}m���\I���oB�����Vc
?�Ub�k(��k��l��߅nڬ�>v��c��E���M�,ϪTW�(�fE���{�����ꭤ�ֱ�6�^���}��z�*�M��4u�z�+r�l��k,sA�)�c_UV�-ʧ��+V���ħ.����c`��p���?E%'Y��j��I����Zѵޕx�Zvoٲ������oEd��1�4�����mxq���_^K�elo�,o�Y�i}�s*�7��͝
���ݕu��w�Z�
����,��z)g��_��]����۵�<4�4��Ss�?���[h�Q��W�Dg_������Rms}HsKlmWev�U��':�Q���2)��,b�z�%y���[�{X�ms��̦�[\ֻ�ɪ�O��W�j�*	�M�Z)s�.s_����etm�M�v�ߤ�|�E�YIq`��a{bF�sw��w�بa�a�~����^Xֶʬ`����_k��ޓ}����g�J��̚��/˰9���^�
�-cK����%<�_R��FC�*�/n��O�貽��_�J26��_�_F�+
���1�9ʽ���P�^�
s�mu���P��I��Z�W�7�m�X�`!�6��6��-��V���Y]WeS�>��+>��ٽ���s�,���蹬��2?H�[�c����%
S�E"��]�A�k~�,ci�}7;o����V��{�:��d�(�����k��߱��nw�c���J���AJ��z�'Qk���_Tz�m�K��u���}V7{Ԕ��.�ڬ!ޡu�s*�k,ub�l���_��G���z>��J�m���H�}^�z��k��E��kYVE�U���lȷ��I)���V/Rf[r,}l�_��m/6z��Z���#�6O�{�/ѭԒIO��UY�7�6�{qim�q��+hqyc�/ۻ�s-������'�}be�e]4����9��`{��l��{]Ko��?�ҝC�A
i�dž��h���ѷ����Z-�Xw�o��Ii/c]-x�c}���ߦ���X-e���K�C�Qyq�t4�[k��k�����N��?���'u��.W�^M���������Ϩ���;��jr��GrJu�L饍aĤ������?KF�o�����]L�����ƀ�~�V=�_��S}\Fl��k����{����ۑ�/�UC*���C�]S�ٚ��hsZ,��h�7mq���}�>���I��[*���<6�X�+u�����-�t9c=�z2��7f\Yf]ђ�k��6�5����Ym��Y�ӯo�����Jn��K�,r�X��S'�i�G�e�7��7�م�e���o�K	�q������V�{X�b�fO�����݈�Q^Mt���\+k�o��m����;��l�E��j�α��.����eb�>�=�ն�6=_�}�����]6���bJtY��[���S���4@-k��k���2�:�ǂ�5�AG5�+#�u���fa1��[/{7&��}ͭ�S)nCYW��*Z���,��,c�V"\�%��~���R'tΚ�C�)p&L�ө�~��ކލҚ8�?ձ�<��a6XwX���w����ͬz~�u���?���;��X�~��5�`��W���޿�Jx�O�0��}�,�ݶ��
�Y{�V������=/c�;?���%;x�8��Lz���1�������z:�k�Y��/���i�}�V�����c���?ڬ�Y�3�>��W��8�1�om�c���~�l���?r���6$�e%���^Em�����ifLJ9�ֵޣ_cv^�l�r�~�]����Ӕu^�M7ݑ��ٕMTV��6��K�ci��K%�.����?�S���V�:��Hs���8�+6��7����_�?�_�?�IO��T�ʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$����|Photoshop
3.08BIM8BIM%��\�/���{g��dպ8BIM�HH8BIM&?�8BIM
8BIM8BIM�	8BIM'
8BIM�H/fflff/ff���2Z5-8BIM�p��������������������������������������������������������������������������������������������8BIM@@8BIM8BIM9��ss��nullboundsObjcRct1Top
longLeftlongBtomlong�Rghtlong�slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenumESliceOrigin
autoGeneratedTypeenum
ESliceTypeImg boundsObjcRct1Top
longLeftlongBtomlong�Rghtlong�urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT	horzAlignenumESliceHorzAligndefault	vertAlignenumESliceVertAligndefaultbgColorTypeenumESliceBGColorTypeNone	topOutsetlong
leftOutsetlongbottomOutsetlongrightOutsetlong8BIM(?�8BIM8BIM��C�}�����JFIFHH��Adobe_CM��Adobed����			



��C�"��
��?	
	
3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE£t6�U�e���u��F'������������Vfv�������7GWgw�������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te����u��F������������Vfv�������'7GWgw������?�U��}h�8�̊�ӝ�p�}&��X��m�{?��w�s�P���������=��$��w�⒚�?Xr�ӫ�=;˚.smĵ���*c^�]�W�\����ŷ�};��A���\@���Ⱦ�_]W:�00���v��c��Oe�[��?�kV��?��������O�5������R~��(�f�B��m����a��?G���>��Y�Օد�x'���c����E�s�;wl�nw��$�.^߭F�^N;��q�Z����?��?��=^��}B˳��C��.�-qsݽ�K�{��9%5���k�0�q0�u�V����kmn4ﱛ��S�2hg���Һ��N�׍��j�6A~Ak=A[}0�U96��uޗ���뱏�����k7���$��I��&�Wծ�U̾�`-���v��sL���jJt�3�~6FC/������-ixݷݷDu���l�Ѻ�ZX��%�\=��IO1_���)��s�،˹��K�����Kun��e�WS?K�~�Ӧ�^���M�Pn�8Vg>��NHmN����+f��}]��~���e�#��^�ASﳿ�qE�T~�9���c�H%�s�$}���R��Z��f�2�j�f9�[^��i�~�l��cj�'�+��U�md7���fZwo0�|��?�����-t���I%)$�IO��U��߬�k�����\^�����k���Ueo��K������ĒS���7�o��i��
�ﵗ3�o����~��W~���O��c���^�U}�?x���!ދw�l�C�%��P��f�^�.n�F�8�cd~s,c����?�3������c
li��hm�:��Yo�g�[�]�Q��֏ѭ��ɺ��֊(���K����X�e����_�/SѮ����WUpq��1Ŏ-
Úv����c���JR����]e��Mud��@�q5��X�k{6��6�<����7�]���U�Q�m��ȬX�n��zn��l���z��INK:_Wu^��q��k�k��Zͷ�Xܚ��*�~��9�=i=�Z�XuD���puw�����z/��;�}��G���M&u^���kr����c����^�[d�6�>�����V���$��N�������.`�-�^��߳�{��p��@�1ޓI�]�]��"$��f������ٿ�uw�1O�M��w��uߢ̷����U�[h�m{X�m6�Ԗ�ξ�Y�?!�o�c�N�Z����$:/�"��C�mV
̱�Z�xs>�RS�S~�W���N�/|8�h�Z,eu����~�����Ы6�׬�.�.�>�k�^˞�=f2���_O�l�E��]�k�i�0~*6dQU/���ju�8�ֆO��[��������8=�<��
��0
�꯵�sl�����?Iw��S��_�l(w�<zo��.�#*�ִz���c�Vn��c1�Ƚ�d�]O�bސx*,��c+{^�\kA�ŭ�c�uޝ��G�����=Y��䆺�}϶����C����~������(UuW3ԥ���ina5���c\�)����U�w՜;m��m���,���ҳѲ�뫷�M��[?�����Y]x�cY�v?�j�����e������}����fʿ���SI�R���96�1�6��V�9ϭߢn�ѿc=M����R�}$w�V���Q��ۑ�nO�a����o��g�Y��}�����k��Q���}����}m���\I���oB�����Vc
?�Ub�k(��k��l��߅nڬ�>v��c��E���M�,ϪTW�(�fE���{�����ꭤ�ֱ�6�^���}��z�*�M��4u�z�+r�l��k,sA�)�c_UV�-ʧ��+V���ħ.����c`��p���?E%'Y��j��I����Zѵޕx�Zvoٲ������oEd��1�4�����mxq���_^K�elo�,o�Y�i}�s*�7��͝
���ݕu��w�Z�
����,��z)g��_��]����۵�<4�4��Ss�?���[h�Q��W�Dg_������Rms}HsKlmWev�U��':�Q���2)��,b�z�%y���[�{X�ms��̦�[\ֻ�ɪ�O��W�j�*	�M�Z)s�.s_����etm�M�v�ߤ�|�E�YIq`��a{bF�sw��w�بa�a�~����^Xֶʬ`����_k��ޓ}����g�J��̚��/˰9���^�
�-cK����%<�_R��FC�*�/n��O�貽��_�J26��_�_F�+
���1�9ʽ���P�^�
s�mu���P��I��Z�W�7�m�X�`!�6��6��-��V���Y]WeS�>��+>��ٽ���s�,���蹬��2?H�[�c����%
S�E"��]�A�k~�,ci�}7;o����V��{�:��d�(�����k��߱��nw�c���J���AJ��z�'Qk���_Tz�m�K��u���}V7{Ԕ��.�ڬ!ޡu�s*�k,ub�l���_��G���z>��J�m���H�}^�z��k��E��kYVE�U���lȷ��I)���V/Rf[r,}l�_��m/6z��Z���#�6O�{�/ѭԒIO��UY�7�6�{qim�q��+hqyc�/ۻ�s-������'�}be�e]4����9��`{��l��{]Ko��?�ҝC�A
i�dž��h���ѷ����Z-�Xw�o��Ii/c]-x�c}���ߦ���X-e���K�C�Qyq�t4�[k��k�����N��?���'u��.W�^M���������Ϩ���;��jr��GrJu�L饍aĤ������?KF�o�����]L�����ƀ�~�V=�_��S}\Fl��k����{����ۑ�/�UC*���C�]S�ٚ��hsZ,��h�7mq���}�>���I��[*���<6�X�+u�����-�t9c=�z2��7f\Yf]ђ�k��6�5����Ym��Y�ӯo�����Jn��K�,r�X��S'�i�G�e�7��7�م�e���o�K	�q������V�{X�b�fO�����݈�Q^Mt���\+k�o��m����;��l�E��j�α��.����eb�>�=�ն�6=_�}�����]6���bJtY��[���S���4@-k��k���2�:�ǂ�5�AG5�+#�u���fa1��[/{7&��}ͭ�S)nCYW��*Z���,��,c�V"\�%��~���R'tΚ�C�)p&L�ө�~��ކލҚ8�?ձ�<��a6XwX���w����ͬz~�u���?���;��X�~��5�`��W���޿�Jx�O�0��}�,�ݶ��
�Y{�V������=/c�;?���%;x�8��Lz���1�������z:�k�Y��/���i�}�V�����c���?ڬ�Y�3�>��W��8�1�om�c���~�l���?r���6$�e%���^Em�����ifLJ9�ֵޣ_cv^�l�r�~�]����Ӕu^�M7ݑ��ٕMTV��6��K�ci��K%�.����?�S���V�:��Hs���8�+6��7����_�?�_�?�IO��T�ʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$�ꤗʩ$���8BIM!UAdobe
PhotoshopAdobe Photoshop
CS48BIM��Fhttp://ns.adobe.com/xap/1.0/<?xpacket
begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP
Core 4.2.2-c063 53.352624, 2008/07/30-18:12:18        ">
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
xmlns:exif="http://ns.adobe.com/exif/1.0/"
xmp:CreatorTool="Adobe Photoshop CS4 Windows"
xmp:CreateDate="2009-01-07T12:11:20-06:00"
xmp:ModifyDate="2009-01-07T12:15:44-06:00"
xmp:MetadataDate="2009-01-07T12:15:44-06:00"
dc:format="image/jpeg" photoshop:ColorMode="3"
photoshop:ICCProfile="sRGB IEC61966-2.1"
xmpMM:InstanceID="xmp.iid:3B9B5333E7DCDD11B5E9C23BCC161C56"
xmpMM:DocumentID="xmp.did:F5643B0EE7DCDD11AD33AFCF74D2A8FB"
xmpMM:OriginalDocumentID="xmp.did:F5643B0EE7DCDD11AD33AFCF74D2A8FB"
tiff:Orientation="1" tiff:XResolution="720000/10000"
tiff:YResolution="720000/10000" tiff:ResolutionUnit="2"
tiff:NativeDigest="256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;23F7F8D1553275324617E45755079344"
exif:PixelXDimension="408" exif:PixelYDimension="172"
exif:ColorSpace="1"
exif:NativeDigest="36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;D1D496BB64E21B5E0DAAD14EF59A56F0">
<xmpMM:History> <rdf:Seq> <rdf:li
stEvt:action="created"
stEvt:instanceID="xmp.iid:F5643B0EE7DCDD11AD33AFCF74D2A8FB"
stEvt:when="2009-01-07T12:14:42-06:00"
stEvt:softwareAgent="Adobe Photoshop CS4 Windows"/> <rdf:li
stEvt:action="converted" stEvt:parameters="from image/bmp to
image/jpeg"/> <rdf:li stEvt:action="saved"
stEvt:instanceID="xmp.iid:F6643B0EE7DCDD11AD33AFCF74D2A8FB"
stEvt:when="2009-01-07T12:14:42-06:00"
stEvt:softwareAgent="Adobe Photoshop CS4 Windows"
stEvt:changed="/"/> <rdf:li stEvt:action="saved"
stEvt:instanceID="xmp.iid:3B9B5333E7DCDD11B5E9C23BCC161C56"
stEvt:when="2009-01-07T12:15:44-06:00"
stEvt:softwareAgent="Adobe Photoshop CS4 Windows"
stEvt:changed="/"/> </rdf:Seq> </xmpMM:History>
</rdf:Description> </rdf:RDF> </x:xmpmeta>               
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                         <?xpacket
end="w"?>��XICC_PROFILEHLinomntrRGB XYZ
�	1acspMSFTIEC sRGB���-HP 
cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright
(c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ
�Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC
http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB
colour space - sRGB.IEC 61966-2.1 Default RGB colour space -
sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing
Condition in IEC61966-2.1view��_.���\�XYZ
L	VPW�meas�sig CRT curv
#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~����������
-;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�

'
=
T
j
�
�
�
�
�
�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e����
Ek���*Qw���;c���*R{���Gp���@j���>i���
 A l � �
�!!H!u!�!�!�"'"U"�"�"�#
#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�>
>`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M���
����_�ɖ4���
�u��L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
�����z���p��g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?��D���I���N���U���\���d���l���v�ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s���
����2��F���[���p�����(��@���X���r�����4��P��m��������8��W��w����)���K��m����Adobed@���������3���	
	
	u!"1A2#	QBa$3Rq�b�%C���&4r
��5'�S6��DTsEF7Gc(UVW�����d�t��e�����)8f�u*9:HIJXYZghijvwxyz����������������������������������������������������m!1"AQ2aqB�#�R�b3	�$��Cr��4%�ScD�&5T6Ed'
s��Ft����UeuV7��������)����������(GWf8v�������gw�������HXhx�������9IYiy�������*:JZjz��������?��ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^���f_M��d��!��c�q�Sbr�\V*j�i)g���V�xL�E)0������H�����ZEiuc3H
�6F1�$R��1�$�8�'Y#j22�����
��P���dBT�F���H�Օ�C)����U���ퟕ;c���F�U/�A�g�;*/��r��:w�>:�{#im���s}�/�����>ԛ]���Y=�]�����V��T9I?y�7�<��ח����B^���k5�C:���;���B�[��FZ+��1?<I����L�&�y|�U��Ȗ�i�7���ʬ$����5����qe"�%�(��S���$�^���v�ٿ�>����8����?������Θ��dd��+Sl��Qm��Ϧ�j�0��Dz?o����v�k/.�����}���"�h%[o�[[R5�p$�+�����o��]��
o{��m|���[���~$�[��[+*Owk,�ݬ�5�$2I\B��Yo���ܻ��a�ݯ��m��3l�A����>�O�i�xSP��
�[��<gr�7#g3��=nK
�2�o���SWd�V5*��~�M�Иv�������։$�=Ά�{����[�y5���R\O%�w;�n^]ͯ�c%��g}v�
mm/�H�攸Ee)$WZV��A,���Q��~H|j�a��n����9~�뽫����۝Y�ٹ���v�؛!�0�c�6N?�����h��fE\1�,�RZ�1�^���.��x���@VwJ��w���T�k��'��6�C�,��m�_�6�ϻYx�f�]zB�TKw
�x���.��c,!�U��G�iK�G�n�%�:�h�2��ݝC�˾w.'ln9���Ȏ�ۿ/�&�oU�㻦	z?�z�ڧ!�.B�������<�Z��e�n;G5�r�<�-�2��m�"R����u����Sk5�PHZ8��T�n�[s]�w{k�[����i$�n����n�R��M���hb�n�d���
L�\���T;��<��~�k]g�~K���N���+�1]��'p�Y�?�ݍ�;it�b�����O��ܯh���{#?$F��_bG��a�����)�#)�sͦ��}��j�7{y�&��l�R��-��&Q��=�Ė���D$Ϙ'��-n��������9%��1q��[X��U�s�A���";��-����;fv������4��u�̼7�]���:���v��w~�7W�vqn�߽p���mW�C��e��c%��j��g�ݹ�Ӗ�v��ɻ>��nQ��Z�qH�4p��:X��+��k�
�{��a<�@H�E����N�'����!V�Ycp��,�����w�6l��=�Ox�r�_
�kwF��l�O��}��:�^���.h���t���m���][��n��F9h���t�X�J���JXf�7����ۻ�����-~��8�m�I�y�2�㷆�;ynne��q@j3:B�I���K����(�{+$�CB��*�M"K<�k�J般��_�[��R�;L�޽g�]3�9����Oeu/`bh�ٺ|&ꗬw�f��J�pm<�;3�����>���?�Z��i���u���Gs�\<񬱉EŬ�mwn�4q:�m:4n
h�|;�w�����d�+C��5�/�m��������d*̭��V�������4^��G^��׽��u�~��{ߺ�^>�׺ӗ�ob:c��w���bٟ��-x>H�����cvĽ���Y6u�?�R���z��_fF��}}�b�R�TTDһ���o��s��3K&���m�/3�c��@��v1�[����H�+FM���x�V}�ܿpm\��J�,��o�oV$MsŷA�>��VS�:����H���)�;�6�����q�$��g���K�/�{�7^C���[�f��pm>��۫ٲ��_�\g��Z=�Q)�M.�d�������️er�v��r;�e	-g.�n��Il�2n�^ܣeH���f%C8�kC�>�Yn��N\�9��ŋ�i.v����������쥤�iax�x�0���/���/��0#�f|��_�8_�]��z�-�7�o�u���c��|v��	ܽQ���Vn��������Ǜȳ�
P��ᑹ��m��7Y��.��u�^��Y�i?U`I.&���������x��v��/6��h�e��K�י7=��Y�����\���J(��0!i�5ˆHڷ�j�~��Y�{����۫z���}þ>+o,�D�W-��Fĭ�uV[%M����Ҷn���B�,:��,�<���Ѵ��tn7أ��Z'y�rm$rm�I�$�����;��	/�"�|��_��,���|uuut
�%�eO�S�G:��U�;��\��G��v�i��O|e߽���ώ����˟��3���;:�����7�Po~�ܽ�����ek�7E.��U��՗���������By�v+�Z�k�8%��{]�०N��.��<G����LQ��[ۉg��$���r^�Pa�y�oݹ~Ǜ�Ş�%�"{�
v��M��[[������e��F�#���sjd�:8ߎ���6W�}��_���@Vo�އ9ٽ�+﯐[_rVw�v��l
����_�o����:�������l�XLtq�"4iK������mKg��v������%�[�H�DE3�_�v��/eX�5��FMN��wH^��M��esa��
}�V�w�[��t#�����G����奸�'as�ڿ�ˡ��r���O���:G����~cepn�|g����b*��?���w>1]���GY��b:��~eh���Z�����]h����a�s�]��x�j]ȳ��q��(�d�D�ڤ�M�Z�����7�j�o�k�]�h���1�������_>��4�Ln$�b'F�I���ehhr�ʺl�7#IK_A_G4u��Uq%E%]%D%�����Ett%YH#��W�w3�]���D���Hee4
�@ �yu�K�{�[{�I�KY�WF�+�
���w���{�^��׺��֩��K~M�ͳ�\a����j�zl_�Y��Q�K��x���K�e���������X��fr��__��RIN^�14�t��o.Kae�{�u�Gqqg���E�����f�w�Y�8|x���+2�}3�I$�[���-�O��;���fM*@f�b����ju]+%ӇHb�c�50�ݗ�]Aڟ�w�����
���w_t|t���g+�x�����{��>Z�7iv�_�;'jue&�9-�=7�M���
�%9��s5��Ϳ���r^��˲r��b�T{���B-�9p���,l�,���&G�I��Ѻ���{�{���:r���/qk%��knVf���	g�-�i�yRpV4kx�����(�l��0w����W�o��(�Ӥz�
��ߐ��Xo���/����j�l���X���n-׍����B�T�MM)Ӵ��_���sM�O�R��<k$0�}{]��Lh���-
Z��J�Cn�����6�v>u�ɑ�W�y�m��҄k�����,J඙�,�F9d�@�5�����k|pn���v���ﭏS�R����em������Kt��3��=�ջ�UGX��M�T~Z�Y
���{����ڷ�v��kY��x��O�w�!�6]U���&G��8g�Hѝ�q���o��W[N��]Zˣ2Z�<H��,m�#�$�T�u#��%7An�?�׷�S|�c5]7�K���rG�+{�-�ٯ�͛���A��D�8h�M�'���ݫ����-_�{��md_��q�h(%���
��~���Q�j������{'Ŀ[%�/���+�j,#���6��o%(��V�vG�$ۻ;��D�<���m���ev&����Z02|�ٵ�S������)֧z�Ǯ��V}�^\TT�&7+SI�h���n#���sڶ�pm�o���s��L,uH�G�D��K��Wo��ZĺM�yfnS�{��.%�����%Z�oD��[�ՎD�TS<��1�i�l�.�&���3��Q����{	_��[��R�j|l��N������6���U�O�ʍσ�閁sT�r��U2�M%5UD�f���7	wm�3�m�����n�R-�����4���F�wq[]Ooo)�����m����\n��Yd��Y>�j�$)<2E$&)%OD&,T��}��~4t���R�m��p�΍�Ϋ��}��tk��O��U�2�G\�ު�����j�;���
��8mឧ�ҽd��ҭC���r�u"���w�ik��V��8�X��w/��Cuq�'���]��p�%/�m�.�d�tw-��u��%c,�jZ[����0�^'T����:���ehhr�ʺl�7#IK_A_G4u��Uq%E%]%D%�����Ett%YH#����w3�]���D���Hee4
�@
�ytես�����%�ѫ��G���G�;�]?׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�_����ߺ�^���Y����S�;{�w����]�ԝ_��3v�l���;�����ڙm՝�9=��g��{���x�j��c$L�|P�̳H�%�[�-.���8��6������N�x�HZDV�dYb.Q"=n��q�F�jK�0Fd�U�$�T1�SBQ��Zq�,O����O�J��m=Y����f��X��7�Mn��~߂�����f��K6�CG���2��SR'���7�N-�c��O���;ܖ����K5Ë���J�����V
.�]_���6o\��p�OSOH�DŪ��4��Č��*�ᰔ�o?���u��1<]��^�k[s��F�U|�l��_���We޴_Ŷ�@��y2
R���hǝ>ܷ�a����.����7-B"�����UZ�>�S�d�	�����oӚ7�cosJ�9j�dʴ���o��Z�A,���4�3�b�(�?�v��?�N���_#6�ο�;�b|��:?�;�k|��M���
z����7����t��u���[�!���ٻ�,�#�g���XM�6VԲ��7	.,�E���^)����P�<N�sG�豗�[���/�.hi��{��A���m�n�Kj�Mlnb�m:.$�+�ƒ�	.Qf���ֆ�~Q��m�ݏ����]C��=��7�s#�˯�}Qg��c76���꿎���Z��������Zakv�Ͱo��U���!^�e��Yl[ø%�-6�W@������	�\^_m��ɑ��g���Ua�.hP�X�����(X�D��"<A�y�8�M�{|����K9�Ip"�#�#m=������*�߰�~��;O9��I�l�֧�os��<���H`qmtu/lҶýo�ܡF��gs�$o��-E)q��&�$���?O%�/���9Zߖ7��
���N�A�2��hF.V+��	"�;i�
1�X��o��o�}}�ϲ?��7�N|��PT�������z������^���>3�6�%5-F
?o�ssd��^V���o��r��-nf!>�m��V7����rM̹��vo���..��䳱�U���(�T��u�>m��ȵZ�I{����O����,��
)��X��Asw������.��/��7�c����y=i�����s��ڋS��~u���ߩ��to�*��v6!3�V���J�ԥ���zY$�`I�v��c��m��>�u�\HXi2okh&�~�!�n<%&Ꮝ�?O'Ԯ�+�w��)�O0��ګ'�k�8{y�=s�����@$P�S���B�����O�]���v��ܽ�ó�̛�{��e|�M��ϸ���%�7�NoͿٛ{�:���Q���k�&����yd�\Yl��X[�;�\�m��B&�������\�VV��3,��F�J������%��}��$�H��C"D�&��.%��x'ep%x�a��fMc�
����?��;��g|Y����9ݴ�?���^]I��zP��g]T����3��V��P�<�����[���c���!��E�
�W�ij�5MH�*�XcTE�-F�_�;�ҙ.mmjK
����##C@�a]�&��L�f�B�H�
�F�ۤ��{�����{ߺ�^��׽��u�~��{ߺ�Z`v���X�1��{���r�5���nM��{�z���������u���Z܎���w>{f�v�(��z)�6ޭ�5��h�ľ��.r�����;M�K����-�G@мR���m���4�X�hZ�^�h�HZ�dX��2�?+=���c��Ù�κxy��n:t��$��
�`#���L,�av����}eM���wo�/s��_��k�g������{+��F�ns��k%>?�LT�MLby���?���KI'$���j�;K����#�,�@ڣX�tb�x����K�;�k�
�7+�W�a��=��N�SD݊
R1INJ�2}9f����8��Y�?��Ʈ����>�o�����7����ؼ�g3�ry_���6���?fds
4{����	�RL�Kwt��[��i+a��[}����"\��[[�}ir���A�sn�q��4xr@��-
�.Y�v{�J��w��/jM��y�.Q��<J����r$�hf�xwMS��������W���l}gRf:��:�G����2��wZu��݊�{1v�mkT�h`��1D%z�Y%���佽�n���Ccw�ʒ;���l���/Ƒ-UY��mcv>
�[*Z��B.���gi0�n��#h��<c"��O�
3
-p�2G��ܗ�,V+?���s쯒��C|��l�o�Y���?�h?�'���X�Wc�8�
�#�C�3x�ժ�m咪����Tm��z�ll1�c�(�\B&��/m���M�h�nY"Y>�����e1�I,�H!i��-e��0$�y��q\òlҼ�rŵ�����r�n�JGt��Al������G��D�R�kr�՗ҿ!���Fl��}{��}]9�vW�~���;`���u�߹:�uw_her�m�ٻ�k�{�h��OL�g+%ڏ�K�*dZ��I��E���X�mw�3�wV�.�k%O�j�Wr�]D+�0\GhD�ΑG<j�)(�z����[����0s�[�"�t��ME�6i,/;"K��H�2,+����_�O���a��g?���ڛ����:��>��s����Tm�ϧ���μ��{#q�|;C_��p5urGQW���x�������~o���[��l��m�
�na���%Ia�4S"�Y�Wi,��L-c����cɭ{v&���KB�H��
�$����Ts4�W���H��ј̯�B�^�쮍�~���{��7�S�����}�{��V���66f-�.��r��b��q�lV1���KNS†�컍���8�y�yj��]��^I[$�I#�qwf$����-���o��!H׵�(�#�0lh��h��'K:��u���{�~��j�Ӿg|�?��ǵ�����G��\x�͋���?�O���!I�{�v�f�;˹:������ϗ�}�C[��C���m�\�G%*ߕ�`�9��c���,-��b
bd���K��#4�n^�Ƭ��@���$m4��w�]�+c�Iir�K#~�7E�db��>�h�8�����x���0����N�+�z���_�Ge��?�f�G3��λ�x������;Ck`6U^+���l�F�ۘ%Ji�պ'pĘ���Ia(�y�z��ۏ/�m�=�wo{\�&]&�$�o
E3~��+/n���*��[>��n2�oݲ�"�1@#�$�d��\�L���ՙ�����|]��һ���u7kvo�?���=e�;s�K��쎈�[3�r�Y����ü(�4�]_H�)C�0�����N�U�s]B���v�aӷ�s�W1�"�%�Ous��d�����Zc�Dd	42,�6�=�z�ܹ7+���0A��mXZ��H�5i�%��XHF`�j��$K~??�@_�/��Maz��+�6����1�����~K|h�3�ڑS�;�v�Hn5��y$E`�,������%P�t���3Aal$������d��Yg`4�q�k$ΰ�k�
�;�]�'���&�.a�L�q�k�p�5g��1,�Hڤ.!X-�6�W�o�S�S_�և����긩�-������~�m�Q��a��F�1ڒd�%H�m�
*p����yA[��:}a-�4�]��_��3d,m�m_REɈZ	��9�[�m[��ј��8?P.���T^]}9R>��s
��.��{?�{�7�o�_+3){�r���������
ܩ��K�����ʠ�Plm��w�Od`{B�7�;C������j�!Y���['k��B��M�Y���g��l�ikb�޴~#������!��t�w}�v^����!���K��S���}j�Ry��a�@�41N-��=[�G�!�\)>t8���o���G����&C��n��}��:������N�w7Mo�s(`�nlF[%=d�.��50��>�q�#`�r�Y/<��֊|7�+[�k�fK��G4�踍����8��a�e��}�Χp����m�I�0M}{xt�5�I�[�$ѼS,KG�R��#0]��{���a��-�?8�+W��������a(��4v�:����al����ɱ�η�w�}s��Vj)�&!P�UVcjL1���_s����5���6��QG{isq��kt�4f�.#����[�,�H%�h�K�켇�����6�HK��n�$�pE�K$�6��Hn`f�e�3	O���]���ѽ/��5��q���~���U�aۯ�a�u���|���ŵ%�N]�SlW��1͊�5�Bii�xQV�{.�{�N?^y�F�zbǾW�V�=�H��]ى%���-���o��!H׵�(�#�0lh��h��'K:��u���{�{�^��׺��u���{�{�^��׺��u���{�{�^����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^��׽��tX�g������O��NR����):/��_eI�;g=�v�Sq��ll�*�}Żk�qlF6����"�WEAO1���ֈ(*Iw��-�w���V��*�Ҫf�bVr��L�؎K2�*��gd^b�,6v��Ż��c��F��ZW�%�Xb22�f�=R��7'��e�
�ÿ�[_�?�������M&O��K�_k�Z<�(�龕����ro����Gw4����H���VӫMt�4�*x��w?�{ͼ���C6����Ʋi�EէU+�kJ�p�Q짣^���{�{�^�1�����]m,Vx:�r���vn}�X��i��ܻ5v���S���_�*,�]���X���@cY�[-���V�Y��I�xә��@�L�<f�6�
lNʑ��WK������i�h.����O�<V����A������5׽��u�~�����+�~<���n�^��ޏ�|�Bm�I���l�]^;�w�fSW��Օ��te�j|}?�"(j����I6F�c~��^[#��v���Hs_��k�
�f��3�a�O�EQs��똌������s}}�6~#3QV(|Rͧĕ�0Ʊ�k�s��'��׺��u���{���u���O̞�5gV�d�ݟv&��{S�;_�/Tm������W�=m�S��ݛ�{3'�(#�V�ケ��S���b+ᥣ�&��"�o��ߟ�u�n��w�������>���
�<fw�Erb�:�%�ױo���v��}��:h��m�s���a=�VI=�â8H�ټi��K����O�enZ��RY?�?v�;N���nw�Et
>Wrn�e~+ot���ߴ����V�M:Q���qu���#M=U�"w-��o���֗{���31�qs<6�<��53��R��O#Ʈ���A��7��5�ֻe���q!V�[�5�Ď�c�Ťi11;*�!�b.a�53����'Lom�Z~)�w/�܇kt�Lo>Ń�7o��n��;Wcc��V�.7�w;���ho
�AG���o
��P��05t4�5YU{l��ݴ��+{ּX$�,�Ii{t�wj@��.֊k�s�5DŽ�:�����n1�}�1sqo�,j5Ʀ����.ot��pxQE<����/���%�c���wO|@���s��]v���Խ��8����ٺ�K�������n�����ؽ����2��1�6-1�G)2�i�r��we=a��I
K�Ĥ�n�4Fmv�D�a���E��Gp�).Ҥ�:��\�/�Ǎ�WSih�[�R2��z��e�Hƈ�1�g�P��$08�Zd~u6��:.���K�{Ӣ:c+K�ݻ[f�=vv����sd��T�0�*��
�E��e���A�KF�Y:Y?��_$��o�v~9���WMU�r2���ҏ�h��YT<vq�յ�մ\�G�0���(����!,ʵ1�3�2s?׽��������ϝzw�l��Xd����,�o�T��$�YJ�wG`d6����r��(kR�g�[3'Vg�0R�t�P�U��6�c�EVܮ#��4��v�=�Ö��Xፘ�+��D���4k��[�r(~��@en:>��(j>"����t�5=Y�H��T��׺��u���{�{�^��׺��u�~��׺�����޽�ӻ3���˭��˳7F��޻���z�p�}��G�1��i��
��o���l���z�Y��S��)��d;�յ�S������|F�m�(�W�{��sᗊ�O�e�j������nK��v]��
�No�	mf������{��T�ǚ	m!���ot��۵{g��GfTvh�X6�ϥ�lͱ6f��'�E�v����-&�#���=��Ez!dI*U�)gV��ovm�T���in�d��qH1�V5gm1Ɓ���5fH�nW*��igsw1���	.�$#���I4�.�t������=������Y��ٻ;r��_T��r��=��ػopn����ŕ������v��d^Y����l
��E�I�o����x���/�����
5�������H���-��a{$�G�_
᧺��t���V�2�7�*5�!"y�{�Mtv>�;
�k�.'�����flL
k��KY6��S�%A�����t�L�DB2��b�@�N��DI{ccZ4�/qB-��}Dt�h��K��Jd�=%"��o���hq�Ԛh�mթܩ%���"��1��Ḍ�9�9�oͿ�+��u���_��?{k�W�S�
�G�߾2]#6����g�z��ջ�)k�X���7v���(vD��:p��U-nJ�H該4�[��4�r���_݉OpacnӴh������5E�]<f������̚����������?��R(|Rͧĕ�0Ʊ�k�a�=۝w�;+`�wsA���o�ӱ6�P�&����������l]y��(H*���5�"�X7��]�/}���ӚEj�Enef���ET���[*�VJI�Y�$dZI{���K��q�d����xZKxչ�'k��zu����p��<&�ٛ���)���ૃ5F
,�7)	A<1[X�V�X��te[�k{���a��;�Y���^Q�nDե��7����'R��w��)���mqxx��R���R3!V"T�AMQ<T�V�K3S-E\��Δ��YQIF�N�*e�0�ju[��̯
��Gl�H��#B�܀HE22F�j�tJ���T��K41I2Č�mEPB͡]���;U�'?�Y�>ft���l�Og�#+��ӽ�O#�۫v�}鹱5��;��*��_dK_�������=U+#��Q��>J�%Z�[�\r�(o�\$���y�5�A�76�U�H��}a�(�~����WBK]���Im�o��*��O�X�^+ʊ)u�+�;hf1��^��;����'o��ꊾ��c7�~����w&��Y��ɧ�V��
=�G�ړ�q�[��ޑ�
��%U����5t��&�ҷ�7�NW��B<3&�fa=�Y}6�w�٧*Ț�tU&�7j���ov�0���6k+�
(~�[�$��"�	$u���T�⹸8���7^��׽��u�~������ߺ�^���Fz,��L�*�i3s�����4�Y)&LuL��U)�
��׊OH�-�%�;��ǽ[�����m�ҋ1��LIY
��#��rXE���b���h��"�2��j��?�5H��S�//�Ч����S���<|���k����~w&��ų�^��������8%����d��o&��f��a"��Ins�m��7H=��e���6���MJ�7pܤ2���I����_n��R����w��[�܊�V<����y�����0�����IX���[x���d�Oپ��;���;pk�^®ߝ����f��L�g����k�vG��S����)���C��uw���ջ�-��{�v�cqb�:;���z�ko��2���7���!��6�tn��+��;�k�d�T��Ikwkyi�κ�������Se�Gw5��y�ɯ`ŶK{�,�۫�o��Z�Ŀ�l�k���q��IK����ō�kk{���z�I�W�Sou/v�
��==����SS.^�����@�,�Ϩ��]��tu63b0-����־���qy�׶豸�&L�z����\�sK{�n��$sEst��o[9�o�Hnd�pܭb�����tK�7�����ۖ7k8E��ܼ�o3�%���,6��nz�[�V/ݗ���Ww��B�C�Mm��/�a��ҽ���_��i�2����_]�7����K�-?}����<�jvo�L��}���p�s8)q��w�K��5�OM]MYF�%=8�x�m�k۠�
���Vܕ-�y��/�%��$i���V������$��u���k���k���Յ���kq5�K���or�qns�5������[=�ЊHm�v�EmI=?񷭰��Bj��_=�3�|��U��v|\�e}��ƨ�ڽ��7�bn���ޫ�ö2}���w>߯�ݕ��J��IYP7�S��>���@l��ێݻD�Db�ug}�����V�7I-�m�t/�8������ps�y���x�h���/,%���D7h���a4�-�E#
�+����uu���l���S��;��7Mu&�ٿ
�����;{	�#v�h|ٛChmާ�썥�7��j�z*j,k`(�p��WOKB��˿�l�[�Ē[G(r��vr�
�l�`bI�x��K{���Ԣ�	��6�r��̒m��o)]d��
Q൥�-\��(�hC�7+��#�����wq$����;uvJ�������.�R}Y�4u���6Z�}0,z�zG�9�7RTǾ>bmX���E�ۀVol�hZaG��	w����p�q�kx�[^}�wM�Dj����q����"�!�{��x�]w�����3�Mk��D�|�c��ф��#Vw�I[�t�xaK��65���B|���~S��p}�W��/��¬�N|4�LF#`R��XUdzί��i|
ݝ��uR�f��v�ݽ����^a'�3ǖ�bsmi��<�uy��6�m�W�w�������Id�QB��Jl�Io6�d���ø�`�Oj.��3n��V�m��m�M���5�!�#�!����c��qT���<(�|�v�"�k��̯�~��]���kz���Gv�N��cN���ll��X���
�6w�kv>�v����2�*�S��I����-u&C)���+e/?���O����0�G4���*�i$r<	$��_㹶�n.�+�5�{��r��i#�,�v9H����mr�t4�Ha!�	,���+-�Ź)^�F��D���omߋ�$���-���1��ҽ	��-|��8������;�;�:�al
|��.���ۺYbٻ��)���R��p��K.���o�!/%���SNc��,7�m3�L�\;0�x����w{t�nЛV��gع��VKI�Z����}��v{���(��*a�"�����ɦ��C-���]�-��n|������o�wG�+��N���?�_�ۗcAе&���~<�/�f��A�:d�ѥ���l
�E=Lx����r����Տ2$7��h[�*�ܩyc���&Wa;��eii,O+�"�[��˛�U�;{_�-�-�q��ͳ��+�^�����V�u7�p
Y&��iQ��'}{:�+^����������vF�K]︾?u��Z�}�Կ�Wm�����N*����k�l���SA��A6ڠ��"�J��c��6.K������]��
�c2ܴ�1�P%�G�;��{k���.�noQw9+˷]�ѹlvoo�W�-�m�m-��H��#�u���ݴ2G�񉠷�\��i^=?׽��u�����0�v��o��.O�����wfo���7�0�;����e�ч�g�o�{�3�;Z�bm�ˍ��n�6\�&i)ih�C�ZO˱˾s���[Iiz�b�����_�J�+�����-��n�=Џs��o�n���=�g��I�K{�9
�W��;2��Z�
�E��%�Ef�l�Y���i6�=�,.��]����t[`o6�լ�����J(�b���[6m�()(Fr�����c��C-}ڮt�LR�@���S^�4�e��]����])ۢG��j������2���?�ċ�L�O7.���þ���P?�[�^��Ҫ��g�:T$�_˖P��+���۟';[�vOV��؟1�<w/V���=��_6:���=׵���Y��+)�������Y.��f�y$���s5TuU�<p���|l�x����O1m����!ܒ�9���)�[G����(�Oe�K�v۹g��կ-��2�\�6�_Uuc?Ѽ�ŸIl^�f�ʉʞ1�m��F�{"+4����p��ڟ;�¶������_1��.��={�vT�\����_�5=[��kz����3��m�.��Ǖ��lE>6�*)膹j�!�M�}��Ai��s~u}7�Y�4P�v��~����˷F�
�a<sk���K�V��$��m�d�u�{ݚ���][�I�ۧFO��rX��F{vB�R�p��6�8~�ݝ��Sx����������{�q�z�-�Q�g�����S�����Z>��;6�t�v&��WQA�M�,�길�0�Dno��w���h��[)�YQ�)%���a�eV�5�VЅ�p�����J�e��H/�\��A����K91��O��P�v;���$7o�/��]]�
�):#�wpt�J�V�N�ո�c
����y����~Sb�0w����fˋ�䶮qe�C/aGE*�J�6���6����گ0l���B��v��X�o*}ݹ����mѽ���Kr�0��u��YM���]���v����W�֪��X�n`[��	�t[��D[�沸���O�]u��G��|��_�;|o^���+�>����3wV����]E�~����׳��kuSq�ݱ��t�Yz*Zܽ4��8e�G�Cm˞�r�{<������4��<[��Q���c�������s)������Ċ[�fI���3��[�-�鳝�n�X�,f
�z�n�Y�X.�r��H�9��%��x<H�D^����9�]���/�#K�3`|��<�/��,��#�w���ϓ�u]Q���'���ۿ�0}�qT�u���C���l#c�/Q�ơ
�Q�a��]Y���o˷P�"�/���y:$F$��n6)�[�aI6�g�hm/~������i�ؤ����qX,�Tx��9<gم�+s��O�hM̻���1����;���1��Ciu�F��N�!۟>L���M���l��g��^���퍝��U���WOC����
��9*ı�!�,&�������K2"��S�R9�-��"}�T�����Wv��x��m-�z��L�f�Z��3�{I�o��S�_s��UV�#Isb�R�'�����{+�o^��׽��u�W������﷪>,�����/�/]���l��ߛú�7�;�:ϩ;��ft'�<����T���f��T���ۇU����3.ٿͿ�<���ò�U#�K;I����3Ii�~g�{i�ͤwS�tW��Ϟ�q��vM�
��K�}�+�����C	��Bx�(�ܯ��hS�)��'����?��f�:|���]���w=��}o>�����gH|��zGp�-꽹�X|�'����[5G���w^G`���Z<u4��q4��#kk�����smk�Z����u�%��;�c�]���Bmbg�6�w7��������i��o�6�����+��^�����6�亘Ͻ[�E�r��=�����K�nmn��{�Q�~>u�s���H�.��������o���ؿ&{��+wÞ��a�+b��ζ��φm��9�l���e}�Ѧ���O>/K��j�ĺ�9��)��v���K�t���|;���u��s��\����k5ʹ7[�˽�	�
��/j;����Y&�a��ErR	M�Yc�����Ya����"�7�{��f�;��?����к�x�vn�_�~;�6�?�hR|c�}�]��u����/�*�������b�*����VWU����O�?)���<�����?N7[H�e-�����N�V���-���X�4�Y$|��Iw��f�y6��m�t�I	�&�I�g���.DJ�[*�lzC�:�g�c��E��>Nn摴~�o[|��E��Q|~��I�q�}�6��p�_�_*s]��[N��f�
���;�G��L��5a��c��n�M�T��o��r�mI,�yZ��:�v��]��\_I��7qoyoq�Jw;sv����7r��6��?8Z�_I�^	���I�ޙ-�l.R���:6����M��m��y|@ړ�Il��˹��So}������c`��Gw|q蘷�A|��Xo���_2������[����v�wodo<FS!
O7����Ewf��.>��}������B�]啭��E0�vOz��v�-��;kh�/a�b�p�
�/�s-��/1n��m�,o�~�K͞	�$�渹��y��n'{V��Ge-��,�5W�jb��5}��F�]�����}��||9�a����u�	q=+��뮆�ۓ�:W���UB��6�&��6�ܤ��8�lmś2��gn{��@��2��Vkɠ����&Ϲ]��i�ı�^ً����]����Kd�s��{��sm�r�̀�mcx�w
�}�����P�[���wO��io/��}|h���T����-�?���)��>?m^����6wR|q�F��=�_��.����/��Vg�0�g~`�~,W:��m��j9���,{�,���;�v~g=�K����ݗc��I<Xg���(�V�hlf��n�}2XZV���r�<K�q=���]YC�e�r�ݥ�p���xw+
��ڴ��Qͼٝ�-���\���q�N�ߝ����5v��<���������پ����ʮ��u_W��W����t�gqq�m���JJ�K�j(�mI��G����sdW��T�ڮ����(����wՖi�0X�&	¸���C�H�j�{~޶�T	ih����~��66��R��H�w;���H��$���6���I��˫�����;�i���=�ӓw�E��Omo��Q���f�޽���
{�=�鎋]�������Q����dy��[)�m��]}���{��7�y��=�g�������x~���no.6u/gpΆ��yn.�y��	�9v��r�X�M��_��0�I,6�����4��oV�E����Cd��ok�6��>�ǻ7n�kl��(�a�`I��1�����S�(~>v��jN�ٽ����v`�貲fw./
�0Y*�J�l��<̮]a�?=�3]me��9o~K�pkie��d��D�a.���XܗpK���`�I��#��R�K��@����0�p��K	<P��$��
G%�����[n������߽��f����V���7��]���0���;�7���[��O��?��l���*�η�V�޹���r����duYj�s�l!0�-�}m?�W��n�dP��6�DŽx�,�b�;L6��̓]/�Z��x(�x�j�o7=�Q9j˞�haRЛK͎Q��o`��M�D�q�Haop���G	�0|}��қ�M`;��b�?ï��}���w�5�޽ճ���G_�����֕�ϑ�,���j\���l�ׄ��X���k�(jqKK�-�y��.v�yc����)}h���M������j�Z�}�]��9v�oqke,���p��nx�ʑ����r�,r�"%�/!`i�K	Z�@�sMG�i�n��=���n�����}��y��ڟ���I�����=�E��S������]��[�eu�@�n�c;M���.��uE-,�h�c���
���{��M���?]�#��M�=�^</�
���_��F[�o�%��r���_R�[��ɫ�{<����Z�Y��������/�7ֻ���dX�|	,.Z�e�����*����>&n�����g�6G̿�Y,^����>WI6K�7�w�D��cyw¼�oG��h�I=��f��U������ݿ({M�p�c����^0k�+۩��u#�T�oq���eyZF2O$sF��'f����.�d藛��ͼ�v�햰܅��Z1��P#IbG<��ֿ{;��Ku�����>��)�+�gx��g�.��l��A�_"�G�Κ�7}�����]�3��~��P�js�]dz~�jRQc�jjqx�\m/,ú7"r�r��Y�E�:n"+�4���[��m!�������Wܭ�wH�����������o��h��KY/yR~Sۤ���|Av���QO+�\�x{kL���K<�
ʹ�'F������ߝ�û>6|����s��-}�ԝ��>|��G&���ƽ��S�>:�6�UOA��䨺�|��{�j<�>�Z��J�U]m�n�q�Y5��y���f�	��
�u�[Ri5��G$3��ˀ�����c&����d�kާ��q���nX����]�ڵIh庶���H�MMk�]�bV�T6�[辳�[p쟎��.��g^7n��3�{���}���8����&_�jS�v�b�C�0��cM��p�<�B��L�vVJꖹ1�Wk��oxZ����m��o񷘦�*��1����6�s
����'�}%��y�{Q�{���Cu<WvЦ�2M,W��[T�Wtgf���E5�f���ZT�m֓nj>����gϦ���?{��{ߺ�_����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��tY���?G|���)�;o�-���|��*���]��k|�S���W`z��6Fx�.j��l�k����
)k�a��J6��ߘ-E7h�h�۽Do_<'�Y���Jq"�I����k�f�uw.�"�k3D��>*i�|)��ȓ%%�Lǻ�N�>����wY|��خ���.��9��y�_yw���x=���Y�N"����db:q��y��$�<
l�3��C��Q���}�W�x33~�x�4ǦMJ��������p���p��6�����и�/镜
>!x�6��l��X0�*1��~���׺��u���{�{�^��׺��u���{�{�^�1��۲�z�~ɽSk���Yv'hvoQ�+�T�K���]K��N�����-�[��w���zy&b[kY�{�#�(�W�"�`���w���G`��1��%�fU"��Xn�y"ic��D��+������)PR{y"�3�E�B����Q��q����v>����CO%
,K-,	Դ�F��*�*����q=������\���ܖgf5ff$�f&��$�I$����H!���#��DUUUP@��g��w�{�^��׺��u���{�{�^����~��.��.��,W`Po��;��y�&Ktw�y�Vtn|u"�q�z
�ٝ���V˨��
�L�,v2:|M%j�tt�CM�F۴.�g۶	�`���+�I'�&�u�Pgmu��6�[EK�>�Ż�5o�[pG騁��LZcb�eQ�����b�鯈��]��]��X����$w=&��L���.��6���U���3��#w콗Q��A2�`�����4T�������fл�n�'i�7{x�)$�$���-A���vH�mmE=�H����xտKU�R���:�?
=1iF.�UY�
��.f=ߪu�~��{ߺ�^��׽��u�~��{ߺ�^��׏�~��}��#������a��]�Q�=;�3�7�73���m�,&��R���U�{k�1?����J�&��kd�|u��8�����{�nCM��ſP<
b=2jUEq⢨'�4��^�G�v�
��cmt.cU�2'���z]�Ax��a�I,��*9��n�׽��tY�k�?Gtgw�p��+�(7���I���%�;˼�+
�7>:�q������/e�cp�A��,v2:|M%j�tt�CM�Fٴ.�g۶	�`���+�I'�&�u�Pgmu��6�[EK�>�Ż�5o��mԯ騁��LZQ��}�F�vB�y��I�Y��'2�7��R��]J��h9��deu<�>�<)q�HX#�RU�(t�tlᔆS�
�z�nc�$P)T�C�z�<�E��7ľ�����^��V�����7gnZM�ݽ�ݵU��x־Swn:l�xv7cfq5{�14�������!<�s#��,��rvͳf�Q6�5+Q��5
j��U�=^;��呞�,׻��ܻ6�xP��
9�t!��Yc	*�|�(bT2��ֺ��u���{�����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^��׽��u�~��{ߺ�^��׽��u����݋�9-rl���SM�R�\J�)ff
*��Y��PI8��'J�������gv.�o��ݛk}�Ӎ�1�7����>��x��/K��n%]v'/��Nc��i"q�oo�R�#���i"��%E�7_T�]a����
�ȍ�Vҡ[�&��9a���'S��)Q�I��`GJ��S���޻7����w���;#mǓ��d��=��x4�n��;km�K�5tT�ܛ�1I����嫯���%yeDj�seh��w,Q
����dQ��y�(���u�FK�U	�e�B#��Y�s�c�$y$v��3�
��@���۪u߿u���{�{�^��׺��u���{�no�6��;;c�-�0ӱ��C׻?5�pحӾ����[�-�����-��۸�塆sIM���N}�"'�����;s;��:��GL�;�%�hb2�I,hN�JD%��GnӤ
�
�:I$q82�C+���)
F�"w�ȿ��k؛�;��k`��kH��oWo^��W�{*f���l���P�]�#W�\u5A�z?W�f�p��lM�Co��
w���g�j��{��	H&5�NWWn�pn7�
��B�HBF�3ċ�QZVy�A%���Y7[��oǭ��[;���|t���n�nj�_���
����זO�;�2��]ṱ����EG<w���ٓN�i}qqgb|k�U�D���U����*T��%������+�1m�Mम4�������Ю�K,B��C-�}�������qo}��ޝ�.v���ˆ��.����l�ul]�&����-3�JoݗBs��0��kXN����XH�i�FV%�hb2�I,h[T�
%"�b#�i�s�3:I$q{L�����d�F�b2o-��:��������{u�
���y�,F��6{u��ckaW)����l��ܙj\~>��欮��U��N��$:�.���啁+I�II*�
О���WWO�/4��c�5/$�x$q�,��*�%��*�?������g�����^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�A����t��M�W�]gM������iToͫ燲7˗�0=.
L��c�λ�����£WGR���-�o�q)v�U��Y�d�QJխcu�����
E
��Oo4�:D��LY�`���1')��E!:$�&PS�?�k�����[�vv�����n��nN���p��o�sؼ�od�3,n��bwv&����m䲻c1G����8e����V�Tv�Eg�p�v�4�x�)�����
��'ā�P�o,o��RI
Y�0�hZIbYT�M,IJ֒PQ�UI�v���MyL�+H+�yLv��1���V�c�
~g#I��Њ��a��er��R�E���3$H�T���fyT����I4�ӭ�:&���O#�%H��#��j��h��Y�����G�[��?Տ�;�zl�Y�h7^��;^�|�X�fɢ�9�^�x��9}����*�i�����V��f�jJ*��xᑗQ���(�k�#�E�r쐡y�/�V(��`(�5�W��[��h?KC#Ӳ1,�v�TI<�@���ic�j}۪u�~��{ߏ׺H����#��[�jo|f#q�=���m
ň���ݳ�[{v�l�f����q�l��9Yj�k!xfD�Ec"[[�N���HdIc�ɮ6����R�����J��͜�R�U���Or��H�P@&9�k�*��>��zKaw���y�ݶv������<n~m�.{����c���N���U�W�Wlf(�4�V���U�P��J�Ո������ƒ/e<X��b�1�D<D��:�P���xb�
I$2-I,K*�����x�A��C*�7
��n�׽��u�~��{ߺ�_����ߺ�^���>{-O���3���-&��UEN#j�i�VO	$���<P��T���U�n��.��<v�Nʴ��(���*Uh*@�H�~׷ͻ�{n�nʷ3���P�8E,@'MH�
yR�Ϙ�O�;�m|g���^��Z���>���;�k�vs5G�wGV��Cҿ̟�{+���m����l�W�j�US�K��KG���Ui��v�5�ѵ�p$Ԑ�4S���p�2æ"{���*�,�`|h����sٷ;͞�n��^\���;Qg�1�;��LD:�D�6�����x?�W��x}5��M����1����
��6���>��쬟Vv�m6_{����;+)_��'�~Fo������{�3})���&p�m��ۤ�g���[�[�G�햗���e�����)f���kmA�[?����K�k��f��l�_Xf���
�w%�͵�%�,ȶ�ܸ�{)ṘF��f	-
yg�7w��(���E��[��2\�au�Jd:w�&��1,���پ�k��K׍���Q���.��|x���Nm��uuY
�vW�M}]
&��o�2��{n�u��r���Z]n[G0;��z-�K��ax!�n��os*Mr�=����F�5����.cܤ�ŭ�خ�Ɔ�3�n�Goh���sz�c�kX^g�6�$�%Ulo�_���b�5�Qo_�.�Ͷ���=v{��>m��9m��4��z��=��V���U�=��e�IVr1�-m�2���6�{�rnܑy��B��k��D�$�F/b���-�	�4M�]Lfi#Yq��Y���5�R�~����F�.����[�3#�,��p۾��伎�sµ��3I�O��/{���~�a���_���e��tf�鎵���n��7�F��`��Ӕ�}���6�쮳�xn��c��>�hPI��ʡ�?���V��:�Y%�����s{ɷ;���TX'�ڭ76��2d2��g���HZ�xm�M���5�4�����������!��fy";��e��UX�2[]Of�JI�Q,�@ٙ��V�S�?��G��O�k�æ~|i�|�;��{gq��٘M�֣#ؿ:�
n��������X̊�
�׊���n�l����6k}��q�.Dz^ܔ��s	��
�K)��I_4���r[m[v��9��.��`���%ⷶ�~��"޶�r�x��^[}4)�O�
ks��S�gɟ�?67v�P�{�s������.��8L.͢���ؽk�������#ug����;����,���D��eH����֗�6ǹ�b.B2��#7�����]�F��"�y|V�m�K�R�M�խ�[��Ԓ,F��I�V�M'1:���—
��յ5K4���=��c�v���}�ҽ���~\|f쭃�7�R�ؠ��x~�;u��]��7p����Y����˻��s>cng�xJS
E-RNZd��m��I^`�9�m��R�u���pMJZKdym�#��{���Y��S3Glo{[�:�)�{�$s#4k��[˵�k$�3��;�U������g[��>FA�r2��~Ba>-�o½ݺ����ܩ����jo����=��x��S��m�*rPd��ߔ��_$8�R�'����[��Isi�q�1�Ȧ�b2?���4>[=��K�7.�4�}|^��{i6H7����MPl������;m�6勒����as
�}j[Z�P��ɰ��K9,��o�N����򷢾D�u�wp�L�\f{����ؽe�[K�z�b�?_��.��{۳��?K�7�cs�w>�X�(~�:�
dt�(���t彿��H[��wY)qa2/��u���{Y�2�g��T�
\���l�"��%���m7$
P�W^ZI�Y�����J�	a0��$�>��}W�{�^��׺��u�}��uT�.��`G����l&�٩�u=��#��{-v�v���u�*]�>�?�)v�6૚�<cT�4����Y������"���落.�E�r�q<�P;D�:F�	EwU!X���d�^U�X吴ps���1$Fg�7����A╧��ê�P��؆�o|��ٕ�`�������-��]���1Sv��Z}����X���Z)*���t=-6Ku㩘���?E��p�<	y;�K{����+;����&�k�#�"Ѯm�%�q�dKv��+dzH�t�
��h�t�8��3o�\��X�d�[����q���ł:�����`��cm0��n6A󟢺�:���o����ڝ]ܙ��o6ka�{��{q|��=W�U�m����̠�횢�F^\mB:D�x���1r���-�ygx��.%4��[��vay�T��$�n�v��e��e��nV��w�~b��w���b��mUX�J.-|�HjE���n�6��^�L�7=��ܢ~Wl~���a�ʗ��?b�._~|��1������\�[/���8ͤ��
F���t�Wɒ�*���j��[&���w7s�����^M��2
�
����̽��
���pZ5wA@�:K�7W�\�|o�.p�hs�P\m�ɕ���@d+OC�^Q#��6�g�?��[�}�/��?U�}�44�M�7ˎ��tu�;�6����W�b��x�̶;Y[3!R�BH�JY�x��W���-��X��:�̌E��l�
ƄԪ�%Aܟ�6��=դC�gi#��ٕY�a�E���BK�>V�1N����}_��ݟ�G�~_��ﵾ=wUn�ܽ��?hm~���S�|���"ﭭ���
���|A�ݱK�IJ�<mC��Zm����h�d�;M�p��m���+���n^�{���V%w2!���<�^�v�;e���Y�������U�#�l�Ek4�Eqm|o��a�)a�N.��!
��~O�����=���q�S�7��i�]���C�:�p�t?io����c�!��ao\�`�#����vF''�n��*�/���l���x��>�si�//�|��a�st�6�&����D{�n%��k��~�tX'�#�"��^���Ě;>_��
���v��
���A5��#=����<2U�zW�/��ϐ��[|<l��V���ž2��[w)���=��[���Wh����s&S�:�ie�S�N����F�;S�+%y~�/�j�u��
�b��z�n���+ݲ�B�Q����)'�d������m)�ۇ�o}u��\�o���+��I]eX��$x��+mm<M�^�۫#D��-�����Co�؟"r�d�^c6�o=�v_�����*=Ź�#븷�`�Gpu�ʮ��K����|�ݹ�j*�
<N�����e>��aw��9�k�Y$���A>�.���u3��x�"[I2Z���_�%�0���8)s*F�J&�[��ͭ�ZmRV��c��ў�n���sv��O��~��{ߺ�T��Ͼ||�����	�1Cћ��Gƚ��{󩲝1����LE_t6B��{ܿ�+�w]���Փa����ݻƢ�(��\�Yi�X٤y���q��/~����J�u2%�k�C��.l�;u�����7����q,&rmR�C��{T�3n0_�<UyaHŮ�tx��x�Q�Ww7VPV5���[�#`�7�ÿ��n��v���������޽YQ����ש`��D�
����'Ҹ��*����jM���ݘ�\�pž�g��f���6+ne��k(y��j���V7T�������iE�ڭ̲,2C����k�&���^��<������+�IfoRk����9�E��<�D�h�}��{�g���0�ɵ��s�>��s���������}��=�ޝ5?�-��K-�k���~���g�l��C�m����9z��2a�a�̻v��[:o���h�y��h���Um/,�f���Va/ҋ��#���Z"R�Q��9~ɹ�x�m�dOw��;}���j��
�s«�<�B���}��{�fW�Ͼ�}A�˷2��G庣�G�X�Ǹ��m�{�7V�S�N�m���.�C����8���Y��������
����zm����m�˸��6]��9K�t�6��%�,�ViU6@M4Ea
��ߛ��9�ՙwӕy3�|&K�`����X+<�f�����.A�q�\Z/S|����~=���?�K	�[�>%no���r��{��3y���S��>��绷aw�m�YT��9��[:�[N���#����k�R>c��Š���khm��K�m弖V�[X��3yx���m��ȗ��"}�^��|�qe���w�-�rė7Iq��t-�`�݉]�wa�ugs��%��9~��;����2-��}�Օ[����x�����_w�?�z|t�o���M򮳩�n��2�?v��E.��A=V�ٻ�1�\�.m��Z��j�ۢ�޹a��o���l�)
H%��
�,����F�RN�y����Xe���[9⻵j[Lc��v��.6ˮCޯ-䈼~
�~�,�$�R+�ͅ��ڬ7���?�-Lj��g���~B�w�L����>Q�WΞ�����@m>�ߒu~��
�|���.�ْ�&��{�w�^�l.��q�&¥MnL�>&L�y~­�{]�[�oq�;�
����j�h�d�X��]��=�Mqv�j�eo=�Z��W�a�+�ɤ���f�㉵���x�8ί[�Yg�aS3]\�5���|���>umn��]w�[p�m�<w����l��b��S��݇�_-�?��r�%��79͸��2{�Sd��As��L�߮�'���d�ɾ���ט#�X����b�%wP��Ik2Okp�|9�,�-$L��[��;ӿ�;�����d��X�Ŗ[]�v�k�9���GqͥըtY�x�M��f1�{�>f��_��'Z�{g�>@|��F��{x����w�wrn���=ƽy��{�G�;B�jn��6靖���<���G�Ӹ휵�ܻ7����7��G�-��;����1��Qh�C�xR$�Y������.ӹ�,�E.Z
��h5Z���B��$�v�x�����Ċ�"bX�>b|����ck���}$��V��]����5��7s&��yM�����_%��z�u&C���`[6կ�9���<=4�M�z9oo5���k�R�]�
���W��8m��
�A5������$	�ۥ����*�ucw0m�������1��$P�a?��3�
��t�m��sml�k/:9�b���p�";�Qv�����v��cY��[��ƿ�?�{^
��?�r�Ҧ�l�wRu�o�C����iq1Qb7FO5�2�%n=>�cy�ܷ%���{���4\�Y2/�s����W�	���>�d�a+)���o������p�1X��ղDg�H�v���[E;��(q�V���ľD|�����o{�p�|�i5n��9��ݻߨ;�;����w�W]�|��\�Pn=�Q���c�s�G�5�mu����q���+������I~�Om�7X�.I�Y�㶼H�B��%��oz�䥛5����q*���Go˗�7�c�ج��@��}��r�V�����x�%��6�1=�ۘ%j����n}����3)�>!o��_�6�^���'�;���-�?Z��h1���!�(1�������T��jǸb��J\���3���07�K�r~�|�q���a�!g��y#�❙�f�V�I>��pn�mt�$7�m���at�{��*�m#[H����E
~�5ֻ�����/ɏ���W�Kk�~?���,�o���n���s�=��҃�0=��}_��]���|I�۫|a�0�{��q��
�̴�q-qE��s��e�XA<�//�_^[܁w)}�{�m�T[��-�۹I&�$Tkx,�;z˺�����(_����7?�qZ��5�a}��}K���X��,�6�U-u4�-¥�C(c��{�h�<�I����wp�E���\��)�����Ce��޸�?klo�Y�u�9װIT��1�ڈ����&�vE[
��|�쵽e�<�q6�&�)_ʖ�6��i$�L	d�%8cs���t\���C�٨����eۤ������h�U��Ŏ9�I��".��?>���4]������Z��<�['
;DZ��~�&'�vo綬���zg	����ٗ���6���,�x�ɇ���o2Kg�Ae�;G:s
��X.v��-��D����I��ekU���9
�nE#S&�	$�
���m�y7c��w�m6�6s��[�w-���DN��[hVT��Uv�/��lʇ_|�����{�������w�1�RvF�ޛgzc�������6���M�*v���}у�v��Z��C�*7R����C$X��\�M�/�-������;D��U�H�Y�L�;E����Z��;ȳ[�p����1A�P�p_m�m�c
��-'��[}!�yn�d��f�8�^��6��)��2{��0f��N��0�O�_>����.�����ٝ�'�
_��}���۸���PnM������
�ʋ-Tunl�cq�li�/��]�$��|K
2F�K�d�a��դ�����	����9&�K���f_�m.-n}ͱ��V��l���He[�m��M�����Ѯd��
+�jm����,?�ۏ����u������I:���o�{�^����ߺ�^���2.M�׋~<[������ȏ�d"��A�Gu�Ѓ��q��,O���dm^��F��
]�E��8o�_*p�}��{+3��o�zKab���g|r��5]O�=E�MN2����UTSH�v�Ŷ��Q��[Ek��K{6���V�W�4k{bl�_���m|X�Z�jZ�c���@���$��ETCs,f'�hUD/�yH�^6�Y'��.[����{�-��=���ou�=����xcz�ؕ
�S��%]ODd6�c�7N��b������m�GU��n���*MD�]����|1V�{whf�wmмD�"߼_O$�K�!ڄ��Y-泊9bkh!��oovp��
�ueVI,I"[\#K��Y����
IJO���CJO��J�b;F�i|�]��썿ܴۂ_�<*%���i���{���䴸��س�E��沐Vd������j�&��Ŭ���?H�.DZp"����nس]*.]����ĽtZ��{�.�ErN��S5����B�[j5��H�Uf�)O��Ogc��n��l�������3���>�wc�b|�޸����9Q�ݝQo����T�wOc*͎�9<�U�W��+��ȐG<[m��l]U����F��8ѣ�|6I$s���H,�F�C}��q��)������ĠI+�2�����DB-��ە����˗�O��?:d|���{��z�uuvo�~^������{�U�wn���ߵ�_��ǿ�oO#d�[mm��$Օ)R��,����ݬR���'�m��K�V��
G�K�Mq�7-imq-�x�����H%���N�-丏�.�ֆ)�]nvѨV�e����9f�1���0��K�*��F������U_	v����6/l��ٹζ�\��e��f�J��[��v�:�u�&��\N��Φ�?��z���y�-u�GI2I1,�=䗷C!����X�(����;H�
���¿S����j��n���Y����J��s
���kK�e�����p֓Bf��+�5�C��2�����oƝ��6��e|`���_#;׬�wo������
�ջWd��xm��nZ-�d�;n$�[�J�����
yг_�3�4�M����wi�SM�F8�Eg�dp�*����5����v�m��6ŷH��.�m0D
��;��Ml�`�B&l<2<�,v�H���#�������̷Y�͍�٪]罺ߴw���|���;_so��E��h��,�t�w���_�cY�0�������j��!�����{��v߽ݫ�����#�^�Ch��!�<�q4v��j�}<1��ش�ú=�'��;p����E�oKHe+f��gH�f3\4��������P�[�z[�qٰM��|������;W��|��[�s��N��C��zJ�Gܕ[}�0}��T9=�����C�1X�%Z_���aV�9�f2�-a�XI}���mC�vUH�y!k�ư�"J��n�}�[աA70M�>2�@��e�WУ��w����o嶒y�c�������_�}V��]���br��-��&[q����{n���r�ñ{C�����ݵ��A�3�l�����	D��������c�;X�8�"�5��J�8�I<��qq
_��i�gi'�I�Ha���k{��V�Gw�FЋj^Fg��cG(�ĉ*�}����O]��^��׺��u�~�ߺ�EG��tz�OP|��Zת�.���)��I|�����喴�\��ml�����:���Ĺ,Ek��1�梁V�u������y�U��-���
)�F��$�H�)$����U��;,1���i�d�U;z\�U�c�J&@�k�6�!o�	��J�.�ٟ�/v�hd;�{�-�.��xͻ��
m�۝�׻���O�Sna>A�^����Xl=Fz(i7�pӌt�FP��mTٯ�n�J�"�+wėj��yj�+�@V�(��^��E�Iil�7���ig|��<�d��Ff�էM3=���^դ6�ǹ".n<B��_�,���S�;����rwB�)�q�ϐ�(����Z��0{�;n�
�e�a�1t�����G�g����/���C��b�R�^	걸WWI��k�U�F�G(�i�t�,v޳/��eX���ä���B���H�Hef�_����v�¾������,j���*�Թ��C�Xm}�P�X2+ֽa�?�3u;��!.;/&GX��3my�Ǫ�
m�v���|��$�00J�<b)%���H��y����usW{�.Kch�o4�V&IDF�e�$����Kr��4�����
���=a�#�wQ���l-�q3�1������g����ۛ�he��gn����4�V__C��d)�����I<���.�pK�ݭ�WȎ��иx�Hʺ0"��GFh�4n�ʡ����=&�im�FUt��h��у+#��i�08����/]�8�u��ݽ���9�6�A�'�wV�ݰу���o�?�~����L����4K4�x�%iҗ�M}�Ű��Z�R�7�"��\DRK�h<����D�sqMoP=��ma"Cn�����E�fA
�Fx�>��selk�T�m:Eq<ӭ������'�ח�����>�ʍ���#��]k���5�ݭظ�6��?s|r�]]��Or.�̵m."���X��Mi�osu�M��6���<5y
�`[D���U��Z$pI�I��0ð�v-w�/$�Wݮ����`G-�߼�̍}q7��e���j�e+��o���l�ߌ��tK��~ܢ���7bO��`g�ܧ����⧴f��RLۘ��͑�k�_�^��Gkm�u�,��Xn�s�G|�=��V�?Qt��6��wwQ��N�Va��w�n->��Ro���7�(ہ������Y�*l�L*n�����Y��Z�v^Cpg����Q�������n���L5EE^7f�=����K=�6T�MP�l5E.Z���Il�u,�r\�O<��HUL�x���#Ǹ���I��xB=�ɕ�-��_�*�*"��B�����E���R!1�(���rK[q���Ou�~��t~��o~��?��˳�G�m׹��t����g7�W'Kv"m����մ�n��7�vPv������T�l�س�(2Sb���J7��ʖ+X�k���Q5�7,�#��ոA�D[Ž�1Zn�D�x0~�`�B���V�d�5�ȱ9TֱLU����ok+%d�����4DM(��>7�(�'ȟ������g�_�;���/�v��?���۷bt�Zln��[S��Vo|o]��}����:�{W�*AS��ǖ�(����b���ح�sd~c�z��U���$�
�,k*�G{g5�3E~�-ܷ;�,6�;ﶖ7��������`�n~�vX����f����d��������$��y41+z��`����9{����~���]k���i�g�ߔU�gumn��͓�]���}�����}z»�EQ���*IMY\��5�ܹiiuFߡ�.�$��Kt�Ώ
��wc<�m{	p҈n��=(�u��7[o����9~�m���i�Ky.�����gK��{g�1��Ñ/�#C3_��>d���5�;�_��{��.l�1~e���،�<N�N���:�)q�!�n��&q��l2S�[C�&�m�wF�D.��O�砎�8�Q�@�pͨ�5��)m�g�
�����Z��G�d��x:}<��&e�g�
��2���>b1����]ٓ�������'O�~���z'��s�
U�.��<�M�sg�qd!�l�ߞ���zzg�	����h�g�dB��8m��ø��+3ZE毫�+w��x��x�$��pZ[4N}\˼E����Ye:Qf�XO5Ų�����I1���)e�k����{��(u?�%\���3���r�w���[t�7o�/�;�q��Y��}\kw.��϶���
v��
��m�o2��x��gy�WY�W�ՙ$���^	��ֈ��K%��,��Ţ)��V��46�6��AAiw	����ASh�K�V�'?Ukr<n�qʃ��7	�:���;��0�
�������N�����;cfvdw���^��}�A�����c)�Υ
%=)�jzxbM�o���������%�{���Y����w	0��d�g��%Gp�xҼ�3��S6�ldYV9-C&��"��[}HM��f��!-Ҷ��k�B���N���tOk�;�a�X�N�����ɘ��`k�7���/sC�{�y�֥H��~�ˊ��4������Zn1���"��"����H(�i���tE��y�i^vi
��~����q�ɒY^҂ֳ���vԏ��$��ۄ�~�
U��w�ϋ��v�J�;Snc{��7��
���o���+2��!��[�=��gf����]{��x�u��Y������%j�I�-�1]��*��ባD��,��kM��5%�H9%�H�^y�ԽIJ��D�$�Md��^�~��[��om��|��>�`�/^���՝��}����eb7�G�/�n�����3=�����*�6~����2�7��5�"�dw&?-���zY���IJ��Hn7۸�>�s��;�(��Ke��T��$�$�$���fb׷fdW6�]��.u<��w�19f�|]�D�����YR�H�y"��"�B-
�����?$�GI�>��ﬞ��$��=�ݽSK��ܔ���b:��6Fy�.Z�L�>J�Ԫ����9�Z�x�Ի����=Z�
��D��Xث�!{����i6��M'l��	%]+���̐�O��9H�UX/��JA����U�
:�-�7�����]w�=��;cqM���kq�������M���{�'��[��Р�ܛW35~����%En>y�*[B��C�6Ћ8������&��C3[�Sȓ;M��ff�٢v-ׯ�nw)7)�.��������0A-�S��U��[i^�=���Q5c���o?�EA��4�3�&�
�?����i)�����cnN�n��8>>�m4�gz�f+�ih��^��~��pdc�R))m���ܷ�7K�
�r���lQ����.>����ov5��u-�C
C:;��6��q�Z�h#m�Nam��q�:���	Z�(u�yM��KP4�M������7���u��?G�
ާ���y�_��WT��qt�n��Swbr�]�_�;ۧ;bwdU]�I��}���	Nꬓ�{T�2ݝ���"�_�K
���Ћ(�/�[�P;q"��F-�Q�#�"�����l��o���ng��4�K)�]��,�yⴌn��I̦R�J�$�c����������m�������K��ü�ʺ�}n��n��s�{�3���Ә�J�����*��VN�T�,�d��۶�%E��Ֆ�#G!�hUAX�ju��;����]�#����#�܈�Wgv/�
��b5��E���Q�1HbT�>��XY���7z���;#3�
�������W|��G[��n��.��s�ڿ(~8P�Α�nТw��s����8�*��V9VH"j��9\���,�t���u��P.-��H�G�gb����)-�"�K��Ep�m5���i0��n�m`�ۥo��Q�N�#@K�kp����\4B4�Lr-��he7��W��Mv��}͑�����}�ڔ�?2�gm<f�ힴ��u�R�jw�:�i��^��chp��x��b�T�a�kIKOe�������o�Ą���Bk�yev�C�A3��0uS^�{-��(!��#�e	aN����D)B����3\x�~���Z?��򹟩*7�q�v�G�*�\wWɝ���o�?*;���r�����[�r�od�n�������CC����<܇K��!KP��J�gd�yk�v�p���c-���FT���.X������+U�w����=o�[���B���[7T.�$�Ikil�|���6�H�2�/������v`o���?�{k9��޹{�^��׺����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^���F{Y��fq8��Wk�d�u��-ˁ�	Q�۵u���S�0�nl6��s�13H�ӦC]DҢ���Tl��	nm����Ky]HY#�]�(�$���\n������8.
�Kd�4p�7.�5(�6G
ԡ��Ԯ�SB+��T�>�߿���?#;�N����߻z�)��oDl�6���쾨��7�����j��ۻ:��'S�J��2�4��gJ���h)9s��Ų�����N�3��3n[]��(,U`�Yd��(G"i�!J�,����6�3�
��}agI�X�Mn%g��O�T�#P��q�	R+����#��l��=���,e���G��9�U�����jû����:f��?������ud!���4u���
��b�S>Ed��*��;�N��h��~y���i���7��Z�\�%��Z�����7W�C��E�XC#��~��{��p�������-
�~���9f�_\�Y%��3^R�]2$�����l�&���.��l�`�_uu�dt���'E�u�_d팏za�67]��_w_eq�!�T�j�|��s���դ�J�s�G@m0�A]M�t�>�On8��;i����⸼����m�@��?Us�nw����ͅ�{E�h�Kx�&�P��m�U
�ss<r��e�ߑ{����@��������7��Ό��*����8��:g��,�KU�6�v���&����J�*61�zy���+�v�O���7
�YwCuKFjݷXf�'�m�rO+#c$���$���s�2slW����v(�f���"V�m��x���	#�����x�9�"�oMl�3���?~[�S���~|��]T�O��GawG\��6��h�Ͻ�����be:_���t�����(p���p����1�6r+GV�����-q���q���Ice}+,B+�`�'��A��8w%�f�;�1�{�N��u#u}�9�p���G,�������E�����p����Y42^45����qp���3*���>\�n�a������?)g�{;��OD�?\|l�X
���A0��v�uWK��f�F��޻�!Q�p��哇p�<��UTT
�R�qc�]�o�Mi��[M��c�۶��vI�n�3m����y���m��kI��k���w�-�M�Kaf��wxC3�^߱�
�Id�����]Kk<N���@T5�[�н՘�1�g��S��T���|Pe2{O�p�e��˪;��k�ݭ���|}6ClRA��nf��n��8�����#QWE]��;\�<��|��H�x���sa,'ķ�m���na�%�J�q`d�y-�(�����.'��&E��ܹ���(i�{{�K�1O���2B��ICv�	��9nA�OudR�
�g|���#U�c'��p{��nn����;�m
'���[j��F�������[ܝ/����x��e3�OQ�������C"�{]�ٽs�;-��r͝���坙T�4��X戤3I,6�����K���
}�r�ܶ\��f�e���B��]½���0�}��H���[fgx��)���z��gʾ����z�F[��ߴ�'����	��)��?�2�+	��\GLt�c��7��S��Wk��SO�E�Ƶ@n���ә�����h��}.Y��k��Z&���{�㱉%��"
��d�������J��6-.n���(a�5����4��Z;����n�0;w�?_S��h���'�?��V�k�"��z�{nۻ�qnn���9ʞ��,eE>i)�q����a���������f٤�`��vhle��9�sA%��7z�3��TY�]K�H��r�һ���l�t
Y��7b��M�"���)�Z�ѩ@��r���g���;���6qm�&�ۘ}���/�:�:�u�&��մ��7�6n��4ԋ[O'����i`�Q��i|����b�ünI�,2�4����	J��o![ɪ�%FP�7?�e��C��$Q�(mh��$�c��`	����O/d���~��{ߺ�^?C�G���To�>����5��Ωߝ�������o<wAm���ީ��o�5;�rオ����Ѧ��su�{1��6��mݼ�,�N�I3�9f(��ge{�6��7����KK丹�#U�:ܥ���k�q�_J��W2�?���<�wz����"!���k��9�q!��G�)�
�6�K5ṞYl�#+��W�~����6l"���G�W׸���*��zm�����?��Ow��l�'{NE۽-�-�0�]v?���W��Z�*q�RΏ���r�	��`�Gt����+��ws�+���Kq�����Sb��K�����im��d��4WSD�I�@>����g�V���+��$�"���I��<�B�M������;�pt�ab�Ro�_�z�/�>�25⋻�7���xvn@u~v�3���v6Sf�0ۖ��1�J�7��n���=��ͯ1Y�]ڐY��feޔ��f���+�<�Kya�X�	nn
���5��6�E����}������.�i,��1��)��
����7�m{۬�&+�fG�P�*~Ku�
�:��ٝ3��o�m��Y���\��]�י��w^���;���#���'��v�4�Ԫ�׬9��v֒c�K�k�M�|����I��^��=,��Y��R\��T��FOu���$~W晶�U�r۶[��$�V��������d����!�[�K�=���$��Z�>F�Gȝ��mm���c�Ϻ��߱{/������F����������>/ma���Sa�,]cUy��U��*9~1s��E��L��,\�[��)m�]�Ի����*Q���%�š$��?��.��)��Nf����$���r�b�J�%��+��![�s���f����*a�ê;cet�6��k�ۯzm.奓�w����l}gt��6�_I&s�-fw!��%&2*��*J�
�P�����m���&�ks4�ȮǼj`�cp����&�#$�	f�|���0�ov��sh@/�x
i�-�XbP9H�Z�V����;i�F��ݯKK�[���_c�i�)��N�ڹٚJ^�����K�w�5�=6vS����z�jz\��+
Sn
���i�wM�v�C��M��	��I��}�%ճ7����s���ԍ�C�)�3|��ãE-�.�5լ��+�"1��Kj�q#L�bR��(���A�c蜎���xwV��-޻���-��)���twW�v��kuG����ڛn��=5��K0c��-��e۹z�@�9$wxrYZ��B�\n�[,�:������f�@�v�٭v��X-m,�!�ᤊ�sM�x�Fn�;��K�m~�%2�L��6�4�ܸ����Y�v������ٜ�U��'���ۘ̾gp�����t��ݯ���w$��R�sϸ�[�I%J�ݭͽؾ0̊-�r\���[i73��>�p�����J�3���fd�즒	tL`�k�T�E���\~]�c=��X�[�T=�>I�7USVvF@m<Z�/�:�z�kn���j3��svuv��޵��O�6Vm��T�ٽ�[���O�j54�L��.�W���+9C��sV�=��.��H�]%�VH�Tjy#��;&p�7����?Ӵi6����6�*葱"���z2>��x��^����Sa>r��MǶ{o�:��zn.��u�pG�z�'a�2���ч�&�[G�6�z����[��\%<������6�:�|�3$6{,���v
d3��-�ё���^G,����I+-�6���ō�;��q�����eo
=l�ynf�+Z,�8X�m]����jm�޻�x���t�[o#�|��O�8�������Qm��E��O�y~��d6�}4;�U�
U+�rBP�k[�ڢ�7��7l
2I�ʣ[[]��c5�uKt�[s<Ղ-s#F:�7ld����k�:&��`.&��`�����$�A�ĺ
t����t'Je�[G�>Fv]��t�X�U�ߊ_.�on=��wf��ͱ��z�d{rNCnG���ۑ�&a�!=
D��2�I}��Ne��^�F�p��_�E���&��iV�E�Y&hb����i�G�1���eO�(���QW����KT�qgp�M
bE��U���c��7�Ǿ��
��k����[k�������������L��ۛS���j��v��M8���a
��Q�ԧ��n�Kx"��t��Ov��lu@�h�����h*3\��F�?���P�6�e��l�<ifalV��H�2ܔ(��rX_4��Hm�7��0,�=�����ݑ����;�E�}��w�b�Q�7�Ho��t<Ǿ��x����ߍ�{��+0u�J�'_A��t�̭f2�����&Yݾ�͛{��-�ל���$�,f/k��]�����RE4:�k{�i��CD�]"�+�sAm*�=��Ī$�n;��lc���nm�U����qmpc��]�?�{�.���h|����_����]��>E�w���u��Tcv
?yt�Otu���?��M��;��X�������!AKO�\�9��q7r������Pm�W���M�\�d���-�PL�4Jb�&;$(��l��9�c{s�%1A)�]N�lۂ��۴	��f�ZR{�xV�<k����~Tnh:�?��>��m������/�����;{k�g��=���ɴ6V_��vM����b�$�䱸�ܢ�'j�(�پ�\���S����G��bM��{H��Lw��B�K��KQ?�.��I&�˻V�^����Ǘ��#�^��
얨��H�9gg�c����{�
�ݤ�Y%��b?���od��
���_��c����[��׺��u���{�{�^��׺��u���{�{�^��׺��u���{�{�^����ߺ�^���>zl�>3Q�qؼ����o⳹�ͻ���㥙�x����`wM~Y\��QY3#54L�%,�'Kv�q�N�G%�S�ds3y�c��6��zz�m�����ԸȢGU$j*���T�2
c��*E?�<�/��K�zpu��Lߏ�w�ݽ˴~Vw�`n�]��������	�z_r|���ޔ[#w���}en��P�X������؋nKۯ�e��6=���*�ܶ׵�g	�dEw=�Mp�Hm��8��.#�;�u�lm���+�����M�G�ɬC(�6R��D�D�^v��*�p������N����ʊ��ݕ����:K�����mv/Roޞ�'���5�ڝ��ǧ��dv���f�J\�LU-[6$ıG�F����nU�1
�Y���I�[ȫ�V��{ٯd���;�n�'�H4G%弳̭a/��{�][nù�Ո���]��<.��ځr��T�i>�[�dV?��-�Y۩���0��=�{�1x����Gv�j�}�ؐ��6����붶wK�����MU�{�-��Jx`����D�����T�x�9d�Wi��U����K��P���k�d�k�u:nV��ͽ�ŔWS#�"K�C$q`����t���X��ˤ��6�pMvGF3ݍ����7������/?ɽ�6���Q�=q��o�h:�r�{��h+7�l���8��x2�F�f�P���N���;{������K��-ܷM�Y#�i-���9-�&�%�To��w���9����y�6}�m!1�6򽽮�o��f�b��;s)�%�.�3xbG;�q׿'�>A��Ozu��}��;㤺�)�v'�w����U�՝�>N��V[�N��\#���l�����YXq�CJ��X�v�F��snɻmk���}4v���&�����m��I$�E
2\<��\�&��u��b���_�����*j���Ey%��)('e�̒��3qn������_�}a�;��8|�Z
��{s��O������^ɗ��N�l���d�?�j]Ǵ�7h��݆�5��Rɸ�k�k��a實JH���n�m�l{�����5����ۅ��v�VfU�
�A`��݈nK{��q<�مics�;��A�^l��
"K[�.�4����}U�ߤ##�jc��DC�'�I��2i�+�O��i|Z�in��ϑ]�W��E�v���kݿ&���l�������(���I}M%FnF�ZB
�jk�C��l]#��Ѓ���(wE��
5.�of�Y���m�i��䇝97y�o�a�y��by~̖�og23����X��1w�i��^4Q���D�1�����۬;��쭻�ë��Ko>��(���;G=�[sfmZ=ŷ�Un߅'�p5=��:�m�M~�8|TUj��	Tw��Q�6s?4���ngkU��ȷI��1Gg5�\��	��=��4��Tl;<ܽ�[O-A2�Oi�%jƣÑVi`H]���"�?e�9]�b��_ܽ�'u|�����du��Z��ҽq�w�{'�7W��ۛQp]ݹ:��n��X���/��ؼWT+��+��Q�h��H��y�[p��7^eܡH��+�f���������֭8{spLB\�)w6�+��ݒ�ivu6\����{aeb<Q�y���1�~�0����*��)���h䶯�>������̋��`��U���݅����7nƓ~t���|S�5��r;jL!�����be�f?�͸�n�RO�{�&m�4������j�����c�db�
��=���,��&7����ٍ6���h�ne�����u��mG3�^Z�=�w�o�h�9
KU�W�7�0�'���]�;+n�
���}[�{��6<Co)�b�0��vuoLg��/������}�C�US�L�R��T�~iܬ���wެ����p��T�$��$@��t�FdIN�*(�����@ܹ�ϲ�f�3����P+��"�'��G�2�`yP�I

c�G]{ߺ�^��׽��u](z7�~[dk:��k�M�F�.��t��7zv��x���ߴ;.�LG�گ�kbmMѐ�[r\M.V.ή8�Y�K�X�L��gs�7��I-��t�����&��U�<�xfg��|)�Kg����7�@��]�{٬�f��6����;�f�WX�J&�	{P��
�h����_#~C��/�����8�|I�)��nNԬ�N�ܝۑ�T��sy�UǸ>9mm�������fe{F��10f>ήh�3�`�n;F繍훥��o`J%�ۯa������x!��L3�$okD�-��w�x�g�X7M�����L&(��n-./�ga�G��Ʒ�ݱxSߖ�Cw�j��QQ|x�~���<�\v�j�n�������v�o���^�ڝO�����;�=]��7[WSg�JJ���H�+)�w;k��~a��C#��h��gx�Cg<{sZL�4���n7F�m�ar����}$�����sB�$�mń�*Y����p�r��)iD��<P�mptm��o2A5�g�n��w����ܿ��[�8��$4�.����_�;B�vd�4���X�}��������`�Re2�q�U3W+��ob�[y���Gx�f��Sg����ge��M�
}s	��
���ܟr.�F�e����]��۫�._����0��hVI��R,e�LE��	bb>Kt��}���c�n��
�Կ7F�ݝ���?���]����v'Z�ή�؛/�?b욡����9�
F{�����<\+�^�,p�^��]Ķ�5��y��C�i\�m;��I^>�[k6�J�"N'3+B`���ͮ�Kfے�Ϳ�n���]P��w�ȡ��e7$�|"-�
.�?�'�
���.s�:�)�1{���;I7�vc�3����ܴ݃[Gq�-���y����lo�婱�q���Eg���,�טy��c�Y�}����PJ��YH�!F��gC�gU��2!�2��O7m3�,{��`@c]�I
I��캗Z�5
�4���:w���/���o��?t�#��=l_�ս{�;�7���gu�7pvnN�����e�ho^ۨ�X6f*|t��c�鐨�J���V������WW��w��;�^�6�ych˵��E�4�����R�a�Y�H�Œ�>�ܮ���y�[�/,lv�e��j��/h7)�I&��ⱖ+K+6�Z�Is,�R-���M��[��}�E����i�$���N�n���>=�۹<�Dv?K
���c׿!���c�]��5MPv�DgO
���,����El�5���gv���G��r���ߨ(��w�f���Ku6�E��bQ�U�v�ʼݱ���[]�m��C�-�Ӹ��a�7��O=���}"Ƶ�纸�H�w�>_?�MoD|����A�Z�U�=��{���O�kKۛ�7�y��6�'�j*L�m�}��x��M��&׊�i�S��=-@r�$��{M�-�����n�cR
�X�^�ծ�U�|kc�������q%�{�����k��Wf�n�7�)+3���[��d��'�{m���.ީ|7/O����yv�Ct�z�Wvm��I��'t�ɞ�9��'~S�m�w�cu?vt�IT�dۛ��Դ�u�إ��T�hj)��H�J���	����u5‰�Q8�eo��6�p�����;�#6
k+A,�n��=�/71ɹ��V��v����[����uAgr�{��gܞ��ֱ[��R���}x�?�~�xu���W���?��b�%�4��+�>+�fnL���Rv�O�g�wz�ެ����_�F;��z*j�~Wtm3IOM;��,���[�KNy������w�w{!4f{y/6r4�����U���WMv�$,.��p�T��X�ccm���"��3���$���5�7P��0�d.F��E�}_Ի�ll?����������|bL��e��������S�k�Qe�m�_�m��q�>S%�<馡��*q�Ŷo���	�7��o-��vq�Ĩ�DB�iL�tmmk
\I
�Mz�BC�-��|����]n�e������-��x�<h�5����As~�r2@��[�üG�_�{�~1���|R������>n���7�vګ���^��
��û6�ì�;���	ٴ)E_��n��QQ�25m_�����w�C��}��k�v�D4�`��v�v��d���.m�;+Yf�K�Se��f��,���lN��s���mO����Ag���<J���Q^Ko2��
O�[���"k��n��:俔6ݏu�u���1�fC�;s�j��w���}5�:�����3�,��������z\;3�ɽnk�f�h(fC��}��
�l�K~Xݭ;��$�6��SH����_M��c�̽i#Y��U7�!���=�uqo���&�ʩo�ZO
+�mv�t�I�I��ݮ&8|���������/G�7g�������?�]W��'�J��=��g'Y񲾫�7��9��>k-���
Z�XĤ��_��kl�}�k+}�ut�.dqsࡕo���a��+G��z�j��p�{"�ܴv�p��=u����wq��ѵɏc����r��۴�Û��	��y��A
�KKI!Mwؙo�7a�)��E�v�uuf�;�;�y��S�Aoϗ�'�ewVS�Lk={�7�e���[m������:�9�{Y32�`�T�����!�ڹ�h�ۣ�6��=��t�K�o.�v�N�]L�s��:4v�{xV�-�`Y^�Dq��j�Fջ웭ĭ}s����G#ư���yo�Q#��B�fh-�����I��r*�.��_��O��	6_�>��o�?>@�������>��A�tF?pak��'��1��>:���T������ĹQ$[�K����*Giϛ��2(�7"����P�)�9�i*S��2�r��{���M�r�8�����T�뿄�^O�L�l�L�

W0U�0�L4�U45�(*e������4Q3���L�!+�.�c���\��RG�5��	����#U�(5*�uV#�+�B�RFJ�$	>�ӝ{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~������ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u����ߺ�^��׽��u�~�����}ş��ٴ�z�kv8�*�������sn�����o��=��?�?�2���O��d�'���Jڷ�G��C��t~�?��x��>$P�~�����%��n"�xv�|T�k�E5h~��38dž.>��T��Mw�=��t�^���v�u�lf�m���^��d6�ح�c�w��K�m�[���QK/I�\�!���9����%�Y#��KX�5�p���"H�2��f�#!�K���1ē��L�8VIeX�824P�"��)��܅�:�^��׽��u�~��&�~��읩���n,��m����\�[om�-�e�`��:��{Ghb�tf���6;EY���L4��+�1~��m���ʹ��2�U�?�e��h*�2
f
�,�7;�=��G�O*ƚ�#]N�WT�DZ�Vv
�I�����M�����O���v��lN�ؘ>��x�돠�n��t4����g1���D߻5�
��g����|��Nɮ[KiƓ��so�`��ʒ�}%�P`��F%�<RϹE[k�R�5=�̶�0I%Tw����.�<H�R(�>��oi:w����u�~��{ߺ�D[��y쏎��(��N��K�7~����lm���WOoM�_���p������}�]��%�q4�-��6fk�gɬY�,�yD�ona�n{6ՈdܯE������4�G4z�M-�Meܬ5�XD���[t	��;��4�Ch�wQ!&kk4T��e
��=�C�v�Q5�ۭ���NZ�_8
����WV��h
�R�W����Oı�>:�ks1G4�Y��t��ے���2��_�����T��"��k�D��K��d�"��yb�2�Ʀ6���Պ�<��5t1��ݣM������(�d��b>,��ĒJ�x����?�EM����H���>6W��B���>A7MQ�}���+��o��K�:S{���^3	���^ң�j�<���R�7���i�jrK~V���kB姇w�m[:ʨw�������ܖ�(⍔3��\�֐��[F�E"�5�R]̶;�pkK{wm����X��k�ݞ�H!�k������[i';��]���ߏ�3�C�+�����_������/�j��[��}��LV�Mז�mj�I��Te3��iQYGIE4RklFݯ�;�i��mk�J
x���Ԭ
��:��,�4���d���[�n�Nٴ�$4��XƨC����\��E�Ui
��H�IV����'�>����AMؒn
��xw/^tv���L@�媷Gb�|Nգ���z�*\�۵��g�e���
v���!=}m
U��;����/�"��aX�\_ͩ���n�(gyN��,Z��m���w��X�e|��Wp�Ea���T�)MZ���o���X|��_�i�/g�{/paw�n�GJ�)��b�U����[k%�r���;B�-���2���
7KLjr54TULڰ��W帱�^��,ݱ+�$���<�54q:�+"�!h�~e�IG�m�^L��F�.�(֬�@"�,i��$Q������o����'9�W�_L�4�7���؟o�n]ɀ��;�=�����;>��T5�:]��⯨��3���b*�#��T<�ȨR7!�t76�*������Q<��^,"�9%��tE�Q�X���\���Z5��OX�Sp_ib�*F�dH֮�
�۽k�{�^��׺��u���{�{�^��?�{�^�lϞ�m؝���?�z��v��u�<7����K�������Gu������}���<TpbuˏJ�c#@q��]K����U��6����.���Y$�T�k�eIx�d�3�6�I�i'
�łVnvm�Mykq4my׷_�hu4�nW�c
Bi�ia
חk2[�$���m�-�<����H�Onm׵�V]ü�&h�
��c��n|�;���;����(���ji(�����T�T�QWQ1���M�Ik�|y����M3��5&�$�2�h�i�PX��Ÿ�Z~�0�,��H�F�Y�X�I�Q��POI-���-�ۛ+��n�D��m��n�ڧ�;3�DZv��?�y↑������>J��M���
�M/��6�O�m��1��\[�o�7����?��x�������4���u��e��x�Q��C�Sĸ�����M�}/��gM�ͤ���E�ۦ�D����fW-M���1�v^���b!�����7����LkEUeOE��/���k�>>�y���I�U����2
��
�+���u1����y�|Ec*��*��";k��`�C�O�3,P�^��Hm�.Q�F��X,�������p{xu�ˢ��?*�נ;3�'ToLOadwO���uZ�m]���m<N���M��U���z�h6�ѡl6ך:JY*���&vj�zL��T�q�������cwv��g�(�*�UcW*Y�$ur��5�źs��Ckqg�#I}u�!PB�\�ɢ$T���m�x��{W�p;K%���պh�y��k�8�M���6���q�`���E�����R�)�)L^R�D�|xL��⯏�N�jH㉦a�bY&�6���ƅ�:�X�v��X��	��YV
x8f�PL�J�i���kn���6�'v�Ɂ�W=H���ٌ~��٪�+qY�ME^7#H�	!�Б��ۈCEm:���X�e^)�Yb��G,n�F�J�l���ט���d�E?K���9Y"�9ђEd`HUU�STUJ��T�MQ"��T�Դp��:����QYW9U�Eo$�eU,@����ko=Ԋ�8ј�G��PIj�;;Q���$����+xʇv
2��ƃS�TE�Y�UFX�	�F�g��3��'�W�읹��}���O.7�v>G������7�k��U~���7Vإ��`咞�5K��A����Yi�S,�G.�
��nV�SWG*�<�Q�6x�k��b�D*T�5*��[����qqc4qHJ:i-m�U�RM";�RY����H��un�7D���o�݉�g�6&+�����}���~Ǫ�+'�h2ۺ�b���"�>iwwi�+t��ZZJ�SU�z�l���ۛ���k�pb�k۫U
�<KA��q�:�Y4�
��(��ܭ�k�a��Z���[���]�r���M%-Y�H��N��.
���Lu�~��{ߺ�^������ߺ�^���S�u�XΗ�K��:k��m���Kh�k:Ƃ�m��7�6ca���˴��z�S������QĬ�/�S�mʻ���<7+m!FV���vF�(�fjDl�VO�x���}ʱ4�˰@�t�y�Y�:�R�Az���c���H:w|O�1�w~?�dc;o��w-]7�o���Wy���9��a�y�����f�<vK/�ݘ,�E�}�h7_��
�6��[�v�x�y���2*\�7�=�[8BɛV�k�R7���أ4��ڢ�u����lde�Ȇ��8g����9�q��1$�L�u"��I+Cb
�uk�t�=���9lܣ�3�Ӿ�ϯ���7{�=�7ş���Pm��_�؞Ώ�&����Z�^OiV���_G��ɗ��5,~(w�P�c�Y�n9��MI��sv��
-��6K��$PG����JJ,PA8��^Am$,^�Ym��w���cc��P��;�O5��i��I.5���^�±@�'�qn'�̬�W����`��Mn��9����{+�����>m��ٛ���|-��:�_'����;��{��vFr��5~y��m��a��N���!'��G�����+ݴIs/6��,�#�%IR�K������>�7;�{�},q��������s�Z��Y9&�|G��Y���_�5T������ڤ[}��ܽ���A����ڿ=�ܝ���?\���A�Cu�.�
��������l����z���&�S�Y��m]�K�[[���Ҙ$��e�y[�H�nۯ�w��m�f��E��
ks�i6��nV���e�Hc�\~���P�Mڵ�Р��o7���gRη�,���hb�rk�cro|D�m�U�m6�m,�Ϙs�X�O�y��{3s|��cz���C�'V�.�꿛]�ҝ{�;{���[/��>��~��[o9؛�p�e�xLmD��&2*:�+�G.V�k�j��6���\�oqh��q�D��kJ������Z��x{�h�c�[�ه���>÷��?ř6��n�+�<&2��3���c[�������#6��Ϛ�wC�;zc{+��s�۟"1�
;��3�f��p5���1��wvm˵zb�|f}���;?�mZ��UGF����I��٤H�eM�e���sew��Ƒ@�=���KK�CȻ����q@�c�W��n{����m�7��Hi-��eKK8�S:�%��l.!�Rt٠�����o'Rp�ڟq����gk��޵�S���ɜv���ʌ^���x���ח^��gS�:C���U�Ǝ��6�>̤�C�v���Q@�5楃l�Ҷ,,���p�k}�!��@_z�=�즌����$��Z[�<V&�l[H��/���uk���I"�}pK��+�,�ͳ��G���H�hv�%��_\-��$�72[_OGZn�o�)��?�O@v���{�ro���ϗ�#�:#|V�>�#��O�����}|9�!��}f'��>Cg�9l>
:���
մ;\;~�5�\m)�@"sx�Eq6�Oseg�
�K��m��[��Rh�c�
�b�S��{�n7	t�|�vKϫ��x�Vs��7��S5����L�Q�"��~�>�����@���w����[{h�{_u�N��ߓ;/�3y������x��-Ǽr>���K�?}W���|>��m��S�\~!c��P�RӡW=�\�ʗ7��x7D��~��l�W�El�PC�$�Q�0�o�.�{�5�3�9Z{y7��r-���*N�R����
O�d�Y粑kk�A���%��M_�Mc�='��;Cc�0^��:}��꿙>�ퟕ[����]�W��g�e���l�pu�dzջ������l��V�W��Ő��u�Ge�Q�ZFy6��k���c�u}�o;x�����v_���~�)w+��帳�����|]�qڥ�e��y�ڠX�s�C0�ou��43Z��7��h�%Kk9`�m�͈N�R|����������>�J�4������"��mv7���;��6�^uNJ�?���=��m���'�0�-�]A���Q��7��'N�6Mw\�eom+Gk˼�|���z�m�P�A��^E4���Al`�ky<K���d�۷g�9��n���,�	�����&hdos$�QY�7Q�:��`���{Hb�ς����?.�O��0�;�'[nχۿ-��]��qw������u3t�o!���W�?�=ݽ+r҇'�6�ϧ���j��O������v���͌H9)c}��
h��p�Yᴼb�u��0$�[m�-��K����0گ��n�n��>y��b_�s��܁�=��V[�t�}x��&���#�}=��u�~��x��u��f��_�N��/�$�J������v�_��o�ji���n���5�G�7�+y��F2�)���&Uu�\�ʛ�Q������Y�ۭ�t�{XQ���	�X��<6�m��p�O4�	�����7ܛn���m;���[��[m�W2��"��.!1�Kp�3���Y��P�DK�4��6Qn�ߕ/ػ��I�J�5�=�C��Z�E���@>���������wf��W����:��{����H�e���亩x%���X�X+E'�q&�d��ܪjRѲ�j��(�I7&��AP(�VK��4O��>�kw�MJ�r�B@V��V_���+���x���O�#����m��;Si��k�V��mo,���QM�}�i1{ϴw"�eh22R�K�|���J�.����J춆��l�-䵉X!��
��������y��`[�{k�x�r}��`H���s�y�{=�m���Y��6ˈW�\)����h��
���,~
�;���w�C쯟��Sc�o��[�[���sE׻�vf�ޔ����z�f�Y���S��ع��-���+��GF�Υ}���k'>sF�c*�\''�p]��w�X�D^�巷��(�RY-�a�e(Ŵg�>Zޥ������r�$pm���3�­���[����3G��f�6p�����E�Z��G)���#�w�{�m���{>�gl|�Y�|��o��}�SW�s[�q�ƕ?�#>��<�אs_(��D��כ�G-蜹̑[	%1,��}��
)qn2ݤMW��F��R�~P��%��d6;jT��"y7��K�D2��Ow;,���v�ҴMqn�pf�mc%��7%]VV�bI��߆��x�M�6''T���7�쑙�j�k�m���c��9L�$�ih�Z�!N)Rh�Iai���]�|c�`��-w�G��G$����$h+#+�+�*X�l72�qMc�����(�R�,��	I�
��2���`�=�ֹߔu�7��O��"�g���N����|��6��<�<�iϿz���P�ׇ{n~�ݻ3
�)w����)����d]1���J���=��[���ͱ�$;]�֒n[u����Vq���ekK+����n?�q�1Cl؟j��6�7�M�k���.$�+g���oG�;_]\X�U��-�'�+k��|��������>P�i����������>��՛s�?su�>|�'
�+��Ow���U�nldX,�B�=#T����v;{m��NG�����m��}�����n$��3����
f���y'���K��,d�kX��2�W���r���v}�h�������F�%æ����Kg�q�m�ܭgMpJ����۽��3�;G���ޥ�^��'�{;v�/�6W�\�lnn��d��N�zo)�vtK�2�5�ڻ���]%I[��,�8�Hv�-�^M�nm<���Ի��Lɷ�+j~��e��?t�6��Q����a[����}���i�En�m����h���������R_��|��������h_�1�������`��Xߕ��.��ј�S�_9{{���N˨�n�І��������|Q���m���m�I4
����ڌM��›Y�K+�b�I��g{T�d���6�r����^}�d��F����\�ܦ)ͦ������P/�\@������(��j�cu��]�m�ѭ-��WK��{�^�V���m����imo����z�ԝ��5��]��[_{����Z���?Dnn���q��\II�k����m��B�y��yzz��n_�]�m�˻�\�s���2�7Ӊay��%Im��܏q��쓽�����"�����m�>U�/�x����sF�����A
q��(�TX��Y����K�dKW,u�&����T7�Z����C�:��,M���QⰉ��+z�U�.����}�T;d���[��7ޮ�ux}�c��P�K%��d�
��d���m�_sm�:_ۤr���/v�5�.�v7V�<��-�6�����n�9�B}��h��X����u�*m��̫�{�fݭ�
��lY?N�$���k{[��$|Q���qn|^�k�����L�~���c��|z�|�m����7?�^��-�ս!��{��7��{�?O�+v�W	��C���(FK'��d۷�#�-ny
/���;�V���;\�ntz�w+��p�7�
�[d���}�8g�7l��7^T��iN�����\n*x+���\I�A<�VzU����[�ٞ�����F�O��;���L+������޿�g�v�p�w�}���eW��Z`�>G	��m>��m���ojôᤏ)G�}�S�yj��>7���+�i�����{�G���9A�;]����������(��-�l��f����W5M��}�4��E[+���hc�B���&�s��?!�f��e|��|��~rmo�=۔�����A�o������/�]���@��3���}��2]�6'�6���(k`νM��`��-vM�ߔ7�.=���mXw+��b�.g�#���~�Ϸ�:^;�ȟ�0A{-��n�B�D��7;�n���N��6E}}��#��MO�6>$i�[���k��˸���K�J��������;�g���,��*^������o��۽y��>Sw����1�4s{�s7G򫴻��������n�3�6���Mcm�>gO���������mk���nu��
��������p_��7)��v�3i�仒�$v-p���������������]Li{�ݴ�2]�ֶ�3���k}di�v�����Hl-�������;�:��{�e�������7��\R���_"��x�XteG�n7nn~ˋ7vF��Tg�
FN�5���f	�m[=�:���>���;���	�?uɴ[]�^Cmso��]����n�$��X���kK�`"�{��$��|���m��H����)L�qy
j���KK�v�v�y�u�=��h�k��W���7�{s���iM�?;B���p|���>#V�~��Q����s��zu�V|�Ͷ��n�}�Y2Wg������f��c7��s��͗8��x�G3���Ve�-`o����hm��Wǎ���soik�����u�{>Z�ϕ��_��s����ܦݤ]���K�4/�o��@|t���v�tXC}���Y���(��s����n���=��ѷghW���o=��z�N���˞��O�g��b��8e�=n?s�s͘4�ܲd\��Eg���9w���>�)�V�����������Io�K�-��G���ݠ�db*�,������[�'l%�o��A��c���k)
�4��z�����C�F
�ȑ&?�WtmL���1���]��[ˢ������c��������M��vek�~BK�����7Mn�}ˎ�L4��此��%�Cv���Kcm��Ƿ����"ZIo�׊�������]"m��/o��m7�6�m7�\�M�T�����x�ee�`�M�e2@�v�j���n��V�)���o�o����ʣf��ܝ+�}��Kx:n��k[�29n�����w'��Gl|{�ݹv�_9�w�ج������|���.^���v�v��q9r��M<��Mv�k=�,j��8�Rd��k
"�BRe,�������Z�m��aH�%Q�[�Y��3x�{�I|x�H%75�r�տF���$~K�8��~c�~��[_t�7���e�؟�9�g�w.[n����}gE��m߻?so>�߽a�)�Z���Z\\����Ƶ1dk�n|��Yy�s����b����ۃZ�2�*,s�[E{j�����X�:��-�[�n4������x���oy~��C,��8
�
坤�JM�[�ycF���_;��Z`?���ߟ����&��}�S�����M��%�ދ�|g�7ogϼ){C��=�L��w��Ll4�Z\[g�t��jMg��{�wSGq��B�o6��5yZ��)E��<_T���*ZvX�{	��e^���k��=�{���܃���ۘf���L��k���RY�h��m�[ީ��#w>n|3�ϝ_%������`�?��]s�p��l|sܽ��ң�d/o���]�����_a�p�=���\���vT�
k*�/Q45��1
�=�Nssc�V���\6�u�>�-�ŵ��Z��/�kۦ�fа�\nۄ�������8^ۘ7Ff���BY������o��Kv�e�[���M�uK{KUKϢ�Q������K��~m��3�u����?;�v�������i��K�6��_�k��^�m�i���c���$��$�K_I55|SW�q�+r�^?"�3�Ceİ\ʑ
�;��/x��R��fXf�s
�n?^0#�'G��v��Os��r�k�7+)�B�*yv�$c�
+K��q�AT�0�dy�[fY
�vvԸ�q{�?�O��?�e�[35��:.��l}Ô�}����뎛��Ը~����n��Qm����`�n
q~*��y<�L����&���V�s�k~n��)
3��(ovԔ�۴�-'�\��–���yqcs����uzvX9�j��)F�ȷ|�cqv�D��w�Sgr���j���D�^�J���Gx��7�&�gYv������Lwg_�2呷2�y�>QmM��q���_�Y��[�gc�p�j�=��7�)C�!�x,;>����]C��q+Ŷ���e��$���'3�G)��ݗ�$0ވ�W�Ԍ��p�<�XcXe�%�d)�-�[���0�2s���]�(
���Kyo<E%��KOi$W�nJ��?�bЈ]�9̖��P��5�#��)���]u�}��K�d�=����*�g�-����T�;�w?EM��7v�y�l��.zG���Sc(qtM�=�������e߁�g[{?wIe�i䙶��Q��Z�����m�%�\����5Mamy��b���7��UH�}�M�m����خ�J�Ob[(����X�7;��,s���>��cΝSӮ~�׺��u����ߺ�^��׽��u�~��{ߺ�^��׽��u��j�*�Jz��UE]-M4J���4мQW�G���c���I�SOuH�R�S�E$��Er���H��H
:�H�!�Q":T
H�P]�D�xe���(ڂ��X�#�a�UՀ=������1��7�t|S�]��s��x��+�>@S���Əvc1�_sT�%=#'Lbjr�}���Q�
٘���ZxS��1ER�oV{͆״��i�p�l�]���H��4�~��t�%@��DVh�ʧ��+�^��y���n�������+q,Q*ۡ��l%}w_Qw5��>�زu�[l^��x�;j�6��]�Ѓw�hpT�i�-���&�\�E=:�����ԅ����7m�}�q�ݮ��×��
4�C$�$�id�#*�Y��#�*)ն���֛]����M�
��qujX�LjͪB��$�������nUo������;�r���y�(6�N�ڳ�h'��?������[:|�%���.S��i�D�G�6.ݶ�}��k�����2������!�$J���Y�2>�6�ӷ_Z_����+��J���tl\0����}�o|4���?�a�Wf�Σ�.�ٛ��_��ްmjI�l.������v�}.��5<���53�LZV>�����Zx�<�@CU�C�F��c��cVpҴ�9dp�wK���K���4����WJ�$�,��FT�
�:|���g��6�}��=m���f�z�xm���hn(M����{bvFբ�,���5\�/%$��KDA��k��
����[,��UH�M��YH|2�J*�1�V<�w����=��#7��hf|7e*$PAd�*2W�F�E꽋'Xu���w������j����7~�A6�+���;Obl��TSө��nHX]
@m�E�ns����t�/.��jH�2IJ�-+ꑕ4Ƭ�#H�
�ڶ�6���l�g6�&��JF��:�5,I�5f�!UG�MN��{Aч^��׽��u�~��{ߺ�^��׽��u�~��x��u�����f�ퟀ���Z̅V>J�����Gy�2��%���{?�{3���4a�jj���ei���CWGR��";�+{�
�̻i,&�S"\��<���8�V����\+*��F���e����Ex�H���I�Yf�9�[it����vD��(�ڛ[olm��6^����v���6��P+GA����i�x�e3;-5
,q
$�/$�}��_\�w�{���'��v�Z��f4Pr~���4%�1�b�8���ljgw,�HƬ�;3��ʼn%E�7Ou�~��{ߺ�^��׏�������q_���vc����+��a{{�Ǐ����;�n�^���u�y���텷�xu�/��i�O+=t�uu4��m\����[-��~#�k����_�Dt�e��|=(bA�4�GwI�u�m����������$5׮MI$����T�b�����WǮ�Gݘ��������^��C���a�v��ۻc�p���]t�^n�L~;am�^b���FZldS��]-]]O��W/�.E���{5߈���4����.bg_J�@�+J$��3n�;�
<{|Vb8���`y$���ɩ$��x��Q
pʐ,G�k�{�^��׺��u���{�{�^��׺��u���{�{��b��H|ĩ���ۻ����띱�;v>��D9���5XZ�wZn��=�Q_�jv����)��)�=x��ԃiܷ��?՗q�[IO�A��Tѡ����b��A��ۓwq���k��Ai��t��q�w�օ~�i�Ҩ��3�&H���{�Mu��>�z�D�����WǮ�Gݘ��������^��C���a�v��ۻc�p���]t�^n�L~;am�^b���FZldS��]-]]M6�W/�.E���{5߈���4����.bg_J�@�+J$wu��]��y��=�+1�x0<�C]z�ԒMp��N塚8eH#*4�KK$�,����)U�1<sBd�����q�#�u�7�	��v�FB�R�H�e����VZ��"���$Ghè
�5����A��hA�
碉���#��ߛ�������,�u'L��+zv���}��V鮝�Ra��+W��URU�,�-4�Ҥ4�lc��y���V�l����2���!�eydV+�j��;F�,~���
�|�	��;���
���)n����<PBC;�#��y����T��׺��u����ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u�~��{ߺ�^��׽��u��libs/phpqrcode/bindings/tcpdf/qrcode.php000064400000242010151165346500014352
0ustar00<?php
//============================================================+
// File name   : qrcode.php
// Begin       : 2010-03-22
// Last Update : 2010-03-29
// Version     : 1.0.002
// License     : GNU LGPL v.3 (http://www.gnu.org/copyleft/lesser.html)
//
	----------------------------------------------------------------------------
//
// 	This library is free software; you can redistribute it and/or
// 	modify it under the terms of the GNU Lesser General Public
// 	License as published by the Free Software Foundation; either
// 	version 3 of the License, or any later version.
//
// 	This library is distributed in the hope that it will be useful,
// 	but WITHOUT ANY WARRANTY; without even the implied warranty of
// 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// 	Lesser General Public License for more details.
//
// 	You should have received a copy of the GNU Lesser General Public
// 	License along with this library; if not, write to the Free Software
// 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
//  or browse http://www.gnu.org/copyleft/lesser.html
//
// 
----------------------------------------------------------------------------
//
// DESCRIPTION :
//
// Class to create QR-code arrays for TCPDF class.
// QR Code symbol is a 2D barcode that can be scanned by
// handy terminals such as a mobile phone with CCD.
// The capacity of QR Code is up to 7000 digits or 4000
// characters, and has high robustness.
// This class supports QR Code model 2, described in
// JIS (Japanese Industrial Standards) X0510:2004
// or ISO/IEC 18004.
// Currently the following features are not supported:
// ECI and FNC1 mode, Micro QR Code, QR Code model 1,
// Structured mode.
//
// This class is derived from the following projects:
// ---------------------------------------------------------
// "PHP QR Code encoder"
// License: GNU-LGPLv3
// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm>
// http://phpqrcode.sourceforge.net/
// https://sourceforge.net/projects/phpqrcode/
//
// The "PHP QR Code encoder" is based on
// "C libqrencode library" (ver. 3.1.1)
// License: GNU-LGPL 2.1
// Copyright (C) 2006-2010 by Kentaro Fukuchi
// http://megaui.net/fukuchi/works/qrencode/index.en.html
//
// Reed-Solomon code encoder is written by Phil Karn, KA9Q.
// Copyright (C) 2002-2006 Phil Karn, KA9Q
//
// QR Code is registered trademark of DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/index-e.html
// ---------------------------------------------------------
//
// Author: Nicola Asuni
//
// (c) Copyright 2010:
//               Nicola Asuni
//               Tecnick.com S.r.l.
//               Via della Pace, 11
//               09044 Quartucciu (CA)
//               ITALY
//               www.tecnick.com
//               info@tecnick.com
//============================================================+

/**
 * Class to create QR-code arrays for TCPDF class.
 * QR Code symbol is a 2D barcode that can be scanned by handy terminals
such as a mobile phone with CCD.
 * The capacity of QR Code is up to 7000 digits or 4000 characters, and has
high robustness.
 * This class supports QR Code model 2, described in JIS (Japanese
Industrial Standards) X0510:2004 or ISO/IEC 18004.
 * Currently the following features are not supported: ECI and FNC1 mode,
Micro QR Code, QR Code model 1, Structured mode.
 *
 * This class is derived from "PHP QR Code encoder" by Dominik
Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C
library 3.1.1." by Kentaro Fukuchi
(http://megaui.net/fukuchi/works/qrencode/index.en.html), contains
Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered
trademark of DENSO WAVE INCORPORATED
(http://www.denso-wave.com/qrcode/index-e.html).
 * Please read comments on this class source file for full copyright and
license information.
 *
 * @package com.tecnick.tcpdf
 * @abstract Class for generating QR-code array for TCPDF.
 * @author Nicola Asuni
 * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via
Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com -
info@tecnick.com
 * @link http://www.tcpdf.org
 * @license http://www.gnu.org/copyleft/lesser.html LGPL
 * @version 1.0.002
 */

// definitions
if (!defined('QRCODEDEFS')) {

	/**
	 * Indicate that definitions for this class are set
	 */
	define('QRCODEDEFS', true);

	// -----------------------------------------------------

	// Encoding modes (characters which can be encoded in QRcode)

	/**
	 * Encoding mode
	 */
	define('QR_MODE_NL', -1);

	/**
	 * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length.
In theory, 7089 characters or less can be stored in a QRcode.
	 */
	define('QR_MODE_NM', 0);

	/**
	 * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters
are encoded to 11bit length. In theory, 4296 characters or less can be
stored in a QRcode.
	 */
	define('QR_MODE_AN', 1);

	/**
	 * Encoding mode 8bit byte data. In theory, 2953 characters or less can be
stored in a QRcode.
	 */
	define('QR_MODE_8B', 2);

	/**
	 * Encoding mode KANJI. A KANJI character (multibyte character) is encoded
to 13bit length. In theory, 1817 characters or less can be stored in a
QRcode.
	 */
	define('QR_MODE_KJ', 3);

	/**
	 * Encoding mode STRUCTURED (currently unsupported)
	 */
	define('QR_MODE_ST', 4);

	// -----------------------------------------------------

	// Levels of error correction.
	// QRcode has a function of an error correcting for miss reading that
white is black.
	// Error correcting is defined in 4 level as below.

	/**
	 * Error correction level L : About 7% or less errors can be corrected.
	 */
	define('QR_ECLEVEL_L', 0);

	/**
	 * Error correction level M : About 15% or less errors can be corrected.
	 */
	define('QR_ECLEVEL_M', 1);

	/**
	 * Error correction level Q : About 25% or less errors can be corrected.
	 */
	define('QR_ECLEVEL_Q', 2);

	/**
	 * Error correction level H : About 30% or less errors can be corrected.
	 */
	define('QR_ECLEVEL_H', 3);

	// -----------------------------------------------------

	// Version. Size of QRcode is defined as version.
	// Version is from 1 to 40.
	// Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version
increases.
	// So version 40 is 177*177 matrix.

	/**
	 * Maximum QR Code version.
	 */
	define('QRSPEC_VERSION_MAX', 40);

	/**
	 * Maximum matrix size for maximum version (version 40 is 177*177 matrix).
	 */
    define('QRSPEC_WIDTH_MAX', 177);

	// -----------------------------------------------------

	/**
	 * Matrix index to get width from $capacity array.
	 */
    define('QRCAP_WIDTH',    0);

    /**
	 * Matrix index to get number of words from $capacity array.
	 */
    define('QRCAP_WORDS',    1);

    /**
	 * Matrix index to get remainder from $capacity array.
	 */
    define('QRCAP_REMINDER', 2);

    /**
	 * Matrix index to get error correction level from $capacity array.
	 */
    define('QRCAP_EC',       3);

	// -----------------------------------------------------

	// Structure (currently usupported)

	/**
	 * Number of header bits for structured mode
	 */
    define('STRUCTURE_HEADER_BITS',  20);

    /**
	 * Max number of symbols for structured mode
	 */
    define('MAX_STRUCTURED_SYMBOLS', 16);

	// -----------------------------------------------------

    // Masks

    /**
	 * Down point base value for case 1 mask pattern (concatenation of same
color in a line or a column)
	 */
    define('N1',  3);

    /**
	 * Down point base value for case 2 mask pattern (module block of same
color)
	 */
	define('N2',  3);

    /**
	 * Down point base value for case 3 mask pattern
(1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column)
	 */
	define('N3', 40);

    /**
	 * Down point base value for case 4 mask pattern (ration of dark modules
in whole)
	 */
	define('N4', 10);

	// -----------------------------------------------------

	// Optimization settings

	/**
	 * if true, estimates best mask (spec. default, but extremally slow; set
to false to significant performance boost but (propably) worst quality code
	 */
	define('QR_FIND_BEST_MASK', true);

	/**
	 * if false, checks all masks available, otherwise value tells count of
masks need to be checked, mask id are got randomly
	 */
	define('QR_FIND_FROM_RANDOM', 2);

	/**
	 * when QR_FIND_BEST_MASK === false
	 */
	define('QR_DEFAULT_MASK', 2);

	// -----------------------------------------------------

} // end of definitions

// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#

if (!class_exists('QRcode', false)) {

	// for compaibility with PHP4
	if (!function_exists('str_split')) {
    	/**
    	 * Convert a string to an array (needed for PHP4 compatibility)
    	 * @param string $string The input string.
    	 * @param int $split_length Maximum length of the chunk.
    	 * @return  If the optional split_length  parameter is specified, the
returned array will be broken down into chunks with each being split_length
 in length, otherwise each chunk will be one character in length. FALSE is
returned if split_length is less than 1. If the split_length length exceeds
the length of string , the entire string is returned as the first (and
only) array element.
    	 */
		function str_split($string, $split_length=1) {
			if ((strlen($string) > $split_length) OR (!$split_length)) {
				do {
					$c = strlen($string);
					$parts[] = substr($string, 0, $split_length);
					$string = substr($string, $split_length);
				} while ($string !== false);
			} else {
				$parts = array($string);
			}
			return $parts;
		}
	}

	// #####################################################

	/**
	 * Class to create QR-code arrays for TCPDF class.
	 * QR Code symbol is a 2D barcode that can be scanned by handy terminals
such as a mobile phone with CCD.
	 * The capacity of QR Code is up to 7000 digits or 4000 characters, and
has high robustness.
	 * This class supports QR Code model 2, described in JIS (Japanese
Industrial Standards) X0510:2004 or ISO/IEC 18004.
	 * Currently the following features are not supported: ECI and FNC1 mode,
Micro QR Code, QR Code model 1, Structured mode.
	 *
	 * This class is derived from "PHP QR Code encoder" by Dominik
Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C
library 3.1.1." by Kentaro Fukuchi
(http://megaui.net/fukuchi/works/qrencode/index.en.html), contains
Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered
trademark of DENSO WAVE INCORPORATED
(http://www.denso-wave.com/qrcode/index-e.html).
	 * Please read comments on this class source file for full copyright and
license information.
	 *
	 * @name QRcode
	 * @package com.tecnick.tcpdf
	 * @abstract Class for generating QR-code array for TCPDF.
	 * @author Nicola Asuni
	 * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via
Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com -
info@tecnick.com
	 * @link http://www.tcpdf.org
	 * @license http://www.gnu.org/copyleft/lesser.html LGPL
	 * @version 1.0.002
	 */
	class QRcode {

		/**
		 * @var barcode array to be returned which is readable by TCPDF
		 * @access protected
		 */
		protected $barcode_array = array();

		/**
		 * @var QR code version. Size of QRcode is defined as version. Version is
from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1
version increases. So version 40 is 177*177 matrix.
		 * @access protected
		 */
		protected $version = 0;

		/**
		 * @var Levels of error correction. See definitions for possible values.
		 * @access protected
		 */
		protected $level = QR_ECLEVEL_L;

		/**
		 * @var Encoding mode
		 * @access protected
		 */
		protected $hint = QR_MODE_8B;

		/**
		 * @var if true the input string will be converted to uppercase
		 * @access protected
		 */
		protected $casesensitive = true;

		/**
		 * @var structured QR code (not supported yet)
		 * @access protected
		 */
		protected $structured = 0;

		/**
		 * @var mask data
		 * @access protected
		 */
		protected $data;

		// FrameFiller

		/**
		 * @var width
		 * @access protected
		 */
		protected $width;

		/**
		 * @var frame
		 * @access protected
		 */
		protected $frame;

		/**
		 * @var X position of bit
		 * @access protected
		 */
		protected $x;

		/**
		 * @var Y position of bit
		 * @access protected
		 */
		protected $y;

		/**
		 * @var direction
		 * @access protected
		 */
		protected $dir;

		/**
		 * @var single bit
		 * @access protected
		 */
		protected $bit;

		// ---- QRrawcode ----

		/**
		 * @var data code
		 * @access protected
		 */
		protected $datacode = array();

		/**
		 * @var error correction code
		 * @access protected
		 */
		protected $ecccode = array();

		/**
		 * @var blocks
		 * @access protected
		 */
		protected $blocks;

		/**
		 * @var Reed-Solomon blocks
		 * @access protected
		 */
		protected $rsblocks = array(); //of RSblock

		/**
		 * @var counter
		 * @access protected
		 */
		protected $count;

		/**
		 * @var data length
		 * @access protected
		 */
		protected $dataLength;

		/**
		 * @var error correction length
		 * @access protected
		 */
		protected $eccLength;

		/**
		 * @var b1
		 * @access protected
		 */
		protected $b1;

		// ---- QRmask ----

		/**
		 * @var run length
		 * @access protected
		 */
		protected $runLength = array();

		// ---- QRsplit ----

		/**
		 * @var input data string
		 * @access protected
		 */
		protected $dataStr = '';

		/**
		 * @var input items
		 * @access protected
		 */
		protected $items;

		// Reed-Solomon items

		/**
		 * @var Reed-Solomon items
		 * @access protected
		 */
		protected $rsitems = array();

		/**
		 * @var array of frames
		 * @access protected
		 */
		protected $frames = array();

		/**
		 * @var alphabet-numeric convesion table
		 * @access protected
		 */
		protected $anTable = array(
			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
			36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, //
			 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1, -1, //
			-1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //
			25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, //
			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  //
			);

		/**
		 * @var array Table of the capacity of symbols
		 * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
		 * @access protected
		 */
		protected $capacity = array(
			array(  0,    0, 0, array(   0,    0,    0,    0)), //
			array( 21,   26, 0, array(   7,   10,   13,   17)), //  1
			array( 25,   44, 7, array(  10,   16,   22,   28)), //
			array( 29,   70, 7, array(  15,   26,   36,   44)), //
			array( 33,  100, 7, array(  20,   36,   52,   64)), //
			array( 37,  134, 7, array(  26,   48,   72,   88)), //  5
			array( 41,  172, 7, array(  36,   64,   96,  112)), //
			array( 45,  196, 0, array(  40,   72,  108,  130)), //
			array( 49,  242, 0, array(  48,   88,  132,  156)), //
			array( 53,  292, 0, array(  60,  110,  160,  192)), //
			array( 57,  346, 0, array(  72,  130,  192,  224)), // 10
			array( 61,  404, 0, array(  80,  150,  224,  264)), //
			array( 65,  466, 0, array(  96,  176,  260,  308)), //
			array( 69,  532, 0, array( 104,  198,  288,  352)), //
			array( 73,  581, 3, array( 120,  216,  320,  384)), //
			array( 77,  655, 3, array( 132,  240,  360,  432)), // 15
			array( 81,  733, 3, array( 144,  280,  408,  480)), //
			array( 85,  815, 3, array( 168,  308,  448,  532)), //
			array( 89,  901, 3, array( 180,  338,  504,  588)), //
			array( 93,  991, 3, array( 196,  364,  546,  650)), //
			array( 97, 1085, 3, array( 224,  416,  600,  700)), // 20
			array(101, 1156, 4, array( 224,  442,  644,  750)), //
			array(105, 1258, 4, array( 252,  476,  690,  816)), //
			array(109, 1364, 4, array( 270,  504,  750,  900)), //
			array(113, 1474, 4, array( 300,  560,  810,  960)), //
			array(117, 1588, 4, array( 312,  588,  870, 1050)), // 25
			array(121, 1706, 4, array( 336,  644,  952, 1110)), //
			array(125, 1828, 4, array( 360,  700, 1020, 1200)), //
			array(129, 1921, 3, array( 390,  728, 1050, 1260)), //
			array(133, 2051, 3, array( 420,  784, 1140, 1350)), //
			array(137, 2185, 3, array( 450,  812, 1200, 1440)), // 30
			array(141, 2323, 3, array( 480,  868, 1290, 1530)), //
			array(145, 2465, 3, array( 510,  924, 1350, 1620)), //
			array(149, 2611, 3, array( 540,  980, 1440, 1710)), //
			array(153, 2761, 3, array( 570, 1036, 1530, 1800)), //
			array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35
			array(161, 3034, 0, array( 600, 1120, 1680, 1980)), //
			array(165, 3196, 0, array( 630, 1204, 1770, 2100)), //
			array(169, 3362, 0, array( 660, 1260, 1860, 2220)), //
			array(173, 3532, 0, array( 720, 1316, 1950, 2310)), //
			array(177, 3706, 0, array( 750, 1372, 2040, 2430))  // 40
		);

		/**
		 * @var array Length indicator
		 * @access protected
		 */
		protected $lengthTableBits = array(
			array(10, 12, 14),
			array( 9, 11, 13),
			array( 8, 16, 16),
			array( 8, 10, 12)
		);

		/**
		 * @var array Table of the error correction code (Reed-Solomon block)
		 * See Table 12-16 (pp.30-36), JIS X0510:2004.
		 * @access protected
		 */
		protected $eccTable = array(
			array(array( 0,  0), array( 0,  0), array( 0,  0), array( 0,  0)), //
			array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), //  1
			array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), //
			array(array( 1,  0), array( 1,  0), array( 2,  0), array( 2,  0)), //
			array(array( 1,  0), array( 2,  0), array( 2,  0), array( 4,  0)), //
			array(array( 1,  0), array( 2,  0), array( 2,  2), array( 2,  2)), //  5
			array(array( 2,  0), array( 4,  0), array( 4,  0), array( 4,  0)), //
			array(array( 2,  0), array( 4,  0), array( 2,  4), array( 4,  1)), //
			array(array( 2,  0), array( 2,  2), array( 4,  2), array( 4,  2)), //
			array(array( 2,  0), array( 3,  2), array( 4,  4), array( 4,  4)), //
			array(array( 2,  2), array( 4,  1), array( 6,  2), array( 6,  2)), // 10
			array(array( 4,  0), array( 1,  4), array( 4,  4), array( 3,  8)), //
			array(array( 2,  2), array( 6,  2), array( 4,  6), array( 7,  4)), //
			array(array( 4,  0), array( 8,  1), array( 8,  4), array(12,  4)), //
			array(array( 3,  1), array( 4,  5), array(11,  5), array(11,  5)), //
			array(array( 5,  1), array( 5,  5), array( 5,  7), array(11,  7)), // 15
			array(array( 5,  1), array( 7,  3), array(15,  2), array( 3, 13)), //
			array(array( 1,  5), array(10,  1), array( 1, 15), array( 2, 17)), //
			array(array( 5,  1), array( 9,  4), array(17,  1), array( 2, 19)), //
			array(array( 3,  4), array( 3, 11), array(17,  4), array( 9, 16)), //
			array(array( 3,  5), array( 3, 13), array(15,  5), array(15, 10)), // 20
			array(array( 4,  4), array(17,  0), array(17,  6), array(19,  6)), //
			array(array( 2,  7), array(17,  0), array( 7, 16), array(34,  0)), //
			array(array( 4,  5), array( 4, 14), array(11, 14), array(16, 14)), //
			array(array( 6,  4), array( 6, 14), array(11, 16), array(30,  2)), //
			array(array( 8,  4), array( 8, 13), array( 7, 22), array(22, 13)), // 25
			array(array(10,  2), array(19,  4), array(28,  6), array(33,  4)), //
			array(array( 8,  4), array(22,  3), array( 8, 26), array(12, 28)), //
			array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), //
			array(array( 7,  7), array(21,  7), array( 1, 37), array(19, 26)), //
			array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30
			array(array(13,  3), array( 2, 29), array(42,  1), array(23, 28)), //
			array(array(17,  0), array(10, 23), array(10, 35), array(19, 35)), //
			array(array(17,  1), array(14, 21), array(29, 19), array(11, 46)), //
			array(array(13,  6), array(14, 23), array(44,  7), array(59,  1)), //
			array(array(12,  7), array(12, 26), array(39, 14), array(22, 41)), // 35
			array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), //
			array(array(17,  4), array(29, 14), array(49, 10), array(24, 46)), //
			array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), //
			array(array(20,  4), array(40,  7), array(43, 22), array(10, 67)), //
			array(array(19,  6), array(18, 31), array(34, 34), array(20, 61))  // 40
		);

		/**
		 * @var array Positions of alignment patterns.
		 * This array includes only the second and the third position of the
alignment patterns. Rest of them can be calculated from the distance
between them.
		 * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
		 * @access protected
		 */
		protected $alignmentPattern = array(
			array( 0,  0),
			array( 0,  0), array(18,  0), array(22,  0), array(26,  0), array(30, 
0), //  1- 5
			array(34,  0), array(22, 38), array(24, 42), array(26, 46), array(28,
50), //  6-10
			array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26,
48), // 11-15
			array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34,
62), // 16-20
			array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32,
58), // 21-25
			array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26,
52), // 26-30
			array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30,
54), // 31-35
			array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30,
58)  // 35-40
		);

		/**
		 * @var array Version information pattern (BCH coded).
		 * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
		 * size: [QRSPEC_VERSION_MAX - 6]
		 * @access protected
		 */
		protected $versionPattern = array(
			0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
//
			0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
//
			0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
//
			0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
//
			0x27541, 0x28c69
		);

		/**
		 * @var array Format information
		 * @access protected
		 */
		protected $formatInfo = array(
			array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
//
			array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
//
			array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
//
			array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) 
//
		);


		// -------------------------------------------------
		// -------------------------------------------------


		/**
		 * This is the class constructor.
		 * Creates a QRcode object
		 * @param string $code code to represent using QRcode
		 * @param string $eclevel error level: <ul><li>L : About 7%
or less errors can be corrected.</li><li>M : About 15% or less
errors can be corrected.</li><li>Q : About 25% or less errors
can be corrected.</li><li>H : About 30% or less errors can be
corrected.</li></ul>
		 * @access public
		 * @since 1.0.000
		 */
		public function __construct($code, $eclevel = 'L') {
			$barcode_array = array();
			if ((is_null($code)) OR ($code == '\0') OR ($code ==
'')) {
				return false;
			}
			// set error correction level
			$this->level = array_search($eclevel, array('L',
'M', 'Q', 'H'));
			if ($this->level === false) {
				$this->level = QR_ECLEVEL_L;
			}
			if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
				return false;
			}
			if (($this->version < 0) OR ($this->version >
QRSPEC_VERSION_MAX)) {
				return false;
			}
			$this->items = array();
			$this->encodeString($code);
			$qrTab = $this->binarize($this->data);
			$size = count($qrTab);
			$barcode_array['num_rows'] = $size;
			$barcode_array['num_cols'] = $size;
			$barcode_array['bcode'] = array();
			foreach ($qrTab as $line) {
				$arrAdd = array();
				foreach (str_split($line) as $char) {
					$arrAdd[] = ($char=='1')?1:0;
				}
				$barcode_array['bcode'][] = $arrAdd;
			}
			$this->barcode_array = $barcode_array;
		}

		/**
		 * Returns a barcode array which is readable by TCPDF
		 * @return array barcode array readable by TCPDF;
		 * @access public
		 */
		public function getBarcodeArray() {
			return $this->barcode_array;
		}

		/**
		 * Convert the frame in binary form
		 * @param array $frame array to binarize
		 * @return array frame in binary form
		 */
		protected function binarize($frame) {
			$len = count($frame);
			// the frame is square (width = height)
			foreach ($frame as &$frameLine) {
				for ($i=0; $i<$len; $i++) {
					$frameLine[$i] =
(ord($frameLine[$i])&1)?'1':'0';
				}
			}
			return $frame;
		}

		/**
		 * Encode the input string to QR code
		 * @param string $string input string to encode
		 */
		protected function encodeString($string) {
			$this->dataStr = $string;
			if (!$this->casesensitive) {
				$this->toUpper();
			}
			$ret = $this->splitString();
			if ($ret < 0) {
				return NULL;
			}
			$this->encodeMask(-1);
		}

		/**
		 * Encode mask
		 * @param int $mask masking mode
		 */
		protected function encodeMask($mask) {
			$spec = array(0, 0, 0, 0, 0);
			$this->datacode = $this->getByteStream($this->items);
			if (is_null($this->datacode)) {
				return NULL;
			}
			$spec = $this->getEccSpec($this->version, $this->level, $spec);
			$this->b1 = $this->rsBlockNum1($spec);
			$this->dataLength = $this->rsDataLength($spec);
			$this->eccLength = $this->rsEccLength($spec);
			$this->ecccode = array_fill(0, $this->eccLength, 0);
			$this->blocks = $this->rsBlockNum($spec);
			$ret = $this->init($spec);
			if ($ret < 0) {
				return NULL;
			}
			$this->count = 0;
			$this->width = $this->getWidth($this->version);
			$this->frame = $this->newFrame($this->version);
			$this->x = $this->width - 1;
			$this->y = $this->width - 1;
			$this->dir = -1;
			$this->bit = -1;
			// inteleaved data and ecc codes
			for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
				$code = $this->getCode();
				$bit = 0x80;
				for ($j=0; $j<8; $j++) {
					$addr = $this->getNextPosition();
					$this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
					$bit = $bit >> 1;
				}
			}
			// remainder bits
			$j = $this->getRemainder($this->version);
			for ($i=0; $i<$j; $i++) {
				$addr = $this->getNextPosition();
				$this->setFrameAt($addr, 0x02);
			}
			// masking
			$this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
			if ($mask < 0) {
				if (QR_FIND_BEST_MASK) {
					$masked = $this->mask($this->width, $this->frame,
$this->level);
				} else {
					$masked = $this->makeMask($this->width, $this->frame,
(intval(QR_DEFAULT_MASK) % 8), $this->level);
				}
			} else {
				$masked = $this->makeMask($this->width, $this->frame, $mask,
$this->level);
			}
			if ($masked == NULL) {
				return NULL;
			}
			$this->data = $masked;
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// FrameFiller

		/**
		 * Set frame value at specified position
		 * @param array $at x,y position
		 * @param int $val value of the character to set
		 */
		protected function setFrameAt($at, $val) {
			$this->frame[$at['y']][$at['x']] = chr($val);
		}

		/**
		 * Get frame value at specified position
		 * @param array $at x,y position
		 * @return value at specified position
		 */
		protected function getFrameAt($at) {
			return ord($this->frame[$at['y']][$at['x']]);
		}

		/**
		 * Return the next frame position
		 * @return array of x,y coordinates
		 */
		protected function getNextPosition() {
			do {
				if ($this->bit == -1) {
					$this->bit = 0;
					return array('x'=>$this->x,
'y'=>$this->y);
				}
				$x = $this->x;
				$y = $this->y;
				$w = $this->width;
				if ($this->bit == 0) {
					$x--;
					$this->bit++;
				} else {
					$x++;
					$y += $this->dir;
					$this->bit--;
				}
				if ($this->dir < 0) {
					if ($y < 0) {
						$y = 0;
						$x -= 2;
						$this->dir = 1;
						if ($x == 6) {
							$x--;
							$y = 9;
						}
					}
				} else {
					if ($y == $w) {
						$y = $w - 1;
						$x -= 2;
						$this->dir = -1;
						if ($x == 6) {
							$x--;
							$y -= 8;
						}
					}
				}
				if (($x < 0) OR ($y < 0)) {
					return NULL;
				}
				$this->x = $x;
				$this->y = $y;
			} while(ord($this->frame[$y][$x]) & 0x80);
			return array('x'=>$x, 'y'=>$y);
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRrawcode

		/**
		 * Initialize code.
		 * @param array $spec array of ECC specification
		 * @return 0 in case of success, -1 in case of error
		 */
		protected function init($spec) {
			$dl = $this->rsDataCodes1($spec);
			$el = $this->rsEccCodes1($spec);
			$rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
			$blockNo = 0;
			$dataPos = 0;
			$eccPos = 0;
			$endfor = $this->rsBlockNum1($spec);
			for ($i=0; $i < $endfor; ++$i) {
				$ecc = array_slice($this->ecccode, $eccPos);
				$this->rsblocks[$blockNo] = array();
				$this->rsblocks[$blockNo]['dataLength'] = $dl;
				$this->rsblocks[$blockNo]['data'] =
array_slice($this->datacode, $dataPos);
				$this->rsblocks[$blockNo]['eccLength'] = $el;
				$ecc = $this->encode_rs_char($rs,
$this->rsblocks[$blockNo]['data'], $ecc);
				$this->rsblocks[$blockNo]['ecc'] = $ecc;
				$this->ecccode = array_merge(array_slice($this->ecccode,0,
$eccPos), $ecc);
				$dataPos += $dl;
				$eccPos += $el;
				$blockNo++;
			}
			if ($this->rsBlockNum2($spec) == 0) {
				return 0;
			}
			$dl = $this->rsDataCodes2($spec);
			$el = $this->rsEccCodes2($spec);
			$rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
			if ($rs == NULL) {
				return -1;
			}
			$endfor = $this->rsBlockNum2($spec);
			for ($i=0; $i < $endfor; ++$i) {
				$ecc = array_slice($this->ecccode, $eccPos);
				$this->rsblocks[$blockNo] = array();
				$this->rsblocks[$blockNo]['dataLength'] = $dl;
				$this->rsblocks[$blockNo]['data'] =
array_slice($this->datacode, $dataPos);
				$this->rsblocks[$blockNo]['eccLength'] = $el;
				$ecc = $this->encode_rs_char($rs,
$this->rsblocks[$blockNo]['data'], $ecc);
				$this->rsblocks[$blockNo]['ecc'] = $ecc;
				$this->ecccode = array_merge(array_slice($this->ecccode, 0,
$eccPos), $ecc);
				$dataPos += $dl;
				$eccPos += $el;
				$blockNo++;
			}
			return 0;
		}

		/**
		 * Return Reed-Solomon block code.
		 * @return array rsblocks
		 */
		protected function getCode() {
			if ($this->count < $this->dataLength) {
				$row = $this->count % $this->blocks;
				$col = $this->count / $this->blocks;
				if ($col >= $this->rsblocks[0]['dataLength']) {
					$row += $this->b1;
				}
				$ret = $this->rsblocks[$row]['data'][$col];
			} elseif ($this->count < $this->dataLength +
$this->eccLength) {
				$row = ($this->count - $this->dataLength) % $this->blocks;
				$col = ($this->count - $this->dataLength) / $this->blocks;
				$ret = $this->rsblocks[$row]['ecc'][$col];
			} else {
				return 0;
			}
			$this->count++;
			return $ret;
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRmask

		/**
		 * Write Format Information on frame and returns the number of black bits
		 * @param int $width frame width
		 * @param array $frame frame
		 * @param array $mask masking mode
		 * @param int $level error correction level
		 * @return int blacks
		 */
		 protected function writeFormatInformation($width, &$frame, $mask,
$level) {
			$blacks = 0;
			$format =  $this->getFormatInfo($mask, $level);
			for ($i=0; $i<8; ++$i) {
				if ($format & 1) {
					$blacks += 2;
					$v = 0x85;
				} else {
					$v = 0x84;
				}
				$frame[8][$width - 1 - $i] = chr($v);
				if ($i < 6) {
					$frame[$i][8] = chr($v);
				} else {
					$frame[$i + 1][8] = chr($v);
				}
				$format = $format >> 1;
			}
			for ($i=0; $i<7; ++$i) {
			if ($format & 1) {
				$blacks += 2;
				$v = 0x85;
			} else {
				$v = 0x84;
			}
			$frame[$width - 7 + $i][8] = chr($v);
			if ($i == 0) {
				$frame[8][7] = chr($v);
			} else {
				$frame[8][6 - $i] = chr($v);
			}
			$format = $format >> 1;
			}
			return $blacks;
		}

		/**
		 * mask0
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask0($x, $y) {
			return ($x + $y) & 1;
		}

		/**
		 * mask1
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask1($x, $y) {
			return ($y & 1);
		}

		/**
		 * mask2
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask2($x, $y) {
			return ($x % 3);
		}

		/**
		 * mask3
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask3($x, $y) {
			return ($x + $y) % 3;
		}

		/**
		 * mask4
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask4($x, $y) {
			return (((int)($y / 2)) + ((int)($x / 3))) & 1;
		}

		/**
		 * mask5
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask5($x, $y) {
			return (($x * $y) & 1) + ($x * $y) % 3;
		}

		/**
		 * mask6
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask6($x, $y) {
			return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
		}

		/**
		 * mask7
		 * @param int $x X position
		 * @param int $y Y position
		 * @return int mask
		 */
		 protected function mask7($x, $y) {
			return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
		}

		/**
		 * Return bitmask
		 * @param int $maskNo mask number
		 * @param int $width width
		 * @param array $frame frame
		 * @return array bitmask
		 */
		protected function generateMaskNo($maskNo, $width, $frame) {
			$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
			for ($y=0; $y<$width; ++$y) {
				for ($x=0; $x<$width; ++$x) {
					if (ord($frame[$y][$x]) & 0x80) {
						$bitMask[$y][$x] = 0;
					} else {
						$maskFunc = call_user_func(array($this, 'mask'.$maskNo),
$x, $y);
						$bitMask[$y][$x] = ($maskFunc == 0)?1:0;
					}
				}
			}
			return $bitMask;
		}

		/**
		 * makeMaskNo
		 * @param int $maskNo
		 * @param int $width
		 * @param int $s
		 * @param int $d
		 * @param boolean $maskGenOnly
		 * @return int b
		 */
		 protected function makeMaskNo($maskNo, $width, $s, &$d,
$maskGenOnly=false) {
			$b = 0;
			$bitMask = array();
			$bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
			if ($maskGenOnly) {
				return;
			}
			$d = $s;
			for ($y=0; $y<$width; ++$y) {
				for ($x=0; $x<$width; ++$x) {
					if ($bitMask[$y][$x] == 1) {
						$d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
					}
					$b += (int)(ord($d[$y][$x]) & 1);
				}
			}
			return $b;
		}

		/**
		 * makeMask
		 * @param int $width
		 * @param array $frame
		 * @param int $maskNo
		 * @param int $level
		 * @return array mask
		 */
		 protected function makeMask($width, $frame, $maskNo, $level) {
			$masked = array_fill(0, $width, str_repeat("\0", $width));
			$this->makeMaskNo($maskNo, $width, $frame, $masked);
			$this->writeFormatInformation($width, $masked, $maskNo, $level);
			return $masked;
		}

		/**
		 * calcN1N3
		 * @param int $length
		 * @return int demerit
		 */
		 protected function calcN1N3($length) {
			$demerit = 0;
			for ($i=0; $i<$length; ++$i) {
				if ($this->runLength[$i] >= 5) {
					$demerit += (N1 + ($this->runLength[$i] - 5));
				}
				if ($i & 1) {
					if (($i >= 3) AND ($i < ($length-2)) AND
($this->runLength[$i] % 3 == 0)) {
						$fact = (int)($this->runLength[$i] / 3);
						if (($this->runLength[$i-2] == $fact)
							AND ($this->runLength[$i-1] == $fact)
							AND ($this->runLength[$i+1] == $fact)
							AND ($this->runLength[$i+2] == $fact)) {
							if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3]
>= (4 * $fact))) {
								$demerit += N3;
							} elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >=
(4 * $fact))) {
								$demerit += N3;
							}
						}
					}
				}
			}
			return $demerit;
		}

		/**
		 * evaluateSymbol
		 * @param int $width
		 * @param array $frame
		 * @return int demerit
		 */
		 protected function evaluateSymbol($width, $frame) {
			$head = 0;
			$demerit = 0;
			for ($y=0; $y<$width; ++$y) {
				$head = 0;
				$this->runLength[0] = 1;
				$frameY = $frame[$y];
				if ($y > 0) {
					$frameYM = $frame[$y-1];
				}
				for ($x=0; $x<$width; ++$x) {
					if (($x > 0) AND ($y > 0)) {
						$b22 = ord($frameY[$x]) & ord($frameY[$x-1]) &
ord($frameYM[$x]) & ord($frameYM[$x-1]);
						$w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) |
ord($frameYM[$x-1]);
						if (($b22 | ($w22 ^ 1)) & 1) {
							$demerit += N2;
						}
					}
					if (($x == 0) AND (ord($frameY[$x]) & 1)) {
						$this->runLength[0] = -1;
						$head = 1;
						$this->runLength[$head] = 1;
					} elseif ($x > 0) {
						if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
							$head++;
							$this->runLength[$head] = 1;
						} else {
							$this->runLength[$head]++;
						}
					}
				}
				$demerit += $this->calcN1N3($head+1);
			}
			for ($x=0; $x<$width; ++$x) {
				$head = 0;
				$this->runLength[0] = 1;
				for ($y=0; $y<$width; ++$y) {
					if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
						$this->runLength[0] = -1;
						$head = 1;
						$this->runLength[$head] = 1;
					} elseif ($y > 0) {
						if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
							$head++;
							$this->runLength[$head] = 1;
						} else {
							$this->runLength[$head]++;
						}
					}
				}
				$demerit += $this->calcN1N3($head+1);
			}
			return $demerit;
		}

		/**
		 * mask
		 * @param int $width
		 * @param array $frame
		 * @param int $level
		 * @return array best mask
		 */
		 protected function mask($width, $frame, $level) {
			$minDemerit = PHP_INT_MAX;
			$bestMaskNum = 0;
			$bestMask = array();
			$checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
			if (QR_FIND_FROM_RANDOM !== false) {
				$howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
				for ($i = 0; $i <  $howManuOut; ++$i) {
					$remPos = rand (0, count($checked_masks)-1);
					unset($checked_masks[$remPos]);
					$checked_masks = array_values($checked_masks);
				}
			}
			$bestMask = $frame;
			foreach ($checked_masks as $i) {
				$mask = array_fill(0, $width, str_repeat("\0", $width));
				$demerit = 0;
				$blacks = 0;
				$blacks  = $this->makeMaskNo($i, $width, $frame, $mask);
				$blacks += $this->writeFormatInformation($width, $mask, $i, $level);
				$blacks  = (int)(100 * $blacks / ($width * $width));
				$demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
				$demerit += $this->evaluateSymbol($width, $mask);
				if ($demerit < $minDemerit) {
					$minDemerit = $demerit;
					$bestMask = $mask;
					$bestMaskNum = $i;
				}
			}
			return $bestMask;
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRsplit

		/**
		 * Return true if the character at specified position is a number
		 * @param string $str string
		 * @param int $pos characted position
		 * @return boolean true of false
		 */
		 protected function isdigitat($str, $pos) {
			if ($pos >= strlen($str)) {
				return false;
			}
			return ((ord($str[$pos]) >=
ord('0'))&&(ord($str[$pos]) <= ord('9')));
		}

		/**
		 * Return true if the character at specified position is an alphanumeric
character
		 * @param string $str string
		 * @param int $pos characted position
		 * @return boolean true of false
		 */
		 protected function isalnumat($str, $pos) {
			if ($pos >= strlen($str)) {
				return false;
			}
			return ($this->lookAnTable(ord($str[$pos])) >= 0);
		}

		/**
		 * identifyMode
		 * @param int $pos
		 * @return int mode
		 */
		 protected function identifyMode($pos) {
			if ($pos >= strlen($this->dataStr)) {
				return QR_MODE_NL;
			}
			$c = $this->dataStr[$pos];
			if ($this->isdigitat($this->dataStr, $pos)) {
				return QR_MODE_NM;
			} elseif ($this->isalnumat($this->dataStr, $pos)) {
				return QR_MODE_AN;
			} elseif ($this->hint == QR_MODE_KJ) {
				if ($pos+1 < strlen($this->dataStr)) {
					$d = $this->dataStr[$pos+1];
					$word = (ord($c) << 8) | ord($d);
					if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >=
0xe040 && $word <= 0xebbf)) {
						return QR_MODE_KJ;
					}
				}
			}
			return QR_MODE_8B;
		}

		/**
		 * eatNum
		 * @return int run
		 */
		 protected function eatNum() {
			$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
			$p = 0;
			while($this->isdigitat($this->dataStr, $p)) {
				$p++;
			}
			$run = $p;
			$mode = $this->identifyMode($p);
			if ($mode == QR_MODE_8B) {
				$dif = $this->estimateBitsModeNum($run) + 4 + $ln
				+ $this->estimateBitsMode8(1)         // + 4 + l8
				- $this->estimateBitsMode8($run + 1); // - 4 - l8
				if ($dif > 0) {
					return $this->eat8();
				}
			}
			if ($mode == QR_MODE_AN) {
				$dif = $this->estimateBitsModeNum($run) + 4 + $ln
				+ $this->estimateBitsModeAn(1)        // + 4 + la
				- $this->estimateBitsModeAn($run + 1);// - 4 - la
				if ($dif > 0) {
					return $this->eatAn();
				}
			}
			$this->items = $this->appendNewInputItem($this->items,
QR_MODE_NM, $run, str_split($this->dataStr));
			return $run;
		}

		/**
		 * eatAn
		 * @return int run
		 */
		 protected function eatAn() {
			$la = $this->lengthIndicator(QR_MODE_AN,  $this->version);
			$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
			$p = 0;
			while($this->isalnumat($this->dataStr, $p)) {
				if ($this->isdigitat($this->dataStr, $p)) {
					$q = $p;
					while($this->isdigitat($this->dataStr, $q)) {
						$q++;
					}
					$dif = $this->estimateBitsModeAn($p) // + 4 + la
					+ $this->estimateBitsModeNum($q - $p) + 4 + $ln
					- $this->estimateBitsModeAn($q); // - 4 - la
					if ($dif < 0) {
						break;
					} else {
						$p = $q;
					}
				} else {
					$p++;
				}
			}
			$run = $p;
			if (!$this->isalnumat($this->dataStr, $p)) {
				$dif = $this->estimateBitsModeAn($run) + 4 + $la
				+ $this->estimateBitsMode8(1) // + 4 + l8
				- $this->estimateBitsMode8($run + 1); // - 4 - l8
				if ($dif > 0) {
					return $this->eat8();
				}
			}
			$this->items = $this->appendNewInputItem($this->items,
QR_MODE_AN, $run, str_split($this->dataStr));
			return $run;
		}

		/**
		 * eatKanji
		 * @return int run
		 */
		 protected function eatKanji() {
			$p = 0;
			while($this->identifyMode($p) == QR_MODE_KJ) {
				$p += 2;
			}
			$this->items = $this->appendNewInputItem($this->items,
QR_MODE_KJ, $p, str_split($this->dataStr));
			return $run;
		}

		/**
		 * eat8
		 * @return int run
		 */
		 protected function eat8() {
			$la = $this->lengthIndicator(QR_MODE_AN, $this->version);
			$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
			$p = 1;
			$dataStrLen = strlen($this->dataStr);
			while($p < $dataStrLen) {
				$mode = $this->identifyMode($p);
				if ($mode == QR_MODE_KJ) {
					break;
				}
				if ($mode == QR_MODE_NM) {
					$q = $p;
					while($this->isdigitat($this->dataStr, $q)) {
						$q++;
					}
					$dif = $this->estimateBitsMode8($p) // + 4 + l8
					+ $this->estimateBitsModeNum($q - $p) + 4 + $ln
					- $this->estimateBitsMode8($q); // - 4 - l8
					if ($dif < 0) {
						break;
					} else {
						$p = $q;
					}
				} elseif ($mode == QR_MODE_AN) {
					$q = $p;
					while($this->isalnumat($this->dataStr, $q)) {
						$q++;
					}
					$dif = $this->estimateBitsMode8($p)  // + 4 + l8
					+ $this->estimateBitsModeAn($q - $p) + 4 + $la
					- $this->estimateBitsMode8($q); // - 4 - l8
					if ($dif < 0) {
						break;
					} else {
						$p = $q;
					}
				} else {
					$p++;
				}
			}
			$run = $p;
			$this->items = $this->appendNewInputItem($this->items,
QR_MODE_8B, $run, str_split($this->dataStr));
			return $run;
		}

		/**
		 * splitString
		 */
		 protected function splitString() {
			while (strlen($this->dataStr) > 0) {
				if ($this->dataStr == '') {
					return 0;
				}
				$mode = $this->identifyMode(0);
				switch ($mode) {
					case QR_MODE_NM: {
						$length = $this->eatNum();
						break;
					}
					case QR_MODE_AN: {
						$length = $this->eatAn();
						break;
					}
					case QR_MODE_KJ: {
						if ($hint == QR_MODE_KJ) {
							$length = $this->eatKanji();
						} else {
							$length = $this->eat8();
						}
						break;
					}
					default: {
						$length = $this->eat8();
						break;
					}
				}
				if ($length == 0) {
					return 0;
				}
				if ($length < 0) {
					return -1;
				}
				$this->dataStr = substr($this->dataStr, $length);
			}
		}

		/**
		 * toUpper
		 */
		 protected function toUpper() {
			$stringLen = strlen($this->dataStr);
			$p = 0;
			while ($p < $stringLen) {
				$mode = $this->identifyMode(substr($this->dataStr, $p),
$this->hint);
				if ($mode == QR_MODE_KJ) {
					$p += 2;
				} else {
					if ((ord($this->dataStr[$p]) >= ord('a')) AND
(ord($this->dataStr[$p]) <= ord('z'))) {
						$this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
					}
					$p++;
				}
			}
			return $this->dataStr;
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRinputItem

		/**
		 * newInputItem
		 * @param int $mode
		 * @param int $size
		 * @param array $data
		 * @param array $bstream
		 * @return array input item
		 */
		 protected function newInputItem($mode, $size, $data, $bstream=null) {
			$setData = array_slice($data, 0, $size);
			if (count($setData) < $size) {
				$setData = array_merge($setData, array_fill(0, ($size -
count($setData)), 0));
			}
			if (!$this->check($mode, $size, $setData)) {
				return NULL;
			}
			$inputitem = array();
			$inputitem['mode'] = $mode;
			$inputitem['size'] = $size;
			$inputitem['data'] = $setData;
			$inputitem['bstream'] = $bstream;
			return $inputitem;
		}

		/**
		 * encodeModeNum
		 * @param array $inputitem
		 * @param int $version
		 * @return array input item
		 */
		 protected function encodeModeNum($inputitem, $version) {
			$words = (int)($inputitem['size'] / 3);
			$inputitem['bstream'] = array();
			$val = 0x1;
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4, $val);
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'],
$this->lengthIndicator(QR_MODE_NM, $version),
$inputitem['size']);
			for ($i=0; $i < $words; ++$i) {
				$val  = (ord($inputitem['data'][$i*3  ]) -
ord('0')) * 100;
				$val += (ord($inputitem['data'][$i*3+1]) -
ord('0')) * 10;
				$val += (ord($inputitem['data'][$i*3+2]) -
ord('0'));
				$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 10, $val);
			}
			if ($inputitem['size'] - $words * 3 == 1) {
				$val = ord($inputitem['data'][$words*3]) -
ord('0');
				$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4, $val);
			} elseif (($inputitem['size'] - ($words * 3)) == 2) {
				$val  = (ord($inputitem['data'][$words*3  ]) -
ord('0')) * 10;
				$val += (ord($inputitem['data'][$words*3+1]) -
ord('0'));
				$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 7, $val);
			}
			return $inputitem;
		}

		/**
		 * encodeModeAn
		 * @param array $inputitem
		 * @param int $version
		 * @return array input item
		 */
		 protected function encodeModeAn($inputitem, $version) {
			$words = (int)($inputitem['size'] / 2);
			$inputitem['bstream'] = array();
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4, 0x02);
			$inputitem['bstream'] = $this->appendNum(v,
$this->lengthIndicator(QR_MODE_AN, $version),
$inputitem['size']);
			for ($i=0; $i < $words; ++$i) {
				$val  =
(int)$this->lookAnTable(ord($inputitem['data'][$i*2  ])) * 45;
				$val +=
(int)$this->lookAnTable(ord($inputitem['data'][$i*2+1]));
				$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 11, $val);
			}
			if ($inputitem['size'] & 1) {
				$val = $this->lookAnTable(ord($inputitem['data'][($words *
2)]));
				$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 6, $val);
			}
			return $inputitem;
		}

		/**
		 * encodeMode8
		 * @param array $inputitem
		 * @param int $version
		 * @return array input item
		 */
		 protected function encodeMode8($inputitem, $version) {
			$inputitem['bstream'] = array();
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4, 0x4);
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'],
$this->lengthIndicator(QR_MODE_8B, $version),
$inputitem['size']);
			for ($i=0; $i < $inputitem['size']; ++$i) {
				$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 8,
ord($inputitem['data'][$i]));
			}
			return $inputitem;
		}

		/**
		 * encodeModeKanji
		 * @param array $inputitem
		 * @param int $version
		 * @return array input item
		 */
		 protected function encodeModeKanji($inputitem, $version) {
			$inputitem['bstream'] = array();
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4, 0x8);
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'],
$this->lengthIndicator(QR_MODE_KJ, $version),
(int)($inputitem['size'] / 2));
			for ($i=0; $i<$inputitem['size']; $i+=2) {
				$val = (ord($inputitem['data'][$i]) << 8) |
ord($inputitem['data'][$i+1]);
				if ($val <= 0x9ffc) {
					$val -= 0x8140;
				} else {
					$val -= 0xc140;
				}
				$h = ($val >> 8) * 0xc0;
				$val = ($val & 0xff) + $h;
				$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 13, $val);
			}
			return $inputitem;
		}

		/**
		 * encodeModeStructure
		 * @param array $inputitem
		 * @return array input item
		 */
		 protected function encodeModeStructure($inputitem) {
			$inputitem['bstream'] = array();
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4, 0x03);
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4,
ord($inputitem['data'][1]) - 1);
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 4,
ord($inputitem['data'][0]) - 1);
			$inputitem['bstream'] =
$this->appendNum($inputitem['bstream'], 8,
ord($inputitem['data'][2]));
			return $inputitem;
		}

		/**
		 * encodeBitStream
		 * @param array $inputitem
		 * @param int $version
		 * @return array input item
		 */
		 protected function encodeBitStream($inputitem, $version) {
			$inputitem['bstream'] = array();
			$words = $this->maximumWords($inputitem['mode'], $version);
			if ($inputitem['size'] > $words) {
				$st1 = $this->newInputItem($inputitem['mode'], $words,
$inputitem['data']);
				$st2 = $this->newInputItem($inputitem['mode'],
$inputitem['size'] - $words,
array_slice($inputitem['data'], $words));
				$st1 = $this->encodeBitStream($st1, $version);
				$st2 = $this->encodeBitStream($st2, $version);
				$inputitem['bstream'] = array();
				$inputitem['bstream'] =
$this->appendBitstream($inputitem['bstream'],
$st1['bstream']);
				$inputitem['bstream'] =
$this->appendBitstream($inputitem['bstream'],
$st2['bstream']);
			} else {
				switch($inputitem['mode']) {
					case QR_MODE_NM: {
						$inputitem = $this->encodeModeNum($inputitem, $version);
						break;
					}
					case QR_MODE_AN: {
						$inputitem = $this->encodeModeAn($inputitem, $version);
						break;
					}
					case QR_MODE_8B: {
						$inputitem = $this->encodeMode8($inputitem, $version);
						break;
					}
					case QR_MODE_KJ: {
						$inputitem = $this->encodeModeKanji($inputitem, $version);
						break;
					}
					case QR_MODE_ST: {
						$inputitem = $this->encodeModeStructure($inputitem);
						break;
					}
					default: {
						break;
					}
				}
			}
			return $inputitem;
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRinput

		/**
		 * Append data to an input object.
		 * The data is copied and appended to the input object.
		 * @param array items input items
		 * @param int $mode encoding mode.
		 * @param int $size size of data (byte).
		 * @param array $data array of input data.
		 * @return items
		 *
		 */
		protected function appendNewInputItem($items, $mode, $size, $data) {
			$items[] = $this->newInputItem($mode, $size, $data);
			return $items;
		}

		/**
		 * insertStructuredAppendHeader
		 * @param array $items
		 * @param int $size
		 * @param int $index
		 * @param int $parity
		 * @return array items
		 */
		 protected function insertStructuredAppendHeader($items, $size, $index,
$parity) {
			if ($size > MAX_STRUCTURED_SYMBOLS) {
				return -1;
			}
			if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
				return -1;
			}
			$buf = array($size, $index, $parity);
			$entry = $this->newInputItem(QR_MODE_ST, 3, buf);
			array_unshift($items, $entry);
			return $items;
		}

		/**
		 * calcParity
		 * @param array $items
		 * @return int parity
		 */
		 protected function calcParity($items) {
			$parity = 0;
			foreach ($items as $item) {
				if ($item['mode'] != QR_MODE_ST) {
					for ($i=$item['size']-1; $i>=0; --$i) {
						$parity ^= $item['data'][$i];
					}
				}
			}
			return $parity;
		}

		/**
		 * checkModeNum
		 * @param int $size
		 * @param array $data
		 * @return boolean true or false
		 */
		 protected function checkModeNum($size, $data) {
			for ($i=0; $i<$size; ++$i) {
				if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) >
ord('9'))){
					return false;
				}
			}
			return true;
		}

		/**
		 * estimateBitsModeNum
		 * @param int $size
		 * @return int number of bits
		 */
		 protected function estimateBitsModeNum($size) {
			$w = (int)$size / 3;
			$bits = $w * 10;
			switch($size - $w * 3) {
				case 1: {
					$bits += 4;
					break;
				}
				case 2: {
					$bits += 7;
					break;
				}
				default: {
					break;
				}
			}
			return $bits;
		}

		/**
		 * Look up the alphabet-numeric convesion table (see JIS X0510:2004,
pp.19).
		 * @param int $c character value
		 * @return value
		 */
		protected function lookAnTable($c) {
			return (($c > 127)?-1:$this->anTable[$c]);
		}

		/**
		 * checkModeAn
		 * @param int $size
		 * @param array $data
		 * @return boolean true or false
		 */
		 protected function checkModeAn($size, $data) {
			for ($i=0; $i<$size; ++$i) {
				if ($this->lookAnTable(ord($data[$i])) == -1) {
					return false;
				}
			}
			return true;
		}

		/**
		 * estimateBitsModeAn
		 * @param int $size
		 * @return int number of bits
		 */
		 protected function estimateBitsModeAn($size) {
			$w = (int)($size / 2);
			$bits = $w * 11;
			if ($size & 1) {
				$bits += 6;
			}
			return $bits;
		}

		/**
		 * estimateBitsMode8
		 * @param int $size
		 * @return int number of bits
		 */
		 protected function estimateBitsMode8($size) {
			return $size * 8;
		}

		/**
		 * estimateBitsModeKanji
		 * @param int $size
		 * @return int number of bits
		 */
		 protected function estimateBitsModeKanji($size) {
			return (int)(($size / 2) * 13);
		}

		/**
		 * checkModeKanji
		 * @param int $size
		 * @param array $data
		 * @return boolean true or false
		 */
		 protected function checkModeKanji($size, $data) {
			if ($size & 1) {
				return false;
			}
			for ($i=0; $i<$size; $i+=2) {
				$val = (ord($data[$i]) << 8) | ord($data[$i+1]);
				if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040))
OR ($val > 0xebbf)) {
					return false;
				}
			}
			return true;
		}

		/**
		 * Validate the input data.
		 * @param int $mode encoding mode.
		 * @param int $size size of data (byte).
		 * @param array data data to validate
		 * @return boolean true in case of valid data, false otherwise
		 */
		protected function check($mode, $size, $data) {
			if ($size <= 0) {
				return false;
			}
			switch($mode) {
				case QR_MODE_NM: {
					return $this->checkModeNum($size, $data);
				}
				case QR_MODE_AN: {
					return $this->checkModeAn($size, $data);
				}
				case QR_MODE_KJ: {
					return $this->checkModeKanji($size, $data);
				}
				case QR_MODE_8B: {
					return true;
				}
				case QR_MODE_ST: {
					return true;
				}
				default: {
					break;
				}
			}
			return false;
		}

		/**
		 * estimateBitStreamSize
		 * @param array $items
		 * @param int $version
		 * @return int bits
		 */
		 protected function estimateBitStreamSize($items, $version) {
			$bits = 0;
			if ($version == 0) {
				$version = 1;
			}
			foreach ($items as $item) {
				switch($item['mode']) {
					case QR_MODE_NM: {
						$bits = $this->estimateBitsModeNum($item['size']);
						break;
					}
					case QR_MODE_AN: {
						$bits = $this->estimateBitsModeAn($item['size']);
						break;
					}
					case QR_MODE_8B: {
						$bits = $this->estimateBitsMode8($item['size']);
						break;
					}
					case QR_MODE_KJ: {
						$bits = $this->estimateBitsModeKanji($item['size']);
						break;
					}
					case QR_MODE_ST: {
						return STRUCTURE_HEADER_BITS;
					}
					default: {
						return 0;
					}
				}
				$l = $this->lengthIndicator($item['mode'], $version);
				$m = 1 << $l;
				$num = (int)(($item['size'] + $m - 1) / $m);
				$bits += $num * (4 + $l);
			}
			return $bits;
		}

		/**
		 * estimateVersion
		 * @param array $items
		 * @return int version
		 */
		 protected function estimateVersion($items) {
			$version = 0;
			$prev = 0;
			do {
				$prev = $version;
				$bits = $this->estimateBitStreamSize($items, $prev);
				$version = $this->getMinimumVersion((int)(($bits + 7) / 8),
$this->level);
				if ($version < 0) {
					return -1;
				}
			} while ($version > $prev);
			return $version;
		}

		/**
		 * lengthOfCode
		 * @param int $mode
		 * @param int $version
		 * @param int $bits
		 * @return int size
		 */
		 protected function lengthOfCode($mode, $version, $bits) {
			$payload = $bits - 4 - $this->lengthIndicator($mode, $version);
			switch($mode) {
				case QR_MODE_NM: {
					$chunks = (int)($payload / 10);
					$remain = $payload - $chunks * 10;
					$size = $chunks * 3;
					if ($remain >= 7) {
						$size += 2;
					} elseif ($remain >= 4) {
						$size += 1;
					}
					break;
				}
				case QR_MODE_AN: {
					$chunks = (int)($payload / 11);
					$remain = $payload - $chunks * 11;
					$size = $chunks * 2;
					if ($remain >= 6) {
						++$size;
					}
					break;
				}
				case QR_MODE_8B: {
					$size = (int)($payload / 8);
					break;
				}
				case QR_MODE_KJ: {
					$size = (int)(($payload / 13) * 2);
					break;
				}
				case QR_MODE_ST: {
					$size = (int)($payload / 8);
					break;
				}
				default: {
					$size = 0;
					break;
				}
			}
			$maxsize = $this->maximumWords($mode, $version);
			if ($size < 0) {
				$size = 0;
			}
			if ($size > $maxsize) {
				$size = $maxsize;
			}
			return $size;
		}

		/**
		 * createBitStream
		 * @param array $items
		 * @return array of items and total bits
		 */
		 protected function createBitStream($items) {
			$total = 0;
			foreach ($items as $key => $item) {
				$items[$key] = $this->encodeBitStream($item, $this->version);
				$bits = count($items[$key]['bstream']);
				$total += $bits;
			}
			return array($items, $total);
		}

		/**
		 * convertData
		 * @param array $items
		 * @return array items
		 */
		 protected function convertData($items) {
			$ver = $this->estimateVersion($items);
			if ($ver > $this->version) {
				$this->version = $ver;
			}
			for (;;) {
				$cbs = $this->createBitStream($items);
				$items = $cbs[0];
				$bits = $cbs[1];
				if ($bits < 0) {
					return -1;
				}
				$ver = $this->getMinimumVersion((int)(($bits + 7) / 8),
$this->level);
				if ($ver < 0) {
					return -1;
				} elseif ($ver > $this->version) {
					$this->version = $ver;
				} else {
					break;
				}
			}
			return $items;
		}

		/**
		 * Append Padding Bit to bitstream
		 * @param array $bstream
		 * @return array bitstream
		 */
		 protected function appendPaddingBit($bstream) {
			$bits = count($bstream);
			$maxwords = $this->getDataLength($this->version, $this->level);
			$maxbits = $maxwords * 8;
			if ($maxbits == $bits) {
				return 0;
			}
			if ($maxbits - $bits < 5) {
				return $this->appendNum($bstream, $maxbits - $bits, 0);
			}
			$bits += 4;
			$words = (int)(($bits + 7) / 8);
			$padding = array();
			$padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
			$padlen = $maxwords - $words;
			if ($padlen > 0) {
				$padbuf = array();
				for ($i=0; $i<$padlen; ++$i) {
					$padbuf[$i] = ($i&1)?0x11:0xec;
				}
				$padding = $this->appendBytes($padding, $padlen, $padbuf);
			}
			return $this->appendBitstream($bstream, $padding);
		}

		/**
		 * mergeBitStream
		 * @param array $bstream
		 * @return array bitstream
		 */
		 protected function mergeBitStream($items) {
			$items = $this->convertData($items);
			$bstream = array();
			foreach ($items as $item) {
				$bstream = $this->appendBitstream($bstream,
$item['bstream']);
			}
			return $bstream;
		}

		/**
		 * Returns a stream of bits.
		 * @param int $items
		 * @return array padded merged byte stream
		 */
		protected function getBitStream($items) {
			$bstream = $this->mergeBitStream($items);
			return $this->appendPaddingBit($bstream);
		}

		/**
		 * Pack all bit streams padding bits into a byte array.
		 * @param int $items
		 * @return array padded merged byte stream
		 */
		protected function getByteStream($items) {
			$bstream = $this->getBitStream($items);
			return $this->bitstreamToByte($bstream);
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRbitstream

		/**
		 * Return an array with zeros
		 * @param int $setLength array size
		 * @return array
		 */
		 protected function allocate($setLength) {
			return array_fill(0, $setLength, 0);
		}

		/**
		 * Return new bitstream from number
		 * @param int $bits number of bits
		 * @param int $num number
		 * @return array bitstream
		 */
		 protected function newFromNum($bits, $num) {
			$bstream = $this->allocate($bits);
			$mask = 1 << ($bits - 1);
			for ($i=0; $i<$bits; ++$i) {
				if ($num & $mask) {
					$bstream[$i] = 1;
				} else {
					$bstream[$i] = 0;
				}
				$mask = $mask >> 1;
			}
			return $bstream;
		}

		/**
		 * Return new bitstream from bytes
		 * @param int $size size
		 * @param array $data bytes
		 * @return array bitstream
		 */
		 protected function newFromBytes($size, $data) {
			$bstream = $this->allocate($size * 8);
			$p=0;
			for ($i=0; $i<$size; ++$i) {
				$mask = 0x80;
				for ($j=0; $j<8; ++$j) {
					if ($data[$i] & $mask) {
						$bstream[$p] = 1;
					} else {
						$bstream[$p] = 0;
					}
					$p++;
					$mask = $mask >> 1;
				}
			}
			return $bstream;
		}

		/**
		 * Append one bitstream to another
		 * @param array $bitstream original bitstream
		 * @param array $append bitstream to append
		 * @return array bitstream
		 */
		 protected function appendBitstream($bitstream, $append) {
			if ((!is_array($append)) OR (count($append) == 0)) {
				return $bitstream;
			}
			if (count($bitstream) == 0) {
				return $append;
			}
			return array_values(array_merge($bitstream, $append));
		}

		/**
		 * Append one bitstream created from number to another
		 * @param array $bitstream original bitstream
		 * @param int $bits number of bits
		 * @param int $num number
		 * @return array bitstream
		 */
		 protected function appendNum($bitstream, $bits, $num) {
			if ($bits == 0) {
				return 0;
			}
			$b = $this->newFromNum($bits, $num);
			return $this->appendBitstream($bitstream, $b);
		}

		/**
		 * Append one bitstream created from bytes to another
		 * @param array $bitstream original bitstream
		 * @param int $size size
		 * @param array $data bytes
		 * @return array bitstream
		 */
		 protected function appendBytes($bitstream, $size, $data) {
			if ($size == 0) {
				return 0;
			}
			$b = $this->newFromBytes($size, $data);
			return $this->appendBitstream($bitstream, $b);
		}

		/**
		 * Convert bitstream to bytes
		 * @param array $bitstream original bitstream
		 * @return array of bytes
		 */
		 protected function bitstreamToByte($bstream) {
			$size = count($bstream);
			if ($size == 0) {
				return array();
			}
			$data = array_fill(0, (int)(($size + 7) / 8), 0);
			$bytes = (int)($size / 8);
			$p = 0;
			for ($i=0; $i<$bytes; $i++) {
				$v = 0;
				for ($j=0; $j<8; $j++) {
					$v = $v << 1;
					$v |= $bstream[$p];
					$p++;
				}
				$data[$i] = $v;
			}
			if ($size & 7) {
				$v = 0;
				for ($j=0; $j<($size & 7); $j++) {
					$v = $v << 1;
					$v |= $bstream[$p];
					$p++;
				}
				$data[$bytes] = $v;
			}
			return $data;
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRspec

		/**
		 * Replace a value on the array at the specified position
		 * @param array $srctab
		 * @param int $x X position
		 * @param int $y Y position
		 * @param string $repl value to replace
		 * @param int $replLen length of the repl string
		 * @return array srctab
		 */
		 protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) {
			$srctab[$y] = substr_replace($srctab[$y], ($replLen !==
false)?substr($repl,0,$replLen):$repl, $x, ($replLen !==
false)?$replLen:strlen($repl));
			return $srctab;
		}

		/**
		 * Return maximum data code length (bytes) for the version.
		 * @param int $version version
		 * @param int $level error correction level
		 * @return int maximum size (bytes)
		 */
		protected function getDataLength($version, $level) {
			return $this->capacity[$version][QRCAP_WORDS] -
$this->capacity[$version][QRCAP_EC][$level];
		}

		/**
		 * Return maximum error correction code length (bytes) for the version.
		 * @param int $version version
		 * @param int $level error correction level
		 * @return int ECC size (bytes)
		 */
		protected function getECCLength($version, $level){
			return $this->capacity[$version][QRCAP_EC][$level];
		}

		/**
		 * Return the width of the symbol for the version.
		 * @param int $version version
		 * @return int width
		 */
		protected function getWidth($version) {
			return $this->capacity[$version][QRCAP_WIDTH];
		}

		/**
		 * Return the numer of remainder bits.
		 * @param int $version version
		 * @return int number of remainder bits
		 */
		protected function getRemainder($version) {
			return $this->capacity[$version][QRCAP_REMINDER];
		}

		/**
		 * Return a version number that satisfies the input code length.
		 * @param int $size input code length (byte)
		 * @param int $level error correction level
		 * @return int version number
		 */
		protected function getMinimumVersion($size, $level) {
			for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) {
				$words  = $this->capacity[$i][QRCAP_WORDS] -
$this->capacity[$i][QRCAP_EC][$level];
				if ($words >= $size) {
					return $i;
				}
			}
			return -1;
		}

		/**
		 * Return the size of length indicator for the mode and version.
		 * @param int $mode encoding mode
		 * @param int $version version
		 * @return int the size of the appropriate length indicator (bits).
		 */
		protected function lengthIndicator($mode, $version) {
			if ($mode == QR_MODE_ST) {
				return 0;
			}
			if ($version <= 9) {
				$l = 0;
			} elseif ($version <= 26) {
				$l = 1;
			} else {
				$l = 2;
			}
			return $this->lengthTableBits[$mode][$l];
		}

		/**
		 * Return the maximum length for the mode and version.
		 * @param int $mode encoding mode
		 * @param int $version version
		 * @return int the maximum length (bytes)
		 */
		protected function maximumWords($mode, $version) {
			if ($mode == QR_MODE_ST) {
				return 3;
			}
			if ($version <= 9) {
				$l = 0;
			} else if ($version <= 26) {
				$l = 1;
			} else {
				$l = 2;
			}
			$bits = $this->lengthTableBits[$mode][$l];
			$words = (1 << $bits) - 1;
			if ($mode == QR_MODE_KJ) {
				$words *= 2; // the number of bytes is required
			}
			return $words;
		}

		/**
		 * Return an array of ECC specification.
		 * @param int $version version
		 * @param int $level error correction level
		 * @param array $spec an array of ECC specification contains as
following: {# of type1 blocks, # of data code, # of ecc code, # of type2
blocks, # of data code}
		 * @return array spec
		 */
		protected function getEccSpec($version, $level, $spec) {
			if (count($spec) < 5) {
				$spec = array(0, 0, 0, 0, 0);
			}
			$b1 = $this->eccTable[$version][$level][0];
			$b2 = $this->eccTable[$version][$level][1];
			$data = $this->getDataLength($version, $level);
			$ecc = $this->getECCLength($version, $level);
			if ($b2 == 0) {
				$spec[0] = $b1;
				$spec[1] = (int)($data / $b1);
				$spec[2] = (int)($ecc / $b1);
				$spec[3] = 0;
				$spec[4] = 0;
			} else {
				$spec[0] = $b1;
				$spec[1] = (int)($data / ($b1 + $b2));
				$spec[2] = (int)($ecc  / ($b1 + $b2));
				$spec[3] = $b2;
				$spec[4] = $spec[1] + 1;
			}
			return $spec;
		}

		/**
		 * Put an alignment marker.
		 * @param array $frame frame
		 * @param int $width width
		 * @param int $ox X center coordinate of the pattern
		 * @param int $oy Y center coordinate of the pattern
		 * @return array frame
		 */
		protected function putAlignmentMarker($frame, $ox, $oy) {
			$finder = array(
				"\xa1\xa1\xa1\xa1\xa1",
				"\xa1\xa0\xa0\xa0\xa1",
				"\xa1\xa0\xa1\xa0\xa1",
				"\xa1\xa0\xa0\xa0\xa1",
				"\xa1\xa1\xa1\xa1\xa1"
				);
			$yStart = $oy - 2;
			$xStart = $ox - 2;
			for ($y=0; $y < 5; $y++) {
				$frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
			}
			return $frame;
		}

		/**
		 * Put an alignment pattern.
		 * @param int $version version
		 * @param array $fram frame
		 * @param int $width width
		 * @return array frame
		 */
		 protected function putAlignmentPattern($version, $frame, $width) {
			if ($version < 2) {
				return $frame;
			}
			$d = $this->alignmentPattern[$version][1] -
$this->alignmentPattern[$version][0];
			if ($d < 0) {
				$w = 2;
			} else {
				$w = (int)(($width - $this->alignmentPattern[$version][0]) / $d +
2);
			}
			if ($w * $w - 3 == 1) {
				$x = $this->alignmentPattern[$version][0];
				$y = $this->alignmentPattern[$version][0];
				$frame = $this->putAlignmentMarker($frame, $x, $y);
				return $frame;
			}
			$cx = $this->alignmentPattern[$version][0];
			$wo = $w - 1;
			for ($x=1; $x < $wo; ++$x) {
				$frame = $this->putAlignmentMarker($frame, 6, $cx);
				$frame = $this->putAlignmentMarker($frame, $cx,  6);
				$cx += $d;
			}
			$cy = $this->alignmentPattern[$version][0];
			for ($y=0; $y < $wo; ++$y) {
				$cx = $this->alignmentPattern[$version][0];
				for ($x=0; $x < $wo; ++$x) {
					$frame = $this->putAlignmentMarker($frame, $cx, $cy);
					$cx += $d;
				}
				$cy += $d;
			}
			return $frame;
		}

		/**
		 * Return BCH encoded version information pattern that is used for the
symbol of version 7 or greater. Use lower 18 bits.
		 * @param int $version version
		 * @return BCH encoded version information pattern
		 */
		protected function getVersionPattern($version) {
			if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
				return 0;
			}
			return $this->versionPattern[($version - 7)];
		}

		/**
		 * Return BCH encoded format information pattern.
		 * @param array $mask
		 * @param int $level error correction level
		 * @return BCH encoded format information pattern
		 */
		protected function getFormatInfo($mask, $level) {
			if (($mask < 0) OR ($mask > 7)) {
				return 0;
			}
			if (($level < 0) OR ($level > 3)) {
				return 0;
			}
			return $this->formatInfo[$level][$mask];
		}

		/**
		 * Put a finder pattern.
		 * @param array $frame frame
		 * @param int $width width
		 * @param int $ox X center coordinate of the pattern
		 * @param int $oy Y center coordinate of the pattern
		 * @return array frame
		 */
		protected function putFinderPattern($frame, $ox, $oy) {
			$finder = array(
			"\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
			"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
			"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
			"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
			"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
			"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
			"\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
			);
			for ($y=0; $y < 7; $y++) {
				$frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
			}
			return $frame;
		}

		/**
		 * Return a copy of initialized frame.
		 * @param int $version version
		 * @return Array of unsigned char.
		 */
		protected function createFrame($version) {
			$width = $this->capacity[$version][QRCAP_WIDTH];
			$frameLine = str_repeat ("\0", $width);
			$frame = array_fill(0, $width, $frameLine);
			// Finder pattern
			$frame = $this->putFinderPattern($frame, 0, 0);
			$frame = $this->putFinderPattern($frame, $width - 7, 0);
			$frame = $this->putFinderPattern($frame, 0, $width - 7);
			// Separator
			$yOffset = $width - 7;
			for ($y=0; $y < 7; ++$y) {
				$frame[$y][7] = "\xc0";
				$frame[$y][$width - 8] = "\xc0";
				$frame[$yOffset][7] = "\xc0";
				++$yOffset;
			}
			$setPattern = str_repeat("\xc0", 8);
			$frame = $this->qrstrset($frame, 0, 7, $setPattern);
			$frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
			$frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
			// Format info
			$setPattern = str_repeat("\x84", 9);
			$frame = $this->qrstrset($frame, 0, 8, $setPattern);
			$frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
			$yOffset = $width - 8;
			for ($y=0; $y < 8; ++$y,++$yOffset) {
				$frame[$y][8] = "\x84";
				$frame[$yOffset][8] = "\x84";
			}
			// Timing pattern
			$wo = $width - 15;
			for ($i=1; $i < $wo; ++$i) {
				$frame[6][7+$i] = chr(0x90 | ($i & 1));
				$frame[7+$i][6] = chr(0x90 | ($i & 1));
			}
			// Alignment pattern
			$frame = $this->putAlignmentPattern($version, $frame, $width);
			// Version information
			if ($version >= 7) {
				$vinf = $this->getVersionPattern($version);
				$v = $vinf;
				for ($x=0; $x<6; ++$x) {
					for ($y=0; $y<3; ++$y) {
						$frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
						$v = $v >> 1;
					}
				}
				$v = $vinf;
				for ($y=0; $y<6; ++$y) {
					for ($x=0; $x<3; ++$x) {
						$frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
						$v = $v >> 1;
					}
				}
			}
			// and a little bit...
			$frame[$width - 8][8] = "\x81";
			return $frame;
		}

		/**
		 * Set new frame for the specified version.
		 * @param int $version version
		 * @return Array of unsigned char.
		 */
		protected function newFrame($version) {
			if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
				return NULL;
			}
			if (!isset($this->frames[$version])) {
				$this->frames[$version] = $this->createFrame($version);
			}
			if (is_null($this->frames[$version])) {
				return NULL;
			}
			return $this->frames[$version];
		}

		/**
		 * Return block number 0
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsBlockNum($spec) {
			return ($spec[0] + $spec[3]);
		}

		/**
		* Return block number 1
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsBlockNum1($spec) {
			return $spec[0];
		}

		/**
		 * Return data codes 1
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsDataCodes1($spec) {
			return $spec[1];
		}

		/**
		 * Return ecc codes 1
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsEccCodes1($spec) {
			return $spec[2];
		}

		/**
		 * Return block number 2
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsBlockNum2($spec) {
			return $spec[3];
		}

		/**
		 * Return data codes 2
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsDataCodes2($spec) {
			return $spec[4];
		}

		/**
		 * Return ecc codes 2
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsEccCodes2($spec) {
			return $spec[2];
		}

		/**
		 * Return data length
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsDataLength($spec) {
			return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
		}

		/**
		 * Return ecc length
		 * @param array $spec
		 * @return int value
		 */
		 protected function rsEccLength($spec) {
			return ($spec[0] + $spec[3]) * $spec[2];
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRrs

		/**
		 * Initialize a Reed-Solomon codec and add it to existing rsitems
		 * @param int $symsize symbol size, bits
		 * @param int $gfpoly  Field generator polynomial coefficients
		 * @param int $fcr  first root of RS code generator polynomial, index
form
		 * @param int $prim  primitive element to generate polynomial roots
		 * @param int $nroots RS code generator polynomial degree (number of
roots)
		 * @param int $pad  padding bytes at front of shortened block
		 * @return array Array of RS values:<ul><li>mm = Bits per
symbol;</li><li>nn = Symbols per
block;</li><li>alpha_to = log lookup table
array;</li><li>index_of = Antilog lookup table
array;</li><li>genpoly = Generator polynomial
array;</li><li>nroots = Number of
generator;</li><li>roots = number of parity
symbols;</li><li>fcr = First consecutive root, index
form;</li><li>prim = Primitive element, index
form;</li><li>iprim = prim-th root of 1, index
form;</li><li>pad = Padding bytes in shortened
block;</li><li>gfpoly</ul>.
		 */
		 protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots,
$pad) {
			foreach ($this->rsitems as $rs) {
				if (($rs['pad'] != $pad) OR ($rs['nroots'] !=
$nroots) OR ($rs['mm'] != $symsize)
					OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] !=
$fcr) OR ($rs['prim'] != $prim)) {
					continue;
				}
				return $rs;
			}
			$rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots,
$pad);
			array_unshift($this->rsitems, $rs);
			return $rs;
		}

		// - - - - - - - - - - - - - - - - - - - - - - - - -

		// QRrsItem

		/**
		 * modnn
		 * @param array RS values
		 * @param int $x X position
		 * @return int X osition
		 */
		 protected function modnn($rs, $x) {
			while ($x >= $rs['nn']) {
				$x -= $rs['nn'];
				$x = ($x >> $rs['mm']) + ($x &
$rs['nn']);
			}
			return $x;
		}

		/**
		 * Initialize a Reed-Solomon codec and returns an array of values.
		 * @param int $symsize symbol size, bits
		 * @param int $gfpoly  Field generator polynomial coefficients
		 * @param int $fcr  first root of RS code generator polynomial, index
form
		 * @param int $prim  primitive element to generate polynomial roots
		 * @param int $nroots RS code generator polynomial degree (number of
roots)
		 * @param int $pad  padding bytes at front of shortened block
		 * @return array Array of RS values:<ul><li>mm = Bits per
symbol;</li><li>nn = Symbols per
block;</li><li>alpha_to = log lookup table
array;</li><li>index_of = Antilog lookup table
array;</li><li>genpoly = Generator polynomial
array;</li><li>nroots = Number of
generator;</li><li>roots = number of parity
symbols;</li><li>fcr = First consecutive root, index
form;</li><li>prim = Primitive element, index
form;</li><li>iprim = prim-th root of 1, index
form;</li><li>pad = Padding bytes in shortened
block;</li><li>gfpoly</ul>.
		 */
		protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots,
$pad) {
			// Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
			$rs = null;
			// Check parameter ranges
			if (($symsize < 0) OR ($symsize > 8)) {
				return $rs;
			}
			if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
				return $rs;
			}
			if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
				return $rs;
			}
			if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
				return $rs;
			}
			if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
				return $rs;
			}
			$rs = array();
			$rs['mm'] = $symsize;
			$rs['nn'] = (1 << $symsize) - 1;
			$rs['pad'] = $pad;
			$rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
			$rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
			// PHP style macro replacement ;)
			$NN =& $rs['nn'];
			$A0 =& $NN;
			// Generate Galois field lookup tables
			$rs['index_of'][0] = $A0; // log(zero) = -inf
			$rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
			$sr = 1;
			for ($i=0; $i<$rs['nn']; ++$i) {
				$rs['index_of'][$sr] = $i;
				$rs['alpha_to'][$i] = $sr;
				$sr <<= 1;
				if ($sr & (1 << $symsize)) {
					$sr ^= $gfpoly;
				}
				$sr &= $rs['nn'];
			}
			if ($sr != 1) {
				// field generator polynomial is not primitive!
				return NULL;
			}
			// Form RS code generator polynomial from its roots
			$rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
			$rs['fcr'] = $fcr;
			$rs['prim'] = $prim;
			$rs['nroots'] = $nroots;
			$rs['gfpoly'] = $gfpoly;
			// Find prim-th root of 1, used in decoding
			for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
				; // intentional empty-body loop!
			}
			$rs['iprim'] = (int)($iprim / $prim);
			$rs['genpoly'][0] = 1;


			for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
				$rs['genpoly'][$i+1] = 1;
				// Multiply rs->genpoly[] by  @**(root + x)
				for ($j = $i; $j > 0; --$j) {
					if ($rs['genpoly'][$j] != 0) {
						$rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^
$rs['alpha_to'][$this->modnn($rs,
$rs['index_of'][$rs['genpoly'][$j]] + $root)];
					} else {
						$rs['genpoly'][$j] = $rs['genpoly'][$j-1];
					}
				}
				// rs->genpoly[0] can never be zero
				$rs['genpoly'][0] =
$rs['alpha_to'][$this->modnn($rs,
$rs['index_of'][$rs['genpoly'][0]] + $root)];
			}
			// convert rs->genpoly[] to index form for quicker encoding
			for ($i = 0; $i <= $nroots; ++$i) {
				$rs['genpoly'][$i] =
$rs['index_of'][$rs['genpoly'][$i]];
			}
			return $rs;
		}

		/**
		 * Encode a Reed-Solomon codec and returns the parity array
		 * @param array $rs RS values
		 * @param array $data data
		 * @param array $parity parity
		 * @return parity array
		 */
		 protected function encode_rs_char($rs, $data, $parity) {
			$MM       =& $rs['mm']; // bits per symbol
			$NN       =& $rs['nn']; // the total number of symbols in
a RS block
			$ALPHA_TO =& $rs['alpha_to']; // the address of an array
of NN elements to convert Galois field elements in index (log) form to
polynomial form
			$INDEX_OF =& $rs['index_of']; // the address of an array
of NN elements to convert Galois field elements in polynomial form to index
(log) form
			$GENPOLY  =& $rs['genpoly']; // an array of NROOTS+1
elements containing the generator polynomial in index form
			$NROOTS   =& $rs['nroots']; // the number of roots in the
RS code generator polynomial, which is the same as the number of parity
symbols in a block
			$FCR      =& $rs['fcr']; // first consecutive root, index
form
			$PRIM     =& $rs['prim']; // primitive element, index form
			$IPRIM    =& $rs['iprim']; // prim-th root of 1, index
form
			$PAD      =& $rs['pad']; // the number of pad symbols in a
block
			$A0       =& $NN;
			$parity = array_fill(0, $NROOTS, 0);
			for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
				$feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
				if ($feedback != $A0) {
					// feedback term is non-zero
					// This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
					// always be for the polynomials constructed by init_rs()
					$feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
					for ($j=1; $j < $NROOTS; ++$j) {
					$parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback +
$GENPOLY[($NROOTS - $j)])];
					}
				}
				// Shift
				array_shift($parity);
				if ($feedback != $A0) {
					array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback +
$GENPOLY[0])]);
				} else {
					array_push($parity, 0);
				}
			}
			return $parity;
		}

	} // end QRcode class

} // END OF "class_exists QRcode"
?>
libs/phpqrcode/cache/frame_1.dat000064400000000141151165346520012535
0ustar00xڝ��
� E9�u��`�"PńC�牗T!0$
E�ɲQ���m��h۾9{kI"�
9Ln)Ap��־�>�^��z�m�nŖ;��m�n����libs/phpqrcode/cache/frame_1.png000064400000000176151165346520012561
0ustar00�PNG


IHDR��7�PLTE����ٟ�3IDATx�c`��P����_8�C������1��@��]�0��O-ݐ��RIEND�B`�libs/phpqrcode/cache/frame_10.dat000064400000000314151165346520012617
0ustar00x��M� F]s�IX�;��n6��	:
�+_^J��r��f��A�2KB"�dd9�$a�t)�d�Og���U���f�.g����zʜ3���1z��MQ�q��!�,���8�u���AU�O�A�H�|�Թܧ|C��N�c�S`�	9-��L8F��
ݙzt��f͓�5��}�f�zo����Éd�W�||�<�libs/phpqrcode/cache/frame_10.png000064400000000312151165346520012631
0ustar00�PNG


IHDR99���PLTE����ٟ�IDATx�͑�	�0D/�k�d'�
�h:������بg~�/��U��.|Ɯ�����
���YxE�4��4d�%�sR�?5���U��es�{�d�i^�'�;��㔅�9^0�"]G���W/8S�o}�$zd\IEND�B`�libs/phpqrcode/cache/frame_11.dat000064400000000322151165346520012617
0ustar00x��M� F]s�IX��n7���F
.������44�/�ـR>CAC�3�t4Sh��D��0G���*�߷��6h���̍�?��Ө�ߙ��y7愄L1r�o�,�UK)�٢��nv��E��װ.�f�^h�jPý�7�k�f7��4�e]�U7��@��xen��s��~�fjx؉��\�佤�g�KSw�M�C�|
zAJlibs/phpqrcode/cache/frame_11.png000064400000000315151165346520012635
0ustar00�PNG


IHDR==$��PLTE����ٟ��IDATx�͑1
�0E �y��@��Rz6GGG7ݻ�.�������#�
�-�+���B�4Ւ9"-	���C'.�0P�:~�pa�|�L�=���)��t�:�AcP�u�+����Av�e�m�9J��Z���IEND�B`�libs/phpqrcode/cache/frame_12.dat000064400000000336151165346520012625
0ustar00x��A�
D]s런���n7��bŕ���T&�b$cI^n3RZ�cb�GM;(�q&8D�Y��L�C\Ő��j�";�ଵ��
u�����,�jŜ{�Qs�<Q�$#��(q��Y�`��������"TD�T���k>�Xy�a��N230�w
�@hZa���CDP-��ou�*?�y��w�̢e�)o�}�e�r/�p�d���C�?'�E�libs/phpqrcode/cache/frame_12.png000064400000000330151165346520012633
0ustar00�PNG


IHDRAA�9[PLTE����ٟ��IDATx�c`��00ԂY��\����0֟�`�������"�P0p``������/D��
�bP���P�{�z���Y�#�!�
��);	g��YS���/0
A��6@b�pu�p�V-��cM���-�IEND�B`�libs/phpqrcode/cache/frame_13.dat000064400000000337151165346530012630
0ustar00x��A�
E��֓��]���Do6j��&���	�UC�y�&DR��v{*D�Gr2)I\
Rvv)$"��R�'\���:,�˸.�{_Du����	>�N�zI�Y��dc��}^�,K2��M�\�eQeQey�h�b�n��b�o2b+Y��E�]eQeQ����(
�i��y��}�<:����٘nv�9-��_X�{��.�GۣU.�]��E��j���J�libs/phpqrcode/cache/frame_13.png000064400000000322151165346530012636
0ustar00�PNG


IHDREE&C�jPLTE����ٟ��IDATx�ݒ�	�0EO^�T'p�H�s��Ћ�EbLltA�?��|G�����4�L�RA4y�u<Mp��H=ڰk��.�G?�R�}S�5Jk����֞ޝ���o{�Q4j�����ִ���������e:“?s�d�IEND�B`�libs/phpqrcode/cache/frame_14.dat000064400000000343151165346530012626
0ustar00x��A
�
E���.�]���Do6j�A�N[M��j(�G�,�RM��L0n�dR,�'A$B&�YTR%0I�פPrYĆtܧ����Otwn�O�ܨ���EʜS�0��ٹ>�X��>ׅ"91�:��:����YtZ3#��F�p��`M�I�O���I��I��q}��NO8!B>N�a"N�N��i_A��33�؉��qޮ�sb��>�vb��I�8�Î��g6yZ׷wlibs/phpqrcode/cache/frame_14.png000064400000000325151165346530012642
0ustar00�PNG


IHDRIIK���PLTE����ٟ��IDATx�ݒ�
�0��Y؂&P
&AT(Y�	(ii
�$6�a�����ɀuTDÍ�Ęq,����l��ŬiDa�<���$v~�
�򽅧P�[�V�q��G�c-�ܭT�;��"|u�vjt�f�nx�h2^f7r����IEND�B`�libs/phpqrcode/cache/frame_15.dat000064400000000362151165346530012630
0ustar00x��1� E3s�J�n7��թ
�]��X�ӓQ�䔶D�����I&Œ�Jɴb6�Vh�G�P��Tenir߂�^�	U.�p�[�O�Y?���Lc͸[�1v���}˱5f]�T�S��
np�/7ij�̷�j�&j��=��Z�{[���j��/�
np��,�Y��7��Ј����(�I�-�\���z�r/����؝5���M�-۾��T�3զ��/��=y�'��#libs/phpqrcode/cache/frame_15.png000064400000000333151165346530012642
0ustar00�PNG


IHDRMM��{�PLTE����ٟ��IDATx�c`�j�̫\�̯hL����-������C!
���?T���P�@��˜�L�C=Ľ*��C|��k����EER;�|1�cs#���l����o��1,UE]j]&
1kLF8�M��@�aaIEND�B`�libs/phpqrcode/cache/frame_16.dat000064400000000362151165346530012631
0ustar00x��A�
E]s�IX�;��n6��`�q���W6���`�%A/3!�����!g��̡�1N)�E��|;��>6⸏�97$����c]kk��w�1�[�m�C͜c�R���>�����E,�hʼnp�#�xF�yW��VWG���3��+����˓�S��}Ğ�#�G8b^c^c��p�c&3YQ"�����v�����������k�9�܇�}�����	�Ŀ�Q�L�/���libs/phpqrcode/cache/frame_16.png000064400000000323151165346530012642
0ustar00�PNG


IHDRQQ�A�uPLTE����ٟ��IDATx�c`�j��?��P��@6;]�/��C�����?T�����0�@�8��كY�C=��
��*o`�Z�?�?��#��
���"�w��#������G
qW$��H� �k�،6��
�م�IEND�B`�libs/phpqrcode/cache/frame_17.dat000064400000000355151165346540012635
0ustar00x��A
�
E���.�]���Do6j��tjm\�瑱<!�4!�x��
�
T�)"T&_h��Le\5���}T��]o]��ꬵ��Nu_����q6>��3��k�S:��}��%j{]���B�+\�
W�>��tZW#g�i�P�W����S��y�+\�
W��>����p�+\�����$�J	�⮔��u�����D���gg4~��m4�b{���r;�zfQ�vq
UloX�
��{libs/phpqrcode/cache/frame_17.png000064400000000323151165346540012644
0ustar00�PNG


IHDRUU;:PLTE����ٟ��IDATx�c`�Wja�\a��[0�C=Ł�׃����P��&���_�z
�?�����$�,U0@�*���"Tqd������CqQ$�j$v�$�"�0������H�]��qE5�fD�Hof�Et�IEND�B`�libs/phpqrcode/cache/frame_18.dat000064400000000373151165346540012636
0ustar00x��A
�0E]�օ,2;s��&�͚h���O������1&09OIv@DD��&�ىK�X��Fv�<�dq�9�<%h��Y�s!(d���s;~||b(�Yůg#�`�K��S���Ķ��s�idߍLg:ә�t�/gm����k�M�3�{�4rT�Q��e��s�>�<ә�t�3���;�H�#љ�t�3��Y�+og�h���ٽ�ln�F>�i^�#awm;g�~p�g�Ns{6z��������p��'libs/phpqrcode/cache/frame_18.png000064400000000344151165346540012650
0ustar00�PNG


IHDRYYo��PLTE����ٟ��IDATx�c`�ja��\a���8�������w��{�����zCah����
az@���Ap��0�a��h�70|��D�G�A�3�3�2�!J�L.2�M)t��
XR
B��A2��z\�MC��"s�8Ͻ��H�IEND�B`�libs/phpqrcode/cache/frame_19.dat000064400000000403151165346540012631
0ustar00x��A
�
E���.�No�7ћ��iiR�N2��W%�x�@�ڜ�'�
u�6��.�*S;}���à�T���zr�t��%�,�����}�;���)�����Z��L���P��$���q�g�L��dJ�;��w��.]z#���[͝��Og����"��	�B��}�}�;��w���#1Gb��;��w��_�C+w�@Df����u��2����N��9R7|pW�k�����k���������libs/phpqrcode/cache/frame_19.png000064400000000341151165346540012646
0ustar00�PNG


IHDR]]����PLTE����ٟ��IDATx�픱
�0D�mv`ob�D���#Hn���BM!��<=}K~���
�
	�@n���ܑ��3
�2	��`1|�Yv�3�
?m`n�Z(�\gl�{���f����l�[�d��Å�͋�w���O!}'�m+����Z$�K-IEND�B`�libs/phpqrcode/cache/frame_2.dat000064400000000167151165346540012550
0ustar00x�͒�
�
F{v�&��&�Y+?Z1��S�'y!����a�815&��۴��H�ٞc��l��F��1�#�6f����6��O7���C����֏���8gI��fB����\DԻ(libs/phpqrcode/cache/frame_2.png000064400000000220151165346540012552
0ustar00�PNG


IHDR�'
PLTE����ٟ�EIDATx�c`������}��	�c�������X�@V}y���)@�+H�$&jA#��B�pekIEND�B`�libs/phpqrcode/cache/frame_20.dat000064400000000372151165346540012626
0ustar00x��M
�
����3�x��ެ��M�X�P�{Y�	�����^f��}iT�I�(:���!�0��R���N׎�98k�;]#���Y2����\���Y�Us���Jg=wQ�J��uSu0�`�0���f����u]���_��b���0�`@nEnEnŝ�0��w(K����X����yi���|����xn��u80��k��
�s�?Kw8H�D��vz�7�libs/phpqrcode/cache/frame_20.png000064400000000341151165346550012637
0ustar00�PNG


IHDRaa��]�PLTE����ٟ��IDATx��1�0E�*�b�:
�ѩJn�+tAL���Ll�/�ӓ#�[2_���/@P7��B�\�N27���mܱV~�Ց	w��Ħ�N��O�Y��	r�zJ��v"�������_\�÷���@�gl��[�{Л%.��`޴4r-=�/tN3I�IEND�B`�libs/phpqrcode/cache/frame_21.dat000064400000000404151165346550012624
0ustar00x��A�
E]s�IX�;��n6Up���в��]٘�<i-eW����)��ŕ��…H\jvq�HL\6���ЅrI��Lܹ��%��@���V�v����(�P4|�Xn�gɝ��~]D����u1Us	S\���,��2��N��?D�K��F-:�eJ]p_���,�a0�`���X��`���w,`X�]��������5��Y4{���2��v�Js����9���)�u�۹���,�]����^_�7$�_�libs/phpqrcode/cache/frame_21.png000064400000000353151165346550012643
0ustar00�PNG


IHDReen���PLTE����ٟ��IDATx��1�0�m~�׸�Q��
���6z(SF�
�+X��¾Cy@�r�h�'��<�+=l����\�N���Wsn
o�/����8�K.�,N�9�����r/S��ؓƆ����v��;ۆ�;[wWEGE��v�K���3�뒳*g�NM�"#���_F���IEND�B`�libs/phpqrcode/cache/frame_22.dat000064400000000422151165346550012625
0ustar00x��A
�0E]{�.�]{{{��Z�Bep��we@�V�ERZ3��"*2o�4�y�)i#d�bdF҅��I"���4��W�I�u��45�x�.Z�S�{���8���k={o.�q���[��:帒q���y
)t#�N8�dCj�-O�OG}�:/�:s�z!�)^<�e��S�u�{�	'�p�	'�=�=�=�'�p�	'�p�ߣߣ���N8��9����pQQ�]H�pz���G�^�Q��I|�߳�u;9�����d;�X~$����t����dylibs/phpqrcode/cache/frame_22.png000064400000000342151165346550012642
0ustar00�PNG


IHDRiiL�yPLTE����ٟ��IDATx�c`�00�"q�30�"�.�p����P�/�����2�"����
zA��,�����eo`�^����������,��A�);��
gj�ʢr/�r��G
+Ԑd���H%0H�U�+��h�ZT.#
J��R�GIEND�B`�libs/phpqrcode/cache/frame_23.dat000064400000000410151165346550012623
0ustar00x��A
�
E���fo�7ћU�)	%M!Δ�Yu(<���sK��T���
�&�I�\i+�Ъ�(m��FQ���h���v~n1�o�]s����_ޟ�3`�_w2�ȹ�lc[��;��c֟ˤ�N�4�p�
7�p��mT�������r�i��_��pS=7�7�p�
7�pÍ>I��O�-�
7�p�
7�$}�>ɷ7�p�
�tss��rs
��V�����m��ҹ���}R~7��&���?7����ԦI�bh�{�<�Mi-libs/phpqrcode/cache/frame_23.png000064400000000334151165346560012645
0ustar00�PNG


IHDRmm�6}PLTE����ٟ��IDATx�c`��_j��W?0�"q�
�pς��(����~``E���H��0�E��G`Yd���U0���*��G
Y4���G�Sv4��#;�ԒmE�F�G
+Ԑ����\ze]Q�����ƭE�2�p�����OIEND�B`�libs/phpqrcode/cache/frame_24.dat000064400000000437151165346560012636
0ustar00x��A�
E���MX0;���nVP4�HSS�x�U3�/O��LiJ4���V�JC�%��6VR&��D�B�HjD��J�??���Bl�cDZ�'�U��X�U�ޏ0��yw�į�j��똳�3ś��cj���{���:Gq�G�����N�v;��笓J���<���]�����#�8�#�8�H'�����Gq�G��tr:9�#�8�#�8�ؓh���N�t����_��>t�e��S����^�\g���Qe?�vu��o��;��>�*�wl��m�libs/phpqrcode/cache/frame_24.png000064400000000362151165346560012647
0ustar00�PNG


IHDRqqذޓPLTE����ٟ��IDATx�핱
�0E�c�J@�(35Ud��Q��DY!MDc�s��3A�
KOOߒ�3�Hgy��@|(�S@�C�?�g@�4�f�~D�6��j���߼6���-�]��w@���O�������u�m?�W���/���S����������;bW�DH��‘IEND�B`�libs/phpqrcode/cache/frame_25.dat000064400000000426151165346560012635
0ustar00x���A
� ��s낋�]r�x�Y51mM�BG
��*Sx|Ua5Ƶ�Z���-,�1�H�P�Rj��X5��i����G�>W���R��/��+uT廯��ӯ嗴�u����[S�a�[kv�5�+5n���J��%+V�X�bŊ�߬u'������SR��tzZ��+�+V�X�bŊ�ٟٟٟ��+V�X�b��������}Ŋ+V�X�������VI�����+k�q�[��t��oVZ�voNV�w�}�{�r<ýR��"�R��]�
W�r}libs/phpqrcode/cache/frame_25.png000064400000000362151165346560012650
0ustar00�PNG


IHDRuuJ�<�PLTE����ٟ��IDATx��!�@E�*lo�i�$4H�AMӓp��+�i�`�;T�
EIv����d�A���j��se9�Z�+�Dޫw>?ȃ�'�Z���|"�0���p��ԩ��c��?6��䎼Hߟ������e���o�����n�n�r�L?�>��.��[���N��1IEND�B`�libs/phpqrcode/cache/frame_26.dat000064400000000450151165346560012633
0ustar00x��A
�
E��օ,t�7�7ћU�		E)i7�*~c���X�EB��FC���6�:&�L,�Mv.����Kg�ո�YM�>���>�mۚ�?��v�mg?��ұ���η�d��C��U��Ik���E\��Ms�f�a�f�a>�[sӈ9쬩ެ8b�<k��7�}�k������3�0�3�0�3��*r��\�7f�a�f�a�fr��\�7f�a�f�a�Y�����d�4�9k�����y�X	y�g���)��dw�n̢�U�>��]�Lg������Eo�
w1libs/phpqrcode/cache/frame_26.png000064400000000364151165346560012653
0ustar00�PNG


IHDRyy'4
PLTE����ٟ��IDATx�c`���``�E���,�/M�D�C����`��E�߁�`��}�Pd��Y��
��	�G`��*��$R��70�)�������!fZߎ,�q;|U���PU��.�.�=^�c��?ZܢԦ
��f��ۂ!P�.��&B3��"��IEND�B`�libs/phpqrcode/cache/frame_27.dat000064400000000434151165346560012636
0ustar00x���A�
�᮹u�Nn7��MZkR\�㪙&/_P�,&繒}h�IKh69��L�RK-�U�k��s�tw>=ֺ�';���B�����so���>_1����󩕞��j�\��{)��,?�ǐj�~h:v�رcǎ;v���f?�3��S���ٱw��s�yǎ;v�رcǎ�9�9�9��;v�رcǎ;ssss�:�رcǎ;��ڝ8'2�.%^d�^뻽����2��;�}�8���]}/r{�;��{~t��.�.]}zS/��{�libs/phpqrcode/cache/frame_27.png000064400000000355151165346560012654
0ustar00�PNG


IHDR}}�N�fPLTE����ٟ��IDATx��;�0D�m.��(��|&�#��"�A�D���RfC��x����6��X8.�t�^��1`����!G��G�r�n��@1��
;��d�����-��J����Yⅱ��/�v��F�[��[����xե[����v��Y��g��fo���0IEND�B`�libs/phpqrcode/cache/frame_28.dat000064400000000476151165346570012646
0ustar00x��A�
E]{�&.fvr�	ܬ�h$�t��i�w�I,?/@�/�1�
��S����CVo�l+'�@w��+[9P��g5޽�.rv��~Y��7�R��A9n���gv�Suw��PԗAҾ�8�rS�}�4���y0Sq���0�`�&����>^�1O�HG�8�
��͛�oa`��`�0����y�;0�`����w"`�0
/����D�0�������%��AM$*�~�O�G-?f�r����lf}+&���}`3�}>op`1�_90�������'�libs/phpqrcode/cache/frame_28.png000064400000000352151165346570012653
0ustar00�PNG


IHDR���nKPLTE����ٟ��IDATx�햱
�0E�+�a	@��
�k��
L@�>M�&���w����UOOq�1�ٯ�,�k�
\4�D�l��3}��q���pȈM�|�$G��q�Aܧ�xq�)�82�_��9����Ծ�rj_e9���8CZCn4w6]8��[�p����[�̆8Mި����.qIEND�B`�libs/phpqrcode/cache/frame_29.dat000064400000000465151165346570012645
0ustar00x���A�
�a�޺	����@n7+*����4�!�?�J���	���抮�]���S��Tf)��s�I�"�Ȕb��0��|�"Luٸ�,��E�1\6�*�uQ�?�>a�υ���R�-r���n.�ꯋ\�T��:�*)|)��,��,�������x_�}:^R��Uoɢ�u�~�މX`�XЏЏЏЏ�_`�X`�XЏЏЏ�_`�X`�XЏЏЏЏ�wb�X`���PU��)D��"c�{�z��3��<}��^?b�m���잃���a������.�]
�{Q6u�T,9libs/phpqrcode/cache/frame_29.png000064400000000350151165346570012652
0ustar00�PNG


IHDR��O�PLTE����ٟ��IDATx�c`���00Ԣ����*�U]�.X�C=]����~``E!�Q�������4V�&2��T5ȁB�B_�
lj0��~�jF�kh�����f4��Ek����
Z|��I�j\1�qŰS�C�]m�T�(��IEND�B`�libs/phpqrcode/cache/frame_3.dat000064400000000174151165346570012552
0ustar00x��
�
E{v�&��&�Y+�b���k�'y������a�:�TXl�޶$W+ӏv��9}gR�@H0YPB���Em��?�����s��"b��t2cn���:�ﺭ�;�Y���z�Q��7��libs/phpqrcode/cache/frame_3.png000064400000000223151165346570012561
0ustar00�PNG


IHDRl]�LPLTE����ٟ�HIDATx�c`�����������
 `1�������`�"�f}�`�_������
��@�+H�$&jA#�)�_l���IEND�B`�libs/phpqrcode/cache/frame_30.dat000064400000000504151165346570012627
0ustar00x���A�
�a�ܺ	f'7���͊�Vte��!6/_�0��q��%N�
�8/���IJ��$���IN��$�\'	K5߾s�N��'a����qE�}�I�v�X?aJ��Ͻ+~�v�R:&��Ʈ��>IeK��sԫ$��$�L0��4i�����+��F�ԝm_)IB#I8}�++��t�O8O8c1�L0�L0����<�L0�L0�z@z@z@�L0�L0�L0����<�L0�L0�uq��`���H&K9��
��n��Px��;�d&��=��Du��q��΄9~;=%ќT%Q��t�7�w0�libs/phpqrcode/cache/frame_30.png000064400000000377151165346600012645
0ustar00�PNG


IHDR��"ꉊPLTE����ٟ��IDATx�햱
�0E/��B�(PD�1RE�.L��(+�
�8'��|a_e==����
U�
2h�t"Md
Z>��+<F�B�����$R�t��h�x�kEĵY1��
kR����e���N�#-�
<|m�J�?�J�9Y%휬��Xg�.�	�Õ�]V���^���@�E�Ao�L��M�*IEND�B`�libs/phpqrcode/cache/frame_31.dat000064400000000510151165346600012617
0ustar00x���A�
�a�޺	��
�&r��������4�����y��ķ!�mV3I��v�!Ҝ�2�i\NSS�4EF2�+65���e���/W�s]��!��?�p���=S~��Đ?�+�x��6r6y�����}�Ǵ���eR1-�W�l��l����Ҍ�X�z/>V櫷��:ñ���A�8��-+mT���bl��l��l�tM�&]��l��l���&]��I��l��l���&]���y�
6�`�
6�`���i�uy��XW���i��\t��z���>�.�z�k��
t��7��7�wJ�ϔ�4�w��҈����85�libs/phpqrcode/cache/frame_31.png000064400000000404151165346600012635
0ustar00�PNG


IHDR����k�PLTE����ٟ��IDATx�햱
�0E/m6`6Q2nP�b�����	��XI�q
Q�l*D|r��t���/
�L"��^V]��wLKX@���k�7ثg/�&���b�hv)��˲�Z_[����{'O���$t�;��B�*�7V�j�s�j�s�j�a�9:�(�'�稍Ϧm[�Z��y�5>���l{Td;&��n��!�IEND�B`�libs/phpqrcode/cache/frame_32.dat000064400000000511151165346600012621
0ustar00x���
� ��־����.�
�D�l�,��Mz��6��Ç	gcJ�D;�'.�A�Iq�މ�I,Ir�Y����Fk%�D�O�y|ED�D�(L�_Y��>*ߚ?a�O��k�L_�<[c���>�c˘�u�LI��%�#�0�#�0�#��otѢ���}��4�f�v_)��E�p���h5R��8�8�1�#�0�#�0���i�tZ�#�0�#�0�#�0���i�tZ�#�0�#�0�#�0���i�tZ�l�0�#�0���9q"��HܜH�Q����"��L5}-��Y׾��k�`��>�z鸳���4&�p��!���!��`�:5libs/phpqrcode/cache/frame_32.png000064400000000406151165346610012641
0ustar00�PNG


IHDR����`PLTE����ٟ��IDATx�햱
�0E/��`
J
D�2F*o�,�@A��
��y\>�>B�*yz:�W|i�OZ�{"+��M��'���8��up�GO�i���X�(��Sf��z��7OS��
Q4�|�(we;��~�V�^mޜ���{�=��|���Wر��Tr��|�k�����4IJ�Rg�O�ge/�`�"�}RIEND�B`�libs/phpqrcode/cache/frame_33.dat000064400000000527151165346610012632
0ustar00x���A�
�a�޺�����@n7+*L++�柮����bb�*LC�����ck�H�r��j���J5Y�i~0�_���T�T�}�e�>��5�b_�w�͟?��������\��Ra�i+7��W��\�wLUN�L��
+���
+����j��O��kc�����\˩|%�o<�k��L�+�+�v���
+���
+��Š>}��8���
+���
+���
+���3�g��
+���
+���
+��3�g��@���
+���
+���
+��:R���X��B�9��I�=�k���o/Sw�ؘ�ٯ�`g������r_ٙ�Y��VSY��zIefnmQoz
>�libs/phpqrcode/cache/frame_33.png000064400000000375151165346610012647
0ustar00�PNG


IHDR��kl*PLTE����ٟ��IDATx��1
�@E�V���7P<��H��y<��G���&$��,df,�YC>�Y����Bs�j7��j��&=�j���F�ٷ1�֜
@�q���S�^�✖�9ua�T�[K�Ɗ��~ܱ������{�˼$�;.�\�%�O�s��d���o��B��c�s}W���zo������㜞"��-���IEND�B`�libs/phpqrcode/cache/frame_34.dat000064400000000513151165346610012626
0ustar00x���1��0���z%
܅���	NR���Y�
U�_O6�S�<?��5�����n.KEI�R*-QM���2[EK6����R���;�<MS>mm5k������S}N\_g���aV���5�1�Y��U�����UK6�Mƌ3f̘1cƌ3fQ��}�<��]q?�֒�/��h-�Y�}�}���3f̘1cƌ3}
}
}
}
�3f̘1cƌ3f̘1���������>cƌ3f̘1cƌ3}
}
}
}
�f̘1cƌ3f��ِ�Z�RJ5\P��|6��9��>�1���F�Y�;�P�i��,�L��ٌ�,���]�P�7�xC�libs/phpqrcode/cache/frame_34.png000064400000000400151165346610012635
0ustar00�PNG


IHDR���
�PLTE����ٟ��IDATx�헱	AE�E�`;&`
��a${�Xā-؉����de�?gt(�l�����̢csG`���X�yr
W/8#ϩ��6sG^�;��nݞ@1����4(/��0�Ԭ.�D��%z\rl�:FLw��(�_�ѥ0�2�KaNeF��l�{�@�ޓ���K��gS�y���?G��&ʻ#�'���2hBIEND�B`�libs/phpqrcode/cache/frame_35.dat000064400000000526151165346610012633
0ustar00x��ݱn�0��u%{V�Ԧ�~��#K�WGtgY3��(�s��PK����J�暪�[�"�K�ݖ*`���<ݴ����t���4��t�zJ�{��{v�����\
և�{v�Ǯ�3T�?f���2}�n�z����n��;v�رcǎ��ҵ���]��u�^�M/~�x��B�;�;�
v�رcǎ;v��>��곞w�رcǎ;v����>��zޱcǎ;v�رc����>�]��;v�رc�N��g�Y}��;v�رcǎ����g��L
k�rJ�w����y�G�N��q&y�>�l�]�s���.ޙ�{6z�hg�҅���|O��libs/phpqrcode/cache/frame_35.png000064400000000363151165346610012646
0ustar00�PNG


IHDR�����PLTE����ٟ��IDATx��1�0���O�)���M�����nn�sF4�^�ᳶ�β������9�I��p�a�N(3��%���LfN�h�@��0��ST��,	X�}��9�o�����4��:M�N�{����`k���ޥ#�M�&�w����;B�6!���7������\�W��EIEND�B`�libs/phpqrcode/cache/frame_36.dat000064400000000562151165346610012634
0ustar00x���An�0Ь�u%�n7���	��R0Q߰�,��'c`x�5��H�s��`s3O�
�0��K���.-aJy�ɂ&̿&�ux�9#{ãy8���?OY�yX����P��?8���ky�˰�3X�>�oc��Rm�f����VM؇OȐ!C����'��m֑�)���u�&_�o�<y�S��C�{
C�2dȐ!C�������2dȐ!C�2�s�s�s�s�2dȐ!C�2d�P�A�A�A�z�!C�2dȐ!C====�!C�2dȐ!C�M�s�)E6,�JE6L)��~���]�)ﯰ�����z1�u�3�_�v��sa{-Bˆ{���?eS�ƌKlibs/phpqrcode/cache/frame_36.png000064400000000420151165346610012641
0ustar00�PNG


IHDR����M�PLTE����ٟ��IDATx�헱
�0E�����@�)e�H�����(+����ئ��Kc	��==��7��g�7A��e��X�z
r
'_�6�#ٓOr�e�w�P��ro���ޮF�ϝ���&`��~���ǎ��rN4{�����f�w]ˎ���e��Zײcn�k�1wK�*�*d��o��Qˎ�q���&h��{Tv�LeK���?,�߲IEND�B`�libs/phpqrcode/cache/frame_37.dat000064400000000570151165346610012634
0ustar00x���Mn�0Ь�u%�n7����HmWd�ސMd}z1N<��RC��V)�a
7V�0WĔ9M)�tS�Y2�eJCI9e�O�~���Y��-�ռ컮���[F�q^�g�m~^}7]M�|n�ݟ�T<˩�pU�T[Ǜ�Sե��m�
]%e���,Y�dɒ%K�,�ay�o�����z��}�>RR��)�˻oy��#��oK�,Y�dɒ%K�,�6�6�6�6��,Y�dɒ%K�,Y�d��������a�dɒ%K�,Y�dɒ�ކކކކކ��%K�,Y�dɒ%K�zzzz�K�=,Y�dɒ%K�,Y��2�4��[.!St�<��m���/{�혂�����̙H���g{�Y�='�8/�9s|Ɵ�2�YHo)Þ+u�om��libs/phpqrcode/cache/frame_37.png000064400000000427151165346610012651
0ustar00�PNG


IHDR��寙PLTE����ٟ��IDATx�헱
�0E�m6`�`%#P�e*`����M�D����>Ź������K�9w���1��ҡb��H
�K`�/��^���p���&	[s6"�.z�\��	�K���ru�]�Ztc�u��
�.[��!_>�|���߻�wK]ώ���g��R׳��;=Sz�te{˸c���ҝ�%=+լ��8%]O)��_����t�=IEND�B`�libs/phpqrcode/cache/frame_38.dat000064400000000546151165346610012640
0ustar00x���A��0Ў�u�A2�;Н��k�(�g��y�tp9��$��D���\�e^'t�-aI��FM�S�k��I�Ť�:7��|L�k�N�8N7���i}����i,�[W��g�Ӵ���?3�1�i��N�}}=�OM:4��)S�L�2eʔ)S�L#$��
��J��JM:}�]���L�٧�S�QL�2eʔ)S�L�2ա�Pt(:��)S�L�2eʔ)S�:�E��Cq�2eʔ)S�L�2eʔ�E��Cѡ8O�2eʔ)S�L�2e�T��Cѡ�P��L�2eʔ)S�L�2ݓ��sJCIK�Ԃi�93��n�_��������+R�����i���4��\�g�����;%
}�a�n��libs/phpqrcode/cache/frame_38.png000064400000000427151165346610012652
0ustar00�PNG


IHDR��j�lPLTE����ٟ��IDATx��1
�@E'U�!�����#�d��XXX�W��4���e-��Ef����0���
��{�m����(?V@L�mó��
���8�w�˟nBÉϽ�L�N4���C:{q��I��"'���~��8�H��F��T]��T]��T]��T�	}����5�i��<'�FY�XcT����M�hؤ
����	�_3�:�t�IEND�B`�libs/phpqrcode/cache/frame_39.dat000064400000000624151165346610012636
0ustar00x���An�0Ь�u%�n7��'"��t�a����,����:S{�:9��rn�i��iӚ��rI��ƶ�SIYAڔӯi�u��޵�����v���ߺ��;���r&���3���ϻ�Ǚ0��k��=d�^�o���e�2��cw�bJھ��lٲe˖-[��`��n�����G���VҎ;i����m�ڷ�[�-[�lٲe˖-[�lٲ��VvʚL�s޲e˖-[�lٲe˖-�`i�`����`z0�-[�lٲe˖-[�lٲ
�VvʚL�s޲e˖-[�lٲe˖-�`i�`����`z0�-[�lٲe˖-[�l�9mN�S�mJ)��U�v��}���e�p�����_��j�;
c�`��{�
��v�ƿ�p{&Ԗ6�]�Oi��s��oD�!Olibs/phpqrcode/cache/frame_39.png000064400000000410151165346610012643
0ustar00�PNG


IHDR���amPLTE����ٟ��IDATx�헱
1D7���᧘F�u~�������k�qO,����I�dx,��4c������f��6P���w@Ne�[�0��L��X����V��e��d�_�>�j�9�/���mJ8�R�^�&���ᗢ���E���AѽiyPtoZ�{z���W�7�pWP�4�4ˮ9Ҥ�/i�,E��27�T��2[w�IEND�B`�libs/phpqrcode/cache/frame_4.dat000064400000000201151165346610012535
0ustar00x��
� E=�u�
pجQ��COM�'�ˏ$
�@���3e�F�\FNXRy�ؾC{�a8�R�Ńa2@����qk���H1�(����`c��j�~�0����ܨ���عnX�G���Ālibs/phpqrcode/cache/frame_4.png000064400000000225151165346610012557
0ustar00�PNG


IHDR!!m*P,PLTE����ٟ�JIDATx�c`���C��\����JB�CC�A�_0IS6;�]��������lW��+X
����
6�~˴��IEND�B`�libs/phpqrcode/cache/frame_40.dat000064400000000626151165346610012630
0ustar00x���A��@Ь������@o�7��`�Qfe�䕫PA>�����<?jjo5WNiz��y�W���&]߅C?�I�r�W��^;�8��
�s<ð��S{�9^gE�}>�<]����߳bZ�n�^A��Q}[�9^�]�y��najM܇K̘1cƌ3f̘1��{�W5}�{��7lM���ޚx�I<��K����αyl3f̘1cƌ3f̘1�ۻٻ={��αyl3f̘1cƌ3f̘1�ۻٻ={��αyl3f̘1cƌ3f̘1�ۻٻ={��αyl3f̘1cƌ3f̘1�ۻٻ={��αyl3f̘1cƌ3f̘��Sʑ�Ӓ7�H�K޼g\��u���_��r'4�[��-�]��q��L��8Ɲ��Y1q�����!���/(%�libs/phpqrcode/cache/frame_40.png000064400000000413151165346610012636
0ustar00�PNG


IHDR����ΆPLTE����ٟ��IDATx��A
�0EV9Co����.=FW�\�[�
=�n�Ug
�%�aB!���o&HR�eΌ��=�3����o�H�l�Z����f�ӑ�
�)XX}��8o�����us�����PpE?�e���W�W�
����g�-����[�#���G>���9����-?Nޒ�|�y�|:��B�};���{�q�������zqy�IEND�B`�libs/phpqrcode/cache/frame_5.dat000064400000000203151165346610012540
0ustar00x��1�
E��u�7Л��Z��|N���DB0@R$l,-�>VKZ[<���z�qƎ��YJ&�i�嚂�Zy�:Y'�Y��V�&�e�R�"�sj��r��+��.�MƎ���9��z�s���,libs/phpqrcode/cache/frame_5.png000064400000000226151165346610012561
0ustar00�PNG


IHDR%%�P�@PLTE����ٟ�KIDATx�c`���C�?0�I"���~0���P���
���V��d���]�j
d-�d�B������IEND�B`�libs/phpqrcode/cache/frame_6.dat000064400000000204151165346620012543
0ustar00x��1�
E;{�&@o�7���"j�M:��L^~`�0�U�SajV�6K���#syN�=E��I�3�B�%�o<\�L���ܙ;���
f���2���tr��L���N�9ݦ�1�N�w�����libs/phpqrcode/cache/frame_6.png000064400000000227151165346620012564
0ustar00�PNG


IHDR))����PLTE����ٟ�LIDATx�c`�����Z
u���H]D��r�����A���/�<v
������o��>�\!r��P�B1�)E/��Br�IEND�B`�libs/phpqrcode/cache/frame_7.dat000064400000000304151165346620012545
0ustar00x��A�
E]s�IXН�n7���)���ʅ�U��Om~ڜ��]$9i��ɩ���B�8�t��h��c�QAC��C��%�f��ߋ��1�D��Q;dl��r�(K2[�.C"�Oѯ�s��\��9˜X��B}�{��7'O�Ɲ�z��3��������3��|r��|뷡�V��[�i|&��v�Z��L_��.�libs/phpqrcode/cache/frame_7.png000064400000000275151165346620012570
0ustar00�PNG


IHDR--�p�PLTE����ٟ�rIDATx����
�
�h��{�c�ie��ӄ�D?���
�>&�%l@P�X��"b�n��Ev�<!�<J�;B�uZ����	���
.4�����}�~KK�%��aq���q��5[IEND�B`�libs/phpqrcode/cache/frame_8.dat000064400000000311151165346620012544
0ustar00x��A�
E��֓��]���Do6�����ص�U)/?
������-����f��@�L
���	�TnB���N��H1FNx$��U8�IN	w�2I�]�Ƣ���Y�i��a���cF<o�1��
D�H��#o=���j{��+�a��x
�~=��{����}���
�Aݬ�<T�ס�x���ݧ#T��8"3>libs/phpqrcode/cache/frame_8.png000064400000000314151165346620012563
0ustar00�PNG


IHDR11IR�_PLTE����ٟ��IDATx����
�0D�U�@Y���@)�
�0O�`V�Aip���GL�5OO����@�Fa�(�^�ٸ?9[_���StO9�Q���y�]�&�=2�I�CƖJ��g��99������G�ߟ��������;IEND�B`�libs/phpqrcode/cache/frame_9.dat000064400000000316151165346620012552
0ustar00x��A�
E]s�IX�;��n6���0+>+����X�!Dy���>5�!�D�n�'	���v)w�>�E��r���s���<�����=��E:���2�?I�Tzܷ!1e��嵼��UۥfM=�m�Ɣ�t4j�xM͵ލ�N/��8�E�zB�ݫ�_�o�3���!����lSx�sT>�<��w8KI�hA�so�/��7�libs/phpqrcode/cache/frame_9.png000064400000000307151165346620012566
0ustar00�PNG


IHDR55�(13PLTE����ٟ�|IDATx����	�PC�+[Wp����(��ʼn,�t�7��Ļ��
L�9��`PNQ��gc��Լ�Q
P=O\�i2�?}N�?�8��9z�-�Ͽ�_}*������m�lO����/gxx
�H��[@$IEND�B`�libs/phpqrcode/cache/mask_0/mask_101_0.dat000064400000000235151165346620014135
0ustar00x���1�
����/��FS�4��`�X�%0��"�O&+�*[[V�/-�٩EJKT�KW�o�z�Ք���,���f噵�	����B�`��vvvz,X��ðð��X�`��l�}T,E�,��R��d�8�u��yE��`9��libs/phpqrcode/cache/mask_0/mask_105_0.dat000064400000000242151165346630014140
0ustar00x���A
� �����SQ�P�
����2��k]G��(Ѡv��S/��-S�l��iS���vQ%��γ���(&&&&��)y?m�{_��s�Ƙ�'&&&&&&}O7��'&&&&&&}O���#�����^g�>�:�&�M�1�
�T�F�b{��:O_2-Nv+[libs/phpqrcode/cache/mask_0/mask_109_0.dat000064400000000241151165346630014143
0ustar00x���=
�0н�i�9'�b�$��t����^#i����i?����b�K[AU�F徝Ƶijx]m�]2�������-Ė�K�~�Vw}�X���������&O�ɓ�666666yR��'�%lllll/��h�l���m	����d�l���3�+��mͫlibs/phpqrcode/cache/mask_0/mask_113_0.dat000064400000000253151165346630014141
0ustar00x���;
�0�>�I��9+E�s�=ϤL1̄[���F�ZU�4�?i<���;7����;��P��#�W-[�ݯ6���dddddd�c",;�"���sk�摑������Q&��erw######�L.���摑������Иy�1�^˲\����3�������	��vlibs/phpqrcode/cache/mask_0/mask_117_0.dat000064400000000252151165346660014147
0ustar00x���A
�0�}O��r�R,#3���,�����o5�C���q:���;;�wvN��JZG�=�m���}�
ѱ����������2��i�R��k�j_YYYYYYYYe�_��������������/��WVVVVVV�k��d-�Ϻ,#��O��Zc]|�{ž�����$�libs/phpqrcode/cache/mask_0/mask_121_0.dat000064400000000265151165346660014146
0ustar00x���1�
��/��w
YM�S���8>2S��F�O�E�����c�W\�ۼ��{c��pK�G��B�К��m��xhfffffff�/s2���2W|*�d�1������������*5�����������̬�RW���a��������s���\xm~8߮��r0w�jsdm����&��y�libs/phpqrcode/cache/mask_0/mask_125_0.dat000064400000000262151165346660014147
0ustar00x���A
�
н��_���TH`3AO�L�4�k���(���ew��GW����.�	#��2���}	\��Y����gggggggggg_d�>���j^���s�;;;;;;;;;;�'��q�;;;;;;;;;�'˰�q�u����������_P�����Yw�{e��=d����G�/���libs/phpqrcode/cache/mask_0/mask_129_0.dat000064400000000304151165346660014150
0ustar00x���1
�
����/�*��D�E�'�hg�t�-�}_�pV��	\"�b=s������[��J��=8Dh�o�۞'�0X�
���۴����e�0`������j"0`����Wf`^P0`����2�Ȁ��
���d07(��<O����o���
6
�S�libs/phpqrcode/cache/mask_0/mask_133_0.dat000064400000000304151165346660014143
0ustar00x���1
�0н�I�9����Ty�)<4��h�N��SҚ��]��Z��?�[��H<�u����FI�7����R�`��,X���E�޹�˴]�Wg���y��,X�`!��Y�#�,X�`���<"��#�,X�`���<bg!���,X�`���Wy�O4ѷ��wf��>Y�/XL�Gb�y�"�pT�libs/phpqrcode/cache/mask_0/mask_137_0.dat000064400000000316151165346660014152
0ustar00x���1�
О��/��+F�Z?�J��L�7Ժ���*�B�a%L~��˻�����ʓC��J��Y�IWJ	���.K]�R�0a„	��$��INTw�lL�a���L�0a„	&Ld@P�O�0a„	&L�0�e@P?a„	&L�0a�D�e@��	&L�0a���M��IlL&)dl��g��acR�<�$�v�,��ɺ?U2�]libs/phpqrcode/cache/mask_0/mask_141_0.dat000064400000000323151165346660014143
0ustar00x���=
�0н�i�9'E��Dx͘%<l�[Z�|ZP�N	�N��M�7;�m�fovm�6-�w��ޥ}�y��aÆ
6lذn�_�t�e�iv��ƾ��ٰaÆ
6l�Ț�Y�.fÆ
6lذa#k�SldM��
6lذaÆ
YS֔5�6lذaÆ
6�m����$��&
3dy�ecS��&�N�L��;&��<libs/phpqrcode/cache/mask_0/mask_145_0.dat000064400000000327151165346660014153
0ustar00x���;
�0�>�I��9+E��{��$�m��^�&���u��S"��D��6ڟ]9���8�U�M���b�Ҿ�Y��[�2拉Ĉ#F�1bĈ��%�iRN�潝�ѳ��#;�#F�1bĈ�N��1�i�#F�1bĈ#F�tZ}��Nk1bĈ#F�1b���k�tZ;�#F�1b��F�V-���u�"IoD-�*�7u��j�>b�MV�+libs/phpqrcode/cache/mask_0/mask_149_0.dat000064400000000337151165346660014160
0ustar00x���A
�
н��_�MEQXP৞.�|94���e��{�JL�v���#�^��n[��?;�
ZIV-���*w�˒1*+V�X�bŊ��X����g��w��qX}�J�R�Y�bŊ+V�X�beΠwfeΠ^�bŊ+V�X�b�ʜA��ʜA�bŊ+V�X�bŊ�9��ٜ��A�bŊ+V�X�bŊ�l��0��*0T�j`?���Ϊ�����;X���=zZr*libs/phpqrcode/cache/mask_0/mask_153_0.dat000064400000000336151165346660014152
0ustar00x���1�
Н��/礑h�&F��`�Ҽ@I;P�Z�^��X�͌�mf��.�=�5[if-���R+!wr�˜g\j̘1cƌ3f̘1cf��o.�2�?�1���z�
`ƌ3f̘1cƌ�������zƌ3f̘1cƌ3f�ztf��3f̘1cƌ3f̘�k�k03��0cƌ3f̘1c����9;��Ď����`vf��̆�͚ZϘ���W9libs/phpqrcode/cache/mask_0/mask_157_0.dat000064400000000343151165346660014154
0ustar00x���A
�
�_��QR����Y
�k���*q͵���=j7�~�nN��.p%ڵ�s�i����.���رcǎ;v�ر{�.-W��2={���mg�y+رcǎ;v��ɳ2;yּcǎ;v�رc�N����ɳ�;v�رcǎ;v2�<�N��V�cǎ;v�ر�ge2v�yǎ;v�رc��]��;����v�"��ޝ]e�'��;[����{�|A�libs/phpqrcode/cache/mask_0/mask_161_0.dat000064400000000361151165346660014147
0ustar00x���A
�
н��_�U���K7ã&�/��\-hw�D�+d����N^�U�9y4]��-�9�J,a��}����2dȐ!���6�I���2��2�}S2dȐ!C�2d(s0/3�9�2dȐ!C�2�9����C�2dȐ!C����2��~�!C�2dȐ!C��y���A?dȐ!C�2d�p�0�'�ax�3èY/��ae��a�\�!�}�2�libs/phpqrcode/cache/mask_0/mask_165_0.dat000064400000000366151165346660014160
0ustar00x���;
�0�>�I�9+��Dy�I�4ˠ�5�:��W���v�d���q�ߜܴ<��d�2x%[���U�%����2�]&K�,Y�dɒ%ˡ,S�՗�r2yd�=,�k�_�{X�dɒ%K�,Y�d)�0���m�,Y�dɒ%K�,Y�d)�0���m�,Y�dɒ%K�,Y��m��e,e�%K�,Y�dɒ%K�,e�q��
���Ò%K�,Y�dɒ�e�:��<���!���YV�,��:B�d�|O�$*#libs/phpqrcode/cache/mask_0/mask_169_0.dat000064400000000365151165346660014163
0ustar00x���1
�0�>�I��9EQ�=��Ls��I���{�Zt��R���}���S��n:�|��R[�?��_*S�L�2eʔ)S�L��&Ϧ�I��O�2�O���2eʔ)S�L�2e*C1��P��P�S�L�2eʔ)S�L��P�2�2��)S�L�2eʔ)S�Le(�}�2��)S�L�2eʔ)S�Le(�}�2��)S�L�2eʔ)S��i�c7;�"�ޙFͦސٙv�L�^��2}oO��'rlibs/phpqrcode/cache/mask_0/mask_173_0.dat000064400000000405151165346660014151
0ustar00x���1�0�ޯ����T 
���[4v��2��ƽok݇��;�Ӳ]f��֞�d��lj�lG��0n+�߻m�G�˖-[�lٲe�"���Y�}o�����V��[�lٲe˖-[�lٲe��հՃ�[�2�lٲe˖-[�lٲe��հՃ�[�2�lٲe˖-[�lٲe��հՃ�[�lٲe˖-[�lٲe�V��a���lٲe˖-[�lٲef[�B��mа��E���;�N��-ۜT�/r��l��?��*�libs/phpqrcode/cache/mask_0/mask_177_0.dat000064400000000410151165346660014151
0ustar00x���1
�0�>�I�9+?����߁��iևd�̹��xֈx�N�/�է|{�ظ�����8d�����0�h��=��cFf̘1cƌ3f̘q�q�=�w6�;l��4cƕ�<�nj3f̘1cƌ3f�X�һ1ֻ�cƌ3f̘1cƌ3f�X�b�w�nj3f̘1cƌ3f̘��M'�X�&��1cƌ3f̘1cƌ3ֻ��n��n�1cƌ3f̘1cƌÍ3U<�
\7�+��(<Oƌ��Ί��nj����4@libs/phpqrcode/cache/mask_0/mask_21_0.dat000064400000000060151165346660014056
0ustar00x�30�C
�.l�H�4S�H3��2��A&M-�ep�؄�Z�zS�libs/phpqrcode/cache/mask_0/mask_25_0.dat000064400000000071151165346660014064
0ustar00x�30�C(�.\H2tӃȳ�䂩Ð�z�~�`=�a@e=p��"G��v�libs/phpqrcode/cache/mask_0/mask_29_0.dat000064400000000073151165346660014072
0ustar00x�30�C$\�$�dL/@���x
L-V�Q����w��b�#ꅻ��4%z�G��libs/phpqrcode/cache/mask_0/mask_33_0.dat000064400000000076151165346660014070
0ustar00x�30�C4\�
�4f��q�!�S�Sɨ��x����f�Jct2�BJ�a���libs/phpqrcode/cache/mask_0/mask_37_0.dat000064400000000101151165346660014061
0ustar00x�30�C,
��Q��jК�P�]�D@.���F�5k������,|yĥ�рe�4i�Clibs/phpqrcode/cache/mask_0/mask_41_0.dat000064400000000104151165346660014057
0ustar00x�30�C
��U��rȘI�Ɲ�DB.�>�JG�5s��Ae&�,
��I�`3�~7
V)-�D�?�libs/phpqrcode/cache/mask_0/mask_45_0.dat000064400000000152151165346660014066
0ustar00x��1
w^����F-`")�40��COEP,��[ϐm-/lGy��{��ŋ�����N�F933g��ؕ��l��;
�ٗ�x�bsN6�#~�`79р�libs/phpqrcode/cache/mask_0/mask_49_0.dat000064400000000160151165346660014071
0ustar00x���K� E�9���o�#?H/�6g$�-���,X]	
��xݘ;��X԰�9��<�Ѻ��q��2�Af��H�7��/5We�{�#���fި��?�4�=N
>��libs/phpqrcode/cache/mask_0/mask_53_0.dat000064400000000161151165346660014065
0ustar00x���K
@!й��o�Q�Ϻ:(m&���s-����6��Z{��m4Y��X�.F�٭���XZi��j=:έ֋b忑VH8�#�[������Y���^X�elibs/phpqrcode/cache/mask_0/mask_57_0.dat000064400000000165151165346660014075
0ustar00x���A
� �{^���s=YL՚
(
o�u���j)��
Z7y�����v,Դ�wVQ	�i���GiҤ��Df�ە��wo4�Ѥ���o�L���Lȼ���������}�4�
h�libs/phpqrcode/cache/mask_0/mask_61_0.dat000064400000000167151165346660014072
0ustar00x���9
!�>�I�9+ō���Q~����d�%���òM���Ͷ��d*bK滻89�z]T�
�aÆ
[��s���8;���6�5ذa/���=؉�n�Z�<��m>s��v���ulibs/phpqrcode/cache/mask_0/mask_65_0.dat000064400000000173151165346660014073
0ustar00x���A�
�;����'����`C�$�����,��(�n>kx���j��>t<�뒖G�@
4�����gG^�y���3I
4�5`�$gH��������!p�������"$libs/phpqrcode/cache/mask_0/mask_69_0.dat000064400000000176151165346660014102
0ustar00x���K�
�=���_�+�m��B��d|Q"s+1���"�),�=�E��a	T�"���n�E-3,��KY�w�=Z�Z�T�.,��K1��#<XBt��<��a��b�#�x/;X.���libs/phpqrcode/cache/mask_0/mask_73_0.dat000064400000000202151165346660014063
0ustar00x���1�
����/��FSM(���7��/JTme�ӕ��l�����s�|��)YY�U�S%�7{i��(L�0mo�짻'���w��DŽ	{�=Όc��)�2���֦�~���Lz�)�vZ5O2]=��?libs/phpqrcode/cache/mask_0/mask_77_0.dat000064400000000213151165346660014071
0ustar00x���A�
D�}O��r�0����B�/;b�Hp/��*K�E7�G���/_l}�x��MP
[(筊��Zޛ�lI6lض�eϷ��O������^��
6�,�,�6l�&l���&��^�Wc�}m�5u�E�;�elibs/phpqrcode/cache/mask_0/mask_81_0.dat000064400000000213151165346660014064
0ustar00x���1� �ὧi�9'�Bߠ���E�Mpo#
�&	�a���6�)c�~��b
�1�߱���ߧ�|Y$F�1N�q_��.����31bĈ�~M���`Ĉco{B�807����dt���v���f����libs/phpqrcode/cache/mask_0/mask_85_0.dat000064400000000210151165346660014065
0ustar00x���1
� ��=�I��NE�Z_����m
E�Vqy�2Yh,S�[���g��UXJkd��.��~>֞!�Ŋ+V�嬪����.��2�X�bŊ����+V�X����.�kB��z���w�ձ�̀g�k��YZ�libs/phpqrcode/cache/mask_0/mask_89_0.dat000064400000000224151165346660014076
0ustar00x���1�
�ὧi�9'�������Hl?L��^"�&M��?b�q��?˸��,�9���!��z�]V��Scƌ3�_����c��!�`n��3f̘1c�̌��	3f̘1/f�>.U��c�˻;�
�2;�Y����+�7�libs/phpqrcode/cache/mask_0/mask_93_0.dat000064400000000231151165346660014067
0ustar00x���K
�
E�yV����,�O�mޠr�PH�0�{��������2�b����c{t�Q�]
{Q�{��{弬֒�ǎ;v��_ڳ��}����L�}l�߱cǎ;v�̑̑̑رcǎ������.L���egw�3���qe��Ѿ@�ilibs/phpqrcode/cache/mask_0/mask_97_0.dat000064400000000226151165346660014077
0ustar00x���A
� D�}N��r]Y�
�����"<40�{�H<U�d@t'|�0�{d��u
�RB}�K~C�ce�l0`���E^:{���F=�
�0`����Jn%���0`��ö�'~c��18�C�[r�>��pu�<libs/phpqrcode/cache/mask_1/mask_101_1.dat000064400000000173151165346660014144
0ustar00x���1
�
н����\Q��E�d		1���N�<�#��Ֆ��-7u��.��l�ԦeiXXXXXRZV��VeIo1�,,,,,v%�?��gaaaa��Y�K&K=/���+ۍ�˱����ގ�libs/phpqrcode/cache/mask_1/mask_105_1.dat000064400000000202151165346660014141
0ustar00x���1�
��Ӕ�_Υ�b��
K�B�?"�*#W�ʘt����gӎ�J��qUM9���������T���LLv��Ǥ��LLLLLLz��gG01111��y�i��ߘ�4m�=՛n��+2libs/phpqrcode/cache/mask_1/mask_109_1.dat000064400000000202151165346660014145
0ustar00x��ֱ
�
�>Ә��K�����}���:!���iY��'*3�]f�s������m��b[�J������ƶŖ�K�9�}cccccc�'u.6�������Ʀs���6666�R[�^g�{/l��ٷ��7͂libs/phpqrcode/cache/mask_1/mask_113_1.dat000064400000000211151165346660014140
0ustar00x���1�
������
-8fL(pB�lDM��9";��-���;?1�p��{�\��%-�������3:@�ad4����������*�N��adddddd���#######�#c]75��������1�xYu�libs/phpqrcode/cache/mask_1/mask_117_1.dat000064400000000206151165346660014150
0ustar00x��ֻ
�
�>Ә��K���$�^�8Y�QSV'z�8��jz��ʇ��^]�ס����ekXYYYYYYYjݵ#�
+�yeeeeeeee�#���WVVVVVVVV;"+�yeeeeeee�l�'�e;b��&�^9�{�/�J$plibs/phpqrcode/cache/mask_1/mask_121_1.dat000064400000000222151165346660014141
0ustar00x���1
�
н����\���C�PbїE��<D�Gd���QG̪�3����k?3�s�9_�z�9i���������|3W��3�����������,W��r�7���������Y�`���a���������sd^���g�ۚ���4��libs/phpqrcode/cache/mask_1/mask_125_1.dat000064400000000220151165346660014143
0ustar00x���1
�
н����\��:��҂�>$�DdƩ���Y����t�څ�λ������0�$��������������ή��������������ꝝ��������g�a7�y��������ٯ�痽Y??���{�{���D��libs/phpqrcode/cache/mask_1/mask_129_1.dat000064400000000244151165346670014156
0ustar00x���1
�
н�I��.�Bq+Fڗ��)<�F�ʝ�����������C
t��LW���P�0`p�A�|��0�2�0``_0+3�/�D0`���}����
0`����2��Ld��>nоV/Q2'�?*�A�
)xS�libs/phpqrcode/cache/mask_1/mask_133_1.dat000064400000000244151165346670014151
0ustar00x���1�
��Ӕ�_΅���h���h���|"z�ۉ�-*dN��������H���QĢ�RÂ,X�`�c���9�Y�(na_�`��,X�,X�,X�`���#:8���,X�`�B�d�¾`��,X|ϢY\X��;�7-��;�`libs/phpqrcode/cache/mask_1/mask_137_1.dat000064400000000255151165346670014157
0ustar00x���1
�0��Ӥ���Kh]D���,-t	��#�ڌ�Q[T��	�K�s�7_����?9|�B&�X�^L�0a„��&3���„�M�&L�0a„	&2���D4c�0a„	&L�Ȁ�Ќe„	&L�0ab��w�Ȁf,&L�0a„�7&y2�a��n�oL�<01O
����
libs/phpqrcode/cache/mask_1/mask_141_1.dat000064400000000260151165346670014146
0ustar00x���1
�
�>�9���4�6)�3�$`s��uʮ�>Wd��
�)�g��'��M�{3\�d6u��bذaÆ
6lؼn��]�Nذ9�FްaÆ
6lذa�3�a#oذaÆ
6lذ�ذ�5e16lذaÆ
]S�b�k�6lذaÆ
�m�ͤ��;C�c�f���Ids�G��libs/phpqrcode/cache/mask_1/mask_145_1.dat000064400000000263151165346670014155
0ustar00x���!�0@�k�����4a)�q�2i.YCUO{35�UZ�F�n]�fN>bd��wtzJ�F}�F�1bĈ#F���(��F�6r�1bĈ#F�1�E1�i�lF�1bĈ#F�tF��#F�1bĈ#F�tZ}�#��#F�1bĈ�l��e�H�G���ܣ@�ٝ��libs/phpqrcode/cache/mask_1/mask_149_1.dat000064400000000272151165346700014153
0ustar00x���1�
��Ӕ�_΅��q�H�_X��c��i�#Gd̘�Ք՛�g��LU�^ݮVR�>dKV�X�bŊ+V�Xe�o��X���J_�bŊ+V�X�b��;�ݙ+}Ŋ+V�X�bŊ+V�AV��ngŊ+V�X�bŊ�}�+���+V�X�bŊ�V��j��>�hewf����*`uTq�libs/phpqrcode/cache/mask_1/mask_153_1.dat000064400000000273151165346700014147
0ustar00x���1
�0���\��9��bt��E�c'���HH���9�efߞmff�M������#.̘1cƌ3f̘1cf��7�3f̘�g̘1cƌ3f̘1c�o2c�]�?�3f̘1cƌ3f�5�Mf��3f̘1cƌ3f̘1�7utf��3f̘1cƌ3f̘=��l����j��3���>�����V�libs/phpqrcode/cache/mask_1/mask_157_1.dat000064400000000301151165346700014143
0ustar00x���1
�
�>�9���4S��d/�5��1��V�)Sk�J����v��7���������eG�cǎ;v�رc��]Z���ٱc'�رcǎ;v�ر�+ر�g�;v�رcǎ;}V�`�N�+رcǎ;v���:;v�;v�رcǎ;��;}Vޱcǎ;v�ص��'��vz�#;��]���klw�oA`libs/phpqrcode/cache/mask_1/mask_161_1.dat000064400000000312151165346710014141
0ustar00x���1�0����_΅X���šyi~���Q�b��kv�p���7'M
u��=�]����([2dȐ��+��\'2��2dȐ!C�2�s0/3d(�)2dȐ!C�24�1dh�
2dȐ!C�2dh�cȐ�<dȐ!C�2dȐ���y�!Cy�MaȐ!C�2d��0����^��4��[��E2�libs/phpqrcode/cache/mask_1/mask_165_1.dat000064400000000320151165346710014144
0ustar00x���1�
��Ӕ�_ΥLK^��#�F��YWt��%ˍ����4���r��M,��Q�X�dɒ%K�,Y��������d�Ҽdɒ%K�,Y�dɒ%K�%K�
�%K�,Y�dɒ%K�v2$K�v��,Y�dɒ%K�,Yʐ�8K�楷�%K�,Y�dɒ%K�2$K�,�K�,Y�dɒ%K�,�Z��VK�<β��yy��
��)�libs/phpqrcode/cache/mask_1/mask_169_1.dat000064400000000324151165346710014154
0ustar00x���1�
н���_���M,����B^��5*V���K�N�n2�����N�NO��i6>�S�L�2eʔ)S�L�2��M�
S�L�S�L�2eʔ)S�L�2�M�}�L�SS�L�2eʔ)S�LeSy�)S��Ŕ)S�L�2eʔ)S;ٔ)S;�)S�L�2eʔ)S�v(�)S�v(�)S�L�2eʔ)S��L�d��T6}a*�3mlj�mzC'libs/phpqrcode/cache/mask_1/mask_173_1.dat000064400000000332151165346710014146
0ustar00x���1�
��Ӕ�_Υ''�@y]X��1?"g�:1犝fn˶�˻����m������m.?��lٲe˖-�F����>glٲ���2�lٲe˖-[�lٲe�O`˖��e˖-[�lٲe˖-[�l�	lٲ��lٲe˖-[�lٲe�V�O`˖��e˖-[�lٲe˖-[�z0}[�z0y˖-[�lٲe˖-[�E��e[h�O��VWö���=�t�*|libs/phpqrcode/cache/mask_1/mask_177_1.dat000064400000000342151165346710014153
0ustar00x���1�
�������E���p0�X��,a#r��}��6}nj�������~���\�8��ƌ3f̘1cƌ�7���{�3f,��y�3f̘1cƌ3f�X_��`�X�&�3f̘1cƌ3f̘��M_��1cy̘1cƌ3f̘1cƌ�+3f,��y�3f̘1cƌ3f�X_�b�X�&�3f̘1cƌ3f�x�2�d����X'�x[cy|��
��3�libs/phpqrcode/cache/mask_1/mask_21_1.dat000064400000000052151165346710014055
0ustar00x�30�C
�����(�Ԓ"J���```����
�I-�
S�libs/phpqrcode/cache/mask_1/mask_25_1.dat000064400000000060151165346710014060
0ustar00x�30�C(��p���#C�=P��`���0��b��S�>v�libs/phpqrcode/cache/mask_1/mask_29_1.dat000064400000000062151165346710014066
0ustar00x�30�C$�2����Y2�*6�
F��w2�h���_�z����libs/phpqrcode/cache/mask_1/mask_33_1.dat000064400000000065151165346710014064
0ustar00x�30�C4�2
*��PA�;�q�Q3���4CA,f��t��libs/phpqrcode/cache/mask_1/mask_37_1.dat000064400000000070151165346710014064
0ustar00x�30�C,&�e@@��fQS��d���5j�
7�����Y��QfHAlibs/phpqrcode/cache/mask_1/mask_41_1.dat000064400000000072151165346710014061
0ustar00x�30�C&�e@,@�*f�B%�	�hH��9j標��LxY@�2d��INxm&?�libs/phpqrcode/cache/mask_1/mask_45_1.dat000064400000000122151165346710014061
0ustar00x�30�C\��H�t2�O�i�����N��P͆D�Q��ل�	�?��M'�3�P�Mm���N�)c���To���Ҁylibs/phpqrcode/cache/mask_1/mask_49_1.dat000064400000000124151165346710014067
0ustar00x�30�C|��Ht�]�Jv�C^
y�;�
F���H;�I�p�n�h�YvS���]b먡iM�x;����libs/phpqrcode/cache/mask_1/mask_53_1.dat000064400000000127151165346710014065
0ustar00x�30�CB���]h��.��B��vA
1$	��5j�����k4��5��"��AK�h��Hi�h_��9Xlibs/phpqrcode/cache/mask_1/mask_57_1.dat000064400000000134151165346710014067
0ustar00x�30�Cb�p�:���D�l�@�$ʟH^��N�A�$�Q;G���.v�R&�EG�MC�v��I%;Ii���Nڕ	������4�O����h�libs/phpqrcode/cache/mask_1/mask_61_1.dat000064400000000135151165346710014063
0ustar00x�30�Cb�pP�����i`�@�&��H^��n�a�d�Q�G��{�n<v�Z���G�Mk�v��=j7��⠳���9m��n7��<����hlibs/phpqrcode/cache/mask_1/mask_65_1.dat000064400000000143151165346720014067
0ustar00x���1
 ����/����D��
"�f=��)v��!�aWyd��5�e�a���[=*��I0d5(_V�!�V�?�_��}�

��"libs/phpqrcode/cache/mask_1/mask_69_1.dat000064400000000146151165346720014076
0ustar00x���1
 ����/�"�ҐV�o�CQD�g#-IV�uy�2�m���ez.�hY�iv,X�<k�ޣZò���b���9�������G��gK���,�ȇ�libs/phpqrcode/cache/mask_1/mask_73_1.dat000064400000000150151165346720014064
0ustar00x���1
 ����/�"�XZ���A>D��TKd�ȩ�N	Lk�˦��Ls�FuФ��;�0aJo�ܧ^���Ďc„���DŽ	��<���}�a�n
�O~SG��&libs/phpqrcode/cache/mask_1/mask_77_1.dat000064400000000156151165346720014076
0ustar00x���1���i���(�7�4_�6a�gc5����.���Ý{m��M�[stb[.%��
ۗ��VV�����a���b.0��a��m����C�U�qasy�4��elibs/phpqrcode/cache/mask_1/mask_81_1.dat000064400000000162151165346720014066
0ustar00x���1���i����6��h�/
�0��'��d���+�|��1Bţ>��`�dY0bĈqӨx�:F�F�F�12����k�1b�hT��2z�3�?R���X;r��libs/phpqrcode/cache/mask_1/mask_85_1.dat000064400000000162151165346720014072
0ustar00x���1
�
н����\�]��4�AA	h���M�\Q��js�Ak�U���jm�un2R������Κ5��:k;�������jƲ�[����eo���[�o��[��k����Z�libs/phpqrcode/cache/mask_1/mask_89_1.dat000064400000000171151165346720014076
0ustar00x���1� ��Ӕ�_΅�N�h}%��@
iDO�H��*c�"�<��g���)�<m�Bs������������w�ja.av��������7��Affff極�2淾��5
�uح�9�|���libs/phpqrcode/cache/mask_1/mask_93_1.dat000064400000000175151165346720014075
0ustar00x���;
�
�>��_.��4I���y킎��`)-5*��(��of[�sm�}�������6YM	;;;;;�G{�z�ط����������z1vw������}�=�wu��L�%�?�"�=�~e�ilibs/phpqrcode/cache/mask_1/mask_97_1.dat000064400000000170151165346720014074
0ustar00x���1
�0н�1��\��tncK���<D��i3#Gdgt(lxV��P���9�F�7lia``````�ސq/]5��v�����������ne``````x��-mX�^��3�5,�y�-��#libs/phpqrcode/cache/mask_2/mask_101_2.dat000064400000000164151165346720014143
0ustar00x���1
� �����C��
�Ux!��?1�e�����)���s��*�KۮLf�B�P(��J֮�ܨx/
�B�a(2�B�P(2E��P(ʲR�S�(%qWR�S����iY�libs/phpqrcode/cache/mask_2/mask_105_2.dat000064400000000167151165346720014152
0ustar00x���!� @����\M��i�p4s���
6��ꙑYs�"�7��&)=�;�
�܌�"�H$ҏ���;�|I�H$�D�t#}O�H$�D�H���H$������IZ�#HgK��J�t�$�libs/phpqrcode/cache/mask_2/mask_109_2.dat000064400000000164151165346720014153
0ustar00x���1
�0н�1��\�@�Nֈ<q��#��#v����-e~_�����[����h4�6JK��Fj��F��h4��E�'i4�F�ɓ4y�F��h��Z�EcS-;��&j��������libs/phpqrcode/cache/mask_2/mask_113_2.dat000064400000000175151165346720014150
0ustar00x���1�0����_�š��Ъ�0�ځ�D\5*{�#��b�H'o+vU��R1�P�D"�H$����>�D"�H$��D��H$�D"Q&�Wer�H$�D"���*x[�(�?/���'��ndlibs/phpqrcode/cache/mask_2/mask_117_2.dat000064400000000175151165346720014154
0ustar00x���1
� �>�9���4!m
dO�s\�0X,la�5#��E���>Z[�ַ�����R�T*�J�R?Q-���*�T*�J�R��?U��W*�J�R�Tݟ���+�J�R�Ԥ��~m5��;��S�&+libs/phpqrcode/cache/mask_2/mask_121_2.dat000064400000000177151165346720014151
0ustar00x���1
!��^��9�JAH�2!��`�F�%���6r��8;�"WW��Gy+d5�L&��d�r�F&�g2�L&��d�\%c��*2�L&��d2٦O���d2�L&��	r����}�L6���"��glibs/phpqrcode/cache/mask_2/mask_125_2.dat000064400000000202151165346730014143
0ustar00x���!�
P�Ӕ�_�@
U(�kp@^M��ڮ5������-��:�VF_��\t:�N���t����y�N�qt:�N���t�G���;�N���t:�.���8:�N���tzA}�����y�N�q��;+n�&libs/phpqrcode/cache/mask_2/mask_129_2.dat000064400000000221151165346730014150
0ustar00x���1
�0н��_�K�Vڡ��'.���!���w]A0X���~�����
	�!��������࣠fK#
x�Fy���4�vey��������@^�+���~��
��	L#��veI�libs/phpqrcode/cache/mask_2/mask_133_2.dat000064400000000226151165346730014150
0ustar00x���1
�
н�������&�`��L������Q-�g=Aq�b��ʪ<�v�b�+�)((((((((�I�n*�<b��G(((((((((�
y�{AAAAAAAA!���)�






����'�e�������M���fv{libs/phpqrcode/cache/mask_2/mask_137_2.dat000064400000000236151165346730014155
0ustar00x���1
�
н����\�N�I,/d+ʣ`�/F|5*z�'H.�,x�O[K�K���������MBBBBBB�T�|?!!9�8�$$$$$$$$$$2
�h�����������Ȁ$2�yBBBBBBBBBB"e�Ȁ�								ɟ$��I�%ɿۓ��H�b��_x���libs/phpqrcode/cache/mask_2/mask_141_2.dat000064400000000240151165346740014144
0ustar00x���=
�
�����t*-�?���M���[�hU��]W�B��;���d�wS�j>��l�
	��f�Ƅ����������Ț44�&








��)O�Ț�Y�F�4�444444444c4~�9S�:3�Ќטp�Ǯ>�libs/phpqrcode/cache/mask_2/mask_145_2.dat000064400000000245151165346740014155
0ustar00x���1
� ��r]
�,t�Q^�&�C������~�
щ��j~mɾ�.��Fg��MDDDDDDDDDDD�ST�׈��D�����������H����dZ��L+�ɴDDDDDDDDDDD2-��'"""""""":B��ת�E�Y���Dd�������libs/phpqrcode/cache/mask_2/mask_149_2.dat000064400000000256151165346740014163
0ustar00x���;�@����/gcaG�BXB�'�-��ˆ���ouէUQ�d�RVOm��T��*ǫ�;;����������j��廝��Ee2PQQQQQQQQQQQ����TTTTTTTTTTTTr�3����������������3�R��&��Ts�����k��z_e2P=���d�libs/phpqrcode/cache/mask_2/mask_153_2.dat000064400000000261151165346740014152
0ustar00x���1
�0��Ӥ����8ZP!��B�����Zu��賶"���bu����*�����)]MFFFFFFFFFFFF���%=
#���ddddddddddddr
ot2��yFFFFFFFFFFFF&�
#�k��������������5��L
2222222222�(Y����7��"d����@H�libs/phpqrcode/cache/mask_2/mask_157_2.dat000064400000000262151165346740014157
0ustar00x���1
�0�>����s6�M���qUH1�X�&U�̘�f�/u-��'���.��[�KGGGGGGGGGG�H�|NG��(tttttttttt��NF���;::::::::::}��N�������������z��$
�>�������������n��A�#��^AG���(t��
=3{libs/phpqrcode/cache/mask_2/mask_161_2.dat000064400000000276151165346740014157
0ustar00x���!�0P�i��_3�Z���k����Y��j�H�KE�ca-Ͼx��HSaj�~��J�~C@6��m	Å�
!!!!!!!!!!!�́�P�@HHHHHHHHHHH(s�/��CBBBBBBBBBBB��m�P�`��	e�����������w��A��0g�#$L�6���v#libs/phpqrcode/cache/mask_2/mask_165_2.dat000064400000000305151165346740014154
0ustar00x���1
�0��Ӥ������?�B�V���UG����%������*�+�_�f��s	MIIIIIIIII��2d;��l�4�()))))))))))e�qJنIDIIIIIIIIIII)۠��mPRRRRRRRRRRR�6l����
JJJJJJJJJJJJن}�R�aQRRRRRRRRRRNe�K?R퐔�͔&�W�3Ulibs/phpqrcode/cache/mask_2/mask_169_2.dat000064400000000304151165346740014157
0ustar00x���1
�
н����\��Cq���Y���_Z5kD�WO��.?�q�����J��Q��;�IIIIIIIIIIIII�JCvSR�C��)))))))))))��MJjJ�������������PlѤ�2RRRRRRRRRRRRR[4)��������������T�BJ*C1OIIIIIIIIIIo�����@i�nJJ�_jJ�F�(libs/phpqrcode/cache/mask_2/mask_173_2.dat000064400000000317151165346740014156
0ustar00x���+�@P�i�����f�t�:>y
&dU߬��S��[������]5Z;a��5V۞�����������A��[Z�˴��������������V���ՃI0ZZZZZZZZZZZZZZ=-�L����������������hi�`��������������VFK�����������������?�ݧ��hio�J0��}��olibs/phpqrcode/cache/mask_2/mask_177_2.dat000064400000000321151165346740014155
0ustar00x���1
�
E�>�Y��4�V$�~�,C���&U��;Oo�k5b��ϙ���G�x9��%&&&&&&&&&&&n$�OL|��v#&&&&&&&&&&&&&��bbݍ��������������Xw#&��l7bbbbbbbbbbbbbb�M"��l7bbbbbbbbbbbbbb�Ma!&�݈������������3�)U<WܱW�/�݈#�n
�libs/phpqrcode/cache/mask_2/mask_21_2.dat000064400000000043151165346740014062
0ustar00x�30�C0�.��E$��"!*���6�E��S�libs/phpqrcode/cache/mask_2/mask_25_2.dat000064400000000051151165346740014065
0ustar00x�30�C�.��#��2
�3DCCL���S���B��v�libs/phpqrcode/cache/mask_2/mask_29_2.dat000064400000000055151165346740014075
0ustar00x�30�C$\�[��d8���T�b���p7�L!��libs/phpqrcode/cache/mask_2/mask_33_2.dat000064400000000057151165346740014072
0ustar00x�30�C\CO.@[�ChT�TO48S�`Q��]Tuj�wlibs/phpqrcode/cache/mask_2/mask_37_2.dat000064400000000057151165346740014076
0ustar00x�30�Cl
���*|��6�y�x�QU�DT�p���J�*�libs/phpqrcode/cache/mask_2/mask_41_2.dat000064400000000063151165346750014067
0ustar00x�30�C���JB�&�ù�Ш�Q��*��JXi@l�0�U�>�*F�>�libs/phpqrcode/cache/mask_2/mask_45_2.dat000064400000000104151165346750014067
0ustar00x�30�C���j4�U�2ېL�p�!hT�pW�5�;գ1?HTS"SU5�t2�T��ƅ+:tlibs/phpqrcode/cache/mask_2/mask_49_2.dat000064400000000106151165346750014075
0ustar00x�30�C����Z�
k�!%:p��D�:Fu�UN�a�c4���@�
�V���iw����ϻ��libs/phpqrcode/cache/mask_2/mask_53_2.dat000064400000000111151165346750014064
0ustar00x�30�CB	pY]��T�E
 �.C�u���$�Q]��Fu�_#P�h��5�u�r��.��k����c��libs/phpqrcode/cache/mask_2/mask_57_2.dat000064400000000114151165346750014073
0ustar00x�30�C�p�Xũ��T@���T�	���Fu���94u�)�Fu���Q��:������u(Fu��ď�"glibs/phpqrcode/cache/mask_2/mask_61_2.dat000064400000000116151165346760014071
0ustar00x�30�C�pS���M
�nCj�Ư��=�{T����M@|T�hj�=�{T7�n2Z�t�M�\�=��.�{libs/phpqrcode/cache/mask_2/mask_65_2.dat000064400000000131151165346760014072
0ustar00x���K
 E�y�y�sM"�f���I� �Zl��}
�Z��h�w��B?Z���Gp	LBv!�Kz)xv5�����o��libs/phpqrcode/cache/mask_2/mask_69_2.dat000064400000000130151165346760014075
0ustar00x���1
 C��Ӵ����t�jTD�"�áP4k��F���tn�)J���b%.Eذ(��ԡ���\�(?��Jj�L*��K��ބ�libs/phpqrcode/cache/mask_2/mask_73_2.dat000064400000000136151165346760014076
0ustar00x���!
CQ�i��_C�F�R��T`�Ʒ2�ؗ��e����&ϐ���
!!!M�P?!��L$$$z�GBBʖ�ߐ�R���4��}
����Olibs/phpqrcode/cache/mask_2/mask_77_2.dat000064400000000142151165346760014077
0ustar00x���1� ��_��CM��>�G�t
�ѫe�+��FW�ZE��m�&gއF�Ѷh��F+�t/�F��Yv�F���������j��[*7��a�libs/phpqrcode/cache/mask_2/mask_81_2.dat000064400000000144151165346760014074
0ustar00x���1
�0н��_�K�ҩVi!O\"�A�����]�:�x����bW��1�uȦ&��_��T
΋6�H$��U^�D�~bׯ�b=g���X����libs/phpqrcode/cache/mask_2/mask_85_2.dat000064400000000145151165346770014102
0ustar00x���1
�0�=�1��\�B7���O�$�A0$�8W����wjgu�u��槊�R�T*u��S֧���J�R��T�J�R��R����ޢN�浘�V�libs/phpqrcode/cache/mask_2/mask_89_2.dat000064400000000146151165346770014107
0ustar00x��ٱ	�0�>��/�&E*c��Qq���Ń�zf$���rM�����<��sa#d2�L&�?�ArY��d2�L�G"�3�L&�{���Rygw�;��
���Ilibs/phpqrcode/cache/mask_2/mask_93_2.dat000064400000000147151165346770014103
0ustar00x���1
1��^c���kµ�x�XF̌����-=VD�"%��C�R��N�����A請w:�N���z$]����t:�n���C�zGݽ�/jc�libs/phpqrcode/cache/mask_2/mask_97_2.dat000064400000000157151165346770014110
0ustar00x���1
�0�_�Ki�vH4
<q	��#�ʩ������s�-TU��S�_Y��@
k���D�I��@ �V��J
a�Pt��0�����C8%�libs/phpqrcode/cache/mask_3/mask_101_3.dat000064400000000270151165346770014150
0ustar00x���K�
E�yWS��9'D1񟾪p	�/9�Ё�u���,k�u9�Ҥ�$��%�ݭwAL��b%ClA��zq۴�붌��b�!���Ĥw�X�4`���_�'FWr�!�b��&�t1�<FWr�!�b��X��y���C1Ć���Ӈ�)E{W�ٯAӅgL�1]�-&�Ƽ����Lqn�libs/phpqrcode/cache/mask_3/mask_105_3.dat000064400000000263151165347010014142
0ustar00x���1�
D�~O3�r6��@(�1�'������J}4���gk�9�7��A=������i��p}��w��ZJo����8���JB=��C�s=
=��;�H�zT.�z衇z�{�{�{T.�z衇z�{�{�{T.z衇zo�S$P�T��h��E��%�Կ�bߞ�r��\R�L$�libs/phpqrcode/cache/mask_3/mask_109_3.dat000064400000000266151165347010014151
0ustar00x���1�
D�~O3�r6���	�O(�;���V6��sy������>�)�_%s�_���d3K�O1^�a��L��,�$�H"�$�KzRP�t[I&��X���9�$�H"�$��I�$y�sI$�DI$ɓ�I�$�I$�Dɍ%e��s�!��=����LAZ5��'�̓IV��r�n��/2oƅlibs/phpqrcode/cache/mask_3/mask_113_3.dat000064400000000310151165347010014132
0ustar00x���A
�0D�}N��rnD��Fj2�K���C�t?W��ݲ�Z�i�.q���o�P��%Smj���7�ަ�:������*��N��:@�:��������*���*����*��f��W9d�2�����*����j�*}�S@��`���*����j���৪6�Jl���ѿ�}��}�է��T��U�a�24hntlibs/phpqrcode/cache/mask_3/mask_117_3.dat000064400000000307151165347010014144
0ustar00x���1
�0�]�Q��.�xI�B$�����?~!�<�Q?�#���5�/tI�J8ow�i�{����}�S��^��~���q猉P„	&L�0�J��1�ϻݢ�D�K'�J�Ä	&L�0ᝅ��n
��0a„	&Lxga��G��*�&L�0a�{
g{����2��s�Ή~���7\]%r�J��9nZlibs/phpqrcode/cache/mask_3/mask_121_3.dat000064400000000324151165347010014136
0ustar00x���1�
���8��\�&�J���!�H�l8U�=$��-eV�=�&�gN�t�gj7��>n\�>���9w%ko��oK7ʨ]�S�]f%�M�6mڴi?V;����v_�b�VL�*��M�6mڴiӦ��ڦ��`m�DݦM�6mڴi�^X�tc��C[%Q�iӦM�6m�Kiǔ�ws�>�T��oǬ�&z�8�Ĭ�����UIb�J�ɮ�=libs/phpqrcode/cache/mask_3/mask_125_3.dat000064400000000317151165347010014144
0ustar00x���1
�
�~N3�rۄ]��BБ�'�?<��/̼V۵����ҏ�����<��0-_�J�[��?�	+w��^;*�y��ɓ'O�<��/9��ɯ�9�<��y�Ɯ'O�<y��ɓ'�J^��a�ț6�
y��ɓ'O�<�G�{��icΓ'O�<y�����P�������|�]�Z֤��Iee�:[~�?��<mJ�_�N�:libs/phpqrcode/cache/mask_3/mask_129_3.dat000064400000000316151165347010014147
0ustar00x���A
� ��6!n�
�G<q�4�h�/��G?;�h�s����LST����Oj����2#���
D��y`�ܫ���P�@�
��\�B�4*yt$�
(P� /�򂼠#Q�@�
�yA^�t$
(P�@��� /��D�
(�\���.`���ɛj�o��C��S��;R�;R�.��I�libs/phpqrcode/cache/mask_3/mask_133_3.dat000064400000000330151165347010014136
0ustar00x���1� ����
q]��ƙ��
�B‹#�
b���?m\��&q�E�b��/��S����ZԵB��D�|4ΛY�G��W&A�"D�!�H��w�TOb'�4N䱈��?B�"D��G�yDQ��!B�"D�yDQ��G�!B�"�<"��#�"D�!B�H��D�y�/����ot��n1��Ht�#
���D����<���libs/phpqrcode/cache/mask_3/mask_137_3.dat000064400000000357151165347010014153
0ustar00x���A
�0�}N��rn�F�HS���YQ|���Z��E�f��u�,%�
�$�uj��G�:��z���o��u�,:O��s�Y�ď��e��:t��I�s��j��|��+�N�5���d�lt�СC�:t���;��b:�M�ѡC�:t��9���h���H6�F�:t�СCǽ�ڨ{A%�d�C�:t�N��$^ur�dV���'\�wj��S���t��;U��'[�,7��libs/phpqrcode/cache/mask_3/mask_141_3.dat000064400000000356151165347010014145
0ustar00x���A
�0�}N�{�˹)%]�j�f/d!�u��O�U����c���0}��a�4�R9���_���T�~�`����_	R[�T�ծ���n1�ݒ"E�)R�H-*�p�~H�ܥ�J����԰��g��"E�)R�H�J�ҧ4��2�L?R�H�"E�)RiR��滀��g��"E�)R�H���>��z���#E�)R�H�Z@�b�l-)�ݿ�<ߧ*�OUR�"5&����5�*i�e�J]�+libs/phpqrcode/cache/mask_3/mask_145_3.dat000064400000000365151165347010014151
0ustar00x���
�@�|������:�^��Jy̡��yM���j��-'
9�V�S�֦K��9��e��)P�yU����w�e�-m
jԨQ�F�5jԨ�R�i٫�F4�_wk}�0+��jRBR�F�5jԨQ�����e�OMBJHjԨQ�F�5jwP�״�˪IH	I�5jԨQ�Fͳ�����c	�w�5jԨQ�F���:����zS��*2��UZ_��C��*�e_O��Z�%dIȯ��blibs/phpqrcode/cache/mask_3/mask_149_3.dat000064400000000372151165347010014153
0ustar00x���A�0�}O��ܠ⦐H頯��'�Z�2{oV�|Ι�%���>��y��R{�!8��ÂI+JpI|#��f�5κ[�PA�	$H�
��Q}�)�&<��E��	JQ)J� A�	$H�
�s5z�����%H� A�	$H��4A�^��5A)*E	$H�
A�	$�	��3�MHQ�	$H�
A��	�3ާ`�P���o��>X{ט��+��Wb������`I��)5��%d�libs/phpqrcode/cache/mask_3/mask_153_3.dat000064400000000373151165347010014147
0ustar00x���A
�0�}N�s�˹)7mJ���,�}8���X=c�W^G�e��N�<v]]b�Iͯ_����gY+M��j���vˋt��&M�4iҤI�&M���xޜ��u~o[�~��4W55���I�&M�4iҤI��S5ML��i5-M�4iҤI�&M�4o�iz`z@S�jZ�4iҤI�&M�4iz���s(�V�ҤI�&M�4iҤ��Y��zK
6�ϛ�:=����_h�6�7m�6m�M{��H�libs/phpqrcode/cache/mask_3/mask_157_3.dat000064400000000370151165347010014150
0ustar00x���1�0�ޯ9��s4VH���@�Ac�
�9yĢmR�֌��5N��;Oxy��+�r��l����@�.{|5���G�Xk���Ȓ%K�,Y�d��lf�Y����d���LVKc�dɒ%K�,Y���>����X�%K�,Y�dɒ�g�Y}V���gɒ%K�,Y�d�Y�G�%+��1Y�dɒ%K�,Y}V��g�Yi,�ɒ%K�,Y�d��V��e��"�}�kg���S��k�go,���4.i��~!_2�libs/phpqrcode/cache/mask_3/mask_161_3.dat000064400000000425151165347010014144
0ustar00x���A
�0�}N��rn�F��Tk�,��N���	�Z�ђf7J�:�ƒ^`W�ٔU��nXڤ�ǧM-����#V��+ߡ��+9z��ҖY�l�)S�L��o�c���ʱO_C�?ߩ�%�;*Kl�M�2eʔ)S�L�2�Ye��]���[bS�L�2eʔ)S�LyVY�lW��G�[bS�L�2eʔ)S�L��
��]g+$��eʔ)S�L�2eʔ���/�q�BbKlʔ)S�L�2e�qʙ�����]�£{�A�����/��~��V9�\%���[�P�#'libs/phpqrcode/cache/mask_3/mask_165_3.dat000064400000000425151165347010014150
0ustar00x���A
�0�}N3����T�#�Z��Y�u�Ï�:�̛�1�ϱE�U��T�T|S�����	��q�)�m-sG���
����B��.C�ĉ'N�8q�ğ����wv7�[��'�tg�!.ե:q�ĉ'N�8q����v`�_+.ե:q�ĉ'N�8q����v`���R�8q�ĉ'N�8q�Τ���8�"ե:q�ĉ'N�8q�ĝIяہq&E�Ku�ĉ'N�8q��+��9:�}kFT?^���Џ�G��o<0իC�g/�_�libs/phpqrcode/cache/mask_3/mask_169_3.dat000064400000000436151165347010014156
0ustar00x���A�0�}O3�rn���񷾦�)}�'3��1E��h���]�4�P[
�_��]Kv�<�˙f�p��#����y_�l�[�g�e���ӧO�>}����o����%uJV/���{�����%��O�>}���ӧO�����}����K~�O�>}���ӧO�>�Q���=�/ї���>}���ӧO�>}���u{��ח���>}���ӧO�>}���u{蟪/�%?}���ӧO�>}��ׯ.N4��<O������z�z���l��z�z�����W/�_���yplibs/phpqrcode/cache/mask_3/mask_173_3.dat000064400000000463151165347010014151
0ustar00x���A�0�}O3�rnPk�TT�yM$&e/|�"ֵd��j�u�y[�a�i�K��{���M	S&z[B�UB�RI�C�!�n5�\w�4�B	$�@	$��[”���3��c��E^%�xw
�	�A:�@	$�@	$�@	$��B�fI�D�	�A:�@	$�@	$�@	$�p�͒f���%H�@	$�@	$�@	$�@BR	�%�	��
�	$�@	$�@	$�@	)$h�4K$L�
�	$�@	$�@	$�@³��_{�Pg�۴y��>჏VMm��R����������t(1���|libs/phpqrcode/cache/mask_3/mask_177_3.dat000064400000000470151165347010014153
0ustar00x���A
�0�}N��rnJ���L|%����ᤳi���^�Q���g�M|�����/��~��SS?���3��=�8RT�4�2��n��z��60TPATPATP�"���V�d:U�h��)*���
�
*���
*���
*����3Th��X��%*$�����
*���
*���
*��[Z,-�S!A$�}TPATPATPA��*�XZ,��V*$���
*���
*���
*���Z,-�ns�
	"A�+���
*���
*�����*j���
<{s�}EMk�jZ�E�Z��;'HMK����n�!libs/phpqrcode/cache/mask_3/mask_21_3.dat000064400000000074151165347010014057
0ustar00x�30�C0�.�"�"�D)7�d�jC$ąʅ".l��M@��,��0&�S�libs/phpqrcode/cache/mask_3/mask_25_3.dat000064400000000113151165347010014055
0ustar00x�30�C�.@�@�A��e@��Y��9�h�S��pI�i0�qaC\�5
�&�L3�e§�4�6
��v�libs/phpqrcode/cache/mask_3/mask_29_3.dat000064400000000113151165347010014061
0ustar00x�30�C$\&y.|�H��3��d8���.E\�$
GMF6_�0��p.�$�d$7��a2Rh�c��libs/phpqrcode/cache/mask_3/mask_33_3.dat000064400000000117151165347010014060
0ustar00x�30�C\�U�
�
�T��\�*����8n)(�"�`Ԗ�f<��Oc[�1C��*���BH>[��u\�}libs/phpqrcode/cache/mask_3/mask_37_3.dat000064400000000123151165347010014061
0ustar00x�30�Cl
��"dUx�28�����A\�����E�6��8�6�2�,dHL	��èb�!16"B�È��g�libs/phpqrcode/cache/mask_3/mask_41_3.dat000064400000000125151165347010014056
0ustar00x�30�C�Lj��U��r`m'hb;�gHqVE\�*4�}�Q��b;�>b�:C¥
\��҆ʶ#��H�D؎�D�_�>�libs/phpqrcode/cache/mask_3/mask_45_3.dat000064400000000167151165347010014070
0ustar00x��K
�
D�s���FJ(&�)�0d��Ї��F�g!�[8�=��&�ia��D)�d8&A�լ�a����1'�I�I��׳�7�9��	ex���߾�	���I�&֝��C�u��Jy�libs/phpqrcode/cache/mask_3/mask_49_3.dat000064400000000177151165347010014075
0ustar00x��A�
�f���z!�����M�pP"ى@���O�p�b)b�E5D�TYd��j�z���n�SwS��T|�;���S��O����*PAR��j�+�j�#Ig�n�Z��
��
:�Ơlibs/phpqrcode/cache/mask_3/mask_53_3.dat000064400000000200151165347010014053
0ustar00x��K
�0D�s���	����!
-(.Bp&�|�"-t�&`�q�Q-"��9�_+)Be/H8��D��%�a~��}spKFN������=,��;�;a^t�4����\��F������SN����libs/phpqrcode/cache/mask_3/mask_57_3.dat000064400000000176151165347010014073
0ustar00x��1
�0w�F��纄�(�hI!����*{}W��VR��-��ڢg��j��mr�w���p��۱Ul�L�<��q������؎����?�m&�M0�	�7[�m��w�K/8�glibs/phpqrcode/cache/mask_3/mask_61_3.dat000064400000000206151165347010014060
0ustar00x��A
�0�f���z�4-%����*��d��p�!�yZܫ��u�(��~�=�&�ۓ��)��R2�"/�"�<9�FΊ=r��b��"/�������rw�"2�������B��#3-�0-K��Wlibs/phpqrcode/cache/mask_3/mask_65_3.dat000064400000000207151165347020014066
0ustar00x��Q
�
D��4���\?R����,�!�O��-�Nv���1�:�c�Z�u��"U�MÕF	~jK����-la�[^q^�Q\�=��o�-la��ZpU��B����@I��K�Jzɢ|1Í����libs/phpqrcode/cache/mask_3/mask_69_3.dat000064400000000211151165347020014065
0ustar00x���
�0�{�&����2�'��d�
l�=,��F���y;$�쇤�WE�-R����:��%T,O2��g�"�"�,�Ȣ/D�yĈ���ɧ{�O䮳�"�,:N�v�E�WN�#(&,�,�������]�x؅libs/phpqrcode/cache/mask_3/mask_73_3.dat000064400000000231151165347020014062
0ustar00x��Q
�0C�{���g�;��JJ?dԬK�=�Ra�sJhTJ6ex��ka�����\$��n��IE,-/��XB���*х=�����wee�4����t��̒t�Lщ�t�t�߫���b�	�gF�f�	��q��o�d��dn-�?libs/phpqrcode/cache/mask_3/mask_77_3.dat000064400000000235151165347020014072
0ustar00x���A
�0���&����B�i�RaK"t�`I@��|���fX�����yi���l�E�:Sza18G���if�K*��?�:Y�C1쌞졘(ቷ��J*�����j�l*��TRI�K���R^ؙ��ks��)c�)c�)�JZ�������a�libs/phpqrcode/cache/mask_3/mask_81_3.dat000064400000000222151165347020014061
0ustar00x���1
�
F�=����\�,J�GA�ġ��hj��>��#�3X�����:�k�Թ\�FM
J�hu���3��>�T�Z���{��PSg�P'��k�V�jժU��_ۯ��U�V����=P
�o�O:Wҝ����j�[�Wx��m��
�5libs/phpqrcode/cache/mask_3/mask_85_3.dat000064400000000240151165347020014065
0ustar00x���K
�0E�yV��9)�:���ҁF�`hP��ry�+�k[�>������G��Z}�(P�ڣh7ŸÛ���H�
�@���4��#����@���@��	�^���F`��z�4T�i�Q���2�����}�k�V�libs/phpqrcode/cache/mask_3/mask_89_3.dat000064400000000245151165347020014076
0ustar00x���1�
�ὧ)���*.@�U��
���|����eŵ6ۢ���w5*��)
o�i�K���4nk>��1}d>��@
4�XYC�o��	ۡ1<��A���h��F���t
�
4�@��5���1�Wr��>7����G��}}��x7|�N�g���Nlibs/phpqrcode/cache/mask_3/mask_93_3.dat000064400000000247151165347020014073
0ustar00x���A
�0D�}N��rnJɪQ�~�B���06���n�a�<<�ׇ��e6�M�R��C��P��L���̓i��9M�2�
�Lk�dD�v*�"a��X�jBd�Ad�d��Z��T�d�Ad��qY�0ex�����qe���N�������&WV���Qvc�libs/phpqrcode/cache/mask_3/mask_97_3.dat000064400000000257151165347020014100
0ustar00x���
�
��>��/�E�.*�d�/��͏6J�#M�׈��R��`�Dh�R���(�u��J�aRJ(�g������y��J(��J(��v%_��R̓1e�څ�(�q��PB	%�PBi_%R�FJt�%�PB	%�~�$�|�	ܔ4�	����N��Do��;U�W��,��q�p�Ti�libs/phpqrcode/cache/mask_4/mask_101_4.dat000064400000000276151165347020014145
0ustar00x��A�
F��s^1�b�����]���4�m+�8�+�Ve��^H�R]�\�c����
�o�WN#��X����+l���HE�cp�\��^.�9q�W9����"�:��.��B���B�\��0�a��PǨcp�\����O���N�qjpG��}��}��$.�˅�����libs/phpqrcode/cache/mask_4/mask_105_4.dat000064400000000270151165347030014144
0ustar00x��K
�0D�=Mr�˹��A��T�e�EF�L2#���鹢�_I!�������딤Ѻ����-իkm�O��]sST6*��'8�	N��$��'N�Z���^�<JvN�sNp��������'���'8�	�����1��{p����?N¿�n��J�Bυ��^��[i'�iHI-��m+Wlibs/phpqrcode/cache/mask_4/mask_109_4.dat000064400000000266151165347030014155
0ustar00x���A
�
н���rݔ�l,�:��"�_�Y����
����=Qcֹ�ɇ���#m�3u[5_����=߶����%B^c8-��ܸq�ƍ[�-�K*����}��q�ߜ�ܸq�ƍ�>�O��Inܸq��M��'�I�s�7n��m��ƫ[>mz�ri����'�n�f�}��|b6ͧlibs/phpqrcode/cache/mask_4/mask_113_4.dat000064400000000312151165347030014140
0ustar00x���A
�
н��_��Jb)t&��BB�K_���ֳ��6�C+5/q_�ghf�������CbH+�p�����;WK?�G�t�	��*G�9r|�c`��c���9FKH�q4��9r�ȑ#Dž��U���G�*G�9r���>�}r���U�*G�9r|�c�[��cN��[_=�׫5�^�J�����
1*�q�vlibs/phpqrcode/cache/mask_4/mask_117_4.dat000064400000000317151165347030014151
0ustar00x����
�
н_���s]4���Dg�n��2Jj}���Ҿ�RsSWG��R��ɧ���)5����E���m�#ܯ����k_"�z���3�\�r�ʕ+�r
�L�k|�/{��;�'���<W��:̕+W�\�r��U=l�3��|�s�ʕ+W�\��;�w�o�Z��r�ʕ+�\���s�K��ze�Sהz83u#W�ubjd�
��$�libs/phpqrcode/cache/mask_4/mask_121_4.dat000064400000000320151165347030014136
0ustar00x���1
�0�>���r6���V2c�,���4�F����qkQ��?v�F����y���;���c�<������<��t��Wʃ}�5&��6gΜ9s��y᜾�ɳ��]�uWar���ٺ͙3gΜ9s�W�Uz�^eݶns�̙3gΜ9�Uz�^eݶns�̙3gΜs�3�~�;�&����vS׫��WU'���)9;���libs/phpqrcode/cache/mask_4/mask_125_4.dat000064400000000325151165347040014150
0ustar00x���A�
�=���_�
V\`���Y�.~��_���1�8/G�5�c��o�J���9�a���h������s�<�e��ρ?���2B�srz��Ν;w�ܹs�g���ל��7[ω&5���K�[�y�ܹs�Ν;w�z���Y�y�ܹs�Ν;w=N����8��}�;w�ܹs�^�=�
��=?}{��&���zj���^��z?��q���libs/phpqrcode/cache/mask_4/mask_129_4.dat000064400000000334151165347040014154
0ustar00x���;�0�ާ���4h��
�U�(\�H����y����u��'��˯�	N�ҷ����D�qs�|>��q|o��}���
A�)p�p��Ah���
���+�]Z9�&h��\�8��}A_��s�8��}A_��s�8��}A_��s�8��t��釃	��^���}a�B��xD�B<ƥS�libs/phpqrcode/cache/mask_4/mask_133_4.dat000064400000000334151165347040014147
0ustar00x���A
� н��_��Қ��B���B�2�f��{��
���cf����g�Kq��=��)ڮ����W��lK2޿���8:o�CRd�\p�\p�@��+$E����Q.���\p�\�#��>���/�#\p�\p��>���#��\p�\p���#��>�q�p�\p��.��$���Iq��	d��G�R��_4�����libs/phpqrcode/cache/mask_4/mask_137_4.dat000064400000000370151165347040014153
0ustar00x���A
�0�}N��r݈�EJq>�����������y��%y>�1Lb���}};�8�������|퇏����ʯ�t�m���8�ܪ�sP����	'�p�ɋ��ݟ�gJ���{��qs��$Ή�D�Qw8�N8�Nn;��;��'�uG��N8�N8�h�>��D�Qw8�N8�N���h=Qw8�N8ᄓ;�}���$+ɝ��]FN��c���$�N�'QI��|h��dlibs/phpqrcode/cache/mask_4/mask_141_4.dat000064400000000376151165347040014154
0ustar00x����
�0�}�&���sa�4j)�
�,�0"Cs�p	���轗�cl-���R��L����9��1u3�t]��}����k���?��%1�j�v�n��n���47	��MH5�l��3��T��y�O�S�p�
7�p�
7Qn䩅��ƍ�F�ҧ��n��n�k�Sr�{M}J��n��n�q�)O���5�7�7�p�
7�p��7�o�yr�W���q~���S-*O%V���M`5	]l��Dlibs/phpqrcode/cache/mask_4/mask_145_4.dat000064400000000377151165347040014161
0ustar00x���A
�0�{^���s^�Ճ��ld<�T3MX�=Zk�·��&��';Q�yvos�����Iq�]~;�U�����a�����?��\R���Dy��Gq�Gq�G�q��Z`�}����_L��|d]��q�Gq�G�ޑ��h_���G�5�Gq�Gqđ}Z}M�Ok>��q�Gq�Gqd�V_��Ӛ��kq�Gq�G?9Jxk��Qf��{ɞnGy}����D�82��D)�6���6libs/phpqrcode/cache/mask_4/mask_149_4.dat000064400000000403151165347040014153
0ustar00x���
!н_���sm��
���+XӋ9=�.��=Zk�a��]�ޒ>K�j�o����|�S��SWK�Zm�׌���j����\����Ъ2�
W\q�W\q���"~����jv�t���v�_��\q�W\q�W\q%g�3����}�+���+���+��r9��A��r�W\q�W\qŕ�A�
g�3�W�A�
W\q�W\q�W����]�V�~v{�D��3�Ȝ!���\�W���^<�r/libs/phpqrcode/cache/mask_4/mask_153_4.dat000064400000000406151165347040014151
0ustar00x���1�0�ޯ�si,')p!�4.���;���WUm��j=������.NO��>����T�ڍ[��S7v�ۜg�q��?���
�{pe�o�3�8�3�8�3�8{�YXz��,���_�O��Yfe���3s���3�8�3�8�3��\C�!����Ms�3�8�3�8�3��r
��\C?379�3�8�3�8�3��\C�!�07�M�8�3�8�3��q����,���mMrs��k�Wv�3��~�W��WBlibs/phpqrcode/cache/mask_4/mask_157_4.dat000064400000000377151165347040014164
0ustar00x���1�0�ޯ�s4�"FP�=iRX¢X��0�멪�u	4f�t��l}�m�����➭�S�|��ю�S�����P�5<]��r�w�q�w�q����^Q��N6Ï���Z�sߙ��,w�q�w�qǝ>�����Μ5g��;��;��Y}V��g�w�,w�q�w�q�w��>����9�w�q�w�q����>�3g�Y��;���[ww?P3�����Ƙ�ggt�퐮�;�]��.3�w4A�libs/phpqrcode/cache/mask_4/mask_161_4.dat000064400000000444151165347050014153
0ustar00x���A�@��f�s!AL���_|,��4�l)i�m���l�׉0'��
+E������]N\��x�#���2��/��_�{�7g��9쏼ٷ��}���2�r�!��?}-�#<Z��χ�j"��P>T��e9�C9�C9���~�����6Sʇ겺�!�r�!�r�!�����ۘs��e9�C9�C94�_��Ɯ�|�.��r�!�r�!��s�/�s0�
���2�r�!�r��8�}D�����w���r�DXΡ|x�|��!�2�libs/phpqrcode/cache/mask_4/mask_165_4.dat000064400000000444151165347050014157
0ustar00x���A
1�}O��r.�"�*?�f���P��LHI�k���ZQ��8
Gy��qk�-����n5����+?�����|֎���kKn�E���Ź�K.��K.?�2���.�|�EJ�{�2<�:.�Ku\�K.��K.�������ǝmu)_���8�\r�%�\r�%�\��Џ;'2�!_���8�\r�%�\r�%�\��Џ;'2�!_��\r�%�\r�%�\rinC?nn�9��
�R�K.��K.���;.���HqY'�ݽ�N�F?�K�㕢,�R���|��	My*3libs/phpqrcode/cache/mask_4/mask_169_4.dat000064400000000451151165347050014161
0ustar00x���A
1�}O��r��q\X�`��fQQ��LHI��g�Ql��z^����Ǚ��o�e�����#-�|vz=���m������]�?��ڪ��A��>��r�)��r�)��r����]�yP��u�w�4˩|���r�)��r�)��r��N�����K��T>U��}N9�SN9�SN95���7��^��|��s�)��r�)��rʩ9��9�R�P�Su�SN9�SN9�SN95���w/eE>U�9�SN9�SN9���>�|*9͊�`?��.:���1�~Z��N��K������'�libs/phpqrcode/cache/mask_4/mask_173_4.dat000064400000000453151165347060014157
0ustar00x���K
1�}N��rn�a��~ZY!��J�t^��5�(�/���jk�z[pj��_�?~v:|jw�Ֆ_m���Xz�o����6?n���<��j�$p�-��r�-�_p[z�=�V��Q�3��T�V��o�	�r�-��r�-��r�-�r09�L�ߚ�	�r�-��r�-��r�-�r09�L�ߚ�	�r�-��r�-��r�-�r09�L�ߚ�	�r�-��r�-��r�-�r09�L�ߚ�	�r�-��r�-��r��v��6���?�,e�`=*K�6ڭ~���6����*�libs/phpqrcode/cache/mask_4/mask_177_4.dat000064400000000454151165347060014164
0ustar00x���A
!����.1B��My��![c��\c���Z��V\��q��7���E�O�zg~�k�˿j�;pg��u��[*7�׽������Tp�1�s�1�s��q�!���㠊w/�r���8��X��~l��c�9�c�9�c�9�����nr7��~l�0Wp�1�s�1�s�1����nr7��~l�0Wp�1�s�1�s�1����nr7��~��+8�c�9�c�9�c��nr7���M��+8�c�9�c�9��t��oEǙ��N�Xy�[���R+��c����qN�\,4Jlibs/phpqrcode/cache/mask_4/mask_21_4.dat000064400000000071151165347060014063
0ustar00x�30@C�����!\��()�"�̅*��0��'q��4�(��������vS�libs/phpqrcode/cache/mask_4/mask_25_4.dat000064400000000114151165347060014065
0ustar00x�30@CCC�ˀ�D!G�9������H.t8�G�i���7�>5�8�"�A�al�`�A��]v�libs/phpqrcode/cache/mask_4/mask_29_4.dat000064400000000116151165347060014073
0ustar00x�30@CCC8	\��bH�
K���E�B�H�H$6A8I@��#�^��X�"��{��%�^���i/�,6���libs/phpqrcode/cache/mask_4/mask_33_4.dat000064400000000131151165347060014063
0ustar00x�30@CCC	�2 ^��!\I*��\�*�*�0Nrᒀ�D�
l˨;�;�)g
¢[*4$�N
�S��@	<�܁��"���libs/phpqrcode/cache/mask_4/mask_37_4.dat000064400000000126151165347060014073
0ustar00x�30@CCC4
�HS����TU�t>@UwAyXB"��I�I"Ug㨻F�EwA�Q��oN�����w!�%�܅E>�_�Alibs/phpqrcode/cache/mask_4/mask_41_4.dat000064400000000131151165347060014062
0ustar00x�30@CCC�$p���22U��M�	e�P�DrR'IPI���u�;�u�L�`ɀE%���NRUR�N��$BQ��TIH1F?�libs/phpqrcode/cache/mask_4/mask_45_4.dat000064400000000170151165347060014071
0ustar00x��A
!E��F��لS��L�\��I�-3[v/�����v�1:��wt�8.m4Z�����4gr�7y��A�#�%ֽq��}sr�w�#O�<=<|&�˷R���e�_��
<>�libs/phpqrcode/cache/mask_4/mask_49_4.dat000064400000000174151165347060014101
0ustar00x��
!D�~�����e)�q�,��d|��:��%щDyG.��;G(�p`�$Y�*W����C-QPሄ�^Us���!�i2����j�#��VΑ�ʤ����`��������libs/phpqrcode/cache/mask_4/mask_53_4.dat000064400000000200151165347060014062
0ustar00x��K
�0��F��vaSE|�ZЅ	!�|$�g�Y�C�����]�v�U�ʑy�m�+����
�W&)n��5^�x�ޗ.$����S-����O���!z�Z���T��P�x}�0p�gclibs/phpqrcode/cache/mask_4/mask_57_4.dat000064400000000202151165347060014070
0ustar00x��K�0D���97
��jb",X�}�W�Dյ��{���f���ѱDx"$T�g�O먌�d.v��H~�l�y�i�y(J͍'A�<��m�|��{;x�ȋ�D��9�tUɉ�~�8���h�libs/phpqrcode/cache/mask_4/mask_61_4.dat000064400000000204151165347060014065
0ustar00x��A
�0�F���^Jk(���C`s2�I��{�Y�:@t������]�
]���~����Jo�R�]����Mozo���5�(y?�Azě����ӻ��^�q:|ȇ���By>A��y�~pw��slibs/phpqrcode/cache/mask_4/mask_65_4.dat000064400000000214151165347060014072
0ustar00x��K�
D������t�X�Й.4�E1^���hv��O��x���W��0�JHŻ����z[�^܈�[v���
y�y��Z�k�=`���v�c�ǃ�<ȃ<��C�/)z�ܑ��������C���""libs/phpqrcode/cache/mask_4/mask_69_4.dat000064400000000216151165347060014100
0ustar00x��;�0CwN��\��~��;C$3�$<)/m�����eΥT��2��:�]�^VV�%��zA�n�pv�s"y�y�y)z���d�u6����G��ȋ���i^��/<�t�r�rr�)9ͤl�r��.���libs/phpqrcode/cache/mask_4/mask_73_4.dat000064400000000225151165347060014073
0ustar00x��A
�0�yM��顴)1�-�lE3�=�}��(��9�T�d���E/eO	ZO����ŻK�Y;�pS5�+���N��I����|
"�e�v��+Dݓ�Ns'O�W�k��I����̞��F��r�i9�&��	�]?��Alibs/phpqrcode/cache/mask_4/mask_77_4.dat000064400000000242151165347060014076
0ustar00x���
�0E���?��jFe8�0�
u�N�0����lB��6�:�h�<�����C�e\,����ܗ~���&rd0
�Sz�7z+��o��������V�u�:�7z��Wo����S�)���mo�3�
O��y�;:*h��>��a��Celibs/phpqrcode/cache/mask_4/mask_81_4.dat000064400000000231151165347060014067
0ustar00x��A
�0�yM��y�XEm7"89�2�Ѹ��Q1ݳ��+�x�x;��t35DIY��1x\:u�����}�e/
��#���Th<
���U�Bz��<���5�G<���5{�G<������5��<饫>�]��U�r��xu�
�
�libs/phpqrcode/cache/mask_4/mask_85_4.dat000064400000000232151165347060014074
0ustar00x��1
�
EwO��r]J������!`�7<�	jv.wO�j��搑��>˯����׷y
ھK@[%�"��^�W��5ӟ.�"�L��͋�R��+�^�W�20P��x�+^���e����?�:�f0�<��.�z�oN$Z�libs/phpqrcode/cache/mask_4/mask_89_4.dat000064400000000244151165347060014103
0ustar00x���1
�0�ὧI�9��% ���
V��ڀf�r���0}�z�=�#9�����ҕ:���~�s��1BՁg&�4p�g�q.p.��&g���T0�5�rg��sg�q��rg捯�u�3��8���k�.Egm��b*��&�7����?���
�:�libs/phpqrcode/cache/mask_4/mask_93_4.dat000064400000000250151165347060014073
0ustar00x���K
�
�ὧI��n$}P�ŌB�]��N��@����%s�fkҫ�}Cz�oA}aʽ2�|���~��D&�l=�����Y����w�q�}���q\�E�Y��j�K_��y�w�q�wz$=��=�;��_݋��>��+�p��H�����9�D�ilibs/phpqrcode/cache/mask_4/mask_97_4.dat000064400000000260151165347060014100
0ustar00x��A
�0�}M���y)�^Z!����q3mXЈg�ދ�$���P'?�{vﻕ�r�u��3����vuijSW�i�M%|W���Kp��8�!�A����a���Ty?ep�q�<0��8�p
��[ɭ�%��8��_�W���T�ϭ!ϭ.��8p�pH�y1�>libs/phpqrcode/cache/mask_5/mask_101_5.dat000064400000000340151165347060014143
0ustar00x���
�
E����+�%=�M�3Cbv�
Ѭ���Nkû��gq�kqq{�%�O���o��,i���K�e�e�3[�|��i��������V��h]`�`�0�ʕ���z˴T�0Gu��/q�8F��1���3�:W��>���#��ȕ0c0�Q�8��E=F#��+a��X�͞+cV�%9W>��Q�]Tk���Y�-gL���q�D�艋�libs/phpqrcode/cache/mask_5/mask_105_5.dat000064400000000340151165347060014147
0ustar00x��A
�
�f����%Y��Ȯ�5�/ҙ��g�QѫݾC�up�<s�I��L���O1����d-�&����t1"�h�ɴ�&�G|�v���U���O�{��N�Fy/ˀ����9b���lt�7�{Y\�/Մ��{ܹ�{�{�=�y���sa�`��{�=����q�����s�뚢�O��y/��^�[7M����{Oh*b/���&�<e|'�libs/phpqrcode/cache/mask_5/mask_109_5.dat000064400000000323151165347060014154
0ustar00x��A
�0�yM��y�R�ZzH���"�ԐqY!�-�*��ݞ=���mQ�_k���^[J~�o�����U[]��vq�e�wJ�-i�5-I�k�
&a&a&��dr�B�N&��q�����}C'�It&a&a&�I�$:�N�$L�$L�$~?��D'�I��I���2)�����zzrdR6�7Ԧ�\>�����j�m?�UߛZKqC��\libs/phpqrcode/cache/mask_5/mask_113_5.dat000064400000000365151165347060014155
0ustar00x��
�0D����^�6�I�63[�[EDq�c���+��j�y��81��\c
��7�c����?u�}DK�4�}��,�kk�g�--�3[���U�Ƃy�UX�UX�SV��:ϫ��՝��,��|�кS�����⫰
��
��
�Vɫ��*�X�[�*�
��
��
��z�U�*�N�V�*�J�UX�UX��S��Xi��jTi4f��ZkU^���_���~�U��x�}ծ�Z/rlibs/phpqrcode/cache/mask_5/mask_117_5.dat000064400000000363151165347060014157
0ustar00x���
D�|M�n/*{�M���+��p�I_&m��-��Ѿ�C����3�2�u�?o-kgB7wc=����U%y�o�R�hӯșDo:ֶy�R�JkQ^a�a�a����qOg�iJ���;����qOg�)ӊ��0�0�0��[�v�ö>�=>���0�0�0�Of�z�3��=>���0�0�0�.�3���Z�$�׷8\�p���w4���:��Z�p�:q����X
7libs/phpqrcode/cache/mask_5/mask_121_5.dat000064400000000400151165347060014142
0ustar00x��Q
�
D�s��ۏ���[+'Ҿ(R�bC^ѽD(��ó�d�Y9$�o�!h�9���ߛꨳwT��[���X!gM�����\��]�6�[�5��V�4䑙sb�a�a�a��ٞ��`{��sc��K�<��\fΉuF��mt�a�a�a������M�Lgx/���D��mt�a�a�a���6g7x�,/�n���6l�6l�6l���߻9�Yy�f;�>F���Wy�N�\/�B�yu^�m���a�(�Ծlibs/phpqrcode/cache/mask_5/mask_125_5.dat000064400000000401151165347060014147
0ustar00x��A
�
E��&���fc;S��$?����؏��Q4��Ya�hûyJ}9�g=��=�li��.;nh_���wz����.��q�CW����ȧy��
u���Pk�;��<��<��<��|*�q��,�
m�kW�q�N�l�%�
����y��y��y��y������^��2䰅sX|���a�a�a�a�3ϙ9lH����<��<��<��<̿��웁��[���n`�T��q��8�^�v�y����libs/phpqrcode/cache/mask_5/mask_129_5.dat000064400000000403151165347060014155
0ustar00x��1�0w�F���$uPXFC�S���d��Pq�*+f���P�{qծ�*|��
��b����=��l���wo�=d��!�7��wZ��A�>�X�X���*/d�~�A͜�c�fV�YX�,C�o���/������y���/��H���@^
/����������y���/��H��oe�u�uj�>�n;�兰��]_m�;��N�Y�3���>�JNtlibs/phpqrcode/cache/mask_5/mask_133_5.dat000064400000000373151165347100014151
0ustar00x���A
�0DѽOc�r]4%1mCT������xΜ[Dv�=��{F���E�Ϗ���q�?ݿ�9�keѭ�}�'2^��c��4G����:�3=J�K-��F0��`#��H��w�'#�<{�~�Z4�:BG舻F0��`��G�~���:��`#�?�#t���w-�`#�?�#��#t#�F0r����}Q��}e����R��;�<��C��V�}ї�����Y-H�libs/phpqrcode/cache/mask_5/mask_137_5.dat000064400000000444151165347100014154
0ustar00x����
�0��>M�/��k�1m���X���=������h����s����H"�k	�M�:��3q�O��W}�9�Ԗ�I����H�1�G;�-��s��ڶ�?�[%M
�	v���#;�zg^��3�d}�6���9��Ψޙ�@7��҄���#g�v���`;׳�ީ\�$������w�l�v���`�v�;ލ�}7�w�ߑ�a;�v��kA������#g�v���`�=N2w�xg�WӤ@n?��c}�SQ�:�Zd?+���9v��z�)�����Plibs/phpqrcode/cache/mask_5/mask_141_5.dat000064400000000451151165347100014145
0ustar00x����
�0��=M�/��t"�
u�|Y)��Ԙ�iF[[�fY�ly��jR�f65���MM����}�5_�M�=~�~����L��TT�l���u%\��G���ŏ~Y��",�7aq�)La
S�������|j����ԝ��E�⤑4߄�
��St��S���0�)L�1%��J>ի��k�'�\j��N�):e�)La
S���Ҙ�O��^��K�������0�)La
Sޡ�O��z��N�):�)La
S���U�J8�f�M���O�&�ϧZT>�s6P휛4���
�Z�R�&������libs/phpqrcode/cache/mask_5/mask_145_5.dat000064400000000454151165347100014154
0ustar00x�����0��>M��/�(�xt��BqCR�;n!�:Eu��p^���ӈ���Fm�F�l���F[��s�rD����:�Un��R�����b���X&_i1��Q`a
kX�ְ�5�a��ٯ�Y뭍��v�Dj��_Y�C��v��5���ְ�5�a
kXÚ~���E���5���ְ�5�a
kX���kg����}m���5��?$ְ�5�a
kX��~ͽl��5��װ�5�a
kX��m����:��nmkQ�?Zh�ӯͧ)�Z�Fyutֆ�G�svH\SG��libs/phpqrcode/cache/mask_5/mask_149_5.dat000064400000000462151165347100014157
0ustar00x���[
�0��&���c��}-s+'���^;A�x���=���Q��_gUݏﵪ��x���G��T��ȺV¹�U��UE����_IǴ;���T1����̠���
]W2�
�2���|o�5�u��ꆬuI�:(W�K�U躒�rP�Ad�Ad�A;
v����o��_zNO��{2rP�A9�
�2�
�2��9���}�^O挞���r�wQd�Ad�A�n�����M�A9(d�Ad�A�^W���Z��.+��G�^���K����`׵}�`_F����klibs/phpqrcode/cache/mask_5/mask_153_5.dat000064400000000463151165347110014154
0ustar00x����
�@�w�f�����Ь`���D"I���e��<:a�u,7��Of�۳�u��P�6��~��s�z����s��,j�լc����V��Zvߨm���s^u�H�Y�u�&�l��&�l��&�_�9������
;]��^�js�O;�ܔ�rSn��&�l��&�l�9��yכ���zA���rSn�M6�d�M6�d�M6���ރ��@/�$7�ܔ�l��&�l��&�lzŽzA�C��rSn�M6�d�M6�d��Ol�7ᰚU�u�N��֛�F��c������P�P���S�,l;H�O�libs/phpqrcode/cache/mask_5/mask_157_5.dat000064400000000430151165347110014152
0ustar00x���1�0D�ާ��ri��(	r*���
�\��~>C�*���v��s��]Ŝ_{W!�zﶬ/�������)�˙������v���V���6�V��޻��,f1�Y�b�����n^o��>���\O�]���,��,�b���,f1�YyV��g�Y��Y��Y�b���,f1+�ʳ�<˳<˳��1�Y�b��Ŭ<+�ʳ�,��,�b���,f1�YyV��g�Y��Y��Y�b���,f���ukys77���}�v����mb�=�w�sw�)�tW���:�libs/phpqrcode/cache/mask_5/mask_161_5.dat000064400000000510151165347110014144
0ustar00x���I
�@���Dp@
�o|m�	���rHk㨤�~c��o�^��Jz�װ��#5l���¦S_92����[�}����ZÊ���=��T�2�ƀ�P��2[cV�衆�C�Yf��'-���X�9>�v��~u���sK5�`�e�,��2�,��2�,��2��-���//�/o_q�}K���\��r�e�Yf�e�Yf�峖��o��+�/�,��\f�e�Yf�e�Yfٳ�e��x�B.�e��2�,��2�,�̲g+����l�\��r�16�,��2�,���<�v.�r륆��޼���rO5����s_�Z�ɔu�I�_���*�libs/phpqrcode/cache/mask_5/mask_165_5.dat000064400000000514151165347110014154
0ustar00x���Q
�P�W3����aVr��S$
�9��mD����Fmc��\vܙe��{����ZԸ��z����W�s��YƎ�Z��u��r������j�����v\����cJ-��K�g�q�g�#�!=�j|�ޥ��˘Z����{n��ĝ����r\�3�8�3�8�3�n\?���xL-��s��r\��q�g�q�g�q������������r�q�g�q�g�q���=�9.��g�q�g�q�g�;)�q�x'E��q9�:�3�8�3�g�;��Zֈu�N����я�ˠ~�~ι�L������j�_Z�!ulibs/phpqrcode/cache/mask_5/mask_169_5.dat000064400000000520151165347110014155
0ustar00x����j�0�|���/�ni��K��'���.r�:�T-m&�Z�x9�y�q�3r��Og�v�OO_zׯ�u`]��ȷ��it�ا��t���il�oc���1�3j9�%_g|�ԧ��)���>���>�ϰ�=�te�&��_�4����=�t�U��}�/��>���>���>�O���r�5/u��>�/���g�}��g�}��g����O����sv�O��}�/��g�}��g�}�ٷ�G�o-�w{��r_�{�g�}��g�}��g_���n��<r_��}���>���=��n]�4Nk��β_���M��������8�m?�SF��<�libs/phpqrcode/cache/mask_5/mask_173_5.dat000064400000000552151165347110014155
0ustar00x���[
�0��&���G1��g�D)[�Cz���eD�ѷц�=R�N�6����F��Jm���Jq�P�}�x�s���_��}��G��F�y;���
[;�]���e�k[��QbT�m�y�&0�	L`�̄Y?���ر���w؛�	�f����c���VN��9����&0�	L`��ׄZ���}0=F=F9AN���L`��&0�	L`Bz�Y�fI���=F9AN��&0�	L`��&0�	���fI��s�r��
'�	L`��&0�	L`<i͒��"�9AN���&0�	L`��V��aB�X�"������,U�m�>��
=�w���Z�gBΜP���!8libs/phpqrcode/cache/mask_5/mask_177_5.dat000064400000000561151165347110014161
0ustar00x���ъ�0�~���ܾح����uO,"%
��:$Xui=��Ѷ��Ճ���g�Ƹ?Ώq�.��So~�z׉��W�:�=�h1c�q���]�Ƕ��i��!�����r�8Ɓ��`+X�
V��	�������j��j�;�8Ɓ�X��+�
��oV���`+X�
V��?[1�^�h-ֳ5Z;�����rmS��+�
��oV���`+X�
V��;���Z,��Y�M�B��+�
V���`+X�
V����Z�e��ڦ}�r�\!W��`+X�
V���`+�3�Km�>S�B��+�
V���`+X�
V��c��㊛�{g;�^Qq5�ZU���ݮ��Q�L�0+*&YD�q����*6libs/phpqrcode/cache/mask_5/mask_21_5.dat000064400000000112151165347110014055
0ustar00xڝ�A
 �f�+���(\=İ�H=Ԍ��%������*�@�?6+�5�����%��]^�nҡ�S�libs/phpqrcode/cache/mask_5/mask_25_5.dat000064400000000136151165347110014067
0ustar00xڝ�a
@!���4�޳ʢ��
?,"���"j����?n<�O���a
�w,l}rG�M;Ϧ�9[����_���x|���=�l4lK��v�libs/phpqrcode/cache/mask_5/mask_29_5.dat000064400000000150151165347110014067
0ustar00x�Ւ]
�
��=M��_n0W	.��=-��4�m�y�B���+����R���􈋆$��ƃ.=s/,+�B�7�󳝍q�z�~�q>=G���Z�y�:��DR��libs/phpqrcode/cache/mask_5/mask_33_5.dat000064400000000152151165347120014065
0ustar00x��SI!�����Mƅ8B5-�!M@�j_�\�L���@;�:�x���B�І)�Hy	����q���b?Do�:�Ƃ��[^/+̋�߷��p�|��κlibs/phpqrcode/cache/mask_5/mask_37_5.dat000064400000000147151165347120014075
0ustar00x��Q
!D�=�s���-.�0-}6�%��(��=�$�Z��e�B�����2N�0�#�i�sE��0P�^�\��2~֥7��V_�ø����$F��o��libs/phpqrcode/cache/mask_5/mask_41_5.dat000064400000000157151165347120014071
0ustar00x��TA
�
��5�?7���XMtxҴx��	��?@���7@�~"�N$��S�ɰ�{�+C���A'�r\P�p�<ޏ�-�	ͺ:S3s�ԉ�ۻ�ީ�z#��qw���	>�libs/phpqrcode/cache/mask_5/mask_45_5.dat000064400000000220151165347120014064
0ustar00x��UA�
��5�?���U:N&Z"��:;4P1=�bNvSG�M1��˛�n<�v`q��{���Mg��4��=G�-T���?����='k��u�ۭ����>���'����(�κ��	J�{E�ѵs�]�	,�sq�libs/phpqrcode/cache/mask_5/mask_49_5.dat000064400000000222151165347120014072
0ustar00x��VA
�
��5�?��*jL+�d�Ť�ν^a��A�ah�r�4���٩�'\G�d�P�����9�e�ro
#Ñ�q��߫�!��W�{EV2	�^��q�u�ѡT�ޫP��8���?����S�����\�P%�[libs/phpqrcode/cache/mask_5/mask_53_5.dat000064400000000231151165347120014065
0ustar00x��VA�
�������"�zYf5Ɛ�JC	�
�A;�����l�\�,��d�R.�\(�e_�
���еaNi5��\ż������aLP��(����;���2ש���j�N6O
u�+��l{y��6od��^
����C[�%��libs/phpqrcode/cache/mask_5/mask_57_5.dat000064400000000233151165347120014073
0ustar00x��VA
�
��5�?��N�l��Z�HAbB�Z0a���M���d`1�z�'"<Ր1��9nvͨ.��)�bݻ�~�;�<K���ھx_���Eu3�][�/[T�o�J�ϵU羁�4���v�	H�Pn���|����Im!w�L1/8,g�libs/phpqrcode/cache/mask_5/mask_61_5.dat000064400000000234151165347120014067
0ustar00x��Q�
C�w���C�Ֆ�B���.ݛ�w�p�����Kv�g;��|3:��}�ؓc0þɴ�j���j7(�l�we^�W�J�ɾ��S��w��t_e���Ϋ�T��M���O�s��9ubs=�?���~~���>�9���Z#t�B�~libs/phpqrcode/cache/mask_5/mask_65_5.dat000064400000000243151165347120014073
0ustar00x��WA
!����KK.T��^B	�f�A����sV���D�ˏaW���
1 ̓����`�P=i��>
xh-Z���^-����~q�a%2�x���J	�~�G����Z0��W���ϳ��/*1��,ֻ���ӓ��m�E��
�libs/phpqrcode/cache/mask_5/mask_69_5.dat000064400000000247151165347130014104
0ustar00x��
� C�~M�?��N��%!�Ƞ
�o�Ոn�ZLk�w��oNA�wZP\%-�h-/��c�H�2O��y����w߽��e*-������]��OF��!�iag���4ץb�#ב��]Ɉ�OO-!���+C���7�w{$�r3�Z��QP�$�B��Nlibs/phpqrcode/cache/mask_5/mask_73_5.dat000064400000000270151165347130014073
0ustar00x��X[�
��i�_�T�h`FM!�Ҵ{$s/@�ê�#t�~Bh79!�z8u>v�䷪���b��N�g�zv*��6�1^N+���u�w��޵���!�f^�4T37�Z�n�-���Ny'�����fz��~��S�ɻ/xG�U*����ѻ�y��_3�b&6^3gp��i�w�xʌq����libs/phpqrcode/cache/mask_5/mask_77_5.dat000064400000000301151165347130014072
0ustar00x��Q�
C�w�����#&C`T����6��ƹ�B��(���9�
�'ֆ����ڢ��zk��"h����v.`���cX�B5[�(��F>71�/3��4��Ϊ�z�^'���[�Fyglg��M>�O�TL�4ϔ{�&3�Wy*�ʧb*��`��<3�;����Vo0�/s�6n�����0�ya��[���m�cElibs/phpqrcode/cache/mask_5/mask_81_5.dat000064400000000274151165347130014076
0ustar00x��
�
C�~M�?��tz�U4���"�	}t���MX�2|.�ɋ�˙F\�������~m��4������X�u
ٔ,
��w�:��E�Ƅ>��X���̯=_�]�g>�>���z�מ�/�)5ךk�k�k���Zs��X��X��Y{ܮ��}���~mt������:S#���&;U#)���libs/phpqrcode/cache/mask_5/mask_85_5.dat000064400000000272151165347130014100
0ustar00x��A
�0�yM��y�R�Zj�+��"9�%N�`ܛEռ���=��e�(�[�Q�Z_����Œ��׾��/����NN��j��3Pci%�U�1
�g � ܱ;O5a���J����b@�P=�<�<
��~�)��n������{��g���Z9q���*����
.Ylibs/phpqrcode/cache/mask_5/mask_89_5.dat000064400000000324151165347130014102
0ustar00x���
� ���4����5e���npQ��
G��c��f���l^^�;;b�5;`�k���U͹߮��j`�N�s��O=�\[a6�����~�nL�D?�
�!6����u��F%w�*Ȭ��k��f��77�SĆ�b�Æ�Xodw_���—m�����bCl��Nۙ
ck&��Y��Voܡ�׷Bע�ب�Al6�
��Jj�xlibs/phpqrcode/cache/mask_5/mask_93_5.dat000064400000000327151165347130014100
0ustar00x��K
�0D�>���&���&
���fP^���8BY5��s(im����Ү���=f���3�/wۧ��E��y����Y�Q�wf��[}��
��[�9�0303�ef��̙��3'3=<��K{n��Sg�3��`f`f`��d��ޝ��oi����Pg�7���܇G�jk�G]�}?V/��
k����Wi72�Js�v�|*"f^libs/phpqrcode/cache/mask_5/mask_97_5.dat000064400000000330151165347130014076
0ustar00x��A�
E������f!3bf5�ƼB����|#f=<3l�6<���_+xj����)
��ݩ�y���
�J
�yXi�ܻ�5�Izsٞ�c�u�eQ��
�K�K�K�d)�>,ͼwx�D�ַ.,;��s�%�g,�,�,=���R��ὓ�7u���K�K��T�D��<(n	lY����h�V۹s�ޕ�y�����P��E�<��qlibs/phpqrcode/cache/mask_6/mask_101_6.dat000064400000000423151165347130014145
0ustar00x��k
�0���4�/��n_.��2#�S�H�6�_�P��Z���f˳_���,�7؞��+�%��W���d�–��n�}��_&�Ok;���P��f�>�t�yY��]�ns
�;s��s��,�!Lk��ԅcbL��12c�X9��1��Z�#X��En#;�sv�T~L~L�R��11vs�.�����1���1�1�1�J1&��؍��Ń�1�1�1�J1&ƞ���g��KLƪjl��k{�g�ڞ5�K�1/�ǐ��~,a�����c���$��libs/phpqrcode/cache/mask_6/mask_105_6.dat000064400000000420151165347140014147
0ustar00x��Q
�@D�s��k���B�Z�#o)Sd�}��Gܷ��l�쯯�^�������)G]S�4�S������?�#B�Z�:��+{����s��H�K�N�iI��!��m��e1
RWe9!��`�`��Uy�ˀ�u�:檞����U=w�-�o�ԺwB�}cM�K��蹰{�{�=�y��蹰{�{�=�y��蹰{�wS��cao�i'�f���yO=C�yO=C�y���[����{S޻�=�;�|v4}ϯ2���0�libs/phpqrcode/cache/mask_6/mask_109_6.dat000064400000000401151165347140014152
0ustar00x��A�0�~���ρDBH�C�H�V2��0�n�uo��l�쯯��˻=ۢs9[���l'���?���7��R"�&���2����:7QqX_�n�
��]�$�՚�EIY�*���L��q0	�0	�0�{LJ��з(s\�ɳw��X�-�7^��It��I��I��I�$~?�N��0	�0	�0���O�'�It�g7L�$L�-�����Iuzrfr
M��^�'}�������(�O~R��]1Y��L�Ğu��9�Q�ӕlibs/phpqrcode/cache/mask_6/mask_113_6.dat000064400000000457151165347140014160
0ustar00x����
E�5�N���Չ���bF6�on���,m�>�gS�9���RW���c�Ǖ9�&�%�1���_��cx=
GR^���w-z?��dz�v�=�,��}ԥ?ǹژ�:�9�m�=��=@U���䲉�UX�UX�Ve������~�by4W���i��:�e=��<SZmAW�UtVaVaVa�ZV�5~������V�*����*��*��*�^�*~�wk�������
��
��ZϪb����ayT�f���j�ֺʯj�Z�~����t_@Un����Ѿ�YWsV��
�[|Hlibs/phpqrcode/cache/mask_6/mask_117_6.dat000064400000000454151165347140014161
0ustar00x��a�
F��4�/��#E��v3�nŸ���/m���Y���T���wm<�~?�l�j�G���C�qS�/��6f�tݟ�o�Ӕf^�l'��7`��Z���C�
�?���he���i���Xq4�[ـ�ԉ�a�a�a���9]P�����Y����M<6��a�[��g�:���0�0�0×g�x8:�Y�z;7�C��at�a�a�a���Ʊ,�C��at�a�a����O�U6���8����=�g�xx\��ƑX�Q�t�2��J�Z��:�g��
C+\libs/phpqrcode/cache/mask_6/mask_121_6.dat000064400000000465151165347140014156
0ustar00x���
�0E��5���Z[�&c���<Qd\{�$����+�4��w�\3�Ñ���0f㘃��������%_��[G��z%LjؾW��r�S�d��*s�>�F�����ڪ�W���v=u��׀�Q�Λ��a�a�a��e�v���K���vTKf5�e���ool+��Ån���6l�6l�6l�6l߄�u�v�w���\�QK��%�mt݆m؆m؆m؆�?g��jɹ�$��n�۰
۰
۰
�wb;�@�̶����v�j45�.�nJ�S6��\�w��VKj{�Fl˿hSv�u�H�%;{��}libs/phpqrcode/cache/mask_6/mask_125_6.dat000064400000000461151165347140014156
0ustar00x��A�0E����r3���&H�
�y�b+��Slh�0Ͳ6L��wE��ѿ��fǮI����v�;���&vw�,o��]u�d�]|�k棘���9ԊC���}�s�1�9Jw9ˡ�Zb�=���PK&�a�a�a�a>�����ɼ�Æ�$<>�O��v��'���C��yt�a�a�a�a~���|���'9li�Σ��<��<��<��<����I�æ��<:���<��<��<���ٕ�W�Dz��y�:.z=��
�ݓʯ
�s�V�öE=ll�_k0_#v���ί�m��jlibs/phpqrcode/cache/mask_6/mask_129_6.dat000064400000000466151165347140014167
0ustar00x���
�0E�����`ILA���Z�IK��؜xcY�R_����_5�
�w��k`�W\�
�,����o5߼'��Ė����qU�~��_?�g0��u]2*=�[|�V���S�9mmKl��
2v��mX�X�������C\�L�ܭ�V\2={�FZqq�)�L�_��P�_�8}��@_@#�,�,�~��_�/��h$X�X�X�/����}�����~�@_�/��``����1�=��;ٴs�_��t��5��~!�w��M�Λ_x���f��/h���fj[�libs/phpqrcode/cache/mask_6/mask_133_6.dat000064400000000450151165347140014153
0ustar00x��A�0�~���ϵRI	m���2���d�'s�RG��{�>���Q<��{X�_�ZLF{Y~R���N�����8aDT�%#W���6_�yE�~�����1��yxƶ��5�Z!�Ոm��ub�������#?���;���̳��!���|(|�iAG��Z0#0#0����G�#�:���������G�#�tAG�k�����~?����#�:#0#0#?0���2��f?2�l�����ř:?r�~�����~�w�È���@�:��sQ�x�#libs/phpqrcode/cache/mask_6/mask_137_6.dat000064400000000543151165347140014162
0ustar00x����
E�5�?�e�����^�4f�H�p[1-e)UQ�V��]�U�W�N�5��o�*8|���۩�W����6�bk?���{�f����|>�s֪��r6����6����6�rҟ�=��v�ڲ�Wy�����-��'
��Ο���;qtQ�E>U�϶�f���곭�x�N]Tc�(s❮7t�Aw��`v`v`v`�kv�wf�wt�;]����;����;�;�;�;��!ޙ;�ao��]���;�l�;�;�;�÷�|ʷ����������(3}��l.��?��"މr}��;�\}�S��-A���w�<9;�EV�'�ם������libs/phpqrcode/cache/mask_6/mask_141_6.dat000064400000000545151165347150014160
0ustar00x��a�
F��4�/��c����]�زȐ���[���=��[E럓���s�m,��f�n/�|kj\��j�?g����[q��(NO�Zc5���SGGP[oM�V�ָ��f���v�L<<e�
+�Ěa*XG6���)��)��)���cL�S�6�tj�M�]o���W8�D~�O��D�`�?�׆N�S�k?��)��)��)�*���U�)���?�SI�=
t
�B�X��L�L�L�T5���Oq��Q�S�:���`
�`
�`
����3_��E��)t
�`
�`
�`��L���yb*?2��T5i�?U!�K��*�x�T7i��o��I�EI���R��E�uJ+M�7��'libs/phpqrcode/cache/mask_6/mask_145_6.dat000064400000000545151165347150014164
0ustar00x����
E��i�ܖLD�f6z����X9^ZLSڊG�T�~�WUıڣ�߁{�F��m��|��ڪ�$uMt�Q�)�jۭ�e??�Ȗ(C֮�ﵳM�����;��'�c�U6��::�V�o��t�MW\��g�Xɶq�2	�`
�`
�`
�`
�n�����7���E-�؜���z�R���Z/ٮ�Q
����k�!a
�`
�`
�`�X�_���&���A��5t�9$��������k�kw��X��F�5t
]c	k�k�k�k|{���Z6��k����`
�`
�`-��~����h�Y�I��_Kr�Z�[ﯩ��r�<Z%6����ƚ�i��պ6bmyyD��libs/phpqrcode/cache/mask_6/mask_149_6.dat000064400000000562151165347150014167
0ustar00x���
�0E��5����f��47��8UD�6����2�z�m�pߞ��k8�����}��G���ӕ��N}?}��W�:����gu�WA�ˌ7~�;�)����Ø{̪ǿ+�WP��Oۢ���r�E�\j�wG)y˖�w���A�A�A�AM%���2��`��2��d��l����|p}�eqP����
:�� � � � ��ej想=�l�T5��ɠ�� :��
� � �
���G��{��d��d�AtDaaaaa��&أ�&�w�
:�� � � �
�1����-MRb0��W�f�
��uz�5�&Y�iIѺ��NрA���P�QS���L}4libs/phpqrcode/cache/mask_6/mask_153_6.dat000064400000000557151165347150014166
0ustar00x���Qn�
��wN��\+56T��n�2�>lYQ�7d�?Fxk}���joex]?��'#{�>�Y��9��UB���Y�yΖW~�{|���V�_�.����c���`�DK��1Ј��q/��'(�p,�jq��#aiY+XZ܍�Mlb���&6��Ml�`3i�y�,}�rg6�yY�,-�b��]9�;��&ݤ�t���&6��Mlb�O�f�|3f�y/��
�I7�&��&6��Mlb����S�i�k�=����&ݤ�t���&6��Mlb��C����9�I7����&6��Mlb��a3�l�'6�*��l^U��7�L�������^�U}�}^PX}��g��)g\�讛5U�k�clibs/phpqrcode/cache/mask_6/mask_157_6.dat000064400000000513151165347150014162
0ustar00x���A�@D�}�f��D�N%���n�ç�,�֖�SV�V�>��W��ó��C�a�z�6���U��~һ�{`n��������ݻdvV�y~�r��Z�"�q��k{>g$��XK���U}m\b�ja�G�x��,f1�Y�b������]�z���̞���^��.��5�[?�嬜��r���,f1�Y��Y>�g�����rV�b���,f1�Y>�g�,���rV�m�Y�b���,f�,��|V��Y9�Y�b���,f�,��|V��Y9+g1�Y�b����ً	�̦M7>2{9z�϶h�m3��l�|�9�x�ټ��#f#�x�6	���-�v�%�N'libs/phpqrcode/cache/mask_6/mask_161_6.dat000064400000000617151165347150014162
0ustar00x���Qn�
E�V��\��N��4M����edFs������ү�M��wU�uy��59�ڇ#�X��Јe�j����V���(�m����kk)��d�u�x�ڸ��9�v�����ԣ��;��v��E���MGlicw`��Έ
D,c�X>��>�d���>��v�N��j�ɞYӪV�u�b���!��M��2]��X�2���e,c�X~�e��;�������k���]��t�.c�X�2���e,c�Q����/�+�/�L��2]�2���e,c�XƲ��esE����t�.�cc�X�2���e,[[!_6W��
�L��2]�2���e,c�a,'�t��5eIey�K{T����>)_���~Η{�\��|oE��W�{+,�J�{+f].X�9?+?�libs/phpqrcode/cache/mask_6/mask_165_6.dat000064400000000620151165347150014160
0ustar00x����j�0�y��_n���F"�w�ǖ2t<�~��Z���-�/e��~m�������/[�kޗ?椋����O~�ڼ/����۱�W�������_��Z{�=g�Ik}/wO-�U�����ߥ�5i�3|�-3[�R�ޑɽY6�-��d�q�g�qƗ�S�Տ�J�n����J��-e}��^���J��LJ��1�5�Z��ݹE��q9.�g�q�g�q��1��z<������q9.��8�3�8�3�8�	����V���179.��g�q�g�q�g�3)�q��x&E��q9.�g�q�g�q��L�z�=0�I��r\��Vg�q�g�qƟd<v:�o�sg���gII�Ǔ�P�x�
�_ϓ�tL�<)Øۣ���$����x}B�|�7�libs/phpqrcode/cache/mask_6/mask_169_6.dat000064400000000607151165347150014171
0ustar00x����J�0��i��9[�J�ɘ�k{�1�b�!g�nhHkS뉭-�V?��KI�����ׁ��1큏�1��ƣݎ/��������`���/z�)*�=��3ڏ�g6���^k6��5�C����Y�<�K��kM���[�y@�G�&_=~���>���>���㵾�+����'{��է_�Vˊ�x�-�J��<ӛܗ�r_��>���>��i��;�����r�O��}�/��g�}��g�}�ٿ�}����}���x�O��}�/��g�}��g�}�ٷ�G�o/�{{��r_���>���>��o/�z�^����#�����}��g�}�ٿ���d��'�ʳ�|�QR��NS��3���������Y����ڳ��Z�'�ms�E�Ƿj�5�libs/phpqrcode/cache/mask_6/mask_173_6.dat000064400000000655151165347160014170
0ustar00x���a��0�9Mr���M
S�*:a_-��5hh_�)�u�Z֭[���l��o�ےs��mK����N�{��H�?x��`l�#f�9>�ڟ[���e�Єώߓ��	�?�^��m���*�/K�m���h�y%��v-nKl������kK�L`��&&��	g5����(�g�wx�Y�ܞ���a¬�pVc�Z[��#O=��SN��9����&0�	L`��DŽ��	��'t�j�j�]�QN��9����&0�	L`���s��YRc�@�QN��9�	L`��&0�	L`��"�YRc�\��
'�	r��&0�	L`���E�����H9AN��&0�	L`��&���7�p�6�`�|�����hm��s��
���R5����Ƙ�ȉ	k\�X/��	�	)�g9�libs/phpqrcode/cache/mask_6/mask_177_6.dat000064400000000671151165347160014172
0ustar00x����n�
��{���ڤ*4v۴u���1����{<�L�Gi�K���GU�����]�m�/�6���j��?mZ�m�z�y/�ξg�j��\�Փ��<`�_��>f{�����_�,�,K9o
4�ǵ���7l���niJiggi�r<�-MG�
��
��
��
�xuV�+z��R�C�r9�+Gq�6�QW��b"��Qe��"�WL����+�
� X�X�X�X�X�/��|~�j,�n��mu�M���ۤ+�
����
�X�X�X�X�X�Ya,��X��;�M����+�
� X�X�X�X�X���e�)o�<S����+�
��
��
��
��
��
�0��X,ަy�t]AW�X�X�X�X�X�;V�H��92m���e3��Wd�Q��be�Qؽ�]>Ә�f�|�����5��H���늚�7/Dlibs/phpqrcode/cache/mask_6/mask_21_6.dat000064400000000127151165347160014072
0ustar00xڝ�Q�
C�9M{��i]��X�1����-�C!����D�7
W�ٜ��&rD�)~�]<M�
�3(>{��A����a��S�libs/phpqrcode/cache/mask_6/mask_25_6.dat000064400000000161151165347160014074
0ustar00xڝQA�
��5����2)�e+�(Xm�Zt�*(�ڹ�;���tJ�<峂�_ڤ�3�o���ڴ"̢a�zh}�&qv��SG�֙,�-���J��4}���oS[��}wlibs/phpqrcode/cache/mask_6/mask_29_6.dat000064400000000166151165347160014105
0ustar00x��RA
�0�����Xc����L(4E�ԈB
8C�ܾ޳n�M��+lǝ��ՆO��1]�&�ڍ�4U�D-6-�$:6�dZ�?y��l��f�?�
�8?�߲�<�l�}��g�g��*libs/phpqrcode/cache/mask_6/mask_33_6.dat000064400000000174151165347160014077
0ustar00x��S1� �y
����+��H:96r9MI1�	4o�
��7��Am�]e�X���8��ZVQ_��<��
a(�b��
�����7FF�1�2/�d^������*�����"�Ru`��olibs/phpqrcode/cache/mask_6/mask_37_6.dat000064400000000200151165347160014071
0ustar00x��A� &����T
`���j<P�0��jB#�&���,Yo���fU��j�*U�Տ���Y���[��oY5�~�5T7bnb,��]�˘�������-������qF:s��t�Dc��h�libs/phpqrcode/cache/mask_6/mask_41_6.dat000064400000000204151165347160014070
0ustar00x��A!����ݬ����Z	5
���,�E;���?߻e-<-9�g���Ja��#�,��MSM�]|�F%C�*ht��~�Ž̢Yo4�"`����,b�c�ɺ�N�.��s{�9�z�@5libs/phpqrcode/cache/mask_6/mask_45_6.dat000064400000000275151165347170014105
0ustar00x��UA�
�����I(t��&�hL�v���ì3
����}�?�q���4�p�g��i�rk��鈿YsR��繍i2?n��]���&�(CF��f�e�`��?��N'.$	��hsYbe	:'��Iz�5���_'_;��}�d_2'���:ar��R96b՝>v���b�'J)��š}r�D"�Tlibs/phpqrcode/cache/mask_6/mask_49_6.dat000064400000000271151165347170014105
0ustar00x��VQ�
��i�{K&�����YX��؁�0�̦!=���t��n&��fp�WL
�`�/�<ϓKVrU�\1�bGp��@��ӑ&fN�/+ƽq����`���AW���S���RGp��_5|�|z��xν:����J��+WE�m4h�4�3tܭ�.��A�g`\�����ʤ�*��F��libs/phpqrcode/cache/mask_6/mask_53_6.dat000064400000000303151165347170014074
0ustar00x����
E�����-M��[�s
����Z7]Y�&�][�
O�;|�X�8���?��^2N=<�F�B�Uΐ8�S��V�>��e�L><3�*=Ǵd�#P%�t8Zz�f���R�D�K{��~Dj�f��!�����C���3�*�p��!V�Z��
�弶����6�sY�Q�y}֒��mF�<*B�libs/phpqrcode/cache/mask_6/mask_57_6.dat000064400000000313151165347170014101
0ustar00x��W��
|�k��K���Q�-�^@c�"Wr^U�Y��M³>_ݏ`���8����G�1��`�B��`;��+���}����&s���]<�J�QF=mb3
U�F'��6�Ɩ�E ��5�Ja�wZ��60��
�[���9���9���{��S��\ݞ8��`k&���os}{�[R���[�+��w��O��d^jWlibs/phpqrcode/cache/mask_6/mask_61_6.dat000064400000000303151165347170014073
0ustar00x��K� D�s���ڤ�E~݂�ih��'�
����N�'oVW���jsp��Cz���ο���a��g!��#WD%~�˃Y?�J�f���R�E�����Ko�ͼ�ǘ��|Ƀˎ*�O�P7�������n�뼽��7�s�`��������s���d�D�����s�~>�<�i�K'�l'��9���%.���7libs/phpqrcode/cache/mask_6/mask_65_6.dat000064400000000316151165347170014103
0ustar00x��WQ�
��i�{K�NLk?��e$�Q�ik����4��1{����`+�!�ڮ�M
�?������1b�8�����.��^��w������sn��Fj�5��EaQX|�=w�@�2v<�ŋŞ���|4w���\�UX�BQz+��T��T���c�B�z�/4��8��,��5�`������ȱ
�OV$
libs/phpqrcode/cache/mask_6/mask_69_6.dat000064400000000331151165347170014104
0ustar00x��K�
@�����dTh���	hLSSE�q	eY@<�+�*�|�窮%���>������z�*7��e����6�Q���S`��.��>�sE�'�%@[��6�@P�0�h
�a�F�xtpl�2�����Q-g1N�feo^����0F�dT>N_�O���w��G�3�u���g���{�3<�[�Ժb?�'6�^��libs/phpqrcode/cache/mask_6/mask_73_6.dat000064400000000346151165347170014105
0ustar00x��X��
|������-�N���M�4���^8��D�i�d�gy���旞��41ibؘ��,�;x��-2�N;┹�Eq�ܹN�>t��L��41"��ˊ�?J�bQ��_�@w��sg����9P�q���5�
�kY�,��dz�⬼��+����#���*�fw?ɝ�`d�cT��;O��L��f����k�U��Һ��w�&fqG�(0��wB陓=~���libs/phpqrcode/cache/mask_6/mask_77_6.dat000064400000000370151165347170014106
0ustar00x����
E����۲i���V�a�.���F��pST�Y��4q��~�z��=��:�͒
�6����m8��:#0Pض�iDy:2Š'��Z�s��&}���滜\r�0\�Ś��Xw��;iP���ȔL�)�S���eԕ�{h�Du9�L��b����J��S��S�)��)��gZ�{��e���)�qJ�d�Lw+�#�3-V0�շl�j����ڠ�S-�S
�9=ݯ��5�PP�q1M�?�g�libs/phpqrcode/cache/mask_6/mask_81_6.dat000064400000000356151165347170014105
0ustar00x��Q�0D�9
�r���R�L�v�k���`���0	�;�i6����\|��_��cc�1��h��u���io��#2��}x*.Y�t�&���
ְ���q/K�;3�v�e�̢Ȋ��A�H��?`]�5��K�����w�!}{Zû߲�W
��yⷾ��^�_y��k�k��^K��ת�b-�b�YSڸ'֜N��u����#M�f�HS�Q?|]�I��A���i�M���y��yuW�libs/phpqrcode/cache/mask_6/mask_85_6.dat000064400000000345151165347170014107
0ustar00x��Q
!D��4�/�B�j��6?
YfA�>cؘ�Y3t��>��3�Փm��b���ׯ��韻E���n�U����l���q��s�;YC�r��j��(�[��s�Š1
�I(�@���7le`��u$��������b@(P>�8�8
Ā�+6���#��F8�#��mjF�|�D�������jF3�ĂU���ꆝ=�^�libs/phpqrcode/cache/mask_6/mask_89_6.dat000064400000000407151165347200014104
0ustar00x��Q
�
D�s�����B�n3B?&��l�D}��63��0q��몼Þ/O��1�cNB��F�Ĝ�Z4����`��`���93�r]=�55�#=:ξ�X�����w��X��5�D�
�A6���؀�
wB�A���J~
2S���{䙮��,U�������3�l�
�A6��A��Fv��߉mxkQ�
�
�)d�l��w������G"��Iժ�7f�����ڼ��cw_:��ִ(���߄�:��S6*���libs/phpqrcode/cache/mask_6/mask_93_6.dat000064400000000424151165347200014076
0ustar00x��a
�0��{���6X]1&[���l)��Κ����L���Ȝ��u~t�������K�����1�>�?p]c��/�n��˨�ۂ�y�=1�w����`L��}��b��ci�۝4�Y_�9R�
Rb$=��
%�3`̀�`&W��|L��g�^��Zgj6R�+��O�̸�"��c�:�:��	̀0f��M���ٚ^�ַ�^i`���M`̀0��̤�Wߘ��[f�������Q�^E�R5p��>�}m��oa�K*M�!��p��&�mRlibs/phpqrcode/cache/mask_6/mask_97_6.dat000064400000000407151165347200014103
0ustar00x��a�0��s���d����Fx[�=4�H���o�j3�4�&�s}�*�����aV��c�&3���5�arW�^a���LCl��z�q�,���1�x�
��SQ�N��]��/Giu�`&�����w�%�,�%�D��Y�"K�t��+�HE'|R2�(v1��v���qi���qd�,�%�D�~����%ػJj�}�ͺĺ�gY"Kd�,�+K��
�]W�t�+sF/)�]�.zN���'`�>���1='#�`+b��l]Z�������libs/phpqrcode/cache/mask_7/mask_101_7.dat000064400000000403151165347200014143
0ustar00x��Q�
C�}r��m��`���f�j��T�#�����54't���f�a�Їo��$�c<��������Hݠ�h8�l�����o=�Ą�ŧ�Hv��;�z��!�|/�F�Ѝ3cf̌�S�ʅ��㍂���8�K�)4�9��Q�1�1�J3f�����S+�w�c���k�3cf캌���z�y�y̵Ҍ��1�{��bL����X�S+��.to{>��mO��J2��3c�<6�Xn0F�
)�libs/phpqrcode/cache/mask_7/mask_105_7.dat000064400000000370151165347200014152
0ustar00x��A
�0E��F��a�Mҙ�N�Px)�pQ���_�~�|ñ(b��F����$.��a�o���W�GN�P�Uǖ��M�%{��o�HQ��U�l�ִ���L^>+��m��#{�{�eo&Y2s�oM�)gncO9s��Z���3w�o���+��{�=f.��z��ޣ�����{�{�=�z��G�c����s�kCQϞp���^��&�{^���N�ʷU����
�e5��}��E�wG��n+olibs/phpqrcode/cache/mask_7/mask_109_7.dat000064400000000362151165347200014157
0ustar00x��A
�0D�9Mr��}��*�_x-d���:�"�NJ��-k�"�⨚���d�{��ջ��������גɬ|<b2+�U�����%Z}�.�q%Gi���h
QA9��I��I��G&��ɞ�<�
o�:�,ub�2}�mބ_
�D'�I��I��I��O�'��$:	�0	�0	��I�$~�D'�w�$L�䇙T�OvLVOO^�<�����O�b��O��O��O��ʛ��t�\3����<�G�ͫlibs/phpqrcode/cache/mask_7/mask_113_7.dat000064400000000433151165347200014151
0ustar00x��Q�
D��4p�˵M�PeQ��6��d?Ը�>'����r�Q5+	s����)�c���7��-���1nn햺q�ɔ���Jtg��^�ʉw�̘Ň-��?�*�&Mm�@ee5�^�
c���
��
����,�����b�\1��3�j�4��T�Z�f���o�����*�
��
��
��:�U��t�*�����������
��
��
��Xů�0<�BW�UtVaVaV�Y�l
ް��k�f5�_�
���k��W5{�����5pn�C��Z:��	bvlibs/phpqrcode/cache/mask_7/mask_117_7.dat000064400000000430151165347210014153
0ustar00x��Y�
D��4p��U�����I�>"�%6�ed��8r�S�Ns��U��n�k5�Xe��j��ު�u����V�Xg��,l`���u���!�h�XZ�\V�lM���|[ͬ��0�0�0���#hF'�c]������i��>����H�at�a�a�a~<��Æz�y�qkO����0�0�0�����㪞F��a�a�a�)��2�˰�fÒ�%��z8���tO=���3�=�����3��:�c�w�
��V$�libs/phpqrcode/cache/mask_7/mask_121_7.dat000064400000000455151165347210014155
0ustar00x��[
�
E���d������i;^az,�#6ƞ^r����h������&����^am���Y�9�_�غ�5C�r�6��t^�^�Wl���E��ز~ɿ|�M��m����mS�}���(
۰
۰
۰}�mQ�]�Z�V�q�]��v�Ѳ"�M�1f�G���,q���B��mt�a�a�a���z�eF�3��cxI��D��mt�a�a�a���m�n�ý$��n�۰
۰
۰
ۏa[}�`[y�����ޖ޻)�n<��4�K�/��O��s�l�n�l�m���/G��libs/phpqrcode/cache/mask_7/mask_125_7.dat000064400000000440151165347210014153
0ustar00x��A�
���ϵ�B�m)��$_�p�V���aA�j����g���'�^�o8��a��Ճ�w7ZJPWm�^%sh�������~Lܳ[��-�R�Eŧ좪��^iu?��	�a�a�a�a���:�ȍ<�������u��f�GV�i
�G��y��y��y��y����������G��y��y��y��y���+�s'������<:���<��<��<��%����1�6��|�=��Z�z'�6���ƿ
�<l�����5�:�)7S�]�
�Ǔ�libs/phpqrcode/cache/mask_7/mask_129_7.dat000064400000000432151165347210014160
0ustar00x��1� �}��?E�1N�
�F�`������D�#�n��Y7�J��i��V9S����	
��Re>\_�p���
͏5���}��ݬ�m����u��&	��?��Ȫ����{wx�Ƃ�#��ڒ��i��w�5��5f��@_�/�```��@^
/���<,�,�,����}���G�X�X��y��@^�/��H����B3+>7}�,�.ږ������6���}玅�^�ξ�=Lw���wS�libs/phpqrcode/cache/mask_7/mask_133_7.dat000064400000000431151165347210014152
0ustar00x���A
�
F�F��RH1	)������[�R>�N��{�N�Ϻ�l#�6���E��1��Z��|X��i㒑���������[�ӟ�9���IݒH_��;2�m`#�F0�?�$�yn��걫ZO�&�c�w��c��B��9�]#�F0�G��#rD���`#�F��#rD���Z�F0�>�G��#rD�`#�F~b$�<{�H�i�#߅����쭏��OL����#e
)Pr�͇i9r�Ȥ)+l��M�libs/phpqrcode/cache/mask_7/mask_137_7.dat000064400000000513151165347210014157
0ustar00x���
�
F��4��/�
�c���_ǂ+�{�S�K<E�Ӑ�%um�Ĕ�O��c�P�Ns��u���+���ʺ�QS,E)ֵ�^�f��a�_�HkoKr��6�D�ZQ����	F><����o[l
����
��0��7։�V�l;b������7�fM�S���;�1����L�C�<�Q�[+@w�t��
v`v`v`v&�!�	��7�X+@w�t��
v`v`v`v8�YP΂�;��C�;�;�;�saG{��;ڻ>vR�|������K�����M��H�
��#Н(S����q��dlibs/phpqrcode/cache/mask_7/mask_141_7.dat000064400000000512151165347210014151
0ustar00x��A�
E�=
�r�I�TY@��Ä�0!���|1����t�bG0��ԗѤ�s���2Z/��o�a���\�q��z��OnҋM����n���t��X"K��m�eM}���Cp����P�L^����S0S0S0S�L	�)ǔ��ژ�Y߾%��b�,�S��l?�zC��)t��L�L�L�LI2��z���RX�h��@��)t��L�L�L�LI1��z��bϷ��B��)�~0S0S0S0�7��)�|���B��)��)��)����3Ֆ�L%�tf��wM��*:~�h����Z��sn�c��$1UTtJg�8���OY�Elibs/phpqrcode/cache/mask_7/mask_145_7.dat000064400000000535151165347210014162
0ustar00x���
�
E��5��?W6Z���-�^��2�q���bG���X6(Ɖu�"�Lb�b�Gu���μ���Gk��:HwA[�j��m��H���ݞ�3�������O�kQ{l�|��T��Em�Jf�L�?��2"&�����������)�k��Rf����c���̉��F��,��z���=�������5X�5X�5X��7�F��\��p���Us#�������5X�5X�5X���F��d��Y�������k�!a
�`
�`
�`�o���8���ct
]C��C������
gM���5�[�N�%��k�h��Zp�?��Iܣ�ϲ�^n$����Y7A����ZP[�
fȓ0libs/phpqrcode/cache/mask_7/mask_149_7.dat000064400000000537151165347220014171
0ustar00x����n�
��{?
���u�چ����2��G$n��c���F��K����b3���֪t��Pc�̥�7[�?9:��['��9'�*Ӗ�G��a��h�_��/�z�+�6XB�>�2�qY�J�0�黏��Bfa��
1�����9c7G�	�Ol��,�^����꽓�3���A:H�
� 1�Ab���0X4�%٫��#��d>�&C�
���
1�Ab�<�A{�o�G�&�LM��A:H1�Ab��
1�	{�j2����t�b��
1�A&1X�`�_�9���`���B��G_�l�5�:g5��ajM��L�����I�	<|r.libs/phpqrcode/cache/mask_7/mask_153_7.dat000064400000000537151165347220014164
0ustar00x���Q�0��=
��匉B5�
ю惤/�Ͳ���I�i�^-��Zkm|�YDh�9����\{�K����{��y���3�v��̻�E]u`R��r�"��}�Y��e�2{�VV8][�.n:+2_���B�&6��Mlb���&6�`3i�9�Y���Ό諡y�U}ԟ82f-vږ�6��n�M�I7��Mlb���&6���l��7������t�n�Mlb���&6��Ml�2�����^�/�n�M�I7��Mlb���&6��;gxA�C��t�n�O�Mlb���&6�y��y��fP��[6�4��̫��k`v^�+�9�ʬO۱��}�攨��+ZX��=:iWElibs/phpqrcode/cache/mask_7/mask_157_7.dat000064400000000474151165347220014170
0ustar00x���M
�0E�[M��͕����s�_������
�}F��Qks���{�%�Wq���.�������]�8evV��bvV}�_��E̻n3W^K�\�`��V캽�Zl���,f1�Y�;�af��k��ި�i���z����z?urV��Y9�Y�b���,f�,��|V��Y9+g1�Y�b���,��|���Y9+g�7�,f1�Y�b�|���Y>+g嬜�,f1�Y�b�|���Y>+g嬜����,f1�Y��l���i�o��.\��Ɲo<�l;9�:�g[�϶l�m��^�I>=gϙ���-yk_TA�libs/phpqrcode/cache/mask_7/mask_161_7.dat000064400000000570151165347220014160
0ustar00x���ю�
��y��/皨E)Ʈ��1~4����93,˵���+��ZT=Ze�C���.�<s��v���>~iߏ������&>�,����6e�����~,l�W]�
���2������\�;׵2j"���e,�rX�ݵV�(�c쵵ZӖ1���8ީ���/,'��t�.�e��e,c�X�2����߱,_��|yt����|��]��t�.c�X�2���e,cy���/ɗ�ys�.�e�L���e,c�X�2��lo�|�Z{+�2]��bl,c�X�2���e{+��֊�[A��2]��X�2���e,c9���C�X�<���/owsP��y�]��y�}�Vd��氹��d9J�Ӈ�)�1�	jI2�libs/phpqrcode/cache/mask_7/mask_165_7.dat000064400000000567151165347220014172
0ustar00x���Q��0������M&A,N�̨!�x0�&XZׇZ�-Kث[���e�j�����x,����.�g}�`;���+k{��~1���}�+k{�إ���SG�W�g�}�ݬ@�?_��8퐾o+�k][�h�W�8~�u��M�g�q�g|j<������*�q=<�����ۓR�wƓ���������q9.��8�3�8�3�8�I���U�G�?~�snr\��q9�8�3�8�3�x�q����㮁y�979.��g�q�g�q�g�=)�q��'E��q9.�g�q�g�q�wO�z�50�I��r\����8�3�8�_�Vvd}�����a�x˯��5���)�&�9)����f���x�3�YH]�S^*/libs/phpqrcode/cache/mask_7/mask_169_7.dat000064400000000577151165347220014177
0ustar00x���]��0�o5�77��&
��-Lx�ؔ��ڦM[�=�8j�h�絚�W��~_o��;Z��ۅC�:^�F�*����J�j��c��[��k���7�U�>ȫnw�[�p���-�u����5D{~�kV^U��g�}��g�}�/c{�'�J�n<䗥U��O�����cmW�-����ܗ�r�}��g�}��g��S��߿x?tnϢ����ܗ�r�}��g�}��g����߿l�ܞ�r_��}��g�}��g�}����߷���ky�ܗ����>���>��[ˣ�o-��=���}�/���g�}��g�}�Oa?}_����]y�O
��ߏޗg��oO�e
��G��3��i��A���������~���'zlibs/phpqrcode/cache/mask_7/mask_173_7.dat000064400000000625151165347230014165
0ustar00x����j�0�{=M�/�
Rb�H�����rj\�=�,�m�co�Z�8;��m��m���0b���_ߚt$~Wu5�ǚNn�'?d�f2��(o���G�,L�����6_{�z���?
�9�wq9�
�S!ƌ��9�o��2�	L`���p�����O�En�v8L��v8L��	U��Y�"�d}�	K�r��
'�	�L`��&0�	L`B'f�:�O8�TcTc\k�r��
'�	�L`��&0�	L`B�Y�gI��k�r��
'�	�L`��&0�	L`��"�YRc�\��
'�	r��&0�	L`���Eڳ���H9AN��&0�	L`��&�'��!�;��q+�Y��l*�ܳ��=؀�9�j�[2����	Ms¤��Ԅ����*�libs/phpqrcode/cache/mask_7/mask_177_7.dat000064400000000627151165347230014173
0ustar00x����j�0�|M�?WV�bR��nǂ/n%���zQ�����?�V����t�K�|�C�E�?:��3���~��/s|�����.��w��q�6��y�-�V���x;F��>e��>��K�0�}y�,J�~����2dV���`+X�
V���)}�fŨƚ�[�+�s[��حH�+��+�
�B�p
�
V���`+X�
V�+��Qy4�G�c�M��۔+�
�B�p
�
V���`+X�
V�u+܋�^,��Mݦ\!W�r�kV���`+X�
V��s����n�s�r�\!W��`+X�
V���`+<g�^,ݦ�L�
�B��+X�
V���`+X����Uu��naA+�%X���yGaKzGa�m�[�u��ִn��0+jR��9�����4Llibs/phpqrcode/cache/mask_7/mask_21_7.dat000064400000000130151165347230014064
0ustar00xڝ�Q
�0B�=��r]��-?]Rl�����2���nc
�[����n��A�".�j+�i
~�x3<�aX�{H��C1x�)����S�libs/phpqrcode/cache/mask_7/mask_25_7.dat000064400000000157151165347230014101
0ustar00xڝQA�
��5�[F@��a�����Z̲�
�>;��Q��I�QH8R���҈G�"�z,��&��;���'o�97�%P8%�6oǽ�;]�NWn�[�f7���v�libs/phpqrcode/cache/mask_7/mask_29_7.dat000064400000000161151165347230014100
0ustar00x��R9�
��������QpX�$l�Ųf!I2pg�S��MZj������<K.�ط
�Ǘ���^D�/�_y�/�gcxV�0�Bf#��]B�Ͻʳ�h�9޹���^��libs/phpqrcode/cache/mask_7/mask_33_7.dat000064400000000164151165347230014076
0ustar00x��SA�@��k���6���ǒ8��07-n��ZbE0�"���t]���3Ztq��>"�t���e0��#ԛ`�_�1-����c����ha�~/�Eh�4���"��~�	libs/phpqrcode/cache/mask_7/mask_37_7.dat000064400000000172151165347230014101
0ustar00x��T;@!�9
����#����F1a�)VҪ��sj�G?Q���g.���Ⰵ�ֿqq�>
C������GJ��u���4nFC�Gl"����4�)a������{�5�=���n�Clibs/phpqrcode/cache/mask_7/mask_41_7.dat000064400000000173151165347240014076
0ustar00x��TA�
��5�[fDY�(O�^��bR3/~t/L"��7SQQ5�j�\S��i���b��#Նȏ��+ǣ�w#�z�x?�㽧A-�w�u曑Y7$b.%A��;�w�R���oxG}?�libs/phpqrcode/cache/mask_7/mask_45_7.dat000064400000000255151165347240014103
0ustar00x��U�
�
|������1(�Ҽ�
6A1��K�!-9F0�[�u��ǹ�R`����س�ܾҨ��1�<	&�,��~3k�רC��hU
輷���!L�9�y��ceKd�k}	꨹�1Yi�����;�U�b3xL��8'ܧ��?�p'+%��w&�;5&��	�8����TԀ�libs/phpqrcode/cache/mask_7/mask_49_7.dat000064400000000254151165347240014106
0ustar00x��V��0��k��h�C-X.���<�h6̋3���,B
�Ԕ�,�@�ϐ�d5$K�"T|p�%9"�yp�,���=<��m����ԉ!��?���D�W"��(��A�-�\-
J\�{0p�l�WW]���4��?4h=
Z_��d+�g(�*�*�+붵(���libs/phpqrcode/cache/mask_7/mask_53_7.dat000064400000000260151165347240014076
0ustar00x��K�
D�s���&�R�k�i�&,H)�tD�j�=����Qa���P"d�s1ZyC�|hey��Cv�aH��7��+�O��u��Q�sZtb����7�v���h�V���~��1#�~�[�f�����fHkZ�Jt���mZ��6���s���w�r�&C�߶flibs/phpqrcode/cache/mask_7/mask_57_7.dat000064400000000274151165347240014107
0ustar00x��A�0����3&��H)Kb��&�q�֞�[-���֌��9�r��Ys�.��i�Ӿ`����~���G��{c�i�Ղ�\Y<�.�|���2��۟�2�
�QQ[[�^N��88�l���[}[�Pl?g+o*ϖ�4W���1�	�
�33��[�\Gos�bk�m�m��m��^��h�libs/phpqrcode/cache/mask_7/mask_61_7.dat000064400000000267151165347240014104
0ustar00x��K
�
D�s��+-�*5�m��c�aT�1�9��Y�쌧�L9�糶����s�//i���\��b�����ī���-"^�D�H-i�;bnA���7�f�et�7ٷỵE:r�<4�6�(�u�y{K3o�"��|a��o�?ᜟ��竟��p�9�j~N�ƛ��s����TY���ulibs/phpqrcode/cache/mask_7/mask_65_7.dat000064400000000273151165347240014105
0ustar00x��A�
����I�*�6^L!酰��i)mT�T]�VW\�9�e@�4Ku^�#N%:�,��mY��JN��9���ඩ�vA�2���Ϝ�H�"Y����+?`�BXD�BX̽{���.��w���d�,~΂k�,�^�bQ�~�.��\�w����^�ρ��OY��E�JmX���"%libs/phpqrcode/cache/mask_7/mask_69_7.dat000064400000000312151165347240014103
0ustar00x��M�0��s����{1�c-?�6&�&,$Rȇm�\=���e���\ZI�Y�B�kru�P콱��G�����3�h�Z�<7��l��%��3���@�qH\J�#1#1��j=�5���:O��y;/1�{��h��t���#1�O2�ՀcT���<\��ᳳ3��"!�=�`��9F�����!�FŇ�libs/phpqrcode/cache/mask_7/mask_73_7.dat000064400000000335151165347250014104
0ustar00x��X�� |������eKkuŪM�Mx
�^9""�RǮ�@�kEbC�JNmL�]-���9c��xLԺ�n
��;���?�4hc��/5���b������mq0E�Jsg��el}���⁒�Y<(�N����Y�YwYw�]rww���7Bu6��e�e�%w��;W��c�*
w���\��L錍\�)1o��w�^w&樻w�u'Q�fG�Alibs/phpqrcode/cache/mask_7/mask_77_7.dat000064400000000342151165347250014106
0ustar00x��K�
D�s���k+�@L⏪V��`1��GAd[��BS
dzZXn�[A��>'o5+��]95�
��,tY��i;r}ͧ�n4���"�C�vKJEY^��N�@�L��Ǚ�lfn=�XNT��mL�focj���S�]Roe��>e��)����i����t'�7?e��OɔL��i���4�6�3���+�p�����4�68������L�}Zy}M���Vmelibs/phpqrcode/cache/mask_7/mask_81_7.dat000064400000000325151165347250014102
0ustar00x���
D��5�?�l�"͊ݕ�u4�a�>ukv
o�40��T�%9���6����U5�*s�I{`����_�>S?�}(:y�T�l�{G&E\��6��}"A��X��XϬ����<�mwx�f��G�<k�r�U�eεεX��X���Z~�s�;\��Z�3�|y�	/�w���p˯�����U�[~�}O��o�`m�s�ݑ�)~,�libs/phpqrcode/cache/mask_7/mask_85_7.dat000064400000000325151165347250014106
0ustar00x��K
�0D�s���J�m,$i>�0	��y����7������x�����F��χ�V���e`V�!f���.��o����
7���^�Q�
�b@��\H/ץc���Q�L��,�Xy�?u$tUs@s@�1
��44Ā?c��/��/�B�~��/�~�:+�-?`|?`9~�(��-ρ>�s�2Zp�2Z�libs/phpqrcode/cache/mask_7/mask_89_7.dat000064400000000364151165347250014115
0ustar00x����
���4�_n�	J]�D�f=$=���|�kv�B计9.�b{��s&o�֌���y7�WˢkXV�6^̈́�13u
r
}G��8�;gqN���k��Zl�
�!6��Io��i&~�7Z�G�L#)U�F�
�Q������)bCl�
��dž��EoDK+�#�ZTqCqC9El�
��b6�ť6����
��6�R�z�[k��
n����`;����،YWe�Ɔ�1j�libs/phpqrcode/cache/mask_7/mask_93_7.dat000064400000000370151165347250014105
0ustar00x��Q
�0C�u����4uY�Vl(����}qD҈}l�����Ʊ������A~�,�Q��Qg�s?XU��8�(�Yȯ��^��
��9���ZJg~�d�/Ii
�mq�<Ax3cf̌��fz&1��3���ԫ$�U�Gg��g�7q�q���df̌�13f�K̈��L�Ug}+>k�R�ϸ�xo23f�̘�_`��
3��33��-Eτ�L/���4�4��^;13պfB�gt���H��i"libs/phpqrcode/cache/mask_7/mask_97_7.dat000064400000000376151165347250014117
0ustar00x����0������ܲD[���V.K��I�`��'��sx����y���$�x�x�"���=O^&p�b���Yʬ�$�K�ݣ���8K����eÌ���	��3:$bI,�%�$���Yb襶
M)�T�
%q����綦E��X}jl�T�T��KbI,�%��,��_e[%��V]R]�;N,�%�$���%V�@`��%pa�m���(}�_�%�%�۸�����4�='u)ai�.;M��>libs/phpqrcode/CHANGELOG000064400000002355151165347260010713
0ustar00* 1.0.0 build 2010031920 

  - first public release
  - help in readme, install
  - cleanup ans separation of QRtools and QRspec
  - now TCPDF binding requires minimal changes in TCPDF, having most of
job
    done in QRtools tcpdfBarcodeArray
  - nicer QRtools::timeBenchmark output
  - license and copyright notices in files
  - indent cleanup - from tab to 4spc, keep it that way please :)
  - sf project, repository, wiki
  - simple code generator in index.php
  
* 1.1.0 build 2010032113

  - added merge tool wich generate merged version of code
    located in phpqrcode.php
  - splited qrconst.php from qrlib.php
  
* 1.1.1 build 2010032405

  - patch by Rick Seymour allowing saving PNG and displaying it at the same
time
  - added version info in VERSION file
  - modified merge tool to include version info into generated file
  - fixed e-mail in almost all head comments
  
* 1.1.2 build 2010032722

  - full integration with TCPDF thanks to Nicola Asuni, it's author
  - fixed bug with alphanumeric encoding detection
  
* 1.1.3 build 2010081807

  - short opening tags replaced with standard ones
  
* 1.1.4 build 2010100721

  - added missing static keyword QRinput::check (found by Luke Brookhart,
Onjax LLC)
libs/phpqrcode/index.php000064400000007111151165347260011314
0ustar00<?php    
/*
 * PHP QR Code encoder
 *
 * Exemplatory usage
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
    
    echo "<h1>PHP QR Code</h1><hr/>";
    
    //set it to writable location, a place for temp generated PNG files
    $PNG_TEMP_DIR =
dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR;
    
    //html PNG location prefix
    $PNG_WEB_DIR = 'temp/';

    include "qrlib.php";    
    
    //ofcourse we need rights to create temp dir
    if (!file_exists($PNG_TEMP_DIR))
        mkdir($PNG_TEMP_DIR);
    
    
    $filename = $PNG_TEMP_DIR.'test.png';
    
    //processing form input
    //remember to sanitize user input in real-life solution !!!
    $errorCorrectionLevel = 'L';
    if (isset($_REQUEST['level']) &&
in_array($_REQUEST['level'],
array('L','M','Q','H')))
        $errorCorrectionLevel = $_REQUEST['level'];    

    $matrixPointSize = 4;
    if (isset($_REQUEST['size']))
        $matrixPointSize = min(max((int)$_REQUEST['size'], 1),
10);


    if (isset($_REQUEST['data'])) { 
    
        //it's very important!
        if (trim($_REQUEST['data']) == '')
            die('data cannot be empty! <a
href="?">back</a>');
            
        // user data
        $filename =
$PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png';
        QRcode::png($_REQUEST['data'], $filename,
$errorCorrectionLevel, $matrixPointSize, 2);    
        
    } else {    
    
        //default data
        echo 'You can provide data in GET parameter: <a
href="?data=like_that">like that</a><hr/>';  
 
        QRcode::png('PHP QR Code :)', $filename,
$errorCorrectionLevel, $matrixPointSize, 2);    
        
    }    
        
    //display generated file
    echo '<img
src="'.$PNG_WEB_DIR.basename($filename).'"
/><hr/>';  
    
    //config form
    echo '<form action="index.php"
method="post">
        Data:&nbsp;<input name="data"
value="'.(isset($_REQUEST['data'])?htmlspecialchars($_REQUEST['data']):'PHP
QR Code :)').'" />&nbsp;
        ECC:&nbsp;<select name="level">
            <option
value="L"'.(($errorCorrectionLevel=='L')?'
selected':'').'>L - smallest</option>
            <option
value="M"'.(($errorCorrectionLevel=='M')?'
selected':'').'>M</option>
            <option
value="Q"'.(($errorCorrectionLevel=='Q')?'
selected':'').'>Q</option>
            <option
value="H"'.(($errorCorrectionLevel=='H')?'
selected':'').'>H - best</option>
        </select>&nbsp;
        Size:&nbsp;<select name="size">';
        
    for($i=1;$i<=10;$i++)
        echo '<option
value="'.$i.'"'.(($matrixPointSize==$i)?'
selected':'').'>'.$i.'</option>';
        
    echo '</select>&nbsp;
        <input type="submit"
value="GENERATE"></form><hr/>';
        
    // benchmark
    QRtools::timeBenchmark();    

    libs/phpqrcode/INSTALL000064400000003772151165347260010536 0ustar00==
REQUIREMENTS ==

 * PHP5
 * PHP GD2 extension with JPEG and PNG support
 
== INSTALLATION ==

If you want to recreate cache by yourself make sure cache directory is
writable and you have permisions to write into it. Also make sure you are
able to read files in it if you have cache option enabled
 
== CONFIGURATION ==

Feel free to modify config constants in qrconfig.php file. Read about it
in
provided comments and project wiki page (links in README file)

== QUICK START ==

Notice: probably you should'nt use all of this in same script :)

<?phpb

//include only that one, rest required files will be included from it
include "qrlib.php"

//write code into file, Error corection lecer is lowest, L (one form:
L,M,Q,H)
//each code square will be 4x4 pixels (4x zoom)
//code will have 2 code squares white boundary around 

QRcode::png('PHP QR Code :)', 'test.png',
'L', 4, 2);

//same as above but outputs file directly into browser (with appr. header
etc.)
//all other settings are default
//WARNING! it should be FIRST and ONLY output generated by script,
otherwise
//rest of output will land inside PNG binary, breaking it for sure
QRcode::png('PHP QR Code :)');

//show benchmark
QRtools::timeBenchmark();

//rebuild cache
QRtools::buildCache();

//code generated in text mode - as a binary table
//then displayed out as HTML using Unicode block building chars :)
$tab = $qr->encode('PHP QR Code :)');
QRspec::debug($tab, true);

== TCPDF INTEGRATION ==

Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php.
Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge)
2dbarcodes.php 

Then use similar as example #50 from TCPDF examples:

<?php

$style = array(
    'border' => true,
    'padding' => 4,
    'fgcolor' => array(0,0,0),
    'bgcolor' => false, //array(255,255,255)
);

//code name: QR, specify error correction level after semicolon (L,M,Q,H)
$pdf->write2DBarcode('PHP QR Code :)', 'QR,L',
'', '', 30, 30, $style, 'N');
libs/phpqrcode/LICENSE000064400000017207151165347260010510 0ustar00        
         GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU
Lesser
General Public License, and the "GNU GPL" refers to version 3 of
the GNU
General Public License.

  "The Library" refers to a covered work governed by this
License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface
provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking
an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means
the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means
the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this
license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this
license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.

  Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
libs/phpqrcode/phpqrcode.php000064400000355664151165347260012215
0ustar00<?php

/*
 * PHP QR Code encoder
 *
 * This file contains MERGED version of PHP QR Code library.
 * It was auto-generated from full version for your convenience.
 *
 * This merged version was configured to not requre any external files,
 * with disabled cache, error loging and weker but faster mask matching.
 * If you need tune it up please use non-merged version.
 *
 * For full version, documentation, examples of use please visit:
 *
 *    http://phpqrcode.sourceforge.net/
 *    https://sourceforge.net/projects/phpqrcode/
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
 

/*
 * Version: 1.1.4
 * Build: 2010100721
 */



//---- qrconst.php -----------------------------





/*
 * PHP QR Code encoder
 *
 * Common constants
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
	// Encoding modes
	 
	define('QR_MODE_NUL', -1);
	define('QR_MODE_NUM', 0);
	define('QR_MODE_AN', 1);
	define('QR_MODE_8', 2);
	define('QR_MODE_KANJI', 3);
	define('QR_MODE_STRUCTURE', 4);

	// Levels of error correction.

	define('QR_ECLEVEL_L', 0);
	define('QR_ECLEVEL_M', 1);
	define('QR_ECLEVEL_Q', 2);
	define('QR_ECLEVEL_H', 3);
	
	// Supported output formats
	
	define('QR_FORMAT_TEXT', 0);
	define('QR_FORMAT_PNG',  1);
	
	class qrstr {
		public static function set(&$srctab, $x, $y, $repl, $replLen = false)
{
			$srctab[$y] = substr_replace($srctab[$y], ($replLen !==
false)?substr($repl,0,$replLen):$repl, $x, ($replLen !==
false)?$replLen:strlen($repl));
		}
	}	



//---- merged_config.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Config file, tuned-up for merged verion
 */
     
    define('QR_CACHEABLE', false);       // use cache - more disk
reads but less CPU power, masks and format templates are stored there
    define('QR_CACHE_DIR', false);       // used when
QR_CACHEABLE === true
    define('QR_LOG_DIR', false);         // default error logs
dir   
    
    define('QR_FIND_BEST_MASK', true);                           
                              // if true, estimates best mask (spec.
default, but extremally slow; set to false to significant performance boost
but (propably) worst quality code
    define('QR_FIND_FROM_RANDOM', 2);                            
                          // if false, checks all masks available,
otherwise value tells count of masks need to be checked, mask id are got
randomly
    define('QR_DEFAULT_MASK', 2);                                
                              // when QR_FIND_BEST_MASK === false
                                                  
    define('QR_PNG_MAXIMUM_SIZE',  1024);                        
                              // maximum allowed png image width (in
pixels), tune to make sure GD and PHP can handle such big images
                                                  



//---- qrtools.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Toolset, handy and debug utilites.
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */

    class QRtools {
    
       
//----------------------------------------------------------------------
        public static function binarize($frame)
        {
            $len = count($frame);
            foreach ($frame as &$frameLine) {
                
                for($i=0; $i<$len; $i++) {
                    $frameLine[$i] =
(ord($frameLine[$i])&1)?'1':'0';
                }
            }
            
            return $frame;
        }
        
       
//----------------------------------------------------------------------
        public static function tcpdfBarcodeArray($code, $mode =
'QR,L', $tcPdfVersion = '4.5.037')
        {
            $barcode_array = array();
            
            if (!is_array($mode))
                $mode = explode(',', $mode);
                
            $eccLevel = 'L';
                
            if (count($mode) > 1) {
                $eccLevel = $mode[1];
            }
                
            $qrTab = QRcode::text($code, false, $eccLevel);
            $size = count($qrTab);
                
            $barcode_array['num_rows'] = $size;
            $barcode_array['num_cols'] = $size;
            $barcode_array['bcode'] = array();
                
            foreach ($qrTab as $line) {
                $arrAdd = array();
                foreach(str_split($line) as $char)
                    $arrAdd[] = ($char=='1')?1:0;
                $barcode_array['bcode'][] = $arrAdd;
            }
                    
            return $barcode_array;
        }
        
       
//----------------------------------------------------------------------
        public static function clearCache()
        {
            self::$frames = array();
        }
        
       
//----------------------------------------------------------------------
        public static function buildCache()
        {
			QRtools::markTime('before_build_cache');
			
			$mask = new QRmask();
            for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
                $frame = QRspec::newFrame($a);
                if (QR_IMAGE) {
                    $fileName =
QR_CACHE_DIR.'frame_'.$a.'.png';
                    QRimage::png(self::binarize($frame), $fileName, 1, 0);
                }
				
				$width = count($frame);
				$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
				for ($maskNo=0; $maskNo<8; $maskNo++)
					$mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
            }
			
			QRtools::markTime('after_build_cache');
        }

       
//----------------------------------------------------------------------
        public static function log($outfile, $err)
        {
            if (QR_LOG_DIR !== false) {
                if ($err != '') {
                    if ($outfile !== false) {
                       
file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt',
date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                    } else {
                       
file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d
H:i:s').': '.$err, FILE_APPEND);
                    }
                }    
            }
        }
        
       
//----------------------------------------------------------------------
        public static function dumpMask($frame) 
        {
            $width = count($frame);
            for($y=0;$y<$width;$y++) {
                for($x=0;$x<$width;$x++) {
                    echo ord($frame[$y][$x]).',';
                }
            }
        }
        
       
//----------------------------------------------------------------------
        public static function markTime($markerId)
        {
            list($usec, $sec) = explode(" ", microtime());
            $time = ((float)$usec + (float)$sec);
            
            if (!isset($GLOBALS['qr_time_bench']))
                $GLOBALS['qr_time_bench'] = array();
            
            $GLOBALS['qr_time_bench'][$markerId] = $time;
        }
        
       
//----------------------------------------------------------------------
        public static function timeBenchmark()
        {
            self::markTime('finish');
        
            $lastTime = 0;
            $startTime = 0;
            $p = 0;

            echo '<table cellpadding="3"
cellspacing="1">
                    <thead><tr style="border-bottom:1px solid
silver"><td colspan="2"
style="text-align:center">BENCHMARK</td></tr></thead>
                    <tbody>';

            foreach($GLOBALS['qr_time_bench'] as
$markerId=>$thisTime) {
                if ($p > 0) {
                    echo '<tr><th
style="text-align:right">till '.$markerId.':
</th><td>'.number_format($thisTime-$lastTime,
6).'s</td></tr>';
                } else {
                    $startTime = $thisTime;
                }
                
                $p++;
                $lastTime = $thisTime;
            }
            
            echo '</tbody><tfoot>
                <tr style="border-top:2px solid
black"><th style="text-align:right">TOTAL:
</th><td>'.number_format($lastTime-$startTime,
6).'s</td></tr>
            </tfoot>
            </table>';
        }
        
    }
    
   
//##########################################################################
    
    QRtools::markTime('start');
    



//---- qrspec.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * QR Code specifications
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * The following data / specifications are taken from
 * "Two dimensional symbol -- QR-code -- Basic Specification"
(JIS X0510:2004)
 *  or
 * "Automatic identification and data capture techniques -- 
 *  QR Code 2005 bar code symbology specification" (ISO/IEC
18004:2006)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    define('QRSPEC_VERSION_MAX', 40);
    define('QRSPEC_WIDTH_MAX',   177);

    define('QRCAP_WIDTH',        0);
    define('QRCAP_WORDS',        1);
    define('QRCAP_REMINDER',     2);
    define('QRCAP_EC',           3);

    class QRspec {
    
        public static $capacity = array(
            array(  0,    0, 0, array(   0,    0,    0,    0)),
            array( 21,   26, 0, array(   7,   10,   13,   17)), // 1
            array( 25,   44, 7, array(  10,   16,   22,   28)),
            array( 29,   70, 7, array(  15,   26,   36,   44)),
            array( 33,  100, 7, array(  20,   36,   52,   64)),
            array( 37,  134, 7, array(  26,   48,   72,   88)), // 5
            array( 41,  172, 7, array(  36,   64,   96,  112)),
            array( 45,  196, 0, array(  40,   72,  108,  130)),
            array( 49,  242, 0, array(  48,   88,  132,  156)),
            array( 53,  292, 0, array(  60,  110,  160,  192)),
            array( 57,  346, 0, array(  72,  130,  192,  224)), //10
            array( 61,  404, 0, array(  80,  150,  224,  264)),
            array( 65,  466, 0, array(  96,  176,  260,  308)),
            array( 69,  532, 0, array( 104,  198,  288,  352)),
            array( 73,  581, 3, array( 120,  216,  320,  384)),
            array( 77,  655, 3, array( 132,  240,  360,  432)), //15
            array( 81,  733, 3, array( 144,  280,  408,  480)),
            array( 85,  815, 3, array( 168,  308,  448,  532)),
            array( 89,  901, 3, array( 180,  338,  504,  588)),
            array( 93,  991, 3, array( 196,  364,  546,  650)),
            array( 97, 1085, 3, array( 224,  416,  600,  700)), //20
            array(101, 1156, 4, array( 224,  442,  644,  750)),
            array(105, 1258, 4, array( 252,  476,  690,  816)),
            array(109, 1364, 4, array( 270,  504,  750,  900)),
            array(113, 1474, 4, array( 300,  560,  810,  960)),
            array(117, 1588, 4, array( 312,  588,  870, 1050)), //25
            array(121, 1706, 4, array( 336,  644,  952, 1110)),
            array(125, 1828, 4, array( 360,  700, 1020, 1200)),
            array(129, 1921, 3, array( 390,  728, 1050, 1260)),
            array(133, 2051, 3, array( 420,  784, 1140, 1350)),
            array(137, 2185, 3, array( 450,  812, 1200, 1440)), //30
            array(141, 2323, 3, array( 480,  868, 1290, 1530)),
            array(145, 2465, 3, array( 510,  924, 1350, 1620)),
            array(149, 2611, 3, array( 540,  980, 1440, 1710)),
            array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
            array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
            array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
            array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
            array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
            array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
            array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
        );
        
       
//----------------------------------------------------------------------
        public static function getDataLength($version, $level)
        {
            return self::$capacity[$version][QRCAP_WORDS] -
self::$capacity[$version][QRCAP_EC][$level];
        }
        
       
//----------------------------------------------------------------------
        public static function getECCLength($version, $level)
        {
            return self::$capacity[$version][QRCAP_EC][$level];
        }
        
       
//----------------------------------------------------------------------
        public static function getWidth($version)
        {
            return self::$capacity[$version][QRCAP_WIDTH];
        }
        
       
//----------------------------------------------------------------------
        public static function getRemainder($version)
        {
            return self::$capacity[$version][QRCAP_REMINDER];
        }
        
       
//----------------------------------------------------------------------
        public static function getMinimumVersion($size, $level)
        {

            for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
                $words  = self::$capacity[$i][QRCAP_WORDS] -
self::$capacity[$i][QRCAP_EC][$level];
                if($words >= $size) 
                    return $i;
            }

            return -1;
        }
    
       
//######################################################################
        
        public static $lengthTableBits = array(
            array(10, 12, 14),
            array( 9, 11, 13),
            array( 8, 16, 16),
            array( 8, 10, 12)
        );
        
       
//----------------------------------------------------------------------
        public static function lengthIndicator($mode, $version)
        {
            if ($mode == QR_MODE_STRUCTURE)
                return 0;
                
            if ($version <= 9) {
                $l = 0;
            } else if ($version <= 26) {
                $l = 1;
            } else {
                $l = 2;
            }

            return self::$lengthTableBits[$mode][$l];
        }
        
       
//----------------------------------------------------------------------
        public static function maximumWords($mode, $version)
        {
            if($mode == QR_MODE_STRUCTURE) 
                return 3;
                
            if($version <= 9) {
                $l = 0;
            } else if($version <= 26) {
                $l = 1;
            } else {
                $l = 2;
            }

            $bits = self::$lengthTableBits[$mode][$l];
            $words = (1 << $bits) - 1;
            
            if($mode == QR_MODE_KANJI) {
                $words *= 2; // the number of bytes is required
            }

            return $words;
        }

        // Error correction code
-----------------------------------------------
        // Table of the error correction code (Reed-Solomon block)
        // See Table 12-16 (pp.30-36), JIS X0510:2004.

        public static $eccTable = array(
            array(array( 0,  0), array( 0,  0), array( 0,  0), array( 0, 
0)),
            array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1, 
0)), // 1
            array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1, 
0)),
            array(array( 1,  0), array( 1,  0), array( 2,  0), array( 2, 
0)),
            array(array( 1,  0), array( 2,  0), array( 2,  0), array( 4, 
0)),
            array(array( 1,  0), array( 2,  0), array( 2,  2), array( 2, 
2)), // 5
            array(array( 2,  0), array( 4,  0), array( 4,  0), array( 4, 
0)),
            array(array( 2,  0), array( 4,  0), array( 2,  4), array( 4, 
1)),
            array(array( 2,  0), array( 2,  2), array( 4,  2), array( 4, 
2)),
            array(array( 2,  0), array( 3,  2), array( 4,  4), array( 4, 
4)),
            array(array( 2,  2), array( 4,  1), array( 6,  2), array( 6, 
2)), //10
            array(array( 4,  0), array( 1,  4), array( 4,  4), array( 3, 
8)),
            array(array( 2,  2), array( 6,  2), array( 4,  6), array( 7, 
4)),
            array(array( 4,  0), array( 8,  1), array( 8,  4), array(12, 
4)),
            array(array( 3,  1), array( 4,  5), array(11,  5), array(11, 
5)),
            array(array( 5,  1), array( 5,  5), array( 5,  7), array(11, 
7)), //15
            array(array( 5,  1), array( 7,  3), array(15,  2), array( 3,
13)),
            array(array( 1,  5), array(10,  1), array( 1, 15), array( 2,
17)),
            array(array( 5,  1), array( 9,  4), array(17,  1), array( 2,
19)),
            array(array( 3,  4), array( 3, 11), array(17,  4), array( 9,
16)),
            array(array( 3,  5), array( 3, 13), array(15,  5), array(15,
10)), //20
            array(array( 4,  4), array(17,  0), array(17,  6), array(19, 
6)),
            array(array( 2,  7), array(17,  0), array( 7, 16), array(34, 
0)),
            array(array( 4,  5), array( 4, 14), array(11, 14), array(16,
14)),
            array(array( 6,  4), array( 6, 14), array(11, 16), array(30, 
2)),
            array(array( 8,  4), array( 8, 13), array( 7, 22), array(22,
13)), //25
            array(array(10,  2), array(19,  4), array(28,  6), array(33, 
4)),
            array(array( 8,  4), array(22,  3), array( 8, 26), array(12,
28)),
            array(array( 3, 10), array( 3, 23), array( 4, 31), array(11,
31)),
            array(array( 7,  7), array(21,  7), array( 1, 37), array(19,
26)),
            array(array( 5, 10), array(19, 10), array(15, 25), array(23,
25)), //30
            array(array(13,  3), array( 2, 29), array(42,  1), array(23,
28)),
            array(array(17,  0), array(10, 23), array(10, 35), array(19,
35)),
            array(array(17,  1), array(14, 21), array(29, 19), array(11,
46)),
            array(array(13,  6), array(14, 23), array(44,  7), array(59, 
1)),
            array(array(12,  7), array(12, 26), array(39, 14), array(22,
41)), //35
            array(array( 6, 14), array( 6, 34), array(46, 10), array( 2,
64)),
            array(array(17,  4), array(29, 14), array(49, 10), array(24,
46)),
            array(array( 4, 18), array(13, 32), array(48, 14), array(42,
32)),
            array(array(20,  4), array(40,  7), array(43, 22), array(10,
67)),
            array(array(19,  6), array(18, 31), array(34, 34), array(20,
61)),//40
        );                                                                 
     

       
//----------------------------------------------------------------------
        // CACHEABLE!!!
        
        public static function getEccSpec($version, $level, array
&$spec)
        {
            if (count($spec) < 5) {
                $spec = array(0,0,0,0,0);
            }

            $b1   = self::$eccTable[$version][$level][0];
            $b2   = self::$eccTable[$version][$level][1];
            $data = self::getDataLength($version, $level);
            $ecc  = self::getECCLength($version, $level);

            if($b2 == 0) {
                $spec[0] = $b1;
                $spec[1] = (int)($data / $b1);
                $spec[2] = (int)($ecc / $b1);
                $spec[3] = 0; 
                $spec[4] = 0;
            } else {
                $spec[0] = $b1;
                $spec[1] = (int)($data / ($b1 + $b2));
                $spec[2] = (int)($ecc  / ($b1 + $b2));
                $spec[3] = $b2;
                $spec[4] = $spec[1] + 1;
            }
        }

        // Alignment pattern
---------------------------------------------------

        // Positions of alignment patterns.
        // This array includes only the second and the third position of
the 
        // alignment patterns. Rest of them can be calculated from the
distance 
        // between them.
         
        // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
         
        public static $alignmentPattern = array(      
            array( 0,  0),
            array( 0,  0), array(18,  0), array(22,  0), array(26,  0),
array(30,  0), // 1- 5
            array(34,  0), array(22, 38), array(24, 42), array(26, 46),
array(28, 50), // 6-10
            array(30, 54), array(32, 58), array(34, 62), array(26, 46),
array(26, 48), //11-15
            array(26, 50), array(30, 54), array(30, 56), array(30, 58),
array(34, 62), //16-20
            array(28, 50), array(26, 50), array(30, 54), array(28, 54),
array(32, 58), //21-25
            array(30, 58), array(34, 62), array(26, 50), array(30, 54),
array(26, 52), //26-30
            array(30, 56), array(34, 60), array(30, 58), array(34, 62),
array(30, 54), //31-35
            array(24, 50), array(28, 54), array(32, 58), array(26, 54),
array(30, 58), //35-40
        );                                                                 
                

        
        /**
--------------------------------------------------------------------
         * Put an alignment marker.
         * @param frame
         * @param width
         * @param ox,oy center coordinate of the pattern
         */
        public static function putAlignmentMarker(array &$frame, $ox,
$oy)
        {
            $finder = array(
                "\xa1\xa1\xa1\xa1\xa1",
                "\xa1\xa0\xa0\xa0\xa1",
                "\xa1\xa0\xa1\xa0\xa1",
                "\xa1\xa0\xa0\xa0\xa1",
                "\xa1\xa1\xa1\xa1\xa1"
            );                        
            
            $yStart = $oy-2;         
            $xStart = $ox-2;
            
            for($y=0; $y<5; $y++) {
                QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
            }
        }

       
//----------------------------------------------------------------------
        public static function putAlignmentPattern($version, &$frame,
$width)
        {
            if($version < 2)
                return;

            $d = self::$alignmentPattern[$version][1] -
self::$alignmentPattern[$version][0];
            if($d < 0) {
                $w = 2;
            } else {
                $w = (int)(($width - self::$alignmentPattern[$version][0])
/ $d + 2);
            }

            if($w * $w - 3 == 1) {
                $x = self::$alignmentPattern[$version][0];
                $y = self::$alignmentPattern[$version][0];
                self::putAlignmentMarker($frame, $x, $y);
                return;
            }

            $cx = self::$alignmentPattern[$version][0];
            for($x=1; $x<$w - 1; $x++) {
                self::putAlignmentMarker($frame, 6, $cx);
                self::putAlignmentMarker($frame, $cx,  6);
                $cx += $d;
            }

            $cy = self::$alignmentPattern[$version][0];
            for($y=0; $y<$w-1; $y++) {
                $cx = self::$alignmentPattern[$version][0];
                for($x=0; $x<$w-1; $x++) {
                    self::putAlignmentMarker($frame, $cx, $cy);
                    $cx += $d;
                }
                $cy += $d;
            }
        }

        // Version information pattern
-----------------------------------------

		// Version information pattern (BCH coded).
        // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
        
		// size: [QRSPEC_VERSION_MAX - 6]
		
        public static $versionPattern = array(
            0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847,
0x0e60d,
            0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683,
0x168c9,
            0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f,
0x1ed75,
            0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e,
0x26a64,
            0x27541, 0x28c69
        );

       
//----------------------------------------------------------------------
        public static function getVersionPattern($version)
        {
            if($version < 7 || $version > QRSPEC_VERSION_MAX)
                return 0;

            return self::$versionPattern[$version -7];
        }

        // Format information
--------------------------------------------------
        // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c
lib)
        
        public static $formatInfo = array(
            array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41,
0x6976),
            array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97,
0x4aa0),
            array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda,
0x2bed),
            array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c,
0x083b)
        );

        public static function getFormatInfo($mask, $level)
        {
            if($mask < 0 || $mask > 7)
                return 0;
                
            if($level < 0 || $level > 3)
                return 0;                

            return self::$formatInfo[$level][$mask];
        }

        // Frame
---------------------------------------------------------------
        // Cache of initial frames.
         
        public static $frames = array();

        /**
--------------------------------------------------------------------
         * Put a finder pattern.
         * @param frame
         * @param width
         * @param ox,oy upper-left coordinate of the pattern
         */
        public static function putFinderPattern(&$frame, $ox, $oy)
        {
            $finder = array(
                "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
                "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
                "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
                "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
                "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
                "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
                "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
            );                            
            
            for($y=0; $y<7; $y++) {
                QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
            }
        }

       
//----------------------------------------------------------------------
        public static function createFrame($version)
        {
            $width = self::$capacity[$version][QRCAP_WIDTH];
            $frameLine = str_repeat ("\0", $width);
            $frame = array_fill(0, $width, $frameLine);

            // Finder pattern
            self::putFinderPattern($frame, 0, 0);
            self::putFinderPattern($frame, $width - 7, 0);
            self::putFinderPattern($frame, 0, $width - 7);
            
            // Separator
            $yOffset = $width - 7;
            
            for($y=0; $y<7; $y++) {
                $frame[$y][7] = "\xc0";
                $frame[$y][$width - 8] = "\xc0";
                $frame[$yOffset][7] = "\xc0";
                $yOffset++;
            }
            
            $setPattern = str_repeat("\xc0", 8);
            
            QRstr::set($frame, 0, 7, $setPattern);
            QRstr::set($frame, $width-8, 7, $setPattern);
            QRstr::set($frame, 0, $width - 8, $setPattern);
        
            // Format info
            $setPattern = str_repeat("\x84", 9);
            QRstr::set($frame, 0, 8, $setPattern);
            QRstr::set($frame, $width - 8, 8, $setPattern, 8);
            
            $yOffset = $width - 8;

            for($y=0; $y<8; $y++,$yOffset++) {
                $frame[$y][8] = "\x84";
                $frame[$yOffset][8] = "\x84";
            }

            // Timing pattern  
            
            for($i=1; $i<$width-15; $i++) {
                $frame[6][7+$i] = chr(0x90 | ($i & 1));
                $frame[7+$i][6] = chr(0x90 | ($i & 1));
            }
            
            // Alignment pattern  
            self::putAlignmentPattern($version, $frame, $width);
            
            // Version information 
            if($version >= 7) {
                $vinf = self::getVersionPattern($version);

                $v = $vinf;
                
                for($x=0; $x<6; $x++) {
                    for($y=0; $y<3; $y++) {
                        $frame[($width - 11)+$y][$x] = chr(0x88 | ($v &
1));
                        $v = $v >> 1;
                    }
                }

                $v = $vinf;
                for($y=0; $y<6; $y++) {
                    for($x=0; $x<3; $x++) {
                        $frame[$y][$x+($width - 11)] = chr(0x88 | ($v &
1));
                        $v = $v >> 1;
                    }
                }
            }
    
            // and a little bit...  
            $frame[$width - 8][8] = "\x81";
            
            return $frame;
        }

       
//----------------------------------------------------------------------
        public static function debug($frame, $binary_mode = false)
        {
            if ($binary_mode) {
            
                    foreach ($frame as &$frameLine) {
                        $frameLine = join('<span
class="m">&nbsp;&nbsp;</span>',
explode('0', $frameLine));
                        $frameLine =
join('&#9608;&#9608;', explode('1',
$frameLine));
                    }
                    
                    ?>
                <style>
                    .m { background-color: white; }
                </style>
                <?php
                    echo '<pre><tt><br/ ><br/
><br/
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
                    echo join("<br/
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
$frame);
                    echo '</tt></pre><br/ ><br/
><br/ ><br/ ><br/ ><br/ >';
            
            } else {
            
                foreach ($frame as &$frameLine) {
                    $frameLine = join('<span
class="m">&nbsp;</span>', 
explode("\xc0", $frameLine));
                    $frameLine = join('<span
class="m">&#9618;</span>',
explode("\xc1", $frameLine));
                    $frameLine = join('<span
class="p">&nbsp;</span>', 
explode("\xa0", $frameLine));
                    $frameLine = join('<span
class="p">&#9618;</span>',
explode("\xa1", $frameLine));
                    $frameLine = join('<span
class="s">&#9671;</span>',
explode("\x84", $frameLine)); //format 0
                    $frameLine = join('<span
class="s">&#9670;</span>',
explode("\x85", $frameLine)); //format 1
                    $frameLine = join('<span
class="x">&#9762;</span>',
explode("\x81", $frameLine)); //special bit
                    $frameLine = join('<span
class="c">&nbsp;</span>', 
explode("\x90", $frameLine)); //clock 0
                    $frameLine = join('<span
class="c">&#9719;</span>',
explode("\x91", $frameLine)); //clock 1
                    $frameLine = join('<span
class="f">&nbsp;</span>', 
explode("\x88", $frameLine)); //version
                    $frameLine = join('<span
class="f">&#9618;</span>',
explode("\x89", $frameLine)); //version
                    $frameLine = join('&#9830;',
explode("\x01", $frameLine));
                    $frameLine = join('&#8901;',
explode("\0", $frameLine));
                }
                
                ?>
                <style>
                    .p { background-color: yellow; }
                    .m { background-color: #00FF00; }
                    .s { background-color: #FF0000; }
                    .c { background-color: aqua; }
                    .x { background-color: pink; }
                    .f { background-color: gold; }
                </style>
                <?php
                echo "<pre><tt>";
                echo join("<br/ >", $frame);
                echo "</tt></pre>";
            
            }
        }

       
//----------------------------------------------------------------------
        public static function serial($frame)
        {
            return gzcompress(join("\n", $frame), 9);
        }
        
       
//----------------------------------------------------------------------
        public static function unserial($code)
        {
            return explode("\n", gzuncompress($code));
        }
        
       
//----------------------------------------------------------------------
        public static function newFrame($version)
        {
            if($version < 1 || $version > QRSPEC_VERSION_MAX) 
                return null;

            if(!isset(self::$frames[$version])) {
                
                $fileName =
QR_CACHE_DIR.'frame_'.$version.'.dat';
                
                if (QR_CACHEABLE) {
                    if (file_exists($fileName)) {
                        self::$frames[$version] =
self::unserial(file_get_contents($fileName));
                    } else {
                        self::$frames[$version] =
self::createFrame($version);
                        file_put_contents($fileName,
self::serial(self::$frames[$version]));
                    }
                } else {
                    self::$frames[$version] = self::createFrame($version);
                }
            }
            
            if(is_null(self::$frames[$version]))
                return null;

            return self::$frames[$version];
        }

       
//----------------------------------------------------------------------
        public static function rsBlockNum($spec)     { return $spec[0] +
$spec[3]; }
        public static function rsBlockNum1($spec)    { return $spec[0]; }
        public static function rsDataCodes1($spec)   { return $spec[1]; }
        public static function rsEccCodes1($spec)    { return $spec[2]; }
        public static function rsBlockNum2($spec)    { return $spec[3]; }
        public static function rsDataCodes2($spec)   { return $spec[4]; }
        public static function rsEccCodes2($spec)    { return $spec[2]; }
        public static function rsDataLength($spec)   { return ($spec[0] *
$spec[1]) + ($spec[3] * $spec[4]);    }
        public static function rsEccLength($spec)    { return ($spec[0] +
$spec[3]) * $spec[2]; }
        
    }



//---- qrimage.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Image output of code using GD2
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    define('QR_IMAGE', true);

    class QRimage {
    
       
//----------------------------------------------------------------------
        public static function png($frame, $filename = false,
$pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) 
        {
            $image = self::image($frame, $pixelPerPoint, $outerFrame);
            
            if ($filename === false) {
                Header("Content-type: image/png");
                ImagePng($image);
            } else {
                if($saveandprint===TRUE){
                    ImagePng($image, $filename);
                    header("Content-type: image/png");
                    ImagePng($image);
                }else{
                    ImagePng($image, $filename);
                }
            }
            
            ImageDestroy($image);
        }
    
       
//----------------------------------------------------------------------
        public static function jpg($frame, $filename = false,
$pixelPerPoint = 8, $outerFrame = 4, $q = 85) 
        {
            $image = self::image($frame, $pixelPerPoint, $outerFrame);
            
            if ($filename === false) {
                Header("Content-type: image/jpeg");
                ImageJpeg($image, null, $q);
            } else {
                ImageJpeg($image, $filename, $q);            
            }
            
            ImageDestroy($image);
        }
    
       
//----------------------------------------------------------------------
        private static function image($frame, $pixelPerPoint = 4,
$outerFrame = 4) 
        {
            $h = count($frame);
            $w = strlen($frame[0]);
            
            $imgW = $w + 2*$outerFrame;
            $imgH = $h + 2*$outerFrame;
            
            $base_image =ImageCreate($imgW, $imgH);
            
            $col[0] = ImageColorAllocate($base_image,255,255,255);
            $col[1] = ImageColorAllocate($base_image,0,0,0);

            imagefill($base_image, 0, 0, $col[0]);

            for($y=0; $y<$h; $y++) {
                for($x=0; $x<$w; $x++) {
                    if ($frame[$y][$x] == '1') {
                       
ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); 
                    }
                }
            }
            
            $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH *
$pixelPerPoint);
            ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW
* $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
            ImageDestroy($base_image);
            
            return $target_image;
        }
    }



//---- qrinput.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Input encoding class
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    define('STRUCTURE_HEADER_BITS',  20);
    define('MAX_STRUCTURED_SYMBOLS', 16);

    class QRinputItem {
    
        public $mode;
        public $size;
        public $data;
        public $bstream;

        public function __construct($mode, $size, $data, $bstream = null) 
        {
            $setData = array_slice($data, 0, $size);
            
            if (count($setData) < $size) {
                $setData = array_merge($setData,
array_fill(0,$size-count($setData),0));
            }
        
            if(!QRinput::check($mode, $size, $setData)) {
                throw new Exception('Error
m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
                return null;
            }
            
            $this->mode = $mode;
            $this->size = $size;
            $this->data = $setData;
            $this->bstream = $bstream;
        }
        
       
//----------------------------------------------------------------------
        public function encodeModeNum($version)
        {
            try {
            
                $words = (int)($this->size / 3);
                $bs = new QRbitstream();
                
                $val = 0x1;
                $bs->appendNum(4, $val);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM,
$version), $this->size);

                for($i=0; $i<$words; $i++) {
                    $val  = (ord($this->data[$i*3  ]) -
ord('0')) * 100;
                    $val += (ord($this->data[$i*3+1]) -
ord('0')) * 10;
                    $val += (ord($this->data[$i*3+2]) -
ord('0'));
                    $bs->appendNum(10, $val);
                }

                if($this->size - $words * 3 == 1) {
                    $val = ord($this->data[$words*3]) -
ord('0');
                    $bs->appendNum(4, $val);
                } else if($this->size - $words * 3 == 2) {
                    $val  = (ord($this->data[$words*3  ]) -
ord('0')) * 10;
                    $val += (ord($this->data[$words*3+1]) -
ord('0'));
                    $bs->appendNum(7, $val);
                }

                $this->bstream = $bs;
                return 0;
                
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodeModeAn($version)
        {
            try {
                $words = (int)($this->size / 2);
                $bs = new QRbitstream();
                
                $bs->appendNum(4, 0x02);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN,
$version), $this->size);

                for($i=0; $i<$words; $i++) {
                    $val  =
(int)QRinput::lookAnTable(ord($this->data[$i*2  ])) * 45;
                    $val +=
(int)QRinput::lookAnTable(ord($this->data[$i*2+1]));

                    $bs->appendNum(11, $val);
                }

                if($this->size & 1) {
                    $val = QRinput::lookAnTable(ord($this->data[$words *
2]));
                    $bs->appendNum(6, $val);
                }
        
                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodeMode8($version)
        {
            try {
                $bs = new QRbitstream();

                $bs->appendNum(4, 0x4);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8,
$version), $this->size);

                for($i=0; $i<$this->size; $i++) {
                    $bs->appendNum(8, ord($this->data[$i]));
                }

                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodeModeKanji($version)
        {
            try {

                $bs = new QRbitrtream();
                
                $bs->appendNum(4, 0x8);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI,
$version), (int)($this->size / 2));

                for($i=0; $i<$this->size; $i+=2) {
                    $val = (ord($this->data[$i]) << 8) |
ord($this->data[$i+1]);
                    if($val <= 0x9ffc) {
                        $val -= 0x8140;
                    } else {
                        $val -= 0xc140;
                    }
                    
                    $h = ($val >> 8) * 0xc0;
                    $val = ($val & 0xff) + $h;

                    $bs->appendNum(13, $val);
                }

                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }

       
//----------------------------------------------------------------------
        public function encodeModeStructure()
        {
            try {
                $bs =  new QRbitstream();
                
                $bs->appendNum(4, 0x03);
                $bs->appendNum(4, ord($this->data[1]) - 1);
                $bs->appendNum(4, ord($this->data[0]) - 1);
                $bs->appendNum(8, ord($this->data[2]));

                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function estimateBitStreamSizeOfEntry($version)
        {
            $bits = 0;

            if($version == 0) 
                $version = 1;

            switch($this->mode) {
                case QR_MODE_NUM:        $bits =
QRinput::estimateBitsModeNum($this->size);    break;
                case QR_MODE_AN:        $bits =
QRinput::estimateBitsModeAn($this->size);    break;
                case QR_MODE_8:            $bits =
QRinput::estimateBitsMode8($this->size);    break;
                case QR_MODE_KANJI:        $bits =
QRinput::estimateBitsModeKanji($this->size);break;
                case QR_MODE_STRUCTURE:    return STRUCTURE_HEADER_BITS;   
        
                default:
                    return 0;
            }

            $l = QRspec::lengthIndicator($this->mode, $version);
            $m = 1 << $l;
            $num = (int)(($this->size + $m - 1) / $m);

            $bits += $num * (4 + $l);

            return $bits;
        }
        
       
//----------------------------------------------------------------------
        public function encodeBitStream($version)
        {
            try {
            
                unset($this->bstream);
                $words = QRspec::maximumWords($this->mode, $version);
                
                if($this->size > $words) {
                
                    $st1 = new QRinputItem($this->mode, $words,
$this->data);
                    $st2 = new QRinputItem($this->mode, $this->size -
$words, array_slice($this->data, $words));

                    $st1->encodeBitStream($version);
                    $st2->encodeBitStream($version);
                    
                    $this->bstream = new QRbitstream();
                    $this->bstream->append($st1->bstream);
                    $this->bstream->append($st2->bstream);
                    
                    unset($st1);
                    unset($st2);
                    
                } else {
                    
                    $ret = 0;
                    
                    switch($this->mode) {
                        case QR_MODE_NUM:        $ret =
$this->encodeModeNum($version);    break;
                        case QR_MODE_AN:        $ret =
$this->encodeModeAn($version);    break;
                        case QR_MODE_8:            $ret =
$this->encodeMode8($version);    break;
                        case QR_MODE_KANJI:        $ret =
$this->encodeModeKanji($version);break;
                        case QR_MODE_STRUCTURE:    $ret =
$this->encodeModeStructure();    break;
                        
                        default:
                            break;
                    }
                    
                    if($ret < 0)
                        return -1;
                }

                return $this->bstream->size();
            
            } catch (Exception $e) {
                return -1;
            }
        }
    };
    
   
//##########################################################################

    class QRinput {

        public $items;
        
        private $version;
        private $level;
        
       
//----------------------------------------------------------------------
        public function __construct($version = 0, $level = QR_ECLEVEL_L)
        {
            if ($version < 0 || $version > QRSPEC_VERSION_MAX ||
$level > QR_ECLEVEL_H) {
                throw new Exception('Invalid version no');
                return NULL;
            }
            
            $this->version = $version;
            $this->level = $level;
        }
        
       
//----------------------------------------------------------------------
        public function getVersion()
        {
            return $this->version;
        }
        
       
//----------------------------------------------------------------------
        public function setVersion($version)
        {
            if($version < 0 || $version > QRSPEC_VERSION_MAX) {
                throw new Exception('Invalid version no');
                return -1;
            }

            $this->version = $version;

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function getErrorCorrectionLevel()
        {
            return $this->level;
        }

       
//----------------------------------------------------------------------
        public function setErrorCorrectionLevel($level)
        {
            if($level > QR_ECLEVEL_H) {
                throw new Exception('Invalid ECLEVEL');
                return -1;
            }

            $this->level = $level;

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function appendEntry(QRinputItem $entry)
        {
            $this->items[] = $entry;
        }
        
       
//----------------------------------------------------------------------
        public function append($mode, $size, $data)
        {
            try {
                $entry = new QRinputItem($mode, $size, $data);
                $this->items[] = $entry;
                return 0;
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        
        public function insertStructuredAppendHeader($size, $index,
$parity)
        {
            if( $size > MAX_STRUCTURED_SYMBOLS ) {
                throw new Exception('insertStructuredAppendHeader
wrong size');
            }
            
            if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
                throw new Exception('insertStructuredAppendHeader
wrong index');
            }

            $buf = array($size, $index, $parity);
            
            try {
                $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
                array_unshift($this->items, $entry);
                return 0;
            } catch (Exception $e) {
                return -1;
            }
        }

       
//----------------------------------------------------------------------
        public function calcParity()
        {
            $parity = 0;
            
            foreach($this->items as $item) {
                if($item->mode != QR_MODE_STRUCTURE) {
                    for($i=$item->size-1; $i>=0; $i--) {
                        $parity ^= $item->data[$i];
                    }
                }
            }

            return $parity;
        }
        
       
//----------------------------------------------------------------------
        public static function checkModeNum($size, $data)
        {
            for($i=0; $i<$size; $i++) {
                if((ord($data[$i]) < ord('0')) ||
(ord($data[$i]) > ord('9'))){
                    return false;
                }
            }

            return true;
        }

       
//----------------------------------------------------------------------
        public static function estimateBitsModeNum($size)
        {
            $w = (int)$size / 3;
            $bits = $w * 10;
            
            switch($size - $w * 3) {
                case 1:
                    $bits += 4;
                    break;
                case 2:
                    $bits += 7;
                    break;
                default:
                    break;
            }

            return $bits;
        }
        
       
//----------------------------------------------------------------------
        public static $anTable = array(
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1,
            36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42,
43,
             0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1,
-1,
            -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24,
            25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1,
-1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
        );
        
       
//----------------------------------------------------------------------
        public static function lookAnTable($c)
        {
            return (($c > 127)?-1:self::$anTable[$c]);
        }
        
       
//----------------------------------------------------------------------
        public static function checkModeAn($size, $data)
        {
            for($i=0; $i<$size; $i++) {
                if (self::lookAnTable(ord($data[$i])) == -1) {
                    return false;
                }
            }

            return true;
        }
        
       
//----------------------------------------------------------------------
        public static function estimateBitsModeAn($size)
        {
            $w = (int)($size / 2);
            $bits = $w * 11;
            
            if($size & 1) {
                $bits += 6;
            }

            return $bits;
        }
    
       
//----------------------------------------------------------------------
        public static function estimateBitsMode8($size)
        {
            return $size * 8;
        }
        
       
//----------------------------------------------------------------------
        public function estimateBitsModeKanji($size)
        {
            return (int)(($size / 2) * 13);
        }
        
       
//----------------------------------------------------------------------
        public static function checkModeKanji($size, $data)
        {
            if($size & 1)
                return false;

            for($i=0; $i<$size; $i+=2) {
                $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
                if( $val < 0x8140 
                || ($val > 0x9ffc && $val < 0xe040) 
                || $val > 0xebbf) {
                    return false;
                }
            }

            return true;
        }

       
/***********************************************************************
         * Validation
        
**********************************************************************/

        public static function check($mode, $size, $data)
        {
            if($size <= 0) 
                return false;

            switch($mode) {
                case QR_MODE_NUM:       return self::checkModeNum($size,
$data);   break;
                case QR_MODE_AN:        return self::checkModeAn($size,
$data);    break;
                case QR_MODE_KANJI:     return self::checkModeKanji($size,
$data); break;
                case QR_MODE_8:         return true; break;
                case QR_MODE_STRUCTURE: return true; break;
                
                default:
                    break;
            }

            return false;
        }
        
        
       
//----------------------------------------------------------------------
        public function estimateBitStreamSize($version)
        {
            $bits = 0;

            foreach($this->items as $item) {
                $bits += $item->estimateBitStreamSizeOfEntry($version);
            }

            return $bits;
        }
        
       
//----------------------------------------------------------------------
        public function estimateVersion()
        {
            $version = 0;
            $prev = 0;
            do {
                $prev = $version;
                $bits = $this->estimateBitStreamSize($prev);
                $version = QRspec::getMinimumVersion((int)(($bits + 7) /
8), $this->level);
                if ($version < 0) {
                    return -1;
                }
            } while ($version > $prev);

            return $version;
        }
        
       
//----------------------------------------------------------------------
        public static function lengthOfCode($mode, $version, $bits)
        {
            $payload = $bits - 4 - QRspec::lengthIndicator($mode,
$version);
            switch($mode) {
                case QR_MODE_NUM:
                    $chunks = (int)($payload / 10);
                    $remain = $payload - $chunks * 10;
                    $size = $chunks * 3;
                    if($remain >= 7) {
                        $size += 2;
                    } else if($remain >= 4) {
                        $size += 1;
                    }
                    break;
                case QR_MODE_AN:
                    $chunks = (int)($payload / 11);
                    $remain = $payload - $chunks * 11;
                    $size = $chunks * 2;
                    if($remain >= 6) 
                        $size++;
                    break;
                case QR_MODE_8:
                    $size = (int)($payload / 8);
                    break;
                case QR_MODE_KANJI:
                    $size = (int)(($payload / 13) * 2);
                    break;
                case QR_MODE_STRUCTURE:
                    $size = (int)($payload / 8);
                    break;
                default:
                    $size = 0;
                    break;
            }
            
            $maxsize = QRspec::maximumWords($mode, $version);
            if($size < 0) $size = 0;
            if($size > $maxsize) $size = $maxsize;

            return $size;
        }
        
       
//----------------------------------------------------------------------
        public function createBitStream()
        {
            $total = 0;

            foreach($this->items as $item) {
                $bits = $item->encodeBitStream($this->version);
                
                if($bits < 0) 
                    return -1;
                    
                $total += $bits;
            }

            return $total;
        }
        
       
//----------------------------------------------------------------------
        public function convertData()
        {
            $ver = $this->estimateVersion();
            if($ver > $this->getVersion()) {
                $this->setVersion($ver);
            }

            for(;;) {
                $bits = $this->createBitStream();
                
                if($bits < 0) 
                    return -1;
                    
                $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8),
$this->level);
                if($ver < 0) {
                    throw new Exception('WRONG VERSION');
                    return -1;
                } else if($ver > $this->getVersion()) {
                    $this->setVersion($ver);
                } else {
                    break;
                }
            }

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function appendPaddingBit(&$bstream)
        {
            $bits = $bstream->size();
            $maxwords = QRspec::getDataLength($this->version,
$this->level);
            $maxbits = $maxwords * 8;

            if ($maxbits == $bits) {
                return 0;
            }

            if ($maxbits - $bits < 5) {
                return $bstream->appendNum($maxbits - $bits, 0);
            }

            $bits += 4;
            $words = (int)(($bits + 7) / 8);

            $padding = new QRbitstream();
            $ret = $padding->appendNum($words * 8 - $bits + 4, 0);
            
            if($ret < 0) 
                return $ret;

            $padlen = $maxwords - $words;
            
            if($padlen > 0) {
                
                $padbuf = array();
                for($i=0; $i<$padlen; $i++) {
                    $padbuf[$i] = ($i&1)?0x11:0xec;
                }
                
                $ret = $padding->appendBytes($padlen, $padbuf);
                
                if($ret < 0)
                    return $ret;
                
            }

            $ret = $bstream->append($padding);
            
            return $ret;
        }

       
//----------------------------------------------------------------------
        public function mergeBitStream()
        {
            if($this->convertData() < 0) {
                return null;
            }

            $bstream = new QRbitstream();
            
            foreach($this->items as $item) {
                $ret = $bstream->append($item->bstream);
                if($ret < 0) {
                    return null;
                }
            }

            return $bstream;
        }

       
//----------------------------------------------------------------------
        public function getBitStream()
        {

            $bstream = $this->mergeBitStream();
            
            if($bstream == null) {
                return null;
            }
            
            $ret = $this->appendPaddingBit($bstream);
            if($ret < 0) {
                return null;
            }

            return $bstream;
        }
        
       
//----------------------------------------------------------------------
        public function getByteStream()
        {
            $bstream = $this->getBitStream();
            if($bstream == null) {
                return null;
            }
            
            return $bstream->toByte();
        }
    }
        
        
    



//---- qrbitstream.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Bitstream class
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
     
    class QRbitstream {
    
        public $data = array();
        
       
//----------------------------------------------------------------------
        public function size()
        {
            return count($this->data);
        }
        
       
//----------------------------------------------------------------------
        public function allocate($setLength)
        {
            $this->data = array_fill(0, $setLength, 0);
            return 0;
        }
    
       
//----------------------------------------------------------------------
        public static function newFromNum($bits, $num)
        {
            $bstream = new QRbitstream();
            $bstream->allocate($bits);
            
            $mask = 1 << ($bits - 1);
            for($i=0; $i<$bits; $i++) {
                if($num & $mask) {
                    $bstream->data[$i] = 1;
                } else {
                    $bstream->data[$i] = 0;
                }
                $mask = $mask >> 1;
            }

            return $bstream;
        }
        
       
//----------------------------------------------------------------------
        public static function newFromBytes($size, $data)
        {
            $bstream = new QRbitstream();
            $bstream->allocate($size * 8);
            $p=0;

            for($i=0; $i<$size; $i++) {
                $mask = 0x80;
                for($j=0; $j<8; $j++) {
                    if($data[$i] & $mask) {
                        $bstream->data[$p] = 1;
                    } else {
                        $bstream->data[$p] = 0;
                    }
                    $p++;
                    $mask = $mask >> 1;
                }
            }

            return $bstream;
        }
        
       
//----------------------------------------------------------------------
        public function append(QRbitstream $arg)
        {
            if (is_null($arg)) {
                return -1;
            }
            
            if($arg->size() == 0) {
                return 0;
            }
            
            if($this->size() == 0) {
                $this->data = $arg->data;
                return 0;
            }
            
            $this->data = array_values(array_merge($this->data,
$arg->data));

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function appendNum($bits, $num)
        {
            if ($bits == 0) 
                return 0;

            $b = QRbitstream::newFromNum($bits, $num);
            
            if(is_null($b))
                return -1;

            $ret = $this->append($b);
            unset($b);

            return $ret;
        }

       
//----------------------------------------------------------------------
        public function appendBytes($size, $data)
        {
            if ($size == 0) 
                return 0;

            $b = QRbitstream::newFromBytes($size, $data);
            
            if(is_null($b))
                return -1;

            $ret = $this->append($b);
            unset($b);

            return $ret;
        }
        
       
//----------------------------------------------------------------------
        public function toByte()
        {
        
            $size = $this->size();

            if($size == 0) {
                return array();
            }
            
            $data = array_fill(0, (int)(($size + 7) / 8), 0);
            $bytes = (int)($size / 8);

            $p = 0;
            
            for($i=0; $i<$bytes; $i++) {
                $v = 0;
                for($j=0; $j<8; $j++) {
                    $v = $v << 1;
                    $v |= $this->data[$p];
                    $p++;
                }
                $data[$i] = $v;
            }
            
            if($size & 7) {
                $v = 0;
                for($j=0; $j<($size & 7); $j++) {
                    $v = $v << 1;
                    $v |= $this->data[$p];
                    $p++;
                }
                $data[$bytes] = $v;
            }

            return $data;
        }

    }




//---- qrsplit.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Input splitting classes
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * The following data / specifications are taken from
 * "Two dimensional symbol -- QR-code -- Basic Specification"
(JIS X0510:2004)
 *  or
 * "Automatic identification and data capture techniques -- 
 *  QR Code 2005 bar code symbology specification" (ISO/IEC
18004:2006)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
    class QRsplit {

        public $dataStr = '';
        public $input;
        public $modeHint;

       
//----------------------------------------------------------------------
        public function __construct($dataStr, $input, $modeHint) 
        {
            $this->dataStr  = $dataStr;
            $this->input    = $input;
            $this->modeHint = $modeHint;
        }
        
       
//----------------------------------------------------------------------
        public static function isdigitat($str, $pos)
        {    
            if ($pos >= strlen($str))
                return false;
            
            return ((ord($str[$pos]) >=
ord('0'))&&(ord($str[$pos]) <= ord('9')));
        }
        
       
//----------------------------------------------------------------------
        public static function isalnumat($str, $pos)
        {
            if ($pos >= strlen($str))
                return false;
                
            return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
        }

       
//----------------------------------------------------------------------
        public function identifyMode($pos)
        {
            if ($pos >= strlen($this->dataStr)) 
                return QR_MODE_NUL;
                
            $c = $this->dataStr[$pos];
            
            if(self::isdigitat($this->dataStr, $pos)) {
                return QR_MODE_NUM;
            } else if(self::isalnumat($this->dataStr, $pos)) {
                return QR_MODE_AN;
            } else if($this->modeHint == QR_MODE_KANJI) {
            
                if ($pos+1 < strlen($this->dataStr)) 
                {
                    $d = $this->dataStr[$pos+1];
                    $word = (ord($c) << 8) | ord($d);
                    if(($word >= 0x8140 && $word <= 0x9ffc)
|| ($word >= 0xe040 && $word <= 0xebbf)) {
                        return QR_MODE_KANJI;
                    }
                }
            }

            return QR_MODE_8;
        } 
        
       
//----------------------------------------------------------------------
        public function eatNum()
        {
            $ln = QRspec::lengthIndicator(QR_MODE_NUM,
$this->input->getVersion());

            $p = 0;
            while(self::isdigitat($this->dataStr, $p)) {
                $p++;
            }
            
            $run = $p;
            $mode = $this->identifyMode($p);
            
            if($mode == QR_MODE_8) {
                $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
                     + QRinput::estimateBitsMode8(1)         // + 4 + l8
                     - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
                if($dif > 0) {
                    return $this->eat8();
                }
            }
            if($mode == QR_MODE_AN) {
                $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
                     + QRinput::estimateBitsModeAn(1)        // + 4 + la
                     - QRinput::estimateBitsModeAn($run + 1);// - 4 - la
                if($dif > 0) {
                    return $this->eatAn();
                }
            }
            
            $ret = $this->input->append(QR_MODE_NUM, $run,
str_split($this->dataStr));
            if($ret < 0)
                return -1;

            return $run;
        }
        
       
//----------------------------------------------------------------------
        public function eatAn()
        {
            $la = QRspec::lengthIndicator(QR_MODE_AN, 
$this->input->getVersion());
            $ln = QRspec::lengthIndicator(QR_MODE_NUM,
$this->input->getVersion());

            $p = 0;
            
            while(self::isalnumat($this->dataStr, $p)) {
                if(self::isdigitat($this->dataStr, $p)) {
                    $q = $p;
                    while(self::isdigitat($this->dataStr, $q)) {
                        $q++;
                    }
                    
                    $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
                         + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
                         - QRinput::estimateBitsModeAn($q); // - 4 - la
                         
                    if($dif < 0) {
                        break;
                    } else {
                        $p = $q;
                    }
                } else {
                    $p++;
                }
            }

            $run = $p;

            if(!self::isalnumat($this->dataStr, $p)) {
                $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
                     + QRinput::estimateBitsMode8(1) // + 4 + l8
                      - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
                if($dif > 0) {
                    return $this->eat8();
                }
            }

            $ret = $this->input->append(QR_MODE_AN, $run,
str_split($this->dataStr));
            if($ret < 0)
                return -1;

            return $run;
        }
        
       
//----------------------------------------------------------------------
        public function eatKanji()
        {
            $p = 0;
            
            while($this->identifyMode($p) == QR_MODE_KANJI) {
                $p += 2;
            }
            
            $ret = $this->input->append(QR_MODE_KANJI, $p,
str_split($this->dataStr));
            if($ret < 0)
                return -1;

            return $run;
        }

       
//----------------------------------------------------------------------
        public function eat8()
        {
            $la = QRspec::lengthIndicator(QR_MODE_AN,
$this->input->getVersion());
            $ln = QRspec::lengthIndicator(QR_MODE_NUM,
$this->input->getVersion());

            $p = 1;
            $dataStrLen = strlen($this->dataStr);
            
            while($p < $dataStrLen) {
                
                $mode = $this->identifyMode($p);
                if($mode == QR_MODE_KANJI) {
                    break;
                }
                if($mode == QR_MODE_NUM) {
                    $q = $p;
                    while(self::isdigitat($this->dataStr, $q)) {
                        $q++;
                    }
                    $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
                         + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
                         - QRinput::estimateBitsMode8($q); // - 4 - l8
                    if($dif < 0) {
                        break;
                    } else {
                        $p = $q;
                    }
                } else if($mode == QR_MODE_AN) {
                    $q = $p;
                    while(self::isalnumat($this->dataStr, $q)) {
                        $q++;
                    }
                    $dif = QRinput::estimateBitsMode8($p)  // + 4 + l8
                         + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
                         - QRinput::estimateBitsMode8($q); // - 4 - l8
                    if($dif < 0) {
                        break;
                    } else {
                        $p = $q;
                    }
                } else {
                    $p++;
                }
            }

            $run = $p;
            $ret = $this->input->append(QR_MODE_8, $run,
str_split($this->dataStr));
            
            if($ret < 0)
                return -1;

            return $run;
        }

       
//----------------------------------------------------------------------
        public function splitString()
        {
            while (strlen($this->dataStr) > 0)
            {
                if($this->dataStr == '')
                    return 0;

                $mode = $this->identifyMode(0);
                
                switch ($mode) {
                    case QR_MODE_NUM: $length = $this->eatNum(); break;
                    case QR_MODE_AN:  $length = $this->eatAn(); break;
                    case QR_MODE_KANJI:
                        if ($hint == QR_MODE_KANJI)
                                $length = $this->eatKanji();
                        else    $length = $this->eat8();
                        break;
                    default: $length = $this->eat8(); break;
                
                }

                if($length == 0) return 0;
                if($length < 0)  return -1;
                
                $this->dataStr = substr($this->dataStr, $length);
            }
        }

       
//----------------------------------------------------------------------
        public function toUpper()
        {
            $stringLen = strlen($this->dataStr);
            $p = 0;
            
            while ($p<$stringLen) {
                $mode = self::identifyMode(substr($this->dataStr, $p),
$this->modeHint);
                if($mode == QR_MODE_KANJI) {
                    $p += 2;
                } else {
                    if (ord($this->dataStr[$p]) >= ord('a')
&& ord($this->dataStr[$p]) <= ord('z')) {
                        $this->dataStr[$p] =
chr(ord($this->dataStr[$p]) - 32);
                    }
                    $p++;
                }
            }

            return $this->dataStr;
        }

       
//----------------------------------------------------------------------
        public static function splitStringToQRinput($string, QRinput
$input, $modeHint, $casesensitive = true)
        {
            if(is_null($string) || $string == '\0' || $string ==
'') {
                throw new Exception('empty string!!!');
            }

            $split = new QRsplit($string, $input, $modeHint);
            
            if(!$casesensitive)
                $split->toUpper();
                
            return $split->splitString();
        }
    }



//---- qrrscode.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Reed-Solomon error correction support
 * 
 * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
 * (libfec is released under the GNU Lesser General Public License.)
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    class QRrsItem {
    
        public $mm;                  // Bits per symbol 
        public $nn;                  // Symbols per block (=
(1<<mm)-1) 
        public $alpha_to = array();  // log lookup table 
        public $index_of = array();  // Antilog lookup table 
        public $genpoly = array();   // Generator polynomial 
        public $nroots;              // Number of generator roots = number
of parity symbols 
        public $fcr;                 // First consecutive root, index form

        public $prim;                // Primitive element, index form 
        public $iprim;               // prim-th root of 1, index form 
        public $pad;                 // Padding bytes in shortened block 
        public $gfpoly;
    
       
//----------------------------------------------------------------------
        public function modnn($x)
        {
            while ($x >= $this->nn) {
                $x -= $this->nn;
                $x = ($x >> $this->mm) + ($x & $this->nn);
            }
            
            return $x;
        }
        
       
//----------------------------------------------------------------------
        public static function init_rs_char($symsize, $gfpoly, $fcr, $prim,
$nroots, $pad)
        {
            // Common code for intializing a Reed-Solomon control block
(char or int symbols)
            // Copyright 2004 Phil Karn, KA9Q
            // May be used under the terms of the GNU Lesser General Public
License (LGPL)

            $rs = null;
            
            // Check parameter ranges
            if($symsize < 0 || $symsize > 8)                    
return $rs;
            if($fcr < 0 || $fcr >= (1<<$symsize))              
 return $rs;
            if($prim <= 0 || $prim >= (1<<$symsize))           
 return $rs;
            if($nroots < 0 || $nroots >= (1<<$symsize))        
 return $rs; // Can't have more roots than symbol values!
            if($pad < 0 || $pad >= ((1<<$symsize) -1 -
$nroots)) return $rs; // Too much padding

            $rs = new QRrsItem();
            $rs->mm = $symsize;
            $rs->nn = (1<<$symsize)-1;
            $rs->pad = $pad;

            $rs->alpha_to = array_fill(0, $rs->nn+1, 0);
            $rs->index_of = array_fill(0, $rs->nn+1, 0);
          
            // PHP style macro replacement ;)
            $NN =& $rs->nn;
            $A0 =& $NN;
            
            // Generate Galois field lookup tables
            $rs->index_of[0] = $A0; // log(zero) = -inf
            $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
            $sr = 1;
          
            for($i=0; $i<$rs->nn; $i++) {
                $rs->index_of[$sr] = $i;
                $rs->alpha_to[$i] = $sr;
                $sr <<= 1;
                if($sr & (1<<$symsize)) {
                    $sr ^= $gfpoly;
                }
                $sr &= $rs->nn;
            }
            
            if($sr != 1){
                // field generator polynomial is not primitive!
                $rs = NULL;
                return $rs;
            }

            /* Form RS code generator polynomial from its roots */
            $rs->genpoly = array_fill(0, $nroots+1, 0);
        
            $rs->fcr = $fcr;
            $rs->prim = $prim;
            $rs->nroots = $nroots;
            $rs->gfpoly = $gfpoly;

            /* Find prim-th root of 1, used in decoding */
            for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
            ; // intentional empty-body loop!
            
            $rs->iprim = (int)($iprim / $prim);
            $rs->genpoly[0] = 1;
            
            for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root +=
$prim) {
                $rs->genpoly[$i+1] = 1;

                // Multiply rs->genpoly[] by  @**(root + x)
                for ($j = $i; $j > 0; $j--) {
                    if ($rs->genpoly[$j] != 0) {
                        $rs->genpoly[$j] = $rs->genpoly[$j-1] ^
$rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] +
$root)];
                    } else {
                        $rs->genpoly[$j] = $rs->genpoly[$j-1];
                    }
                }
                // rs->genpoly[0] can never be zero
                $rs->genpoly[0] =
$rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] +
$root)];
            }
            
            // convert rs->genpoly[] to index form for quicker encoding
            for ($i = 0; $i <= $nroots; $i++)
                $rs->genpoly[$i] =
$rs->index_of[$rs->genpoly[$i]];

            return $rs;
        }
        
       
//----------------------------------------------------------------------
        public function encode_rs_char($data, &$parity)
        {
            $MM       =& $this->mm;
            $NN       =& $this->nn;
            $ALPHA_TO =& $this->alpha_to;
            $INDEX_OF =& $this->index_of;
            $GENPOLY  =& $this->genpoly;
            $NROOTS   =& $this->nroots;
            $FCR      =& $this->fcr;
            $PRIM     =& $this->prim;
            $IPRIM    =& $this->iprim;
            $PAD      =& $this->pad;
            $A0       =& $NN;

            $parity = array_fill(0, $NROOTS, 0);

            for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {
                
                $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
                if($feedback != $A0) {      
                    // feedback term is non-zero
            
                    // This line is unnecessary when GENPOLY[NROOTS] is
unity, as it must
                    // always be for the polynomials constructed by
init_rs()
                    $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] +
$feedback);
            
                    for($j=1;$j<$NROOTS;$j++) {
                        $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback
+ $GENPOLY[$NROOTS-$j])];
                    }
                }
                
                // Shift 
                array_shift($parity);
                if($feedback != $A0) {
                    array_push($parity, $ALPHA_TO[$this->modnn($feedback
+ $GENPOLY[0])]);
                } else {
                    array_push($parity, 0);
                }
            }
        }
    }
    
   
//##########################################################################
    
    class QRrs {
    
        public static $items = array();
        
       
//----------------------------------------------------------------------
        public static function init_rs($symsize, $gfpoly, $fcr, $prim,
$nroots, $pad)
        {
            foreach(self::$items as $rs) {
                if($rs->pad != $pad)       continue;
                if($rs->nroots != $nroots) continue;
                if($rs->mm != $symsize)    continue;
                if($rs->gfpoly != $gfpoly) continue;
                if($rs->fcr != $fcr)       continue;
                if($rs->prim != $prim)     continue;

                return $rs;
            }

            $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim,
$nroots, $pad);
            array_unshift(self::$items, $rs);

            return $rs;
        }
    }



//---- qrmask.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Masking
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
	define('N1', 3);
	define('N2', 3);
	define('N3', 40);
	define('N4', 10);

	class QRmask {
	
		public $runLength = array();
		
		//----------------------------------------------------------------------
		public function __construct() 
        {
            $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
        }
        
       
//----------------------------------------------------------------------
        public function writeFormatInformation($width, &$frame, $mask,
$level)
        {
            $blacks = 0;
            $format =  QRspec::getFormatInfo($mask, $level);

            for($i=0; $i<8; $i++) {
                if($format & 1) {
                    $blacks += 2;
                    $v = 0x85;
                } else {
                    $v = 0x84;
                }
                
                $frame[8][$width - 1 - $i] = chr($v);
                if($i < 6) {
                    $frame[$i][8] = chr($v);
                } else {
                    $frame[$i + 1][8] = chr($v);
                }
                $format = $format >> 1;
            }
            
            for($i=0; $i<7; $i++) {
                if($format & 1) {
                    $blacks += 2;
                    $v = 0x85;
                } else {
                    $v = 0x84;
                }
                
                $frame[$width - 7 + $i][8] = chr($v);
                if($i == 0) {
                    $frame[8][7] = chr($v);
                } else {
                    $frame[8][6 - $i] = chr($v);
                }
                
                $format = $format >> 1;
            }

            return $blacks;
        }
        
       
//----------------------------------------------------------------------
        public function mask0($x, $y) { return ($x+$y)&1;              
        }
        public function mask1($x, $y) { return ($y&1);                 
        }
        public function mask2($x, $y) { return ($x%3);                     
    }
        public function mask3($x, $y) { return ($x+$y)%3;                  
    }
        public function mask4($x, $y) { return
(((int)($y/2))+((int)($x/3)))&1; }
        public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3;  
        }
        public function mask6($x, $y) { return
((($x*$y)&1)+($x*$y)%3)&1;       }
        public function mask7($x, $y) { return
((($x*$y)%3)+(($x+$y)&1))&1;     }
        
       
//----------------------------------------------------------------------
        private function generateMaskNo($maskNo, $width, $frame)
        {
            $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
            
            for($y=0; $y<$width; $y++) {
                for($x=0; $x<$width; $x++) {
                    if(ord($frame[$y][$x]) & 0x80) {
                        $bitMask[$y][$x] = 0;
                    } else {
                        $maskFunc = call_user_func(array($this,
'mask'.$maskNo), $x, $y);
                        $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
                    }
                    
                }
            }
            
            return $bitMask;
        }
        
       
//----------------------------------------------------------------------
        public static function serial($bitFrame)
        {
            $codeArr = array();
            
            foreach ($bitFrame as $line)
                $codeArr[] = join('', $line);
                
            return gzcompress(join("\n", $codeArr), 9);
        }
        
       
//----------------------------------------------------------------------
        public static function unserial($code)
        {
            $codeArr = array();
            
            $codeLines = explode("\n", gzuncompress($code));
            foreach ($codeLines as $line)
                $codeArr[] = str_split($line);
            
            return $codeArr;
        }
        
       
//----------------------------------------------------------------------
        public function makeMaskNo($maskNo, $width, $s, &$d,
$maskGenOnly = false) 
        {
            $b = 0;
            $bitMask = array();
            
            $fileName =
QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';

            if (QR_CACHEABLE) {
                if (file_exists($fileName)) {
                    $bitMask =
self::unserial(file_get_contents($fileName));
                } else {
                    $bitMask = $this->generateMaskNo($maskNo, $width,
$s, $d);
                    if
(!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
                        mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
                    file_put_contents($fileName, self::serial($bitMask));
                }
            } else {
                $bitMask = $this->generateMaskNo($maskNo, $width, $s,
$d);
            }

            if ($maskGenOnly)
                return;
                
            $d = $s;

            for($y=0; $y<$width; $y++) {
                for($x=0; $x<$width; $x++) {
                    if($bitMask[$y][$x] == 1) {
                        $d[$y][$x] = chr(ord($s[$y][$x]) ^
(int)$bitMask[$y][$x]);
                    }
                    $b += (int)(ord($d[$y][$x]) & 1);
                }
            }

            return $b;
        }
        
       
//----------------------------------------------------------------------
        public function makeMask($width, $frame, $maskNo, $level)
        {
            $masked = array_fill(0, $width, str_repeat("\0",
$width));
            $this->makeMaskNo($maskNo, $width, $frame, $masked);
            $this->writeFormatInformation($width, $masked, $maskNo,
$level);
       
            return $masked;
        }
        
       
//----------------------------------------------------------------------
        public function calcN1N3($length)
        {
            $demerit = 0;

            for($i=0; $i<$length; $i++) {
                
                if($this->runLength[$i] >= 5) {
                    $demerit += (N1 + ($this->runLength[$i] - 5));
                }
                if($i & 1) {
                    if(($i >= 3) && ($i < ($length-2))
&& ($this->runLength[$i] % 3 == 0)) {
                        $fact = (int)($this->runLength[$i] / 3);
                        if(($this->runLength[$i-2] == $fact) &&
                           ($this->runLength[$i-1] == $fact) &&
                           ($this->runLength[$i+1] == $fact) &&
                           ($this->runLength[$i+2] == $fact)) {
                            if(($this->runLength[$i-3] < 0) ||
($this->runLength[$i-3] >= (4 * $fact))) {
                                $demerit += N3;
                            } else if((($i+3) >= $length) ||
($this->runLength[$i+3] >= (4 * $fact))) {
                                $demerit += N3;
                            }
                        }
                    }
                }
            }
            return $demerit;
        }
        
       
//----------------------------------------------------------------------
        public function evaluateSymbol($width, $frame)
        {
            $head = 0;
            $demerit = 0;

            for($y=0; $y<$width; $y++) {
                $head = 0;
                $this->runLength[0] = 1;
                
                $frameY = $frame[$y];
                
                if ($y>0)
                    $frameYM = $frame[$y-1];
                
                for($x=0; $x<$width; $x++) {
                    if(($x > 0) && ($y > 0)) {
                        $b22 = ord($frameY[$x]) & ord($frameY[$x-1])
& ord($frameYM[$x]) & ord($frameYM[$x-1]);
                        $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) |
ord($frameYM[$x]) | ord($frameYM[$x-1]);
                        
                        if(($b22 | ($w22 ^ 1))&1) {                    
                                                
                            $demerit += N2;
                        }
                    }
                    if(($x == 0) && (ord($frameY[$x]) & 1)) {
                        $this->runLength[0] = -1;
                        $head = 1;
                        $this->runLength[$head] = 1;
                    } else if($x > 0) {
                        if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1)
{
                            $head++;
                            $this->runLength[$head] = 1;
                        } else {
                            $this->runLength[$head]++;
                        }
                    }
                }
    
                $demerit += $this->calcN1N3($head+1);
            }

            for($x=0; $x<$width; $x++) {
                $head = 0;
                $this->runLength[0] = 1;
                
                for($y=0; $y<$width; $y++) {
                    if($y == 0 && (ord($frame[$y][$x]) & 1)) {
                        $this->runLength[0] = -1;
                        $head = 1;
                        $this->runLength[$head] = 1;
                    } else if($y > 0) {
                        if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x]))
& 1) {
                            $head++;
                            $this->runLength[$head] = 1;
                        } else {
                            $this->runLength[$head]++;
                        }
                    }
                }
            
                $demerit += $this->calcN1N3($head+1);
            }

            return $demerit;
        }
        
        
       
//----------------------------------------------------------------------
        public function mask($width, $frame, $level)
        {
            $minDemerit = PHP_INT_MAX;
            $bestMaskNum = 0;
            $bestMask = array();
            
            $checked_masks = array(0,1,2,3,4,5,6,7);
            
            if (QR_FIND_FROM_RANDOM !== false) {
            
                $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
                for ($i = 0; $i <  $howManuOut; $i++) {
                    $remPos = rand (0, count($checked_masks)-1);
                    unset($checked_masks[$remPos]);
                    $checked_masks = array_values($checked_masks);
                }
            
            }
            
            $bestMask = $frame;
             
            foreach($checked_masks as $i) {
                $mask = array_fill(0, $width, str_repeat("\0",
$width));

                $demerit = 0;
                $blacks = 0;
                $blacks  = $this->makeMaskNo($i, $width, $frame,
$mask);
                $blacks += $this->writeFormatInformation($width, $mask,
$i, $level);
                $blacks  = (int)(100 * $blacks / ($width * $width));
                $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
                $demerit += $this->evaluateSymbol($width, $mask);
                
                if($demerit < $minDemerit) {
                    $minDemerit = $demerit;
                    $bestMask = $mask;
                    $bestMaskNum = $i;
                }
            }
            
            return $bestMask;
        }
        
       
//----------------------------------------------------------------------
    }




//---- qrencode.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Main encoder classes.
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    class QRrsblock {
        public $dataLength;
        public $data = array();
        public $eccLength;
        public $ecc = array();
        
        public function __construct($dl, $data, $el, &$ecc, QRrsItem
$rs)
        {
            $rs->encode_rs_char($data, $ecc);
        
            $this->dataLength = $dl;
            $this->data = $data;
            $this->eccLength = $el;
            $this->ecc = $ecc;
        }
    };
    
   
//##########################################################################

    class QRrawcode {
        public $version;
        public $datacode = array();
        public $ecccode = array();
        public $blocks;
        public $rsblocks = array(); //of RSblock
        public $count;
        public $dataLength;
        public $eccLength;
        public $b1;
        
       
//----------------------------------------------------------------------
        public function __construct(QRinput $input)
        {
            $spec = array(0,0,0,0,0);
            
            $this->datacode = $input->getByteStream();
            if(is_null($this->datacode)) {
                throw new Exception('null imput string');
            }

            QRspec::getEccSpec($input->getVersion(),
$input->getErrorCorrectionLevel(), $spec);

            $this->version = $input->getVersion();
            $this->b1 = QRspec::rsBlockNum1($spec);
            $this->dataLength = QRspec::rsDataLength($spec);
            $this->eccLength = QRspec::rsEccLength($spec);
            $this->ecccode = array_fill(0, $this->eccLength, 0);
            $this->blocks = QRspec::rsBlockNum($spec);
            
            $ret = $this->init($spec);
            if($ret < 0) {
                throw new Exception('block alloc error');
                return null;
            }

            $this->count = 0;
        }
        
       
//----------------------------------------------------------------------
        public function init(array $spec)
        {
            $dl = QRspec::rsDataCodes1($spec);
            $el = QRspec::rsEccCodes1($spec);
            $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
            

            $blockNo = 0;
            $dataPos = 0;
            $eccPos = 0;
            for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {
                $ecc = array_slice($this->ecccode,$eccPos);
                $this->rsblocks[$blockNo] = new QRrsblock($dl,
array_slice($this->datacode, $dataPos), $el,  $ecc, $rs);
                $this->ecccode =
array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
                
                $dataPos += $dl;
                $eccPos += $el;
                $blockNo++;
            }

            if(QRspec::rsBlockNum2($spec) == 0)
                return 0;

            $dl = QRspec::rsDataCodes2($spec);
            $el = QRspec::rsEccCodes2($spec);
            $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
            
            if($rs == NULL) return -1;
            
            for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {
                $ecc = array_slice($this->ecccode,$eccPos);
                $this->rsblocks[$blockNo] = new QRrsblock($dl,
array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
                $this->ecccode =
array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
                
                $dataPos += $dl;
                $eccPos += $el;
                $blockNo++;
            }

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function getCode()
        {
            $ret;

            if($this->count < $this->dataLength) {
                $row = $this->count % $this->blocks;
                $col = $this->count / $this->blocks;
                if($col >= $this->rsblocks[0]->dataLength) {
                    $row += $this->b1;
                }
                $ret = $this->rsblocks[$row]->data[$col];
            } else if($this->count < $this->dataLength +
$this->eccLength) {
                $row = ($this->count - $this->dataLength) %
$this->blocks;
                $col = ($this->count - $this->dataLength) /
$this->blocks;
                $ret = $this->rsblocks[$row]->ecc[$col];
            } else {
                return 0;
            }
            $this->count++;
            
            return $ret;
        }
    }

   
//##########################################################################
    
    class QRcode {
    
        public $version;
        public $width;
        public $data; 
        
       
//----------------------------------------------------------------------
        public function encodeMask(QRinput $input, $mask)
        {
            if($input->getVersion() < 0 || $input->getVersion()
> QRSPEC_VERSION_MAX) {
                throw new Exception('wrong version');
            }
            if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
                throw new Exception('wrong level');
            }

            $raw = new QRrawcode($input);
            
            QRtools::markTime('after_raw');
            
            $version = $raw->version;
            $width = QRspec::getWidth($version);
            $frame = QRspec::newFrame($version);
            
            $filler = new FrameFiller($width, $frame);
            if(is_null($filler)) {
                return NULL;
            }

            // inteleaved data and ecc codes
            for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++)
{
                $code = $raw->getCode();
                $bit = 0x80;
                for($j=0; $j<8; $j++) {
                    $addr = $filler->next();
                    $filler->setFrameAt($addr, 0x02 | (($bit &
$code) != 0));
                    $bit = $bit >> 1;
                }
            }
            
            QRtools::markTime('after_filler');
            
            unset($raw);
            
            // remainder bits
            $j = QRspec::getRemainder($version);
            for($i=0; $i<$j; $i++) {
                $addr = $filler->next();
                $filler->setFrameAt($addr, 0x02);
            }
            
            $frame = $filler->frame;
            unset($filler);
            
            
            // masking
            $maskObj = new QRmask();
            if($mask < 0) {
            
                if (QR_FIND_BEST_MASK) {
                    $masked = $maskObj->mask($width, $frame,
$input->getErrorCorrectionLevel());
                } else {
                    $masked = $maskObj->makeMask($width, $frame,
(intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
                }
            } else {
                $masked = $maskObj->makeMask($width, $frame, $mask,
$input->getErrorCorrectionLevel());
            }
            
            if($masked == NULL) {
                return NULL;
            }
            
            QRtools::markTime('after_mask');
            
            $this->version = $version;
            $this->width = $width;
            $this->data = $masked;
            
            return $this;
        }
    
       
//----------------------------------------------------------------------
        public function encodeInput(QRinput $input)
        {
            return $this->encodeMask($input, -1);
        }
        
       
//----------------------------------------------------------------------
        public function encodeString8bit($string, $version, $level)
        {
            if(string == NULL) {
                throw new Exception('empty string!');
                return NULL;
            }

            $input = new QRinput($version, $level);
            if($input == NULL) return NULL;

            $ret = $input->append($input, QR_MODE_8, strlen($string),
str_split($string));
            if($ret < 0) {
                unset($input);
                return NULL;
            }
            return $this->encodeInput($input);
        }

       
//----------------------------------------------------------------------
        public function encodeString($string, $version, $level, $hint,
$casesensitive)
        {

            if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
                throw new Exception('bad hint');
                return NULL;
            }

            $input = new QRinput($version, $level);
            if($input == NULL) return NULL;

            $ret = QRsplit::splitStringToQRinput($string, $input, $hint,
$casesensitive);
            if($ret < 0) {
                return NULL;
            }

            return $this->encodeInput($input);
        }
        
       
//----------------------------------------------------------------------
        public static function png($text, $outfile = false, $level =
QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) 
        {
            $enc = QRencode::factory($level, $size, $margin);
            return $enc->encodePNG($text, $outfile,
$saveandprint=false);
        }

       
//----------------------------------------------------------------------
        public static function text($text, $outfile = false, $level =
QR_ECLEVEL_L, $size = 3, $margin = 4) 
        {
            $enc = QRencode::factory($level, $size, $margin);
            return $enc->encode($text, $outfile);
        }

       
//----------------------------------------------------------------------
        public static function raw($text, $outfile = false, $level =
QR_ECLEVEL_L, $size = 3, $margin = 4) 
        {
            $enc = QRencode::factory($level, $size, $margin);
            return $enc->encodeRAW($text, $outfile);
        }
    }
    
   
//##########################################################################
    
    class FrameFiller {
    
        public $width;
        public $frame;
        public $x;
        public $y;
        public $dir;
        public $bit;
        
       
//----------------------------------------------------------------------
        public function __construct($width, &$frame)
        {
            $this->width = $width;
            $this->frame = $frame;
            $this->x = $width - 1;
            $this->y = $width - 1;
            $this->dir = -1;
            $this->bit = -1;
        }
        
       
//----------------------------------------------------------------------
        public function setFrameAt($at, $val)
        {
            $this->frame[$at['y']][$at['x']] =
chr($val);
        }
        
       
//----------------------------------------------------------------------
        public function getFrameAt($at)
        {
            return
ord($this->frame[$at['y']][$at['x']]);
        }
        
       
//----------------------------------------------------------------------
        public function next()
        {
            do {
            
                if($this->bit == -1) {
                    $this->bit = 0;
                    return array('x'=>$this->x,
'y'=>$this->y);
                }

                $x = $this->x;
                $y = $this->y;
                $w = $this->width;

                if($this->bit == 0) {
                    $x--;
                    $this->bit++;
                } else {
                    $x++;
                    $y += $this->dir;
                    $this->bit--;
                }

                if($this->dir < 0) {
                    if($y < 0) {
                        $y = 0;
                        $x -= 2;
                        $this->dir = 1;
                        if($x == 6) {
                            $x--;
                            $y = 9;
                        }
                    }
                } else {
                    if($y == $w) {
                        $y = $w - 1;
                        $x -= 2;
                        $this->dir = -1;
                        if($x == 6) {
                            $x--;
                            $y -= 8;
                        }
                    }
                }
                if($x < 0 || $y < 0) return null;

                $this->x = $x;
                $this->y = $y;

            } while(ord($this->frame[$y][$x]) & 0x80);
                        
            return array('x'=>$x, 'y'=>$y);
        }
        
    } ;
    
   
//##########################################################################
   
    
    class QRencode {
    
        public $casesensitive = true;
        public $eightbit = false;
        
        public $version = 0;
        public $size = 3;
        public $margin = 4;
        
        public $structured = 0; // not supported yet
        
        public $level = QR_ECLEVEL_L;
        public $hint = QR_MODE_8;
        
       
//----------------------------------------------------------------------
        public static function factory($level = QR_ECLEVEL_L, $size = 3,
$margin = 4)
        {
            $enc = new QRencode();
            $enc->size = $size;
            $enc->margin = $margin;
            
            switch ($level.'') {
                case '0':
                case '1':
                case '2':
                case '3':
                        $enc->level = $level;
                    break;
                case 'l':
                case 'L':
                        $enc->level = QR_ECLEVEL_L;
                    break;
                case 'm':
                case 'M':
                        $enc->level = QR_ECLEVEL_M;
                    break;
                case 'q':
                case 'Q':
                        $enc->level = QR_ECLEVEL_Q;
                    break;
                case 'h':
                case 'H':
                        $enc->level = QR_ECLEVEL_H;
                    break;
            }
            
            return $enc;
        }
        
       
//----------------------------------------------------------------------
        public function encodeRAW($intext, $outfile = false) 
        {
            $code = new QRcode();

            if($this->eightbit) {
                $code->encodeString8bit($intext, $this->version,
$this->level);
            } else {
                $code->encodeString($intext, $this->version,
$this->level, $this->hint, $this->casesensitive);
            }
            
            return $code->data;
        }

       
//----------------------------------------------------------------------
        public function encode($intext, $outfile = false) 
        {
            $code = new QRcode();

            if($this->eightbit) {
                $code->encodeString8bit($intext, $this->version,
$this->level);
            } else {
                $code->encodeString($intext, $this->version,
$this->level, $this->hint, $this->casesensitive);
            }
            
            QRtools::markTime('after_encode');
            
            if ($outfile!== false) {
                file_put_contents($outfile, join("\n",
QRtools::binarize($code->data)));
            } else {
                return QRtools::binarize($code->data);
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodePNG($intext, $outfile =
false,$saveandprint=false) 
        {
            try {
            
                ob_start();
                $tab = $this->encode($intext);
                $err = ob_get_contents();
                ob_end_clean();
                
                if ($err != '')
                    QRtools::log($outfile, $err);
                
                $maxSize = (int)(QR_PNG_MAXIMUM_SIZE /
(count($tab)+2*$this->margin));
                
                QRimage::png($tab, $outfile, min(max(1, $this->size),
$maxSize), $this->margin,$saveandprint);
            
            } catch (Exception $e) {
            
                QRtools::log($outfile, $e->getMessage());
            
            }
        }
    }


libs/phpqrcode/qrbitstream.php000064400000012412151165347270012543
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Bitstream class
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
     
    class QRbitstream {
    
        public $data = array();
        
       
//----------------------------------------------------------------------
        public function size()
        {
            return count($this->data);
        }
        
       
//----------------------------------------------------------------------
        public function allocate($setLength)
        {
            $this->data = array_fill(0, $setLength, 0);
            return 0;
        }
    
       
//----------------------------------------------------------------------
        public static function newFromNum($bits, $num)
        {
            $bstream = new QRbitstream();
            $bstream->allocate($bits);
            
            $mask = 1 << ($bits - 1);
            for($i=0; $i<$bits; $i++) {
                if($num & $mask) {
                    $bstream->data[$i] = 1;
                } else {
                    $bstream->data[$i] = 0;
                }
                $mask = $mask >> 1;
            }

            return $bstream;
        }
        
       
//----------------------------------------------------------------------
        public static function newFromBytes($size, $data)
        {
            $bstream = new QRbitstream();
            $bstream->allocate($size * 8);
            $p=0;

            for($i=0; $i<$size; $i++) {
                $mask = 0x80;
                for($j=0; $j<8; $j++) {
                    if($data[$i] & $mask) {
                        $bstream->data[$p] = 1;
                    } else {
                        $bstream->data[$p] = 0;
                    }
                    $p++;
                    $mask = $mask >> 1;
                }
            }

            return $bstream;
        }
        
       
//----------------------------------------------------------------------
        public function append(QRbitstream $arg)
        {
            if (is_null($arg)) {
                return -1;
            }
            
            if($arg->size() == 0) {
                return 0;
            }
            
            if($this->size() == 0) {
                $this->data = $arg->data;
                return 0;
            }
            
            $this->data = array_values(array_merge($this->data,
$arg->data));

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function appendNum($bits, $num)
        {
            if ($bits == 0) 
                return 0;

            $b = QRbitstream::newFromNum($bits, $num);
            
            if(is_null($b))
                return -1;

            $ret = $this->append($b);
            unset($b);

            return $ret;
        }

       
//----------------------------------------------------------------------
        public function appendBytes($size, $data)
        {
            if ($size == 0) 
                return 0;

            $b = QRbitstream::newFromBytes($size, $data);
            
            if(is_null($b))
                return -1;

            $ret = $this->append($b);
            unset($b);

            return $ret;
        }
        
       
//----------------------------------------------------------------------
        public function toByte()
        {
        
            $size = $this->size();

            if($size == 0) {
                return array();
            }
            
            $data = array_fill(0, (int)(($size + 7) / 8), 0);
            $bytes = (int)($size / 8);

            $p = 0;
            
            for($i=0; $i<$bytes; $i++) {
                $v = 0;
                for($j=0; $j<8; $j++) {
                    $v = $v << 1;
                    $v |= $this->data[$p];
                    $p++;
                }
                $data[$i] = $v;
            }
            
            if($size & 7) {
                $v = 0;
                for($j=0; $j<($size & 7); $j++) {
                    $v = $v << 1;
                    $v |= $this->data[$p];
                    $p++;
                }
                $data[$bytes] = $v;
            }

            return $data;
        }

    }
libs/phpqrcode/qrconfig.php000064400000002646151165347270012026
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Config file, feel free to modify
 */
     
    define('QR_CACHEABLE', true);                                
                              // use cache - more disk reads but less CPU
power, masks and format templates are stored there
    define('QR_CACHE_DIR',
dirname(__FILE__).DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR);
 // used when QR_CACHEABLE === true
    define('QR_LOG_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR); 
                              // default error logs dir   
    
    define('QR_FIND_BEST_MASK', true);                           
                              // if true, estimates best mask (spec.
default, but extremally slow; set to false to significant performance boost
but (propably) worst quality code
    define('QR_FIND_FROM_RANDOM', false);                        
                              // if false, checks all masks available,
otherwise value tells count of masks need to be checked, mask id are got
randomly
    define('QR_DEFAULT_MASK', 2);                                
                              // when QR_FIND_BEST_MASK === false
                                                  
    define('QR_PNG_MAXIMUM_SIZE',  1024);                        
                              // maximum allowed png image width (in
pixels), tune to make sure GD and PHP can handle such big images
                                                 
libs/phpqrcode/qrconst.php000064400000003341151165347270011700
0ustar00<?php

/*
 * PHP QR Code encoder
 *
 * Common constants
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
	// Encoding modes
	 
	define('QR_MODE_NUL', -1);
	define('QR_MODE_NUM', 0);
	define('QR_MODE_AN', 1);
	define('QR_MODE_8', 2);
	define('QR_MODE_KANJI', 3);
	define('QR_MODE_STRUCTURE', 4);

	// Levels of error correction.

	define('QR_ECLEVEL_L', 0);
	define('QR_ECLEVEL_M', 1);
	define('QR_ECLEVEL_Q', 2);
	define('QR_ECLEVEL_H', 3);
	
	// Supported output formats
	
	define('QR_FORMAT_TEXT', 0);
	define('QR_FORMAT_PNG',  1);
	
	class qrstr {
		public static function set(&$srctab, $x, $y, $repl, $replLen = false)
{
			$srctab[$y] = substr_replace($srctab[$y], ($replLen !==
false)?substr($repl,0,$replLen):$repl, $x, ($replLen !==
false)?$replLen:strlen($repl));
		}
	}	libs/phpqrcode/qrencode.php000064400000042142151165347270012011
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Main encoder classes.
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    class QRrsblock {
        public $dataLength;
        public $data = array();
        public $eccLength;
        public $ecc = array();
        
        public function __construct($dl, $data, $el, &$ecc, QRrsItem
$rs)
        {
            $rs->encode_rs_char($data, $ecc);
        
            $this->dataLength = $dl;
            $this->data = $data;
            $this->eccLength = $el;
            $this->ecc = $ecc;
        }
    };
    
   
//##########################################################################

    class QRrawcode {
        public $version;
        public $datacode = array();
        public $ecccode = array();
        public $blocks;
        public $rsblocks = array(); //of RSblock
        public $count;
        public $dataLength;
        public $eccLength;
        public $b1;
        
       
//----------------------------------------------------------------------
        public function __construct(QRinput $input)
        {
            $spec = array(0,0,0,0,0);
            
            $this->datacode = $input->getByteStream();
            if(is_null($this->datacode)) {
                throw new Exception('null imput string');
            }

            QRspec::getEccSpec($input->getVersion(),
$input->getErrorCorrectionLevel(), $spec);

            $this->version = $input->getVersion();
            $this->b1 = QRspec::rsBlockNum1($spec);
            $this->dataLength = QRspec::rsDataLength($spec);
            $this->eccLength = QRspec::rsEccLength($spec);
            $this->ecccode = array_fill(0, $this->eccLength, 0);
            $this->blocks = QRspec::rsBlockNum($spec);
            
            $ret = $this->init($spec);
            if($ret < 0) {
                throw new Exception('block alloc error');
                return null;
            }

            $this->count = 0;
        }
        
       
//----------------------------------------------------------------------
        public function init(array $spec)
        {
            $dl = QRspec::rsDataCodes1($spec);
            $el = QRspec::rsEccCodes1($spec);
            $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
            

            $blockNo = 0;
            $dataPos = 0;
            $eccPos = 0;
            for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {
                $ecc = array_slice($this->ecccode,$eccPos);
                $this->rsblocks[$blockNo] = new QRrsblock($dl,
array_slice($this->datacode, $dataPos), $el,  $ecc, $rs);
                $this->ecccode =
array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
                
                $dataPos += $dl;
                $eccPos += $el;
                $blockNo++;
            }

            if(QRspec::rsBlockNum2($spec) == 0)
                return 0;

            $dl = QRspec::rsDataCodes2($spec);
            $el = QRspec::rsEccCodes2($spec);
            $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
            
            if($rs == NULL) return -1;
            
            for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {
                $ecc = array_slice($this->ecccode,$eccPos);
                $this->rsblocks[$blockNo] = new QRrsblock($dl,
array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
                $this->ecccode =
array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
                
                $dataPos += $dl;
                $eccPos += $el;
                $blockNo++;
            }

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function getCode()
        {
            $ret;

            if($this->count < $this->dataLength) {
                $row = $this->count % $this->blocks;
                $col = $this->count / $this->blocks;
                if($col >= $this->rsblocks[0]->dataLength) {
                    $row += $this->b1;
                }
                $ret = $this->rsblocks[$row]->data[$col];
            } else if($this->count < $this->dataLength +
$this->eccLength) {
                $row = ($this->count - $this->dataLength) %
$this->blocks;
                $col = ($this->count - $this->dataLength) /
$this->blocks;
                $ret = $this->rsblocks[$row]->ecc[$col];
            } else {
                return 0;
            }
            $this->count++;
            
            return $ret;
        }
    }

   
//##########################################################################
    
    class QRcode {
    
        public $version;
        public $width;
        public $data; 
        
       
//----------------------------------------------------------------------
        public function encodeMask(QRinput $input, $mask)
        {
            if($input->getVersion() < 0 || $input->getVersion()
> QRSPEC_VERSION_MAX) {
                throw new Exception('wrong version');
            }
            if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
                throw new Exception('wrong level');
            }

            $raw = new QRrawcode($input);
            
            QRtools::markTime('after_raw');
            
            $version = $raw->version;
            $width = QRspec::getWidth($version);
            $frame = QRspec::newFrame($version);
            
            $filler = new FrameFiller($width, $frame);
            if(is_null($filler)) {
                return NULL;
            }

            // inteleaved data and ecc codes
            for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++)
{
                $code = $raw->getCode();
                $bit = 0x80;
                for($j=0; $j<8; $j++) {
                    $addr = $filler->next();
                    $filler->setFrameAt($addr, 0x02 | (($bit &
$code) != 0));
                    $bit = $bit >> 1;
                }
            }
            
            QRtools::markTime('after_filler');
            
            unset($raw);
            
            // remainder bits
            $j = QRspec::getRemainder($version);
            for($i=0; $i<$j; $i++) {
                $addr = $filler->next();
                $filler->setFrameAt($addr, 0x02);
            }
            
            $frame = $filler->frame;
            unset($filler);
            
            
            // masking
            $maskObj = new QRmask();
            if($mask < 0) {
            
                if (QR_FIND_BEST_MASK) {
                    $masked = $maskObj->mask($width, $frame,
$input->getErrorCorrectionLevel());
                } else {
                    $masked = $maskObj->makeMask($width, $frame,
(intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
                }
            } else {
                $masked = $maskObj->makeMask($width, $frame, $mask,
$input->getErrorCorrectionLevel());
            }
            
            if($masked == NULL) {
                return NULL;
            }
            
            QRtools::markTime('after_mask');
            
            $this->version = $version;
            $this->width = $width;
            $this->data = $masked;
            
            return $this;
        }
    
       
//----------------------------------------------------------------------
        public function encodeInput(QRinput $input)
        {
            return $this->encodeMask($input, -1);
        }
        
       
//----------------------------------------------------------------------
        public function encodeString8bit($string, $version, $level)
        {
            if(string == NULL) {
                throw new Exception('empty string!');
                return NULL;
            }

            $input = new QRinput($version, $level);
            if($input == NULL) return NULL;

            $ret = $input->append($input, QR_MODE_8, strlen($string),
str_split($string));
            if($ret < 0) {
                unset($input);
                return NULL;
            }
            return $this->encodeInput($input);
        }

       
//----------------------------------------------------------------------
        public function encodeString($string, $version, $level, $hint,
$casesensitive)
        {

            if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
                throw new Exception('bad hint');
                return NULL;
            }

            $input = new QRinput($version, $level);
            if($input == NULL) return NULL;

            $ret = QRsplit::splitStringToQRinput($string, $input, $hint,
$casesensitive);
            if($ret < 0) {
                return NULL;
            }

            return $this->encodeInput($input);
        }
        
       
//----------------------------------------------------------------------
        public static function png($text, $outfile = false, $level =
QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) 
        {
            $enc = QRencode::factory($level, $size, $margin);
            return $enc->encodePNG($text, $outfile,
$saveandprint=false);
        }

       
//----------------------------------------------------------------------
        public static function text($text, $outfile = false, $level =
QR_ECLEVEL_L, $size = 3, $margin = 4) 
        {
            $enc = QRencode::factory($level, $size, $margin);
            return $enc->encode($text, $outfile);
        }

       
//----------------------------------------------------------------------
        public static function raw($text, $outfile = false, $level =
QR_ECLEVEL_L, $size = 3, $margin = 4) 
        {
            $enc = QRencode::factory($level, $size, $margin);
            return $enc->encodeRAW($text, $outfile);
        }
    }
    
   
//##########################################################################
    
    class FrameFiller {
    
        public $width;
        public $frame;
        public $x;
        public $y;
        public $dir;
        public $bit;
        
       
//----------------------------------------------------------------------
        public function __construct($width, &$frame)
        {
            $this->width = $width;
            $this->frame = $frame;
            $this->x = $width - 1;
            $this->y = $width - 1;
            $this->dir = -1;
            $this->bit = -1;
        }
        
       
//----------------------------------------------------------------------
        public function setFrameAt($at, $val)
        {
            $this->frame[$at['y']][$at['x']] =
chr($val);
        }
        
       
//----------------------------------------------------------------------
        public function getFrameAt($at)
        {
            return
ord($this->frame[$at['y']][$at['x']]);
        }
        
       
//----------------------------------------------------------------------
        public function next()
        {
            do {
            
                if($this->bit == -1) {
                    $this->bit = 0;
                    return array('x'=>$this->x,
'y'=>$this->y);
                }

                $x = $this->x;
                $y = $this->y;
                $w = $this->width;

                if($this->bit == 0) {
                    $x--;
                    $this->bit++;
                } else {
                    $x++;
                    $y += $this->dir;
                    $this->bit--;
                }

                if($this->dir < 0) {
                    if($y < 0) {
                        $y = 0;
                        $x -= 2;
                        $this->dir = 1;
                        if($x == 6) {
                            $x--;
                            $y = 9;
                        }
                    }
                } else {
                    if($y == $w) {
                        $y = $w - 1;
                        $x -= 2;
                        $this->dir = -1;
                        if($x == 6) {
                            $x--;
                            $y -= 8;
                        }
                    }
                }
                if($x < 0 || $y < 0) return null;

                $this->x = $x;
                $this->y = $y;

            } while(ord($this->frame[$y][$x]) & 0x80);
                        
            return array('x'=>$x, 'y'=>$y);
        }
        
    } ;
    
   
//##########################################################################
   
    
    class QRencode {
    
        public $casesensitive = true;
        public $eightbit = false;
        
        public $version = 0;
        public $size = 3;
        public $margin = 4;
        
        public $structured = 0; // not supported yet
        
        public $level = QR_ECLEVEL_L;
        public $hint = QR_MODE_8;
        
       
//----------------------------------------------------------------------
        public static function factory($level = QR_ECLEVEL_L, $size = 3,
$margin = 4)
        {
            $enc = new QRencode();
            $enc->size = $size;
            $enc->margin = $margin;
            
            switch ($level.'') {
                case '0':
                case '1':
                case '2':
                case '3':
                        $enc->level = $level;
                    break;
                case 'l':
                case 'L':
                        $enc->level = QR_ECLEVEL_L;
                    break;
                case 'm':
                case 'M':
                        $enc->level = QR_ECLEVEL_M;
                    break;
                case 'q':
                case 'Q':
                        $enc->level = QR_ECLEVEL_Q;
                    break;
                case 'h':
                case 'H':
                        $enc->level = QR_ECLEVEL_H;
                    break;
            }
            
            return $enc;
        }
        
       
//----------------------------------------------------------------------
        public function encodeRAW($intext, $outfile = false) 
        {
            $code = new QRcode();

            if($this->eightbit) {
                $code->encodeString8bit($intext, $this->version,
$this->level);
            } else {
                $code->encodeString($intext, $this->version,
$this->level, $this->hint, $this->casesensitive);
            }
            
            return $code->data;
        }

       
//----------------------------------------------------------------------
        public function encode($intext, $outfile = false) 
        {
            $code = new QRcode();

            if($this->eightbit) {
                $code->encodeString8bit($intext, $this->version,
$this->level);
            } else {
                $code->encodeString($intext, $this->version,
$this->level, $this->hint, $this->casesensitive);
            }
            
            QRtools::markTime('after_encode');
            
            if ($outfile!== false) {
                file_put_contents($outfile, join("\n",
QRtools::binarize($code->data)));
            } else {
                return QRtools::binarize($code->data);
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodePNG($intext, $outfile =
false,$saveandprint=false) 
        {
            try {
            
                ob_start();
                $tab = $this->encode($intext);
                $err = ob_get_contents();
                ob_end_clean();
                
                if ($err != '')
                    QRtools::log($outfile, $err);
                
                $maxSize = (int)(QR_PNG_MAXIMUM_SIZE /
(count($tab)+2*$this->margin));
                
                QRimage::png($tab, $outfile, min(max(1, $this->size),
$maxSize), $this->margin,$saveandprint);
            
            } catch (Exception $e) {
            
                QRtools::log($outfile, $e->getMessage());
            
            }
        }
    }
libs/phpqrcode/qrimage.php000064400000007051151165347270011636
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Image output of code using GD2
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    define('QR_IMAGE', true);

    class QRimage {
    
       
//----------------------------------------------------------------------
        public static function png($frame, $filename = false,
$pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) 
        {
            $image = self::image($frame, $pixelPerPoint, $outerFrame);
            
            if ($filename === false) {
                Header("Content-type: image/png");
                ImagePng($image);
            } else {
                if($saveandprint===TRUE){
                    ImagePng($image, $filename);
                    header("Content-type: image/png");
                    ImagePng($image);
                }else{
                    ImagePng($image, $filename);
                }
            }
            
            ImageDestroy($image);
        }
    
       
//----------------------------------------------------------------------
        public static function jpg($frame, $filename = false,
$pixelPerPoint = 8, $outerFrame = 4, $q = 85) 
        {
            $image = self::image($frame, $pixelPerPoint, $outerFrame);
            
            if ($filename === false) {
                Header("Content-type: image/jpeg");
                ImageJpeg($image, null, $q);
            } else {
                ImageJpeg($image, $filename, $q);            
            }
            
            ImageDestroy($image);
        }
    
       
//----------------------------------------------------------------------
        private static function image($frame, $pixelPerPoint = 4,
$outerFrame = 4) 
        {
            $h = count($frame);
            $w = strlen($frame[0]);
            
            $imgW = $w + 2*$outerFrame;
            $imgH = $h + 2*$outerFrame;
            
            $base_image =ImageCreate($imgW, $imgH);
            
            $col[0] = ImageColorAllocate($base_image,255,255,255);
            $col[1] = ImageColorAllocate($base_image,0,0,0);

            imagefill($base_image, 0, 0, $col[0]);

            for($y=0; $y<$h; $y++) {
                for($x=0; $x<$w; $x++) {
                    if ($frame[$y][$x] == '1') {
                       
ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); 
                    }
                }
            }
            
            $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH *
$pixelPerPoint);
            ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW
* $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
            ImageDestroy($base_image);
            
            return $target_image;
        }
    }libs/phpqrcode/qrinput.php000064400000060343151165347270011716
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Input encoding class
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    define('STRUCTURE_HEADER_BITS',  20);
    define('MAX_STRUCTURED_SYMBOLS', 16);

    class QRinputItem {
    
        public $mode;
        public $size;
        public $data;
        public $bstream;

        public function __construct($mode, $size, $data, $bstream = null) 
        {
            $setData = array_slice($data, 0, $size);
            
            if (count($setData) < $size) {
                $setData = array_merge($setData,
array_fill(0,$size-count($setData),0));
            }
        
            if(!QRinput::check($mode, $size, $setData)) {
                throw new Exception('Error
m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
                return null;
            }
            
            $this->mode = $mode;
            $this->size = $size;
            $this->data = $setData;
            $this->bstream = $bstream;
        }
        
       
//----------------------------------------------------------------------
        public function encodeModeNum($version)
        {
            try {
            
                $words = (int)($this->size / 3);
                $bs = new QRbitstream();
                
                $val = 0x1;
                $bs->appendNum(4, $val);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM,
$version), $this->size);

                for($i=0; $i<$words; $i++) {
                    $val  = (ord($this->data[$i*3  ]) -
ord('0')) * 100;
                    $val += (ord($this->data[$i*3+1]) -
ord('0')) * 10;
                    $val += (ord($this->data[$i*3+2]) -
ord('0'));
                    $bs->appendNum(10, $val);
                }

                if($this->size - $words * 3 == 1) {
                    $val = ord($this->data[$words*3]) -
ord('0');
                    $bs->appendNum(4, $val);
                } else if($this->size - $words * 3 == 2) {
                    $val  = (ord($this->data[$words*3  ]) -
ord('0')) * 10;
                    $val += (ord($this->data[$words*3+1]) -
ord('0'));
                    $bs->appendNum(7, $val);
                }

                $this->bstream = $bs;
                return 0;
                
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodeModeAn($version)
        {
            try {
                $words = (int)($this->size / 2);
                $bs = new QRbitstream();
                
                $bs->appendNum(4, 0x02);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN,
$version), $this->size);

                for($i=0; $i<$words; $i++) {
                    $val  =
(int)QRinput::lookAnTable(ord($this->data[$i*2  ])) * 45;
                    $val +=
(int)QRinput::lookAnTable(ord($this->data[$i*2+1]));

                    $bs->appendNum(11, $val);
                }

                if($this->size & 1) {
                    $val = QRinput::lookAnTable(ord($this->data[$words *
2]));
                    $bs->appendNum(6, $val);
                }
        
                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodeMode8($version)
        {
            try {
                $bs = new QRbitstream();

                $bs->appendNum(4, 0x4);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8,
$version), $this->size);

                for($i=0; $i<$this->size; $i++) {
                    $bs->appendNum(8, ord($this->data[$i]));
                }

                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function encodeModeKanji($version)
        {
            try {

                $bs = new QRbitrtream();
                
                $bs->appendNum(4, 0x8);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI,
$version), (int)($this->size / 2));

                for($i=0; $i<$this->size; $i+=2) {
                    $val = (ord($this->data[$i]) << 8) |
ord($this->data[$i+1]);
                    if($val <= 0x9ffc) {
                        $val -= 0x8140;
                    } else {
                        $val -= 0xc140;
                    }
                    
                    $h = ($val >> 8) * 0xc0;
                    $val = ($val & 0xff) + $h;

                    $bs->appendNum(13, $val);
                }

                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }

       
//----------------------------------------------------------------------
        public function encodeModeStructure()
        {
            try {
                $bs =  new QRbitstream();
                
                $bs->appendNum(4, 0x03);
                $bs->appendNum(4, ord($this->data[1]) - 1);
                $bs->appendNum(4, ord($this->data[0]) - 1);
                $bs->appendNum(8, ord($this->data[2]));

                $this->bstream = $bs;
                return 0;
            
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        public function estimateBitStreamSizeOfEntry($version)
        {
            $bits = 0;

            if($version == 0) 
                $version = 1;

            switch($this->mode) {
                case QR_MODE_NUM:        $bits =
QRinput::estimateBitsModeNum($this->size);    break;
                case QR_MODE_AN:        $bits =
QRinput::estimateBitsModeAn($this->size);    break;
                case QR_MODE_8:            $bits =
QRinput::estimateBitsMode8($this->size);    break;
                case QR_MODE_KANJI:        $bits =
QRinput::estimateBitsModeKanji($this->size);break;
                case QR_MODE_STRUCTURE:    return STRUCTURE_HEADER_BITS;   
        
                default:
                    return 0;
            }

            $l = QRspec::lengthIndicator($this->mode, $version);
            $m = 1 << $l;
            $num = (int)(($this->size + $m - 1) / $m);

            $bits += $num * (4 + $l);

            return $bits;
        }
        
       
//----------------------------------------------------------------------
        public function encodeBitStream($version)
        {
            try {
            
                unset($this->bstream);
                $words = QRspec::maximumWords($this->mode, $version);
                
                if($this->size > $words) {
                
                    $st1 = new QRinputItem($this->mode, $words,
$this->data);
                    $st2 = new QRinputItem($this->mode, $this->size -
$words, array_slice($this->data, $words));

                    $st1->encodeBitStream($version);
                    $st2->encodeBitStream($version);
                    
                    $this->bstream = new QRbitstream();
                    $this->bstream->append($st1->bstream);
                    $this->bstream->append($st2->bstream);
                    
                    unset($st1);
                    unset($st2);
                    
                } else {
                    
                    $ret = 0;
                    
                    switch($this->mode) {
                        case QR_MODE_NUM:        $ret =
$this->encodeModeNum($version);    break;
                        case QR_MODE_AN:        $ret =
$this->encodeModeAn($version);    break;
                        case QR_MODE_8:            $ret =
$this->encodeMode8($version);    break;
                        case QR_MODE_KANJI:        $ret =
$this->encodeModeKanji($version);break;
                        case QR_MODE_STRUCTURE:    $ret =
$this->encodeModeStructure();    break;
                        
                        default:
                            break;
                    }
                    
                    if($ret < 0)
                        return -1;
                }

                return $this->bstream->size();
            
            } catch (Exception $e) {
                return -1;
            }
        }
    };
    
   
//##########################################################################

    class QRinput {

        public $items;
        
        private $version;
        private $level;
        
       
//----------------------------------------------------------------------
        public function __construct($version = 0, $level = QR_ECLEVEL_L)
        {
            if ($version < 0 || $version > QRSPEC_VERSION_MAX ||
$level > QR_ECLEVEL_H) {
                throw new Exception('Invalid version no');
                return NULL;
            }
            
            $this->version = $version;
            $this->level = $level;
        }
        
       
//----------------------------------------------------------------------
        public function getVersion()
        {
            return $this->version;
        }
        
       
//----------------------------------------------------------------------
        public function setVersion($version)
        {
            if($version < 0 || $version > QRSPEC_VERSION_MAX) {
                throw new Exception('Invalid version no');
                return -1;
            }

            $this->version = $version;

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function getErrorCorrectionLevel()
        {
            return $this->level;
        }

       
//----------------------------------------------------------------------
        public function setErrorCorrectionLevel($level)
        {
            if($level > QR_ECLEVEL_H) {
                throw new Exception('Invalid ECLEVEL');
                return -1;
            }

            $this->level = $level;

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function appendEntry(QRinputItem $entry)
        {
            $this->items[] = $entry;
        }
        
       
//----------------------------------------------------------------------
        public function append($mode, $size, $data)
        {
            try {
                $entry = new QRinputItem($mode, $size, $data);
                $this->items[] = $entry;
                return 0;
            } catch (Exception $e) {
                return -1;
            }
        }
        
       
//----------------------------------------------------------------------
        
        public function insertStructuredAppendHeader($size, $index,
$parity)
        {
            if( $size > MAX_STRUCTURED_SYMBOLS ) {
                throw new Exception('insertStructuredAppendHeader
wrong size');
            }
            
            if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
                throw new Exception('insertStructuredAppendHeader
wrong index');
            }

            $buf = array($size, $index, $parity);
            
            try {
                $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
                array_unshift($this->items, $entry);
                return 0;
            } catch (Exception $e) {
                return -1;
            }
        }

       
//----------------------------------------------------------------------
        public function calcParity()
        {
            $parity = 0;
            
            foreach($this->items as $item) {
                if($item->mode != QR_MODE_STRUCTURE) {
                    for($i=$item->size-1; $i>=0; $i--) {
                        $parity ^= $item->data[$i];
                    }
                }
            }

            return $parity;
        }
        
       
//----------------------------------------------------------------------
        public static function checkModeNum($size, $data)
        {
            for($i=0; $i<$size; $i++) {
                if((ord($data[$i]) < ord('0')) ||
(ord($data[$i]) > ord('9'))){
                    return false;
                }
            }

            return true;
        }

       
//----------------------------------------------------------------------
        public static function estimateBitsModeNum($size)
        {
            $w = (int)$size / 3;
            $bits = $w * 10;
            
            switch($size - $w * 3) {
                case 1:
                    $bits += 4;
                    break;
                case 2:
                    $bits += 7;
                    break;
                default:
                    break;
            }

            return $bits;
        }
        
       
//----------------------------------------------------------------------
        public static $anTable = array(
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1,
            36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42,
43,
             0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1,
-1,
            -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24,
            25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1,
-1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
        );
        
       
//----------------------------------------------------------------------
        public static function lookAnTable($c)
        {
            return (($c > 127)?-1:self::$anTable[$c]);
        }
        
       
//----------------------------------------------------------------------
        public static function checkModeAn($size, $data)
        {
            for($i=0; $i<$size; $i++) {
                if (self::lookAnTable(ord($data[$i])) == -1) {
                    return false;
                }
            }

            return true;
        }
        
       
//----------------------------------------------------------------------
        public static function estimateBitsModeAn($size)
        {
            $w = (int)($size / 2);
            $bits = $w * 11;
            
            if($size & 1) {
                $bits += 6;
            }

            return $bits;
        }
    
       
//----------------------------------------------------------------------
        public static function estimateBitsMode8($size)
        {
            return $size * 8;
        }
        
       
//----------------------------------------------------------------------
        public function estimateBitsModeKanji($size)
        {
            return (int)(($size / 2) * 13);
        }
        
       
//----------------------------------------------------------------------
        public static function checkModeKanji($size, $data)
        {
            if($size & 1)
                return false;

            for($i=0; $i<$size; $i+=2) {
                $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
                if( $val < 0x8140 
                || ($val > 0x9ffc && $val < 0xe040) 
                || $val > 0xebbf) {
                    return false;
                }
            }

            return true;
        }

       
/***********************************************************************
         * Validation
        
**********************************************************************/

        public static function check($mode, $size, $data)
        {
            if($size <= 0) 
                return false;

            switch($mode) {
                case QR_MODE_NUM:       return self::checkModeNum($size,
$data);   break;
                case QR_MODE_AN:        return self::checkModeAn($size,
$data);    break;
                case QR_MODE_KANJI:     return self::checkModeKanji($size,
$data); break;
                case QR_MODE_8:         return true; break;
                case QR_MODE_STRUCTURE: return true; break;
                
                default:
                    break;
            }

            return false;
        }
        
        
       
//----------------------------------------------------------------------
        public function estimateBitStreamSize($version)
        {
            $bits = 0;

            foreach($this->items as $item) {
                $bits += $item->estimateBitStreamSizeOfEntry($version);
            }

            return $bits;
        }
        
       
//----------------------------------------------------------------------
        public function estimateVersion()
        {
            $version = 0;
            $prev = 0;
            do {
                $prev = $version;
                $bits = $this->estimateBitStreamSize($prev);
                $version = QRspec::getMinimumVersion((int)(($bits + 7) /
8), $this->level);
                if ($version < 0) {
                    return -1;
                }
            } while ($version > $prev);

            return $version;
        }
        
       
//----------------------------------------------------------------------
        public static function lengthOfCode($mode, $version, $bits)
        {
            $payload = $bits - 4 - QRspec::lengthIndicator($mode,
$version);
            switch($mode) {
                case QR_MODE_NUM:
                    $chunks = (int)($payload / 10);
                    $remain = $payload - $chunks * 10;
                    $size = $chunks * 3;
                    if($remain >= 7) {
                        $size += 2;
                    } else if($remain >= 4) {
                        $size += 1;
                    }
                    break;
                case QR_MODE_AN:
                    $chunks = (int)($payload / 11);
                    $remain = $payload - $chunks * 11;
                    $size = $chunks * 2;
                    if($remain >= 6) 
                        $size++;
                    break;
                case QR_MODE_8:
                    $size = (int)($payload / 8);
                    break;
                case QR_MODE_KANJI:
                    $size = (int)(($payload / 13) * 2);
                    break;
                case QR_MODE_STRUCTURE:
                    $size = (int)($payload / 8);
                    break;
                default:
                    $size = 0;
                    break;
            }
            
            $maxsize = QRspec::maximumWords($mode, $version);
            if($size < 0) $size = 0;
            if($size > $maxsize) $size = $maxsize;

            return $size;
        }
        
       
//----------------------------------------------------------------------
        public function createBitStream()
        {
            $total = 0;

            foreach($this->items as $item) {
                $bits = $item->encodeBitStream($this->version);
                
                if($bits < 0) 
                    return -1;
                    
                $total += $bits;
            }

            return $total;
        }
        
       
//----------------------------------------------------------------------
        public function convertData()
        {
            $ver = $this->estimateVersion();
            if($ver > $this->getVersion()) {
                $this->setVersion($ver);
            }

            for(;;) {
                $bits = $this->createBitStream();
                
                if($bits < 0) 
                    return -1;
                    
                $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8),
$this->level);
                if($ver < 0) {
                    throw new Exception('WRONG VERSION');
                    return -1;
                } else if($ver > $this->getVersion()) {
                    $this->setVersion($ver);
                } else {
                    break;
                }
            }

            return 0;
        }
        
       
//----------------------------------------------------------------------
        public function appendPaddingBit(&$bstream)
        {
            $bits = $bstream->size();
            $maxwords = QRspec::getDataLength($this->version,
$this->level);
            $maxbits = $maxwords * 8;

            if ($maxbits == $bits) {
                return 0;
            }

            if ($maxbits - $bits < 5) {
                return $bstream->appendNum($maxbits - $bits, 0);
            }

            $bits += 4;
            $words = (int)(($bits + 7) / 8);

            $padding = new QRbitstream();
            $ret = $padding->appendNum($words * 8 - $bits + 4, 0);
            
            if($ret < 0) 
                return $ret;

            $padlen = $maxwords - $words;
            
            if($padlen > 0) {
                
                $padbuf = array();
                for($i=0; $i<$padlen; $i++) {
                    $padbuf[$i] = ($i&1)?0x11:0xec;
                }
                
                $ret = $padding->appendBytes($padlen, $padbuf);
                
                if($ret < 0)
                    return $ret;
                
            }

            $ret = $bstream->append($padding);
            
            return $ret;
        }

       
//----------------------------------------------------------------------
        public function mergeBitStream()
        {
            if($this->convertData() < 0) {
                return null;
            }

            $bstream = new QRbitstream();
            
            foreach($this->items as $item) {
                $ret = $bstream->append($item->bstream);
                if($ret < 0) {
                    return null;
                }
            }

            return $bstream;
        }

       
//----------------------------------------------------------------------
        public function getBitStream()
        {

            $bstream = $this->mergeBitStream();
            
            if($bstream == null) {
                return null;
            }
            
            $ret = $this->appendPaddingBit($bstream);
            if($ret < 0) {
                return null;
            }

            return $bstream;
        }
        
       
//----------------------------------------------------------------------
        public function getByteStream()
        {
            $bstream = $this->getBitStream();
            if($bstream == null) {
                return null;
            }
            
            return $bstream->toByte();
        }
    }
        
        
    libs/phpqrcode/qrlib.php000064400000003102151165347300011305
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Root library file, prepares environment and includes dependencies
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
	
	$QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;
	
	// Required libs
	
	include $QR_BASEDIR."qrconst.php";
	include $QR_BASEDIR."qrconfig.php";
	include $QR_BASEDIR."qrtools.php";
	include $QR_BASEDIR."qrspec.php";
	include $QR_BASEDIR."qrimage.php";
	include $QR_BASEDIR."qrinput.php";
	include $QR_BASEDIR."qrbitstream.php";
	include $QR_BASEDIR."qrsplit.php";
	include $QR_BASEDIR."qrrscode.php";
	include $QR_BASEDIR."qrmask.php";
	include $QR_BASEDIR."qrencode.php";

libs/phpqrcode/qrmask.php000064400000030450151165347300011500
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Masking
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
	define('N1', 3);
	define('N2', 3);
	define('N3', 40);
	define('N4', 10);

	class QRmask {
	
		public $runLength = array();
		
		//----------------------------------------------------------------------
		public function __construct() 
        {
            $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
        }
        
       
//----------------------------------------------------------------------
        public function writeFormatInformation($width, &$frame, $mask,
$level)
        {
            $blacks = 0;
            $format =  QRspec::getFormatInfo($mask, $level);

            for($i=0; $i<8; $i++) {
                if($format & 1) {
                    $blacks += 2;
                    $v = 0x85;
                } else {
                    $v = 0x84;
                }
                
                $frame[8][$width - 1 - $i] = chr($v);
                if($i < 6) {
                    $frame[$i][8] = chr($v);
                } else {
                    $frame[$i + 1][8] = chr($v);
                }
                $format = $format >> 1;
            }
            
            for($i=0; $i<7; $i++) {
                if($format & 1) {
                    $blacks += 2;
                    $v = 0x85;
                } else {
                    $v = 0x84;
                }
                
                $frame[$width - 7 + $i][8] = chr($v);
                if($i == 0) {
                    $frame[8][7] = chr($v);
                } else {
                    $frame[8][6 - $i] = chr($v);
                }
                
                $format = $format >> 1;
            }

            return $blacks;
        }
        
       
//----------------------------------------------------------------------
        public function mask0($x, $y) { return ($x+$y)&1;              
        }
        public function mask1($x, $y) { return ($y&1);                 
        }
        public function mask2($x, $y) { return ($x%3);                     
    }
        public function mask3($x, $y) { return ($x+$y)%3;                  
    }
        public function mask4($x, $y) { return
(((int)($y/2))+((int)($x/3)))&1; }
        public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3;  
        }
        public function mask6($x, $y) { return
((($x*$y)&1)+($x*$y)%3)&1;       }
        public function mask7($x, $y) { return
((($x*$y)%3)+(($x+$y)&1))&1;     }
        
       
//----------------------------------------------------------------------
        private function generateMaskNo($maskNo, $width, $frame)
        {
            $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
            
            for($y=0; $y<$width; $y++) {
                for($x=0; $x<$width; $x++) {
                    if(ord($frame[$y][$x]) & 0x80) {
                        $bitMask[$y][$x] = 0;
                    } else {
                        $maskFunc = call_user_func(array($this,
'mask'.$maskNo), $x, $y);
                        $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
                    }
                    
                }
            }
            
            return $bitMask;
        }
        
       
//----------------------------------------------------------------------
        public static function serial($bitFrame)
        {
            $codeArr = array();
            
            foreach ($bitFrame as $line)
                $codeArr[] = join('', $line);
                
            return gzcompress(join("\n", $codeArr), 9);
        }
        
       
//----------------------------------------------------------------------
        public static function unserial($code)
        {
            $codeArr = array();
            
            $codeLines = explode("\n", gzuncompress($code));
            foreach ($codeLines as $line)
                $codeArr[] = str_split($line);
            
            return $codeArr;
        }
        
       
//----------------------------------------------------------------------
        public function makeMaskNo($maskNo, $width, $s, &$d,
$maskGenOnly = false) 
        {
            $b = 0;
            $bitMask = array();
            
            $fileName =
QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';

            if (QR_CACHEABLE) {
                if (file_exists($fileName)) {
                    $bitMask =
self::unserial(file_get_contents($fileName));
                } else {
                    $bitMask = $this->generateMaskNo($maskNo, $width,
$s, $d);
                    if
(!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
                        mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
                    file_put_contents($fileName, self::serial($bitMask));
                }
            } else {
                $bitMask = $this->generateMaskNo($maskNo, $width, $s,
$d);
            }

            if ($maskGenOnly)
                return;
                
            $d = $s;

            for($y=0; $y<$width; $y++) {
                for($x=0; $x<$width; $x++) {
                    if($bitMask[$y][$x] == 1) {
                        $d[$y][$x] = chr(ord($s[$y][$x]) ^
(int)$bitMask[$y][$x]);
                    }
                    $b += (int)(ord($d[$y][$x]) & 1);
                }
            }

            return $b;
        }
        
       
//----------------------------------------------------------------------
        public function makeMask($width, $frame, $maskNo, $level)
        {
            $masked = array_fill(0, $width, str_repeat("\0",
$width));
            $this->makeMaskNo($maskNo, $width, $frame, $masked);
            $this->writeFormatInformation($width, $masked, $maskNo,
$level);
       
            return $masked;
        }
        
       
//----------------------------------------------------------------------
        public function calcN1N3($length)
        {
            $demerit = 0;

            for($i=0; $i<$length; $i++) {
                
                if($this->runLength[$i] >= 5) {
                    $demerit += (N1 + ($this->runLength[$i] - 5));
                }
                if($i & 1) {
                    if(($i >= 3) && ($i < ($length-2))
&& ($this->runLength[$i] % 3 == 0)) {
                        $fact = (int)($this->runLength[$i] / 3);
                        if(($this->runLength[$i-2] == $fact) &&
                           ($this->runLength[$i-1] == $fact) &&
                           ($this->runLength[$i+1] == $fact) &&
                           ($this->runLength[$i+2] == $fact)) {
                            if(($this->runLength[$i-3] < 0) ||
($this->runLength[$i-3] >= (4 * $fact))) {
                                $demerit += N3;
                            } else if((($i+3) >= $length) ||
($this->runLength[$i+3] >= (4 * $fact))) {
                                $demerit += N3;
                            }
                        }
                    }
                }
            }
            return $demerit;
        }
        
       
//----------------------------------------------------------------------
        public function evaluateSymbol($width, $frame)
        {
            $head = 0;
            $demerit = 0;

            for($y=0; $y<$width; $y++) {
                $head = 0;
                $this->runLength[0] = 1;
                
                $frameY = $frame[$y];
                
                if ($y>0)
                    $frameYM = $frame[$y-1];
                
                for($x=0; $x<$width; $x++) {
                    if(($x > 0) && ($y > 0)) {
                        $b22 = ord($frameY[$x]) & ord($frameY[$x-1])
& ord($frameYM[$x]) & ord($frameYM[$x-1]);
                        $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) |
ord($frameYM[$x]) | ord($frameYM[$x-1]);
                        
                        if(($b22 | ($w22 ^ 1))&1) {                    
                                                
                            $demerit += N2;
                        }
                    }
                    if(($x == 0) && (ord($frameY[$x]) & 1)) {
                        $this->runLength[0] = -1;
                        $head = 1;
                        $this->runLength[$head] = 1;
                    } else if($x > 0) {
                        if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1)
{
                            $head++;
                            $this->runLength[$head] = 1;
                        } else {
                            $this->runLength[$head]++;
                        }
                    }
                }
    
                $demerit += $this->calcN1N3($head+1);
            }

            for($x=0; $x<$width; $x++) {
                $head = 0;
                $this->runLength[0] = 1;
                
                for($y=0; $y<$width; $y++) {
                    if($y == 0 && (ord($frame[$y][$x]) & 1)) {
                        $this->runLength[0] = -1;
                        $head = 1;
                        $this->runLength[$head] = 1;
                    } else if($y > 0) {
                        if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x]))
& 1) {
                            $head++;
                            $this->runLength[$head] = 1;
                        } else {
                            $this->runLength[$head]++;
                        }
                    }
                }
            
                $demerit += $this->calcN1N3($head+1);
            }

            return $demerit;
        }
        
        
       
//----------------------------------------------------------------------
        public function mask($width, $frame, $level)
        {
            $minDemerit = PHP_INT_MAX;
            $bestMaskNum = 0;
            $bestMask = array();
            
            $checked_masks = array(0,1,2,3,4,5,6,7);
            
            if (QR_FIND_FROM_RANDOM !== false) {
            
                $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
                for ($i = 0; $i <  $howManuOut; $i++) {
                    $remPos = rand (0, count($checked_masks)-1);
                    unset($checked_masks[$remPos]);
                    $checked_masks = array_values($checked_masks);
                }
            
            }
            
            $bestMask = $frame;
             
            foreach($checked_masks as $i) {
                $mask = array_fill(0, $width, str_repeat("\0",
$width));

                $demerit = 0;
                $blacks = 0;
                $blacks  = $this->makeMaskNo($i, $width, $frame,
$mask);
                $blacks += $this->writeFormatInformation($width, $mask,
$i, $level);
                $blacks  = (int)(100 * $blacks / ($width * $width));
                $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
                $demerit += $this->evaluateSymbol($width, $mask);
                
                if($demerit < $minDemerit) {
                    $minDemerit = $demerit;
                    $bestMask = $mask;
                    $bestMaskNum = $i;
                }
            }
            
            return $bestMask;
        }
        
       
//----------------------------------------------------------------------
    }
libs/phpqrcode/qrrscode.php000064400000020445151165347300012027
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Reed-Solomon error correction support
 * 
 * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
 * (libfec is released under the GNU Lesser General Public License.)
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    class QRrsItem {
    
        public $mm;                  // Bits per symbol 
        public $nn;                  // Symbols per block (=
(1<<mm)-1) 
        public $alpha_to = array();  // log lookup table 
        public $index_of = array();  // Antilog lookup table 
        public $genpoly = array();   // Generator polynomial 
        public $nroots;              // Number of generator roots = number
of parity symbols 
        public $fcr;                 // First consecutive root, index form

        public $prim;                // Primitive element, index form 
        public $iprim;               // prim-th root of 1, index form 
        public $pad;                 // Padding bytes in shortened block 
        public $gfpoly;
    
       
//----------------------------------------------------------------------
        public function modnn($x)
        {
            while ($x >= $this->nn) {
                $x -= $this->nn;
                $x = ($x >> $this->mm) + ($x & $this->nn);
            }
            
            return $x;
        }
        
       
//----------------------------------------------------------------------
        public static function init_rs_char($symsize, $gfpoly, $fcr, $prim,
$nroots, $pad)
        {
            // Common code for intializing a Reed-Solomon control block
(char or int symbols)
            // Copyright 2004 Phil Karn, KA9Q
            // May be used under the terms of the GNU Lesser General Public
License (LGPL)

            $rs = null;
            
            // Check parameter ranges
            if($symsize < 0 || $symsize > 8)                    
return $rs;
            if($fcr < 0 || $fcr >= (1<<$symsize))              
 return $rs;
            if($prim <= 0 || $prim >= (1<<$symsize))           
 return $rs;
            if($nroots < 0 || $nroots >= (1<<$symsize))        
 return $rs; // Can't have more roots than symbol values!
            if($pad < 0 || $pad >= ((1<<$symsize) -1 -
$nroots)) return $rs; // Too much padding

            $rs = new QRrsItem();
            $rs->mm = $symsize;
            $rs->nn = (1<<$symsize)-1;
            $rs->pad = $pad;

            $rs->alpha_to = array_fill(0, $rs->nn+1, 0);
            $rs->index_of = array_fill(0, $rs->nn+1, 0);
          
            // PHP style macro replacement ;)
            $NN =& $rs->nn;
            $A0 =& $NN;
            
            // Generate Galois field lookup tables
            $rs->index_of[0] = $A0; // log(zero) = -inf
            $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
            $sr = 1;
          
            for($i=0; $i<$rs->nn; $i++) {
                $rs->index_of[$sr] = $i;
                $rs->alpha_to[$i] = $sr;
                $sr <<= 1;
                if($sr & (1<<$symsize)) {
                    $sr ^= $gfpoly;
                }
                $sr &= $rs->nn;
            }
            
            if($sr != 1){
                // field generator polynomial is not primitive!
                $rs = NULL;
                return $rs;
            }

            /* Form RS code generator polynomial from its roots */
            $rs->genpoly = array_fill(0, $nroots+1, 0);
        
            $rs->fcr = $fcr;
            $rs->prim = $prim;
            $rs->nroots = $nroots;
            $rs->gfpoly = $gfpoly;

            /* Find prim-th root of 1, used in decoding */
            for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
            ; // intentional empty-body loop!
            
            $rs->iprim = (int)($iprim / $prim);
            $rs->genpoly[0] = 1;
            
            for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root +=
$prim) {
                $rs->genpoly[$i+1] = 1;

                // Multiply rs->genpoly[] by  @**(root + x)
                for ($j = $i; $j > 0; $j--) {
                    if ($rs->genpoly[$j] != 0) {
                        $rs->genpoly[$j] = $rs->genpoly[$j-1] ^
$rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] +
$root)];
                    } else {
                        $rs->genpoly[$j] = $rs->genpoly[$j-1];
                    }
                }
                // rs->genpoly[0] can never be zero
                $rs->genpoly[0] =
$rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] +
$root)];
            }
            
            // convert rs->genpoly[] to index form for quicker encoding
            for ($i = 0; $i <= $nroots; $i++)
                $rs->genpoly[$i] =
$rs->index_of[$rs->genpoly[$i]];

            return $rs;
        }
        
       
//----------------------------------------------------------------------
        public function encode_rs_char($data, &$parity)
        {
            $MM       =& $this->mm;
            $NN       =& $this->nn;
            $ALPHA_TO =& $this->alpha_to;
            $INDEX_OF =& $this->index_of;
            $GENPOLY  =& $this->genpoly;
            $NROOTS   =& $this->nroots;
            $FCR      =& $this->fcr;
            $PRIM     =& $this->prim;
            $IPRIM    =& $this->iprim;
            $PAD      =& $this->pad;
            $A0       =& $NN;

            $parity = array_fill(0, $NROOTS, 0);

            for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {
                
                $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
                if($feedback != $A0) {      
                    // feedback term is non-zero
            
                    // This line is unnecessary when GENPOLY[NROOTS] is
unity, as it must
                    // always be for the polynomials constructed by
init_rs()
                    $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] +
$feedback);
            
                    for($j=1;$j<$NROOTS;$j++) {
                        $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback
+ $GENPOLY[$NROOTS-$j])];
                    }
                }
                
                // Shift 
                array_shift($parity);
                if($feedback != $A0) {
                    array_push($parity, $ALPHA_TO[$this->modnn($feedback
+ $GENPOLY[0])]);
                } else {
                    array_push($parity, 0);
                }
            }
        }
    }
    
   
//##########################################################################
    
    class QRrs {
    
        public static $items = array();
        
       
//----------------------------------------------------------------------
        public static function init_rs($symsize, $gfpoly, $fcr, $prim,
$nroots, $pad)
        {
            foreach(self::$items as $rs) {
                if($rs->pad != $pad)       continue;
                if($rs->nroots != $nroots) continue;
                if($rs->mm != $symsize)    continue;
                if($rs->gfpoly != $gfpoly) continue;
                if($rs->fcr != $fcr)       continue;
                if($rs->prim != $prim)     continue;

                return $rs;
            }

            $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim,
$nroots, $pad);
            array_unshift(self::$items, $rs);

            return $rs;
        }
    }libs/phpqrcode/qrspec.php000064400000063764151165347300011515
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * QR Code specifications
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * The following data / specifications are taken from
 * "Two dimensional symbol -- QR-code -- Basic Specification"
(JIS X0510:2004)
 *  or
 * "Automatic identification and data capture techniques -- 
 *  QR Code 2005 bar code symbology specification" (ISO/IEC
18004:2006)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    define('QRSPEC_VERSION_MAX', 40);
    define('QRSPEC_WIDTH_MAX',   177);

    define('QRCAP_WIDTH',        0);
    define('QRCAP_WORDS',        1);
    define('QRCAP_REMINDER',     2);
    define('QRCAP_EC',           3);

    class QRspec {
    
        public static $capacity = array(
            array(  0,    0, 0, array(   0,    0,    0,    0)),
            array( 21,   26, 0, array(   7,   10,   13,   17)), // 1
            array( 25,   44, 7, array(  10,   16,   22,   28)),
            array( 29,   70, 7, array(  15,   26,   36,   44)),
            array( 33,  100, 7, array(  20,   36,   52,   64)),
            array( 37,  134, 7, array(  26,   48,   72,   88)), // 5
            array( 41,  172, 7, array(  36,   64,   96,  112)),
            array( 45,  196, 0, array(  40,   72,  108,  130)),
            array( 49,  242, 0, array(  48,   88,  132,  156)),
            array( 53,  292, 0, array(  60,  110,  160,  192)),
            array( 57,  346, 0, array(  72,  130,  192,  224)), //10
            array( 61,  404, 0, array(  80,  150,  224,  264)),
            array( 65,  466, 0, array(  96,  176,  260,  308)),
            array( 69,  532, 0, array( 104,  198,  288,  352)),
            array( 73,  581, 3, array( 120,  216,  320,  384)),
            array( 77,  655, 3, array( 132,  240,  360,  432)), //15
            array( 81,  733, 3, array( 144,  280,  408,  480)),
            array( 85,  815, 3, array( 168,  308,  448,  532)),
            array( 89,  901, 3, array( 180,  338,  504,  588)),
            array( 93,  991, 3, array( 196,  364,  546,  650)),
            array( 97, 1085, 3, array( 224,  416,  600,  700)), //20
            array(101, 1156, 4, array( 224,  442,  644,  750)),
            array(105, 1258, 4, array( 252,  476,  690,  816)),
            array(109, 1364, 4, array( 270,  504,  750,  900)),
            array(113, 1474, 4, array( 300,  560,  810,  960)),
            array(117, 1588, 4, array( 312,  588,  870, 1050)), //25
            array(121, 1706, 4, array( 336,  644,  952, 1110)),
            array(125, 1828, 4, array( 360,  700, 1020, 1200)),
            array(129, 1921, 3, array( 390,  728, 1050, 1260)),
            array(133, 2051, 3, array( 420,  784, 1140, 1350)),
            array(137, 2185, 3, array( 450,  812, 1200, 1440)), //30
            array(141, 2323, 3, array( 480,  868, 1290, 1530)),
            array(145, 2465, 3, array( 510,  924, 1350, 1620)),
            array(149, 2611, 3, array( 540,  980, 1440, 1710)),
            array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
            array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
            array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
            array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
            array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
            array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
            array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
        );
        
       
//----------------------------------------------------------------------
        public static function getDataLength($version, $level)
        {
            return self::$capacity[$version][QRCAP_WORDS] -
self::$capacity[$version][QRCAP_EC][$level];
        }
        
       
//----------------------------------------------------------------------
        public static function getECCLength($version, $level)
        {
            return self::$capacity[$version][QRCAP_EC][$level];
        }
        
       
//----------------------------------------------------------------------
        public static function getWidth($version)
        {
            return self::$capacity[$version][QRCAP_WIDTH];
        }
        
       
//----------------------------------------------------------------------
        public static function getRemainder($version)
        {
            return self::$capacity[$version][QRCAP_REMINDER];
        }
        
       
//----------------------------------------------------------------------
        public static function getMinimumVersion($size, $level)
        {

            for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
                $words  = self::$capacity[$i][QRCAP_WORDS] -
self::$capacity[$i][QRCAP_EC][$level];
                if($words >= $size) 
                    return $i;
            }

            return -1;
        }
    
       
//######################################################################
        
        public static $lengthTableBits = array(
            array(10, 12, 14),
            array( 9, 11, 13),
            array( 8, 16, 16),
            array( 8, 10, 12)
        );
        
       
//----------------------------------------------------------------------
        public static function lengthIndicator($mode, $version)
        {
            if ($mode == QR_MODE_STRUCTURE)
                return 0;
                
            if ($version <= 9) {
                $l = 0;
            } else if ($version <= 26) {
                $l = 1;
            } else {
                $l = 2;
            }

            return self::$lengthTableBits[$mode][$l];
        }
        
       
//----------------------------------------------------------------------
        public static function maximumWords($mode, $version)
        {
            if($mode == QR_MODE_STRUCTURE) 
                return 3;
                
            if($version <= 9) {
                $l = 0;
            } else if($version <= 26) {
                $l = 1;
            } else {
                $l = 2;
            }

            $bits = self::$lengthTableBits[$mode][$l];
            $words = (1 << $bits) - 1;
            
            if($mode == QR_MODE_KANJI) {
                $words *= 2; // the number of bytes is required
            }

            return $words;
        }

        // Error correction code
-----------------------------------------------
        // Table of the error correction code (Reed-Solomon block)
        // See Table 12-16 (pp.30-36), JIS X0510:2004.

        public static $eccTable = array(
            array(array( 0,  0), array( 0,  0), array( 0,  0), array( 0, 
0)),
            array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1, 
0)), // 1
            array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1, 
0)),
            array(array( 1,  0), array( 1,  0), array( 2,  0), array( 2, 
0)),
            array(array( 1,  0), array( 2,  0), array( 2,  0), array( 4, 
0)),
            array(array( 1,  0), array( 2,  0), array( 2,  2), array( 2, 
2)), // 5
            array(array( 2,  0), array( 4,  0), array( 4,  0), array( 4, 
0)),
            array(array( 2,  0), array( 4,  0), array( 2,  4), array( 4, 
1)),
            array(array( 2,  0), array( 2,  2), array( 4,  2), array( 4, 
2)),
            array(array( 2,  0), array( 3,  2), array( 4,  4), array( 4, 
4)),
            array(array( 2,  2), array( 4,  1), array( 6,  2), array( 6, 
2)), //10
            array(array( 4,  0), array( 1,  4), array( 4,  4), array( 3, 
8)),
            array(array( 2,  2), array( 6,  2), array( 4,  6), array( 7, 
4)),
            array(array( 4,  0), array( 8,  1), array( 8,  4), array(12, 
4)),
            array(array( 3,  1), array( 4,  5), array(11,  5), array(11, 
5)),
            array(array( 5,  1), array( 5,  5), array( 5,  7), array(11, 
7)), //15
            array(array( 5,  1), array( 7,  3), array(15,  2), array( 3,
13)),
            array(array( 1,  5), array(10,  1), array( 1, 15), array( 2,
17)),
            array(array( 5,  1), array( 9,  4), array(17,  1), array( 2,
19)),
            array(array( 3,  4), array( 3, 11), array(17,  4), array( 9,
16)),
            array(array( 3,  5), array( 3, 13), array(15,  5), array(15,
10)), //20
            array(array( 4,  4), array(17,  0), array(17,  6), array(19, 
6)),
            array(array( 2,  7), array(17,  0), array( 7, 16), array(34, 
0)),
            array(array( 4,  5), array( 4, 14), array(11, 14), array(16,
14)),
            array(array( 6,  4), array( 6, 14), array(11, 16), array(30, 
2)),
            array(array( 8,  4), array( 8, 13), array( 7, 22), array(22,
13)), //25
            array(array(10,  2), array(19,  4), array(28,  6), array(33, 
4)),
            array(array( 8,  4), array(22,  3), array( 8, 26), array(12,
28)),
            array(array( 3, 10), array( 3, 23), array( 4, 31), array(11,
31)),
            array(array( 7,  7), array(21,  7), array( 1, 37), array(19,
26)),
            array(array( 5, 10), array(19, 10), array(15, 25), array(23,
25)), //30
            array(array(13,  3), array( 2, 29), array(42,  1), array(23,
28)),
            array(array(17,  0), array(10, 23), array(10, 35), array(19,
35)),
            array(array(17,  1), array(14, 21), array(29, 19), array(11,
46)),
            array(array(13,  6), array(14, 23), array(44,  7), array(59, 
1)),
            array(array(12,  7), array(12, 26), array(39, 14), array(22,
41)), //35
            array(array( 6, 14), array( 6, 34), array(46, 10), array( 2,
64)),
            array(array(17,  4), array(29, 14), array(49, 10), array(24,
46)),
            array(array( 4, 18), array(13, 32), array(48, 14), array(42,
32)),
            array(array(20,  4), array(40,  7), array(43, 22), array(10,
67)),
            array(array(19,  6), array(18, 31), array(34, 34), array(20,
61)),//40
        );                                                                 
     

       
//----------------------------------------------------------------------
        // CACHEABLE!!!
        
        public static function getEccSpec($version, $level, array
&$spec)
        {
            if (count($spec) < 5) {
                $spec = array(0,0,0,0,0);
            }

            $b1   = self::$eccTable[$version][$level][0];
            $b2   = self::$eccTable[$version][$level][1];
            $data = self::getDataLength($version, $level);
            $ecc  = self::getECCLength($version, $level);

            if($b2 == 0) {
                $spec[0] = $b1;
                $spec[1] = (int)($data / $b1);
                $spec[2] = (int)($ecc / $b1);
                $spec[3] = 0; 
                $spec[4] = 0;
            } else {
                $spec[0] = $b1;
                $spec[1] = (int)($data / ($b1 + $b2));
                $spec[2] = (int)($ecc  / ($b1 + $b2));
                $spec[3] = $b2;
                $spec[4] = $spec[1] + 1;
            }
        }

        // Alignment pattern
---------------------------------------------------

        // Positions of alignment patterns.
        // This array includes only the second and the third position of
the 
        // alignment patterns. Rest of them can be calculated from the
distance 
        // between them.
         
        // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
         
        public static $alignmentPattern = array(      
            array( 0,  0),
            array( 0,  0), array(18,  0), array(22,  0), array(26,  0),
array(30,  0), // 1- 5
            array(34,  0), array(22, 38), array(24, 42), array(26, 46),
array(28, 50), // 6-10
            array(30, 54), array(32, 58), array(34, 62), array(26, 46),
array(26, 48), //11-15
            array(26, 50), array(30, 54), array(30, 56), array(30, 58),
array(34, 62), //16-20
            array(28, 50), array(26, 50), array(30, 54), array(28, 54),
array(32, 58), //21-25
            array(30, 58), array(34, 62), array(26, 50), array(30, 54),
array(26, 52), //26-30
            array(30, 56), array(34, 60), array(30, 58), array(34, 62),
array(30, 54), //31-35
            array(24, 50), array(28, 54), array(32, 58), array(26, 54),
array(30, 58), //35-40
        );                                                                 
                

        
        /**
--------------------------------------------------------------------
         * Put an alignment marker.
         * @param frame
         * @param width
         * @param ox,oy center coordinate of the pattern
         */
        public static function putAlignmentMarker(array &$frame, $ox,
$oy)
        {
            $finder = array(
                "\xa1\xa1\xa1\xa1\xa1",
                "\xa1\xa0\xa0\xa0\xa1",
                "\xa1\xa0\xa1\xa0\xa1",
                "\xa1\xa0\xa0\xa0\xa1",
                "\xa1\xa1\xa1\xa1\xa1"
            );                        
            
            $yStart = $oy-2;         
            $xStart = $ox-2;
            
            for($y=0; $y<5; $y++) {
                QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
            }
        }

       
//----------------------------------------------------------------------
        public static function putAlignmentPattern($version, &$frame,
$width)
        {
            if($version < 2)
                return;

            $d = self::$alignmentPattern[$version][1] -
self::$alignmentPattern[$version][0];
            if($d < 0) {
                $w = 2;
            } else {
                $w = (int)(($width - self::$alignmentPattern[$version][0])
/ $d + 2);
            }

            if($w * $w - 3 == 1) {
                $x = self::$alignmentPattern[$version][0];
                $y = self::$alignmentPattern[$version][0];
                self::putAlignmentMarker($frame, $x, $y);
                return;
            }

            $cx = self::$alignmentPattern[$version][0];
            for($x=1; $x<$w - 1; $x++) {
                self::putAlignmentMarker($frame, 6, $cx);
                self::putAlignmentMarker($frame, $cx,  6);
                $cx += $d;
            }

            $cy = self::$alignmentPattern[$version][0];
            for($y=0; $y<$w-1; $y++) {
                $cx = self::$alignmentPattern[$version][0];
                for($x=0; $x<$w-1; $x++) {
                    self::putAlignmentMarker($frame, $cx, $cy);
                    $cx += $d;
                }
                $cy += $d;
            }
        }

        // Version information pattern
-----------------------------------------

		// Version information pattern (BCH coded).
        // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
        
		// size: [QRSPEC_VERSION_MAX - 6]
		
        public static $versionPattern = array(
            0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847,
0x0e60d,
            0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683,
0x168c9,
            0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f,
0x1ed75,
            0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e,
0x26a64,
            0x27541, 0x28c69
        );

       
//----------------------------------------------------------------------
        public static function getVersionPattern($version)
        {
            if($version < 7 || $version > QRSPEC_VERSION_MAX)
                return 0;

            return self::$versionPattern[$version -7];
        }

        // Format information
--------------------------------------------------
        // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c
lib)
        
        public static $formatInfo = array(
            array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41,
0x6976),
            array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97,
0x4aa0),
            array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda,
0x2bed),
            array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c,
0x083b)
        );

        public static function getFormatInfo($mask, $level)
        {
            if($mask < 0 || $mask > 7)
                return 0;
                
            if($level < 0 || $level > 3)
                return 0;                

            return self::$formatInfo[$level][$mask];
        }

        // Frame
---------------------------------------------------------------
        // Cache of initial frames.
         
        public static $frames = array();

        /**
--------------------------------------------------------------------
         * Put a finder pattern.
         * @param frame
         * @param width
         * @param ox,oy upper-left coordinate of the pattern
         */
        public static function putFinderPattern(&$frame, $ox, $oy)
        {
            $finder = array(
                "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
                "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
                "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
                "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
                "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
                "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
                "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
            );                            
            
            for($y=0; $y<7; $y++) {
                QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
            }
        }

       
//----------------------------------------------------------------------
        public static function createFrame($version)
        {
            $width = self::$capacity[$version][QRCAP_WIDTH];
            $frameLine = str_repeat ("\0", $width);
            $frame = array_fill(0, $width, $frameLine);

            // Finder pattern
            self::putFinderPattern($frame, 0, 0);
            self::putFinderPattern($frame, $width - 7, 0);
            self::putFinderPattern($frame, 0, $width - 7);
            
            // Separator
            $yOffset = $width - 7;
            
            for($y=0; $y<7; $y++) {
                $frame[$y][7] = "\xc0";
                $frame[$y][$width - 8] = "\xc0";
                $frame[$yOffset][7] = "\xc0";
                $yOffset++;
            }
            
            $setPattern = str_repeat("\xc0", 8);
            
            QRstr::set($frame, 0, 7, $setPattern);
            QRstr::set($frame, $width-8, 7, $setPattern);
            QRstr::set($frame, 0, $width - 8, $setPattern);
        
            // Format info
            $setPattern = str_repeat("\x84", 9);
            QRstr::set($frame, 0, 8, $setPattern);
            QRstr::set($frame, $width - 8, 8, $setPattern, 8);
            
            $yOffset = $width - 8;

            for($y=0; $y<8; $y++,$yOffset++) {
                $frame[$y][8] = "\x84";
                $frame[$yOffset][8] = "\x84";
            }

            // Timing pattern  
            
            for($i=1; $i<$width-15; $i++) {
                $frame[6][7+$i] = chr(0x90 | ($i & 1));
                $frame[7+$i][6] = chr(0x90 | ($i & 1));
            }
            
            // Alignment pattern  
            self::putAlignmentPattern($version, $frame, $width);
            
            // Version information 
            if($version >= 7) {
                $vinf = self::getVersionPattern($version);

                $v = $vinf;
                
                for($x=0; $x<6; $x++) {
                    for($y=0; $y<3; $y++) {
                        $frame[($width - 11)+$y][$x] = chr(0x88 | ($v &
1));
                        $v = $v >> 1;
                    }
                }

                $v = $vinf;
                for($y=0; $y<6; $y++) {
                    for($x=0; $x<3; $x++) {
                        $frame[$y][$x+($width - 11)] = chr(0x88 | ($v &
1));
                        $v = $v >> 1;
                    }
                }
            }
    
            // and a little bit...  
            $frame[$width - 8][8] = "\x81";
            
            return $frame;
        }

       
//----------------------------------------------------------------------
        public static function debug($frame, $binary_mode = false)
        {
            if ($binary_mode) {
            
                    foreach ($frame as &$frameLine) {
                        $frameLine = join('<span
class="m">&nbsp;&nbsp;</span>',
explode('0', $frameLine));
                        $frameLine =
join('&#9608;&#9608;', explode('1',
$frameLine));
                    }
                    
                    ?>
                <style>
                    .m { background-color: white; }
                </style>
                <?php
                    echo '<pre><tt><br/ ><br/
><br/
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
                    echo join("<br/
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
$frame);
                    echo '</tt></pre><br/ ><br/
><br/ ><br/ ><br/ ><br/ >';
            
            } else {
            
                foreach ($frame as &$frameLine) {
                    $frameLine = join('<span
class="m">&nbsp;</span>', 
explode("\xc0", $frameLine));
                    $frameLine = join('<span
class="m">&#9618;</span>',
explode("\xc1", $frameLine));
                    $frameLine = join('<span
class="p">&nbsp;</span>', 
explode("\xa0", $frameLine));
                    $frameLine = join('<span
class="p">&#9618;</span>',
explode("\xa1", $frameLine));
                    $frameLine = join('<span
class="s">&#9671;</span>',
explode("\x84", $frameLine)); //format 0
                    $frameLine = join('<span
class="s">&#9670;</span>',
explode("\x85", $frameLine)); //format 1
                    $frameLine = join('<span
class="x">&#9762;</span>',
explode("\x81", $frameLine)); //special bit
                    $frameLine = join('<span
class="c">&nbsp;</span>', 
explode("\x90", $frameLine)); //clock 0
                    $frameLine = join('<span
class="c">&#9719;</span>',
explode("\x91", $frameLine)); //clock 1
                    $frameLine = join('<span
class="f">&nbsp;</span>', 
explode("\x88", $frameLine)); //version
                    $frameLine = join('<span
class="f">&#9618;</span>',
explode("\x89", $frameLine)); //version
                    $frameLine = join('&#9830;',
explode("\x01", $frameLine));
                    $frameLine = join('&#8901;',
explode("\0", $frameLine));
                }
                
                ?>
                <style>
                    .p { background-color: yellow; }
                    .m { background-color: #00FF00; }
                    .s { background-color: #FF0000; }
                    .c { background-color: aqua; }
                    .x { background-color: pink; }
                    .f { background-color: gold; }
                </style>
                <?php
                echo "<pre><tt>";
                echo join("<br/ >", $frame);
                echo "</tt></pre>";
            
            }
        }

       
//----------------------------------------------------------------------
        public static function serial($frame)
        {
            return gzcompress(join("\n", $frame), 9);
        }
        
       
//----------------------------------------------------------------------
        public static function unserial($code)
        {
            return explode("\n", gzuncompress($code));
        }
        
       
//----------------------------------------------------------------------
        public static function newFrame($version)
        {
            if($version < 1 || $version > QRSPEC_VERSION_MAX) 
                return null;

            if(!isset(self::$frames[$version])) {
                
                $fileName =
QR_CACHE_DIR.'frame_'.$version.'.dat';
                
                if (QR_CACHEABLE) {
                    if (file_exists($fileName)) {
                        self::$frames[$version] =
self::unserial(file_get_contents($fileName));
                    } else {
                        self::$frames[$version] =
self::createFrame($version);
                        file_put_contents($fileName,
self::serial(self::$frames[$version]));
                    }
                } else {
                    self::$frames[$version] = self::createFrame($version);
                }
            }
            
            if(is_null(self::$frames[$version]))
                return null;

            return self::$frames[$version];
        }

       
//----------------------------------------------------------------------
        public static function rsBlockNum($spec)     { return $spec[0] +
$spec[3]; }
        public static function rsBlockNum1($spec)    { return $spec[0]; }
        public static function rsDataCodes1($spec)   { return $spec[1]; }
        public static function rsEccCodes1($spec)    { return $spec[2]; }
        public static function rsBlockNum2($spec)    { return $spec[3]; }
        public static function rsDataCodes2($spec)   { return $spec[4]; }
        public static function rsEccCodes2($spec)    { return $spec[2]; }
        public static function rsDataLength($spec)   { return ($spec[0] *
$spec[1]) + ($spec[3] * $spec[4]);    }
        public static function rsEccLength($spec)    { return ($spec[0] +
$spec[3]) * $spec[2]; }
        
    }libs/phpqrcode/qrsplit.php000064400000026165151165347300011710
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Input splitting classes
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
<fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * The following data / specifications are taken from
 * "Two dimensional symbol -- QR-code -- Basic Specification"
(JIS X0510:2004)
 *  or
 * "Automatic identification and data capture techniques -- 
 *  QR Code 2005 bar code symbology specification" (ISO/IEC
18004:2006)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
    class QRsplit {

        public $dataStr = '';
        public $input;
        public $modeHint;

       
//----------------------------------------------------------------------
        public function __construct($dataStr, $input, $modeHint) 
        {
            $this->dataStr  = $dataStr;
            $this->input    = $input;
            $this->modeHint = $modeHint;
        }
        
       
//----------------------------------------------------------------------
        public static function isdigitat($str, $pos)
        {    
            if ($pos >= strlen($str))
                return false;
            
            return ((ord($str[$pos]) >=
ord('0'))&&(ord($str[$pos]) <= ord('9')));
        }
        
       
//----------------------------------------------------------------------
        public static function isalnumat($str, $pos)
        {
            if ($pos >= strlen($str))
                return false;
                
            return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
        }

       
//----------------------------------------------------------------------
        public function identifyMode($pos)
        {
            if ($pos >= strlen($this->dataStr)) 
                return QR_MODE_NUL;
                
            $c = $this->dataStr[$pos];
            
            if(self::isdigitat($this->dataStr, $pos)) {
                return QR_MODE_NUM;
            } else if(self::isalnumat($this->dataStr, $pos)) {
                return QR_MODE_AN;
            } else if($this->modeHint == QR_MODE_KANJI) {
            
                if ($pos+1 < strlen($this->dataStr)) 
                {
                    $d = $this->dataStr[$pos+1];
                    $word = (ord($c) << 8) | ord($d);
                    if(($word >= 0x8140 && $word <= 0x9ffc)
|| ($word >= 0xe040 && $word <= 0xebbf)) {
                        return QR_MODE_KANJI;
                    }
                }
            }

            return QR_MODE_8;
        } 
        
       
//----------------------------------------------------------------------
        public function eatNum()
        {
            $ln = QRspec::lengthIndicator(QR_MODE_NUM,
$this->input->getVersion());

            $p = 0;
            while(self::isdigitat($this->dataStr, $p)) {
                $p++;
            }
            
            $run = $p;
            $mode = $this->identifyMode($p);
            
            if($mode == QR_MODE_8) {
                $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
                     + QRinput::estimateBitsMode8(1)         // + 4 + l8
                     - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
                if($dif > 0) {
                    return $this->eat8();
                }
            }
            if($mode == QR_MODE_AN) {
                $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
                     + QRinput::estimateBitsModeAn(1)        // + 4 + la
                     - QRinput::estimateBitsModeAn($run + 1);// - 4 - la
                if($dif > 0) {
                    return $this->eatAn();
                }
            }
            
            $ret = $this->input->append(QR_MODE_NUM, $run,
str_split($this->dataStr));
            if($ret < 0)
                return -1;

            return $run;
        }
        
       
//----------------------------------------------------------------------
        public function eatAn()
        {
            $la = QRspec::lengthIndicator(QR_MODE_AN, 
$this->input->getVersion());
            $ln = QRspec::lengthIndicator(QR_MODE_NUM,
$this->input->getVersion());

            $p = 0;
            
            while(self::isalnumat($this->dataStr, $p)) {
                if(self::isdigitat($this->dataStr, $p)) {
                    $q = $p;
                    while(self::isdigitat($this->dataStr, $q)) {
                        $q++;
                    }
                    
                    $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
                         + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
                         - QRinput::estimateBitsModeAn($q); // - 4 - la
                         
                    if($dif < 0) {
                        break;
                    } else {
                        $p = $q;
                    }
                } else {
                    $p++;
                }
            }

            $run = $p;

            if(!self::isalnumat($this->dataStr, $p)) {
                $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
                     + QRinput::estimateBitsMode8(1) // + 4 + l8
                      - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
                if($dif > 0) {
                    return $this->eat8();
                }
            }

            $ret = $this->input->append(QR_MODE_AN, $run,
str_split($this->dataStr));
            if($ret < 0)
                return -1;

            return $run;
        }
        
       
//----------------------------------------------------------------------
        public function eatKanji()
        {
            $p = 0;
            
            while($this->identifyMode($p) == QR_MODE_KANJI) {
                $p += 2;
            }
            
            $ret = $this->input->append(QR_MODE_KANJI, $p,
str_split($this->dataStr));
            if($ret < 0)
                return -1;

            return $run;
        }

       
//----------------------------------------------------------------------
        public function eat8()
        {
            $la = QRspec::lengthIndicator(QR_MODE_AN,
$this->input->getVersion());
            $ln = QRspec::lengthIndicator(QR_MODE_NUM,
$this->input->getVersion());

            $p = 1;
            $dataStrLen = strlen($this->dataStr);
            
            while($p < $dataStrLen) {
                
                $mode = $this->identifyMode($p);
                if($mode == QR_MODE_KANJI) {
                    break;
                }
                if($mode == QR_MODE_NUM) {
                    $q = $p;
                    while(self::isdigitat($this->dataStr, $q)) {
                        $q++;
                    }
                    $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
                         + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
                         - QRinput::estimateBitsMode8($q); // - 4 - l8
                    if($dif < 0) {
                        break;
                    } else {
                        $p = $q;
                    }
                } else if($mode == QR_MODE_AN) {
                    $q = $p;
                    while(self::isalnumat($this->dataStr, $q)) {
                        $q++;
                    }
                    $dif = QRinput::estimateBitsMode8($p)  // + 4 + l8
                         + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
                         - QRinput::estimateBitsMode8($q); // - 4 - l8
                    if($dif < 0) {
                        break;
                    } else {
                        $p = $q;
                    }
                } else {
                    $p++;
                }
            }

            $run = $p;
            $ret = $this->input->append(QR_MODE_8, $run,
str_split($this->dataStr));
            
            if($ret < 0)
                return -1;

            return $run;
        }

       
//----------------------------------------------------------------------
        public function splitString()
        {
            while (strlen($this->dataStr) > 0)
            {
                if($this->dataStr == '')
                    return 0;

                $mode = $this->identifyMode(0);
                
                switch ($mode) {
                    case QR_MODE_NUM: $length = $this->eatNum(); break;
                    case QR_MODE_AN:  $length = $this->eatAn(); break;
                    case QR_MODE_KANJI:
                        if ($hint == QR_MODE_KANJI)
                                $length = $this->eatKanji();
                        else    $length = $this->eat8();
                        break;
                    default: $length = $this->eat8(); break;
                
                }

                if($length == 0) return 0;
                if($length < 0)  return -1;
                
                $this->dataStr = substr($this->dataStr, $length);
            }
        }

       
//----------------------------------------------------------------------
        public function toUpper()
        {
            $stringLen = strlen($this->dataStr);
            $p = 0;
            
            while ($p<$stringLen) {
                $mode = self::identifyMode(substr($this->dataStr, $p),
$this->modeHint);
                if($mode == QR_MODE_KANJI) {
                    $p += 2;
                } else {
                    if (ord($this->dataStr[$p]) >= ord('a')
&& ord($this->dataStr[$p]) <= ord('z')) {
                        $this->dataStr[$p] =
chr(ord($this->dataStr[$p]) - 32);
                    }
                    $p++;
                }
            }

            return $this->dataStr;
        }

       
//----------------------------------------------------------------------
        public static function splitStringToQRinput($string, QRinput
$input, $modeHint, $casesensitive = true)
        {
            if(is_null($string) || $string == '\0' || $string ==
'') {
                throw new Exception('empty string!!!');
            }

            $split = new QRsplit($string, $input, $modeHint);
            
            if(!$casesensitive)
                $split->toUpper();
                
            return $split->splitString();
        }
    }libs/phpqrcode/qrtools.php000064400000014274151165347310011714
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Toolset, handy and debug utilites.
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */

    class QRtools {
    
       
//----------------------------------------------------------------------
        public static function binarize($frame)
        {
            $len = count($frame);
            foreach ($frame as &$frameLine) {
                
                for($i=0; $i<$len; $i++) {
                    $frameLine[$i] =
(ord($frameLine[$i])&1)?'1':'0';
                }
            }
            
            return $frame;
        }
        
       
//----------------------------------------------------------------------
        public static function tcpdfBarcodeArray($code, $mode =
'QR,L', $tcPdfVersion = '4.5.037')
        {
            $barcode_array = array();
            
            if (!is_array($mode))
                $mode = explode(',', $mode);
                
            $eccLevel = 'L';
                
            if (count($mode) > 1) {
                $eccLevel = $mode[1];
            }
                
            $qrTab = QRcode::text($code, false, $eccLevel);
            $size = count($qrTab);
                
            $barcode_array['num_rows'] = $size;
            $barcode_array['num_cols'] = $size;
            $barcode_array['bcode'] = array();
                
            foreach ($qrTab as $line) {
                $arrAdd = array();
                foreach(str_split($line) as $char)
                    $arrAdd[] = ($char=='1')?1:0;
                $barcode_array['bcode'][] = $arrAdd;
            }
                    
            return $barcode_array;
        }
        
       
//----------------------------------------------------------------------
        public static function clearCache()
        {
            self::$frames = array();
        }
        
       
//----------------------------------------------------------------------
        public static function buildCache()
        {
			QRtools::markTime('before_build_cache');
			
			$mask = new QRmask();
            for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
                $frame = QRspec::newFrame($a);
                if (QR_IMAGE) {
                    $fileName =
QR_CACHE_DIR.'frame_'.$a.'.png';
                    QRimage::png(self::binarize($frame), $fileName, 1, 0);
                }
				
				$width = count($frame);
				$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
				for ($maskNo=0; $maskNo<8; $maskNo++)
					$mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
            }
			
			QRtools::markTime('after_build_cache');
        }

       
//----------------------------------------------------------------------
        public static function log($outfile, $err)
        {
            if (QR_LOG_DIR !== false) {
                if ($err != '') {
                    if ($outfile !== false) {
                       
file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt',
date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                    } else {
                       
file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d
H:i:s').': '.$err, FILE_APPEND);
                    }
                }    
            }
        }
        
       
//----------------------------------------------------------------------
        public static function dumpMask($frame) 
        {
            $width = count($frame);
            for($y=0;$y<$width;$y++) {
                for($x=0;$x<$width;$x++) {
                    echo ord($frame[$y][$x]).',';
                }
            }
        }
        
       
//----------------------------------------------------------------------
        public static function markTime($markerId)
        {
            list($usec, $sec) = explode(" ", microtime());
            $time = ((float)$usec + (float)$sec);
            
            if (!isset($GLOBALS['qr_time_bench']))
                $GLOBALS['qr_time_bench'] = array();
            
            $GLOBALS['qr_time_bench'][$markerId] = $time;
        }
        
       
//----------------------------------------------------------------------
        public static function timeBenchmark()
        {
            self::markTime('finish');
        
            $lastTime = 0;
            $startTime = 0;
            $p = 0;

            echo '<table cellpadding="3"
cellspacing="1">
                    <thead><tr style="border-bottom:1px solid
silver"><td colspan="2"
style="text-align:center">BENCHMARK</td></tr></thead>
                    <tbody>';

            foreach($GLOBALS['qr_time_bench'] as
$markerId=>$thisTime) {
                if ($p > 0) {
                    echo '<tr><th
style="text-align:right">till '.$markerId.':
</th><td>'.number_format($thisTime-$lastTime,
6).'s</td></tr>';
                } else {
                    $startTime = $thisTime;
                }
                
                $p++;
                $lastTime = $thisTime;
            }
            
            echo '</tbody><tfoot>
                <tr style="border-top:2px solid
black"><th style="text-align:right">TOTAL:
</th><td>'.number_format($lastTime-$startTime,
6).'s</td></tr>
            </tfoot>
            </table>';
        }
        
    }
    
   
//##########################################################################
    
    QRtools::markTime('start');
    libs/phpqrcode/README000064400000003142151165347310010350 0ustar00This
is PHP implementation of QR Code 2-D barcode generator. It is pure-php
LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi.

== LICENSING ==

Copyright (C) 2010 by Dominik Dzienia 

This library is free software; you can redistribute it and/or modify it
under
the terms of the GNU Lesser General Public License as published by the
Free
Software Foundation; either version 3 of the License, or any later
version.

This library is distributed in the hope that it will be useful, but WITHOUT
ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE
file)
for more details.

You should have received a copy of the GNU Lesser General Public License
along
with this library; if not, write to the Free Software Foundation, Inc., 51
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

== INSTALATION AND USAGE ==

 * INSTALL file
 *
http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page

== CONTACT ==

Fell free to contact me via e-mail (deltalab at poczta dot fm) or using
folowing project pages:

 * http://sourceforge.net/projects/phpqrcode/
 * http://phpqrcode.sourceforge.net/
  
== ACKNOWLEDGMENTS ==

Based on C libqrencode library (ver. 3.1.1) 
Copyright (C) 2006-2010 by Kentaro Fukuchi
http://megaui.net/fukuchi/works/qrencode/index.en.html

QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and
other
countries.

Reed-Solomon code encoder is written by Phil Karn, KA9Q.
Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
 libs/phpqrcode/tools/merge.bat000064400000000026151165347310012415
0ustar00php ./merge.php
pauselibs/phpqrcode/tools/merge.php000064400000005054151165347310012444
0ustar00<?php

/*
 * PHP QR Code encoder
 *
 * Tool for merging all library files into one, simpler to incorporate.
 * 
 * MAKE SURE THAT RESULTING PHPQRCode.php (and its dir) ARE WRITABLE!
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
    $QR_BASEDIR =
dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR;
    $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;
    
    $outputFile = $QR_BASEDIR.'phpqrcode.php';
    
    // Required libs
    
    $fileList = array(
        $QR_BASEDIR.'qrconst.php',
        $QR_TOOLSDIR.'merged_config.php',
        $QR_BASEDIR.'qrtools.php',
        $QR_BASEDIR.'qrspec.php',
        $QR_BASEDIR.'qrimage.php',
        $QR_BASEDIR.'qrinput.php',
        $QR_BASEDIR.'qrbitstream.php',
        $QR_BASEDIR.'qrsplit.php',
        $QR_BASEDIR.'qrrscode.php',
        $QR_BASEDIR.'qrmask.php',
        $QR_BASEDIR.'qrencode.php'
    );
    
    $headerFile = $QR_TOOLSDIR.'merged_header.php';
    $versionFile = $QR_BASEDIR.'VERSION';
    
    $outputCode = '';
    
    foreach($fileList as $fileName) {
        $outputCode .= "\n\n".'//----
'.basename($fileName).'
-----------------------------'."\n\n";
        $anotherCode = file_get_contents($fileName);
        $anotherCode = preg_replace ('/^<\?php/',
'', $anotherCode);
        $anotherCode = preg_replace ('/\?>\*$/', '',
$anotherCode);
        $outputCode .= "\n\n".$anotherCode."\n\n";
    }
    
	$versionDataEx = explode("\n",
file_get_contents($versionFile));
	
    $outputContents = file_get_contents($headerFile);
    $outputContents .= "\n\n/*\n * Version:
".trim($versionDataEx[0])."\n * Build:
".trim($versionDataEx[1])."\n */\n\n";
    $outputContents .= $outputCode;
    
    file_put_contents($outputFile, $outputContents);
    
    libs/phpqrcode/tools/merge.sh000064400000000032151165347310012256
0ustar00#!/bin/sh
php
./merge.phplibs/phpqrcode/tools/merged_config.php000064400000002404151165347310014131
0ustar00<?php
/*
 * PHP QR Code encoder
 *
 * Config file, tuned-up for merged verion
 */
     
    define('QR_CACHEABLE', false);       // use cache - more disk
reads but less CPU power, masks and format templates are stored there
    define('QR_CACHE_DIR', false);       // used when
QR_CACHEABLE === true
    define('QR_LOG_DIR', false);         // default error logs
dir   
    
    define('QR_FIND_BEST_MASK', true);                           
                              // if true, estimates best mask (spec.
default, but extremally slow; set to false to significant performance boost
but (propably) worst quality code
    define('QR_FIND_FROM_RANDOM', 2);                            
                          // if false, checks all masks available,
otherwise value tells count of masks need to be checked, mask id are got
randomly
    define('QR_DEFAULT_MASK', 2);                                
                              // when QR_FIND_BEST_MASK === false
                                                  
    define('QR_PNG_MAXIMUM_SIZE',  1024);                        
                              // maximum allowed png image width (in
pixels), tune to make sure GD and PHP can handle such big images
                                                 
libs/phpqrcode/tools/merged_header.php000064400000002571151165347310014121
0ustar00<?php

/*
 * PHP QR Code encoder
 *
 * This file contains MERGED version of PHP QR Code library.
 * It was auto-generated from full version for your convenience.
 *
 * This merged version was configured to not requre any external files,
 * with disabled cache, error loging and weker but faster mask matching.
 * If you need tune it up please use non-merged version.
 *
 * For full version, documentation, examples of use please visit:
 *
 *    http://phpqrcode.sourceforge.net/
 *    https://sourceforge.net/projects/phpqrcode/
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
 */
 
 libs/phpqrcode/VERSION000064400000000021151165347310010531 0ustar001.1.4
2010100721libs/slick/ajax-loader.gif000064400000010122151165347320011463
0ustar00GIF89a 
�������������������~~~������������������⸸������쮮����>>>VVV```|||������JJJlll���������,,,^^^LLL���!�Created
with ajaxload.info!�
!�NETSCAPE2.0,  �@�pH$8Gq�$N�A�3(
�L	��V�K|P(���:(r�Bь�_@X!/�BxBnb}Eg�orEg�^	oWD	cJCgoqmo���	�E�{p~
��r��D�}ŠM�d������K���r����񋇅o�
��|�����̩ò�]�q�āӤ`
9C�f)�$'�=�Ê}�C�^u�-�H.!��ܻ�ݧ��
	�O�K"1����5.&{j�T�
�BBo�e���6��<�@�B?��1
�)�G�bK�� !�
, 
�@�pH$&4Bq�$D�b(����V���[4_��:t:"r�qh@��a��)ȉgBk_oEg~�#rJDgxloWF	C	~mg		oD

B�wK!��
�C��ɶwE�
�ʢd�X��������r������
��s'��xM
&T$$��|M��C�ڟ�
A���Bl�d��ڵ�Kd�V��?oFl-X�
�L[�J*�Ξ6�!�"��	5\@���p�oIm
��N!Q�Xm�@ק%2u:uH2�\�R�#�a!�
,  �@�pH$
�Bq�$&D���(�L��V�
[$���:4P(
r�s��_���IȉgBxBoE
gw^	r�FgW�oWDcB

��g	oD%#��
v JEin�E�
~"�#�L	��d$��L
�X"yrv�E�����ͻ�d�����)xWO�<2���I�&��1a���"��UJ�(q�z�	�+��kQ�\"
����*�tRj��O�}C���7":�s�dE&
�R*�"#��-����=�L���֯Q�2s:d+q�V�����
!�
,  �@�pH$.Aq�4�B��d&"t
��jQ�P(��.�q8���Hy�"�3\HV$�QBm{Oeu
pzBeRumTDC�
�W
�mDCe
�t�B]�c�~�	
�aV�jU�U�f{
����L���{[H��øU����{���������i�98�\q���*��3��n�%��L\�@��0������2�T��*	9��}�t��I�*D9�x�6�ϴ�F]l"���!M�!0ըT,D�*�FT׮pq!�
, 
�@�pH,*��rILGA��\&�g�L�E�B*���.F�C�Уv���~,$�wSGIrjmgBGTrjTD��G�WH��j\CG
v�B	d�a�
zw%��V��`�
�E|m%�mv�L�ي�`	�����L��䩻w�����ہ��K�U�b�Ȁ�-�FA�;!:t�p�_3G�8�
�C�E69<�A��N�踁�;"�,H�@�#"8H�Y��M498���EB[ɒo�.96d�0NRU�A�tU�DX�8�l*��M��!�
, 
�@�pH,*��rILGAQ�T&�g�XP$�ӭ���p1r�͙�Z����9��|�jfBGi~WeF
C�
��}R�iCyq�N��N	�aGus �L�
�`���K]�K	
�L�`�E�΃�U��]���K��
���`���
���z��չ���W�D�Jl��X�@A�d�pESB`A
X�	��!1P�!"��MZ� �:�
A��&�:�ED�!HP��ϖ5:�p��H?��@������A�4���(Y��СD�V����.!�
, 
�@�pH,*��rILGAQ�T&�g�XP$�ӭ���p1r�͙�Z����9��|�jfBGi~WeE	y�
��}R�inlHCq�N��N]�aGuz���C�
�`��L��j���z���ƒ�`���d���L������K������U����ϿW�D�c��j
���s�0R%��+q���"�lQbw�
Р�F�.С�
0�s3�SIH�D����svV�<	�+��4
�9�
���BT��~A�2�$O!(\���*ח8�!�
, 
�@�pH,*��rILGAQ�T&�g�XP$�ӭ���p1r�͙�Z����9��|�jfBGi~WeE	y�
��}R�inlHCq�N��N]�aGuz���C�
�`��L��j���z���ƒ���Īɹsd�Ϊ�L���Ŀ���C�ҿW�E�O��j�������B��B!J`*��"�lm��8p���4��!(P0�EM(PC�!ʐ#�48���I�2�=���!4�CC�
q@�ïB�*�6�p
�$�
��!�
, 
�@�pH,*��rILGAQ�T&�g�XP$�ӭ���p1r�͙�Z����9��|�jfBGi~WeE	y�
��}R�inlHCq�N��N]�aGuz���C�
�`��L��j���z���ƒ���Īɹsd�Ϊ�L���Ŀ���Cؿ̫`##s��E�s�G��#%B	�)�M���p`
&0
EDba���7pp�@7g���dD#Kv[@�ï!�(@B�$O1�0oV��!OO�>P�����d�8@��,9J��,7�p
+�A�`�!�
	, 
�@�pH,*��rILGAQ�T&�g�XP$�ӭ���p1r�͙�Z����9��|�jfBGi~WeE	y�
��}R�inlHCq�N��N]�aGuz���C�
�`��L��j���z�L���g��R���d������z��
����z�ʽD��U	sP�Ls��J�6L���HQV0��'��hZ%��8@@�.�ED�tC
l�V`X�S������?X�	q��!�+����@*-�҄�FxB�����\�F�3�֮��
]!�

, 
�@�pH,*��rILGAQ�T&�g�XP$�ӭ���p1r�͙�Z����9��|�jEGi~WeE	y#D�}R�
inlHB!�$CfCN]�E��j�
���$s��L�j�Nsz�E���g�����dG�
����z��
����z��\�U
�j�cb���������
�Ӫ\] 2!d��ZnV��Tg��L0 ��F2�T��ȇ
�
`�Ǖ�2Fj�����k
�XT�.5X:)
��5,'R��,�tPuyz�*R0|�!�
, 
�@�pH,*��rI4����8e*�TJ,(�"�Ӂ��*�GN����y#���`xDdk\GnEd�i	�C	�Dd�SGm}GI��B$J�^�E��a�
jD	�x��K�n��x��E���x��
����G������nh����a�C�
J��V8pI�h�>���KE�8�D\�2$���C�!"�Хj1��YB�
ӂS
��T@D��5d8���52��^I�$����?�*aij�'T5U�*���G�
N:�J�lӱ#�2a�-;libs/slick/config.rb000064400000000241151165347350010403
0ustar00css_dir = "."
sass_dir = "."
images_dir = "."
fonts_dir = "fonts"
relative_assets = true

output_style = :compact
line_comments = false

preferred_syntax =
:scsslibs/slick/fonts/slick.eot000064400000004000151165347350011555
0ustar00d	�LP� O��
slickRegularVersion 1.0
slick
�PFFTMm�ȯHGDEF4(
OS/2O���XVcmap"E��bgasp��
glyf?��`<,head1��6hhea�$hmtxJJ�loca��,maxpKG8
name'��hnpost/�2�E��O_<��qx�qx%%���.�D@�LfGLf��	�
PfEd@a!���.��%%%%\@a "!�!���a
"!�!��������t�qF��%%��,?64/&#"326"'&'&476762��WW�20|0220|02q��	XX	�|0220|022%%��,%7654/7654/&#"326"'&'&476762(WW���20|0220|02q	XX	���|0220|022%%��"'&'&476762�20|0220|02>|0220|022%%��C+"'&?&#"32767632#"'&'&'&47676763276�
�	(*:"
'!+)4/&,,&/*')%��
	'':'',&^&,%�"!n���	
		B*	
�	�	
�slickslickRegularRegularFontForge 2.0 : slick : 14-4-2014FontForge 2.0 :
slick : 14-4-2014slickslickVersion 1.0Version 1.0slickslick�D
arrowright	arrowleft����װ�qx�qxlibs/slick/fonts/slick.svg000064400000004150151165347350011573
0ustar00<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by Fontastic.me</metadata>
<defs>
<font id="slick" horiz-adv-x="512">
<font-face font-family="slick" units-per-em="512"
ascent="480" descent="-32"/>
<missing-glyph horiz-adv-x="512" />

<glyph unicode="&#8594;" d="M241 113l130 130c4 4 6 8
6 13 0 5-2 9-6 13l-130 130c-3 3-7 5-12 5-5 0-10-2-13-5l-29-30c-4-3-6-7-6-12
0-5 2-10 6-13l87-88-87-88c-4-3-6-8-6-13 0-5 2-9 6-12l29-30c3-3 8-5 13-5 5 0
9 2 12 5z m234 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40
0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34
46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33
29-70 29-110z"/>
<glyph unicode="&#8592;" d="M296 113l29 30c4 3 6 7 6
12 0 5-2 10-6 13l-87 88 87 88c4 3 6 8 6 13 0 5-2 9-6 12l-29 30c-3 3-8 5-13
5-5 0-9-2-12-5l-130-130c-4-4-6-8-6-13 0-5 2-9 6-13l130-130c3-3 7-5 12-5 5 0
10 2 13 5z m179
143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110
29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80
33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70
29-110z"/>
<glyph unicode="&#8226;" d="M475
256c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110
29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80
33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70
29-110z"/>
<glyph unicode="&#97;" d="M475
439l0-128c0-5-1-9-5-13-4-4-8-5-13-5l-128 0c-8 0-13 3-17 11-3 7-2 14 4 20l40
39c-28 26-62 39-100 39-20
0-39-4-57-11-18-8-33-18-46-32-14-13-24-28-32-46-7-18-11-37-11-57 0-20 4-39
11-57 8-18 18-33 32-46 13-14 28-24 46-32 18-7 37-11 57-11 23 0 44 5 64 15
20 9 38 23 51 42 2 1 4 3 7 3 3 0 5-1 7-3l39-39c2-2 3-3 3-6
0-2-1-4-2-6-21-25-46-45-76-59-29-14-60-20-93-20-30 0-58 5-85 17-27 12-51
27-70 47-20 19-35 43-47 70-12 27-17 55-17 85 0 30 5 58 17 85 12 27 27 51 47
70 19 20 43 35 70 47 27 12 55 17 85 17 28 0 55-5 81-15 26-11 50-26 70-45l37
37c6 6 12 7 20 4 8-4 11-9 11-17z"/>
</font></defs></svg>
libs/slick/fonts/slick.ttf000064400000003544151165347350011577
0ustar00
�PFFTMm�ȯHGDEF4(
OS/2O���XVcmap"E��bgasp��
glyf?��`<,head1��6hhea�$hmtxJJ�loca��,maxpKG8
name'��hnpost/�2�E��O_<��qx�qx%%���.�D@�LfGLf��	�
PfEd@a!���.��%%%%\@a "!�!���a
"!�!��������t�qF��%%��,?64/&#"326"'&'&476762��WW�20|0220|02q��	XX	�|0220|022%%��,%7654/7654/&#"326"'&'&476762(WW���20|0220|02q	XX	���|0220|022%%��"'&'&476762�20|0220|02>|0220|022%%��C+"'&?&#"32767632#"'&'&'&47676763276�
�	(*:"
'!+)4/&,,&/*')%��
	'':'',&^&,%�"!n���	
		B*	
�	�	
�slickslickRegularRegularFontForge 2.0 : slick : 14-4-2014FontForge 2.0 :
slick : 14-4-2014slickslickVersion 1.0Version 1.0slickslick�D
arrowright	arrowleft����װ�qx�qxlibs/slick/fonts/slick.woff000064400000002544151165347350011742
0ustar00wOFFOTTOd\CFF .��VFFTM8m�ȯGDEFT
2OS/2pR`P��cmap�Pb"D�head.61�hheaD$�hmtx`JJmaxppPnamex�n'��postT
x�=��oA�g)['��V
6A��k{7z՛w�u,.ą�B��?x�;[X,���X
HP�ƣH�'x�Mz�YJ�$o���y���7
�0����1Ġgޣ�����0��!t�j�/���Zy�'�	T��@�^��'P8x���>fE�J���)�z���Q'o�¦�mC��QQ=G�_@��/�Fܖ��TU�d��PM�q�*�F�˰������}��8�:�9k�4I
��*v�7q�(��#4EQ�~�q(�ܰ�
[��7q7�*dK'��Z�&��,�6˰DݲdE�G�W��#o��ʥ|Op���{��j5H�l�[-��4���b/k	�A�V��|�(I�r�ʬLmK8Ϟg�y�8���/��թ<�|;�
����
�̶�������
���+�ҩT�j��HP$�N�[�U��_6F͑22��p���=*;c����T��1�j��f�4,�؍����t<4��#���Y8D���F/a]_Ii)NRN��m8��i)%�"
�:��i65����5�셳t&�
�x����x�c```d�s�o��+�a4Zy�x�c`d``�b	`b`B0�v7x�c`fb`�����������2H2�0001�r2�A#�R`���4��D�I��?`�c���6D
�m�JF7�x�c```f�`F���|
����d30$*()NP��?X����ˇ��l�B�,T0��
f�9-x�c`d``b;�0�x~���L
p���N�2�2�f�
�r0����	Rx�c`d``������@6#*`0b�%%%%Px�m�=j�@�?ْC~H�"�ڥAB�\��R�7f"B��}�T�R�9@���z!E����7����2�/�byɚ1r*�{�[>#����L�kun”��<D^��6r*�k�G>"��bf����CTy��qV�����y8Z&�v
��a1���;��M]ѐ�_���4���u��Eiv&$�VM��uY�����}�{}&{��~MU��L���2Ex�c`f@�h�libs/slick/slick-theme.css000064400000006111151165347350011532
0ustar00@charset 'UTF-8';
/* Slider */
.slick-loading .slick-list
{
    background: #fff url('./ajax-loader.gif') center center
no-repeat;
}

/* Icons */
@font-face
{
    font-family: 'slick';
    font-weight: normal;
    font-style: normal;

    src: url('./fonts/slick.eot');
    src: url('./fonts/slick.eot?#iefix')
format('embedded-opentype'), url('./fonts/slick.woff')
format('woff'), url('./fonts/slick.ttf')
format('truetype'), url('./fonts/slick.svg#slick')
format('svg');
}
/* Arrows */
.slick-prev,
.slick-next
{
    font-size: 0;
    line-height: 0;

    position: absolute;
    top: 50%;

    display: block;

    width: 20px;
    height: 20px;
    padding: 0;
    -webkit-transform: translate(0, -50%);
    -ms-transform: translate(0, -50%);
    transform: translate(0, -50%);

    cursor: pointer;

    color: transparent;
    border: none;
    outline: none;
    background: transparent;
}
.slick-prev:hover,
.slick-prev:focus,
.slick-next:hover,
.slick-next:focus
{
    color: transparent;
    outline: none;
    background: transparent;
}
.slick-prev:hover:before,
.slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before
{
    opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before
{
    opacity: .25;
}

.slick-prev:before,
.slick-next:before
{
    font-family: 'slick';
    font-size: 20px;
    line-height: 1;

    opacity: .75;
    color: white;

    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

.slick-prev
{
    left: -25px;
}
[dir='rtl'] .slick-prev
{
    right: -25px;
    left: auto;
}
.slick-prev:before
{
    content: '←';
}
[dir='rtl'] .slick-prev:before
{
    content: '→';
}

.slick-next
{
    right: -25px;
}
[dir='rtl'] .slick-next
{
    right: auto;
    left: -25px;
}
.slick-next:before
{
    content: '→';
}
[dir='rtl'] .slick-next:before
{
    content: '←';
}

/* Dots */
.slick-dotted.slick-slider
{
    margin-bottom: 30px;
}

.slick-dots
{
    position: absolute;
    bottom: -25px;

    display: block;

    width: 100%;
    padding: 0;
    margin: 0;

    list-style: none;

    text-align: center;
}
.slick-dots li
{
    position: relative;

    display: inline-block;

    width: 20px;
    height: 20px;
    margin: 0 5px;
    padding: 0;

    cursor: pointer;
}
.slick-dots li button
{
    font-size: 0;
    line-height: 0;

    display: block;

    width: 20px;
    height: 20px;
    padding: 5px;

    cursor: pointer;

    color: transparent;
    border: 0;
    outline: none;
    background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus
{
    outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before
{
    opacity: 1;
}
.slick-dots li button:before
{
    font-family: 'slick';
    font-size: 6px;
    line-height: 20px;

    position: absolute;
    top: 0;
    left: 0;

    width: 20px;
    height: 20px;

    content: '•';
    text-align: center;

    opacity: .25;
    color: black;

    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before
{
    opacity: .75;
    color: black;
}
libs/slick/slick-theme.less000064400000010125151165347350011710
0ustar00@charset "UTF-8";

// Default Variables

@slick-font-path: "./fonts/";
@slick-font-family: "slick";
@slick-loader-path: "./";
@slick-arrow-color: white;
@slick-dot-color: black;
@slick-dot-color-active: @slick-dot-color;
@slick-prev-character: "←";
@slick-next-character: "→";
@slick-dot-character: "•";
@slick-dot-size: 6px;
@slick-opacity-default: 0.75;
@slick-opacity-on-hover: 1;
@slick-opacity-not-active: 0.25;

/* Slider */
.slick-loading .slick-list{
    background: #fff url('@{slick-loader-path}ajax-loader.gif')
center center no-repeat;
}

/* Arrows */
.slick-prev,
.slick-next {
    position: absolute;
    display: block;
    height: 20px;
    width: 20px;
    line-height: 0px;
    font-size: 0px;
    cursor: pointer;
    background: transparent;
    color: transparent;
    top: 50%;
    -webkit-transform: translate(0, -50%);
    -ms-transform: translate(0, -50%);
    transform: translate(0, -50%);
    padding: 0;
    border: none;
    outline: none;
    &:hover, &:focus {
        outline: none;
        background: transparent;
        color: transparent;
        &:before {
            opacity: @slick-opacity-on-hover;
        }
    }
    &.slick-disabled:before {
        opacity: @slick-opacity-not-active;
    }
}

.slick-prev:before, .slick-next:before {
    font-family: @slick-font-family;
    font-size: 20px;
    line-height: 1;
    color: @slick-arrow-color;
    opacity: @slick-opacity-default;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    
    & when ( @slick-font-family = 'slick' ) {
        /* Icons */
        @font-face {
            font-family: 'slick';
            font-weight: normal;
            font-style: normal;
            src: url('@{slick-font-path}slick.eot');
            src: url('@{slick-font-path}slick.eot?#iefix')
format('embedded-opentype'),
url('@{slick-font-path}slick.woff') format('woff'),
url('@{slick-font-path}slick.ttf') format('truetype'),
url('@{slick-font-path}slick.svg#slick') format('svg');
        }
    }
}

.slick-prev {
    left: -25px;
    [dir="rtl"] & {
        left: auto;
        right: -25px;
    }
    &:before {
        content: @slick-prev-character;
        [dir="rtl"] & {
            content: @slick-next-character;
        }
    }
}

.slick-next {
    right: -25px;
    [dir="rtl"] & {
        left: -25px;
        right: auto;
    }
    &:before {
        content: @slick-next-character;
        [dir="rtl"] & {
            content: @slick-prev-character;
        }
    }
}

/* Dots */

.slick-dotted .slick-slider {
    margin-bottom: 30px;
}

.slick-dots {
    position: absolute;
    bottom: -25px;
    list-style: none;
    display: block;
    text-align: center;
    padding: 0;
    margin: 0;
    width: 100%;
    li {
        position: relative;
        display: inline-block;
        height: 20px;
        width: 20px;
        margin: 0 5px;
        padding: 0;
        cursor: pointer;
        button {
            border: 0;
            background: transparent;
            display: block;
            height: 20px;
            width: 20px;
            outline: none;
            line-height: 0px;
            font-size: 0px;
            color: transparent;
            padding: 5px;
            cursor: pointer;
            &:hover, &:focus {
                outline: none;
                &:before {
                    opacity: @slick-opacity-on-hover;
                }
            }
            &:before {
                position: absolute;
                top: 0;
                left: 0;
                content: @slick-dot-character;
                width: 20px;
                height: 20px;
                font-family: @slick-font-family;
                font-size: @slick-dot-size;
                line-height: 20px;
                text-align: center;
                color: @slick-dot-color;
                opacity: @slick-opacity-not-active;
                -webkit-font-smoothing: antialiased;
                -moz-osx-font-smoothing: grayscale;
            }
        }
        &.slick-active button:before {
            color: @slick-dot-color-active;
            opacity: @slick-opacity-default;
        }
    }
}
libs/slick/slick-theme.scss000064400000011226151165347350011720
0ustar00@charset "UTF-8";

// Default Variables

// Slick icon entity codes outputs the following
// "\2190" outputs ascii character "←"
// "\2192" outputs ascii character "→"
// "\2022" outputs ascii character "•"

$slick-font-path: "./fonts/" !default;
$slick-font-family: "slick" !default;
$slick-loader-path: "./" !default;
$slick-arrow-color: white !default;
$slick-dot-color: black !default;
$slick-dot-color-active: $slick-dot-color !default;
$slick-prev-character: "\2190" !default;
$slick-next-character: "\2192" !default;
$slick-dot-character: "\2022" !default;
$slick-dot-size: 6px !default;
$slick-opacity-default: 0.75 !default;
$slick-opacity-on-hover: 1 !default;
$slick-opacity-not-active: 0.25 !default;

@function slick-image-url($url) {
    @if function-exists(image-url) {
        @return image-url($url);
    }
    @else {
        @return url($slick-loader-path + $url);
    }
}

@function slick-font-url($url) {
    @if function-exists(font-url) {
        @return font-url($url);
    }
    @else {
        @return url($slick-font-path + $url);
    }
}

/* Slider */

.slick-list {
    .slick-loading & {
        background: #fff slick-image-url("ajax-loader.gif")
center center no-repeat;
    }
}

/* Icons */
@if $slick-font-family == "slick" {
    @font-face {
        font-family: "slick";
        src: slick-font-url("slick.eot");
        src: slick-font-url("slick.eot?#iefix")
format("embedded-opentype"),
slick-font-url("slick.woff") format("woff"),
slick-font-url("slick.ttf") format("truetype"),
slick-font-url("slick.svg#slick") format("svg");
        font-weight: normal;
        font-style: normal;
    }
}

/* Arrows */

.slick-prev,
.slick-next {
    position: absolute;
    display: block;
    height: 20px;
    width: 20px;
    line-height: 0px;
    font-size: 0px;
    cursor: pointer;
    background: transparent;
    color: transparent;
    top: 50%;
    -webkit-transform: translate(0, -50%);
    -ms-transform: translate(0, -50%);
    transform: translate(0, -50%);
    padding: 0;
    border: none;
    outline: none;
    &:hover, &:focus {
        outline: none;
        background: transparent;
        color: transparent;
        &:before {
            opacity: $slick-opacity-on-hover;
        }
    }
    &.slick-disabled:before {
        opacity: $slick-opacity-not-active;
    }
    &:before {
        font-family: $slick-font-family;
        font-size: 20px;
        line-height: 1;
        color: $slick-arrow-color;
        opacity: $slick-opacity-default;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
    }
}

.slick-prev {
    left: -25px;
    [dir="rtl"] & {
        left: auto;
        right: -25px;
    }
    &:before {
        content: $slick-prev-character;
        [dir="rtl"] & {
            content: $slick-next-character;
        }
    }
}

.slick-next {
    right: -25px;
    [dir="rtl"] & {
        left: -25px;
        right: auto;
    }
    &:before {
        content: $slick-next-character;
        [dir="rtl"] & {
            content: $slick-prev-character;
        }
    }
}

/* Dots */

.slick-dotted.slick-slider {
    margin-bottom: 30px;
}

.slick-dots {
    position: absolute;
    bottom: -25px;
    list-style: none;
    display: block;
    text-align: center;
    padding: 0;
    margin: 0;
    width: 100%;
    li {
        position: relative;
        display: inline-block;
        height: 20px;
        width: 20px;
        margin: 0 5px;
        padding: 0;
        cursor: pointer;
        button {
            border: 0;
            background: transparent;
            display: block;
            height: 20px;
            width: 20px;
            outline: none;
            line-height: 0px;
            font-size: 0px;
            color: transparent;
            padding: 5px;
            cursor: pointer;
            &:hover, &:focus {
                outline: none;
                &:before {
                    opacity: $slick-opacity-on-hover;
                }
            }
            &:before {
                position: absolute;
                top: 0;
                left: 0;
                content: $slick-dot-character;
                width: 20px;
                height: 20px;
                font-family: $slick-font-family;
                font-size: $slick-dot-size;
                line-height: 20px;
                text-align: center;
                color: $slick-dot-color;
                opacity: $slick-opacity-not-active;
                -webkit-font-smoothing: antialiased;
                -moz-osx-font-smoothing: grayscale;
            }
        }
        &.slick-active button:before {
            color: $slick-dot-color-active;
            opacity: $slick-opacity-default;
        }
    }
}
libs/slick/slick.css000064400000003360151165347350010435 0ustar00/* Slider
*/
.slick-slider
{
    position: relative;

    display: block;
    box-sizing: border-box;

    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;

    -webkit-touch-callout: none;
    -khtml-user-select: none;
    -ms-touch-action: pan-y;
        touch-action: pan-y;
    -webkit-tap-highlight-color: transparent;
}

.slick-list
{
    position: relative;

    display: block;
    overflow: hidden;

    margin: 0;
    padding: 0;
}
.slick-list:focus
{
    outline: none;
}
.slick-list.dragging
{
    cursor: pointer;
    cursor: hand;
}

.slick-slider .slick-track,
.slick-slider .slick-list
{
    -webkit-transform: translate3d(0, 0, 0);
       -moz-transform: translate3d(0, 0, 0);
        -ms-transform: translate3d(0, 0, 0);
         -o-transform: translate3d(0, 0, 0);
            transform: translate3d(0, 0, 0);
}

.slick-track
{
    position: relative;
    top: 0;
    left: 0;

    display: block;
    margin-left: auto;
    margin-right: auto;
}
.slick-track:before,
.slick-track:after
{
    display: table;

    content: '';
}
.slick-track:after
{
    clear: both;
}
.slick-loading .slick-track
{
    visibility: hidden;
}

.slick-slide
{
    display: none;
    float: left;

    height: 100%;
    min-height: 1px;
}
[dir='rtl'] .slick-slide
{
    float: right;
}
.slick-slide img
{
    display: block;
}
.slick-slide.slick-loading img
{
    display: none;
}
.slick-slide.dragging img
{
    pointer-events: none;
}
.slick-initialized .slick-slide
{
    display: block;
}
.slick-loading .slick-slide
{
    visibility: hidden;
}
.slick-vertical .slick-slide
{
    display: block;

    height: auto;

    border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
    display: none;
}
libs/slick/slick.js000064400000257575151165347350010304 0ustar00/*
     _ _      _       _
 ___| (_) ___| | __  (_)___
/ __| | |/ __| |/ /  | / __|
\__ \ | | (__|   < _ | \__ \
|___/_|_|\___|_|\_(_)/ |___/
                   |__/

 Version: 1.9.0
  Author: Ken Wheeler
 Website: http://kenwheeler.github.io
    Docs: http://kenwheeler.github.io/slick
    Repo: http://github.com/kenwheeler/slick
  Issues: http://github.com/kenwheeler/slick/issues

 */
/* global window, document, define, jQuery, setInterval, clearInterval */
;(function(factory) {
    'use strict';
    if (typeof define === 'function' && define.amd) {
        define(['jquery'], factory);
    } else if (typeof exports !== 'undefined') {
        module.exports = factory(require('jquery'));
    } else {
        factory(jQuery);
    }

}(function($) {
    'use strict';
    var Slick = window.Slick || {};

    Slick = (function() {

        var instanceUid = 0;

        function Slick(element, settings) {

            var _ = this, dataSettings;

            _.defaults = {
                accessibility: true,
                adaptiveHeight: false,
                appendArrows: $(element),
                appendDots: $(element),
                arrows: true,
                asNavFor: null,
                prevArrow: '<button class="slick-prev"
aria-label="Previous"
type="button">Previous</button>',
                nextArrow: '<button class="slick-next"
aria-label="Next"
type="button">Next</button>',
                autoplay: false,
                autoplaySpeed: 3000,
                centerMode: false,
                centerPadding: '50px',
                cssEase: 'ease',
                customPaging: function(slider, i) {
                    return $('<button type="button"
/>').text(i + 1);
                },
                dots: false,
                dotsClass: 'slick-dots',
                draggable: true,
                easing: 'linear',
                edgeFriction: 0.35,
                fade: false,
                focusOnSelect: false,
                focusOnChange: false,
                infinite: true,
                initialSlide: 0,
                lazyLoad: 'ondemand',
                mobileFirst: false,
                pauseOnHover: true,
                pauseOnFocus: true,
                pauseOnDotsHover: false,
                respondTo: 'window',
                responsive: null,
                rows: 1,
                rtl: false,
                slide: '',
                slidesPerRow: 1,
                slidesToShow: 1,
                slidesToScroll: 1,
                speed: 500,
                swipe: true,
                swipeToSlide: false,
                touchMove: true,
                touchThreshold: 5,
                useCSS: true,
                useTransform: true,
                variableWidth: false,
                vertical: false,
                verticalSwiping: false,
                waitForAnimate: true,
                zIndex: 1000
            };

            _.initials = {
                animating: false,
                dragging: false,
                autoPlayTimer: null,
                currentDirection: 0,
                currentLeft: null,
                currentSlide: 0,
                direction: 1,
                $dots: null,
                listWidth: null,
                listHeight: null,
                loadIndex: 0,
                $nextArrow: null,
                $prevArrow: null,
                scrolling: false,
                slideCount: null,
                slideWidth: null,
                $slideTrack: null,
                $slides: null,
                sliding: false,
                slideOffset: 0,
                swipeLeft: null,
                swiping: false,
                $list: null,
                touchObject: {},
                transformsEnabled: false,
                unslicked: false
            };

            $.extend(_, _.initials);

            _.activeBreakpoint = null;
            _.animType = null;
            _.animProp = null;
            _.breakpoints = [];
            _.breakpointSettings = [];
            _.cssTransitions = false;
            _.focussed = false;
            _.interrupted = false;
            _.hidden = 'hidden';
            _.paused = true;
            _.positionProp = null;
            _.respondTo = null;
            _.rowCount = 1;
            _.shouldClick = true;
            _.$slider = $(element);
            _.$slidesCache = null;
            _.transformType = null;
            _.transitionType = null;
            _.visibilityChange = 'visibilitychange';
            _.windowWidth = 0;
            _.windowTimer = null;

            dataSettings = $(element).data('slick') || {};

            _.options = $.extend({}, _.defaults, settings, dataSettings);

            _.currentSlide = _.options.initialSlide;

            _.originalSettings = _.options;

            if (typeof document.mozHidden !== 'undefined') {
                _.hidden = 'mozHidden';
                _.visibilityChange = 'mozvisibilitychange';
            } else if (typeof document.webkitHidden !==
'undefined') {
                _.hidden = 'webkitHidden';
                _.visibilityChange = 'webkitvisibilitychange';
            }

            _.autoPlay = $.proxy(_.autoPlay, _);
            _.autoPlayClear = $.proxy(_.autoPlayClear, _);
            _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);
            _.changeSlide = $.proxy(_.changeSlide, _);
            _.clickHandler = $.proxy(_.clickHandler, _);
            _.selectHandler = $.proxy(_.selectHandler, _);
            _.setPosition = $.proxy(_.setPosition, _);
            _.swipeHandler = $.proxy(_.swipeHandler, _);
            _.dragHandler = $.proxy(_.dragHandler, _);
            _.keyHandler = $.proxy(_.keyHandler, _);

            _.instanceUid = instanceUid++;

            // A simple way to check for HTML strings
            // Strict HTML recognition (must start with <)
            // Extracted from jQuery v1.11 source
            _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/;


            _.registerBreakpoints();
            _.init(true);

        }

        return Slick;

    }());

    Slick.prototype.activateADA = function() {
        var _ = this;

        _.$slideTrack.find('.slick-active').attr({
            'aria-hidden': 'false'
        }).find('a, input, button, select').attr({
            'tabindex': '0'
        });

    };

    Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup,
index, addBefore) {

        var _ = this;

        if (typeof(index) === 'boolean') {
            addBefore = index;
            index = null;
        } else if (index < 0 || (index >= _.slideCount)) {
            return false;
        }

        _.unload();

        if (typeof(index) === 'number') {
            if (index === 0 && _.$slides.length === 0) {
                $(markup).appendTo(_.$slideTrack);
            } else if (addBefore) {
                $(markup).insertBefore(_.$slides.eq(index));
            } else {
                $(markup).insertAfter(_.$slides.eq(index));
            }
        } else {
            if (addBefore === true) {
                $(markup).prependTo(_.$slideTrack);
            } else {
                $(markup).appendTo(_.$slideTrack);
            }
        }

        _.$slides = _.$slideTrack.children(this.options.slide);

        _.$slideTrack.children(this.options.slide).detach();

        _.$slideTrack.append(_.$slides);

        _.$slides.each(function(index, element) {
            $(element).attr('data-slick-index', index);
        });

        _.$slidesCache = _.$slides;

        _.reinit();

    };

    Slick.prototype.animateHeight = function() {
        var _ = this;
        if (_.options.slidesToShow === 1 &&
_.options.adaptiveHeight === true && _.options.vertical === false)
{
            var targetHeight =
_.$slides.eq(_.currentSlide).outerHeight(true);
            _.$list.animate({
                height: targetHeight
            }, _.options.speed);
        }
    };

    Slick.prototype.animateSlide = function(targetLeft, callback) {

        var animProps = {},
            _ = this;

        _.animateHeight();

        if (_.options.rtl === true && _.options.vertical === false)
{
            targetLeft = -targetLeft;
        }
        if (_.transformsEnabled === false) {
            if (_.options.vertical === false) {
                _.$slideTrack.animate({
                    left: targetLeft
                }, _.options.speed, _.options.easing, callback);
            } else {
                _.$slideTrack.animate({
                    top: targetLeft
                }, _.options.speed, _.options.easing, callback);
            }

        } else {

            if (_.cssTransitions === false) {
                if (_.options.rtl === true) {
                    _.currentLeft = -(_.currentLeft);
                }
                $({
                    animStart: _.currentLeft
                }).animate({
                    animStart: targetLeft
                }, {
                    duration: _.options.speed,
                    easing: _.options.easing,
                    step: function(now) {
                        now = Math.ceil(now);
                        if (_.options.vertical === false) {
                            animProps[_.animType] = 'translate('
+
                                now + 'px, 0px)';
                            _.$slideTrack.css(animProps);
                        } else {
                            animProps[_.animType] =
'translate(0px,' +
                                now + 'px)';
                            _.$slideTrack.css(animProps);
                        }
                    },
                    complete: function() {
                        if (callback) {
                            callback.call();
                        }
                    }
                });

            } else {

                _.applyTransition();
                targetLeft = Math.ceil(targetLeft);

                if (_.options.vertical === false) {
                    animProps[_.animType] = 'translate3d(' +
targetLeft + 'px, 0px, 0px)';
                } else {
                    animProps[_.animType] = 'translate3d(0px,' +
targetLeft + 'px, 0px)';
                }
                _.$slideTrack.css(animProps);

                if (callback) {
                    setTimeout(function() {

                        _.disableTransition();

                        callback.call();
                    }, _.options.speed);
                }

            }

        }

    };

    Slick.prototype.getNavTarget = function() {

        var _ = this,
            asNavFor = _.options.asNavFor;

        if ( asNavFor && asNavFor !== null ) {
            asNavFor = $(asNavFor).not(_.$slider);
        }

        return asNavFor;

    };

    Slick.prototype.asNavFor = function(index) {

        var _ = this,
            asNavFor = _.getNavTarget();

        if ( asNavFor !== null && typeof asNavFor ===
'object' ) {
            asNavFor.each(function() {
                var target = $(this).slick('getSlick');
                if(!target.unslicked) {
                    target.slideHandler(index, true);
                }
            });
        }

    };

    Slick.prototype.applyTransition = function(slide) {

        var _ = this,
            transition = {};

        if (_.options.fade === false) {
            transition[_.transitionType] = _.transformType + ' '
+ _.options.speed + 'ms ' + _.options.cssEase;
        } else {
            transition[_.transitionType] = 'opacity ' +
_.options.speed + 'ms ' + _.options.cssEase;
        }

        if (_.options.fade === false) {
            _.$slideTrack.css(transition);
        } else {
            _.$slides.eq(slide).css(transition);
        }

    };

    Slick.prototype.autoPlay = function() {

        var _ = this;

        _.autoPlayClear();

        if ( _.slideCount > _.options.slidesToShow ) {
            _.autoPlayTimer = setInterval( _.autoPlayIterator,
_.options.autoplaySpeed );
        }

    };

    Slick.prototype.autoPlayClear = function() {

        var _ = this;

        if (_.autoPlayTimer) {
            clearInterval(_.autoPlayTimer);
        }

    };

    Slick.prototype.autoPlayIterator = function() {

        var _ = this,
            slideTo = _.currentSlide + _.options.slidesToScroll;

        if ( !_.paused && !_.interrupted && !_.focussed ) {

            if ( _.options.infinite === false ) {

                if ( _.direction === 1 && ( _.currentSlide + 1 )
=== ( _.slideCount - 1 )) {
                    _.direction = 0;
                }

                else if ( _.direction === 0 ) {

                    slideTo = _.currentSlide - _.options.slidesToScroll;

                    if ( _.currentSlide - 1 === 0 ) {
                        _.direction = 1;
                    }

                }

            }

            _.slideHandler( slideTo );

        }

    };

    Slick.prototype.buildArrows = function() {

        var _ = this;

        if (_.options.arrows === true ) {

            _.$prevArrow =
$(_.options.prevArrow).addClass('slick-arrow');
            _.$nextArrow =
$(_.options.nextArrow).addClass('slick-arrow');

            if( _.slideCount > _.options.slidesToShow ) {

               
_.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden
tabindex');
               
_.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden
tabindex');

                if (_.htmlExpr.test(_.options.prevArrow)) {
                    _.$prevArrow.prependTo(_.options.appendArrows);
                }

                if (_.htmlExpr.test(_.options.nextArrow)) {
                    _.$nextArrow.appendTo(_.options.appendArrows);
                }

                if (_.options.infinite !== true) {
                    _.$prevArrow
                        .addClass('slick-disabled')
                        .attr('aria-disabled', 'true');
                }

            } else {

                _.$prevArrow.add( _.$nextArrow )

                    .addClass('slick-hidden')
                    .attr({
                        'aria-disabled': 'true',
                        'tabindex': '-1'
                    });

            }

        }

    };

    Slick.prototype.buildDots = function() {

        var _ = this,
            i, dot;

        if (_.options.dots === true && _.slideCount >
_.options.slidesToShow) {

            _.$slider.addClass('slick-dotted');

            dot = $('<ul
/>').addClass(_.options.dotsClass);

            for (i = 0; i <= _.getDotCount(); i += 1) {
                dot.append($('<li
/>').append(_.options.customPaging.call(this, _, i)));
            }

            _.$dots = dot.appendTo(_.options.appendDots);

           
_.$dots.find('li').first().addClass('slick-active');

        }

    };

    Slick.prototype.buildOut = function() {

        var _ = this;

        _.$slides =
            _.$slider
                .children( _.options.slide +
':not(.slick-cloned)')
                .addClass('slick-slide');

        _.slideCount = _.$slides.length;

        _.$slides.each(function(index, element) {
            $(element)
                .attr('data-slick-index', index)
                .data('originalStyling',
$(element).attr('style') || '');
        });

        _.$slider.addClass('slick-slider');

        _.$slideTrack = (_.slideCount === 0) ?
            $('<div
class="slick-track"/>').appendTo(_.$slider) :
            _.$slides.wrapAll('<div
class="slick-track"/>').parent();

        _.$list = _.$slideTrack.wrap(
            '<div
class="slick-list"/>').parent();
        _.$slideTrack.css('opacity', 0);

        if (_.options.centerMode === true || _.options.swipeToSlide ===
true) {
            _.options.slidesToScroll = 1;
        }

        $('img[data-lazy]',
_.$slider).not('[src]').addClass('slick-loading');

        _.setupInfinite();

        _.buildArrows();

        _.buildDots();

        _.updateDots();


        _.setSlideClasses(typeof _.currentSlide === 'number' ?
_.currentSlide : 0);

        if (_.options.draggable === true) {
            _.$list.addClass('draggable');
        }

    };

    Slick.prototype.buildRows = function() {

        var _ = this, a, b, c, newSlides, numOfSlides,
originalSlides,slidesPerSection;

        newSlides = document.createDocumentFragment();
        originalSlides = _.$slider.children();

        if(_.options.rows > 0) {

            slidesPerSection = _.options.slidesPerRow * _.options.rows;
            numOfSlides = Math.ceil(
                originalSlides.length / slidesPerSection
            );

            for(a = 0; a < numOfSlides; a++){
                var slide = document.createElement('div');
                for(b = 0; b < _.options.rows; b++) {
                    var row = document.createElement('div');
                    for(c = 0; c < _.options.slidesPerRow; c++) {
                        var target = (a * slidesPerSection + ((b *
_.options.slidesPerRow) + c));
                        if (originalSlides.get(target)) {
                            row.appendChild(originalSlides.get(target));
                        }
                    }
                    slide.appendChild(row);
                }
                newSlides.appendChild(slide);
            }

            _.$slider.empty().append(newSlides);
            _.$slider.children().children().children()
                .css({
                    'width':(100 / _.options.slidesPerRow) +
'%',
                    'display': 'inline-block'
                });

        }

    };

    Slick.prototype.checkResponsive = function(initial, forceUpdate) {

        var _ = this,
            breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint
= false;
        var sliderWidth = _.$slider.width();
        var windowWidth = window.innerWidth || $(window).width();

        if (_.respondTo === 'window') {
            respondToWidth = windowWidth;
        } else if (_.respondTo === 'slider') {
            respondToWidth = sliderWidth;
        } else if (_.respondTo === 'min') {
            respondToWidth = Math.min(windowWidth, sliderWidth);
        }

        if ( _.options.responsive &&
            _.options.responsive.length &&
            _.options.responsive !== null) {

            targetBreakpoint = null;

            for (breakpoint in _.breakpoints) {
                if (_.breakpoints.hasOwnProperty(breakpoint)) {
                    if (_.originalSettings.mobileFirst === false) {
                        if (respondToWidth < _.breakpoints[breakpoint])
{
                            targetBreakpoint = _.breakpoints[breakpoint];
                        }
                    } else {
                        if (respondToWidth > _.breakpoints[breakpoint])
{
                            targetBreakpoint = _.breakpoints[breakpoint];
                        }
                    }
                }
            }

            if (targetBreakpoint !== null) {
                if (_.activeBreakpoint !== null) {
                    if (targetBreakpoint !== _.activeBreakpoint ||
forceUpdate) {
                        _.activeBreakpoint =
                            targetBreakpoint;
                        if (_.breakpointSettings[targetBreakpoint] ===
'unslick') {
                            _.unslick(targetBreakpoint);
                        } else {
                            _.options = $.extend({}, _.originalSettings,
                                _.breakpointSettings[
                                    targetBreakpoint]);
                            if (initial === true) {
                                _.currentSlide = _.options.initialSlide;
                            }
                            _.refresh(initial);
                        }
                        triggerBreakpoint = targetBreakpoint;
                    }
                } else {
                    _.activeBreakpoint = targetBreakpoint;
                    if (_.breakpointSettings[targetBreakpoint] ===
'unslick') {
                        _.unslick(targetBreakpoint);
                    } else {
                        _.options = $.extend({}, _.originalSettings,
                            _.breakpointSettings[
                                targetBreakpoint]);
                        if (initial === true) {
                            _.currentSlide = _.options.initialSlide;
                        }
                        _.refresh(initial);
                    }
                    triggerBreakpoint = targetBreakpoint;
                }
            } else {
                if (_.activeBreakpoint !== null) {
                    _.activeBreakpoint = null;
                    _.options = _.originalSettings;
                    if (initial === true) {
                        _.currentSlide = _.options.initialSlide;
                    }
                    _.refresh(initial);
                    triggerBreakpoint = targetBreakpoint;
                }
            }

            // only trigger breakpoints during an actual break. not on
initialize.
            if( !initial && triggerBreakpoint !== false ) {
                _.$slider.trigger('breakpoint', [_,
triggerBreakpoint]);
            }
        }

    };

    Slick.prototype.changeSlide = function(event, dontAnimate) {

        var _ = this,
            $target = $(event.currentTarget),
            indexOffset, slideOffset, unevenOffset;

        // If target is a link, prevent default action.
        if($target.is('a')) {
            event.preventDefault();
        }

        // If target is not the <li> element (ie: a child), find the
<li>.
        if(!$target.is('li')) {
            $target = $target.closest('li');
        }

        unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);
        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) %
_.options.slidesToScroll;

        switch (event.data.message) {

            case 'previous':
                slideOffset = indexOffset === 0 ? _.options.slidesToScroll
: _.options.slidesToShow - indexOffset;
                if (_.slideCount > _.options.slidesToShow) {
                    _.slideHandler(_.currentSlide - slideOffset, false,
dontAnimate);
                }
                break;

            case 'next':
                slideOffset = indexOffset === 0 ? _.options.slidesToScroll
: indexOffset;
                if (_.slideCount > _.options.slidesToShow) {
                    _.slideHandler(_.currentSlide + slideOffset, false,
dontAnimate);
                }
                break;

            case 'index':
                var index = event.data.index === 0 ? 0 :
                    event.data.index || $target.index() *
_.options.slidesToScroll;

                _.slideHandler(_.checkNavigable(index), false,
dontAnimate);
                $target.children().trigger('focus');
                break;

            default:
                return;
        }

    };

    Slick.prototype.checkNavigable = function(index) {

        var _ = this,
            navigables, prevNavigable;

        navigables = _.getNavigableIndexes();
        prevNavigable = 0;
        if (index > navigables[navigables.length - 1]) {
            index = navigables[navigables.length - 1];
        } else {
            for (var n in navigables) {
                if (index < navigables[n]) {
                    index = prevNavigable;
                    break;
                }
                prevNavigable = navigables[n];
            }
        }

        return index;
    };

    Slick.prototype.cleanUpEvents = function() {

        var _ = this;

        if (_.options.dots && _.$dots !== null) {

            $('li', _.$dots)
                .off('click.slick', _.changeSlide)
                .off('mouseenter.slick', $.proxy(_.interrupt, _,
true))
                .off('mouseleave.slick', $.proxy(_.interrupt, _,
false));

            if (_.options.accessibility === true) {
                _.$dots.off('keydown.slick', _.keyHandler);
            }
        }

        _.$slider.off('focus.slick blur.slick');

        if (_.options.arrows === true && _.slideCount >
_.options.slidesToShow) {
            _.$prevArrow &&
_.$prevArrow.off('click.slick', _.changeSlide);
            _.$nextArrow &&
_.$nextArrow.off('click.slick', _.changeSlide);

            if (_.options.accessibility === true) {
                _.$prevArrow &&
_.$prevArrow.off('keydown.slick', _.keyHandler);
                _.$nextArrow &&
_.$nextArrow.off('keydown.slick', _.keyHandler);
            }
        }

        _.$list.off('touchstart.slick mousedown.slick',
_.swipeHandler);
        _.$list.off('touchmove.slick mousemove.slick',
_.swipeHandler);
        _.$list.off('touchend.slick mouseup.slick',
_.swipeHandler);
        _.$list.off('touchcancel.slick mouseleave.slick',
_.swipeHandler);

        _.$list.off('click.slick', _.clickHandler);

        $(document).off(_.visibilityChange, _.visibility);

        _.cleanUpSlideEvents();

        if (_.options.accessibility === true) {
            _.$list.off('keydown.slick', _.keyHandler);
        }

        if (_.options.focusOnSelect === true) {
            $(_.$slideTrack).children().off('click.slick',
_.selectHandler);
        }

        $(window).off('orientationchange.slick.slick-' +
_.instanceUid, _.orientationChange);

        $(window).off('resize.slick.slick-' + _.instanceUid,
_.resize);

        $('[draggable!=true]',
_.$slideTrack).off('dragstart', _.preventDefault);

        $(window).off('load.slick.slick-' + _.instanceUid,
_.setPosition);

    };

    Slick.prototype.cleanUpSlideEvents = function() {

        var _ = this;

        _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _,
true));
        _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _,
false));

    };

    Slick.prototype.cleanUpRows = function() {

        var _ = this, originalSlides;

        if(_.options.rows > 0) {
            originalSlides = _.$slides.children().children();
            originalSlides.removeAttr('style');
            _.$slider.empty().append(originalSlides);
        }

    };

    Slick.prototype.clickHandler = function(event) {

        var _ = this;

        if (_.shouldClick === false) {
            event.stopImmediatePropagation();
            event.stopPropagation();
            event.preventDefault();
        }

    };

    Slick.prototype.destroy = function(refresh) {

        var _ = this;

        _.autoPlayClear();

        _.touchObject = {};

        _.cleanUpEvents();

        $('.slick-cloned', _.$slider).detach();

        if (_.$dots) {
            _.$dots.remove();
        }

        if ( _.$prevArrow && _.$prevArrow.length ) {

            _.$prevArrow
                .removeClass('slick-disabled slick-arrow
slick-hidden')
                .removeAttr('aria-hidden aria-disabled tabindex')
                .css('display','');

            if ( _.htmlExpr.test( _.options.prevArrow )) {
                _.$prevArrow.remove();
            }
        }

        if ( _.$nextArrow && _.$nextArrow.length ) {

            _.$nextArrow
                .removeClass('slick-disabled slick-arrow
slick-hidden')
                .removeAttr('aria-hidden aria-disabled tabindex')
                .css('display','');

            if ( _.htmlExpr.test( _.options.nextArrow )) {
                _.$nextArrow.remove();
            }
        }


        if (_.$slides) {

            _.$slides
                .removeClass('slick-slide slick-active slick-center
slick-visible slick-current')
                .removeAttr('aria-hidden')
                .removeAttr('data-slick-index')
                .each(function(){
                    $(this).attr('style',
$(this).data('originalStyling'));
                });

            _.$slideTrack.children(this.options.slide).detach();

            _.$slideTrack.detach();

            _.$list.detach();

            _.$slider.append(_.$slides);
        }

        _.cleanUpRows();

        _.$slider.removeClass('slick-slider');
        _.$slider.removeClass('slick-initialized');
        _.$slider.removeClass('slick-dotted');

        _.unslicked = true;

        if(!refresh) {
            _.$slider.trigger('destroy', [_]);
        }

    };

    Slick.prototype.disableTransition = function(slide) {

        var _ = this,
            transition = {};

        transition[_.transitionType] = '';

        if (_.options.fade === false) {
            _.$slideTrack.css(transition);
        } else {
            _.$slides.eq(slide).css(transition);
        }

    };

    Slick.prototype.fadeSlide = function(slideIndex, callback) {

        var _ = this;

        if (_.cssTransitions === false) {

            _.$slides.eq(slideIndex).css({
                zIndex: _.options.zIndex
            });

            _.$slides.eq(slideIndex).animate({
                opacity: 1
            }, _.options.speed, _.options.easing, callback);

        } else {

            _.applyTransition(slideIndex);

            _.$slides.eq(slideIndex).css({
                opacity: 1,
                zIndex: _.options.zIndex
            });

            if (callback) {
                setTimeout(function() {

                    _.disableTransition(slideIndex);

                    callback.call();
                }, _.options.speed);
            }

        }

    };

    Slick.prototype.fadeSlideOut = function(slideIndex) {

        var _ = this;

        if (_.cssTransitions === false) {

            _.$slides.eq(slideIndex).animate({
                opacity: 0,
                zIndex: _.options.zIndex - 2
            }, _.options.speed, _.options.easing);

        } else {

            _.applyTransition(slideIndex);

            _.$slides.eq(slideIndex).css({
                opacity: 0,
                zIndex: _.options.zIndex - 2
            });

        }

    };

    Slick.prototype.filterSlides = Slick.prototype.slickFilter =
function(filter) {

        var _ = this;

        if (filter !== null) {

            _.$slidesCache = _.$slides;

            _.unload();

            _.$slideTrack.children(this.options.slide).detach();

            _.$slidesCache.filter(filter).appendTo(_.$slideTrack);

            _.reinit();

        }

    };

    Slick.prototype.focusHandler = function() {

        var _ = this;

        // If any child element receives focus within the slider we need to
pause the autoplay
        _.$slider
            .off('focus.slick blur.slick')
            .on(
                'focus.slick',
                '*',
                function(event) {
                    var $sf = $(this);

                    setTimeout(function() {
                        if( _.options.pauseOnFocus ) {
                            if ($sf.is(':focus')) {
                                _.focussed = true;
                                _.autoPlay();
                            }
                        }
                    }, 0);
                }
            ).on(
                'blur.slick',
                '*',
                function(event) {
                    var $sf = $(this);

                    // When a blur occurs on any elements within the slider
we become unfocused
                    if( _.options.pauseOnFocus ) {
                        _.focussed = false;
                        _.autoPlay();
                    }
                }
            );
    };

    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide =
function() {

        var _ = this;
        return _.currentSlide;

    };

    Slick.prototype.getDotCount = function() {

        var _ = this;

        var breakPoint = 0;
        var counter = 0;
        var pagerQty = 0;

        if (_.options.infinite === true) {
            if (_.slideCount <= _.options.slidesToShow) {
                 ++pagerQty;
            } else {
                while (breakPoint < _.slideCount) {
                    ++pagerQty;
                    breakPoint = counter + _.options.slidesToScroll;
                    counter += _.options.slidesToScroll <=
_.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
                }
            }
        } else if (_.options.centerMode === true) {
            pagerQty = _.slideCount;
        } else if(!_.options.asNavFor) {
            pagerQty = 1 + Math.ceil((_.slideCount -
_.options.slidesToShow) / _.options.slidesToScroll);
        }else {
            while (breakPoint < _.slideCount) {
                ++pagerQty;
                breakPoint = counter + _.options.slidesToScroll;
                counter += _.options.slidesToScroll <=
_.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
            }
        }

        return pagerQty - 1;

    };

    Slick.prototype.getLeft = function(slideIndex) {

        var _ = this,
            targetLeft,
            verticalHeight,
            verticalOffset = 0,
            targetSlide,
            coef;

        _.slideOffset = 0;
        verticalHeight = _.$slides.first().outerHeight(true);

        if (_.options.infinite === true) {
            if (_.slideCount > _.options.slidesToShow) {
                _.slideOffset = (_.slideWidth * _.options.slidesToShow) *
-1;
                coef = -1

                if (_.options.vertical === true &&
_.options.centerMode === true) {
                    if (_.options.slidesToShow === 2) {
                        coef = -1.5;
                    } else if (_.options.slidesToShow === 1) {
                        coef = -2
                    }
                }
                verticalOffset = (verticalHeight * _.options.slidesToShow)
* coef;
            }
            if (_.slideCount % _.options.slidesToScroll !== 0) {
                if (slideIndex + _.options.slidesToScroll > _.slideCount
&& _.slideCount > _.options.slidesToShow) {
                    if (slideIndex > _.slideCount) {
                        _.slideOffset = ((_.options.slidesToShow -
(slideIndex - _.slideCount)) * _.slideWidth) * -1;
                        verticalOffset = ((_.options.slidesToShow -
(slideIndex - _.slideCount)) * verticalHeight) * -1;
                    } else {
                        _.slideOffset = ((_.slideCount %
_.options.slidesToScroll) * _.slideWidth) * -1;
                        verticalOffset = ((_.slideCount %
_.options.slidesToScroll) * verticalHeight) * -1;
                    }
                }
            }
        } else {
            if (slideIndex + _.options.slidesToShow > _.slideCount) {
                _.slideOffset = ((slideIndex + _.options.slidesToShow) -
_.slideCount) * _.slideWidth;
                verticalOffset = ((slideIndex + _.options.slidesToShow) -
_.slideCount) * verticalHeight;
            }
        }

        if (_.slideCount <= _.options.slidesToShow) {
            _.slideOffset = 0;
            verticalOffset = 0;
        }

        if (_.options.centerMode === true && _.slideCount <=
_.options.slidesToShow) {
            _.slideOffset = ((_.slideWidth *
Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) /
2);
        } else if (_.options.centerMode === true &&
_.options.infinite === true) {
            _.slideOffset += _.slideWidth *
Math.floor(_.options.slidesToShow / 2) - _.slideWidth;
        } else if (_.options.centerMode === true) {
            _.slideOffset = 0;
            _.slideOffset += _.slideWidth *
Math.floor(_.options.slidesToShow / 2);
        }

        if (_.options.vertical === false) {
            targetLeft = ((slideIndex * _.slideWidth) * -1) +
_.slideOffset;
        } else {
            targetLeft = ((slideIndex * verticalHeight) * -1) +
verticalOffset;
        }

        if (_.options.variableWidth === true) {

            if (_.slideCount <= _.options.slidesToShow ||
_.options.infinite === false) {
                targetSlide =
_.$slideTrack.children('.slick-slide').eq(slideIndex);
            } else {
                targetSlide =
_.$slideTrack.children('.slick-slide').eq(slideIndex +
_.options.slidesToShow);
            }

            if (_.options.rtl === true) {
                if (targetSlide[0]) {
                    targetLeft = (_.$slideTrack.width() -
targetSlide[0].offsetLeft - targetSlide.width()) * -1;
                } else {
                    targetLeft =  0;
                }
            } else {
                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft *
-1 : 0;
            }

            if (_.options.centerMode === true) {
                if (_.slideCount <= _.options.slidesToShow ||
_.options.infinite === false) {
                    targetSlide =
_.$slideTrack.children('.slick-slide').eq(slideIndex);
                } else {
                    targetSlide =
_.$slideTrack.children('.slick-slide').eq(slideIndex +
_.options.slidesToShow + 1);
                }

                if (_.options.rtl === true) {
                    if (targetSlide[0]) {
                        targetLeft = (_.$slideTrack.width() -
targetSlide[0].offsetLeft - targetSlide.width()) * -1;
                    } else {
                        targetLeft =  0;
                    }
                } else {
                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft
* -1 : 0;
                }

                targetLeft += (_.$list.width() - targetSlide.outerWidth())
/ 2;
            }
        }

        return targetLeft;

    };

    Slick.prototype.getOption = Slick.prototype.slickGetOption =
function(option) {

        var _ = this;

        return _.options[option];

    };

    Slick.prototype.getNavigableIndexes = function() {

        var _ = this,
            breakPoint = 0,
            counter = 0,
            indexes = [],
            max;

        if (_.options.infinite === false) {
            max = _.slideCount;
        } else {
            breakPoint = _.options.slidesToScroll * -1;
            counter = _.options.slidesToScroll * -1;
            max = _.slideCount * 2;
        }

        while (breakPoint < max) {
            indexes.push(breakPoint);
            breakPoint = counter + _.options.slidesToScroll;
            counter += _.options.slidesToScroll <=
_.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
        }

        return indexes;

    };

    Slick.prototype.getSlick = function() {

        return this;

    };

    Slick.prototype.getSlideCount = function() {

        var _ = this,
            slidesTraversed, swipedSlide, swipeTarget, centerOffset;

        centerOffset = _.options.centerMode === true ?
Math.floor(_.$list.width() / 2) : 0;
        swipeTarget = (_.swipeLeft * -1) + centerOffset;

        if (_.options.swipeToSlide === true) {

           
_.$slideTrack.find('.slick-slide').each(function(index, slide) {

                var slideOuterWidth, slideOffset, slideRightBoundary;
                slideOuterWidth = $(slide).outerWidth();
                slideOffset = slide.offsetLeft;
                if (_.options.centerMode !== true) {
                    slideOffset += (slideOuterWidth / 2);
                }

                slideRightBoundary = slideOffset + (slideOuterWidth);

                if (swipeTarget < slideRightBoundary) {
                    swipedSlide = slide;
                    return false;
                }
            });

            slidesTraversed =
Math.abs($(swipedSlide).attr('data-slick-index') -
_.currentSlide) || 1;

            return slidesTraversed;

        } else {
            return _.options.slidesToScroll;
        }

    };

    Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide,
dontAnimate) {

        var _ = this;

        _.changeSlide({
            data: {
                message: 'index',
                index: parseInt(slide)
            }
        }, dontAnimate);

    };

    Slick.prototype.init = function(creation) {

        var _ = this;

        if (!$(_.$slider).hasClass('slick-initialized')) {

            $(_.$slider).addClass('slick-initialized');

            _.buildRows();
            _.buildOut();
            _.setProps();
            _.startLoad();
            _.loadSlider();
            _.initializeEvents();
            _.updateArrows();
            _.updateDots();
            _.checkResponsive(true);
            _.focusHandler();

        }

        if (creation) {
            _.$slider.trigger('init', [_]);
        }

        if (_.options.accessibility === true) {
            _.initADA();
        }

        if ( _.options.autoplay ) {

            _.paused = false;
            _.autoPlay();

        }

    };

    Slick.prototype.initADA = function() {
        var _ = this,
                numDotGroups = Math.ceil(_.slideCount /
_.options.slidesToShow),
                tabControlIndexes =
_.getNavigableIndexes().filter(function(val) {
                    return (val >= 0) && (val <
_.slideCount);
                });

        _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({
            'aria-hidden': 'true',
            'tabindex': '-1'
        }).find('a, input, button, select').attr({
            'tabindex': '-1'
        });

        if (_.$dots !== null) {
           
_.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function(i)
{
                var slideControlIndex = tabControlIndexes.indexOf(i);

                $(this).attr({
                    'role': 'tabpanel',
                    'id': 'slick-slide' + _.instanceUid
+ i,
                    'tabindex': -1
                });

                if (slideControlIndex !== -1) {
                   var ariaButtonControl = 'slick-slide-control'
+ _.instanceUid + slideControlIndex
                   if ($('#' + ariaButtonControl).length) {
                     $(this).attr({
                         'aria-describedby': ariaButtonControl
                     });
                   }
                }
            });

            _.$dots.attr('role',
'tablist').find('li').each(function(i) {
                var mappedSlideIndex = tabControlIndexes[i];

                $(this).attr({
                    'role': 'presentation'
                });

                $(this).find('button').first().attr({
                    'role': 'tab',
                    'id': 'slick-slide-control' +
_.instanceUid + i,
                    'aria-controls': 'slick-slide' +
_.instanceUid + mappedSlideIndex,
                    'aria-label': (i + 1) + ' of ' +
numDotGroups,
                    'aria-selected': null,
                    'tabindex': '-1'
                });

            }).eq(_.currentSlide).find('button').attr({
                'aria-selected': 'true',
                'tabindex': '0'
            }).end();
        }

        for (var i=_.currentSlide, max=i+_.options.slidesToShow; i <
max; i++) {
          if (_.options.focusOnChange) {
            _.$slides.eq(i).attr({'tabindex': '0'});
          } else {
            _.$slides.eq(i).removeAttr('tabindex');
          }
        }

        _.activateADA();

    };

    Slick.prototype.initArrowEvents = function() {

        var _ = this;

        if (_.options.arrows === true && _.slideCount >
_.options.slidesToShow) {
            _.$prevArrow
               .off('click.slick')
               .on('click.slick', {
                    message: 'previous'
               }, _.changeSlide);
            _.$nextArrow
               .off('click.slick')
               .on('click.slick', {
                    message: 'next'
               }, _.changeSlide);

            if (_.options.accessibility === true) {
                _.$prevArrow.on('keydown.slick', _.keyHandler);
                _.$nextArrow.on('keydown.slick', _.keyHandler);
            }
        }

    };

    Slick.prototype.initDotEvents = function() {

        var _ = this;

        if (_.options.dots === true && _.slideCount >
_.options.slidesToShow) {
            $('li', _.$dots).on('click.slick', {
                message: 'index'
            }, _.changeSlide);

            if (_.options.accessibility === true) {
                _.$dots.on('keydown.slick', _.keyHandler);
            }
        }

        if (_.options.dots === true && _.options.pauseOnDotsHover
=== true && _.slideCount > _.options.slidesToShow) {

            $('li', _.$dots)
                .on('mouseenter.slick', $.proxy(_.interrupt, _,
true))
                .on('mouseleave.slick', $.proxy(_.interrupt, _,
false));

        }

    };

    Slick.prototype.initSlideEvents = function() {

        var _ = this;

        if ( _.options.pauseOnHover ) {

            _.$list.on('mouseenter.slick', $.proxy(_.interrupt,
_, true));
            _.$list.on('mouseleave.slick', $.proxy(_.interrupt,
_, false));

        }

    };

    Slick.prototype.initializeEvents = function() {

        var _ = this;

        _.initArrowEvents();

        _.initDotEvents();
        _.initSlideEvents();

        _.$list.on('touchstart.slick mousedown.slick', {
            action: 'start'
        }, _.swipeHandler);
        _.$list.on('touchmove.slick mousemove.slick', {
            action: 'move'
        }, _.swipeHandler);
        _.$list.on('touchend.slick mouseup.slick', {
            action: 'end'
        }, _.swipeHandler);
        _.$list.on('touchcancel.slick mouseleave.slick', {
            action: 'end'
        }, _.swipeHandler);

        _.$list.on('click.slick', _.clickHandler);

        $(document).on(_.visibilityChange, $.proxy(_.visibility, _));

        if (_.options.accessibility === true) {
            _.$list.on('keydown.slick', _.keyHandler);
        }

        if (_.options.focusOnSelect === true) {
            $(_.$slideTrack).children().on('click.slick',
_.selectHandler);
        }

        $(window).on('orientationchange.slick.slick-' +
_.instanceUid, $.proxy(_.orientationChange, _));

        $(window).on('resize.slick.slick-' + _.instanceUid,
$.proxy(_.resize, _));

        $('[draggable!=true]',
_.$slideTrack).on('dragstart', _.preventDefault);

        $(window).on('load.slick.slick-' + _.instanceUid,
_.setPosition);
        $(_.setPosition);

    };

    Slick.prototype.initUI = function() {

        var _ = this;

        if (_.options.arrows === true && _.slideCount >
_.options.slidesToShow) {

            _.$prevArrow.show();
            _.$nextArrow.show();

        }

        if (_.options.dots === true && _.slideCount >
_.options.slidesToShow) {

            _.$dots.show();

        }

    };

    Slick.prototype.keyHandler = function(event) {

        var _ = this;
         //Dont slide if the cursor is inside the form fields and arrow
keys are pressed
        if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT'))
{
            if (event.keyCode === 37 && _.options.accessibility ===
true) {
                _.changeSlide({
                    data: {
                        message: _.options.rtl === true ? 'next'
:  'previous'
                    }
                });
            } else if (event.keyCode === 39 &&
_.options.accessibility === true) {
                _.changeSlide({
                    data: {
                        message: _.options.rtl === true ?
'previous' : 'next'
                    }
                });
            }
        }

    };

    Slick.prototype.lazyLoad = function() {

        var _ = this,
            loadRange, cloneRange, rangeStart, rangeEnd;

        function loadImages(imagesScope) {

            $('img[data-lazy]', imagesScope).each(function() {

                var image = $(this),
                    imageSource = $(this).attr('data-lazy'),
                    imageSrcSet = $(this).attr('data-srcset'),
                    imageSizes  = $(this).attr('data-sizes') ||
_.$slider.attr('data-sizes'),
                    imageToLoad = document.createElement('img');

                imageToLoad.onload = function() {

                    image
                        .animate({ opacity: 0 }, 100, function() {

                            if (imageSrcSet) {
                                image
                                    .attr('srcset', imageSrcSet
);

                                if (imageSizes) {
                                    image
                                        .attr('sizes', imageSizes
);
                                }
                            }

                            image
                                .attr('src', imageSource)
                                .animate({ opacity: 1 }, 200, function() {
                                    image
                                        .removeAttr('data-lazy
data-srcset data-sizes')
                                       
.removeClass('slick-loading');
                                });
                            _.$slider.trigger('lazyLoaded', [_,
image, imageSource]);
                        });

                };

                imageToLoad.onerror = function() {

                    image
                        .removeAttr( 'data-lazy' )
                        .removeClass( 'slick-loading' )
                        .addClass( 'slick-lazyload-error' );

                    _.$slider.trigger('lazyLoadError', [ _,
image, imageSource ]);

                };

                imageToLoad.src = imageSource;

            });

        }

        if (_.options.centerMode === true) {
            if (_.options.infinite === true) {
                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 +
1);
                rangeEnd = rangeStart + _.options.slidesToShow + 2;
            } else {
                rangeStart = Math.max(0, _.currentSlide -
(_.options.slidesToShow / 2 + 1));
                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) +
_.currentSlide;
            }
        } else {
            rangeStart = _.options.infinite ? _.options.slidesToShow +
_.currentSlide : _.currentSlide;
            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);
            if (_.options.fade === true) {
                if (rangeStart > 0) rangeStart--;
                if (rangeEnd <= _.slideCount) rangeEnd++;
            }
        }

        loadRange =
_.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);

        if (_.options.lazyLoad === 'anticipated') {
            var prevSlide = rangeStart - 1,
                nextSlide = rangeEnd,
                $slides = _.$slider.find('.slick-slide');

            for (var i = 0; i < _.options.slidesToScroll; i++) {
                if (prevSlide < 0) prevSlide = _.slideCount - 1;
                loadRange = loadRange.add($slides.eq(prevSlide));
                loadRange = loadRange.add($slides.eq(nextSlide));
                prevSlide--;
                nextSlide++;
            }
        }

        loadImages(loadRange);

        if (_.slideCount <= _.options.slidesToShow) {
            cloneRange = _.$slider.find('.slick-slide');
            loadImages(cloneRange);
        } else
        if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {
            cloneRange = _.$slider.find('.slick-cloned').slice(0,
_.options.slidesToShow);
            loadImages(cloneRange);
        } else if (_.currentSlide === 0) {
            cloneRange =
_.$slider.find('.slick-cloned').slice(_.options.slidesToShow *
-1);
            loadImages(cloneRange);
        }

    };

    Slick.prototype.loadSlider = function() {

        var _ = this;

        _.setPosition();

        _.$slideTrack.css({
            opacity: 1
        });

        _.$slider.removeClass('slick-loading');

        _.initUI();

        if (_.options.lazyLoad === 'progressive') {
            _.progressiveLazyLoad();
        }

    };

    Slick.prototype.next = Slick.prototype.slickNext = function() {

        var _ = this;

        _.changeSlide({
            data: {
                message: 'next'
            }
        });

    };

    Slick.prototype.orientationChange = function() {

        var _ = this;

        _.checkResponsive();
        _.setPosition();

    };

    Slick.prototype.pause = Slick.prototype.slickPause = function() {

        var _ = this;

        _.autoPlayClear();
        _.paused = true;

    };

    Slick.prototype.play = Slick.prototype.slickPlay = function() {

        var _ = this;

        _.autoPlay();
        _.options.autoplay = true;
        _.paused = false;
        _.focussed = false;
        _.interrupted = false;

    };

    Slick.prototype.postSlide = function(index) {

        var _ = this;

        if( !_.unslicked ) {

            _.$slider.trigger('afterChange', [_, index]);

            _.animating = false;

            if (_.slideCount > _.options.slidesToShow) {
                _.setPosition();
            }

            _.swipeLeft = null;

            if ( _.options.autoplay ) {
                _.autoPlay();
            }

            if (_.options.accessibility === true) {
                _.initADA();

                if (_.options.focusOnChange) {
                    var $currentSlide = $(_.$slides.get(_.currentSlide));
                    $currentSlide.attr('tabindex', 0).focus();
                }
            }

        }

    };

    Slick.prototype.prev = Slick.prototype.slickPrev = function() {

        var _ = this;

        _.changeSlide({
            data: {
                message: 'previous'
            }
        });

    };

    Slick.prototype.preventDefault = function(event) {

        event.preventDefault();

    };

    Slick.prototype.progressiveLazyLoad = function( tryCount ) {

        tryCount = tryCount || 1;

        var _ = this,
            $imgsToLoad = $( 'img[data-lazy]', _.$slider ),
            image,
            imageSource,
            imageSrcSet,
            imageSizes,
            imageToLoad;

        if ( $imgsToLoad.length ) {

            image = $imgsToLoad.first();
            imageSource = image.attr('data-lazy');
            imageSrcSet = image.attr('data-srcset');
            imageSizes  = image.attr('data-sizes') ||
_.$slider.attr('data-sizes');
            imageToLoad = document.createElement('img');

            imageToLoad.onload = function() {

                if (imageSrcSet) {
                    image
                        .attr('srcset', imageSrcSet );

                    if (imageSizes) {
                        image
                            .attr('sizes', imageSizes );
                    }
                }

                image
                    .attr( 'src', imageSource )
                    .removeAttr('data-lazy data-srcset
data-sizes')
                    .removeClass('slick-loading');

                if ( _.options.adaptiveHeight === true ) {
                    _.setPosition();
                }

                _.$slider.trigger('lazyLoaded', [ _, image,
imageSource ]);
                _.progressiveLazyLoad();

            };

            imageToLoad.onerror = function() {

                if ( tryCount < 3 ) {

                    /**
                     * try to load the image 3 times,
                     * leave a slight delay so we don't get
                     * servers blocking the request.
                     */
                    setTimeout( function() {
                        _.progressiveLazyLoad( tryCount + 1 );
                    }, 500 );

                } else {

                    image
                        .removeAttr( 'data-lazy' )
                        .removeClass( 'slick-loading' )
                        .addClass( 'slick-lazyload-error' );

                    _.$slider.trigger('lazyLoadError', [ _,
image, imageSource ]);

                    _.progressiveLazyLoad();

                }

            };

            imageToLoad.src = imageSource;

        } else {

            _.$slider.trigger('allImagesLoaded', [ _ ]);

        }

    };

    Slick.prototype.refresh = function( initializing ) {

        var _ = this, currentSlide, lastVisibleIndex;

        lastVisibleIndex = _.slideCount - _.options.slidesToShow;

        // in non-infinite sliders, we don't want to go past the
        // last visible index.
        if( !_.options.infinite && ( _.currentSlide >
lastVisibleIndex )) {
            _.currentSlide = lastVisibleIndex;
        }

        // if less slides than to show, go to start.
        if ( _.slideCount <= _.options.slidesToShow ) {
            _.currentSlide = 0;

        }

        currentSlide = _.currentSlide;

        _.destroy(true);

        $.extend(_, _.initials, { currentSlide: currentSlide });

        _.init();

        if( !initializing ) {

            _.changeSlide({
                data: {
                    message: 'index',
                    index: currentSlide
                }
            }, false);

        }

    };

    Slick.prototype.registerBreakpoints = function() {

        var _ = this, breakpoint, currentBreakpoint, l,
            responsiveSettings = _.options.responsive || null;

        if ( $.type(responsiveSettings) === 'array' &&
responsiveSettings.length ) {

            _.respondTo = _.options.respondTo || 'window';

            for ( breakpoint in responsiveSettings ) {

                l = _.breakpoints.length-1;

                if (responsiveSettings.hasOwnProperty(breakpoint)) {
                    currentBreakpoint =
responsiveSettings[breakpoint].breakpoint;

                    // loop through the breakpoints and cut out any
existing
                    // ones with the same breakpoint number, we don't
want dupes.
                    while( l >= 0 ) {
                        if( _.breakpoints[l] && _.breakpoints[l]
=== currentBreakpoint ) {
                            _.breakpoints.splice(l,1);
                        }
                        l--;
                    }

                    _.breakpoints.push(currentBreakpoint);
                    _.breakpointSettings[currentBreakpoint] =
responsiveSettings[breakpoint].settings;

                }

            }

            _.breakpoints.sort(function(a, b) {
                return ( _.options.mobileFirst ) ? a-b : b-a;
            });

        }

    };

    Slick.prototype.reinit = function() {

        var _ = this;

        _.$slides =
            _.$slideTrack
                .children(_.options.slide)
                .addClass('slick-slide');

        _.slideCount = _.$slides.length;

        if (_.currentSlide >= _.slideCount && _.currentSlide !==
0) {
            _.currentSlide = _.currentSlide - _.options.slidesToScroll;
        }

        if (_.slideCount <= _.options.slidesToShow) {
            _.currentSlide = 0;
        }

        _.registerBreakpoints();

        _.setProps();
        _.setupInfinite();
        _.buildArrows();
        _.updateArrows();
        _.initArrowEvents();
        _.buildDots();
        _.updateDots();
        _.initDotEvents();
        _.cleanUpSlideEvents();
        _.initSlideEvents();

        _.checkResponsive(false, true);

        if (_.options.focusOnSelect === true) {
            $(_.$slideTrack).children().on('click.slick',
_.selectHandler);
        }

        _.setSlideClasses(typeof _.currentSlide === 'number' ?
_.currentSlide : 0);

        _.setPosition();
        _.focusHandler();

        _.paused = !_.options.autoplay;
        _.autoPlay();

        _.$slider.trigger('reInit', [_]);

    };

    Slick.prototype.resize = function() {

        var _ = this;

        if ($(window).width() !== _.windowWidth) {
            clearTimeout(_.windowDelay);
            _.windowDelay = window.setTimeout(function() {
                _.windowWidth = $(window).width();
                _.checkResponsive();
                if( !_.unslicked ) { _.setPosition(); }
            }, 50);
        }
    };

    Slick.prototype.removeSlide = Slick.prototype.slickRemove =
function(index, removeBefore, removeAll) {

        var _ = this;

        if (typeof(index) === 'boolean') {
            removeBefore = index;
            index = removeBefore === true ? 0 : _.slideCount - 1;
        } else {
            index = removeBefore === true ? --index : index;
        }

        if (_.slideCount < 1 || index < 0 || index > _.slideCount
- 1) {
            return false;
        }

        _.unload();

        if (removeAll === true) {
            _.$slideTrack.children().remove();
        } else {
            _.$slideTrack.children(this.options.slide).eq(index).remove();
        }

        _.$slides = _.$slideTrack.children(this.options.slide);

        _.$slideTrack.children(this.options.slide).detach();

        _.$slideTrack.append(_.$slides);

        _.$slidesCache = _.$slides;

        _.reinit();

    };

    Slick.prototype.setCSS = function(position) {

        var _ = this,
            positionProps = {},
            x, y;

        if (_.options.rtl === true) {
            position = -position;
        }
        x = _.positionProp == 'left' ? Math.ceil(position) +
'px' : '0px';
        y = _.positionProp == 'top' ? Math.ceil(position) +
'px' : '0px';

        positionProps[_.positionProp] = position;

        if (_.transformsEnabled === false) {
            _.$slideTrack.css(positionProps);
        } else {
            positionProps = {};
            if (_.cssTransitions === false) {
                positionProps[_.animType] = 'translate(' + x +
', ' + y + ')';
                _.$slideTrack.css(positionProps);
            } else {
                positionProps[_.animType] = 'translate3d(' + x +
', ' + y + ', 0px)';
                _.$slideTrack.css(positionProps);
            }
        }

    };

    Slick.prototype.setDimensions = function() {

        var _ = this;

        if (_.options.vertical === false) {
            if (_.options.centerMode === true) {
                _.$list.css({
                    padding: ('0px ' + _.options.centerPadding)
                });
            }
        } else {
            _.$list.height(_.$slides.first().outerHeight(true) *
_.options.slidesToShow);
            if (_.options.centerMode === true) {
                _.$list.css({
                    padding: (_.options.centerPadding + ' 0px')
                });
            }
        }

        _.listWidth = _.$list.width();
        _.listHeight = _.$list.height();


        if (_.options.vertical === false && _.options.variableWidth
=== false) {
            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);
            _.$slideTrack.width(Math.ceil((_.slideWidth *
_.$slideTrack.children('.slick-slide').length)));

        } else if (_.options.variableWidth === true) {
            _.$slideTrack.width(5000 * _.slideCount);
        } else {
            _.slideWidth = Math.ceil(_.listWidth);
           
_.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) *
_.$slideTrack.children('.slick-slide').length)));
        }

        var offset = _.$slides.first().outerWidth(true) -
_.$slides.first().width();
        if (_.options.variableWidth === false)
_.$slideTrack.children('.slick-slide').width(_.slideWidth -
offset);

    };

    Slick.prototype.setFade = function() {

        var _ = this,
            targetLeft;

        _.$slides.each(function(index, element) {
            targetLeft = (_.slideWidth * index) * -1;
            if (_.options.rtl === true) {
                $(element).css({
                    position: 'relative',
                    right: targetLeft,
                    top: 0,
                    zIndex: _.options.zIndex - 2,
                    opacity: 0
                });
            } else {
                $(element).css({
                    position: 'relative',
                    left: targetLeft,
                    top: 0,
                    zIndex: _.options.zIndex - 2,
                    opacity: 0
                });
            }
        });

        _.$slides.eq(_.currentSlide).css({
            zIndex: _.options.zIndex - 1,
            opacity: 1
        });

    };

    Slick.prototype.setHeight = function() {

        var _ = this;

        if (_.options.slidesToShow === 1 &&
_.options.adaptiveHeight === true && _.options.vertical === false)
{
            var targetHeight =
_.$slides.eq(_.currentSlide).outerHeight(true);
            _.$list.css('height', targetHeight);
        }

    };

    Slick.prototype.setOption =
    Slick.prototype.slickSetOption = function() {

        /**
         * accepts arguments in format of:
         *
         *  - for changing a single option's value:
         *     .slick("setOption", option, value, refresh )
         *
         *  - for changing a set of responsive options:
         *     .slick("setOption", 'responsive', [{},
...], refresh )
         *
         *  - for updating multiple values at once (not responsive)
         *     .slick("setOption", { 'option': value,
... }, refresh )
         */

        var _ = this, l, item, option, value, refresh = false, type;

        if( $.type( arguments[0] ) === 'object' ) {

            option =  arguments[0];
            refresh = arguments[1];
            type = 'multiple';

        } else if ( $.type( arguments[0] ) === 'string' ) {

            option =  arguments[0];
            value = arguments[1];
            refresh = arguments[2];

            if ( arguments[0] === 'responsive' && $.type(
arguments[1] ) === 'array' ) {

                type = 'responsive';

            } else if ( typeof arguments[1] !== 'undefined' ) {

                type = 'single';

            }

        }

        if ( type === 'single' ) {

            _.options[option] = value;


        } else if ( type === 'multiple' ) {

            $.each( option , function( opt, val ) {

                _.options[opt] = val;

            });


        } else if ( type === 'responsive' ) {

            for ( item in value ) {

                if( $.type( _.options.responsive ) !== 'array' )
{

                    _.options.responsive = [ value[item] ];

                } else {

                    l = _.options.responsive.length-1;

                    // loop through the responsive object and splice out
duplicates.
                    while( l >= 0 ) {

                        if( _.options.responsive[l].breakpoint ===
value[item].breakpoint ) {

                            _.options.responsive.splice(l,1);

                        }

                        l--;

                    }

                    _.options.responsive.push( value[item] );

                }

            }

        }

        if ( refresh ) {

            _.unload();
            _.reinit();

        }

    };

    Slick.prototype.setPosition = function() {

        var _ = this;

        _.setDimensions();

        _.setHeight();

        if (_.options.fade === false) {
            _.setCSS(_.getLeft(_.currentSlide));
        } else {
            _.setFade();
        }

        _.$slider.trigger('setPosition', [_]);

    };

    Slick.prototype.setProps = function() {

        var _ = this,
            bodyStyle = document.body.style;

        _.positionProp = _.options.vertical === true ? 'top' :
'left';

        if (_.positionProp === 'top') {
            _.$slider.addClass('slick-vertical');
        } else {
            _.$slider.removeClass('slick-vertical');
        }

        if (bodyStyle.WebkitTransition !== undefined ||
            bodyStyle.MozTransition !== undefined ||
            bodyStyle.msTransition !== undefined) {
            if (_.options.useCSS === true) {
                _.cssTransitions = true;
            }
        }

        if ( _.options.fade ) {
            if ( typeof _.options.zIndex === 'number' ) {
                if( _.options.zIndex < 3 ) {
                    _.options.zIndex = 3;
                }
            } else {
                _.options.zIndex = _.defaults.zIndex;
            }
        }

        if (bodyStyle.OTransform !== undefined) {
            _.animType = 'OTransform';
            _.transformType = '-o-transform';
            _.transitionType = 'OTransition';
            if (bodyStyle.perspectiveProperty === undefined &&
bodyStyle.webkitPerspective === undefined) _.animType = false;
        }
        if (bodyStyle.MozTransform !== undefined) {
            _.animType = 'MozTransform';
            _.transformType = '-moz-transform';
            _.transitionType = 'MozTransition';
            if (bodyStyle.perspectiveProperty === undefined &&
bodyStyle.MozPerspective === undefined) _.animType = false;
        }
        if (bodyStyle.webkitTransform !== undefined) {
            _.animType = 'webkitTransform';
            _.transformType = '-webkit-transform';
            _.transitionType = 'webkitTransition';
            if (bodyStyle.perspectiveProperty === undefined &&
bodyStyle.webkitPerspective === undefined) _.animType = false;
        }
        if (bodyStyle.msTransform !== undefined) {
            _.animType = 'msTransform';
            _.transformType = '-ms-transform';
            _.transitionType = 'msTransition';
            if (bodyStyle.msTransform === undefined) _.animType = false;
        }
        if (bodyStyle.transform !== undefined && _.animType !==
false) {
            _.animType = 'transform';
            _.transformType = 'transform';
            _.transitionType = 'transition';
        }
        _.transformsEnabled = _.options.useTransform && (_.animType
!== null && _.animType !== false);
    };


    Slick.prototype.setSlideClasses = function(index) {

        var _ = this,
            centerOffset, allSlides, indexOffset, remainder;

        allSlides = _.$slider
            .find('.slick-slide')
            .removeClass('slick-active slick-center
slick-current')
            .attr('aria-hidden', 'true');

        _.$slides
            .eq(index)
            .addClass('slick-current');

        if (_.options.centerMode === true) {

            var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;

            centerOffset = Math.floor(_.options.slidesToShow / 2);

            if (_.options.infinite === true) {

                if (index >= centerOffset && index <=
(_.slideCount - 1) - centerOffset) {
                    _.$slides
                        .slice(index - centerOffset + evenCoef, index +
centerOffset + 1)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                } else {

                    indexOffset = _.options.slidesToShow + index;
                    allSlides
                        .slice(indexOffset - centerOffset + 1 + evenCoef,
indexOffset + centerOffset + 2)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                }

                if (index === 0) {

                    allSlides
                        .eq(allSlides.length - 1 - _.options.slidesToShow)
                        .addClass('slick-center');

                } else if (index === _.slideCount - 1) {

                    allSlides
                        .eq(_.options.slidesToShow)
                        .addClass('slick-center');

                }

            }

            _.$slides
                .eq(index)
                .addClass('slick-center');

        } else {

            if (index >= 0 && index <= (_.slideCount -
_.options.slidesToShow)) {

                _.$slides
                    .slice(index, index + _.options.slidesToShow)
                    .addClass('slick-active')
                    .attr('aria-hidden', 'false');

            } else if (allSlides.length <= _.options.slidesToShow) {

                allSlides
                    .addClass('slick-active')
                    .attr('aria-hidden', 'false');

            } else {

                remainder = _.slideCount % _.options.slidesToShow;
                indexOffset = _.options.infinite === true ?
_.options.slidesToShow + index : index;

                if (_.options.slidesToShow == _.options.slidesToScroll
&& (_.slideCount - index) < _.options.slidesToShow) {

                    allSlides
                        .slice(indexOffset - (_.options.slidesToShow -
remainder), indexOffset + remainder)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                } else {

                    allSlides
                        .slice(indexOffset, indexOffset +
_.options.slidesToShow)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                }

            }

        }

        if (_.options.lazyLoad === 'ondemand' ||
_.options.lazyLoad === 'anticipated') {
            _.lazyLoad();
        }
    };

    Slick.prototype.setupInfinite = function() {

        var _ = this,
            i, slideIndex, infiniteCount;

        if (_.options.fade === true) {
            _.options.centerMode = false;
        }

        if (_.options.infinite === true && _.options.fade ===
false) {

            slideIndex = null;

            if (_.slideCount > _.options.slidesToShow) {

                if (_.options.centerMode === true) {
                    infiniteCount = _.options.slidesToShow + 1;
                } else {
                    infiniteCount = _.options.slidesToShow;
                }

                for (i = _.slideCount; i > (_.slideCount -
                        infiniteCount); i -= 1) {
                    slideIndex = i - 1;
                   
$(_.$slides[slideIndex]).clone(true).attr('id', '')
                        .attr('data-slick-index', slideIndex -
_.slideCount)
                       
.prependTo(_.$slideTrack).addClass('slick-cloned');
                }
                for (i = 0; i < infiniteCount  + _.slideCount; i += 1) {
                    slideIndex = i;
                   
$(_.$slides[slideIndex]).clone(true).attr('id', '')
                        .attr('data-slick-index', slideIndex +
_.slideCount)
                       
.appendTo(_.$slideTrack).addClass('slick-cloned');
                }
               
_.$slideTrack.find('.slick-cloned').find('[id]').each(function()
{
                    $(this).attr('id', '');
                });

            }

        }

    };

    Slick.prototype.interrupt = function( toggle ) {

        var _ = this;

        if( !toggle ) {
            _.autoPlay();
        }
        _.interrupted = toggle;

    };

    Slick.prototype.selectHandler = function(event) {

        var _ = this;

        var targetElement =
            $(event.target).is('.slick-slide') ?
                $(event.target) :
                $(event.target).parents('.slick-slide');

        var index =
parseInt(targetElement.attr('data-slick-index'));

        if (!index) index = 0;

        if (_.slideCount <= _.options.slidesToShow) {

            _.slideHandler(index, false, true);
            return;

        }

        _.slideHandler(index);

    };

    Slick.prototype.slideHandler = function(index, sync, dontAnimate) {

        var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,
            _ = this, navTarget;

        sync = sync || false;

        if (_.animating === true && _.options.waitForAnimate ===
true) {
            return;
        }

        if (_.options.fade === true && _.currentSlide === index) {
            return;
        }

        if (sync === false) {
            _.asNavFor(index);
        }

        targetSlide = index;
        targetLeft = _.getLeft(targetSlide);
        slideLeft = _.getLeft(_.currentSlide);

        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;

        if (_.options.infinite === false && _.options.centerMode
=== false && (index < 0 || index > _.getDotCount() *
_.options.slidesToScroll)) {
            if (_.options.fade === false) {
                targetSlide = _.currentSlide;
                if (dontAnimate !== true && _.slideCount >
_.options.slidesToShow) {
                    _.animateSlide(slideLeft, function() {
                        _.postSlide(targetSlide);
                    });
                } else {
                    _.postSlide(targetSlide);
                }
            }
            return;
        } else if (_.options.infinite === false &&
_.options.centerMode === true && (index < 0 || index >
(_.slideCount - _.options.slidesToScroll))) {
            if (_.options.fade === false) {
                targetSlide = _.currentSlide;
                if (dontAnimate !== true && _.slideCount >
_.options.slidesToShow) {
                    _.animateSlide(slideLeft, function() {
                        _.postSlide(targetSlide);
                    });
                } else {
                    _.postSlide(targetSlide);
                }
            }
            return;
        }

        if ( _.options.autoplay ) {
            clearInterval(_.autoPlayTimer);
        }

        if (targetSlide < 0) {
            if (_.slideCount % _.options.slidesToScroll !== 0) {
                animSlide = _.slideCount - (_.slideCount %
_.options.slidesToScroll);
            } else {
                animSlide = _.slideCount + targetSlide;
            }
        } else if (targetSlide >= _.slideCount) {
            if (_.slideCount % _.options.slidesToScroll !== 0) {
                animSlide = 0;
            } else {
                animSlide = targetSlide - _.slideCount;
            }
        } else {
            animSlide = targetSlide;
        }

        _.animating = true;

        _.$slider.trigger('beforeChange', [_, _.currentSlide,
animSlide]);

        oldSlide = _.currentSlide;
        _.currentSlide = animSlide;

        _.setSlideClasses(_.currentSlide);

        if ( _.options.asNavFor ) {

            navTarget = _.getNavTarget();
            navTarget = navTarget.slick('getSlick');

            if ( navTarget.slideCount <= navTarget.options.slidesToShow
) {
                navTarget.setSlideClasses(_.currentSlide);
            }

        }

        _.updateDots();
        _.updateArrows();

        if (_.options.fade === true) {
            if (dontAnimate !== true) {

                _.fadeSlideOut(oldSlide);

                _.fadeSlide(animSlide, function() {
                    _.postSlide(animSlide);
                });

            } else {
                _.postSlide(animSlide);
            }
            _.animateHeight();
            return;
        }

        if (dontAnimate !== true && _.slideCount >
_.options.slidesToShow) {
            _.animateSlide(targetLeft, function() {
                _.postSlide(animSlide);
            });
        } else {
            _.postSlide(animSlide);
        }

    };

    Slick.prototype.startLoad = function() {

        var _ = this;

        if (_.options.arrows === true && _.slideCount >
_.options.slidesToShow) {

            _.$prevArrow.hide();
            _.$nextArrow.hide();

        }

        if (_.options.dots === true && _.slideCount >
_.options.slidesToShow) {

            _.$dots.hide();

        }

        _.$slider.addClass('slick-loading');

    };

    Slick.prototype.swipeDirection = function() {

        var xDist, yDist, r, swipeAngle, _ = this;

        xDist = _.touchObject.startX - _.touchObject.curX;
        yDist = _.touchObject.startY - _.touchObject.curY;
        r = Math.atan2(yDist, xDist);

        swipeAngle = Math.round(r * 180 / Math.PI);
        if (swipeAngle < 0) {
            swipeAngle = 360 - Math.abs(swipeAngle);
        }

        if ((swipeAngle <= 45) && (swipeAngle >= 0)) {
            return (_.options.rtl === false ? 'left' :
'right');
        }
        if ((swipeAngle <= 360) && (swipeAngle >= 315)) {
            return (_.options.rtl === false ? 'left' :
'right');
        }
        if ((swipeAngle >= 135) && (swipeAngle <= 225)) {
            return (_.options.rtl === false ? 'right' :
'left');
        }
        if (_.options.verticalSwiping === true) {
            if ((swipeAngle >= 35) && (swipeAngle <= 135)) {
                return 'down';
            } else {
                return 'up';
            }
        }

        return 'vertical';

    };

    Slick.prototype.swipeEnd = function(event) {

        var _ = this,
            slideCount,
            direction;

        _.dragging = false;
        _.swiping = false;

        if (_.scrolling) {
            _.scrolling = false;
            return false;
        }

        _.interrupted = false;
        _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false :
true;

        if ( _.touchObject.curX === undefined ) {
            return false;
        }

        if ( _.touchObject.edgeHit === true ) {
            _.$slider.trigger('edge', [_, _.swipeDirection() ]);
        }

        if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {

            direction = _.swipeDirection();

            switch ( direction ) {

                case 'left':
                case 'down':

                    slideCount =
                        _.options.swipeToSlide ?
                            _.checkNavigable( _.currentSlide +
_.getSlideCount() ) :
                            _.currentSlide + _.getSlideCount();

                    _.currentDirection = 0;

                    break;

                case 'right':
                case 'up':

                    slideCount =
                        _.options.swipeToSlide ?
                            _.checkNavigable( _.currentSlide -
_.getSlideCount() ) :
                            _.currentSlide - _.getSlideCount();

                    _.currentDirection = 1;

                    break;

                default:


            }

            if( direction != 'vertical' ) {

                _.slideHandler( slideCount );
                _.touchObject = {};
                _.$slider.trigger('swipe', [_, direction ]);

            }

        } else {

            if ( _.touchObject.startX !== _.touchObject.curX ) {

                _.slideHandler( _.currentSlide );
                _.touchObject = {};

            }

        }

    };

    Slick.prototype.swipeHandler = function(event) {

        var _ = this;

        if ((_.options.swipe === false) || ('ontouchend' in
document && _.options.swipe === false)) {
            return;
        } else if (_.options.draggable === false &&
event.type.indexOf('mouse') !== -1) {
            return;
        }

        _.touchObject.fingerCount = event.originalEvent &&
event.originalEvent.touches !== undefined ?
            event.originalEvent.touches.length : 1;

        _.touchObject.minSwipe = _.listWidth / _.options
            .touchThreshold;

        if (_.options.verticalSwiping === true) {
            _.touchObject.minSwipe = _.listHeight / _.options
                .touchThreshold;
        }

        switch (event.data.action) {

            case 'start':
                _.swipeStart(event);
                break;

            case 'move':
                _.swipeMove(event);
                break;

            case 'end':
                _.swipeEnd(event);
                break;

        }

    };

    Slick.prototype.swipeMove = function(event) {

        var _ = this,
            edgeWasHit = false,
            curLeft, swipeDirection, swipeLength, positionOffset, touches,
verticalSwipeLength;

        touches = event.originalEvent !== undefined ?
event.originalEvent.touches : null;

        if (!_.dragging || _.scrolling || touches && touches.length
!== 1) {
            return false;
        }

        curLeft = _.getLeft(_.currentSlide);

        _.touchObject.curX = touches !== undefined ? touches[0].pageX :
event.clientX;
        _.touchObject.curY = touches !== undefined ? touches[0].pageY :
event.clientY;

        _.touchObject.swipeLength = Math.round(Math.sqrt(
            Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));

        verticalSwipeLength = Math.round(Math.sqrt(
            Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));

        if (!_.options.verticalSwiping && !_.swiping &&
verticalSwipeLength > 4) {
            _.scrolling = true;
            return false;
        }

        if (_.options.verticalSwiping === true) {
            _.touchObject.swipeLength = verticalSwipeLength;
        }

        swipeDirection = _.swipeDirection();

        if (event.originalEvent !== undefined &&
_.touchObject.swipeLength > 4) {
            _.swiping = true;
            event.preventDefault();
        }

        positionOffset = (_.options.rtl === false ? 1 : -1) *
(_.touchObject.curX > _.touchObject.startX ? 1 : -1);
        if (_.options.verticalSwiping === true) {
            positionOffset = _.touchObject.curY > _.touchObject.startY ?
1 : -1;
        }


        swipeLength = _.touchObject.swipeLength;

        _.touchObject.edgeHit = false;

        if (_.options.infinite === false) {
            if ((_.currentSlide === 0 && swipeDirection ===
'right') || (_.currentSlide >= _.getDotCount() &&
swipeDirection === 'left')) {
                swipeLength = _.touchObject.swipeLength *
_.options.edgeFriction;
                _.touchObject.edgeHit = true;
            }
        }

        if (_.options.vertical === false) {
            _.swipeLeft = curLeft + swipeLength * positionOffset;
        } else {
            _.swipeLeft = curLeft + (swipeLength * (_.$list.height() /
_.listWidth)) * positionOffset;
        }
        if (_.options.verticalSwiping === true) {
            _.swipeLeft = curLeft + swipeLength * positionOffset;
        }

        if (_.options.fade === true || _.options.touchMove === false) {
            return false;
        }

        if (_.animating === true) {
            _.swipeLeft = null;
            return false;
        }

        _.setCSS(_.swipeLeft);

    };

    Slick.prototype.swipeStart = function(event) {

        var _ = this,
            touches;

        _.interrupted = true;

        if (_.touchObject.fingerCount !== 1 || _.slideCount <=
_.options.slidesToShow) {
            _.touchObject = {};
            return false;
        }

        if (event.originalEvent !== undefined &&
event.originalEvent.touches !== undefined) {
            touches = event.originalEvent.touches[0];
        }

        _.touchObject.startX = _.touchObject.curX = touches !== undefined ?
touches.pageX : event.clientX;
        _.touchObject.startY = _.touchObject.curY = touches !== undefined ?
touches.pageY : event.clientY;

        _.dragging = true;

    };

    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter =
function() {

        var _ = this;

        if (_.$slidesCache !== null) {

            _.unload();

            _.$slideTrack.children(this.options.slide).detach();

            _.$slidesCache.appendTo(_.$slideTrack);

            _.reinit();

        }

    };

    Slick.prototype.unload = function() {

        var _ = this;

        $('.slick-cloned', _.$slider).remove();

        if (_.$dots) {
            _.$dots.remove();
        }

        if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {
            _.$prevArrow.remove();
        }

        if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {
            _.$nextArrow.remove();
        }

        _.$slides
            .removeClass('slick-slide slick-active slick-visible
slick-current')
            .attr('aria-hidden', 'true')
            .css('width', '');

    };

    Slick.prototype.unslick = function(fromBreakpoint) {

        var _ = this;
        _.$slider.trigger('unslick', [_, fromBreakpoint]);
        _.destroy();

    };

    Slick.prototype.updateArrows = function() {

        var _ = this,
            centerOffset;

        centerOffset = Math.floor(_.options.slidesToShow / 2);

        if ( _.options.arrows === true &&
            _.slideCount > _.options.slidesToShow &&
            !_.options.infinite ) {

           
_.$prevArrow.removeClass('slick-disabled').attr('aria-disabled',
'false');
           
_.$nextArrow.removeClass('slick-disabled').attr('aria-disabled',
'false');

            if (_.currentSlide === 0) {

               
_.$prevArrow.addClass('slick-disabled').attr('aria-disabled',
'true');
               
_.$nextArrow.removeClass('slick-disabled').attr('aria-disabled',
'false');

            } else if (_.currentSlide >= _.slideCount -
_.options.slidesToShow && _.options.centerMode === false) {

               
_.$nextArrow.addClass('slick-disabled').attr('aria-disabled',
'true');
               
_.$prevArrow.removeClass('slick-disabled').attr('aria-disabled',
'false');

            } else if (_.currentSlide >= _.slideCount - 1 &&
_.options.centerMode === true) {

               
_.$nextArrow.addClass('slick-disabled').attr('aria-disabled',
'true');
               
_.$prevArrow.removeClass('slick-disabled').attr('aria-disabled',
'false');

            }

        }

    };

    Slick.prototype.updateDots = function() {

        var _ = this;

        if (_.$dots !== null) {

            _.$dots
                .find('li')
                    .removeClass('slick-active')
                    .end();

            _.$dots
                .find('li')
                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))
                .addClass('slick-active');

        }

    };

    Slick.prototype.visibility = function() {

        var _ = this;

        if ( _.options.autoplay ) {

            if ( document[_.hidden] ) {

                _.interrupted = true;

            } else {

                _.interrupted = false;

            }

        }

    };

    $.fn.slick = function() {
        var _ = this,
            opt = arguments[0],
            args = Array.prototype.slice.call(arguments, 1),
            l = _.length,
            i,
            ret;
        for (i = 0; i < l; i++) {
            if (typeof opt == 'object' || typeof opt ==
'undefined')
                _[i].slick = new Slick(_[i], opt);
            else
                ret = _[i].slick[opt].apply(_[i].slick, args);
            if (typeof ret != 'undefined') return ret;
        }
        return _;
    };

}));
libs/slick/slick.less000064400000003334151165347350010614 0ustar00/* Slider
*/

.slick-slider {
    position: relative;
    display: block;
    box-sizing: border-box;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    -ms-touch-action: pan-y;
    touch-action: pan-y;
    -webkit-tap-highlight-color: transparent;
}
.slick-list {
    position: relative;
    overflow: hidden;
    display: block;
    margin: 0;
    padding: 0;

    &:focus {
        outline: none;
    }

    &.dragging {
        cursor: pointer;
        cursor: hand;
    }
}
.slick-slider .slick-track,
.slick-slider .slick-list {
    -webkit-transform: translate3d(0, 0, 0);
    -moz-transform: translate3d(0, 0, 0);
    -ms-transform: translate3d(0, 0, 0);
    -o-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
}

.slick-track {
    position: relative;
    left: 0;
    top: 0;
    display: block;
    margin-left: auto;
    margin-right: auto;

    &:before,
    &:after {
        content: "";
        display: table;
    }

    &:after {
        clear: both;
    }

    .slick-loading & {
        visibility: hidden;
    }
}
.slick-slide {
    float: left;
    height: 100%;
    min-height: 1px;
    [dir="rtl"] & {
        float: right;
    }
    img {
        display: block;
    }
    &.slick-loading img {
        display: none;
    }

    display: none;

    &.dragging img {
        pointer-events: none;
    }

    .slick-initialized & {
        display: block;
    }

    .slick-loading & {
        visibility: hidden;
    }

    .slick-vertical & {
        display: block;
        height: auto;
        border: 1px solid transparent;
    }
}
.slick-arrow.slick-hidden {
    display: none;
}
libs/slick/slick.min.js000064400000125551151165347350011052 0ustar00/*
     _ _      _       _
 ___| (_) ___| | __  (_)___
/ __| | |/ __| |/ /  | / __|
\__ \ | | (__|   < _ | \__ \
|___/_|_|\___|_|\_(_)/ |___/
                   |__/

 Version: 1.9.0
  Author: Ken Wheeler
 Website: http://kenwheeler.github.io
    Docs: http://kenwheeler.github.io/slick
    Repo: http://github.com/kenwheeler/slick
  Issues: http://github.com/kenwheeler/slick/issues

 */
(function(i){"use strict";"function"==typeof
define&&define.amd?define(["jquery"],i):"undefined"!=typeof
exports?module.exports=i(require("jquery")):i(jQuery)})(function(i){"use
strict";var e=window.Slick||{};e=function(){function e(e,o){var
s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(e),appendDots:i(e),arrows:!0,asNavFor:null,prevArrow:'<button
class="slick-prev" aria-label="Previous"
type="button">Previous</button>',nextArrow:'<button
class="slick-next" aria-label="Next"
type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return
i('<button type="button"
/>').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(e),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(e).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,"undefined"!=typeof
document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):"undefined"!=typeof
document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=t++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}var
t=0;return e}(),e.prototype.activateADA=function(){var
i=this;i.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a,
input, button,
select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var
s=this;if("boolean"==typeof t)o=t,t=null;else
if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof
t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):o===!0?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var
i=this;if(1===i.options.slidesToShow&&i.options.adaptiveHeight===!0&&i.options.vertical===!1){var
e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var
o={},s=this;s.animateHeight(),s.options.rtl===!0&&s.options.vertical===!1&&(e=-e),s.transformsEnabled===!1?s.options.vertical===!1?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):s.cssTransitions===!1?(s.options.rtl===!0&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),s.options.vertical===!1?(o[s.animType]="translate("+i+"px,
0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),s.options.vertical===!1?o[s.animType]="translate3d("+e+"px,
0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px,
0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var
e=this,t=e.options.asNavFor;return
t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var
t=this,o=t.getNavTarget();null!==o&&"object"==typeof
o&&o.each(function(){var
t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var
e=this,t={};e.options.fade===!1?t[e.transitionType]=e.transformType+"
"+e.options.speed+"ms
"+e.options.cssEase:t[e.transitionType]="opacity
"+e.options.speed+"ms
"+e.options.cssEase,e.options.fade===!1?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var
i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var
i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var
i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(i.options.infinite===!1&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1===0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var
e=this;e.options.arrows===!0&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden
tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden
tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),e.options.infinite!==!0&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var
e,t,o=this;if(o.options.dots===!0&&o.slideCount>o.options.slidesToShow){for(o.$slider.addClass("slick-dotted"),t=i("<ul
/>").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("<li
/>").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var
e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('<div
class="slick-track"/>').appendTo(e.$slider):e.$slides.wrapAll('<div
class="slick-track"/>').parent(),e.$list=e.$slideTrack.wrap('<div
class="slick-list"/>').parent(),e.$slideTrack.css("opacity",0),e.options.centerMode!==!0&&e.options.swipeToSlide!==!0||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof
e.currentSlide?e.currentSlide:0),e.options.draggable===!0&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var
i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.options.rows>0){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var
d=document.createElement("div");for(e=0;e<l.options.rows;e++){var
a=document.createElement("div");for(t=0;t<l.options.slidesPerRow;t++){var
c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+"%",display:"inline-block"})}},e.prototype.checkResponsive=function(e,t){var
o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if("window"===r.respondTo?n=a:"slider"===r.respondTo?n=d:"min"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o
in
r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(r.originalSettings.mobileFirst===!1?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),e===!0&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),e===!0&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,e===!0&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||l===!1||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var
o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!==0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var
d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var
e,t,o=this;if(e=o.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else
for(var s in e){if(i<e[s]){i=t;break}t=e[s]}return
i},e.prototype.cleanUpEvents=function(){var
e=this;e.options.dots&&null!==e.$dots&&(i("li",e.$dots).off("click.slick",e.changeSlide).off("mouseenter.slick",i.proxy(e.interrupt,e,!0)).off("mouseleave.slick",i.proxy(e.interrupt,e,!1)),e.options.accessibility===!0&&e.$dots.off("keydown.slick",e.keyHandler)),e.$slider.off("focus.slick
blur.slick"),e.options.arrows===!0&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),e.options.accessibility===!0&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick
mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick
mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick
mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick
mouseleave.slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),e.options.accessibility===!0&&e.$list.off("keydown.slick",e.keyHandler),e.options.focusOnSelect===!0&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var
e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var
i,e=this;e.options.rows>0&&(i=e.$slides.children().children(),i.removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){var
e=this;e.shouldClick===!1&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var
t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled
slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled
tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled
slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled
tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide
slick-active slick-center slick-visible
slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var
e=this,t={};t[e.transitionType]="",e.options.fade===!1?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var
t=this;t.cssTransitions===!1?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var
e=this;e.cssTransitions===!1?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var
e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var
e=this;e.$slider.off("focus.slick
blur.slick").on("focus.slick","*",function(t){var
o=i(this);setTimeout(function(){e.options.pauseOnFocus&&o.is(":focus")&&(e.focussed=!0,e.autoPlay())},0)}).on("blur.slick","*",function(t){i(this);e.options.pauseOnFocus&&(e.focussed=!1,e.autoPlay())})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){var
i=this;return i.currentSlide},e.prototype.getDotCount=function(){var
i=this,e=0,t=0,o=0;if(i.options.infinite===!0)if(i.slideCount<=i.options.slidesToShow)++o;else
for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else
if(i.options.centerMode===!0)o=i.slideCount;else
if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else
o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return
o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return
n.slideOffset=0,t=n.$slides.first().outerHeight(!0),n.options.infinite===!0?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,n.options.vertical===!0&&n.options.centerMode===!0&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!==0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),n.options.centerMode===!0&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:n.options.centerMode===!0&&n.options.infinite===!0?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:n.options.centerMode===!0&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=n.options.vertical===!1?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,n.options.variableWidth===!0&&(o=n.slideCount<=n.options.slidesToShow||n.options.infinite===!1?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=n.options.rtl===!0?o[0]?(n.$slideTrack.width()-o[0].offsetLeft-o.width())*-1:0:o[0]?o[0].offsetLeft*-1:0,n.options.centerMode===!0&&(o=n.slideCount<=n.options.slidesToShow||n.options.infinite===!1?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=n.options.rtl===!0?o[0]?(n.$slideTrack.width()-o[0].offsetLeft-o.width())*-1:0:o[0]?o[0].offsetLeft*-1:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){var
e=this;return e.options[i]},e.prototype.getNavigableIndexes=function(){var
i,e=this,t=0,o=0,s=[];for(e.options.infinite===!1?i=e.slideCount:(t=e.options.slidesToScroll*-1,o=e.options.slidesToScroll*-1,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return
s},e.prototype.getSlick=function(){return
this},e.prototype.getSlideCount=function(){var e,t,o,s,n=this;return
s=n.options.centerMode===!0?Math.floor(n.$list.width()/2):0,o=n.swipeLeft*-1+s,n.options.swipeToSlide===!0?(n.$slideTrack.find(".slick-slide").each(function(e,s){var
r,l,d;if(r=i(s).outerWidth(),l=s.offsetLeft,n.options.centerMode!==!0&&(l+=r/2),d=l+r,o<d)return
t=s,!1}),e=Math.abs(i(t).attr("data-slick-index")-n.currentSlide)||1):n.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){var
t=this;t.changeSlide({data:{message:"index",index:parseInt(i)}},e)},e.prototype.init=function(e){var
t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),t.options.accessibility===!0&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var
e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return
i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a,
input, button,
select").attr({tabindex:"-1"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(".slick-cloned")).each(function(t){var
s=o.indexOf(t);if(i(this).attr({role:"tabpanel",id:"slick-slide"+e.instanceUid+t,tabindex:-1}),s!==-1){var
n="slick-slide-control"+e.instanceUid+s;i("#"+n).length&&i(this).attr({"aria-describedby":n})}}),e.$dots.attr("role","tablist").find("li").each(function(s){var
n=o[s];i(this).attr({role:"presentation"}),i(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+e.instanceUid+s,"aria-controls":"slick-slide"+e.instanceUid+n,"aria-label":s+1+"
of
"+t,"aria-selected":null,tabindex:"-1"})}).eq(e.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var
s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.options.focusOnChange?e.$slides.eq(s).attr({tabindex:"0"}):e.$slides.eq(s).removeAttr("tabindex");e.activateADA()},e.prototype.initArrowEvents=function(){var
i=this;i.options.arrows===!0&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),i.options.accessibility===!0&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var
e=this;e.options.dots===!0&&e.slideCount>e.options.slidesToShow&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),e.options.accessibility===!0&&e.$dots.on("keydown.slick",e.keyHandler)),e.options.dots===!0&&e.options.pauseOnDotsHover===!0&&e.slideCount>e.options.slidesToShow&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var
e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var
e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick
mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick
mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick
mouseup.slick",{action:"end"},e.swipeHandler),e.$list.on("touchcancel.slick
mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),e.options.accessibility===!0&&e.$list.on("keydown.slick",e.keyHandler),e.options.focusOnSelect===!0&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var
i=this;i.options.arrows===!0&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),i.options.dots===!0&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var
e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&e.options.accessibility===!0?e.changeSlide({data:{message:e.options.rtl===!0?"next":"previous"}}):39===i.keyCode&&e.options.accessibility===!0&&e.changeSlide({data:{message:e.options.rtl===!0?"previous":"next"}}))},e.prototype.lazyLoad=function(){function
e(e){i("img[data-lazy]",e).each(function(){var
e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||r.$slider.attr("data-sizes"),n=document.createElement("img");n.onload=function(){e.animate({opacity:0},100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy
data-srcset
data-sizes").removeClass("slick-loading")}),r.$slider.trigger("lazyLoaded",[r,e,t])})},n.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),r.$slider.trigger("lazyLoadError",[r,e,t])},n.src=t})}var
t,o,s,n,r=this;if(r.options.centerMode===!0?r.options.infinite===!0?(s=r.currentSlide+(r.options.slidesToShow/2+1),n=s+r.options.slidesToShow+2):(s=Math.max(0,r.currentSlide-(r.options.slidesToShow/2+1)),n=2+(r.options.slidesToShow/2+1)+r.currentSlide):(s=r.options.infinite?r.options.slidesToShow+r.currentSlide:r.currentSlide,n=Math.ceil(s+r.options.slidesToShow),r.options.fade===!0&&(s>0&&s--,n<=r.slideCount&&n++)),t=r.$slider.find(".slick-slide").slice(s,n),"anticipated"===r.options.lazyLoad)for(var
l=s-1,d=n,a=r.$slider.find(".slick-slide"),c=0;c<r.options.slidesToScroll;c++)l<0&&(l=r.slideCount-1),t=t.add(a.eq(l)),t=t.add(a.eq(d)),l--,d++;e(t),r.slideCount<=r.options.slidesToShow?(o=r.$slider.find(".slick-slide"),e(o)):r.currentSlide>=r.slideCount-r.options.slidesToShow?(o=r.$slider.find(".slick-cloned").slice(0,r.options.slidesToShow),e(o)):0===r.currentSlide&&(o=r.$slider.find(".slick-cloned").slice(r.options.slidesToShow*-1),e(o))},e.prototype.loadSlider=function(){var
i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){var
i=this;i.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var
i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var
i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var
i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var
t=this;if(!t.unslicked&&(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),t.options.accessibility===!0&&(t.initADA(),t.options.focusOnChange))){var
o=i(t.$slides.get(t.currentSlide));o.attr("tabindex",0).focus()}},e.prototype.prev=e.prototype.slickPrev=function(){var
i=this;i.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var
t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),r=document.createElement("img"),r.onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy
data-srcset
data-sizes").removeClass("slick-loading"),l.options.adaptiveHeight===!0&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var
t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var
e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e
in
n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return
s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var
e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),e.options.focusOnSelect===!0&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof
e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var
e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var
o=this;return"boolean"==typeof
i?(e=i,i=e===!0?0:o.slideCount-1):i=e===!0?--i:i,!(o.slideCount<1||i<0||i>o.slideCount-1)&&(o.unload(),t===!0?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,void
o.reinit())},e.prototype.setCSS=function(i){var
e,t,o=this,s={};o.options.rtl===!0&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,o.transformsEnabled===!1?o.$slideTrack.css(s):(s={},o.cssTransitions===!1?(s[o.animType]="translate("+e+",
"+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+",
"+t+",
0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var
i=this;i.options.vertical===!1?i.options.centerMode===!0&&i.$list.css({padding:"0px
"+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),i.options.centerMode===!0&&i.$list.css({padding:i.options.centerPadding+"
0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),i.options.vertical===!1&&i.options.variableWidth===!1?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):i.options.variableWidth===!0?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var
e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();i.options.variableWidth===!1&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var
e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,t.options.rtl===!0?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var
i=this;if(1===i.options.slidesToShow&&i.options.adaptiveHeight===!0&&i.options.vertical===!1){var
e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var
e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":"undefined"!=typeof
arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else
if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else
if("responsive"===n)for(t in
s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var
i=this;i.setDimensions(),i.setHeight(),i.options.fade===!1?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var
i=this,e=document.body.style;i.positionProp=i.options.vertical===!0?"top":"left",
"top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"),void
0===e.WebkitTransition&&void 0===e.MozTransition&&void
0===e.msTransition||i.options.useCSS===!0&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof
i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void
0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void
0===e.perspectiveProperty&&void
0===e.webkitPerspective&&(i.animType=!1)),void
0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void
0===e.perspectiveProperty&&void
0===e.MozPerspective&&(i.animType=!1)),void
0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void
0===e.perspectiveProperty&&void
0===e.webkitPerspective&&(i.animType=!1)),void
0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void
0===e.msTransform&&(i.animType=!1)),void
0!==e.transform&&i.animType!==!1&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&i.animType!==!1},e.prototype.setSlideClasses=function(i){var
e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active
slick-center
slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),n.options.centerMode===!0){var
r=n.options.slidesToShow%2===0?1:0;e=Math.floor(n.options.slidesToShow/2),n.options.infinite===!0&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else
i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=n.options.infinite===!0?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass("slick-active").attr("aria-hidden","false"):t.slice(o,o+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"));"ondemand"!==n.options.lazyLoad&&"anticipated"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var
e,t,o,s=this;if(s.options.fade===!0&&(s.options.centerMode=!1),s.options.infinite===!0&&s.options.fade===!1&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=s.options.centerMode===!0?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t+s.slideCount).appendTo(s.$slideTrack).addClass("slick-cloned");s.$slideTrack.find(".slick-cloned").find("[id]").each(function(){i(this).attr("id","")})}},e.prototype.interrupt=function(i){var
e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var
t=this,o=i(e.target).is(".slick-slide")?i(e.target):i(e.target).parents(".slick-slide"),s=parseInt(o.attr("data-slick-index"));return
s||(s=0),t.slideCount<=t.options.slidesToShow?void
t.slideHandler(s,!1,!0):void
t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var
o,s,n,r,l,d=null,a=this;if(e=e||!1,!(a.animating===!0&&a.options.waitForAnimate===!0||a.options.fade===!0&&a.currentSlide===i))return
e===!1&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,a.options.infinite===!1&&a.options.centerMode===!1&&(i<0||i>a.getDotCount()*a.options.slidesToScroll)?void(a.options.fade===!1&&(o=a.currentSlide,t!==!0&&a.slideCount>a.options.slidesToShow?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o))):a.options.infinite===!1&&a.options.centerMode===!0&&(i<0||i>a.slideCount-a.options.slidesToScroll)?void(a.options.fade===!1&&(o=a.currentSlide,t!==!0&&a.slideCount>a.options.slidesToShow?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o))):(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!==0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!==0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=a.getNavTarget(),l=l.slick("getSlick"),l.slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide)),a.updateDots(),a.updateArrows(),a.options.fade===!0?(t!==!0?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void
a.animateHeight()):void(t!==!0&&a.slideCount>a.options.slidesToShow?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)))},e.prototype.startLoad=function(){var
i=this;i.options.arrows===!0&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),i.options.dots===!0&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var
i,e,t,o,s=this;return
i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),o=Math.round(180*t/Math.PI),o<0&&(o=360-Math.abs(o)),o<=45&&o>=0?s.options.rtl===!1?"left":"right":o<=360&&o>=315?s.options.rtl===!1?"left":"right":o>=135&&o<=225?s.options.rtl===!1?"right":"left":s.options.verticalSwiping===!0?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var
e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return
o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void
0===o.touchObject.curX)return!1;if(o.touchObject.edgeHit===!0&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else
o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var
e=this;if(!(e.options.swipe===!1||"ontouchend"in
document&&e.options.swipe===!1||e.options.draggable===!1&&i.type.indexOf("mouse")!==-1))switch(e.touchObject.fingerCount=i.originalEvent&&void
0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,e.options.verticalSwiping===!0&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var
e,t,o,s,n,r,l=this;return n=void
0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void
0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void
0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(l.options.verticalSwiping===!0&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void
0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(l.options.rtl===!1?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),l.options.verticalSwiping===!0&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,l.options.infinite===!1&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),l.options.vertical===!1?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,l.options.verticalSwiping===!0&&(l.swipeLeft=e+o*s),l.options.fade!==!0&&l.options.touchMove!==!1&&(l.animating===!0?(l.swipeLeft=null,!1):void
l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var
e,t=this;return
t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow?(t.touchObject={},!1):(void
0!==i.originalEvent&&void
0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void
0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void
0!==e?e.pageY:i.clientY,void(t.dragging=!0))},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var
i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var
e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide
slick-active slick-visible
slick-current").attr("aria-hidden","true").css("width","")},e.prototype.unslick=function(i){var
e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var
i,e=this;i=Math.floor(e.options.slidesToShow/2),e.options.arrows===!0&&e.slideCount>e.options.slidesToShow&&!e.options.infinite&&(e.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),e.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===e.currentSlide?(e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),e.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):e.currentSlide>=e.slideCount-e.options.slidesToShow&&e.options.centerMode===!1?(e.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),e.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):e.currentSlide>=e.slideCount-1&&e.options.centerMode===!0&&(e.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),e.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var
i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var
i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var
i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if("object"==typeof
s||"undefined"==typeof s?o[i].slick=new
e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),"undefined"!=typeof
t)return t;return
o}});libs/slick/slick.scss000064400000003334151165347350010621 0ustar00/*
Slider */

.slick-slider {
    position: relative;
    display: block;
    box-sizing: border-box;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    -ms-touch-action: pan-y;
    touch-action: pan-y;
    -webkit-tap-highlight-color: transparent;
}
.slick-list {
    position: relative;
    overflow: hidden;
    display: block;
    margin: 0;
    padding: 0;

    &:focus {
        outline: none;
    }

    &.dragging {
        cursor: pointer;
        cursor: hand;
    }
}
.slick-slider .slick-track,
.slick-slider .slick-list {
    -webkit-transform: translate3d(0, 0, 0);
    -moz-transform: translate3d(0, 0, 0);
    -ms-transform: translate3d(0, 0, 0);
    -o-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
}

.slick-track {
    position: relative;
    left: 0;
    top: 0;
    display: block;
    margin-left: auto;
    margin-right: auto;

    &:before,
    &:after {
        content: "";
        display: table;
    }

    &:after {
        clear: both;
    }

    .slick-loading & {
        visibility: hidden;
    }
}
.slick-slide {
    float: left;
    height: 100%;
    min-height: 1px;
    [dir="rtl"] & {
        float: right;
    }
    img {
        display: block;
    }
    &.slick-loading img {
        display: none;
    }

    display: none;

    &.dragging img {
        pointer-events: none;
    }

    .slick-initialized & {
        display: block;
    }

    .slick-loading & {
        visibility: hidden;
    }

    .slick-vertical & {
        display: block;
        height: auto;
        border: 1px solid transparent;
    }
}
.slick-arrow.slick-hidden {
    display: none;
}
libs/slideshow2/css/controller-controls.png000064400000002024151165347350015112
0ustar00�PNG


IHDR�${s�FtEXtSoftwareAdobe
ImageReadyq�e<�PLTE���<<<�����Ԧ��QQQ���MMM���������������������sss��������议���筭�ppp���ggg��홙����aaammm���qqq���lll������HHH���```CCC��ﱱ����ZZZ������XXX���uuuvvv���������UUU������{{{�������嬬����������\Q��@tRNS����������������������������������������������������������������{�D�IDATx�̗�V�0���$���YPq��N�	�VFi��I�z/��˯ݽsr���&�[��o>�3!�z���5�v�	)Ec�V+&�$�Y�
��S�=>��e`��*�Y/���Ԛ��p0���
�Cm|2�H3����+"�����m�Ot56���F��0��3Q{�Zɚ
�f��I�`�̍AT�VD�43�Qj�S$��0�\��"�@j�`,8�2��U�բ�a,Jڢ�U٢���<��
���irmd��_�-
���1�juϤ������\�����f�bt�i�D]��CI�j��d�f�M0Bu�C~�Z�L�E^�5��j�����>LW1T���3�͘��x���c&�|���\.��R���n��z���,C���Jk�O0�(���#}8Jfbq���E�Y�`��h�
�`00s`��Ѷ:�iH34����4����0�6U+�a&L�b��m&�b��37����F�f�0jG�I+0�,#٫���R��F��Z�ad_��V�
H�!3\�s�-
<��3�V޹&�F�o��%ۢ`�㲎���L�Y�^�%{a��̅񲏭R$�f�bt:i���CIAmG4,��:	F����k�21�y�֬��W[4-���LH���~41!�n�=��Ai�էIEND�B`�libs/slideshow2/css/controller.png000064400000004226151165347350013257
0ustar00�PNG


IHDR�0&VW\tEXtSoftwareAdobe
ImageReadyq�e<8IDATx��_LSW�/mi�@	;@�
c]���\CL�,#�,�˲�h_�>�����C��%>�B�C�0��0�����,
�PJ�R�η=��^���~�_L�����OϹ��m��
�����%�"�E���:�&$��Q+�P�Ӓ;c"�Dd����%�)#K^˔�h�����
"bYDXĢ���ymY���b'�����{��Jb�����ڪ���O+**�KJJ���򊲳�]v��i�X�|��ĉF�+�p84??��������������!q�K��	�W�4��&��2�a�]��"�'O������۷�:77���EHz���M>{���'O��~�z��4)�I�c��TRoZh)�U����D��|��Ç^UU���z����Ǐ�FGGC�'<99�@����U>.B�8�1����n������<t�PnMM�K:�2444���{[[�-q�_���Fo�b�zSB�dƻp����[�رo=O��f�}���{q���I����"$=�H�y��qwcccq�%;	�uww�������D���$�7Z'3�ع�[ZZN��쫲��Op���\�zul|||�����Cyy����ӻ���
�ybb��4;���;do=���J�u�6���>s��G����r}833�t���a��d��n8r�Hιs�*�@����_�\��1->i���Z{5�
�s��-MMM_;�������ٳg��+lrB�-999�˗/\YY�
���޽����]J�R����%%�,����0���|B����:u��`8�$!�\���|!�߹�U�X�[��������ͰNm5���Q�z����/**�F���Ąl?]]]�


y���%��|1��4�V�B[B�޹�٘�;3��lVBv8�$܄��U����j蝱m����}����l�X��ϟ:::ʙlBvx�-z����Avvv��cԼ�z'zh�;c��F�Ό�)�fb�"���p�Jg��E7�-Sa;'v��"ٌ֙���$��Z|i9S���8�Ol"���ll��0n!�\�I�	G�?WaW.[t�ϻpj
-�El�d�b>��p��a��(�G qj
k�ܛM�9��p��Y->���8ό/������Φ:�	p�@��1/�Q�l�Q�ؤ2��&�gf�b^�����&�b�VH�����MF�yQ�Jg3�Bkj؍`��L#l2B̋rT:k�K!�Jh��e#��r�����&N\Y�WI���Z���MF�yQ�Jg��B#K�4nB6B6!�E9*�
�F����߸	�E�d���tvQ
��B#��S܄<�l2B̋rT:J)4�q
�?�~#O0���7�(\��k	���:(ǁ/!�7���܄��ւQ�|�~��:(ǁ�H���#�<�I�	G���4)�����Pj��"2��		1�I8*��闭�6�Dd�=�BY���r���f$d灋pn�Q-^�2)I`��ͫ~����|TVV�����u���i&�'d�@�K�.p:����q�…VqyB�O��/��K������v��į��٬��׮]���N����hy���̪�gm]��f

P��Cd�G9d�g���2����EѺ;w�,��M\���
%�	�I��8}L��9{��)Gm������oB�g���2�X]OOOgkk�OZ��l�P[�r�����RN��	�Y�z���_$���"J�^o=
ey<�z��}H��<�L�KH�`;'v�a�>cij``������j��KS"�=��Ս�6H��^塷��|ͨ��r��{�'�E��	̐�iR�����M���pd
9�3�$NM��fKW�i��mmm�d���l�ޜ$�	��ڢ����o�Q[�8��I���I���ll�;��i�:Cj�-"��B�7Z'��&�F��_�|��@$�F�`�E6B$0�X,V>.B�D��X�/dAr�g�H���-
q@��a�+G�z�tM�7�Q�L��NY�Z��'�����%dD�C�E��t/�E�KS	�z��p\�ze&�5��	ǨJ�#���[:��k!$��kE�/���%�Qo��IEND�B`�libs/slideshow2/css/loader.png000064400000037444151165347350012352
0ustar00�PNG


IHDRh鄽tEXtSoftwareAdobe
ImageReadyq�e<>�IDATx���T��;L΁��a��s�HQ���(*P��(�"
D1�`�PD�"
9�9�0L��չ���Cwܻ�[�Z�hz�O�]�꯿j���g���]{�wv�Ӕ�?�����z����\�����n��(�f���6/����eH�_���v���t�-*��D�k��_�~6����I��
P�g)�.��ߢsy���
7W==9����a��^�}�֔�T������r����F��d;�Ӧ�t�F@�o�v%3��M�M��6��ϾL�r����n�>�{���Ց���ks��w�}7L��U9Ƅ��nۍ>-ƣ�5#��o0r��f��T�;�̯
2������q�Ƶ������ts�r����N�8�c�6��Y�k�-�uxs��)SZ���{�-ru��K�>�����כ1cFsy�a�~�T�58�
���o�y����k�>�{��vX�r���_���ٳ��:H�/�UǷ
W'Sv@�~�
O�>�<���9,�m7)�S6f�W�^1�-�����i��v��S�����͛WZ��NnJ�]ۭ����>�������y��Q�x2y^5Y
�Y�B�(^V�Y#�!�<�j7�p(y!J����Ƚ$4蝈���1cƴS��"��$oB�)7P�u�k��=���g�u>�����>��/���':�'ס]C��v��y��1b��Jn�����T��7)7@ݿSc�r���k������N%3Go�-�׮���o�zݮ]�����D�-c�S�7Ǜ�1���5��d�r��F�=,�O�)���\�㛕�n��S��К5k6C���A�Q:�}��4ek7�184@2�$���.��O5m,�%S,�Cy�&7�S�N����K�K��:4��td��1;4]v޳g�2���ex}R��g�7#W��"ۭg��D�+z�d��L�>��1�I�&�8u��O�*U���0����?�o„	�ڄ��=:v������c�駟۾}�4^K��'�Y�*�P�����~�?���|Ɣ����+W��u1��8Q�J���-���$���S��7��bŊU
��1�����/}�/_>�����\EEE�)�RH�gʝ�nݺQ�
W>��{���#x]T]_����CBB��t/�TrÆ
׬Y3T1M�M�7���������J��e$���%�.��-��7W�Z��-����o�m��o��VzQ�AP(X�L�2�J��S2:�x��GU`r܄�����]�lٽ*4�#rK9�N1�H%Cd���&���s�$h8Ʉ�3�vJ��fpdnKdff�)�d^��>�Q���,H2ޢ�Ee'f�Z숀�$��EN�����V��]�7�Æ�^z)�����cŀB�
OOO��߿���>���|��V⺩�}௿�ZTˤ�`�Ǟ;w�N��e���9��u��Q���W	@��lٲ5�Չ��������:3E�{�嗋ԩS�"��ƨ4��hL�Cgv/^��X�b�;vL@۾}��~<�O>�d}s�ǎ������X#��5���JlР��8�k����SO=��<��y�)�$��ꖝ�]�F
�"7/�c����a&m����Ɓ�`�!�<�H
с�ݺu��5jt�;:#�{S~r�ǎs�	uf�#H�t�ڵ��d��ݻw���$�}�Z�jO�<��u@�X��3gw���HG��ѣB@@@��~衇�+�Ik׮}�|���O�8a�KI���u�صkW6A����a��{��s4�L�RE��D�S�t�vj�y�W@��M�ٳ�F����F��6iҤ2c��p2�
D�-Z�,���޽{��2����2^;A0��訂Nz�c��/�+WNT�*�T�S�R��<z�KO������o&�*��?��@ڟ�ra�q*
���K�,�������]����jZ��/v.����WC?���U��Ǐ�{����v`��;3�����_&is�$�����pV�Z�,����k��ׯ��ҥK�q]���e�$�T(�v����p�_��>�!��={֠�0-Q�_�.]"q�bW�\q�|i��:��0���Q.\�;777�Md}Y��Y�f��ԪUK�d�>E��ͻ�x�T�p�����8�|�Ͷ,�t˹s��(V�X	SG��v���Yjö���|�����O?��D�����\�^F��r����Dm$NU#���T�ОN"v/r���}֬Y;��T�a}��Ӓ%���"���À%8���_��º���zu�@���y�k]3��̙�r���T�Y��Bd�r��ŋ����g����۪�f|�0fC�{�w͈��,
	hE�+W.є��B����H�ĩ��=7"׃��R�ɓ'��p�BĦ"��F|�z��	���H@���{p?�q�L��4�$^�Z�|���
��D�Kf��TY%
�2�@F��k�x!7�qH��g	�����*z�Ŷ0a�aJ�=,,L+d�ȑ��؂k����,%��S7�mK�.��
MA_|�Ee�$#,	��]j���Ɋ�uM�+����\�5
z�+�����d�v�7I�w��AV(A0p���{
|αs�γZ��a=�m�B�T:�"����I>��
�Z�V4NP
0k�(��Py����a��[:l��̴R��?
pE���4=��sM	Q�p$aWvX���U�
S�Ũ�Ξ=�
rO�:v�xO۶m��@B�!�QXV�6m�3�I�4i�f�N��^��]�
UO#���O�Y�Z�j[�^��0�H�~8v��^�F�Jy��H�>����+JK��^j������/`X�p2�2��`�2^IV��w��u��fR�?s��I�����rc��7���3F�E��#>����
a��,2E0�
�y��e7n�\�b�'�����f������i6,-F|�����	{6��`ޫD�n.:�O���z���X��_^FM�:޻�-Z��4shC���
`t2陵߶_76x�g5�T�+�%

����-v�x��S)�<���wŞ�7�,!�aÆ͹7'Y�E�|^]'D+{��K~��M�;��ɣG�.+r���hQ,�۔�8ď��4
VOO%Kƭ/��e�ƠaÆ%`�n��.O�"�܆���a���93�=~>�*P�G��}�Q��ݻ��L��%O�S��V��ט�c�`�I�8j�޴y��|�D�P���0�A\������߸�Zy}>���:�Jʖ#�~"7��9��6m�Q�k׮]ܔ)SJ>���mt�G}��W^���eT��
�0�2dHg��!����>m#iC.s܎���T�1Z�n��K/Ex�g�Ʌ��;`��fj�񊽯��H���D������[�n�ԩS0��_�?�U����_�pc�p��15W�n�h'`�Έv<`��>}���=p�N��z���6W�Z�A�U�!ƍ�sɒ%�(��6�
R�;1��R�S
�\�x���-�#u'E<��CG���<"%�%�$r��Fh1o�3f<�Q�D�r����o��f�-ZWmC��#P>�C�
@S�'�so:@��+�'5mڴ>�@v7B��W�dDu����a���o=�r�AX�BBB2�ۃ�@��رc��C�N`�+�ܢ憀�S�ی�1�Ȩ2q��j��	lPc��%�6�d8�cdG��S�z�3'���-�T�9sf�e˖=�o$�R�딂@R�ub�����I𩚜�l�N�S��y��G����V�g�*���w���T�R%����1��>�l��~�29�p#�k�xO0ݧx�ʘ1c�J
�d
6���~$rK`�Rj�B}�5�1�wf��n@0��F��<����d5Qq���_���`���T�.�
�@�̟?�Alrij�>�I�O�w��
l�Ff�.�î�B�Sг�8x�\�ׯ_q|�"�u�\���F�V��c0Y�%�oC�N�~`�fb�Ə?X�gϨ�^����/Q�H��_|q�w4��O�u��i��"芔�U��1{�왉�7'帼w��}���N�>�0;E��3��\[��BZ���#��b�z��y�v����0����XI��€����,re2cv��5
e6�.
H�X����t�Τ^"�|��ߵ�{G�.]�����C��LT�
+���T���`���Sq���X-r�6o�<��E.��}��	b�p���W�EZ��9t��;{�Gbbb��H�_�g�阐�PT���jO|||[�R��h��6DnĚ5k^��/`t���F�;�e˖��w
2�\��=�j2�������N�0��<�N�y�ԝ����vƒ\a!s7���f¬N`v�����dq��K���@�r��
����1�o(�t�ڵ�I±C�kɠ䳧=�5!N~'v{��͘�2���Q��N�(v�W�����̗��л�=l5jԘ���Ŏ�"V�;�@���|
ۃ�@C#t������7nLO��6���m|ꩧ�i]�K��u��M�̄IHU�>��CCC��˹�!&!��52�Y�fU,Y�d)p�t��(A�(v]��!	�[ݥ3�^�@�R%v�}�A�wbK�R�Į��U��h>{у\c]ە���R2`ğ�s݋�gY���}Ǵi��jx��>ʴl��K�;;K�֭[�HXX�?�c'�����_2�]�d�	Ba�
�̈́�]�dHH(6�˜���6��n�\F�u�]��ѷo�z�Ta�2���U�R�܈�<�����TƷ�,p:�~������-,ߟ,�:�P=�^�z�`|�:v�FJE�,�ۗJ�х�׭��(���"T#jF�ÀV+翠ڎ�!"Uh�^�����t�D()��R@�tm�y�!��X`u3Lj�#�=����95Q��
�U��w�}	򐂼��9����N�5����P�����g0��m۶m��!w7zJ�vek��Ƣ
��f���
/'��:n�5[���V���'`�%����;�Ν;gڪ��\�2P,NS@}G,o^:C*�U��]�f�\��K�Z"W�n2������˗Rr��Ծ0Al�j�2�s8�Q�d+�X¨b�^�|
���]0���-ZH����R�i�#�3��x��Y$����	���ƛ�A��,�`߁y����aV.����T'�T�.���cD�Q��dC�n)��\W�|C�IL=yJ��|s@�*��O�}�@����T�M��O>�dM��1tUL�(����ሲ����>���\	�a���dnD�*���Z��f'�O<Q��V=�Ǐ߁ƨ�˵ؖ�t���°C�
�\�JH�E�X�,��}2�%���, TnL
 �?�Ç
��$@��MI��'��d���E2	��гQ~��ڐО�l9�^�<�l֬Y[󞸆�!o�->�cl
�W��Q����x�6�E��\�����E��`����%0�\e
�y��y>kN���h���j(]�y�K�'�z���E��;vl��7�	H�R�
7~Y9�ٓj�ʄ
���C\$�h$�د/((�g+T��"�S&BR[a8��y�bI�ܫJ�2�����.�7]p�c���a^��}�Gϣ�MfyA�%I��*'<�d�r/���R1ƫ�>�����j~�|�H�9�k��\��r_B}~�����q�
�fou�z-�B���ė���۷o7��`}������}�Z�9e�Ya+Q�֭K��)�^�$W2@撀�o��Fl�E��o�:JnY���Z�/r�H��S��Y�=e(]�����,*\�Ž������|�7�����	�2�,r��Ggs��
g�y�sj޼y;0c�CJ��?���ﹺ\;�2I��o�+3����I͞���g������}B㤤(�QY�}OT�s��+�!�;B;�-
Ar�"?�|^�o��Soʽ)9"Y#�
�D?����n]��S�g�}��t�H����?r8gY���@�%�l�>(��"��8��+�ί]�yb������7烶kw��Oy?�IS��R���"8���]����udV�.R���D�7`9�`>Q*�ő���1#b,�u�ر�b����Zˋ���`ʕ������J�r�<@Ն��Zv��^�z�_�uC&���Ƥ�tZw4���x��HZ��L�8q�0�7�xc�'���$�:�*�C��h��g�1���^�gsR���������G��*�FFF����~#��YZ[4sz��e.LR2�\�n޼���e�R�ew���˗/ߑ4�(�w��ų)�r��0�b&[	�t]�s�…��N{��[v���5�ž�a�;�6��O֎��xM���G�m��[�nB
zi�ԩ�����sN�	�[Mp����@�:�\ж���{	QHEI}�,X��#F4�|ȗ��G}�~���MK���(V���I_��~�[��/��[�D�_ü%�8p`��k��K�zK��&�x��7��02�80�ΐ!C�:���V�Cܘ��ulR6��Vs[D[���u�*��p�ë*�U�y.�푰{��>��.���?~���$5�P�+Jg�jD���v�E����'��6{��v6}�=�T`��
<���N�O�n�Ć(�-D�.U�j�D���iӦ-U;�.Zw��Y�Ղ1�"�ru�z
rAc(YZt2PnLjI�
4(Aj���8V+斪�-��y�W;t��w���
SI���-������bŊ�f�I��J�,�āeA�X>r��X:��."]�ڹ�kϰ0��FD�j�
�Ȓ`��C����{ܛ\-�2W�Ő�|7���×5Ff��w�t��%�,�0�A�a�����ּ�5���x�����
x�"�]�X�i�H3�ڪ�[1�H@���C
�~��6i6�c�i�����/w%K}5��G*�'��b�4��W����!�NY,3f�V��\�:{﫯�ڍ�$%�������	%��Ŧ�Z��p�*�…v2�L�|\+�<�uh�6�Æ
kOYT4e
��4��b�5=�~O?�t�h��ɒ��3u��b<�����K�����Y�
sعx��JǗ-%��.��>T��`�F����Zw�7�f
����	���
�����ߎ)�eF��'^��	fU?
����֭��DD?����f
�®�S�aaaҵs�<L�vY1�%��Q���8@�N����C���	ȃ����M{��ĬY�������O��]�����(�u�7�|�Ԉ�=BU6�(�<�ݙ�Pƕ���:�t�1P�F�DRZn�4F�V�_p�/�P�cǎ��e�B�lR�4Ǐ��
P�~��e͞=�]N)srr2�S6Nu��_��=]М(x�С��>LJ���tvI��w���*��O�C�V
}�e��4����N�e�O�F��AD�
����P�,�I9H���ex���4��8�!7G:jK.�Jݸq��w�y'SH|6�m۶mH{�r�HiR)�q��*����fpI\�t�k�Z��W7���!�:��%͝���N��F|�L�2��%��R�I��L�n�(M�PlӦMә�ƒ���#7��[�bŴ�]�~���D'
S�`߄�
Є0'Ni���W
hr��.7�,cz�J��I�O>/�F�KZ=�s�E,�KVX�`�c�_	�
%�m�Vt�gY�|?��-�^z�����G={����g[���esO9��>�N
83���V���l�@��~������."$�ke��a�3���\<3,	
�`��ț111���\>|WG�lJLL��Z�d�%��|	)X����F>|x2�w��q��ٸ��qqqP�#7ۇ���U=�ud����9�{8�Y��P�3p����
dii�ܓd�ltttGuT@�
�p��6"���NE���Ef6�t�w�z��-�%3�Mc�M�Ɓ#������i��f���J�?Rz��(��a%J�.]KV�����kO���^�xܫ0�q
3�h,̴�w�eݭ��'��
YA
Q=����{C���(��|���u�iӦ���&�Q����O)�aW%|��&ܬ�e�-[��mgr����M4�R��ug�$$$�6�H���D�Ej�n�,����-\�Ԃ����aì�P���2��-�1�
��ۤ uSO��^Sa�"Wɓ��\��lMn�i����
J���E�>�8+�.=�yE^b�Y���%�sƾ�Zm���,\�=��ᒍQ*@]w
t�+>
O��I��O�a��}��+�py�bo�\y����/�^�Fu�h�7�܀\!)v�=S׹���t*�ܲ��O_W�v�o�l�L5w�7��驯�|0��<�T�\�8Ѹ��@
�>���nº��H{��ɓ��lR��d�g�R���Iξ�����xs�^���uIS�I��?��_�7
ױf͚���
�8�e˖3�
̭֔��J��;ST�v����	Pc\Ǵr�
�]�r�y�n��1}ٲe�`9i�k_�s����oW�:u
è�"��5�}���E����80K)	��������_q���K��1,=='ˎ*X�8q�V��	T�b�_���MZ��=���OW�~R̴RL�$��ԮϢ�81@0�r����'��/~��KV�����������W��tmq�E�*�"��
l+����Yfޠ��6;͙3giŊ������?mڴ�T�q֒Q���^V���l�2�#>$��n](��y�>}��C�`��C�T��E�6|7��,�:H���"�vc�6�1c�/����	�<�y߁N��5��;u�$��EEE���������!��y5`�+dM��|��>�eY�5����,.�,�"Y`M�s�i;>�}�f^�pɒ%{g
���СC����˃*�I��՘1c6��!+mF�_E6����l
?�4p
|:�gϞ��	bZ�/_~dÆ
���	��EBَz��?��#?Y5c[	�;�"�իW��g�A���^^����
rZ�]̳��Ƚo�…�*}��a�0�r�:w�\���?��*mq����cqRd�~3X`ן~�ii���C�,p�]��Vx�ܹ-�����|,zi��eԘ:�vR��b�9\b0�xs'�eQÓ�BԘ�^�$���{��-�x8N�lǒM��[U-
UTs�-�8|-� ���''L��\��u�J��L�e�
��3bĈx-+-�MV�2�	��DI�	N��s�aÆU�m��B�W��Ǐ�<y�^�Vc5o�	���Wl�6m�gϞ]�l���/r��wrrr�f�믿>]6��|$փ\O�Ce�>(ׯ_�B�k�{X6�!+�d����ޒ�W;��},:�5�%9x)�)0�	��|�	���S�N�i�|�<�,��"���X��G�>}��ĉ�)��!�X���رc	���o��m��/x%r;���>
QX��'�LR��'M]E��1��ͧ�z��jR(f�EBOE|׀�b@�=�гK�.ݤ���\yJ#�t����"���X�E���E/C.Q��=��әy�ĉ}��AgϞ=��Q�4`u���i��
��f��(��"��™LD��I��mݺuXt0�u�V�Z/��������7�V�H�֯_�m���,m�n���CgC4
uGݺu��c���Gyd�#GNk���ˡ6�&�I�M��4|��c���&�fK��`4�Z�0P2��f�������~��$9KJ9gΜɀM��ڶr=|ס�Vؔ)S���I��t�m۶_�`�w͠Pt��Փv9�̶{��0Z�ث��4��n�6���j%J��~f�QF�Yn���m�fFQ�t
��H*fJ�2e^P=�g�5
r����>�x�7�җ'{ʫ�3�7��;��"-s������u_��qޙ'�����ʮ6��,��ƺ,����a�b��{��@�h�
pA[0�mکQ
��J�F���ߤ�&�S}?͒��İ0Y��d�b.2�]��[��VɵA�Y+��Ԃ��R�V����u�T/r�q�wxUQ���LFgG���\x�@8�`Уo߾�Ɇ��O�r߻�=:^����7�܏��n���7�:�/"�}�z}J.��4t���s�����#UW--&3
R�P?���,�����%��M��1�#I��x*��#�T�g�=zaPaRg�ECҧ�j�6R��2�
�뮻�pvY��֨QC}���Ϧ�4��a(�r��ᄏ�d���T	H%�L�u�uc;@!�nd:H��Z8FeO�X�+�@"nK��/�ڗ�,�G�v���Ev`DDD8�͕M%K�L���}�f�lI��#d�4ZÞ�Js�ڸ���%j��o��P{#mMLL�It�Q�B9V2R�o
��l��J�6-W��,>����&6cͮ�����C����@ne��=���.eٺ�\���B�f+o��{`�N�C@X{Q�m����,r�&W�c�g͚UZ���R[���w������CK�yL�w�I=V�b�5RRR&*f�g���l�HC�,`	8�z�2J�Q���)�
Q�En"�DN1�Ҥ`/A�*
=�U��ɦ��ۋl߾}B�ƍ[���x+*��u�&�(>_]i����{�ue2�WP�l�����n�|Ŭ[��_0���:���3�4�d�!����{챚R����K�*Ui���/��\Ox%�#R~��
����d��Tَ)�<S$D���㕲W���h��7V���n`=n4��Фw�ޏK�Z��aEx�t6���{��`1�Z�S'u*p�=��г�>��g�}��8�M_���)�v���Ȅ�
t�ҜlɅ�����m߾���q0���A5�T�"�k	�^�v��5�q~R�j5������iڴ�ݲ0�d�Z�r��ի�N4����?�8p`e�-N=���S���eoܳg�N��,H�݊3g�,�$�gD�i4a|MБ�R��!�V�Z�`L}^~���ʠ��D��
���H�k���+�����!B�Q?����/�����dG�,�:,
�Ք3d��f���FA0�2��2s}���������f\>�M'���=J�g��%K~C�b�e�~Z��#mמ��O���F��裏ޗ���Y���������o�Z�h�DYL�Nagž׾��%��J��k~�'::��nҕ+W���7�>�����}a��kg�x:,�>o޼b�G61�����G��v��G/����(?J��M�I�����ܧ��!;}y�Mm���Ϗ�ß䵜��8�Ǐo��}�?'#m��@1���}}�����ǣF�����}iii�	PťOXق��B[І
^$�՗�����|X�?�p�琍�Wr�@�Kn�f͚	o��֨-Z|��sϽ#�i�T�n��P*�r��
#��.\�]�N�!������}��ѹ��������C���2gI+V��l��Ev��_
���8�G��+��c��2g����j^�(ى�>�h}2�1������z�žw��
=	`�V�׭�3آR��q7q�
�⇓����":w��
�"RV��L���8��#��t���_�=P�ߟhE�b��f�zZ��(ۤ��o��cǎ�.�a��aKu��
�I�ҥ�������c�%�%Y(}�k��&��6^Gt	8�-�UUwBB��7?���6@J)�;v�`9q�I@���	��vd&����lCR���5T�+V,0��67�`߲e�"�
PH�lt�s?��ܿa�
4(.+�L�.^'��"�y䑓�G������#�f�}�ĵ`P'���a�I���E��7ܽ{w�d�4X�q�\c������R���n��S������x/]�tz׮]��+��j��x'Nc{�'j2�mؙ��II{g
$AN��8.�x��
�a����-��$�%�p��*9�����&g����J�V��_�L�0�e�N��0#))I��6���b�cr�c9�"�8
��+ِ�.�L�]n�>�*���'�|�8c�L��U�#��#h�%
����aZ��G��7��X>_��#–ϯ~�rD�)�0�L�!7mЕ0Y9�@k��Ek�/_.��T�R��d
�}d�S�M��L�_.���˖-�6��J��D@fה�='�)컼4�q?c�ߗ�
�UZK�ߵ���V�TW�'��<	
=��]�g��Z�r���?���q�Tv�N��U���9y����z;�\�o5��V���
�0��X�l�@0'�LX�w�	��J�T:v�s���k�L9*h,����"������O�i;8YY�|����A���{
��*�7�'/[R�%�;�L*E�ܓ�%PY��@�II@N<k޼�t�����2闉H���c*�ڠo�a�f��q`����}��r���I�	�y��{��U���<�'ծm��T?�F[4aR�,��Q�E���I[e�?àR�3)I`��q�_�߼N�����H�,����ϗm���дc<M����>DŽ��n�G�?���q���[�	�'���N�i8�\
K�C�H�0����>�KKo-��H���E�׽��Z[M�>���ư��س�����)��m䇘��XRt9S�	М�j��J�WL�{8�G/�����Yrd�l,ڋc���Zi�:uj.��;,r�Ɏ��T=3]�[s~���ٖ��JJ�vdq0�
&�˯����f͚���/�6Ȝ�Vu�m���Sc���4��\|t.�$�m����	&<'߁a�Ç��(@#�^�����f{e���Z߃�-nٕmݹs��#0@�<��W�u[�L��`8JJ��3��,r]j��l(�
7P�+����]�v]寋��Ud�ä����l2�Q�=[��=P�$dh�(Y^��pj��agx�X�F�Ռo�<�����}����NL��B����亴�u.k�ån蒶3��O��/}�(�<H?��J#�#�Å�p��˸�l�}Hԭ`��j�*�OM�U�q6�׿D�e�\�������frd�P�(���V��;...�������8̠qY�G�
��O\	8=zt3�S�R�^OyJ
sΜ9GdC��,���L��5Q���4�\�l�Ic,,rI�w"��%L��Lf.+�<��a9'***�v��?f{X�$7S�
$�_�
:<v�؞�3gA��@v���;r��;wR�tB�!@���&�R���v:��r�J4mCn��ab_�RWے��Ȣ�U�������|^��t���s3@�.5J����aCW$#4{�aO.2�%���F�����S�m��9�v��α�a�H�lQ�c��/�W?��õ8��>p�
��/+��nI�]�,�al�SUVr3GN��r�-:�s,�͛7Ϡ����
�d��w6/Yv��=�5C��y��̉]Ζ��`χa�Ȧ��J�)�AɾO0�T��ꫯ�Q�OW�l�-�
7L��ݍ?ʡZ|�x�n�>�ڙ�s�d��{�d�2^��T�3π�nC����x����ʦ�S�NɁK�q��G)�`׆.��r
�*�쭎��aL���z�_odϵ8RiUP��w�=Ƥ^��X����7-V����š��'�]X���d���c���'-�߻wo�m³���Ȑ�-&]��J*���
p��x�q�†�f�r���V�܃1�2��W��-O�G"��[	p��!=z������D�����^K��&��lM�0��g���o�v��G!�FOe�;�>�8L1��+U���������b�F��{ȝ�fazmβH����C!�H��*)b�l���4
V��s��%;�p���dx�бyY6>3q��(�O65���+��3q&����%q��5�V�m�A#sO�d�ϋ�9��(��@-�M�K��ի��'��)�891OXf�V�*kD'K4�tm]�|�W�d=�$@�?������g�tO�}�v����Ν;7Vؐm�����:�9rd%�!�,�h�B�H=LVtBm�v�s9���}ުU�~H�i��жl-�y��c!Eٲ�nD�
��R�ʳrT1�d�,T���C��(�MrH:�a�燄s�X>�k����	����Y�j��D�Λ��$XH`7n�oȝ/gRA(+i��58iΡ�Z+ԛ��٧O�����/�5��\��ܳg�V�.��������/�u`��Fn�5�l���~P�ɼ"{��e+&���/�J�C�U�`���%�����۷�D�����a�0��-[����r�.]�2���k�'q{�)�a��x֪UKƻ���"���q�lE��1�W	X����B�
�7�;̓.�1�N�t���E`@Wdc���=��2���rd��^��x��)SF~Eco���W�-X�2�"ʜ)S�\2��`x�_�j�.�-���5���\C�yF?�vѢE�-7K=aԗ+K)^�x_@��錹�7"צ�F���r�
�2���Kѧ�����+TV
�|O�5��j�Y����zH�"	�B`̣hO��]��9Pm�9ܬY��ׯ_��o�R7�G�3�v����իW����eQ�5��o۶m�b���瞉���,�W�5�,����w+�/%��I!�R���)�>��������x��>��C����/��~�2q��4-�"�^3ːu��7]k����n*������/��O�РA�B�5A���v�ey�����=L�l�3�)4~�eٲe��6j�h�ퟟ27kn.-�(W?�Ʃ�C�o��&'��`����fk��S͹r�Zc{�6������6m����f�ӭ��M�uh���Y���VY��Wخ=
ˡ��i���ӹ�ڽ)`9�����lJ���*�X}Ԇ�����S�N�-=�aJǗ���ȵYj�y��;��6y�ҝ��m��a?t���ʵ�h�_�NӮ]�X�v@���Qsl���l��z�r͖M��&�����樣�o�\��ό�����]��n����j֬)?B
��4,3�ӴZwA�שm�	Ҳ�����&M�t�<�9s���7�V7O�j��ٴ_>8G��ش�C��.(T�P*v�R��bl��
�Y�����t4Xݗ��A_�tāUӽ�"W��
6��>~U��cY�Y��J����;v����I�RJ(�\�Eo�x�H�wk�u���V�j�0�#�u���gH�å�k�	0�=z���sFr�EH�%��P�v�xs����?��			q�=�k5�g��TW������Ja�dd��X�红�t��r��+�qn�̙o�nݺ��vU��4�}�o7.y�k#�����ܮ�9G�;��x��:A�E�e�|���|B�����c��'��{��μ�Z��c1�@d��Z�Tr|-Pݢ\��iK��v�5?��\�P��b@��
�Fdۭ����6�����u?���`�Iey����k��~ZQ�@�M�kvz��
.˼�nR��9sX2�,v�oqn����,7?��v�;����k+{����9�a"oF��4��r�[�v-o'&�N����V�����-8�n�=z���ws��r���W����A����6���7+��0�Āꇭ%IEND�B`�libs/slideshow2/css/slideshow.css000064400000012210151165347350013071
0ustar00/**
Stylesheet: Slideshow.css
	CSS for Slideshow.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).
	
HTML:
	<div class="slideshow">
		<div class="slideshow-images" />
		<div class="slideshow-captions" />
		<div class="slideshow-controller" />
		<div class="slideshow-loader" />
		<div class="slideshow-thumbnails" />
	</div>
	
Notes:
	These next five rules are required for Slideshow to work correctly.
	Override at your own risk.
*/

.slideshow {
	display: block; position: relative; z-index: 0;
}
.slideshow-images {
	display: block; overflow: hidden; position: relative;
}		
.slideshow-images img {
	display: block; position: absolute; z-index: 1;
}		
.slideshow-thumbnails {
	overflow: hidden;
}
.slideshow-thumbnails ul {
	left: 0; position: absolute; top: 0; width: 100000px;
}

/**
HTML:
	<div class="slideshow-images">
		<img />
		<img />
	</div>
	
Notes:
	The images div is where the slides are shown.
	Customize the visible / prev / next classes to effect the slideshow
transitions: fading, wiping, etc.
*/

.slideshow-images {
	height: 300px; width: 400px;
}		
.slideshow-images-visible { 
	opacity: 1;
}	
.slideshow-images-prev { 
	opacity: 0;
}
.slideshow-images-next { 
	opacity: 0;
}
.slideshow-images img {
	float: left; left: 0; top: 0;
}	

/**
Notes:
	These are examples of user-defined styles.
	Customize these classes to your usage of Slideshow.
*/

.slideshow {
	height: auto; margin: 0 auto; width: 400px;
}
.slideshow a img {
	border: 0;
}

/**
HTML:
	<div class="slideshow-captions">
		...
	</div>
	
Notes:
	Customize the hidden / visible classes to affect the captions animation.
*/

.slideshow-captions {
	background: #000; bottom: 0; color: #FFF; font: normal 12px/22px Arial,
sans-serif; left: 0; overflow: hidden; position: absolute; text-indent:
10px; width: 100%; z-index: 10000;
}
.slideshow-captions-hidden {
	height: 0; opacity: 0;
}
.slideshow-captions-visible {
	height: 22px; opacity: .7;
}

/**
HTML:
	<div class="slideshow-controller">
		<ul>
			<li class="first"><a /></li>
			<li class="prev"><a /></li>
			<li class="play"><a /></li>
			<li class="next"><a /></li>
			<li class="last"><a /></li>
		</ul>
	</div>
	
Notes:
	Customize the hidden / visible classes to affect the controller animation.
*/

.slideshow-controller {
	background: url(controller.png) no-repeat; height: 48px; left: 50%;
margin: -24px 0 0 -122px; overflow: hidden; position: absolute; top: 50%;
width: 244px; z-index: 10000;
}
.slideshow-controller * {
	margin: 0; outline: none; padding: 0;
}
.slideshow-controller-hidden { 
	opacity: 0;
}
.slideshow-controller-visible {
	opacity: 1;
}
.slideshow-controller a {
	background: url(controller-controls.png) no-repeat -47px 0; cursor:
pointer; display: block; height: 18px; left: 112px; overflow: hidden;
position: absolute; top: 15px; width: 20px;
}
.slideshow-controller a.active {
	background-position: -47px -18px;
}
.slideshow-controller li {
	list-style: none;
}			 
.slideshow-controller li.first a {
	background-position: 0 0; left: 36px; width: 19px;
}
.slideshow-controller li.first a.active {
	background-position: 0 -18px;
}
.slideshow-controller li.prev a {
	background-position: -19px 0; left: 68px; width: 28px;
}
.slideshow-controller li.prev a.active {
	background-position: -19px -18px;
}
.slideshow-controller li.play a {
	background-position: -67px 0;
}
.slideshow-controller li.play a.active {
	background-position: -67px -18px;
}
.slideshow-controller li.next a {
	background-position: -87px 0; left: 148px; width: 28px;
}
.slideshow-controller li.next a.active {
	background-position: -87px -18px;
}
.slideshow-controller li.last a {
	background-position: -115px 0; left: 189px; width: 19px;
}
.slideshow-controller li.last a.active {
	background-position: -115px -18px;
}

/**
HTML:
	<div class="slideshow-loader" />
	
Notes:
	Customize the hidden / visible classes to affect the loader animation.
*/

.slideshow-loader {
	background: url(loader.png); height: 30px; right: 2px; position: absolute;
top: 2px; width: 30px; z-index: 10001;
}
.slideshow-loader-hidden {
	opacity: 0;
}
.slideshow-loader-visible {
	opacity: 1;
}

/**
HTML:
	<div class="slideshow-thumbnails">
		<ul>
			<li><a class="slideshow-thumbnails-active"
/></li>
			<li><a class="slideshow-thumbnails-inactive"
/></li>
			...
			<li><a class="slideshow-thumbnails-inactive"
/></li>
		</ul>
	</div>
	
Notes:
	Customize the active / inactive classes to affect the thumbnails
animation.
	Use the !important keyword to override FX without affecting performance.
*/

.slideshow-thumbnails {
	bottom: -55px; height: 55px; left: 0; position: absolute; width: 100%;
}
.slideshow-thumbnails * {
	margin: 0; padding: 0;
}
.slideshow-thumbnails li {
	float: left; list-style: none;
}
.slideshow-thumbnails a {
	display: block; float: left; outline: none; margin: 5px 5px 0 0; padding:
5px;
}
.slideshow-thumbnails a:hover {
	background-color: #FF9 !important; opacity: 1 !important;
}
.slideshow-thumbnails img {
	display: block;
}
.slideshow-thumbnails-hidden {
	background-color: #FFF; opacity: 0;
}
.slideshow-thumbnails-inactive {
	background-color: #FFF; opacity: .5;
}
.slideshow-thumbnails-active {
	background-color: #9FF; opacity: 1;
}libs/slideshow2/js/slideshow.flash.js000064400000003002151165347350013634
0ustar00/**
Script: Slideshow.Flash.js
	Slideshow.Flash - Flash extension for Slideshow.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).

Dependencies:
	Slideshow.
*/

(function(){
	Slideshow.Flash = new Class({
		Extends: Slideshow,
	
		options: {
			color: ['#FFF']
		},
	
	/**
	Constructor: initialize
		Creates an instance of the Slideshow class.

	Arguments:
		element - (element) The wrapper element.
		data - (array or object) The images and optional thumbnails, captions and
links for the show.
		options - (object) The options below.

	Syntax:
		var myShow = new Slideshow.Flash(element, data, options);
*/

		initialize: function(el, data, options){
			options = options || {};
			options.overlap = true;
			if (options.color)
				options.color = Array.mfrom(options.color);
			this.parent(el, data, options);
		},

	/**
	Private method: show
		Does the slideshow effect.
*/

		_show: function(fast){
			if (!this.image.retrieve('tween'))
			  $$(this.a, this.b).set('tween', {'duration':
this.options.duration, 'link': 'cancel',
'onStart': this._start.bind(this), 'onComplete':
this._complete.bind(this), 'property': 'opacity'});
			if (fast)
				this.image.get('tween').cancel().set(1);
			else {
				this.el.retrieve('images').setStyle('background',
this.options.color[this.slide % this.options.color.length]);
				var img = (this.counter % 2) ? this.a : this.b;
				img.get('tween').cancel().set(0);
				this.image.get('tween').set(0).start(1);
			}
		}
	});
})();libs/slideshow2/js/slideshow.fold.js000064400000004667151165347350013505
0ustar00/**
Script: Slideshow.Fold.js
	Slideshow.Fold - Flash extension for Slideshow.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).

Dependencies:
	Slideshow.
*/

Slideshow.Fold = new Class({
	Extends: Slideshow,
	
/**
Private method: show
	Does the slideshow effect.
*/

	_show: function(fast){
		if (!this.image.retrieve('tween')){
			var options = (this.options.overlap) ? {'duration':
this.options.duration} : {'duration': this.options.duration / 2};
			$$(this.a, this.b).set('tween', Object.merge(options,
{'link': 'chain', 'onStart':
this._start.bind(this), 'onComplete': this._complete.bind(this),
'property': 'clip', 'transition':
this.options.transition}));
		}
		var img = (this.counter % 2) ? this.a : this.b,
			rect = this._rect(this.image),
			half = Math.ceil(rect.top + (rect.bottom - rect.top) / 2);
			
		if (fast){			
			img.get('tween').cancel().set('rect(0, 0, 0, 0)');
			this.image.get('tween').cancel().set('rect(auto, auto,
auto, auto)'); 			
		} 
		else {
			if (this.options.overlap){	
				img.get('tween').set('rect(auto, auto, auto,
auto)');
				this.image.get('tween')
					.set(rect.top + ' ' + rect.left + ' ' + half +
' ' + rect.left)
					.start(rect.top + ' ' + rect.right + ' ' + half +
' ' + rect.left)
					.start(rect.top + ' ' + rect.right + ' ' +
rect.bottom + ' ' + rect.left);
			} 
			else	{
				var fn = function(rect){
					this.image.get('tween')
						.set(rect.top + ' ' + rect.left + ' ' + half +
' ' + rect.left)
						.start(rect.top + ' ' + rect.right + ' ' + half +
' ' + rect.left)
						.start(rect.top + ' ' + rect.right + ' ' +
rect.bottom + ' ' + rect.left);
				}.pass(rect, this);
				if (this.firstrun)
					return fn();
				rect = this._rect(img);
				img.get('tween')
					.set(rect.top + ' ' + rect.right + ' ' +
rect.bottom + ' ' + rect.left)
					.start(rect.top + ' ' + rect.right + ' ' + half +
' ' + rect.left)
					.start(rect.top + ' ' + rect.left + ' ' + half +
' ' + rect.left).chain(fn);
			}
		}
	},
	
	/**
	Private method: rect
		Calculates the clipping rect
	*/

	_rect: function(img){
		var rect = img.getCoordinates(this.el.retrieve('images'));
		rect.left = (rect.left < 0) ? Math.abs(rect.left) : 0;
		rect.top = (rect.top < 0) ? Math.abs(rect.top) : 0;
		rect.right = (rect.right > this.width) ? rect.left + this.width :
rect.width;
		rect.bottom = (rect.bottom > this.height) ? rect.top + this.height :
rect.height;
		return rect;		
	}
});libs/slideshow2/js/slideshow.js000064400000077535151165347350012566
0ustar00/**
Script: Slideshow.js
	Slideshow - A javascript class for Mootools to stream and animate the
presentation of images on your website.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2011 [Aeron Glemann](http://www.electricprism.com/aeron/).

Dependencies:
	Mootools 1.3.1 Core: Fx.Morph, Fx.Tween, Selectors, Element.Dimensions.
	Mootools 1.3.1.1 More: Assets.
*/
(function(){
	WhenPaused = 1 << 0;
	WhenPlaying = 1 << 1;
	OnStart = 1 << 2;
	
	Slideshow = new Class({
		Implements: [Chain, Events, Options],

		options: {/*
			onComplete: $empty,
			onEnd: $empty,
			onStart: $empty,*/
		    accesskeys: {'first': {'key': 'shift
left', 'label': 'Shift + Leftwards Arrow'},
'prev': {'key': 'left', 'label':
'Leftwards Arrow'}, 'pause': {'key':
'p', 'label': 'P'}, 'next':
{'key': 'right', 'label': 'Rightwards
Arrow'}, 'last': {'key': 'shift right',
'label': 'Shift + Rightwards Arrow'}},
			captions: true,
			center: true,
			classes: [/*'slideshow', 'first', 'prev',
'play', 'pause', 'next', 'last',
'images', 'captions', 'controller',
'thumbnails', 'hidden', 'visible',
'inactive', 'active', 'loader'*/],
			controller: true,
			data: null,
			delay: 2000,
			duration: 1000,
			fast: false,
			height: false,
			href: '',
			hu: '',
			linked: false,
			loader: true,
			loop: true,
			match: /\?slide=(\d+)$/,
			overlap: true,
			paused: false,
			random: false,
			replace: [/(\.[^\.]+)$/, 't$1'],
			resize: 'fill',
			slide: 0,
			thumbnails: true,
			titles: false,
			transition: 'sine:in:out',
			width: false
		},

	/**
	Constructor: initialize
		Creates an instance of the Slideshow class.

	Arguments:
		element - (element) The wrapper element.
		data - (array or object) The images and optional thumbnails, captions and
links for the show.
		options - (object) The options below.

	Syntax:
		var myShow = new Slideshow(element, data, options);
	*/

		initialize: function(el, data, options){
			this.setOptions(options);
			this.el = document.id(el);
			if (!this.el) 
				return;
			var match = window.location.href.match(this.options.match);
			this.slide = this._slide = this.options.match && match ?
match[1].toInt() 
				: this.options.slide;
			this.counter = this.timeToNextTransition = this.timeToTransitionComplete
= 0;
			this.direction = 'left';
			this.cache = {};
			this.paused = false;
			if (!this.options.overlap)
				this.options.duration *= 2;
			var anchor = this.el.getElement('a') || new
Element('a');
			if (!this.options.href)
				this.options.href = anchor.get('href') || '';
			if (this.options.hu.length && !this.options.hu.test(/\/$/)) 
				this.options.hu += '/';
			if (this.options.fast === true)
				this.options.fast = WhenPaused | WhenPlaying;

			// styles

			var keys = 'slideshow first prev play pause next last images
captions controller thumbnails hidden visible inactive active
loader'.split(' '),
				values = keys.map(function(key, i){
					return this.options.classes[i] || key;
				}, this);
			this.classes = values.associate(keys);
			this.classes.get = function(){
				var str = '.' + this.slideshow;
				for (var i = 0, l = arguments.length; i < l; i++)
					str += '-' + this[arguments[i]];
				return str;
			}.bind(this.classes);

			// data	
			
			if (!data){
				this.options.hu = '';
				data = {};
				var thumbnails =
this.el.getElements(this.classes.get('thumbnails') + '
img');
				this.el.getElements(this.classes.get('images') + '
img').each(function(img, i){
					var src = img.src,
						caption = img.alt || img.title,
						href = img.getParent().href,
						thumbnail = thumbnails[i] ? thumbnails[i].src 
							: '';
					data[src] = {'caption': caption, 'href': href,
'thumbnail': thumbnail};
				});
			}
			var loaded = this.load(data);
			if (!loaded)
				return; 

			// events

			this.events = {};
			this.events.push = function(type, fn){
				if (!this[type])
					this[type] = [];
				this[type].push(fn);
				document.addEvent(type, fn);
				return this;
			}.bind(this.events);

			this.accesskeys = {};
			for (action in this.options.accesskeys){
				var obj = this.options.accesskeys[action];
				this.accesskeys[action] = accesskey = {'label': obj.label};
				['shift', 'control',
'alt'].each(function(modifier){
					var re = new RegExp(modifier, 'i');
					accesskey[modifier] = obj.key.test(re);
					obj.key = obj.key.replace(re, '');
				});
				accesskey.key = obj.key.trim();
			}

			this.events.push('keyup', function(e){
				Object.each(this.accesskeys, function(accesskey, action){
					if (e.key == accesskey.key && e.shift == accesskey.shift
&& e.control == accesskey.control && e.alt ==
accesskey.alt)
						this[action]();
				}, this);			
			}.bind(this));	 

			// required elements

			var el = this.el.getElement(this.classes.get('images')),
				img = this.el.getElement('img') || new
Element('img'),
				images = el ? el.empty() 
					: new Element('div', {'class':
this.classes.get('images').substr(1)}).inject(this.el),
				div = images.getSize();
			this.height = this.options.height || div.y;		
			this.width = this.options.width || div.x;
			images.set({'styles': {'height': this.height,
'width': this.width}});
			this.el.store('images', images);
			this.a = this.image = img;
			if (Browser.ie && Browser.version >= 7)
				this.a.style.msInterpolationMode = 'bicubic';
			this.a.set('styles', {'display': 'none'});
			this.b = this.a.clone();
			[this.a, this.b].each(function(img){
				anchor.clone().cloneEvents(anchor).grab(img).inject(images);
			});

			// optional elements

			this.options.captions && new Caption(this);
			this.options.controller && new Controller(this);
			this.options.loader && new Loader(this);
			this.options.thumbnails && new Thumbnails(this);

			// begin show

			this._preload(this.options.fast & OnStart);
		},

	/**
	Public method: go
		Jump directly to a slide in the show.

	Arguments:
		n - (integer) The index number of the image to jump to, 0 being the first
image in the show.

	Syntax:
		myShow.go(n);	
	*/

		go: function(n, direction){
			var nextSlide = (this.slide + this.data.images.length) %
this.data.images.length;
			if (n == nextSlide || Date.now() < this.timeToTransitionComplete)
				return;		
			clearTimeout(this.timer);
			this.timeToNextTransition = 0;		
			this.direction = direction ? direction 
				: n < this._slide ? 'right' 
				: 'left';
			this.slide = this._slide = n;
			if (this.preloader) 
				this.preloader = this.preloader.destroy();
			this._preload((this.options.fast & WhenPlaying) || (this.paused
&& this.options.fast & WhenPaused));
		},

	/**
	Public method: first
		Goes to the first image in the show.

	Syntax:
		myShow.first();	
	*/

		first: function(){
			this.prev(true); 
		},

	/**
	Public method: prev
		Goes to the previous image in the show.

	Syntax:
		myShow.prev();	
	*/

		prev: function(first){
			var n = 0;
			if (!first){
				if (this.options.random){
					if (this.showed.i < 2)
						return;
					this.showed.i -= 2;
					n = this.showed.array[this.showed.i];
				}
				else
					n = (this.slide - 1 + this.data.images.length) %
this.data.images.length;									
			}
			this.go(n, 'right');
		},

	/**
	Public method: pause
		Toggles play / pause state of the show.

	Arguments:
		p - (undefined, 1 or 0) Call pause with no arguments to toggle the pause
state. Call pause(1) to force pause, or pause(0) to force play.

	Syntax:
		myShow.pause(p);	
	*/

		pause: function(p){
			if (p != undefined)
				this.paused = p ? false 
					: true;
			if (this.paused){ // play
				this.paused = false;
				this.timeToTransitionComplete = Date.now() +
this.timeToTransitionComplete;		
				this.timer = this._preload.delay(50, this);
				[this.a, this.b].each(function(img){
					['morph', 'tween'].each(function(p){
						if (this.retrieve(p)) this.get(p).resume();
					}, img);
				});
				this.controller &&
this.el.retrieve('pause').getParent().removeClass(this.classes.play);
			} 
			else { // pause
				this.paused = true;
				this.timeToTransitionComplete = this.timeToTransitionComplete -
Date.now();
				clearTimeout(this.timer);
				[this.a, this.b].each(function(img){
					['morph', 'tween'].each(function(p){
						if (this.retrieve(p)) this.get(p).pause();
					}, img);
				});
				this.controller &&
this.el.retrieve('pause').getParent().addClass(this.classes.play);
			}
		},

	/**
	Public method: next
		Goes to the next image in the show.

	Syntax:
		myShow.next();	
	*/

		next: function(last){
			var n = last ? this.data.images.length - 1 
				: this._slide;
			this.go(n, 'left');
		},

	/**
	Public method: last
		Goes to the last image in the show.

	Syntax:
		myShow.last();	
	*/

		last: function(){
			this.next(true); 
		},

	/**
	Public method: load
		Loads a new data set into the show: will stop the current show, rewind
and rebuild thumbnails if applicable.

	Arguments:
		data - (array or object) The images and optional thumbnails, captions and
links for the show.

	Syntax:
		myShow.load(data);
	*/

		load: function(data){
			this.firstrun = true;
			this.showed = {'array': [], 'i': 0};
			if (typeOf(data) == 'array'){
				this.options.captions = false;			
				data = new Array(data.length).associate(data.map(function(image, i){
return image + '?' + i })); 
			}
			this.data = {'images': [], 'captions': [],
'hrefs': [], 'thumbnails': [], 'targets': [],
'titles': []};
			for (var image in data){
				var obj = data[image] || {},
					image = this.options.hu + image,
					caption = obj.caption ? obj.caption.trim() 
						: '',
					href = obj.href ? obj.href.trim() 
						: this.options.linked ? image 
						: this.options.href,
					target = obj.target ? obj.target.trim() 
						: '_self',
					thumbnail = obj.thumbnail ? this.options.hu + obj.thumbnail.trim() 
						: image.replace(this.options.replace[0], this.options.replace[1]),
					title = caption.replace(/<.+?>/gm,
'').replace(/</g, '&lt;').replace(/>/g,
'&gt;').replace(/"/g, "'");
				this.data.images.push(image);
				this.data.captions.push(caption);
				this.data.hrefs.push(href);
				this.data.targets.push(target);
				this.data.thumbnails.push(thumbnail);
				this.data.titles.push(title);
			}
			if (this.options.random)
				this.slide = this._slide = Number.random(0, this.data.images.length -
1);

			// only run when data is loaded dynamically into an existing slideshow
instance

			if (this.options.thumbnails &&
this.el.retrieve('thumbnails'))
				this._thumbnails();
			if (this.el.retrieve('images')){
				[this.a, this.b].each(function(img){
					['morph', 'tween'].each(function(p){
						if (this.retrieve(p)) this.get(p).cancel();
					}, img);
				});
				this.slide = this._slide = this.timeToTransitionComplete = 0;
				this.go(0);		
			}
			return this.data.images.length;
		},

	/**
	Public method: destroy
		Destroys a Slideshow instance.

	Arguments:
		p - (string) The images and optional thumbnails, captions and links for
the show.

	Syntax:
		myShow.destroy(p);
	*/

		destroy: function(p){
			Object.each(this.events, function(array, e){
				if ('each' in array)
					array.each(function(fn){ document.removeEvent(e, fn); });
			});
			this.pause(1);
			'caption loader thumbnails'.split('
').each(function(i, timer){
				this.options[i] && (timer =
this[i].retrieve('timer')) && clearTimeout(timer);
			}, this);
			typeOf(this.el[p]) == 'function' && this.el[p]();
			delete this.el.uid;
		},

	/**
	Private method: preload
		Preloads the next slide in the show, once loaded triggers the show,
updates captions, thumbnails, etc.
	*/

		_preload: function(fast){
			var src = this.data.images[this._slide].replace(/([^?]+).*/,
'$1'),
				cached = loaded = !!this.cache[src];
			if (!cached){
				if (!this.preloader)
				 	this.preloader = new Asset.image(src, {
						'onerror': function(){
							// do something
						},
						'onload': function(){
							this.store('loaded', true);
						}
					});
				loaded = this.preloader.retrieve('loaded') &&
this.preloader.get('width');
			}
			if (loaded && Date.now() > this.timeToNextTransition
&& Date.now() > this.timeToTransitionComplete){
				var src = this.data.images[this._slide].replace(/([^?]+).*/,
'$1');
				if (this.preloader){
					this.cache[src] = {
						'height': this.preloader.get('height'),
						'src': src,
						'width': this.preloader.get('width')
					}
				}
				if (this.stopped){
					if (this.options.captions)
						this.caption.get('morph').cancel().start(this.classes.get('captions',
'hidden'));
					this.pause(1);
					if (this.end)
						this.fireEvent('end');
					this.stopped = this.end = false;
					return;				
				}
				this.image = this.counter % 2 ? this.b 
					: this.a;
				this.image.set('styles', {'display':
'block', 'height': null, 'visibility':
'hidden', 'width': null, 'zIndex':
this.counter});
				this.image.set(this.cache[src]);
				this.image.width = this.cache[src].width;
				this.image.height = this.cache[src].height;
				this.options.resize && this._resize(this.image);
				this.options.center && this._center(this.image);
				var anchor = this.image.getParent();
				if (this.data.hrefs[this._slide]){
					anchor.set('href', this.data.hrefs[this._slide]);
					anchor.set('target', this.data.targets[this._slide]);			
				} 
				else {
					anchor.erase('href');
					anchor.erase('target');
				}
				var title = this.data.titles[this._slide];
				this.image.set('alt', title);		
				this.options.titles && anchor.set('title', title);
				this.options.loader && this.loader.fireEvent('hide');
				this.options.captions &&
this.caption.fireEvent('update', fast);				
				this.options.thumbnails &&
this.thumbnails.fireEvent('update', fast); 			
				this._show(fast);
				this._loaded(fast);
			} 
			else {
				if (Date.now() > this.timeToNextTransition &&
this.options.loader)
					this.loader.fireEvent('show');
				this.timer = this._preload.delay(50, this, fast); 
			}
		},

	/**
	Private method: show
		Does the slideshow effect.
	*/

		_show: function(fast){
			if (!this.image.retrieve('morph')){
				var options =  this.options.overlap ? {'link':
'cancel'} : {'link': 'chain'};
				$$(this.a, this.b).set('morph', Object.merge(options,
{'duration': this.options.duration, 'onStart':
this._start.bind(this), 'onComplete': this._complete.bind(this),
'transition': this.options.transition}));
			}
			var hidden = this.classes.get('images', (this.direction ==
'left' ? 'next' 
				: 'prev')),
				visible = this.classes.get('images', 'visible'),
				img = this.counter % 2 ? this.a 
					: this.b;
			if (fast){			
				img.get('morph').cancel().set(hidden);
				this.image.get('morph').cancel().set(visible); 			
			} 
			else {
				if (this.options.overlap){
					img.get('morph').set(visible);
					this.image.get('morph').set(hidden).start(visible);
				} 
				else {
					var fn = function(visible){
						this.image.get('morph').start(visible);
					}.pass(visible, this);
					if (this.firstrun)
						return fn();
					hidden = this.classes.get('images', (this.direction ==
'left' ? 'prev' 
						: 'next'));
					this.image.get('morph').set(hidden);				
					img.get('morph').set(visible).start(hidden).chain(fn);
				}
			}
		},

	/**
	Private method: loaded
		Run after the current image has been loaded, sets up the next image to be
shown.
	*/

		_loaded: function(fast){
			this.counter++;
			this.timeToNextTransition = Date.now() + this.options.duration +
this.options.delay;
			this.direction = 'left';			
			this.timeToTransitionComplete = fast ? 0 
				: Date.now() + this.options.duration;
			if (this._slide == (this.data.images.length - 1) &&
!this.options.loop && !this.options.random)
				this.stopped = this.end = true;
			if (this.options.random){
				this.showed.i++;
				if (this.showed.i >= this.showed.array.length){
					var n = this._slide;
					if (this.showed.array.getLast() != n) this.showed.array.push(n);
					while (this._slide == n)
						this.slide = this._slide = Number.random(0, this.data.images.length -
1);				
				}
				else
					this.slide = this._slide = this.showed.array[this.showed.i];
			}
			else {
				this.slide = this._slide;
				this._slide = (this.slide + 1) % this.data.images.length;
			}
			if (this.image.getStyle('visibility') != 'visible')
				(function(){ this.image.setStyle('visibility',
'visible'); }).delay(1, this);			
			if (this.preloader) 
				this.preloader = this.preloader.destroy();
			this.paused || this._preload();
		},

	/**
	Private method: center
		Center an image.
	*/

		_center: function(img){
			var size = img.getSize(), 
				h = size.y, w = size.x; 
			img.set('styles', {'left': (w - this.width) / -2,
'top': (h - this.height) / -2});
		},

	/**
	Private method: resize
		Resizes an image.
	*/

		_resize: function(img){
			var h = img.get('height').toFloat(), w =
img.get('width').toFloat(),
				dh = this.height / h, dw = this.width / w;
			if (this.options.resize == 'fit')
				dh = dw = dh > dw ? dw 
					: dh;
			if (this.options.resize == 'fill')
				dh = dw = dh > dw ? dh 
					: dw;
			img.set('styles', {'height': Math.ceil(h * dh),
'width': Math.ceil(w * dw)});
		},

	/**
	Private method: start
		Callback on start of slide change.
	*/

		_start: function(){		
			this.fireEvent('start');
		},

	/**
	Private method: complete
		Callback on start of slide change.
	*/

		_complete: function(){
			if (this.firstrun && this.options.paused)
				this.pause(1);
			this.firstrun = false;
			this.fireEvent('complete');
		}	
	});

	/**
	Private method: captions
		Builds the optional caption element, adds interactivity.
		This method can safely be removed if the captions option is not enabled.
	*/

	var Caption = new Class({
		Implements: [Chain, Events, Options],

		options: {/*
			duration: 500,
			fps: 50,
			transition: 'sine:in:out',
			unit: false, */
			delay: 0,
			link: 'cancel'			
		},

		initialize: function(slideshow){
			if (!slideshow)
				return;
			var options = slideshow.options.captions;
			if (options === true)
				options = {};
			this.setOptions(options);
			var el =
slideshow.el.getElement(slideshow.classes.get('captions')),
				caption = el ? el.dispose().empty()
					: new Element('div', {'class':
slideshow.classes.get('captions').substr(1)});
			slideshow.caption = caption;
			caption.set({
		    	'aria-busy': false,
		    	'aria-hidden': false,
				'events': { 'update': this.update.bind(slideshow)
},
				'morph': this.options,
				'role': 'description'
			}).store('delay', this.options.delay);
		    if (!caption.get('id'))
		    	caption.set('id', 'Slideshow-' + Date.now());
		   
slideshow.el.retrieve('images').set('aria-labelledby',
caption.get('id'));
			caption.inject(slideshow.el);
		},

		update: function(fast){
		    var empty = !this.data.captions[this._slide].length, timer;
			if (timer = this.caption.retrieve('timer'))
				clearTimeout(timer);
		    if (fast){
		      var p = empty ? 'hidden' 
				: 'visible';
		      this.caption.set({'aria-hidden': empty, 'html':
this.data.captions[this._slide]}).get('morph').cancel().set(this.classes.get('captions',
p));
		    }
		    else {
		      var fn1 = empty ? function(){} 
				: function(caption){
				this.caption.store('timer', setTimeout(function(caption){
			        this.caption.set('html',
caption).morph(this.classes.get('captions',
'visible'));
				}.pass(caption, this), this.caption.retrieve('delay')));
		      }.pass(this.data.captions[this._slide], this);    
		      var fn2 = function(){ 
		        this.caption.set('aria-busy', false); 
		      }.bind(this);
		      this.caption.set('aria-busy',
true).get('morph').cancel().start(this.classes.get('captions',
'hidden')).chain(fn1, fn2);
		    }
		}
	});

	/**
	Private method: controller
	  Builds the optional controller element, adds interactivity.
	  This method can safely be removed if the controller option is not
enabled.
	*/

	var Controller = new Class({
		Implements: [Chain, Events, Options],

		options: {/*
			duration: 500,
			fps: 50,
			transition: 'sine:in:out',
			unit: false, */
			link: 'cancel'			
		},

		initialize: function(slideshow){
			if (!slideshow)
				return;
			var options = slideshow.options.captions;
			if (options === true)
				options = {};
			this.setOptions(options);
			var el =
slideshow.el.getElement(slideshow.classes.get('controller')),
				controller = el ? el.dispose().empty()
					: new Element('div', {'class':
slideshow.classes.get('controller').substr(1)});
			slideshow.controller = controller;
			controller.set({
				'aria-hidden': false, 
				'role': 'menubar'
			});
			var ul = new Element('ul', {'role':
'menu'}).inject(controller),
				i = 0;
			Object.each(slideshow.accesskeys, function(accesskey, action){
				var li = new Element('li', {
					'class': (action == 'pause' &&
this.options.paused) ? this.classes.play + ' ' +
this.classes[action] 
						: this.classes[action]
				}).inject(ul);
				var a = this.el.retrieve(action, new Element('a', {
					'role': 'menuitem', 'tabindex': i++,
'title': accesskey.label
				}).inject(li));
				a.set('events', {
					'click': function(action){
						this[action]()
					}.pass(action, this),
					'mouseenter': function(active){
						this.addClass(active)
					}.pass(this.classes.active, a),
					'mouseleave': function(active){
						this.removeClass(active)
					}.pass(this.classes.active, a)
				});		
			}, slideshow);
			controller.set({
				'events': {
					'hide':
this.hide.pass(slideshow.classes.get('controller',
'hidden'), controller),
					'show':
this.show.pass(slideshow.classes.get('controller',
'visible'), controller)
				},
				'morph': this.options
			}).store('hidden', false);
			slideshow.events
				.push('keydown', this.keydown.bind(slideshow))
				.push('keyup',	this.keyup.bind(slideshow))
				.push('mousemove',	this.mousemove.bind(slideshow));
			controller.inject(slideshow.el).fireEvent('hide');
		},

		hide: function(hidden){
			if (this.get('aria-hidden') == 'false')
				this.set('aria-hidden', true).morph(hidden);
		},

		keydown: function(e){
			Object.each(this.accesskeys, function(accesskey, action){
				if (e.key == accesskey.key && e.shift == accesskey.shift
&& e.control == accesskey.control && e.alt ==
accesskey.alt){
					if (this.controller.get('aria-hidden') == 'true')
						this.controller.get('morph').set(this.classes.get('controller',
'visible'));
					this.el.retrieve(action).fireEvent('mouseenter');
				}					
			}, this);		
		},

		keyup: function(e){
			Object.each(this.accesskeys, function(accesskey, action){
				if (e.key == accesskey.key && e.shift == accesskey.shift
&& e.control == accesskey.control && e.alt ==
accesskey.alt){
					if (this.controller.get('aria-hidden') == 'true')
						this.controller.set('aria-hidden',
false).fireEvent('hide'); 
					this.el.retrieve(action).fireEvent('mouseleave');
				}					
			}, this);			
		},

		mousemove: function(e){
			var images = this.el.retrieve('images').getCoordinates(),
				action = (e.page.x > images.left && e.page.x <
images.right && e.page.y > images.top && e.page.y <
images.bottom) ? 'show' 
					: 'hide';
			this.controller.fireEvent(action);
		},

		show: function(visible){
			if (this.get('aria-hidden') == 'true')
				this.set('aria-hidden', false).morph(visible);
		}
	});

	/**
	Private method: loader
		Builds the optional loader element, adds interactivity.
		This method can safely be removed if the loader option is not enabled.
	*/

	var Loader = new Class({
		Implements: [Chain, Events, Options],

		options: {/*
			duration: 500,
			transition: 'sine:in:out',
			unit: false, */
			fps: 20,
			link: 'cancel'			
		},

		initialize: function(slideshow){
			if (!slideshow)
				return;
			var options = slideshow.options.loader;
			if (options === true)
				options = {};
			this.setOptions(options);
			var loader = new Element('div', {
				'aria-hidden': false,
				'class':
slideshow.classes.get('loader').substr(1),				
				'morph': this.options,
				'role': 'progressbar'
			}).store('animate', false).store('i',
0).store('delay', 1000 / this.options.fps).inject(slideshow.el);
			slideshow.loader = loader;
			var url =
loader.getStyle('backgroundImage').replace(/url\(['"]?(.*?)['"]?\)/,
'$1').trim();
			if (url){
				if (url.test(/\.png$/) && Browser.ie && Browser.version
< 7)
					loader.setStyles({'backgroundImage': 'none',
'filter':
'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' +
url + '", sizingMethod="crop")'});					
				new Asset.image(url, {'onload': function(){
					var size = loader.getSize(),
						width = this.get('width'), 
						height = this.get('height');
					if (width > size.x)
						loader.store('x', size.x).store('animate',
'x').store('frames', (width / size.x).toInt());
					if (height > size.y)
						loader.store('y', size.y).store('animate',
'y').store('frames', (height / size.y).toInt());
				}});
			}
			loader.set('events', {
				'animate': this.animate.bind(loader),
				'hide':
this.hide.pass(slideshow.classes.get('loader',
'hidden'), loader),
				'show':
this.show.pass(slideshow.classes.get('loader',
'visible'), loader)
			});
			loader.fireEvent('hide');
		},

		animate: function(){
			var animate = this.retrieve('animate');
			if (!animate)
				return;
			var i = (this.retrieve('i').toInt() + 1) %
this.retrieve('frames');
			this.store('i', i);
			var n = (i * this.retrieve(animate)) + 'px';
			if (animate == 'x')
				this.setStyle('backgroundPosition', n + ' 0px');			
			if (animate == 'y')
				this.setStyle('backgroundPosition', '0px ' + n);			
		},

		hide: function(hidden){
			if (this.get('aria-hidden') == 'false'){
				this.set('aria-hidden', true).morph(hidden);
				if (this.retrieve('animate'))
					clearTimeout(this.retrieve('timer'));
			}
		},

		show: function(visible){
			if (this.get('aria-hidden') == 'true'){
				this.set('aria-hidden', false).morph(visible);
				if (this.retrieve('animate')){
					this.store('timer', function(){ 
						this.fireEvent('animate') 
					}.periodical(this.retrieve('delay'), this));			
				}
			}
		}
	});

	/**
	Private method: thumbnails
		Builds the optional thumbnails element, adds interactivity.
		This method can safely be removed if the thumbnails option is not
enabled.
	*/

	var Thumbnails = new Class({
		Implements: [Chain, Events, Options],

		options: {/*
			duration: 500,
			transition: 'sine:in:out',
			unit: false, */
			columns: null,
			fps: 50,
			link: 'cancel',
			position: null,
			rows: null,
			scroll: null
		},

		initialize: function(slideshow){
			var options = (slideshow.options.thumbnails === true) ? {} 
				: slideshow.options.thumbnails;
			this.setOptions(options);
			var el =
slideshow.el.getElement(slideshow.classes.get('thumbnails')),
				thumbnails = el ? el.empty() 
					: new Element('div', {'class':
slideshow.classes.get('thumbnails').substr(1)});
			slideshow.thumbnails = thumbnails;
			thumbnails.set({'role': 'menubar',
'styles': {'overflow': 'hidden'}});
			var uid = thumbnails.retrieve('uid', 'Slideshow-' +
Date.now()),
				ul = new Element('ul', {'role': 'menu',
'styles': {'left': 0, 'position':
'absolute', 'top': 0}, 'tween':
{'link': 'cancel'}}).inject(thumbnails);
			slideshow.data.thumbnails.each(function(thumbnail, i){
				var li = new Element('li', {'id': uid +
i}).inject(ul),
					a = new Element('a', {
						'class': slideshow.classes.get('thumbnails',
'hidden').substr(1),
						'events': {
							'click': this.click.pass(i, slideshow)
						},
						'href': slideshow.data.images[i],
						'morph': this.options,
						'role': 'menuitem',
						'tabindex': i
					}).store('uid', i).inject(li);
				if (slideshow.options.titles)
					a.set('title', slideshow.data.titles[i]);
				new Asset.image(thumbnail, {
					'onload': this.onload.pass(i, slideshow)
				}).inject(a);
			}, this);
			thumbnails.set('events', {
				'scroll': this.scroll.bind(thumbnails),
				'update': this.update.bind(slideshow)
			});
			var coords = thumbnails.getCoordinates();
			if (!options.scroll)
				options.scroll = (coords.height > coords.width) ? 'y' 
					: 'x';
			var props = (options.scroll == 'y') ? 'top bottom height
y width'.split(' ') 
				: 'left right width x height'.split(' ');
			thumbnails.store('props', props).store('delay', 1000
/ this.options.fps);
			slideshow.events.push('mousemove',
this.mousemove.bind(thumbnails));
			thumbnails.inject(slideshow.el);
		},

		click: function(i){
			this.go(i); 
			return false; 
		},

		mousemove: function(e){
			var coords = this.getCoordinates();
			if (e.page.x > coords.left && e.page.x < coords.right
&& e.page.y > coords.top && e.page.y <
coords.bottom){
				this.store('page', e.page);			
				if (!this.retrieve('mouseover')){
					this.store('mouseover', true);
					this.store('timer',
function(){this.fireEvent('scroll');}.periodical(this.retrieve('delay'),
this));
				}
			}
			else {
				if (this.retrieve('mouseover')){
					this.store('mouseover', false);				
					clearTimeout(this.retrieve('timer'));
				}
			}			
		},

		onload: function(i){
			var thumbnails = this.thumbnails,
				a = thumbnails.getElements('a')[i];
			if (a){
				(function(a){
					var visible = i == this.slide ? 'active' 
						: 'inactive';					
					a.store('loaded',
true).get('morph').set(this.classes.get('thumbnails',
'hidden')).start(this.classes.get('thumbnails',
visible));	
				}).delay(Math.max(1000 / this.data.thumbnails.length, 100), this, a);
			}					
			if (thumbnails.retrieve('limit'))
				return;
			var props = thumbnails.retrieve('props'), 
				options = this.options.thumbnails,
				pos = props[1], 
				length = props[2], 
				width = props[4],
				li = thumbnails.getElement('li:nth-child(' + (i + 1) +
')').getCoordinates();
			if (options.columns || options.rows){
				thumbnails.setStyles({'height': this.height,
'width': this.width});
				if (options.columns.toInt())
					thumbnails.setStyle('width', li.width *
options.columns.toInt());
				if (options.rows.toInt())
					thumbnails.setStyle('height', li.height *
options.rows.toInt());
			}
			var div = thumbnails.getCoordinates();
			if (options.position){
				if (options.position.test(/bottom|top/))
					thumbnails.setStyles({'bottom': 'auto',
'top': 'auto'}).setStyle(options.position,
-div.height);
				if (options.position.test(/left|right/))
					thumbnails.setStyles({'left': 'auto',
'right': 'auto'}).setStyle(options.position,
-div.width);
			}
			var units = Math.floor(div[width] / li[width]),
				x = Math.ceil(this.data.images.length / units),
				r = this.data.images.length % units,
				len = x * li[length],
				ul = thumbnails.getElement('ul').setStyle(length, len);
			ul.getElements('li').setStyles({'height': li.height,
'width': li.width});
			thumbnails.store('limit', div[length] - len);
		},

		scroll: function(n, fast){
			var div = this.getCoordinates(),
				ul = this.getElement('ul').getPosition(),
				props = this.retrieve('props'),
				axis = props[3], delta, pos = props[0], size = props[2], value,			
				tween = this.getElement('ul').set('tween',
{'property': pos}).get('tween');	
			if (n != undefined){
				var uid = this.retrieve('uid'),
					li = document.id(uid + n).getCoordinates();
				delta = div[pos] + (div[size] / 2) - (li[size] / 2) - li[pos];
				value = (ul[axis] - div[pos] +
delta).limit(this.retrieve('limit'), 0);
				tween[fast ? 'set' : 'start'](value);
			}
			else{
				var area = div[props[2]] / 3, 
					page = this.retrieve('page'), 
					velocity = -(this.retrieve('delay') * 0.01);			
				if (page[axis] < (div[pos] + area))
					delta = (page[axis] - div[pos] - area) * velocity;
				else if (page[axis] > (div[pos] + div[size] - area))
					delta = (page[axis] - div[pos] - div[size] + area) * velocity;			
				if (delta){			
					value = (ul[axis] - div[pos] +
delta).limit(this.retrieve('limit'), 0);
					tween.set(value);
				}
			}				
		},

		update: function(fast){
			var thumbnails = this.thumbnails,
				uid = thumbnails.retrieve('uid');
			thumbnails.getElements('a').each(function(a, i){
				if (a.retrieve('loaded')){
					if (a.retrieve('uid') == this._slide){
						if (!a.retrieve('active', false)){
							a.store('active', true);
							var active = this.classes.get('thumbnails',
'active');							
							if (fast) a.get('morph').set(active);
							else a.morph(active);
						}
					} 
					else {
						if (a.retrieve('active', true)){
							a.store('active', false);
							var inactive = this.classes.get('thumbnails',
'inactive');						
							if (fast) a.get('morph').set(inactive);
							else a.morph(inactive);
						}
					}
				}
			}, this);
			if (!thumbnails.retrieve('mouseover'))
				thumbnails.fireEvent('scroll', [this._slide, fast]);
		}
	});
})();libs/slideshow2/js/slideshow.kenburns.js000064400000005570151165347350014402
0ustar00/**
Script: Slideshow.KenBurns.js
	Slideshow.KenBurns - KenBurns extension for Slideshow, includes zooming
and panning effects.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).
	
Dependencies:
	Slideshow.
*/
(function(){
	Slideshow.KenBurns = new Class({
		Extends: Slideshow,

		options: {
			pan: [100, 100],
			zoom: [50, 50]
		},

	/**
	Constructor: initialize
		Creates an instance of the Slideshow class.

	Arguments:
		element - (element) The wrapper element.
		data - (array or object) The images and optional thumbnails, captions and
links for the show.
		options - (object) The options below.

	Syntax:
		var myShow = new Slideshow.KenBurns(element, data, options);
	*/

		initialize: function(el, data, options){
			options = options || {};
			options.overlap = true;
			options.resize = 'fill';
			['pan', 'zoom'].each(function(p){
				if (this[p] != undefined){
					if (typeOf(this[p]) != 'array') this[p] = [this[p],
this[p]];
					this[p].map(function(n){return (n.toInt() || 0).limit(0, 100);});					
				}
			}, options);
			this.parent(el, data, options);
		},

	/**
	Private method: show
		Does the slideshow effect.
	*/

		_show: function(fast){
			if (!this.image.retrieve('morph')){
				$$(this.a, this.b).set({
					'tween': {'duration': this.options.duration,
'link': 'cancel', 'onStart':
this._start.bind(this), 'onComplete': this._complete.bind(this),
'property': 'opacity'},
					'morph': {'duration': (this.options.delay +
this.options.duration * 2), 'link': 'cancel',
'transition': 'linear'}
				});
			}
			this.image.set('styles', {'bottom':
'auto', 'left': 'auto', 'right':
'auto', 'top': 'auto'});
			var props = ['top left', 'top right', 'bottom
left', 'bottom right'][this.counter % 4].split('
');
			this.image.setStyles([0, 0].associate(props));
			var src = this.data.images[this._slide].replace(/([^?]+).*/,
'$1'),
				cache = this.cache[src];
			dh = this.height / cache.height;
			dw = this.width / cache.width;
			delta = (dw > dh) ? dw : dh;
			var values = {},
				zoom = (Number.random.apply(Number, this.options.zoom) / 100.0) + 1,
				pan = Math.abs((Number.random.apply(Number, this.options.pan) / 100.0)
- 1);
			['height', 'width'].each(function(prop, i){
				var e = Math.ceil(cache[prop] * delta),
					s = (e * zoom).toInt();		
				values[prop] = [s, e];
				if (dw > dh || i){
					e = (this[prop] - this.image[prop]);
					s = (e * pan).toInt();			
					values[props[i]] = [s, e];
				}
			}, this);
			var paused = ((this.firstrun && this.options.paused) ||
this.paused);
			if (fast || paused){
				this._center(this.image);
				this.image.get('morph').cancel();
				if (paused)
					this.image.get('tween').cancel().set(0).start(1);
				else
					this.image.get('tween').cancel().set(1);
			} 
			else{
				this.image.get('morph').start(values);
				this.image.get('tween').set(0).start(1);
			}
		}
	});
})();libs/slideshow2/js/slideshow.push.js000064400000003565151165347350013534
0ustar00/**
Script: Slideshow.Push.js
	Slideshow.Push - Push extension for Slideshow.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).
	
Dependencies:
	Slideshow.
	Mootools 1.3.1 More: Fx.Elements.
*/

Slideshow.Push = new Class({
	Extends: Slideshow,
	
/**
Constructor: initialize
	Creates an instance of the Slideshow class.

Arguments:
	element - (element) The wrapper element.
	data - (array or object) The images and optional thumbnails, captions and
links for the show.
	options - (object) The options below.

Syntax:
	var myShow = new Slideshow.Push(element, data, options);
*/
	
	initialize: function(el, data, options){
		options = options || {};
		options.overlap = true;		
		this.parent(el, data, options);
	},

/**
Private method: show
	Does the slideshow effect.
*/

	_show: function(fast){
		var images = [this.image, ((this.counter % 2) ? this.a : this.b)];
		if (!this.image.retrieve('fx'))
			this.image.store('fx', new Fx.Elements(images,
{'duration': this.options.duration, 'link':
'cancel', 'onStart': this._start.bind(this),
'onComplete': this._complete.bind(this), 'transition':
this.options.transition }));
		this.image.set('styles', {'left': 'auto',
'right': 'auto' }).setStyle(this.direction,
this.width);
		var values = {'0': {}, '1': {} };
		values['0'][this.direction] = [this.width, 0];
		values['1'][this.direction] = [0, -this.width];
		if (images[1].getStyle(this.direction) == 'auto'){
			var width = this.width - images[1].width;	
			images[1].set('styles', {'left': 'auto',
'right': 'auto' }).setStyle(this.direction, width);		 
			values['1'][this.direction] = [width, -this.width];
		}
		if (fast){
		 	for (var prop in values)
		 		values[prop][this.direction] = values[prop][this.direction][1];			
			this.image.retrieve('fx').cancel().set(values);
		} 
		else
			this.image.retrieve('fx').start(values);
	}
});libs/slideshow2/README000064400000002372151165347350010456
0ustar00LICENSE

MIT-style license.

COPYRIGHT

Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).

SUMMARY

Slideshow is a javascript class for Mootools 1.2 to stream and animate the
presentation of images on your website.

FILES

In this distribution, you will find the following files:

css/          - Folder containing stylesheet and CSS background images.
images/       - Folder with example images.
index.html    - Example script usage.
js/           - Folder with the Slideshow scripts and Mootools 1.2.1.

SUPPORT

http://code.google.com/p/slideshow                    - Official
development website.
http://www.electricprism.com/aeron/slideshow/         - Demos and examples.
http://code.google.com/p/slideshow/wiki/FAQ           - FAQ.
http://code.google.com/p/slideshow/wiki/Slideshow     - Manual.
http://groups.google.com/group/mootools-slideshow     - Google Group.

CHANGE LOG

slideshow.js (147)	- IE fixed for both the base class and Fold slideshows.
slideshow.js (131)	- IE7 or newer now looks good! Added transitions on
paused, titles options, more.
slideshow.js (113)	- Fixed conflict with Mootools 1.2.1 and destroy().
slideshow.js (105)      - Added fix for duplicate image filenames.
slideshow.js (104)      - Added onEnd event
handler.libs/slimbox2/css/closelabel.gif000064400000001713151165347350012634
0ustar00GIF87aB�������zzz�����������YYY��҃����������䌌����PPP���TTTVVV������RRRXXXQQQSSS���UUU�������������{{{```WWW���������OOOLLL���fff___���KKK��ޡ���������������lll���xxx������yyy���dddZZZ�����ﳳ������㇇�iiiNNNsssMMM���ggg|||���ccc�����������߹�����ppp���eee���vvvmmm������nnnooo������,B�������������������������/�������2X]�$�����(Y';��8*'G��×���?,T��!'M�
�
̕	�	��	7�냣&HO�<��p��(h@a�
ș��@@Q���%:��X�d|�@<8��
��U�&�xN*�8���z����+�,<p"��,��ɳ�U*:�yT@RC��HR��*p�)i�%���Z
 �:%��a���FaX�p�B��&�E71��K|,
���H†O
�cc�tMB��neI��Qb�U2Ǒg�]Q$�	q]lp���Nc9'[�l���I@q+݂�iCRH�Pa�pI
:L�`3G�U��q#ذ�K8YO��UQOq���
7H��¹�M<�cOV��@m
�s�H�xf�)T�� p
Zp�/Pr�s��x�29E�K��_�2�"��B��3�A&�Q3`�0���(��"9d��@h�ĕO�"K$Tu�=p��+�4�~g��f��;libs/slimbox2/css/loading.gif000064400000002377151165347350012153
0ustar00GIF89a�������&&&��似���̪���������������������������������ظ�����ppp���hhhFFFHHH222������PPP666���VVV���!�
!�NETSCAPE2.0,�@�pHL<�á
Ĩt��W�`��4S退-k�\J%<��f4c`𸜛	GyXg{wQo�X	
h�Dd�
a�eTy�vkyBVevCp�y��C
yFp�QpGpP�CpHp�ͫpIp��pJ�����e��֝X��ϧ���e	��p	�X����%��ia6�Ž�'_S�jt�EY�<��m@�zh��*AY
���I8�ظq��J6c����N8/%��f�s��	!�
!,W@���H���d`��@I$sJDCө!�N]�2�1
��a0�(@�����j��W!~�!���v�
����	�A!�
!,	Y��0Ԉ���apL&	��		MӀD��!�!���
�.���\�����n�A|!�!��B�C|GvsCA!�
!,Y��p(\�G�8@�a�
DC��qUP��A�D+�/��A\i$Jx@�~4�{�z!
C��K�z��h�{WWCA!�
!,	T��0T���PpAl�!��8
��ȓ-�C`\]bςy=e�g5��0`�W��!R�zkIBh�P!]FA!�
!,Y��`8L���#�8�$���D��M5T�
ېEz�l�Р��C��`��P,�yz�zO
��O��U�[�a!	A!�
!,	Y��АC�@p�P�K�
Z��K��
B�gzRAB�#�`Ǹ��B��>�B�!	�
B�!�BvGur
GA!�
!,X��pH,(�q�9XP�2T�D�K�%f��P�G�C
P�~@�D@X��Ć�۩S~S	�
S!��u~�!����A;libs/slimbox2/css/nextlabel.gif000064400000000542151165347350012504
0ustar00GIF89a?
�zzz������aaa������������mmm������UUU�����������և����Ͼ��������������������rrrIII���333!�,?
�
�mdi�h��,:�p,�tm�x��|��pH,�ȠF�04��r	�04�R@S�N���b�Ɔ0�6�ŀ
P(2��!n�̀(UOaZ�?�[	�e)	L�&[�bU��O�j$l��@�������c��=���*r�JU$�P��'[Y�êŴKfhִ%���Ĩ�R_�%���I�������-�����
H��0D
�;libs/slimbox2/css/prevlabel.gif000064400000000563151165347350012505
0ustar00GIF89a?
������������bbbmmm��������Ǻ�����������������yyy�����廻���������������WWW���333!�,?
�`&�di�h�����p��rm�x��|��pH,����ib���pdӦ@�i�@��0CS�	�+&�vOR
=�Dak#~Xb%|BL�bs#i�&`�LQ}eg|�X��""��N���hr��#\�C�&�d"�&x\j��$��j�&���~Ȅr�Xtu�`���Y���J��"����+*$H0��TP��aÄ#J�H��S�;libs/slimbox2/css/slimbox2-rtl.css000064400000002350151165347350013106
0ustar00/* SLIMBOX */

#lbOverlay {
	position: fixed;
	z-index: 9999;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	background-color: #000;
	cursor: pointer;
}

#lbCenter, #lbBottomContainer {
	position: absolute;
	z-index: 9999;
	overflow: hidden;
	background-color: #fff;
}

.lbLoading {
	background: #fff url(loading.gif) no-repeat center;
}

#lbImage {
	position: absolute;
	left: 0;
	top: 0;
	border: 10px solid #fff;
	background-repeat: no-repeat;
}

#lbPrevLink, #lbNextLink {
	display: block;
	position: absolute;
	top: 0;
	width: 50%;
	outline: none;
}

#lbPrevLink {
	right: 0;
}

#lbPrevLink:hover {
	background: transparent url(prevlabel.gif) no-repeat 100% 15%;
}

#lbNextLink {
	left: 0;
}

#lbNextLink:hover {
	background: transparent url(nextlabel.gif) no-repeat 0 15%;
}

#lbBottom {
	font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
	font-size: 10px;
	color: #666;
	line-height: 1.4em;
	text-align: right;
	border: 10px solid #fff;
	border-top-style: none;
	direction: rtl;
}

#lbCloseLink {
	display: block;
	float: left;
	width: 66px;
	height: 22px;
	background: transparent url(closelabel.gif) no-repeat center;
	margin: 5px 0;
	outline: none;
}

#lbCaption, #lbNumber {
	margin-left: 71px;
}

#lbCaption {
	font-weight: bold;
}
libs/slimbox2/css/slimbox2.css000064400000002330151165347350012305
0ustar00/* SLIMBOX */

#lbOverlay {
	position: fixed;
	z-index: 9999;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	background-color: #000;
	cursor: pointer;
}

#lbCenter, #lbBottomContainer {
	position: absolute;
	z-index: 9999;
	overflow: hidden;
	background-color: #fff;
}

.lbLoading {
	background: #fff url(loading.gif) no-repeat center;
}

#lbImage {
	position: absolute;
	left: 0;
	top: 0;
	border: 10px solid #fff;
	background-repeat: no-repeat;
}

#lbPrevLink, #lbNextLink {
	display: block;
	position: absolute;
	top: 0;
	width: 50%;
	outline: none;
}

#lbPrevLink {
	left: 0;
}

#lbPrevLink:hover {
	background: transparent url(prevlabel.gif) no-repeat 0 15%;
}

#lbNextLink {
	right: 0;
}

#lbNextLink:hover {
	background: transparent url(nextlabel.gif) no-repeat 100% 15%;
}

#lbBottom {
	font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
	font-size: 10px;
	color: #666;
	line-height: 1.4em;
	text-align: left;
	border: 10px solid #fff;
	border-top-style: none;
}

#lbCloseLink {
	display: block;
	float: right;
	width: 66px;
	height: 22px;
	background: transparent url(closelabel.gif) no-repeat center;
	margin: 5px 0;
	outline: none;
}

#lbCaption, #lbNumber {
	margin-right: 71px;
}

#lbCaption {
	font-weight: bold;
}
libs/slimbox2/js/slimbox2.js000064400000010532151165347350011760
0ustar00/*!
	Slimbox v2.05 - The ultimate lightweight Lightbox clone for jQuery
	(c) 2007-2013 Christophe Beyls <http://www.digitalia.be>
	MIT-style license.
*/

(function(w){var
E=w(window),u,f,F=-1,n,x,D,v,y,L,r,m=!window.XMLHttpRequest,s=[],l=document.documentElement,k={},t=new
Image(),J=new
Image(),H,a,g,p,I,d,G,c,A,K;w(function(){w("body").append(w([H=w('<div
id="lbOverlay" />').click(C)[0],a=w('<div
id="lbCenter" />')[0],G=w('<div
id="lbBottomContainer"
/>')[0]]).css("display","none"));g=w('<div
id="lbImage" />').appendTo(a).append(p=w('<div
style="position: relative;" />').append([I=w('<a
id="lbPrevLink" href="#"
/>').click(B)[0],d=w('<a id="lbNextLink"
href="#" />').click(e)[0]])[0])[0];c=w('<div
id="lbBottom" />').appendTo(G).append([w('<a
id="lbCloseLink" href="#"
/>').click(C)[0],A=w('<div id="lbCaption"
/>')[0],K=w('<div id="lbNumber"
/>')[0],w('<div style="clear: both;"
/>')[0]])[0]});w.slimbox=function(O,N,M){u=w.extend({loop:false,overlayOpacity:0.8,overlayFadeDuration:400,resizeDuration:400,resizeEasing:"swing",initialWidth:250,initialHeight:250,imageFadeDuration:400,captionAnimationDuration:400,counterText:"Image
{x} of
{y}",closeKeys:[27,88,67],previousKeys:[37,80],nextKeys:[39,78]},M);if(typeof
O=="string"){O=[[O,N]];N=0}y=E.scrollTop()+(E.height()/2);L=u.initialWidth;r=u.initialHeight;w(a).css({top:Math.max(0,y-(r/2)),width:L,height:r,marginLeft:-L/2}).show();v=m||(H.currentStyle&&(H.currentStyle.position!="fixed"));if(v){H.style.position="absolute"}w(H).css("opacity",u.overlayOpacity).fadeIn(u.overlayFadeDuration);z();j(1);f=O;u.loop=u.loop&&(f.length>1);return
b(N)};w.fn.slimbox=function(M,P,O){P=P||function(Q){return[Q.href,Q.title]};O=O||function(){return
true};var N=this;return N.unbind("click").click(function(){var
S=this,U=0,T,Q=0,R;T=w.grep(N,function(W,V){return
O.call(S,W,V)});for(R=T.length;Q<R;++Q){if(T[Q]==S){U=Q}T[Q]=P(T[Q],Q)}return
w.slimbox(T,U,M)})};function z(){var
N=E.scrollLeft(),M=E.width();w([a,G]).css("left",N+(M/2));if(v){w(H).css({left:N,top:E.scrollTop(),width:M,height:E.height()})}}function
j(M){if(M){w("object").add(m?"select":"embed").each(function(O,P){s[O]=[P,P.style.visibility];P.style.visibility="hidden"})}else{w.each(s,function(O,P){P[0].style.visibility=P[1]});s=[]}var
N=M?"bind":"unbind";E[N]("scroll
resize",z);w(document)[N]("keydown",o)}function o(O){var
N=O.which,M=w.inArray;return(M(N,u.closeKeys)>=0)?C():(M(N,u.nextKeys)>=0)?e():(M(N,u.previousKeys)>=0)?B():null}function
B(){return b(x)}function e(){return b(D)}function
b(M){if(M>=0){F=M;n=f[F][0];x=(F||(u.loop?f.length:0))-1;D=((F+1)%f.length)||(u.loop?0:-1);q();a.className="lbLoading";k=new
Image();k.onload=i;k.src=n}return false}function
i(){a.className="";w(g).css({backgroundImage:"url("+n+")",visibility:"hidden",display:""});w(p).width(k.width);w([p,I,d]).height(k.height);w(A).html(f[F][1]||"");w(K).html((((f.length>1)&&u.counterText)||"").replace(/{x}/,F+1).replace(/{y}/,f.length));if(x>=0){t.src=f[x][0]}if(D>=0){J.src=f[D][0]}L=g.offsetWidth;r=g.offsetHeight;var
M=Math.max(0,y-(r/2));if(a.offsetHeight!=r){w(a).animate({height:r,top:M},u.resizeDuration,u.resizeEasing)}if(a.offsetWidth!=L){w(a).animate({width:L,marginLeft:-L/2},u.resizeDuration,u.resizeEasing)}w(a).queue(function(){w(G).css({width:L,top:M+r,marginLeft:-L/2,visibility:"hidden",display:""});w(g).css({display:"none",visibility:"",opacity:""}).fadeIn(u.imageFadeDuration,h)})}function
h(){if(x>=0){w(I).show()}if(D>=0){w(d).show()}w(c).css("marginTop",-c.offsetHeight).animate({marginTop:0},u.captionAnimationDuration);G.style.visibility=""}function
q(){k.onload=null;k.src=t.src=J.src=n;w([a,g,c]).stop(true);w([I,d,g,G]).hide()}function
C(){if(F>=0){q();F=x=D=-1;w(a).hide();w(H).stop().fadeOut(u.overlayFadeDuration,j)}return
false}})(jQuery);

// AUTOLOAD CODE BLOCK (MAY BE CHANGED OR REMOVED)
jQuery.slimbox.scanPage = function() {
	if (!/series60|symbian|windows ce|blackberry/i.test(navigator.userAgent))
{
		if (typeof(Lightbox) !== 'undefined') {
			jQuery(function ($) {
				$("a[rel^='lightbox']").slimbox({/* Put custom
options here */}, null, function (el) {
					return (this == el) || ((this.rel.length > 8) && (this.rel
== el.rel));
				});
			});
		}
	}
};

window.addEvent("domready", jQuery.slimbox.scanPage);


require(['fab/fabrik'], function (Fabrik) {
		Fabrik.addEvent('fabrik.list.update', jQuery.slimbox.scanPage);
		Fabrik.addEvent('fabrik.cdd.update', jQuery.slimbox.scanPage);
});libs/twitteroauth/LICENSE.md000064400000002114151165347350011654
0ustar00Copyright (c) 2009 Abraham Williams - http://abrah.am -
abraham@abrah.am
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
libs/twitteroauth/README.md000064400000001750151165347350011534
0ustar00<span itemprop="name">TwitterOAuth</span>
[![Build
Status](https://img.shields.io/travis/abraham/twitteroauth.svg)](https://travis-ci.org/abraham/twitteroauth)
[![Scrutinizer Code
Quality](https://scrutinizer-ci.com/g/abraham/twitteroauth/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/abraham/twitteroauth/?branch=master)
[![Issues
Count](https://img.shields.io/github/issues/abraham/twitteroauth.svg)](https://github.com/abraham/twitteroauth/issues)
[![Latest
Version](https://img.shields.io/packagist/v/abraham/twitteroauth.svg)](https://packagist.org/packages/abraham/twitteroauth)
------------

<p itemprop="description">The most popular PHP library for
Twitter's OAuth REST API.</p>

See documentation at https://twitteroauth.com.

OAuth signing code originally sourced from
[here](https://code.google.com/p/oauth/).

<img
src="https://raw.githubusercontent.com/abraham/twitteroauth-demo/master/images/twitter-logo-blue.png"
itemprop="image" alt="Twitter bird"
width="200px">
libs/twitteroauth/src/cacert.pem000064400000764522151165347350013025
0ustar00##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Wed Oct 28 04:12:04 2015
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root
certificates
## file (certdata.txt).  This file can be found in the mozilla source tree:
##
http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
##
## It contains the certificates in PEM format and therefore
## can be directly used with curl / libcurl / php_curl, or with
## an Apache+mod_ssl webserver for SSL client authentication.
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.25.
## SHA1: 6d7d2f0a4fae587e7431be191a081ac1257d300a
##


Equifax Secure CA
=================
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
70+sB3c4
-----END CERTIFICATE-----

GlobalSign Root CA
==================
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----

GlobalSign Root CA - R2
=======================
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
-----END CERTIFICATE-----

Verisign Class 3 Public Primary Certification Authority - G3
============================================================
-----BEGIN CERTIFICATE-----
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
-----END CERTIFICATE-----

Verisign Class 4 Public Primary Certification Authority - G3
============================================================
-----BEGIN CERTIFICATE-----
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
-----END CERTIFICATE-----

Entrust.net Premium 2048 Secure Server CA
=========================================
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
-----END CERTIFICATE-----

Baltimore CyberTrust Root
=========================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
-----END CERTIFICATE-----

AddTrust Low-Value Services Root
================================
-----BEGIN CERTIFICATE-----
MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
-----END CERTIFICATE-----

AddTrust External Root
======================
-----BEGIN CERTIFICATE-----
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
-----END CERTIFICATE-----

AddTrust Public Services Root
=============================
-----BEGIN CERTIFICATE-----
MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
-----END CERTIFICATE-----

AddTrust Qualified Certificates Root
====================================
-----BEGIN CERTIFICATE-----
MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
-----END CERTIFICATE-----

Entrust Root Certification Authority
====================================
-----BEGIN CERTIFICATE-----
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
-----END CERTIFICATE-----

RSA Security 2048 v3
====================
-----BEGIN CERTIFICATE-----
MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
pKnXwiJPZ9d37CAFYd4=
-----END CERTIFICATE-----

GeoTrust Global CA
==================
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
Mw==
-----END CERTIFICATE-----

GeoTrust Global CA 2
====================
-----BEGIN CERTIFICATE-----
MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
H4z1Ir+rzoPz4iIprn2DQKi6bA==
-----END CERTIFICATE-----

GeoTrust Universal CA
=====================
-----BEGIN CERTIFICATE-----
MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
P/rmMuGNG2+k5o7Y+SlIis5z/iw=
-----END CERTIFICATE-----

GeoTrust Universal CA 2
=======================
-----BEGIN CERTIFICATE-----
MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
-----END CERTIFICATE-----

Visa eCommerce Root
===================
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
398znM/jra6O1I7mT1GvFpLgXPYHDw==
-----END CERTIFICATE-----

Certum Root CA
==============
-----BEGIN CERTIFICATE-----
MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
-----END CERTIFICATE-----

Comodo AAA Services root
========================
-----BEGIN CERTIFICATE-----
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----

Comodo Secure Services root
===========================
-----BEGIN CERTIFICATE-----
MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
RR3B7Hzs/Sk=
-----END CERTIFICATE-----

Comodo Trusted Services root
============================
-----BEGIN CERTIFICATE-----
MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
9y5Xt5hwXsjEeLBi
-----END CERTIFICATE-----

QuoVadis Root CA
================
-----BEGIN CERTIFICATE-----
MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
5nrQNiOKSnQ2+Q==
-----END CERTIFICATE-----

QuoVadis Root CA 2
==================
-----BEGIN CERTIFICATE-----
MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
-----END CERTIFICATE-----

QuoVadis Root CA 3
==================
-----BEGIN CERTIFICATE-----
MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
-----END CERTIFICATE-----

Security Communication Root CA
==============================
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
FL39vmwLAw==
-----END CERTIFICATE-----

Sonera Class 2 Root CA
======================
-----BEGIN CERTIFICATE-----
MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
llpwrN9M
-----END CERTIFICATE-----

Staat der Nederlanden Root CA
=============================
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
-----END CERTIFICATE-----

UTN DATACorp SGC Root CA
========================
-----BEGIN CERTIFICATE-----
MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
-----END CERTIFICATE-----

UTN USERFirst Hardware Root CA
==============================
-----BEGIN CERTIFICATE-----
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
nfhmqA==
-----END CERTIFICATE-----

Camerfirma Chambers of Commerce Root
====================================
-----BEGIN CERTIFICATE-----
MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
erfutGWaIZDgqtCYvDi1czyL+Nw=
-----END CERTIFICATE-----

Camerfirma Global Chambersign Root
==================================
-----BEGIN CERTIFICATE-----
MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
-----END CERTIFICATE-----

NetLock Notary (Class A) Root
=============================
-----BEGIN CERTIFICATE-----
MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
8CgHrTwXZoi1/baI
-----END CERTIFICATE-----

XRamp Global CA Root
====================
-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
-----END CERTIFICATE-----

Go Daddy Class 2 CA
===================
-----BEGIN CERTIFICATE-----
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
vZ8=
-----END CERTIFICATE-----

Starfield Class 2 CA
====================
-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
QBFGmh95DmK/D5fs4C8fF5Q=
-----END CERTIFICATE-----

StartCom Certification Authority
================================
-----BEGIN CERTIFICATE-----
MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
g14=
-----END CERTIFICATE-----

Taiwan GRCA
===========
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
-----END CERTIFICATE-----

Swisscom Root CA 1
==================
-----BEGIN CERTIFICATE-----
MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
NY6E0F/6MBr1mmz0DlP5OlvRHA==
-----END CERTIFICATE-----

DigiCert Assured ID Root CA
===========================
-----BEGIN CERTIFICATE-----
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
-----END CERTIFICATE-----

DigiCert Global Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----

DigiCert High Assurance EV Root CA
==================================
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
-----END CERTIFICATE-----

Certplus Class 2 Primary CA
===========================
-----BEGIN CERTIFICATE-----
MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
l7+ijrRU
-----END CERTIFICATE-----

DST Root CA X3
==============
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

DST ACES CA X6
==============
-----BEGIN CERTIFICATE-----
MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
oKfN5XozNmr6mis=
-----END CERTIFICATE-----

TURKTRUST Certificate Services Provider Root 2
==============================================
-----BEGIN CERTIFICATE-----
MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
UrbnBEI=
-----END CERTIFICATE-----

SwissSign Gold CA - G2
======================
-----BEGIN CERTIFICATE-----
MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
-----END CERTIFICATE-----

SwissSign Silver CA - G2
========================
-----BEGIN CERTIFICATE-----
MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
-----END CERTIFICATE-----

GeoTrust Primary Certification Authority
========================================
-----BEGIN CERTIFICATE-----
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
-----END CERTIFICATE-----

thawte Primary Root CA
======================
-----BEGIN CERTIFICATE-----
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
-----END CERTIFICATE-----

VeriSign Class 3 Public Primary Certification Authority - G5
============================================================
-----BEGIN CERTIFICATE-----
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
-----END CERTIFICATE-----

SecureTrust CA
==============
-----BEGIN CERTIFICATE-----
MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
-----END CERTIFICATE-----

Secure Global CA
================
-----BEGIN CERTIFICATE-----
MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
-----END CERTIFICATE-----

COMODO Certification Authority
==============================
-----BEGIN CERTIFICATE-----
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
-----END CERTIFICATE-----

Network Solutions Certificate Authority
=======================================
-----BEGIN CERTIFICATE-----
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
-----END CERTIFICATE-----

WellsSecure Public Root Certificate Authority
=============================================
-----BEGIN CERTIFICATE-----
MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
tylv2G0xffX8oRAHh84vWdw+WNs=
-----END CERTIFICATE-----

COMODO ECC Certification Authority
==================================
-----BEGIN CERTIFICATE-----
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
-----END CERTIFICATE-----

IGC/A
=====
-----BEGIN CERTIFICATE-----
MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
0mBWWg==
-----END CERTIFICATE-----

Security Communication EV RootCA1
=================================
-----BEGIN CERTIFICATE-----
MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
-----END CERTIFICATE-----

OISTE WISeKey Global Root GA CA
===============================
-----BEGIN CERTIFICATE-----
MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
-----END CERTIFICATE-----

Microsec e-Szigno Root CA
=========================
-----BEGIN CERTIFICATE-----
MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
-----END CERTIFICATE-----

Certigna
========
-----BEGIN CERTIFICATE-----
MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
-----END CERTIFICATE-----

Deutsche Telekom Root CA 2
==========================
-----BEGIN CERTIFICATE-----
MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
Cm26OWMohpLzGITY+9HPBVZkVw==
-----END CERTIFICATE-----

Cybertrust Global Root
======================
-----BEGIN CERTIFICATE-----
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
-----END CERTIFICATE-----

ePKI Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
-----END CERTIFICATE-----

T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet
Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
=============================================================================================================================
-----BEGIN CERTIFICATE-----
MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
-----END CERTIFICATE-----

Buypass Class 2 CA 1
====================
-----BEGIN CERTIFICATE-----
MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
-----END CERTIFICATE-----

EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
==========================================================================
-----BEGIN CERTIFICATE-----
MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
-----END CERTIFICATE-----

certSIGN ROOT CA
================
-----BEGIN CERTIFICATE-----
MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
-----END CERTIFICATE-----

CNNIC ROOT
==========
-----BEGIN CERTIFICATE-----
MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
mxE=
-----END CERTIFICATE-----

ApplicationCA - Japanese Government
===================================
-----BEGIN CERTIFICATE-----
MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
rosot4LKGAfmt1t06SAZf7IbiVQ=
-----END CERTIFICATE-----

GeoTrust Primary Certification Authority - G3
=============================================
-----BEGIN CERTIFICATE-----
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
-----END CERTIFICATE-----

thawte Primary Root CA - G2
===========================
-----BEGIN CERTIFICATE-----
MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
-----END CERTIFICATE-----

thawte Primary Root CA - G3
===========================
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
-----END CERTIFICATE-----

GeoTrust Primary Certification Authority - G2
=============================================
-----BEGIN CERTIFICATE-----
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
npaqBA+K
-----END CERTIFICATE-----

VeriSign Universal Root Certification Authority
===============================================
-----BEGIN CERTIFICATE-----
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
mJO37M2CYfE45k+XmCpajQ==
-----END CERTIFICATE-----

VeriSign Class 3 Public Primary Certification Authority - G4
============================================================
-----BEGIN CERTIFICATE-----
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
-----END CERTIFICATE-----

NetLock Arany (Class Gold) Főtanúsítvány
============================================
-----BEGIN CERTIFICATE-----
MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
-----END CERTIFICATE-----

Staat der Nederlanden Root CA - G2
==================================
-----BEGIN CERTIFICATE-----
MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
66+KAQ==
-----END CERTIFICATE-----

CA Disig
========
-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
4Z7CRneC9VkGjCFMhwnN5ag=
-----END CERTIFICATE-----

Juur-SK
=======
-----BEGIN CERTIFICATE-----
MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
yyqcjg==
-----END CERTIFICATE-----

Hongkong Post Root CA 1
=======================
-----BEGIN CERTIFICATE-----
MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
-----END CERTIFICATE-----

SecureSign RootCA11
===================
-----BEGIN CERTIFICATE-----
MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
-----END CERTIFICATE-----

ACEDICOM Root
=============
-----BEGIN CERTIFICATE-----
MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
-----END CERTIFICATE-----

Microsec e-Szigno Root CA 2009
==============================
-----BEGIN CERTIFICATE-----
MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
LXpUq3DDfSJlgnCW
-----END CERTIFICATE-----

GlobalSign Root CA - R3
=======================
-----BEGIN CERTIFICATE-----
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
kpeDMdmztcpHWD9f
-----END CERTIFICATE-----

Autoridad de Certificacion Firmaprofesional CIF A62634068
=========================================================
-----BEGIN CERTIFICATE-----
MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
-----END CERTIFICATE-----

Izenpe.com
==========
-----BEGIN CERTIFICATE-----
MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
-----END CERTIFICATE-----

Chambers of Commerce Root - 2008
================================
-----BEGIN CERTIFICATE-----
MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
-----END CERTIFICATE-----

Global Chambersign Root - 2008
==============================
-----BEGIN CERTIFICATE-----
MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
-----END CERTIFICATE-----

Go Daddy Root Certificate Authority - G2
========================================
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
-----END CERTIFICATE-----

Starfield Root Certificate Authority - G2
=========================================
-----BEGIN CERTIFICATE-----
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
-----END CERTIFICATE-----

Starfield Services Root Certificate Authority - G2
==================================================
-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
-----END CERTIFICATE-----

AffirmTrust Commercial
======================
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
-----END CERTIFICATE-----

AffirmTrust Networking
======================
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
-----END CERTIFICATE-----

AffirmTrust Premium
===================
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
-----END CERTIFICATE-----

AffirmTrust Premium ECC
=======================
-----BEGIN CERTIFICATE-----
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
eQ==
-----END CERTIFICATE-----

Certum Trusted Network CA
=========================
-----BEGIN CERTIFICATE-----
MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
-----END CERTIFICATE-----

Certinomis - Autorité Racine
=============================
-----BEGIN CERTIFICATE-----
MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
vgt2Fl43N+bYdJeimUV5
-----END CERTIFICATE-----

Root CA Generalitat Valenciana
==============================
-----BEGIN CERTIFICATE-----
MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
-----END CERTIFICATE-----

A-Trust-nQual-03
================
-----BEGIN CERTIFICATE-----
MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
ahq97BvIxYSazQ==
-----END CERTIFICATE-----

TWCA Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
-----END CERTIFICATE-----

Security Communication RootCA2
==============================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE-----

EC-ACC
======
-----BEGIN CERTIFICATE-----
MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
5EI=
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions RootCA 2011
=======================================================
-----BEGIN CERTIFICATE-----
MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
-----END CERTIFICATE-----

Actalis Authentication Root CA
==============================
-----BEGIN CERTIFICATE-----
MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
-----END CERTIFICATE-----

Trustis FPS Root CA
===================
-----BEGIN CERTIFICATE-----
MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
iB6XzCGcKQENZetX2fNXlrtIzYE=
-----END CERTIFICATE-----

StartCom Certification Authority
================================
-----BEGIN CERTIFICATE-----
MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
-----END CERTIFICATE-----

StartCom Certification Authority G2
===================================
-----BEGIN CERTIFICATE-----
MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
obp573PYtlNXLfbQ4ddI
-----END CERTIFICATE-----

Buypass Class 2 Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
rJgWVqA=
-----END CERTIFICATE-----

Buypass Class 3 Root CA
=======================
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
Cp/HuZc=
-----END CERTIFICATE-----

T-TeleSec GlobalRoot Class 3
============================
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
-----END CERTIFICATE-----

EE Certification Centre Root CA
===============================
-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
dcGWxZ0=
-----END CERTIFICATE-----

TURKTRUST Certificate Services Provider Root 2007
=================================================
-----BEGIN CERTIFICATE-----
MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
poRq0Tl9
-----END CERTIFICATE-----

D-TRUST Root Class 3 CA 2 2009
==============================
-----BEGIN CERTIFICATE-----
MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
-----END CERTIFICATE-----

D-TRUST Root Class 3 CA 2 EV 2009
=================================
-----BEGIN CERTIFICATE-----
MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
w9y4AyHqnxbxLFS1
-----END CERTIFICATE-----

PSCProcert
==========
-----BEGIN CERTIFICATE-----
MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
-----END CERTIFICATE-----

China Internet Network Information Center EV Certificates Root
==============================================================
-----BEGIN CERTIFICATE-----
MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
-----END CERTIFICATE-----

Swisscom Root CA 2
==================
-----BEGIN CERTIFICATE-----
MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
5OfNeOI5wSsSnqaeG8XmDtkx2Q==
-----END CERTIFICATE-----

Swisscom Root EV CA 2
=====================
-----BEGIN CERTIFICATE-----
MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
-----END CERTIFICATE-----

CA Disig Root R1
================
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
a7+h89n07eLw4+1knj0vllJPgFOL
-----END CERTIFICATE-----

CA Disig Root R2
================
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
7+ZtsH8tZ/3zbBt1RqPlShfppNcL
-----END CERTIFICATE-----

ACCVRAIZ1
=========
-----BEGIN CERTIFICATE-----
MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
EfbRD0tVNEYqi4Y7
-----END CERTIFICATE-----

TWCA Global Root CA
===================
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
-----END CERTIFICATE-----

TeliaSonera Root CA v1
======================
-----BEGIN CERTIFICATE-----
MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
-----END CERTIFICATE-----

E-Tugra Certification Authority
===============================
-----BEGIN CERTIFICATE-----
MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
C7TbO6Orb1wdtn7os4I07QZcJA==
-----END CERTIFICATE-----

T-TeleSec GlobalRoot Class 2
============================
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
-----END CERTIFICATE-----

Atos TrustedRoot 2011
=====================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
-----END CERTIFICATE-----

QuoVadis Root CA 1 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
hMJKzRwuJIczYOXD
-----END CERTIFICATE-----

QuoVadis Root CA 2 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
O3jtZsSOeWmD3n+M
-----END CERTIFICATE-----

QuoVadis Root CA 3 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
PpxxVJkES/1Y+Zj0
-----END CERTIFICATE-----

DigiCert Assured ID Root G2
===========================
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
IhNzbM8m9Yop5w==
-----END CERTIFICATE-----

DigiCert Assured ID Root G3
===========================
-----BEGIN CERTIFICATE-----
MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
1vUhZscv6pZjamVFkpUBtA==
-----END CERTIFICATE-----

DigiCert Global Root G2
=======================
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
MrY=
-----END CERTIFICATE-----

DigiCert Global Root G3
=======================
-----BEGIN CERTIFICATE-----
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
VOKa5Vt8sycX
-----END CERTIFICATE-----

DigiCert Trusted Root G4
========================
-----BEGIN CERTIFICATE-----
MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
82Z+
-----END CERTIFICATE-----

WoSign
======
-----BEGIN CERTIFICATE-----
MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG
EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g
QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ
BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO
CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX
2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5
KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR
+ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez
EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk
lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2
8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY
yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C
AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R
8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq
T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj
y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC
2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes
5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/
EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh
mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx
kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi
kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==
-----END CERTIFICATE-----

WoSign China
============
-----BEGIN CERTIFICATE-----
MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG
EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv
geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD
VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k
8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5
uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85
dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5
Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy
b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc
76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m
+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6
yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX
GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA
A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY
r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115
j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A
kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97
qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y
jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB
ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv
T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO
kI26oQ==
-----END CERTIFICATE-----

COMODO RSA Certification Authority
==================================
-----BEGIN CERTIFICATE-----
MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
LaZRfyHBNVOFBkpdn627G190
-----END CERTIFICATE-----

USERTrust RSA Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
+T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----

USERTrust ECC Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R4
===========================
-----BEGIN CERTIFICATE-----
MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R5
===========================
-----BEGIN CERTIFICATE-----
MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----

Staat der Nederlanden Root CA - G3
==================================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
-----END CERTIFICATE-----

Staat der Nederlanden EV Root CA
================================
-----BEGIN CERTIFICATE-----
MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
-----END CERTIFICATE-----

IdenTrust Commercial Root CA 1
==============================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
cGzM7vRX+Bi6hG6H
-----END CERTIFICATE-----

IdenTrust Public Sector Root CA 1
=================================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
3Wl9af0AVqW3rLatt8o+Ae+c
-----END CERTIFICATE-----

Entrust Root Certification Authority - G2
=========================================
-----BEGIN CERTIFICATE-----
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
e4pIb4tF9g==
-----END CERTIFICATE-----

Entrust Root Certification Authority - EC1
==========================================
-----BEGIN CERTIFICATE-----
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
-----END CERTIFICATE-----

CFCA EV ROOT
============
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
-----END CERTIFICATE-----

TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
=========================================================
-----BEGIN CERTIFICATE-----
MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
-----END CERTIFICATE-----

TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
=========================================================
-----BEGIN CERTIFICATE-----
MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
-----END CERTIFICATE-----

Certinomis - Root CA
====================
-----BEGIN CERTIFICATE-----
MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
hkIGuUE=
-----END CERTIFICATE-----
libs/twitteroauth/src/Config.php000064400000002741151165347350012763
0ustar00<?php

namespace Abraham\TwitterOAuth;

/**
 * Handle setting and storing config for TwitterOAuth.
 *
 * @author Abraham Williams <abraham@abrah.am>
 */
class Config
{
    /** @var int How long to wait for a response from the API */
    protected $timeout = 5;
    /** @var int how long to wait while connecting to the API */
    protected $connectionTimeout = 5;
    /**
     * Decode JSON Response as associative Array
     *
     * @see http://php.net/manual/en/function.json-decode.php
     *
     * @var bool
     */
    protected $decodeJsonAsArray = false;
    /** @var string User-Agent header */
    protected $userAgent = 'TwitterOAuth
(+https://twitteroauth.com)';
    /** @var array Store proxy connection details */
    protected $proxy = [];

    /**
     * Set the connection and response timeouts.
     *
     * @param int $connectionTimeout
     * @param int $timeout
     */
    public function setTimeouts($connectionTimeout, $timeout)
    {
        $this->connectionTimeout = (int)$connectionTimeout;
        $this->timeout = (int)$timeout;
    }

    /**
     * @param bool $value
     */
    public function setDecodeJsonAsArray($value)
    {
        $this->decodeJsonAsArray = (bool)$value;
    }

    /**
     * @param string $userAgent
     */
    public function setUserAgent($userAgent)
    {
        $this->userAgent = (string)$userAgent;
    }

    /**
     * @param array $proxy
     */
    public function setProxy(array $proxy)
    {
        $this->proxy = $proxy;
    }
}
libs/twitteroauth/src/Consumer.php000064400000001264151165347350013350
0ustar00<?php
/**
 * The MIT License
 * Copyright (c) 2007 Andy Smith
 */
namespace Abraham\TwitterOAuth;

class Consumer
{
    /** @var string  */
    public $key;
    /** @var string  */
    public $secret;
    /** @var string|null  */
    public $callbackUrl;

    /**
     * @param string $key
     * @param string $secret
     * @param null $callbackUrl
     */
    public function __construct($key, $secret, $callbackUrl = null)
    {
        $this->key = $key;
        $this->secret = $secret;
        $this->callbackUrl = $callbackUrl;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return
"Consumer[key=$this->key,secret=$this->secret]";
    }
}
libs/twitteroauth/src/HmacSha1.php000064400000002061151165347350013136
0ustar00<?php
/**
 * The MIT License
 * Copyright (c) 2007 Andy Smith
 */
namespace Abraham\TwitterOAuth;

/**
 * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as
defined in [RFC2104]
 * where the Signature Base String is the text and the key is the
concatenated values (each first
 * encoded per Parameter Encoding) of the Consumer Secret and Token Secret,
separated by an '&'
 * character (ASCII code 38) even if empty.
 *   - Chapter 9.2 ("HMAC-SHA1")
 */
class HmacSha1 extends SignatureMethod
{
    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return "HMAC-SHA1";
    }

    /**
     * {@inheritDoc}
     */
    public function buildSignature(Request $request, Consumer $consumer,
Token $token = null)
    {
        $signatureBase = $request->getSignatureBaseString();

        $parts = [$consumer->secret, null !== $token ? $token->secret
: ""];

        $parts = Util::urlencodeRfc3986($parts);
        $key = implode('&', $parts);

        return base64_encode(hash_hmac('sha1', $signatureBase,
$key, true));
    }
}
libs/twitteroauth/src/Request.php000064400000014062151165347350013205
0ustar00<?php
/**
 * The MIT License
 * Copyright (c) 2007 Andy Smith
 */
namespace Abraham\TwitterOAuth;

class Request
{
    protected $parameters;
    protected $httpMethod;
    protected $httpUrl;
    public static $version = '1.0';

    /**
     * Constructor
     *
     * @param string     $httpMethod
     * @param string     $httpUrl
     * @param array|null $parameters
     */
    public function __construct($httpMethod, $httpUrl, array $parameters =
[])
    {
        $parameters = array_merge(Util::parseParameters(parse_url($httpUrl,
PHP_URL_QUERY)), $parameters);
        $this->parameters = $parameters;
        $this->httpMethod = $httpMethod;
        $this->httpUrl = $httpUrl;
    }

    /**
     * pretty much a helper function to set up the request
     *
     * @param Consumer $consumer
     * @param Token    $token
     * @param string   $httpMethod
     * @param string   $httpUrl
     * @param array    $parameters
     *
     * @return Request
     */
    public static function fromConsumerAndToken(
        Consumer $consumer,
        Token $token = null,
        $httpMethod,
        $httpUrl,
        array $parameters = []
    ) {
        $defaults = [
            "oauth_version" => Request::$version,
            "oauth_nonce" => Request::generateNonce(),
            "oauth_timestamp" => time(),
            "oauth_consumer_key" => $consumer->key
        ];
        if (null !== $token) {
            $defaults['oauth_token'] = $token->key;
        }

        $parameters = array_merge($defaults, $parameters);

        return new Request($httpMethod, $httpUrl, $parameters);
    }

    /**
     * @param string $name
     * @param string $value
     */
    public function setParameter($name, $value)
    {
        $this->parameters[$name] = $value;
    }

    /**
     * @param $name
     *
     * @return string|null
     */
    public function getParameter($name)
    {
        return isset($this->parameters[$name]) ?
$this->parameters[$name] : null;
    }

    /**
     * @return array
     */
    public function getParameters()
    {
        return $this->parameters;
    }

    /**
     * @param $name
     */
    public function removeParameter($name)
    {
        unset($this->parameters[$name]);
    }

    /**
     * The request parameters, sorted and concatenated into a normalized
string.
     *
     * @return string
     */
    public function getSignableParameters()
    {
        // Grab all parameters
        $params = $this->parameters;

        // Remove oauth_signature if present
        // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be
excluded.")
        if (isset($params['oauth_signature'])) {
            unset($params['oauth_signature']);
        }

        return Util::buildHttpQuery($params);
    }

    /**
     * Returns the base string of this request
     *
     * The base string defined as the method, the url
     * and the parameters (normalized), each urlencoded
     * and the concated with &.
     *
     * @return string
     */
    public function getSignatureBaseString()
    {
        $parts = [
            $this->getNormalizedHttpMethod(),
            $this->getNormalizedHttpUrl(),
            $this->getSignableParameters()
        ];

        $parts = Util::urlencodeRfc3986($parts);

        return implode('&', $parts);
    }

    /**
     * Returns the HTTP Method in uppercase
     *
     * @return string
     */
    public function getNormalizedHttpMethod()
    {
        return strtoupper($this->httpMethod);
    }

    /**
     * parses the url and rebuilds it to be
     * scheme://host/path
     *
     * @return string
     */
    public function getNormalizedHttpUrl()
    {
        $parts = parse_url($this->httpUrl);

        $scheme = $parts['scheme'];
        $host = strtolower($parts['host']);
        $path = $parts['path'];

        return "$scheme://$host$path";
    }

    /**
     * Builds a url usable for a GET request
     *
     * @return string
     */
    public function toUrl()
    {
        $postData = $this->toPostdata();
        $out = $this->getNormalizedHttpUrl();
        if ($postData) {
            $out .= '?' . $postData;
        }
        return $out;
    }

    /**
     * Builds the data one would send in a POST request
     *
     * @return string
     */
    public function toPostdata()
    {
        return Util::buildHttpQuery($this->parameters);
    }

    /**
     * Builds the Authorization: header
     *
     * @return string
     * @throws TwitterOAuthException
     */
    public function toHeader()
    {
        $first = true;
        $out = 'Authorization: OAuth';
        foreach ($this->parameters as $k => $v) {
            if (substr($k, 0, 5) != "oauth") {
                continue;
            }
            if (is_array($v)) {
                throw new TwitterOAuthException('Arrays not supported
in headers');
            }
            $out .= ($first) ? ' ' : ', ';
            $out .= Util::urlencodeRfc3986($k) . '="' .
Util::urlencodeRfc3986($v) . '"';
            $first = false;
        }
        return $out;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->toUrl();
    }

    /**
     * @param SignatureMethod $signatureMethod
     * @param Consumer        $consumer
     * @param Token           $token
     */
    public function signRequest(SignatureMethod $signatureMethod, Consumer
$consumer, Token $token = null)
    {
        $this->setParameter("oauth_signature_method",
$signatureMethod->getName());
        $signature = $this->buildSignature($signatureMethod, $consumer,
$token);
        $this->setParameter("oauth_signature", $signature);
    }

    /**
     * @param SignatureMethod $signatureMethod
     * @param Consumer        $consumer
     * @param Token           $token
     *
     * @return string
     */
    public function buildSignature(SignatureMethod $signatureMethod,
Consumer $consumer, Token $token = null)
    {
        return $signatureMethod->buildSignature($this, $consumer,
$token);
    }

    /**
     * @return string
     */
    public static function generateNonce()
    {
        return md5(microtime() . mt_rand());
    }
}
libs/twitteroauth/src/Response.php000064400000004017151165347350013352
0ustar00<?php

namespace Abraham\TwitterOAuth;

/**
 * The result of the most recent API request.
 *
 * @author Abraham Williams <abraham@abrah.am>
 */
class Response
{
    /** @var string|null API path from the most recent request */
    private $apiPath;
    /** @var int HTTP status code from the most recent request */
    private $httpCode = 0;
    /** @var array HTTP headers from the most recent request */
    private $headers = [];
    /** @var array|object Response body from the most recent request */
    private $body = [];
    /** @var array HTTP headers from the most recent request that start
with X */
    private $xHeaders = [];

    /**
     * @param string $apiPath
     */
    public function setApiPath($apiPath)
    {
        $this->apiPath = $apiPath;
    }

    /**
     * @return string|null
     */
    public function getApiPath()
    {
        return $this->apiPath;
    }

    /**
     * @param array|object $body
     */
    public function setBody($body)
    {
        $this->body = $body;
    }

    /**
     * @return array|object|string
     */
    public function getBody()
    {
        return $this->body;
    }

    /**
     * @param int $httpCode
     */
    public function setHttpCode($httpCode)
    {
        $this->httpCode = $httpCode;
    }

    /**
     * @return int
     */
    public function getHttpCode()
    {
        return $this->httpCode;
    }

    /**
     * @param array $headers
     */
    public function setHeaders($headers)
    {
        foreach ($headers as $key => $value) {
            if (substr($key, 0, 1) == 'x') {
                $this->xHeaders[$key] = $value;
            }
        }
        $this->headers = $headers;
    }

    /**
     * @return array
     */
    public function getsHeaders()
    {
        return $this->headers;
    }

    /**
     * @param array $xHeaders
     */
    public function setXHeaders($xHeaders)
    {
        $this->xHeaders = $xHeaders;
    }

    /**
     * @return array
     */
    public function getXHeaders()
    {
        return $this->xHeaders;
    }
}
libs/twitteroauth/src/SignatureMethod.php000064400000003303151165347350014653
0ustar00<?php
/**
 * The MIT License
 * Copyright (c) 2007 Andy Smith
 */
namespace Abraham\TwitterOAuth;

/**
 * A class for implementing a Signature Method
 * See section 9 ("Signing Requests") in the spec
 */
abstract class SignatureMethod
{
    /**
     * Needs to return the name of the Signature Method (ie HMAC-SHA1)
     *
     * @return string
     */
    abstract public function getName();

    /**
     * Build up the signature
     * NOTE: The output of this function MUST NOT be urlencoded.
     * the encoding is handled in OAuthRequest when the final
     * request is serialized
     *
     * @param Request $request
     * @param Consumer $consumer
     * @param Token $token
     *
     * @return string
     */
    abstract public function buildSignature(Request $request, Consumer
$consumer, Token $token = null);

    /**
     * Verifies that a given signature is correct
     *
     * @param Request $request
     * @param Consumer $consumer
     * @param Token $token
     * @param string $signature
     *
     * @return bool
     */
    public function checkSignature(Request $request, Consumer $consumer,
Token $token, $signature)
    {
        $built = $this->buildSignature($request, $consumer, $token);

        // Check for zero length, although unlikely here
        if (strlen($built) == 0 || strlen($signature) == 0) {
            return false;
        }

        if (strlen($built) != strlen($signature)) {
            return false;
        }

        // Avoid a timing leak with a (hopefully) time insensitive compare
        $result = 0;
        for ($i = 0; $i < strlen($signature); $i++) {
            $result |= ord($built{$i}) ^ ord($signature{$i});
        }

        return $result == 0;
    }
}
libs/twitteroauth/src/Token.php000064400000001501151165347350012627
0ustar00<?php
/**
 * The MIT License
 * Copyright (c) 2007 Andy Smith
 */
namespace Abraham\TwitterOAuth;

class Token
{
    /** @var string */
    public $key;
    /** @var string */
    public $secret;

    /**
     * @param string $key    The OAuth Token
     * @param string $secret The OAuth Token Secret
     */
    public function __construct($key, $secret)
    {
        $this->key = $key;
        $this->secret = $secret;
    }

    /**
     * Generates the basic string serialization of a token that a server
     * would respond to request_token and access_token calls with
     *
     * @return string
     */
    public function __toString()
    {
        return
sprintf("oauth_token=%s&oauth_token_secret=%s",
            Util::urlencodeRfc3986($this->key),
            Util::urlencodeRfc3986($this->secret)
        );
    }
}
libs/twitteroauth/src/TwitterOAuth.php000064400000031752151165347350014165
0ustar00<?php
/**
 * The most popular PHP library for use with the Twitter OAuth REST API.
 *
 * @license MIT
 */
namespace Abraham\TwitterOAuth;

use Abraham\TwitterOAuth\Util\JsonDecoder;

/**
 * TwitterOAuth class for interacting with the Twitter API.
 *
 * @author Abraham Williams <abraham@abrah.am>
 */
class TwitterOAuth extends Config
{
    const API_VERSION = '1.1';
    const API_HOST = 'https://api.twitter.com';
    const UPLOAD_HOST = 'https://upload.twitter.com';
    const UPLOAD_CHUNK = 40960; // 1024 * 40

    /** @var Response details about the result of the last request */
    private $response;
    /** @var string|null Application bearer token */
    private $bearer;
    /** @var Consumer Twitter application details */
    private $consumer;
    /** @var Token|null User access token details */
    private $token;
    /** @var HmacSha1 OAuth 1 signature type used by Twitter */
    private $signatureMethod;

    /**
     * Constructor
     *
     * @param string      $consumerKey      The Application Consumer Key
     * @param string      $consumerSecret   The Application Consumer Secret
     * @param string|null $oauthToken       The Client Token (optional)
     * @param string|null $oauthTokenSecret The Client Token Secret
(optional)
     */
    public function __construct($consumerKey, $consumerSecret, $oauthToken
= null, $oauthTokenSecret = null)
    {
        $this->resetLastResponse();
        $this->signatureMethod = new HmacSha1();
        $this->consumer = new Consumer($consumerKey, $consumerSecret);
        if (!empty($oauthToken) && !empty($oauthTokenSecret)) {
            $this->token = new Token($oauthToken, $oauthTokenSecret);
        }
        if (empty($oauthToken) && !empty($oauthTokenSecret)) {
            $this->bearer = $oauthTokenSecret;
        }
    }

    /**
     * @param string $oauthToken
     * @param string $oauthTokenSecret
     */
    public function setOauthToken($oauthToken, $oauthTokenSecret)
    {
        $this->token = new Token($oauthToken, $oauthTokenSecret);
    }

    /**
     * @return string|null
     */
    public function getLastApiPath()
    {
        return $this->response->getApiPath();
    }

    /**
     * @return int
     */
    public function getLastHttpCode()
    {
        return $this->response->getHttpCode();
    }

    /**
     * @return array
     */
    public function getLastXHeaders()
    {
        return $this->response->getXHeaders();
    }

    /**
     * @return array|object|null
     */
    public function getLastBody()
    {
        return $this->response->getBody();
    }

    /**
     * Resets the last response cache.
     */
    public function resetLastResponse()
    {
        $this->response = new Response();
    }

    /**
     * Make URLs for user browser navigation.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return string
     */
    public function url($path, array $parameters)
    {
        $this->resetLastResponse();
        $this->response->setApiPath($path);
        $query = http_build_query($parameters);
        return sprintf('%s/%s?%s', self::API_HOST, $path,
$query);
    }

    /**
     * Make /oauth/* requests to the API.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array
     * @throws TwitterOAuthException
     */
    public function oauth($path, array $parameters = [])
    {
        $response = [];
        $this->resetLastResponse();
        $this->response->setApiPath($path);
        $url = sprintf('%s/%s', self::API_HOST, $path);
        $result = $this->oAuthRequest($url, 'POST',
$parameters);

        if ($this->getLastHttpCode() != 200) {
            throw new TwitterOAuthException($result);
        }

        parse_str($result, $response);
        $this->response->setBody($response);

        return $response;
    }

    /**
     * Make /oauth2/* requests to the API.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    public function oauth2($path, array $parameters = [])
    {
        $method = 'POST';
        $this->resetLastResponse();
        $this->response->setApiPath($path);
        $url = sprintf('%s/%s', self::API_HOST, $path);
        $request = Request::fromConsumerAndToken($this->consumer,
$this->token, $method, $url, $parameters);
        $authorization = 'Authorization: Basic ' .
$this->encodeAppAuthorization($this->consumer);
        $result = $this->request($request->getNormalizedHttpUrl(),
$method, $authorization, $parameters);
        $response = JsonDecoder::decode($result,
$this->decodeJsonAsArray);
        $this->response->setBody($response);
        return $response;
    }

    /**
     * Make GET requests to the API.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    public function get($path, array $parameters = [])
    {
        return $this->http('GET', self::API_HOST, $path,
$parameters);
    }

    /**
     * Make POST requests to the API.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    public function post($path, array $parameters = [])
    {
        return $this->http('POST', self::API_HOST, $path,
$parameters);
    }

    /**
     * Make DELETE requests to the API.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    public function delete($path, array $parameters = [])
    {
        return $this->http('DELETE', self::API_HOST, $path,
$parameters);
    }

    /**
     * Make PUT requests to the API.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    public function put($path, array $parameters = [])
    {
        return $this->http('PUT', self::API_HOST, $path,
$parameters);
    }

    /**
     * Upload media to upload.twitter.com.
     *
     * @param string $path
     * @param array  $parameters
     * @param boolean  $chunked
     *
     * @return array|object
     */
    public function upload($path, array $parameters = [], $chunked = false)
    {
        if ($chunked) {
            return $this->uploadMediaChunked($path, $parameters);
        } else {
            return $this->uploadMediaNotChunked($path, $parameters);
        }
    }

    /**
     * Private method to upload media (not chunked) to upload.twitter.com.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    private function uploadMediaNotChunked($path, $parameters)
    {
        $file = file_get_contents($parameters['media']);
        $base = base64_encode($file);
        $parameters['media'] = $base;
        return $this->http('POST', self::UPLOAD_HOST, $path,
$parameters);
    }

    /**
     * Private method to upload media (chunked) to upload.twitter.com.
     *
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    private function uploadMediaChunked($path, $parameters)
    {
        // Init
        $init = $this->http('POST', self::UPLOAD_HOST, $path,
[
            'command' => 'INIT',
            'media_type' =>
$parameters['media_type'],
            'total_bytes' =>
filesize($parameters['media'])
        ]);
        // Append
        $segment_index = 0;
        $media = fopen($parameters['media'], 'rb');
        while (!feof($media))
        {
            $this->http('POST', self::UPLOAD_HOST,
'media/upload', [
                'command' => 'APPEND',
                'media_id' => $init->media_id_string,
                'segment_index' => $segment_index++,
                'media_data' => base64_encode(fread($media,
self::UPLOAD_CHUNK))
            ]);
        }
        fclose($media);
        // Finalize
        $finalize = $this->http('POST', self::UPLOAD_HOST,
'media/upload', [
            'command' => 'FINALIZE',
            'media_id' => $init->media_id_string
        ]);
        return $finalize;
    }

    /**
     * @param string $method
     * @param string $host
     * @param string $path
     * @param array  $parameters
     *
     * @return array|object
     */
    private function http($method, $host, $path, array $parameters)
    {
        $this->resetLastResponse();
        $url = sprintf('%s/%s/%s.json', $host, self::API_VERSION,
$path);
        $this->response->setApiPath($path);
        $result = $this->oAuthRequest($url, $method, $parameters);
        $response = JsonDecoder::decode($result,
$this->decodeJsonAsArray);
        $this->response->setBody($response);
        return $response;
    }

    /**
     * Format and sign an OAuth / API request
     *
     * @param string $url
     * @param string $method
     * @param array  $parameters
     *
     * @return string
     * @throws TwitterOAuthException
     */
    private function oAuthRequest($url, $method, array $parameters)
    {
        $request = Request::fromConsumerAndToken($this->consumer,
$this->token, $method, $url, $parameters);
        if (array_key_exists('oauth_callback', $parameters)) {
            // Twitter doesn't like oauth_callback as a parameter.
            unset($parameters['oauth_callback']);
        }
        if ($this->bearer === null) {
            $request->signRequest($this->signatureMethod,
$this->consumer, $this->token);
            $authorization = $request->toHeader();
        } else {
            $authorization = 'Authorization: Bearer ' .
$this->bearer;
        }
        return $this->request($request->getNormalizedHttpUrl(),
$method, $authorization, $parameters);
    }

    /**
     * Make an HTTP request
     *
     * @param string $url
     * @param string $method
     * @param string $authorization
     * @param array $postfields
     *
     * @return string
     * @throws TwitterOAuthException
     */
    private function request($url, $method, $authorization, $postfields)
    {
        /* Curl settings */
        $options = [
            // CURLOPT_VERBOSE => true,
            CURLOPT_CAINFO => __DIR__ . DIRECTORY_SEPARATOR .
'cacert.pem',
            CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout,
            CURLOPT_HEADER => true,
            CURLOPT_HTTPHEADER => ['Accept: application/json',
$authorization, 'Expect:'],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_TIMEOUT => $this->timeout,
            CURLOPT_URL => $url,
            CURLOPT_USERAGENT => $this->userAgent,
            CURLOPT_ENCODING => 'gzip',
        ];

        if (!empty($this->proxy)) {
            $options[CURLOPT_PROXY] =
$this->proxy['CURLOPT_PROXY'];
            $options[CURLOPT_PROXYUSERPWD] =
$this->proxy['CURLOPT_PROXYUSERPWD'];
            $options[CURLOPT_PROXYPORT] =
$this->proxy['CURLOPT_PROXYPORT'];
            $options[CURLOPT_PROXYAUTH] = CURLAUTH_BASIC;
            $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
        }

        switch ($method) {
            case 'GET':
                break;
            case 'POST':
                $options[CURLOPT_POST] = true;
                $options[CURLOPT_POSTFIELDS] =
Util::buildHttpQuery($postfields);
                break;
            case 'DELETE':
                $options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
                break;
            case 'PUT':
                $options[CURLOPT_CUSTOMREQUEST] = 'PUT';
                break;
        }

        if (in_array($method, ['GET', 'PUT',
'DELETE']) && !empty($postfields)) {
            $options[CURLOPT_URL] .= '?' .
Util::buildHttpQuery($postfields);
        }


        $curlHandle = curl_init();
        curl_setopt_array($curlHandle, $options);
        $response = curl_exec($curlHandle);

        // Throw exceptions on cURL errors.
        if (curl_errno($curlHandle) > 0) {
            throw new TwitterOAuthException(curl_error($curlHandle),
curl_errno($curlHandle));
        }

        $this->response->setHttpCode(curl_getinfo($curlHandle,
CURLINFO_HTTP_CODE));
        $parts = explode("\r\n\r\n", $response);
        $responseBody = array_pop($parts);
        $responseHeader = array_pop($parts);
       
$this->response->setHeaders($this->parseHeaders($responseHeader));

        curl_close($curlHandle);

        return $responseBody;
    }

    /**
     * Get the header info to store.
     *
     * @param string $header
     *
     * @return array
     */
    private function parseHeaders($header)
    {
        $headers = [];
        foreach (explode("\r\n", $header) as $line) {
            if (strpos($line, ':') !== false) {
                list ($key, $value) = explode(': ', $line);
                $key = str_replace('-', '_',
strtolower($key));
                $headers[$key] = trim($value);
            }
        }
        return $headers;
    }

    /**
     * Encode application authorization header with base64.
     *
     * @param Consumer $consumer
     *
     * @return string
     */
    private function encodeAppAuthorization($consumer)
    {
        // TODO: key and secret should be rfc 1738 encoded
        $key = $consumer->key;
        $secret = $consumer->secret;
        return base64_encode($key . ':' . $secret);
    }
}
libs/twitteroauth/src/TwitterOAuthException.php000064400000000222151165347350016030
0ustar00<?php

namespace Abraham\TwitterOAuth;

/**
 * @author Abraham Williams <abraham@abrah.am>
 */
class TwitterOAuthException extends \Exception
{
}
libs/twitteroauth/src/Util.php000064400000006532151165347350012475
0ustar00<?php
/**
 * The MIT License
 * Copyright (c) 2007 Andy Smith
 */
namespace Abraham\TwitterOAuth;

class Util
{
    /**
     * @param $input
     *
     * @return array|mixed|string
     */
    public static function urlencodeRfc3986($input)
    {
        $output = '';
        if (is_array($input)) {
            $output = array_map([__NAMESPACE__ . '\Util',
'urlencodeRfc3986'], $input);
        } elseif (is_scalar($input)) {
            $output = rawurlencode($input);
        }
        return $output;
    }

    /**
     * @param string $string
     *
     * @return string
     */
    public static function urldecodeRfc3986($string)
    {
        return urldecode($string);
    }

    /**
     * This function takes a input like a=b&a=c&d=e and returns the
parsed
     * parameters like this
     * array('a' => array('b','c'),
'd' => 'e')
     *
     * @param mixed $input
     *
     * @return array
     */
    public static function parseParameters($input)
    {
        if (!isset($input) || !$input) {
            return [];
        }

        $pairs = explode('&', $input);

        $parameters = [];
        foreach ($pairs as $pair) {
            $split = explode('=', $pair, 2);
            $parameter = Util::urldecodeRfc3986($split[0]);
            $value = isset($split[1]) ? Util::urldecodeRfc3986($split[1]) :
'';

            if (isset($parameters[$parameter])) {
                // We have already recieved parameter(s) with this name, so
add to the list
                // of parameters with this name

                if (is_scalar($parameters[$parameter])) {
                    // This is the first duplicate, so transform scalar
(string) into an array
                    // so we can add the duplicates
                    $parameters[$parameter] = [$parameters[$parameter]];
                }

                $parameters[$parameter][] = $value;
            } else {
                $parameters[$parameter] = $value;
            }
        }
        return $parameters;
    }

    /**
     * @param $params
     *
     * @return string
     */
    public static function buildHttpQuery($params)
    {
        if (!$params) {
            return '';
        }

        // Urlencode both keys and values
        $keys = Util::urlencodeRfc3986(array_keys($params));
        $values = Util::urlencodeRfc3986(array_values($params));
        $params = array_combine($keys, $values);

        // Parameters are sorted by name, using lexicographical byte value
ordering.
        // Ref: Spec: 9.1.1 (1)
        uksort($params, 'strcmp');

        $pairs = [];
        foreach ($params as $parameter => $value) {
            if (is_array($value)) {
                // If two or more parameters share the same name, they are
sorted by their value
                // Ref: Spec: 9.1.1 (1)
                // June 12th, 2010 - changed to sort because of issue 164
by hidetaka
                sort($value, SORT_STRING);
                foreach ($value as $duplicateValue) {
                    $pairs[] = $parameter . '=' .
$duplicateValue;
                }
            } else {
                $pairs[] = $parameter . '=' . $value;
            }
        }
        // For each parameter, the name is separated from the corresponding
value by an '=' character (ASCII code 61)
        // Each name-value pair is separated by an '&'
character (ASCII code 38)
        return implode('&', $pairs);
    }
}
libs/twitteroauth/src/Util/JsonDecoder.php000064400000001136151165347350014667
0ustar00<?php

namespace Abraham\TwitterOAuth\Util;

/**
 * @author louis <louis@systemli.org>
 */
class JsonDecoder
{
    /**
     * Decodes a JSON string to stdObject or associative array
     *
     * @param string $string
     * @param bool   $asArray
     *
     * @return array|object
     */
    public static function decode($string, $asArray)
    {
        if (version_compare(PHP_VERSION, '5.4.0',
'>=') && !(defined('JSON_C_VERSION')
&& PHP_INT_SIZE > 4)) {
            return json_decode($string, $asArray, 512,
JSON_BIGINT_AS_STRING);
        }

        return json_decode($string, $asArray);
    }
}
models/connection.php000064400000025042151165347400010710 0ustar00<?php
/**
 * Fabrik Connection Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Version;
use Joomla\Database\DatabaseDriver;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.model');

/**
 * Fabrik Connection Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikFEModelConnection extends FabModel
{
	/**
	 * Current connection
	 *
	 * @var Table
	 */
	protected $connection = null;

	/**
	 * Default connection table
	 *
	 * @var Table
	 */
	protected $defaultConnection = null;

	/**
	 * Containing db connections
	 *
	 * @var array
	 */
	protected static $dbs = array();

	/**
	 * Connection id
	 *
	 * @var int
	 */
	protected $id = null;

	/**
	 * Method to set the element id
	 *
	 * @param   int  $id  element ID number
	 *
	 * @return  null
	 */
	public function setId($id)
	{
		// Set new element ID
		$this->id = $id;
	}

	/**
	 * Test if the connection is exactly the same as Joomla's db
connection as
	 * defined in configuration.php
	 *
	 * @since  3.0.8
	 *
	 * @return boolean  True if the same
	 */
	public function isJdb()
	{
		// $$$rob lets see if we have an exact config match with J db if so just
return that
		$conf = $this->config;
		$host = $conf->get('host');
		$user = $conf->get('user');
		$password = $conf->get('password');
		$database = $conf->get('db');
		$prefix = $conf->get('dbprefix');
		$driver = $conf->get('dbtype');

		$default_options = array('driver' => $driver,
'host' => $host, 'user' => $user,
'password' => $password, 'database' => $database,
				'prefix' => $prefix);

		$cn = $this->getConnection();
		$options = $this->getConnectionOptions($cn);

		return $this->compareConnectionOpts($default_options, $options);
	}

	/**
	 * Get driver instance based on J version
	 *
	 * @param   array  $options  Connection options
	 *
	 * @since  3.1b2
	 *
	 * @return  JDatabaseDriver|JDatabase
	 */
	public function getDriverInstance($options)
	{
		return DatabaseDriver::getInstance($options);
	}

	/**
	 * Decrypt once a connection password - if its params->encryptedPw
option is true
	 *
	 * @param   Table  &FabrikTableConnection  Connection
	 *
	 * @since   3.1rc1
	 *
	 * @return  void
	 */
	protected function decryptPw(&$cnn)
	{
		if (isset($cnn->decrypted) && $cnn->decrypted)
		{
			return;
		}

		$crypt = FabrikWorker::getCrypt();
		$params = json_decode($cnn->params);

		if (is_object($params) && $params->encryptedPw == true)
		{
			$cnn->password = $crypt->decrypt($cnn->password);
			$cnn->decrypted = true;
		}
	}

	/**
	 * Get a connection table object
	 *
	 * @param   int  $id  connection id
	 *
	 * @return  FabrikTableConnection  Connection tables
	 */
	public function &getConnection($id = null)
	{
		if (!is_null($id))
		{
			$this->setId($id);
		}

		if (!is_object($this->connection))
		{
			if ($this->id == -1 || $this->id == '' || $this->id
== 0)
			{
				$this->connection = $this->loadDefaultConnection();
			}
			else
			{
				$this->connection = FabTable::getInstance('Connection',
'FabrikTable');
				$this->connection->load($this->id);
			}

			$this->decryptPw($this->connection);
		}

		if ($this->connection->get('published') != '1')
		{
			throw new RuntimeException('Connection ID #' .
$this->connection->get('id') . ' is unpublished or
trashed', E_ERROR);
		}

		return $this->connection;
	}

	/**
	 * Load the connection associated with the table
	 *
	 * @return  object  database object using connection details false if
connection error
	 */
	public function &getDb()
	{
		if (!isset(self::$dbs))
		{
			self::$dbs = array();
		}

		$error = false;
		$cn = $this->getConnection();
		$input = $this->app->getInput();

		if ($input->get('task') == 'test')
		{
			self::$dbs = array();
			$this->connection = null;
			$cn = $this->getConnection();
		}

		if (!array_key_exists($cn->id, self::$dbs))
		{
			if ($this->isJdb())
			{
				$db = FabrikWorker::getDbo();
			}
			else
			{
				$options = $this->getConnectionOptions($cn);
				$db = $this->getDriverInstance($options);
			}

			try
			{
				$db->connect();
			}
			catch (RuntimeException $e)
			{
				$error = true;
			}

			self::$dbs[$cn->id] = $db;

			if ($error)
			{
				/**
				 * $$$Rob - not sure why this is happening on badmintonrochelais.com
(mySQL 4.0.24) but it seems like
				 * you can only use one connection on the site? As
JDatabase::getInstance() forces a new connection if its options
				 * signature is not found, then fabrik's default connection
won't be created, hence defaulting to that one
				 */
				if ($cn->default == 1 && $input->get('task')
!== 'test')
				{
					self::$dbs[$cn->id] = FabrikWorker::getDbo();
					
					/*Throw meaningful error message*/
					if (!self::$dbs[$cn->id]->connect()) {
						$eMessage = JDEBUG ? $e->getMessage() : '';
						throw new RuntimeException($eMessage.' Fabrik could not connect
to database cid = ' . $cn->id );
					}

					// $$$rob remove the error from the error stack
					// if we don't do this the form is not rendered
					//JError::getError(true);
				}
				else
				{
					if (!$this->app->isClient('administrator'))
					{
						throw new RuntimeException('Fabrik could not connect to
database', E_ERROR);
					}
					else
					{
						// $$$ rob - unset the connection as caching it will mean that
changes we make to the incorrect connection in admin, will not result
						// in the test connection link informing the user that the changed
connection properties are now correct
						if ($input->get('task') == 'test')
						{
							$this->connection = null;
							$level = E_NOTICE;
						}
						else
						{
							$level = E_ERROR;
						}

						throw new RuntimeException('Fabrik could not connect to database
cid = ' . $cn->id, $level);
					}
				}
			}
		}

		return self::$dbs[$cn->id];
	}

	/**
	 * Strip the _fab off of a driver name, to get the standard J! driver name
	 *
	 * Really just a wrapper round a helper rtrimword(), but wanted to make
it'
	 * clear what it's doing.
	 *
	 * @param   string  $driverName  Database driver name
	 *
	 * @return string
	 */
	private function getBaseDriverName($driverName = '')
	{
		return FabrikString::rtrimword($driverName, '_fab');
	}

	/**
	 * Compare two arrays of connection details. Ignore prefix as this may be
set to '' if using koowna
	 *
	 * @param   array  $opts1  first compare
	 * @param   array  $opts2  second compare
	 *
	 * @return  bool
	 */
	private function compareConnectionOpts($opts1, $opts2)
	{
		/**
		 * $$$ hugh - this is returning false when one of the options are
defaults from the J! config, and the other is an
		 * actual connection, where the driver is (say) mysqli vs mysqli_fab. 
The J! config will never have the _fab driver
		 * specified, so I'm pretty sure we want to strip that off, and just
compare the base type.
		 */

		return (
			$this->getBaseDriverName($opts1['driver']) ==
$this->getBaseDriverName($opts2['driver'])
			&& $opts1['host'] == $opts2['host']
			&& $opts1['user'] == $opts2['user']
			&& $opts1['password'] == $opts2['password']
			&& $opts1['database'] == $opts2['database']
		);
	}

	/**
	 * Get the options to connect to a db
	 *
	 * @param   object  &$cn  connection table
	 *
	 * @return  array  connection options
	 */
	public function getConnectionOptions(&$cn)
	{
		$conf = $this->config;
		$host = $cn->host;
		$user = $cn->user;
		$password = $cn->password;
		$database = $cn->database;
		$prefix = $conf->get('dbprefix');
		$driver = $conf->get('dbtype');

		// Test for swapping db table names
		$options = array('driver' => $driver, 'host' =>
$host, 'user' => $user, 'password' => $password,
'database' => $database, 'prefix' => $prefix);

		return $options;
	}

	/**
	 * Gets object of connections
	 *
	 * @return  array  of connection tables id, description
	 */
	public function getConnections()
	{
		$db = FabrikWorker::getDbo();
		$query = $db->getQuery(true);
		$query->select('*, id AS value, description AS
text')->from('#__fabrik_connections')->where('published
= 1');
		$db->setQuery($query);
		$connections = $db->loadObjectList();

		foreach ($connections as &$cnn)
		{
			$this->decryptPw($cnn);
		}

		return $connections;
	}

	/**
	 * Queries all published connections and returns an multidimensional array
	 * of tables for each connection
	 *
	 * @param   array  $connections  all available connections
	 *
	 * @return  array
	 */
	public function getConnectionTables($connections)
	{
		$connectionTables = array();
		$connectionTables[-1] = array();
		$connectionTables[-1][] = HTMLHelper::_('select.option',
'-1', Text::_('COM_FABRIK_PLEASE_SELECT'));

		foreach ($connections as $cn)
		{
			$connectionTables[$cn->value] = array();

			if ($cn->host and $cn->published == '1')
			{
				$this->connection = null;
				$this->id = $cn->id;
				$fabrikDb = $this->getDb();
				$tables = $fabrikDb->getTableList();
				$connectionTables[$cn->value][] =
HTMLHelper::_('select.option', '', '- Please
select -');

				if (is_array($tables))
				{
					foreach ($tables as $table)
					{
						$connectionTables[$cn->value][] =
HTMLHelper::_('select.option', $table, $table);
					}
				}
			}
		}

		return $connectionTables;
	}

	/**
	 * Get the tables names in the loaded connection
	 *
	 * @param   bool  $addBlank  add an empty record to the beginning of the
list
	 *
	 * @return array tables
	 */
	public function getThisTables($addBlank = false)
	{
		$this->getConnection();
		$fabrikDb = $this->getDb();
		$tables = $fabrikDb->getTableList();
		if (is_array($tables))
		{
			if ($addBlank)
			{
				$tables = array_merge(array(""), $tables);
			}

			return $tables;
		}
		else
		{
			return array();
		}
	}

	/**
	 * Tests if you can connect to the connection
	 *
	 * @return  bool  true if connection made otherwise false
	 */
	public function testConnection()
	{
		try
		{
			$this->getDb();
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Load the default connection
	 *
	 * @return  FabrikTableConnection  default connection
	 */
	public function &loadDefaultConnection()
	{
		if (!$this->defaultConnection)
		{
			// $$$ rob connections are pooled for all packages - each package should
use
			// jos_fabrik_connections and not jos_fabrik_connections
			$row = FabTable::getInstance('Connection',
'FabrikTable');
			$row->load(array('default' => 1));
			$this->decryptPw($row);
			$this->defaultConnection = $row;
		}

		$this->connection = $this->defaultConnection;

		return $this->defaultConnection;
	}
}
models/csvexport.php000064400000042433151165347400010611 0ustar00<?php
/**
 * CSV Export Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\Utilities\ArrayHelper;
use Fabrik\Helpers\Html;
use Joomla\String\StringHelper;

jimport('joomla.application.component.model');

/**
 * CSV Export Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikFEModelCSVExport extends FabModel
{
	/**
	 * Number of records to output at a time
	 *
	 * @var int
	 */
	public $step = 100;

	/**
	 * Out put format
	 *
	 * @var string
	 */
	public $outPutFormat = 'csv';

	/**
	 * Cell delimiter
	 *
	 * @var string
	 */
	protected $delimiter = ';';

	/**
	 * @var FabrikFEModelList
	 */
	public $model;

	/**
	 * Get csv export step from params or URL
	 *
	 * @return  integer  Export step
	 */
	public function getStep()
	{
		$input = $this->app->getInput();
		$step_param =
$this->model->getParams()->get('csv_export_step',
$this->step);
		$step_url = $input->get('csv_export_step', $step_param);
		return (int) $step_url;
	}

	/**
	 * Write the current batch section of the CSV file
	 *
	 * @param   int  $total       Total # of records
	 * @param   bool $canDownload Can we also download the file (at end of
export)
	 *
	 * @return  null
	 */
	public function writeFile($total, $canDownload = false)
	{
		$params = $this->model->getParams();
		$input = $this->app->getInput();

		// F3 turn off error reporting as this is an ajax call
		error_reporting(0);
		jimport('joomla.filesystem.file');
		$start    = $input->getInt('start', 0);
		$filePath = $this->getFilePath();
		$str      = '';

		if (File::exists($filePath))
		{
			if ($start === 0)
			{
				File::delete($filePath);
			}
			else
			{
				$str = file_get_contents($filePath);
			}
		}
		else
		{
			// Fabrik3 odd cant pass 2nd param by reference if we try to write
'' so assign it to $tmp first
			$tmp = '';
			$ok  = File::write($filePath, $tmp);

			if (!$ok)
			{
				$this->reportWriteError($filePath);
				exit;
			}

			// with UTF8 Excel needs BOM
			$str = ( $input->get('excel') == 1 &&
$this->getEncoding() == 'UTF-8' ) ? "\xEF\xBB\xBF" :
'';
		}

		$table = $this->model->getTable();
		$this->model->render();
		$this->removePkVal();
		$this->outPutFormat = $input->get('excel') == 1 ?
'excel' : 'csv';
		$config             = ComponentHelper::getParams('com_fabrik');
		$this->delimiter    = $this->outPutFormat == 'excel' ?
COM_FABRIK_EXCEL_CSV_DELIMITER : COM_FABRIK_CSV_DELIMITER;
		$this->delimiter    = $config->get('csv_delimiter',
$this->delimiter);
		$local_delimiter    =
$this->model->getParams()->get('csv_local_delimiter');
		if ($local_delimiter != '') {
			$this->delimiter = $local_delimiter;
		}
		if ($this->delimiter === '\t') {
			$this->delimiter = "\t";
		}
		$end_of_line		=
$this->model->getParams()->get('csv_end_of_line');
		if ($end_of_line == 'r') {
			$end_of_line = "\r";
		}
		else {
			$end_of_line = "\n";
		}
		if ($start === 0)
		{
			$headings = $this->getHeadings();

			if (empty($headings))
			{
				$url = $input->server->get('HTTP_REFERER',
'');
				$this->app->enqueueMessage(Text::_('No data to
export'));
				$this->app->redirect($url);

				return;
			}

			$str .= implode($this->delimiter, $headings) . $end_of_line;
		}

		$incRaw       = $input->get('incraw', true);
		$incData      = $input->get('inctabledata', true);
		$data         = $this->model->getData();
		$exportFormat =
$this->model->getParams()->get('csvfullname');
		$shortKey     = FabrikString::shortColName($table->db_primary_key);
		$a            = array();

		foreach ($data as $group)
		{
			foreach ($group as $row)
			{
				$a = ArrayHelper::fromObject($row);

				if ($exportFormat == 1)
				{
					unset($a[$shortKey]);
				}

				if (!$incRaw)
				{
					foreach ($a as $key => $val)
					{
						if (substr($key, StringHelper::strlen($key) - 4,
StringHelper::strlen($key)) == '_raw')
						{
							unset($a[$key]);
						}
					}
				}

				if (!$incData)
				{
					foreach ($a as $key => $val)
					{
						if (substr($key, StringHelper::strlen($key) - 4,
StringHelper::strlen($key)) != '_raw')
						{
							unset($a[$key]);
						}
					}
				}

				if ($incData && $incRaw)
				{
					foreach ($a as $key => $val)
					{
						// Remove Un-needed repeat join element values.
						if (array_key_exists($key . '___params', $a))
						{
							unset($a[$key . '___params']);
						}

						if (array_key_exists($key . '_id', $a))
						{
							unset($a[$key . '_id']);
						}
					}
				}

				if ($input->get('inccalcs') == 1)
				{
					array_unshift($a, ' ');
				}

				$this->carriageReturnFix($a);

				if ($params->get('csv_format_json', '1') ===
'1')
				{
					array_walk($a, array($this, 'implodeJSON'), $end_of_line);
				}

				$this->model->csvExportRow = $a;
				$pluginResults =
FabrikWorker::getPluginManager()->runPlugins('onExportCSVRow',
$this->model, 'list', $a);
				if (in_array(false, $pluginResults))
				{
					continue;
				}
				else
				{
					$a = $this->model->csvExportRow;
				}

				$str .= implode($this->delimiter, array_map(array($this,
'quote'), array_values($a)));
				$str .= $end_of_line;
			}
		}

		$res              = new stdClass;
		$res->total       = $total;
		$res->count       = $start + $this->getStep();
		$res->file        = basename($filePath);
		$res->limitStart  = $start;
		$res->limitLength = $this->getStep();

		if ($res->count >= $res->total)
		{
			$this->addCalculations($a, $str);
		}

		error_reporting(0);
		$ok = File::write($filePath, $str);

		if (!$ok)
		{
			$this->reportWriteError($filePath);
			exit;
		}
		else
		{
			if (!$canDownload)
			{
				echo json_encode($res);
			}
		}
	}

	/**
	 * Format JSON data
	 */
	protected function implodeJSON(&$v, $k, $sepchar)
	{
		if (!FabrikString::isRawName($k) && FabrikWorker::isJSON($v))
		{
			$v = FabrikWorker::JSONtoData($v, true);
			$v = implode($sepchar, $v);
		}
	}

	/**
	 * Report a error writing the file
	 *
	 * @param   string $filePath file path we were trying to write to
	 *
	 * @return  null
	 */
	protected function reportWriteError($filePath)
	{
		$o      = new stdClass;
		$o->err = 'cant write file ' . $filePath;
		echo json_encode($o);
	}

	/**
	 * Fix carriage returns
	 *
	 * @param   object|array &$row Csv line of data to fix
	 *
	 * @return  null
	 */
	private function carriageReturnFix(&$row)
	{
		$newline =
$this->model->getParams()->get('newline_csv_export',
'nl');

		switch ($newline)
		{
			default:
			case 'nl2br':
				if (is_array($row))
				{
					foreach ($row as &$val)
					{
						$val = nl2br($val);
						$val = str_replace(array("\n", "\r",
"\n\r", "\r\n"), '', $val);
					}
				}
				else
				{
					$row = nl2br($row);
					$row = str_replace(array("\n", "\r",
"\n\r", "\r\n"), '', $row);
				}

				break;
			case 'nl':
				break;
			case 'remove':
				if (is_array($row))
				{
					foreach ($row as &$val)
					{
						$val = str_replace(array("\n", "\r",
"\n\r", "\r\n"), '', $val);
					}
				}
				else
				{
					$row = str_replace(array("\n", "\r",
"\n\r", "\r\n"), '', $row);
				}

				break;
		}
	}

	/**
	 * Get the file name to save the csv data to
	 *
	 * @return  string  filename
	 */
	private function getFileName()
	{
		$this->model->setId($this->app->getInput()->getInt('listid'));

		$filename = Html::getLayout('fabrik-csv-filename')
			->render((object) array(
				'model' => $this->model,
				'filename' =>
$this->model->getParams()->get('csv_filename')
			));
		return $filename;
	}

	/**
	 * Get the tmp folder to store the csv file in
	 *
	 * @return  string  path
	 */
	private function getFilePath()
	{
		return $this->config->get('tmp_path') . '/' .
$this->getFileName();
	}

	/**
	 * Write the final csv file
	 */
	public function writeCSVFile()
	{
		$filePath = $this->getFilePath();
		$str      = $this->getCSVContent();
		File::delete($filePath);
		echo $str;
		exit;
	}

	/**
	 * Get the final CSV content
	 *
	 * @return bool
	 */
	protected function getCSVContent()
	{
		$filePath = $this->getFilePath();

		if (File::exists($filePath))
		{
			$str = file_get_contents($filePath);
		}
		else
		{
			// If we cant find the file then don't try to auto download it
			return false;
		}

		return $str;
	}

	/**
	 * Start the download of the completed csv file
	 *
	 * @return null
	 */
	public function downloadFile()
	{
		// To prevent long file from getting cut off from    
//max_execution_time
		//error_reporting(0);
		@set_time_limit(0);
		jimport('joomla.filesystem.file');
		$filename = $this->getFileName();
		$filePath = $this->getFilePath();
		// Do additional processing if post-processing php file exists
		$listid = $this->app->getInput()->getInt('listid');
		// Allows for custom csv file processing. Included php file should kill
php processing
		// with die; or exit; to prevent continuation of this script (normal
download). See Wiki.
		if(file_exists(JPATH_PLUGINS.'/fabrik_list/listcsv/scripts/list_'.$listid.'_csv_export.php')){	
  
			require(JPATH_PLUGINS.'/fabrik_list/listcsv/scripts/list_'.$listid.'_csv_export.php');
		}
		$document = Factory::getDocument();
		//$document->setMimeEncoding('application/zip');
		$document->setMimeEncoding('text/csv');
		$str = $this->getCSVContent();
		$this->app->clearHeaders();
		$encoding = $this->getEncoding();

		// Set the response to indicate a file download
		//$this->app->setHeader('Content-Type',
'application/zip');
		$this->app->setHeader('Content-Type',
'text/csv');
		$this->app->setHeader('Content-Disposition',
"attachment;filename=\"" . $filename . "\"");

		// Xls formatting for accents
		if ($this->outPutFormat == 'excel')
		{
			$this->app->setHeader('Content-Type',
'application/vnd.ms-excel');
		}

		$this->app->setHeader('charset', $encoding);
		$this->app->setBody($str);
		echo $this->app->toString(false);
		File::delete($filePath);
		// $$$ rob 21/02/2012 - need to exit otherwise Chrome give 349 download
error
		exit;
	}

	/**
	 * Add calculations
	 *
	 * @param   array  $a    of field elements $a
	 * @param   string &$str to out put as csv file $str
	 *
	 * @return  null
	 */
	protected function addCalculations($a, &$str)
	{
		$input = $this->app->getInput();

		if ($input->get('inccalcs') == 1)
		{
			$incRaw  = $input->get('incraw', true);
			$calKeys = array('sums', 'avgs',
'medians', 'count');

			foreach ($calKeys as $calKey)
			{
				$calculations[$calKey]    = FArrayHelper::array_fill(0, count($a) + 1,
' ');
				$calculations[$calKey][0] = $calKey;
				$calcs                    = $this->model->getCalculations();

				foreach ($calcs[$calKey] as $key => $cal)
				{
					$x     = 0;
					$found = false;

					// $$$rob if grouped data and calc split then get the formatted string
as $cal['calc] wont exist below
					foreach ($a as $aKey => $aVal)
					{
						if (trim($aKey) == trim($key) && $x != 0)
						{
							$json = $calcs[$calKey][$aKey . '_obj'];
							unset($json['']);

							if (count($json) == 1)
							{
								$default = $defaultRaw = $json['Total']->value;
							}
							else
							{
								$default = strip_tags($calcs[$calKey][$aKey]);
								$defaultRaw = json_encode($json);
							}
						}

						$x++;
					}

					$x = 0;

					foreach ($a as $aKey => $aVal)
					{
						if ($aKey == StringHelper::substr($key, 0, StringHelper::strlen($key)
- 4) && $x != 0)
						{
							$found = true;
							break;
						}

						$x++;
					}

					if ($found)
					{
						if (array_key_exists('calc', $cal))
						{
							$calculations[$calKey][$x] = $cal['calc']->value;

							if ($incRaw)
							{
								$calculations[$calKey][$x + 1] = $cal['calc']->value;
							}
						}
						else
						{
							$calculations[$calKey][$x] = $default;

							if ($incRaw)
							{
								$calculations[$calKey][$x + 1] = $defaultRaw;
							}
						}
					}
				}

				$str .= implode($this->delimiter, array_map(array($this,
'quote'), $calculations[$calKey]));
				$str .= "\n";
			}
		}
	}

	/**
	 * Quote a string
	 *
	 * @param   string $n string to quote
	 *
	 * @return  string
	 */
	protected function quote($n)
	{
		$cleanhtml =
$this->model->getParams()->get('csv_clean_html',
'leave');
		
		switch ($cleanhtml)
		{
			default:
			case 'leave':
				break;
			
			case 'remove':
				$n = strip_tags($n);
				$n =  html_entity_decode($n);
				break;
				
			case 'replaceli':
				$n = str_replace ('<li>', '', $n);
				$n = str_replace ('</li>', "\n", $n);
				$n = strip_tags($n);
				$n =  html_entity_decode($n);
				break;
		}
		
		$doubleQuote  =
$this->model->getParams()->get('csv_double_quote',
'1') === '1';
		if ($doubleQuote == true)
		{
			$n = '"' . str_replace('"',
'""', $n) . '"';
		}

		$csvEncoding = $this->getEncoding();

		// $$$ hugh - func won't exist if PHP wasn't built with MB
string
		if (!function_exists('mb_convert_encoding') || $csvEncoding ===
'UTF-8')
		{
			return $n;
		}

		if (function_exists('iconv'))
		{
			$res = iconv('UTF-8', $csvEncoding, $n);
			//$$$ trob: if iconv returns false try mb_convert instead of returning
an empty field
			if ($res !== false) return $res;
		}
		return mb_convert_encoding($n, $csvEncoding, 'UTF-8');
	}

	/**
	 * Get the encoding e.g. UFT-8 for which to encode the text and set the
document charset
	 * header on download
	 *
	 * @return string
	 */
	protected function getEncoding()
	{
		$params          = $this->model->getParams();
		$defaultEncoding = $this->outPutFormat == 'excel' ?
'UTF-16LE' : 'UTF-8';
		$csvEncoding     = $params->get('csv_encoding',
'');

		if ($csvEncoding === '')
		{
			$csvEncoding = $defaultEncoding;
		}

		return $csvEncoding;
	}

	/**
	 * Get the headings for the csv file
	 *
	 * @return  array    heading labels
	 */
	public function getHeadings()
	{
		$input         = $this->app->getInput();
		$w             = new FabrikWorker;
		$table         = $this->model->getTable();
		$params        = $this->model->getParams();
		$headingFormat = $params->get('csvfullname');
		$data          = $this->model->getData();
		$g             = current($data);

		if (empty($g))
		{
			return $g;
		}

		$r         = current($g);
		$formModel = $this->model->getFormModel();
		$groups    = $formModel->getGroupsHiarachy();
		$h         = array();

		if (!is_object($r))
		{
			return new stdClass;
		}

		$incRaw  = $input->get('incraw', true);
		$incData = $input->get('inctabledata', true);

		$shortKey = FabrikString::shortColName($table->db_primary_key);

		foreach ($r as $heading => $value)
		{
			$found = false;

			foreach ($groups as $groupModel)
			{
				$elementModels = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					$element  = $elementModel->getElement();
					$fullName = $elementModel->getFullName(true, false);

					if ($fullName == $heading || $fullName . '_raw' == $heading)
					{
						$found = true;

						switch ($headingFormat)
						{
							default:
							case '0':
								$n = $element->name;
								break;
							case '1':
								$n = $elementModel->getFullName(false, false);
								break;
							case '2':
								$n = $elementModel->getListHeading();
								break;
						}

						/**
						 * $$$ hugh - added next line as special case for a client, do not
remove!
						 * (used in conjunction with "Custom QS" option, to allow
variable header labels
						 */
						$n = $w->parseMessageForPlaceHolder($n, array());

						if ($fullName . '_raw' == $heading)
						{
							$n .= '_raw';
						}

						if ($incData && StringHelper::substr($n,
StringHelper::strlen($n) - 4, StringHelper::strlen($n)) !==
'_raw')
						{
							if (!in_array($n, $h))
							{
								// Only add heading once
								$h[] = $n;
							}
							else
							{
								$h[] = $this->uniqueHeading($n, $h);
							}
						}

						if ($incRaw && StringHelper::substr($n,
StringHelper::strlen($n) - 4, strlen($n)) == '_raw')
						{
							if (!in_array($n, $h))
							{
								// Only add heading once
								$h[] = $n;
							}
							else
							{
								$h[] = $this->uniqueHeading($n, $h);
							}
						}
					}
				}
			}

			if (!$found)
			{
				if (!(StringHelper::substr($heading, StringHelper::strlen($heading) -
4, StringHelper::strlen($heading)) == '_raw' &&
!$incRaw))
				{
					// Stop id getting added to tables when exported with full element
name key
					if ($headingFormat != 1 && $heading != $shortKey)
					{
						$h[] = $heading;
					}
				}
			}
		}

		if ($input->get('inccalcs') == 1)
		{
			array_unshift($h, Text::_('Calculation'));
		}

		$this->model->csvExportHeadings = $h;
		$pluginResults =
FabrikWorker::getPluginManager()->runPlugins('onExportCSVHeadings',
$this->model, 'list', $h);
		if (in_array(false, $pluginResults))
		{
			return false;
		}
		else
		{
			$h = $this->model->csvExportHeadings;
		}

		$h = array_map(array($this, "quote"), $h);

		return $h;
	}

	/**
	 * Get unique heading
	 *
	 * @param   string $n Key
	 * @param   array  $h Search
	 *
	 * @return  string
	 */
	protected function uniqueHeading($n, $h)
	{
		$c    = 1;
		$newN = $n . '_' . $c;

		while (in_array($newN, $h))
		{
			$c++;
			$newN = $n . '_' . $c;
		}

		return $newN;
	}

	/**
	 * Remove the __pk_val from data
	 *
	 * @return  null
	 */
	protected function removePkVal()
	{
		$data = $this->model->getData();

		foreach ($data as $group)
		{
			foreach ($group as $row)
			{
				unset($row->__pk_val);
			}
		}
	}
}
models/element.php000064400000663777151165347400010231 0ustar00<?php
/**
 * Fabrik Element Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2023  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Object\CMSObject;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Fabrik\Helpers\LayoutFile;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;
use Joomla\CMS\Date\Date;
use Joomla\CMS\HTML\HTMLHelper;
use Fabrik\Helpers\Php;

jimport('joomla.application.component.model');
jimport('joomla.filesystem.file');

/**
 * Fabrik Element Model
 *
 * @package  Fabrik
 * @since    3.0
 */
#[\AllowDynamicProperties]
class PlgFabrik_Element extends FabrikPlugin
{
	/**
	 * Element id
	 *
	 * @var int
	 */
	protected $id = null;

	/**
	 * Javascript actions to attach to element
	 *
	 * @var array
	 */
	protected $jsActions = null;

	/**
	 * Editable
	 *
	 * @var bool
	 */
	public $editable = null;

	/**
	 * Is an upload element
	 *
	 * @var bool
	 */
	protected $is_upload = false;

	/**
	 * Does the element's data get recorded in the db
	 *
	 * @var bool
	 */
	protected $recordInDatabase = true;

	/**
	 * Contain access rights
	 *
	 * @var object
	 */
	protected $access = null;

	/**
	 * Validation error
	 *
	 * @var string
	 */
	protected $validationError = null;

	/**
	 *  Stores possible element names to avoid repeat db queries
	 *
	 * @var array
	 */
	public $fullNames = array();

	/**
	 * Group model
	 *
	 * @var object
	 */
	protected $group = null;

	/**
	 * Form model
	 *
	 * @var object
	 */
	protected $form = null;

	/**
	 * List model
	 *
	 * @var object
	 */
	protected $list = null;

	/**
	 * Element object
	 *
	 * @var FabrikTableElement
	 */
	public $element = null;

	/**
	 * If the element 'Include in search all' option is set to
'default' then this states if the
	 * element should be ignored from search all.
	 *
	 * @var bool  True, ignore in extended search all.
	 */
	protected $ignoreSearchAllDefault = false;

	/**
	 * Does the element have a label
	 *
	 * @var bool
	 */
	private $hasLabel = true;

	/**
	 * Does the element contain sub elements e.g checkboxes radiobuttons
	 *
	 * @var bool
	 */
	public $hasSubElements = false;

	/**
	 * Valid image extensions
	 *
	 * @var array
	 */
	protected $imageExtensions = array('jpg', 'jpeg',
'gif', 'bmp', 'png');

	/**
	 * Is the element in a detailed view?
	 *
	 * @var bool
	 */
	public $inDetailedView = false;

	/**
	 * Default values
	 *
	 * @var array
	 */
	public $defaults = array();

	/**
	 * The element's HTML ids based on $repeatCounter
	 *
	 * @var array
	 */
	public $HTMLids = array();

	/**
	 * Is the element in a repeat group
	 *
	 * @var bool
	 */
	public $inRepeatGroup = null;

	/**
	 * Is the element in a new group.
	 *
	 * Used by pre rendering / getGroupView so elements can set a default on
new repeat groups,
	 * even if it isn't a new record.
	 *
	 * @var bool
	 */
	public $newGroup = null;

	/**
	 * Default value
	 *
	 * @var string
	 */
	protected $default = null;

	/**
	 * Join model
	 *
	 * @var object
	 */
	protected $joinModel = null;

	/**
	 * Has the icon been set
	 *
	 * @var bool
	 */
	protected $iconsSet = false;

	/**
	 * Parent element row - if no parent returns element
	 *
	 * @var object
	 */
	protected $parent = null;

	/**
	 * Actual table name (table or joined tables db table name)
	 *
	 * @var string
	 */
	protected $actualTable = null;

	/**
	 * Ensures the query values are only escaped once
	 *
	 * @var bool
	 */
	protected $escapedQueryValue = false;

	/**
	 * Db table field type
	 *
	 * @var  string
	 */
	protected $fieldDesc = 'VARCHAR(%s)';

	/**
	 * Db table field size
	 *
	 * @var  string
	 */
	protected $fieldSize = '255';

	/**
	 * Element error msg
	 *
	 * @var string
	 */
	protected $elementError = '';

	/**
	 * Multi-db join option - can we add duplicate options (set to false in
tags element)
	 *
	 * @var  bool
	 */
	protected $allowDuplicates = true;

	/**
	 * Wraps 'foo' AS 'bar' as statements with
SUM('foo') = 'bar'
	 * Used in nv3d viz to alter query statements
	 *
	 * @var  string
	 */
	public $calcSelectModifier = null;

	public static $fxAdded = array();
	/**
	 * @var FabrikFEModelElementValidator
	 */
	public $validator;

	/**
	 * Selected filter value labels
	 *
	 * @var array
	 */
	public $filterDisplayValues = array();

	/**
	 * Cache for eval'ed options for dropdowns
	 *
	 * @var array
	 */
	protected $phpOptions = array();

	/**
	 *
	 * Cache for suboptions
	 *
	 * @var null|array
	 *
	 * @since 3.7
	 */
	protected $subOptionValues = null;

	/**
	 * Cache for subpoption labels
	 *
	 * @var null|array
	 */
	protected $subOptionLabels = null;

	/* dynamic properties to make php8.2 happy */
	public $tmpl = null;
	public $_foreignKey = null;
	public $_repeatGroupTotal = null;
	public $_inJoin  = null;
	public $elementHTMLName  = null;
	public $_default = null;

	/**
	 * Constructor
	 *
	 * @param   object &$subject The object to observe
	 * @param   array  $config   An array that holds the plugin configuration
	 *
	 * @since       1.5
	 */
	public function __construct(&$subject, $config = array())
	{
		parent::__construct($subject, $config);
		$this->validator =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('ElementValidator',
'FabrikFEModel');
		$this->validator->setElementModel($this);
		$this->access = new stdClass;
	}

	/**
	 * Weed out any non-serializable properties.  We only ever get serialized
by J!'s cache handler,
	 * to create the cache ID, so we don't really care about __wake() or
not saving all state.  We just
	 * want to avoid the dreaded "serialization of a closure is not
allowed", and provide enough propeties
	 * to guarrantee a unique hash for the cache ID.
	 */

	public function __sleep() {
		$serializable = array();

		foreach ($this as $paramName => $paramValue) {

			//if (!is_string($paramValue) && !is_array($paramValue)
&& is_callable($paramValue))
			if (!is_numeric($paramValue) && !is_string($paramValue)
&& !is_array($paramValue))
			{
				continue;
			}

			$serializable[] = $paramName;
		}

		return $serializable;
	}

	/**
	 * Method to set the element id
	 *
	 * @param   int $id element ID number
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		// Set new element ID
		$this->id = $id;
	}

	/**
	 * Get the element id
	 *
	 * @return  int    element id
	 */
	public function getId()
	{
		return $this->id;
	}

	/**
	 * Get the element table object
	 *
	 * @param   bool $force default false - force load the element
	 *
	 * @return  FabrikTableElement  element table
	 */
	public function &getElement($force = false)
	{
		if (!$this->element || $force)
		{
			Table::addIncludePath(JPATH_ADMINISTRATOR .
'/components/com_fabrik/tables');
			$row = FabTable::getInstance('Element',
'FabrikTable');
			$row->load($this->id);
			$this->element = $row;

			// 3.1 reset the params at the same time. Seems to be required for ajax
autocomplete
			if ($force)
			{
				unset($this->params);
				$this->getParams();
			}
		}

		return $this->element;
	}

	/**
	 * Get parent element
	 *
	 * @return  object  element table
	 */
	public function getParent()
	{
		if (!isset($this->parent))
		{
			$element = $this->getElement();

			if ((int) $element->parent_id !== 0)
			{
				$this->parent = FabTable::getInstance('element',
'FabrikTable');
				$this->parent->load($element->parent_id);
			}
			else
			{
				$this->parent = $element;
			}
		}

		return $this->parent;
	}

	/**
	 * Bind data to the _element variable - if possible we should run one
query to get all the forms
	 * element data and then iterate over that, creating an element plugin for
each row
	 * and bind each record to that plugins _element. This is instead of using
getElement() which
	 * reloads in the element increasing the number of queries run
	 *
	 * @param   mixed &$row (object or assoc array)
	 *
	 * @return  object  element table
	 */
	public function bindToElement(&$row)
	{
		if (!$this->element)
		{
			Table::addIncludePath(JPATH_ADMINISTRATOR .
'/components/com_fabrik/tables');
			$this->element = FabTable::getInstance('Element',
'FabrikTable');
		}

		if (is_object($row))
		{
			$row = ArrayHelper::fromObject($row);
		}

		$this->element->bind($row);

		return $this->element;
	}

	/**
	 * Set the context in which the element occurs
	 *
	 * @param   FabrikFEModelGroup &$groupModel group model
	 * @param   FabrikFEModelForm  &$formModel  form model
	 * @param   FabrikFEModelList  &$listModel  list model
	 *
	 * @return  void
	 */
	public function setContext(&$groupModel, &$formModel,
&$listModel)
	{
		// Don't assign these with &= as they already are when passed
into the func
		$this->group = $groupModel;
		$this->form  = $formModel;
		$this->list  = $listModel;
	}

	/**
	 * Get the element's fabrik list model
	 *
	 * @return  FabrikFEModelList    list model
	 */
	public function getListModel()
	{
		if (is_null($this->list))
		{
			$groupModel = $this->getGroup();
			$this->list = $groupModel->getListModel();
		}

		return $this->list;
	}

	/**
	 * load in the group model
	 *
	 * @param   int $groupId group id
	 *
	 * @return  FabrikFEModelGroup    group model
	 */
	public function &getGroup($groupId = null)
	{
		if (is_null($groupId))
		{
			$element = $this->getElement();
			$groupId = $element->group_id;
		}

		if (is_null($this->group) || $this->group->getId() != $groupId)
		{
			$model =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Group',
'FabrikFEModel');
			$model->setId($groupId);
			$model->getGroup();
			$this->group = $model;
		}

		return $this->group;
	}

	/**
	 * Get the elements group model
	 *
	 * @param   int $group_id If not set uses elements default group id
	 *
	 * @return  FabrikFEModelGroup  group model
	 */
	public function getGroupModel($group_id = null)
	{
		return $this->getGroup($group_id);
	}

	/**
	 * Set the group model
	 *
	 * @param   FabrikFEModelGroup $group group model
	 *
	 * @since 3.0.6
	 *
	 * @return  null
	 */
	public function setGroupModel($group)
	{
		$this->group = $group;
	}

	/**
	 * get the elements form model
	 *
	 * @deprecated use getFormModel
	 *
	 * @return  FabrikFEModelForm    Form model
	 */
	public function getForm()
	{
		return $this->getFormModel();
	}

	/**
	 * get the element's form model
	 *
	 * @return  FabrikFEModelForm  Form model
	 */
	public function getFormModel()
	{
		if (is_null($this->form))
		{
			$listModel  = $this->getListModel();
			$table      = $listModel->getTable();
			$this->form =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Form',
'FabrikFEModel');
			$this->form->setId($table->form_id);
			$this->form->getForm();
		}

		return $this->form;
	}

	/**
	 * Set form model
	 *
	 * @param   FabrikFEModelForm $model form model
	 *
	 * @return  void
	 */
	public function setFormModel($model)
	{
		$this->form = $model;
	}

	/**
	 * Shows the RAW list data - can be overwritten in plugin class
	 *
	 * @param   string $data    element data
	 * @param   object $thisRow all the data in the tables current row
	 *
	 * @return  string    formatted value
	 */
	public function renderRawListData($data, $thisRow)
	{
		return $data;
	}

	/**
	 * replace labels shown in table view with icons (if found)
	 *
	 * @param   string $data data
	 * @param   string $view list/details
	 * @param   string $tmpl template
	 *
	 * @since      3.9 - icon_folder is a three way - search through template
folders for icons or use class
	 *
	 * @deprecated use replaceWithIcons()
	 * @return  string    data
	 */
	protected function _replaceWithIcons($data, $view = 'list',
$tmpl = null)
	{
		return $this->replaceWithIcons($data, $view, $tmpl);
	}

	/**
	 * Replace labels shown in list view with icons (if found)
	 *
	 * @param   string $data Data
	 * @param   string $view List/details
	 * @param   string $tmpl Template
	 *
	 * @since      3.9 - icon_folder is a three way - search through template
folders for icons or use class
	 *
	 * @return  string    data
	 */
	protected function replaceWithIcons($data, $view = 'list', $tmpl
= null)
	{
		if ($data == '')
		{
			$this->iconsSet = false;

			return $data;
		}

		$params    = $this->getParams();
		$listModel = $this->getListModel();
		$iconFile  = (string) $params->get('icon_file',
'');
		$iconFolder  = (int) $params->get('icon_folder',
'');

		if ($iconFile === '{extension}')
		{
			$iconFileInfo = pathinfo(trim(strip_tags($data)));
			$iconFile = FArrayHelper::getValue($iconFileInfo, 'extension',
'');
		}

		if ((int) $params->get('icon_folder', 0) === 0 &&
$iconFile === '')
		{
			$this->iconsSet = false;

			return $data;
		}

		if (in_array($listModel->getOutPutFormat(), array('csv',
'rss')))
		{
			$this->iconsSet = false;

			return $data;
		}

		$cleanData  = empty($iconFile) ? FabrikString::clean(strip_tags($data)) :
$iconFile;
		$cleanDatas = array($this->getElement()->name . '_' .
$cleanData, $cleanData);
		$opts = array('forceImage' => true);

		//If subdir is set prepend file name with subdirectory (so first search
through [template folders]/subdir for icons, e.g. images/subdir)
		$iconSubDir = $params->get('icon_subdir', '');

		if ($iconSubDir != '')
		{
			$iconSubDir = rtrim($iconSubDir, '/') . '/';
			$iconSubDir = ltrim($iconSubDir, '/');
			array_unshift($cleanDatas, $iconSubDir . $cleanData); //search subdir
first
		}

		foreach ($cleanDatas as $cleanData)
		{
			foreach ($this->imageExtensions as $ex)
			{
				$img = FabrikHelperHTML::image($cleanData . '.' . $ex, $view,
$tmpl, array(), false, $opts);

				if (!empty($img))
				{
					break;
				}
			}

			if (empty($img) && $iconFolder === 2)
			{
				$opts = array('forceImage' => false);
				$img = FabrikHelperHTML::image($cleanData, $view, $tmpl, array(),
false, $opts);
			}

			if (!empty($img))
			{
				$this->iconsSet = true;
				$opts           = new stdClass;
				$opts->position = 'top';
				$opts           = json_encode($opts);
				$data           = '<span>' . $data .
'</span>';

				// See if data has an <a> tag
				$html = FabrikHelperHTML::loadDOMDocument($data);
				$as   = $html->getElementsBytagName('a');

				if ($params->get('icon_hovertext', true))
				{
					//$aHref  = 'javascript:void(0)';
					$aHref  = '#';
					$target = '';

					if ($as->length)
					{
						// Data already has an <a href="foo"> lets get that
for use in hover text
						$a      = $as->item(0);
						$aHref  = $a->getAttribute('href');
						$target = $a->getAttribute('target');
						$target = 'target="' . $target . '"';
					}

					$data = htmlspecialchars($data, ENT_QUOTES);

					$layout                  =
FabrikHelperHTML::getLayout('element.fabrik-element-listicon-tip');
					$displayData             = new stdClass;
					$displayData->img     = $img;
					$displayData->title   = $data;
					$displayData->href    = $aHref;
					$displayData->target  = $target;
					$displayData->opts    = $opts;
					$img                  = $layout->render($displayData);

					//$img  = '<a class="fabrikTip" ' . $target .
' href="' . $aHref . '" opts=\'' . $opts
. '\' title="' . $data . '">' . $img
. '</a>';
				}
				elseif (!empty($iconFile))
				{
					/**
					 * $$$ hugh - kind of a hack, but ... if this is an upload element, it
may already be a link, and
					 * we'll need to replace the text in the link with the image
					 * After ages dicking around with a regex to do this, decided to use
DOMDocument instead!
					 */

					if ($as->length)
					{
						$img = $html->createElement('img');
						$src = FabrikHelperHTML::image($cleanData . '.' . $ex,
$view, $tmpl, array(), true, array('forceImage' => true));
						$img->setAttribute('src', $src);
						$as->item(0)->nodeValue = '';
						$as->item(0)->appendChild($img);

						return $html->saveHTML();
					}
				}

				return $img;
			}

		}

		return $data;
	}

	/**
	 * Build the sub query which is used when merging in in repeat element
	 * records from their joined table into the one field.
	 * Overwritten in database join element to allow for building the join
	 * to the table containing the stored values required labels
	 *
	 * @param   string $jKey  key
	 * @param   bool   $addAs add 'AS' to select sub query
	 *
	 * @return  string  sub query
	 */
	public function buildQueryElementConcat($jKey, $addAs = true)
	{
		$joinTable = $this->getJoinModel()->getJoin()->table_join;
		$dbTable   = $this->actualTableName();
		// Jaanus: joined group pk? set in groupConcactJoinKey()
		$pkField    = $this->groupConcactJoinKey();
		$fullElName = $this->_db->qn($dbTable . '___' .
$this->element->name);
		$sql        = '(SELECT GROUP_CONCAT(' . $jKey . '
SEPARATOR \'' . GROUPSPLITTER . '\') FROM ' .
$joinTable . ' WHERE parent_id = '
			. $pkField . ')';

		if ($addAs)
		{
			$sql .= ' AS ' . $fullElName;
		}

		return $sql;
	}

	/**
	 * Build the sub query which is used when merging in
	 * repeat element records from their joined table into the one field.
	 * Overwritten in database join element to allow for building
	 * the join to the table containing the stored values required ids
	 *
	 * @since   2.1.1
	 *
	 * @return  string    sub query
	 */
	protected function buildQueryElementConcatRaw()
	{
		$joinTable  = $this->getJoinModel()->getJoin()->table_join;
		$dbTable    = $this->actualTableName();
		$fullElName = $this->_db->qn($dbTable . '___' .
$this->element->name . '_raw');
		$pkField    = $this->groupConcactJoinKey();

		return '(SELECT GROUP_CONCAT(id SEPARATOR \'' .
GROUPSPLITTER . '\') FROM ' . $joinTable . ' WHERE
parent_id = ' . $pkField
		. ') AS ' . $fullElName;
	}

	/**
	 * Build the sub query which is used when merging in
	 * repeat element records from their joined table into the one field.
	 * Overwritten in database join element to allow for building
	 * the join to the table containing the stored values required ids
	 *
	 * @since   2.1.1
	 *
	 * @return  string    sub query
	 */
	protected function buildQueryElementConcatId()
	{
		return '';
	}

	/**
	 * Used in form model setJoinData.
	 *
	 * @since 2.1.1
	 *
	 * @return  array  Element names to search data in to create join data
array
	 */
	public function getJoinDataNames()
	{
		$name    = $this->getFullName(true, false);
		$rawName = $name . '_raw';

		return array($name, $rawName);
	}

	/**
	 * Create the SQL select 'name AS alias' segment for list/form
queries
	 *
	 * @param   array &$aFields   array of element names
	 * @param   array &$aAsFields array of 'name AS alias'
fields
	 * @param   array $opts       options : alias - replace the fullelement
name in asfields "name AS
	 *                            tablename___elementname"
	 *
	 * @return  void
	 */
	public function getAsField_html(&$aFields, &$aAsFields, $opts =
array())
	{
		$dbTable    = $this->actualTableName();
		$db         = FabrikWorker::getDbo();
		$table      = $this->getListModel()->getTable();
		$fullElName = FArrayHelper::getValue($opts, 'alias',
$db->qn($dbTable . '___' . $this->element->name));
		$fName      = $dbTable . '.' . $this->element->name;
		$k          = $db->qn($fName);
		$secret     = $this->config->get('secret');

		if ($this->encryptMe())
		{
			$k = 'AES_DECRYPT(' . $k . ', ' . $db->q($secret)
. ')';
		}

		if ($this->isJoin())
		{
			$jKey = $this->element->name;

			if ($this->encryptMe())
			{
				$jKey = 'AES_DECRYPT(' . $jKey . ', ' .
$db->q($secret) . ')';
			}

			$joinTable  = $this->getJoinModel()->getJoin()->table_join;
			//$fullElName = FArrayHelper::getValue($opts, 'alias', $k);
			$fullElName = FArrayHelper::getValue($opts, 'alias',
$fullElName);
			$str        = $this->buildQueryElementConcat($jKey);
		}
		else
		{
			if ($this->calcSelectModifier)
			{
				$k = $this->calcSelectModifier . '(' . $k . ')';
			}

			$str = $k . ' AS ' . $fullElName;
		}

		if ($table->db_primary_key == $fullElName)
		{
			array_unshift($aFields, $fullElName);
			array_unshift($aAsFields, $fullElName);
		}
		else
		{
			if (!in_array($str, $aFields))
			{
				$aFields[]   = $str;
				$aAsFields[] = $fullElName;
			}

			$k = $db->qn($dbTable . '.' . $this->element->name);

			if ($this->encryptMe())
			{
				$k = 'AES_DECRYPT(' . $k . ', ' .
$db->q($secret) . ')';
			}

			if ($this->isJoin())
			{
				$pkField     = $this->groupConcactJoinKey();
				$str         = $this->buildQueryElementConcatRaw();
				$aFields[]   = $str;
				$as  = $db->qn($dbTable . '___' .
$this->element->name . '_raw');
				$aAsFields[] = $as;

				$str         = $this->buildQueryElementConcatId();
				$aFields[]   = $str;
				$as  = $db->qn($dbTable . '___' .
$this->element->name . '_id');
				$aAsFields[] = $as;

				$as  = $db->qn($dbTable . '___' .
$this->element->name . '___params');
				$str = '(SELECT GROUP_CONCAT(params SEPARATOR \'' .
GROUPSPLITTER . '\') FROM ' . $joinTable . ' WHERE
parent_id = '
					. $pkField . ') AS ' . $as;
				// Jaanus: joined group pk set in groupConcactJoinKey()
				$aFields[]   = $str;
				$aAsFields[] = $as;
			}
			else
			{
				$fullElName = $db->qn($dbTable . '___' .
$this->element->name . '_raw');

				if ($this->calcSelectModifier)
				{
					$k = $this->calcSelectModifier . '(' . $k .
')';
				}

				$str = $k . ' AS ' . $fullElName;
			}

			if (!in_array($str, $aFields))
			{
				$aFields[]   = $str;
				$aAsFields[] = $fullElName;
			}
		}
	}

	/**
	 * OMG! If repeat element inside a repeat group then the group_concat
subquery needs to change the key
	 * it selected on - so it could either be the table pk or the joined
groups pk.... :D
	 *
	 * @since   3.1rc1
	 *
	 * @return string
	 */
	protected function groupConcactJoinKey()
	{
		$table = $this->getListModel()->getTable();

		if ($this->getGroupModel()->isJoin() && $this->isJoin())
		{
			$groupJoin = $this->getGroupModel()->getJoinModel()->getJoin();
			$pkField   = $groupJoin->params->get('pk');
		}
		else
		{
			$pkField = $table->db_primary_key;
		}

		return $pkField;
	}

	/**
	 * Get raw column name
	 *
	 * @param   bool $useStep Use step in name
	 *
	 * @return string
	 */
	public function getRawColumn($useStep = true)
	{
		$n = $this->getFullName($useStep, false);
		$n .= '_raw`';

		return $n;
	}

	/**
	 * Is the element editable - wrapper for _editable property as 3.1 uses
editable
	 *
	 * @since  3.0.7
	 *
	 * @return bool
	 */
	public function isEditable()
	{
		return $this->editable;
	}

	/**
	 * Set the element edit state - wrapper for _editable property as 3.1 uses
editable
	 *
	 * @param   bool $editable Is the element editable
	 *
	 * @since 3.0.7
	 *
	 * @return  void
	 */
	public function setEditable($editable)
	{
		$this->editable = $editable;
	}

	/**
	 * Check user can view the read only element OR view in list view
	 *
	 * @param   string $view View list/form @since 3.0.7
	 *
	 * @return  bool  can view or not
	 */
	public function canView($view = 'form')
	{
		$default = 1;
		$key     = $view == 'form' ? 'view' :
'listview';
		$prop    = $view == 'form' ? 'view_access' :
'list_view_access';
		$params  = $this->getParams();

		if (!is_object($this->access) || !isset($this->access->{$key}))
		{
			$groups             = $this->user->getAuthorisedViewLevels();
			$this->access->$key = in_array($params->get($prop, $default),
$groups);
		}

		// If no group access, can override with check on lookup element's
value = logged in user id.
		if (!$this->access->$key &&
$params->get('view_access_user', '') !==
'' && $view == 'form')
		{
			$formModel = $this->getFormModel();
			$data      = $formModel->getData();

			if (!empty($data) && $this->user->get('id') !==
0)
			{
				$lookUpId = $params->get('view_access_user',
'');
				$lookUp   = $formModel->getElement($lookUpId, true);

				// Could be  a linked parent element in which case the form
doesn't contain the element whose id is $lookUpId
				if (!$lookUp)
				{
					$lookUp =
FabrikWorker::getPluginManager()->getElementPlugin($lookUpId);
				}

				if ($lookUp)
				{
					$fullName           = $lookUp->getFullName(true, true);
					$value              = $formModel->getElementData($fullName, true);
					$this->access->$key = ($this->user->get('id') ==
$value) ? true : false;
				}
				else
				{
					FabrikWorker::logError('Did not load element ' . $lookUpId .
' for element::canView()', 'error');
				}
			}
		}
		else if ($this->access->$key && $view == 'form')
		{
			$formModel = $this->getFormModel();
			$pluginManager = FabrikWorker::getPluginManager();
			if (in_array(false,
$pluginManager->runPlugins('onElementCanView', $formModel,
'form', $this)))
			{
				$this->access->$key = false;
			}
		}
		else if ($this->access->$key && $view == 'list')
		{
			$listModel = $this->getListModel();
			$pluginManager = FabrikWorker::getPluginManager();
			if (in_array(false,
$pluginManager->runPlugins('onElementCanViewList', $listModel,
'list', $this)))
			{
				$this->access->$key = false;
			}
		}

		return $this->access->$key;
	}

	/**
	 * Check if the user can use the active element
	 * If location is 'list' then we don't check the group
canEdit() option - causes inline edit plugin not to work
	 * when followed by a update_col plugin.
	 *
	 * @param   string $location To trigger plugin on form/list for elements
	 * @param   string $event    To trigger plugin on
	 *
	 * @return  bool can use or not
	 */
	public function canUse($location = 'form', $event = null)
	{
		// Odd! even though defined in initialize() for confirmation plugin
access was not set.
		if (!isset($this->access))
		{
			$this->access = new stdClass;
		}

		if (!is_object($this->access) || !isset($this->access->use))
		{
			/**
			 * $$$ hugh - testing new "Option 5" for group show,
"Always show read only"
			 * So if element's group show is type 5, then element is de-facto
read only.
			 */
			if ($location !== 'list' &&
!$this->getGroupModel()->canEdit())
			{
				$this->access->use = false;
			}
			else
			{
				$viewLevel = $this->getElement()->access;

				if (!$this->getFormModel()->isNewRecord())
				{
					$editViewLevel =
$this->getParams()->get('edit_access');

					if ($editViewLevel)
					{
						$viewLevel = $editViewLevel;
					}
				}

				$groups            = $this->user->getAuthorisedViewLevels();
				$this->access->use = in_array($viewLevel, $groups);

				// Override with check on lookup element's value = logged in user
id.
				$params = $this->getParams();

				if (!$this->access->use &&
$params->get('edit_access_user', '') !==
'' && $location == 'form')
				{
					$formModel = $this->getFormModel();
					$data      = $formModel->getData();

					if (!empty($data) && $this->user->get('id')
!== 0)
					{
						$lookUpId = $params->get('edit_access_user',
'');
						$lookUp   = $formModel->getElement($lookUpId, true);

						// Could be  a linked parent element in which case the form
doesn't contain the element whose id is $lookUpId
						if (!$lookUp)
						{
							$lookUp =
FabrikWorker::getPluginManager()->getElementPlugin($lookUpId);
						}

						if ($lookUp)
						{
							$fullName          = $lookUp->getFullName(true, true);
							$value             = (array)
$formModel->getElementData($fullName, true);
							$this->access->use =
in_array($this->user->get('id'), $value);
						}
						else
						{
							FabrikWorker::logError('Did not load element ' . $lookUpId
. ' for element::canUse()', 'error');
						}
					}
				}
				else if ($this->access->use && $location ==
'form')
				{
					$formModel = $this->getFormModel();
					$pluginManager = FabrikWorker::getPluginManager();
					if (in_array(false,
$pluginManager->runPlugins('onElementCanUse', $formModel,
'form', $this)))
					{
						$this->access->use = false;
					}
				}
			}
		}

		return $this->access->use;
	}

	/**
	 * Defines if the user can use the filter related to the element
	 *
	 * @return  bool    true if you can use
	 */
	public function canUseFilter()
	{
		if (!is_object($this->access) || !isset($this->access->filter))
		{
			$groups = $this->user->getAuthorisedViewLevels();

			// $$$ hugh - fix for where certain elements got created with 0 as the
			// the default for filter_access, which isn't a legal value, should
be 1
			$filterAccess         =
$this->getParams()->get('filter_access');
			$filterAccess         = $filterAccess == '0' ? '1' :
$filterAccess;
			$this->access->filter = in_array($filterAccess, $groups);
		}

		return $this->access->filter;
	}

	/**
	 * Set/get if element should record its data in the database
	 *
	 * @deprecated - not used
	 *
	 * @return bool
	 */
	public function setIsRecordedInDatabase()
	{
		return true;
	}

	/**
	 * Internal element validation
	 *
	 * @param   array $data          Form data
	 * @param   int   $repeatCounter Repeat group counter
	 *
	 * @return bool
	 */
	public function validate($data, $repeatCounter = 0)
	{
		return true;
	}

	/**
	 * Get validation error - run through Text
	 *
	 * @return  string
	 */
	public function getValidationErr()
	{
		return Text::_($this->validationError);
	}

	/**
	 * Is the element consider to be empty for purposes of rendering on the
form,
	 * i.e. for assigning classes, etc.  Can be overridden by individual
elements.
	 *
	 * NOTE - this was originally intended for validation, but wound up being
used for both validation
	 * AND rendering.  Which doesn't really work, because the $data can
be entirely different.  Tried
	 * adding dataConsideredEmptyForValidation() below, but that causes issues
where elements don't have
	 * one, we'd need to go through in one swoop and split them out in
every element.  So for now, leave this
	 * as the default which is called in both contexts, BUT the notempty
validation checks to see if an
	 * element model has a dataCOnsideredEmptyForValidation() method and calls
that in preference to this
	 * if it does.  We can come back and revisit this issue, as we gradually
split out the funcitonality in each
	 * element type.
	 *
	 * @param   array $data          Data to test against
	 * @param   int   $repeatCounter Repeat group #
	 *
	 * @return  bool
	 */
	public function dataConsideredEmpty($data, $repeatCounter)
	{
		return ($data == '') ? true : false;
	}

	/**
	 * is the element consider to be empty for validation purposes, on form
submit
	 * Used in isempty validation rule.  Split out from dataConsideredEmpty in
3.2
	 *
	 * NOTE - see comments on dataConsideredEmpty(), have to hold off on
putting this in the main model.
	 *
	 * @param   array $data          Data to test against
	 * @param   int   $repeatCounter Repeat group #
	 *
	 * @return  bool
	 *
	 * @since   3.2
	 */

	/*
	public function dataConsideredEmptyForValidation($data, $repeatCounter)
	{
		return ($data == '') ? true : false;
	}
	*/

	/**
	 * Get an array of element html ids and their corresponding
	 * js events which trigger a validation.
	 * Examples of where this would be overwritten include timedate element
with time field enabled
	 *
	 * @param   int $repeatCounter Repeat group counter
	 *
	 * @return  array  html ids to watch for validation
	 */
	public function getValidationWatchElements($repeatCounter)
	{
		$id = $this->getHTMLId($repeatCounter);
		$ar = array('id' => $id, 'triggerEvent' =>
$this->getChangeEvent());

		return array($ar);
	}

	/**
	 * Manipulates posted form data for insertion into database
	 *
	 * @param   mixed $val  This elements posted form data
	 * @param   array $data Posted form data
	 *
	 * @return  mixed
	 */
	public function storeDatabaseFormat($val, $data)
	{
		if (is_array($val) && count($val) === 1)
		{
			$val = array_shift($val);
		}

		if (is_array($val) || is_object($val))
		{
			return json_encode($val);
		}
		else
		{
			return $val;
		}
	}

	/**
	 * When importing csv data you can run this function on all the data to
	 * format it into the format that the form would have submitted the date
	 *
	 * @param   array  &$data To prepare
	 * @param   string $key   List column heading
	 * @param   bool   $isRaw Data is raw
	 *
	 * @return  array  data
	 */
	public function prepareCSVData(&$data, $key, $isRaw = false)
	{
		return $data;
	}

	/**
	 * Determines if the data in the form element is used when updating a
record
	 *
	 * @param   mixed $val Element form data
	 *
	 * @return  bool  true if ignored on update, default = false
	 */
	public function ignoreOnUpdate($val)
	{
		return false;
	}

	/**
	 * can be overwritten in add-on class
	 *
	 * checks the posted form data against elements INTERNAL validation rule -
e.g. file upload size / type
	 *
	 * @param   array  $aErrors     Existing errors
	 * @param   object &$groupModel Group model
	 * @param   object &$formModel  Form model
	 * @param   array  $data        Posted data
	 *
	 * @deprecated - not used
	 *
	 * @return  array    updated errors
	 */
	public function validateData($aErrors, &$groupModel, &$formModel,
$data)
	{
		return $aErrors;
	}

	/**
	 * Determines the label used for the browser title
	 * in the form/detail views
	 *
	 * @param   array $data          Form data
	 * @param   int   $repeatCounter When repeating joined groups we need to
know what part of the array to access
	 * @param   array $opts          Options
	 *
	 * @return  string    Text to add to the browser's title
	 */
	public function getTitlePart($data, $repeatCounter = 0, $opts = array())
	{
		$titlePart = $this->getValue($data, $repeatCounter, $opts);

		return is_array($titlePart) ? implode(', ', $titlePart) :
$titlePart;
	}

	/**
	 * Should the element ignore a form or list row copy, and use the default
regardless
	 *
	 * @return bool
	 */
	public function defaultOnCopy()
	{
		$params = $this->getParams();
		return $params->get('default_on_copy', '0') ===
'1';
	}

	/**
	 * This really does get just the default value (as defined in the
element's settings)
	 *
	 * @param   array $data Form data
	 *
	 * @return mixed
	 */
	public function getDefaultValue($data = array())
	{
		if (!isset($this->default))
		{
			$w       = new FabrikWorker;
			$element = $this->getElement();
			$default = $w->parseMessageForPlaceHolder($element->default,
$data);

			if ($element->eval == "1" && is_string($default))
			{
				/**
				 * Inline edit with a default eval'd "return
FabrikHelperElement::filterValue(290);"
				 * was causing the default to be eval'd twice (no idea y) - add in
check for 'return' into eval string
				 * see http://fabrikar.com/forums/showthread.php?t=30859
				 */
				if (!stristr($default, 'return'))
				{
					$this->_default = $default;
				}
				else
				{
					FabrikHelperHTML::debug($default, 'element eval default:' .
$element->label);
					FabrikWorker::clearEval();
					$default = Php::Eval(['code' => $default,
'vars'=>['data'=>$data]]);
					FabrikWorker::logEval($default, 'Caught exception on eval of
' . $element->name . ': %s');

					// Test this does stop error
					$this->_default = $default === false ? '' : $default;
				}
			}

			if (is_array($default))
			{
				foreach ($default as &$d)
				{
					$d = Text::_($d);
				}

				$this->default = $default;
			}
			else
			{
				$this->default = Text::_($default);
			}
		}

		return $this->default;
	}

	/**
	 * Called by form model to build an array of values to encrypt
	 *
	 * @param   array &$values Previously encrypted values
	 * @param   array $data    Form data
	 * @param   int   $c       Repeat group counter
	 *
	 * @return  void
	 */
	public function getValuesToEncrypt(&$values, $data, $c)
	{
		$name  = $this->getFullName(true, false);
		$opts  = array('raw' => true);
		$group = $this->getGroup();

		if ($group->canRepeat())
		{
			if (!array_key_exists($name, $values))
			{
				$values[$name]['data'] = array();
			}

			$values[$name]['data'][$c] = $this->getValue($data, $c,
$opts);
		}
		else
		{
			$values[$name]['data'] = $this->getValue($data, $c, $opts);
		}
	}

	/**
	 * Element plugin specific method for setting unencrypted values back into
post data
	 *
	 * @param   array  &$post Data passed by ref
	 * @param   string $key   Key
	 * @param   string $data  Elements unencrypted data
	 *
	 * @return  void
	 */
	public function setValuesFromEncryt(&$post, $key, $data)
	{
		FArrayHelper::setValue($post, $key, $data);
		FArrayHelper::setValue($_REQUEST, $key, $data);

		// $$$rob even though $post is passed by reference - by adding in the
value
		// we aren't actually modifying the $_POST var that post was created
from
		$this->app->getInput()->set($key, $data);
	}

	/**
	 * Determines the value for the element in the form view
	 *
	 * @param   array $data          Form data
	 * @param   int   $repeatCounter When repeating joined groups we need to
know what part of the array to access
	 *
	 * @return  string    value
	 */
	public function getROValue($data, $repeatCounter = 0)
	{
		return $this->getValue($data, $repeatCounter);
	}

	/**
	 * Helper method to get the default value used in getValue()
	 * For readonly elements:
	 *    If the form is new we need to get the default value
	 *    If the form is being edited we don't want to get the default
value
	 * Otherwise use the 'use_default' value in $opts, defaulting to
true
	 *
	 * @param   array $data Form data
	 * @param   array $opts Options
	 *
	 * @since  3.0.7
	 *
	 * @return  mixed    value
	 */
	protected function getDefaultOnACL($data, $opts)
	{
		// Rob - 31/10/2012 - if readonly and editing an existing record we
don't want to show the default label
		if (!$this->isEditable() && (int)FArrayHelper::getValue($data,
'rowid') != 0)
		{
			$opts['use_default'] = false;
		}

		/**
		 * $$$rob - if no search form data submitted for the search element then
the default
		 * selection was being applied instead
		 * otherwise get the default value so if we don't find the
element's value in $data we fall back on this value
		 */
		return FArrayHelper::getValue($opts, 'use_default', true) ==
false ? '' : $this->getDefaultValue($data);
	}

	/**
	 * Use in list model storeRow() to determine if data should be stored.
	 * Currently only supported for db join elements whose values are default
values
	 * avoids casing '' into 0 for int fields
	 *
	 * @param   array $data Data being inserted
	 * @param   mixed $val  Element value to insert into table
	 *
	 * @since   3.0.7
	 *
	 * @return boolean
	 */
	public function dataIsNull($data, $val)
	{
		return false;
	}

	/**
	 * Determines the value for the element in the form view
	 *
	 * @param   array $data          Form data
	 * @param   int   $repeatCounter When repeating joined groups we need to
know what part of the array to access
	 * @param   array $opts          Options, 'raw' = 1/0 use raw
value
	 *
	 * @return  string    value
	 */
	public function getValue($data, $repeatCounter = 0, $opts = array())
	{
		$input = $this->app->getInput();

		if (!isset($this->defaults))
		{
			$this->defaults = array();
		}

		$key = $repeatCounter . '.' . serialize($opts);

		if (!array_key_exists($key, $this->defaults))
		{
			$groupRepeat = $this->getGroupModel()->canRepeat();
			$default     = $this->getDefaultOnACL($data, $opts);
			$name        = $this->getFullName(true, false);

			if (FArrayHelper::getValue($opts, 'raw', 0) == 1)
			{
				$name .= '_raw';
			}

			/**
			 * @FIXME - if an element is NULL in the table, we will be applying the
default even if this
			 * isn't a new form.  Probaby needs to be a global option, although
not entirely sure what
			 * we would set it to ...
			 */
			 //Fix: don't apply the default if a rowid is set and >=1 (=
existing record)
			 if (array_key_exists('rowid',$data) &&
!empty($data['rowid'])) {
				 $values = FArrayHelper::getValue($data, $name);
			 }
			 else {
				 $values = FArrayHelper::getValue($data, $name, $default);
			 }

			// Querystring override (seems on http://fabrikar.com/subscribe/form/22
querystring var was not being set into $data)
			if (FArrayHelper::getValue($opts, 'use_querystring', false))
			{
				if ((is_array($values) && empty($values)) || $values ===
'')
				{
					// Trying to avoid errors if value is an array
					$values = $input->get($name, null, 'array');

					if (is_null($values) || (count($values) === 1 && $values[0] ==
''))
					{
						$values = $input->get($name, '', 'string');
					}
				}
			}

			if ($groupRepeat)
			{
				// Weird bug where stdClass with key 0, when cast to (array) you
couldn't access values[0]
				if (is_object($values))
				{
					$values = ArrayHelper::fromObject($values);
				}

				if (!is_array($values))
				{
					$values = (array) $values;
				}

				$values = FArrayHelper::getValue($values, $repeatCounter,
'');
			}

			if (FArrayHelper::getValue($opts, 'runplugins', false))
			{
				$formModel = $this->getFormModel();
				FabrikWorker::getPluginManager()->runPlugins('onGetElementDefault',
$formModel, 'form', $this);
			}

			$this->defaults[$key] = $values;
		}

		return $this->defaults[$key];
	}

	/**
	 * Is the element hidden or not - if not set then return false
	 *
	 * @return  bool
	 */
	public function isHidden()
	{
		$element = $this->getElement();

		return ($element->hidden == true) ? true : false;
	}

	/**
	 * Used in things like date when its id is suffixed with _cal
	 * called from getLabel();
	 *
	 * @param   string &$id Initial id
	 *
	 * @return  void
	 */
	protected function modHTMLId(&$id)
	{
	}

	/**
	 * Should the element be tipped?
	 *
	 * @param   string $mode Form/list render context
	 * @param   array  $data data array
	 *
	 * @since    3.0.6
	 *
	 * @return  bool
	 */
	private function isTipped($mode = 'form', $data = array())
	{
		$formModel = $this->getFormModel();

		if ($formModel->getParams()->get('tiplocation',
'tip') !== 'tip' && $mode === 'form')
		{
			return false;
		}

		$params = $this->getParams();

		if (empty($this->getTipText($data)))
		{
			return false;
		}

		if ($mode == 'form' && (!$formModel->isEditable()
&& $params->get('labelindetails', true) == false))
		{
			return false;
		}

		if ($mode === 'list' &&
$params->get('labelinlist', false) == false)
		{
			return false;
		}

		return true;
	}

	/**
	 * Get list heading label
	 *
	 * @return  string
	 */
	public function getListHeading()
	{
		$params  = $this->getParams();
		$element = $this->getElement();
		$label   = $params->get('alt_list_heading') == ''
? $element->label : $params->get('alt_list_heading');

		return Text::_($label);
	}

	/**
	 * Get the element's HTML label
	 *
	 * @param   int    $repeatCounter Group repeat counter
	 * @param   string $tmpl          Form template
	 *
	 * @return  string  label
	 */
	public function getLabel($repeatCounter, $tmpl = '')
	{
		$element = $this->getElement();

		$this->modHTMLId($elementHTMLId);
		$model = $this->getFormModel();

		$displayData             = new stdClass;
		$displayData->canView    = $this->canView();
		$displayData->id         = $this->getHTMLId($repeatCounter);
		$displayData->canUse     = $this->canUse();
//		$displayData->j3         = FabrikWorker::j3();
		$displayData->j3         = true;
		$displayData->hidden     = $this->isHidden();
		$displayData->label      = Text::_($element->label);
		$displayData->altLabel   = $this->getListHeading();
		$displayData->hasLabel   = $this->hasLabel;
		$displayData->view       =
$this->app->getInput()->get('view', 'form');
		$displayData->tip        = $this->tipHtml($model->data);
		$displayData->tipText    =
$this->tipTextAndValidations('form', $model->data);
		$displayData->rollOver   = $this->isTipped('form',
$model->data);
		$displayData->isEditable = $this->isEditable();
		$displayData->tipOpts    = $this->tipOpts();
		$displayData->labelPosition =  $this->group->labelPosition();

		$labelClass = 'form-label';

		if ($displayData->canView || $displayData->canUse)
		{
			$labelClass .= ' fabrikLabel ';

			if (empty($displayData->label))
			{
				$labelClass .= ' fabrikEmptyLabel';
			}

			if ($displayData->rollOver)
			{
				$labelClass .= ' fabrikHover';
			}

			if ($displayData->hasLabel && !$displayData->hidden)
			{
				if ($displayData->tip !== '')
				{
					//trob: this triggers FabrikJS, use layout
components\com_fabrik\layouts\element\fabrik-element-label.php
					//$labelClass .= ' fabrikTip';
				}
			}
		}

		$displayData->icons = '';
		$iconOpts           = array('icon-class' =>
'small');

		if ($displayData->rollOver)
		{
			$displayData->icons .=
FabrikHelperHTML::image('question-sign', 'form', $tmpl,
$iconOpts) . ' ';
		}

		if ($displayData->isEditable)
		{
			$displayData->icons .= $this->validator->labelIcons();
		}

		$displayData->labelClass = $labelClass;
		$layout                  =
FabrikHelperHTML::getLayout('fabrik-element-label',
$this->labelPaths());

		$str = $layout->render($displayData);

		return $str;
	}

	/**
	 * Get an array of paths to look for the element template.
	 *
	 * @return array
	 */
	protected function labelPaths()
	{
		// base built-in layouts
		$basePath       = COM_FABRIK_BASE .
'components/com_fabrik/layouts/element';
		$pluginPath     = COM_FABRIK_BASE . '/plugins/fabrik_element/'
. $this->getPluginName() . '/layouts';
		// Custom per template layouts
		$view = $this->getFormModel()->isEditable() ? 'form' :
'details';
		$tmplPath = COM_FABRIK_FRONTEND . '/views/'. $view .
'/tmpl/' . $this->getFormModel()->getTmpl() .
'/layouts/element/';
		$tmplElPath = COM_FABRIK_FRONTEND . '/views/'. $view .
'/tmpl/' . $this->getFormModel()->getTmpl() .
'/layouts/element/' . $this->getFullName(true, false);
		// Custom per theme layouts
		$perThemePath   = JPATH_THEMES . '/' .
$this->app->getTemplate() .
'/html/layouts/com_fabrik/element';
		$perElementPath = JPATH_THEMES . '/' .
$this->app->getTemplate() .
'/html/layouts/com_fabrik/element/' . $this->getFullName(true,
false);

		return array($basePath, $pluginPath, $tmplPath, $tmplElPath,
$perThemePath, $perElementPath);
	}

	/**
	 * Set fabrikErrorMessage div with potential error messages
	 *
	 * @param   int    $repeatCounter repeat counter
	 * @param   string $tmpl          template
	 *
	 * @return  string
	 */
	protected function addErrorHTML($repeatCounter, $tmpl = '')
	{
		$err               = $this->getErrorMsg($repeatCounter);
		$err               = htmlspecialchars($err, ENT_QUOTES);
		$layout            =
FabrikHelperHTML::getLayout('element.fabrik-element-error');
		$displayData       = new stdClass;
		$displayData->err  = $err;
		$displayData->tmpl = $tmpl;

		return $layout->render($displayData);
	}

	/**
	 * Add tips on element labels
	 * does ACL check on element's label in details setting
	 *
	 * @param   string $txt  Label
	 * @param   array  $data Row data
	 * @param   string $mode Form/list render context
	 *
	 * @return  string  Label with tip
	 */
	protected function rollover_old($txt, $data = array(), $mode =
'form')
	{
		if (is_object($data))
		{
			$data = ArrayHelper::fromObject($data);
		}

		$rollOver = $this->tipHtml($data, $mode);

		return $rollOver !== '' ? '<span
class="fabrikTip" ' . $rollOver . '>' . $txt .
'</span>' : $txt;
	}

	/**
	 * Add tips on element labels
	 * does ACL check on element's label in details setting
	 *
	 * @param   string $txt  Label
	 * @param   array  $data Row data
	 * @param   string $mode Form/list render context
	 *
	 * @return  string  Label with tip
	 */
	protected function rollover($txt, $data = array(), $mode =
'form')
	{
		if (is_object($data))
		{
			$data = ArrayHelper::fromObject($data);
		}

		$title    = $this->tipTextAndValidations($mode, $data);

		// $$$ hugh - only run the layout if there's a title, save row
rendering time
		if (!empty($title))
		{
			$layout                  =
FabrikHelperHTML::getLayout('element.fabrik-element-tip');
			$displayData             = new stdClass;
			$displayData->tipTitle   = $title;
			$displayData->tipText    = $txt;
			$displayData->rollOver   = $this->isTipped('form',
$data);
			$displayData->isEditable = $this->isEditable();
			$displayData->tipOpts    = $this->tipOpts();

			$rollOver = $layout->render($displayData);
		}
		else
		{
			// defensive coding for corner case of calcs with JSON data
			$rollOver = is_scalar($txt) ? (string)$txt : '';
		}

		return $rollOver;
	}

	/**
	 * Get the hover tip options
	 *
	 * @return stdClass
	 */
	protected function tipOpts()
	{
		$params         = $this->getParams();
		$opts           = new stdClass;
		$pos            = $params->get('tiplocation',
'top');
		$opts->formTip  = true;
		$opts->position = $pos;
		$opts->trigger  = 'hover';
		$opts->notice   = true;

		if ($this->editable)
		{
			if ($this->validator->hasValidations())
			{
				$opts->heading = Text::_('COM_FABRIK_VALIDATION');
			}
		}

		return $opts;
	}

	/**
	 * Get Hover tip text and validation text
	 *
	 * @param   string $mode View mode form/list
	 * @param   array  $data Model data
	 *
	 * @return string
	 */
	protected function tipTextAndValidations($mode, $data = array())
	{
		$lines = array();
		$tmpl  = $this->getFormModel()->getTmpl();

		if (($mode === 'list' ||
!$this->validator->hasValidations()) &&
!$this->isTipped($mode, $data))
		{
			return '';
		}

		if ($this->isTipped($mode, $data))
		{
			$lines[] = '<li>' .
FabrikHelperHTML::image('question-sign', 'form', $tmpl)
. ' ' . $this->getTipText($data) . '</li>';
		}

		if ($mode === 'form')
		{
			$validationTexts = $this->validator->hoverTexts();

			foreach ($validationTexts as $validationText)
			{
				$lines[] = '<li>' . $validationText .
'</li>';
			}
		}

		if (count($lines) > 0)
		{
			array_unshift($lines,'<ul class="validation-notices"
style="list-style:none">');
			$lines[] = '</ul>';
			$lines    = array_unique($lines);
			$rollOver = implode('', $lines);
			// $$$ rob - looks like htmlspecialchars is needed otherwise invalid
markup created and pdf output issues.
			$rollOver = htmlspecialchars($rollOver, ENT_QUOTES);
		}
		else
		{
			$rollOver = '';
		}

		return $rollOver;
	}

	/**
	 * Get the element tip HTML
	 *
	 * @param   array $data to use in parse holders - defaults to form's
data
	 *
	 * @return  string  tip HTML
	 */
	protected function getTipText($data = null)
	{
		if (is_null($data))
		{
			$data = $this->getFormModel()->data;
		}

		$model  = $this->getFormModel();
		$params = $this->getParams();

		if (!$model->isEditable() &&
!$params->get('labelindetails'))
		{
			return '';
		}

		$w   = new FabrikWorker;
		$tip =
$w->parseMessageForPlaceHolder($params->get('rollover'),
$data);

		if ($params->get('tipseval'))
		{
			FabrikWorker::clearEval();
			$res = Php::Eval(['code' => $tip, 'vars' =>
['data'=>$data]]);
			FabrikWorker::logEval($res, 'Caught exception (%s) on eval of
' . $this->getElement()->name . ' tip: ' .
str_replace('%','&percnt;',$tip));
			$tip = $res;
		}

		$tip = Text::_($tip);

		return $tip;
	}

	/**
	 * Used for the name of the filter fields
	 * For element this is an alias of getFullName()
	 * Overridden currently only in databasejoin class
	 *
	 * @return  string    element filter name
	 */
	public function getFilterFullName()
	{
		return FabrikString::safeColName($this->getFullName(true, false));
	}

	/**
	 * Get the field name to use in the list's slug url
	 *
	 * @param   bool $raw raw
	 *
	 * @since   3.0.6
	 *
	 * @return  string  element slug name
	 */
	public function getSlugName($raw = false)
	{
		return $this->getFilterFullName();
	}

	/**
	 * Set and override element full name (used in pw element)
	 *
	 * @param   string $name           Element name
	 * @param   bool   $useStep        Concat name with form's step
element (true) or with '.' (false) default true
	 * @param   bool   $incRepeatGroup Include '[]' at the end of
the name (used for repeat group elements) default true
	 *
	 * @return  void
	 */
	public function setFullName($name = '', $useStep = true,
$incRepeatGroup = true)
	{
		$groupModel            = $this->getGroup();
		$formModel             = $this->getFormModel();
		$element               = $this->getElement();
		$key                   = $element->id . '.' .
$groupModel->get('id') . '_' .
$formModel->getId() . '_' . $useStep . '_'
			. $incRepeatGroup;
		$this->fullNames[$key] = $name;
	}

	/**
	 * If already run then stored value returned
	 *
	 * @param   bool $useStep        Concat name with form's step element
(true) or with '.' (false) default true
	 * @param   bool $incRepeatGroup Include '[]' at the end of the
name (used for repeat group elements) default true
	 *
	 * @return  string  element full name
	 */
	public function getFullName($useStep = true, $incRepeatGroup = true)
	{
		$groupModel = $this->getGroup();
		$formModel  = $this->getFormModel();
		$listModel  = $this->getListModel();
		$element    = $this->getElement();

		$key = $element->id . '.' .
$groupModel->get('id') . '_' .
$formModel->getId() . '_' . $useStep . '_'
			. $incRepeatGroup;

		if (isset($this->fullNames[$key]))
		{
			return $this->fullNames[$key];
		}

		$table         = $listModel->getTable();
		$db_table_name = $table->db_table_name;
		$thisStep      = ($useStep) ? $formModel->joinTableElementStep :
'.';

		if ($groupModel->isJoin())
		{
			$joinModel = $groupModel->getJoinModel();
			$join      = $joinModel->getJoin();
			$fullName  = $join->table_join . $thisStep . $element->name;
		}
		else
		{
			$fullName = $db_table_name . $thisStep . $element->name;
		}

		if ($groupModel->canRepeat() == 1 && $incRepeatGroup)
		{
			$fullName .= '[]';
		}

		$this->fullNames[$key] = $fullName;

		return $fullName;
	}

	/**
	 * Get order by full name
	 *
	 * @param   bool $useStep Concat name with form's step element (true)
or with '.' (false) default true
	 *
	 * @return  string  Order by full name
	 */
	public function getOrderbyFullName($useStep = true)
	{
		return $this->getFullName($useStep);
	}

	/**
	 * When copying elements from an existing table
	 * once a copy of all elements has been made run them through this method
	 * to ensure that things like watched element id's are updated
	 *
	 * @param   array $newElements copied element ids (keyed on original
element id)
	 *
	 * @return  void
	 */
	public function finalCopyCheck($newElements)
	{
		// Overwritten in element class
	}

	/**
	 * Copy an element table row
	 *
	 * @param   int    $id       Element id to copy
	 * @param   string $copyText Feedback msg
	 * @param   int    $groupId  Group model id
	 * @param   string $name     New element name
	 *
	 * @return  mixed    Error or new row
	 */
	public function copyRow($id, $copyText = 'Copy of %s', $groupId
= null, $name = null)
	{
		/** @var FabrikTableElement $rule */
		$rule = FabTable::getInstance('Element',
'FabrikTable');

		$rule->load((int) $id);
		$rule->id    = null;
		$rule->label = sprintf($copyText, $rule->label);

		if (!is_null($groupId))
		{
			$rule->group_id = $groupId;
		}

		if (!is_null($name))
		{
			$rule->name = $name;
		}

		$groupModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Group',
'FabrikFEModel');
		$groupModel->setId($groupId);
		$groupListModel = $groupModel->getListModel();

		// $$$ rob - if its a joined group then it can have the same element
names
		if ((int) $groupModel->getGroup()->is_join === 0)
		{
			if ($groupListModel->fieldExists($rule->name, array(),
$groupModel))
			{
				$this->app->enqueueMessage(Text::_('COM_FABRIK_ELEMENT_NAME_IN_USE'),
'error');

				return false;
			}
		}

		$date = $this->date;
		$tz   = new \DateTimeZone($this->app->get('offset'));
		$date->setTimezone($tz);
		$rule->created         = $date->toSql();
		$params                = $rule->params == '' ? new stdClass
: json_decode($rule->params);
		$params->parent_linked = 1;
		$rule->params          = json_encode($params);
		$rule->parent_id       = $id;
		$config                =
ComponentHelper::getParams('com_fabrik');

		if ($config->get('unpublish_clones', false))
		{
			$rule->published = 0;
		}

		$rule->store();

		/**
		 * I thought we did this in an overridden element model method, like
onCopy?
		 * if its a database join then add in a new join record
		 */
		if (is_a($this, 'PlgFabrik_ElementDatabasejoin'))
		{
			$join = FabTable::getInstance('Join',
'FabrikTable');
			$join->load(array('element_id' => $id));
			$join->id         = null;
			$join->element_id = $rule->id;
			$join->group_id   = $rule->group_id;
			$join->store();
		}

		// Copy js events
		$db    = FabrikWorker::getDbo(true);
		$query = $db->getQuery(true);
		$query->select('id')->from('#__fabrik_jsactions')->where('element_id
= ' . (int) $id);
		$db->setQuery($query);
		$actions = $db->loadColumn();

		foreach ($actions as $id)
		{
			$jsCode = FabTable::getInstance('Jsaction',
'FabrikTable');
			$jsCode->load($id);
			$jsCode->id         = 0;
			$jsCode->element_id = $rule->id;
			$jsCode->store();
		}

		return $rule;
	}

	/**
	 * Get the element's raw label (used for details view, not wrapped in
<label> tags
	 *
	 * @return  string  Label
	 */
	protected function getRawLabel()
	{
		return $this->element->label;
	}

	/**
	 * This was in the views display and _getElement code but seeing as its
used
	 * by multiple views its safer to have it here
	 *
	 * @param   int    $c       Repeat group counter
	 * @param   int    $elCount Order in which the element is shown in the
form
	 * @param   string $tmpl    Template
	 *
	 * @return  mixed    - false if you shouldn't continue to render the
element
	 */
	public function preRender($c, $elCount, $tmpl)
	{
		$model      = $this->getFormModel();
		$groupModel = $this->getGroup();
		$group      = $groupModel->getGroupProperties($model);

		if (!$this->canUse() && !$this->canView())
		{
			return false;
		}

		if (!$this->canUse())
		{
			$this->setEditable(false);
		}
		else
		{
			$editable = $model->isEditable() ? true : false;
			$this->setEditable($editable);
		}

		// Force reload?
		$this->HTMLids     = null;
		$elementTable      = $this->getElement();
		$element           = new stdClass;
		$element->startRow = 0;
		$element->endRow   = 0;
		$elHTMLName        = $this->getFullName();

		// If the element is in a join AND is the join's foreign key then we
don't show the element
		if ($elementTable->name == $this->_foreignKey)
		{
			$element->label        = '';
			$element->error        = '';
			$this->element->hidden = true;
		}
		else
		{
			$element->error = $this->getErrorMsg($c);
		}

		$element->plugin         = $elementTable->plugin;
		$element->hidden         = $this->isHidden();
		$element->id             = $this->getHTMLId($c);
		$element->className      = 'fb_el_' . $element->id;
		//$element->containerClass = $this->containerClass($element);
		$element->element        = $this->preRenderElement($model->data,
$c);
		$element->bsClass        = $this->getBsClass();

		// Ensure that view data property contains the same html as the
group's element
		$model->tmplData[$elHTMLName] = $element->element;
		$element->label_raw           = Text::_($this->getRawLabel());

		// GetLabel needs to know if the element is editable
		if ($elementTable->name != $this->_foreignKey)
		{
			$l              = $this->getLabel($c, $tmpl);
			$w              = new FabrikWorker;
			$element->label = $w->parseMessageForPlaceHolder($l,
$model->data);
		}

		$element->errorTag   = $this->addErrorHTML($c, $tmpl);
		$element->element_ro = $this->getROElement($model->data, $c);
		$element->value      = $this->getValue($model->data, $c);
		$element->containerClass = $this->containerClass($element);

		$elName = $this->getFullName(true, false);

		if (array_key_exists($elName . '_raw', $model->data))
		{
			$element->element_raw = $model->data[$elName . '_raw'];
		}
		else
		{
			$element->element_raw = array_key_exists($elName, $model->data) ?
$model->data[$elName] : $element->value;
		}

		if ($this->dataConsideredEmpty($element->element_ro, $c))
		{
			$element->containerClass .= ' fabrikDataEmpty';
			$element->dataEmpty = true;
		}
		else
		{
			$element->dataEmpty = false;
		}

		// Tips (if not rendered as hovers)
		$tip = $this->getTipText();

		if ($tip !== '')
		{
			$tip = FabrikHelperHTML::image('question-sign',
'form', $tmpl) . ' ' . $tip;
		}

		$element->labels  = $groupModel->labelPosition('form');
		$element->dlabels =
$groupModel->labelPosition('details');

		switch ($model->getParams()->get('tiplocation'))
		{
			default:
			case 'tip':
				$element->tipAbove = '';
				$element->tipBelow = '';
				$element->tipSide  = '';
				break;
			case 'above':
				$element->tipAbove = $tip;
				$element->tipBelow = '';
				$element->tipSide  = '';
				break;
			case 'below':
				$element->tipAbove = '';
				$element->tipBelow = $tip;
				$element->tipSide  = '';
				break;
			case 'side':
				$element->tipAbove = '';
				$element->tipBelow = '';
				$element->tipSide  = $tip;
				break;
		}

		return $element;
	}

	/**
	 * Build the tip HTML
	 *
	 * @param   array  $data Data
	 * @param   string $mode Mode Form/List
	 *
	 * @return string
	 */
	protected function tipHtml($data = array(), $mode = 'form')
	{
		$title = $this->tipTextAndValidations($mode, $data);
		$opts  = $this->tipOpts();
		$opts  = json_encode($opts);

		return $title !== '' ? 'title="' . $title .
'" opts=\'' . $opts . '\'' :
'';
	}

	/**
	 * Get the class name for the element wrapping dom object
	 *
	 * @param   object $element element row
	 *
	 * @since   3.0
	 *
	 * @return  string    class names
	 */
	protected function containerClass($element)
	{
		$item = $this->getElement();
		$c    = array('fabrikElementContainer', 'plg-' .
$item->plugin, $element->className);

		if ($element->hidden)
		{
			$c[] = 'fabrikHide';
		}
		else
		{
			/**
			 * $$$ hugh - adding a class name for repeat groups, as per:
			 * http://fabrikar.com/forums/showthread.php?p=165128#post165128
			 * But as per my response on that thread, if this turns out to be a
performance
			 * hit, may take it out.  That said, I think having this class will make
things
			 * easier for custom styling when the element ID isn't constant.
			 */
			$groupModel = $this->getGroupModel();

			if ($groupModel->canRepeat())
			{
				$c[] = 'fabrikRepeatGroup___' . $this->getFullName(true,
false);
			}
		}

		if ($element->error != '')
		{
			$c[] = 'fabrikError';
		}

		$c[] = $this->getParams()->get('containerclass',
'');

		$c[] = $this->getRowClassRO($element);

		// first run plugins, which may set row class
		$formModel = $this->getFormModel();
		$args = new stdClass;
		$args->rowClass = [];
		$args->data = $formModel->data;
		$pluginResults =
\Fabrik\Helpers\Worker::getPluginManager()->runPlugins(
			'onElementContainerClass',
			$formModel,
			'form',
			$this,
			$args
		);

		$c = array_merge($c, $args->rowClass);

		return implode(' ', $c);
	}

	/**
	 * Merge the rendered element into the views element storage arrays
	 *
	 * @param   object $element            to merge
	 * @param   array  &$aElements         element array
	 * @param   array  &$namedData         Form data
	 * @param   array  &$aSubGroupElements sub group element array
	 *
	 * @return  void
	 */
	public function stockResults($element, &$aElements, &$namedData,
&$aSubGroupElements)
	{
		$elHTMLName                           = $this->getFullName();
		$aElements[$this->getElement()->name] = $element;

		/**
		 * $$$ rob 12/10/2012 - $namedData is the formModels data - commenting
out as the form data needs to be consistent
		 * as we loop over elements - this was setting from a string to an object
?!!!???!!
		 * $namedData[$elHTMLName] = $element;
		 */
		if ($elHTMLName)
		{
			// $$$ rob was keyed on int but that's not very useful for
templating
			$aSubGroupElements[$this->getElement()->name] = $element;
		}
	}

	/**
	 * Pre-render just the element (no labels etc.)
	 * Was _getElement but this was ambiguous with getElement() and method is
public
	 *
	 * @param   array $data          data
	 * @param   int   $repeatCounter repeat group counter
	 *
	 * @return  string
	 */
	public function preRenderElement($data, $repeatCounter = 0)
	{
		$groupModel = $this->getGroupModel();

		if (!$this->canView() && !$this->canUse())
		{
			return '';
		}
		// Used for working out if the element should behave as if it was in a
new form (joined grouped) even when editing a record
		$this->inRepeatGroup = $groupModel->canRepeat();
		$this->_inJoin       = $groupModel->isJoin();
		$opts                = array('runplugins' => 1);
		$this->getValue($data, $repeatCounter, $opts);

		if ($this->isEditable())
		{
			return $this->render($data, $repeatCounter);
		}
		else
		{
			$htmlId = $this->getHTMLId($repeatCounter);

			// $$$ rob even when not in ajax mode the element update() method may be
called in which case we need the span
			// $$$ rob changed from span wrapper to div wrapper as element's
content may contain divs which give html error

			// Placeholder to be updated by ajax code
			// @TODO the entity decode causes problems on RO with tooltips
			$v = $this->getROElement($data, $repeatCounter);
			$v = html_entity_decode($v);
			//$v = $v == '' ? '&nbsp;' : $v;

			return '<div class="fabrikElementReadOnly"
id="' . $htmlId . '">' . $v .
'</div>';
		}
	}

	/**
	 * Get read-only element
	 * Was _getROElement() but is a public method
	 *
	 * @param   array $data          data
	 * @param   int   $repeatCounter repeat group counter
	 *
	 * @return  string
	 */
	public function getROElement($data, $repeatCounter = 0)
	{
		if (!$this->canView() && !$this->canUse())
		{
			return '';
		}

		$editable = $this->isEditable();
		$this->setEditable(false);
		$v = $this->render($data, $repeatCounter);
		$this->addCustomLink($v, $data, $repeatCounter);
		$this->setEditable($editable);

		return $v;
	}

	/**
	 * Add custom link to element - must be uneditable for link to be added
	 *
	 * @param   string &$v            value
	 * @param   array  $data          row data
	 * @param   int    $repeatCounter repeat counter
	 *
	 * @return  string
	 */
	protected function addCustomLink(&$v, $data, $repeatCounter = 0)
	{
		if ($this->isEditable())
		{
			return $v;
		}

		$params     = $this->getParams();
		$customLink = $params->get('custom_link', '');

		if ($customLink !== '' &&
$this->getElement()->link_to_detail == '1' &&
$params->get('custom_link_indetails', true))
		{
			$w = new FabrikWorker;

			/**
			 * $$$ hugh - this should really happen elsewhere, but I needed a quick
fix for handling
			 * {slug} in detail view links, which for some reason are not
'stringURLSafe' at this point,
			 * so they are like "4:A Page Title" instead of
4-a-page-title.
			 */
			if (strstr($customLink, '{slug}') &&
array_key_exists('slug', $data))
			{
				$slug       = str_replace(':', '-',
$data['slug']);
				$slug       = ApplicationHelper::stringURLSafe($slug);
				$customLink = str_replace('{slug}', $slug, $customLink);
			}

			/**
			 * Testing new parseMessageForRepeats(), see comments on the function
itself.
			 */
			$customLink = $w->parseMessageForRepeats($customLink, $data, $this,
$repeatCounter);

			$customLink = $w->parseMessageForPlaceHolder($customLink, $data);
			$customLink =
$this->getListModel()->parseMessageForRowHolder($customLink, $data);

			if (trim($customLink) !== '')
			{
				$v = '<a href="' . $customLink . '"
data-iscustom="1">' . $v . '</a>';
			}
		}

		return $v;
	}

	/**
	 * Get any html error messages
	 *
	 * @param   int $repeatCount group repeat count
	 *
	 * @return  string    error messages
	 */
	protected function getErrorMsg($repeatCount = 0)
	{
		$arErrors    = $this->getFormModel()->errors;
		$parsed_name = $this->getFullName();
		$err_msg     = '';
		$parsed_name = FabrikString::rtrimword($parsed_name, '[]');

		if (isset($arErrors[$parsed_name]))
		{
			if (array_key_exists($repeatCount, $arErrors[$parsed_name]))
			{
				if (is_array($arErrors[$parsed_name][$repeatCount]))
				{
					$err_msg = implode('<br />',
$arErrors[$parsed_name][$repeatCount]);
				}
				else
				{
					$err_msg .= $arErrors[$parsed_name][$repeatCount];
				}
			}
		}

		return $err_msg;
	}

	/**
	 * Draws the html form element
	 *
	 * @param   array $data          To pre-populate element with
	 * @param   int   $repeatCounter Repeat group counter
	 *
	 * @return  string    elements html
	 */
	public function render($data, $repeatCounter = 0)
	{
		return 'need to overwrite in element plugin class';
	}

	/**
	 * Format the read only output for the page
	 *
	 * @param   string $value Initial value
	 * @param   string $label Label
	 *
	 * @return  string  Read only value
	 */
	protected function getReadOnlyOutput($value, $label)
	{
		$params = $this->getParams();

		if ($params->get('icon_folder') != -1 &&
$params->get('icon_folder') != '')
		{
			$icon = $this->replaceWithIcons($value);

			if ($this->iconsSet)
			{
				$label = $icon;
			}
		}

		return $label;
	}

	/**
	 * Get hidden field
	 *
	 * @param   string $name  Element name
	 * @param   string $value Element value
	 * @param   string $id    Element id
	 * @param   string $class Class name
	 *
	 * @return string
	 */
	protected function getHiddenField($name, $value, $id = '',
$class = 'fabrikinput inputbox hidden')
	{
		$value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8');
		$opts  = array('class' => $class, 'type' =>
'hidden', 'name' => $name, 'value' =>
$value, 'id' => $id);

		return $this->buildInput('input', $opts);
	}

	/**
	 * Helper method to build an input field
	 *
	 * @deprecated use LayoutInterfaces instead
	 *
	 * @param   string $node     Input type default 'input'
	 * @param   array  $bits     Input property => value
	 * @param   bool   $shortTag Is $node a <node/> or
<node></node> tag
	 *
	 * @return  string  input
	 */
	protected function buildInput($node = 'input', $bits = array(),
$shortTag = true)
	{
		$str = '<' . $node . ' ';

		$value = '';

		foreach ($bits as $key => $val)
		{
			if ($node === 'textarea' && $key ===
'value')
			{
				$value = $val;
				continue;
			}

			$str .= $key . '="' . $val . '" ';
		}

		$str .= $shortTag ? '' : '>';

		if (!$shortTag && $value !== '')
		{
			$str .= $value;
		}

		$str .= $shortTag ? '/>' : '</' . $node .
'>';

		return $str;
	}

	/**
	 * Helper function to build the property array used in buildInput()
	 *
	 * @param   int   $repeatCounter Repeat group counter
	 * @param   mixed $type          Null/string $type property (if null then
password/text applied as default)
	 *
	 * @return  array  input properties key/value
	 */
	protected function inputProperties($repeatCounter, $type = null)
	{
		$bits    = array();
		$element = $this->getElement();
		$params  = $this->getParams();
		$size    = (int) $element->width < 0 ? 1 : (int)
$element->width;

		if (!isset($type))
		{
			// Changes by JF Questiaux - info@betterliving.be
			switch ($params->get('password')) // Kept the name
'password' for backward compatibility
			{
				case '1' :
					$type = 'password';
					break;
				case '2' :
					$type = 'tel';
					break;
				case '3' :
					$type = 'email';
					break;
				case '4' :
					$type = 'search';
					break;
				case '5' :
					$type = 'url';
					break;
				case '6' :
					$type = 'number';
					break;
				default :
					$type = 'text';
			}
			// End of changes
		}

		$maxLength = $params->get('maxlength');

		if ($maxLength == '0' or $maxLength == '')
		{
			$maxLength = $size;
		}

		$class          = array();

		// Bootstrap 3
		$class[] = 'form-control';

		if ($this->elementError != '')
		{
			$class[] = ' elementErrorHighlight';
		}

		if ($element->hidden == '1')
		{
			$class[] = ' hidden';
			$type    = 'hidden';
		}

		$bits['type'] = $type;
		$bits['id']   = $this->getHTMLId($repeatCounter);
		$bits['name'] = $this->getHTMLName($repeatCounter);

		if (!$element->hidden)
		{
			$bits['size']      = $size;
			$bits['maxlength'] = $maxLength;
		}

		$class[]       = 'fabrikinput inputbox';
		$bits['class'] = implode(' ', $class);

		if ($params->get('placeholder', '') !==
'')
		{
			$bits['placeholder'] =
Text::_($params->get('placeholder'));
		}

		if ($params->get('autocomplete', 1) == 0)
		{
			$bits['autocomplete'] = 'off';
		}
		// Cant be used with hidden element types
		if ($element->hidden != '1')
		{
			if ($params->get('readonly'))
			{
				$bits['readonly'] = "readonly";
				$bits['class'] .= " readonly";
			}

			if ($params->get('disable'))
			{
				$bits['class'] .= " disabled";
				$bits['disabled'] = 'disabled';
			}
		}

		return $bits;
	}

	/**
	 * get the id used in the html element
	 *
	 * @param   int $repeatCounter group counter
	 *
	 * @return  string
	 */
	public function getHTMLId($repeatCounter = 0)
	{
		if (!is_array($this->HTMLids))
		{
			$this->HTMLids = array();
		}

		if (!array_key_exists((int) $repeatCounter, $this->HTMLids))
		{
			$groupModel = $this->getGroup();
			$listModel  = $this->getListModel();
			$table      = $listModel->getTable();
			$element    = $this->getElement();

			if ($groupModel->isJoin())
			{
				$joinModel = $groupModel->getJoinModel();
				$joinTable = $joinModel->getJoin();
				$fullName  = $joinTable->table_join . '___' .
$element->name;
			}
			else
			{
				$fullName = $table->db_table_name . '___' .
$element->name;
			}

			// Change the id for detailed view elements
			if ($this->inDetailedView)
			{
				$fullName .= '_ro';
			}

			if ($groupModel->canRepeat())
			{
				$fullName .= '_' . $repeatCounter;
			}

			$this->HTMLids[$repeatCounter] = $fullName;
		}

		return $this->HTMLids[$repeatCounter];
	}

	/**
	 * get the element html name
	 *
	 * @param   int $repeatCounter group counter
	 *
	 * @return  string
	 */
	public function getHTMLName($repeatCounter = 0)
	{
		$groupModel = $this->getGroup();
		$table      = $this->getListModel()->getTable();
		$element    = $this->getElement();

		if ($groupModel->isJoin())
		{
			$joinModel = $groupModel->getJoinModel();
			$joinTable = $joinModel->getJoin();
			$fullName  = $joinTable->table_join . '___' .
$element->name;
		}
		else
		{
			$fullName = $table->db_table_name . '___' .
$element->name;
		}

		if ($groupModel->canRepeat())
		{
			// $$$ rob - always use repeatCounter in html names - avoids ajax post
issues with mootools1.1
			$fullName .= '[' . $repeatCounter . ']';
		}

		if ($this->hasSubElements)
		{
			$fullName .= '[]';
		}
		// @TODO: check this - repeated elements do need to have something
applied to their id based on their order in the repeated groups

		$this->elementHTMLName = $fullName;

		return $this->elementHTMLName;
	}

	/**
	 * Load element params
	 *
	 * @return  Registry  default element params
	 */
	public function getParams()
	{
		if (!isset($this->params))
		{
			$this->params = new Registry($this->getElement()->params);
		}

		return $this->params;
	}

	/**
	 * Not used
	 *
	 * @deprecated
	 *
	 * @return  mixed
	 */
	protected function loadPluginParams()
	{
		if (isset($this->xmlPath))
		{
			$element      = $this->getElement();
			$pluginParams = new Registry($element->params);

			return $pluginParams;
		}

		return false;
	}

	/**
	 * Loads in elements validation objects
	 *
	 * @deprecated use $this->validator->findAll()
	 *
	 * @return  array    validation objects
	 */
	public function getValidations()
	{
		return $this->validator->findAll();
	}

	/**
	 * get javascript actions
	 *
	 * @deprecated ?
	 *
	 * @return  array  js actions
	 */
	public function getJSActions()
	{
		if (!isset($this->jsActions))
		{
			$query = $this->_db->getQuery();
			$query->select('*')->from('#__fabrik_jsactions')->where('element_id
= ' . (int) $this->id);
			$this->_db->setQuery($query);
			$this->jsActions = $this->_db->loadObjectList();
		}

		return $this->jsActions;
	}

	/**
	 *Create the js code to observe the elements js actions
	 *
	 * @param   string $jsControllerKey Either form_ or _details
	 * @param   int    $repeatCount     Counter
	 *
	 * @return  string    js events
	 */
	public function getFormattedJSActions($jsControllerKey, $repeatCount)
	{
		$jsStr        = '';
		$allJsActions = $this->getFormModel()->getJsActions();
		/**
		 * hugh - only needed getParent when we weren't saving changes to
parent params to child
		 * which we should now be doing ... and getParent() causes an extra table
lookup for every child
		 * element on the form.
		 * $element = $this->getParent();
		 */
		$element = $this->getElement();
		$w       = new FabrikWorker;

		if (array_key_exists($element->id, $allJsActions))
		{
			$elId = $this->getHTMLId($repeatCount);

			foreach ($allJsActions[$element->id] as $jsAct)
			{
				$js = $jsAct->code;
				$js = str_replace(array("\n", "\r"), "",
$js);

				// Don't think we need to do this any more, although removing it
will break bc
				/*
				if ($jsAct->action == 'load')
				{
					// JS code is already stored in the db as htmlspecialchars()
09/08/2013
					$quote = '&#039;';
					$js    = preg_replace('#\bthis\b#', 'document.id('
. $quote . $elId . $quote . ')', $js);
				}
				*/

				if ($jsAct->action != '' && $js !== '')
				{
					$jsSlashes = addslashes($js);
					$jsStr .= $jsControllerKey .
".dispatchEvent('$element->plugin', '$elId',
'$jsAct->action', '$jsSlashes');\n";
				}
				else
				{
					// Build wysiwyg code
					if (isset($jsAct->js_e_event) && $jsAct->js_e_event !=
'')
					{
						// $$$ rob get the correct element id based on the repeat counter
						$triggerEl =
$this->getFormModel()->getElement(str_replace('fabrik_trigger_element_',
'', $jsAct->js_e_trigger));
						$triggerid = is_object($triggerEl) ? 'element_' .
$triggerEl->getHTMLId($repeatCount) : $jsAct->js_e_trigger;

						$key = $elId . serialize($jsAct);

						if (array_key_exists($key, self::$fxAdded))
						{
							// Avoid duplicate events
							continue;
						}

						$jsStr .= $jsControllerKey .
".addElementFX('$triggerid',
'$jsAct->js_e_event');\n";
						self::$fxAdded[$key] = true;

						$f                 = InputFilter::getInstance();
						$post              = $f->clean($_POST, 'array');
						$jsAct->js_e_value =
$w->parseMessageForPlaceHolder(htmlspecialchars_decode($jsAct->js_e_value),
$post);

						if ($jsAct->js_e_condition == 'hidden')
						{
							$js = "if (this.getContainer().getStyle('display')
=== 'none') {";
						}
						elseif ($jsAct->js_e_condition == 'shown')
						{
							$js = "if (this.getContainer().getStyle('display')
!== 'none') {";
						}
						elseif ($jsAct->js_e_condition == 'CONTAINS')
						{
							$js = "if (this.get('value') !== null ";
							$js .= " &&
(Array.from(this.get('value')).contains('$jsAct->js_e_value')";
							$js .= " ||
this.get('value').contains('$jsAct->js_e_value'))";
							$js .= ") {";
						}
						elseif ($jsAct->js_e_condition == '!CONTAINS')
						{
							$js = "if (this.get('value') === null ";
							$js .= " ||
(!Array.from(this.get('value')).contains('$jsAct->js_e_value')";
							$js .= " ||
!this.get('value').contains('$jsAct->js_e_value'))";
							$js .= ") {";
						}
						// $$$ hugh if we always quote the js_e_value, numeric comparison
doesn't work, as '100' < '3'.
						// So let's assume if they use <, <=, > or >= they
mean numbers.
						elseif (in_array($jsAct->js_e_condition, array('<',
'<=', '>', '>=')))
						{
							$js .= "if(this.get('value').toFloat()
$jsAct->js_e_condition '$jsAct->js_e_value'.toFloat())
{";
						}
						elseif ($jsAct->js_e_condition == 'regex')
						{
							if (preg_match('#^/.+/\w*#', $jsAct->js_e_value))
							{
								$js .= "if
(this.get('value').toString().test(%%REGEX%%)) {";
							}
							else
							{
								$js .= "if
(this.get('value').toString().test(/%%REGEX%%/)) {";
							}
						}
						elseif ($jsAct->js_e_condition == '!regex')
						{
							if (preg_match('#^/.+/\w*#', $jsAct->js_e_value))
							{
								$js .= "if
(this.get('value').toString().test(%%REGEX%%)) {";
							}
							else
							{
								$js .= "if
(!this.get('value').toString().test(/%%REGEX%%/)) {";
							}
						}
						else
						{
							$js = "if (this.get('value')
$jsAct->js_e_condition '$jsAct->js_e_value') {";
						}

						// Need to use corrected triggerid here as well
						if (preg_match('#^fabrik_trigger#', $triggerid))
						{
							$js .= "Fabrik.getBlock('" . $jsControllerKey .
"').doElementFX('" . $triggerid . "',
'$jsAct->js_e_event', this)";
						}
						else
						{
							$js .= "Fabrik.getBlock('" . $jsControllerKey .
"').doElementFX('fabrik_trigger_" . $triggerid .
"', '$jsAct->js_e_event', this)";
						}

						$js .= "}";
						$js = addslashes($js);
						$js = str_replace('%%REGEX%%', $jsAct->js_e_value, $js);
						$js = str_replace(array("\n", "\r"),
"", $js);
						$jsStr .= $jsControllerKey .
".dispatchEvent('$element->plugin', '$elId',
'$jsAct->action', '$js');\n";
					}
				}
			}
		}

		return $jsStr;
	}

	/**
	 * Get the default value for the list filter
	 *
	 * @param   bool $normal  is the filter a normal or advanced filter
	 * @param   int  $counter filter order
	 *
	 * @return  string
	 */
	protected function getDefaultFilterVal($normal = true, $counter = 0)
	{
		$input = $this->app->getInput();

		// Used for update col list plugin - we don't want a default value
filled
		if ($input->get('fabrikIngoreDefaultFilterVal', false))
		{
			return '';
		}

		$listModel = $this->getListModel();
		$filters   = $listModel->getFilterArray();

		// $$$ rob test for db join fields
		//$elName = $this->getFilterFullName();
		$elName = $this->getFullName(true, false);
		$elid   = $this->getElement()->id;
		$f      = InputFilter::getInstance();
		$data   = $f->clean($_REQUEST, 'array');

		// See if the data is in the request array - can use
tablename___elementname=filterval in query string
		$default = '';

		if (array_key_exists($elName, $data))
		{
			if (is_array($data[$elName]))
			{
				$default = @$data[$elName]['value'];
			}
		}

		$context = 'com_' . $this->package . '.list' .
$listModel->getRenderContext() . '.filter.' . $elid;
		$context .= $normal ? '.normal' : '.advanced';

		// We didn't find anything - lets check the filters
		if ($default == '')
		{
			if (empty($filters))
			{
				return '';
			}

			if (array_key_exists('elementid', $filters))
			{
				/**
				 * $$$ hugh - if we have one or more pre-filters on the same element
that has a normal filter,
				 * the following line doesn't work. So in 'normal' mode
we need to get all the keys,
				 * and find the 'normal' one.
				 * $k = $normal == true ? array_search($elid,
$filters['elementid']) : $counter;
				 */
				$k = false;

				if ($normal)
				{
					$keys = array_keys($filters['elementid'], $elid);

					foreach ($keys as $key)
					{
						/**
						 * $$$ rob 05/09/2011 - just testing for 'normal' is not
enough as there are several search_types
						 * i.e. I've added a test for Querystring filters as without
that the search values were
						 * not being shown in ranged filter fields
						 */
						if (in_array($filters['search_type'][$key],
array('normal', 'querystring',
'jpluginfilters')))
						{
							$k = $key;
							continue;
						}
					}
				}
				else
				{
					$k = $counter;
				}
				// Is there a filter with this elements name
				if ($k !== false)
				{
					$searchType =
FArrayHelper::getValue($filters['search_type'], $k);

					// Check element name is the same as the filter (could occur in
advanced search when swapping element type)
					if ($searchType <> 'advanced' ||
$filters['key'][$k] ===
$input->getString('element'))
					{
						/**
						 * if its a search all filter don't use its value.
						 * if we did the next time the filter form is submitted its value is
turned
						 * from a search all filter into an element filter
						 */
						if (!is_null($searchType) && $searchType !=
'searchall')
						{
							if ($searchType != 'prefilter')
							{
								$default = FArrayHelper::getValue($filters['origvalue'],
$k);
							}
						}
					}
				}
			}
		}

		$default = $this->app->getUserStateFromRequest($context, $elid,
$default);
		$fType   = $this->getElement()->filter_type;

		if ($this->multiOptionFilter())
		{
			$default = (is_array($default) &&
array_key_exists('value', $default)) ?
$default['value'] : $default;

			if (is_array($default))
			{
				// Hidden querystring filters can be using ranged valued though
				if (!in_array($fType, array('hidden', 'checkbox',
'multiselect', 'range')))
				{
					// Weird thing on meow where when you first load the task list the id
element had a date range filter applied to it????
					$default = '';
				}
			}
			else
			{
				$default = stripslashes($default);
			}
		}

		return $default;
	}

	/**
	 * Is the element filter type a multi-select
	 *
	 * @return boolean
	 */
	protected function multiOptionFilter()
	{
		$fType = $this->getElement()->filter_type;

		return in_array($fType, array('range', 'checkbox',
'multiselect'));
	}

	/**
	 * If the search value isn't what is stored in the database, but
rather what the user
	 * sees then switch from the search string to the db value here
	 * overwritten in things like checkbox and radio plugins
	 *
	 * @param   string $value FilterVal
	 *
	 * @return  string
	 */
	protected function prepareFilterVal($value)
	{
		return $value;
	}

	/**
	 * Get the filter name
	 *
	 * @param   int  $counter Filter order
	 * @param   bool $normal  Do we render as a normal filter or as an
advanced search filter
	 *
	 * @return  string
	 */
	protected function filterName($counter = 0, $normal = true)
	{
		$listModel = $this->getListModel();
		$v         = 'fabrik___filter[list_' .
$listModel->getRenderContext() . '][value]';
		$v .= $normal ? '[' . $counter . ']' :
'[]';

		return $v;
	}

	/**
	 * Get the list filter for the element
	 *
	 * @param   int  $counter Filter order
	 * @param   bool $normal  Do we render as a normal filter or as an
advanced search filter
	 *                        if normal include the hidden fields as well
(default true, use false for advanced filter
	 *                        rendering)
	 *
	 * @return  string    Filter html
	 */
	public function getFilter($counter = 0, $normal = true, $container =
'')
	{
		$listModel = $this->getListModel();
		$formModel = $listModel->getFormModel();
		$dbElName  = $this->getFullName(false, false);

		if (!$formModel->hasElement($dbElName))
		{
			return '';
		}

		$element = $this->getElement();
		$elName  = $this->getFullName(true, false);
		$v       = $this->filterName($counter, $normal);

		// Correct default got
		$default                   = $this->getDefaultFilterVal($normal,
$counter);
		$this->filterDisplayValues = array($default);
		$return                    = array();

		if (in_array($element->filter_type, array('range',
'dropdown', 'checkbox', 'multiselect')))
		{
			$rows = $this->filterValueList($normal);
			$this->unmergeFilterSplits($rows);

			if (!in_array($element->filter_type, array('checkbox',
'multiselect')))
			{
				array_unshift($rows, HTMLHelper::_('select.option',
'', $this->filterSelectLabel()));
			}

			$this->getFilterDisplayValues($default, $rows);

			foreach ($rows as &$r)
			{
				// translate
				$r->text = Text::_($r->text);

				// decode first, to decode all hex entities (like &#39;)
				$r->text = html_entity_decode($r->text, ENT_QUOTES | ENT_XML1,
'UTF-8');

				// Encode if necessary
				if (!in_array($element->get('filter_type'),
array('checkbox')))
				{
					/**
					 * Special case, pick out alt="foo" string if the text is an
img tag in a dropdown
					 */
					$m = [];

					if ($element->get('filter_type') === 'dropdown'
&&
preg_match('/<img\s+.*?alt="(.*?)".*>/',
$r->text, $m))
					{
						$r->text = $m[1];
					}
					else
					{
						$r->text = strip_tags($r->text);
					}

					$r->text = htmlspecialchars($r->text, ENT_NOQUOTES,
'UTF-8', false);
				}
			}
		}

		switch ($element->filter_type)
		{
			case 'range':
				$this->rangedFilterFields($default, $return, $rows, $v,
'list');
				break;
			case 'checkbox':
				$return[] = $this->checkboxFilter($rows, $default, $v);
				break;
			case 'dropdown':
			case 'multiselect':
				$return[] = $this->selectFilter($rows, $default, $v);
				break;

			case 'field':
			default:
				$return[] = $this->singleFilter($default, $v);
				break;

			case 'hidden':
				if (is_array($default))
				{
					$this->rangedFilterFields($default, $return, null, $v,
'hidden');
				}
				else
				{
					$return[] = $this->singleFilter($default, $v, 'hidden');
				}

				break;

			case 'auto-complete':
				$autoComplete = $this->autoCompleteFilter($default, $v, null,
$normal, $container);
				$return       = array_merge($return, $autoComplete);
				break;
		}

		$return[] = $normal ? $this->getFilterHiddenFields($counter, $elName,
false, $normal) : $this->getAdvancedFilterHiddenFields();

		return implode("\n", $return);
	}

	/**
	 * Build a select list filter
	 *
	 * @param $rows
	 * @param $default
	 * @param $v
	 *
	 * @return mixed
	 */
	protected function selectFilter($rows, $default, $v)
	{
		$class   = $this->filterClass();
		$element = $this->getElement();
		$id      = $this->getHTMLId() . 'value';

		if ($element->filter_type === 'dropdown' ||
$element->filter_type === 'multiselect')
		{
			$advancedClass = $this->getAdvancedSelectClass();
			$class .= !empty($advancedClass) ? ' ' . $advancedClass :
'';
		}

		$max  = count($rows) < 7 ? count($rows) : 7;
		$size = $element->filter_type === 'multiselect' ?
'multiple="multiple" size="' . $max .
'"' : 'size="1"';
		$v    = $element->filter_type === 'multiselect' ? $v .
'[]' : $v;
		$data = 'data-filter-name="' . $this->getFullName(true,
false) . '"';

		return HTMLHelper::_('select.genericlist', $rows, $v,
'class="form-select-sm ' . $class . '" ' .
$size . ' ' . $data, 'value', 'text',
$default, $id);
	}

	/**
	 * Get the labels for the filter values
	 *
	 * @param   array|string $default
	 * @param   array        $rows
	 *
	 * @return  array
	 */
	protected function getFilterDisplayValues($default, $rows)
	{
		$default                   = (array) $default;
		$this->filterDisplayValues = array();

		foreach ($rows as $row)
		{
			if (in_array($row->value, $default) && $row->value !=
'')
			{
				$this->filterDisplayValues[] = $row->text;
			}
		}

		return $this->filterDisplayValues;
	}

	/**
	 * Get filter classes
	 *
	 * @since 3.1b
	 *
	 * @return  string
	 */
	protected function filterClass()
	{
		$params         = $this->getParams();
		$classes        = array('fabrik_filter');
		$bootstrapClass =
trim($this->getBsClass($params->get('filter_class',
'col-sm-4')));
		$classes[]      = $bootstrapClass;
		$classes[]      = $params->get('filter_responsive_class',
'');

		return implode(' ', $classes);
	}

	/**
	 * Checkbox filter
	 *
	 * @param   array  $rows    Filter list options
	 * @param   array  $default Selected filter values
	 * @param   string $v       Filter name
	 *
	 * @since 3.0.7
	 *
	 * @return  string  Checkbox filter LayoutInterface HTML
	 */
	protected function checkboxFilter($rows, $default, $v)
	{
		$values = array();
		$labels = array();

		foreach ($rows as $row)
		{
			$values[] = $row->value;
			$labels[] = $row->text;
		}

		$default = (array) $default;

		$layout                   =
$this->getLayout('list-filter-checkbox');
		$displayData              = new stdClass;
		$displayData->values      = $values;
		$displayData->labels      = $labels;
		$displayData->default     = $default;
		$displayData->elementName = $this->getFullName(true, false);
		$displayData->name        = $v;
		$res                      = $layout->render($displayData);

		// If no custom list layout found revert to the default
list.filter.fabrik-filter-checkbox renderer
		if ($res === '')
		{
			//$basePath = COM_FABRIK_FRONTEND . '/layouts/';
			//$layout   = new
FileLayout('list.filter.fabrik-filter-checkbox', $basePath,
array('debug' => false, 'component' =>
'com_fabrik', 'client' => 'site'));
			//$layout =
$this->getLayout('list.filter.fabrik-filter-checkbox');
			$layout =
$this->getListModel()->getLayout('list.filter.fabrik-filter-checkbox');
			$res      = $layout->render($displayData);
		}

		return $res;
	}

	/**
	 * Build ranged filter fields either as two drop-downs or two hidden
fields
	 *
	 * @param   array  $default Filter values
	 * @param   array  &$return HTML to return
	 * @param   array  $rows    Filter list options
	 * @param   string $v       Filter name
	 * @param   string $type    Show ranged values as a list or hidden
	 *
	 * @since  3.0.7
	 *
	 * @return void
	 */
	protected function rangedFilterFields($default, &$return, $rows, $v,
$type = 'list')
	{
		$element    = $this->getElement();
		$class      = $this->filterClass();
		$attributes = 'class="' . $class . '"
size="1" ';
		$attributes .= 'data-filter-name="' .
$this->getFullName(true, false) . '"';
		$default = (array) $default;

		if (count($default) === 1)
		{
			$default[1] = '';
		}

		$def0 = array_key_exists('value', $default) ?
$default['value'][0] : $default[0];
		$def1 = array_key_exists('value', $default) ?
$default['value'][1] : $default[1];

		if ($type === 'list')
		{
			$return[] = '<span
class="fabrikFilterRangeLabel">' .
Text::_('COM_FABRIK_BETWEEN') . '</span>';
			$return[] = HTMLHelper::_('select.genericlist', $rows, $v .
'[0]', $attributes, 'value', 'text', $def0,
$element->name . '_filter_range_0');
			$return[] = '<br />';
			$return[] = '<span
class="fabrikFilterRangeLabel">' .
Text::_('COM_FABRIK_AND') . '</span>';
			$return[] = HTMLHelper::_('select.genericlist', $rows, $v .
'[1]', $attributes, 'value', 'text', $def1,
$element->name . '_filter_range_1');
		}
		else
		{
			$return[] = '<input type="hidden"
data-filter-name="' . $this->getFullName(true, false) .
'" class="' .
				$class . '" name="' . $v . '[0]"
value="' . $def0 . '" id="' .
$element->name . '_filter_range_0" />';
			$return[] = '<input type="hidden"
data-filter-name="' . $this->getFullName(true, false) .
'" class="' .
				$class . '" name="' . $v . '[1]"
value="' . $def1 . '" id="' .
$element->name . '_filter_range_1" />';
		}
	}

	/**
	 * Create a input type text/hidden filter
	 *
	 * @param   string $default Value
	 * @param   string $v       Filter name
	 * @param   string $type    Type: 'text' or 'hidden'
	 *
	 * @return string  filter
	 */
	protected function singleFilter($default, $v, $type = 'text')
	{
		// $$$ hugh - for "reasons", sometimes it's an array with
one value.  No clue why.  Sod it.
		if (is_array($default))
		{
			$default = array_shift($default);
		}
		
		// $$$ rob - if searching on "O'Fallon" from querystring
filter the string has slashes added regardless
		$default = (string) $default;
		$default = stripslashes($default);
		$default = htmlspecialchars($default);
		$size    = (int) $this->getParams()->get('filter_length',
20);
		$class   = $this->filterClass();
		$id      = $this->getHTMLId() . 'value';

		return '<input type="' . $type . '"
data-filter-name="' . $this->getFullName(true, false) .
		'" name="' . $v . '" class="' .
$class . '" size="' . $size . '"
value="' . $default . '" id="'
		. $id . '" />';
	}

	/**
	 * Build the HTML ////for the auto-complete filter
	 *
	 * @param   string $default    Label
	 * @param   string $v          Field name
	 * @param   string $labelValue Label value
	 * @param   bool   $normal     Do we render as a normal filter or as an
advanced search filter
	 *                             if normal include the hidden fields as well
(default true, use false for advanced
	 *                             filter rendering)
	 *
	 * @return  array  HTML bits
	 */
	protected function autoCompleteFilter($default, $v, $labelValue = null,
$normal = true, $container = null)
	{
		if (is_null($labelValue))
		{
			$labelValue = $default;
		}

		$listModel = $this->getListModel();
		$default   = stripslashes($default);
		$default   = htmlspecialchars($default);
		$id        = $this->getHTMLId() . 'value';
		$class     = $this->filterClass();
		$size      = (int)
$this->getParams()->get('filter_length', 20);
		/**
		 * $$$ rob 28/10/2011 using selector rather than element id so we can
have n modules with the same filters
		 * showing and not produce invalid html & duplicate js calls
		 */
		$return   = array();
		$return[] = '<input type="hidden" "
data-filter-name="' . $this->getFullName(true, false) .
			'" name="' . $v . '" class="' .
$class . ' ' . $id . '" value="' . $default .
'" />';
		$return[] = '<input type="text"
name="auto-complete' . $this->getElement()->id .
'" class="' . $class . ' autocomplete-trigger
'
			. $id . '-auto-complete" size="' . $size .
'" value="' . $labelValue . '" />';
		$opts     = array();

		if ($normal)
		{
			$opts['menuclass'] = 'auto-complete-container';

			if (empty($container))
			{
				$container = 'listform_' . $listModel->getRenderContext();
			}

			$selector          = '#' . $container . ' .' . $id;
		}
		else
		{
			$selector          = '.advancedSearch_' .
$listModel->getRenderContext() . ' .' . $id;
			$opts['menuclass'] = 'auto-complete-container
advanced';
		}

		$element = $this->getElement();
		$formId  = $this->getFormModel()->getId();
		FabrikHelperHTML::autoComplete($selector, $element->id, $formId,
$element->plugin, $opts);

		return $return;
	}

	/**
	 * Get drop-down filter select label
	 *
	 * @return  string
	 */
	protected function filterSelectLabel()
	{
		$params = $this->getParams();

		return $params->get('filter_required') == 1 ?
Text::_('COM_FABRIK_PLEASE_SELECT') :
Text::_('COM_FABRIK_FILTER_PLEASE_SELECT');
	}

	/**
	 * Checks if filter option values are in json format
	 * if so explode those values into new options
	 *
	 * @param   array &$rows Filter options
	 *
	 * @return null
	 */
	protected function unmergeFilterSplits(&$rows)
	{
		/*
		 * takes rows which may be in format :
		*
		* [0] => stdClass Object
		(
				[text] => ["1"]
				[value] => ["1"]
		)
		and converts them into
		[0] => CMSObject Object
		(
				[_errors:protected] => Array
				(
				)
				[value] => 1
				[text] => 1
				[disable] =>
		)
		*/
		$allValues = array();

		foreach ($rows as $row)
		{
			$allValues[] = $row->value;
		}

		$c = count($rows) - 1;

		for ($j = $c; $j >= 0; $j--)
		{
			$vals = FabrikWorker::JSONtoData($rows[$j]->value, true);
			$txt  = FabrikWorker::JSONtoData($rows[$j]->text, true);

			if (is_array($vals))
			{
				for ($i = 0; $i < count($vals); $i++)
				{
					$vals2 = FabrikWorker::JSONtoData($vals[$i], true);
					$txt2  = FabrikWorker::JSONtoData(FArrayHelper::getValue($txt, $i),
true);

					for ($jj = 0; $jj < count($vals2); $jj++)
					{
						if (!in_array($vals2[$jj], $allValues))
						{
							$allValues[] = $vals2[$jj];
							$rows[]      = HTMLHelper::_('select.option', $vals2[$jj],
$txt2[$jj]);
						}
					}
				}

				if (FabrikWorker::isJSON($rows[$j]->value, false))
				{
					// $$$ rob 01/10/2012 - if not unset then you could get json values in
standard dd filter (checkbox)
					unset($rows[$j]);
				}
			}

			if (count($vals) > 1)
			{
				unset($rows[$j]);
			}
		}
	}

	/**
	 * Run after unmergeFilterSplits to ensure filter dropdown labels are
correct
	 *
	 * @param   array &$rows filter options
	 *
	 * @return  null
	 */
	protected function reapplyFilterLabels(&$rows)
	{
		$values = $this->getSubOptionValues();
		$labels = $this->getSubOptionLabels();

		foreach ($rows as &$row)
		{
			$k = array_search($row->value, $values);

			if ($k !== false)
			{
				$row->text = $labels[$k];
			}
		}

		$rows = array_values($rows);
	}

	/**
	 * Get sub option values
	 *
	 * @param   array $data   Form data. If submitting a form, we want to use
that form's data and not
	 *                        re-query the form Model for its data as with
multiple plugins of the same type
	 *                        this was getting the plugin params out of sync.
	 *
	 * @return  array
	 */
	protected function getSubOptionValues($data = array())
	{
		$phpOpts = $this->getPhpOptions($data);

		if (!$phpOpts)
		{
			// cache, as even just fetching the params can eat up time in list with
lots of rows
			if (!isset($this->subOptionValues))
			{
				$params = $this->getParams();
				$opts   = $params->get('sub_options', '');
				$opts   = $opts == '' ? array() : (array)
@$opts->sub_values;
				$this->subOptionValues = $opts;
			}

			return $this->subOptionValues;
		}
		else
		{
			/**
			 * Paul - According to tooltip, $phpOpts should be of form
"array(JHTML: :_('select.option', '1',
'one'))"
			 * This is an array of objects with properties text and value.
			 * If user has mis-specified this we should tell them.
			 *
			 * @FIXME - $$$ hugh - seems like an empty array should be valid as
well?
			 **/
			if (!is_array($phpOpts) || !$phpOpts[0] || !is_object($phpOpts[0]) ||
!isset($phpOpts[0]->value) || !isset($phpOpts[0]->text))
			{
				FabrikWorker::logError(sprintf(Text::_('COM_FABRIK_ELEMENT_SUBOPTION_ERROR'),
$this->element->name, var_export($phpOpts, true)),
'error');

				return array();
			}

			$opts = array();

			foreach ($phpOpts as $phpOpt)
			{
				$opts[] = $phpOpt->value;
			}
		}

		return $opts;
	}

	/**
	 * Get sub option labels
	 *
	 * @param   array $data   Form data. If submitting a form, we want to use
that form's data and not
	 *                        re-query the form Model for its data as with
multiple plugins of the same type
	 *                        this was getting the plugin params out of sync.
	 *
	 * @return  array
	 */
	protected function getSubOptionLabels($data = array())
	{
		$phpOpts = $this->getPhpOptions($data);

		if (!$phpOpts)
		{
			// cache, as running Text::() can eat up time with lots of options
			if (!isset($this->subOptionLabels))
			{
				$params = $this->getParams();
				$opts   = $params->get('sub_options', '');
				$opts   = $opts == '' ? array() : (array)
@$opts->sub_labels;

				foreach ($opts as &$opt)
				{
					$opt = Text::_($opt);
				}

				$this->subOptionLabels = $opts;
			}

			return $this->subOptionLabels;
		}
		else
		{
			/**
			 * Paul - According to tooltip, $phpOpts should be of form
"array(HTMLHelper::_('select.option', '1',
'one'))"
			 * This is an array of objects with properties text and value.
			 * If user has mis-specified this we should tell them.
			 *
			 * @FIXME - $$$ hugh - seems like an empty array should be valid as
well?
			 **/
			if (!is_array($phpOpts) || !$phpOpts[0] || !is_object($phpOpts[0]) ||
!isset($phpOpts[0]->value) || !isset($phpOpts[0]->text))
			{
				FabrikWorker::logError(sprintf(Text::_('COM_FABRIK_ELEMENT_SUBOPTION_ERROR'),
$this->element->name, var_export($phpOpts, true)),
'error');

				return array();
			}

			$opts = array();

			foreach ($phpOpts as $phpOpt)
			{
				$opts[] = $phpOpt->text;
			}
		}

		foreach ($opts as &$opt)
		{
			$opt = Text::_($opt);
		}

		return $opts;
	}

	/**
	 * Get sub option enabled/disabled state
	 *
	 * @return  array
	 */
	protected function getSubOptionEnDis()
	{
		$opts    = array();
		$phpOpts = $this->getPhpOptions();

		if ($phpOpts)
		{
			foreach ($phpOpts as $phpOpt)
			{
				$opts[] = isset($phpOpt->disable) ? $phpOpt->disable : false;
			}
		}

		return $opts;
	}

	/**
	 * Should we get the elements sub options via the use of eval'd
parameter setting
	 *
	 * @param   array $data   Form data. If submitting a form, we want to use
that form's data and not
	 *                        re-query the form Model for its data as with
multiple plugins of the same type
	 *                        this was getting the plugin params out of sync.
	 *
	 * @since  3.0.7
	 *
	 * @return mixed  false if no, otherwise needs to return array of
HTMLHelperoptions
	 */
	protected function getPhpOptions($data = array())
	{
		$params = $this->getParams();
		$pop    = $params->get('dropdown_populate', '');

		if ($pop !== '')
		{
			$w    = new FabrikWorker;
			//$data = empty($data) ? $this->getFormModel()->getData() : $data;
			$pop  = $w->parseMessageForPlaceHolder($pop, $data, false);

			$key = md5($pop) . '-' . md5(serialize($data));

			if (isset($this->phpOptions[$key]))
			{
				return $this->phpOptions[$key];
			}

			FabrikWorker::clearEval();
			$res = Php::Eval(['code' => $pop, 'vars' =>
["data" => $data]]);
			FabrikWorker::logEval($res, 'Eval exception : ' .
$this->element->name . '::getPhpOptions() : ' . $pop .
' : %s');

			$this->phpOptions[$key] = $res;

			return $res;
		}

		return false;
	}

	/**
	 * Get the radio buttons possible values
	 * needed for inline edit list plugin
	 *
	 * @return  array  of radio button values
	 */
	public function getOptionValues()
	{
		return $this->getSubOptionValues();
	}

	/**
	 * get the radio buttons possible labels
	 * needed for inline edit list plugin
	 *
	 * @return  array  of radio button labels
	 */
	protected function getOptionLabels()
	{
		return $this->getSubOptionLabels();
	}

	/**
	 * Get the filter build method - all (2) or recorded data (1)
	 *
	 * @since   3.0.7
	 *
	 * @return  int
	 */
	protected function getFilterBuildMethod()
	{
		$usersConfig = ComponentHelper::getParams('com_fabrik');
		$params      = $this->getParams();
		$filterBuild = $params->get('filter_build_method', 0);

		if ($filterBuild == 0)
		{
			$filterBuild = $usersConfig->get('filter_build_method');
		}

		return $filterBuild;
	}

	/**
	 * Used by radio and drop-down elements to get a drop-down list of their
unique
	 * unique values OR all options - based on filter_build_method
	 *
	 * @param   bool   $normal    do we render as a normal filter or as an
advanced search filter
	 * @param   string $tableName table name to use - defaults to
element's current table
	 * @param   string $label     field to use, defaults to element name
	 * @param   string $id        field to use, defaults to element name
	 * @param   bool   $incJoin   include join
	 *
	 * @return  array  text/value objects
	 */
	public function filterValueList($normal, $tableName = '', $label
= '', $id = '', $incJoin = true)
	{
		$filterBuild = $this->getFilterBuildMethod();

		if ($filterBuild == 2 && $this->hasSubElements)
		{
			return $this->filterValueList_All($normal, $tableName, $label, $id,
$incJoin);
		}
		else
		{
			return $this->filterValueList_Exact($normal, $tableName, $label, $id,
$incJoin);
		}
	}

	/**
	 * If filterValueList_Exact incjoin value = false, then this method is
called
	 * to ensure that the query produced in filterValueList_Exact contains at
least the database join element's
	 * join
	 *
	 * @return  string  required join text to ensure exact filter list code
produces a valid query.
	 */
	protected function buildFilterJoin()
	{
		return '';
	}

	/**
	 * Create an array of label/values which will be used to populate the
elements filter dropdown
	 * returns only data found in the table you are filtering on
	 *
	 * @param   bool   $normal    do we render as a normal filter or as an
advanced search filter
	 * @param   string $tableName table name to use - defaults to
element's current table
	 * @param   string $label     field to use, defaults to element name
	 * @param   string $id        field to use, defaults to element name
	 * @param   bool   $incJoin   include join
	 *
	 * @throws ErrorException
	 *
	 * @return  array    filter value and labels
	 */
	protected function filterValueList_Exact($normal, $tableName =
'', $label = '', $id = '', $incJoin = true)
	{
		$listModel = $this->getListModel();
		$fbConfig  = ComponentHelper::getParams('com_fabrik');
		$fabrikDb  = $listModel->getDb();
		$table     = $listModel->getTable();
		$element   = $this->getElement();
		$origTable = $table->db_table_name;
		$elName    = $this->getFullName(true, false);
		$elName2   = $this->getFullName(false, false);

		if (!$this->isJoin())
		{
			$ids = $listModel->getColumnData($elName2);

			// For ids that are text with apostrophes in
			for ($x = count($ids) - 1; $x >= 0; $x--)
			{
				if ($ids[$x] == '')
				{
					unset($ids[$x]);
				}
				else
				{
					$ids[$x] = addslashes($ids[$x]);
				}
			}
		}

		$incJoin = $this->isJoin() ? false : $incJoin;
		/**
		 * filter the drop downs lists if the table_view_own_details option is on
		 * other wise the lists contain data the user should not be able to see
		 * note, this should now use the prefilter data to filter the list
		 */

		// Check if the elements group id is on of the table join groups if it is
then we swap over the table name
		$fromTable = $this->isJoin() ?
$this->getJoinModel()->getJoin()->table_join : $origTable;
		$joinStr   = $incJoin ? $listModel->buildQueryJoin() :
$this->buildFilterJoin();

		// New option not to order elements - required if you want to use db
joins 'Joins where and/or order by statement'
		$groupBy = $this->getOrderBy('filter');

		foreach ($listModel->getJoins() as $aJoin)
		{
			// Not sure why the group id key wasn't found - but put here to
remove error
			if (property_exists($aJoin, 'group_id'))
			{
				if ($aJoin->group_id == $element->group_id &&
$aJoin->element_id == 0)
				{
					$fromTable = $aJoin->table_join;
					$elName    = preg_replace('/^' . $origTable .
'\./', $fromTable . '.', $elName2);
				}
			}
		}

		$elName = FabrikString::safeColName($elName);

		if ($label == '')
		{
			$label = $this->isJoin() ? $this->getElement()->name : $elName;
		}

		if ($id == '')
		{
			$id = $this->isJoin() ? 'id' : $elName;
		}

		if ($this->encryptMe())
		{
			$secret = $this->config->getValue('secret');
			$label  = 'AES_DECRYPT(' . $label . ', ' .
$fabrikDb->quote($secret) . ')';
			$id     = 'AES_DECRYPT(' . $id . ', ' .
$fabrikDb->quote($secret) . ')';
		}

		$origTable = $tableName == '' ? $origTable : $tableName;
		/**
		 * $$$ rob - 2nd sql was blowing up for me on my test table - why did we
change to it?
		 *
http://localhost/fabrik2.0.x/index.php?option=com_fabrik&view=table&listid=12&calculations=0&resetfilters=0&Itemid=255&lang=en
		 * so added test for initial fromtable in join str and if found use
origtable
		 */
		if (strstr($joinStr, 'JOIN ' . $fabrikDb->qn($fromTable)))
		{
			$sql = 'SELECT DISTINCT(' . $label . ') AS ' .
$fabrikDb->qn('text') . ', ' . $id . ' AS
' . $fabrikDb->qn('value')
				. ' FROM ' . $fabrikDb->qn($origTable) . ' ' .
$joinStr . "\n";
		}
		else
		{
			$sql = 'SELECT DISTINCT(' . $label . ') AS ' .
$fabrikDb->qn('text') . ', ' . $id . ' AS
' . $fabrikDb->qn('value')
				. ' FROM ' . $fabrikDb->qn($fromTable) . ' ' .
$joinStr . "\n";
		}

		if (!$this->isJoin())
		{
			$sql .= 'WHERE ' . $id . ' IN (\'' .
implode("','", $ids) . '\')';
		}

		// Apply element where/order by statements to the filter (e.g. dbjoins
'Joins where and/or order by statement')
		$elementWhere = $this->buildQueryWhere(array(), true, null,
array('mode' => 'filter'));

		if (StringHelper::stristr($sql, 'WHERE ') &&
StringHelper::stristr($elementWhere??'', 'WHERE '))
		{
			// $$$ hugh - only replace the WHERE with AND if it's the first
word, so we don't munge sub-queries
			// $elementWhere = StringHelper::str_ireplace('WHERE ',
'AND ', $elementWhere);
			$elementWhere = preg_replace("#^(\s*)(WHERE)(.*)#i",
"$1AND$3", $elementWhere);
		}
		else if (StringHelper::stristr($sql, 'WHERE ') &&
!empty($elementWhere) && !StringHelper::stristr($elementWhere,
'WHERE '))
		{
			// if we have a WHERE in the main query, and the element clause
isn't empty but doesn't start with WHERE ...
			$elementWhere = 'AND ' . $elementWhere;
		}

		$sql .= ' ' . $elementWhere;
		$sql .= "\n" . $groupBy;
		$sql = $listModel->pluginQuery($sql);
		$fabrikDb->setQuery($sql, 0,
$fbConfig->get('filter_list_max', 100));
		FabrikHelperHTML::debug((string) $fabrikDb->getQuery(), 'element
filterValueList_Exact:');

		try
		{
			$rows = $fabrikDb->loadObjectList();
		} catch (RuntimeException $e)
		{
			throw new ErrorException('filter query error: ' .
$this->getElement()->name . ' ' .
$fabrikDb->getErrorMsg(), 500);
		}

		return $rows;
	}

	/**
	 * Get a readonly value for a filter, uses getROElement() to ascertain
value, adds between x & y if ranged values
	 *
	 * @param   mixed $data String or array of filter value(s)
	 *
	 * @since   3.0.7
	 *
	 * @return  string
	 */
	public function getFilterRO($data)
	{
		if (in_array($this->getFilterType(), array('range',
'range-hidden')))
		{
			$return = array();

			foreach ($data as $d)
			{
				$return[] = $this->getROElement($d);
			}

			return Text::_('COM_FABRIK_BETWEEN') . '<br
/>' . implode('<br />' .
Text::_('COM_FABRIK_AND') . "<br />", $return);
		}

		return $this->getROElement($data);
	}

	/**
	 * Get options order by
	 *
	 * @param   string              $view  View mode '' or
'filter'
	 * @param   JDatabaseQuery|bool $query Set to false to return a string
	 *
	 * @return  string  order by statement
	 */
	protected function getOrderBy($view = '', $query = false)
	{
		if (isset($this->orderBy))
		{
			return $this->orderBy;
		}
		else
		{
			return "ORDER BY text ASC ";
		}
	}

	/**
	 * Create an array of label/values which will be used to populate the
elements filter dropdown
	 * returns all possible options
	 *
	 * @param   bool   $normal    do we render as a normal filter or as an
advanced search filter
	 * @param   string $tableName table name to use - defaults to
element's current table
	 * @param   string $label     field to use, defaults to element name
	 * @param   string $id        field to use, defaults to element name
	 * @param   bool   $incJoin   include join
	 *
	 * @return  array    filter value and labels
	 */
	protected function filterValueList_All($normal, $tableName = '',
$label = '', $id = '', $incJoin = true)
	{
		$values = $this->getSubOptionValues();
		$labels = $this->getSubOptionLabels();
		$return = array();

		for ($i = 0; $i < count($values); $i++)
		{
			$return[] = HTMLHelper::_('select.option', $values[$i],
$labels[$i]);
		}

		return $return;
	}

	/**
	 * Get the hidden fields for a normal filter
	 *
	 * @param   int    $counter Filter counter
	 * @param   string $elName  Full element name will be converted to
tablename.elementname format
	 * @param   bool   $hidden  Has the filter been added due to a search form
value with no corresponding filter set
	 *                          up in the table if it has we need to know so
that when we do a search from a
	 *                          'fabrik_list_filter_all' field that
search term takes precedence
	 * @param   bool   $normal  do we render as a normal filter or as an
advanced search filter
	 *
	 *
	 * @return  string    html Hidden fields
	 */
	protected function getFilterHiddenFields($counter, $elName, $hidden =
false, $normal = true)
	{
		$params  = $this->getParams();
		$element = $this->getElement();
		$class   = $this->filterClass();
		$filters = $this->getListModel()->getFilterArray();

		// $$$ needs to apply to CDD's as well, so just making this an
override-able method.
		if ($this->quoteLabel())
		{
			$elName = FabrikString::safeColName($elName);
		}

		// If querying via the querystring - then the condition and eval should
be looked up against that key
		$elementIds = FArrayHelper::getValue($filters, 'elementid',
array());

		// Check that there is an element filter for this element in the element
ids.
		$filterIndex = array_search($this->getId(), $elementIds);

		$hidden    = $hidden ? 1 : 0;
		$match     = $this->isExactMatch(array('match' =>
$element->filter_exact_match));
		$return    = array();
		$eval      = FArrayHelper::getValue($filters, 'eval', array());
		$joins     = FArrayHelper::getValue($filters, 'join', array());
		$condition = FArrayHelper::getValue($filters, 'condition',
array());
		$groupedTo = FArrayHelper::getValue($filters,
'grouped_to_previous', array());
		/*
		 * Element filter not found (could be a prefilter instead) so use element
default options
		 * see
http://fabrikar.com/forums/index.php?threads/major-filter-issues.37360/
		 */
		if ($filterIndex === false || $normal)
		{
			$condition = $this->getFilterCondition();
			$eval      = FABRIKFILTER_TEXT;
		}
		else
		{
			$condition = FArrayHelper::getValue($condition, $filterIndex,
$this->getFilterCondition());
			$eval      = FArrayHelper::getValue($eval, $filterIndex,
FABRIKFILTER_TEXT);
		}

		$searchTypes = FArrayHelper::getValue($filters, 'search_type',
array());
		$searchType  = FArrayHelper::getValue($searchTypes, $filterIndex,
'normal');

		// If our previous filter was a pre-filter we never want to use its join
value as it could result in the pre-filter being ignored
		// Thus in this instance we should always use 'AND'
		$join              = $searchType === 'prefilter' ?
'AND' : FArrayHelper::getValue($joins, $filterIndex,
'AND');
		$groupedToPrevious = FArrayHelper::getValue($groupedTo, $filterIndex,
'0');

		// Need to include class other wise csv export produces incorrect results
when exporting
		$prefix   = '<input type="hidden" class="' .
$class . '" name="fabrik___filter[list_' .
$this->getListModel()->getRenderContext() . ']';
		$return[] = $prefix . '[condition][' . $counter . ']"
value="' . $condition . '" />';
		$return[] = $prefix . '[join][' . $counter . ']"
value="' . $join . '" />';
		$return[] = $prefix . '[key][' . $counter . ']"
value="' . $elName . '" />';
		$return[] = $prefix . '[search_type][' . $counter .
']" value="normal" />';
		$return[] = $prefix . '[match][' . $counter . ']"
value="' . $match . '" />';
		$return[] = $prefix . '[full_words_only][' . $counter .
']" value="' .
$params->get('full_words_only', '0') . '"
/>';
		$return[] = $prefix . '[eval][' . $counter . ']"
value="' . $eval . '" />';
		$return[] = $prefix . '[grouped_to_previous][' . $counter .
']" value="' . $groupedToPrevious . '"
/>';
		$return[] = $prefix . '[hidden][' . $counter . ']"
value="' . $hidden . '" />';
		$return[] = $prefix . '[elementid][' . $counter . ']"
value="' . $element->id . '" />';

		return implode("\n", $return);
	}

	/**
	 * Get the condition statement to use in the filters hidden field
	 *
	 * @return  string    =, begins or contains
	 */
	protected function getFilterCondition()
	{
		if ($this->getElement()->filter_type == 'auto-complete')
		{
			$cond = 'contains';
		}
		else
		{
			$match = $this->isExactMatch(array('match' =>
$this->getElement()->filter_exact_match));
			$cond  = ($match == 1) ? '=' : 'contains';
		}

		return $cond;
	}

	/**
	 * Get the filter type: the element filter_type property unless a ranged
querystring is used
	 *
	 * @since  3.0.7
	 *
	 * @return string
	 */
	protected function getFilterType()
	{
		$element  = $this->getElement();
		$type     = $element->filter_type;
		$name     = $this->getFullName(true, false);
		$qsFilter = $this->app->getInput()->get($name, array(),
'array');
		$qsValues = FArrayHelper::getValue($qsFilter, 'value',
array());

		if (is_array($qsValues) && count($qsValues) > 1)
		{
			$type = $type === 'hidden' ? 'range-hidden' :
'range';
		}

		return $type;
	}

	/**
	 * Get the hidden fields for an advanced filter
	 *
	 * @return  string    html hidden fields
	 */
	protected function getAdvancedFilterHiddenFields()
	{
		$element  = $this->getElement();
		$return   = array();
		$prefix   = '<input type="hidden"
name="fabrik___filter[list_' .
$this->getListModel()->getRenderContext() . ']';
		$return[] = $prefix . '[elementid][]" value="' .
$element->id . '" />';

		return implode("\n", $return);
	}

	/**
	 * This builds an array containing the filters value and condition
	 * when using a ranged search
	 *
	 * @param   array  $value     Initial values
	 * @param   string $condition Filter condition e.g. BETWEEN
	 *
	 * @return  array  (value condition)
	 */
	protected function getRangedFilterValue($value, $condition = '')
	{
		$db      = FabrikWorker::getDbo();
		$element = $this->getElement();

		if ($element->filter_type === 'range' ||
strtoupper($condition) === 'BETWEEN')
		{
			if (is_numeric($value[0]) && is_numeric($value[1]))
			{
				$value = $value[0] . ' AND ' . $value[1];
			}
			else
			{
				$value = $db->q($value[0]) . ' AND ' .
$db->q($value[1]);
			}

			$condition = 'BETWEEN';
		}
		else
		{
			if (is_array($value) && !empty($value))
			{
				foreach ($value as &$v)
				{
					$v = $db->q($v);
				}

				$value = ' (' . implode(',', $value) .
')';
			}

			$condition = 'IN';
		}

		return array($value, $condition);
	}

	/**
	 * Escapes a SINGLE query search string
	 *
	 * @param   string $condition filter condition
	 * @param   value  &$value    value to escape
	 *
	 * @since   3.0.7
	 *
	 * @return  null
	 */
	private function escapeOneQueryValue($condition, &$value)
	{
		if ($condition == 'REGEXP')
		{
			$value = preg_quote($value);
		}

		/**
		 * If doing a search via a querystring for O'Fallon then the '
is backslashed
		 * in FabrikModelListfilter::getQuerystringFilters()
		 * but the MySQL regexp needs it to be back-quoted three times
		 */

		// If searching on '\' then don't double up \'s
		if (strlen(str_replace('\\', '', $value)) > 0)
		{
			$value = str_replace("\\", "\\\\\\", $value);

			// $$$rob check things haven't been double quoted twice (occurs now
that we are doing preg_quote() above to fix searches on '*'
			$value = str_replace("\\\\\\\\\\\\", "\\\\\\",
$value);
		}
	}

	/**
	 * Escapes the a query search string
	 *
	 * @param   string $condition filter condition
	 * @param   value  &$value    value to escape
	 *
	 * @return  null
	 */
	private function escapeQueryValue($condition, &$value)
	{
		// $$$ rob 30/06/2011 only escape once !
		if ($this->escapedQueryValue)
		{
			return;
		}

		$this->escapedQueryValue = true;

		if (is_array($value))
		{
			foreach ($value as &$val)
			{
				$this->escapeOneQueryValue($condition, $val);
			}
		}
		else
		{
			$this->escapeOneQueryValue($condition, $value);
		}
	}

	/**
	 * Builds an array containing the filters value and condition
	 *
	 * @param   string $value     Initial value
	 * @param   string $condition Initial condition e.g. LIKE, =
	 * @param   string $eval      How the value should be handled
	 *
	 * @return  array    (value condition)
	 */
	public function getFilterValue($value, $condition, $eval)
	{
		$condition = StringHelper::strtolower($condition);
		$this->escapeQueryValue($condition, $value);
		$db = FabrikWorker::getDbo();

		if (is_array($value))
		{
			// Ranged search
			list($value, $condition) = $this->getRangedFilterValue($value,
$condition);
		}
		else
		{
			switch ($condition)
			{
				case 'notequals':
				case '<>':
					$condition = "<>";

					// 2 = sub-query so don't quote
					$value = ($eval == FABRIKFILTER_QUERY) ? '(' . $value .
')' : $db->q($value);
					break;
				case 'equals':
				case '=':
					$condition = "=";
					$value     = ($eval == FABRIKFILTER_QUERY) ? '(' . $value .
')' : $db->q($value);
					break;
				case 'begins':
				case 'begins with':
					$condition = "LIKE";
					$value     = $eval == FABRIKFILTER_QUERY ? '(' . $value .
')' : $db->q($value . '%');
					break;
				case 'ends':
				case 'ends with':
					// @TODO test this with subquery
					$condition = "LIKE";
					$value     = $eval == FABRIKFILTER_QUERY ? '(' . $value .
')' : $db->q('%' . $value);
					break;
				case 'contains':
				case 'like':
					// @TODO test this with subquery
					$condition = "LIKE";
					//$value     = $eval == FABRIKFILTER_QUERY ? '(' . $value .
')' : $db->q('%' . $value . '%');
					// if they want NOQUOTES on a LIKE, assume they are building their own
CONCAT or whatever with %'s
					switch ($eval)
					{
						case FABRIKFILTER_QUERY:
							$value = '(' . $value . ')';
							break;
						case FABRIKFILTER_NOQUOTES:
							$value = $value;
							break;
						default:
							$value = $db->q('%' . $value . '%');
							break;
					}
					break;
				case '>':
				case '&gt;':
				case 'greaterthan':
					$condition = '>';
					break;
				case '<':
				case '&lt;':
				case 'lessthan':
					$condition = '<';
					break;
				case '>=':
				case '&gt;=':
				case 'greaterthanequals':
					$condition = '>=';
					break;
				case '<=':
				case '&lt;=':
				case 'lessthanequals':
					$condition = '<=';
					break;
				case 'in':
					$condition = 'IN';
					if ($eval != FABRIKFILTER_QUERY)
					{
						$value = FabrikString::safeQuote($value, true);
					}
					$value = '(' . $value . ')';
					break;
				case 'not_in':
					$condition = 'NOT IN';
					if ($eval != FABRIKFILTER_QUERY)
					{
						$value = FabrikString::safeQuote($value, true);
					}
					$value = '(' . $value . ')';
					break;
			}

			switch ($condition)
			{
				case '>':
				case '<':
				case '>=':
				case '<=':
					if ($eval == FABRIKFILTER_QUERY)
					{
						$value = '(' . $value . ')';
					}
					else
					{
						if (!is_numeric($value))
						{
							$value = $db->q($value);
						}
					}
					break;
			}
			// $$$ hugh - if 'noquotes' (3) selected, strip off the quotes
again!
			if ($eval == FABRIKFILTER_NOQUOTES)
			{
				// $$$ hugh - darn, this is stripping the ' of the end of things
like "select & from foo where bar = '123'"
				$value = StringHelper::ltrim($value, "'");
				$value = StringHelper::rtrim($value, "'");
			}

			if ($condition == '=' && $value ==
"'_null_'")
			{
				$condition = " IS NULL ";
				$value     = '';
			}
		}

		return array($value, $condition);
	}

	/**
	 * Build the filter query for the given element.
	 * Can be overwritten in plugin - e.g. see checkbox element which checks
for partial matches
	 *
	 * @param   string $key           element name in format
`tablename`.`elementname`
	 * @param   string $condition     =/like etc.
	 * @param   string $value         search string - already quoted if
specified in filter array options
	 * @param   string $originalValue original filter value without quotes or
%'s applied
	 * @param   string $type          filter type
advanced/normal/prefilter/search/querystring/sea* @
	 * @param   string $filterEval    eval the filter value
	 * @return  string    sql query part e,g, "key = value"
	 */
	public function getFilterQuery($key, $condition, $value, $originalValue,
$type = 'normal', $filterEval = '0')
	{
		$this->encryptFieldName($key);

		switch ($condition)
		{
			case 'thisyear':
				$query = ' YEAR(' . $key . ') = YEAR(NOW()) ';
				break;
			case 'earlierthisyear':
				$query = ' (DAYOFYEAR(' . $key . ') <=
DAYOFYEAR(NOW()) AND YEAR(' . $key . ') = YEAR(NOW())) ';
				break;
			case 'laterthisyear':
				$query = ' (DAYOFYEAR(' . $key . ') >=
DAYOFYEAR(NOW()) AND YEAR(' . $key . ') = YEAR(NOW())) ';
				break;
			case 'today':
				$query = ' (' . $key . ' >= CURDATE() AND ' .
$key . ' < CURDATE() + INTERVAL 1 DAY) ';
				break;
			case 'yesterday':
				$query = ' (' . $key . ' >= CURDATE() - INTERVAL 1
DAY AND ' . $key . ' < CURDATE()) ';
				break;
			case 'tomorrow':
				$query = ' (' . $key . ' >= CURDATE() + INTERVAL 1
DAY  AND ' . $key . ' < CURDATE() + INTERVAL 2 DAY ) ';
				break;
			case 'thismonth':
				$query = ' (' . $key . ' >=
DATE_ADD(LAST_DAY(DATE_SUB(now(), INTERVAL 1 MONTH)), INTERVAL 1 DAY)  AND
' . $key
					. ' <= LAST_DAY(NOW()) ) ';
				break;
			case 'lastmonth':
				$query = ' (' . $key . ' >=
DATE_ADD(LAST_DAY(DATE_SUB(now(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)  AND
' . $key
					. ' <= LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)) ) ';
				break;
			case 'nextmonth':
				$query = ' (' . $key . ' >= DATE_ADD(LAST_DAY(now()),
INTERVAL 1 DAY)  AND ' . $key
					. ' <= DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 MONTH) ) ';
				break;
			case 'nextweek1':
				$query = ' (YEARWEEK(' . $key . ',1) =
YEARWEEK(DATE_ADD(NOW(), INTERVAL 1 WEEK), 1))';
				break;
			case 'birthday':
				$query = '(MONTH(' . $key . ') = MONTH(CURDATE()) AND 
DAY(' . $key . ') = DAY(CURDATE())) ';
				break;
			default:
				if ($this->isJoin())
				{
					// Query the joined table concatenating into one field
					$joinTable = $this->getJoinModel()->getJoin()->table_join;

					// Jaanus: joined group pk set in groupConcactJoinKey()
					$pk    = $this->groupConcactJoinKey();
					$key   = "(SELECT GROUP_CONCAT(id SEPARATOR '" .
GROUPSPLITTER . "') FROM $joinTable WHERE parent_id = $pk)";
					$value = str_replace("'", '', $value);
					$query = "($key = '$value' OR $key LIKE
'$value" . GROUPSPLITTER . "%' OR
					$key LIKE '" . GROUPSPLITTER . "$value" .
GROUPSPLITTER . "%' OR
					$key LIKE '%" . GROUPSPLITTER . "$value')";
				}
				else
				{
					$query = " $key $condition $value ";
				}

				break;
		}

		return $query;
	}

	/**
	 * Get the AES decrypt sql segment for the element
	 *
	 * @param   string &$key field name
	 *
	 * @return  void
	 */
	public function encryptFieldName(&$key)
	{
		if ($this->encryptMe())
		{
			$db     = FabrikWorker::getDbo();
			$secret = $this->config->get('secret');
			$matches = array();
			if (preg_match('/LOWER\((.*)\)/', $key, $matches))
			{
				$key = 'LOWER(CONVERT(AES_DECRYPT(' . $matches[1] . ',
' . 	$db->q($secret) . ') USING utf8))';
			}
			else
			{
				$key = 'AES_DECRYPT(' . $key . ', ' .
$db->q($secret) . ')';
			}
		}
	}

	/**
	 * If no filter condition supplied (either via querystring or in posted
filter data
	 * return the most appropriate filter option for the element.
	 *
	 * @return  string    default filter condition ('=',
'REGEXP' etc.)
	 */
	public function getDefaultFilterCondition()
	{
		$fieldDesc = $this->getFieldDescription();

		if (StringHelper::stristr($fieldDesc, 'INT') ||
$this->getElement()->filter_exact_match == 1)
		{
			return '=';
		}

		return 'REGEXP';
	}

	/**
	 * $$$ rob testing not using this as elements can only be in one group
	 * $$$ hugh - still called from import.php
	 * when adding a new element this will ensure its added to all tables that
the
	 * elements group is associated with
	 *
	 * @param   string $origColName original column name leave null to ignore
	 *
	 * @TODO Fabrik 3 - loadFromFormId() might need to pass in a package id
	 *
	 * @deprecated
	 *
	 * @return  null
	 */
	public function addToDBTable($origColName = null)
	{
	}

	/**
	 * called from admin element controller when element saved
	 *
	 * @param   array $data posted element save data
	 *
	 * @return  bool  save ok or not
	 */
	public function onSave($data)
	{
		$params = $this->getParams();

		if (!$this->canEncrypt() &&
$params->get('encrypt'))
		{
			throw new RuntimeException('The encryption option is only available
for field and text area plugins');
		}

		// Overridden in element plugin if needed
		return true;
	}

	/**
	 * Called from admin element controller when element is removed
	 *
	 * @return  bool  save ok or not
	 */
	public function onRemove()
	{
		// Delete js actions
		$db    = FabrikWorker::getDbo(true);
		$query = $db->getQuery(true);
		$id    = (int) $this->getElement()->id;
		$query->delete()->from('#__fabrik_jsactions')->where('element_id
=' . $id);
		$db->setQuery($query);

		try
		{
			$db->execute();
		} catch (Exception $e)
		{
			throw new RuntimeException('Didn\'t delete js actions for
element ' . $id);
		}

		return true;
	}

	/**
	 * States if the element contains data which is recorded in the database
	 * some elements (e.g. buttons) don't
	 *
	 * @param   array $data posted data
	 *
	 * @return  bool
	 */
	public function recordInDatabase($data = null)
	{
		return $this->getParams()->get('store_in_db',
$this->recordInDatabase);
	}

	/**
	 * Used by elements with sub-options, given a value, return its label
	 *
	 * @param   string $v            Value
	 * @param   string $defaultLabel Default label
	 * @param   bool   $forceCheck   Force check even if $v === $defaultLabel
	 *
	 * @return  string    Label
	 */
	public function getLabelForValue($v, $defaultLabel = null, $forceCheck =
false)
	{
		/**
		 * $$$ hugh - only needed getParent when we weren't saving changes
to parent params to child
		 * which we should now be doing ... and getParent() causes an extra table
lookup for every child
		 * element on the form.
		 * $element = $this->getParent();
		 */
		$params = $this->getParams();
		$values = $this->getSubOptionValues();
		$labels = $this->getSubOptionLabels();
		
		//F4: Don't use strict search, in F4 values may be integer or string
		$key    = array_search($v, $values, false);
		/**
		 * $$$ rob if we allow adding to the dropdown but not recording
		 * then there will be no $key set to revert to the $val instead
		 */
		if ($v === $params->get('sub_default_value'))
		{
			$v = $params->get('sub_default_label');
		}

		return ($key === false) ? $v : FArrayHelper::getValue($labels, $key,
$defaultLabel);
	}

	/**
	 * Build the query for the avg calculation
	 *
	 * @param   FabrikFEModelList &$listModel list model
	 * @param   array             $labels     Labels
	 *
	 * @return  string    sql statement
	 */
	protected function getAvgQuery(&$listModel, $labels = array())
	{
		$label      = count($labels) == 0 ? "'calc' AS label"
: 'CONCAT(' . implode(', " & " , ',
$labels) . ')  AS label';
		$item       = $listModel->getTable();
		$joinSQL    = $listModel->buildQueryJoin();
		$whereSQL   = $listModel->buildQueryWhere();
		$name       = $this->getFullName(false, false);
		$groupModel = $this->getGroup();
		$roundTo    = (int) $this->getParams()->get('avg_round');

		if ($groupModel->isJoin())
		{
			// Element is in a joined column - lets presume the user wants to sum
all cols, rather than reducing down to the main cols totals
			$sql = "SELECT ROUND(AVG($name), $roundTo) AS value, $label FROM
" . FabrikString::safeColName($item->db_table_name)
				. " $joinSQL $whereSQL " .
$this->additionalElementCalcJoin('avg_split');
		}
		else
		{
			/*
			 * Need to do first query to get distinct records as if we are doing
left joins the sum is too large
			 * However, views may not have a primary key which is unique so set to
'' if no join
			 */
			$distinct = $this->getListModel()->isView() &&
trim($joinSQL) == '' ? '' : 'DISTINCT';

			$sql = "SELECT ROUND(AVG(value), $roundTo) AS value, label
			FROM (SELECT " . $distinct . " $item->db_primary_key, $name
AS value, $label FROM " .
FabrikString::safeColName($item->db_table_name)
				. " $joinSQL $whereSQL " .
$this->additionalElementCalcJoin('avg_split') . ") AS
t";
		}

		return $sql;
	}

	/**
	 * Get sum query
	 *
	 * @param   FabrikFEModelList &$listModel List model
	 * @param   array             $labels     Label
	 *
	 * @return string
	 */
	protected function getSumQuery(&$listModel, $labels = array())
	{
		$label      = count($labels) == 0 ? "'calc' AS label"
: 'CONCAT(' . implode(', " & " , ',
$labels) . ')  AS label';
		$item       = $listModel->getTable();
		$joinSQL    = $listModel->buildQueryJoin();
		$whereSQL   = $listModel->buildQueryWhere();
		$name       = $this->getFullName(false, false);
		$groupModel = $this->getGroup();

		if ($groupModel->isJoin())
		{
			// Element is in a joined column - lets presume the user wants to sum
all cols, rather than reducing down to the main cols totals
			$sql = "SELECT SUM($name) AS value, $label FROM " .
FabrikString::safeColName($item->db_table_name) . " $joinSQL
$whereSQL " .
$this->additionalElementCalcJoin('sum_split');
		}
		else
		{
			/*
			 * Need to do first query to get distinct records as if we are doing
left joins the sum is too large
			 * However, views may not have a primary key which is unique so set to
'' if no join
			 */
			$distinct = $this->getListModel()->isView() &&
trim($joinSQL) == '' ? '' : 'DISTINCT';

			$sql = "SELECT SUM(value) AS value, label
			FROM (SELECT " . $distinct . " $item->db_primary_key, $name
AS value, $label FROM " .
FabrikString::safeColName($item->db_table_name)
				. " $joinSQL $whereSQL " .
$this->additionalElementCalcJoin('sum_split') . ") AS
t";
		}

		return $sql;
	}

	/**
	 * If split then the split element could require an additional join to get
the sum query to work
	 *
	 * @param   string $splitParam Name of calculation split param. Loads up
split calculation element
	 *
	 * @return string Sql
	 */
	private function additionalElementCalcJoin($splitParam)
	{
		$sql       = '';
		$elementId = $this->getParams()->get($splitParam, null);

		if (!is_null($elementId))
		{
			$pluginManager = FabrikWorker::getPluginManager();
			$plugin        = $pluginManager->getElementPlugin($elementId);

			/**
			 * If the join table_join_alias is set, it has already been joined in
the buildQueryJoin
			 * so we don't need to add it (it'll blow up with a "Not
unique table/alias" if we do)
			 */

			$join = $plugin->getJoin();
			if (!(isset($join->table_join_alias) &&
!empty($join->table_join_alias)))
			{
				$sql = ' ' . $plugin->buildFilterJoin();
			}
		}

		return $sql;
	}

	/**
	 * Get a custom query
	 *
	 * @param   FabrikFEModelList &$listModel list
	 * @param   string            $label      label
	 *
	 * @return  string
	 */
	protected function getCustomQuery(&$listModel, $label =
"'calc'")
	{
		$params       = $this->getParams();
		$custom_query = $params->get('custom_calc_query',
'');
		$item         = $listModel->getTable();
		$joinSQL      = $listModel->buildQueryJoin();
		$whereSQL     = $listModel->buildQueryWhere();
		$name         = $this->getFullName(false, false);
		$groupModel   = $this->getGroup();

		if ($groupModel->isJoin())
		{
			// Element is in a joined column - lets presume the user wants to sum
all cols, rather than reducing down to the main cols totals
			// $custom_query = sprintf($custom_query, $name);
			$custom_query = str_replace('%s', $name, $custom_query);

			return "SELECT $custom_query AS value, $label AS label FROM "
. FabrikString::safeColName($item->db_table_name) . " $joinSQL
$whereSQL";
		}
		else
		{
			// Need to do first query to get distinct records as if we are doing
left joins the sum is too large
			// $custom_query = sprintf($custom_query, 'value');
			$custom_query = str_replace('%s', 'value',
$custom_query);

			return 'SELECT ' . $custom_query . ' AS value, label FROM
(SELECT DISTINCT ' .
FabrikString::safeColName($item->db_table_name)
			. '.*, ' . $name . ' AS value, ' . $label . '
AS label FROM ' . FabrikString::safeColName($item->db_table_name)
			. ' ' . $joinSQL . ' ' . $whereSQL . ') AS
t';
		}
	}

	/**
	 * Get a query for our median query
	 *
	 * @param   FabrikFEModelList &$listModel List
	 * @param   array             $labels     Label
	 *
	 * @return string
	 */
	protected function getMedianQuery(&$listModel, $labels = array())
	{
		$label    = count($labels) == 0 ? "'calc' AS label" :
'CONCAT(' . implode(', " & " , ',
$labels) . ')  AS label';
		$item     = $listModel->getTable();
		$joinSQL  = $listModel->buildQueryJoin();
		$whereSQL = $listModel->buildQueryWhere();

		$sql = 'SELECT ' . $this->getFullName(false, false) . '
AS value, ' . $label . ' FROM ' .
FabrikString::safeColName($item->db_table_name)
			. ' ' . $joinSQL . ' ' . $whereSQL . ' ' .
$this->additionalElementCalcJoin('median_split');

		return $sql;
	}

	/**
	 * Get a query for our count method
	 *
	 * @param   FabrikFEModelList &$listModel List
	 * @param   array             $labels     Labels
	 *
	 * @return string
	 */
	protected function getCountQuery(&$listModel, $labels = array())
	{
		$label    = count($labels) == 0 ? "'calc' AS label" :
'CONCAT(' . implode(', " & " , ',
$labels) . ')  AS label';
		$db       = FabrikWorker::getDbo();
		$item     = $listModel->getTable();
		$joinSQL  = $listModel->buildQueryJoin();
		$whereSQL = $listModel->buildQueryWhere();
		$name     = $this->getFullName(false, false);

		// $$$ hugh - need to account for 'count value' here!
		$params          = $this->getParams();
		$count_condition = $params->get('count_condition',
'');

		if (!empty($count_condition))
		{
			if (!empty($whereSQL))
			{
				$whereSQL .= " AND $name = " . $db->q($count_condition);
			}
			else
			{
				$whereSQL = "WHERE $name = " . $db->q($count_condition);
			}
		}

		$groupModel = $this->getGroup();

		if ($groupModel->isJoin())
		{
			// Element is in a joined column - lets presume the user wants to sum
all cols, rather than reducing down to the main cols totals
			$sql = "SELECT COUNT($name) AS value, $label FROM " .
FabrikString::safeColName($item->db_table_name) . " $joinSQL
$whereSQL " .
$this->additionalElementCalcJoin('count_split');
		}
		else
		{
			// Need to do first query to get distinct records as if we are doing
left joins the sum is too large
			$sql = "SELECT COUNT(value) AS value, label
			FROM (SELECT DISTINCT $item->db_primary_key, $name AS value, $label
FROM " . FabrikString::safeColName($item->db_table_name)
				. " $joinSQL $whereSQL " .
$this->additionalElementCalcJoin('count_split') . ") AS
t";
		}

		return $sql;
	}

	/**
	 * Work out the calculation group-bys to apply:
	 *
	 * - If group_by is assigned in the app input
	 * - If no group_by request then check the list models group by and add
that
	 *
	 * @param   string $splitParam Element parameter name containing the
calculation split option
	 * @param   object $listModel  List model
	 *
	 * @since   3.0.8
	 *
	 * @return  array  (Group by element names, group by element labels)
	 */
	protected function calcGroupBys($splitParam, $listModel)
	{
		$pluginManager  = FabrikWorker::getPluginManager();
		$requestGroupBy =
$this->app->getInput()->get('group_by', '');
		$groupByLabels  = array();

		if ($requestGroupBy == '0')
		{
			$requestGroupBy = '';
		}

		$groupBys = array();

		if ($requestGroupBy !== '')
		{
			$formModel      = $this->getFormModel();
			$requestGroupBy =
$formModel->getElement($requestGroupBy)->getElement()->id;
			$groupBys[]     = $requestGroupBy;
		}
		else
		{
			$listGroupBy = $listModel->getTable()->group_by;

			if ($listGroupBy !== '')
			{
				$groupBys[] = $listGroupBy;
			}
		}

		$params   = $this->getParams();
		$splitSum = $params->get($splitParam, null);

		if (!is_null($splitSum))
		{
			$groupBys[] = $splitSum;
		}

		foreach ($groupBys as &$gById)
		{
			$plugin = $pluginManager->getElementPlugin($gById);

			/**
			 * In the calculation rendering, in default.php, we are keying by values
not labels for join elements,
			 * so there's no point keying by label for joins.  So I think we
need to change this chunk so it just tests to see if
			 * there is a getJoinValueColumn method, and if so, use that.  I'm
leaving the original code intact though,
			 * while I wait to see if this causes Other Horrible Things To Happen.
			 */

			/*
			$sName = method_exists($plugin, 'getJoinLabelColumn') ?
$plugin->getJoinLabelColumn() : $plugin->getFullName(false, false,
false);

			if (!stristr($sName, 'CONCAT'))
			{
				$gById = FabrikString::safeColName($sName);
			}
			else
			{
				if (method_exists($plugin, 'getJoinValueColumn'))
				{
					$sName = $plugin->getJoinValueColumn();
					$gById = FabrikString::safeColName($sName);
				}
			}
			*/

			if (method_exists($plugin, 'getFullLabelOrConcat'))
			{
				$sName  = $plugin->getJoinValueColumn();
				$sLabel = $plugin->getFullLabelOrConcat();
			}
			else
			{
				$sName = $sLabel = $plugin->getFullName(false, false, false);
			}

			$gById           = FabrikString::safeColName($sName);
			$groupByLabels[] = $sLabel;
		}

		return array($groupBys, $groupByLabels);
	}

	/**
	 * If the calculation query has had to convert the data to a machine
format, use
	 * this function to convert back to human readable format. E.g. time
element
	 * calcs in seconds but we'd want to convert back into h:m:s
	 *
	 * @param   array &$rows Calculation values
	 *
	 * @return  void
	 */
	protected function formatCalValues(&$rows)
	{
	}

	/**
	 * Calculation: sum
	 * can be overridden in element class
	 *
	 * @param   FabrikFEModelList &$listModel List model
	 *
	 * @return  array
	 */
	public function sum(&$listModel)
	{
		$db       = $listModel->getDb();
		$params   = $this->getParams();
		$splitSum = $params->get('sum_split', '');
		list($groupBys, $groupByLabels) =
$this->calcGroupBys('sum_split', $listModel);
		$split     = empty($groupBys) ? false : true;
		$calcLabel = $params->get('sum_label',
Text::_('COM_FABRIK_SUM'));

		if ($split)
		{
			$pluginManager = FabrikWorker::getPluginManager();
			$plugin        = $pluginManager->getElementPlugin($splitSum);
			$sql           = $this->getSumQuery($listModel, $groupBys) . '
GROUP BY label';
			$sql           = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results2 = $db->loadObjectList('label');
			$this->formatCalValues($results2);
			$uberTotal = 0;

			foreach ($results2 as $pair)
			{
				$uberTotal += $pair->value;
			}

			$uberObject          = new stdClass;
			$uberObject->value   = $uberTotal;
			$uberObject->label   = Text::_('COM_FABRIK_TOTAL');
			$uberObject->class   = 'splittotal';
			$uberObject->special = true;
			$results2[]          = $uberObject;
			$results             = $this->formatCalcSplitLabels($results2,
$plugin, 'sum');
		}
		else
		{
			// Need to add a group by here as well as if the ONLY_FULL_GROUP_BY SQL
mode is enabled an error is produced
			$sql = $this->getSumQuery($listModel) . ' GROUP BY label';
			$sql = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results = $db->loadObjectList('label');
			$this->formatCalValues($results);
		}

		$res = $this->formatCalcs($results, $calcLabel, $split);

		return array($res, $results);
	}

	/**
	 * calculation: average
	 * can be overridden in element class
	 *
	 * @param   FabrikFEModelList &$listModel list model
	 *
	 * @return  string    result
	 */
	public function avg(&$listModel)
	{
		$db        = $listModel->getDb();
		$params    = $this->getParams();
		$splitAvg  = $params->get('avg_split', '');
		$item      = $listModel->getTable();
		$calcLabel = $params->get('avg_label',
Text::_('COM_FABRIK_AVERAGE'));
		list($groupBys, $groupByLabels) =
$this->calcGroupBys('avg_split', $listModel);

		$split = empty($groupBys) ? false : true;

		if ($split)
		{
			$pluginManager = FabrikWorker::getPluginManager();
			$plugin        = $pluginManager->getElementPlugin($splitAvg);
			$sql           = $this->getAvgQuery($listModel, $groupBys) . "
GROUP BY label";
			$sql           = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results2 = $db->loadObjectList('label');
			$this->formatCalValues($results2);
			$uberTotal = 0;

			foreach ($results2 as $pair)
			{
				$uberTotal += $pair->value;
			}

			$uberObject          = new stdClass;
			$uberObject->value   = $uberTotal / count($results2);
			$uberObject->label   = Text::_('COM_FABRIK_AVERAGE');
			$uberObject->special = true;
			$uberObject->class   = 'splittotal';
			$results2[]          = $uberObject;

			$results = $this->formatCalcSplitLabels($results2, $plugin,
'avg');
		}
		else
		{
			// Need to add a group by here as well as if the ONLY_FULL_GROUP_BY SQL
mode is enabled an error is produced
			$sql = $this->getAvgQuery($listModel) . " GROUP BY label";
			$sql = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results = $db->loadObjectList('label');
			$this->formatCalValues($results);
		}

		$res = $this->formatCalcs($results, $calcLabel, $split);

		return array($res, $results);
	}

	/**
	 * Get the sprintf format string
	 *
	 * @since 3.0.4
	 *
	 * @return string
	 */
	public function getFormatString()
	{
		$params = $this->getParams();

		return $params->get('text_format_string');
	}

	/**
	 * calculation: median
	 * can be overridden in element class
	 *
	 * @param   FabrikDEModelList &$listModel list model
	 *
	 * @return  string    result
	 */
	public function median(&$listModel)
	{
		$db          = $listModel->getDb();
		$item        = $listModel->getTable();
		$element     = $this->getElement();
		$joinSQL     = $listModel->buildQueryJoin();
		$whereSQL    = $listModel->buildQueryWhere();
		$params      = $this->getParams();
		$splitMedian = $params->get('median_split', '');
		list($groupBys, $groupByLabels) =
$this->calcGroupBys('sum_split', $listModel);
		$split     = empty($groupBys) ? false : true;
		$format    = $this->getFormatString();
		$res       = '';
		$calcLabel = $params->get('median_label',
Text::_('COM_FABRIK_MEDIAN'));
		$results   = array();

		if ($split)
		{
			$pluginManager = FabrikWorker::getPluginManager();
			$plugin        = $pluginManager->getElementPlugin($splitMedian);
			$sql           = $this->getMedianQuery($listModel, $groupBys) .
' GROUP BY label ';
			$sql           = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results2 = $db->loadObjectList();
			$results  = $this->formatCalcSplitLabels($results2, $plugin,
'median');
		}
		else
		{
			$sql = $this->getMedianQuery($listModel);
			$sql = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$res = $this->_median($db->loadColumn());
			$o   = new stdClass;

			if ($format != '')
			{
				$res = sprintf($format, $res);
			}

			$o->value    = $res;
			$label       = $this->getListHeading();
			$o->elLabel  = $label;
			$o->calLabel = $calcLabel;
			$o->label    = 'calc';
			$results     = array('calc' => $o);
		}

		$res = $this->formatCalcs($results, $calcLabel, $split, true, false);

		return array($res, $results);
	}

	/**
	 * calculation: count
	 * can be overridden in element class
	 *
	 * @param   FabrikFEModelList &$listModel List model
	 *
	 * @return  string    result
	 */
	public function count(&$listModel)
	{
		$db = $listModel->getDb();
		$listModel->clearTable();
		$item       = $listModel->getTable();
		$element    = $this->getElement();
		$params     = $this->getParams();
		$calcLabel  = $params->get('count_label',
Text::_('COM_FABRIK_COUNT'));
		$splitCount = $params->get('count_split', '');

		list($groupBys, $groupByLabels) =
$this->calcGroupBys('count_split', $listModel);
		$split = empty($groupBys) ? false : true;

		if ($split)
		{
			$pluginManager = FabrikWorker::getPluginManager();
			$plugin        = $pluginManager->getElementPlugin($splitCount);
			$sql           = $this->getCountQuery($listModel, $groupBys) . "
GROUP BY label ";
			$sql           = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results2  = $db->loadObjectList('label');
			$uberTotal = 0;
			/*
			 * Removes values from display when split on used:
			* see
http://www.fabrikar.com/forums/index.php?threads/calculation-split-on-problem.32035/
			foreach ($results2 as $k => &$r)
			{
			if ($k == '')
			{
			unset($results2[$k]);
			}
			}
			*/
			foreach ($results2 as $pair)
			{
				$uberTotal += $pair->value;
			}

			$uberObject                            = new stdClass;
			$uberObject->value                     = count($results2) == 0 ? 0 :
$uberTotal;
			$uberObject->label                     =
Text::_('COM_FABRIK_TOTAL');
			$uberObject->class                     = 'splittotal';
			$uberObject->special                   = true;
			$results                               =
$this->formatCalcSplitLabels($results2, $plugin, 'count');
			$results[Text::_('COM_FABRIK_TOTAL')] = $uberObject;
		}
		else
		{
			// Need to add a group by here as well as if the ONLY_FULL_GROUP_BY SQL
mode is enabled an error is produced
			$sql = $this->getCountQuery($listModel) . ' GROUP BY label
';
			$sql = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results = $db->loadObjectList('label');
		}

		$res = $this->formatCalcs($results, $calcLabel, $split, false, false);

		return array($res, $results);
	}

	/**
	 * calculation: custom_calc
	 * can be overridden in element class
	 *
	 * @param   FabrikFEModelList &$listModel list model
	 *
	 * @return  array
	 */
	public function custom_calc(&$listModel)
	{
		$db          = $listModel->getDb();
		$params      = $this->getParams();
		$item        = $listModel->getTable();
		$splitCustom = $params->get('custom_calc_split',
'');
		$split       = $splitCustom == '' ? false : true;
		$calcLabel   = $params->get('custom_calc_label',
Text::_('COM_FABRIK_CUSTOM'));

		if ($split)
		{
			$pluginManager = FabrikWorker::getPluginManager();
			$plugin        = $pluginManager->getElementPlugin($splitCustom);
			$splitName     = method_exists($plugin, 'getJoinLabelColumn')
? $plugin->getJoinLabelColumn() : $plugin->getFullName(false, false);
			$splitName     = FabrikString::safeColName($splitName);
			$sql           = $this->getCustomQuery($listModel, $splitName) .
' GROUP BY label';
			$sql           = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results2 = $db->loadObjectList('label');
			$results  = $this->formatCalcSplitLabels($results2, $plugin,
'custom_calc');
		}
		else
		{
			// Need to add a group by here as well as if the ONLY_FULL_GROUP_BY SQL
mode is enabled an error is produced
			$sql = $this->getCustomQuery($listModel) . ' GROUP BY
label';
			$sql = $listModel->pluginQuery($sql);
			$db->setQuery($sql);
			$results = $db->loadObjectList('label');
		}

		$res = $this->formatCalcs($results, $calcLabel, $split);

		return array($res, $results);
	}

	/**
	 * Format the labels for calculations when they are split
	 *
	 * @param   array  &$results2 calculation results
	 * @param   object &$plugin   element that the data is SPLIT on
	 * @param   string $type      of calculation
	 *
	 * @return  array
	 */
	protected function formatCalcSplitLabels(&$results2, &$plugin,
$type = '')
	{
		$results = array();
		$toMerge = array();
		$name    = $plugin->getFullName(true, false);

		// $$$ hugh - avoid PHP warning if $results2 is NULL
		if (empty($results2))
		{
			return $results;
		}

		foreach ($results2 as $key => $val)
		{
			if (isset($val->special) && $val->special)
			{
				// Don't include special values (ubers) in $toMerge, otherwise
total sum added to first value
				$results[$val->label] = $val;
				continue;
			}

			if ($plugin->hasSubElements)
			{
				//
http://fabrikar.com/forums/index.php?threads/calculation-split-on-problem.40122/
				$labelParts = explode(' & ',
$val->label??'');
				if (count($labelParts) > 1)
				{
					$label = $labelParts[1];
				}
				else
				{
					$label = $labelParts[0];
				}

				$label = FabrikWorker::JSONtoData($label);
				$ls = array();

				if (is_array($label))
				{
					foreach ($label as $l)
					{
						$ls[] = ($type != 'median') ?
$plugin->getLabelForValue($l) : $plugin->getLabelForValue($key,
$key);
					}
				}
				else
				{
					$ls[] = ($type != 'median') ?
$plugin->getLabelForValue($label) : $plugin->getLabelForValue($key,
$key);
				}

				if (count($labelParts) > 1)
				{
					$val->label = $labelParts[0] . ' & ' .
implode(',', $ls);
				}
				else
				{
					$val->label = implode(',', $ls);
				}
			}
			else
			{
				$d          = new stdClass;
				$d->$name   = $val->label;
				$opts       = array('rollover' => false, 'link'
=> false);
				$val->label = $plugin->renderListData($val->label, $d, $opts);
			}

			if (array_key_exists($val->label, $results))
			{
				/** $$$ rob the $result data is keyed on the raw database result -
however, we are interested in
				 * keying on the formatted table result (e.g. allows us to group date
entries by year)
				 */
				if ($results[$val->label] !== '')
				{
					$toMerge[$val->label][] = $results[$val->label]->value;
				}

				$results[$val->label]   = '';
				$toMerge[$val->label][] = $val->value;
			}
			else
			{
				$results[$val->label] = $val;
			}
		}

		foreach ($toMerge as $label => $data)
		{
			$o = new stdClass;

			switch ($type)
			{
				case 'avg':
					$o->value = $this->simpleAvg($data);
					break;
				case 'sum':
					$o->value = $this->simpleSum($data);
					break;
				case 'median':
					$o->value = $this->_median($data);
					break;
				case 'count':
					$o->value = count($data);
					break;
				case 'custom_calc':
					$params          = $this->getParams();
					$custom_calc_php = $params->get('custom_calc_php',
'');

					if (!empty($custom_calc_php))
					{
						FabrikWorker::clearEval();
						$o->value = Php::Eval(['code' => $custom_calc_php]);
						FabrikWorker::logEval($custom_calc_php, 'Caught exception on
eval of ' . $name . ': %s');
					}
					else
					{
						$o->value = $data;
					}

					break;
				default:
					$o->value = $data;
					break;
			}

			$o->label        = $label;
			$results[$label] = $o;
		}

		return $results;
	}

	/**
	 * find an average from a set of data
	 * can be overwritten in plugin - see date for example of averaging dates
	 *
	 * @param   array $data to average
	 *
	 * @return  string  average result
	 */
	public function simpleAvg($data)
	{
		return $this->simpleSum($data) / count($data);
	}

	/**
	 * find the sum from a set of data
	 * can be overwritten in plugin - see date for example of averaging dates
	 *
	 * @param   array $data to sum
	 *
	 * @return  string  sum result
	 */
	public function simpleSum($data)
	{
		return array_sum($data);
	}

	/**
	 * Take the results form a calc and create the string that can be used to
summarize them
	 *
	 * @param   array  &$results      calculation results
	 * @param   string $calcLabel     calc label
	 * @param   bool   $split         is the data split
	 * @param   bool   $numberFormat  should we apply any number formatting
	 * @param   bool   $sprintFFormat should we apply the text_format_string ?
	 *
	 * @return  string
	 */
	protected function formatCalcs(&$results, $calcLabel, $split = false,
$numberFormat = true, $sprintFFormat = true)
	{
		settype($results, 'array');
		$res    = array();
		$res[]  = $split ? '<dl>' : '<ul
class="fabrikRepeatData">';
		$l      = '<span class="calclabel">' .
$calcLabel . '</span>';
		$res[]  = $split ? '<dt>' . $l . '</dt>'
: '<li>' . $l;
		$format = $this->getFormatString();
		$label  = $this->getListHeading();

		foreach ($results as $key => $o)
		{
			$o->label   = ($o->label == 'calc') ? '' :
$o->label;
			$o->elLabel = $label . ' ' . $o->label;

			if ($numberFormat)
			{
				$o->value = $this->numberFormat($o->value);
			}

			if ($format != '' && $sprintFFormat)
			{
				$o->value = sprintf($format, $o->value);
			}

			$o->calLabel = $calcLabel;
			$class       = isset($o->class) ? ' class="' .
$o->class . '"' : '';

			if ($split)
			{
				$res[] = '<dd' . $class . '><span
class="calclabel">' . $o->label . ':</span>
' . $o->value . '</dd>';
			}
			else
			{
				$res[] = $o->value . '</li>';
			}
		}

		ksort($results);
		$res[] = $split ? '</dl>' : '</ul>';

		return implode("\n", $res);
	}

	/**
	 * Get median
	 *
	 * @param   array $results set of results to get median from
	 *
	 * @return  string    median value
	 */
	private function _median($results)
	{
		$results = (array) $results;
		sort($results);

		if ((count($results) % 2) == 1)
		{
			/* odd */
			$midKey = floor(count($results) / 2);

			return $results[$midKey];
		}
		else
		{
			$midKey  = floor(count($results) / 2) - 1;
			$midKey2 = floor(count($results) / 2);

			return $this->simpleAvg(array(FArrayHelper::getValue($results,
$midKey), FArrayHelper::getValue($results, $midKey2)));
		}
	}

	/**
	 * Returns javascript which creates an instance of the class defined in
formJavascriptClass()
	 *
	 * @param   int $repeatCounter Repeat group counter
	 *
	 * @return  array
	 */
	public function elementJavascript($repeatCounter)
	{
		return array();
	}

	/**
	 * Get JS code for ini element list js
	 * Overwritten in plugin classes
	 *
	 * @return string
	 */
	public function elementListJavascript()
	{
		return '';
	}

	/**
	 * Create a class for the elements default javascript options
	 *
	 * @param   int $repeatCounter repeat group counter
	 *
	 * @return  object    options
	 */
	public function getElementJSOptions($repeatCounter)
	{
		$element             = $this->getElement();
		$opts                = new stdClass;
		$data                = $this->getFormModel()->data;
		$opts->repeatCounter = $repeatCounter;
		$opts->editable      = ($this->canView() &&
!$this->canUse()) ? false : $this->isEditable();
		$opts->value         = $this->getValue($data, $repeatCounter);
		$opts->label         = $element->label;
		$opts->defaultVal    = $this->getDefaultValue($data);
		$opts->inRepeatGroup = $this->getGroup()->canRepeat() == 1;
		$opts->fullName      = $this->getFullName(true, false);
		$opts->watchElements =
$this->validator->jsWatchElements($repeatCounter);
		$groupModel          = $this->getGroup();
		$opts->canRepeat     = (bool) $groupModel->canRepeat();
		$opts->isGroupJoin   = (bool) $groupModel->isJoin();
		$validations         = $this->validator->findAll();
		$opts->mustValidate  = false;

		foreach ($validations as $validation)
		{
			$validationParams = $validation->getParams();
			if ($validationParams->get('must_validate', '0')
=== '1')
			{
				if ($validation->canValidate())
				{
					$opts->mustValidate = true;
					break;
				}
			}
		}

		$opts->validations = empty($validations) ? false : true;

		if ($this->isJoin())
		{
			$opts->joinid = (int) $this->getJoinModel()->getJoin()->id;
		}
		else
		{
			$opts->joinid = (int) $groupModel->getGroup()->join_id;
		}

		return $opts;
	}

	/**
	 * Does the element use the WYSIWYG editor
	 *
	 * @return  bool    use wysiwyg editor
	 */
	public function useEditor()
	{
		return false;
	}

	/**
	 * Processes uploaded data
	 *
	 * @return  void
	 */
	public function processUpload()
	{
	}

	/**
	 * Get the class to manage the form element
	 * to ensure that the file is loaded only once
	 *
	 * @param   array  &$srcs  Scripts previously loaded
	 * @param   string $script Script to load once class has loaded
	 * @param   array  &$shim  Dependant class names to load before
loading the class - put in requirejs.config shim
	 *
	 * @return void
	 */
	public function formJavascriptClass(&$srcs, $script = '',
&$shim = array())
	{
		$name   = $this->getElement()->plugin;
		$ext    = FabrikHelperHTML::isDebug() ? '.js' :
'-min.js';
		$formId = $this->getFormModel()->getId();
		static $elementClasses;

		if (!isset($elementClasses))
		{
			$elementClasses = array();
		}

		if (!array_key_exists($formId, $elementClasses))
		{
			$elementClasses[$formId] = array();
		}
		// Load up the default script
		if ($script == '')
		{
			$script = 'plugins/fabrik_element/' . $name . '/' .
$name . $ext;
		}

		if (empty($elementClasses[$formId][$script]))
		{
			$srcs['Element' . ucfirst($name)] = $script;
			$elementClasses[$formId][$script] = 1;
		}
	}

	/**
	 * load js file for element when in list view
	 *
	 * @param   array &$srcs JS scripts to load
	 *
	 * @return  null
	 */
	public function tableJavascriptClass(&$srcs)
	{
		$p   = $this->getElement()->plugin;
		$src = 'plugins/fabrik_element/' . $p . '/list-' . $p
. '.js';

		if (File::exists(JPATH_SITE . '/' . $src))
		{
			$className = 'Fb' . ucfirst($p) .'List';
			$srcs[$className] = $src;
		}
	}

	/**
	 * Can be overwritten in plugin classes
	 * e.g. if changing from db join to field we need to remove the join
	 * entry from the #__fabrik_joins table
	 *
	 * @param   object &$row that is going to be updated
	 *
	 * @return null
	 */
	public function beforeSave(&$row)
	{
//		$safeHtmlFilter = InputFilter::getInstance(null, null, 1, 1);
		$safeHtmlFilter = InputFilter::getInstance(array(), array(), 1, 1);
		$post           = $safeHtmlFilter->clean($_POST, 'array');
		$post           = $post['jform'];
		$dbjoinEl       = (is_subclass_of($this,
'PlgFabrik_ElementDatabasejoin') || get_class($this) ==
'PlgFabrik_ElementDatabasejoin');
		/**
		 * $$$ hugh - added test for empty id, i.e. new element, otherwise we try
and delete a crap load of join table rows
		 * we shouldn't be deleting!  Also adding defensive code to
deleteJoins() to test for empty ID.
		 */

		if (!empty($post['id']) && !$this->isJoin()
&& !$dbjoinEl)
		{
			$this->deleteJoins((int) $post['id']);
		}
	}

	/**
	 * Delete joins
	 *
	 * @param   int $id element id
	 *
	 * @return  null
	 */
	protected function deleteJoins($id)
	{
		// $$$ hugh - bail if no $id specified
		if (empty($id))
		{
			return;
		}

		$db    = FabrikWorker::getDbo(true);
		$query = $db->getQuery(true);
		$query->delete('#__fabrik_joins')->where('element_id
= ' . $id);
		$db->setQuery($query);
		$db->execute();

		$query->clear();
		$query->select('j.id AS
jid')->from('#__fabrik_elements AS
e')->join('INNER', ' #__fabrik_joins AS j ON
j.element_id = e.id')
			->where('e.parent_id = ' . $id);
		$db->setQuery($query);
		$join_ids = $db->loadColumn();

		if (!empty($join_ids))
		{
			$query->clear();
			$query->delete('#__fabrik_joins')->where('id IN
(' . implode(',', $join_ids) . ')');
			$db->setQuery($query);
			$db->execute();
		}
	}

	/**
	 * If your element risks not to post anything in the form (e.g. check
boxes with none checked)
	 * the this function will insert a default value into the database
	 *
	 * @param   array &$data form data
	 *
	 * @return  array  form data
	 */
	public function getEmptyDataValue(&$data)
	{
	}

	/**
	 * Used to format the data when shown in the form's email
	 *
	 * @param   mixed $value         element's data
	 * @param   array $data          form records data
	 * @param   int   $repeatCounter repeat group counter
	 *
	 * @return  string    formatted value
	 */
	public function getEmailValue($value, $data = array(), $repeatCounter = 0)
	{
		if ($this->inRepeatGroup && is_array($value))
		{
			$val = array();

			foreach ($value as $v2)
			{
				$val[] = $this->getIndEmailValue($v2, $data, $repeatCounter);
			}
		}
		else
		{
			$val = $this->getIndEmailValue($value, $data, $repeatCounter);
		}

		return $val;
	}

	/**
	 * Turn form value into email formatted value
	 *
	 * @param   mixed $value         Element value
	 * @param   array $data          Form data
	 * @param   int   $repeatCounter Group repeat counter
	 *
	 * @return  string  email formatted value
	 */
	protected function getIndEmailValue($value, $data = array(),
$repeatCounter = 0)
	{
		return $value;
	}

	/**
	 * Is the element an upload element
	 *
	 * @return boolean
	 */
	public function isUpload()
	{
		return $this->is_upload;
	}

	/**
	 * If a database join element's value field points to the same db
field as this element
	 * then this element can, within modifyJoinQuery, update the query.
	 * E.g. if the database join element points to a file upload element then
you can replace
	 * the file path that is the standard $val with the html to create the
image
	 *
	 * @param   string $val  value
	 * @param   string $view form or list
	 *
	 * @deprecated - doesn't seem to be used
	 *
	 * @return  string    modified val
	 */
	protected function modifyJoinQuery($val, $view = 'form')
	{
		return $val;
	}

	/**
	 * not used
	 *
	 * @deprecated
	 *
	 * @return void
	 */
	public function ajax_loadTableFields()
	{
		$db             = FabrikWorker::getDbo();
		$listModel      =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$input          = $this->app->getInput();
		$this->_cnnId   = $input->getInt('cid', 0);
		$tbl            = $db->qn($input->get('table'));
		$fieldDropDown  = $listModel->getFieldsDropDown($this->_cnnId,
$tbl, '-', false, 'params[join_val_column]');
		$fieldDropDown2 = $listModel->getFieldsDropDown($this->_cnnId,
$tbl, '-', false, 'params[join_key_column]');
		echo "$('addJoinVal').innerHTML =
'$fieldDropDown';";
		echo "$('addJoinKey').innerHTML =
'$fieldDropDown2';";
	}

	/**
	 * Get join row
	 *
	 * @return  FabrikTableJoin    join table or false if not loaded
	 */
	protected function getJoin()
	{
		if ($this->isJoin())
		{
			return $this->getJoinModel()->getJoin();
		}

		return false;
	}

	/**
	 * Get database field description
	 *
	 * @return  string  db field type
	 */
	public function getFieldDescription()
	{
		$element = $this->getPluginName();
		$plugin  = PluginHelper::getPlugin('fabrik_element', $element);
		$fParams = new Registry($plugin->params);
		$p       = $this->getParams();

		if ($this->encryptMe())
		{
			return 'BLOB';
		}

		$group = $this->getGroup();

		if ($group->isJoin() == 0 && $group->canRepeat())
		{
			return "TEXT";
		}
		else
		{
			$size    = $p->get('maxlength', $this->fieldSize);
			$objType = sprintf($this->fieldDesc, $size);
		}

		$objType = $fParams->get('defaultFieldType', $objType);

		return $objType;
	}

	/**
	 * Trigger called when a row is deleted, can be used to delete images
previously uploaded
	 *
	 * @param   array $groups grouped data of rows to delete
	 *
	 * @return  void
	 */
	public function onDeleteRows($groups)
	{
	}

	/**
	 * Get a value to use as an empty filter value
	 *
	 * @return  string
	 */
	public function emptyFilterValue()
	{
		return '';
	}

	/**
	 * Trigger called when a form or group row is stored.
	 * Ignores the element if it is a join chx/multi select
	 *
	 * @param   array &$data         Data to store
	 * @param   int   $repeatCounter Repeat group index
	 *
	 * @return  bool  If false, data should not be added.
	 */
	public function onStoreRow(&$data, $repeatCounter = 0)
	{
		if ($this->isJoin())
		{
			return false;
		}

		$element = $this->getElement();

		// We should not process this element if it is unpublished
		// Unpublished elements may not be in a valid state and may cause an
error (white-screen)
		if (!$element->published)
		{
			return false;
		}

		$shortName = $element->name;
		$listModel = $this->getListModel();

		if ($this->encryptMe())
		{
			$listModel->encrypt[] = $shortName;
		}

		$formModel = $this->getFormModel();
		$name      = $this->getFullName(true, false);

		/**
		 * @TODO - fix this to use formData instead of formDataWithTableName,
		 * which we need to deprecate.
		 */
		if (!array_key_exists($name, $formModel->formDataWithTableName))
			//if
($this->dataConsideredEmpty(FArrayHelper::getValue($formModel->formDataWithTableName,
$name, '')))
		{
			$this->getEmptyDataValue($data);
		}

		$v = $this->getValue($formModel->formDataWithTableName,
$repeatCounter);

		if (!$this->ignoreOnUpdate($v))
		{
			$data[$shortName] = $v;
		}

		return true;
	}

	/**
	 * Shows the data formatted for the list view
	 *
	 * @param   string   $data     Elements data
	 * @param   stdClass &$thisRow All the data in the lists current row
	 * @param   array    $opts     Rendering options
	 *
	 * @return  string    formatted value
	 */
	public function renderListData($data, stdClass &$thisRow, $opts =
array())
	{
        $profiler = Profiler::getInstance('Application');
        JDEBUG ? $profiler->mark("renderListData: parent: start:
{$this->element->name}") : null;

        $params    = $this->getParams();
		$listModel = $this->getListModel();

		if (!ArrayHelper::getValue($opts, 'json', false))
		{
			$data = FabrikWorker::JSONtoData($data, true);
		}
		else
		{
			$data = (array) $data;
		}

		foreach ($data as $i => &$d)
		{
			/**
			 * At this point we should have scalar data, but if something (like a
textarea) had JSON as its value,
			 * it will have gotten decoded by the JSONtoData, so if not scalar,
re-encode it.
			 */
			if (!is_scalar($d))
			{
				$d = json_encode($d);
			}

			if ((int)$params->get('icon_folder', 0) > 0 &&
ArrayHelper::getValue($opts, 'icon', 1))
			{
				// $$$ rob was returning here but that stopped us being able to use
links and icons together
				$d = $this->replaceWithIcons($d, 'list',
$listModel->getTmpl());
			}

			if (ArrayHelper::getValue($opts, 'rollover', 1))
			{
				$d = $this->rollover($d, $thisRow, 'list');
			}

			if (ArrayHelper::getValue($opts, 'link', 1))
			{
				$d = $listModel->_addLink($d, $this, $thisRow, $i);
			}
		}

		$final = $this->renderListDataFinal($data, $opts);
        JDEBUG ? $profiler->mark("renderListData: parent: end:
{$this->element->name}") : null;

        return $final;
	}

	/**
	 * Final prepare data function called from renderListData(), converts data
to string and if needed
	 * encases in <ul> (for repeating data)
	 *
	 * @param   array  $data  list cell data
     * $param   array  $opts  list options
	 *
	 * @return  string    cell data
	 */
	protected function renderListDataFinal($data, $opts)
	{
        $profiler = Profiler::getInstance('Application');
        JDEBUG ? $profiler->mark("renderListDataFinal: parent:
start: {$this->element->name}") : null;

        if (is_array($data))
		{
			if (count($data) > 1)
			{
				if (!array_key_exists(0, $data))
				{
					// Occurs if we have created a list from an existing table whose data
contains json objects (e.g. #__users.params)
					$obj     = ArrayHelper::toObject($data);
					$data    = array();
					$data[0] = $obj;
				}
				// If we are storing info as json the data will contain an array of
objects
				if (is_object($data[0]))
				{
					foreach ($data as &$o)
					{
						$this->convertDataToString($o);
					}
				}

				$r = '<ul
class="fabrikRepeatData"><li>' .
implode('</li><li>', $data) .
'</li></ul>';
			}
			else
			{
				$r = empty($data) ? '' : array_shift($data);
			}
		}
		else
		{
			$r = $data;
		}

        $displayData = new stdClass;
        $displayData->text = $r;

        if (ArrayHelper::getValue($opts, 'custom_layout', 1)) {
            $layout = $this->getLayout('list');
            $res = $layout->render($displayData);
        }
        else
        {
            $res = '';
        }

		// If no custom list layout found revert to the default list renderer
		if ($res === '')
		{
			$basePath = COM_FABRIK_FRONTEND . '/layouts/';
			$layout   = new FileLayout('fabrik-element-list', $basePath,
array('debug' => false, 'component' =>
'com_fabrik', 'client' => 'site'));
			$res      = $layout->render($displayData);
		}

        JDEBUG ? $profiler->mark("renderListDataFinal: parent: end:
{$this->element->name}") : null;

        return $res;
	}

	/**
	 * Convert an object or array into a <ul>
	 *
	 * @param   mixed &$o data to convert
	 *
	 * @return  void
	 */
	protected function convertDataToString(&$o)
	{
		if (is_object($o))
		{
			$s = '<ul>';

			foreach ($o as $k => $v)
			{
				if (!is_string($v))
				{
					$v = json_encode($v);
				}

				$s .= '<li>' . $v . '</li>';
			}

			$s .= '</ul>';
			$o = $s;
		}
	}

	/**
	 * Prepares the element data for CSV export
	 *
	 * @param   string $data     Element data
	 * @param   object &$thisRow All the data in the lists current row
	 *
	 * @return  string    Formatted CSV export value
	 */
	public function renderListData_csv($data, &$thisRow)
	{
		return $data;
	}

	/**
	 * Builds some html to allow certain elements to display the option to add
in new options
	 * e.g. picklists, dropdowns radiobuttons
	 *
	 * @param   bool $repeatCounter repeat group counter
	 * @param   bool $onlylabel     only show the label - overrides standard
element settings
	 *
	 * @return  string
	 */
	protected function getAddOptionFields($repeatCounter, $onlylabel = false)
	{
		$params = $this->getParams();

		if (!$params->get('allow_frontend_addto'))
		{
			return;
		}

		$basePath                        = COM_FABRIK_BASE .
'/components/com_fabrik/layouts/element';
		$layout                          = new
FileLayout('fabrik-element-addoptions', $basePath,
array('debug' => false, 'component' =>
'com_fabrik', 'client' => 'site'));
		$displayData                     = new stdClass;
		$displayData->id                 =
$this->getHTMLId($repeatCounter);
		$displayData->add_image          =
FabrikHelperHTML::image('plus', 'form',
@$this->tmpl, array('alt' =>
Text::_('COM_FABRIK_ADD')));
		$displayData->allowadd_onlylabel =
$params->get('allowadd-onlylabel');
		$displayData->savenewadditions   =
$params->get('savenewadditions');
		$displayData->onlylabel          = $onlylabel;
		$displayData->hidden_field       =
$this->getHiddenField($displayData->id . '_additions',
'', $displayData->id . '_additions');

		return $layout->render($displayData);
	}

	/**
	 * Does the element force the form to submit via AJAX
	 *
	 * @deprecated - not used
	 *
	 * @return  bool    true if the element type forces the form to
	 */
	public function requiresAJAXSubmit()
	{
		return false;
	}

	/**
	 * Determine if the element should run its validation plugins on form
submission
	 *
	 * @return  bool    default true
	 */
	public function mustValidate()
	{
		return true;
	}

	/**
	 * Get the name of the field to order the table data by
	 * can be overwritten in plugin class - but not currently done so
	 *
	 * @return string column to order by tablename___elementname and yes you
can use aliases in the order by clause
	 */
	public function getOrderByName()
	{
		return $this->getFullName(true, false);
	}

	/**
	 * Not used
	 *
	 * @param   string $rawval raw value
	 *
	 * @deprecated - not used
	 *
	 * @return string
	 */
	public function getFilterLabel($rawval)
	{
		return $rawval;
	}

	/**
	 * Store the element params
	 *
	 * @return  bool
	 *
	 * @throws  RuntimeException
	 */
	public function storeAttribs()
	{
		$element = $this->getElement();

		if (!$element)
		{
			return false;
		}

		$db              = FabrikWorker::getDbo(true);
		$element->params = $this->getParams()->toString();

		/*
		 * Trying to save JSON params larger than the params field totally breaks
the backend.  Original size
		 * of params field was TEXT, and a large serialized calculation could
blow that away.
		 *
		 * In 3.6.1 we increased the size of params to MEDIUMTEXT, but people
only updating from github
		 * may not get that update right away.  So just to be on the safe side,
we'll update it on the fly
		 * if params are big.  Leave this in till 3.7.
		 */
		if (strlen($element->params) > 65535)
		{
			$db->setQuery("ALTER TABLE `#__fabrik_elements` MODIFY `params`
MEDIUMTEXT");
			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				// meh
			}
		}

		$query           = $db->getQuery(true);
		$query->update('#__fabrik_elements')->set('params =
' . $db->q($element->params))->where('id = ' .
(int) $element->id);
		$db->setQuery($query);
		$res = $db->execute();

		return $res;
	}

	/**
	 * load a new set of default properties and params for the element
	 * can be overridden in plugin class
	 *
	 * @param   array $properties Default props
	 *
	 * @return  FabrikTableElement    element (id = 0)
	 */
	public function getDefaultProperties($properties = array())
	{
		$now = $this->date->toSql();
		$this->setId(0);
		$item = $this->getElement();
		$item->set('plugin', $this->_name);
		$item->set('params', $this->getDefaultAttribs());
		$item->set('created', $now);
		$item->set('created_by',
$this->user->get('id'));
		$item->set('created_by_alias',
$this->user->get('username'));
		$item->set('published', '1');
		$item->set('show_in_list_summary', '1');
		$item->set('link_to_detail', '1');
		$item->bind($properties);

		return $item;
	}

	/**
	 * Get a json encoded string of the element default parameters
	 *
	 * @return  string
	 */
	public function getDefaultAttribs()
	{
		$o                               = new stdClass;
		$o->rollover                     = '';
		$o->comment                      = '';
		$o->sub_default_value            = '';
		$o->sub_default_label            = '';
		$o->element_before_label         = 1;
		$o->allow_frontend_addtocheckbox = 0;
		$o->database_join_display_type   = 'dropdown';
		$o->joinType                     = 'simple';
		$o->join_conn_id                 = -1;
		$o->date_table_format            = 'Y-m-d';
		$o->date_form_format             = 'Y-m-d H:i:s';
		$o->date_showtime                = 0;
		$o->date_time_format             = 'H:i';
		$o->date_defaulttotoday          = 1;
		$o->date_firstday                = 0;
		$o->multiple                     = 0;
		$o->allow_frontend_addtodropdown = 0;
		$o->password                     = 0;
		$o->maxlength                    = 255;
		$o->text_format                  = 'text';
		$o->integer_length               = 6;
		$o->decimal_length               = 2;
		$o->guess_linktype               = 0;
		$o->disable                      = 0;
		$o->readonly                     = 0;
		$o->ul_max_file_size             = 16000;
		$o->ul_email_file                = 0;
		$o->ul_file_increment            = 0;
		$o->upload_allow_folderselect    = 1;
		$o->fu_fancy_upload              = 0;
		$o->upload_delete_image          = 1;
		$o->make_link                    = 0;
		$o->fu_show_image_in_table       = 0;
		$o->image_library                = 'gd2';
		$o->make_thumbnail               = 0;
		$o->imagepath                    = '/';
		$o->selectImage_root_folder      = '/';
		$o->image_front_end_select       = 0;
		$o->show_image_in_table          = 0;
		$o->image_float                  = 'none';
		$o->link_target                  = '_self';
		$o->radio_element_before_label   = 0;
		$o->options_per_row              = 4;
		$o->ck_options_per_row           = 4;
		$o->allow_frontend_addtoradio    = 0;
		$o->use_wysiwyg                  = 0;
		$o->my_table_data                = 'id';
		$o->update_on_edit               = 0;
		$o->view_access                  = 1;
		$o->show_in_rss_feed             = 0;
		$o->show_label_in_rss_feed       = 0;
		$o->icon_folder                  = -1;
		$o->use_as_row_class             = 0;
		$o->filter_access                = 1;
		$o->full_words_only              = 0;
		$o->inc_in_adv_search            = 1;
		$o->sum_on                       = 0;
		$o->sum_access                   = 0;
		$o->avg_on                       = 0;
		$o->avg_access                   = 0;
		$o->median_on                    = 0;
		$o->median_access                = 0;
		$o->count_on                     = 0;
		$o->count_access                 = 0;

		return json_encode($o);
	}

	/**
	 * Do we need to include the light-box js code
	 *
	 * @return  bool
	 */
	public function requiresLightBox()
	{
		return false;
	}

	/**
	 * Do we need to include the slide-show js code
	 *
	 * @return  bool
	 */
	public function requiresSlideshow()
	{
		return false;
	}

	/**
	 * Get Joomfish options
	 *
	 * @deprecated - not supporting joomfish
	 *
	 * @return  array    key=>value options
	 */
	public function getJoomfishOptions()
	{
		return array();
	}

	/**
	 * When filtering a table determine if the element's filter should be
an exact match
	 * should take into account if the element is in a non-joined repeat group
	 *
	 * @param   string $val element value
	 *
	 * @return  bool
	 */
	public function isExactMatch($val)
	{
		$element          = $this->getElement();
		$filterExactMatch = isset($val['match']) ?
$val['match'] : $element->filter_exact_match;
		$group            = $this->getGroup();

		if (!$group->isJoin() && $group->canRepeat())
		{
			$filterExactMatch = false;
		}

		return $filterExactMatch;
	}

	/**
	 * Not used
	 *
	 * @deprecated - not used
	 *
	 * @return boolean
	 */
	public function onAjax_getFolders()
	{
		$input   = $this->app->getInput();
		$rDir    = $input->getString('dir');
		$folders = Folder::folders($rDir);

		if ($folders === false)
		{
			// $$$ hugh - need to echo empty JSON array otherwise we break JS which
assumes an array
			echo json_encode(array());

			return false;
		}

		sort($folders);
		echo json_encode($folders);
	}

	/**
	 * If used as a filter add in some JS code to watch observed filter
element's changes
	 * when it changes update the contents of this elements dd filter's
options
	 *
	 * @param   bool   $normal    is the filter a normal (true) or advanced
filter
	 * @param   string $container container
	 *
	 * @return  void
	 */
	public function filterJS($normal, $container)
	{
		// Overwritten in plugin
	}

	/**
	 * Should the element's data be returned in the search all?
	 * Looks at the lists selected options, if its there looks at what search
mode the list is using
	 * and determines if the selected element can be used.
	 *
	 * @param   bool   $advancedMode Is the elements' list is extended
search all mode?
	 * @param   string $search       Search string
	 *
	 * @return  bool    true
	 */
	public function includeInSearchAll($advancedMode = false, $search =
'')
	{
		if ($this->isJoin() && $advancedMode)
		{
			return false;
		}

		$listModel      = $this->getListModel();
		$listParams     = $listModel->getParams();
		$searchElements = $listParams->get('list_search_elements',
'');

		if ($searchElements === '')
		{
			return false;
		}

		$searchElements = json_decode($searchElements);

		if (!isset($searchElements->search_elements) ||
!is_array($searchElements->search_elements))
		{
			return false;
		}

		if (in_array($this->getId(), $searchElements->search_elements))
		{
			$advancedMode = $listParams->get('search-mode-advanced');

			return $this->canIncludeInSearchAll($advancedMode);
		}
	}

	/**
	 * Is it possible to include the element in the  Search all query?
	 * true if basic search
	 * true/false if advanced search
	 *
	 * @param   bool $advancedMode Is the list using advanced search
	 *
	 * @since  3.1b
	 *
	 * @return boolean
	 */
	public function canIncludeInSearchAll($advancedMode)
	{
		$params = $this->getParams();

		if (!$advancedMode)
		{
			return true;
		}

		if ($this->ignoreSearchAllDefault)
		{
			return false;
		}

		$format = $params->get('text_format');

		if ($format == 'integer' || $format == 'decimal')
		{
			return false;
		}

		return true;
	}

	/**
	 * Modify the label for admin list - filter elements.
	 * Adds a '*' if the element is not available in advanced search
	 *
	 * @param   string &$label Element label
	 *
	 * @return  void
	 */
	public function availableInAdvancedSearchLabel(&$label)
	{
		$label = $this->canIncludeInSearchAll(true) ? $label : $label .
'*';
	}

	/**
	 * Get the value to use for graph calculations
	 * see timer which converts the value into seconds
	 *
	 * @param   string $v standard value
	 *
	 * @return  mixed calculation value
	 */
	public function getCalculationValue($v)
	{
		return (float) $v;
	}

	/**
	 * run on formModel::setFormData()
	 *
	 * @param   int $c repeat group counter
	 *
	 * @return void
	 */
	public function preProcess($c)
	{
	}

	/**
	 * Called when copy row list plugin called
	 *
	 * @param   mixed $val value to copy into new record
	 *
	 * @return mixed value to copy into new record
	 */
	public function onCopyRow($val)
	{
		return $this->defaultOnCopy() ? $this->default : $val;
	}

	/**
	 * Called when save as copy form button clicked
	 *
	 * @param   mixed $val value to copy into new record
	 *
	 * @return  mixed  value to copy into new record
	 */
	public function onSaveAsCopy($val)
	{
		return $this->defaultOnCopy() ? $this->default : $val;
	}

	/**
	 * Ajax call to get auto complete options (now caches results)
	 *
	 * @return  string  json encoded options
	 */
	public function onAutocomplete_options()
	{
		// Needed for ajax update (since we are calling this method via
dispatcher element is not set)
		$input = $this->app->getInput();
		$o         = new stdClass;
		$formModel = $this->getFormModel();
		$this->setId($input->getInt('element_id'));
		$this->loadMeForAjax();

		// Check for request forgeries
		if ($formModel->spoofCheck() &&
!Session::checkToken('request'))
		{
			$o->error = Text::_('JERROR_ALERTNOAUTHOR');
			echo json_encode($o);

			return;
		}

		if (!$this->canUse()) {
			$o->error = Text::_('JERROR_ALERTNOAUTHOR');
			echo json_encode($o);

			return;
		}

		$cache  = FabrikWorker::getCache();
		$search = $input->get('value', '',
'string');
		// uh oh, can't serialize PDO db objects so no can cache, as J!
serializes the args
		if ($this->config->get('dbtype') ===
'pdomysql')
		{
			echo $this->cacheAutoCompleteOptions($this, $search);
		}
		else
		{
			echo $cache->get(array(get_class($this),
'cacheAutoCompleteOptions'), [$this, $search]);
		}
	}

	/**
	 * Cache method to populate auto-complete options
	 *
	 * @param   plgFabrik_Element $elementModel element model
	 * @param   string            $search       search string
	 * @param   array             $opts         options, 'label'
=> field to use for label (db join)
	 *
	 * @since   3.0.7
	 *
	 * @return string  json encoded search results
	 */
	public static function cacheAutoCompleteOptions($elementModel, $search,
$opts = array())
	{
		$name = $elementModel->getFullName(false, false);
		$elementModel->encryptFieldName($name);
		$listModel = $elementModel->getListModel();
		$db        = $listModel->getDb();
		$query     = $db->getQuery(true);
		$tableName = $listModel->getTable()->db_table_name;
		$query->select('DISTINCT(' . $name . ') AS value,
' . $name . ' AS text')->from($tableName);
		$query->where($name . ' LIKE ' .
$db->q(addslashes('%' . $search . '%')));
		$query = $listModel->buildQueryJoin($query);
		$query = $listModel->buildQueryWhere(false, $query);
		$query = $listModel->pluginQuery($query);
		$db->setQuery($query);
		$tmp = $db->loadObjectList();

		foreach ($tmp as &$t)
		{
			$elementModel->toLabel($t->text);
			$t->text = strip_tags($t->text);
		}

		return json_encode($tmp);
	}

	/**
	 * Get the table name that the element stores to
	 * can be the main table name or the joined table name
	 *
	 * @return  string
	 */
	protected function getTableName()
	{
		$listModel  = $this->getListModel();
		$table      = $listModel->getTable();
		$groupModel = $this->getGroup();

		if ($groupModel->isJoin())
		{
			$joinModel = $groupModel->getJoinModel();
			$join      = $joinModel->getJoin();
			$name      = $join->table_join;
		}
		else
		{
			$name = $table->db_table_name;
		}

		return $name;
	}

	/**
	 * Converts a raw value into its label equivalent
	 *
	 * @param   string &$v raw value
	 *
	 * @return  void
	 */
	protected function toLabel(&$v)
	{
	}

	/**
	 * Build group by query to append to list query
	 *
	 * @return  string getGroupByQuery
	 */
	public function getGroupByQuery()
	{
		return '';
	}

	/**
	 * Append element where statement to lists where array
	 *
	 * @param   array &$whereArray list models where statements
	 *
	 * @return  void
	 */
	public function appendTableWhere(&$whereArray)
	{
		$params = $this->getParams();

		if ($params->get('append_table_where', false))
		{
			if (method_exists($this, 'buildQueryWhere'))
			{
				$where = trim($this->buildQueryWhere(array()));

				if ($where != '')
				{
					$where = StringHelper::substr($where, 5, StringHelper::strlen($where)
- 5);

					if (!in_array($where, $whereArray))
					{
						$whereArray[] = $where;
					}
				}
			}
		}
	}

	/**
	 * Used by validations
	 *
	 * @param   string $data    this elements data
	 * @param   string $cond    what condition to apply
	 * @param   string $compare data to compare element's data to
	 *
	 * @return bool
	 */
	public function greaterOrLessThan($data, $cond, $compare)
	{
		if ($cond == '>')
		{
			return $data > $compare;
		}
		elseif ($cond == '>=')
		{
			return $data >= $compare;
		}
		elseif ($cond == '<')
		{
			return $data < $compare;
		}
		elseif ($cond == '<=')
		{
			return $data <= $compare;
		}
		elseif ($cond == '==')
		{
			return $data == $compare;
		}

		return false;
	}

	/**
	 * Can the element plugin encrypt data
	 *
	 * @return  bool
	 */
	public function canEncrypt()
	{
		return false;
	}

	/**
	 * Should the element's data be encrypted
	 *
	 * @return  bool
	 */
	public function encryptMe()
	{
		$params = $this->getParams();

		return ($this->canEncrypt() &&
$params->get('encrypt', false));
	}

	/**
	 * Format a number value
	 *
	 * @param   mixed $data (double/int)
	 *
	 * @return  string    formatted number
	 */
	protected function numberFormat($data)
	{
		$params = $this->getParams();

		if (!$params->get('field_use_number_format', false) ||
empty($data))
		{
			return $data;
		}

		$decimalLength = (int) $params->get('decimal_length', 2);
		$decimalSep    = $params->get('field_decimal_sep',
'.');
		$thousandSep   = $params->get('field_thousand_sep',
',');

		// Workaround for params not letting us save just a space!
		if ($thousandSep == '#32')
		{
			$thousandSep = ' ';
		}
		else if ($thousandSep == '#00')
		{
			$thousandSep = '';
		}

		return number_format((float) $data, $decimalLength, $decimalSep,
$thousandSep);
	}

	/**
	 * Strip number format from a number value
	 *
	 * @param   mixed $val (double/int)
	 *
	 * @return  string    formatted number
	 */
	public function unNumberFormat($val)
	{
		$params = $this->getParams();

		if (!$params->get('field_use_number_format', false) ||
is_null($val))
		{
			return $val;
		}

		// if we're copying a row, format won't be applied
		$formModel = $this->getFormModel();

		if (isset($formModel->formData) &&
array_key_exists('fabrik_copy_from_table',
$formModel->formData))
		{
			return $val;
		}

		// Might think about rounding to decimal_length, but for now let MySQL do
it
		$decimalLength = (int) $params->get('decimal_length', 2);

		// Swap dec and thousand seps back to Normal People Decimal Format!
		$decimalSep  = $params->get('field_decimal_sep',
'.');
		$thousandSep = $params->get('field_thousand_sep',
',');

		// Workaround for params not letting us save just a space!
		if ($thousandSep == '#32')
		{
			$thousandSep = ' ';
		}
		else if ($thousandSep == '#00')
		{
			$thousandSep = '';
		}
		
		$val = str_replace($thousandSep, '', $val);
		$val = str_replace($decimalSep, '.', $val);

		return $val;
	}

	/**
	 * Recursively get all linked children of an element
	 *
	 * @param   int $id element id
	 *
	 * @return  array
	 */
	public function getElementDescendents($id = 0)
	{
		if (empty($id))
		{
			$id = $this->id;
		}

		$db    = FabrikWorker::getDbo(true);
		$query = $db->getQuery(true);
		$query->select('id')->from('#__fabrik_elements')->where('parent_id
= ' . (int) $id);
		$db->setQuery($query);
		$kids     = $db->loadObjectList();
		$all_kids = array();

		foreach ($kids as $kid)
		{
			$all_kids[] = $kid->id;
			$all_kids   = array_merge($this->getElementDescendents($kid->id),
$all_kids);
		}

		return $all_kids;
	}

	/**
	 * Get the actual table name to use when building select queries
	 * so if in a joined group get the joined to table's name otherwise
return the
	 * table's db table name
	 *
	 * @return  string
	 */
	protected function actualTableName()
	{
		if (isset($this->actualTable))
		{
			return $this->actualTable;
		}

		$groupModel = $this->getGroup();

		if ($groupModel->isJoin())
		{
			$joinModel = $groupModel->getJoinModel();

			return $joinModel->getJoin()->table_join;
		}

		$listModel         = $this->getListModel();
		$this->actualTable = $listModel->getTable()->db_table_name;

		return $this->actualTable;
	}

	/**
	 * When creating crud query in tableModel::storeRow() each element has the
chance
	 * to alter the row id - used by sugarid plugin to fudge rowid
	 *
	 * @param   string &$rowId row id
	 *
	 * @deprecated - not used
	 *
	 * @return  void
	 */
	public function updateRowId(&$rowId)
	{
	}

	/**
	 * Fabrik3: moved to Admin Element Model
	 *
	 * @deprecated - not used
	 *
	 * @return  string    table name
	 */
	protected function getRepeatElementTableName()
	{
	}

	/**
	 * Is the element a repeating element
	 *
	 * @return  bool
	 */
	public function isRepeatElement()
	{
		return $this->isJoin();
	}

	/**
	 * fabrik3: moved to Admin Element Model
	 * if repeated element we need to make a joined db table to store repeated
data in
	 *
	 * @depreciated
	 *
	 * @return  void
	 */
	public function createRepeatElement()
	{
	}

	/**
	 * get the element's associated join model
	 *
	 * @return  FabrikFEModelJoin    join model
	 */
	public function getJoinModel()
	{
		if (is_null($this->joinModel))
		{
			$this->joinModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Join',
'FabrikFEModel');

			// $$$ rob ensure we load the join by asking for the parents id, but
then ensure we set the element id back to this elements id
			$this->joinModel->getJoinFromKey('element_id',
$this->getParent()->id);
			$this->joinModel->getJoin()->element_id =
$this->getElement()->id;
		}

		return $this->joinModel;
	}

	/**
	 * When saving an element pk we need to update any join which has the same
params->pk
	 *
	 * @param   string $oldName (previous element name)
	 * @param   string $newName (new element name)
	 *
	 * @since    3.0.6
	 *
	 * @return  void
	 */
	public function updateJoinedPks($oldName, $newName)
	{
		$db    = FabrikWorker::getDbo(true);
		$item  = $this->getListModel()->getTable();
		$query = $db->getQuery(true);

		// Update linked lists id.
		$query->update('#__fabrik_joins')->set('table_key =
' . $db->q($newName))
			->where('join_from_table = ' .
$db->q($item->db_table_name))->where('table_key = ' .
$db->q($oldName));
		$db->setQuery($query);
		$db->execute();

		// Update join pk parameter
		$query->clear();
		$query->select('id')->from('#__fabrik_joins')->where('table_join
= ' . $db->q($item->db_table_name));
		$db->setQuery($query);
		$ids    = $db->loadColumn();
		$testPk = $db->qn($item->db_table_name . '.' . $oldName);
		$newPk  = $db->qn($item->db_table_name . '.' . $newName);

		foreach ($ids as $id)
		{
			$join = FabTable::getInstance('Join',
'FabrikTable');
			$join->load($id);
			$params = new Registry($join->params);

			if ($params->get('pk') === $testPk)
			{
				$params->set('pk', $newPk);
				$join->params = (string) $params;
				$join->store();
			}
		}
	}

	/**
	 * Is the element a join
	 *
	 * @return  bool
	 */
	public function isJoin()
	{
		return $this->getParams()->get('repeat', false);
	}

	/**
	 * Used by inline edit table plugin
	 * If returns yes then it means that there are only two possible options
for the
	 * ajax edit, so we should simply toggle to the alternative value and show
the
	 * element rendered with that new value (used for yes/no element)
	 *
	 * @deprecated - only called in a deprecated element method
	 *
	 * @return  bool
	 */
	protected function canToggleValue()
	{
		return false;
	}

	/**
	 * Encrypt an entire columns worth of data, used when updating an element
to encrypted
	 * with existing data in the column
	 *
	 * @return  null
	 */
	public function encryptColumn()
	{
		$secret    = $this->config->get('secret');
		$listModel = $this->getListModel();
		$db        = $listModel->getDb();
		$tbl       = $this->actualTableName();
		$name      = $this->getElement()->name;
		$db->setQuery("UPDATE $tbl SET " . $name . " =
AES_ENCRYPT(" . $name . ", " . $db->q($secret) .
")");
		$db->execute();
	}

	/**
	 * Decrypt an entire columns worth of data, used when updating an element
from encrypted to decrypted
	 * with existing data in the column
	 *
	 * @return  null
	 */
	public function decryptColumn()
	{
		// @TODO this query looks right but when going from encrypted blob to
decrypted field the values are set to null
		$secret    = $this->config->get('secret');
		$listModel = $this->getListModel();
		$db        = $listModel->getDb();
		$tbl       = $this->actualTableName();
		$name      = $this->getElement()->name;
		$db->setQuery("UPDATE $tbl SET " . $name . " =
AES_DECRYPT(" . $name . ", " . $db->q($secret) .
")");
		$db->execute();
	}

	/**
	 * PN 19-Jun-11: Construct an element error string.
	 *
	 * @return  string
	 */
	public function selfDiagnose()
	{
		$retStr = '';
		$this->_db->setQuery("SELECT COUNT(*) FROM #__fabrik_groups
" . "WHERE (id = " . $this->element->group_id .
");");
		$group_id = $this->_db->loadResult();

		if (!$group_id)
		{
			$retStr = 'No valid group assignment';
		}
		elseif (!$this->element->plugin)
		{
			$retStr = 'No plugin';
		}
		elseif (!$this->element->label)
		{
			$retStr = 'No element label';
		}
		else
		{
			$retStr = '';
		}

		return $retStr;
	}

	/**
	 * Shortcut to get plugin manager
	 *
	 * @since 3.0b
	 *
	 * @deprecated
	 *
	 * @return  object  plugin manager
	 */
	public function getPluginManager()
	{
		return FabrikWorker::getPluginManager();
	}

	/**
	 * When the element is a repeatable join (e.g. db join checkbox) then
figure out how many
	 * records have been selected
	 *
	 * @param   array  $data  data
	 * @param   object $oJoin join current join
	 *
	 * @since 3.0rc1
	 *
	 * @return  int  number of records selected
	 */
	public function getJoinRepeatCount($data, $oJoin)
	{
		return count(FArrayHelper::getValue($data, $oJoin->table_join .
'___id', array()));
	}

	/**
	 * When we do ajax requests from the element - as the plugin controller
uses the J dispatcher
	 * the element hasn't loaded up itself, so any time you have a
function onAjax_doSomething() call this
	 * helper function first to load up the element. Otherwise things like
parameters will not be loaded
	 *
	 * @since 3.0rc1
	 *
	 * @return  null
	 */
	protected function loadMeForAjax()
	{
		$input      = $this->app->getInput();
		$this->form =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Form',
'FabrikFEModel');
		$formId     = $input->getInt('formid');
		$this->form->setId($formId);
		$this->setId($input->getInt('element_id'));
		$this->list =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$this->list->loadFromFormId($formId);
		$table          = $this->list->getTable(true);
		$table->form_id = $formId;
		$element        = $this->getElement(true);
		$this->setEditable($this->canUse('form'));
	}

	/**
	 * get the element's cell class
	 *
	 * @since 3.0.4
	 *
	 * @return  string    css classes
	 */

	public function getCellClass()
	{
		$params    = $this->getParams();
		$classes   = array();
		$classes[] = $this->getFullName(true, false);
		$classes[] = 'fabrik_element';
		$classes[] = 'fabrik_list_' .
$this->getListModel()->getId() . '_group_' .
$this->getGroupModel()->getId();
		$c         = $params->get('tablecss_cell_class',
'');

		if ($c !== '')
		{
			$classes[] = $c;
		}

		return implode(' ', $classes);
	}

	/**
	 * get the elements list heading class
	 *
	 * @since 3.0.4
	 *
	 * @return  string    css classes
	 */
	public function getHeadingClass()
	{
		$classes   = array();
		$classes[] = 'fabrik_ordercell';
		$classes[] = $this->getFullName(true, false);
		$classes[] = $this->getElement()->id . '_order';
		$classes[] = 'fabrik_list_' .
$this->getListModel()->getId() . '_group_' .
$this->getGroupModel()->getId();
		$classes[] =
$this->getParams()->get('tablecss_header_class');

		return implode(' ', $classes);
	}

	/**
	 * convert XML format data into fabrik data (used by web services)
	 *
	 * @param   mixed $v data
	 *
	 * @return  mixed  data
	 */
	public function fromXMLFormat($v)
	{
		return $v;
	}

	/**
	 * Allows the element to pre-process a rows data before and join merging
of rows
	 * occurs. Used in calc element to do calcs on actual row rather than
merged row
	 *
	 * @param   string $data elements data for the current row
	 * @param   object $row  current row's data
	 *
	 * @since    3.0.5
	 *
	 * @return  string    formatted value
	 */
	public function preFormatFormJoins($data, $row)
	{
		return $data;
	}

	/**
	 * Return an array of parameter names which should not get updated if a
linked element's parent is saved
	 * notably any parameter which references another element id should be
returned in this array
	 * called from admin element model updateChildIds()
	 * see cascadingdropdown element for example
	 *
	 * @return  array    parameter names to not alter
	 */
	public function getFixedChildParameters()
	{
		return array();
	}

	/**
	 * Set row class
	 *
	 * @param   array &$data row data to set class for
	 *
	 * @return  null
	 */
	public function setRowClass(&$data)
	{
		// first run plugins, which may set row class
		$listModel = $this->getListModel();
		$args = new stdClass;
		$args->rowClass = '';
		$args->data = $data;
		$pluginResults =
\Fabrik\Helpers\Worker::getPluginManager()->runPlugins(
			'onElementSetRowClass',
			$listModel,
			'list',
			$this,
			$args
		);

		// now check built in "use as row class"
		$rowClass = $this->getParams()->get('use_as_row_class');
		$col    = $this->getFullName(true, false);
		$rawCol = $col . '_raw';

		foreach ($data as $groupKey => $group)
		{
			for ($i = 0; $i < count($group); $i++)
			{
				if ($rowClass == 1)
				{
					$c = false;

					if (isset($data[$groupKey][$i]->data->$rawCol))
					{
						$c = $data[$groupKey][$i]->data->$rawCol;
					}
					elseif (isset($data[$groupKey][$i]->data->$col))
					{
						$c = $data[$groupKey][$i]->data->$col;
					}

					if ($c !== false)
					{
						// added noRowClass and rowClass for use in div templates that need
to split those out
						if (!isset($data[$groupKey][$i]->noRowClass))
						{
							$data[$groupKey][$i]->noRowClass =
$data[$groupKey][$i]->class;
						}

						if (!isset($data[$groupKey][$i]->rowClasses))
						{
							$data[$groupKey][$i]->rowClasses = [];
						}

						$data[$groupKey][$i]->rowClasses[] = FabrikString::getRowClass($c,
$this->element->name);

						// plugins may have already created a rowClass
						if (isset($data[$groupKey][$i]->pluginRowClass))
						{
							$data[$groupKey][$i]->rowClass = 
$data[$groupKey][$i]->pluginRowClass . ' ' . implode('
', $data[$groupKey][$i]->rowClasse);
							$data[$groupKey][$i]->class    = 
$data[$groupKey][$i]->noRowClass . ' ' .
$data[$groupKey][$i]->rowClass;
						}
						else
						{
							$data[$groupKey][$i]->rowClass =  implode(' ',
$data[$groupKey][$i]->rowClasses);
							$data[$groupKey][$i]->class    =
$data[$groupKey][$i]->noRowClass . ' ' .
$data[$groupKey][$i]->rowClass;
						}
					}
				}
				else
				{
					// plugins may have already created a rowClass
					if (isset($data[$groupKey][$i]->pluginRowClass))
					{
						// added noRowClass and rowClass for use in div templates that need
to split those out
						if (!isset($data[$groupKey][$i]->noRowClass))
						{
							$data[$groupKey][$i]->noRowClass =
$data[$groupKey][$i]->class;
						}

						$data[$groupKey][$i]->class    =
$data[$groupKey][$i]->noRowClass . ' ' .
$data[$groupKey][$i]->pluginRowClass;
					}
				}
			}
		}
	}

	/**
	 * Set row class
	 *
	 * @param   object  $element  element object
	 *
	 * @return  null
	 */
	public function getRowClassRO($element)
	{
		$rowClass = $this->getParams()->get('use_as_row_class',
'0');

		if ($rowClass === '1')
		{
			return FabrikString::getRowClass($element->value,
$this->element->name);
		}

		return '';
	}


	/**
	 * Unset the element models access
	 *
	 * @return  null
	 */
	public function clearAccess()
	{
		unset($this->access);
	}

	/**
	 * Forces reset of defaults, etc.
	 *
	 * @return  null
	 */
	public function reset()
	{
		$this->defaults = null;
	}

	/**
	 * Clear default values, need to call this if we change an elements value
in any of the formData
	 * arrays during submission process.
	 *
	 * @return  null
	 */
	public function clearDefaults()
	{
		$this->defaults = null;
	}

	/**
	 * Should the 'label' field be quoted.  Overridden by
databasejoin and extended classes,
	 * which may use a CONCAT'ed label which mustn't be quoted.
	 *
	 * @since    3.0.6
	 *
	 * @return boolean
	 */
	protected function quoteLabel()
	{
		return true;
	}

	/**
	 * Create the where part for the query that selects the list options
	 *
	 * @param   array               $data           Current row data to use in
placeholder replacements
	 * @param   bool                $incWhere       Should the additional user
defined WHERE statement be included
	 * @param   string              $thisTableAlias Db table alias
	 * @param   array               $opts           Options
	 * @param   JDatabaseQuery|bool $query          Append where to
JDatabaseQuery object or return string (false)
	 *
	 * @return string|JDatabaseQuery
	 */
	protected function buildQueryWhere($data = array(), $incWhere = true,
$thisTableAlias = null, $opts = array(), $query = false)
	{
		return '';
	}

	/**
	 * Is the element set to always render in list contexts
	 *
	 * @param   bool $not_shown_only Not sure???
	 *
	 * @return   bool
	 */
	public function isAlwaysRender($not_shown_only = true)
	{
		$params       = $this->getParams();
		$element      = $this->getElement();
		$alwaysRender = $params->get('always_render',
'0');

		return $not_shown_only ? $element->show_in_list_summary == 0
&& $alwaysRender == '1' : $alwaysRender == '1';
	}

	/**
	 * Called at end of form record save. Used for many-many join elements to
save their data
	 *
	 * @param   array &$data Form data
	 *
	 * @since  3.1rc1
	 *
	 * @return  void
	 */
	public function onFinalStoreRow(&$data)
	{
		if (!$this->isJoin())
		{
			return;
		}

		$groupModel = $this->getGroupModel();
		$listModel  = $this->getListModel();
		$db         = $listModel->getDb();
		$query      = $db->getQuery(true);
		$formData   =& $this->getFormModel()->formDataWithTableName;

		// I set this to raw for cdd.
		$name       = $this->getFullName(true, false);
		$ajaxSubmit =
$this->app->getInput()->get('fabrik_ajax');
		$rawName    = $name . '_raw';
		$shortName  = $this->getElement()->name;

		$join = $this->getJoin();

		/*
		 * The submitted element's values
		 *
		 * NOTE - if we are coming from a list row copy, the _raw data is
actually the map table
		 * id's, not the FK's, because we used form model getData to
load it.  So we need to stuff the
		 * actual FK's (in the _id array) back into _raw
		 */

        if (array_key_exists('fabrik_copy_from_table',
$formData))
        {
            $idName = $name . '_id';
            $idValues = FArrayHelper::getValue($formData, $idName,
array());

            if (!empty($idValues))
            {
                $formData[$rawName] = $idValues;
            }
        }

		$d = FArrayHelper::getValue($formData, $rawName,
FArrayHelper::getValue($formData, $name));
		// set $emptyish to false so if no selection, we don't save a bogus
empty row
		$allJoinValues = FabrikWorker::JSONtoData($d, true, false);

		if ($groupModel->isJoin())
		{
			$groupJoinModel = $groupModel->getJoinModel();
			$k              = str_replace('`', '',
str_replace('.', '___',
$groupJoinModel->getJoin()->params->get('pk')));
			$parentIds      = (array) $formData[$k];
		}
		else
		{
			$k         = 'rowid';
			$parentIds = empty($allJoinValues) ? array() :
FArrayHelper::array_fill(0, count($allJoinValues), $formData[$k]);
		}

		$paramsKey = $this->getJoinParamsKey();
		$allParams = (array) FArrayHelper::getValue($formData, $paramsKey,
array());
		$allParams = array_values($allParams);
		$i         = 0;
		$idsToKeep = array();

		foreach ($parentIds as $parentId)
		{
			if (!array_key_exists($parentId, $idsToKeep))
			{
				$idsToKeep[$parentId] = array();
			}

			if ($groupModel->canRepeat())
			{
				$joinValues = FArrayHelper::getValue($allJoinValues, $i, array());
			}
			else
			{
				$joinValues = $allJoinValues;
			}

			$joinValues = (array) $joinValues;

			// Get existing records
			if ($parentId == '')
			{
				$ids = array();
			}
			else
			{
				$query->clear();
				$query->select('id, ' .
$shortName)->from($join->table_join)->where('parent_id =
' . $parentId);
				$db->setQuery($query);
				$ids = (array) $db->loadObjectList($shortName);
			}

			// If doing an ajax form submit and the element is an ajax file upload
then its data is different.
			if (get_class($this) === 'PlgFabrik_ElementFileupload'
&& $ajaxSubmit)
			{
				$allParams  = array_key_exists('crop', $joinValues) ?
array_values($joinValues['crop']) : array();
				$joinValues = array_key_exists('id', $joinValues) ?
array_keys($joinValues['id']) : $joinValues;
			}

			foreach ($joinValues as $jIndex => $jid)
			{
				$record             = new stdClass;
				$record->parent_id  = $parentId;
				$fkVal              = FArrayHelper::getValue($joinValues, $jIndex);
				$record->$shortName = $fkVal;
				$record->params     = FArrayHelper::getValue($allParams, $jIndex);

				// Stop notice with file-upload where fkVal is an array
				if (array_key_exists($fkVal, $ids))
				{
					$record->id             = $ids[$fkVal]->id;
					$idsToKeep[$parentId][] = $record->id;
				}
				else
				{
					$record->id = 0;
				}

				if ($record->id == 0)
				{
					$ok           = $listModel->insertObject($join->table_join,
$record);
					$lastInsertId = $listModel->getDb()->insertid();

					if (!$this->allowDuplicates)
					{
						$newId                    = new stdClass;
						$newId->id                = $lastInsertId;
						$newId->$shortName        = $record->$shortName;
						$ids[$record->$shortName] = $newId;
					}

					$idsToKeep[$parentId][] = $lastInsertId;
				}
				else
				{
					$ok = $listModel->updateObject($join->table_join, $record,
'id');
				}

				if (!$ok)
				{
					throw new RuntimeException('Didn\'t save dbjoined repeat
element');
				}
			}

			$i++;
		}

		// Delete any records that were unselected.
		$this->deleteDeselectedItems($idsToKeep, $k);
	}

	/**
	 * For joins:
	 * Get the key which contains the linking tables primary key values.
	 *
	 * @param   bool $step Use step '___' or '.' in full
name
	 *
	 * @return boolean|string
	 */
	public function getJoinIdKey($step = true)
	{
		if (!$this->isJoin())
		{
			return false;
		}

		if ($this->getGroupModel()->isJoin())
		{
			$join  = $this->getJoin();
			$idKey = $join->table_join . '___id';
		}
		else
		{
			$idKey = $this->getFullName($step, false) . '___id';
		}

		return $idKey;
	}

	/**
	 * For joins:
	 * Get the key which contains the linking tables params values.
	 *
	 * @param   bool $step Use step '___' or '.' in full
name
	 *
	 * @return boolean|string
	 */
	public function getJoinParamsKey($step = true)
	{
		if (!$this->isJoin())
		{
			return false;
		}

		if ($this->getGroupModel()->isJoin())
		{
			$join      = $this->getJoin();
			$paramsKey = $join->table_join . '___params';
		}
		else
		{
			$paramsKey = $this->getFullName($step, false) .
'___params';
		}

		return $paramsKey;
	}

	/**
	 * Delete any deselected items from the cross-reference table
	 *
	 * @param   array  $idsToKeep List of ids to keep
	 * @param   string $k         Parent record key name
	 *
	 * @return  void
	 */
	protected function deleteDeselectedItems($idsToKeep, $k)
	{
		$listModel = $this->getListModel();
		$join      = $this->getJoin();
		$db        = $listModel->getDb();
		$query     = $db->getQuery(true);

		if (empty($idsToKeep))
		{
			$formData = $this->getFormModel()->formDataWithTableName;
			$parentId = $formData[$k];
			if (!empty($parentId))
			{
				$query->delete($join->table_join)->where('parent_id =
' . $db->q($parentId));
				$db->setQuery($query);
				$db->execute();
			}
		}
		else
		{
			foreach ($idsToKeep as $parentId => $ids)
			{
				$query->clear();
				$query->delete($join->table_join)->where($db->quoteName('parent_id')
. ' = ' . $parentId);

				if (!empty($ids))
				{
					$query->where($db->quoteName('id') . ' NOT IN (
' . implode(',', $ids) . ')');
				}

				$db->setQuery($query);
				$db->execute();
			}
		}
	}

	/**
	 * Return an internal validation icon - e.g. for Password element
	 *
	 * @return  string
	 */
	public function internalValidationIcon()
	{
		return '';
	}

	/**
	 * Return internal validation hover text - e.g. for Password element
	 *
	 * @return  string
	 */
	public function internalValidationText()
	{
		return '';
	}

	/**
	 * Return JS event required to trigger a 'change', usually
'change',
	 * but some elements need a 'click' or a 'blur'.  Used
initially by CDD element.
	 * NOTE - there is also a getChangeEvent() in element.js, which should
return the same thing, Don't Ask.
	 *
	 * @return  string
	 */
	public function getChangeEvent()
	{
		return 'change';
	}

	/**
	 * Returns class name to use for advanced select (no surrounding space),
or empty string
	 *
	 * @return  bool
	 */
	public function getAdvancedSelectClass()
	{
		$fbConfig       = ComponentHelper::getParams('com_fabrik');
		$params         = $this->getParams();
		$advancedClass  = '';
		$globalAdvanced = (int) $fbConfig->get('advanced_behavior',
'0');

		if ($globalAdvanced !== 0)
		{
			$advancedClass = $params->get('advanced_behavior',
'0') == '1' || $globalAdvanced === 2 ?
'advancedSelect' : '';
		}

		return $advancedClass;
	}

	/**
	 * Get the element's LayoutInterface file
	 * Its actually an instance of LayoutFile which inverses the ordering
added include paths.
	 * In LayoutFile the addedPath takes precedence over the default paths,
which makes more sense!
	 *
	 * @param   string $type  form/details/list
	 * @param   array  $paths Optional paths to add as includes
	 *
	 * @return LayoutFile
	 */
	public function getLayout($type, $paths = array(), $options = array())
	{
		$defaultOptions = array('debug' => false,
'component' => 'com_fabrik', 'client'
=> 'site');
		$options        = array_merge($defaultOptions, $options);
		$basePath       = $this->layoutBasePath();
		$layout         = new LayoutFile('fabrik-element-' .
$this->getPluginName() . '-' . $type, $basePath, $options);

		foreach ($paths as $path)
		{
			$layout->addIncludePath($path);
		}
		$layout->addIncludePaths(JPATH_SITE . '/layouts');
		$layout->addIncludePaths(JPATH_THEMES . '/' .
$this->app->getTemplate() . '/html/layouts');
		$layout->addIncludePaths(JPATH_THEMES . '/' .
$this->app->getTemplate() . '/html/layouts/com_fabrik');
		$layout->addIncludePaths(JPATH_THEMES . '/' .
$this->app->getTemplate() .
'/html/layouts/com_fabrik/element/');

		// Custom per element layout...
		$layout->addIncludePaths(JPATH_THEMES . '/' .
$this->app->getTemplate() .
'/html/layouts/com_fabrik/element/' . $this->getFullName(true,
false));

		// Custom per template layout
		$view = $this->getFormModel()->isEditable() ? 'form' :
'details';
		$layout->addIncludePaths(COM_FABRIK_FRONTEND . '/views/'.
$view . '/tmpl/' . $this->getFormModel()->getTmpl() .
'/layouts/element/');
		$layout->addIncludePaths(COM_FABRIK_FRONTEND . '/views/'.
$view . '/tmpl/' . $this->getFormModel()->getTmpl() .
'/layouts/element/' . $this->getFullName(true, false));
		return $layout;
	}

	/**
	 * Get the LayoutInterface base path for the plugin's layout files.
	 *
	 * @return string
	 */
	protected function layoutBasePath()
	{
		return COM_FABRIK_BASE . '/plugins/fabrik_element/' .
$this->getPluginName() . '/layouts';
	}

	/**
	 * Get lower case plugin name based off class name:
	 * E.g. PlgFabrik_ElementDatabasejoin => databasejoin
	 *
	 * @return string
	 */
	protected function getPluginName()
	{
		$name = get_class($this);

		if (strstr($name, '\\'))
		{
			$name = explode('\\', $name);
			$name = array_pop($name);
		}

		return
strtolower(StringHelper::str_ireplace('PlgFabrik_Element',
'', $name));
	}

	/**
	 * Validate teh element against a Joomla form Rule
	 *
	 * @param   string $type  Rule type e.g. 'password'
	 * @param   mixed  $value Value to validate
	 * @param   mixed  $path  Optional path to load teh rule from
	 *
	 * @throws Exception
	 *
	 * @return bool
	 */
	protected function validateJRule($type, $value, $path = null)
	{
		if (!is_null($path))
		{
			FormHelper::addRulePath($path);
		}

		$rule = FormHelper::loadRuleType($type, true);
		$xml  = new SimpleXMLElement('<xml></xml>');
		$this->lang->load('com_users');

		if (!$rule->test($xml, $value))
		{
			$this->validationError = '';

			foreach ($this->app->getMessageQueue() as $i => $msg)
			{
				if ($msg['type'] === 'warning')
				{
					$this->validationError .= $msg['message'] . '<br
/>';
				}
			}
			FabrikWorker::killMessage($this->app, 'warning');

			return false;
		}

		return true;
	}

	/**
	 * Say an element is in a repeat group, this method gets that repeat
groups primary
	 * key value.
	 *
	 * @param int $repeatCounter
	 *
	 * @since 3.3.2
	 *
	 * @return mixed  False if not in a join
	 */
	protected function getJoinedGroupPkVal($repeatCounter = 0)
	{
		$groupModel = $this->getGroupModel();

		if (!$groupModel->isJoin())
		{
			return false;
		}

		$formModel    = $this->getFormModel();
		$joinModel    = $groupModel->getJoinModel();
		$elementModel = $formModel->getElement($joinModel->getForeignID());

		return $elementModel->getValue($formModel->data, $repeatCounter);
	}

	/**
	 * Is the element published.
	 *
	 * @return boolean
	 */
	public function isPublished()
	{
		return $this->getElement()->published === 1;
	}

	/**
	 * Add any jsJLayout templates to Fabrik.jLayouts js object.
	 *
	 * @return void
	 */
	public function jsJLayout()
	{
	}

	/**
	 * Give elements a chance to reset data after a failed validation.  For
instance, file upload element
	 * needs to reset the values as they aren't submitted with the form
	 *
	 * @param  $data  array form data
	 */
	public function setValidationFailedData(&$data)
	{
		return;
	}

	/**
	 * Swap values for labels
	 *
	 * @param   array  &$d  Data
	 *
	 * @return  void
	 */
	protected function swapValuesForLabels(&$d)
	{
		$groups = $this->getFormModel()->getGroupsHiarachy();

		foreach (array_keys($groups) as $gkey)
		{
			$group = $groups[$gkey];
			$elementModels = $group->getPublishedElements();

			for ($j = 0; $j < count($elementModels); $j++)
			{
				$elementModel = $elementModels[$j];
				$elKey = $elementModel->getFullName(true, false);
				$v = FArrayHelper::getValue($d, $elKey);

				if (is_array($v))
				{
					$origData = FArrayHelper::getValue($d, $elKey, array());

					if (!array_key_exists($elKey . '_raw', $d))
					{
						$d[$elKey . '_raw'] = $origData;
					}

					foreach (array_keys($v) as $x)
					{
						$origVal = FArrayHelper::getValue($origData, $x);
						$d[$elKey][$x] = $elementModel->getLabelForValue($v[$x], $origVal,
true);
					}
				}
				else
				{
					$origData = FArrayHelper::getValue($d, $elKey);

					if (!array_key_exists($elKey . '_raw', $d))
					{
						$d[$elKey . '_raw'] = $origData;
					}

					$d[$elKey] = $elementModel->getLabelForValue($v, $origData, true);
				}
			}
		}
	}

	/**
	 * When running parseMessageForPlaceholder on data we need to set the
none-raw value of things like birthday/time
	 * elements to that stored in the listModel::storeRow() method
	 *
	 * @param   array  &$data          Form data
	 * @param   int    $repeatCounter  Repeat group counter
	 *
	 * @return  void
	 */
	protected function setStoreDatabaseFormat(&$data, $repeatCounter = 0)
	{
		$formModel = $this->getFormModel();
		$groups = $formModel->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$fullKey = $elementModel->getFullName(true, false);
				$value = $data[$fullKey];

				if ($groupModel->canRepeat() && is_array($value))
				{
					foreach ($value as $k => $v)
					{
						$data[$fullKey][$k] = $elementModel->storeDatabaseFormat($v,
$data);
					}
				}
				else
				{
					$data[$fullKey] = $elementModel->storeDatabaseFormat($value,
$data);
				}
			}
		}
	}

	/* Convert the older BS2 & BS3 column classes to BS5
	 *
	 * @param   string $oldClass class to convert
	 *
	 * @return   string BS5 class
	*/
	protected function getBsClass($oldClass='') {
		$classList = [
			'input-mini' 	=> 'col-sm-2',
			'input-small' 	=> 'col-sm-4',
			'input-medium' 	=> 'col-sm-6',
			'input-large' 	=> 'col-sm-8',
			'input-xlarge' 	=> 'col-sm-10',
			'input-xxlarge' => 'col-sm-12',
			'input-block-level' => 'col-sm-12',
		];

		// Some plugins have no format setting, but they should. If not then we
use col-sm-10, 2 grids are used for the label
		$bsClass = $oldClass == '' ?
$this->getParams()->get('bootstrap_class',
'col-sm-10') : $oldClass;

		// check for old col-sm and span classes
		$bsClass = str_replace(['col-md-', 'span'],
'col-sm-', $bsClass);

		if (array_key_exists($bsClass, $classList)) {
			$bsClass = $classList[$bsClass];
		}
		if (strlen($bsClass) > 0) $bsClass = ' '.$bsClass;

		return $bsClass;
	}
}
models/elementlist.php000064400000070775151165347400011113 0ustar00<?php
/**
 * Fabrik Element List Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Factory;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Fabrik\Helpers\Php;

jimport('joomla.application.component.model');
jimport('joomla.filesystem.file');

/**
 * Fabrik Element List Model
 *
 * @package  Fabrik
 * @since    3.0
 */
class PlgFabrik_ElementList extends PlgFabrik_Element
{
	/**
	 * Does the element have sub elements
	 *
	 * @var bool
	 */
	public $hasSubElements = true;

	/**
	 * Default values
	 *
	 * @var array
	 */
	public $defaults = null;

	/**
	 * Db table field type
	 *
	 * @var  string
	 */
	protected $fieldDesc = 'TEXT';

	/**
	 * Db table field size
	 *
	 * @var  string
	 */
	protected $inputType = 'radio';

	/**
	 * Should the table render functions use html to display the data
	 *
	 * @var bool
	 */
	public $renderWithHTML = true;

	/**
	 * Determines the label used for the browser title
	 * in the form/detail views
	 *
	 * @param   array  $data           Form data
	 * @param   int    $repeatCounter  When repeating joined groups we need to
know what part of the array to access
	 * @param   array  $opts           Options
	 *
	 * @return  string	Text to add to the browser's title
	 */
	public function getTitlePart($data, $repeatCounter = 0, $opts = array())
	{
		$val = $this->getValue($data, $repeatCounter, $opts);
		$labels = $this->getSubOptionLabels();
		$values = $this->getSubOptionValues();
		$str = '';

		if (is_array($val))
		{
			foreach ($val as $tmpVal)
			{
				$key = array_search($tmpVal, $values);
				$str .= ($key === false) ? $tmpVal : $labels[$key];
				$str .= ' ';
			}
		}
		else
		{
			$str = $val;
		}

		return $str;
	}

	/**
	 * Get sub elements initial selection
	 *
	 * @return  array  Initially selected values
	 */
	public function getSubInitialSelection()
	{
		$params = $this->getParams();
		$opts = $params->get('sub_options');
		$r = isset($opts->sub_initial_selection) ? (array)
$opts->sub_initial_selection : array();

		return $r;
	}

	/**
	 * Does the element consider the data to be empty
	 * Used in isempty validation rule
	 *
	 * @param   array  $data           Data to test against
	 * @param   int    $repeatCounter  Repeat group #
	 *
	 * @return  bool
	 */
	public function dataConsideredEmpty($data, $repeatCounter)
	{
		$data = (array) $data;

		foreach ($data as $d)
		{
			if ($d != '')
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * This really does get just the default value (as defined in the
element's settings)
	 *
	 * @param   array  $data  Form data
	 *
	 * @return mixed
	 */
	public function getDefaultValue($data = array())
	{
		$params = $this->getParams();
		$opts = $params->get('sub_options');

		if (!isset($this->default))
		{
			if (isset($opts->sub_initial_selection))
			{
				$this->default = $this->getSubInitialSelection();
			}
			else
			{
				$this->default = parent::getDefaultValue($data);
			}
		}

		return $this->default;
	}

	/**
	 * Builds an array containing the filters value and condition
	 *
	 * @param   string  $value      Initial value
	 * @param   string  $condition  Initial $condition
	 * @param   string  $eval       How the value should be handled
	 *
	 * @return  array	(value condition)
	 */
	public function getFilterValue($value, $condition, $eval)
	{
		if (is_array($value))
		{
			foreach ($value as &$v)
			{
				$v = $this->prepareFilterVal($v);
			}
		}
		else
		{
			$value = $this->prepareFilterVal($value);
		}

		return parent::getFilterValue($value, $condition, $eval);
	}

	/**
	 * Build the filter query for the given element.
	 * Can be overwritten in plugin - e.g. see checkbox element which checks
for partial matches
	 *
	 * @param   string  $key            Element name in format
`tablename`.`elementname`
	 * @param   string  $condition      =/like etc.
	 * @param   string  $value          Search string - already quoted if
specified in filter array options
	 * @param   string  $originalValue  Original filter value without quotes
or %'s applied
	 * @param   string  $type           Filter type
advanced/normal/prefilter/search/querystring/searchall
	 * @param   string  $evalFilter     evaled (only used for multiselect
types)
	 *                                  
	 * @return  string	sql query part e,g, "key = value"
	 */
	public function getFilterQuery($key, $condition, $value, $originalValue,
$type = 'normal', $evalFilter = '0')
	{
		$element = $this->getElement();
		$condition = StringHelper::strtoupper($condition);
		$this->encryptFieldName($key);
		$glue = 'OR';

		if ($element->filter_type == 'checkbox' ||
$element->filter_type == 'multiselect')
		{
			$str = $this->filterQueryMultiValues($key, $condition,
$originalValue, $evalFilter, $type);
		}
		else
		{
			$originalValue = trim($value, "'");

			/*
			 * JSON stored values will back slash "/". So we need to add
"\\\\"
			* before it to escape it for the query.
			*/
			$originalValue = str_replace("/", "\\\\/",
$originalValue);

			if (strtoupper($condition) === 'IS NULL')
			{
				$value = '';
			}

			switch ($condition)
			{
				case '=':
				case '<>':

					$condition2 = $condition == '=' ? 'LIKE' :
'NOT LIKE';
					$glue = $condition == '=' ? 'OR' :
'AND';
					$db = FabrikWorker::getDbo();
					$str = "($key $condition $value " . " $glue $key
$condition2 " . $db->q('["' . $originalValue .
'"%') . " $glue $key $condition2 "
					. $db->q('%"' . $originalValue .
'"%') . " $glue $key $condition2 " .
$db->q('%"' . $originalValue . '"]') .
")";
					break;
				default:
					$str = " $key $condition $value ";
					break;
			}
		}

		return $str;
	}

	/**
	 * @param $key
	 * @param $condition
	 * @param $originalValue
	 * @param $evalFilter
	 * @param $type
	 *
	 * @return string
	 */
	protected function filterQueryMultiValues ($key, $condition,
$originalValue, $evalFilter, $type)
	{
		$str = array();

		/**
		 * Grrrr.  For some reason, $evalFilter is getting set in element filter
session when it shouldn't.
		 * This code was only meant for eval'ing of prefilters, so until i
can work out why eval is getting set,
		 * just restrict this to prefilter types
		 */
		if ($evalFilter && ($type === 'prefilter' || $type ===
'menuprefilter'))
		{
			$originalValue = stripslashes(htmlspecialchars_decode($originalValue,
ENT_QUOTES));
			FabrikWorker::clearEval();
			$originalValue = Php::Eval(['code' => $originalValue]);
			FabrikWorker::logEval($originalValue, 'Caught exception on eval of
elementList::filterQueryMultiValues() ' . $key . ': %s');
		}

		if ($condition === 'NOT IN')
		{
			$partialComparison = ' NOT LIKE ';
			$comparison = ' <> ';
			$glue = ' AND ';
		}
		else
		{
			$partialComparison = ' LIKE ';
			$comparison = ' = ';
			$glue = ' OR ';
		}

		switch ($condition)
		{
			case 'IN':
			case 'NOT IN':
				/**
				 * Split out 1,2,3 into an array to iterate over.
				 * It's a string if pre-filter, array if element filter
				 */
				if (!is_array($originalValue))
				{
					$originalValue = explode(',', $originalValue);
				}

				foreach ($originalValue as &$v)
				{
					$v = trim($v);
					$v = FabrikString::ltrimword($v, '"');
					$v = FabrikString::ltrimword($v, "'");
					$v = FabrikString::rtrimword($v, '"');
					$v = FabrikString::rtrimword($v, "'");
				}
				break;
			default:
				$originalValue = (array) $originalValue;
				break;
		}

		foreach ($originalValue as $v2)
		{
			$v2 = str_replace("/", "\\\\/", $v2);
			$str[] = '(' . $key . $partialComparison .
$this->_db->q('%"' . $v2 . '"%') .
$glue . $key .
				$comparison . $this->_db->q($v2) . ') ';
		}

		return '(' . implode($glue, $str) . ')';
	}

	/**
	 * Get the filter name
	 *
	 * @param   int   $counter  Filter order
	 * @param   bool  $normal   Do we render as a normal filter or as an
advanced search filter
	 *
	 * @return  string
	 */
	protected function filterName($counter = 0, $normal = true)
	{
		$element = $this->getElement();

		if ($element->filter_type === 'checkbox' ||
$element->filter_type == 'range')
		{
			$listModel = $this->getListModel();
			$v = 'fabrik___filter[list_' .
$listModel->getRenderContext() . '][value]';
			$v .= '[' . $counter . ']';
		}
		else
		{
			$v = parent::filterName($counter, $normal);
		}

		return $v;
	}

	/**
	 * Get the table filter for the element
	 *
	 * @param   int   $counter  Filter order
	 * @param   bool  $normal   Do we render as a normal filter or as an
advanced search filter
	 * if normal include the hidden fields as well (default true, use false
for advanced filter rendering)
	 *
	 * @return  string	Filter HTML
	 */
	public function getFilter($counter = 0, $normal = true, $container =
'')
	{
		$element = $this->getElement();
		$values = $this->getSubOptionValues();
		$default = $this->getDefaultFilterVal($normal, $counter);
		$this->filterDisplayValues = array($default);
		$elName = $this->getFullName(true, false);
		$params = $this->getParams();
		$v = $this->filterName($counter, $normal);

		if (in_array($element->filter_type, array('range',
'dropdown', '', 'checkbox',
'multiselect')))
		{
			$rows = $this->filterValueList($normal);

			if ($params->get('filter_groupby') != -1)
			{
				$rows = ArrayHelper::sortObjects($rows,
$params->get('filter_groupby', 'text'));
			}

			$this->getFilterDisplayValues($default, $rows);

			if (!in_array('', $values) &&
!in_array($element->filter_type, array('checkbox',
'multiselect')))
			{
				array_unshift($rows, HTMLHelper::_('select.option',
'', $this->filterSelectLabel()));
			}

			foreach ($rows as &$r)
			{
				// translate
				$r->text = Text::_($r->text);

				// decode first, to decode all hex entities (like &#39;)
				$r->text = html_entity_decode($r->text, ENT_QUOTES | ENT_XML1,
'UTF-8');

				// Encode if necessary
				if (!in_array($element->get('filter_type'),
array('checkbox')))
				{
					$r->text = strip_tags($r->text);
					$r->text = htmlspecialchars($r->text, ENT_NOQUOTES,
'UTF-8', false);
				}
			}

		}

		$return = array();

		switch ($element->filter_type)
		{
			case 'range':

				if (!is_array($default))
				{
					$default = array('', '');
				}

				$this->rangedFilterFields($default, $return, $rows, $v,
'list');
				break;
			case 'checkbox':
				$return[] = $this->checkboxFilter($rows, $default, $v);
				break;
			case 'dropdown':
			case 'multiselect':
			default:
				$return[] = $this->selectFilter($rows, $default, $v);
				break;

			case 'field':
				$return[] = $this->singleFilter($default, $v);
				break;

			case 'hidden':
				$return[] = $this->singleFilter($default, $v, 'hidden');
				break;

			case 'auto-complete':
				$defaultLabel = $this->getLabelForValue($default);
				$autoComplete = $this->autoCompleteFilter($default, $v,
$defaultLabel, $normal, $container);
				$return = array_merge($return, $autoComplete);
				break;
		}

		$return[] = $normal ? $this->getFilterHiddenFields($counter, $elName,
false, $normal) : $this->getAdvancedFilterHiddenFields();

		return implode("\n", $return);
	}

	/**
	 * Get an array of element html ids and their corresponding
	 * js events which trigger a validation.
	 * Examples of where this would be overwritten include timedate element
with time field enabled
	 *
	 * @param   int  $repeatCounter  Repeat group counter
	 *
	 * @return  array  HTML ids to watch for validation
	 */
	public function getValidationWatchElements($repeatCounter)
	{
		$id = $this->getHTMLId($repeatCounter);
		$ar = array('id' => $id, 'triggerEvent' =>
'click');

		return array($ar);
	}

	/**
	 * Turn form value into email formatted value
	 *
	 * @param   mixed  $value          Element value
	 * @param   array  $data           Form data
	 * @param   int    $repeatCounter  Group repeat counter
	 *
	 * @return  string  Email formatted value
	 */
	protected function getIndEmailValue($value, $data = array(),
$repeatCounter = 0)
	{
		$params = $this->getParams();
		$split_str = $params->get('options_split_str',
'');

		// Pass in data - otherwise if using multiple plugins of the same type
the plugin order gets messed
		// up. Occurs for drop-down element using php eval options.
		$values = $this->getSubOptionValues($data);
		$labels = $this->getSubOptionLabels($data);
		$aLabels = array();

		if (is_string($value))
		{
			$value = array($value);
		}

		if (is_array($value))
		{
			foreach ($value as $tmpVal)
			{
				$key = array_search($tmpVal, $values);

				if ($key !== false)
				{
					$aLabels[] = $labels[$key];
				}
			}
		}

		if ($split_str == '')
		{
			if (count($aLabels) === 1)
			{
				$val = $aLabels[0];
			}
			else
			{
				$val = '<ul><li>' .
implode('</li><li>', $aLabels) .
'</li></ul>';
			}
		}
		else
		{
			$val = implode($split_str, $aLabels);
		}

		if ($val === '')
		{
			$val = $params->get('sub_default_label');
		}

		return $val;
	}

	/**
	 * Used by radio and drop-down elements to get a drop-down list of their
unique
	 * unique values OR all options - based on filter_build_method
	 *
	 * @param   bool    $normal     Do we render as a normal filter or as an
advanced search filter
	 * @param   string  $tableName  Table name to use - defaults to
element's current table
	 * @param   string  $label      Field to use, defaults to element name
	 * @param   string  $id         Field to use, defaults to element name
	 * @param   bool    $incjoin    Include join
	 *
	 * @return  array  Text/value objects
	 */
	public function filterValueList($normal, $tableName = '', $label
= '', $id = '', $incjoin = true)
	{
		$rows = parent::filterValueList($normal, $tableName, $label, $id,
$incjoin);
		$this->unmergeFilterSplits($rows);
		$this->reapplyFilterLabels($rows);

		return $rows;
	}

	/**
	 * Cache method to populate auto-complete options
	 *
	 * @param   plgFabrik_Element  $elementModel  Element model
	 * @param   string             $search        Search string
	 * @param   array              $opts          Options, 'label'
=> field to use for label (db join)
	 *
	 * @since   3.0.7
	 *
	 * @return string  Json encoded search results
	 */
	public static function cacheAutoCompleteOptions($elementModel, $search,
$opts = array())
	{
		$app = Factory::getApplication();
		$label = FArrayHelper::getValue($opts, 'label', '');
		$rows = $elementModel->filterValueList(true, '', $label);
		$v = $app->getInput()->get('value', '',
'string');

		/**
		 * Search for every word separately in the result rather than the single
string (of multiple words)
		 *
		 * Added u switch, for UTF8
		 */
		$regex  = "/(?=.*" .
			implode(")(?=.*",
				array_filter(explode(" ", preg_quote($v, '/')))
			) . ").*/ui";
		$start = count($rows) - 1;

		for ($i = $start; $i >= 0; $i--)
		{
			$rows[$i]->text = strip_tags($rows[$i]->text);

			// Check that search strings are not in the HTML we just stripped
			if (!preg_match($regex, $rows[$i]->text))
			{
				unset($rows[$i]);
			}
		}

		$rows = array_values($rows);
		echo json_encode($rows);
	}

	/**
	 * Will the element allow for multiple selections
	 *
	 * @since	3.0.6
	 *
	 * @return  bool
	 */
	protected function isMultiple()
	{
		$params = $this->getParams();

		return $params->get('multiple', 0) || $this->isJoin();
	}

	/**
	 * Optionally pre-format list data before rendering to <ul>
	 *
	 * @param   array  &$data    Element Data
	 * @param   array  $thisRow  Row data
	 *
	 * @return  void
	 */
	protected function listPreformat(&$data, $thisRow)
	{
	}

	/**
	 * Shows the data formatted for the list view
	 *
	 * @param   string    $data      Elements data
	 * @param   stdClass  &$thisRow  All the data in the lists current row
	 * @param   array     $opts      Rendering options
	 *
	 * @return  string	formatted value
	 */
	public function renderListData($data, stdClass &$thisRow, $opts =
array())
	{
        $profiler = Profiler::getInstance('Application');
        JDEBUG ? $profiler->mark("renderListData: parent: start:
{$this->element->name}") : null;

        $params = $this->getParams();
		$listModel = $this->getListModel();
		$multiple = $this->isMultiple();
		$mergeGroupRepeat = ($this->getGroup()->canRepeat() &&
$this->getListModel()->mergeJoinedData());
		$useIcon = (int)$params->get('icon_folder', 0) > 0
&& ArrayHelper::getValue($opts, 'icon', 1);

		// Give priority to raw value icons (podion)
		$raw = $this->isJoin() ? $this->getFullName(true, false) .
'_raw' : $this->getFullName(true, false) . '_id';

		if (isset($thisRow->$raw))
		{
			$rawData = FabrikWorker::JSONtoData($thisRow->$raw, true);

			foreach ($rawData as &$val)
			{
				$val = $useIcon ? $this->replaceWithIcons($val, 'list',
$listModel->getTmpl()) : $val;
			}

			if ($this->iconsSet)
			{
				// Use raw icons
				$data = $rawData;
				$useIcon = false;
			}
		}

		// Repeat group data
		$gdata = FabrikWorker::JSONtoData($data, true);
		$this->listPreformat($gdata, $thisRow);
		$addHtml = (count($gdata) !== 1 || $multiple || $mergeGroupRepeat)
&& $this->renderWithHTML;
		$uls = array();

		foreach ($gdata as $i => $d)
		{
			$lis = array();
			$values = is_array($d) ? $d : FabrikWorker::JSONtoData($d, true);

			foreach ($values as $tmpVal)
			{
				$l = $useIcon ? $this->replaceWithIcons($tmpVal, 'list',
$listModel->getTmpl()) : $tmpVal;

				if (!$this->iconsSet == true)
				{
					if (!is_a($this, 'PlgFabrik_ElementDatabasejoin'))
					{
						$l = $this->getLabelForValue($tmpVal);
					}
					else
					{
						$l = $tmpVal;
					}

					$l = $this->replaceWithIcons($l, 'list',
$listModel->getTmpl());
				}

				if ($this->renderWithHTML)
				{
					if (ArrayHelper::getValue($opts, 'rollover', 1))
					{
						$l = $this->rollover($l, $thisRow, 'list');
					}
					if (ArrayHelper::getValue($opts, 'link', 1))
					{
						$l = $listModel->_addLink($l, $this, $thisRow, $i);
					}
				}

				if (trim($l) !== '')
				{
					$lis[] = $l;
				}
				else
				{
					// was trying to fix issue with empty merged repeat rows not having
height but messes CSV export
					//$lis[] = '&nbsp;';
					$lis[] = '';
				}
			}

			if (!empty($lis))
			{
				$uls[] = $lis;
			}
		}

		// Do all uls only contain one record, if so condense to 1 ul (avoids
nested <ul>'s each with one <li>
		$condense = true;

		foreach ($uls as $ul)
		{
			if (count($ul) > 1)
			{
				$condense = false;
			}
		}

		$layout =
FabrikHelperHTML::getLayout('fabrik-element-elementlist-details',
			array(COM_FABRIK_FRONTEND . '/layouts/element'));

		$displayData = array(
			'uls' => $uls,
			'condense' => $condense,
			'addHtml' => $addHtml,
			'sepChar' => ArrayHelper::getValue($opts,
'sepChar', ' ')
		);

        JDEBUG ? $profiler->mark("renderListData: parent: end:
{$this->element->name}") : null;

		return $layout->render((object) $displayData);
	}

	/**
	 * Prepares the element data for CSV export
	 *
	 * @param   string  $data      Element data
	 * @param   object  &$thisRow  All the data in the lists current row
	 *
	 * @return  string	Formatted value
	 */
	public function renderListData_csv($data, &$thisRow)
	{
		$this->renderWithHTML = false;
		$d = $this->renderListData(
			$data,
			$thisRow,
			array(
				'sepChar' =>
$this->getlistModel()->getParams()->get('csv_multi_join_split',
',')
			)
		);

		if ($this->isJoin())
		{
			// Set the linking table's pk as the raw value.
			$raw = $this->getFullName(true, false) . '_raw';
			$id = $this->getFullName(true, false) . '_id';
			$data = $thisRow->$id;

			$rawData = FabrikWorker::JSONtoData($data, true);
			$thisRow->$raw = json_encode($rawData);
		}

		$this->renderWithHTML = true;

		return $d;
	}

	/**
	 * Draws the html form element
	 *
	 * @param   array  $data           To pre-populate element with
	 * @param   int    $repeatCounter  Repeat group counter
	 *
	 * @return  string	Elements html
	 */
	public function render($data, $repeatCounter = 0)
	{
		$name = $this->getHTMLName($repeatCounter);
		$input = $this->app->getInput();
		$id = $this->getHTMLId($repeatCounter);
		$params = $this->getParams();
		$values = $this->getSubOptionValues();
		$labels = $this->getSubOptionLabels();

		/**
		 * $$$ hugh -- working on issue with radio and checkbox, where extra
blank subitem gets added
		 * if nothing selected.  this fix assumes that 'value' cannot
be empty string for sub-options,
		 * and I'm not sure if we enforce that.  Problem being that if we
just cast directly to
		 * an array, the array isn't "empty()", as it has a
single, empty string entry.  So then
		 * the array_diff() we're about to do sees that as a diff.
		 *
		 * $$$ rob - Need more logic that the previous test, as we weren't
applying default value/label if set and data empty
		*/
		$selected = (array) $this->getValue($data, $repeatCounter);

		if (FArrayHelper::emptyIsh($selected))
		{
			$selected = array();

			// Nothing previously selected, and not editable, set selected to
default value, which later on is replaced with default label
			if (!$this->isEditable() &&
$params->get('sub_default_value', '') !==
'')
			{
				$selected[] = $params->get('sub_default_value');
			}
		}

		// $$$ rob 06/10/2011 if front end add option on, but added option not
saved we should add in the selected value to the
		// values and labels.
		$diff = array_diff($selected, $values);

		if (!empty($diff))
		{
			$values = array_merge($values, $diff);

			// Swap over the default value to the default label
			if (!$this->isEditable())
			{
				foreach ($diff as &$di)
				{
					if ($di === $params->get('sub_default_value'))
					{
						$di = $params->get('sub_default_label');
					}
				}
			}

			$labels = array_merge($labels, $diff);
		}

		if (!$this->isEditable())
		{
			$aRoValues = array();

			for ($i = 0; $i < count($values); $i++)
			{
				if (in_array($values[$i], $selected))
				{
					$aRoValues[] = $this->getReadOnlyOutput($values[$i], $labels[$i]);
				}
			}

			$splitter = ($params->get('icon_folder') != -1 &&
$params->get('icon_folder') != '') ? ' ' :
', ';

			if (empty($aRoValues))
			{
				return'';
			}

			return ($this->isMultiple() && $this->renderWithHTML)
			? '<ul class="fabrikRepeatData"><li>' .
implode('</li><li>', $aRoValues) .
'</li></ul>' : implode($splitter, $aRoValues);
		}

		// Remove the default value
		$key = array_search($params->get('sub_default_value'),
$values);

		if ($key)
		{
			unset($values[$key]);
		}

		$optionsPerRow = (int)
$this->getParams()->get('options_per_row', 4);
		$elBeforeLabel = (bool)
$this->getParams()->get('element_before_label', true);

		// Element_before_label
		if ($input->get('format') == 'raw')
		{
			$optionsPerRow = 1;
		}

		$classes = $this->gridClasses();
		$dataAttributes = $this->dataAttributes();
		$buttonGroup = $this->buttonGroup();
		$grid = FabrikHelperHTML::grid($values, $labels, $selected, $name,
$this->inputType, $elBeforeLabel, $optionsPerRow, $classes,
$buttonGroup, $dataAttributes);
		array_unshift($grid, '<div
class="fabrikSubElementContainer" id="' . $id .
'">');
		$grid[] = '</div><!-- close subElementContainer
-->';

		if ($params->get('allow_frontend_addto', false))
		{
			$onlyLabel = $params->get('allowadd-onlylabel');
			$grid[] = $this->getAddOptionFields($repeatCounter, $onlyLabel);
		}

		return implode("\n", $grid);
	}

	/**
	 * Should the grid be rendered as a Bootstrap button-group
	 *
	 * @since 3.1
	 *
	 * @return  bool
	 */
	protected function buttonGroup()
	{
		$params = $this->getParams();

//		return FabrikWorker::j3() &&
$params->get('btnGroup', false);
		return $params->get('btnGroup', false);
	}

	/**
	 * Get classes to assign to the grid
	 * An array of arrays of class names, keyed as 'container',
'label' or 'input',
	 *
	 * @return  array
	 */
	protected function gridClasses()
	{
		return array();
	}

	/**
	 * Get data attributes to assign to the container
	 *
	 * @return  array
	 */
	protected function dataAttributes()
	{
		return array();
	}

	/**
	 * Should the sub label appear before or after the sub element?
	 *
	 * @return  bool
	 */
	protected function getElementBeforeLabel()
	{
		return (bool)
$this->getParams()->get('radio_element_before_label',
true);
	}

	/**
	 * called from within function getValue
	 * needed so we can append _raw to the name for elements such as db joins
	 *
	 * @param   array  $opts  Options
	 *
	 * @return  string  Element name inside data array
	 */
	protected function getValueFullName($opts)
	{
		return $this->getFullName(true, false);
	}

	/**
	 * Determines the value for the element in the form view
	 *
	 * @param   array  $data           Form data
	 * @param   int    $repeatCounter  When repeating joined groups we need to
know what part of the array to access
	 * @param   array  $opts           Options
	 *
	 * @return  string	value
	 */
	public function getValue($data, $repeatCounter = 0, $opts = array())
	{
		$v = parent::getValue($data, $repeatCounter, $opts);

		if (is_string($v))
		{
			$v = FabrikWorker::JSONtoData($v, true);
		}

		return $v;
	}

	/**
	 * Is the drop-downs cnn the same as the main Joomla db
	 *
	 * @return  bool
	 */
	protected function inJDb()
	{
		return $this->getlistModel()->inJDb();
	}

	/**
	 * Trigger called when a row is stored.
	 * Check if new options have been added and if so store them in the
element for future use.
	 *
	 * @param   array  &$data          Data to store
	 * @param   int    $repeatCounter  Repeat group index
	 *
	 * @return  bool
	 */
	public function onStoreRow(&$data, $repeatCounter = 0)
	{
		if (!parent::onStoreRow($data, $repeatCounter))
		{
			return false;
		}

		$element = $this->getElement();
		$params = $this->getParams();
		$formModel = $this->getFormModel();
		$formData = $formModel->formData;

		if ($params->get('savenewadditions') &&
array_key_exists($element->name . '_additions', $formData))
		{
			$added = stripslashes($formData[$element->name .
'_additions']);

			if (trim($added) == '')
			{
				return true;
			}

			$added = json_decode($added);
			$values = $this->getSubOptionValues();
			$labels = $this->getSubOptionLabels();
			$found = false;

			foreach ($added as $obj)
			{
				if (!in_array($obj->val, $values))
				{
					$values[] = $obj->val;
					$found = true;
					$labels[] = $obj->label;
				}
			}

			if ($found)
			{
				$opts = $params->get('sub_options');
				$opts->sub_values = $values;
				$opts->sub_labels = $labels;

				// $$$ rob don't json_encode this - the params object has its own
toString() magic method
				$element->params = (string) $params;
				$element->store();
			}
		}

		return true;
	}

	/**
	 * Get the class to manage the form element
	 * to ensure that the file is loaded only once
	 *
	 * @param   array   &$srcs   Scripts previously loaded
	 * @param   string  $script  Script to load once class has loaded
	 * @param   array   &$shim   Dependant class names to load before
loading the class - put in requirejs.config shim
	 *
	 * @return void
	 */
	public function formJavascriptClass(&$srcs, $script = '',
&$shim = array())
	{
		$mediaFolder = FabrikHelperHTML::getMediaFolder();
		$files = array(
			'Element' => $mediaFolder . '/element.js',
			'ElementList' => $mediaFolder . '/elementlist.js'
		);

		$srcs = array_merge($srcs, $files);

		parent::formJavascriptClass($srcs, $script, $shim);
	}

	/**
	 * used by elements with sub-options
	 *
	 * $$$ hugh - started working on adding this to elementlist, as we need to
handle
	 * JSON-ified options for multi-select elements, which the main element
model getLabelForValue()
	 * doesn't do.  But I need to sort out how this gets handled in
rendering as well.
	 *
	 * @param   string  $v             Value
	 * @param   string  $defaultLabel  Default label
	 *
	 * @return  string	label
	 */

	public function notreadyyet_getLabelForValue($v, $defaultLabel =
'')
	{
		$labels = $this->getSubOptionLabels();
		$multiple = $this->isMultiple();
		$vals = is_array($v) ? $v : FabrikWorker::JSONtoData($v, true);

		foreach ($vals as $val)
		{
			$l = FArrayHelper::getValue($labels, $val, $defaultLabel);

			if (trim($l) !== '')
			{
				if ($multiple && $this->renderWithHTML)
				{
					$lis[] = '<li>' . $l . '</li>';
				}
				else
				{
					$lis[] = $l;
				}
			}
		}

		$return = '';

		if (!empty($lis))
		{
			$return = ($multiple && $this->renderWithHTML) ? '<ul
class="fabrikRepeatData">' . implode(' ', $lis)
. '</ul>' : implode(' ', $lis);
		}

		/**
		 * $$$ rob if we allow adding to the drop-down but not recording
		 * then there will be no $key set to revert to the $val instead
		 */
		/*
		if ($v === $params->get('sub_default_value'))
		{
		$v = $params->get('sub_default_label');
		}
		return ($key === false) ? $v : FArrayHelper::getValue($labels, $key,
$defaultLabel);
		*/
		return $return;
	}

	/**
	 * Internal element validation
	 *
	 * @param   array $data          Form data
	 * @param   int   $repeatCounter Repeat group counter
	 *
	 * @return bool
	 */
	public function validate($data, $repeatCounter = 0)
	{
		return true;
	}
}
models/elementvalidator.php000064400000016346151165347400012117
0ustar00<?php
/**
 * Fabrik Element Validator Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Factory;
use Joomla\String\StringHelper;

jimport('joomla.application.component.model');

/**
 * Fabrik Element Validator Model
 * - Helper class for dealing with groups of attached validation rules.
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.1b2
 */
class FabrikFEModelElementValidator extends FabModel
{
	/**
	 * Validation objects associated with the element
	 *
	 * @var array
	 */
	protected $validations = null;

	/**
	 * Element model
	 *
	 * @var PlgFabrik_Element
	 */
	protected $elementModel = null;

	/**
	 * Icon image render options
	 *
	 * @var array
	 */
	protected $iconOpts = array('icon-class' =>
'small');

	/**
	 * Set the element model - an instance of this class is linked to one
element model
	 *
	 * @param   JModel  &$elementModel  Element model
	 *
	 * @return  void
	 */
	public function setElementModel(&$elementModel)
	{
		$this->elementModel = $elementModel;
	}

	/**
	 * Loads in element's published validation objects
	 *
	 * @return  PlgFabrik_Validationrule[]	Validation objects
	 */
	public function findAll()
	{
		if (isset($this->validations))
		{
			return $this->validations;
		}

		$params = $this->elementModel->getParams();
		$validations = (array) $params->get('validations',
'array');
		$usedPlugins = (array) FArrayHelper::getValue($validations,
'plugin', array());
		$published = FArrayHelper::getValue($validations,
'plugin_published', array());
		$showIcon = FArrayHelper::getValue($validations, 'show_icon',
array());
		$validateIn = FArrayHelper::getValue($validations,
'validate_in', array());
		$validationOn = FArrayHelper::getValue($validations,
'validation_on', array());
		$mustValidate = FArrayHelper::getValue($validations,
'must_validate', array());
		$validateHidden = FArrayHelper::getValue($validations,
'validate_hidden', array());

		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->getPlugInGroup('validationrule');
		$c = 0;
		$this->validations = array();
//		$dispatcher = JEventDispatcher::getInstance();
		$dispatcher    = Factory::getApplication()->getDispatcher();
		PluginHelper::importPlugin('fabrik_validationrule');
		$i = 0;

		foreach ($usedPlugins as $usedPlugin)
		{
			if ($usedPlugin !== '')
			{
				$isPublished = FArrayHelper::getValue($published, $i, true);

				if ($isPublished)
				{
					$class = 'PlgFabrik_Validationrule' .
StringHelper::ucfirst($usedPlugin);
					$conf = array();
					$conf['name'] = StringHelper::strtolower($usedPlugin);
					$conf['type'] =
StringHelper::strtolower('fabrik_Validationrule');

					/** @var PlgFabrik_Validationrule $plugIn */
					$plugIn = new $class($dispatcher, $conf);
					//bootPlugin($plugin, $type)  where $type = fabrik_element and $plugin
= field
//					$plugIn =
Factory::getApplication()->bootPlugin($conf['name'],
$conf['type']);
					PluginHelper::getPlugin('fabrik_validationrule',
$usedPlugin);
					$plugIn->elementModel = $this->elementModel;
					$this->validations[] = $plugIn;

					// Set params relative to plugin render order
					$plugIn->setParams($params, $i);

					$plugIn->getParams()->set('show_icon',
FArrayHelper::getValue($showIcon, $i, true));
					$plugIn->getParams()->set('validate_in',
FArrayHelper::getValue($validateIn, $i, 'both'));
					$plugIn->getParams()->set('validation_on',
FArrayHelper::getValue($validationOn, $i, 'both'));
					$plugIn->getParams()->set('must_validate',
FArrayHelper::getValue($mustValidate, $i, '0'));
					$plugIn->getParams()->set('validate_hidden',
FArrayHelper::getValue($validateHidden, $i, '1'));
					$plugIn->js();
					$c++;
				}
			}

			$i ++;
		}

		return $this->validations;
	}

	/**
	 * Should the icon be shown
	 *
	 * @return boolean
	 */
	private function showIcon()
	{
		$validations = $this->findAll();

		foreach ($validations as $v)
		{
			if ($v->getParams()->get('show_icon'))
			{
				return true;
			}
		}

		$internal = $this->elementModel->internalValidationIcon();

		if ($internal !== '')
		{
			return true;
		}

		return false;
	}

	/**
	 * Get the icon
	 * - If showIcon() false - show question-sign for hover tip txt indicator
	 * - If one validation - use the icon specified in the J fabrik_validation
settings (default to star)
	 * - If more than one return default j2.5/j3 img
	 *
	 * @param   int  $c  Validation plugin render order
	 *
	 * @return string
	 */
	public function getIcon($c = null)
	{
//		$j3 = FabrikWorker::j3();
//		$j3 = true;
		$validations = $this->findAll();

		if (!$this->showIcon())
		{
			return '';
		}

		if (!empty($validations))
		{
//			if ($j3)
//			{
				if (is_null($c))
				{
					return $validations[0]->iconImage();
				}
				else
				{
					return $validations[$c]->iconImage();
				}
//			}
		}

		$internal = $this->elementModel->internalValidationIcon();

		if ($internal !== '')
		{
			return $internal;
		}

//		return $j3 ? 'star.png' : 'notempty.png';
		return 'star.png';
	}

	/**
	 * Get the array data use to set up the javascript watch element
	 *
	 * @param   int  $repeatCounter  Repeat group counter
	 *
	 * @return array
	 */
	public function jsWatchElements($repeatCounter = 0)
	{
		$validationEls = array();
		$validations = $this->findAll();

		if (!empty($validations) &&
$this->elementModel->isEditable())
		{
			$watchElements =
$this->elementModel->getValidationWatchElements($repeatCounter);

			foreach ($watchElements as $watchElement)
			{
				$o = new stdClass;
				$o->id = $watchElement['id'];
				$o->triggerEvent = $watchElement['triggerEvent'];
				$validationEls[] = $o;
			}
		}

		return $validationEls;
	}

	/**
	 * Get the main validation icon to show next to the element's label
	 *
	 * @return string
	 */
	public function labelIcons()
	{
		$tmpl = $this->elementModel->getFormModel()->getTmpl();
		$validations = array_unique($this->findAll(),SORT_REGULAR);
		$emptyIcon = $this->getIcon();
		$icon = empty($emptyIcon) && empty($validations) ? "" :
FabrikHelperHTML::image($emptyIcon, 'form', $tmpl,
$this->iconOpts) . ' ';

		return $icon;
	}

	/**
	 * Does the element have validations - checks assigned and internal
validations
	 *
	 * @return boolean
	 */
	public function hasValidations()
	{
		$validations = $this->findAll();

		if (!empty($validations) ||
$this->elementModel->internalValidationText() !== '')
		{
			return true;
		}

		return false;
	}

	/**
	 * Create hover tip text for validations
	 *
	 * @return  array  Messages
	 */
	public function hoverTexts()
	{
		$texts = array();

		if ($this->elementModel->isEditable())
		{
			$tmpl = $this->elementModel->getFormModel()->getTmpl();
			$validations = array_unique($this->findAll(),SORT_REGULAR);

			foreach ($validations as $c => $validation)
			{
				$texts[] = $validation->getHoverText($c, $tmpl);
			}

			$internal = $this->elementModel->internalValidationText();

			if ($internal !== '')
			{
				$i = $this->elementModel->internalValidationIcon();
				$icon = FabrikHelperHTML::image($i, 'form', $tmpl,
$this->iconOpts);
				$texts[] = $icon . ' ' . $internal;
			}
		}

		return $texts;
	}
}
models/fabrik.php000064400000006360151165347400010011 0ustar00<?php
/**
 * Fabrik Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Language\Language;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Date\Date;
use Joomla\CMS\User\User;
use Joomla\CMS\Factory;
use Joomla\Utilities\ArrayHelper;

jimport('joomla.application.component.model');

/**
 * Fabrik Element List Model - Joomla 1.7 onwards
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabModel extends BaseDatabaseModel
{
	/**
	 * @var CMSApplication
	 */
	protected $app;

	/**
	 * @var User
	 */
	protected $user;

	/**
	 * @var Date
	 */
	protected $date;

	/**
	 * App name
	 *
	 * @var string
	 */
	protected $package = 'fabrik';

	/**
	 * @var Registry
	 */
	protected $config;

	/**
	 * @var Language
	 */
	protected $lang;

	/**
	 * Constructor
	 *
	 * @param   array  $config  An array of configuration options (name,
state, dbo, table_path, ignore_request).
	 *
	 * @since   3.3.4
	 * @throws  Exception
	 */
	public function __construct($config = array())
	{
		$this->app = ArrayHelper::getValue($config, 'app',
Factory::getApplication());
		$this->user = ArrayHelper::getValue($config, 'user',
Factory::getUser());
		$this->config = ArrayHelper::getValue($config, 'config',
Factory::getApplication()->getConfig());
		$this->session = ArrayHelper::getValue($config, 'session',
Factory::getSession());
		$this->date = ArrayHelper::getValue($config, 'date',
Factory::getDate());
		$this->lang = ArrayHelper::getValue($config, 'lang',
Factory::getApplication()->getLanguage());
		$this->package =
$this->app->getUserState('com_fabrik.package',
'fabrik');

		parent::__construct($config);
	}

	/**
	 * Method to load and return a model object.
	 *
	 * @param   string  $name    The name of the view
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  configuration
	 *
	 * @return	FabTable|false	Model object or boolean false if failed
	 */
	protected function _createTable($name, $prefix = 'Table',
$config = array())
	{
		// Clean the model name
		$name = preg_replace('/[^A-Z0-9_]/i', '', $name);
		$prefix = preg_replace('/[^A-Z0-9_]/i', '', $prefix);

		// Make sure we are returning a DBO object
		if (!array_key_exists('dbo', $config))
		{
			$config['dbo'] = $this->getDbo();
		}

		return FabTable::getInstance($name, $prefix, $config);
	}

	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return	Table	The table
	 */
	public function getTable($name = '', $prefix =
'Table', $options = array())
	{
		if (empty($name))
		{
			$name = $this->getName();
		}

		if ($table = $this->_createTable($name, $prefix, $options))
		{
			return $table;
		}

		throw new
RuntimeException(Text::sprintf('JLIB_APPLICATION_ERROR_TABLE_NAME_NOT_SUPPORTED',
$name));

		return null;
	}
}
models/fabrikmodelform.php000064400000000712151165347400011711
0ustar00<?php
/**
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

require_once 'fabrik.php';

/**
 * Abstract Fabrik Form Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */

abstract class FabModelForm extends FabModel
{
}
models/form.php000064400000435347151165347410007532 0ustar00<?php
/**
 * Fabrik Form Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Filter\OutputFilter;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Session\Session;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Fabrik\Helpers\Uploader;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;
use Joomla\CMS\Factory;

jimport('joomla.application.component.model');
require_once 'fabrikmodelform.php';

/**
 * Fabrik Form Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
#[\AllowDynamicProperties]
class FabrikFEModelForm extends FabModelForm
{
	/**
	 * id
	 * @var int
	 */
	public $id = null;

	/**
	 * Set to -1 if form in ajax module, set to 1+ if in package
	 *
	 * @var int
	 */
	public $packageId = 0;

	/**
	 * Form's group elements
	 *
	 * @var array
	 */
	protected $elements = null;

	/**
	 * List model associated with form
	 *
	 * @var FabrikFEModelList
	 */
	protected $listModel = null;

	/**
	 * Group ids that are actually tablejoins [groupid->joinid]
	 *
	 * @var array
	 */
	public $aJoinGroupIds = array();

	/**
	 * If editable if 0 then show view only version of form
	 *
	 * @var bol true
	 */
	public $editable = true;

	/**
	 * Validation rule classes
	 *
	 * @var array
	 */
	protected $validationRuleClasses = null;

	/**
	 * The form running as a mambot or module(true)
	 *
	 * @var bool
	 */
	public $isMambot = false;

	/**
	 * Join objects for the form
	 *
	 * @var array
	 */
	protected $aJoinObjs = array();

	/**
	 * Concat string to create full element names
	 *
	 * @var string
	 */
	public $joinTableElementStep = '___';

	/**
	 * Parameters
	 *
	 * @var Registry
	 */
	protected $params = null;

	/**
	 * Row id to submit
	 *
	 * @var int
	 */
	public $rowId = null;

	/**
	 * Submitted as ajax
	 *
	 * @since 3.0
	 * @var bool
	 */
	public $ajax = null;

	/**
	 * Form table
	 *
	 * @var Table
	 */
	public $form = null;

	/**
	 * Last current element found in hasElement()
	 *
	 * @var object
	 */
	protected $currentElement = null;

	/**
	 * @var InputFilter
	 */
	protected $filter;

	/**
	 * If true encase table and element names with "`" when getting
element list
	 *
	 * @var bool
	 */
	protected $addDbQuote = false;

	/**
	 * Form Data
	 *
	 * @var array
	 */
	public $formData = null;

	/**
	 * Form errors
	 *
	 * @var array
	 */
	public $errors = array();

	/**
	 * Uploader helper
	 *
	 * @var Uploader
	 */
	protected $uploader = null;

	/**
	 * Pages (array containing group ids for each page in the form)
	 *
	 * @var array
	 */
	protected $pages = null;

	/**
	 * Session model deals with storing incomplete pages
	 *
	 * @var FabrikFEModelFormsession
	 */
	public $sessionModel = null;

	/**
	 * Modified data by any validation rule that uses replace functionality
	 *
	 * @var array
	 */
	public $modifiedValidationData = null;

	/**
	 * Group Models
	 *
	 * @var array
	 */
	public $groups = null;

	/**
	 * Store the form's previous data when processing
	 *
	 * @var array
	 */
	public $origData = null;

	/**
	 * Stores elements not shown in the list view
	 * @var array
	 */
	protected $elementsNotInList = null;

	/**
	 * Form data
	 *
	 * @var array
	 */
	public $data = null;

	/**
	 * Form data - ready for use in template. Contains HTML output for
listname___elementname
	 * and raw value for listname___elementname_raw
	 *
	 * @var array
	 */
	public $tmplData = array();

	/**
	 * Form data - keys use the full element name (listname___elementname)
	 * @var array
	 */
	public $formDataWithTableName = null;

	/**
	 * Should the form store the main row? Set to false in juser
	 * plugin if fabrik table is also #__users
	 *
	 * @var bool
	 */
	public $storeMainRow = true;

	/**
	 * Query used to load form record.
	 *
	 * @var string
	 */
	public $query = null;

	/**
	 * Specifies element name that have been overridden from a form plugin,
	 * so encrypted RO data should be ignored
	 *
	 * @var array
	 */
	protected $pluginUpdatedElements = array();

	/**
	 * Linked fabrik lists
	 *
	 * @var array
	 */
	protected $linkedFabrikLists = null;

	/**
	 * Are we copying a row?  i.e. using form's Copy button.  Plugin
manager needs to know.
	 *
	 * @var bool
	 */
	public $copyingRow = false;

	/**
	 * Container string for form plugin JS ini code
	 *
	 * @since 3.1b
	 *
	 * @var array
	 */
	public $formPluginJS = array();

	/**
	 * Form plugin files to load
	 *
	 * @since 3.1b
	 *
	 * @var array
	 */
	public $formPluginShim = array();

	/**
	 * JS options on load, only used when calling onJSOpts plugin
	 * so plugin code can access and modify them
	 *
	 * @since 3.2
	 *
	 * @var array
	 */
	public $jsOpts = null;

	/**
	 * @var array
	 */
	public $_origData;

	/**
	 * Original Row id before form is saved.
	 *
	 * @var string
	 */
	public $origRowId;

	/**
	 * Is the form being posted via ajax.
	 *
	 * @var bool
	 */
	protected $ajaxPost = false;

	/**
	 * Posted form data with full names?
	 *
	 * @var array
	 */
	public $fullFormData = array();

	/**
	 * Use this lastInsertId to store the main table's lastInsertId, so
we can use this rather
	 * than the list model lastInsertId, which could be for the last joined
table rather than
	 * the form's main table.
	 *
	 * @since 3.3
	 *
	 * @var mixed
	 */
	public $lastInsertId = null;

	/**
	 * Form plugins can set this to trigger a validation fail which isn't
specific to an element
	 *
	 * @since 3.4
	 *
	 * @var mixed
	 */
	public $formErrorMsg = null;

	/**
	 * Form sessionData
	 *
	 * @var array
	 */
	public $sessionData = null;

	/**
	 * cache tmpl name
	 *
	 * @since 3.7
	 *
	 * @var string
	 */
	public $tmpl = null;

	/**
	 * did we find any data in getData()
	 *
	 * @since 3.8
	 *
	 * @var bool
	 */
	public $noData = false;

	/**
	 * Constructor
	 *
	 * @param   array  $config  An array of configuration options (name,
state, dbo, table_path, ignore_request).
	 *
	 * @since       1.5
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);
		$usersConfig = ComponentHelper::getParams('com_fabrik');
		$id = $this->app->getInput()->getInt('formid',
$usersConfig->get('formid'));
		$this->setId($id);
	}

	/**
	 * Method to set the form id
	 *
	 * @param   int  $id  list ID number
	 *
	 * @since 3.0
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		// Set new form ID
		$this->id = $id;
		$this->setState('form.id', $id);

		// $$$ rob not sure why but we need this getState() here when assigning
id from admin view
		$this->getState();
	}

	/**
	 * Set row id
	 *
	 * @param   string  $id  primary key value
	 *
	 * @since   3.0.7
	 *
	 * @return  void
	 */
	public function setRowId($id)
	{
		$this->rowId = $id;
	}

	/**
	 * Method to get the form id
	 *
	 * @return  int
	 */
	public function getId()
	{
		return $this->getState('form.id');
	}

	/**
	 * Get form table (alias to getTable())
	 *
	 * @return  FabTable  form table
	 */
	public function getForm()
	{
		return $this->getTable();
	}

	/**
	 * Checks if the params object has been created and if not creates and
returns it
	 *
	 * @return  object  params
	 */
	public function getParams()
	{
		if (!isset($this->params))
		{
			$form = $this->getForm();
			$this->params = new Registry($form->params);
		}

		return $this->params;
	}

	/**
	 * Should the form load up rowid=-1 usekey=foo
	 *
	 * @param   string  $priority  Request priority menu or request
	 *
	 * @return boolean
	 */
	protected function isUserRowId($priority = 'menu')
	{
		$rowId = FabrikWorker::getMenuOrRequestVar('rowid',
'', $this->isMambot, $priority);

		return $rowId === '-1' || $rowId === ':1';
	}

	/**
	 * Makes sure that the form is not viewable based on the list's
access settings
	 *
	 * Also sets the form's editable state, if it can record in to a db
table
	 *
	 * @return  int  0 = no access, 1 = view only , 2 = full form view, 3 =
add record only
	 */
	public function checkAccessFromListSettings()
	{
		$form = $this->getForm();

		if ($form->record_in_database == 0)
		{
			return 2;
		}

		$listModel = $this->getListModel();

		if (!is_object($listModel))
		{
			return 2;
		}

		$data = $this->getData();
		$ret = 0;

		if ($listModel->canViewDetails(FArrayHelper::toObject($data)))
		{
			$ret = 1;
		}
		else
		{
			if ($this->app->getInput()->get('view',
'form') == 'details')
			{
				return 0;
			}
		}

		//$isUserRowId = $this->isUserRowId();

		/* New form can we add?
		 *
		 * NOTE - testing to see if $data exists rather than looking at rowid to
decide if editing, as when using
		 * rowid=-1, things get funky, as rowid is never empty, even for new
form, as it's set to user id
		 */
		if (empty($data) || !array_key_exists('__pk_val', $data) ||
empty($data['__pk_val']))
		{
			if ($listModel->canAdd())
			{
				$ret = 3;
			}
			else if ($listModel->canEdit($data))
			{
				$ret = 2;
			}
		}
		else
		{
			// Editing from - can we edit
			if ($listModel->canEdit($data))
			{
				$ret = 2;
			}
		}
		// If no access (0) or read only access (1) set the form to not be
editable
		$editable = ($ret <= 1) ? false : true;
		$this->setEditable($editable);

		if ($this->app->getInput()->get('view',
'form') == 'details')
		{
			$this->setEditable(false);
		}

		return $ret;
	}

	/**
	 * Get the template name
	 *
	 * @since 3.0
	 *
	 * @return string tmpl name
	 */
	public function getTmpl()
	{
		if (!isset($this->tmpl))
		{
			$input       = $this->app->getInput();
			$params      = $this->getParams();
			$item        = $this->getForm();
			$tmpl        = '';
//			$default     = FabrikWorker::j3() ? 'bootstrap' :
'default';
			$default     = 'bootstrap';
//			$jTmplFolder = FabrikWorker::j3() ? 'tmpl' :
'tmpl25';
			$jTmplFolder = 'tmpl';
			$document    = Factory::getDocument();

			if ($document->getType() === 'pdf')
			{
				$tmpl = $params->get('pdf_template', '') !==
'' ? $params->get('pdf_template') : $default;
			}
			else
			{
				if ($this->app->isClient('administrator'))
				{
					$tmpl = $this->isEditable() ?
$params->get('admin_form_template') :
$params->get('admin_details_template');
					$tmpl = $tmpl == '' ? $default : $tmpl;
				}

				if ($tmpl == '')
				{
					if ($this->isEditable())
					{
						$tmpl = $item->form_template == '' ? $default :
$item->form_template;
					}
					else
					{
						$tmpl = $item->view_only_template == '' ? $default :
$item->view_only_template;
					}
				}

				$tmpl = FabrikWorker::getMenuOrRequestVar('fabriklayout',
$tmpl, $this->isMambot);
			}

			// Finally see if the options are overridden by a querystring var
			$baseTmpl = $tmpl;
			$tmpl     = $input->get('layout', $tmpl);

			// Test it exists - otherwise revert to baseTmpl tmpl
			$folder = $this->isEditable() ? 'form' :
'details';

			if (!Folder::exists(JPATH_SITE .
'/components/com_fabrik/views/' . $folder . '/' .
$jTmplFolder . '/' . $tmpl))
			{
				$tmpl = $baseTmpl;
			}

			$this->isEditable() ? $item->form_template = $tmpl :
$item->view_only_template = $tmpl;
			$this->tmpl = $tmpl;
		}

		return $this->tmpl;
	}

	/**
	 * loads form's css files
	 * Checks : custom css file, template css file. Including them if found
	 *
	 * @return  void
	 */
	public function getFormCss()
	{
		$input = $this->app->getInput();
//		$jTmplFolder = FabrikWorker::j3() ? 'tmpl' :
'tmpl25';
		$jTmplFolder = 'tmpl';
		$tmpl = $this->getTmpl();
		$v = $this->isEditable() ? 'form' : 'details';

		// Check for a form template file (code moved from view)
		if ($tmpl != '')
		{
			$qs = '?c=' . $this->getId();
			$qs .= '&amp;rowid=' . $this->getRowId();

			/* $$$ need &amp; for pdf output which is parsed through xml parser
otherwise fails
			 * If FabrikHelperHTML::styleSheetajax loaded then don't do
&amp;
			 * J!4/F4: Never do &amp; this will now break the parameters for
css-files and it's not longer needed for pdfs
			 */
			$view = $this->isEditable() ? 'form' : 'details';

			//if (FabrikHelperHTML::cssAsAsset())
			//{
				$qs .= '&view=' . $v;
				$qs .= '&rowid=' . $this->getRowId();
			/*}
			else
			{
				$qs .= '&amp;view=' . $v;
				$qs .= '&amp;rowid=' . $this->getRowId();
			}
			*/
			
			$tmplPath = 'templates/' . $this->app->getTemplate() .
'/html/com_fabrik/' . $view . '/' . $tmpl .
'/template_css.php' . $qs;

			if (!FabrikHelperHTML::stylesheetFromPath($tmplPath))
			{
				FabrikHelperHTML::stylesheetFromPath('components/com_fabrik/views/'
. $view . '/' . $jTmplFolder . '/' . $tmpl .
'/template_css.php' . $qs);
			}

			/* $$$ hugh - as per Skype convos with Rob, decided to re-instate the
custom.css convention.  So I'm adding two files:
			 * custom.css - for backward compat with existing 2.x custom.css
			 * custom_css.php - what we'll recommend people use for custom css
moving forward.
			 */

			if (!FabrikHelperHTML::stylesheetFromPath('templates/' .
$this->app->getTemplate() . '/html/com_fabrik/' . $view .
'/' . $tmpl . '/custom.css' . $qs))
			{
				FabrikHelperHTML::stylesheetFromPath('components/com_fabrik/views/'
. $view . '/' . $jTmplFolder . '/' . $tmpl .
'/custom.css' . $qs);
			}

			$path = 'templates/' . $this->app->getTemplate() .
'/html/com_fabrik/' . $view . '/' . $tmpl .
'/custom_css.php' . $qs;

			if (!FabrikHelperHTML::stylesheetFromPath($path))
			{
				$displayData              = new stdClass;
				$displayData->view        = $view;
				$displayData->tmpl        = $tmpl;
				$displayData->qs          = $qs;
				$displayData->jTmplFolder = $jTmplFolder;
				$displayData->formModel   = $this;
				$layout = $this->getLayout('form.fabrik-custom-css-qs');
				$path = $layout->render($displayData);

				FabrikHelperHTML::stylesheetFromPath($path);
			}
		}

		if ($this->app->isClient('administrator') &&
$input->get('tmpl') === 'components')
		{
			FabrikHelperHTML::stylesheet('administrator/templates/system/css/system.css');
		}
	}

	/**
	 * Load the JS files into the document
	 *
	 * @param   array  &$scripts  Js script sources to load in the head
	 *
	 * @return null
	 */
	public function getCustomJsAction(&$scripts)
	{
		// $$$ hugh - added ability to use form_XX, as am adding custom list_XX
		$view = $this->isEditable() ? 'form' : 'details';

		/**
		 * $$$ hugh - need to use an assoc key name for the scripts array, as it
gets used in the requirejs
		 * to pass in as a function arg, which then blows up with
"unexpected number" if we don't use a key name
		 */
		$scriptsKey = $view . '_' . $this->getId();

		if (File::exists(COM_FABRIK_FRONTEND . '/js/' .
$this->getId() . '.js'))
		{
			$scripts[$scriptsKey] = 'components/com_fabrik/js/' .
$this->getId() . '.js';
		}
		elseif (File::exists(COM_FABRIK_FRONTEND . '/js/' . $view .
'_' . $this->getId() . '.js'))
		{
			$scripts[$scriptsKey] = 'components/com_fabrik/js/' . $view .
'_' . $this->getId() . '.js';
		}
	}

	/**
	 * Set the browser title
	 *
	 * @param   string  $title  Default browser title set by menu items'
'page_title' property
	 *
	 * @return	string	Browser title
	 */
	public function getPageTitle($title = '')
	{
		$title = $title == '' ? $this->getLabel() : $title;
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($element->use_in_page_title == '1')
				{
					$title .= ' ' .
$elementModel->getTitlePart($this->data);
				}
			}
		}

		return $title;
	}

	/**
	 * Compares the forms table with its groups to see if any of the groups
are in fact table joins
	 *
	 * @param   array  $joins  tables joins
	 *
	 * @return	array	array(group_id =>join_id)
	 */
	public function getJoinGroupIds($joins = null)
	{
		$listModel = $this->getlistModel();

		if (is_null($joins))
		{
			$joins = $listModel->getJoins();
		}

		$arJoinGroupIds = array();
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			foreach ($joins as $join)
			{
				if ($join->element_id == 0 &&
$groupModel->getGroup()->id == $join->group_id)
				{
					$arJoinGroupIds[$groupModel->getId()] = $join->id;
				}
			}
		}

		$this->aJoinGroupIds = $arJoinGroupIds;

		return $arJoinGroupIds;
	}

	/**
	 * Gets the javascript actions the forms elements
	 *
	 * @return  array  javascript actions
	 */
	public function getJsActions()
	{
		if (isset($this->jsActions))
		{
			return $this->jsActions;
		}

		$this->jsActions = array();
		$db = FabrikWorker::getDbo(true);
		$aJsActions = array();
		$aElIds = array();
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				/* $$$ hugh - only needed getParent when we weren't saving changes
to parent params to child
				 * which we should now be doing ... and getParent() causes an extra
table lookup for every child
				 * element on the form.
				 */
				$aJsActions[$elementModel->getElement()->id] = array();
				$aElIds[] = (int) $elementModel->getElement()->id;
			}
		}

		if (!empty($aElIds))
		{
			$query = $db->getQuery(true);
			$query->select('*')->from('#__fabrik_jsactions')->where('element_id
IN (' . implode(',', $aElIds) . ')');
			$db->setQuery($query);
			$res = $db->loadObjectList();
		}
		else
		{
			$res = array();
		}

		if (is_array($res))
		{
			foreach ($res as $r)
			{
				// Merge the js attributes back into the array
				$a = json_decode($r->params);

				foreach ($a as $k => $v)
				{
					$r->$k = $v;
				}

				unset($r->params);

				if (!isset($r->js_published) || (int) $r->js_published === 1)
				{
					$this->jsActions[$r->element_id][] = $r;
				}
			}
		}

		return $this->jsActions;
	}

	/**
	 * Test to try to load all group data in one query and then bind that data
to group table objects
	 * in getGroups()
	 *
	 * @return  array
	 */
	public function getPublishedGroups()
	{
		$db = FabrikWorker::getDbo(true);

		if (!isset($this->_publishedformGroups) ||
empty($this->_publishedformGroups))
		{
			$params = $this->getParams();
			$query = $db->getQuery(true);
			$query->select(' *, fg.group_id AS group_id, RAND() AS
rand_order')
			->from('#__fabrik_formgroup AS fg')
			->join('INNER', '#__fabrik_groups as g ON g.id =
fg.group_id')
			->where('fg.form_id = ' . (int) $this->getId() . '
AND published = 1');

			if ($params->get('randomise_groups') == 1)
			{
				$query->order('rand_order');
			}
			else
			{
				$query->order('fg.ordering');
			}

			$db->setQuery($query);
			$sql = (string)$query;
			$groups = $db->loadObjectList('group_id');
			$this->_publishedformGroups =
$this->mergeGroupsWithJoins($groups);
		}

		return $this->_publishedformGroups;
	}

	/**
	 * Get the ids of all the groups in the form
	 *
	 * @return  array  group ids
	 */
	public function getGroupIds()
	{
		$groups = $this->getPublishedGroups();

		return array_keys($groups);
	}

	/**
	 * Merge in Join Ids into an array of groups
	 *
	 * @param   array  $groups  form groups
	 *
	 * @return  array
	 */
	private function mergeGroupsWithJoins($groups)
	{
		$db = FabrikWorker::getDbo(true);
		$form = $this->getForm();

		if ($form->record_in_database)
		{
			$listModel = $this->getListModel();
			$listId = (int) $listModel->getId();

			if (is_object($listModel) && $listId !== 0)
			{
				$query = $db->getQuery(true);
				$query->select('g.id, j.id AS
joinid')->from('#__fabrik_joins AS j')
					->join('INNER', '#__fabrik_groups AS g ON g.id =
j.group_id')->where('list_id = ' . $listId . ' AND
g.published = 1');

				// Added as otherwise you could potentially load a element joinid as a
group join id. 3.1
				$query->where('j.element_id = 0');
				$db->setQuery($query);
				$joinGroups = $db->loadObjectList('id');

				foreach ($joinGroups as $k => $o)
				{
					if (array_key_exists($k, $groups))
					{
						$groups[$k]->join_id = $o->joinid;
					}
				}
			}
		}

		return $groups;
	}

	/**
	 * Get the forms published group objects
	 *
	 * @return  FabrikFEModelGroup[]  Group model objects with table row
loaded
	 */
	public function getGroups()
	{
		if (!isset($this->groups))
		{
			$this->groups = array();
			$listModel = $this->getListModel();
			$groupModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Group',
'FabrikFEModel');
			$groupData = $this->getPublishedGroups();

			foreach ($groupData as $id => $groupD)
			{
				$thisGroup = clone ($groupModel);
				$thisGroup->setId($id);
				$thisGroup->setContext($this, $listModel);

				// $$ rob 25/02/2011 this was doing a query per group - pointless as we
bind $groupD to $row afterwards
				// $row = $thisGroup->getGroup();
				$row = FabTable::getInstance('Group',
'FabrikTable');
				$row->bind($groupD);
				$thisGroup->setGroup($row);

				if ($row->published == 1)
				{
					$this->groups[$id] = $thisGroup;
				}
			}
		}

		return $this->groups;
	}

	/**
	 * Gets each element in the form along with its group info
	 *
	 * @param   bool  $excludeUnpublished  included unpublished elements in
the result
	 *
	 * @return  array  element objects
	 */
	public function getFormGroups($excludeUnpublished = true)
	{
		$params = $this->getParams();
		$db = FabrikWorker::getDbo(true);
		$query = $db->getQuery(true);
		$query
			->select(
				'*, #__fabrik_groups.params AS gparams, #__fabrik_elements.id as
element_id
		, #__fabrik_groups.name as group_name, RAND() AS
rand_order')->from('#__fabrik_formgroup')
			->join('LEFT', '#__fabrik_groups	ON
#__fabrik_formgroup.group_id = #__fabrik_groups.id')
			->join('LEFT', '#__fabrik_elements ON
#__fabrik_groups.id = #__fabrik_elements.group_id')
			->where('#__fabrik_formgroup.form_id = ' . (int)
$this->getState('form.id'));

		if ($excludeUnpublished)
		{
			$query->where('#__fabrik_elements.published = 1');
		}

		if ($params->get('randomise_groups') == 1)
		{
			$query->order('rand_order, #__fabrik_elements.ordering');
		}
		else
		{
			$query->order('#__fabrik_formgroup.ordering,
#__fabrik_formgroup.group_id, #__fabrik_elements.ordering');
		}

		$db->setQuery($query);
		$groups = $db->loadObjectList();
		$this->elements = $groups;

		return $groups;
	}

	/**
	 * Similar to getFormGroups() except that this returns a data structure of
	 * form
	 * --->group
	 * -------->element
	 * -------->element
	 * --->group
	 * if run before then existing data returned
	 *
	 * @return  FabrikFEModelGroup[]  Group & element objects
	 */
	public function getGroupsHiarachy()
	{
		if (!isset($this->groups))
		{
			$this->getGroups();
			$this->groups =
FabrikWorker::getPluginManager()->getFormPlugins($this);
		}

		return $this->groups;
	}

	/**
	 * Get an list of elements that aren't shown in the table view
	 *
	 * @return  array  of element table objects
	 */
	public function getElementsNotInTable()
	{
		if (!isset($this->elementsNotInList))
		{
			$this->elementsNotInList = array();
			$groups = $this->getGroupsHiarachy();

			foreach ($groups as $group)
			{
				$elements = $group->getPublishedElements();

				foreach ($elements as $elementModel)
				{
					if ($elementModel->canView() || $elementModel->canUse())
					{
						$element = $elementModel->getElement();

						if (!isset($element->show_in_list_summary) ||
!$element->show_in_list_summary)
						{
							$this->elementsNotInList[] = $element;
						}
					}
				}
			}
		}

		return $this->elementsNotInList;
	}

	/**
	 * This checks to see if the form has a file upload element
	 * and returns the correct encoding type for the form
	 *
	 * @return  string  form encoding type
	 */
	public function getFormEncType()
	{
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				if ($elementModel->isUpload())
				{
					return "multipart/form-data";
				}
			}
		}

		return "application/x-www-form-urlencoded";
	}

	/**
	 * Get the plugin manager
	 *
	 * @deprecated use return FabrikWorker::getPluginManager(); instead since
3.0b
	 *
	 * @return  object  plugin manager
	 */

	public function getPluginManager()
	{
		return FabrikWorker::getPluginManager();
	}

	/**
	 * When the form is submitted we want to get the original record it
	 * is updating - this is used in things like the file upload element
	 * to check for changes in uploaded files and process the difference
	 *
	 * @return	array
	 */
	protected function setOrigData()
	{
		$input = $this->app->getInput();

		if ($this->isNewRecord() ||
!$this->getForm()->record_in_database)
		{
			$this->_origData = array(new stdClass);
		}
		else
		{
			/*
			 * $$$ hugh - when loading origdata on editing of a rowid=-1/usekey
form,
			 * the rowid will be set to the actual form tables's rowid, not the
userid,
			 * so we need to unset 'usekey', otherwise we end up with the
wrong row.
			 * I thought we used to take care of this elsewhere?
			 *
			 * $$$ 7/25/2017 - don't think this is true any more?
			 *
			 * $$$ 9/5/2017 = yup, still seems to be necesaasy, definitely when
submitting with a juser plugin.  So
			 * reverted changes made on 7/25, and will keep an eye out for
situations where doing this causes problems.
			 */

			$isUserRow = $this->isUserRowId();

			if ($isUserRow)
			{
				$origUseKey = $input->get('usekey', '');
				$input->set('usekey', '');
			}

			$listModel = $this->getListModel();
			$fabrikDb = $listModel->getDb();
			$sql = $this->buildQuery();
			$fabrikDb->setQuery($sql);
			$this->_origData = $fabrikDb->loadObjectList();

			if ($isUserRow)
			{
				$input->set('usekey', $origUseKey);
			}
		}
	}

	/**
	 * Get the form record's original data - before any alterations were
made to it
	 * in the form
	 *
	 * @return  array
	 */
	public function getOrigData()
	{
		if (!isset($this->_origData))
		{
			$this->setOrigData();
		}

		return $this->_origData;
	}

	/**
	 * test if orig data is empty.  Made this a function, as it's not a
simple test
	 * for empty(), and code outside the model shouldn't need to know
it'll be a one
	 * entry array with an empty stdClass in it.
	 *
	 * @return  bool
	 */
	public function origDataIsEmpty()
	{
		if (!isset($this->_origData))
		{
			$this->setOrigData();
		}

		return (empty($this->_origData) || (count($this->_origData) == 1
&& count((array) $this->_origData[0]) == 0));
	}

	/**
	 * Are we copying a row?  Usually set in controller process().
	 *
	 * @param   bool  $set  if true, set copyingRow to true
	 *
	 * @return	bool
	 */
	public function copyingRow($set = false)
	{
		if ($set)
		{
			$this->copyingRow = true;
		}

		return $this->copyingRow;
	}

	/**
	 * Processes the form data and decides what action to take
	 *
	 * @return  bool  false if one of the plugins returns an error otherwise
true
	 */
	public function process()
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('process: start') : null;
		$input = $this->app->getInput();

		error_reporting(error_reporting() ^ (E_WARNING | E_NOTICE));
		@set_time_limit(300);
		$form = $this->getForm();
		$pluginManager = FabrikWorker::getPluginManager();

		$sessionModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Formsession',
'FabrikFEModel');
		$sessionModel->setFormId($this->getId());
		$sessionModel->setRowId($this->rowId);
		/* $$$ rob rowId can be updated by jUser plugin so plugin can use check
(for new/edit)
		 * now looks at origRowId
		 */
		$this->origRowId = $this->rowId;

		JDEBUG ? $profiler->mark('process, getGroupsHiarachy:
start') : null;
		$this->getGroupsHiarachy();

		if ($form->record_in_database == '1')
		{
			JDEBUG ? $profiler->mark('process, setOrigData: start') :
null;
			$this->setOrigData();
		}

		/*
		 * $$$ hugh - we do this prior to processToDb(), but turns out we need
formDataWithTableName in
		 * some plugins, like 'php', which run
$formModel->getProcessData().  But it's kind of a chicken
		 * and egg, because those same plugins my change $formData.  Anyway, only
solution for now is
		 * set up $this->formDataWithTaleName here, so they at least have the
posted data to work with,
		 * then do it again after all the plugins have run.  So, rule of thumb
... plugins running onBeforeProcess
		 * or onBeforeStore need to modify formData, not formDataWithTableName.
		 */
		$this->formDataWithTableName = $this->formData;

		JDEBUG ? $profiler->mark('process, onBeforeProcess plugins:
start') : null;
		if (in_array(false,
$pluginManager->runPlugins('onBeforeProcess', $this)))
		{
			return false;
		}

		$this->removeEmptyNoneJoinedGroupData($this->formData);
		JDEBUG ? $profiler->mark('process, setFormData: start') :
null;
		$this->setFormData();

		JDEBUG ? $profiler->mark('process, _doUpload: start') :
null;
		if (!$this->_doUpload())
		{
			return false;
		}

		/** $$$ rob 27/10/2011 - moved above _doUpload as code in there is trying
to update formData which is not yet set
		 * this->setFormData();
		 */

		JDEBUG ? $profiler->mark('process, onBeforeStore plugins:
start') : null;
		if (in_array(false,
$pluginManager->runPlugins('onBeforeStore', $this)))
		{
			return false;
		}

		$this->formDataWithTableName = $this->formData;

		if ($form->record_in_database == '1')
		{
			$rowid = $this->processToDB();
			/*
			 * I want to add the following, but have a feeling some things will
break if I do.
			 * Currently when adding a new form, getRowId() will never give you the
new rowid,
			 * which kinda sucks.  But ... I'm pretty sure if I set it, then
there's existing code
			 * which will break it does yield the new rowid after submission.  Need
to test this
			 * thoroughly before enabling it.
			 */
			/*
			if ($this->getRowId() === '')
			{
				$this->setRowId($rowid);
			}
			*/
		}

		// Clean the cache.
		$cache = Factory::getCache($input->get('option'));
		$cache->clean();

		// $$$rob run this before as well as after onAfterProcess (ONLY for
redirect plugin)
		// so that any redirect urls are available for the plugin (e.g twitter)
		JDEBUG ? $profiler->mark('process, onLastProcess plugins:
start') : null;
		$pluginManager->runPlugins('onLastProcess', $this);

		JDEBUG ? $profiler->mark('process, onAfterProcess plugins:
start') : null;
		if (in_array(false,
$pluginManager->runPlugins('onAfterProcess', $this)))
		{
			// $$$ rob this no longer stops default redirect (not needed any more)
			// returning false here stops the default redirect occurring
			return false;
		}
		// Need to remove the form session before redirect plugins occur
		$sessionModel->remove();

		// $$$rob used ONLY for redirect plugins
		JDEBUG ? $profiler->mark('process, onLastProcess plugins:
start') : null;
		if (in_array(false,
$pluginManager->runPlugins('onLastProcess', $this)))
		{
			// $$$ rob this no longer stops default redirect (not needed any more)
			// returning false here stops the default redirect occurring
			return false;
		}

		// Clean both admin and front end cache.
		parent::cleanCache('com_fabrik', 1);
		parent::cleanCache('com_fabrik', 0);

		JDEBUG ? $profiler->mark('process: end') : null;

		return true;
	}

	/**
	 * Perform file uploads
	 *
	 * @return bool
	 */
	protected function _doUpload()
	{
		$oUploader = $this->getUploader();
		$oUploader->upload();

		if ($oUploader->moveError)
		{
			return false;
		}

		return true;
	}

	/**
	 * Update the data that gets posted via the form and stored by the form
	 * model. Used in elements to modify posted data see file upload
	 *
	 * @param   string  $key          in key.dot.format to set a recursive
array
	 * @param   string|array  $val          value to set to
	 * @param   bool    $update_raw   automatically update _raw key as well
	 * @param   bool    $override_ro  update data even if element is RO
	 *
	 * @return  void
	 */
	public function updateFormData($key, $val, $update_raw = false,
$override_ro = false)
	{
		if (strstr($key, '.'))
		{
			$nodes = explode('.', $key);
			$count = count($nodes);
			$pathNodes = $count - 1;

			if ($pathNodes < 0)
			{
				$pathNodes = 0;
			}

			$ns = &$this->formData;

			for ($i = 0; $i <= $pathNodes; $i++)
			{
				// If any node along the registry path does not exist, create it
				if (!isset($ns[$nodes[$i]]))
				{
					$ns[$nodes[$i]] = array();
				}

				$ns = &$ns[$nodes[$i]];
			}

			$ns = $val;

			// $$$ hugh - changed name of $ns, as re-using after using it to set by
reference was borking things up!
			$nsTable = &$this->formDataWithTableName;

			for ($i = 0; $i <= $pathNodes; $i++)
			{
				// If any node along the registry path does not exist, create it
				if (!isset($nsTable[$nodes[$i]]))
				{
					$nsTable[$nodes[$i]] = array();
				}

				$nsTable = &$nsTable[$nodes[$i]];
			}

			$nsTable = $val;

			// $$$ hugh - changed name of $ns, as re-using after using it to set by
reference was borking things up!
			$nsFull = &$this->fullFormData;

			for ($i = 0; $i <= $pathNodes; $i++)
			{
				// If any node along the registry path does not exist, create it
				if (!isset($nsFull[$nodes[$i]]))
				{
					$nsFull[$nodes[$i]] = array();
				}

				$nsFull = &$nsFull[$nodes[$i]];
			}

			$nsFull = $val;

			// $$$ hugh - FIXME - nope, this won't work!  We don't know
which path node is the element name.
			// $$$ hugh again - should now work, with little preg_replace hack, if
last part is numeric, then second to last will be element name
			if ($update_raw)
			{
				if (preg_match('#\.\d+$#', $key))
				{
					$key = preg_replace('#(.*)(\.\d+)$#', '$1_raw$2',
$key);
				}
				else
				{
					$key .= '_raw';
				}

				$nodes = explode('.', $key);
				$count = count($nodes);
				$pathNodes = $count - 1;

				if ($pathNodes < 0)
				{
					$pathNodes = 0;
				}

				$nsRaw = &$this->formData;

				for ($i = 0; $i <= $pathNodes; $i++)
				{
					// If any node along the registry path does not exist, create it
					if (!isset($nsRaw[$nodes[$i]]))
					{
						$nsRaw[$nodes[$i]] = array();
					}

					$nsRaw = &$nsRaw[$nodes[$i]];
				}

				$nsRaw = $val;

				$nsRawFull = $this->fullFormData;

				for ($i = 0; $i <= $pathNodes; $i++)
				{
					// If any node along the registry path does not exist, create it
					if (!isset($nsRawFull[$nodes[$i]]))
					{
						$nsRawFull[$nodes[$i]] = array();
					}

					$nsRawFull = &$nsRawFull[$nodes[$i]];
				}

				$nsRawFull = $val;
			}
		}
		else
		{
			if (isset($this->formData))
			{
				$this->formData[$key] = $val;
				$this->formDataWithTableName[$key] = $val;
			}
			// Check if set - for case where you have a fileupload element &
confirmation plugin - when plugin is trying to update non-existent data
			if (isset($this->fullFormData))
			{
				$this->fullFormData[$key] = $val;
			}
			/*
			 * Need to allow RO (encrypted) elements to be updated.  Consensus is
that
			 * we should actually modify the actual encrypted element in the
$_REQUEST,
			 * but turns out this is a major pain in the butt (see
_cryptViewOnlyElements() in the
			 * form view for details!).  Main problem is we need to know if
it's a join and/or repeat group,
			 * which means loading up the element model.  So for now, just going to
add the element name to a
			 * class array, $this->pluginUpdatedElements[], which we'll
check in addDefaultDataFromRO()
			 * in the table model, or wherever else we need it.
			 */
			/*
			 if (array_key_exists('fabrik_vars', $_REQUEST)
			&& array_key_exists('querystring',
$_REQUEST['fabrik_vars'])
			&& array_key_exists($key,
$_REQUEST['fabrik_vars']['querystring'])) {
			$crypt = FabrikWorker::getCrypt();
			// turns out it isn't this simple, of course!  see above
			$_REQUEST['fabrik_vars']['querystring'][$key] =
$crypt->encrypt($val);
			}
			 */
			// add element name to this array, which will then cause this element to
be skipped
			// during the RO data phase of writing the row.  Don't think it
really matter what we set it to,
			// might as well be the value.  Note that we need the new $override_ro
arg, as some elements
			// use updateFormData() as part of normal operation, which should
default to NOT overriding RO.

			if ($override_ro)
			{
				$this->pluginUpdatedElements[$key] = $val;
			}

			if ($update_raw)
			{
				$key .= '_raw';
				$this->formData[$key] = $val;
				$this->formDataWithTableName[$key] = $val;

				if (isset($this->fullFormData))
				{
					$this->fullFormData[$key] = $val;
				}

				if ($override_ro)
				{
					$this->pluginUpdatedElements[$key] = $val;
				}
			}
		}
	}

	/**
	 * Intended for use by things like PHP form plugin code, PHP validations,
etc.,
	 * so folk don't have to access formData directly.
	 *
	 * @param   string  $fullName     full element name
	 * @param   bool    $raw          get raw data
	 * @param   mixed   $default      value
	 * @param   string  $repeatCount  repeat count if needed
	 *
	 * @since	3.0.6
	 *
	 * @return mixed
	 */
	public function getElementData($fullName, $raw = false, $default =
'', $repeatCount = null)
	{
		$data = isset($this->formData) ? $this->formData : $this->data;
		$value = null;

		if ($raw)
		{
			$fullName .= '_raw';
		}
		// Simplest case, element name exists in main group
		if (is_array($data) && array_key_exists($fullName, $data))
		{
			$value = $data[$fullName];
		}
        /* Maybe we are being called from onAfterProcess hook, or somewhere
else
         * running after store, when non-joined data names have been
reduced to short
         * names in formData, so peek in formDataWithTableName
         */
        elseif (isset($this->formDataWithTableName) &&
array_key_exists($fullName, $this->formDataWithTableName))
        {
            $value = $this->formDataWithTableName[$fullName];
        }

		if (isset($value) && isset($repeatCount) &&
is_array($value))
		{
			$value = FArrayHelper::getValue($value, $repeatCount, $default);
		}

		// If we didn't find it, set to default
		if (!isset($value))
		{
			$value = $default;
		}

		return $value;
	}

	/**
	 * This will strip the html from the form data according to the
	 * filter settings applied from article manager->parameters
	 * see here -
http://forum.joomla.org/index.php/topic,259690.msg1182219.html#msg1182219
	 *
	 * @return  array  form data
	 */
	public function &setFormData()
	{
		if (isset($this->formData))
		{
			return $this->formData;
		}

		list($this->dofilter, $this->filter) =
FabrikWorker::getContentFilter();

		$this->ajaxPost =
$this->app->getInput()->getBool('fabrik_ajax');

		// Set up post data, and copy values to raw (for failed form submissions)
		$data = $_POST;
		$this->copyToRaw($data);

		/**
		 * $$$ hugh - quite a few places in code that runs after this want
__pk_val,
		 * so if it doesn't exist, grab it from the PK element.
		 */
		if (!array_key_exists('__pk_val', $data))
		{
			/**
			 * $$$ hugh - There HAS to be an easier way of getting the PK element
name, that doesn't involve calling getPrimaryKeyAndExtra(),
			 * which is a horribly expensive operation.
			 */
			$primaryKey = $this->getListModel()->getPrimaryKey(true);
			$data['__pk_val'] = FArrayHelper::getValue($data, $primaryKey
. '_raw', FArrayHelper::getValue($data, $primaryKey,
''));
		}

		// Apply querystring values if not already in post (so qs values
doesn't overwrite the submitted values for dbjoin elements)
		$data = array_merge($data, $_REQUEST);
		array_walk_recursive($data, array($this, '_clean'));

		// Set here so element can call formModel::updateFormData()
		$this->formData = $data;
		$this->fullFormData = $this->formData;
		$this->session->set('com_fabrik.form.data',
$this->formData);

		return $this->formData;
	}

	/**
	 * Called from setFormData to clean up posted data from either ajax or
posted form
	 * used in array_walk_recursive() method
	 *
	 * @param   mixed  &$item  (string or array)
	 *
	 * @return  void
	 */
	protected function _clean(&$item)
	{
		if (is_array($item))
		{
			array_walk_recursive($item, array($this, '_clean'));
		}
		else
		{
			if ($this->dofilter)
			{
				//$item = preg_replace('/%([0-9A-F]{2})/mei',
"chr(hexdec('\\1'))", $item);
				$item = preg_replace_callback('/%([0-9A-F]{2})/mi',  function
($matches) { return chr(hexdec($matches[1])); }, $item);
				if ($this->ajaxPost)
				{
					$item = rawurldecode($item);
				}

				if ($this->dofilter)
				{
					@$item = $this->filter->clean($item);
				}
			}
			else
			{
				if ($this->ajaxPost)
				{
					$item = rawurldecode($item);
				}
			}
		}
	}

	/**
	 * Loop over elements and call their preProcess() method
	 *
	 * @return  void
	 */
	private function callElementPreProcess()
	{
		$input = $this->app->getInput();
		$repeatTotals = $input->get('fabrik_repeat_group', array(0),
'array');
		$groups = $this->getGroupsHiarachy();

		// Currently this is just used by calculation elements
		foreach ($groups as $groupModel)
		{
			$group = $groupModel->getGroup();
			$repeatedGroupCount = FArrayHelper::getValue($repeatTotals,
$group->id, 0, 'int');
			$elementModels = $groupModel->getPublishedElements();

			for ($c = 0; $c < $repeatedGroupCount; $c++)
			{
				foreach ($elementModels as $elementModel)
				{
					$elementModel->preProcess($c);
				}
			}
		}
	}

	/**
	 * Without this the first groups repeat data was always being saved (as it
was posted but hidden
	 * on the form.
	 *
	 * @param   array  &$data  posted form data
	 *
	 * @return  void
	 */
	protected function removeEmptyNoneJoinedGroupData(&$data)
	{
		$repeats = FArrayHelper::getValue($data, 'fabrik_repeat_group',
array());
		$groups = $this->getGroups();

		foreach ($repeats as $groupId => $c)
		{
			if ($c == 0)
			{
				$group = $groups[$groupId];

				if ($group->isJoin())
				{
					continue;
				}

				$elements = $group->getPublishedElements();

				foreach ($elements as $elementModel)
				{
					$name = $elementModel->getElement()->name;
					$data[$name] = '';
					$data[$name . '_raw'] = '';
				}
			}
		}
	}

	/**
	 * Prepare the submitted form data for copying
	 *
	 * @return  string  Original records reference
	 */
	protected function prepareForCopy()
	{
		$listModel = $this->getListModel();
		$item = $listModel->getTable();
		$k = $item->db_primary_key;
		$k = FabrikString::safeColNameToArrayKey($k);
		$origId = FArrayHelper::getValue($this->formData, $k, '');

		// COPY function should create new records
		if (array_key_exists('Copy', $this->formData))
		{
			$this->rowId = '';
			$this->formData[$k] = '';
			$this->formData['rowid'] = '';
		}

		// set the repeat group counts (mutated from the base view code which
creates the hidden input)
		$groups   = $this->getGroupsHiarachy();
		$fabrikRepeatGroup = array();

		foreach ($groups as $groupModel)
		{
			// Check if group is actually a table join
			$repeatGroup = 1;
			$foreignKey  = null;

			if ($groupModel->canRepeat())
			{
				if ($groupModel->isJoin())
				{
					$joinModel  = $groupModel->getJoinModel();
					$joinTable  = $joinModel->getJoin();

					if (is_object($joinTable))
					{
						$elementModels = $groupModel->getPublishedElements();
						reset($elementModels);
						$tmpElement        = current($elementModels);
						$smallerElHTMLName = $tmpElement->getFullName(true, false);
						$repeatGroup       = count($this->formData[$smallerElHTMLName]);
					}
				}
			}

			$groupModel->repeatTotal = $repeatGroup;
			$fabrikRepeatGroup[$groupModel->getId()] = $repeatGroup;
		}

		$this->app->getInput()->set('fabrik_repeat_group',
$fabrikRepeatGroup);

		return $origId;
	}

	/**
	 * As part of the form process we may need to update the referring url if
making a copy
	 *
	 * @param   string  $origId    Original record ref
	 * @param   string  $insertId  New insert reference
	 *
	 * @return  void referrer
	 */
	protected function updateReferrer($origId, $insertId)
	{
		$input = $this->app->getInput();

		// Set the redirect page to the form's url if making a copy and set
the id to the new insert id
		if (array_key_exists('Copy', $this->formData))
		{
			$u = str_replace('rowid=' . $origId, 'rowid=' .
$insertId, $input->get('HTTP_REFERER', '',
'string'));
			$input->set('fabrik_referrer', $u);
		}
	}

	/**
	 * Set various request / input arrays with the main records insert id
	 *
	 * @param   string  $insertId  The records insert id
	 *
	 * @return  void
	 */
	public function setInsertId($insertId)
	{
		$input = $this->app->getInput();
		$listModel = $this->getListModel();
		$item = $listModel->getTable();
		$tmpKey = str_replace("`", "",
$item->db_primary_key);
		$tmpKey = str_replace('.', '___', $tmpKey);
		$this->formData[$tmpKey] = $insertId;
		$this->formData[$tmpKey . '_raw'] = $insertId;
		$this->formData[FabrikString::shortColName($item->db_primary_key)]
= $insertId;
		$this->formData[FabrikString::shortColName($item->db_primary_key) .
'_raw'] = $insertId;

		$this->fullFormData[$tmpKey] = $insertId;
		$this->fullFormData[$tmpKey . '_raw'] = $insertId;
		$this->fullFormData['rowid'] = $insertId;
		$this->formData['rowid'] = $insertId;
		$this->formDataWithTableName[$tmpKey] = $insertId;
		$this->formDataWithTableName[$tmpKey . '_raw'] = $insertId;
		$this->formDataWithTableName['rowid'] = $insertId;

		$input->set($tmpKey, $insertId);
		$input->set('rowid', $insertId);

		// $$$ hugh - pretty sure we need to unset 'usekey' now, as it
is not relevant to joined data,
		// and it messing with storeRow of joins
		$input->set('usekey', '');
	}

	/**
	 * Process groups when the form is submitted
	 *
	 * @param   int  $parentId  insert ID of parent table
	 *
	 * @return  void
	 */
	protected function processGroups($parentId = null)
	{
		$groupModels = $this->getGroups();

		foreach ($groupModels as $groupModel)
		{
			// Jaanus: if group is visible
			if ($groupModel->canView() && $groupModel->canEdit())
			{
				$groupModel->process($parentId);
			}
		}
	}

	/**
	 * Process individual elements when submitting the form
	 * Used for multi-select join elements which need to store data in
	 * related tables
	 *
	 * @since   3.1rc2
	 *
	 * @return  void
	 */
	protected function processElements()
	{
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elementModel->onFinalStoreRow($this->formData);
			}
		}
	}

	/**
	 * Process the form to the database
	 *
	 * @return string Insert id
	 */
	public function processToDB()
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('processToDb: start') : null;

		$pluginManager = FabrikWorker::getPluginManager();
		$listModel = $this->getListModel();
		$origId = $this->prepareForCopy();
		$this->formData =
$listModel->removeTableNameFromSaveData($this->formData,
'___');

		JDEBUG ? $profiler->mark('processToDb, submitToDatabase:
start') : null;
		$insertId = $this->storeMainRow ?
$this->submitToDatabase($this->rowId) : $this->rowId;

		$this->updateReferrer($origId, $insertId);
		$this->setInsertId($insertId);

		// Store join data
		JDEBUG ? $profiler->mark('processToDb, processGroups:
start') : null;
		$this->processGroups($insertId);

		// Enable db join checkboxes in repeat groups to save data
		JDEBUG ? $profiler->mark('processToDb, processElements:
start') : null;
		$this->processElements();

		JDEBUG ? $profiler->mark('processToDb, onBeforeCalculations
plugins: start') : null;

		if (in_array(false,
$pluginManager->runPlugins('onBeforeCalculations', $this)))
		{
			return $insertId;
		}

		JDEBUG ? $profiler->mark('processToDb, doCalculations:
start') : null;
		$this->listModel->doCalculations();

		JDEBUG ? $profiler->mark('processToDb: end') : null;

		return $insertId;
	}

	/**
	 * Saves the form data to the database
	 *
	 * @param   string  $rowId  If '' then insert a new row -
otherwise update this row id
	 *
	 * @return	mixed	insert id (or rowid if updating existing row) if ok, else
string error message
	 */
	protected function submitToDatabase($rowId = '')
	{
		$this->getGroupsHiarachy();
		$groups = $this->getGroupsHiarachy();
		$listModel = $this->getListModel();
		$listModel->encrypt = array();
		$data = array();

		foreach ($groups as $groupModel)
		{
			// Joined groups stored in groupModel::process();
			if ($groupModel->isJoin())
			{
				continue;
			}

			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				if ($elementModel->encryptMe())
				{
					$listModel->encrypt[] = $elementModel->getElement()->name;
				}
				// Following line added to fix importcsv where data from first row is
used for every row.
				$elementModel->defaults = null;
				$elementModel->onStoreRow($data);
			}
		}

		$listModel = $this->getListModel();
		$listModel->setFormModel($this);
		$listModel->getTable();
		$listModel->storeRow($data, $rowId);
		$this->lastInsertId = $listModel->lastInsertId;
		$useKey = $this->app->getInput()->get('usekey',
'');

		if (!empty($useKey))
		{
			return $listModel->lastInsertId;
		}
		else
		{
			return ($rowId == '') ? $listModel->lastInsertId : $rowId;
		}
	}

	/**
	 * Get the form's list model
	 * (was getTable but that clashed with J1.5 func)
	 *
	 * @return  FabrikFEModelList  fabrik list model
	 */
	public function getListModel()
	{
		if (!isset($this->listModel))
		{
			$this->listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
			$item = $this->getForm();
			$this->listModel->loadFromFormId($item->id);
			$this->listModel->setFormModel($this);
		}

		return $this->listModel;
	}

	/**
	 * Get the class names for each of the validation rules
	 *
	 * @deprecated (was only used in element label)
	 *
	 * @return	array	(validationruleid => classname )
	 */
	public function loadValidationRuleClasses()
	{
		if (is_null($this->validationRuleClasses))
		{
			$validationRules =
FabrikWorker::getPluginManager()->getPlugInGroup('validationrule');
			$classes = array();

			foreach ($validationRules as $rule)
			{
				$classes[$rule->name] = $rule->name;
			}

			$this->validationRuleClasses = $classes;
		}

		return $this->validationRuleClasses;
	}

	/**
	 * Give elements a way to re-instate data after a validation failure, for
example upload elements,
	 * where the value won't be in the submitted data, in order to
preserve state
	 **
	 * @return	void
	 */
	public function setValidationFailedData()
	{
		$this->getGroupsHiarachy();
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elementModel->setValidationFailedData($this->formData);
			}
		}
	}

	/**
	 * Add in any encrypted stuff, in case we fail validation ...
	 * otherwise it won't be in $data when we rebuild the page.
	 * Need to do it here, so _raw fields get added in the next chunk
'o' code.
	 *
	 * @param   array  &$post  posted form data passed by reference
	 *
	 * @return	null
	 */
	public function addEncrytedVarsToArray(&$post)
	{
		if (array_key_exists('fabrik_vars', $_REQUEST) &&
array_key_exists('querystring',
$_REQUEST['fabrik_vars']))
		{
			$groups = $this->getGroupsHiarachy();
			$crypt = FabrikWorker::getCrypt();
			$w = new FabrikWorker;

			foreach ($groups as $g => $groupModel)
			{
				$elementModels = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					$elementModel->getElement();

					foreach ($_REQUEST['fabrik_vars']['querystring']
as $key => $encrypted)
					{
						if ($elementModel->getFullName(true, false) == $key)
						{
							/* 	$$$ rob - don't test for !canUse() as confirmation plugin
dynamically sets this
							 * if ($elementModel->canView())
							 * $$$ hugh - testing adding non-viewable, non-editable elements to
encrypted vars
							 */

							if (is_array($encrypted))
							{
								// Repeat groups
								$v = array();

								foreach ($encrypted as $e)
								{
									// $$$ rob urldecode when posting from ajax form
									$e = urldecode($e);
									$e = empty($e) ? '' : $crypt->decrypt($e);
									$e = FabrikWorker::JSONtoData($e);
									$v[] = $w->parseMessageForPlaceHolder($e, $post);
								}
							}
							else
							{
								// $$$ rob urldecode when posting from ajax form
								$encrypted = urldecode($encrypted);
								$v = empty($encrypted) ? '' :
$crypt->decrypt($encrypted);

								/*
								 * $$$ hugh - things like element list elements (radios, etc) seem
to use
								 * their JSON data for encrypted read only values, need to decode.
								 */

								if (is_subclass_of($elementModel,
'PlgFabrik_ElementList'))
								{
									$v = FabrikWorker::JSONtoData($v, true);
								}

								$v = $w->parseMessageForPlaceHolder($v, $post);
							}

							$elementModel->setGroupModel($groupModel);
							$elementModel->setValuesFromEncryt($post, $key, $v);
							/* $$ rob set both normal and rawvalues to encrypted - otherwise
validate method doesn't
							 * pick up decrypted value
							 */
							$elementModel->setValuesFromEncryt($post, $key .
'_raw', $v);
						}
					}
				}
			}
		}
	}

	/**
	 * When submitting data copy values to _raw equivalent
	 *
	 * @param   array  &$post     Form data
	 * @param   bool   $override  Override existing raw data when copying to
raw
	 *
	 * @return	null
	 */
	public function copyToRaw(&$post, $override = false)
	{
		$this->copyToFromRaw($post, 'toraw', $override);
	}

	/**
	 * Copy raw data to non-raw data
	 *
	 * @param   array  &$post     Form data
	 * @param   bool   $override  Override existing raw data when copying from
raw
	 *
	 * @return	null
	 */
	public function copyFromRaw(&$post, $override = false)
	{
		$this->copyToFromRaw($post, 'fromraw', $override);
	}

	/**
	 * Copy raw data to non-raw data OR none-raw to raw
	 *
	 * @param   array   &$post      Form data
	 * @param   string  $direction  Either - toraw OR fromraw - defines which
data to copy to where raw/none-raw
	 * @param   bool    $override   Override existing raw data when copying
from raw
	 *
	 * @return	null
	 */
	protected function copyToFromRaw(&$post, $direction =
'toraw', $override = false)
	{
		$groups = $this->getGroupsHiarachy();
		$input = $this->app->getInput();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elName2 = $elementModel->getFullName(true, false);
				$elName2Raw = $elName2 . '_raw';

				if ($direction === 'toraw')
				{
					if (!array_key_exists($elName2Raw, $post) || $override)
					{
						// Post required getValue() later on
						$input->set($elName2Raw, FArrayHelper::getValue($post, $elName2,
''));
						$post[$elName2Raw] = FArrayHelper::getValue($post, $elName2,
'');
					}
				}
				else
				{
					if (!array_key_exists($elName2 . '_raw', $post) ||
$override)
					{
						// Post required getValue() later on
						$input->set($elName2, FArrayHelper::getValue($post, $elName2Raw,
''));
						$post[$elName2] = FArrayHelper::getValue($post, $elName2Raw,
'');
					}
				}
			}
		}
	}

	/**
	 * Has the form failed a validation
	 *
	 * @return bool
	 */
	public function failedValidation()
	{
		return $this->hasErrors();
	}

	/**
	 * Validate the form
	 * modifies post data to include validation replace data
	 *
	 * @return  bool  true if form validated ok
	 */
	public function validate()
	{
		$input = $this->app->getInput();

		if ((bool) $input->getBool('fabrik_ignorevalidation', false)
=== true)
		{
			// Put in when saving page of form
			return true;
		}

		$pluginManager =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Pluginmanager',
'FabrikFEModel');
		$pluginManager->getPlugInGroup('validationrule');

		$post = $this->setFormData();

		// Contains any data modified by the validations
		$this->modifiedValidationData = array();
		$w = new FabrikWorker;
		$ok = true;

		// $$$ rob 01/07/2011 fileupload needs to examine records previous data
for validations on editing records
		$this->setOrigData();

		// $$$ rob copy before addEncrytedVarsToArray as well as after
		// so that any placeholders(.._raw) contained in the encrypted vars are
correctly replaced
		$this->copyToRaw($post);

		/* $$$ rob for PHP 5.2.1 (and potential up to before 5.2.6) $post is not
fully associated with formData -
		 * so the above copToRaw does not update $this->formData.
		 * $$$ hugh - had to add the &, otherwise replace validations
weren't work, as modifying
		 * $post wasn't modifying $this->formData.  Which is weird, as I
thought all array assignments
		 * were by reference?
		 * $$$ hugh - FIXME - wait ... what ... hang on ... we assign
$this->formData in $this->setFormData(),
		 * which we assigned to $post a few lines up there ^^.  Why are we now
assigning $post back to $this->formData??
		 */
		$this->formData = &$post;

		/* $$$ hugh - add in any encrypted stuff, in case we fail validation ...
		 * otherwise it won't be in $data when we rebuild the page.
		 * Need to do it here, so _raw fields get added in the next chunk
'o' code.
		 */
		$this->addEncrytedVarsToArray($post);

		// $$$ hugh - moved this to after addEncryptedVarsToArray(), so read only
data is
		// available to things like calcs running in preProcess phase.
		$this->callElementPreProcess();

		// Add in raw fields - the data is already in raw format so just copy the
values
		$this->copyToRaw($post);

		$groups = $this->getGroupsHiarachy();
		$repeatTotals = $input->get('fabrik_repeat_group', array(0),
'array');
		$ajaxPost = $input->getBool('fabrik_ajax');
		$joinData = array();

		foreach ($groups as $groupModel)
		{
			$groupCounter = $groupModel->getGroup()->id;
			$elementModels = $groupModel->getPublishedElements();

			if ($groupModel->isJoin())
			{
				$joinModel = $groupModel->getJoinModel();
			}

			foreach ($elementModels as $elementModel)
			{
				// If the user can't view or edit the element, then don't
validate it. Otherwise user sees failed validation but no indication of
what failed
				if (!$elementModel->canUse() &&
!$elementModel->canView())
				{
					continue;
				}

				$elDbValues = array();
				$elementModel->getElement();
				$validationRules = $elementModel->validator->findAll();

				// $$ rob incorrect for ajax validation on joined elements
				// $elName = $elementModel->getFullName(true, false);
				$elName = $input->getBool('fabrik_ajax') ?
$elementModel->getHTMLId(0) : $elementModel->getFullName(true,
false);
				$this->errors[$elName] = array();
				$elName2 = $elementModel->getFullName(true, false);

				// $$$rob fix notice on validation of multi-page forms
				if (!array_key_exists($groupCounter, $repeatTotals))
				{
					$repeatTotals[$groupCounter] = 1;
				}

				for ($c = 0; $c < $repeatTotals[$groupCounter]; $c++)
				{
					$this->errors[$elName][$c] = array();

					// $$$ rob $this->formData was $_POST, but failed to get anything
for calculation elements in php 5.2.1
					$formData = $elementModel->getValue($this->formData, $c,
array('runplugins' => 0, 'use_default' => false,
'use_querystring' => false));
					
					// Internal element plugin validations
					if (!$elementModel->validate(@$formData, $c))
					{
						$ok = false;
						$this->errors[$elName][$c][] =
$elementModel->getValidationErr();
					}

					/**
					 * $$$ rob 11/04/2012 was stopping multiselect/chx dbjoin elements
from saving in normal group.
					 * if ($groupModel->canRepeat() || $elementModel->isJoin())
					 */
					if ($groupModel->canRepeat())
					{
						// $$$ rob for repeat groups no join setting to array() means that
$_POST only contained the last repeat group data
						// $elDbValues = array();
						$elDbValues[$c] = $formData;
					}
					else
					{
						$elDbValues = $formData;
					}
					// Validations plugins attached to elements
					if (!$elementModel->mustValidate())
					{
						continue;
					}

					foreach ($validationRules as $plugin)
					{
						$plugin->formModel = $this;

						if ($plugin->shouldValidate($formData, $c))
						{
							if (!$plugin->validate($formData, $c))
							{
								$this->errors[$elName][$c][] =
$w->parseMessageForPlaceHolder($plugin->getMessage());
								$ok = false;
							}

							if (method_exists($plugin, 'replace'))
							{
								if ($groupModel->canRepeat())
								{
									$elDbValues[$c] = $formData;
									$testReplace = $plugin->replace($elDbValues[$c], $c);

									if ($testReplace != $elDbValues[$c])
									{
										$elDbValues[$c] = $testReplace;
										$this->modifiedValidationData[$elName][$c] = $testReplace;
										$joinData[$elName2 . '_raw'][$c] = $testReplace;
										$post[$elName . '_raw'][$c] = $testReplace;
									}
								}
								else
								{
									$testReplace = $plugin->replace($elDbValues, $c);

									if ($testReplace != $elDbValues)
									{
										$elDbValues = $testReplace;
										$this->modifiedValidationData[$elName] = $testReplace;
										$input->set($elName . '_raw', $elDbValues);
										$post[$elName . '_raw'] = $elDbValues;
									}
								}
							}
						}
					}
				}

				if ($groupModel->isJoin() || $elementModel->isJoin())
				{
					$joinData[$elName2] = $elDbValues;
				}
				else
				{
					$input->set($elName, $elDbValues);
					$post[$elName] = $elDbValues;
				}
				// Unset the defaults or the orig submitted form data will be used (see
date plugin mysql vs form format)
				$elementModel->defaults = null;
			}
		}
		// Insert join data into request array
		foreach ($joinData as $key => $val)
		{
			$input->set($key, $val);
			$post[$key] = $val;
		}

		if (!empty($this->errors))
		{
			FabrikWorker::getPluginManager()->runPlugins('onError',
$this);
		}

		FabrikHelperHTML::debug($this->errors, 'form:errors');
		//echo "<pre>";print_r($this->errors);exit;
		$this->setErrors($this->errors);

		return $ok;
	}

	/**
	 * Helper method to get the session context - apply row id only if not
'' as
	 * accessing session data with a path '..' appears not to be
possible
	 *
	 * @return string
	 */
	public function getSessionContext()
	{
		$context = 'com_fabrik.form.' . $this->getId() .
'.';
		$rowId = $this->getRowId();

		if ($rowId !== '')
		{
			$context .= $rowId . '.';
		}

		return $context;
	}

	/**
	 * Get form validation errors - if empty test session for errors
	 * 31/01/13 - no longer restoring from session errors - see
http://fabrikar.com/forums/showthread.php?t=31377
	 * 19/02/13 - Changed from http_referer test to this->isMambot to
restore session errors when redirecting from a non-ajax form
	 * in module that has failed validation - see
http://fabrikar.com/forums/showthread.php?t=31870
	 *
	 * @return  array  errors
	 */
	public function getErrors()
	{
		// Store errors in local array as clearErrors() removes $this->errors
		$errors = array();

		if (empty($this->errors))
		{
			if ($this->isMambot)
			{
				$errors = $this->session->get($this->getSessionContext() .
'errors', array());
			}
		}
		else
		{
			$errors = $this->errors;
		}
		$this->clearErrors();
		$this->errors = $errors;

		return $this->errors;
	}

	/**
	 * Clear form validation errors
	 *
	 * @return  void
	 */
	public function clearErrors()
	{
		$this->errors = array();
		$context = $this->getSessionContext();
		$this->session->clear($context . 'errors');
		/* $$$ rob this was commented out, but putting back in to test issue that
if we have ajax validations on
		 * and a field is validated, then we don't submit the form, and go
back to add the form, the previously validated
		 * values are shown in the form.
		 */
		$this->session->set($context . 'session.on', false);
	}

	/**
	 * Set form validation errors in session
	 *
	 * @param   array  $errors  error messages
	 *
	 * @return void
	 */
	public function setErrors($errors)
	{
		$context = $this->getSessionContext();
		$this->session->set($context . 'errors', $errors);
		$this->session->set($context . 'session.on', true);
	}

	/**
	 * Get a JSON encoded string of error and modified data messages
	 *
	 * @return string
	 */
	public function getJsonErrors()
	{
		$data = array('modified' =>
$this->modifiedValidationData, 'errors' =>
$this->errors);

		return json_encode($data);
	}

	/**
	 * Should the form do a spoof check
	 *
	 * @return	bool
	 */
	public function spoofCheck()
	{
		$fbConfig = ComponentHelper::getParams('com_fabrik');

		return $this->getParams()->get('spoof_check',
$fbConfig->get('spoofcheck_on_formsubmission', true));
	}

	/**
	 * Get an instance of the uploader object
	 *
	 * @return  object  uploader
	 */
	public function &getUploader()
	{
		if (is_null($this->uploader))
		{
			$this->uploader = new Uploader($this);
		}

		return $this->uploader;
	}

	/**
	 * Get the forms table name
	 *
	 * @deprecated - not used?
	 *
	 * @return  string  table name
	 */
	public function getTableName()
	{
		$this->getListModel();

		return $this->getListModel()->getTable()->db_table_name;
	}

	/**
	 * Get the form row
	 *
	 * @param   string  $name     table name
	 * @param   string  $prefix   table name prefix
	 * @param   array   $options  initial state options
	 *
	 * @return FabTable form row
	 */
	public function getTable($name = '', $prefix =
'Table', $options = array())
	{
		if (is_null($this->form))
		{
			$this->form = parent::getTable('Form',
'FabrikTable');
		}

		$id = $this->getId();

		if ($this->form->id != $id)
		{
			$this->form->load($id);
		}

		return $this->form;
	}

	/**
	 * Determines if the form can be published
	 *
	 * @return  bool  true if publish dates are ok
	 */
	public function canPublish()
	{
		$form = $this->getForm();
		$publishUp = FabrikWorker::isNullDate($form->publish_up) ? null :
Factory::getDate($form->publish_up)->toUnix();
		$publishDown = FabrikWorker::isNullDate($form->publish_down) ? null :
Factory::getDate($form->publish_down)->toUnix();
		$now = $this->date->toUnix();

		if ($form->published == '1')
		{
			if ($now >= $publishUp)
			{
				if ($now <= $publishDown || $publishDown === null)
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Create a drop down list of all the elements in the form
	 *
	 * @param   string  $name                Drop down name
	 * @param   string  $default             Current value
	 * @param   bool    $excludeUnpublished  Add elements that are unpublished
	 * @param   bool    $useStep             Concat table name and el name
with '___' (true) or "." (false)
	 * @param   bool    $incRaw              Include raw labels default = true
	 * @param   string  $key                 What value should be used for the
option value 'name' (default) or 'id' @since 3.0.7
	 * @param   string  $attribs             Select list attributes @since
3.1b
	 *
	 * @return	string	html list
	 */
	public function getElementList($name = 'order_by', $default =
'', $excludeUnpublished = false,
		$useStep = false, $incRaw = true, $key = 'name', $attribs =
'class="inputbox" size="1"')
	{
		$aEls = $this->getElementOptions($useStep, $key, false, $incRaw);
		asort($aEls);

		// Paul - Prepend rather than append "none" option.
		array_unshift($aEls, HTMLHelper::_('select.option',
'', '-'));

		return HTMLHelper::_('select.genericlist', $aEls, $name,
$attribs, 'value', 'text', $default);
	}

	/**
	 * Get an array of the form's element's ids
	 *
	 * @param   array  $ignore  ClassNames to ignore e.g.
array('FabrikModelFabrikCascadingdropdown')
	 * @param   array  $opts    Property 'includePublished' can be
set to 0; @since 3.0.7
	 *                          Property 'loadPrefilters' @since
3.0.7.1 - used to ensure that pre-filter elements are loaded in inline edit
	 *
	 * @return  array  int ids
	 */
	public function getElementIds($ignore = array(), $opts = array())
	{
		$aEls = array();
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$this->getElementIds_check($elementModel, $ignore, $opts, $aEls);
			}
		}

		if (FArrayHelper::getValue($opts, 'loadPrefilters', false))
		{
			$listModel = $this->getListModel();
			list($afilterFields, $afilterConditions, $afilterValues, $afilterAccess,
$afilterEval, $afilterJoins, $aFilterType) =
$listModel->prefilterSetting();

			foreach ($afilterFields as $name)
			{
				$raw = preg_match("/_raw$/", $name) > 0;
				$name = $name ? FabrikString::rtrimword($name, '_raw') :
$name;
				$elementModel = $this->getElement($name);
			}
		}

		return $aEls;
	}

	/**
	 * Helper function for getElementIds(), test if the element should be
added
	 *
	 * @param   plgFabrik_Element  $elementModel  Element model
	 * @param   array              $ignore        ClassNames to ignore e.g.
array('FabrikModelFabrikCascadingdropdown')
	 * @param   array              $opts          Filter options
	 * @param   array              &$aEls         Array of element ids to
load
	 *
	 * @return  void
	 */
	private function getElementIds_check($elementModel, $ignore, $opts,
&$aEls)
	{
		$class = get_class($elementModel);

		if (!in_array($class, $ignore))
		{
			$element = $elementModel->getElement();

			if (!(FArrayHelper::getValue($opts, 'includePublised', true)
&& $element->published == 0))
			{
				$aEls[] = (int) $element->id;
			}
		}
	}

	/**
	 * Creates options array to be then used by getElementList to create a
drop down of elements in the form
	 * separated as elements need to collate this options from multiple forms
	 *
	 * @param   bool    $useStep               concat table name and el name
with '___' (true) or "." (false)
	 * @param   string  $key                   name of key to use (default
"name")
	 * @param   bool    $show_in_list_summary  only show those elements shown
in table summary
	 * @param   bool    $incRaw                include raw labels in list
(default = false) Only works if $key = name
	 * @param   array   $filter                list of plugin names that
should be included in the list - if empty include all plugin types
	 * @param   string  $labelMethod           An element method that if set
can alter the option's label
	 *                                         Used to only show elements that
can be selected for search all
	 * @param   bool    $noJoins               do not include elements in
joined tables (default false)
	 * @param   bool    $translate             run label through translation
(default true)
	 *
	 * @return	array	html options
	 */
	public function getElementOptions($useStep = false, $key =
'name', $show_in_list_summary = false, $incRaw = false,
		$filter = array(), $labelMethod = '', $noJoins = false,
$translate = true)
	{
		$groups = $this->getGroupsHiarachy();
		$aEls = array();

		foreach ($groups as $gid => $groupModel)
		{
			if ($noJoins && $groupModel->isJoin())
			{
				continue;
			}

			$elementModels = $groupModel->getMyElements();
			$prefix = $groupModel->isJoin() ?
$groupModel->getJoinModel()->getJoin()->table_join . '.'
: '';

			foreach ($elementModels as $elementModel)
			{
				$el = $elementModel->getElement();

				if (!empty($filter) && !in_array($el->plugin, $filter))
				{
					continue;
				}

				if ($show_in_list_summary == true &&
$el->show_in_list_summary != 1)
				{
					continue;
				}

				$val = $el->$key;
				$label = strip_tags($prefix . $el->label);

				if ($translate)
				{
					$label = Text::_($label);
				}

				if ($labelMethod !== '')
				{
					$elementModel->$labelMethod($label);
				}

				if ($key != 'id')
				{
					$val = $elementModel->getFullName($useStep, false);

					if ($this->addDbQuote)
					{
						$val = FabrikString::safeColName($val);
					}

					if ($incRaw && is_a($elementModel,
'PlgFabrik_ElementDatabasejoin'))
					{
						/* @FIXME - next line had been commented out, causing undefined
warning for $rawVal
						 * on following line.  Not sure if getrawColumn is right thing to use
here though,
						 * like, it adds filed quotes, not sure if we need them.
						 */
						if ($elementModel->getElement()->published != 0)
						{
							$rawVal = $elementModel->getRawColumn($useStep);

							if (!$this->addDbQuote)
							{
								$rawVal = str_replace('`', '', $rawVal);
							}

							$aEls[$label . '(raw)'] =
HTMLHelper::_('select.option', $rawVal, $label .
'(raw)');
						}
					}
				}

				$aEls[] = HTMLHelper::_('select.option', $val, $label);
			}
		}
		// Paul - Sort removed so that list is presented in group/id order
regardless of whether $key is name or id
		// asort($aEls);

		return $aEls;
	}

	/**
	 * Called via ajax nav
	 *
	 * @param   int  $dir  1 - move forward, 0 move back
	 *
	 * @return  bool  new row id loaded.
	 */
	public function paginateRowId($dir)
	{
		$db = FabrikWorker::getDbo();
		$input = $this->app->getInput();
		$c = $dir == 1 ? '>=' : '<=';
		$intLimit = $dir == 1 ? 2 : 0;
		$listModel = $this->getListModel();
		$item = $listModel->getTable();
		$rowId = $input->getString('rowid', '',
'string');
		$query = $db->getQuery(true);
		$query->select($item->db_primary_key . ' AS ' .
FabrikString::safeColNameToArrayKey($item->db_primary_key))->from($item->db_table_name)
			->where($item->db_primary_key . ' ' . $c . ' '
. $db->q($rowId));
		$query = $listModel->buildQueryOrder($query);
		$db->setQuery($query, 0, $intLimit);
		$ids = $db->loadColumn();

		if ($dir == 1)
		{
			if (count($ids) >= 2)
			{
				$input->set('rowid', $ids[$dir]);

				return true;
			}
			else
			{
				return false;
			}
		}

		if (count($ids) - 2 >= 0)
		{
			$input->set('rowid', $ids[count($ids) - 2]);

			return true;
		}

		return false;
	}

	/**
	 * Get the last insert id, for situations where we need the
'rowid' for newly inserted forms,
	 * and can't use getRowId() because it caches rowid as empty.  For
example, in plugins running
	 * onAfterProcess, like upsert.
	 *
	 * Note that $this->lastInsertId is getting set in the
	 */
	public function getInsertId()
	{
		return $this->lastInsertId;
	}

	/**
	 * Are we creating a new record or editing an existing one?
	 * Put here to ensure compat when we go from 3.0 where rowid = 0 = new, to
row id '' = new
	 *
	 * @since   3.0.9
	 *
	 * @return  boolean
	 */
	public function isNewRecord()
	{
		if ($this->getRowId() === '')
		{
			return true;
		}
		else
		{
			/*
			 * special case when using 'useley', rowid will be set on
submission, even on a new record,
			 * so test for hidden 'nodata' field, which is set on form
load if getData() finds no existing data.
			 */
			if ($this->app->getInput()->get('task', '')
=== 'form.process')
			{
				$opts   = array(
					'formid' => $this->getId()
				);
				$useKey = FabrikWorker::getMenuOrRequestVar('usekey',
'', $this->isMambot, 'var', $opts);

				if ($useKey &&
$this->app->getInput()->get('nodata', '') ===
'1')
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Get the current records row id
	 * setting a rowid of -1 will load in the current users record (used in
	 * conjunction with usekey variable
	 *
	 * setting a rowid of -2 will load in the last created record
	 *
	 * @return  string  rowid
	 */
	public function getRowId()
	{
		if (isset($this->rowId))
		{
			return $this->rowId;
		}

		$input = $this->app->getInput();
		$usersConfig = ComponentHelper::getParams('com_fabrik');

		// $$$rob if we show a form module when in a fabrik form component view -
we shouldn't use
		// the request rowid for the content plugin as that value is destined for
the component
		if ($this->isMambot && $input->get('option') ==
'com_fabrik')
		{
			$this->rowId = $usersConfig->get('rowid');
		}
		else
		{
			$this->rowId = FabrikWorker::getMenuOrRequestVar('rowid',
$usersConfig->get('rowid'), $this->isMambot);

			if ($this->rowId == -2)
			{
				// If the default was set to -2 (load last row) then a pagination form
plugin's row id should override menu settings
				$this->rowId = FabrikWorker::getMenuOrRequestVar('rowid',
$usersConfig->get('rowid'), $this->isMambot,
'request');
			}
		}

		if
($this->getListModel()->getParams()->get('sef-slug',
'') !== '')
		{
			$this->rowId = explode(':', $this->rowId);
			$this->rowId = array_shift($this->rowId);
		}
		// $$$ hugh - for some screwed up reason, when using SEF, rowid=-1 ends
up as :1
		// $$$ rob === compare as otherwise 0 == ":1" which meant that
the users record was loaded
		if ($this->isUserRowId())
		{
			$this->rowId = '-1';
		}
		// Set rowid to -1 to load in the current users record
		switch ($this->rowId)
		{
			case '-1':
				// New rows (no logged in user) should be ''
				$this->rowId = $this->user->get('id') == 0 ?
'' : $this->user->get('id');
				break;
			case '-2':
				// Set rowid to -2 to load in the last recorded record
				$this->rowId = $this->getMaxRowId();
				break;
		}

		/**
		 * $$$ hugh - added this as a Hail Mary sanity check, make sure
		 * rowId is an empty string if for whatever reason it's still null,
		 * as we have code in various place that checks for $this->rowId ===
''
		 * to detect adding new form.  So if at this point rowid is null, we have
		 * to assume it's a new form, and set rowid to empty string.
		 */
		if (is_null($this->rowId))
		{
			$this->rowId = '';
		}

		/**
		 * $$$ hugh - there's a couple of places, like calendar viz, that
add &rowid=0 to
		 * query string for new form, so check for that and set to empty string.
		 */
		if ($this->rowId === '0')
		{
			$this->rowId = '';
		}

		FabrikWorker::getPluginManager()->runPlugins('onSetRowId',
$this);

		return $this->rowId;
	}

	/**
	 * Collates data to write out the form
	 *
	 * @return  mixed  bool
	 */
	public function render()
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('formmodel render: start') : null;

		// $$$rob required in paolo's site when rendering modules with ajax
option turned on
		$this->listModel = null;
		$this->setRowId($this->getRowId());

		/*
		 * $$$ hugh - need to call this here as we set $this->editable here,
which is needed by some plugins
		 * hmmmm, this means that getData() is being called from
checkAccessFromListSettings(),
		 * so plugins running onBeforeLoad will have to
unset($formModel->_data) if they want to
		 * do something funky like change the rowid being loaded.  Not a huge
problem, but caught me out
		 * when a custom PHP onBeforeLoad plugin I'd written for a client
suddenly broke.
		 */
		$this->checkAccessFromListSettings();
		$pluginManager = FabrikWorker::getPluginManager();
		$res = $pluginManager->runPlugins('onBeforeLoad', $this);

		if (in_array(false, $res))
		{
			return false;
		}

		JDEBUG ? $profiler->mark('formmodel render: getData start')
: null;
		$data = $this->getData();
		JDEBUG ? $profiler->mark('formmodel render: getData end') :
null;
		$res = $pluginManager->runPlugins('onLoad', $this);

		if (in_array(false, $res))
		{
			return false;
		}

		// @TODO - relook at this:
		// $this->_reduceDataForXRepeatedJoins();
		JDEBUG ? $profiler->mark('formmodel render end') : null;

		$this->session->set('com_fabrik.form.' .
$this->getId() . '.data', $this->data);

		// $$$ rob return res - if its false the the form will not load
		return $res;
	}

	/**
	 * Get the max row id - used when requesting rowid=-2 to return the last
recorded detailed view
	 *
	 * @return  int  max row id
	 */
	protected function getMaxRowId()
	{
		if (!$this->getForm()->record_in_database)
		{
			return $this->rowId;
		}

		$listModel = $this->getListModel();
		$fabrikDb = $listModel->getDb();
		$item = $listModel->getTable();
		$k = FabrikString::safeNameQuote($item->db_primary_key);

		// @TODO JQuery this
		$fabrikDb->setQuery("SELECT MAX($k) FROM " .
FabrikString::safeColName($item->db_table_name) .
$listModel->buildQueryWhere());

		return $fabrikDb->loadResult();
	}

	/**
	 * If a submit plugin wants to fail validation not specific to an element
	 *
	 * @param  string  $errMsg
	 */
	public function setFormErrorMsg($errMsg)
	{
		$this->formErrorMsg = $errMsg;
	}

	/**
	 * Does the form contain user errors
	 *
	 * @return  bool
	 */
	public function hasErrors()
	{
		$errorsFound = false;

		if (isset($this->formErrorMsg))
		{
			$errorsFound = true;
		}

		$allErrors = $this->isMambot ?
$this->session->get($this->getSessionContext() .
'errors', array()) : $this->errors;

		foreach ($allErrors as $field => $errors)
		{
			if (!empty($errors) & is_array($errors))
			{
				foreach ($errors as $error)
				{
					if (!empty($error[0]))
					{
						$errorsFound = true;
					}
				}
			}
		}

		if ($this->saveMultiPage(false))
		{
			$sessionRow = $this->getSessionData();
			/*
			 * Test if its a resumed paged form
			 * if so _arErrors will be filled so check all elements had no errors
			 */
			$multiPageErrors = false;

			if ($sessionRow->data != '')
			{
				foreach ($this->errors as $err)
				{
					if (!empty($err[0]))
					{
						$multiPageErrors = true;
					}
				}

				if (!$multiPageErrors)
				{
					$errorsFound = false;
				}
			}
		}

		return $errorsFound;
	}

	/**
	 * Main method to get the data to insert into the form
	 *
	 * @return  array  Form's data
	 */

	public function getData()
	{
		// If already set return it. If not was causing issues with the juser
form plugin
		// when it tried to modify the form->data info, from within its onLoad
method, when sync user option turned on.

		if (isset($this->data))
		{
			return $this->data;
		}

		$this->getRowId();
		$input = $this->app->getInput();
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('formmodel getData: start') : null;
		$this->data = array();
		$f = InputFilter::getInstance();

		/*
		 * $$$ hugh - we need to remove any elements from the query string,
		 * if the user doesn't have access, otherwise ACL's on elements
can
		 * be bypassed by just setting value on form load query string!
		 *
		 * Also remove all form data if task is form.process, in case some plugin
is trying to reload
		 * form data.
		 */

		$clean_request = $f->clean($_REQUEST, 'array');
		$qs_request = array();

		foreach ($clean_request as $key => $value)
		{
			$test_key = FabrikString::rtrimword($key, '_raw');
			$elementModel = $this->getElement($test_key, false, false);

			if ($elementModel !== false)
			{
				if (!$elementModel->canUse()
					|| $this->app->getInput()->get('task',
'') === 'form.process'
					|| $this->app->getInput()->get('task',
'') === 'process'
					|| $this->hasErrors()
				)
				{
					unset($clean_request[$key]);
				}
				else
				{
					if (is_array($value)) {
						$newValue = [];
						foreach ($value as $key => $item) {
							$newValue[$key] = urldecode($item);
						}
					} else {
						$newValue = urldecode($value);
					}
					$clean_request[$key] = $qs_request[$key] = $newValue;
				}
			}
		}

		$data = $clean_request;
		$form = $this->getForm();
		$this->getGroupsHiarachy();
		JDEBUG ? $profiler->mark('formmodel getData: groups loaded')
: null;

		if (!$form->record_in_database)
		{
			FabrikHelperHTML::debug($data, 'form:getData from $_REQUEST');
			$data = $f->clean($_REQUEST, 'array');
		}
		else
		{
			JDEBUG ? $profiler->mark('formmodel getData: start get list
model') : null;
			$listModel = $this->getListModel();
			JDEBUG ? $profiler->mark('formmodel getData: end get list
model') : null;
			$fabrikDb = $listModel->getDb();
			JDEBUG ? $profiler->mark('formmodel getData: db created') :
null;
			$listModel->getTable();
			JDEBUG ? $profiler->mark('formmodel getData: table row
loaded') : null;
			$this->aJoinObjs = $listModel->getJoins();
			JDEBUG ? $profiler->mark('formmodel getData: joins loaded')
: null;

			if ($this->hasErrors())
			{
				// $$$ hugh - if we're a mambot, reload the form session state we
saved in
				// process() when it banged out.
				if ($this->isMambot)
				{
					$sessionRow = $this->getSessionData();
					$this->sessionModel->last_page = 0;

					if ($sessionRow->data != '')
					{
						$sData = unserialize($sessionRow->data);
						$data = FArrayHelper::toObject($sData, 'stdClass', false);
						OutputFilter::objectHTMLSafe($data);
						$data = array($data);
						FabrikHelperHTML::debug($data, 'form:getData from session (form
in Mambot and errors)');
					}
				}
				else
				{
					// $$$ rob - use setFormData rather than $_GET
					// as it applies correct input filtering to data as defined in article
manager parameters
					$this->setValidationFailedData($this->formData);
					$data = $this->setFormData();
					$data = FArrayHelper::toObject($data, 'stdClass', false);

					// $$$rob ensure "<tags>text</tags>" that are
entered into plain text areas are shown correctly
					OutputFilter::objectHTMLSafe($data);
					$data = ArrayHelper::fromObject($data);
					FabrikHelperHTML::debug($data, 'form:getData from POST (form not
in Mambot and errors)');
				}
			}
			else
			{
				$sessionLoaded = false;

				// Test if its a resumed paged form
				if ($this->saveMultiPage())
				{
					$sessionRow = $this->getSessionData();
					JDEBUG ? $profiler->mark('formmodel getData: session data
loaded') : null;

					if ($sessionRow->data != '')
					{
						$sessionLoaded = true;
						/*
						 * $$$ hugh - this chunk should probably go in setFormData, but
don't want to risk any side effects just now
						 * problem is that later failed validation, non-repeat join element
data is not formatted as arrays,
						 * but from this point on, code is expecting even non-repeat join
data to be arrays.
						 */
						$tmp_data = unserialize($sessionRow->data);

						/*
						$groups = $this->getGroupsHiarachy();

						foreach ($groups as $groupModel)
						{
							if ($groupModel->isJoin() &&
!$groupModel->canRepeat())
							{
								foreach ($tmp_data['join'][$groupModel->getJoinId()]
as &$el)
								{
									$el = array($el);
								}
							}
						}
						*/

						$bits = $data;
						$bits = array_merge($tmp_data, $bits);
						//$data = array(FArrayHelper::toObject($bits));
						$data = $bits;
						FabrikHelperHTML::debug($data, 'form:getData from session (form
not in Mambot and no errors');
					}
				}

				if (!$sessionLoaded)
				{
					/* Only try and get the row data if its an active record
					 * use !== '' as rowid may be alphanumeric.
					 * Unlike 3.0 rowId does equal '' if using rowid=-1 and user
not logged in
					 */
                    $opts = array(
                        'formid' => $this->getId()
                    );
					$useKey = FabrikWorker::getMenuOrRequestVar('usekey',
'', $this->isMambot, 'var', $opts);

					if (!empty($useKey) || $this->rowId !== '')
					{
						// $$$ hugh - once we have a few join elements, our select statements
are
						// getting big enough to hit default select length max in MySQL.
						$listModel->setBigSelects();

						// Otherwise lets get the table record

						/**
						 * $$$ hugh - 11/14/2015 - ran into issue with the order by from a
list being added to the form query, when
						 * rendering a form with a content plugin in a list intro.  And I
don't think we ever need to
						 * apply ordering to a form's select, by definition it's
only one row.  Leaving this here for
						 * now just as a reminder in case there's any unforeseen side
effects.
						 *
						 * $$$ hugh - 4/25/2016 - yes, there is an issue, as (duh!) ordering
is needed for repeat groups.
						 * Changing this back to original for now, will need to work out how
to handle that corner case
						 */
						$opts = $input->get('task') ==
'form.inlineedit' ? array('ignoreOrder' => true) :
array();
						// $opts = array('ignoreOrder' => true);
						$sql = $this->buildQuery($opts);
						$fabrikDb->setQuery($sql);
						FabrikHelperHTML::debug((string) $fabrikDb->getQuery(),
'form:render');
						$rows = $fabrikDb->loadObjectList();

						if (is_null($rows))
						{
//							JError::raiseWarning(500, $fabrikDb->getErrorMsg());
							\Joomla\CMS\Factory::getApplication()->enqueueMessage($fabrikDb->getErrorMsg(),
'error');
						}

						JDEBUG ? $profiler->mark('formmodel getData: rows data
loaded') : null;

						// $$$ rob Ack above didn't work for joined data where there
would be n rows returned for "this rowid = $this->rowId  \n";
						if (!empty($rows))
						{
							// Only do this if the query returned some rows (it wont if usekey
on and userid = 0 for example)
							$data = array();

							foreach ($rows as &$row)
							{
								if (empty($data))
								{
									// If loading in a rowid=-1 set the row id to the actual row id
									$this->rowId = isset($row->__pk_val) ? $row->__pk_val :
$this->rowId;
								}

								$row = empty($row) ? array() : ArrayHelper::fromObject($row);
								$request = $clean_request;
								$request = array_merge($row, $request);
								$data[] = FArrayHelper::toObject($request);
							}

							$this->noData = false;
						}
						else
						{
							$this->noData = true;
						}

						FabrikHelperHTML::debug($data, 'form:getData from querying
rowid= ' . $this->rowId . ' (form not in Mambot and no
errors)');

						// If empty data return and trying to edit a record then show error
						JDEBUG ? $profiler->mark('formmodel getData: empty
test') : null;

						// Was empty($data) but that is never empty. Had issue where list
prefilter meant record was not loaded, but no message shown in form
						if (empty($rows) && $this->rowId != '')
						{
							// $$$ hugh - special case when using -1, if user doesn't have
a record yet
							if ($this->isUserRowId())
							{
							    // set data to just elements that have been set on the qs (and
"cleaned" / ACL checked)
							    $this->data = $qs_request;
								return;
							}
							else
							{
								// If no key found set rowid to 0 so we can insert a new record.
								if (empty($useKey) && !$this->isMambot &&
in_array($input->get('view'), array('form',
'details')))
								{
									$this->rowId = '';
									/**
									 * runtime exception is a little obtuse for people getting here
from legitimate links,
									 * like from an email, but aren't logged in so run afoul of a
pre-filter, etc
									 * So do the 3.0 thing, and raise a warning
									 */
									//throw new
RuntimeException(Text::_('COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE'));
//									JError::raiseWarning(500,
Text::_('COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE'));
									\Joomla\CMS\Factory::getApplication()->enqueueMessage(Text::_('COM_FABRIK_COULD_NOT_FIND_RECORD_IN_DATABASE'),
'warning');
								}
								else
								{
									// If we are using usekey then there's a good possibility
that the record
									// won't yet exist - so in this case suppress this error
message
									$this->rowId = '';
								}
							}
						}
					}

					// No need to setJoinData if you are correcting a failed validation
					if (!empty($data))
					{
						$this->setJoinData($data);
					}
				}

			}
		}

		$this->data = $data;
		FabrikHelperHTML::debug($data, 'form:data');
		JDEBUG ? $profiler->mark('queryselect: getData() end') :
null;

		return $this->data;
	}

	/**
	 * Checks if user is logged in and form multi-page settings to determine
	 * if the form saves to the session table on multi-page navigation
	 *
	 * @param   bool  $useSessionOn  Return true if Session contains
session.on - used in confirmation
	 * plugin to re-show the previously entered form data. Not used in
$this->hasErrors() otherwise logged in users
	 * can not get the confirmation plugin to work
	 *
	 * @return  bool
	 */
	public function saveMultiPage($useSessionOn = true)
	{
		$params = $this->getParams();

		// Set in plugins such as confirmation plugin
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('usesSession', $this,
'form');

		if (in_array(true, $pluginManager->data))
		{
			if ($this->session->get($this->getSessionContext() .
'session.on') == true && $useSessionOn)
			{
				return true;
			}
		}

		$save = (int) $params->get('multipage_save', 0);

		if ($this->user->get('id') !== 0)
		{
			return $save === 0 ? false : true;
		}
		else
		{
			return $save === 2 ? true : false;
		}
	}

	/**
	 * If editing a record which contains repeated join data then on start
$data is an
	 * array with each records being a row in the database.
	 *
	 * We need to take this structure and convert it to the same format as
when the form
	 * is submitted
	 *
	 * @param   array  &$data  form data
	 *
	 * @return  void
	 */
	public function setJoinData(&$data)
	{
		$this->_joinDefaultData = array();

		if (empty($data))
		{
			return;
		}

		// No joins so leave !
		if (!is_array($this->aJoinObjs) || $this->rowId === '')
		{
			return;
		}

		if (!array_key_exists(0, $data))
		{
			$data[0] = new stdClass;
		}

		$groups = $this->getGroupsHiarachy();
		/**
		 * $$$ hugh - adding the "PK's seen" stuff, otherwise we
end up adding multiple
		 * rows when we have multiple repeat groups.  For instance, if we had two
repeated
		 * groups, one with 2 repeats and one with 3, we ended up with 6 repeats
for each
		 * group, with 3 and 2 copies of each respectively.  So we need to track
which
		 * instances of each repeat we have already copied into the main row.
		 *
		 * So $joinPksSeen will be indexed by $joinPksSeen[groupid][elementid]
		 */
		$joinPksSeen = array();
		/**
		 * Have to copy the data for the PK's seen stuff, as we're
modifying the original $data
		 * as we go, which screws up the PK logic once we've modified the PK
value itself in the
		 * original $data.  Probably only needed for $data[0], as that's the
only row we actually
		 * modify, but for now I'm just copying the whole thing, which then
gets used for doing the ...
		 * $joinPkVal = $data_copy[$row_index]->$joinPk;
		 * ... inside the $data iteration below.
		 *
		 * PS, could probably just do a $data_copy = $data, as our usage of the
copy isn't going to
		 * involve nested arrays (which get copied by reference when using =),
but I've been burned
		 * so many times with array copying, I'm going to do a "deep
copy" using serialize/unserialize!
		 */
		$data_copy = unserialize(serialize($data));

		foreach ($groups as $groupId => $groupModel)
		{
			$group = $groupModel->getGroup();
			$joinPksSeen[$groupId] = array();
			$elementModels = $groupModel->getMyElements();

			foreach ($elementModels as $elementModelID => $elementModel)
			{
				if ($groupModel->isJoin() || $elementModel->isJoin())
				{
					if ($groupModel->isJoin())
					{
						$joinModel = $groupModel->getJoinModel();
						$joinPk = $joinModel->getForeignID();
						$joinPksSeen[$groupId][$elementModelID] = array();
					}

					$names = $elementModel->getJoinDataNames();

					foreach ($data as $row_index => $row)
					{
						// Might be a string if new record ?
						$row = (object) $row;

						if ($groupModel->isJoin())
						{
							/**
							 * If the join's PK element isn't published or for any
other reason not
							 * in $data, we're hosed!
							 */
							if (!isset($data_copy[$row_index]->$joinPk))
							{
								continue;
							}

							$joinPkVal = $data_copy[$row_index]->$joinPk;
							/**
							 * if we've seen the PK value for this element's row
before, skip it.
							 * Check for empty as well, just in case - as we're loading
existing data,
							 * it darn well should have a value!
							 */
							if (empty($joinPkVal) || in_array($joinPkVal,
$joinPksSeen[$groupId][$elementModelID]))
							{
								continue;
							}
						}

						for ($i = 0; $i < count($names); $i ++)
						{
							$name = $names[$i];

							if (property_exists($row, $name))
							{
								$v = $row->$name;
								$v = FabrikWorker::JSONtoData($v, $elementModel->isJoin());

								// New record or csv export
								if (!isset($data[0]->$name))
								{
									$data[0]->$name = $v;
								}

								if (!is_array($data[0]->$name))
								{
									if ($groupModel->isJoin() &&
$groupModel->canRepeat())
									{
										$v = array($v);
									}

									$data[0]->$name = $v;
								}
								else
								{
									if ($groupModel->isJoin() &&
$groupModel->canRepeat())
									{
										$n =& $data[0]->$name;
										$n[] = $v;
									}
								}
							}
						}

						if ($groupModel->isJoin())
						{
							/**
							 * Make a Note To Self that we've now handled the data for this
element's row,
							 * and can skip it from now on.
							 */
							$joinPksSeen[$groupId][$elementModelID][] = $joinPkVal;
						}
					}
				}
			}
		}

		// Remove the additional rows - they should have been merged into [0]
above. if no [0] then use main array
		$data = ArrayHelper::fromObject(FArrayHelper::getValue($data, 0, $data));
	}

	/**
	 * Get the forms session data (used when using multi-page forms)
	 *
	 * @return  object	session data
	 */
	protected function getSessionData()
	{
		if (isset($this->sessionData))
		{
			return $this->sessionData;
		}

		$params = $this->getParams();
		$this->sessionModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Formsession',
'FabrikFEModel');
		$this->sessionModel->setFormId($this->getId());
		$this->sessionModel->setRowId($this->rowId);
		$useCookie = (int) $params->get('multipage_save', 0) === 2 ?
true : false;

		if (!$useCookie)
		{
			// In case a plugin is using cookie session (e.g. confirmation plugin)
			$useCookie = $this->sessionModel->canUseCookie();
		}

		$this->sessionModel->useCookie($useCookie);

		$this->sessionData = $this->sessionModel->load();

		return $this->sessionData;
	}

	/**
	 * Create the sql query to get the rows data for insertion into the form
	 *
	 * @param   array  $opts  key: ignoreOrder ignores order by part of query
	 *                        Needed for inline edit, as it only selects
certain fields, order by on a db join element returns 0 results
	 *
	 * @deprecated	use buildQuery() instead
	 *
	 * @return  string	sql query to get row
	 */
	public function _buildQuery($opts = array())
	{
		return $this->buildQuery($opts);
	}

	/**
	 * Create the sql query to get the rows data for insertion into the form
	 *
	 * @param   array  $opts  key: ignoreOrder ignores order by part of query
	 *                        Needed for inline edit, as it only selects
certain fields, order by on a db join element returns 0 results
	 *
	 * @return  string  query
	 */
	public function buildQuery($opts = array())
	{
		if (isset($this->query))
		{
			return $this->query;
		}

		$db = FabrikWorker::getDbo();
		$input = $this->app->getInput();
		$form = $this->getForm();

		if (!$form->record_in_database)
		{
			return;
		}

		$listModel = $this->getListModel();
		$item = $listModel->getTable();
		$sql = $listModel->buildQuerySelect('form');
		$sql .= $listModel->buildQueryJoin();
		$emptyRowId = $this->rowId === '' ? true : false;
		$random = $input->get('random');
        $opts = array(
            'formid' => $this->getId()
        );
		$useKey = FabrikWorker::getMenuOrRequestVar('usekey',
'', $this->isMambot, 'var', $opts);

		if ($useKey != '')
		{
			$useKey = explode('|', $useKey);

			foreach ($useKey as &$tmpK)
			{
				$tmpK = !strstr($tmpK, '.') ? $item->db_table_name .
'.' . $tmpK : $tmpK;
				$tmpK = FabrikString::safeColName($tmpK);
			}

			if (!is_array($this->rowId))
			{
				$aRowIds = explode('|', $this->rowId);
			}
		}

		$comparison = $input->get('usekey_comparison',
'=');
		$viewPk = $input->get('view_primary_key');

		// $$$ hugh - changed this to !==, as in rowid=-1/usekey situations, we
can have a rowid of 0
		// I don't THINK this will have any untoward side effects, but ...
		if ((!$random && !$emptyRowId) || !empty($useKey))
		{
			$sql .= ' WHERE ';

			if (!empty($useKey))
			{
				$sql .= "(";
				$parts = array();

				for ($k = 0; $k < count($useKey); $k++)
				{
					/**
					 *
					 * For gory reasons, we have to assume that an empty string cannot be
a valid rowid
					 * when using usekey, so just create a 1=-1 if it is.
					 */
					if ($aRowIds[$k] === '')
					{
						$parts[] = ' 1=-1';
						continue;
					}
					// Ensure that the key value is not quoted as we Quote() afterwards
					if ($comparison == '=')
					{
						$parts[] = ' ' . $useKey[$k] . ' = ' .
$db->q($aRowIds[$k]);
					}
					else
					{
						$parts[] = ' ' . $useKey[$k] . ' LIKE ' .
$db->q('%' . $aRowIds[$k] . '%');
					}
				}

				$sql .= implode(' AND ', $parts);
				$sql .= ')';
			}
			else
			{
				$sql .= ' ' . $item->db_primary_key . ' = ' .
$db->q($this->rowId);
			}
		}
		else
		{
			if ($viewPk != '')
			{
				$sql .= ' WHERE ' . $viewPk . ' ';
			}
			elseif ($random)
			{
				// $$$ rob Should this not go after prefilters have been applied ?
				$sql .= ' ORDER BY RAND() LIMIT 1 ';
			}
		}
		// Get pre-filter conditions from table and apply them to the record
		// the false, ignores any filters set by the table
		$where = $listModel->buildQueryWhere(false);

		if (strstr($sql, 'WHERE'))
		{
			// Do it this way as queries may contain sub-queries which we want to
keep the where
			$firstWord = StringHelper::substr($where, 0, 5);

			if ($firstWord == 'WHERE')
			{
				$where = StringHelper::substr_replace($where, 'AND', 0, 5);
			}
		}
		// Set rowId to -2 to indicate random record
		if ($random)
		{
			$this->setRowId(-2);
		}

		// $$$ rob ensure that all prefilters are wrapped in brackets so that
		// only one record is loaded by the query - might need to set $word =
and?
		if (trim($where) != '')
		{
			$where = explode(' ', $where);
			$word = array_shift($where);
			$sql .= $word . ' (' . implode(' ', $where) .
')';
		}

		if (!$random && FArrayHelper::getValue($opts,
'ignoreOrder', false) === false)
		{
			// $$$ rob if showing joined repeat groups we want to be able to order
them as defined in the table
			$sql .= $listModel->buildQueryOrder();
		}

		$this->query = $sql;

		return $sql;
	}

	/**
	 * Attempts to determine if the form contains the element
	 *
	 * @param   string  $searchName  Element name to search for
	 * @param   bool    $checkInt    Check search name against element id
	 * @param   bool    $checkShort  Check short element name
	 *
	 * @return  bool  true if found, false if not found
	 */
	public function hasElement($searchName, $checkInt = false, $checkShort =
true)
	{
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getMyElements();

			if (!is_array($groupModel->elements))
			{
				continue;
			}

			foreach ($groupModel->elements as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($checkInt)
				{
					if ($searchName == $element->id)
					{
						$this->currentElement = $elementModel;

						return true;
					}
				}

				if ($searchName == $element->name && $checkShort)
				{
					$this->currentElement = $elementModel;

					return true;
				}

				if ($searchName == $elementModel->getFullName(true, false))
				{
					$this->currentElement = $elementModel;

					return true;
				}

				if ($searchName == $elementModel->getFullName(false, false))
				{
					$this->currentElement = $elementModel;

					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Get an element
	 *
	 * @param   string  $searchName  Name to search for
	 * @param   bool    $checkInt    Check search name against element id
	 * @param   bool    $checkShort  Check short element name
	 *
	 * @return  PlgFabrik_Element  ok: element model not ok: false
	 */
	public function getElement($searchName, $checkInt = false, $checkShort =
true)
	{
		return $this->hasElement($searchName, $checkInt, $checkShort) ?
$this->currentElement : false;
	}

	/**
	 * Set the list model
	 *
	 * @param   object  &$listModel  List model
	 *
	 * @return  void
	 */
	public function setListModel(&$listModel)
	{
		$this->listModel = $listModel;
	}

	/**
	 * Is the page a multi-page form?
	 *
	 * @return  bool
	 */
	public function isMultiPage()
	{
		$groups = $this->getGroupsHiarachy();
        $view =   $this->app->getInput()->get('view',
'form');

		foreach ($groups as $groupModel)
		{
			$params = $groupModel->getParams();

			switch ($params->get('split_page'))
            {
                default:
                case '0':
                    break;
                case '1':
                    return true;
                    break;
                case '2':
                    if ($view === 'form')
                    {
                        return true;
                    }
                    break;
                case '3':
                    if ($view == 'details')
                    {
                        return true;
                    }
                    break;
            }
		}

		return false;
	}

	/**
	 * Get an object of pages, keyed on page counter and containing an array
of the page's group ids
	 *
	 * @return  object
	 */
	public function getPages()
	{
		if (!is_null($this->pages))
		{
			return $this->pages;
		}

		$this->pages = new stdClass;
		$pageCounter = 0;
		$groups = $this->getGroupsHiarachy();
		$c = 0;

		foreach ($groups as $groupModel)
		{
			$params = $groupModel->getParams();

			if ($groupModel->isSplitPage() && $c != 0 &&
$groupModel->canView())
			{
				$pageCounter++;
			}

			if ($groupModel->canView())
			{
				if (!isset($this->pages->$pageCounter))
				{
					$this->pages->$pageCounter = array();
				}

				array_push($this->pages->$pageCounter, $groupModel->getId());
			}

			$c++;
		}

		return $this->pages;
	}

	/**
	 * Should the form submit via ajax or not?
	 *
	 * @return  bool
	 */

	public function isAjax()
	{
		if (is_null($this->ajax))
		{
			$this->ajax =
$this->app->getInput()->getBool('ajax', false);

			// $$$ rob - no element requires AJAX submission!

			/* $groups = $this->getGroupsHiarachy();
			foreach ($groups as $groupModel)
			{
			    $elementModels = $groupModel->getPublishedElements();
			    foreach ($elementModels as $elementModel)
			    {
			        if ($elementModel->requiresAJAXSubmit())
			        {
			            $this->ajax = true;
			        }
			    }
			} */
		}

		return (bool) $this->ajax;
	}

	/**
	 * Used in special case where you have 2 + n-n joins in a single table
	 * In this case the sql query will most likely create four rows of data
for
	 * each combination of possibilities
	 *
	 * E.g.
	 *
	 * tbl classes (id, label)
	 *
	 * left joined to:
	 * tbl student_classes (id, label, student_id)
	 *
	 * left joined to
	 * tbl student_teachers (id, label, teacher_id)
	 *
	 * entering one records with 2 students and 2 teachers gives you 4 rows in
the query
	 *
	 * classid  student_id, teacher_id
	 * 1        1           1
	 * 1        2	          1
	 * 1        1	          2
	 * 1        2           2
	 *
	 * @since   2.0rc1
	 *
	 * @return  void
	 */
	protected function _reduceDataForXRepeatedJoins()
	{
		$groups = $this->getGroupsHiarachy();
		$listModel = $this->getListModel();
		$pkField = '';

		foreach ($groups as $groupModel)
		{
			/**
			 * $$$ hugh - we need to do this for non-repeat joins as well
			 */
			if ($groupModel->isJoin())
			{
				$joinModel = $groupModel->getJoinModel();
				$tblJoin = $joinModel->getJoin();

				// $$$ hugh - slightly modified these lines so we don't create
$this->data['join'] if there is no
				// join data, because that then messes up code subsequent code that
checks for empty($this->data)
				if (!isset($this->data['join']))
				{
					// $this->data['join'] = array();
					return;
				}

				if (!array_key_exists($tblJoin->id,
$this->data['join']))
				{
					continue;
				}

				if ($tblJoin->table_join == '')
				{
					continue;
				}

				$jData = &$this->data['join'][$tblJoin->id];
				$db = $listModel->getDb();
				$fields = $db->getTableColumns($tblJoin->table_join, false);
				$keyCount = 0;
				unset($pkField);

				foreach ($fields as $f)
				{
					if ($f->Key == 'PRI')
					{
						if (!isset($pkField))
						{
							$pkField = $tblJoin->table_join . '___' . $f->Field;
						}

						$keyCount ++;
					}
				}

				if (!isset($pkField))
				{
					$pkField = '';
				}
				/*
				 * Corner case if you link to #__user_profile - its primary key is made
of 2 elements, so
				 * simply checking on the user_id (the first col) will find duplicate
results and incorrectly
				 * merge down.
				 */
				if ($keyCount > 1)
				{
					return;
				}

				$usedKeys = array();

				if (!empty($jData) && array_key_exists($pkField, $jData))
				{
					foreach ($jData[$pkField] as $key => $value)
					{
						/*
						 * $$$rob
						 * added : || ($value === '' &&
!empty($this->errors))
						 * this was incorrectly reducing empty data
						 * when re-viewing form after failed validation
						 * with a form with repeating groups (with empty data in the key
fields
						 *
						 */
						if (!in_array($value, $usedKeys) || ($value === ''
&& !empty($this->errors)))
						{
							$usedKeys[$key] = $value;
						}
					}
				}

				$keysToKeep = array_keys($usedKeys);

				// Remove unneeded data from array
				foreach ($jData as $key => $value)
				{
					foreach ($value as $key2 => $v)
					{
						if (!in_array($key2, $keysToKeep))
						{
							unset($jData[$key][$key2]);
						}
					}
				}
				// Reduce the keys so that we don't have keys of 0, 2
				foreach ($jData as $key => $array)
				{
					if ($groupModel->canRepeat())
					{
						$jData[$key] = array_values($array);
					}
					else
					{
						// $$$ hugh - if it's a one-to-one, it should be a single value
						$aVals = array_values($array);
						$jData[$key] = FArrayHelper::getValue($aVals, 0, '');
					}
				}
			}
		}
	}

	/**
	 * Query all active form plugins to see if they inject custom html into
the top
	 * or bottom of the form
	 *
	 * @return  array  plugin top html, plugin bottom html (inside
<form>) plugin end (after form)
	 */

	public function getFormPluginHTML()
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->getPlugInGroup('form');
		$form = $this->getForm();

		$pluginManager->runPlugins('getBottomContent', $this,
'form');
		$pluginBottom = implode("<br />",
array_filter($pluginManager->data));

		$pluginManager->runPlugins('getTopContent', $this,
'form');
		$pluginTop = implode("<br />",
array_filter($pluginManager->data));

		// Inserted after the form's closing </form> tag
		$pluginManager->runPlugins('getEndContent', $this,
'form');
		$pluginEnd = implode("<br />",
array_filter($pluginManager->data));

		return array($pluginTop, $pluginBottom, $pluginEnd);
	}

	/**
	 * Presuming that our introduction looks like this:
	 *
	 * {new:this is an intro}
	 * {edit:You're editing a record}
	 * some more text
	 *
	 * creating a new form record will show the intro text as:
	 *
	 * this is an intro
	 * some more text
	 *
	 * and editing an existing record will show:
	 *
	 * You're editing a record
	 * some more text
	 *
	 * @return string modified intro
	 */
	public function getIntro()
	{
		$intro = $this->getForm()->intro;

		return $this->parseIntroOutroPlaceHolders($intro);
	}

	/**
	 * Parse into and outro text
	 *
	 * @param   string  $text  Text to parse
	 *
	 * @since   3.0.7
	 *
	 * @return  string
	 */
	public function parseIntroOutroPlaceHolders($text)
	{

		if (empty($text)) return $text;
		
		if (!$this->isEditable())
		{
			$remove = "/{new:\s*.*?}/is";
			$text = preg_replace($remove, '', $text);
			$remove = "/{edit:\s*.*?}/is";
			$text = preg_replace($remove, '', $text);
			$match = "/{details:\s*.*?}/is";
			$text = preg_replace_callback($match, array($this,
'_getIntroOutro'), $text);
		}
		else
		{
			$match = $this->isNewRecord() ? 'new' : 'edit';
			$remove = $this->isNewRecord()  ? 'edit' : 'new';
			$match = "/{" . $match . ":\s*.*?}/is";
			$remove = "/{" . $remove . ":\s*.*?}/is";
			$text = preg_replace_callback($match, array($this,
'_getIntroOutro'), $text);
			$text = preg_replace($remove, '', $text);
			$text = preg_replace("/{details:({(?>[^{}]+|(?1))*})}/is",
'', $text);
			$text = preg_replace("/{details:\s*.*?}/is", '',
$text);
		}

		$this->data['fabrik_view_url'] =
$this->getListModel()->viewDetailsLink($this->data);
		$this->data['fabrik_edit_url'] =
$this->getListModel()->editLink($this->data);

		$w    = new FabrikWorker;
		$text = $w->parseMessageForPlaceHolder($text, $this->data, true);

		// Jaanus: to remove content plugin code from intro and/or outro when
plugins are not processed
		$params = $this->getParams();
		$jPlugins = (int) $params->get('process-jplugins',
'2');

		if ($jPlugins === 0 || ($jPlugins === 2 &&
$this->isEditable()))
		{
			$text = preg_replace("/{\s*.*?}/i", '', $text);
		}

		$text = FabrikString::translate($text);

		return $text;
	}

	/**
	 * Used from getIntro as preg_replace_callback function to strip
	 * undesired text from form label intro
	 *
	 * @param   array  $match  Preg matched strings
	 *
	 * @return  string  intro text
	 */
	private function _getIntroOutro($match)
	{
		$m = explode(":", $match[0]);
		array_shift($m);
		$m = implode(":", $m);
		$m = FabrikString::rtrimword($m, "}");
		$m = preg_replace('/\[(\S+?)\]/', '{${1}}', $m);
		return $m;
	}

	/**
	 * Jaanus: see text above about intro
	 *
	 * @return  string  Outro
	 */
	public function getOutro()
	{
		$params = $this->getParams();
		$outro = $params->get('outro');

		return $this->parseIntroOutroPlaceHolders($outro);
	}

	/**
	 * Get the form's label
	 *
	 * @return  string  Label
	 */
	public function getLabel()
	{
		$label = $this->getForm()->label;

		if (!$this->isEditable())
		{
			return str_replace("{Add/Edit}", '', $label);
		}

		if (!empty($label) && StringHelper::stristr($label,
"{Add/Edit}"))
		{
			$replace = $this->isNewRecord() ? Text::_('COM_FABRIK_ADD')
: Text::_('COM_FABRIK_EDIT');
			$label = str_replace("{Add/Edit}", $replace, $label);
		}

		return Text::_($label);
	}

	/**
	 * Currently only called from listModel _createLinkedForm when copying
existing table
	 *
	 * @TODO should move this to the admin model
	 *
	 * @return  object  Form table
	 */
	public function copy()
	{
		// Array key = old id value new id
		$this->groupidmap = array();
		$input = $this->app->getInput();
		$groupModels = $this->getGroups();
		$this->form = null;
		$form = $this->getTable();
		$form->id = null;

		// $$$ rob newFormLabel set in table copy
		if ($input->get('newFormLabel', '',
'string') !== '')
		{
			$form->label = $input->get('newFormLabel', '',
'string');
		}

		$res = $form->store();
		$newElements = array();

		foreach ($groupModels as $groupModel)
		{
			$oldId = $groupModel->getId();

			// $$$rob use + rather than array_merge to preserve keys
			$groupModel->_newFormid = $form->id;
			$newElements = $newElements + $groupModel->copy();
			$this->groupidmap[$oldId] = $groupModel->getGroup()->id;
		}
		// Need to do finalCopyCheck() on form elements
		$pluginManager = FabrikWorker::getPluginManager();

		// @TODO something not right here when copying a cascading dropdown
element in a join group
		foreach ($newElements as $origId => $newId)
		{
			$plugin = $pluginManager->getElementPlugin($newId);
			$plugin->finalCopyCheck($newElements);
		}
		// Update the model's table to the copied one
		$this->form = $form;
		$this->setId($form->id);
		$this->newElements = $newElements;

		return $form;
	}

	/**
	 * Get the related lists (relations defined by db join foreign keys)
	 *
	 * @return  array  Links to view the related lists
	 */
	public function getRelatedTables()
	{
		$input = $this->app->getInput();
		$links = array();
		$params = $this->getParams();

		if (!$params->get('show-referring-table-releated-data',
false))
		{
			return $links;
		}

		$listModel = $this->getListModel();
		$referringTable =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');

		// $$$ rob - not sure that referring_table is anything other than the
form's table id
		// but for now just defaulting to that if no other variable found (e.g
when links in sef urls)
		$tid = $input->getInt('referring_table',
$input->getInt('listid', $listModel->getTable()->id));
		$referringTable->setId($tid);
		$tableParams = $referringTable->getParams();
		$table = $referringTable->getTable();
		$joinsToThisKey = $referringTable->getJoinsToThisKey();
		$linksToForms = $referringTable->getLinksToThisKey();
		$row = $this->getData();
		$facetedLinks = $tableParams->get('facetedlinks', null);

		if (is_null($facetedLinks))
		{
			return;
		}

		$linkedLists = $facetedLinks->linkedlist;
		$aExisitngLinkedForms = $facetedLinks->linkedform;
		$linkedform_linktype = $facetedLinks->linkedform_linktype;
		$linkedtable_linktype = $facetedLinks->linkedlist_linktype;
		$f = 0;
		$allPks = array();

		foreach ($joinsToThisKey as $joinKey => $element)
		{
			$key = $element->list_id . '-' . $element->form_id .
'-' . $element->element_id;
			$qsKey = $referringTable->getTable()->db_table_name .
'___' . $element->name;
			$val = $input->get($qsKey);

			if ($val == '')
			{
				// Default to row id if we are coming from a main link (and not a
related data link)
				$val = $input->get($qsKey . '_raw', '',
'string');

				if (empty($val))
				{
					$thisKey = $this->getListModel()->getTable()->db_table_name .
'___' . $element->join_key_column . '_raw';
					$val = FArrayHelper::getValue($this->data, $thisKey, $val);

					if (empty($val))
					{
						$val = $input->get('rowid');
					}
				}
			}

			/* $$$ tom 2012-09-14 - If we don't have a key value, get all.  If
we have a key value,
			 * use it to restrict the count to just this entry.
			 */

			$pks = array();

			if (!empty($val))
			{
				$pks[] = $val;
			}

			$allPks[$key] = $pks;

			if (isset($linkedLists->$key) && $linkedLists->$key != 0)
			{
				$recordCounts = $referringTable->getRecordCounts($element, $pks);

				// Jaanus - 18.10.2013 - get correct element fullnames as link keys
				$linkKey = $recordCounts['linkKey'];

				/* $$$ hugh - changed to use _raw as key, see:
				 * http://fabrikar.com/forums/showthread.php?t=20020
				 */

				$linkKeyRaw = $linkKey . '_raw';
				$popUpLink = FArrayHelper::getValue($linkedtable_linktype->$key, $f,
false);
				$count = is_array($recordCounts) && array_key_exists($val,
$recordCounts) ? $recordCounts[$val]->total : 0;
				$label = $facetedLinks->linkedlistheader->$key == '' ?
$element->listlabel : $facetedLinks->linkedlistheader->$key;
				$links[$element->list_id][] = $label . ': ' .
$referringTable->viewDataLink($popUpLink, $element, null, $linkKey,
$val, $count, $f);
			}

			$f++;
		}

		$f = 0;

		// Create columns containing links which point to forms associated with
this table

		foreach ($linksToForms as $element)
		{
			if ($element !== false)
			{
				$key = $element->list_id . '-' . $element->form_id .
'-' . $element->element_id;
				$linkedForm = $aExisitngLinkedForms->$key;
				$popUpLink = $linkedform_linktype->$key;

				if ($linkedForm !== '0')
				{
					if (is_object($element))
					{
						$linkKeyData = $referringTable->getRecordCounts($element,
$allPks[$key]);
						$linkKey = $linkKeyData['linkKey'];
						$val = $input->get($linkKey, '', 'string');

						if ($val == '')
						{
							$qsKey = $referringTable->getTable()->db_table_name .
'___' . $element->name;
							$val = $input->get($qsKey . '_raw',
$input->get('rowid'));
						}

						// Jaanus: when no link to list and no form headers then people still
know where they add data
						$fKey = $facetedLinks->linkedformheader->$key;
						$label = $fKey != '' ? ': ' . $fKey :
(isset($linkedLists->$key) && $linkedLists->$key != 0 ?
'' : ': ' . $element->listlabel);

						// Jaanus: label after add link if no list link helps to make
difference between data view links and only add links.
						$links[$element->list_id][] =
$referringTable->viewFormLink($popUpLink, $element, null, $linkKey,
$val, false, $f) . $label;
					}
				}

				$f++;
			}
		}

		return $links;
	}

	/**
	 * Create the form's html class name.
	 * Based on column counts etc. as to whether form-horizontal applied
	 *
	 * @return  string
	 */
	public function getFormClass()
	{
		return 'fabrikForm';
	}

	/**
	 * Strip out any element names from url qs vars
	 *
	 * @param   string  $url  URL
	 *
	 * @return  string
	 */
	protected function stripElementsFromUrl($url)
	{
		$url = explode('?', $url);

		if (count($url) == 1)
		{
			return $url;
		}

		$filtered = array();
		$bits = explode('&', $url[1]);

		foreach ($bits as $bit)
		{
			$parts = explode('=', $bit);
			$key = $parts[0];
			$key = FabrikString::rtrimword($key, '_raw');

			if (!$this->hasElement($key))
			{
				$filtered[] = implode('=', $parts);
			}
		}

		$url = $url[0] . '?' . implode('&', $filtered);

		return $url;
	}

	/**
	 * Get the url to use as the form's action property
	 *
	 * @return	string	Url
	 */
	public function getAction()
	{
		$option = $this->app->getInput()->get('option');
		$router = $this->app->getRouter();
		$is_sef =
(bool)Factory::getApplication()->getConfig()->get('sef');

		if ($this->app->isClient('administrator'))
		{
			$action = filter_var(ArrayHelper::getValue($_SERVER,
'REQUEST_URI', 'index.php'), FILTER_SANITIZE_URL);
			$action = $this->stripElementsFromUrl($action);
			$action = str_replace("&", "&amp;",
$action);

			return $action;
		}

		if ($option === 'com_fabrik')
		{
			$page = 'index.php?';

			// Get array of all querystring vars
			$uri = JURI::getInstance();

			/**
			 * Was $router->parse($uri);
			 * but if you had a module + form on a page using sef urls and
			 * Joomla's language switcher - calling parse() would re-parse the
url and
			 * mung it well good and proper like.
			 *
			 */
			$queryVars = $router->getVars();

			if ($this->isAjax())
			{
				$queryVars['format'] = 'raw';
				unset($queryVars['view']);
				$queryVars['task'] = 'form.process';
			}

			$qs = array();

			foreach ($queryVars as $k => $v)
			{
				if ($k == 'rowid')
				{
					$v = $this->getRowId();
				}
				/* $$$ hugh - things get weird if we have been passed a urlencoded URL
as a qs arg,
				 * which the $router->parse() above will have urldecoded, and it
gets used as part of the URI path
				 * when we Route::_() below.  So we need to re-urlencode stuff and
junk.
				 * Ooops, make sure it isn't an array, which we'll get if
they have something like
				 * &table___foo[value]=bar
				 */
				if (!is_array($v))
				{
					$v = urlencode($v);
					$qs[] = $k . '=' . $v;
				}
				else
				{
					foreach ($v as $subV)
					{
						$qs[] = $k . '[]=' . urlencode($subV);
					}
				}
			}

			$action = $page . implode("&amp;", $qs);
			$action = Route::_($action);
		}
		else
		{
			// In plugin & SEF URLs
			//J!4 ->getMode() not supported; if ((int) $router->getMode() ===
(int) JROUTER_MODE_SEF) )
			if ($is_sef)
			{
				// $$$ rob if embedding a form in a form, then the embedded form's
url will contain
				// the id of the main form - not sure if its an issue for now
				$action = filter_var(ArrayHelper::getValue($_SERVER,
'REQUEST_URI', 'index.php'), FILTER_SANITIZE_URL);
			}
			else
			{
				// In plugin and no sef (routing dealt with in form controller)
				$action = 'index.php';
			}
		}

		return $action;
	}

	/**
	 * If the group is a joined group we want to ensure that
	 * its id field is contained with in the group's elements
	 *
	 * @param   object  &$groupTable  Group table
	 *
	 * @return	string	HTML hidden field
	 */
	protected function _makeJoinIdElement(&$groupTable)
	{
		$listModel = $this->getListModel();
		$joinId = $this->aJoinGroupIds[$groupTable->id];
		$element = new stdClass;

		// Add in row id for join data
		$element->label = '';
		$element->labels = '';
		$element->error = '';
		$element->value = '';
		$element->id = '';
		$element->startRow = 0;
		$element->endRow = 0;
		$element->errorTag = '';
		$element->column = '';
		$element->className = '';
		$element->containerClass = '';

		foreach ($listModel->getJoins() as $oJoin)
		{
			if ($oJoin->id == $joinId)
			{
				$key = $oJoin->table_join . $this->joinTableElementStep .
$oJoin->table_join_key;

				if (array_key_exists('join', $this->data))
				{
					// $$$ rob if join element is a db join the data $key contains label
and not foreign key value
					if (@array_key_exists($key . '_raw',
$this->data['join'][$joinId]))
					{
						$val = $this->data['join'][$joinId][$key .
'_raw'];
					}
					else
					{
						$val = @$this->data['join'][$joinId][$key];
					}

					if (is_array($val))
					{
						$val = array_key_exists(0, $val) ? $val[0] : '';
					}
				}
				else
				{
					$val = '';
				}

				if ($val == '')
				{
					// Something's gone wrong - lets take the main table's key
					$k = $oJoin->join_from_table . $this->joinTableElementStep .
$oJoin->table_key;
					$val = @$this->data[$k];
				}

				if (is_array($val))
				{
					$val = array_shift($val);
				}

				$element->value = $val;
				$element->element = '<input type="hidden"
id="join.' . $joinId . '.rowid" name="join['
. $joinId . '][rowid]" value="' . $val
					. '" />';
				$element->hidden = true;
				$element->containerClass = 'fabrikElementContainer 
fabrikHide';
			}
		}

		return $element;
	}

	/**
	 * Get an array of read only values
	 *
	 * @return  array
	 */
	public function getreadOnlyVals()
	{
		return $this->readOnlyVals;
	}

	/**
	 * Prepare the elements for rendering
	 *
	 * @param   string  $tmpl  Form template
	 *
	 * @since   3.0
	 *
	 * @return  array
	 */
	public function getGroupView($tmpl = '')
	{
		if (isset($this->groupView))
		{
			return $this->groupView;
		}

		$input = $this->app->getInput();

		// $$$rob - do regardless of whether form is editable as $data is
required for hidden encrypted fields
		// and not used anywhere else (avoids a warning message)
		$data = array();
		/* $$$ rob - 3.0 for some reason just using $this->data was not right
as join data was empty when editing existing record
		 * $$$ hugh - commented this out, as a) running getData() twice is
expensive, and b) it blows away any changes onLoad plugins
		 * make to _data, like the juser plugin
		 * Ran this change for a couple of weeks before committing, seems to work
without it.
		 *unset($this->data);
		 */
		$origData = $this->getData();

		foreach ($origData as $key => $val)
		{
			if (is_string($val))
			{
				$data[$key] = htmlspecialchars($val, ENT_QUOTES);
			}
			else
			{
				// Not sure what the htmlspecialchars is for above but if we don't
assign here we loose join data
				$data[$key] = $val;
			}
		}

		$this->tmplData = $data;
		$this->groupView = array();
		$this->readOnlyVals = array();

		// $$$ hugh - temp foreach fix
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $gkey => $groupModel)
		{
			$groupTable = $groupModel->getGroup();
			$group = $groupModel->getGroupProperties($this);
			$groupParams = $groupModel->getParams();
			$aElements = array();

			// Check if group is actually a table join
			/*
			if (array_key_exists($groupTable->id, $this->aJoinGroupIds))
			{
				$aElements[] = $this->_makeJoinIdElement($groupTable);
			}
			*/

			$repeatGroup = 1;
			$foreignKey = null;
			$startHidden = false;
			$newGroup = false;

			if ($groupModel->canRepeat())
			{
				$joinTable = $groupModel->getJoinModel()->getJoin();
				$foreignKey = '';

				if (is_object($joinTable))
				{
					$repeatGroup = $groupModel->repeatCount();

					if ($groupModel->canEdit() && $repeatGroup === 0)
					{
						$newGroup = true;
						$repeatGroup = 1;
					}

					if (!$groupModel->fkPublished())
					{
						$startHidden = false;
					}
				}
			}
			// Test failed validated forms, repeat group counts are in request
			$repeatGroups = $input->get('fabrik_repeat_group', array(),
'array');

			if (!empty($repeatGroups))
			{
				$repeatGroup = FArrayHelper::getValue($repeatGroups, $gkey,
$repeatGroup);

				if ($repeatGroup == 0)
				{
					$repeatGroup = 1;
					$startHidden = true;
				}

				$newGroup = false;
			}

			$groupModel->repeatTotal = $startHidden ? 0 : $repeatGroup;
			$aSubGroups = array();

			for ($c = 0; $c < $repeatGroup; $c++)
			{
				$aSubGroupElements = array();
				$elCount = 0;
				$elementModels = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					/* $$$ rob ensure that the element is associated with the correct form
(could occur if n plugins rendering form
					 * and detailed views of the same form.
					 */
					$elementModel->setFormModel($this);
					$elementModel->tmpl = $tmpl;
					$elementModel->newGroup = $newGroup;

					/* $$$rob test don't include the element in the form is we
can't use and edit it
					 * test for captcha element when user logged in
					 */
					if (!$this->isEditable())
					{
						$elementModel->inDetailedView = true;
					}

					if (!$this->isEditable() && !$elementModel->canView())
					{
						continue;
					}

					$elementModel->_foreignKey = $foreignKey;
					$elementModel->_repeatGroupTotal = $repeatGroup - 1;
					$element = $elementModel->preRender($c, $elCount, $tmpl);

					// $$$ hugh - experimenting with adding non-viewable, non-editable to
encrypted vars
					// if (!$element || ($elementModel->canView() &&
!$elementModel->canUse()))
					if (!$element || !$elementModel->canUse())
					{
						/* $$$ hugh - $this->data doesn't seem to always have what we
need in it, but $data does.
						 * can't remember exact details, was chasing a nasty issue with
encrypted 'user' elements.
						 */

						// $$$ rob HTMLName seems not to work for joined data in confirmation
plugin
						$elementModel->getValuesToEncrypt($this->readOnlyVals, $data,
$c);
						/**
						 * $$$ hugh - need to decode it if it's a string, 'cos we
encoded $data up there ^^ somewhere, which
						 * then causes read only data to get changed to htmlencoded after
submission.  See this thread for gory details:
						 *
http://fabrikar.com/forums/index.php?threads/how-to-avoid-changes-to-an-element-with-a-read-only-link.37656/#post-192437
						 */
						$elName = $elementModel->getFullName(true, false);

						if (!is_array($this->readOnlyVals[$elName]['data']))
						{
							$this->readOnlyVals[$elName]['data'] =
htmlspecialchars_decode($this->readOnlyVals[$elName]['data']);
						}

						$this->readOnlyVals[$elName]['repeatgroup'] =
$groupModel->canRepeat();
						$this->readOnlyVals[$elName]['join'] =
$groupModel->isJoin();
					}

					if ($element)
					{
						$elementModel->stockResults($element, $aElements, $this->data,
$aSubGroupElements);
					}

					if ($element && !$element->hidden)
					{
						$elCount++;
					}
				}
				// If its a repeatable group put in subgroup
				if ($groupModel->canRepeat())
				{
					// Style attribute for group columns (need to occur after
randomisation of the elements otherwise clears are not ordered correctly)
					$rowix = -1;

					foreach ($aSubGroupElements as $elKey => $element)
					{
						$rowix = $groupModel->setColumnCss($element, $rowix);
					}

					$aSubGroups[] = $aSubGroupElements;
				}
			}

			$groupModel->randomiseElements($aElements);

			// Style attribute for group columns (need to occur after randomisation
of the elements otherwise clears are not ordered correctly)
			$rowix = -1;

			// Don't double setColumnCss otherwise weirdness ensues
			if (!$groupModel->canRepeat())
			{
				foreach ($aElements as $elKey => $element)
				{
					$rowix = $groupModel->setColumnCss($element, $rowix);
				}
			}

			$group->elements = $aElements;
			$group->subgroups = $aSubGroups;
			$group->startHidden = $startHidden;
			$group->repeatIntro = $groupParams->get('repeat_intro',
'');

			$group->classArray[] = 'fabrikGroup';
			$group->class = implode(' ', $group->classArray);
			$group->newGroup = $newGroup;

			// Only create the group if there are some element inside it
			if (count($aElements) != 0 && $groupModel->canView() !==
false)
			{
				// 28/01/2011 $$$rob and if it is published
				$showGroup = (int)
$groupParams->get('repeat_group_show_first');

				if ($showGroup !== 0)
				{
					// $$$ - hugh - testing new 'hide if no usable elements'
option (4)
					// Jaanus: if not form view with "details only" option and
not details view with "form only" option
					if (!($showGroup == 2 && $this->isEditable()) &&
!($showGroup == 3 && $input->get('view',
'form') == 'details')
						&& !($showGroup == 4 && !$groupModel->canView()))
					{
						$this->groupView[$group->name] = $group;
					}
				}
			}
		}

		return $this->groupView;
	}

	/**
	 * Get any fabrik tables that link to the join table
	 *
	 * @param   string  $table  Table name
	 *
	 * @return  array
	 */
	public function getLinkedFabrikLists($table)
	{
		if (!isset($this->linkedFabrikLists))
		{
			$this->linkedFabrikLists = array();
		}

		if (!array_key_exists($table, $this->linkedFabrikLists))
		{
			$db = FabrikWorker::getDbo(true);

			if (trim($table == ''))
			{
				return array();
			}
			else
			{
				$query = $db->getQuery(true);
				$query->select('*')->from('#__fabrik_lists')->where('db_table_name
= ' . $db->q($table));
				$db->setQuery($query);
			}

			$this->linkedFabrikLists[$table] = $db->loadColumn();
		}

		return $this->linkedFabrikLists[$table];
	}

	/**
	 * Used to see if something legitimate in the submission process, like a
form plugin,
	 * has modified an RO element value and wants to override the RO/origdata.
	 *
	 * If $value is set, then this method additionally adds the modified value
to the updated array.
	 *
	 * @param   string  $fullname  Full element name
	 * @param   mixed   $value     Optional value, states that a plugin update
the readonly value of $fullname
	 *
	 * @return bool
	 */
	public function updatedByPlugin($fullname = '', $value = null)
	{
		if (isset($value))
		{
			$this->pluginUpdatedElements[$fullname] = $value;
		}

		return array_key_exists($fullname, $this->pluginUpdatedElements);
	}

	/**
	 * Populate the Model state
	 *
	 * @return  void
	 */
	protected function populateState()
	{
		$input = $this->app->getInput();

		if (!$this->app->isClient('administrator'))
		{
			// Load the menu item / component parameters.
			$params = $this->app->getParams();
			$this->setState('params', $params);

			// Load state from the request.
			$pk = $input->getInt('formid',
$params->get('formid'));
		}
		else
		{
			$pk = $input->getInt('formid');
		}

		$this->setState('form.id', $pk);
	}

	/**
	 * Is the form editable
	 *
	 * @return  bool
	 */
	public function isEditable()
	{
		return $this->editable;
	}

	/**
	 * Set editable state
	 *
	 * @param   bool  $editable  Editable state
	 *
	 * @since 3.0.7
	 *
	 * @return  void
	 */
	public function setEditable($editable)
	{
		$this->editable = $editable;
	}

	/**
	 * Helper method to get the session redirect key. Redirect plugin stores
this
	 * other form plugins such as twitter or Paypal may need to query the
session to perform the final redirect
	 * once the user has returned from those sites.
	 *
	 * @return  string  Session key to store redirect information (note: ends
in '.')
	 */
	public function getRedirectContext()
	{
		return 'com_fabrik.form.' . $this->getId() .
'.redirect.';
	}

	/**
	 * Resets cached form data.
	 *
	 * @param   bool  $unset_groups  Also reset group and element model cached
data
	 *
	 * @return  void
	 */
	public function unsetData($unset_groups = false)
	{
		unset($this->data);
		unset($this->query);

		if ($unset_groups)
		{
			/* $$$ hugh - unset group published elements list, and clear each
			 * element's default data.  Needed from content plugin, otherwise
if
			 * we render the same form more than once with different rowids, we end
up
			 * rendering the first copy's element data X times.
			 * Not sure if we need to actually unset the group published elements
list,
			 * but for the moment I'm just using a Big Hammer to get the
content plugin working!
			 */
			$groups = $this->getGroupsHiarachy();

			foreach ($groups as $groupModel)
			{
				$groupModel->resetPublishedElements();
				$elementModels = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					$elementModel->reset();
				}
			}

			unset($this->groups);
			$pluginManager = FabrikWorker::getPluginManager();
			$pluginManager->clearFormPlugins($this);
		}
	}

	/**
	 * Reset form's cached data, i.e. from content plugin, where we may
be rendering the same
	 * form twice, with different row data.
	 *
	 * @return  void
	 */
	public function reset()
	{
		$this->unsetData(true);
	}

	/**
	 * Get redirect URL
	 *
	 * @param   bool  $incSession  Set url in session?
	 * @param   bool  $isMambot    Is Mambot
	 *
	 * @return   array  url: string  Redirect url, baseRedirect (True: default
redirect, False: plugin redirect)
	 *
	 * @since 3.0.6 (was in form controller)
	 */
	public function getRedirectURL($incSession = true, $isMambot = false)
	{
		$input = $this->app->getInput();

		if ($this->app->isClient('administrator'))
		{
			// Admin always uses option com_fabrik
			if (array_key_exists('apply', $this->formData))
			{
				$url =
'index.php?option=com_fabrik&task=form.view&formid=' .
$input->getInt('formid') . '&rowid=' .
$input->getString('rowid', '', 'string');
			}
			else
			{
				$url =
'index.php?option=com_fabrik&task=list.view&listid=' .
$this->getListModel()->getId();
			}
		}
		else
		{
			if (array_key_exists('apply', $this->formData))
			{
				$url =
'index.php?option=com_fabrik&view=form&formid=' .
$input->getInt('formid') . '&rowid=' .
$input->getString('rowid', '', 'string')
					. '&listid=' . $input->getInt('listid');
				$itemId = (int) FabrikWorker::itemId();
				if ($itemId !== 0)
					$url = $url . '&Itemid=' . $itemId;
			}
			else
			{
				if ($isMambot)
				{
					// Return to the same page
					$url = filter_var(ArrayHelper::getValue($_SERVER,
'HTTP_REFERER', 'index.php'), FILTER_SANITIZE_URL);
				}
				else
				{
					// Return to the page that called the form
					$url = urldecode($input->post->get('fabrik_referrer',
'index.php', 'string'));
				}

				$itemId = (int) FabrikWorker::itemId();

				if ($url == '')
				{
					if ($itemId !== 0)
					{
						$url = 'index.php?' .
http_build_query($this->app->getMenu('site')->getActive()->query)
. '&Itemid=' . $itemId;
					}
					else
					{
						// No menu link so redirect back to list view
						$url =
'index.php?option=com_fabrik&view=list&listid=' .
$input->getInt('listid');
					}
				}
			}

			if ($this->config->get('sef'))
			{
				$url = Route::_($url);
			}
		}
		// 3.0 need to distinguish between the default redirect and redirect
plugin
		$baseRedirect = true;

		if (!$incSession)
		{
			return array('url' => $url, 'baseRedirect' =>
$baseRedirect);
		}

		$formdata = $this->session->get('com_fabrik.form.data');
		$context = $this->getRedirectContext();

		// If the redirect plug-in has set a url use that in preference to the
default url
		$sUrl = $this->session->get($context . 'url', array());

		if (!empty($sUrl))
		{
			$baseRedirect = false;
		}

		if (!is_array($sUrl))
		{
			$sUrl = array($sUrl);
		}

		if (empty($sUrl))
		{
			$sUrl[] = $url;
		}

		$url = array_shift($sUrl);
		$this->session->set($context . 'url', $sUrl);

		// Redirect URL which set prefilters of < were converted to &lt;
which then gave mySQL error
		$url = htmlspecialchars_decode($url);

		return array('url' => $url, 'baseRedirect' =>
$baseRedirect);
	}

	/**
	 * Should we show success messages
	 *
	 * @since  3.0.7
	 *
	 * @return boolean
	 */
	public function showSuccessMsg()
	{
		$mode = $this->getParams()->get('suppress_msgs',
'0');

		return ($mode == 0 || $mode == 2);
	}

	/**
	 * Get the success message
	 *
	 * @return  string
	 */
	public function getSuccessMsg()
	{
		$registry = $this->session->get('registry');

		// $$$ rob 30/03/2011 if using as a search form don't show record
added message
		if ($registry &&
$registry->get('com_fabrik.searchform.fromForm') !=
$this->get('id'))
		{
			if (!$this->showSuccessMsg())
			{
				return '';
			}

			$params = $this->getParams();

			return Text::_($params->get('submit-success-msg',
'COM_FABRIK_RECORD_ADDED_UPDATED'));
		}
		else
		{
			return '';
		}
	}

	/**
	 * Should we show ACL messages
	 *
	 * @since  3.0.7
	 *
	 * @return boolean
	 */
	public function showACLMsg()
	{
		$mode = $this->getParams()->get('suppress_msgs',
'0');

		return $mode == 0 || $mode == 1;
	}

	/**
	 * If trying to add/edit a record when the user doesn't have rights
to do so,
	 * what message, if any should we show.
	 *
	 * @param  bool  $force  if true don't check if messages suppressed
	 *
	 * @since  3.0.7
	 *
	 * @return string
	 */
	public function aclMessage($force = false)
	{
		if (!$force && !$this->showACLMsg())
		{
			return '';
		}

		$input = $this->app->getInput();
		$msg = $input->get('rowid', '',
'string') == 0 ? 'COM_FABRIK_NOTICE_CANT_ADD_RECORDS' :
'COM_FABRIK_NOTICE_CANT_EDIT_RECORDS';

		return Text::_($msg);
	}

	/**
	 * Say a form is embedded in an article, and is set to redirect on
same/new page (so not in popup)
	 * Then we need to grab and re-apply the redirect/thanks message
	 *
	 * @return  void
	 */
	public function applyMsgOnce()
	{
		if (!$this->app->getInput()->get('isMambot'))
		{
			// Don't apply if not isMambot
			return;
		}

		// Proceed, isMambot set in PlgFabrik_FormRedirect::buildJumpPage()
		$context = $this->getRedirectContext();
		$msg = $this->session->get($context . 'msg', array());

		if (!empty($msg))
		{
			$msg = FArrayHelper::getValue($msg, 0);
			$this->app->enqueueMessage($msg);
		}
		// Ensure its only shown once even if page is refreshed with isMambot in
querystring
		$this->session->clear($context . 'msg');
	}

	/**
	 * Get redirect message
	 *
	 * @return  string  Redirect message
	 *
	 * @since   3.0.6 (was in form controller)
	 */
	public function getRedirectMessage()
	{
		if (!$this->showSuccessMsg())
		{
			return '';
		}

		$msg = $this->getSuccessMsg();
		$context = $this->getRedirectContext();
		$sMsg = $this->session->get($context . 'msg',
array($msg));

		if (!is_array($sMsg))
		{
			$sMsg = array($sMsg);
		}

		if (empty($sMsg))
		{
			$sMsg[] = $msg;
		}

		/**
		 * $$$ rob Was using array_shift to set $msg, not to really remove it
from $sMsg
		 * without the array_shift the custom message is never attached to the
redirect page.
		 * Use-case: redirect plugin with jump page pointing to a J page and
thanks message selected.
		 */
		$customMsg = array_keys($sMsg);
		$customMsg = array_shift($customMsg);
		$customMsg = FArrayHelper::getValue($sMsg, $customMsg);

		if ($customMsg != '')
		{
			$msg = $customMsg;
		}

		$q = $this->app->getMessageQueue();
		$found = false;

		foreach ($q as $m)
		{
			// Custom message already queued - unset default msg
			if ($m['type'] == 'message' &&
trim($m['message']) !== '')
			{
				$found = true;
				break;
			}
		}

		if ($found)
		{
			$msg = null;
		}

		$showMsg = null;
		$this->session->set($context . 'msg', $sMsg);
		$showMsg = (array) $this->session->get($context .
'showsystemmsg', array(true));

		if (is_array($showMsg))
		{
			$showMsg = array_shift($showMsg);
		}

		$msg = $showMsg == 1 ? $msg : '';

		// $$$ hugh - testing allowing placeholders in success msg
		$w = new FabrikWorker;
		$msg = $w->parseMessageForPlaceHolder($msg, $this->data);

		return $msg;
	}

	/**
	 * Build the JS key that the model uses in the view. This key is assigned
to Fabrik.blocks
	 *
	 * @since   3.1rc1
	 *
	 * @return  string
	 */
	public function jsKey()
	{
		$key = $this->isEditable() ? 'form_' . $this->getId() :
'details_' . $this->getId();

		if ($this->getRowId() != '')
		{
			$key .= '_' . $this->getRowId();
		}

		return $key;
	}

	/**
	 * Ask all elements to add their js Fabrik.jLayouts to the framework
	 * This has to be done before we call FabrikHelperHTML::framework();
	 *
	 * @return void;
	 */
	public function elementJsJLayouts()
	{
		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elementModel->jsJLayout();
			}
		}
	}

	/**
	 * Get a subset of the model's data with non accessible values
removed
	 *
	 * @param   string  $view  View
	 *
	 * @return  array data
	 */
	public function accessibleData($view = 'form')
	{
		$accessibleData = $this->data;

		$groups = $this->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				switch ($view)
				{
					default:
					case 'form':
						$accessible = $elementModel->canUse($view);
						break;
					case 'details':
						$accessible = $elementModel->canView('form');
						break;
					case 'list':
						$accessible = $elementModel->canView('list');
						break;
				}

				if (!$accessible)
				{
					$name = $elementModel->getFullName(true, false);
					unset($accessibleData[$name]);
					unset($accessibleData[$name . '_raw']);
				}
			}
		}

		return $accessibleData;
	}


	/**
	 * Get a form LayoutInterface file
	 *
	 * @param   string  $name     layout name
	 * @param   array   $paths    Optional paths to add as includes
	 * @param   array   $options  Options
	 *
	 * @return LayoutFile
	 */
	public function getLayout($name, $paths = array(), $options = array())
	{
		$view = $this->isEditable() ? 'form' : 'details';
		$paths[] = COM_FABRIK_FRONTEND . '/views/'. $view .
'/tmpl/' . $this->getTmpl() . '/layouts';
		$layout  = FabrikHelperHTML::getLayout($name, $paths, $options);

		return $layout;
	}

	public function recordInDatabase()
	{
		$form = $this->getForm();

		return $form->record_in_database === '1';
	}
}
models/formgroup.php000064400000001061151165347410010565 0ustar00<?php
/**
 * Fabrik Form Group Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Model\BaseDatabaseModel;

jimport('joomla.application.component.model');

/**
 * Fabrik Form Group Model
 *
 * @package     Fabrik
 * @since       3.0
 * @deprecated  Not used
 */
class FabrikFEModelFormGroup extends BaseDatabaseModel
{
}
models/forminlineedit.php000064400000013226151165347410011563
0ustar00<?php
/**
 * Fabrik Inline Edit Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Factory;

jimport('joomla.application.component.model');
require_once 'fabrikmodelform.php';

/**
 * Fabrik Form Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikFEModelFormInlineEdit extends FabModelForm
{
	/**
	 * @var FabrikFEModelForm
	 */
	protected $formModel;

	/**
	 * Render the inline edit interface
	 *
	 * @return void
	 */
	public function render()
	{
		$this->formModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Form',
'FabrikFEModel');
		$input = $this->app->getInput();

		// Need to render() with all element ids in case canEditRow plugins etc.
use the row data.
		$elids = $input->get('elementid', array(),
'array');
		$input->set('elementid', null);

		$this->formModel->render();

		// Set back to original input so we only show the requested elements
		$input->set('elementid', $elids);
		$this->groups = $this->formModel->getGroupView();

		// Main trigger element's id
		$elementId = $input->getInt('elid');

		$html = $this->inlineEditMarkUp();
		echo implode("\n", $html);

		$srcs = array();
		$repeatCounter = 0;
		$elementIds = (array) $input->get('elementid', array(),
'array');
		$eCounter = 0;
		$onLoad = array();
		$onLoad[] = "Fabrik.inlineedit_$elementId = {'elements':
{}};";

		foreach ($elementIds as $id)
		{
			$elementModel = $this->formModel->getElement($id, true);
			$elementModel->getElement();
			$elementModel->setEditable(true);
			$elementModel->formJavascriptClass($srcs);
			$elementJS = $elementModel->elementJavascript($repeatCounter);
			$onLoad[] = 'var o = new ' . $elementJS[0] .
'("' . $elementJS[1] . '",' .
json_encode($elementJS[2]) . ');';

			if ($eCounter === 0)
			{
				$onLoad[] = "o.select();";
				$onLoad[] = "o.focus();";
				$onLoad[] = "Fabrik.inlineedit_$elementId.token = '" .
Session::getFormToken() . "';";
			}

			$eCounter++;
			$onLoad[] = "Fabrik.inlineedit_$elementId.elements[$id] = o";
		}

		$onLoad[] =
"Fabrik.fireEvent('fabrik.list.inlineedit.setData');";
		FabrikHelperHTML::script($srcs, implode("\n", $onLoad));
	}

	/**
	 * Create markup for bootstrap inline editor
	 *
	 * @since   3.1b
	 *
	 * @return  array
	 */
	protected function inlineEditMarkUp()
	{
		// @TODO LayoutInterface this
		$input = $this->app->getInput();
		$html = array();
		$html[] = '<div class="modal">';
		$html[] = ' <div
class="modal-header"><h3>' .
Text::_('COM_FABRIK_EDIT') . '</h3></div>';
		$html[] = '<div class="modal-body">';
		$html[] = '<form>';

		foreach ($this->groups as $group)
		{
			foreach ($group->elements as $element)
			{
				$html[] = '<div class="control-group
fabrikElementContainer ' . $element->id . '">';
				$html[] = '<label>' . $element->label .
'</label>';
//				$html[] = '<div
class="fabrikElement'.$element->bsClass'">';
				$html[] = '<div class="fabrikElement
'.$element->bsClass.'">';
				$html[] = $element->element;
				$html[] = '</div>';
				$html[] = '</div>';
			}
		}

		$html[] = '</form>';
		$html[] = '</div>';
		$thisTmpl = isset($this->tmpl) ? $this->tmpl : '';

		if ($input->getBool('inlinesave') ||
$input->getBool('inlinecancel'))
		{
			$html[] = '<div class="modal-footer">';

			if ($input->getBool('inlinecancel') == true)
			{
				$html[] = '<a href="#" class="btn
inline-cancel">';
				$html[] = FabrikHelperHTML::image('delete.png',
'list', $thisTmpl, array('alt' =>
Text::_('COM_FABRIK_CANCEL')));
				$html[] = '<span>' .
Text::_('COM_FABRIK_CANCEL') .
'</span></a>';
			}

			if ($input->getBool('inlinesave') == true)
			{
				$html[] = '<a href="#" class="btn btn-primary
inline-save">';
				$html[] = FabrikHelperHTML::image('save.png',
'list', $thisTmpl, array('alt' =>
Text::_('COM_FABRIK_SAVE')));
				$html[] = '<span>' .
Text::_('COM_FABRIK_SAVE') . '</span></a>';
			}

			$html[] = '</div>';
		}

		$html[] = '</div>';

		return $html;
	}
	/**
	 * Set form model
	 *
	 * @param   JModel  $model  Front end form model
	 *
	 * @return  void
	 */
	public function setFormModel($model)
	{
		$this->formModel = $model;
	}

	/**
	 * Inline edit show the edited element
	 *
	 * @return string
	 */
	public function showResults()
	{
		$input = $this->app->getInput();
		$listModel = $this->formModel->getListModel();
		$listId = $listModel->getId();
		$listModel->clearCalculations();
		$listModel->doCalculations();
		$elementId = $input->getInt('elid');

		if ($elementId === 0)
		{
			return;
		}

		$elementModel = $this->formModel->getElement($elementId, true);

		if (!$elementModel)
		{
			return;
		}

		$rowId = $input->get('rowid');
		$listModel->setId($listId);

		// If the inline edit stored a element join we need to reset back the
table
		$listModel->clearTable();
		$listModel->getTable();
		$data = $listModel->getRow($rowId);

		// For a change in the element which means its no longer shown in the
list due to pre-filter. We may want to remove the row from the list as
well?
		if (!is_object($data))
		{
			$data = new stdClass;
		}

		$key = $input->get('element');
		$html = '';
		$html .= $elementModel->renderListData($data->$key, $data);
		$listRef = 'list_' . $input->get('listref');
		$doCalcs = "\nFabrik.blocks['" . $listRef .
"'].updateCals(" .
json_encode($listModel->getCalculations()) . ")";
		$html .= '<script type="text/javascript">';
		$html .= $doCalcs;
		$html .= "</script>\n";

		return $html;
	}
}models/formsession.php000064400000021545151165347410011125
0ustar00<?php
/**
 * Fabrik Form Session Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Crypt\Crypt;
use Joomla\Crypt\Key;
use Joomla\CMS\Crypt\Cipher\CryptoCipher;
use Joomla\CMS\Application\ApplicationHelper;

jimport('joomla.application.component.model');

/**
 * Fabrik Form Session Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikFEModelFormsession extends FabModel
{
	/**
	 * User id
	 *
	 * @var int
	 */
	protected $userId = null;

	/**
	 * Unique reference for the form session
	 *
	 * @var string
	 */
	protected $hash = null;

	/**
	 * Form id
	 *
	 * @var int
	 */
	protected $formId = null;

	/**
	 * Row id
	 *
	 * @var string
	 */
	protected $rowId = null;

	/**
	 * Status message
	 *
	 * @var string
	 */
	public $status = null;

	/**
	 * Status id
	 *
	 * @var int
	 */
	protected $statusId = null;

	/**
	 * Formsession row
	 *
	 * @var Table
	 */
	public $row = null;

	/**
	 * Should the form store a cookie with
	 * a reference to the incomplete form data
	 *
	 * @var bool
	 */
	protected $useCookie = true;

	/**
	 * cryptor
	 *
	 * @var object
	 */
	protected $crypt = null;

	/**
	 * Constructor
	 */
	public function __construct()
	{
		if (!defined('_FABRIKFORMSESSION_LOADED_FROM_COOKIE'))
		{
			define('_FABRIKFORMSESSION_LOADED_FROM_COOKIE', 1);
			define('_FABRIKFORMSESSION_LOADED_FROM_TABLE', 2);
		}

		parent::__construct();
	}

	/**
	 * Save the form data to #__fabrik_form_session
	 *
	 * @param   object  &$formModel  form model
	 *
	 * @return  null
	 */
	public function savePage(&$formModel)
	{
		// Need to check for encrypted vars, unencrypt them and place them back
in the array
		$post = $formModel->setFormData();
		$input = $this->app->getInput();
		$formModel->copyToRaw($post);
		$formModel->addEncrytedVarsToArray($post);

		$pluginManager = FabrikWorker::getPluginManager();
		if (in_array(false, $pluginManager->runPlugins('onSavePage',
$formModel)))
		{
			return false;
		}

		if (array_key_exists('fabrik_vars', $post))
		{
			unset($post['fabrik_vars']);
		}

		$data = serialize($post);
		$hash = $this->getHash();
		$row = $this->load();
		$row->hash = $hash;
		$row->user_id = (int) $this->user->get('id');
		$row->form_id = $this->getFormId();
		$row->row_id = $this->getRowId();
		$row->last_page = $input->get('page');
		$row->referring_url =
$input->server->get('HTTP_REFERER', '',
'string');
		$row->data = $data;
		$this->setCookie($hash);

		if (!$row->store())
		{
			echo $row->getError();
		}

		// $$$ hugh - if we're saving the formdata in the session, we should
set 'session.on'
		// as per The New Way we're doing redirects, etc.
		$this->session->set('com_' . $this->package .
'.form.' . $this->getFormId() . '.session.on',
true);
	}

	/**
	 * Set the form session cookie
	 *
	 * @param   string  $hash  the actual key that is stored in the db
table's hash field
	 *
	 * @return  null
	 */
	public function setCookie($hash)
	{
		if ($this->canUseCookie() === false)
		{
			return;
		}

		$crypt = $this->getCrypt();
		$lifetime = time() + 365 * 24 * 60 * 60;
		$key = (int) $this->user->get('id') . ':' .
$this->getFormId() . ':' . $this->getRowId();
		$rcookie = $crypt->encrypt($hash);
		setcookie($key, $rcookie, $lifetime, '/');
	}

	/**
	 * Remove the form session cookie
	 *
	 * @return  null
	 */
	protected function removeCookie()
	{
		$lifetime = time() - 99986400;
		$key = (int) $this->user->get('id') . ':' .
$this->getFormId() . ':' . $this->getRowId();
		setcookie($key, false, $lifetime, '/');
	}

	/**
	 * Create the crypt class object
	 *
	 * @return  JSimpleCrypt
	 */
	protected function getCrypt()
	{
		/**
		 * $$$ hugh - might want to alter this to use FabrikWorker::getCrypt()
		 * as we now use that everywhere else.
		 * $$$ trob - did it
		 */

		if (!isset($this->crypt))
		{
/*			jimport('joomla.utilities.simplecrypt');
			jimport('joomla.utilities.utility');

			// Create the encryption key, apply extra hardening using the user agent
string

			$key =
ApplicationHelper::getHash($this->app->getInput()->server->get('HTTP_USER_AGENT'));
			$key = new Key('simple', $key, $key);
			$this->crypt = new Crypt(new CryptoCipher, $key);
*/
			$this->crypt = FabrikWorker::getCrypt();
		}

		return $this->crypt;
	}

	/**
	 * Set use cookie
	 *
	 * @param   bool  $bol  set use cookie true/false
	 *
	 * @return  void
	 */
	public function useCookie($bol)
	{
		$this->useCookie = $bol;
	}

	/**
	 * Load in the saved session
	 *
	 * @return object session table row
	 */
	public function load()
	{
		$row = $this->getTable('Formsession',
'FabrikTable');
		$row->data = '';
		$hash = '';

		if ((int) $this->user->get('id') !== 0)
		{
			$hash = $this->getHash();
			$this->status = Text::_('LOADING FROM DATABASE');
			$this->statusId = _FABRIKFORMSESSION_LOADED_FROM_TABLE;
		}
		else
		{
			if ($this->canUseCookie())
			{
				$crypt = $this->getCrypt();
				$cookieKey = $this->getCookieKey();
				$cookieVal = FArrayHelper::getValue($_COOKIE, $cookieKey,
'');

				if ($cookieVal !== '')
				{
					$this->status =
Text::_('COM_FABRIK_LOADING_FROM_COOKIE');
					$this->statusId = _FABRIKFORMSESSION_LOADED_FROM_COOKIE;
					$hash = $crypt->decrypt($cookieVal);
				}
			}
		}

		if ($hash !== '')
		{
			// No point loading it if the hash is empty
			$row->load(array('hash' => $hash));
		}

		if (is_null($row->id))
		{
			$row->last_page = 0;
			$row->data = '';
		}

		$this->last_page = $row->last_page;
		$this->row = $row;

		return $row;
	}

	/**
	 * Get the cookie name
	 *
	 * @since 2.0.4
	 *
	 * @return  string
	 */
	protected function getCookieKey()
	{
		$key = (int) $this->user->get('id') . ':' .
$this->getFormId() . ':' . $this->getRowId();

		return $key;
	}

	/**
	 * If a plug has set a session var com_fabrik.form.X.session.on then we
should be
	 * using the session cookie, see form confirmation plugin for this in use
	 *
	 * @since 2.0.4
	 *
	 * @return  bool
	 */
	public function canUseCookie()
	{
		$formId = $this->getFormId();

		if ($this->session->get('com_' . $this->package .
'.form.' . $formId . '.session.on'))
		{
			return true;
		}

		return $this->useCookie;
	}

	/**
	 * Remove the saved session
	 *
	 * @return  bool
	 */

	public function remove()
	{
		// $$$ hugh - need to clear the 'session.on'.  If we're
zapping the stored
		// session form data, doesn't matter who or what set
'session.on' ... it ain't there any more.
		$this->session->clear('com_' . $this->package .
'.form.' . $this->getFormId() . '.session.on');
		$row = $this->getTable('Formsession',
'FabrikTable');
		$hash = '';

		if ((int) $this->user->get('id') !== 0)
		{
			$hash = $this->getHash();
		}
		else
		{
			if ($this->useCookie)
			{
				$crypt = $this->getCrypt();
				$cookieKey = (int) $this->user->get('id') .
':' . $this->getFormId() . ':' .
$this->getRowId();
				$cookieVal = FArrayHelper::getValue($_COOKIE, $cookieKey,
'');

				if ($cookieVal !== '')
				{
					$hash = $crypt->decrypt($cookieVal);
				}
			}
		}

		$db = $row->getDbo();
		$row->hash = $hash;
		$query = $db->getQuery(true);
		$query->delete($db->qn($row->getTableName()))->where('hash
= ' . $db->q($hash));
		$db->setQuery($query);
		$this->removeCookie();
		$this->row = $row;

		if ($db->execute())
		{
			return true;
		}
		else
		{
			$row->setError($db->getErrorMsg());

			return false;
		}
	}

	/**
	 * Get the hash identifier
	 * format userid:formid:rowid
	 *
	 * @return  string  hash
	 */
	public function getHash()
	{
		$userId = $this->getUserId();

		if (is_null($this->hash))
		{
			$this->hash = $userId . ':' . $this->getFormId() .
':' . $this->getRowId();
		}

		return $this->hash;
	}

	/**
	 * Get a the user id
	 *
	 * @return  mixed  user id if logged in, unique id if not
	 */
	protected function getUserId()
	{
		if ($this->user->get('id') == 0)
		{
			return uniqid();
		}

		return $this->user->get('id');
	}

	/**
	 * Det the form id whose record is being edited
	 *
	 * @param   int  $id  form id
	 *
	 * @return  null
	 */
	public function setFormId($id)
	{
		$this->formId = $id;
	}

	/**
	 * Set the row id that is being edited or saved
	 *
	 * @param   int  $id  Row id
	 *
	 * @return  null
	 */
	public function setRowId($id)
	{
		$this->rowId = (int) $id;
	}

	/**
	 * Gets the row id - if not set uses request 'rowid' var
	 *
	 * @return  int
	 */
	protected function getRowId()
	{
		if (is_null($this->rowId))
		{
			$this->rowId =
$this->app->getInput()->getString('rowid', '',
'string');
		}

		return (int) $this->rowId;
	}

	/**
	 * Gets the row id - if not set uses request 'rowId' var
	 *
	 * @return int  form id
	 */
	public function getFormId()
	{
		if (is_null($this->formId))
		{
			$this->formId =
$this->app->getInput()->getInt('formid');
		}

		return $this->formId;
	}
}
models/group.php000064400000116241151165347410007710 0ustar00<?php
/**
 * Fabrik Group Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Table\Table;
use Joomla\CMS\Language\Text;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;
use Joomla\CMS\Factory;

jimport('joomla.application.component.model');

/**
 * Fabrik Group Model
 *
 * @package  Fabrik
 * @since    3.0
 */
class FabrikFEModelGroup extends FabModel
{
	/**
	 * Element plugins
	 *
	 * @var array
	 */
	public $elements = null;
	/**
	 * Published element plugins
	 *
	 * @var array
	 */
	public $publishedElements = null;
	/**
	 * How many times the group's data is repeated
	 *
	 * @var int
	 */
	public $repeatTotal = null;
	/**
	 * Parameters
	 *
	 * @var Registry
	 */
	protected $params = null;
	/**
	 * Id of group to load
	 *
	 * @var int
	 */
	protected $id = null;
	/**
	 * Group table
	 *
	 * @var Table
	 */
	protected $group = null;
	/**
	 * Form model
	 *
	 * @var FabrikFEModelForm
	 */
	protected $form = null;
	/**
	 * List model
	 *
	 * @var FabrikFEModelList
	 */
	protected $table = null;
	/**
	 * Join model
	 *
	 * @var FabrikFEModelJoin
	 */
	protected $joinModel = null;
	/**
	 * Published element plugins shown in the list
	 *
	 * @var array
	 */
	protected $publishedListElements = null;
	/**
	 * Form ids that the group is in (maximum of one value)
	 *
	 * @var array
	 */
	protected $formsIamIn = null;
	/**
	 * Can the group be viewed (set to false if no elements are visible in the
group
	 *
	 * @var bool
	 */
	protected $canView = null;
	/**
	 * Can the group be edited (if false, will override element ACL's and
make all elements read only)
	 *
	 * @var bool
	 */
	protected $canEdit = null;
	protected $groupProperties = null;

	/*
	 * cache for properties object
	 *
	 * @var object
	 */
	/**
	 * Save this so we can set endRow on previous element if it was hidden and
this element isn't.
	 * @var null
	 */
	private $setColumnCssLastElement = null;

	/**
	 * Can the user edit the group
	 *
	 * @return   bool
	 */
	public function canEdit()
	{
		/**
		 * First cut at this code, need to add actual ACL setting for edit
		 *
		 * Mostly needed so people can run plugins on this hook, to set groups to
read only
		 */
		if (!is_null($this->canEdit))
		{
			return $this->canEdit;
		}

		$params        = $this->getParams();
		$this->canEdit = true;

		// If group show is type 5, then always read only.
		if (in_array($params->get('repeat_group_show_first',
'1'), array('2', '5')))
		{
			$this->canEdit = false;

			return $this->canEdit;
		}

		$formModel     = $this->getFormModel();
		$pluginCanEdit =
FabrikWorker::getPluginManager()->runPlugins('onCanEditGroup',
$formModel, 'form', $this);

		if (empty($pluginCanEdit))
		{
			$pluginCanEdit = true;
		}
		else
		{
			$pluginCanEdit = !in_array(false, $pluginCanEdit);
		}

		$this->canEdit = $pluginCanEdit;

		return $this->canEdit;
	}

	/**
	 * Get group params
	 *
	 * @return  object    params
	 */
	public function &getParams()
	{
		if (!$this->params)
		{
			$this->params = new Registry($this->getGroup()->params);
		}

		return $this->params;
	}

	/**
	 * Get group table
	 *
	 * @return  FabrikTableGroup
	 */
	public function &getGroup()
	{
		if (is_null($this->group))
		{
			Table::addIncludePath(JPATH_ADMINISTRATOR .
'/components/com_fabrik/tables');
			$this->group = FabTable::getInstance('Group',
'FabrikTable');
			$this->group->load($this->getId());
		}

		return $this->group;
	}

	/**
	 * Set the group row
	 *
	 * @param   FabrikTableGroup $group Fabrik table
	 *
	 * @since   3.0.5
	 *
	 * @return  void
	 */
	public function setGroup($group)
	{
		$this->group = $group;
	}

	/**
	 * Get group id
	 *
	 * @return int
	 */
	public function getId()
	{
		return $this->get('id');
	}

	/**
	 * Method to set the group id
	 *
	 * @param   int $id group ID number
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		// Set new group ID
		$this->id = $id;
	}

	/**
	 * Get the groups form model
	 *
	 * @return FabrikFEModelForm form model
	 */
	public function getFormModel()
	{
		if (!isset($this->form))
		{
			$formIds    = $this->getFormsIamIn();
			$formId     = empty($formIds) ? 0 : $formIds[0];
			$this->form =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Form',
'FabrikFEModel');
			$this->form->setId($formId);
			$this->form->getForm();
			$this->form->getlistModel();
		}

		return $this->form;
	}

	/**
	 * Get an array of forms that the group is in
	 * NOTE: now a group can only belong to one form
	 *
	 * @return  array  form ids
	 */
	public function getFormsIamIn()
	{
		if (!isset($this->formsIamIn))
		{
			$db    = FabrikWorker::getDbo(true);
			$query = $db->getQuery(true);
			$query->select('form_id')->from('#__fabrik_formgroup')->where('group_id
= ' . (int) $this->getId());
			$db->setQuery($query);
			$this->formsIamIn = $db->loadColumn();
		}

		return $this->formsIamIn;
	}

	/**
	 * Can the user view the group
	 *
	 * @param   string $mode View mode list|form
	 *
	 * @return   bool
	 */
	public function canView($mode = 'form')
	{
		// No ACL option for list view.
		if ($mode === 'list')
		{
			return true;
		}

		if (!is_null($this->canView))
		{
			return $this->canView;
		}

		$params        = $this->getParams();
		$elementModels = $this->getPublishedElements();
		$this->canView = false;

		foreach ($elementModels as $elementModel)
		{
			// $$$ hugh - added canUse() check, corner case, see:
			// http://fabrikar.com/forums/showthread.php?p=111746#post111746
			if (!$elementModel->canView() && !$elementModel->canUse())
			{
				continue;
			}

			$this->canView = true;
			break;
		}

		// Get the group access level
		$groups      = $this->user->getAuthorisedViewLevels();
		$groupAccess = $params->get('access', '');

		if ($groupAccess !== '')
		{
			$this->canView = in_array($groupAccess, $groups);

			// If the user can't access the group return that and ignore
repeat_group_show_first option
			if (!$this->canView)
			{
				return $this->canView;
			}
		}

		/*
		 * Sigh - seems that the repeat group 'repeat_group_show_first'
property has been bastardized to be a setting
		* that is applicable to a group even when not in a repeat group, and has
basically become a standard group setting.
		* My bad for labelling it poorly to start with.
		* So, now if this is set to 'no' the group is not shown but
canView was returning true - doh! Caused issues in
		* multi page forms where we were trying to set/check errors in groups
which were not attached to the form.
		*/
		$formModel = $this->getFormModel();
		$showGroup = $params->get('repeat_group_show_first',
'1');

		if ($showGroup == 0)
		{
			$this->canView = false;
		}

		// If editable but only show group in details view:
		if (!($formModel->isEditable() && $showGroup == 2))
		{
			$this->canView = true;
		}

		// If form not editable and show group in form view:
		if (!$formModel->isEditable() && $showGroup == 3)
		{
			$this->canView = false;
		}

		return $this->canView;
	}

	/**
	 * Get an array of published elements
	 *
	 * @since 120/10/2011 - can override with elementid request data (used in
inline edit to limit which elements are shown)
	 *
	 * @return  PlgFabrik_Element[]    published element objects
	 */
	public function getPublishedElements()
	{
		if (!isset($this->publishedElements))
		{
			$this->publishedElements = array();
		}

		$ids = (array)
$this->app->getInput()->get('elementid', array(),
'array');
		$sig = implode('.', $ids);
		if ($sig === '')
		{
			$sig = 'default';
		}
		if (!array_key_exists($sig, $this->publishedElements))
		{
			$this->publishedElements[$sig] = array();
			$elements                      = (array) $this->getMyElements();

			foreach ($elements as $elementModel)
			{
				$element = $elementModel->getELement();

				if ($element->published == 1)
				{
					if (empty($ids) || in_array($element->id, $ids))
					{
						$this->publishedElements[$sig][] = $elementModel;
					}
				}
			}
		}

		return $this->publishedElements[$sig];
	}

	/**
	 * Returns array of elements in the group
	 *
	 * NOTE: pretty sure that ->elements will already be loaded
	 * within $formModel->getGroupsHiarachy()
	 *
	 * @return  PlgFabrik_Element[]    Element objects (bound to element
plugin)
	 */
	public function getMyElements()
	{
		// Elements should generally have already been loaded via the plugin
manager getFormPlugins() method
		if (!isset($this->elements))
		{
			$this->getGroup();
			$this->elements = array();
			$pluginManager  = FabrikWorker::getPluginManager();
			$formModel      = $this->getFormModel();
			$allGroups      = $pluginManager->getFormPlugins($formModel);

			if (empty($this->elements))
			{
				// Horrible hack for when saving group

				/*
				 * $$$ rob Using @ for now as in inline edit in podion you get multiple
notices when
				* saving the status element
				*/
				/* Bauer note: this error prevents adding new elements
				 * in a new list (where Id is not yet known) in php 7
				 */
				// $this->elements = @$allGroups[$this->getId()]->elements;
				$thisId = $this->getId();
				if (!empty($thisId))
				{
					$this->elements = $allGroups[$thisId]->elements;
				}
			}
		}

		return $this->elements;
	}

	/**
	 * Set the context in which the element occurs
	 *
	 * @param   object $formModel Form model
	 * @param   object $listModel List model
	 *
	 * @return void
	 */
	public function setContext($formModel, $listModel)
	{
		$this->form  = $formModel;
		$this->table = $listModel;
	}

	/**
	 * Randomise the element list (note the array is the pre-rendered
elements)
	 *
	 * @param   array &$elements form views processed/formatted list of
elements that the form template uses
	 *
	 * @return  void
	 */
	public function randomiseElements(&$elements)
	{
		if ($this->getParams()->get('random', false) == true)
		{
			$keys = array_keys($elements);
			shuffle($keys);

			foreach ($keys as $key)
			{
				$new[$key] = $elements[$key];
			}

			$elements = $new;
		}
	}

	/**
	 * Set the element column css allows for group column settings to be
applied
	 *
	 * @param   object &$element Pre-render element properties
	 * @param   int    $rowIx    Current key when looping over elements.
	 *
	 * @since    Fabrik 3.0.5.2
	 *
	 * @return  int  the next column count
	 */
	public function setColumnCss(&$element, $rowIx)
	{
		$params   = $this->getParams();
		$colCount = (int) $params->get('group_columns');

		if ($colCount === 0)
		{
			$colCount = 1;
		}

		$element->offset = $params->get('group_offset', 0);

		// Bootstrap grid formatting
		if ($colCount === 1) // Single column
		{
			$element->startRow = true;
			$element->endRow   = 1;
			$element->span     = '';
			$element->column   = '';
			$rowIx             = -1;

			return $rowIx;
		}

		// Multi-column
		$widths = $params->get('group_column_widths', '');
		$w      = (int)floor(12 / $colCount);

		$element->startRow = 0;
		$element->endRow   = 0;

		// Reset previous assumed last element
		if ($rowIx != -1)
		{
			if (isset($this->setColumnCssLastElement->endRow))
$this->setColumnCssLastElement->endRow = 0;
		}
		/**
		 * Hidden fields at start of row will be grouped on a separate row to
avoid
		 * issues with css selector :first-child.
		 * $rowIx == -1 indicates a new row to distinguish it from
		 * $rowIx = 0 which indicates hidden fields already processed at start of
row.
		 **/
		if ($rowIx === 0 && !$element->hidden)
		{
			// Previous element must have been hidden - so set end of row on that
and new row on this
			$this->setColumnCssLastElement->endRow = 1;
			$rowIx                                 = -1;
		}

		if ($rowIx < 0)
		{
			$rowIx             = 0;
			$element->startRow = 1;
		}

		if ($widths !== '')
		{
			$widths = array_map('trim', explode(',', $widths));
			$w      = FArrayHelper::getValue($widths, ($rowIx) % $colCount, $w);
		}

		$element->column   = ' col-sm-'.$w;

		if (!$element->hidden)
		{
			$rowIx++;
		}

		$element->endRow = 1;
		
		if ($rowIx !== 0 && ($rowIx % $colCount === 0))
		{

			// Reset rowIx to indicate a new row.
			$rowIx = -1;
		} 

		// Save this so we can set endRow on previous element if it was hidden
and this element isn't.
		$this->setColumnCssLastElement = $element;
		
		return $rowIx;
	}

	/**
	 * Work out the bootstrap column spans for the group
	 * Assigned to each element in setColumnCss()
	 * Looks at the property group_column_widths which accepts either % or
1-12 as values
	 *
	 * @since 3.0b
	 *
	 * @return  array|void
	 */
	public function columnSpans()
	{
		$params = $this->getParams();
		$widths = $params->get('group_column_widths', '');

		if (trim($widths) === '')
		{
			return '';
		}

		$widths = explode(',', $widths);

//		if (FabrikWorker::j3())
//		{
			foreach ($widths as &$w)
			{
				if ($w == '')
				{
					$w = 6;
				}

				if (strstr($w, '%'))
				{
					$w = (int) str_replace('%', '', $w);
					$w = (int) floor(($w / 100) * 12);
				}

				$w = ' ' . FabrikHelperHTML::getGridSpan($w);
			}
//		}

		return $widths;
	}

	/**
	 * Alias to getFormModel()
	 *
	 * @deprecated
	 *
	 * @return object form model
	 */
	public function getForm()
	{
		return $this->getFormModel();
	}

	/**
	 * Get a list of all elements which are set to show in list or
	 * are set to include in list query
	 *
	 * @since   3.0.6
	 *
	 * @return  array  list of element models
	 */
	public function getListQueryElements()
	{
		if (!isset($this->listQueryElements))
		{
			$this->listQueryElements = array();
		}

		$input       = $this->app->getInput();
		$groupParams = $this->getParams();

		// $$$ rob fabrik_show_in_list set in admin module params (will also be
set in menu items and content plugins later on)
		// its an array of element ids that should be show. Overrides default
element 'show_in_list' setting.
		$showInList = $input->get('fabrik_show_in_list', array(),
'array');
		$sig        = empty($showInList) ? 0 : implode('.',
$showInList);

		if (!array_key_exists($sig, $this->listQueryElements))
		{
			$this->listQueryElements[$sig] = array();
			$elements                      = $this->getMyElements();
			/**
			 * $$$ Paul - it is possible that the user has set Include in List Query
			 * to No for table primary key or join foreign key. If List is then set
			 * to Merge and Reduce, this causes a problem because the pk/fk
			 * placeholder is not set. We therefore include the table PK and join FK
			 * regardless of Include in List Query settings if any elements in the
			 * group have Include in List Query = Yes.
			 * In order to avoid iterating over the elements twice, we save the
			 * PK / FK elementModel and include it as soon as it is needed.
			 * If the access level does not allow for these to be used, then we
should
			 * display some sort of warning - though this is not included in this
fix.
			 **/
			$join = $this->getJoinModel();

			if (is_null($join->getJoin()->params))
			{
				$joinId = '';
				$joinFk = '';
			}
			else
			{
				$joinId = $join->getForeignID();
				$joinFk = $join->getForeignKey();
			}

			$elementIncluded = false;
			$tablePkIncluded = $joinFkIncluded = false;
			$tablePkElement  = $joinFkElement = null;

			foreach ($elements as $elementModel)
			{
				$element = $elementModel->getElement();
				$params  = $elementModel->getParams();
				/**
				 * $$$ hugh - experimenting adding non-viewable data to encrypted vars
on forms,
				 * also we need them in addDefaultDataFromRO()
				 * if ($element->published == 1 &&
$elementModel->canView())
				 */
				if ($element->published == 1)
				{
					$full_name = $elementModel->getFullName(true, false);

					/**
					 * As this function seems to be used to build both the list view and
the form view, we should NOT
					 * include elements in the list query if the user can not view them,
as their data is sent to the json object
					 * and thus visible in the page source.
					 * Jaanus: also when we exclude elements globally with group settings
($groupParams->get('list_view_and_query', 1) == 0)
					 */

					if ($input->get('view') == 'list' &&
((!$this->getListModel()->isUserDoElement($full_name) &&
!$elementModel->canView('list')) ||
$groupParams->get('list_view_and_query', 1) == 0))
					{
						continue;
					}

					$showThisInList = $element->primary_key ||
$params->get('include_in_list_query', 1) == 1
						|| (empty($showInList) && $element->show_in_list_summary)
|| in_array($element->id, $showInList);

					if ($showThisInList)
					{
						if ($element->primary_key || $full_name == $joinId)
						{
							$tablePkIncluded = true;
						}
						elseif (!$tablePkIncluded && !is_null($tablePkElement))
						{
							// Add primary key before other element
							$this->listQueryElements[$sig][] = $tablePkElement;
							$tablePkIncluded                 = true;
						}

						if ($full_name == $joinFk)
						{
							$joinFkIncluded = true;
						}
						elseif (!$joinFkIncluded && !is_null($joinFkElement))
						{
							// Add foreign key before other element
							$this->listQueryElements[$sig][] = $joinFkElement;
							$joinFkIncluded                  = true;
						}

						$this->listQueryElements[$sig][] = $elementModel;
						$elementIncluded                 = true;
					}
					elseif ($element->primary_key || $full_name == $joinId)
					{
						if ($elementIncluded)
						{
							// Add primary key after other element
							$this->listQueryElements[$sig][] = $elementModel;
							$tablePkIncluded                 = true;
						}
						else
						{
							// Save primary key for future use
							$tablePkElement = $elementModel;
						}
					}
					elseif ($elementModel->getFullName(true, false) == $joinFk)
					{
						if ($elementIncluded)
						{
							// Add foreign key after other element
							$this->listQueryElements[$sig][] = $elementModel;
							$joinFkIncluded                  = true;
						}
						else
						{
							// Save foreign key for future use
							$joinFkElement = $elementModel;
						}
					}
				}
			}
		}

		return $this->listQueryElements[$sig];
	}

	/**
	 * Get the group's associated join model
	 *
	 * @return  FabrikFEModelJoin  join model
	 */
	public function getJoinModel()
	{
		$group = $this->getGroup();

		if (is_null($this->joinModel))
		{
			$this->joinModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Join',
'FabrikFEModel');
			$this->joinModel->setId($group->join_id);
			$js = $this->getListModel()->getJoins();

			// $$$ rob set join models data from preloaded table joins - reduced
load time
			for ($x = 0; $x < count($js); $x++)
			{
				if ($js[$x]->id == $group->join_id &&
$js[$x]->element_id == 0)
				{
					$this->joinModel->setData($js[$x]);
					break;
				}
			}

			$this->joinModel->getJoin();
		}

		return $this->joinModel;
	}

	/**
	 * Get the groups list model
	 *
	 * @return  FabrikFEModelList    list model
	 */
	public function getlistModel()
	{
		return $this->getFormModel()->getlistModel();
	}

	/**
	 * Get published elements to show in list
	 *
	 * @return  PlgFabrik_Element[]
	 */
	public function getPublishedListElements()
	{
		if (!isset($this->publishedListElements))
		{
			$this->publishedListElements = array();
		}

		$input  = $this->app->getInput();
		$params = $this->getParams();

		// $$$ rob fabrik_show_in_list set in admin module params (will also be
set in menu items and content plugins later on)
		// its an array of element ids that should be show. Overrides default
element 'show_in_list' setting.
		$showInList = (array) $input->get('fabrik_show_in_list',
array(), 'array');
		$sig        = empty($showInList) ? 0 : implode('.',
$showInList);

		if (!array_key_exists($sig, $this->publishedListElements))
		{
			$this->publishedListElements[$sig] = array();
			$elements                          = $this->getMyElements();

			foreach ($elements as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($params->get('list_view_and_query', 1) == 1 &&
$element->published == 1 &&
$elementModel->canView('list'))
				{
					if (empty($showInList))
					{
						if ($element->show_in_list_summary)
						{
							$this->publishedListElements[$sig][] = $elementModel;
						}
					}
					else
					{
						if (in_array($element->id, $showInList))
						{
							$this->publishedListElements[$sig][] = $elementModel;
						}
					}
				}
			}
		}

		return $this->publishedListElements[$sig];
	}

	/**
	 * Is the group a repeat group
	 *
	 * @return  bool
	 */
	public function canCopyElementValues()
	{
		$params = $this->getParams();

		return $params->get('repeat_copy_element_values',
'0') === '1';
	}

	/**
	 * Get the group's join_id
	 *
	 * @return  mixed   join_id, or false if not a join
	 */
	public function getJoinId()
	{
		if (!$this->isJoin())
		{
			return false;
		}

		return $this->getGroup()->join_id;
	}

	/**
	 * Is the group a join?
	 *
	 * @return  bool
	 */
	public function isJoin()
	{
		return $this->getGroup()->is_join;
	}

	/**
	 * Make a group object to be used in the form view. Object contains
	 * group display properties
	 *
	 * @param   object &$formModel form model
	 *
	 * @return  object    group display properties
	 */
	public function getGroupProperties(&$formModel)
	{
		if (!isset($this->groupProperties))
		{
			$w          = new FabrikWorker;
			$input      = $this->app->getInput();
			$group      = new stdClass;
			$groupTable = $this->getGroup();
			$params     = $this->getParams();
			$view       = $input->get('view');

			if (!isset($this->editable))
			{
				$this->editable = $formModel->isEditable();
			}

			if ($this->editable)
			{
				// If all of the groups elements are not editable then set the group to
uneditable
				$elements = $this->getPublishedElements();
				$editable = false;

				foreach ($elements as $element)
				{
					if ($element->canUse())
					{
						$editable = true;
					}
				}

				if (!$editable)
				{
					$this->editable = false;
				}
			}

			$group->editable  = $this->editable;
			$group->canRepeat = $params->get('repeat_group_button',
'0');
			$showGroup        = $params->def('repeat_group_show_first',
'1');
			$pages            = $formModel->getPages();
			$startPage        = isset($formModel->sessionModel->last_page) ?
$formModel->sessionModel->last_page : 0;

			if ($showGroup == -1 || $showGroup == 0 || ($view == 'form'
&& $showGroup == -2) || ($view == 'details' &&
$showGroup == -3))
			{
				$groupTable->css .= ";display:none;";
			}

			$group->css = trim(str_replace(array("<br />",
"<br>"), "", $groupTable->css));
			$group->id  = $groupTable->id;

			$label = $input->getString('group' . $group->id .
'_label', $groupTable->label);

			if (!empty($label) && StringHelper::stristr($label,
"{Add/Edit}"))
			{
				$replace = $formModel->isNewRecord() ?
Text::_('COM_FABRIK_ADD') : Text::_('COM_FABRIK_EDIT');
				$label   = str_replace("{Add/Edit}", $replace, $label);
			}

			$groupTable->label       = $label;
			$group->title            =
$w->parseMessageForPlaceHolder($groupTable->label,
$formModel->data, false);
			$group->title            = Text::_($group->title);
			$group->name             = $groupTable->name;
			$group->displaystate     = ($group->canRepeat == 1 &&
$formModel->isEditable()) ? 1 : 0;
			$group->maxRepeat        = (int)
$params->get('repeat_max');
			$group->minRepeat        = $params->get('repeat_min',
'') === '' ? 1 : (int)
$params->get('repeat_min', '');
			$group->numRepeatElement =
$params->get('repeat_num_element', '');
			$group->noDataMsg        =
$params->get('repeat_no_data_message', '');
			$group->showMaxRepeats   =
$params->get('show_repeat_max', '0') ==
'1';
			$group->minMaxErrMsg     =
$params->get('repeat_error_message', '');
			$group->minMaxErrMsg     = Text::_($group->minMaxErrMsg);
			$group->canAddRepeat     = $this->canAddRepeat();
			$group->canDeleteRepeat  = $this->canDeleteRepeat();
			$intro                   =
FabrikString::translate($params->get('intro'));
			$group->intro            =
$formModel->parseIntroOutroPlaceHolders($intro, $group->editable,
$formModel->isNewRecord());
			$outro                   = Text::_($params->get('outro'));
			$group->outro            =
$formModel->parseIntroOutroPlaceHolders($outro, $group->editable,
$formModel->isNewRecord());
			$group->columns          = $params->get('group_columns',
1);
			$group->splitPage        = $this->isSplitPage();
			$group->showLegend       = $this->showLegend($group);
			$group->labels           = $params->get('labels_above',
-1);
			$group->dlabels          =
$params->get('labels_above_details', -1);
			$group->classArray       = array();
			$group->class            = '';
			$group->canOrder         =
$params->get('repeat_sortable', '') ===
'1';

			if ($this->canRepeat())
			{
				$group->tmpl = $params->get('repeat_template',
'repeatgroup');
			}
			else
			{
				$group->tmpl = 'group';
			}

			$this->groupProperties = $group;
		}

		return $this->groupProperties;
	}

	/**
	 * Can the user add a repeat group
	 *
	 * @since   3.0.1
	 *
	 * @return  bool
	 */
	public function canAddRepeat()
	{
		$params = $this->getParams();
		$ok     = $this->canRepeat();

		if ($ok)
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$ok     = in_array($params->get('repeat_add_access', 1),
$groups);
		}

		return $ok;
	}

	/**
	 * Is the group a repeat group
	 *
	 * @return  bool
	 */
	public function canRepeat()
	{
		return $this->getParams()->get('repeat_group_button');
	}

	/**
	 * Can the user delete a repeat group
	 *
	 * @since   3.0.1
	 *
	 * @return  bool
	 */
	public function canDeleteRepeat()
	{
		$ok = false;

		if ($this->canRepeat())
		{
			$params = $this->getParams();
			$row    = $this->getFormModel()->getData();
			$ok     = FabrikWorker::canUserDo($params, $row,
'repeat_delete_access_user');

			if ($ok === -1)
			{
				$groups = $this->user->getAuthorisedViewLevels();
				$ok     = in_array($params->get('repeat_delete_access',
1), $groups);
			}
		}

		return $ok;
	}

	public function isSplitPage()
	{
		$params = $this->getParams();
		$view   = $this->app->getInput()->get('view');

		$splitPage = (int) $params->get('split_page', 0);

		switch ($splitPage)
		{
			case 0:
				$splitPage = false;
				break;
			case 1:
				$splitPage = true;
				break;
			case 2:
				$splitPage = ($view === 'form');
				break;
			case 3:
				$splitPage = ($view === 'details');
				break;
		}

		return $splitPage;
	}

	/**
	 * Should the group legend be shown
	 *
	 * @param   object $group Group properties
	 *
	 * @return boolean
	 */
	private function showLegend($group)
	{
		$allHidden = true;

		foreach ((array) $this->elements as $elementModel)
		{
			$allHidden &= $elementModel->isHidden();
		}

		if ((!$allHidden || !empty($group->intro)) &&
trim($group->title) !== '')
		{
			return true;
		}

		return false;
	}

	/**
	 * Get the label positions, if set to global then return form's label
positions
	 *
	 * @param string $view form|details
	 *
	 * @return int
	 */
	public function labelPosition($view = 'form')
	{
		$property = $view === 'form' ? 'labels_above' :
'labels_above_details';
		$params   = $this->getParams();

		$position = (int) $params->get($property, -1);

		if ($position === -1)
		{
			$formParams = $this->getFormModel()->getParams();
			$position   = (int) $formParams->get($property, 0);
		}

		return $position;
	}

	/**
	 * Copies a group, form group and its elements
	 * (when copying a table (and hence a group) the groups join is copied in
table->copyJoins)
	 *
	 * @return  array    an array of new element id's keyed on original
elements that have been copied
	 */
	public function copy()
	{
		$input    = $this->app->getInput();
		$elements = $this->getMyElements();
		$group    = $this->getGroup();

		// NewGroupNames set in table copy
		$newNames = $input->get('newGroupNames', array(),
'array');

		if (array_key_exists($group->id, $newNames))
		{
			$group->name = $newNames[$group->id];
		}

		$group->id = null;
		$group->store();
		$newElements = array();

		foreach ($elements as $element)
		{
			$origElementId               = $element->getElement()->id;
			$copy                        = $element->copyRow($origElementId,
$element->getElement()->label, $group->id);
			$newElements[$origElementId] = $copy->id;
		}

		$this->elements = null;
		$elements       = $this->getMyElements();

		// Create form group
		$formId              = isset($this->_newFormid) ? $this->_newFormid
: $this->getFormModel()->getId();
		$formGroup           = FabTable::getInstance('FormGroup',
'FabrikTable');
		$formGroup->form_id  = $formId;
		$formGroup->group_id = $group->id;
		$formGroup->ordering = 999999;
		$formGroup->store();
		$formGroup->reorder(" form_id = '$formId'");

		return $newElements;
	}

	/**
	 * Resets published element cache
	 *
	 * @return  void
	 */
	public function resetPublishedElements()
	{
		unset($this->publishedElements);
		unset($this->publishedListElements);
		unset($this->elements);
	}

	/**
	 * Group specific form submission code - deals with saving joined data.
	 *
	 * @param   int $parentId insert ID of parent table
	 *
	 * @return  void
	 */
	public function process($parentId = null)
	{
		if (!$this->isJoin())
		{
			return;
		}

		$canRepeat  = $this->canRepeat();
		$repeats    = $this->repeatTotals();
		$joinModel  = $this->getJoinModel();
		$pkField    = $joinModel->getForeignID();
		$fkOnParent = $this->fkOnParent();
		$listModel  = $this->getListModel();
		$item       = $this->getGroup();
		$formModel  = $this->getFormModel();
		$formData   =& $formModel->formDataWithTableName;

		if (!$fkOnParent)
		{
			$this->setForeignKey();
		}

		$elementModels = $this->getMyElements();
		$list          = $listModel->getTable();
		$tblName       = $list->db_table_name;
		$tblPk         = $list->db_primary_key;

		// Set the list's table name to the join table, needed for
storeRow()
		$join                 = $joinModel->getJoin();
		$list->db_table_name  = $join->table_join;
		$list->db_primary_key = $joinModel->getForeignID('.');
		$usedKeys             = array();

		$insertId = false;

		if (!$fkOnParent)
		{
			/*
			 * It's a "normal" join, with the FK on the child, which
may or may not repeat
			 */
			for ($i = 0; $i < $repeats; $i++)
			{
				$data = array();

				foreach ($elementModels as $elementModel)
				{
					$elementModel->onStoreRow($data, $i);
				}

				if ($formModel->copyingRow())
				{
					$pk = '';

					if ($canRepeat)
					{
						$formData[$pkField][$i] = '';
					}
					else
					{
						$formData[$pkField] = '';
					}

				}
				else
				{
					$pk = $canRepeat ? FArrayHelper::getValue($formData[$pkField], $i,
'') : $formData[$pkField];

					// Say for some reason the pk was set as a dbjoin!
					if (is_array($pk))
					{
						$pk = array_shift($pk);
					}
				}

				$insertId = $listModel->storeRow($data, $pk, true, $item);

				// Update key
				if ($canRepeat)
				{
					$formData[$pkField][$i] = $insertId;
				}
				else
				{
					$formData[$pkField] = $insertId;
				}

				$usedKeys[] = $insertId;
			}

			// Delete any removed groups
			$this->deleteRepeatGroups($usedKeys);
		}
		else
		{
			/*
			 * It's an abnormal join!  FK is on the parent.  Can't repeat,
and the $pk needs to be derived differently
			 */

			$data = array();

			foreach ($elementModels as $elementModel)
			{
				$elementModel->onStoreRow($data, 0);
			}

			/*
			 * Although we use getPrimaryKey(), it's not really the primary
key, 'cos the relationship is flipped
			 * when we're in $fkOnParent mode!  So it's actually the FK
field on the parent table.
			 */
			$fkField = $joinModel->getPrimaryKey('___');
			$pk      = FArrayHelper::getValue($formData, $fkField .
'_raw', FArrayHelper::getValue($formData, $fkField,
''));

			if (is_array($pk))
			{
				$pk = array_shift($pk);
			}

			// storeRow treats 0 or '0' differently to empty string!  So
if empty(), specifically set to empty string
			if (empty($pk))
			{
				$pk = '';
			}

			$insertId = $listModel->storeRow($data, $pk, true, $item);
		}

		// Reset the list's table name
		$list->db_table_name  = $tblName;
		$list->db_primary_key = $tblPk;

		/*
		 * If the FK is on the parent, we (may) need to update the parent row
with the FK value
		 * for the joined row we just upserted.
		 */
		if ($fkOnParent && !empty($insertId))
		{
			/*
			 * Only bother doing this is the FK isn't there or has been
changed.  Again, don't be
			 * confused by using getPrimaryKey, it's really the FK 'cos
the relationship is flipped
			 * from a "normal" join, with the FK on the parent.
			 */
			$fkField = $joinModel->getPrimaryKey('___');
			if (!array_key_exists($fkField, $formData) || $formData[$fkField] !=
$insertId)
			{
				$formData[$fkField]          = $insertId;
				$formData[$fkField . '_raw'] = $insertId;
				$fkField                     =
$joinModel->getPrimaryKey('.');
				$listModel->updateRow($parentId, $fkField, $insertId);
			}
		}
	}

	/**
	 * Get the number of times the group was repeated when the user fills
	 * in the form
	 *
	 * @todo whats the difference between this and @link(repeatCount)
	 *
	 * @return  int
	 */
	protected function repeatTotals()
	{
		$input        = $this->app->getInput();
		$repeatTotals = $input->get('fabrik_repeat_group', array(0),
'post', 'array');

		return (int) FArrayHelper::getValue($repeatTotals,
$this->getGroup()->id, 0);
	}

	/**
	 *
	 *
	 */
	public function fkOnParent()
	{
		/*
		 * $$$ hugh - if $pkField is same-same as FK, then this is a one-to-one
join in which the FK is
		* on the "parent", so it's ...
		*
		* parent.child_id (FK) => child.id (PK)
		*
		* ... rather than ...
		*
		* parent.id (PK) <= child.parent_id (FK)
		*
		* ... which means it needs different handling, like we don't set the
FK value in the child, rather
		* we have to go back and update the FK value in the parent after writing
the child row.
		*/

		// @TODO - handle joins which don't involve the parent!

		$joinModel = $this->getJoinModel();
		$pkField   = $joinModel->getForeignID();
		$fk        = $joinModel->getForeignKey();

		return $pkField === $fk;
	}

	/**
	 * Part of process()
	 * Set foreign key's value to the main records insert id
	 *
	 * @return  void
	 */
	protected function setForeignKey()
	{
		$formModel      = $this->getFormModel();
		$formData       =& $formModel->formDataWithTableName;
		$joinModel      = $this->getJoinModel();
		$masterInsertId = $this->masterInsertId();
		$fk_name        = $joinModel->getForeignKey();
		$fks            = array($fk_name, $fk_name . '_raw');

		foreach ($fks as $fk)
		{
			if ($this->canRepeat() && array_key_exists($fk, $formData))
			{
				if (array_key_exists($fk, $formData))
				{
					if (is_array($formData[$fk]))
					{
						foreach ($formData[$fk] as $k => $v)
						{
							$formData[$fk][$k] = $masterInsertId;
						}
					}
					else
					{
						$formData[$fk] = $masterInsertId;
					}
				}
			}
			else
			{
				$formData[$fk] = $masterInsertId;
			}
		}

		/**
		 *
		 * $$$ hugh - added the clearDefaults method and need to call it here,
otherwise if any pre-processing
		 * has already called the element model's getValue(), the change we
just made to formdata won't get picked up
		 * during the row store processing, as getValue() will return the cached
default.
		 */
		$elementModel = $formModel->getElement($fk_name);

		if ($elementModel)
		{
			$elementModel->clearDefaults();
		}
	}

	/**
	 * Get the records master Insert Id - need better description...
	 *
	 * @return  string
	 */
	protected function masterInsertId()
	{
		$formModel = $this->getFormModel();
		$joinModel = $this->getJoinModel();
		$formData  =& $formModel->formDataWithTableName;
		$joinToPk  = $joinModel->getJoinedToTablePk();

		return $formData[$joinToPk];
	}

	/**
	 * When storing a joined group. Delete any deselected repeating joined
records
	 *
	 * @param   array $usedKeys Keys saved in store()
	 *
	 * @return  bool
	 */
	private function deleteRepeatGroups($usedKeys = array())
	{
		if (!$this->canRepeat())
		{
			/*
			 * If the group can not be repeated then the user could not have deleted
a
			 * repeat group.
			 */
			return true;
		}

		/*
		 * If we are copying a row, everything is new, leave old groups alone
		 */

		$formModel = $this->getFormModel();

		if ($formModel->copyingRow())
		{
			return true;
		}

		$listModel      = $this->getListModel();
		$list           = $listModel->getTable();
		$joinModel      = $this->getJoinModel();
		$join           = $joinModel->getJoin();
		$db             = $listModel->getDb();
		$query          = $db->getQuery(true);
		$masterInsertId = $this->masterInsertId();
		$query->delete($db->qn($list->db_table_name));
		$pk = $join->params->get('pk');

		/*
		 * Get the original row ids. We can ONLY delete from within this set.
This
		 * allows us to respect and prefilter that was applied to the list's
data.
		 */

		$origGroupRowsIds = $this->getOrigGroupRowsIds();

		/*
		 * Find out which keys were origionally in the form, but were not
submitted
		 * i.e. those keys whose records were removed
		 */

		if (!$formModel->isNewRecord())
		{
			$keysToDelete = array_diff($origGroupRowsIds, $usedKeys);
		}

		// Nothing to delete - return
		if (empty($keysToDelete))
		{
			return true;
		}

		if (is_array($masterInsertId))
		{
			foreach ($masterInsertId as &$mid)
			{
				if (is_array($mid))
				{
					$mid = array_unshift($mid);
				}

				$mid = $db->quote($mid);
			}

			$query->where($db->qn($join->table_join_key) . ' IN
(' . implode(', ', $masterInsertId) . ')');
		}
		else
		{
			$query->where($db->qn($join->table_join_key) . ' = '
. $db->q($masterInsertId));
		}

		$query->where($pk . 'IN (' . implode(',',
$db->q($keysToDelete)) . ') ');
		$db->setQuery($query);

		return $db->execute();
	}

	/**
	 * Get original group Ids from form metadata
	 */
	public function getOrigGroupRowsIds()
	{
		$groupId          = $this->getId();
		$formModel        = $this->getFormModel();
		$origGroupRowsIds = FArrayHelper::getValue($formModel->formData,
'fabrik_group_rowids', array());
		$origGroupRowsIds = FArrayHelper::getValue($origGroupRowsIds, $groupId,
'[]');
		$origGroupRowsIds = json_decode($origGroupRowsIds);

		return $origGroupRowsIds;
	}

	/**
	 * Test if the group can repeat and if the fk element is published
	 *
	 * @since   3.1rc1
	 *
	 * @return boolean
	 */
	public function fkPublished()
	{
		if ($this->canRepeat())
		{
			return true;
		}

		$joinTable     = $this->getJoinModel()->getJoin();
		$fullFk        = $joinTable->table_join . '___' .
$joinTable->table_join_key;
		$elementModels = $this->getPublishedElements();

		foreach ($elementModels as $elementModel)
		{
			if ($elementModel->getFullName(true, false) === $fullFk)
			{
				return true;
			}
		}

		//JError::raiseWarning(E_ERROR,
Text::sprintf('COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED',
$fullFk));
		\Joomla\CMS\Factory::getApplication()->enqueueMessage(Text::sprintf('COM_FABRIK_JOINED_DATA_BUT_FK_NOT_PUBLISHED',
$fullFk), 'error');

		return false;
	}

	/**
	 * Get the number of times the group was repeated based on the form's
current data
	 *
	 * @since   3.1rc1
	 *
	 * @return number
	 */
	public function repeatCount()
	{
		$data          = $this->getFormModel()->getData();
		$elementModels = $this->getPublishedElements();
		reset($elementModels);
		$tmpElement = current($elementModels);

		if (!empty($elementModels))
		{
			$smallerElHTMLName = $tmpElement->getFullName(true, false);
			$d                 = FArrayHelper::getValue($data, $smallerElHTMLName,
array());

			if (is_object($d))
			{
				$d = ArrayHelper::fromObject($d);
			}

			$repeatGroup = is_scalar($d) ? 1 : count($d);
		}
		else
		{
			// No published elements - not sure if setting repeatGroup to 0 is right
though
			$repeatGroup = 0;
		}

		return $repeatGroup;
	}
}
models/importcsv.php000064400000127150151165347410010603 0ustar00<?php
/**
 * Import CSV class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Model\FormModel;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Path;
use Joomla\String\StringHelper;

jimport('joomla.application.component.model');
jimport('joomla.application.component.modelform');

/**
 * Import CSV class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikFEModelImportcsv extends FormModel
{
	/**
	 * Cleaned heading names
	 *
	 * @var array
	 */
	public $headings = null;

	/**
	 * CSV data
	 *
	 * @var array
	 */
	public $data = null;

	/**
	 * List of new headings found in csv file when importing
	 *
	 * @var array
	 */
	public $newHeadings = array();

	/**
	 * List of matched headings found in csv file when importing
	 *
	 * @var array
	 */
	public $matchedHeadings = array();

	/**
	 * Used to store the heading key for any heading deselected on admin
import into a new list
	 *
	 * @var array
	 */
	protected $unmatchedKeys = array();

	/**
	 * List's join objects
	 *
	 * @var array
	 */
	public $joins = null;

	/**
	 * List model to import into
	 *
	 * @var object
	 */
	public $listModel = null;

	/**
	 * Number of records added
	 *
	 * @var int
	 */
	public $updatedCount = 0;

	/**
	 * CSV file name
	 *
	 * @var string
	 */
	protected $csvFile = null;

	/**
	 * Delimiter to split data by
	 *
	 * @var string
	 */
	protected $fieldDelimiter = null;

	/**
	 * Directory to which the csv file is imported
	 *
	 * @var string
	 */
	protected $baseDir = null;

	/**
	 * Import the csv file
	 *
	 * @return  boolean
	 */
	public function import()
	{
		$this->readCSV($this->getCSVFileName());
		$this->findExistingElements();
		$this->setSession();

		return true;
	}

	/**
	 * Gets the name of the csv file from the uploaded jForm
	 *
	 * @return string csv file name
	 */
	public function getCSVFileName()
	{
		if (is_null($this->csvFile))
		{
			$session = Factory::getSession();

			if ($session->has('com_fabrik.csv.filename'))
			{
				$this->csvFile =
$session->get('com_fabrik.csv.filename');
			}
			else
			{
				$this->csvFile = 'fabrik_csv_' . md5(uniqid());
				$session->set('com_fabrik.csv.filename',
$this->csvFile);
			}
		}

		return $this->csvFile;
	}

	/**
	 * Loads the Joomla form for importing the csv file
	 *
	 * @param   array $data     form data
	 * @param   bool  $loadData load form data
	 *
	 * @return  object    form
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		Form::addFormPath(COM_FABRIK_BASE .
'administrator/components/com_fabrik/models/forms');
		$form = $this->loadForm('com_fabrik.import',
'import', array('control' => 'jform',
'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		$form->model = $this;

		return $form;
	}

	/**
	 * Checks uploaded file, and uploads it
	 *
	 * @throws Exception
	 *
	 * @return  true  csv file uploaded ok, false error (JError warning
raised)
	 */
	public function checkUpload()
	{
		/* Track errors message- so if from frontend menu redirect 
		    to current url rather than throwing exception
		 */
		$errmsg = '';
		$app      = Factory::getApplication();
		$input    = $app->getInput();

		if (!(bool) ini_get('file_uploads'))
		{
            $errmsg = Text::_('COM_FABRIK_ERR_UPLOADS_DISABLED');
            $userFile = false;
		}
		else
		{

		    $userFile = $input->files->get('jform');
		}

		if (!$userFile)
		{
			if($errmsg == '')
			{
				$errmsg = Text::_('COM_FABRIK_IMPORT_CSV_NO_FILE_SELECTED');
			}
		} else {
    		jimport('joomla.filesystem.file');
            $allowedlist =
FabrikWorker::getMenuOrRequestVar('csv_import_extensions','',false,'menu');
            $allowed = empty($allowedlist) ?
array('txt','csv','tsv') :
explode(',',$allowedlist);
            $ext =
File::getExt($userFile['userfile']['name']);

			if (!in_array($ext, $allowed))
		    {
		        $errmsg = 'Import Failed! Invalid file format
('.$ext.'). Valid formats are ('.implode(',
',$allowed).')';
			}
			else
			{
        		$tmp_name  = $this->getCSVFileName();
		        $tmp_dir   = $this->getBaseDir();
		        $to        = Path::clean($tmp_dir . '/' . $tmp_name);
		        $resultDir =
File::upload($userFile['userfile']['tmp_name'], $to);

		        if ($resultDir == false && !File::exists($to))
		        {
		            $errmsg = Text::_('Upload Error');	
		        }
		        else
		        {
		            $listid = $input->getInt('listid');
		            // Allows user-created post-processing script to be
(optionally) run 
                    if
(file_exists(JPATH_PLUGINS.'/fabrik_list/listcsv/scripts/list_'.$listid.'_csv_import.php'))
                    {
                       
require(JPATH_PLUGINS.'/fabrik_list/listcsv/scripts/list_'.$listid.'_csv_import.php');
                    }				
		        }  
    		}
		}
        
        if (!empty($errmsg))
		{
            // If from frontend menu redirect back to list with displayed
error message, else throw exception
           
if(FabrikWorker::getMenuOrRequestVar('csv_import_extensions','',false,'menu')
== '')
            {
                throw new Exception(Text::_($errmsg));
            }
            else
            {
                $cururl = Uri::getInstance(); 
                $app = Factory::getApplication();
                $app->redirect($cururl, $errmsg, 'error');
            }    
		}    		

		return true;
	}

	/**
	 * Get the field delimiter from post
	 * and set in session 'com_fabrik.csv.fielddelimiter' for later
use
	 *
	 * @return  string    delimiter character
	 */
	protected function getFieldDelimiter()
	{
		$data = $this->getFormData();

		if (is_null($this->fieldDelimiter))
		{
			$this->fieldDelimiter = ',';
			$session              = Factory::getSession();

			if ($session->has('com_fabrik.csv.fielddelimiter'))
			{
				$this->fieldDelimiter =
$session->get('com_fabrik.csv.fielddelimiter');
			}

			$tabDelimiter         = FArrayHelper::getValue($data,
'tabdelimited');
			$this->fieldDelimiter = $tabDelimiter == 1 ? "\t" :
FArrayHelper::getValue($data, 'field_delimiter',
$this->fieldDelimiter);
			$session->set('com_fabrik.csv.fielddelimiter',
$this->fieldDelimiter);
		}

		return $this->fieldDelimiter;
	}

	/**
	 * Get form data
	 *
	 * @return  array
	 */
	protected function getFormData()
	{
		$app    = Factory::getApplication();
		$filter = InputFilter::getInstance();
		$post   = $filter->clean($_POST, 'array');

		return $app->getInput()->get('jform', $post,
'array');
	}

	/**
	 * Read the CSV file, store results in $this->headings and
$this->data
	 *
	 * @param   string $file to read
	 *
	 * @return null
	 */
	public function readCSV($file)
	{
		$baseDir         = $this->getBaseDir();
		$this->headings  = array();
		$this->data      = array();
		$data            = $this->getFormData();
		$field_delimiter = $this->getFieldDelimiter();
		$text_delimiter  = stripslashes(FArrayHelper::getValue($data,
'text_delimiter', '"'));

		if (!File::exists($baseDir . '/' . $file))
		{
			throw new UnexpectedValueException('Csv file : ' . $baseDir .
'/' . $file . ' not found');
		}

		//$origLineEnding = ini_get("auto_detect_line_endings");
		//ini_set("auto_detect_line_endings", true);
		$origMaxExecution = ini_get("max_execution_time");
		ini_set("max_execution_time", 300);

		$csv              = new Csv_Bv($baseDir . '/' . $file,
$field_delimiter, $text_delimiter, '\\');
		$csv->inPutFormat = FArrayHelper::getValue($data,
'inPutFormat', 'csv');

		// Will skip empty rows. TRUE by default. (Shown here for example only).
		$csv->SkipEmptyRows(true);

		// Remove leading and trailing \s and \t. TRUE by default.
		$csv->TrimFields(true);

		while ($row = $csv->NextLine())
		{
			if (empty($this->headings))
			{
				$this->sanitizeHeadings($row);

				if (!$this->getSelectKey())
				{
					// If no table loaded and the user asked to automatically add a key
then put id at the beginning of the new headings
					$idHeading = 'id';

					if (in_array($idHeading, $row))
					{
						$idHeading .= rand(0, 9);
					}

					array_unshift($row, $idHeading);
				}

				$this->headings = $row;
			}
			else
			{
				if (function_exists('iconv'))
				{
					foreach ($row as &$d)
					{
						/**
						 * strip any none utf-8 characters from the import data
						 * if we don't do this then the site's session is destroyed
and you are logged out
						 */
						$d = iconv("utf-8", "utf-8//IGNORE", $d);
					}
				}

				if (!$this->getSelectKey())
				{
					array_unshift($row, '');
				}
				
				// In admin import the user has deselected some columns for import.
Remove them from the row
				if (!empty($this->unmatchedKeys))
				{
					$row = array_diff_key($row , $this->unmatchedKeys);
					$row = array_values($row);
				}

				if (count($row) == 1 && $row[0] == '')
				{
					// CSV import from excel saved as unicode has blank record @ end
				}
				else
				{
					$this->data[] = $row;
				}
			}
		}

		fclose($csv->mHandle);

		//ini_set("auto_detect_line_endings", $origLineEnding);
		ini_set("max_execution_time", $origMaxExecution);
	}

	/**
	 * sanitize Headings
	 *
	 * @param  array &$row
	*
	 * @return void
	 */
	private function sanitizeHeadings(&$row)
	{
		$model       = $this->getlistModel();
		$tableParams = $model->getParams();
		// note that when creating a new list via import, this will default to 0
(and get cleaned)
		$mode        = $tableParams->get('csvfullname',
'0');

		foreach ($row as $key => &$heading)
		{
			// Remove UFT8 Byte-Order-Mark if present

			/*
			 * $$$ hugh - for some bizarre reason, this code was stripping the first
two characters of the heading
			 * on one of my client sites, so "Foo Bar" was becoming
"o_Bar" if the CSV had a BOM.  So I'm experimenting with
just using a str_replace,
			 * which works on the CSV I'm having issues with.  I've left
the original code in place as belt-and-braces.
			 */
			$heading = str_replace("\xEF\xBB\xBF", '',
$heading);
			$bom     = pack("CCC", 0xef, 0xbb, 0xbf);

			if (0 === strncmp($heading, $bom, 3))
			{
				$heading = StringHelper::substr($heading, 3);
			}

			if ($mode == '0')
			{
				/*
				 * $$$ hugh - if we are creating a list from a CSV import, we need to
				 * totally sanitize the name into a valid element name.  So clean it,
boil consecutive
				 * __ down to single (avoid accidentally getting a ___ in the name),
and remove leading
				 * and trailing _.
				 *
				 * Also do this if mode is 0.
				 *
				 * Possible gotcha if they have element names with double __ created by
hand.
				 */
				$heading = FabrikString::clean($heading);
				$heading = preg_replace('/__+/', '_', $heading);
				$heading = trim($heading, '_');
			}
			else if ($mode != 2)
			{
				// $$$ rob replacing with this as per thread -
http://fabrikar.com/forums/showthread.php?p=83304
				// $heading = str_replace(' ', '_', $heading);

			}

			if (!empty($this->matchedHeadings) && !in_array($heading,
$this->matchedHeadings))
			{
				$this->unmatchedKeys[$key] = 1;
				unset($row[$key]);

			}

		}

		$row = array_values($row);
	}

	/**
	 * Return the first line of the imported data
	 *
	 * @return  array
	 */
	public function getSample()
	{
		return $this->data[0];
	}

	/**
	 * Possibly setting large data in the session is a bad idea
	 *
	 * @deprecated
	 *
	 * @return  void
	 */
	public function setSession()
	{
		$session = Factory::getSession();
		$session->set('com_fabrik.csvdata', $this->data);
		$session->set('com_fabrik.matchedHeadings',
$this->matchedHeadings);
	}

	/**
	 * Get the directory to which the csv file is imported
	 *
	 * @return  string    path
	 */
	protected function getBaseDir()
	{
		if (!isset($this->baseDir))
		{
			$config        = Factory::getApplication()->getConfig();
			$tmp_dir       = $config->get('tmp_path');
			$this->baseDir = Path::clean($tmp_dir);
		}

		return $this->baseDir;
	}

	/**
	 * Used by import csv cron plugin to override default base dir location
	 *
	 * @param   string $dir (folder path)
	 *
	 * @since    3.0.3.1
	 *
	 * @return  void
	 */
	public function setBaseDir($dir)
	{
		$this->baseDir = $dir;
	}

	/**
	 * Deletes the csv file and optionally removes its path from the session
	 *
	 * @param   bool $clearSession should we clear the session
	 *
	 * @return void
	 */
	public function removeCSVFile($clearSession = true)
	{
		$baseDir       = $this->getBaseDir();
		$userFile_path = $baseDir . '/' . $this->getCSVFileName();

		if (File::exists($userFile_path))
		{
			File::delete($userFile_path);
		}

		if ($clearSession)
		{
			$this->clearSession();
		}
	}

	/**
	 * Clear session
	 *
	 * @return void
	 */
	public function clearSession()
	{
		$session = Factory::getSession();
		$session->clear('com_fabrik.csv.filename');
		$session->clear('com_fabrik.csv.fielddelimiter');
	}

	/**
	 * Get the list model
	 *
	 * @return FabrikFEModelList List model
	 */
	public function getlistModel()
	{
		$app = Factory::getApplication();

		if (!isset($this->listModel))
		{
			$this->listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
			$this->listModel->setId($app->getInput()->getInt('listid'));
		}

		return $this->listModel;
	}

	/**
	 * Determine if the imported data has existing correlating elements
	 *
	 * @return  null
	 */
	public function findExistingElements()
	{
		$model = $this->getlistModel();
		$model->getFormGroupElementData();

		/** @var FabrikFEModelPluginmanager $pluginManager */
		$pluginManager =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Pluginmanager',
'FabrikFEModel');
		$pluginManager->getPlugInGroup('list');
		$formModel   = $model->getFormModel();
		$tableParams = $model->getParams();
		$mode        = $tableParams->get('csvfullname');
		$intKey      = 0;
		$groups      = $formModel->getGroupsHiarachy();
		$elementMap  = array();

		// $$ Phil - Get 'Show in List' elements from menu (if
'use show in list') or set as empty array if not
		$use_sil =
FabrikWorker::getMenuOrRequestVar('csv_import_sil_only',
'0', false, 'menu');
		$list_elements = $use_sil ?
FabrikWorker::getMenuOrRequestVar('list_elements', '',
false, 'menu') : '';
		$showinlist = !empty($list_elements) ? json_decode($list_elements, 1) :
array();

		if(!empty($showinlist))
		{
			$showinlist = $showinlist['show_in_list'];
		}
        
		// $$ hugh - adding $rawMap so we can tell prepareCSVData() if data is
already raw
		$rawMap = array();

		foreach ($this->headings as $heading)
		{
			$found = false;

			foreach ($groups as $groupModel)
			{
				$elementModels = $groupModel->getMyElements();

				foreach ($elementModels as $elementModel)
				{
					$element = $elementModel->getElement();

                    // $$ Phil - Only include elements set in menu show in
list, or if not set at all
                    $elid = (int) $element->id;

					if(empty($showinlist) || in_array($elid,$showinlist)) {

					    switch ($mode)
					    {
						    case 0:
							    $name = $element->name;
							    break;
						    case 1:
    							$name = $elementModel->getFullName(false, false);
	    						break;
		    				case 2:
			    				$name = $element->label;
				    			break;
					    }

					    $paramsKey = $elementModel->getFullName(false, false);

					    if (StringHelper::strtolower(trim($heading)) ==
StringHelper::strtolower(trim($name)))
					    {
					    	if (!array_key_exists($paramsKey, $this->matchedHeadings))
						    {
							    // Heading found in table
							    $this->matchedHeadings[$paramsKey]         =
$element->name;
							    $this->aUsedElements[strtolower($heading)] = $elementModel;
							    $elementMap[$intKey]                       = clone
($elementModel);
							    $rawMap[$intKey]                           = false;
							    $found                                     = true;

							    // Break out of the group foreach
							    break;
						    }
					    }

					    $paramsKey .= '_raw';

					    if (StringHelper::strtolower(trim($heading)) ==
StringHelper::strtolower(trim($name)) . '_raw')
					    {
						    if (!array_key_exists($paramsKey, $this->matchedHeadings))
						    {
							    // Heading found in table
							    $this->matchedHeadings[$paramsKey]                  =
$element->name . '_raw';
							    $this->aUsedElements[strtolower($heading) . '_raw']
= $elementModel;
							    $found                                              = true;
							    $elementMap[$intKey]                                = clone
($elementModel);
							    $rawMap[$intKey]                                    = true;

							    // Break out of the group foreach
							    break;
						    }
					    }

					    // Joined element params
					    if ($elementModel->isJoin())
					    {
						    $paramsKey = $elementModel->getJoinParamsKey();
						    $idKey     = $elementModel->getJoinIdKey();

    						if ($paramsKey === $heading || $idKey === $heading)
	    					{
		    					if (!array_key_exists($paramsKey, $this->matchedHeadings))
			    				{
				    				$found = true;

					    			// Break out of the group foreach
						    		break;
							    }
						    }
					    }
				    }
				}    
			}

			// Moved after repeat group otherwise elements in second group are never
found
			if (!$found && !in_array($heading, $this->newHeadings)
&& trim($heading) !== '')
			{
				$this->newHeadings[] = $heading;
			}

			$intKey++;
		}

		foreach ($elementMap as $key => $elementModel)
		{
			$element = $elementModel->getElement();
			$elementModel->prepareCSVData($this->data, $key, $rawMap[$key]);
		}
	}

	/**
	 * Work out which published elements are not included
	 *
	 * @return array element models whose defaults should be added to each of
the imported
	 * data's array. Keyed on element name.
	 */
	protected function defaultsToAdd()
	{
		$model         = $this->getListModel();
		$elements      = $model->getElements();
		$defaultsToAdd = array();
		$elementKeys   = array_keys($elements);

		foreach ($elementKeys as $e)
		{
			$e2 = str_replace('`', '', $e);

			if (!array_key_exists($e2, $this->matchedHeadings) &&
!array_key_exists($e2 . '_raw', $this->matchedHeadings))
			{
				$elementModel                                           =
$elements[$e];
				$defaultsToAdd[FabrikString::safeColNameToArrayKey($e)] =
$elementModel;
			}
		}

		return $defaultsToAdd;
	}

	/**
	 * Insert data into a fabrik table
	 *
	 * @deprecated use insertData instead
	 *
	 * @return null
	 */
	public function makeTableFromCSV()
	{
		$this->insertData();
	}

	/**
	 * Insert data into a Fabrik list
	 *
	 * @return null
	 */
	public function insertData()
	{
		$origMaxExecution = ini_get("max_execution_time");
		ini_set("max_execution_time", 300);

		$app                 = Factory::getApplication();
		$jForm               = $app->getInput()->get('jform',
array(), 'array');
		
		// Default to menu / request, allow override by UI (jform) options
        $dropData =
FabrikWorker::getMenuOrRequestVar('csv_import_dropdata',
'0', false, 'menu');
        $dropData = (int) FArrayHelper::getValue($jForm,
'drop_data', $dropData);

        $overWrite =
FabrikWorker::getMenuOrRequestVar('csv_import_overwrite',
'0', false, 'menu');
        $overWrite = (int) FArrayHelper::getValue($jForm,
'overwrite', $overWrite);
		
		$model               = $this->getlistModel();
		$model->importingCSV = true;
		$formModel           = $model->getFormModel();

		// $$$ rob 27/17/212 we need to reset the form as it was first generated
before its elements were created.
		$formModel->reset();

		FabrikWorker::getPluginManager()->runPlugins('onStartImportCSV',
$model, 'list');

		if ($dropData && $model->canEmpty())
		{
			$model->truncate();
		}

		$item        = $model->getTable();
		$tableParams = $model->getParams();
		$csvFullName = $tableParams->get('csvfullname', 0);

		$key = FabrikString::shortColName($item->db_primary_key);

		// Get a list of existing primary key values
		$db    = $model->getDb();
		$query = $db->getQuery(true);
		$query->select($item->db_primary_key)->from($item->db_table_name);
		$db->setQuery($query);
		$aExistingKeys = $db->loadColumn();
		$this->addedCount = 0;
		$updatedCount     = 0;

		// $$$ rob we are no longer removing the element joins from $joins
		// so lets see if any of $joins are table joins.
		$tableJoinsFound = $this->tableJoinsFound();

		$joinData      = array();
		$defaultsToAdd = $this->defaultsToAdd();

		foreach ($this->data as $data)
		{
			$aRow  = array();
			$pkVal = null;
			$i     = 0;

			foreach ($this->matchedHeadings as $headingKey => $heading)
			{
				switch ($csvFullName)
				{
					case 0:
						break;
					case 1:
						$heading = explode('.', $heading);
						$heading = array_pop($heading);
						break;
					case 2:
						break;
				}

				// Test _raw key and use that
				if (StringHelper::substr($heading, StringHelper::strlen($heading) - 4,
StringHelper::strlen($heading)) == '_raw')
				{
					$pkTestHeading = StringHelper::substr($heading, 0,
StringHelper::strlen($heading) - 4);
				}
				else
				{
					$pkTestHeading = $heading;
				}
				/*
				 * $$$rob isset($pkVal) because: It could be that you have two elements
(short names) with the
				 * same name (if trying to import joined data, in this case I'm
				 * presuming that the master table's pkval is the first one you
come to
				 */

				if ($pkTestHeading == $key && !isset($pkVal))
				{
					$pkVal = $data[$i];
				}

				$aRow[str_replace('.', '___', $headingKey)] =
$data[$i];
				$i++;
			}

            /* $$ Phil moved down. Why would you addDefaults unless you
were adding a new row???
             * If not new row, and not drop_data and/or if overwrite, this
would overwrite 
             * existing fields that are not included in the import data
with their default value!
             */
            // $this->addDefaults($aRow);
            
			$model->getFormGroupElementData();
			$this->setRawDataAsPriority($aRow);

			if ($overWrite && in_array($pkVal, $aExistingKeys))
			{
				$formModel->rowId = $pkVal;
				$updatedCount++;
				$model->csvOverwriting = true;
			}
			else
			{
			    // $$ Phil - Moved from above
			    $this->addDefaults($aRow);
			    
				if ($item->auto_inc)
				{
					// If not overwriting ensure the any existing PK's are removed
and the form rowId set to ''
					$pk    =
FabrikString::safeColNameToArrayKey($item->db_primary_key);
					$rawPk = $pk . '_raw';
					unset($aRow[$pk]);
					unset($aRow[$rawPk]);
					$formModel->rowId = '';
					$formModel->setInsertId('');
					$model->csvOverwriting = false;
				}
				else
				{
					// If not auto-inc then we should keep the rowid value
					// but set the form model rowId to '' to enable inserts
					$formModel->rowId = '';

					// Set to true to avoid list model unsetting pk value
					$model->csvOverwriting = true;
				}

				$this->addedCount++;

			}

			// $$$ rob - if raw and none raw or just raw found then insert the raw
data
			// into the none raw key. Otherwise if just importing raw data no data
stored
			foreach ($aRow as $k => $val)
			{
				if (StringHelper::substr($k, StringHelper::strlen($k) - 4,
StringHelper::strlen($k)) == '_raw')
				{
					$noneraw        = StringHelper::substr($k, 0, strlen($k) - 4);
					$aRow[$noneraw] = $val;
				}
			}

			if (!$tableJoinsFound)
			{
				$formModel->formData = $formModel->formDataWithTableName = $aRow;

				if (!in_array(false,
FabrikWorker::getPluginManager()->runPlugins('onImportCSVRow',
$model, 'list')))
				{
					$rowid = $formModel->processToDB();
					$args = new \stdClass();
					$args->rowid = $rowid;
					FabrikWorker::getPluginManager()->runPlugins('onAfterImportCSVRow',
$model, 'list', $args);
				}
			}
			else
			{
				// Merge multi line csv into one entry & defer till we've
passed everything
				$joinData = $this->_fakeJoinData($joinData, $aRow, $pkVal,
$formModel);
			}
		}

		if ($tableJoinsFound)
		{
			$this->insertJoinedData($joinData);
		}

		$this->removeCSVFile();
		$this->updatedCount = $updatedCount;

		FabrikWorker::getPluginManager()->runPlugins('onCompleteImportCSV',
$model, 'list');

		ini_set('max_execution_time', $origMaxExecution);
	}

	/**
	 * Add in per row default values for missing elements
	 *
	 * @param   array &$aRow Import CSV data
	 */
	private function addDefaults(&$aRow)
	{
		$defaultsToAdd = $this->defaultsToAdd();

		foreach ($defaultsToAdd as $k => $elementModel)
		{
			/* Added check as defaultsToAdd ALSO contained element keys for those
elements which
			 * are created from new csv columns, which previously didn't exist
in the list
			 */
			if (!array_key_exists($k, $aRow))
			{
				$aRow[$k] = $elementModel->getDefaultValue($aRow);
			}

			if (!array_key_exists($k . '_raw', $aRow))
			{
				$aRow[$k . '_raw'] = $aRow[$k];
			}
		}
	}

	/**
	 * Take any _raw values and replace their real elements with their data
	 *
	 * @param   array &$aRow Importing CSV Data
	 */
	private function setRawDataAsPriority(&$aRow)
	{
		foreach ($aRow as $k => $val)
		{
			if (StringHelper::substr($k, StringHelper::strlen($k) - 4,
StringHelper::strlen($k)) == '_raw')
			{
				$noneraw = StringHelper::substr($k, 0, StringHelper::strlen($k) - 4);

				if (array_key_exists($noneraw, $aRow))
				{
					// Complete madness for encoding issue with fileupload ajax + single
upload max
					preg_match('/params":"(.*)"\}\]/', $val,
$matches);

					if (count($matches) == 2)
					{
						$replace = addSlashes($matches[1]);
						$val     = preg_replace('/params":"(.*)\}\]/',
'params":"' . $replace . '"}]', $val,
-1, $c);
					}
					$aRow[$noneraw] = $val;
					unset($aRow[$k]);
				}
			}
		}
	}

	/**
	 * Does the list contain table joins
	 *
	 * @return boolean
	 */
	private function tableJoinsFound()
	{
		$found = false;
		$joins = $this->getJoins();

		for ($x = 0; $x < count($joins); $x++)
		{
			if ((int) $joins[$x]->list_id !== 0 &&
$joins[$x]->element_id === 0)
			{
				$found = true;
			}
		}

		return $found;
	}

	/**
	 * Get the update message to show the user, # elements added, rows update
and rows added
	 *
	 * @since   3.0.8
	 *
	 * @return  string
	 */
	public function updateMessage()
	{
		$elementsCreated = $this->countElementsCreated();

		if ($elementsCreated == 0)
		{
			$msg = Text::sprintf('COM_FABRIK_CSV_ADDED_AND_UPDATED',
$this->addedCount, $this->updatedCount);
		}
		else
		{
			$msg =
Text::sprintf('COM_FABRIK_CSV_ADD_ELEMENTS_AND_RECORDS_AND_UPDATED',
$elementsCreated, $this->addedCount, $this->updatedCount);
		}

		return $msg;
	}

	/**
	 * Calculate the number of elements that have been added during the import
	 *
	 * @since  3.0.8
	 *
	 * @return number
	 */
	protected function countElementsCreated()
	{
		$app    = Factory::getApplication();
		$input  = $app->getInput();
		$listId = $input->getInt('fabrik_list',
$input->get('listid'));

		if ($listId == 0)
		{
			$elementsCreated = count($this->newHeadings);
		}
		else
		{
			$elementsCreated = 0;
			$newElements     = $input->get('createElements', array(),
'array');

			foreach ($newElements as $k => $v)
			{
				if ($v == 1)
				{
					$elementsCreated++;
				}
			}
		}

		return $elementsCreated;
	}

	/**
	 * Once we have iterated over all of the csv file and recreated
	 * the join data, we can finally allow the lists form to process it
	 *
	 * @param   array $joinData data
	 *
	 * @return  void
	 */
	private function insertJoinedData($joinData)
	{
		// Ensure that the main row data doesn't contain and joined data
(keep [join][x] though
		$model  = $this->getListModel();
		$app    = Factory::getApplication();
		$table  = $model->getTable();
		$dbName = $table->db_table_name;

		foreach ($joinData as &$j)
		{
			foreach ($j as $k => $v)
			{
				if (!is_array($v))
				{
					if (array_shift(explode('___', $k)) !=
$table->db_table_name)
					{
						unset($j[$k]);
					}
				}
			}
		}

		$formModel = $model->getFormModel();
		$groups    = $formModel->getGroupsHiarachy();
		$groupIds  = array();

		foreach ($groups as $group)
		{
			if ($group->isJoin())
			{
				$groupIds[$group->getGroup()->join_id] =
$group->getGroup()->id;
			}
		}

		foreach ($joinData as $data)
		{
			// Reset the table's name back to the main table
			$table->db_table_name = $dbName;
			$fabrik_repeat_group  = array();
			$js                   = FArrayHelper::getValue($data, 'join',
array());

			foreach ($js as $jid => $jdata)
			{
				// Work out max num of repeated data to insert
				$counter = 0;

				foreach ($jdata as $v)
				{
					if (count($v) > $counter)
					{
						$counter = count($v);
					}
				}

				$groupId                       = $groupIds[$jid];
				$fabrik_repeat_group[$groupId] = $counter;
			}
			// $$$ rob here we're setting up fabrik_repeat_group to allow the
form to 'know' how many repeated records to insert.
			$app->getInput()->set('fabrik_repeat_group',
$fabrik_repeat_group);
			$formModel->formData = $data;

			if (!in_array(false,
FabrikWorker::getPluginManager()->runPlugins('onImportCSVRow',
$model, 'list')))
			{
				$formModel->processToDB();
			}
		}
	}

	/**
	 * As each csv row is in a single line we need to fake the join data
before
	 * sending it of to be processed by the form model
	 * Look at the list model and get all table joins
	 * then insert data into the row
	 * NOTE: will probably only work for a 1:1 join result
	 *
	 * @param   array  $joinData   Merged join data
	 * @param   array  $aRow       Row
	 * @param   mixed  $pkVal      Primary key value
	 * @param   object &$formModel Form model
	 *
	 * @return  array    updated join data
	 */
	private function _fakeJoinData($joinData, $aRow, $pkVal, &$formModel)
	{
		$origData     = $aRow;
		$app          = Factory::getApplication();
		
		// $$ Phil changed to let overwrite from menu take precidence
        $overWrite =
FabrikWorker::getMenuOrRequestVar('csv_import_overwrite','',false,'menu');
		if($overWrite=='') $overWrite =
$app->getInput()->getInt('overwrite', 0, 'post');

		$joins        = $this->getJoins();
		$groups       = $formModel->getGroups();
		$updatedCount = 0;

		if (!empty($joins))
		{
			// A new record that will need to be inserted
			if (!array_key_exists($pkVal, $joinData))
			{
				$joinData[$pkVal] = array();
			}

			foreach ($aRow as $k => $v)
			{
				if (!array_key_exists($k, $joinData[$pkVal]))
				{
					$joinData[$pkVal][$k] = $v;
				}
			}

			if (!array_key_exists('join', $joinData[$pkVal]))
			{
				$joinData[$pkVal]['join'] = array();
			}

			foreach ($joins as $join)
			{
				// Only iterate over table joins (exclude element joins)
				if ((int) $join->element_id != 0)
				{
					continue;
				}

				$repeat = $groups[$join->group_id]->canRepeat();
				$keys   = $this->getJoinPkRecords($join);

				if ($overWrite && in_array($pkVal, $keys))
				{
					// Not sure 2nd test is right here
					$origData[$join->table_key] = $pkVal;
					$updatedCount++;
				}
				else
				{
					$origData[$join->table_join . '___' .
$join->table_key] = 0;
					$this->addedCount++;
				}

				$origData[$join->table_join . '___' .
$join->table_join_key] = $pkVal;

				foreach ($origData as $key => $val)
				{
					$t = array_shift(explode('___', $key));

					if ($t == $join->table_join)
					{
						if ($repeat)
						{
							$joinData[$pkVal]['join'][$join->id][$key][] = $val;
						}
						else
						{
							$joinData[$pkVal]['join'][$join->id][$key] = $val;
						}
					}
				}
			}
		}

		return $joinData;
	}

	/**
	 * Get Join Primary Key values
	 *
	 * @param   object $join join row
	 *
	 * @return  array
	 */

	private function getJoinPkRecords($join)
	{
		$model     = $this->getlistModel();
		$formModel = $model->getFormModel();

		if (!isset($this->joinpkids))
		{
			$this->joinpkids = array();
		}

		if (!array_key_exists($join->id, $this->joinpkids))
		{
			$db    = $model->getDb();
			$query = $db->getQuery(true);
			$query->select($join->table_key)->from($join->table_join);
			$db->setQuery($query);
			$this->joinpkids[$join->id] = $db->loadColumn();
		}

		return $this->joinpkids[$join->id];
	}

	/**
	 * Get list model joins
	 *
	 * @return  array    joins
	 */
	public function getJoins()
	{
		if (!isset($this->joins))
		{
			$model = $this->getlistModel();

			// Move the join table data into their own array space
			$this->joins = $model->getJoins();
		}

		return $this->joins;
	}

	/**
	 * Create an error message
	 *
	 * @return  string
	 */
	public function makeError()
	{
		$str = Text::_('COM_FABRIK_CSV_FIELDS_NOT_IN_TABLE');

		foreach ($this->newHeadings as $heading)
		{
			$str .= $heading . ', ';
		}

		return $str;
	}

	/**
	 * Get an array of headings that should be added as part of the  import
	 *
	 * @return array
	 */
	public function getNewHeadings()
	{
		return $this->newHeadings;
	}

	/**
	 * Determine if the choose-element-types view should contain a column
where
	 * the user selects the field to be the pk.
	 * Should return false if the user has asked for the importer to
automatically create a
	 * primary key
	 *
	 * @return  bool    true if column shown
	 */
	public function getSelectKey()
	{
		$app    = Factory::getApplication();
		$input  = $app->getInput();
		$post   = $input->get('jform', array(), 'array');
		$addKey = (int) FArrayHelper::getValue($post, 'addkey', 0);
		$task   = $input->get('task', '',
'string');

		// $$$ rob 30/01/2012 - if in csvimport cron plugin then we have to
return true here
		// otherwise a blank column is added to the import data meaning overwrite
date dunna workie
		if ($input->getBool('cron_csvimport'))
		{
			return true;
		}

		if ($addKey === 1)
		{
			return false;
		}

		// Admin import csv to new list: user not asking Fabrik to automatically
create a pk
		if ($task === 'makeTableFromCSV' && $addKey === 0)
		{
			return true;
		}

		// Reimporting into existing list - should return true
    	// $$ Phil changed because if from frontend menu $task is
'input.doimport'
		// if ($input->getInt('listid') !== 0 && $task ===
'doimport')
        if ($input->getInt('listid') !== 0 &&
strpos($task,'doimport') !== false)
    	{
			return true;
		}

		if (trim($this->getlistModel()->getPrimaryKey() ?? '')
!== '')
		{
			return false;
		}

		return true;
	}

	/**
	 * Get the csv files headings
	 *
	 * @return  array
	 */
	public function getHeadings()
	{
		return $this->headings;
	}
}

/**
 * This class will parse a csv file in either standard or MS Excel format.
 * Two methods are provided to either process a line at a time or return
the whole csv file as an array.
 *
 * It can deal with:
 * - Line breaks within quoted fields
 * - Character separator (usually a comma or semicolon) in quoted fields
 * - Can leave or remove leading and trailing \s or \t
 * - Can leave or skip empty rows.
 * - Windows and Unix line breaks dealt with automatically. Care must be
taken with Macintosh format.
 *
 * Also, the escape character is automatically removed.
 *
 * NOTICE:
 * - Quote character can be escaped by itself or by using an escape
character, within a quoted field (i.e. "" or \"
 * will work)
 *
 * $csv = & new Csv_Bv('test.csv', ';',
'"' , '\\');
 * $csv->SkipEmptyRows(TRUE); // Will skip empty rows. TRUE by default.
(Shown here for example only).
 * $csv->TrimFields(TRUE); // Remove leading and trailing \s and \t.
TRUE by default.
 *
 * while ($row = $csv->NextLine()) {
 *
 *         echo "<br><br>Processing line ".
$csv->RowCount() . "<br>";
 *         echo implode(' , ', $row);
 *
 * }
 *
 * echo "<br><br>Number of returned rows:
".$csv->RowCount();
 * echo "<br><br>Number of skipped rows:
".$csv->SkippedRowCount();
 *
 * ----
 * OR using the csv2array function.
 * ----
 *
 * $csv = & new Csv_Bv('test.csv', ';',
'"' , '\\');
 * $csv->SkipEmptyRows(TRUE); // Will skip empty rows. TRUE by default.
(Shown here for example only).
 * $csv->TrimFields(TRUE); // Remove leading and trailing \s and \t.
TRUE by default.
 *
 * $_arr = $csv->csv2Array();
 *
 * echo "<br><br>Number of returned rows:
".$csv->RowCount();
 * echo "<br><br>Number of skipped rows:
".$csv->SkippedRowCount();
 *
 *
 * WARNING:
 * - Macintosh line breaks need to be dealt with carefully. See the PHP
help files for the function 'fgetcsv'
 *
 * The coding standards used in this file can be found here:
http://www.dagbladet.no/development/phpcodingstandard/
 *
 *    All comments and suggestions are welcomed.
 *
 * SUPPORT: Visit http://vhd.com.au/forum/
 *
 * CHANGELOG:
 *
 * - Fixed skipping of last row if the last row did not have a new line.
Thanks to Florian Bruch and Henry Flurry.
 * (2006_05_15)
 * - Changed the class name to Csv_Bv for consistency. (2006_05_15)
 * - Fixed small problem where line breaks at the end of file returned a
warning (2005_10_28)
 *
 * @version    Release: 1.2
 * @category   Joomla
 * @package    Fabrik
 * @author     Ben Vautier <classes@vhd.com.au>
 * @copyright  2006 Ben Vautier
 * @since      3.0
 *
 */
class Csv_Bv
{
	/**
	 * Seperator character
	 *
	 * @var char
	 */
	protected $mFldSeperator;

	/**
	 * Enclose character
	 *
	 * @var char
	 */
	protected $mFldEnclosure;

	/**
	 * Escape character
	 *
	 * @var char
	 */
	protected $mFldEscapor;

	/**
	 * Length of the largest row in bytes.Default is 4096
	 *
	 * @var int
	 */
	protected $mRowSize;

	/**
	 * Holds the file pointer
	 *
	 * @var resource
	 */
	public $mHandle;

	/**
	 * Counts the number of rows that have been returned
	 *
	 * @var int
	 */
	protected $mRowCount;

	/**
	 * Counts the number of empty rows that have been skipped
	 *
	 * @var int
	 */
	protected $mSkippedRowCount;

	/**
	 * Determines whether empty rows should be skipped or not.
	 * By default empty rows are returned.
	 *
	 * @var boolean
	 */
	protected $mSkipEmptyRows;

	/**
	 * Specifies whether the fields leading and trailing \s and \t should be
removed
	 * By default it is TRUE.
	 *
	 * @var boolean
	 */
	protected $mTrimFields;

	/**
	 * $$$ rob 15/07/2011
	 *  'excel' or 'csv', if excel then convert
'UTF-16LE' to 'UTF-8' with iconv when reading in lines
	 *
	 * @var string
	 */
	public $inPutFormat = 'csv';

	/**
	 * Constructor
	 *
	 * Only used to initialise variables.
	 *
	 * @param   string $file      file path
	 * @param   string $seperator Only one character is allowed (optional)
	 * @param   string $enclose   Only one character is allowed (optional)
	 * @param   string $escape    Only one character is allowed (optional)
	 */

	public function __construct($file, $seperator = ',', $enclose =
'"', $escape = '')
	{
		$this->mFldSeperator    = $seperator;
		$this->mFldEnclosure    = $enclose;
		$this->mFldEscapor      = $escape;
		$this->mSkipEmptyRows   = true;
		$this->mTrimFields      = true;
		$this->htmlentity       = true;
		$this->mRowCount        = 0;
		$this->mSkippedRowCount = 0;
		$this->mRowSize         = 4096;

		// Open file
		$this->mHandle = @fopen($file, "r") or
trigger_error('Unable to open csv file', E_USER_ERROR);
	}

	/**
	 * uft 8 decode
	 *
	 * @param   string $string decode strong
	 *
	 * @return unknown|mixed
	 */

	protected function charset_decode_utf_8($string)
	{
		/* Only do the slow convert if there are 8-bit characters */
		/* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */
		if (!preg_match("/[\200-\237]/", $string) and
!preg_match("/[\241-\377]/", $string))
		{
			return $string;
		}

		// Decode three byte unicode characters
		$pattern = "/([\340-\357])([\200-\277])([\200-\277])/";
		$string  = preg_replace_callback(
			$pattern,
			function ($m)
			{
				return '&#' . ((ord($m[1]) - 224) * 4096 + (ord($m[2]) -
128) * 64 + (ord($m[3]) - 128));
			},
			$string
		);

		// Decode two byte unicode characters
		$string = preg_replace_callback(
			"/([\300-\337])([\200-\277])/",
			function ($m)
			{
				return '&#' . ((ord($m[1]) - 192) * 64 + (ord($m[2]) -
128));
			},
			$string
		);

		return $string;
	}

	/**
	 * csv::NextLine() returns an array of fields from the next csv line.
	 *
	 * The position of the file pointer is stored in PHP internals.
	 *
	 * Empty rows can be skipped
	 * Leading and trailing \s and \t can be removed from each field
	 *
	 * @return  array  of fields
	 */

	public function NextLine()
	{
		if (feof($this->mHandle))
		{
			return false;
		}

		$arr_row = fgetcsv($this->mHandle, $this->mRowSize,
$this->mFldSeperator, $this->mFldEnclosure);
		$this->mRowCount++;

		// Skip empty rows if asked to
		if ($this->mSkipEmptyRows)
		{
            /* $$ Phil changed - $arr_row (fgetcsv) could be false (if any
errors or EOF) 
             * and so needs to be include in this if condition so as to
return false
             */
			// if ($arr_row[0] === '' && count($arr_row) === 1)
			if (!$arr_row || ($arr_row[0] === '' &&
count($arr_row) === 1))
			{
				$this->mRowCount--;
				$this->mSkippedRowCount++;
				$arr_row = $this->NextLine();

				// This is to avoid a warning when empty lines are found at the very
end of a file.
				if (!is_array($arr_row))
				{
					// This will only happen if we are at the end of a file.
					return false;
				}
			}
		}

		if (is_array($arr_row))
		{
			if ($this->inPutFormat == 'excel' || $this->inPutFormat
== 'fabrikexcel')
			{
				$encFrom = $this->inPutFormat == 'fabrikexcel' ?
'UTF-16LE' : 'Windows-1252';

				foreach ($arr_row as $k => $v)
				{
					$arr_row[$k] = trim($arr_row[$k]);

					if ($arr_row[$k] !== '')
					{
						$arr_row[$k] = iconv($encFrom, 'UTF-8', $arr_row[$k]);
						$arr_row[$k] = str_replace('""',
'"', $arr_row[$k]);
						$arr_row[$k] = preg_replace("/^\"(.*)\"$/sim",
"$1", $arr_row[$k]);
					}
				}
			}
		}
		// Remove leading and trailing spaces \s and \t
		if ($this->mTrimFields && is_array($arr_row))
		{
			array_walk($arr_row, array($this, 'ArrayTrim'));
		}

		/**
		 * Remove escape character if it is not empty and different from the
enclose character
		 * otherwise fgetcsv removes it automatically and we don't have to
worry about it.
		 */
		if ($this->mFldEscapor !== '' &&
$this->mFldEscapor !== $this->mFldEnclosure &&
is_array($arr_row))
		{
			array_walk($arr_row, array($this, 'ArrayRemoveEscapor'));
		}

		// Remove leading and trailing spaces \s and \t
		if ($this->htmlentity && is_array($arr_row))
		{
			array_walk($arr_row, array($this, 'charset_decode_utf_8'));
		}

		return $arr_row;
	}

	/**
	 * csv::Csv2Array will return the whole csv file as 2D array
	 *
	 * @return  array
	 */

	public function Csv2Array()
	{
		$arr_csv = array();

		while ($arr_row = $this->NextLine())
		{
			$arr_csv[] = $arr_row;
		}

		return $arr_csv;
	}

	/**
	 * csv::ArrayTrim will remove \s and \t from an array
	 *
	 * It is called from array_walk.
	 *
	 * @param   string &$item string to trim
	 * @param   string $key   not used
	 *
	 * @return  void
	 */

	protected Function ArrayTrim(&$item, $key)
	{
		// Space and tab
		$item = trim($item, " \t");
	}

	/**
	 * csv::ArrayRemoveEscapor will escape the enclose character
	 * It is called from array_walk.
	 *
	 * @param   string &$item string to trim
	 * @param   string $key   not used
	 *
	 * @return  void
	 */

	protected function ArrayRemoveEscapor(&$item, $key)
	{
		$item = str_replace($this->mFldEscapor . $this->mFldEnclosure,
$this->mFldEnclosure, $item);
	}

	/**
	 * Htmlenties a string
	 *
	 * @param   string &$item string to trim
	 * @param   string $key   not used
	 *
	 * @return  void
	 */

	protected function htmlentity(&$item, $key)
	{
		$item = htmlentities($item);
	}

	/**
	 * csv::RowCount return the current row count
	 *
	 * @access public
	 * @return int
	 */
	public function RowCount()
	{
		return $this->mRowCount;
	}

	/**
	 * csv::RowCount return the current skipped row count
	 *
	 * @return int
	 */

	public function SkippedRowCount()
	{
		return $this->mSkippedRowCount;
	}

	/**
	 * csv::SkipEmptyRows, sets whether empty rows should be skipped or not
	 *
	 * @param   bool $bool skip empty rows
	 *
	 * @return void
	 */

	public function SkipEmptyRows($bool = true)
	{
		$this->mSkipEmptyRows = $bool;
	}

	/**
	 * csv::TrimFields, sets whether fields should have their \s and \t
removed.
	 *
	 * @param   bool $bool set trim fields state
	 *
	 * @return  null
	 */

	public function TrimFields($bool = true)
	{
		$this->mTrimFields = $bool;
	}
}
models/index.html000064400000000000151165347420010022
0ustar00models/join.php000064400000014064151165347420007514
0ustar00<?php
/**
 * Fabrik Join Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Table\Table;
use \Joomla\Registry\Registry;

jimport('joomla.application.component.model');

/**
 * Fabrik Join Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikFEModelJoin extends FabModel
{
	/**
	 * Join table
	 *
	 * @var object
	 */
	protected $join = null;

	/**
	 * Join id to load
	 *
	 * @var int
	 */
	protected $id = null;

	/**
	 * Data to bind to Join table
	 *
	 * @var array
	 */
	protected $data = null;

	/**
	 * Whether the joined table is a MySQL view
	 *
	 * @var bool
	 */
	protected $isView = null;

	/**
	 * Params
	 *
	 * @var string
	 */
	public $params = null;
	/**
	 * Set the join id
	 *
	 * @param   int  $id  join id
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		$this->id = $id;
	}

	/**
	 * Get the join id
	 *
	 * @return  int  join id
	 */
	public function getId()
	{
		return $this->id;
	}

	/**
	 * Set data
	 *
	 * @param   array  $data  to set to
	 *
	 * @return  void
	 */
	public function setData($data)
	{
		$this->data = $data;
	}

	/**
	 * Get Join
	 *
	 * @return  FabrikTableJoin
	 */
	public function getJoin()
	{
		if (!isset($this->join))
		{
			$this->join = FabTable::getInstance('join',
'FabrikTable');

			if (isset($this->data))
			{
				$this->join->bind($this->data);
			}
			else
			{
				$this->join->load($this->id);
			}

			$this->paramsType($this->join);
		}

		return $this->join;
	}

	/**
	 * When loading the join Table ensure its params are set to be a Registry
item
	 *
	 * @param   Table  &$join  Join table
	 *
	 * @return  void
	 */
	private function paramsType(&$join)
	{
		if (is_string($join->params))
		{
			$join->params = trim($join->params) == '' ?
'{"type": ""}' : $join->params;
			$join->params = new Registry($join->params);
		}

		// Set a default join alias - normally overwritten in
listModel::_makeJoinAliases();
		$join->table_join_alias = $join->table_join;
	}

	/**
	 * Clear the join
	 *
	 * @return  void
	 */
	public function clearJoin()
	{
		unset($this->join);
	}

	/**
	 * Load the model from the element id
	 *
	 * @param   string  $key  Db table key
	 * @param   int     $id   Key value
	 *
	 * @return  FabTable  join
	 */
	public function getJoinFromKey($key, $id)
	{
		if (!isset($this->join))
		{
			$this->join = FabTable::getInstance('join',
'FabrikTable');
			$this->join->load(array($key => $id));
			$this->paramsType($this->join);
		}

		return $this->join;
	}

	/**
	 * Get joined table's primary key
	 *
	 * @param   string  $glue  Between table and field name
	 *
	 * @return  string
	 */
	public function getForeignID($glue = '___')
	{
		$join = $this->getJoin();
		$pk = $join->params->get('pk');
		if (!empty($pk)) {
			$pk = str_replace('`', '', $pk);
			$pk = str_replace('.', $glue, $pk);
		}

		return $pk;
	}

	/**
	 * Get the join foreign key
	 *
	 * @param   string  $glue  Between table and field name
	 *
	 * @return string
	 */
	public function getForeignKey($glue = '___')
	{
		$join = $this->getJoin();
		$fk = $join->table_join . $glue . $join->table_join_key;

		return $fk;
	}

	/**
	 * Get the join Primary key
	 *
	 * @param   string  $glue  Between table and field name
	 *
	 * @return string
	 */
	public function getPrimaryKey($glue = '___')
	{
		$join = $this->getJoin();
		$fk = $join->join_from_table . $glue . $join->table_key;

		return $fk;
	}

	/**
	 * Get joined to table primary key
	 *
	 * @param   string  $glue  Between table and field name
	 *
	 * @return string
	 */
	public function getJoinedToTablePk($glue = '___')
	{
		$join = $this->getJoin();

		return $join->join_from_table . $glue . $join->table_key;
	}

	/**
	 * Set the join element ID
	 *
	 * @param   int  $id  element id
	 *
	 * @return  void
	 */
	public function setElementId($id)
	{
		$this->join->element_id = $id;
	}

	/**
	 * deletes the loaded join and then
	 * removes all elements, groups & form group record
	 *
	 * @param   int  $groupId  the group id that the join is linked to
	 *
	 * @return void/JError
	 */
	public function deleteAll($groupId)
	{
		$db = FabrikWorker::getDbo(true);
		$query = $db->getQuery(true);
		$query->delete('
#__fabrik_elements')->where('group_id = ' . (int)
$groupId);
		$db->setQuery($query);
		$db->execute();
		$query->clear();
		$query->delete(' #__fabrik_groups')->where('id =
' . (int) $groupId);
		$db->setQuery($query);
		$db->execute();

		// Delete all form group records
		$query->clear();
		$query->delete('
#__fabrik_formgroup')->where('group_id = ' . (int)
$groupId);
		$db->setQuery($query);
		$db->execute();
		$this->getJoin()->delete();
	}

	/**
	 * saves the table join data
	 *
	 * @param   array  $source  data to save
	 *
	 * @return  bool
	 */
	public function save($source)
	{
		if (!$this->bind($source))
		{
			return false;
		}

		if (!$this->check())
		{
			return false;
		}

		if (!$this->store())
		{
			return false;
		}

		$this->_error = '';

		return true;
	}

	/**
	 * Tests if the table is in fact a view
	 * NOTE - not working yet, just committed so I can pull other changes
	 *
	 * @return  bool	true if table is a view
	 */
	public function isView()
	{
		$join = $this->getJoin();
		$params = $$join->params;
		$isView = $params->get('isview', null);

		if (!is_null($isView) && (int) $isView >= 0)
		{
			return $isView;
		}

		if (isset($this->isView))
		{
			return $this->isView;
		}

		$db = FabrikWorker::getDbo();
		$dbname = $join->table_join;
		$sql = " SELECT table_name, table_type, engine FROM
INFORMATION_SCHEMA.tables " . "WHERE table_name = " .
$db->quote($table->db_table_name)
		. " AND table_type = 'view' AND table_schema = " .
$db->quote($dbname);
		$db->setQuery($sql);
		$row = $db->loadObjectList();
		$this->isView = empty($row) ? 0 : 1;

		// Store and save param for following tests
		$params->set('isview', $this->isView);
		$join->params = (string) $params;
		$this->save($join);

		return $this->isView;
	}
}
models/list-advanced-search.php000064400000026077151165347420012545
0ustar00<?php
/**
 * List Advanced Search Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Session\Session;
use Joomla\String\StringHelper;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.model');

/**
 * List Advanced Search Class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.3.4
 */
class FabrikFEModelAdvancedSearch extends FabModel
{
	/**
	 * @var FabrikFEModelList
	 */
	protected $model;

	/**
	 * Previously submitted advanced search data
	 *
	 * @var array
	 */
	protected $advancedSearchRows = null;

	/**
	 * Set list model
	 *
	 * @param   FabrikFEModelList  $model
	 *
	 * @return void
	 */
	public function setModel($model)
	{
		$this->model = $model;
	}
	/**
	 * Called from
index.php?option=com_fabrik&view=list&layout=_advancedsearch&tmpl=component&listid=4
	 * advanced search popup view
	 *
	 * @return  object	advanced search options
	 */
	public function opts()
	{
		$model = $this->model;
		$params = $model->getParams();
		$opts = new stdClass;

		// $$$ rob - 20/208/2012 if list advanced search off return nothing
		if ($params->get('advanced-filter') == 0)
		{
			return $opts;
		}

		$defaultStatement =
$params->get('advanced-filter-default-statement',
'<>');
		$opts->defaultStatement = $defaultStatement;

		$list = $model->getTable();
		$listRef = $model->getRenderContext();
		$opts->conditionList = FabrikHelperHTML::conditionList($listRef,
'');
		list($fieldNames, $firstFilter) =
$this->getAdvancedSearchElementList();
		$statements = $this->getStatementsOpts();
		$opts->elementList = HTMLHelper::_('select.genericlist',
$fieldNames, 'fabrik___filter[list_' . $listRef .
'][key][]',
			'class="form-select-sm key" size="1" ',
'value', 'text');
		$opts->statementList = HTMLHelper::_('select.genericlist',
$statements, 'fabrik___filter[list_' . $listRef .
'][condition][]',
			'class="form-select-sm" ', 'value',
'text', $defaultStatement);
		$opts->listid = $list->id;
		$opts->listref = $listRef;
		$opts->ajax = $model->isAjax();
		$opts->counter = count($this->getadvancedSearchRows()) - 1;
		$elements = $model->getElements();
		$arr = array();

		foreach ($elements as $e)
		{
			$key = $e->getFilterFullName();
			$arr[$key] = array('id' => $e->getId(),
'plugin' => $e->getElement()->plugin);
		}

		$opts->elementMap = $arr;

		return $opts;
	}

	/**
	 * Get a list of elements that are included in the advanced search
drop-down list
	 *
	 * @return  array  list of fields names and which is the first filter
	 */
	private function getAdvancedSearchElementList()
	{
		$model = $this->model;
		$first = false;
		$firstFilter = false;
		$fieldNames[] = HTMLHelper::_('select.option', '',
Text::_('COM_FABRIK_PLEASE_SELECT'));
		$elementModels = $model->getElements();

		foreach ($elementModels as $elementModel)
		{
			if (!$elementModel->canView('list'))
			{
				continue;
			}

			$element = $elementModel->getElement();
			$elParams = $elementModel->getParams();

			if ($elParams->get('inc_in_adv_search', 1))
			{
				$elName = $elementModel->getFilterFullName();

				if (!$first)
				{
					$first = true;
					$firstFilter = $elementModel->getFilter(0, false);
				}

				$fieldNames[] = HTMLHelper::_('select.option', $elName,
strip_tags(Text::_($element->label)));
			}
		}

		return array($fieldNames, $firstFilter);
	}

	/**
	 * Build an array of html data that gets inserted into the advanced search
popup view
	 *
	 * @return  array	html lists/fields
	 */
	public function getAdvancedSearchRows()
	{
		if (isset($this->advancedSearchRows))
		{
			return $this->advancedSearchRows;
		}

		$model = $this->model;
		$statements = $this->getStatementsOpts();
		$input = $this->app->getInput();
		$rows = array();
		$elementModels = $model->getElements();
		list($fieldNames, $firstFilter) =
$this->getAdvancedSearchElementList();
		$prefix = 'fabrik___filter[list_' .
$model->getRenderContext() . '][';
		$type = '<input type="hidden" name="' .
$prefix . 'search_type][]" value="advanced"
/>';
		$grouped = '<input type="hidden" name="' .
$prefix . 'grouped_to_previous][]" value="0"
/>';
		$filters = $this->filterValues();
		$counter = 0;

		if (array_key_exists('key', $filters))
		{
			foreach ($filters['key'] as $key)
			{
				foreach ($elementModels as $elementModel)
				{
					$testKey =
FabrikString::safeColName($elementModel->getFullName(false, false));

					if ($testKey == $key)
					{
						break;
					}
				}

				$join = $filters['join'][$counter];
				$condition = $filters['condition'][$counter];
				$value = $filters['origvalue'][$counter];
				$v2 = $filters['value'][$counter];
				$jsSel = '=';

				switch ($condition)
				{
					case 'NOTEMPTY':
						$jsSel = 'NOTEMPTY';
						break;
					case 'EMPTY':
						$jsSel = 'EMPTY';
						break;
					case "<>":
						$jsSel = '<>';
						break;
					case "=":
						$jsSel = 'EQUALS';
						break;
					case "<":
						$jsSel = '<';
						break;
					case ">":
						$jsSel = '>';
						break;
					default:
						$firstChar = StringHelper::substr($v2, 1, 1);
						$lastChar = StringHelper::substr($v2, -2, 1);

						switch ($firstChar)
						{
							case '%':
								$jsSel = ($lastChar == '%') ? 'CONTAINS' :
$jsSel = 'ENDS WITH';
								break;
							default:
								if ($lastChar == '%')
								{
									$jsSel = 'BEGINS WITH';
								}
								break;
						}
						break;
				}

				if (is_string($value))
				{
					$value = trim(trim($value, '"'), '%');
				}

				if ($counter == 0)
				{
					$join = Text::_('COM_FABRIK_WHERE') . '<input
type="hidden" value="WHERE" name="' . $prefix
. 'join][]" />';
				}
				else
				{
					$join = FabrikHelperHTML::conditionList($model->getRenderContext(),
$join);
				}

				$lineElName =
FabrikString::safeColName($elementModel->getFullName(true, false));
				$orig = $input->get($lineElName);
				$input->set($lineElName, array('value' => $value));
				$filter = $elementModel->getFilter($counter, false);
				$input->set($lineElName, $orig);
				$key = HTMLHelper::_('select.genericlist', $fieldNames,
$prefix . 'key][]', 'class="form-select-sm key "
size="1" ', 'value', 'text', $key);
				$jsSel = HTMLHelper::_('select.genericlist', $statements,
$prefix . 'condition][]', 'class="form-select-sm "
size="1" ', 'value', 'text', $jsSel);
				$rows[] = array('join' => $join, 'element' =>
$key, 'condition' => $jsSel, 'filter' => $filter,
'type' => $type,
					'grouped' => $grouped);
				$counter++;
			}
		}

		if ($counter == 0)
		{
			$params = $model->getParams();
			$join = Text::_('COM_FABRIK_WHERE') . '<input
type="hidden" name="' . $prefix . 'join][]"
value="WHERE" />';
			$key = HTMLHelper::_('select.genericlist', $fieldNames,
$prefix . 'key][]', 'class="form-select-sm key"
size="1" ', 'value', 'text',
'');
			$defaultStatement =
$params->get('advanced-filter-default-statement',
'<>');
			$jsSel = HTMLHelper::_('select.genericlist', $statements,
$prefix . 'condition][]', 'class="form-select-sm"
size="1" ', 'value', 'text',
$defaultStatement);
			$rows[] = array('join' => $join, 'element' =>
$key, 'condition' => $jsSel, 'filter' =>
$firstFilter, 'type' => $type,
				'grouped' => $grouped);
		}

		$this->advancedSearchRows = $rows;

		return $rows;
	}

	/**
	 * Get a list of submitted advanced filters
	 *
	 * @return array advanced filter values
	 */
	public function filterValues()
	{
		$model = $this->model;
		$filters = $model->getFilterArray();
		$advanced = array();
		$iKeys = array_keys(FArrayHelper::getValue($filters, 'key',
array()));

		foreach ($iKeys as $i)
		{
			$searchType = FArrayHelper::getValue($filters['search_type'],
$i);

			if (!is_null($searchType) && $searchType ==
'advanced')
			{
				foreach (array_keys($filters) as $k)
				{
					if (array_key_exists($k, $advanced))
					{
						// some keys may not exist for all filters
						$kf             = FArrayHelper::getValue($filters, $k, array());
						if (is_array($advanced[$k]))
						{
							$advanced[$k][] = FArrayHelper::getValue($kf, $i, '');
						}
					}
					else
					{
						$advanced[$k] = array_key_exists($i, $filters[$k]) ?
array(($filters[$k][$i])) : '';
					}
				}
			}
		}

		return $advanced;
	}

	/**
	 * Build the advanced search link
	 *
	 * @return  string  <a href...> link
	 */
	public function link()
	{
		$model = $this->model;
		$params = $model->getParams();

		if ($params->get('advanced-filter', '0'))
		{
			$displayData = new stdClass;
			$displayData->url = $this->url();
			$displayData->tmpl = $model->getTmpl();
			$layout =
FabrikHelperHTML::getLayout('list.fabrik-advanced-search-button');

			return $layout->render($displayData);
		}
		else
		{
			return '';
		}
	}

	/**
	 * Get the URL used to open the advanced search window
	 *
	 * @return  string
	 */
	public function url()
	{
		$model = $this->model;
		$table = $model->getTable();
		$url = COM_FABRIK_LIVESITE . 'index.php?option=com_' .
$this->package .
			'&amp;format=partial&amp;view=list&amp;layout=_advancedsearch&amp;tmpl=component&amp;listid='
			. $table->id . '&amp;nextview=' .
$this->app->getInput()->get('view', 'list');

		// Defines if we are in a module or in the component.
		$url .= '&amp;scope=' . $this->app->scope;
		$url .= '&amp;tkn=' . Session::getFormToken();

		return $url;
	}

	/**
	 * Called via advanced search to load in a given element filter
	 *
	 * @return string html for filter
	 */
	public function elementFilter()
	{
		$model = $this->model;
		$input = $this->app->getInput();
		$elementId = $input->getId('elid');
		$pluginManager = FabrikWorker::getPluginManager();
		$className = $input->get('plugin');
		$plugin = $pluginManager->getPlugIn($className, 'element');
		$plugin->setId($elementId);
		$plugin->getElement();

		if ($input->get('context') == 'visualization')
		{
			$container = $input->get('parentView');
		}
		else
		{
			$container = 'listform_' . $model->getRenderContext();
		}

		$script = $plugin->filterJS(false, $container);
		FabrikHelperHTML::addScriptDeclaration($script);

		echo $plugin->getFilter($input->getInt('counter', 0),
false);
	}

	/**
	 * Get a list of advanced search options
	 *
	 * @return array of JHTML options
	 */
	protected function getStatementsOpts()
	{
		$statements = array();
		$statements[] = HTMLHelper::_('select.option', '=',
Text::_('COM_FABRIK_EQUALS'));
		$statements[] = HTMLHelper::_('select.option',
'<>', Text::_('COM_FABRIK_NOT_EQUALS'));
		$statements[] = HTMLHelper::_('select.option', 'BEGINS
WITH', Text::_('COM_FABRIK_BEGINS_WITH'));
		$statements[] = HTMLHelper::_('select.option',
'CONTAINS', Text::_('COM_FABRIK_CONTAINS'));
		$statements[] = HTMLHelper::_('select.option', 'ENDS
WITH', Text::_('COM_FABRIK_ENDS_WITH'));
		$statements[] = HTMLHelper::_('select.option',
'>', Text::_('COM_FABRIK_GREATER_THAN'));
		$statements[] = HTMLHelper::_('select.option',
'<', Text::_('COM_FABRIK_LESS_THAN'));
		$statements[] = HTMLHelper::_('select.option',
'EMPTY', Text::_('COM_FABRIK_IS_EMPTY'));
		$statements[] = HTMLHelper::_('select.option',
'NOTEMPTY', Text::_('COM_FABRIK_IS_NOT_EMPTY'));

		return $statements;
	}
}models/list.php000064400001237231151165347420007534 0ustar00<?php
/**
 * Fabrik List Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.modelform');

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\MVC\Model\FormModel;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Language\Language;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Version;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Log\Log;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Session\Session;
use Joomla\CMS\User\User;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Fabrik\Helpers\Pagination;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;
use Joomla\CMS\Factory;
use Fabrik\Helpers\Php;

require_once COM_FABRIK_FRONTEND .
'/models/list-advanced-search.php';

/**
 * Fabrik List Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikFEModelList extends FormModel
{
	/**
	 * List id
	 *
	 * @var int
	 */
	public $id = null;

	/**
	 * package id
	 *
	 * @var int
	 */
	public $packageId = null;

	/**
	 * Lists connection object
	 *
	 * @var object
	 */
	protected $connection = null;

	/**
	 * List item
	 *
	 * @var Table
	 */
	protected $table = null;

	/**
	 * List's form model
	 *
	 * @var FabrikFEModelForm
	 */
	protected $formModel = null;

	/**
	 * Data ordering directions
	 *
	 * @var array
	 */
	public $orderDirs = array();

	/**
	 * SQL Query
	 *
	 * @var array
	 */
	public $whereSQL = array();

	/**
	 * Data ordering field names
	 *
	 * @var array
	 */
	public $orderEls = array();
	/**
	 * Joins
	 *
	 * @var array
	 */
	private $joins = null;

	/**
	 * Column calculations
	 * @var array
	 */
	protected $runCalculations = array();

	/**
	 * List output format - set to rss to collect correct element data within
function getData()
	 *
	 * @var string
	 */
	protected $outputFormat = 'html';

	/**
	 * Is rendered as a J content plugin
	 *
	 * @var bool
	 */
	public $isMambot = false;

	/**
	 * Contain access rights
	 *
	 * @var object
	 */
	protected $access = null;

	/**
	 * Id of the last inserted record (or if updated the last record updated)
	 *
	 * @var int
	 */
	public $lastInsertId = null;

	/**
	 * Database fields
	 *
	 * @var array
	 */
	protected $dbFields = null;

	/**
	 * Used when making custom links to determine if we need to append the
rowId to the url
	 *
	 * @var bool
	 */
	protected $rowIdentifierAdded = false;

	/**
	 * Total number of records in the list
	 *
	 * @var int
	 */
	protected $totalRecords;

	/**
	 * Is ajax used
	 *
	 * @var bool
	 */
	public $ajax = null;

	/**
	 * Join sql
	 *
	 * @var string
	 */
	protected $joinsSQL = null;

	/**
	 * Order by column names
	 *
	 * @var array
	 */
	protected $orderByFields = null;

	protected $joinsToThisKey = null;

	protected $linksToThisKey = null;

	/**
	 * Used to determine which filter action to use.
	 * If a filter is a range then override lists setting with "on
submit"
	 *
	 * @var string
	 */
	protected $real_filter_action = null;

	/**
	 * Internally used when using parseMessageForRowHolder();
	 *
	 * @var array
	 */
	protected $aRow = null;

	/**
	 * Rows to delete
	 *
	 * @var array
	 */
	public $rowsToDelete = null;

	/**
	 * Original list data BEFORE form saved - used to ensure uneditable data
is stored
	 *
	 * @var array
	 */
	protected $origData = null;

	/**
	 * Set to true to load records STARTING from a random id (used in the
getPageNav func)
	 *
	 * @var bool
	 */
	public $randomRecords = false;

	/**
	 * List data
	 *
	 * @var array
	 */
	protected $data = null;

	/**
	 * Template name
	 *
	 * @var string
	 */
	protected $tmpl = null;

	/**
	 * Pagination
	 *
	 * @var Pagination
	 */
	protected $nav = null;

	/**
	 * List field names
	 *
	 * @var array
	 */
	protected $fields = null;

	/**
	 * Prefilters
	 *
	 * @var array
	 */
	protected $prefilters = null;

	/**
	 * Filters
	 *
	 * @var array
	 */
	public $filters = null;

	/**
	 * Can rows be selected
	 *
	 * @var bool
	 */
	protected $canSelectRows = null;

	/**
	 * As fields - used in query to build list data
	 *
	 * @var array
	 */
	public $asfields = null;

	/**
	 * Has an element, which is the db key, already been added to the list of
fields to select
	 *
	 * @var bool
	 */
	public $temp_db_key_addded = false;

	/**
	 * Has the group by statement been added to the list query
	 *
	 * @var bool
	 */
	protected $group_by_added = false;

	/**
	 * List of where conditions added by list plugins
	 *
	 * @var array
	 */
	protected $pluginQueryWhere = array();

	/**
	 * List of group by statements added by list plugins
	 *
	 * @var array
	 */
	public $pluginQueryGroupBy = array();

	/**
	 * Used in views for rendering
	 *
	 * @var array
	 */
	public $groupTemplates = array();

	/**
	 * Is the list a view
	 *
	 * @var bool
	 */
	protected $isView = null;

	/**
	 * Index objects
	 *
	 * @var array
	 */
	protected $indexes = null;

	/**
	 * List action url
	 *
	 * @var string
	 */
	protected $tableAction = null;

	/**
	 * Doing CSV import
	 *
	 * @var bool
	 */
	public $importingCSV = false;

	/**
	 * CSV in over-write mode
	 *
	 * @var bool
	 */
	public $csvOverwriting = false;

	/**
	 * CSV export row (for modifying in csvlist plugins)
	 */
	public $csvExportRow = null;

	/**
	 * CSV export row (for modifying in csvlist plugins)
	 */
	public $csvExportHeadings = null;

	/**
	 * Element names to encrypt
	 *
	 * @var array
	 */
	public $encrypt = array();

	/**
	 * Which record number to start showing from
	 *
	 * @var int
	 */
	public $limitStart = null;

	/**
	 * Number of records per page
	 *
	 * @var int
	 */
	public $limitLength = null;

	/**
	 * List rows
	 *
	 * @var array
	 */
	protected $rows = null;

	/**
	 * Should a heading be added for action buttons (returns true if at least
one row has buttons)
	 *
	 * @deprecated (since 3.0.7)
	 *
	 * @var bool
	 */
	protected $actionHeading = false;

	/**
	 * List of column data - used for filters
	 *
	 * @var array
	 */
	protected $columnData = array();

	/**
	 * Render context used for defining custom css variable for tmpl rendering
e.g. module_1
	 *
	 * @var string
	 */
	protected $renderContext = '';

	/**
	 * The max number of buttons that is shown in a row
	 *
	 * @var int
	 */
	protected $rowActionCount = 0;

	/**
	 * Do any of the elements have a required filter, only used through method
of same name
	 *
	 * @var bool
	 */
	protected $hasRequiredElementFilters = null;

	/**
	 * Elements which have a required filter
	 *
	 * @var array
	 */
	protected $elementsWithRequiredFilters = array();

	/**
	 * Force formatData() to format all elements, uses formatAll() accessor
method
	 *
	 * @var bool
	 */
	protected $format_all = false;

	/**
	 * Cached order by statement
	 *
	 * @since 3.0.7
	 *
	 * @var array - string and/or JQueryBuilder section
	 */
	public $orderBy = array();

	/**
	 * Empty data message
	 *
	 * @var string
	 */
	public $emptyMsg = null;
	/**
	 * Tabs field to use
	 *
	 * @since 3.1
	 *
	 * @var string
	 */
	protected $tabsField = null;

	/**
	 * Tabs to display
	 *
	 * @since 3.1
	 *
	 * @var array
	 */
	protected $tabs = null;

	/**
	 * Filter js code
	 *
	 * @var string
	 */
	public $filterJs = null;

	/**
	 * @var array
	 */
	protected $selectedOrderFields = array();

	/**
	 * Array of short element names, for elements which
	 * should be wrapped in a link to details/form href.
	 *
	 * @var array
	 */
	private $_aLinkElements = array();

	/**
	 * @var FabrikFEModelAdvancedSearch
	 */
	public $advancedSearch;

	/**
	 * @var CMSApplication
	 */
	protected $app;

	/**
	 * @var Session
	 */
	protected $session;

	/**
	 * @var User
	 */
	protected $user;

	/**
	 * @var JConfig
	 */
	protected $config;

	/**
	 * @var Language
	 */
	protected $lang;

    /**
     * Set by (for example) email plugin, to allow bypassing detail view
ACL for producing PDF
     *
     * @var bool
     */
	protected $localPdf = false;


	/**
	 * Used to allow getData() to get the query from finesseDataI() for debug
if an exception is thrown
	 * @var string
	 */
	protected $queryDebug = '';


	/**
	 * Load form
	 *
	 * @param   array  $data      form data
	 * @param   bool   $loadData  load in the data
	 *
	 * @since       1.5
	 *
	 * @return  mixed  false or form.
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_fabrik.list', 'view',
array('control' => 'jform', 'load_data'
=> $loadData));

		if (empty($form))
		{
			return false;
		}

		return $form;
	}

	/**
	 * Constructor
	 *
	 * @param   array  $config  DI Config options
	 */
	public function __construct($config = array())
	{
		parent::__construct();
		$usersConfig = ComponentHelper::getParams('com_fabrik');
		$this->app = ArrayHelper::getValue($config, 'app',
Factory::getApplication());
		$this->session = ArrayHelper::getValue($config, 'session',
Factory::getSession());
		$this->user = ArrayHelper::getValue($config, 'user',
Factory::getUser());
		$this->config = ArrayHelper::getValue($config, 'config',
Factory::getApplication()->getConfig());
		$this->lang = ArrayHelper::getValue($config, 'lang',
Factory::getApplication()->getLanguage());

		$input = $this->app->getInput();
		$id = $input->getInt('listid',
$usersConfig->get('listid'));
		$this->packageId = (int) $input->getInt('packageId',
$usersConfig->get('packageId'));
		$this->setId($id);
		$this->advancedSearch =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('AdvancedSearch',
'FabrikFEModel');
		$this->advancedSearch->setModel($this);
		$this->access = new stdClass;
	}

	/**
	 * Process the lists plug-ins
	 *
	 * @return  array	of list plug-in result messages
	 */
	public function processPlugin()
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('process', $this,
'list');

		return $pluginManager->data;
	}

	/**
	 * Code to enable plugins to add a button to the top of the list
	 *
	 * @return  array	button html
	 */
	public function getPluginTopButtons()
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('topButton', $this,
'list');
		$buttons = $pluginManager->data;

		return $buttons;
	}

	/**
	 * Get the html that is outputted by list plug-in buttons
	 *
	 * @return  array  buttons
	 */
	public function getPluginButtons()
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->getPlugInGroup('list');
		$pluginManager->runPlugins('button', $this,
'list');
		$buttons = $pluginManager->data;

		return $buttons;
	}

	/**
	 * Get an array of plugin js classes to load
	 *
	 * @param   array  &$r     Previously loaded classes
	 * @param   array  &$shim  Shim object to ini require.js
	 *
	 * @return  array
	 */
	public function getPluginJsClasses(&$r = array(), &$shim =
array())
	{
		$r = (array) $r;
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->getPlugInGroup('list');
		$src = array();
		$pluginManager->runPlugins('loadJavascriptClass', $this,
'list', $src);

		foreach ($pluginManager->data as $f)
		{
			if (is_null($f) || $f == '')
			{
				continue;
			}

			if (is_array($f))
			{
				$r = array_merge($r, $f);
			}
			else
			{
				$r[$f] = $f;
			}
		}

		$pluginManager->runPlugins('requireJSShim', $this,
'list');

		foreach ($pluginManager->data as $ashim)
		{
			$shim = array_merge($shim, $ashim);
		}

		return $r;
	}

	/**
	 * Get plugin js objects
	 *
	 * @param   string  $container  list container HTML id
	 *
	 * @return  mixed
	 */
	public function getPluginJsObjects($container = null)
	{
		if (is_null($container))
		{
			$container = 'listform_' . $this->getId();
		}

		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->getPlugInGroup('list');
		$pluginManager->runPlugins('onLoadJavascriptInstance',
$this, 'list', $container);

		return $pluginManager->data;
	}

	/**
	 * Main query to build table
	 *
	 * @return  array  list data
	 */
	public function render()
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('onBeforeListRender', $this,
'list');
		FabrikHelperHTML::debug($_POST, 'render:post');
		$input = $this->app->getInput();
		$profiler = Profiler::getInstance('Application');
		$id = $this->getId();
		$this->outputFormat = $input->get('format',
'html');

		if (is_null($id) || $id == '0')
		{
			throw new
RuntimeException(Text::_('COM_FABRIK_INCORRECT_LIST_ID'), 500);
		}

		if ($this->outputFormat == 'fabrikfeed')
		{
			$this->outputFormat = 'feed';
		}

		$item = $this->getTable();

		if ($item->db_table_name == '')
		{
			throw new
RuntimeException(Text::_('COM_FABRIK_INCORRECT_LIST_ID'), 500);
		}

		// Cant set time limit in safe mode so suppress warning
		@set_time_limit(60);
		JDEBUG ? $profiler->mark('About to get table filter') :
null;
		$filters = $this->getFilterArray();
		JDEBUG ? $profiler->mark('Got filters') : null;
		$this->setLimits();
		$this->setElementTmpl();
		$data = $this->getData();
		JDEBUG ? $profiler->mark('got data') : null;

		// Think we really have to do these as the calc isn't updated when
the list is filtered
		$this->doCalculations();
		JDEBUG ? $profiler->mark('done calcs') : null;
		$this->getCalculations();
		JDEBUG ? $profiler->mark('got calcs') : null;
		$item->hit();

		return $data;
	}

	/**
	 * Set the navigation limit and limitstart
	 *
	 * @param   int  $limitStart_override   Specific limitstart to use, if
both start and length are specified
	 * @param   int  $limitlength_override  Specific limitlength to use, if
both start and length are specified
	 *
	 * @return  void
	 */
	public function setLimits($limitStart_override = null,
$limitlength_override = null)
	{
		$input = $this->app->getInput();

		// Plugins using setLimits - these limits would get overwritten by
render() or getData() calls
		if (isset($this->limitLength) && isset($this->limitStart)
&& is_null($limitStart_override) &&
is_null($limitlength_override))
		{
			return;
		}
		/*
		 * $$$ hugh - added the overrides, so things like visualizations can just
turn
		 * limits off, by passing 0's, without having to go round the houses
setting
		 * the request array before calling this method.
		 */
		if (!is_null($limitStart_override) &&
!is_null($limitlength_override))
		{
			// Might want to set the request vars here?
			$limitStart = $limitStart_override;
			$limitLength = $limitlength_override;
		}
		else
		{
			$package =
$this->app->getUserState('com_fabrik.package',
'fabrik');
			$item = $this->getTable();
			$params = $this->getParams();
			$id = $this->getId();
			$this->randomRecords = $input->get('fabrik_random',
$this->randomRecords);

			// $$$ rob don't make the key list.X as the registry doesn't
seem to like keys with just '1' a
			$context = 'com_' . $package . '.list' .
$this->getRenderContext() . '.';
			$limitStart = $this->randomRecords ? $this->getRandomLimitStart()
: 0;

			// Deal with the fact that you can have more than one list on a page so
limitstart has to be specific per table

			// If list is rendered as a content plugin don't set the limits in
the session
			if ($this->app->scope == 'com_content')
			{
				$limitLength = $input->getInt('limit' . $id,
$item->rows_per_page);

				if (!$this->randomRecords)
				{
					$limitStart = $input->getInt('limitstart' . $id,
$limitStart);
				}
			}
			else
			{
				// If a list (assoc with a menu item) loads a form, with db join &
front end select - don't use the orig menu's rows_per_page value.
				$mambot = $this->isMambot || ($input->get('tmpl') ===
'component' && $input->getInt('ajax') ===
1);
				$rowsPerPage =
FabrikWorker::getMenuOrRequestVar('rows_per_page',
$item->rows_per_page, $mambot);

				// If a menu item specifically sets the # of rows to show this should
be stored (and used) in its own session context.
				// See:
http://fabrikar.com/forums/index.php?threads/list-results-split-by-wrong-rows-per-page-number.42182/#post-213703
				if (!$this->app->isClient('administrator') &&
!$mambot)
				{
					$menus = $this->app->getMenu();
					$menu = $menus->getActive();

					if (is_object($menu))
					{
						if
(!is_null($menu->getParams()->get('rows_per_page')))
						{
							$context .= $menu->id . '.';
						}
					}
				}

				$limitLength = $this->app->getUserStateFromRequest($context .
'limitlength', 'limit' . $id, $rowsPerPage);

				if (!$this->randomRecords)
				{
					$limitStart = $this->app->getUserStateFromRequest($context .
'limitstart', 'limitstart' . $id, $limitStart,
'int');
				}
			}

			if ($this->outputFormat == 'feed')
			{
				$limitLength = $input->getInt('limit',
$params->get('rsslimit', 150));
				$maxLimit = $params->get('rsslimitmax', 2500);

				if ($limitLength > $maxLimit)
				{
					$limitLength = $maxLimit;
				}
			}

			if ($limitStart < 0)
			{
				$limitStart = 0;
			}
		}

		$this->limitLength = $limitLength;
		$this->limitStart = $limitStart;
	}

	/**
	 * This merges session data for the fromForm with any request data
	 * allowing us to filter data results from both search forms and filters
	 *
	 * @return  array
	 */
	public function getRequestData()
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('start get Request data') : null;
		$f = $this->getFilterModel()->getFilters();
		JDEBUG ? $profiler->mark('end get Request data') : null;

		return $f;
	}

	/**
	 * Get the table's filter model
	 *
	 * @return  model	filter model
	 */
	public function &getFilterModel()
	{
		if (!isset($this->filterModel))
		{
			$this->filterModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Listfilter',
'FabrikFEModel');
			$this->filterModel->setListModel($this);
		}

		return $this->filterModel;
	}

	/**
	 * Once we have a few table joins, our select statements are
	 * getting big enough to hit default select length max in MySQL.
	 * Added per-list setting to enable_big_selects.
	 *
	 * 03/10/2012 - Should preserve any old list settings, but this is now set
in the global config
	 * We set it on the main J db in the system plugin setBigSelects() but
should do here as well as we
	 * may not be dealing with the same db.
	 *
	 * 2012-10-19 - $$$ hugh - trouble with preserving old list settings is
there is no way to change them, without
	 * directly poking around in the params in the database.  Commenting out
the per-list checking.
	 *
	 * @deprecated   now handled in FabrikHelper::getDbo(), as it needs to
apply to all queries, including internal / default connection ones.
	 * @since   3/16/2010
	 *
	 * @return  void
	 */
	public function setBigSelects()
	{
		$fabrikDb = $this->getDb();
		FabrikWorker::bigSelects($fabrikDb);
	}

	/**
	 * Append to the list's data
	 *
	 * @param   string  $groupRef  Group by reference (0 for non-grouped)
	 * @param   object  $row       Row to append to the list
	 *
	 * @return  array  $this->data
	 */
	public function appendData($groupRef, $row)
	{
		$data = $this->getData();

		if (array_key_exists($groupRef, $data))
		{
			$data[$groupRef][] = $row;
			$this->data = $data;
		}

		return $this->data;
	}

	/**
	 * Get the table's data
	 *
     * @param   $opts  array  list options
     *
	 * @return  array	of objects (rows)
	 */
	public function getData($opts = array())
	{
		if (isset($this->data) && !is_null($this->data))
		{
			return $this->data;
		}

		$profiler = Profiler::getInstance('Application');
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('onPreLoadData', $this,
'list');

		// Needs to be off for FOUND_ROWS() to work
		ini_set('mysql.trace_mode', 'off');
		JDEBUG ? $profiler->mark('query build start') : null;

		// Ajax call needs to recall this - not sure why
		$this->setLimits();
		JDEBUG ? $profiler->mark('query build end') : null;

		$config = ComponentHelper::getParams('com_fabrik');
		$opts['custom_layout'] =
$config->get('fabrik_check_custom_list_layout',
'0');

		try
		{
			$this->finesseData($opts);
		}
		catch (Exception $e)
		{
			$item = $this->getTable();
			$msg = 'Fabrik has generated an incorrect query for the list '
. $item->label . ': <br />';

			// If Fabrik debug, show msg
			if (FabrikHelperHTML::isDebug(true))
			{
				$msg .= '<br /><pre>' . $e->getMessage() .
'</pre>';
			}

			// Only show actual query if J! is in debug mode
			if ($this->config->get('debug'))
            {
				$msg .= '<br /><pre>' .
(string)$this->queryDebug . '</pre><br />';
            }

			throw new RuntimeException($msg, 500);
		}

		$nav = $this->getPagination($this->totalRecords,
$this->limitStart, $this->limitLength);

		// Pass the query as an object property so it can be updated via
reference
		$args = new stdClass;
		$args->data =& $this->data;

		$pluginManager->runPlugins('onLoadData', $this,
'list', $args);
		$pluginManager->runPlugins('onLoadListData',
$this->getFormModel(), 'form', $args);

		return $this->data;
	}

	/**
	 * Method to run the getData select query and do our Fabrik magikin'
	 *
     * @param  $opts  array  list options
     *
	 * @return void
	 */
	public function finesseData($opts = array())
	{
		$profiler = Profiler::getInstance('Application');
		$traceModel = ini_get('mysql.trace_mode');
		$fabrikDb = $this->getDb();
		$this->setBigSelects();
		$query = $this->buildQuery();
		$this->queryDebug = $query;
//echo $query;
		// $$$ rob - if merging joined data then we don't want to limit
		// the query as we have already done so in buildQuery()
		if ($this->mergeJoinedData() || $this->limitLength === -1)
		{
			$fabrikDb->setQuery($query);
		}
		else
		{
			$fabrikDb->setQuery($query, $this->limitStart,
$this->limitLength);
		}

		FabrikHelperHTML::debug((string) $fabrikDb->getQuery(), 'list
GetData:' . $this->getTable()->label);
		JDEBUG ? $profiler->mark('before query run') : null;

		/* set 2nd param to false in attempt to stop joomfish db adaptor from
translating the original query
		 * fabrik3 - 2nd param in j16 is now used - guessing that joomfish now
uses the third param for the false switch?
		* $$$ rob 26/09/2011 note Joomfish not currently released for J1.7
		*/
		$this->data = $fabrikDb->loadObjectList('',
'stdClass', false);

		// fire a plugin hook before we format the data
		$args       = new stdClass;
		$args->data = $this->data;
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('onLoadedData', $this,
'list', $args);
		$pluginManager->runPlugins('onLoadedListData',
$this->getFormModel(), 'form', $args);

		// $$$ rob better way of getting total records
		if ($this->mergeJoinedData())
		{
			$this->totalRecords = $this->getTotalRecords();
		}
		else
		{
			$fabrikDb->setQuery("SELECT FOUND_ROWS()");
			$this->totalRecords = $fabrikDb->loadResult();
		}

		if ($this->randomRecords)
		{
			shuffle($this->data);
		}

		ini_set('mysql.trace_mode', $traceModel);
		JDEBUG ? $profiler->mark('query run and data loaded') :
null;
		$this->translateData($this->data);

		// Add labels before pre-formatting - otherwise calc elements on
drop-down elements show raw data for {list___element}
		$this->addLabels($this->data);

		// Run calculations
		$this->preFormatFormJoins($this->data);
		JDEBUG ? $profiler->mark('start format for joins') : null;
		$this->formatForJoins($this->data);
		JDEBUG ? $profiler->mark('start format data') : null;
		$this->formatData($this->data, $opts);
		JDEBUG ? $profiler->mark('data formatted') : null;
	}

	/**
	 * Part of list model finesseData() replace list___element values with
labels for
	 * things like dropdowns, needed so that calc elements in
preFormatFormJoins() have access to the element
	 * label
	 *
	 * @param   array  &$data  List data
	 *
	 * @return  void
	 */
	protected function addLabels(&$data)
	{
		$form = $this->getFormModel();
		$groups = $form->getGroupsHiarachy();
		$ec = count($data);

		foreach ($groups as $groupModel)
		{
			$elementModels = $this->activeContextElements($groupModel);

			foreach ($elementModels as $elementModel)
			{
				$elementModel->setContext($groupModel, $form, $this);
				$col = $elementModel->getFullName(true, true);

				if (!empty($data) && isset($data[0]->{$col}))
				{
					for ($i = 0; $i < $ec; $i++)
					{
						$thisRow = $data[$i];
						$colData = $thisRow->$col;
						$data[$i]->$col = $elementModel->getLabelForValue($colData,
$colData);
					}
				}
			}
		}
	}

	/**
	 * $$$ rob pointless getting elements not shown in the table view?
	 * $$$ hugh - oops, they might be using elements in group-by template not
shown in table
	 * http://fabrikar.com/forums/showthread.php?p=102600#post102600
	 * $$$ rob in that case lets test that rather than loading blindly
	 * $$$ rob 15/02/2011 or out put may be csv in which we want to format any
fields not shown in the form
	 * $$$ hugh 06/05/2012 added formatAll() mechanism, so plugins can force
formatting of all elements
	 *
	 * @param   JModel  $groupModel  Group model
	 *
	 * @return array element models
	 */
	private function activeContextElements($groupModel)
	{
		$tableParams = $this->getParams();

		if ($this->formatAll() ||
($tableParams->get('group_by_template') !== ''
&& $this->getGroupBy() != '') ||
$this->outputFormat == 'csv'
			|| $this->outputFormat == 'feed')
		{
			$elementModels = $groupModel->getPublishedElements();
		}
		else
		{
			/* $$$ hugh - added 'always render' option to elements, and
methods to grab those.
			 * Could probably do this in getPublishedListElements(), but for now
just grab a list
			 * of elements with 'always render' set to Yes, and "show
in list" set to No,
			 * then merge that with the getPublishedListElements.  This is to work
around issues
			 * where things like plugin bubble templates use placeholders for
elements not shown in the list.
			 */
			$alwaysRenderElements = $this->getAlwaysRenderElements(true,
$groupModel->getId());
			$showInList = $this->showInList();
			$elementModels = $groupModel->getPublishedListElements();
			$elementModels = array_merge($elementModels, $alwaysRenderElements);
		}

		return $elementModels;
	}

	/**
	 * Translate data
	 *
	 * @param   array  &$data  data
	 *
	 * @deprecated Joomfish not available in J1.7
	 *
	 * @return  void
	 */
	protected function translateData(&$data)
	{
		return;
		$params = $this->getParams();

		if (!PluginHelper::isEnabled('system', 'jfdatabase'))
		{
			return;
		}

		if (defined('JOOMFISH_PATH') &&
$params->get('allow-data-translation'))
		{
			$table = $this->getTable();
			$db = FabrikWorker::getDbo();
			$jf = JoomFishManager::getInstance();
			$tableName = str_replace($this->config->get('dbprefix'),
'', $table->db_table_name);
			$contentElement = $jf->getContentElement($tableName);

			if (!is_object($contentElement))
			{
				return;
			}

			$title =
Fabrikstring::shortColName($params->get('joomfish-title'));
			$activeLangs = $jf->getActiveLanguages();
			$langId =
$activeLangs[$this->config->get("jflang")]->id;
			$db->setQuery($contentElement->createContentSQL($langId));

			if ($title == '')
			{
				$contentTable = $contentElement->getTable();

				foreach ($contentTable->Fields as $tableField)
				{
					if ($tableField->Type == 'titletext')
					{
						$title = $tableField->Name;
					}
				}
			}

			$longKey =
FabrikString::safeColNameToArrayKey($table->db_primary_key);
			$res =
$db->loadObjectList(FabrikString::shortColName($table->db_primary_key));

			// $$$ hugh - if no JF results, bail out, otherwise we pitch warnings in
the foreach loop.
			if (empty($res))
			{
				return;
			}

			foreach ($data as &$row)
			{
				// $$$ rob if the id isn't published fall back to __pk_val
				$translateRow = array_key_exists($longKey, $row) ?
$res[$row->$longKey] : $res[$row->__pk_val];

				foreach ($row as $key => $val)
				{
					$shortKey = array_pop(explode('___', $key));

					if ($shortKey === $title)
					{
						$row->$key = $translateRow->titleTranslation;
						$key = $key . '_raw';
						$row->$key = $translateRow->titleTranslation;
					}
					else
					{
						if (array_key_exists($shortKey, $translateRow))
						{
							$row->$key = $translateRow->$shortKey;
							$key = $key . '_raw';

							if (array_key_exists($key, $row))
							{
								$row->$key = $translateRow->$shortKey;
							}
						}
					}
				}
			}
		}
	}

	/**
	 * Run the list data through element filters
	 *
	 * @param   array  &$data  list data
     * @param   array  $opts   list options
	 *
	 * @return  void
	 */
	protected function formatData(&$data, $opts = array())
	{
		$profiler = Profiler::getInstance('Application');
        JDEBUG ? $profiler->mark("formatData: start") : null;

        $input = $this->app->getInput();
		jimport('joomla.filesystem.file');
		$form = $this->getFormModel();
		$tableParams = $this->getParams();
		$table = $this->getTable();
		$method = 'renderListData_' . $this->outputFormat;
		$this->_aLinkElements = array();

		// $$$ hugh - temp foreach fix
		$groups = $form->getGroupsHiarachy();
		$ec = count($data);

		foreach ($groups as $groupModel)
		{
			$elementModels = $this->activeContextElements($groupModel);

			foreach ($elementModels as $elementModel)
			{
				$elementModel->setContext($groupModel, $form, $this);
				$col = $elementModel->getFullName(true, false);

				// Check if there is  a custom out put handler for the tables format
				// Currently supports "renderListData_csv",
"renderListData_rss", "renderListData_html",
"renderListData_json"
				if (!empty($data) && property_exists($data[0], $col))
				{
					if (method_exists($elementModel, $method))
					{
						for ($i = 0; $i < count($data); $i++)
						{
							$thisRow = $data[$i];
							$colData = $thisRow->$col;
							$data[$i]->$col = $elementModel->$method($colData, $thisRow);
						}
					}
					else
					{
						JDEBUG ? $profiler->mark("elements renderListData: ($ec)
tableid = $table->id $col") : null;

						for ($i = 0; $i < $ec; $i++)
						{
							$thisRow = $data[$i];
							$colData = $thisRow->$col;
							$data[$i]->$col = $elementModel->renderListData($colData,
$thisRow, $opts);
							$rawCol = $col . '_raw';

							/**
							 * Rendering of accented characters in DomPDF
							 * Don't do this on feeds, as it produces non XMLS entities
like &eacute that blow XML parsers up
							 */
							if ($this->app->getInput()->get('format',
'') !== 'fabrikfeed'
								&& $this->app->getInput()->get('format',
'') !== 'feed'
								&& !empty($data[$i]) && property_exists($data[$i],
$col) && !empty($data[$i]->$col))
							{
								$data[$i]->$col =
htmlspecialchars_decode(htmlentities($data[$i]->$col, ENT_NOQUOTES,
'UTF-8'), ENT_NOQUOTES);
							}

							/* Not sure if this works, as far as I can tell _raw will always
exist, even if
							 * the element model hasn't explicitly done anything with it
(except maybe unsetting it?)
							* For instance, the calc element needs to set _raw.  For now, I
changed $thisRow above to
							* be a = reference to $data[$i], and in renderListData() the calc
element modifies
							* the _raw entry in $thisRow.  I guess it could simply unset the
_raw in $thisRow and
							* then implement a renderRawListData.  Anyway, just sayin'.
							*/
							if (!isset($thisRow->{$rawCol}))
							{
								$data[$i]->$rawCol =
$elementModel->renderRawListData($colData, $thisRow);
								if (!empty($data[$i]->$rawCol)) {
									$data[$i]->$rawCol =
htmlspecialchars_decode(htmlentities($data[$i]->$rawCol, ENT_NOQUOTES,
'UTF-8'), ENT_NOQUOTES);
								}
							}
						}
					}
				}
			}
		}

		JDEBUG ? $profiler->mark('elements rendered for table data')
: null;
		$this->groupTemplates = array();
		$this->groupTemplatesExtra = array();

		// Check if the data has a group by applied to it
		$groupBy = $this->getGroupBy();

		if ($groupBy != '' && $this->outputFormat !=
'csv')
		{
			$w = new FabrikWorker;

			$groupBy = FabrikString::safeColNameToArrayKey($groupBy);

			// 3.0 if not group by template spec'd by group but assigned in qs
then use that as the group by tmpl
			$requestGroupBy = $input->get('group_by', '');

			if ($requestGroupBy == '')
			{
				$groupTemplate = $tableParams->get('group_by_template');

				if ($groupTemplate == '')
				{
					$groupTemplate = '{' . $groupBy . '}';
				}
			}
			else
			{
				$groupTemplate = '{' . $requestGroupBy . '}';
			}

			$groupTemplateExtra =
$tableParams->get('group_by_template_extra', '');

			if ($tableParams->get('group_by_raw', '1') ===
'1')
			{
				$groupBy .= '_raw';
			}

			$groupedData = array();

			$groupTitle = null;
			$aGroupTitles = array();

			for ($i = 0; $i < count($data); $i++)
			{
				$sData = isset($data[$i]->$groupBy) ? $data[$i]->$groupBy :
'';

				// Get rid of & as it blows up SimpleXMLElement, and don't
want to use htmlspecialchars as don't want to mess with <, >,
etc.
				$sData = str_replace('&', '&amp;',
str_replace('&amp;', '&', $sData));

				// Test if its just an <a>*</a> tag - if so allow HTML
(enables use of icons)
				$xml = new SimpleXMLElement('<div>' . $sData .
'</div>');
				$children = $xml->children();

				// Not working in PHP5.2	if (!($xml->count() === 1 &&
$children[0]->getName() == 'a'))
				if (!(count($xml->children()) === 1 &&
$children[0]->getName() == 'a'))
				{
					$sData = strip_tags($sData);
				}

				if (!in_array($sData, $aGroupTitles))
				{
					$aGroupTitles[] = $sData;
					$this->groupTemplates[$sData] =
$w->parseMessageForPlaceHolder($groupTemplate,
ArrayHelper::fromObject($data[$i]));
					$this->groupTemplatesExtra[$sData] =
$w->parseMessageForPlaceHolder($groupTemplateExtra,
ArrayHelper::fromObject($data[$i]));
					$groupedData[$sData] = array();
				}

				$data[$i]->_groupId = $sData;
				$gKey = $sData;

				// If the group_by was added in in getAsFields remove it from the
returned data set (to avoid mess in package view)

				if ($this->group_by_added)
				{
					unset($data[$i]->$groupBy);
				}

				$groupedData[$gKey][] = $data[$i];
			}

			$data = $groupedData;
		}
		else
		{
			// Make sure that the none grouped data is in the same format
			$data = array($data);
		}

		JDEBUG ? $profiler->mark('table grouped-by applied') : null;

		if ($this->outputFormat != 'pdf' &&
$this->outputFormat != 'csv' && $this->outputFormat
!= 'feed')
		{
			$this->addSelectBoxAndLinks($data, $opts);
			FabrikHelperHTML::debug($data, 'table:data');
		}

		JDEBUG ? $profiler->mark('formatData: end') : null;
	}

	/**
	 * Add the select box and various links into the data array
	 *
	 * @param   array  &$data  list's row objects
     * $param   array  $opts   list rendering options
	 *
	 * @return  void
	 */
	protected function addSelectBoxAndLinks(&$data, $opts = array())
    {
        $profiler = Profiler::getInstance('Application');

        if (!FArrayHelper::getValue($opts, 'add_box_and_links',
1))
        {
            JDEBUG ? $profiler->mark('addSelectboxAndLinks:
skipping') : null;
            return;
        }

        JDEBUG ? $profiler->mark('addSelectboxAndLinks:
start') : null;

//        $j3 = FabrikWorker::j3();
//       $j3 = true;
		$db = FabrikWorker::getDbo(true);
		$params = $this->getParams();
		$buttonAction = $this->actionMethod();
		$tmpKey = '__pk_val';
		$faceted = $params->get('facetedlinks');
		$viewLinkTarget = $params->get('list_detail_link_target',
'_self');

		// Get a list of fabrik lists and ids for view list and form links
		$oldLinksToForms = $this->getLinksToThisKey();
		$linksToForms = array();

		foreach ($oldLinksToForms as $join)
		{
			if ($join !== false)
			{
				$k = $join->list_id . '-' . $join->form_id .
'-' . $join->element_id;
				$linksToForms[$k] = $join;
			}
		}

		$query = $db->getQuery(true);
		$query->select('id, label,
db_table_name')->from('#__fabrik_lists');
		$db->setQuery($query);
		$aTableNames = $db->loadObjectList('label');

		// Get pk values
		$pks = array();

		foreach ($data as $groupKey => $group)
		{
			$cg = count($group);

			for ($i = 0; $i < $cg; $i++)
			{
				$pks[] = @$data[$groupKey][$i]->$tmpKey;
			}
		}

		$joins = $this->getJoins();

		foreach ($data as $groupKey => $group)
		{
			// $group = $data[$key]; //Messed up in php 5.1 group positioning in
data became ambiguous
			$cg = count($group);

			for ($i = 0; $i < $cg; $i++)
			{
				$row = $data[$groupKey][$i];
				$viewLinkAdded = false;

				// Done each row as its result can change
				$canEdit = $this->canEdit($row);
				$canView = $this->canView($row);
				$canDelete = $this->canDelete($row);
				$pKeyVal = isset($row->{$tmpKey}) ? $row->$tmpKey : '';
				$pkCheck = array();
				$pkCheck[] = '<div style="display:none">';

				foreach ($joins as $join)
				{
					if ($join->list_id !== '0')
					{
						// $$$ rob 22/02/2011 was not using _raw before which was inserting
html into the value for image elements
						$fKey = $join->table_join_alias . '___' .
$join->table_key . '_raw';

						if (isset($row->$fKey))
						{
							$fKeyVal = $row->$fKey;

							if (is_object($fKeyVal))
							{
								$fKeyVal = ArrayHelper::fromObject($fKeyVal);
							}

							if (is_array($fKeyVal))
							{
								$fKeyVal = array_shift($fKeyVal);
							}

							$pkCheck[] = '<input type="checkbox"
class="fabrik_joinedkey" value="' .
htmlspecialchars($fKeyVal, ENT_COMPAT, 'UTF-8')
							. '" name="' . $join->table_join_alias .
'[' . $row->__pk_val . ']" />';
						}
					}
				}

				$pkCheck[] = '</div>';
				$pkCheck = implode("\n", $pkCheck);
				$row->fabrik_select = '<input type="checkbox"
id="id_' . $row->__pk_val . '" name="ids['
. $row->__pk_val . ']" value="'
						. htmlspecialchars($pKeyVal, ENT_COMPAT, 'UTF-8') .
'" />' . $pkCheck;

				// Add in some default links if no element chosen to be a link
                JDEBUG ? $profiler->mark('addSelectboxAndLinks:
building edit link') : null;

                $link = $this->viewDetailsLink($data[$groupKey][$i]);
				$edit_link = $this->editLink($data[$groupKey][$i]);
				$row->fabrik_view_url = $link;
				$row->fabrik_edit_url = $edit_link;

				$editAttribs = $this->getCustomLink('attribs',
'edit');
				$detailsAttribs = $this->getCustomLink('attribs',
'details');

				$row->fabrik_view = '';
				$row->fabrik_edit = '';

				$rowId = $this->getSlug($row);
				$isAjax = $this->isAjaxLinks() ? '1' : '0';

				$editLabel = $this->editLabel($data[$groupKey][$i]);
				$editText = $buttonAction == 'dropdown' ? $editLabel :
'<span class="hidden">' . $editLabel .
'</span>';

//				$btnClass = ($j3 && $buttonAction != 'dropdown') ?
'btn ' : '';
				$btnClass = ($buttonAction != 'dropdown') ? 'btn '
: '';
//				$class = $j3 ? $btnClass . 'fabrik_edit fabrik__rowlink' :
'btn fabrik__rowlink';
				$class = $btnClass . 'fabrik_edit fabrik__rowlink';
				$dataList = 'list_' . $this->getRenderContext();
				$loadMethod = $this->getLoadMethod('editurl');

//				if ($j3)
//				{
                    JDEBUG ? $profiler->mark('addSelectboxAndLinks:
building edit link: layout start') : null;
					$displayData = new stdClass;
					$displayData->loadMethod = $loadMethod;
					$displayData->class = $class;
					$displayData->editAttributes = $editAttribs;
					$displayData->dataList = $dataList;
					$displayData->editLink = $edit_link;
					$displayData->editLabel = $editLabel;
					$displayData->editText = $editText;
					$displayData->rowData = $row;
					$displayData->rowId = $rowId;
					$displayData->isAjax = $isAjax;
					$displayData->isCustom = $this->getCustomLink('url',
'edit') !== '';
					$displayData->list_edit_link_icon =
$params->get('list_edit_link_icon', 'edit');
					$layout =
$this->getLayout('listactions.fabrik-edit-button');
					$editLink = $layout->render($displayData);
                    JDEBUG ? $profiler->mark('addSelectboxAndLinks:
building edit link: layout end') : null;
/*
				}
				else
				{
					$img = FabrikHelperHTML::image('edit.png', 'list',
'', array('alt' => $editLabel));
					$editLink = '<a data-loadmethod="' . $loadMethod .
'" class="' . $class . '" ' .
$editAttribs
						. 'data-list="' . $dataList . '"
href="' . $edit_link . '" title="' .
$editLabel . '">' . $img
						. ' ' . $editText . '</a>';
				}
*/
                JDEBUG ? $profiler->mark('addSelectboxAndLinks:
building view link') : null;

                $viewLabel = $this->viewLabel($data[$groupKey][$i]);
				$viewText = $buttonAction == 'dropdown' ? $viewLabel :
'<span class="hidden">' . $viewLabel .
'</span>';
//				$class = $j3 ? $btnClass . 'fabrik_view fabrik__rowlink' :
'btn fabrik__rowlink';
				$class = $btnClass . 'fabrik_view fabrik__rowlink';

				$loadMethod = $this->getLoadMethod('detailurl');

//				if ($j3)
//				{
					$displayData = new stdClass;
					$displayData->loadMethod = $loadMethod;
					$displayData->class = $class;
					$displayData->detailsAttributes = $detailsAttribs;
					$displayData->link = $link;
					$displayData->viewLabel = $viewLabel;
					$displayData->viewLinkTarget = $viewLinkTarget;
					$displayData->viewText = $viewText;
					$displayData->dataList = $dataList;
					$displayData->rowData = $row;
					$displayData->rowId = $rowId;
					$displayData->isAjax = $isAjax;
					$displayData->isCustom = $this->getCustomLink('url',
'details') !== '';
					$displayData->list_detail_link_icon =
$params->get('list_detail_link_icon', 'search');
					$layout =
$this->getLayout('listactions.fabrik-view-button');
					$viewLink = $layout->render($displayData);
/*
				}
				else
				{
					$img = FabrikHelperHTML::image('search.png',
'list', '', array('alt' => $viewLabel));
					$viewLink = '<a data-loadmethod="' . $loadMethod .
'" class="' . $class . '" ' .
$detailsAttribs
						. 'data-list="' . $dataList . '"
href="' . $link . '" title="' . $viewLabel .
'" target="' . $viewLinkTarget . '">'
. $img
						. ' ' . $viewText . '</a>';
				}
*/

				// 3.0 actions now in list in one cell
                JDEBUG ? $profiler->mark('addSelectboxAndLinks:
building actions') : null;

                $row->fabrik_actions = array();
				$actionMethod = $this->actionMethod();

				if ($canView || $canEdit)
				{
					if ($canEdit == 1)
					{
//						if ($params->get('editlink') || ($actionMethod ==
'floating' || $j3))
//						{
							$row->fabrik_edit = $editLink;
//							$row->fabrik_actions['fabrik_edit'] = $j3 ?
$row->fabrik_edit : '<li class="fabrik_edit">'
. $row->fabrik_edit . '</li>';
							$row->fabrik_actions['fabrik_edit'] =
$row->fabrik_edit;
//						}

						$row->fabrik_edit_url = $edit_link;

						if ($this->canViewDetails($row) &&
$this->floatingDetailLink())
						{
							$row->fabrik_view = $viewLink;
//							$row->fabrik_actions['fabrik_view'] = $j3 ?
$row->fabrik_view : '<li class="fabrik_view">'
. $row->fabrik_view . '</li>';
							$row->fabrik_actions['fabrik_view'] =
$row->fabrik_view;
						}
					}
					else
					{
						if ($this->canViewDetails($row) &&
$this->floatingDetailLink())
						{
							if (empty($this->_aLinkElements))
							{
								$viewLinkAdded = true;
								$row->fabrik_view = $viewLink;
//								$row->fabrik_actions['fabrik_view'] = $j3 ?
$row->fabrik_view : '<li class="fabrik_view">'
. $row->fabrik_view . '</li>';
								$row->fabrik_actions['fabrik_view'] =
$row->fabrik_view;
							}
						}
						else
						{
							$row->fabrik_edit = '';
						}
					}
				}

				if ($this->canViewDetails($row) && !$viewLinkAdded
&& $this->floatingDetailLink())
				{
					$link = $this->viewDetailsLink($row, 'details');
					$row->fabrik_view_url = $link;
					$row->fabrik_view = $viewLink;
//					$row->fabrik_actions['fabrik_view'] = $j3 ?
$row->fabrik_view : '<li class="fabrik_view">'
. $row->fabrik_view . '</li>';
					$row->fabrik_actions['fabrik_view'] =
$row->fabrik_view;
				}

				if ($canDelete)
				{
					if ($buttonAction == 'dropdown')
					{
//						$row->fabrik_actions['delete_divider'] = $j3 ?
'' : '<li class="divider"></li>';
						$row->fabrik_actions['delete_divider'] = '';
					}

					$row->fabrik_actions['fabrik_delete'] =
$this->deleteButton();
				}
				// Create columns containing links which point to tables associated
with this table
				$oldJoinsToThisKey = $this->getJoinsToThisKey();
				$joinsToThisKey = array();

				foreach ($oldJoinsToThisKey as $join)
				{
					$k = $join->list_id . '-' . $join->form_id .
'-' . $join->element_id;
					$joinsToThisKey[$k] = $join;
				}

				foreach ($joinsToThisKey as $f => $join)
				{
					// $$$ hugh - for reasons I don't understand, $joinsToThisKey now
contains entries
					// which aren't in $faceted->linkedlist, so added this sanity
check.
					if (isset($faceted->linkedlist->$f))
					{
						$join->list_id = array_key_exists($join->listlabel,
$aTableNames) ? $aTableNames[$join->listlabel]->id : '';
						$facetTable = $this->facetedTable($join->list_id);
						$linkedTable = $faceted->linkedlist->$f;
						$popupLink = $faceted->linkedlist_linktype->$f;

						if ($linkedTable != '0' &&
$facetTable->canView())
						{
							$recordKey = $join->element_id . '___' . $linkedTable;
							$key = $recordKey . "_list_heading";
							$val = $pKeyVal;
							$recordCounts = $this->getRecordCounts($join, $pks);
							$count = 0;
							$linkKey = $recordCounts['linkKey'];

							if (is_array($recordCounts))
							{
								if (array_key_exists($val, $recordCounts))
								{
									$count = $recordCounts[$val]->total;
									$linkKey = $recordCounts[$val]->linkKey;
								}
								else
								{
									if (array_key_exists((int) $val, $recordCounts) && (int)
$val !== 0)
									{
										$count = $recordCounts[(int) $val]->total;
										$linkKey = $recordCounts[$val]->linkKey;
									}
								}
							}

							$join->list_id = array_key_exists($join->listlabel,
$aTableNames) ? $aTableNames[$join->listlabel]->id : '';
							$group[$i]->$key = $this->viewDataLink($popupLink, $join,
$row, $linkKey, $val, $count, $f);
						}
						// $$$ hugh - pretty sure we don't need to be doing this
						// $f++;
					}
				}

				// Create columns containing links which point to forms associated with
this table
				foreach ($linksToForms as $f => $join)
				{
					$linkedForm = $faceted->linkedform->$f;
					$popupLink = $faceted->linkedform_linktype->$f;
					/* $$$ hugh @TODO - rob, can you check this, I added this line,
					 * but the logic applied for $val in the linked table code above seems
to be needed?
					* http://fabrikar.com/forums/showthread.php?t=9535
					*/
					$val = $pKeyVal;

					if ($linkedForm !== '0')
					{
						if (is_object($join))
						{
							// $$$rob moved these two lines here as there were giving warnings
since Hugh commented out the if ($element != '') {
							$linkKey = @$join->db_table_name . '___' .
@$join->name;
							$gKey = $linkKey . '_form_heading';
							$row2 = ArrayHelper::fromObject($row);
							$linkLabel =
$this->parseMessageForRowHolder($faceted->linkedformtext->$f,
$row2);
							$group[$i]->$gKey = $this->viewFormLink($popupLink, $join,
$row, $linkKey, $val, false, $f);
						}
					}
				}
			}
		}

		$args['data'] = &$data;
		$pluginButtons = $this->getPluginButtons();

		// Build layout for row buttons
		$tpl = $this->getTmpl();
		$align = $params->get('checkboxLocation', 'end')
== 'end' ? 'right' : 'left';
		$displayData = array('align' => $align);
		$layout = $this->getLayout('listactions.' . $buttonAction);

		foreach ($data as $groupKey => $group)
		{
			$cg = count($group);

			for ($i = 0; $i < $cg; $i++)
			{
				$row = $data[$groupKey][$i];

				if (!empty($pluginButtons))
				{
					if ($buttonAction == 'dropdown')
					{
//						$row->fabrik_actions[] = $j3 ? '' : '<li
class="divider"></li>';
						$row->fabrik_actions[] = '';
					}
				}

				foreach ($pluginButtons as $b)
				{
					if (trim($b) !== '')
					{
//						$row->fabrik_actions[] = $j3 ? $b : '<li>' . $b
. '</li>';
						$row->fabrik_actions[] = $b;
					}
				}

				if (!empty($row->fabrik_actions))
				{
					if (count($row->fabrik_actions) > $this->rowActionCount)
					{
						$this->rowActionCount = count($row->fabrik_actions);
					}

//					if ($j3)
//					{
						$displayData['items'] = $row->fabrik_actions;
						$row->fabrik_actions = $layout->render($displayData);
//					}
//					else
//					{
//						$row->fabrik_actions = '<ul
class="fabrik_action">' . implode("\n",
$row->fabrik_actions) . '</ul>';
//					}
				}
				else
				{
					$row->fabrik_actions = '';
				}
			}
        }

        JDEBUG ? $profiler->mark('addSelectBoxAndLinks: end')
: null;
    }

	/**
	 * Should the list link load in an i-frame or a xhr
	 *
	 * @param   string  $prop  Parameter url to check
	 *
	 * @since  3.1.1
	 *
	 * @return  string  Load method xhr/iframe
	 */
	protected function getLoadMethod($prop)
	{
		$params = $this->getParams();
		$url = $params->get($prop, '');

		return $url == '' || strstr($url, 'com_fabrik') ?
'xhr' : 'iframe';
	}


	/**
	 * Helper method to decide if a detail link should be added to the row.
	 *
	 * If in Fabrik 3.1 return true (just use the default acl to control the
link)
	 *
	 * If in Fabrik 3.0 return true if detail link option on and action method
is floating
	 *
	 * @return boolean
	 */
	protected function floatingDetailLink()
	{
//		if (FabrikWorker::j3())
//		{
			return true;
//		}

//		$params = $this->getParams();
//		$actionMethod = $this->actionMethod();

//		return $params->get('detaillink') == '1' ||
$actionMethod == 'floating';
	}

	/**
	 * Get the way row buttons are rendered (dropdown or inline)
	 * Can be set either by global config or list options
	 *
	 * In Fabrik 3.1 we've deprecated the floating action code - should
return inline in this case
	 *
	 * @since   3.0.7
	 *
	 * @return  string
	 */
	public function actionMethod()
	{
		$params = $this->getParams();
		$fbConfig = ComponentHelper::getParams('com_fabrik');

		if ($params->get('actionMethod', 'default') ==
'default')
		{
			// Use global
			$default = $fbConfig->get('actionMethod',
'inline');
		}
		else
		{
			$default = $params->get('actionMethod',
'inline');
		}
		if ($default == 'floating') $default = 'inline';
		return $default;
	}

	/**
	 * Get delete button
	 *
	 * @param   string  $tpl      Template
	 * @param   bool    $heading  Is this the check all delete button
	 *
	 * @since 3.0
	 *
	 * @return	string	delete button wrapped in <li>
	 */
	protected function deleteButton($tpl = '', $heading = false)
	{
		$params = $this->getParams();
		$displayData = new stdClass;
		$label = Text::_('COM_FABRIK_DELETE');
		$buttonAction = $this->actionMethod();
//		$j3 = FabrikWorker::j3();
//		$j3 = true;
		$displayData->tpl = $this->getTmpl();
		$displayData->text = $buttonAction == 'dropdown' ? $label :
'<span class="hidden">' . $label .
'</span>';
//		$displayData->btnClass = ($j3 && $buttonAction !=
'dropdown') ? 'btn btn-default ' : '';
		$displayData->btnClass = ($buttonAction != 'dropdown') ?
'btn btn-default ' : '';
		//$displayData->iconClass = $j3 ? 'icon-remove' :
'icon-minus';
		$displayData->list_delete_icon =
$params->get('list_delete_icon', 'delete');
//		$displayData->label = $j3 ? ' ' .
Text::_('COM_FABRIK_DELETE') : '<span>' .
Text::_('COM_FABRIK_DELETE') . '</span>';
		$displayData->label = ' ' .
Text::_('COM_FABRIK_DELETE');
		$displayData->renderContext = $this->getRenderContext();

		$layout =
$this->getLayout('listactions.fabrik-delete-button');

//		if ($j3)
//		{
			return $layout->render($displayData);
/*
		}
		else
		{
			$btn = '<a href="#" class="' .
$displayData->btnClass . 'delete"
data-listRef="list_' . $displayData->renderContext
				. '" title="' .
Text::_('COM_FABRIK_DELETE') . '">'
				. FabrikHelperHTML::image('delete.png', 'list',
$displayData->tpl, array('alt' => $displayData->label,
'icon-class' => $displayData->iconClass)) . ' ' .
$displayData->text . '</a>';

			return '<li class="fabrik_delete">' . $btn .
'</li>';
		}
*/
	}

	/**
	 * Get a list of possible menus
	 * USED TO BUILD RELATED TABLE LINKS WITH CORRECT ITEMID AND TEMPLATE
	 *
	 * @since   2.0.4
	 *
	 * @return  array  linked table menu items
	 */
	protected function getTableLinks()
	{
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');

		if (isset($this->tableLinks))
		{
			return $this->tableLinks;
		}

		$joinsToThisKey = $this->getJoinsToThisKey();

		if (empty($joinsToThisKey))
		{
			$this->tableLinks = array();
		}
		else
		{
			$query = $this->_db->getQuery(true);
			$query->select('*')->from('#__menu');

			foreach ($joinsToThisKey as $element)
			{
				$linkWhere[] = 'link LIKE "index.php?option=com_' .
$package . '&view=list&listid=' . (int)
$element->list_id . '%"';
			}

			$where = 'type = "component" AND (' . implode('
OR ', $linkWhere) . ')';
			$query->where($where);
			$this->_db->setQuery($query);
			$this->tableLinks = $this->_db->loadObjectList();
		}

		return $this->tableLinks;
	}

	/**
	 * For related table links get the record count for each of the
table's rows
	 *
	 * @param   object  &$element  element
	 * @param   array   $pks       primary keys to count on
	 *
	 * @return  array  counts key'd on element primary key
	 */
	public function getRecordCounts(&$element, $pks = array())
	{
		if (!isset($this->recordCounts))
		{
			$this->recordCounts = array();
		}

		$input = $this->app->getInput();
		$k = $element->element_id;

		if (array_key_exists($k, $this->recordCounts))
		{
			return $this->recordCounts[$k];
		}

		$listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$listModel->setId($element->list_id);
		$db = $listModel->getDb();
		$elementModel =
$listModel->getFormModel()->getElement($element->element_id,
true);
		$key = $elementModel->getFullName(false, false);
		$linkKey = FabrikString::safeColName($key);
		$fparams = $listModel->getParams();

		// Ensure that the faceted list's "require filters" option
is set to false
		$fparams->set('require-filter', false);

		// Ignore faceted lists session filters
		$origIncSesssionFilters =
$input->get('fabrik_incsessionfilters', true);
		$input->set('fabrik_incsessionfilters', false);
		$query = $db->getQuery(true);
		$query =
$listModel->buildQueryWhere($input->getInt('incfilters',
0), $query);

		if (!FArrayHelper::emptyIsh($pks))
		{
			// Only load the current record sets record counts
			$query->where($linkKey . ' IN (' . implode(',',
$pks) . ')');
		}
		// Force reload of join sql
		$listModel->set('joinsSQL', null);

		// Trigger load of joins without cdd elements - seems to mess up count
otherwise
		$listModel->set('includeCddInJoin', false);
		$k2 = $db->q(FabrikString::safeColNameToArrayKey($key));

		// $$$ Jannus - see http://fabrikar.com/forums/showthread.php?t=20751
		$distinct = $listModel->mergeJoinedData() ? 'DISTINCT ' :
'';
		$item = $listModel->getTable();
		$query->select($k2 . ' AS linkKey, ' . $linkKey . ' AS
id, COUNT(' . $distinct . $item->db_primary_key . ') AS
total')
            ->from($db->quoteName($item->db_table_name));
		$query = $listModel->buildQueryJoin($query);
		$listModel->set('includeCddInJoin', true);
		$query->group($linkKey);
		$sql = (string) $query;
		$db->setQuery($query);
		$this->recordCounts[$k] = $db->loadObjectList('id');
		$this->recordCounts[$k]['linkKey'] =
FabrikString::safeColNameToArrayKey($key);
		FabrikHelperHTML::debug($query->dump(), 'getRecordCounts query:
' . $linkKey);
		FabrikHelperHTML::debug($this->recordCounts[$k], 'getRecordCounts
data: ' . $linkKey);
		$input->set('fabrik_incsessionfilters',
$origIncSesssionFilters);

		return $this->recordCounts[$k];
	}

	/**
	 * Creates the html <a> link allowing you to edit other forms from
the list
	 * E.g. Faceted browsing: those specified in the list's
"Form's whose primary keys link to this table"
	 *
	 * @param   bool    $popUp    is popup link
	 * @param   object  $element  27/06/2011 - changed to passing in element
	 * @param   object  $row      current list row
	 * @param   string  $key      key
	 * @param   string  $val      value
	 * @param   bool    $useKey   use the key
	 * @param   int     $f        repeat value 27/11/2011
	 *
	 * @return  string	<a> html part
	 */
	public function viewFormLink($popUp = false, $element = null, $row = null,
$key = '', $val = '', $useKey = false, $f = 0)
	{
		$elKey = $element->list_id . '-' . $element->form_id .
'-' . $element->element_id;
		$params = $this->getParams();
		$listId = $element->list_id;
		$formId = $element->form_id;
		$faceted = $params->get('facetedlinks');
		$linkedFormText = ArrayHelper::fromObject($faceted->linkedformtext);
		$msg = FArrayHelper::getValue($linkedFormText, $elKey);
		$row2 = ArrayHelper::fromObject($row);
		$label = $this->parseMessageForRowHolder($msg, $row2);
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$itemId = FabrikWorker::itemId();

		if (is_null($listId))
		{
			$list = $this->getTable();
			$listId = $list->id;
		}

		if (is_null($formId))
		{
			$form = $this->getFormModel()->getForm();
			$formId = $form->id;
		}

		$facetTable = $this->facetedTable($listId);

		if ($facetTable->canAdd())
		{

			if ($this->app->isClient('administrator'))
			{
				$bits[] = 'task=form.view';
				$bits[] = 'cid=' . $formId;
			}
			else
			{
				$bits[] = 'view=form';
				$bits[] = 'Itemid=' . $itemId;
			}

			$bits[] = 'formid=' . $formId;
			$bits[] = 'referring_table=' . $this->getTable()->id;

			// $$$ hugh - change in databasejoin getValue() means we have to append
_raw to key name
			if ($key != '')
			{
				$bits[] = $key . '_raw=' . $val;
			}

			if ($useKey and $key != '' and !is_null($row))
			{
				$bits[] = 'usekey=' . FabrikString::shortColName($key);
				$bits[] = 'rowid=' . $row->slug;
			}

			$url = 'index.php?option=com_' . $package . '&'
. implode('&', $bits);
			$url = Route::_($url);

			if (is_null($label) || $label == '')
			{
				$label = Text::_('COM_FABRIK_LINKED_FORM_ADD');
			}

		}
		else
		{
			$url = "";
		}

		$displayData = new stdClass;
		$displayData->url = $url;
		$displayData->label = $label;
		$displayData->popUp = $popUp;
		$displayData->canAdd = $facetTable->canAdd();
		$displayData->tmpl = $this->getTmpl();
		$displayData->row = $row;
		$layout =
$this->getLayout('list.fabrik-related-data-add-button');

		return $layout->render($displayData);
	}

	/**
	 * Get one of the current tables facet tables
	 *(used in tables that link to this lists links)
	 *
	 * @param   int  $id  list id
	 *
	 * @return  object	table
	 */
	protected function facetedTable($id)
	{
		if (!isset($this->facettables))
		{
			$this->facettables = array();
		}

		if (!array_key_exists($id, $this->facettables))
		{
			$this->facettables[$id] =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
			$this->facettables[$id]->setId($id);
		}

		return $this->facettables[$id];
	}

	/**
	 * Build the link (<a href..>) for viewing list data
	 *
	 * @param   bool    $popUp    is the link to generated a popup to show
	 * @param   object  $element  27/06/2011
	 * @param   object  $row      current list row data
	 * @param   string  $key      28/06/2011 - do longer passed in with _raw
appended (done in this method)
	 * @param   string  $val      value
	 * @param   int     $count    number of related records
	 * @param   int     $f        ref to related data admin info 27/16/2011
	 *
	 * @return  string
	 */
	public function viewDataLink($popUp = false, $element = null, $row = null,
$key = '', $val = '', $count = 0, $f = null)
	{
		$count = (int) $count;
		$elKey = $element->list_id . '-' . $element->form_id .
'-' . $element->element_id;
		$listId = $element->list_id;
		$params = $this->getParams();
		$faceted = $params->get('facetedlinks');

		/* $$$ hugh - we are getting element keys that aren't in the
linkedlisttext.
		 * not sure why, so added this defensive code.  Should probably find out
		* why though!  I just needed to make this error go away NAO!
		*/
		$linkedListText = isset($faceted->linkedlisttext->$elKey) ?
$faceted->linkedlisttext->$elKey : '';
		$row2 = ArrayHelper::fromObject($row);
		$label = $this->parseMessageForRowHolder($linkedListText, $row2);

		if (is_null($listId))
		{
			$list = $this->getTable();
			$listId = $list->id;
		}

		$displayData = new stdClass;
		$displayData->count = $count;
		$facetTable = $this->facetedTable($listId);

		if ($facetTable->canView())
		{
			$showRelated = (int) $params->get('show_related_info', 0);
			$emptyLabel = $showRelated === 1 ?
Text::_('COM_FABRIK_NO_RECORDS') : '';
			$displayData->totalLabel = ($count === 0) ? $emptyLabel : '(0)
' . $label;
			$showRelatedAdd = (int) $params->get('show_related_add',
0);
			$existingLinkedForms = (array) $params->get('linkedform');
			$linkedForm = FArrayHelper::getValue($existingLinkedForms, $f, false);
			$displayData->addLink = $linkedForm == '0' ?
$this->viewFormLink($popUp, $element, $row, $key, $val, false, $f) :
'';

			$key .= '_raw';

			if ($label === '')
			{
				$label = Text::_('COM_FABRIK_VIEW');
			}

			$displayData->url = $this->relatedDataURL($key, $val, $listId);
			$displayData->showRelated = $showRelated == 0 || ($showRelated == 2 
&& $count);
			$displayData->showAddLink = $displayData->addLink != ''
&& ($showRelatedAdd === 1 || ($showRelatedAdd === 2 &&
$count === 0));
		}

		$displayData->label = $label;
		$displayData->popUp = $popUp;
		$displayData->canView = $facetTable->canView();
		$displayData->tmpl = $this->getTmpl();
		$displayData->row = $row;
		$layout =
$this->getLayout('list.fabrik-related-data-view-button');

		return $layout->render($displayData);
	}

	/**
	 * Make related data URL
	 *
	 * @param   string  $key     Related link key
	 * @param   string  $val     Related link value
	 * @param   int     $listId  List id
	 *
	 * @since   3.0.8
	 *
	 * @return  string  URL
	 */
	protected function relatedDataURL($key, $val, $listId)
	{

		$itemId = FabrikWorker::itemId($listId);
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$url = 'index.php?option=com_' . $package . '&';

		if ($this->app->isClient('administrator'))
		{
			$bits[] = 'task=list.view';
			$bits[] = 'cid=' . $listId;
		}
		else
		{
			$bits[] = 'view=list';
			$bits[] = 'listid=' . $listId;

			// Jaanus 12 Apr 2015 - commenting out the Itemid stuff as it totally
messed up things i.e when one list was under many menu items and
prefiltered differently under each item
			/*
			$listLinks = $this->getTableLinks();

			// $$$ rob 01/03/2011 find at matching itemid in another menu item for
the related data link
			foreach ($listLinks as $listLink)
			{
				if (strstr($listLink->link, 'index.php?option=com_' .
$package . '&view=list&listid=' . $listId))
				{
					$bits[] = 'Itemid=' . $listLink->id;
					$itemId = $listLink->id;
					break;
				}
			}
			*/

			$bits[] = 'Itemid=' . $itemId;
		}

		if ($key != '')
		{
			$bits[] = $key . '=' . $val;
		}

		$bits[] = 'limitstart' . $listId . '=0';
		$bits[] = 'resetfilters=1';

		// Nope stops url filter form working on related data :(
		// $bits[] = 'clearfilters=1';

		// Test for related data, filter once, go back to main list re-filter -
		$bits[] = 'fabrik_incsessionfilters=0';

		$args = new stdClass;
		$args->bits = $bits;
		FabrikWorker::getPluginManager()->runPlugins('onRelatedDataURL',
$this, 'list', $args);
		$bits = $args->bits;

		$url .= implode('&', $bits);
		$url = Route::_($url);

		return $url;
	}

	/**
	 * Add a normal/custom link to the element data
	 *
	 * @param   string             $data           Element data
	 * @param   PlgFabrik_Element  &$elementModel  Element model
	 * @param   object             $row            All row data
	 * @param   int                $repeatCounter  Repeat group counter
	 *
	 * @return  string	element data with link added if specified
	 */
	public function _addLink($data, &$elementModel, $row, $repeatCounter =
0)
	{
		$element = $elementModel->getElement();
		$params = $elementModel->getParams();
		$customLink = trim($params->get('custom_link',
''));
		$target = trim($params->get('custom_link_target',
''));

		if ($this->outputFormat == 'csv' ||
($element->link_to_detail == 0 && $customLink == ''))
		{
			return $data;
		}

		// $$$ rob if its a custom link then we aren't linking to the
details view so we should
		// ignore the view details access settings
		if (!($this->canViewDetails($row) || $this->canEdit()) &&
$customLink == '')
		{
			return $data;
		}

		$link = $this->linkHref($elementModel, $row, $repeatCounter);

		if ($link == '')
		{
			return $data;
		}
		// Try to remove any previously entered links
		$data = preg_replace('/<a(.*?)>|<\/a>/',
'', $data);
		$class = '';

		if ($this->canViewDetails($row))
		{
			$class = ' fabrik_view';
		}

		if ($this->canEdit($row))
		{
			$class = ' fabrik_edit';
		}


		$loadMethod = $this->getLoadMethod('custom_link');
		$class = 'fabrik___rowlink ' . $class;
		$dataList = 'list_' . $this->getRenderContext();
		$rowId = $this->getSlug($row);
		$isAjax = $this->isAjaxLinks() ? '1' : '0';
		$isCustom = $customLink !== '';
		$isIcon = false;
		
		/* Check if the data component is html, if it is an icon lnk and image
parse it out */
		$html = FabrikHelperHTML::loadDOMDocument($data);
		$a   = $html->getElementsByTagName('a')->item(0);
		$img = $html->getElementsByTagName('img')->item(0);
		if (isset($html) && isset($a) && isset($img))
		{
			$isIcon = true;
		}

		$paths = array(
			COM_FABRIK_FRONTEND . '/views/list/tmpl/' .
$this->getTmpl() . '/layouts/element/' .
$elementModel->getFullName(true, false)
		);

		if ($isIcon === true ) {
			$layout =
$this->getLayout('element.fabrik-element-custom-icon-link',
$paths);
		} else {
			$layout =
$this->getLayout('element.fabrik-element-custom-link',
$paths);
		}
		$displayData             = new stdClass;
		$displayData->loadMethod = $loadMethod;
		$displayData->dataList   = $dataList;
		$displayData->isAjax     = $isAjax;
		$displayData->customLink = $customLink;
		$displayData->isCustom   = $isCustom;
		$displayData->class      = $class;
		$displayData->link       = $link;
		$displayData->rowId      = $rowId;
		$displayData->target     = $target;

		if  ($isIcon) {
			$displayData->data_original = $a->nodeValue;
			$displayData->opts = $a->getAttribute('opts');
			$displayData->data = $a->ownerDocument->saveHTML($img);
			$displayData->title = $a->getAttribute('title');
		} else {
			$displayData->data = $data;
		}
		
		$data = $layout->render($displayData);

		return $data;
	}

	/**
	 * Get the href for the edit/details link
	 *
	 * @param   object  $elementModel   Element model
	 * @param   array   $row            Lists current row data
	 * @param   int     $repeatCounter  Repeat group counter
	 *
	 * @since   2.0.4
	 *
	 * @return  string	link href
	 */
	public function linkHref($elementModel, $row, $repeatCounter = 0)
	{
		$element = $elementModel->getElement();
		$table = $this->getTable();
		$params = $elementModel->getParams();
		$customLink = $params->get('custom_link');
		$link = '';

		if ($customLink == '')
		{
			// $$$ rob only test canEdit and canView on standard edit links - if
custom we should always use them,
			// 3.0 get either edit or view link - as viewDetailsLink now always
returns the view details link
			if ($this->canEdit($row))
			{
				$this->_aLinkElements[] = $element->name;
				$link = $this->editLink($row);
			}
			elseif ($this->canViewDetails($row))
			{
				$this->_aLinkElements[] = $element->name;
				$link = $this->viewDetailsLink($row);
			}
		}
		else
		{
			$array = ArrayHelper::fromObject($row);

			foreach ($array as $k => &$v)
			{
				/* $$$ hugh - not everything is JSON, some stuff is just plain strings.
				 * So we need to see if JSON encoding failed, and only use result if it
didn't.
				* $v = json_decode($v, true);
				*/
				if (is_array($v))
				{
					$v = FArrayHelper::getValue($v, $repeatCounter);
				}
				else
				{
				    // use JSONtoData() so //..*..// separated data gets exploded into
array
					//$v2 = json_decode($v, true);
					$v2 = \Fabrik\Helpers\Worker::JSONtoData($v);

					if ($v2 !== null)
					{
						if (is_array($v2))
						{
							$v = FArrayHelper::getValue($v2, $repeatCounter);
						}
						else
						{
							$v = $v2;
						}
					}
				}
			}

			$array['rowid'] = $this->getSlug($row);
			$array['listid'] = $table->id;

			$link = Route::_($this->parseMessageForRowHolder($customLink,
$array));
		}

		// Allow creating custom links, default layout will just return $link
unaltered
		$layout                     =
FabrikHelperHTML::getLayout('element.fabrik-element-details-link');
		$displayData                = new stdClass;
		$displayData->row           = $row;
		$displayData->listModel     = $this;
		$displayData->elementModel  = $elementModel;
		$displayData->customLink    = $customLink;
		$displayData->repeatCounter = $repeatCounter;
		$displayData->link          = $link;
		$link                       = $layout->render($displayData);

		return $link;
	}

	/**
	 * get query to make records
	 *
	 * @return  string	sql
	 */
	public function buildQuery()
	{
		$profiler = Profiler::getInstance('Application');
		$input = $this->app->getInput();
		JDEBUG ? $profiler->mark('buildQuery: start') : null;
		$db = $this->getDb();
		$query = $db->getQuery(true);
		$table = $this->getTable();

		if ($this->mergeJoinedData())
		{
			/* $$$ rob - get a list of the main table's ids limited on the
navigation
			 * this will then be used to filter the main query,
			* by modifying the where part of the query
			*/
			$db = $this->getDb();
			$table = $this->getTable();

			/* $$$ rob 23/05/2012 if the search data is in the joined records we
want to get the id's for the joined records and not the master record
			 see http://fabrikar.com/forums/showthread.php?t=26400. This is a
partial hack as I can't see how we know which joined record is really
last
			$$$ rob 25/05/2012 - slight change so that we work our way up the pk/fk
list until we find some ids.
			$$$ hugh, later in the day 25/05/2012 - big OOOOPS, see comment below
about table_key vs table_join_key!
			erm no not a mistake!?! reverted as no example of what was wrong with
original code
			*/
			$joins = $this->getJoins();

			// Default to the primary key as before this fix
			$lookupC = 0;
			$tmpPks = array();

			foreach ($joins as $join)
			{
				// $$$ hugh - added repeatElement, as _makeJoinAliases() is going to
set canUse to false for those,
				// so they won't get included in the query ... so will blow up if
we reference them with __pk_calX selection
				if ($join->params->get('type') !== 'element'
&& $join->params->get('type') !==
'repeatElement')
				{
					// $$$ hugh - need to be $lookupC + 1, otherwise we end up with two
0's, 'cos we added main table above

					/**
					 * [non-merged data]
					 *
					 * country	towm
					 * ------------------------------
					 * france	la rochelle
					 * france	paris
					 * france	bordeaux
					 *
					 * [merged data]
					 *
					 * country	town
					 * -------------------------------
					 * france	la rochelle
					 * 			paris
					 * 			bordeaux
					 *
					 * [now search on town = 'la rochelle']
					 *
					 * If we don't use this new code then the search results show all
three towns.
					 * By getting the lowest set of complete primary keys (in this example
the town ids) we set our query to be:
					 *
					 * where town_id IN (1)
					 *
					 * which gives a search result of
					 *
					 * country	town
					 * -------------------------------
					 * france	la rochelle
					 *
					 */
					$pk = $join->params->get('pk');

					if (!array_key_exists($pk, $tmpPks) || !is_array($tmpPks[$pk]))
					{
						$tmpPks[$pk] = array($pk);
					}
					else
					{
						if (count($tmpPks[$pk]) == 1)
						{
							$v = str_replace('`', '', $tmpPks[$pk][0]);
							$v = explode('.', $v);
							// $v[0] = $v[0] . '_0';
							$tmpPks[$pk][0] = $db->qn($v[0] . '.' . $v[1]);
						}

						$v = str_replace('`', '', $pk);
						$v = explode('.', $v);
						$v[0] = $v[0] . '_' . (count($tmpPks[$pk]) == 0 ?
'' : count($tmpPks[$pk]) - 1);
						$tmpPks[$pk][] = $db->qn($v[0] . '.' . $v[1]);
					}
				}
			}
			// Check for duplicate pks if so we can presume that they are aliased
with _X in from query
			$lookupC = 0;
			$lookUps = array('DISTINCT ' . $table->db_primary_key .
' AS __pk_val' . $lookupC);
			$lookUpNames = array($table->db_primary_key);

			foreach ($tmpPks as $pks)
			{
				foreach ($pks as $pk)
				{
					$lookUps[] = $pk . ' AS __pk_val' . ($lookupC + 1);
					$lookUpNames[] = $pk;
					$lookupC++;
				}
			}

			// $$$ rob if no ordering applied i had results where main record (e.g.
UK) was shown in 2 lines not next to each other
			// causing them not to be merged and a 6 rows shown when limit set to 5.
So below, if no order by set then order by main pk asc
			$by = trim($table->order_by) === '' ? array() : (array)
json_decode($table->order_by);

			if (empty($by))
			{
				$dir = (array) json_decode($table->order_dir);
				array_unshift($dir, 'ASC');
				$table->order_dir = json_encode($dir);

				$by = (array) json_decode($table->order_by);
				array_unshift($by, $table->db_primary_key);
				$table->order_by = json_encode($by);
			}

			// $$$ rob build order first so that we know of any elements we need to
include in the select statement
			$query = $this->buildQueryOrder($query);
			$this->selectedOrderFields = (array) $this->selectedOrderFields;
			$this->selectedOrderFields = array_unique(array_merge($lookUps,
$this->selectedOrderFields));

			$query->select(implode(', ', $this->selectedOrderFields)
. ' FROM ' . $db->qn($table->db_table_name));
			$query = $this->buildQueryJoin($query);
			$query =
$this->buildQueryWhere($input->get('incfilters', 1),
$query);
			$query = $this->buildQueryGroupBy($query);

			// Can't limit the query here as this gives incorrect _data array.
			// $db->setQuery($query, $this->limitStart,
$this->limitLength);
			$db->setQuery($query);
			FabrikHelperHTML::debug((string) $query, 'table:mergeJoinedData get
ids');
			$ids = array();
			$idRows = $db->loadObjectList();
			$maxPossibleIds = count($idRows);

			// An array of the lists pk values
			$mainKeys = array();

			foreach ($idRows as $r)
			{
				$mainKeys[] = $db->q($r->__pk_val0);
			}

			// Chop up main keys for list limitstart, length to cull the data down
to the correct length as defined by the page nav/ list settings
			$mainKeys = array_unique($mainKeys);

			if ($this->limitLength > 0)
			{
				$mainKeys = array_slice($mainKeys, $this->limitStart,
$this->limitLength);
			}

			/**
			 * $$$ rob get an array containing the PRIMARY key values for each
joined tables data.
			 * Stop as soon as we have a set of ids totaling the sum of records
contained in $idRows
			*/
			while (count($ids) < $maxPossibleIds && $lookupC >= 0)
			{
				$ids = ArrayHelper::getColumn($idRows, '__pk_val' .
$lookupC);

				for ($idx = count($ids) - 1; $idx >= 0; $idx--)
				{
					if ($ids[$idx] == '')
					{
						unset($ids[$idx]);
					}
					else
					{
						$ids[$idx] = $db->q($ids[$idx]);
					}
				}

				if (count($ids) < $maxPossibleIds)
				{
					$lookupC--;
				}
			}

			/*
			foreach ($lookUpNames as $c => $lookUpName)
			{
				$ids[$lookUpName] = ArrayHelper::getColumn($idRows,
'__pk_val' . $c);
			}
			*/
		}

		// Now lets actually construct the query that will get the required
records:
		$query->clear();
		unset($this->orderBy);
		$query = $this->buildQuerySelect('list', $query);
		JDEBUG ? $profiler->mark('queryselect: got') : null;
		$query = $this->buildQueryJoin($query);
		JDEBUG ? $profiler->mark('queryjoin: got') : null;

		if ($this->mergeJoinedData())
		{
			/* $$$ rob We've already used buildQueryWhere to get our list of
main pk ids.
			 * so lets use that list of ids to create the where statement. This will
return 5/10/20 etc
			* records from our main table, as per our page nav, even if a main
record has 3 rows of joined
			* data. If no ids found then do where "2 = -2" to return no
records (was "1 = -1", changed to make
			* it easier to know where this is coming form when debugging)
			*/
			if (!empty($ids))
			{

				if ($lookUpNames[$lookupC] !== $table->db_primary_key)
				{
					$query->where($lookUpNames[$lookupC] . ' IN (' .
implode(',', array_unique($ids)) . ')');
				}

				/*
				foreach ($ids as $lookUpName => $pks)
				{
					if ($lookUpName !== $table->db_primary_key)
					{
						if (!empty($pks))
						{
							$query->where($lookUpName . ' IN (' .
implode(array_unique($pks), ',') . ')');
						}
					}
				}
				*/

				if (!empty($mainKeys))
				{
					// Limit to the current page
					$query->where($table->db_primary_key . ' IN (' .
implode(',', $mainKeys) . ')');
				}
				else
				{
					$query->where('2 = -2');
				}
			}
			else
			{
				$query->where('2 = -2');
			}
		}
		else
		{
			// $$$ rob we aren't merging joined records so lets just add the
standard where query
			// Incfilters set when exporting as CSV
			$query =
$this->buildQueryWhere($input->get('incfilters', 1),
$query);
		}

		$query = $this->buildQueryGroupBy($query);
		$query = $this->buildQueryOrder($query);
		$query = $this->pluginQuery($query);
		$this->mainQuery = $query;

		/*
		$params = $this->getParams();

		if ($params->get('force_collate', '') !==
'')
		{
			$query .= ' COLLATE ' .
$params->get('force_collate', '') . ' ';
		}
		*/

		return (string) $query;
	}

	/**
	 * Pass an sql query through the table plug-ins
	 *
	 * @param   string  $query  sql query
	 *
	 * @return  string	altered query.
	 */
	public function pluginQuery($query)
	{
		// Pass the query as an object property so it can be updated via
reference
		$args = new stdClass;
		$args->query = $query;
		FabrikWorker::getPluginManager()->runPlugins('onQueryBuilt',
$this, 'list', $args);
		$query = $args->query;

		return $query;
	}

	/**
	 * Add the slug field to the select fields, called from buildQuerySelect()
	 *
	 * @param   array  &$fields  fields
	 *
	 * @since 3.0.6
	 *
	 * @return  void
	 */
	private function selectSlug(&$fields)
	{
		$formModel = $this->getFormModel();
		$item = $this->getTable();
		$pk = FabrikString::safeColName($item->db_primary_key);
		$params = $this->getParams();

		if (in_array($this->outputFormat, array('raw',
'html', 'partial', 'feed', 'pdf',
'phocapdf')))
		{
			$slugElement = null;
			$slug = $params->get('sef-slug');
			if (!empty($slug)) {
				$raw = StringHelper::substr($slug, StringHelper::strlen($slug) - 4, 4)
== '_raw' ? true : false;
				$slug = FabrikString::rtrimword($slug, '_raw');
				$slugElement = $formModel->getElement($slug);
			}
			if ($slugElement)
			{
				$slug = $slugElement->getSlugName($raw);
				$slug = FabrikString::safeColName($slug);
				$fields[] = "CONCAT_WS(':', $pk, $slug) AS slug";
			}
			else
			{
				if ($pk !== '``')
				{
					$fields[] = $pk . ' AS slug';
				}
			}
		}
	}

	/**
	 * Get the select part of the query
	 *
	 * @param   string                      $mode   List/form - effects which
elements are selected
	 * @param   JDatabaseQueryElement|bool  $query  QueryBuilder (false to
return string)
	 *
	 * @return  mixed  string if $query = false, otherwise $query
	 */
	public function buildQuerySelect($mode = 'list', $query = false)
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('queryselect: start') : null;
		$db = $this->getDb();
		$form = $this->getFormModel();
		$table = $this->getTable();
		$form->getGroupsHiarachy();
		JDEBUG ? $profiler->mark('queryselect: fields load start') :
null;
		$fields = $this->getAsFields($mode);
		$pk = FabrikString::safeColName($table->db_primary_key);
		$params = $this->getParams();
		$this->selectSlug($fields);
		JDEBUG ? $profiler->mark('queryselect: fields loaded') :
null;
		$sFields = (empty($fields)) ? '' : implode(", \n ",
$fields) . "\n ";

		/**
		 * Testing potential fix for FOUND_ROWS performance issue on large
tables.  If merging,
		 * we never do a SELECT FOUND_ROWS(), so no need to use
SQL_CALC_FOUND_ROWS.
		 */
		$calcFoundRows = $this->mergeJoinedData() ? '' :
'SQL_CALC_FOUND_ROWS';

		/**
		 * Distinct creates a temporary table which may slow down queries.
		 * Added advanced option to toggle it on/off
		 *
http://fabrikar.com/forums/index.php?threads/bug-distinct.39160/#post-196739
		 */
		$distinct = $params->get('distinct', true) ?
'DISTINCT' : '';

		// $$$rob added raw as an option to fix issue in saving calendar data
		if (trim($table->db_primary_key) != '' &&
(in_array($this->outputFormat, array('partial',
'raw', 'html', 'feed', 'pdf',
'phocapdf', 'csv', 'word', 'yql',
'oai'))))
		{
			$sFields .= ', ';
			$strPKey = $pk . ' AS ' . $db->qn('__pk_val') .
"\n";

			if ($query)
			{
				$query->select($calcFoundRows . ' ' . $distinct . '
' . $sFields . $strPKey);
			}
			else
			{
				$sql = 'SELECT ' . $calcFoundRows . ' ' . $distinct
. ' ' . $sFields . $strPKey;
			}
		}
		else
		{
			if ($query)
			{
				$query->select($calcFoundRows . ' ' . $distinct . '
' . $sFields);
			}
			else
			{
				$sql = 'SELECT ' . $calcFoundRows . ' ' . $distinct
. ' ' . trim($sFields, ", \n") . "\n";
			}
		}

		if ($query)
		{
			$query->from($db->qn($table->db_table_name));
		}
		else
		{
			$sql .= ' FROM ' . $db->qn($table->db_table_name) .
" \n";
		}

		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('onBuildQuerySelect', $this,
'list', $query);

		return $query ? $query : $sql;
	}

	/**
	 * Get the part of the sql statement that orders the table data
	 * Since 3.0.7 caches the results as calling orderBy twice when using
single ordering in admin module anules the user selected order by
	 *
	 * @param   mixed  $query  False or a query object
	 *
	 * @throws ErrorException
	 *
	 * @return  mixed  string or query object - Ordering part of sql statement
	 */
	public function buildQueryOrder($query = false)
	{
		$sig = $query ? 1 : 0;

		if (!isset($this->orderBy))
		{
			$this->orderBy = array();
		}

		if (array_key_exists($sig, $this->orderBy))
		{
			return $this->orderBy[$sig];
		}

		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$params = $this->getParams();
		$input = $this->app->getInput();
		$formModel = $this->getFormModel();
		$table = $this->getTable();
		$db = $this->getDb();
		$this->selectedOrderFields = array();

		if ($this->outputFormat == 'fabrikfeed' ||
$this->outputFormat == 'feed')
		{
			$dateColId = (int) $params->get('feed_date', 0);
			$dateColElement = $formModel->getElement($dateColId, true);
			$dateCol = $db->qn($dateColElement->getFullName(false, false,
false));

			if ($dateColId !== 0)
			{
				$this->order_dir = 'DESC';
				$this->order_by = $dateCol;

				if (!$query)
				{
					return "\n" . ' ORDER BY ' . $dateCol . '
DESC';
				}
				else
				{
					$query->order($dateCol . ' DESC');

					return $query;
				}
			}
		}

		$strOrder = '';

		/**
		 * When list reordered the controller runs order() and
		 * stores the order settings in the session by calling setOrderByAndDir()
		 * it then redirects to the list view and here all we need to do it get
		 * those order settings from the session
		*/
		$elements = $this->getElements();

		// Build the order by statement from the session
		$clearOrdering = (bool) $input->getInt('clearordering',
false) && $input->get('task') !== 'order';
		$singleOrdering = $this->singleOrdering();

		foreach ($elements as $element)
		{
			$context = 'com_' . $package . '.list' .
$this->getRenderContext() . '.order.' .
$element->getElement()->id;

			if ($clearOrdering)
			{
				$this->session->set($context, null);
			}
			else
			{
				// $$$tom Added single-ordering option
				if (!$singleOrdering || ($singleOrdering &&
$element->getElement()->id ==
$input->getInt('orderby')))
				{
					$dir = $this->session->get($context);

					if ($dir != '' && $dir != '-' &&
trim($dir) != 'Array')
					{
						$strOrder == '' ? $strOrder = "\n ORDER BY " :
$strOrder .= ',';
						$strOrder .=
FabrikString::safeNameQuote($element->getOrderByName(), false) . '
' . $dir;
						$orderByName =
FabrikString::safeNameQuote($element->getOrderByName(), false);
						$this->orderEls[] = $orderByName;
						$this->orderDirs[] = $dir;
						$element->getAsField_html($this->selectedOrderFields,
$aAsFields);

						if ($query !== false && is_object($query))
						{
							$query->order($orderByName . ' ' . $dir);
						}
					}
				}
				else
				{
					$this->session->set($context, null);
				};
			}
		}
		$userHasOrdered = ($strOrder == '') ? false : true;

		// If nothing found in session use default ordering (or that set by
querystring)
		if (!$userHasOrdered)
		{
			$orderBys = explode(',',
$input->getString('order_by',
$input->getString('orderby', '')));

			if ($orderBys[0] == '')
			{
				$orderBys = json_decode($table->order_by, true);
			}
			// $$$ not sure why, but sometimes $orderBys is NULL at this point.
			if (!isset($orderBys))
			{
				$orderBys = array();
			}
			// Covert ids to names (were stored as names but then stored as ids)
			foreach ($orderBys as &$orderBy)
			{
				if (is_numeric($orderBy))
				{
					$elementModel = $formModel->getElement($orderBy, true);
					$orderBy = $elementModel ? $elementModel->getOrderByName() :
$orderBy;
				}
			}

			$orderDirs = explode(',',
$input->getString('order_dir',
$input->getString('orderdir', '')));

			if ($orderDirs[0] == '' || $orderDirs[0] == '-')
			{
				$orderDirs = json_decode($table->order_dir, true);
			}

			$els = $this->getElements('filtername');

			if (!empty($orderBys))
			{
				$bits = array();
				$o = 0;

				foreach ($orderBys as $orderByRaw)
				{
					$dir = FArrayHelper::getValue($orderDirs, $o, 'desc');

					// As we use getString() for query string, need to sanitize
					if (!in_array(strtolower($dir), array('asc',
'desc','-')))
					{
						throw new ErrorException('invalid order direction: ' .
$dir, 500);
					}

					if ($orderByRaw !== '' && $dir != '-')
					{
						// $$$ hugh - getOrderByName can return a CONCAT, ie join element ...

						/*
						 * $$$ hugh - OK, we need to test for this twice, because older
elements
						 * which get converted form names to ids above have already been run
through
						 * getOrderByName().  So first check here ...
						 */
						if (!StringHelper::stristr($orderByRaw, 'CONCAT(')
&& !StringHelper::stristr($orderByRaw, 'CONCAT_WS('))
						{
							$orderByRaw = FabrikString::safeColName($orderByRaw);

							if (array_key_exists($orderByRaw, $els))
							{
								$field = $els[$orderByRaw]->getOrderByName();
								/*
								 * $$$ hugh - ... second check for CONCAT, see comment above
								 * $$$ @TODO why don't we just embed this logic in
safeColName(), so
								 * it recognizes a CONCAT and treats it accordingly?
								 */
								if (!StringHelper::stristr($field, 'CONCAT(') &&
!StringHelper::stristr($field, 'CONCAT_WS('))
								{
									$field = FabrikString::safeColName($field);
								}

								$bits[] = " $field $dir";
								$this->orderEls[] = $field;
								$this->orderDirs[] = $dir;
							}
							else
							{
								if (strstr($orderByRaw, '_raw`'))
								{
									$orderByRaw = FabrikString::safeColNameToArrayKey($orderByRaw);
								}

								$bits[] = " $orderByRaw $dir";
								$this->orderEls[] = $orderByRaw;
								$this->orderDirs[] = $dir;
							}
						}
						else
						{
							// If it was a CONCAT(), just add it with no other checks or
processing
							$bits[] = " $orderByRaw $dir";
							$this->orderEls[] = $orderByRaw;
							$this->orderDirs[] = $dir;
						}
					}

					$o ++;
				}

				if (!empty($bits))
				{
					if (!$query || !is_object($query))
					{
						$strOrder = "\n ORDER BY" . implode(',', $bits);
					}
					else
					{
						$query->order(implode(',', $bits));
					}
				}
			}
		}

		$groupBy = $this->getGroupBy();

		if ($groupBy !== '')
		{
			$groupByColName = FabrikString::safeColName($groupBy);

			if (!in_array($groupByColName, $this->orderEls))
			{
				$strOrder == '' ? $strOrder = "\n ORDER BY " :
$strOrder .= ',';
				$strOrder .= $groupByColName . ' ASC';
				$this->orderEls[]  = $groupBy;
				$this->orderDirs[] = 'ASC';

				if ($query !== false && is_object($query))
				{
					$query->order(FabrikString::safeColName($groupBy) . '
ASC');
				}
			}
		}

		/* apply group ordering
		 * @TODO - explain something to hugh!  Why is this "group
ordering"?  AFAICT, it's just a secondary
		* order by, isn't specific to the Group By feature in any way?  So
why not just put this option in
		*/
		$groupOrderBy = $params->get('group_by_order');

		if ($groupOrderBy != '')
		{
			$groupOrderDir = $params->get('group_by_order_dir');
			$strOrder == '' ? $strOrder = "\n ORDER BY " :
$strOrder .= ',';
			$orderBy = strstr($groupOrderBy, '_raw`') ?
FabrikString::safeColNameToArrayKey($groupOrderBy) :
FabrikString::safeColName($groupOrderBy);

			if (!$query)
			{
				$strOrder .= $orderBy . ' ' . $groupOrderDir;
			}
			else
			{
				$query->order($orderBy . ' ' . $groupOrderDir);
			}

			$this->orderEls[] = $orderBy;
			$this->orderDirs[] = $groupOrderDir;
		}

		$this->orderBy[$sig] = $query === false ? $strOrder : $query;

		return $this->orderBy[$sig];
	}

	/**
	 * Should we order on multiple elements or one
	 *
	 * @since   3.0.7 (refactored from buildQueryOrder())
	 *
	 * @return  bool
	 */
	public function singleOrdering()
	{
		$params = $this->getParams();

		if ($params->get('enable_single_sorting',
'default') == 'default')
		{
			// Use global
			$fbConfig = ComponentHelper::getParams('com_fabrik');
			$singleOrdering = $fbConfig->get('enable_single_sorting',
false);
		}
		else
		{
			$singleOrdering = $params->get('enable_single_sorting',
false);
		}

		return $singleOrdering;
	}

	/**
	 * Called when the table column order by is clicked
	 * store order options in session
	 *
	 * @return  void
	 */
	public function setOrderByAndDir()
	{
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$input = $this->app->getInput();
		$postOrderBy = $input->getInt('orderby', '');
		$postOrderDir = $input->get('orderdir', '');
		$orderValues = array('asc', 'desc', '-');
		$id = $this->getRenderContext();

		if (in_array($postOrderDir, $orderValues))
		{
			$context = 'com_' . $package . '.list' . $id .
'.order.' . $postOrderBy;
			$this->session->set($context, $postOrderDir);
			// if the order is being cleared, remove the query string so list
defaults get applied
			if ($postOrderDir === '-')
			{
				$input->set('orderby', '');
				$input->set('orderdir', '');
			}
		}
	}

	/**
	 * Get the part of the sql query that creates the joins
	 * used when building the table's data
	 *
	 * @param   bool|JDatabaseQuery  $query  JQuery object or false
	 *
	 * @return  JDatabaseQuery|string  string or join query - join sql
	 */
	public function buildQueryJoin($query = false)
	{
		$db = FabrikWorker::getDbo();
		$ref = $query ? '1' : '0';

		if (isset($this->joinsSQL[$ref]))
		{
			return $this->joinsSQL[$ref];
		}

		$statements = array();
		$table = $this->getTable();
		$selectedTables[] = $table->db_table_name;
		$return = array();
		$joins = ($this->get('includeCddInJoin', true) === false) ?
$this->getJoinsNoCdd() : $this->getJoins();

		foreach ($joins as $join)
		{
			// Used to bypass user joins if the table connect isnt the Joomla
connection
			if ((int) $join->canUse === 0)
			{
				continue;
			}

			if ($join->join_type == '')
			{
				$join->join_type = 'LEFT';
			}

			$sql = StringHelper::strtoupper($join->join_type) . ' JOIN
' . $db->qn($join->table_join);
			$k = FabrikString::safeColName($join->keytable . '.' .
$join->table_key);

			// Check we only get the field name
			$join->table_join_key = explode('.', 
$join->table_join_key);
			$join->table_join_key = array_pop($join->table_join_key);

			if ($join->table_join_alias == '')
			{
				$on = FabrikString::safeColName($join->table_join . '.' .
$join->table_join_key);
				$sql .= ' ON ' . $on . ' = ' . $k;
			}
			else
			{
				$on = FabrikString::safeColName($join->table_join_alias .
'.' . $join->table_join_key);
				$sql .= ' AS ' .
FabrikString::safeColName($join->table_join_alias) . ' ON ' .
$on . ' = ' . $k . "\n";
			}

			/*
			 * @FIXME - need to work out where the COLLATE needs to go. Was at the
end of builQuery, but that creates
			 * an invalid query if we had any grouping.  As it only applies to
joined tables, tried putting it here,
			 * but still get a query error.  Needs to be fixed, but I have to commit
to get some other changes done.
			 */
			/*
			$params = $this->getParams();

			if ($params->get('force_collate', '') !==
'')
			{
				$sql .= ' COLLATE ' .
$params->get('force_collate', '') . ' ';
			}
			*/

			/* Try to order join statements to ensure that you are selecting from
tables that have
			 * already been included (either via a previous join statement or the
table select statement)
			*/
			if (in_array($join->keytable, $selectedTables))
			{
				$return[] = $sql;
				$selectedTables[] = $join->table_join;
			}
			else
			{
				// Didn't find anything so defer it till later

				/* $statements[$join->keytable] = $sql;
				 * $$$rob - sometimes the keytable is the same for 2 deferred joins
				* in this case the first join is incorrectly overwritten in the
$statements array
				* keying on join->id should solve this
				*/
				$statements[$join->id] = array($join->keytable, $sql);
			}

			// Go through the deferred join statements and see if their table has
now been selected
			foreach ($statements as $joinId => $ar)
			{
				$t = $ar[0];
				$s = $ar[1];

				if (in_array($t, $selectedTables))
				{
					if (!in_array($s, $return))
					{
						// $$$rob test to avoid duplicate join queries
						$return[] = $s;
						unset($statements[$t]);
					}
				}
			}
		}
		// $$$rob test for bug #376
		foreach ($statements as $joinId => $ar)
		{
			$s = $ar[1];

			if (!in_array($s, $return))
			{
				$return[] = $s;
			}
		}

		if ($query !== false)
		{
			foreach ($return as $r)
			{
				$words = explode(' ', trim($r));
				$type = array_shift($words);
				$statement = str_replace('JOIN', '', implode('
', $words));
				$query->join($type, $statement);
			}

			return $query;
		}
		else
		{
			$return = implode(' ', $return);
			$this->joinsSQL[$ref] = $return;
		}

		return $query == false ? $return : $query;
	}

	/**
	 * Build query prefilter where part
	 *
	 * @param   PlgFabrik_Element  $element  Element model
	 *
	 * @return  string
	 */
	public function buildQueryPrefilterWhere($element)
	{
		$elementName = FabrikString::safeColName($element->getFullName(false,
false));
		$filters = $this->getFilterArray();
		$keys = array_keys($filters);
		$valueKeys = array_keys(FArrayHelper::getValue($filters,
'value', array()));

		foreach ($valueKeys as $i)
		{
			if ($filters['search_type'][$i] != 'prefilter' ||
$filters['key'][$i] != $elementName)
			{
				foreach ($keys as $key)
				{
					unset($filters[$key][$i]);
				}
			}
		}

		list($sqlNoFilter, $sql) = $this->_filtersToSQL($filters, true,
false);
		$where = str_replace('WHERE', '', $sql);

		if ($where != '')
		{
			$where = ' AND ' . $where;
		}

		return $where;
	}

	/**
	 * Get the part of the main query that provides a group by statement
	 * only added by 'count' element plug-in at the moment
	 *
	 * @param   bool|JDatabaseQuery  $query  false to return a mySQL string,
JQuery object to append group statement to.
	 *
	 * @return  mixed  string if $query false, else JQuery object
	 */
	public function buildQueryGroupBy($query = false)
	{
		$groups = $this->getFormModel()->getGroupsHiarachy();
		$pluginManager = FabrikWorker::getPluginManager();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$res = $elementModel->getGroupByQuery();

				if ($res != '')
				{
					$this->pluginQueryGroupBy[] = $res;
				}
			}
		}

		if (!empty($this->pluginQueryGroupBy))
		{
			if ($query === false)
			{
				return ' GROUP BY ' . implode(', ',
$this->pluginQueryGroupBy);
			}
			else
			{
				$pluginManager->runPlugins('onBuildQueryGroupBy', $this,
'list', $query);
				$query->group($this->pluginQueryGroupBy);

				return $query;
			}
		}

		$pluginManager->runPlugins('onBuildQueryGroupBy', $this,
'list', $query);

		return $query === false ? '' : $query;
	}

	/**
	 * Get the part of the sql query that relates to the where statement
	 *
	 * @param   bool                 $incFilters  if true the SQL contains any
filters
	 *                                            if false only contains
prefilter sql
	 * @param   bool|JDatabaseQuery  $query       if false return the where as
a string
	 *                                            if a db query object, set
the where clause
	 * Paul 2013-07-20 Add join parameter to limit where clause to main table
if needed
	 * @param   bool                 $doJoins     include where clauses for
joins?
	 *
	 * @return  mixed	string if $query false, else JDatabaseQuery
	 */
	public function buildQueryWhere($incFilters = true, $query = false,
$doJoins = true)
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('onBuildQueryWhere', $this,
'list');

		$sig = !$query ? 'string' : 'query';
		$sig .= (int) $incFilters;

		/**
		 * $$ hugh - caching is borked when using query builder object, as
we're always returning a query
		 * string, never an object.  So code like this:
		 *
		 * $query = $db->getQuery(true);
		 * // some code that does query building stuff here, then ...
		 * $query = $listModel->buildQueryWhere(true, $query);
		 * $query = $listModel->buildQueryJoin($query);
		 *
		 * ... blows up in buildQueryJoin() if this function returns a cached
query string, overwriting
		 * the $query builder object.
		 *
		 * "Real" fix would be to sort it out so we return the object,
although I'm not convinced that's
		 * the even the right fix.  But for now only use the cache if we're
using string not object.
		 */
		if ($query === false && isset($whereSQL[$sig]))
		{
			return $whereSQL[$sig][$incFilters];
		}


		$filters = $this->getFilterArray();

		/* $$$ hugh - added option to 'require filtering', so if no
filters specified
		 * we return an empty table.  Only do this where $inFilters is set, so
we're only doing this
		* on the main row count and data fetch, and things like
		* filter dropdowns still get built.
		*/

		if ($incFilters && !$this->gotAllRequiredFilters())
		{
			if (!$query)
			{
				return 'WHERE 1 = -1 ';
			}
			else
			{
				$query->where('1 = -1');

				return $query;
			}
		}

		$groups = $this->getFormModel()->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			if ($doJoins || (!$doJoins && $groupModel->isJoin()))
			{
				$elementModels = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					$elementModel->appendTableWhere($this->pluginQueryWhere);
				}
			}
		}

		if (empty($filters))
		{
			// $$$ hugh - testing hack for plugins to add WHERE clauses
			if (!empty($this->pluginQueryWhere))
			{
				if (!$query)
				{
					return 'WHERE ' . implode(' AND ',
$this->pluginQueryWhere);
				}
				else
				{
					$query->where(implode(' AND ',
$this->pluginQueryWhere));

					return $query;
				}
			}
			else
			{
				return $query ? $query : '';
			}
		}

		$addWhere = $query == false ? true : false;
		list($sqlNoFilter, $sql) = $this->_filtersToSQL($filters, $addWhere,
true);
		$whereSQL[$sig] = array('0' => $sqlNoFilter, '1'
=> $sql);

		if (!$query)
		{
			return $whereSQL[$sig][$incFilters];
		}
		else
		{
			if (!empty($whereSQL[$sig][$incFilters]))
			{
				$query->where($whereSQL[$sig][$incFilters]);
			}

			return $query;
		}
	}

	/**
	 * Used by buildQueryWhere and buildQueryPrefilterWhere
	 * takes a filter array and returns the SQL
	 *
	 * @param   array  &$filters        filters
	 * @param   bool   $startWithWhere  start the statement with
'where' (true is for j1.5 way of making queries, false for j1.6+)
	 * @param   bool   $incPlugin       include the pluginQueryWhere
statements
	 *
	 * @return  array	nofilter, filter sql
	 */
	private function _filtersToSQL(&$filters, $startWithWhere = true,
$incPlugin = true)
	{
		$prefilters = $this->groupFilterSQL($filters, 'prefilter');
		$menuFilters = $this->groupFilterSQL($filters,
'menuPrefilter');
		$postFilers = $this->groupFilterSQL($filters);

		// Combine menu and prefilters
		if (!empty($prefilters) && !empty($menuFilters))
		{
			array_unshift($menuFilters, 'AND');
		}

		$prefilters = array_merge($prefilters, $menuFilters);


		if (!empty($prefilters) && !empty($postFilers))
		{
			array_unshift($postFilers, 'AND');
		}

		$sql = array_merge($prefilters, $postFilers);
		$pluginQueryWhere = trim(implode(' AND ',
$this->pluginQueryWhere));

		if ($pluginQueryWhere !== '' && $incPlugin)
		{
			$pluginQueryWhere = '(' . $pluginQueryWhere . ')';

			if (!empty($sql))
			{
				$sql[] = ' AND ';
			}

			if (!empty($prefilters))
			{
				$prefilters[] = ' AND ';
			}

			$sql[] = $pluginQueryWhere;
			$prefilters[] = $pluginQueryWhere;
		}
		// Add in the where to the query
		if (!empty($sql) && $startWithWhere)
		{
			array_unshift($sql, 'WHERE');
		}

		if (!empty($prefilters) && $startWithWhere)
		{
			array_unshift($prefilters, 'WHERE');
		}

		$sql = implode(' ', $sql);
		$prefilters = implode(' ', $prefilters);

		return array($prefilters, $sql);
	}

	/**
	 * Parse the filter array and return an array of words that will make up
part of the filter query
	 *
	 * @param   array   &$filters  filters
	 * @param   string  $type      * = filters, 'prefilter' = get
prefilter only
	 *
	 * @return  array	words making up sql query.
	 */
	private function groupFilterSQL(&$filters, $type = '*')
	{
		$groupedCount = 0;
		$ingroup = false;
		$sql = array();

		// $$$ rob keys may no longer be in asc order as we may have filtered out
some in buildQueryPrefilterWhere()
		$valueKeys = array_keys(FArrayHelper::getValue($filters, 'key',
array()));
		$nullElementConditions = array('IS NULL', 'IS NOT
NULL');

		// get the last key, so we can find out in the foreach if we're on
the last key (for "grouped to previous")
		end($valueKeys);
		$lastVkey = key($valueKeys);
		reset($valueKeys);

		foreach ($valueKeys as $vkey => $i)
		{
			// $$$rob - prefilter with element that is not published so ignore
			$condition =
StringHelper::strtoupper(FArrayHelper::getValue($filters['condition'],
$i, ''));
			$searchType = $filters['search_type'][$i];
			if (FArrayHelper::getValue($filters['sqlCond'], $i,
'') == '' && !in_array($condition,
$nullElementConditions))
			{
				continue;
			}

			if (in_array($searchType, array('prefilter',
'menuPrefilter')) && $type == '*')
			{
				continue;
			}

			if ($searchType !== $type && $type !== '*')
			{
				continue;
			}

			// get next key, or -1 if we're on the last key
			$n = $vkey === $lastVkey ? -1 : $valueKeys[$vkey + 1];

			$gStart = '';
			$gEnd = '';

			if (!in_array($condition, $nullElementConditions))
			{
				$filters['origvalue'][$i] = 'this is ignoerd i
hope';
			}
			// $$$ rob added $filters['sqlCond'][$i] test so that you can
test for an empty string
			if ($filters['origvalue'][$i] != '' ||
$filters['sqlCond'][$i] != '')
			{
				if (array_key_exists($n, $filters['grouped_to_previous']))
				{
					if ($filters['grouped_to_previous'][$n] == 1)
					{
						if (!$ingroup)
						{
							// Search all filter after a prefilter - alter 'join'
value to 'AND'
							$gStart = '(';
							$groupedCount++;
						}

						$ingroup = true;
					}
					else
					{
						if ($ingroup)
						{
							$gEnd = ')';
							$groupedCount--;
							$ingroup = false;
						}
					}
				}
				else
				{
					if ($ingroup)
					{
						$gEnd = ')';
						$groupedCount--;
						$ingroup = false;
					}
				}

				$glue = FArrayHelper::getValue($filters['join'], $i,
'AND');
				$sql[] = empty($sql) ? $gStart : $glue . ' ' . $gStart;
				$sql[] = $filters['sqlCond'][$i] . $gEnd;
			}

		}
		// $$$rob ensure opening and closing parenthesis for prefilters are equal
		// Seems to occur if you have 3 prefilters with 2nd = grouped/AND and 3rd
grouped/OR

		if ($groupedCount > 0)
		{
			$sql[] = str_pad('', (int) $groupedCount, ')');
		}
		// Wrap in brackets
		if (!empty($sql))
		{
			array_unshift($sql, '(');
			$sql[] = ')';
		}

		return $sql;
	}

	/**
	 * Get a list of the tables columns' order by field names
	 *
	 * @deprecated - don't think its used
	 *
	 * @return  array	order by names
	 */
	public function getOrderByFields()
	{
		if (is_null($this->orderByFields))
		{
			$this->orderByFields = array();
		}

		$form = $this->getFormModel();
		$groups = $form->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$this->orderByFields[] = $elementModel->getOrderByName();
			}
		}

		return $this->orderByFields;
	}

	/**
	 * Get the elements that are included in the search all query
	 *
	 * @return  array  search all fields
	 */
	public function getSearchAllFields()
	{
		if (isset($this->searchAllAsFields))
		{
			return $this->searchAllAsFields;
		}

		$searchAllFields = array();
		$this->searchAllAsFields = array();
		$form = $this->getFormModel();
		$table = $this->getTable();
		$groups = $form->getGroupsHiarachy();
		$gKeys = array_keys($groups);
		$opts = array('inc_raw' => false);
		$mode = $this->getParams()->get('search-mode-advanced');

		foreach ($gKeys as $x)
		{
			$groupModel = $groups[$x];
			$elementModels = $groupModel->getPublishedElements();

			for ($ek = 0; $ek < count($elementModels); $ek++)
			{
				$elementModel = $elementModels[$ek];

				if ($elementModel->includeInSearchAll($mode))
				{
					// Boolean search doesn't seem possible on encrypted fields.
					$p = $elementModel->getParams();
					$o = $p->get('encrypt');
					$p->set('encrypt', false);
					$elementModel->getAsField_html($this->searchAllAsFields,
$searchAllFields, $opts);
					$p->set('encrypt', $o);
				}
			}
		}

		$db = FabrikWorker::getDbo();

		// If the group by element isn't in the fields (IE its not
published) add it (otherwise group by wont work)
		$longGroupBy = $db->qn($this->getGroupBy());
		$groupBy = $this->getGroupBy();

		if (!in_array($longGroupBy, $searchAllFields) && trim($groupBy)
!= '')
		{
			$this->searchAllAsFields[] = FabrikString::safeColName($groupBy) .
' AS ' . $longGroupBy;
			$searchAllFields[] = $longGroupBy;
		}

		for ($x = 0; $x < count($this->searchAllAsFields); $x++)
		{
			$match = ' AS ' . $searchAllFields[$x];

			if (array_key_exists($x, $this->searchAllAsFields))
			{
				$this->searchAllAsFields[$x] = trim(str_replace($match,
'', $this->searchAllAsFields[$x]));
			}
		}

		$this->searchAllAsFields = array_unique($this->searchAllAsFields);

		return $this->searchAllAsFields;
	}

	/**
	 * Get the part of the table sql statement that selects which fields to
load
	 *
	 * @param   string  $mode  list/form - effects which elements are selected
	 *
	 * @return  array	field names to select in getElement data sql query
	 */
	protected function &getAsFields($mode = 'list')
	{
		$profiler = Profiler::getInstance('Application');

		if (isset($this->asfields))
		{
			return $this->asfields;
		}

		$this->fields = array();
		$this->asfields = array();
		$db = FabrikWorker::getDbo(true);
		$form = $this->getFormModel();
		$table = $this->getTable();
		$this->temp_db_key_addded = false;
		$groups = $form->getGroupsHiarachy();
		$gKeys = array_keys($groups);

		foreach ($gKeys as $x)
		{
			$groupModel = $groups[$x];

			if ($groupModel->canView($mode) !== false)
			{
				$elementModels = $mode === 'list' ?
$groupModel->getListQueryElements() :
$groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					$method = 'getAsField_' . $this->outputFormat;

					if (!method_exists($elementModel, $method))
					{
						$method = 'getAsField_html';
					}

					$elementModel->$method($this->asfields, $this->fields);
				}
			}
		}

		/**
		 * Temporarily add in the db key so that the edit links work, must remove
it before final return
		 * of getData();
		 */
		JDEBUG ? $profiler->mark('getAsFields: starting to test if a
view') : null;

		if (!$this->isView())
		{
			if (!$this->temp_db_key_addded && $table->db_primary_key
!= '')
			{
				$str = FabrikString::safeColName($table->db_primary_key) . ' AS
' . FabrikString::safeColNameToArrayKey($table->db_primary_key);
				$this->fields[] =
$db->qn(FabrikString::safeColNameToArrayKey($table->db_primary_key));
			}
		}

		JDEBUG ? $profiler->mark('getAsFields: end of view test') :
null;

		// For raw data in packages
		if ($this->outputFormat == 'raw')
		{
			$str = FabrikString::safeColName($table->db_primary_key) . ' AS
__pk_val';
			$this->fields[] = $str;
		}

		$this->group_by_added = false;

		// If the group by element isn't in the fields (IE its not
published) add it (otherwise group by wont work)
		$longGroupBy = $this->getGroupByName();

		if (!in_array($longGroupBy, $this->fields) &&
trim($longGroupBy) != '')
		{
			if (!in_array(FabrikString::safeColName($longGroupBy),
$this->fields))
			{
				$this->asfields[] = FabrikString::safeColName($longGroupBy) . '
AS ' . $longGroupBy;
				$this->fields = $longGroupBy;
				$this->group_by_added = true;
			}
		}

		return $this->asfields;
	}

	/**
	 * Get the group by element regardless of wheter it was stored as id or
string
	 *
	 * @since 3.0.7
	 *
	 * @return  plgFabrik_Element
	 */
	protected function getGroupByElement()
	{
		$item = $this->getTable();
		$formModel = $this->getFormModel();
		$groupBy = $this->app->getInput()->get('group_by',
$item->group_by, 'string');

		return $formModel->getElement($groupBy, true);
	}

	/**
	 * Get group by field name
	 *
	 * @since 3.0.7
	 *
	 * @return mixed false or name
	 */
	protected function getGroupByName()
	{
		$db = $this->getDb();
		$elementModel = $this->getGroupByElement();

		if (!$elementModel)
		{
			return false;
		}

		$groupBy = $elementModel->getFullName(true, false);

		return $db->qn(FabrikString::safeColNameToArrayKey($groupBy));
	}

	/**
	 * Checks if the params object has been created and if not creates and
returns it
	 *
	 * @return  object	params
	 */
	public function getParams()
	{
		$item = $this->getTable();

		if (!isset($this->params))
		{
			$this->params = new Registry($item->params);
		}

		return $this->params;
	}

	/**
	 * Method to set the list id
	 *
	 * @param   int  $id  list ID
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		$this->setState('list.id', $id);
		$this->renderContext = '';

		// $$$ rob not sure why but we need this getState() here when assigning
id from admin view
		$this->setRenderContext($id);
		$this->getState();
	}

	/**
	 * Get the list id
	 *
	 * @return  int  list id
	 */
	public function getId()
	{
		return $this->getState('list.id');
	}

	/**
	 * Get the table object for the models _id
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return   object	table
	 */
	public function getTable($name = '', $prefix =
'Table', $options = array())
	{
		if ($name === true)
		{
			$this->clearTable();
		}

		if (!isset($this->table) || !is_object($this->table))
		{
			Table::addIncludePath(JPATH_ADMINISTRATOR .
'/components/com_fabrik/tables');
			$this->table = FabTable::getInstance('List',
'FabrikTable');
			$id = $this->getId();

			if ($id !== 0)
			{
				$this->table->load($id);
			}

			if (!empty($this->table->db_primary_key) &&
trim($this->table->db_primary_key) !== '')
			{
				$this->table->db_primary_key =
FabrikString::safeColName($this->table->db_primary_key);
			}
		}

		return $this->table;
	}

	/**
	 * Set the table object
	 *
	 * @param   object  $table  db row
	 *
	 * @return   void
	 */
	public function setTable($table)
	{
		$this->table = $table;
	}

	/**
	 * unset the table object
	 *
	 * @return void
	 */
	public function clearTable()
	{
		unset($this->table);
	}

	/**
	 * Load the database object associated with the list
	 *
	 * @return  JDatabaseDriver	database
	 */
	public function &getDb()
	{
		return FabrikWorker::getConnection($this->getTable())->getDb();
	}

	/**
	 * Get the lists connection object
	 * sets $this->connection to the lists connection
	 *
	 * @deprecated since 3.0b use FabrikWorker::getConnection() instead
	 *
	 * @return  object	connection
	 */
	public function &getConnection()
	{
		$this->connection = FabrikWorker::getConnection($this->getTable());

		return $this->connection;
	}

	/**
	 *Is the table published
	 * Dates are stored as UTC so we can compare them against a date with no
offset applied
	 *
	 * @return  bool	published state
	 */

	public function canPublish()
	{
		$item = $this->getTable();
		$publishUp = FabrikWorker::isNullDate($item->publish_up) ? null :
Factory::getDate($item->publish_up)->toUnix();
		$publishDown = FabrikWorker::isNullDate($item->publish_down) ? null :
Factory::getDate($item->publish_down)->toUnix();
		$now = Factory::getDate()->toUnix();

		if ($item->published == '1')
		{
			if ($now >= $publishUp)
			{
				if ($now <= $publishDown || $publishDown === null)
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Access control to determine if the current user has rights to drop data
	 * from the table
	 *
	 * @return  bool	yes/no
	 */
	public function canEmpty()
	{
		if (!isset($this->access->allow_drop))
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->allow_drop =
in_array($this->getParams()->get('allow_drop'), $groups);
		}
/*

		// Felixkat - Commenting out as this shouldn't have got here.

		// Retrieve session set in plugin-cron
		$session = Factory::getSession();
		$fabrikCron = $session->get('fabrikCron', '');

		// If CSV import is running and Drop Data is set.....
		if
($this->app->getInput()->getString('cron_csvimport',
'') || (is_object($fabrikCron) &&
$fabrikCron->dropData == 1))
		{
			$session = Factory::getSession();
			$fabrikCron = $session->get('fabrikCron', '');

			// If Secret is set, (this caters for external Wget), OR no querystring,
i.e &fabrik_cron=1, (this caters for automatic cron)
			if ($fabrikCron->requireJS == 1 && $fabrikCron->secret ==
1 || ($this->app->getInput()->getString('fabrik_cron')
== ''))
			{
				$this->access->allow_drop = 1;
			}
		// Felixkat
		}
*/
		return $this->access->allow_drop;
	}

	public function setLocalPdf()
    {
        $this->localPdf = true;
    }

	/**
	 * Check if the user can view the detailed record
	 *
	 * @param   object  $row  of data currently active
	 *
	 * @return  bool
	 */
	public function canViewDetails($row = null)
	{
		static $acls = array();

		if (isset($row->__pk_val) && !empty($row->__pk_val))
		{
			/**
			 * If we've got the results for this PK, return them.  Set result,
so customProcessResult() gets it right
			 */
			if (array_key_exists($row->__pk_val, $acls))
			{
				return $acls[$row->__pk_val];
			}
		}

		$allowPDF = false;

		if ($this->app->getInput()->get('format',
'html') === 'pdf')
		{
			$config = ComponentHelper::getParams('com_fabrik');

			if ($config->get('allow_pdf_localhost_view', '0')
=== '1')
			{
				if ($this->localPdf)
				{
					$allowPDF = true;
				}
				else {
					$whitelist = array(
						'127.0.0.1',
						'::1'
					);
					$pdfLocalhostIP = $config->get('allow_pdf_localhost_ip',
'');

					if (!empty($pdfLocalhostIP)) {
						$whitelist[] = $pdfLocalhostIP;
					}

					if (in_array($_SERVER['REMOTE_ADDR'], $whitelist)) {
						$allowPDF = true;
					}
				}
			}

		}

		if ($allowPDF)
		{
			$this->access->viewdetails = true;
		}
		else
		{
			/**
			 * Allow the plugin to take precedence.  If no plugins, or all plugin(s)
return null (or any
			 * value other than true or false) then we drop through to normal
useDo/ACL checks.  If any plugin returns
			 * false, access is denied.  If no plugin returns false, and any return
true, access is allowed.
			 */
			$pluginCanView =
FabrikWorker::getPluginManager()->runPlugins('onCanView',
$this, 'list', $row);

			// At least one plugin run, so plugin results take precedence over
anything else.
			if (!empty($pluginCanView))
			{
				// test false first, so if any plugin returns false, access is denied
				if (in_array(false, $pluginCanView, true))
				{
					$this->access->viewdetails = false;
				}

				if (in_array(true, $pluginCanView, true))
				{
					$this->access->viewdetails = true;
				}
			}

			// no plugin preference, so use normal ACL
			if (!isset($this->access->viewdetails))
			{
				$groups                    =
$this->user->getAuthorisedViewLevels();
				$this->access->viewdetails =
in_array($this->getParams()->get('allow_view_details'),
$groups);
			}
		}

		if (isset($row->__pk_val) && !empty($row->__pk_val))
		{
			$acls[$row->__pk_val] = $this->access->viewdetails;
		}

		return $this->access->viewdetails;
	}

	/**
	 * Checks user access for editing records
	 *
	 * @param   object  $row  of data currently active
	 *
	 * @return  bool	access allowed
	 */
	public function canEdit($row = null)
	{
		/**
		 * $$$ hugh - FIXME - we really need to split out a onCanEditRow method,
rather than overloading
		 * onCanEdit for both table and per-row contexts.  At the moment, we
calling per-row plugins with
		 * null $row when canEdit() is called in a table context.
		 */

		/**
		 * Allow the plugin to take precedence.  If no plugins, or all plugin(s)
return null (or any
		 * value other than true or false) then we drop through to normal
useDo/ACL checks.  If any plugin returns
		 * false, access is denied.  If no plugin returns false, and any return
true, access is allowed.
		 */
		$pluginCanEdit =
FabrikWorker::getPluginManager()->runPlugins('onCanEdit',
$this, 'list', $row);

		// At least one plugin run, so plugin results take precedence over
anything else.
		if (!empty($pluginCanEdit))
		{
			// test false first, so if any plugin returns false, access is denied
			if (in_array(false, $pluginCanEdit, true))
			{
				return false;
			}

			if (in_array(true, $pluginCanEdit, true))
			{
				return true;
			}
		}

		// plugins didn't express a preference, so check user next
		$canUserDo = $this->canUserDo($row, 'allow_edit_details2');

		if ($canUserDo !== -1)
		{
			// $canUserDo expressed a boolean preference, so use that
			return $canUserDo;
		}

		// no user preference, so use normal ACL
		if (!isset($this->access->edit))
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->edit =
in_array($this->getParams()->get('allow_edit_details'),
$groups);
		}

		return $this->access->edit;
	}

	/**
	 * Checks if any one row is editable = used to get the correct headings
	 *
	 * @return  bool
	 */
	protected function canEditARow()
	{
		$data = $this->getData();

		foreach ($data as $rows)
		{
			foreach ($rows as $row)
			{
				if ($this->canEdit($row))
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Access control function for determining if the user can perform
	 * a designated function on a specific row
	 *
	 * @param   object  $row  data
	 * @param   string  $col  access control setting to compare against
	 *
	 * @return  mixed	- if ACL setting defined here return bool, otherwise
return -1 to contiune with default acl setting
	 */
	protected function canUserDo($row, $col)
	{
		$params = $this->getParams();

		return FabrikWorker::canUserDo($params, $row, $col);
	}

	/**
	 * Checks user access for deleting records.
	 *
	 * @param   object  $row  of data currently active
	 *
	 * @return  bool	access allowed
	 */
	public function canDelete($row = null)
	{

		/**
		 * Find out if any plugins deny delete.  We then allow a plugin to
override with 'false' if
		 * if useDo or group ACL allows edit.  But we don't allow plugin to
allow, if userDo or group ACL
		 * deny access.
		 *
		 * CHANGED on 12/1/2017, to allow the plugin to take precedence.  Only if
plugin(s) return null (or any
		 * valuse other than true or false) then we drop through to normal
useDo/ACL checks.  If any plugin returns
		 * false, access is denied.  If no plugin returns false, and any return
true, access is allowed.
		 */
		$pluginCanDelete =
FabrikWorker::getPluginManager()->runPlugins('onCanDelete',
$this, 'list', $row);

		// At least one plugin run, so plugin results take precedence over
anything else.
		if (!empty($pluginCanDelete))
		{
			// check 'false' first, so if any plugin denies, result is
false
			if (in_array(false, $pluginCanDelete, true))
			{
				return false;
			}

			if (in_array(true, $pluginCanDelete, true))
			{
				return true;
			}

		}

		// No plugins returned true or false, so carry on to user check
		$canUserDo = $this->canUserDo($row, 'allow_delete2');

		if ($canUserDo !== -1)
		{
			// $canUserDo expressed a boolean preference, so use that
			return $canUserDo;
		}

		// no preference from user check, so use main ACL
		if (!isset($this->access->delete))
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->delete =
in_array($this->getParams()->get('allow_delete'), $groups);
		}

		return $this->access->delete;
	}

	/**
	 * Determine if any record can be deleted - used to see if we include the
	 * delete button in the list view
	 *
	 * @return  bool
	 */
	public function deletePossible()
	{
		$data = $this->getData();

		foreach ($data as $rows)
		{
			foreach ($rows as $row)
			{
				if ($this->canDelete($row))
				{
					return true;
				}
			}
		}

		if ($this->listRequiresFiltering() && $this->isAjax()
&& $this->canDelete())
		{
			return true;
		}

		return false;
	}

	/**
	 * Checks user access for importing csv
	 *
	 * @return  bool  access allowed
	 */
	public function canCSVImport()
	{
		if (!isset($this->access->csvimport))
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->csvimport =
in_array($this->getParams()->get('csv_import_frontend'),
$groups);
		}

		return $this->access->csvimport;
	}

	/**
	 * Checks user access for exporting csv
	 *
	 * @return  bool  access allowed
	 */
	public function canCSVExport()
	{
		if (!isset($this->access->csvexport))
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->csvexport =
in_array($this->getParams()->get('csv_export_frontend'),
$groups);
		}

		return $this->access->csvexport;
	}

	/**
	 * Checks user access for front end group by
	 *
	 * @return  bool  access allowed
	 */
	public function canGroupBy()
	{
		if (!isset($this->access->groupby))
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->groupby =
in_array($this->getParams()->get('group_by_access'),
$groups);
		}

		return $this->access->groupby;
	}

	/**
	 * Checks user access for adding records
	 *
	 * @return  bool  access allowed
	 */
	public function canAdd()
	{
		if (!isset($this->access->add))
		{
			$pluginCanAdd =
FabrikWorker::getPluginManager()->runPlugins('onCanAdd',
$this, 'list');

			// At least one plugin run, so plugin results take precedence over
anything else.
			if (!empty($pluginCanAdd))
			{
				// check 'false' first, so if any plugin denies, result is
false
				if (in_array(false, $pluginCanAdd, true))
				{
					return false;
				}

				if (in_array(true, $pluginCanAdd, true))
				{
					return true;
				}

			}

			$input = $this->app->getInput();
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->add =
in_array($this->getParams()->get('allow_add'), $groups);
			$hideAdd = $input->getBool('hide-add', false);

			if ($hideAdd)
			{
				$this->access->add = false;
			}
		}

		return $this->access->add;
	}

	/**
	 *
	 */

	protected function checkMenuAccess()
	{
		if (!isset($this->access->menu_access))
		{
			$this->access->menu_access = true;

			if (!$this->app->isClient('administrator'))
			{
				$params = $this->getParams();

				if ($params->get('menu_access_only', '0') ===
'1')
				{
					$itemId = $this->app->getInput()->getInt('Itemid',
'');

					if (empty($itemId))
					{
						$this->access->menu_access = false;
					}
					else
					{

						$component = ComponentHelper::getComponent('com_fabrik');
						$package   =
$this->app->getUserState('com_fabrik.package',
'fabrik');
						$db        = FabrikWorker::getDbo(true);
						$id        = (int) $this->getId();
						$query     = $db->getQuery(true);
						$query->select('id')
							->from('#__menu')
							->where('component_id = ' . (int) $component->id)
							->where('type = "component"')
							->where('link = "index.php?option=com_' . $package
. '&view=list&listid=' . (int) $id . '"');
						$db->setQuery($query);
						$menuIds = $db->loadColumn();

						if (!in_array($itemId, $menuIds))
						{
							$this->access->menu_access = false;
						}
					}
				}
			}
		}

		return $this->access->menu_access;
	}

	/**
	 * Check user can view the list
	 *
	 * @return  bool  can view or not
	 */
	public function canView()
	{
		if (!$this->checkMenuAccess())
		{
			return false;
		}

		if (!isset($this->access->view))
		{
			$groups = $this->user->getAuthorisedViewLevels();
			$this->access->view = in_array($this->getTable()->access,
$groups);
		}

		return $this->access->view;
	}

	/**
	 * Load the table from the form_id value
	 *
	 * @param   int  $formId  (jos_fabrik_forms.id)
	 *
	 * @return  object	table row
	 */
	public function loadFromFormId($formId)
	{
		Table::addIncludePath(JPATH_ADMINISTRATOR .
'/components/com_fabrik/table');
		$row = FabTable::getInstance('List', 'FabrikTable');
		$row->load(array('form_id' => $formId));
		$this->table = $row;
		$this->setId($row->id);
		$this->setState('list.id', $row->id);

		return $row;
	}

	/**
	 * Like getJoins() but exclude cascading drop-down joins
	 * seems to be needed when calculating related table's record counts.
	 * This is called from within buildQueryJoin()
	 * and fired if this is done:
	 * $listModel->set('includeCddInJoin', false);
	 * as in tableModel::getRecordCounts()
	 *
	 * @return  array  join objects (table rows - not table objects or models)
	 */
	protected function getJoinsNoCdd()
	{
		if (!isset($this->_joinsNoCdd))
		{
			$form = $this->getFormModel();
			$form->getGroupsHiarachy();
			$ignore = array('PlgFabrik_ElementCascadingdropdown');
			$ids = $form->getElementIds($ignore);
			$db = FabrikWorker::getDbo(true);
			$id = (int) $this->getId();
			$query = $db->getQuery(true);
			$query->select('*')->from('#__fabrik_joins')->where('list_id
= ' . $id, 'OR');

			if (!empty($ids))
			{
				$query->where('element_id IN (' . implode(", ",
$ids) . ')');
			}
			/* maybe we will have to order by element_id asc to ensure that table
joins are loaded
			 * before element joins (if an element join is in a table join then its
'join_from_table' key needs to be updated
			 		*/
			$query->order('id');
			$db->setQuery($query);
			$this->_joinsNoCdd = $db->loadObjectList();
			$this->_makeJoinAliases($this->_joinsNoCdd);
		}

		return $this->_joinsNoCdd;
	}

	/**
	 * Get joins
	 *
	 * @return array join objects (table rows - not table objects or models)
	 */
	public function &getJoins()
	{
		if (!isset($this->joins))
		{
			$form = $this->getFormModel();
			$form->getGroupsHiarachy();

			// Force loading of join elements
			$ids = $form->getElementIds(array(),
array('includePublised' => false, 'loadPrefilters'
=> true));
			$db = FabrikWorker::getDbo(true);
			$id = (int) $this->getId();
			$query = $db->getQuery(true);
			$query->select('*')->from('#__fabrik_joins')->where('(element_id
= 0 AND list_id = ' . $id . ')', 'OR');

			if (!empty($ids))
			{
				$query->where('element_id IN ( ' . implode(', ',
$ids) . ')');
			}
			/* maybe we will have to order by element_id asc to ensure that table
joins are loaded
			 * before element joins (if an element join is in a table join then its
'join_from_table' key needs to be updated
			 		*/
			$query->order('id');
			$db->setQuery($query);
			$this->joins = $db->loadObjectList();

			// make sure list joins comes first, don't ask
			usort($this->joins, function($a, $b) {
				if ((int)$a->list_id === 0)
				{
					return 1;
				}

				if ((int)$b->list_id === 0)
				{
					return -1;
				}


				return ((int)$a->list_id < (int)$b->list_id) ? -1 : 1;
			});

			$this->_makeJoinAliases($this->joins);

			foreach ($this->joins as &$join)
			{
				if (is_string($join->params))
				{
					$join->params = new Registry($join->params);
					$this->setJoinPk($join);
				}
			}
		}

		return $this->joins;
	}

	/**
	 * Merged data queries need to know the joined tables primary key value
	 *
	 * @param   object  &$join  join
	 *
	 * @since	3.0.6
	 *
	 * @return  void
	 */
	protected function setJoinPk(&$join)
	{
		$pk = $join->params->get('pk');

		if (!isset($pk))
		{
			$fabrikDb = $this->getDb();
			$db = FabrikWorker::getDbo(true);
			$query = $db->getQuery(true);
			$pk = $this->getPrimaryKeyAndExtra($join->table_join);

			if ($pk !== false && !empty($pk[0]['colname']))
			{
				$pks = $join->table_join . '.' .
$pk[0]['colname'];
				$join->params->set('pk', $fabrikDb->qn($pks));
				$query->update('#__fabrik_joins')->set('params =
' . $db->q((string) $join->params))->where('id = '
. (int) $join->id);
				$db->setQuery($query);

				try
				{
					$db->execute();
				}
				catch (RuntimeException $e)
				{
				}

				$join->params = new Registry($join->params);
			}
		}
	}

	/**
	 * Rebuild the join aliases
	 *
	 * @param   object $newJoin
	 *
	 * @return array
	 */
	public function makeJoinAliases($newJoin = null)
	{
		if (!is_null($newJoin))
		{
			$this->joins[] = $newJoin;
		}


		$this->_makeJoinAliases($this->joins);

		return $this->joins;
	}

	/**
	 * As you may be joining to multiple versions of the same db table we need
	 * to set the various database name aliases that our SQL query will use
	 *
	 * @param   array  &$joins  joins
	 *
	 * @return  void
	 */
	protected function _makeJoinAliases(&$joins)
	{
		$prefix = $this->app->get('dbprefix');
		$table = $this->getTable();
		$aliases = array($table->db_table_name);
		$tableGroups = array();

		// Build up the alias and $tableGroups array first
		foreach ($joins as &$join)
		{
			$join->canUse = true;

			if ($join->table_join == '#__users' || $join->table_join
== $prefix . 'users')
			{
				if (!$this->inJDb())
				{
					/* $$$ hugh - changed this to pitch an error and bang out, otherwise
if we just set canUse to false, our getData query
					 * is just going to blow up, with no useful warning msg.
					* This is basically a bandaid for corner case where user has (say)
host name in J!'s config, and IP address in
					* our connection details, or vice versa, which is not uncommon for
'locahost' setups,
					* so at least I'll know what the problem is when they post in the
forums!
					*/

					$join->canUse = false;
				}
			}
			// $$$ rob Check for repeat elements In list view we don't need to
add the join
			// as the element data is concatenated into one row. see
elementModel::getAsField_html()
			$opts = json_decode($join->params);

			if (isset($opts->type) && $opts->type ==
'repeatElement')
			{
				$join->canUse = false;
			}

			$tableJoin = str_replace('#__', $prefix,
$join->table_join);

			if (in_array($tableJoin, $aliases))
			{
				$base = $tableJoin;
				$a = $base;
				$c = 0;

				while (in_array($a, $aliases))
				{
					$a = $base . '_' . $c;
					$c++;
				}

				$join->table_join_alias = $a;
			}
			else
			{
				$join->table_join_alias = $tableJoin;
			}

			$aliases[] = str_replace('#__', $prefix,
$join->table_join_alias);

			if (!array_key_exists($join->group_id, $tableGroups))
			{
				if ($join->element_id == 0)
				{
					$tableGroups[$join->group_id] = $join->table_join_alias;
				}
			}
		}

		foreach ($joins as &$join)
		{
			// If they are element joins add in this table's name as the
calling joining table.
			if ($join->join_from_table == '')
			{
				$join->join_from_table = $table->db_table_name;
			}

			/*
			 * Test case:
			* you have a table that joins to a 2nd table
			* in that 2nd table there is a database join element
			* that 2nd elements key needs to point to the 2nd tables name and not
the first
			*
			* e.g. when you want to create a n-n relationship
			*
			* events -> (table join) events_artists -> (element join) artist
			*/

			$join->keytable = $join->join_from_table;

			if (array_key_exists($join->group_id, $tableGroups))
			{
				if ($join->element_id != 0)
				{
					$join->keytable = $tableGroups[$join->group_id];
					$join->join_from_table = $join->keytable;
				}
			}
		}

		FabrikHelperHTML::debug($joins, 'joins');
	}

	/**
	 * Gets the field names for the given table
	 * $$$ hugh - copies this to backend model, so remember to modify that as
well, if
	 * you make changes to this one.  Better yet, make it a Helper func that
requires
	 * the $tbl arg, as that's the only thing that makes it list model
specific.
	 *
	 * @param   string  $tbl  table name
	 * @param   string  $key  field to key return array on
	 *
	 * @return  array	table fields
	 */
	public function getDBFields($tbl = null, $key = null)
	{
		if (is_null($tbl))
		{
			$table = $this->getTable();
			$tbl = $table->db_table_name;
		}

		if ($tbl == '')
		{
			return array();
		}

		$sig = $tbl . $key;
		$tbl = FabrikString::safeColName($tbl);

		if (!isset($this->dbFields[$sig]))
		{
			$db = $this->getDb();
			$tbl = FabrikString::safeColName($tbl);
			$db->setQuery("DESCRIBE " . $tbl);

			try
			{
				$this->dbFields[$sig] = $db->loadObjectList($key);
			}
			catch (RuntimeException $e)
			{
				// List may be in second connection but we might try to get #__user
fields for join
				$this->dbFields[$sig] = array();
			}

			foreach ($this->dbFields[$sig] as &$row)
			{
				/**
				 * Boil the type down to just the base type, so "INT(11)
UNSIGNED" becomes just "INT"
				 * I'm sure there's other cases than just UNSIGNED I need to
deal with, but for now that's
				 * what I most care about, as this stuff is being written handle being
more specific about
				 * the elements the list PK can be selected from.
				 */
				$row->BaseType = strtoupper(preg_replace('#(\(\d+\))$#',
'', $row->Type));
				$row->BaseType = preg_replace('#(\s+SIGNED|\s+UNSIGNED)#',
'', $row->BaseType);

				/**
				 * Grab the size part ...
				 */
				$matches = array();
				if (preg_match('#\((\d+)\)$#', $row->Type, $matches))
				{
					$row->BaseLength = $matches[1];
				}
				else
				{
					$row->BaseLength = '';
				}
			}
		}

		return $this->dbFields[$sig];
	}

	/**
	 * Called at the end of saving an element
	 * if a new element it will run the sql to add to field,
	 * if existing element and name changed will create query to be used later
	 *
	 * @param   PlgFabrik_Element  &$elementModel  element model
	 * @param   string             $origColName    original column name
	 *
	 * @throws ErrorException
	 *
	 * @return  array($update, $q, $oldName, $newdesc, $origDesc, $dropKey)
	 */
	public function shouldUpdateElement(&$elementModel, $origColName =
null)
	{
		$return = array(false, '', '', '',
'', false);
		$element = $elementModel->getElement();
		$pluginManager = FabrikWorker::getPluginManager();
		$basePlugIn = $pluginManager->getPlugIn($element->plugin,
'element');
		$fabrikDb = $this->getDb();
		$group = $elementModel->getGroup();
		$dropKey = false;
		/*$$$ rob - replaced this with getting the table from the group as if we
moved the element
		 *from one group to another $this->getTable gives you the old
group's table, where as we want
		* the new group's table
		*/
		$table = $group->getlistModel()->getTable();

		// $$$ hugh - if this is a table-less form ... not much point going any
		// further 'cos things will go BANG
		if (empty($table->id))
		{
			return $return;
		}

		if ($this->isView())
		{
			return $return;
		}

		if ($group->isJoin())
		{
			$tableName = $group->getJoinModel()->getJoin()->table_join;
			$keyData = $this->getPrimaryKeyAndExtra($tableName);
			$primaryKey = $keyData[0]['colname'];
		}
		else
		{
			$keyData = $this->getPrimaryKeyAndExtra();
			$tableName = $table->db_table_name;
			$primaryKey = $table->db_primary_key;
		}

		// $$$ rob base plugin needs to know group info for date fields in
non-join repeat groups
		$basePlugIn->setGroupModel($elementModel->getGroupModel());

		// The element type AFTER saving
		$objType = $elementModel->getFieldDescription();
		$dbDescriptions = $this->getDBFields($tableName, 'Field');

		if (!$this->canAlterFields() && !$this->canAddFields())
		{
			$objType = $dbDescriptions[$origColName]->Type;
		}

		if (is_null($objType))
		{
			return $return;
		}

		$existingFields = array_keys($dbDescriptions);
		$lastField = $existingFields[count($existingFields) - 1];
		$tableName = FabrikString::safeColName($tableName);
		$lastField = FabrikString::safeColName($lastField);
		$altered = false;

		if (!array_key_exists($element->name, $dbDescriptions))
		{
			if ($origColName == '')
			{
				if ($this->canAddFields())
				{
					$fabrikDb
					->setQuery("ALTER TABLE $tableName ADD COLUMN " .
FabrikString::safeColName($element->name) . " $objType AFTER
$lastField");

					try
					{
						$fabrikDb->execute();
						$altered = true;
					}
					catch (Exception $e)
					{
						throw new ErrorException('alter structure: ' .
$fabrikDb->getErrorMsg(), 500);
					}
				}
			}
			// Commented out as it stops the update when changing an element name
			// return $return;
		}

		$thisFieldDesc = FArrayHelper::getValue($dbDescriptions, $origColName,
new stdClass);

		/* $$$ rob the Default property for timestamps when they are set to
CURRENT_TIMESTAMP
		 * doesn't show up from getDBFields()  - so presuming a timestamp
field will always default
		* to the current timestamp (update of the field's data controller in
the Extra property (on update CURRENT_TIMESTAMP)
				*/
		$existingDef = '';

		if (isset($thisFieldDesc->Type))
		{
			$existingDef = $thisFieldDesc->Type;

			if ($thisFieldDesc->Type == 'timestamp')
			{
				$existingDef .= $thisFieldDesc->Null = 'YES' ? '
NULL' : ' NOT NULL';
				$existingDef .= ' DEFAULT CURRENT_TIMESTAMP';
				$existingDef .= ' ' . $thisFieldDesc->Extra;
			}
		}

		// If its the primary 3.0
		for ($k = 0; $k < count($keyData); $k++)
		{
			if ($keyData[$k]['colname'] == $origColName)
			{
				$existingDef .= ' ' . $keyData[$k]['extra'];
			}
		}
		/* $$$ hugh 2012/05/13 - tweaking things a little so we don't care
about certain differences in type.
		 * Initially, just integer types and signed vs unsigned.  So if the
existing column is TINYINT(3) UNSIGNED
		* and we think it's INT(3), i.e. that's what
getFieldDescription() returns, let's treat those as functionally
		* the same, and not change anything.  Ideally we should turn this into
some kind of element model method, so
		* we would do something like $base_existingDef =
$elementModel->baseFieldDescription($existingDef), and (say) the
		* field element, if passed "TINYINT(3) UNSIGNED" would return
"INT(3)".  But for now, just tweak it here.
		*/
		$objTypeUpper = ' ' . StringHelper::strtoupper(trim($objType))
. ' ';
		$objTypeUpper = str_replace(' NOT NULL ', ' ',
$objTypeUpper);
		$objTypeUpper = str_replace(' UNSIGNED ', ' ',
$objTypeUpper);
		$objTypeUpper = str_replace(array(' INTEGER', '
TINYINT', ' SMALLINT', ' MEDIUMINT', '
BIGINT'), ' INT', $objTypeUpper);
		$objTypeUpper = trim($objTypeUpper);
		$existingDef = ' ' .
StringHelper::strtoupper(trim($existingDef)) . ' ';
		$existingDef = str_replace(' UNSIGNED ', ' ',
$existingDef);
		$existingDef = str_replace(array(' INTEGER', '
TINYINT', ' SMALLINT', ' MEDIUMINT', '
BIGINT'), ' INT', $existingDef);
		$existingDef = trim($existingDef);

		if ($element->name == $origColName && $existingDef ==
$objTypeUpper)
		{
			// No changes to the element name or field type
			return $return;
		}
		elseif ($this->canAlterFields() === false)
		{
			// Give a notice if the user cant alter the field type but selections he
has made would normally do so:
			$this->app->enqueueMessage(Text::_('COM_FABRIK_NOTICE_ELEMENT_SAVED_BUT_STRUCTUAL_CHANGES_NOT_APPLIED'),
'notice');

			return $return;
		}

		$return[4] = $existingDef;
		$existingFields = array_keys($dbDescriptions);
		$lastField = $existingFields[count($existingFields) - 1];
		$tableName = FabrikString::safeColName($tableName);
		$lastField = FabrikString::safeColName($lastField);

		if (empty($origColName) || !in_array($origColName, $existingFields) ||
($this->app->getInput()->get('task') ===
'save2copy' && $this->canAddFields()))
		{
			if (!$altered)
			{
				if (!in_array($element->name, $existingFields))
				{
					$fabrikDb->setQuery("ALTER TABLE $tableName ADD COLUMN "
. FabrikString::safeColName($element->name) . " $objType AFTER
$lastField");

					try
					{
						$fabrikDb->execute();
					}
					catch (RuntimeException $e)
					{
						// Don't throw error for attempting to re-add an existing db
column
						if (!array_key_exists($element->name, $dbDescriptions))
						{
							throw new ErrorException('alter structure: ' .
$e->getMessage(), 500);
						}
					}
				}
			}
		}
		else
		{
			// $$$ rob don't alter it yet - lets defer this and give the user
the choice if they
			// really want to do this
			if ($this->canAlterFields())
			{
				$origColName = $origColName == null ?
$fabrikDb->qn($element->name) : $fabrikDb->qn($origColName);

				if (StringHelper::strtolower($objType) == 'blob')
				{
					$dropKey = true;
				}

				$q = 'ALTER TABLE ' . $tableName . ' CHANGE ' .
$origColName . ' ' . FabrikString::safeColName($element->name)
. ' ' . $objType . ' ';

				if (FabrikString::safeColName($primaryKey) == $tableName .
'.' . FabrikString::safeColName($element->name) &&
$table->auto_inc)
				{
					if (!stripos($q, ' NOT NULL'))
					{
						$q .= ' NOT NULL';
					}

					if (!stripos($q, ' AUTO_INCREMENT'))
					{
						$q .= ' AUTO_INCREMENT';
					}
				}

				$origColName = FabrikString::safeColName($origColName);
				$return[0] = true;
				$return[1] = $q;
				$return[2] = $origColName;
				$return[3] = $objTypeUpper;
				$return[5] = $dropKey;

				return $return;
			}
		}

		return $return;
	}

	/**
	 * Add or update a database column via sql
	 *
	 * @param   object  &$elementModel  element plugin
	 * @param   string  $origColName    original field name
	 *
	 * @return  bool
	 */
	public function alterStructure(&$elementModel, $origColName = null)
	{
		$element = $elementModel->getElement();
		$pluginManager = FabrikWorker::getPluginManager();
		$basePlugIn = $pluginManager->getPlugIn($element->plugin,
'element');
		$fabrikDb = $this->getDb();
		$table = $this->getTable();
		$tableName = $table->db_table_name;

		// $$$ rob base plugin needs to know group info for date fields in
non-join repeat groups
		$basePlugIn->setGroupModel($elementModel->getGroupModel());
		$objType = $elementModel->getFieldDescription();
		$dbDescriptions = $this->getDBFields($tableName);

		if (!$this->canAlterFields())
		{
			foreach ($dbDescriptions as $f)
			{
				if ($f->Field == $origColName)
				{
					$objType = $f->Type;
				}
			}
		}

		if (!is_null($objType))
		{
			foreach ($dbDescriptions as $dbDescription)
			{
				$fieldName = StringHelper::strtolower($dbDescription->Field);

				if (StringHelper::strtolower($element->name) == $fieldName
&& StringHelper::strtolower($dbDescription->Type) ==
StringHelper::strtolower($objType))
				{
					return true;
				}

				$existingFields[] = $fieldName;
			}

			$lastField = $fieldName;
			$element->name = FabrikString::safeColName($element->name);
			$tableName = FabrikString::safeColName($tableName);
			$lastField = FabrikString::safeColName($lastField);

			if (empty($origColName) ||
!in_array(StringHelper::strtolower($origColName), $existingFields))
			{
				$fabrikDb->setQuery("ALTER TABLE $tableName ADD COLUMN
$element->name $objType AFTER $lastField");

				try
				{
					$fabrikDb->execute();
				}
				catch (Exception $e)
				{
					throw new RuntimeException('alter structure: ' .
$e->getMessage());
				}
			}
			else
			{
				if ($this->canAlterFields())
				{
					if ($origColName == null)
					{
						$origColName = $element->name;
					}

					$origColName = FabrikString::safeColName($origColName);
					$fabrikDb->setQuery("ALTER TABLE $tableName CHANGE
$origColName $element->name $objType");

					try
					{
						$fabrikDb->execute();
					}
					catch (Exception $e)
					{
						throw new RuntimeException('alter structure: ' .
$e->getMessage());
					}
				}
			}
		}

		return true;
	}

	/**
	 * Can we alter this tables fields structure?
	 *
	 * @return  bool
	 */
	public function canAlterFields()
	{
		$listId = $this->getId();

		if (empty($listId))
		{
			return false;
		}

		$state = $this->alterExisting();

		return $state == 1;
	}

	/**
	 * Get the alter fields setting
	 *
	 * @since	3.0.6
	 *
	 * @return  string	alter fields setting
	 */
	private function alterExisting()
	{
		$params = $this->getParams();
		$fbConfig = ComponentHelper::getParams('com_fabrik');
		$alter = $params->get('alter_existing_db_cols',
'default');

		if ($alter === 'default')
		{
			$alter = $fbConfig->get('fbConf_alter_existing_db_cols',
true);
		}

		return $alter;
	}

	/**
	 * Can we add fields to the list?
	 *
	 * @since	3.0.6
	 *
	 * @return  bool
	 */
	public function canAddFields()
	{
		$state = $this->alterExisting();

		return ($state == 1 || $state == 'addonly');
	}

	/**
	 * If not loaded this loads in the table's form model
	 * also binds a reference of the table to the form.
	 *
	 * @return  FabrikFEModelForm	form model with form table loaded
	 */
	public function &getFormModel()
	{
		if (!isset($this->formModel))
		{
			$this->formModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Form',
'FabrikFEModel');
			$table = $this->getTable();
			$this->formModel->setId($table->form_id);
			$this->formModel->getForm();
			$this->formModel->setListModel($this);
		}

		return $this->formModel;
	}

	/**
	 * Set the form model
	 *
	 * @param   object  $model  form model
	 *
	 * @return  void
	 */
	public function setFormModel($model)
	{
		$this->formModel = $model;
	}

	/**
	 * Sets isView
	 *
	 * @param  string   is view
	 */
	public function setIsView($isView = '0')
	{
		$this->isView = $isView;
	}

	/**
	 * Tests if the table is in fact a view
	 *
	 * @return  bool	true if table is a view
	 */
	public function isView()
	{
		$params = $this->getParams();
		$isView = $params->get('isview', null);

		if (!is_null($isView) && (int) $isView >= 0)
		{
			return $isView;
		}

		return $this->isView;
	}

	/**
	 * Store filters in the registry
	 *
	 * @param   array  $request  filters to store
	 *
	 * @return  void
	 */
	public function storeRequestData($request)
	{
		/**
		 * If we're processing a record count for related data, don't
store the filter.  Corner case when you have
		 * multiple list plugins, and one has related data to another, and they
happen to use that element
		 * in a plugin filter
		 */
		if
(!$this->app->getInput()->get('fabrik_incsessionfilters',
true)
			||
!$this->app->getInput()->get('fabrik_storesessionfilters',
true))
		{
			return;
		}

		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$input = $this->app->getInput();
		$registry = $this->session->get('registry');
		$option = 'com_' . $package;
		$tid = 'list' . $this->getRenderContext();

		// Make sure that we only store data thats been entered from this page
first test we aren't in a plugin
		if ($input->get('option') == $option &&
is_object($registry))
		{
			// Don't do this when you are viewing a form or details page as it
wipes out the table filters
			$reg = $registry->get('_registry');

			if (isset($reg[$option]) &&
!in_array($input->get('view'), array('form',
'details')))
			{
				unset($reg[$option]['data']->$tid->filter);
			}
		}

		$context = $option . '.' . $tid . '.filter';

		// @TODO test for _clear_ in values and if so delete session data
		foreach ($request as $key => $val)
		{
			if (is_array($val))
			{
				$key = $context . '.' . $key;
				$this->app->setUserState($key, array_values($val));
			}
		}

		$args = array (
			'context' => $context,
			'request' => $request
		);

		FabrikWorker::getPluginManager()->runPlugins(
			'onStoreRequestData',
			$this,
			'list',
			$args
		);
	}

	/**
	 * Creates filter array (return existing if exists)
	 *
	 * @return  array	filters
	 */
	public function &getFilterArray()
	{
		if (isset($this->filters))
		{

			return $this->filters;
		}

		$filterModel = $this->getFilterModel();
		$db = FabrikWorker::getDbo();
		$this->filters = array();
		$request = $this->getRequestData();
		$this->storeRequestData($request);
		FabrikHelperHTML::debug($request, 'filter:request');
		$elements = $this->getElements('id');

		/* $$$ rob prefilters loaded before anything to avoid issues where you
filter on something and
		 * you have 2 prefilters with joined by an OR - this was incorrectly
giving SQL of
		* WHERE normal filter = x OR ( prefilter1 = y OR prefilter2 = x)
		* this change changes the SQL to
		* WHERE ( prefilter1 = y OR prefilter2 = x) AND normal filter = x
		*/
		$this->getPrefilterArray($this->filters);

		// These are filters created from a search form or normal search, assign
them to the filters array
		$keys = array_keys($request);
		$indexStep = count(FArrayHelper::getValue($this->filters,
'key', array()));
		FabrikHelperHTML::debug($keys, 'filter:request keys');

		foreach ($keys as $key)
		{
			if (is_array($request[$key]))
			{
				foreach ($request[$key] as $kk => $v)
				{
					if (!array_key_exists($key, $this->filters) ||
!is_array($this->filters[$key]))
					{
						$this->filters[$key] = array();
					}

					$this->filters[$key][$kk + $indexStep] = $v;
				}
			}
		}

		FabrikHelperHTML::debug($this->filters,
'listmodel::getFilterArray middle');
		$readOnlyValues = array();
		$w = new FabrikWorker;
		$noFiltersSetup = FArrayHelper::getValue($this->filters,
'no-filter-setup', array());

		if (count($this->filters) == 0)
		{
			FabrikWorker::getPluginManager()->runPlugins('onFiltersGot',
$this, 'list');

			return $this->filters;
		}

		// Get a list of plugins
		$pluginKeys = $filterModel->getPluginFilterKeys();
		$elementIds = FArrayHelper::getValue($this->filters,
'elementid', array());
		$sqlCond = FArrayHelper::getValue($this->filters, 'sqlCond',
array());
		$raws = FArrayHelper::getValue($this->filters, 'raw',
array());

		foreach ($this->filters['key'] as $i => $keyval)
		{
			$value = $this->filters['value'][$i];
			$condition =
StringHelper::strtoupper($this->filters['condition'][$i]);
			$key = $this->filters['key'][$i];
			$filterEval = $this->filters['eval'][$i];
			$elid = FArrayHelper::getValue($elementIds, $i);
			$key2 = array_key_exists('key2', $this->filters) ?
FArrayHelper::getValue($this->filters['key2'], $i,
'') : '';

			/* $$$ rob see if the key is a raw filter
			 * 20/12/2010 - think $key is never with _raw now as it is unset in
tablefilter::getQuerystringFilters() although may  be set elsewhere
			* - if it is make a note and remove the _raw from the name
			*/
			$raw = FArrayHelper::getValue($raws, $i, false);

			if (StringHelper::substr($key, -5, 5) == '_raw`')
			{
				$key = StringHelper::substr($key, 0, StringHelper::strlen($key) - 5) .
'`';
				$raw = true;
			}

			if ($elid == -1)
			{
				// Bool match
				$this->filters['origvalue'][$i] = $value;

				/*
				 * Meh.  This next bit is a nasty hack.  Turns out you can't mix
different tables in a
				 * MATCH(...) AGAINST (...), so we have to split it out into one MATCH
per table, joined with OR.
				 * This should really be done when building the search in
doBooleanSearch() in the list filter model,
				 * but the concept of a single filter with index 9999 is fairly
baked-in, so creating multiple filters
				 * for a single searchall will be problematic.  So lets hack it here,
by seeing if the MATCH(..) list
				 * uses more than one table, and if so massage it into multiple MATCH.
				 */
				$fieldsByTable = array();
				$matches = array();
				preg_match('/MATCH\((.*)\)/s', $key, $matches);

				// if we parsed out the fields, process them
				if (count($matches) > 1)
				{
					$fields = explode(',', $matches[1]);

					foreach ($fields as $field)
					{
						$parts = explode('.', $field);

						if (!array_key_exists($parts[0], $fieldsByTable))
						{
							$fieldsByTable[$parts[0]] = array();
						}

						$fieldsByTable[$parts[0]][] = $parts[0] . '.' . $parts[1];
					}
				}

				if (count($fieldsByTable) > 1)
				{
					// if we got more than one table, build the multiple MATCHes
					$matchSql = array();

					foreach ($fieldsByTable as $table => $fields)
					{
						$matchSql[] = 'MATCH(' . implode(',', $fields) .
')' . ' ' . $condition . ' (' .
$db->q($value) . ' IN BOOLEAN MODE)';
					}
					$mode =
$this->app->getInput()->get('search-mode-advanced',
'all');
					$join = $mode === 'none' ? ' AND ' : ' OR
';
					$this->filters['sqlCond'][$i] = '(' .
implode($join, $matchSql) . ')';
				}
				else
				{
					// if only one table, or couldn't parse out the fields, stick
with original behavior
					$this->filters['sqlCond'][$i] = $key . ' ' .
$condition . ' (' . $db->q($value) . ' IN BOOLEAN
MODE)';
				}

				continue;
			}

			// List plug-in filter found - it should have set its own sql in
onGetPostFilter();
			if (!empty($elid) && in_array($elid, $pluginKeys))
			{
				$this->filters['origvalue'][$i] = $value;
				$this->filters['sqlCond'][$i] =
$this->filters['sqlCond'][$i];
				continue;
			}

			$elementModel = FArrayHelper::getValue($elements, $elid);

			// $$$ rob key2 if set is in format  `countries_0`.`label` rather than 
`countries`.`label`
			// used for search all filter on 2nd db join element pointing to the
same table
			if (strval($key2) !== '')
			{
				$key = $key2;
			}

			$eval = $this->filters['eval'][$i];
			$fullWordsOnly = $this->filters['full_words_only'][$i];

			// $$ hugh - testing allowing {QS} replacements in pre-filter values
			$w->replaceRequest($value);
			$value = $this->prefilterParse($value);

			// add false for 'safe' so we include things like session data
			$value = $w->parseMessageForPlaceHolder($value, null, true, false,
null, false);

			if (!is_a($elementModel, 'PlgFabrik_Element'))
			{
				if ($this->filters['condition'][$i] == 'exists')
				{
					$this->filters['sqlCond'][$i] = 'EXISTS (' .
$value . ')';
				}

				continue;
			}

			$elementModel->_rawFilter = $raw;

			if ($filterEval == '1')
			{
				// $$$ rob hehe if you set $i in the eval'd code all sorts of
chaos ensues
				$origi = $i;
				$value = htmlspecialchars_decode($value, ENT_QUOTES);
				FabrikWorker::clearEval();
				$value = Php::Eval(['code' => $value,
'vars'=>['elementModel'=>$elementModel]]);
				FabrikWorker::logEval($value, 'Caught exception on eval of
tableModel::getFilterArray() ' . $key . ': %s');
				$i = $origi;
			}

			if ($condition == 'LATERTHISYEAR' || $condition ==
'EARLIERTHISYEAR')
			{
				$value = $db->q($value);
			}

			if ($fullWordsOnly == '1')
			{
				$condition = 'REGEXP';
			}

			$originalValue = $this->filters['value'][$i];

			if ($value == '' && $eval == FABRIKFILTER_QUERY)
			{
				throw new
RuntimeException(Text::_('COM_FABRIK_QUERY_PREFILTER_WITH_NO_VALUE'),
500);
			}

			list($value, $condition) = $elementModel->getFilterValue($value,
$condition, $eval);

			/*
			 *  $$$ hugh - this chunk got fugly, as we wound up with too many quotes
with whole words on
			 *  and exact match off, like ...
			 *  LOWER('"[[:<:]]Brose[[:>:]]"')
			 *  ... so I fixed it the long handed way ... could prolly be done more
elegantly, but this should work!
			 */
			if ($fullWordsOnly == '1')
			{
				if (is_array($value))
				{
					foreach ($value as &$v)
					{
						$v = "\"[[:<:]]" . $v .
"[[:>:]]\"";
					}
					if (strtoupper($condition) === 'REGEXP')
					{
						// $$$ 15/11/2012 - moved from before getFilterValue() to after as
otherwise date filters in querystrings created wonky query
						$v = 'LOWER(' . $v . ')';
					}
				}
				else
				{
					$value = "\"[[:<:]]" . $value .
"[[:>:]]\"";
					if (strtoupper($condition) === 'REGEXP')
					{
						// $$$ 15/11/2012 - moved from before getFilterValue() to after as
otherwise date filters in querystrings created wonky query
						$value = 'LOWER(' . $value . ')';
					}
				}
			}
			else
			{

				if (strtoupper($condition) === 'REGEXP')
				{
					// $$$ 15/11/2012 - moved from before getFilterValue() to after as
otherwise date filters in querystrings created wonky query
					$value = 'LOWER(' . $db->q($value, false) .
')';
				}

			}

			if (!array_key_exists($i, $sqlCond) || $sqlCond[$i] == '')
			{
				// Will produce an SQL error - but is equivalent to 'show no
records' so set to where 3 = -3
				if ($condition === 'IN' && $value === '()')
				{
					$query = '3 = -3';
				}
				else
				{
					$query = $elementModel->getFilterQuery($key, $condition, $value,
$originalValue, $this->filters['search_type'][$i],
$filterEval);
				}

				$this->filters['sqlCond'][$i] = $query;
			}

			$this->filters['condition'][$i] = $condition;

			// Used when getting the selected dropdown filter value
			$this->filters['origvalue'][$i] = $originalValue;
			$this->filters['value'][$i] = $value;

			if (!array_key_exists($i, $noFiltersSetup))
			{
				$this->filters['no-filter-setup'][$i] = 0;
			}

			if ($this->filters['no-filter-setup'][$i] == 1)
			{
				$tmpName = $elementModel->getFullName(true, false);
				$tmpData = array($tmpName => $originalValue, $tmpName .
'_raw' => $originalValue);

				// Set defaults to null to ensure we get correct value for 2nd
drop-down search value (multi drop-down from search form)
				$elementModel->defaults = null;

				if (!array_key_exists($key, $readOnlyValues))
				{
					$readOnlyValues[$key] = array();
				}

				$readOnlyValues[$key][] = $elementModel->getFilterRO($tmpData);

				// Set it back to null again so that in form view we dont return this
value.
				$elementModel->defaults = null;

				// Filter value assigned in readOnlyValues foreach loop towards end of
this function
				$this->filters['filter'][$i] = '';
			}
			else
			{
				/*$$$rob not sure $value is the right var to put in here - or if its
actually used
				 * but without this line you get warnings about missing variable in the
filter array
				*/
				$this->filters['filter'][$i] = $value;
			}
		}

		FabrikHelperHTML::debug($this->filters, 'end filters');

		foreach ($readOnlyValues as $key => $val)
		{
			foreach ($this->filters['key'] as $i => $fKey)
			{
				if ($fKey === $key)
				{
					$this->filters['filter'][$i] =
implode("<br>", $val);
				}
			}
		}

		FabrikWorker::getPluginManager()->runPlugins('onFiltersGot',
$this, 'list');
		FabrikHelperHTML::debug($this->filters, 'after
plugins:onFiltersGot');

		return $this->filters;
	}

	/**
	 * Get the elements to show in the list view
	 *
	 * @since 3.1b2
	 *
	 * @return array
	 */
	private function showInList()
	{
		$input = $this->app->getInput();
		$showInList = array();
		$opts = array('listid' => $this->getId());
		$listElements =
json_decode(FabrikWorker::getMenuOrRequestVar('list_elements',
'', $this->isMambot, 'menu', $opts));

		if (isset($listElements->show_in_list))
		{
			$showInList = $listElements->show_in_list;
		}

		$args = array(
			$this,
			&$showInList
		);

		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('onShowInList', $this,
'list', $args);

		$showInList = (array) $input->get('fabrik_show_in_list',
$showInList, 'array');

		// Set it for use by groupModel->getPublishedListElements()
		$input->set('fabrik_show_in_list', $showInList);

		return $showInList;
	}

	/**
	 * Get the module or the menu pre-filter settings
	 *
	 * @return string
	 */
	private function menuModulePrefilters()
	{
		$input = $this->app->getInput();
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$moduleId = 0;
		$properties= '';
		// Are we coming from a post request via a module?
		$requestRef = $input->get('listref', '',
'string');

		if ($requestRef !== '' && !strstr($requestRef,
'com_' . $package))
		{
			// If so we need to load in the modules parameters
			$ref = explode('_', $requestRef);

			if (count($ref) > 1)
			{
				$moduleId = (int) array_pop($ref);
				$query = $this->_db->getQuery(true);

				if ($moduleId !== 0)
				{
					$this->setRenderContext($moduleId);
					$query->select('params')->from('#__modules')->where('id
= ' . $moduleId);
					$this->_db->setQuery($query);
					$obj = json_decode($this->_db->loadResult()??'');

					if (is_object($obj) && isset($obj->prefilters))
					{
						$properties = $obj->prefilters;
					}
				}
			}
		}

		if (!strstr($this->getRenderContext(), 'mod_fabrik_list')
&& $moduleId === 0)
		{
			$spoof_check = array(
				'view' => 'list',
				'listid' => $this->getId()
			);
			$properties = FabrikWorker::getMenuOrRequestVar('prefilters',
'', $this->isMambot, 'menu', $spoof_check);
		}

		if (!FabrikWorker::isJSON($properties))
		{
			$properties = '';
		}

		return $properties;
	}

	/**
	 * Get the prefilter settings from list/module/menu options
	 * Use in listModel::getPrefilterArray() and formModel::getElementIds()
	 *
	 * @return multitype:array
	 */
	public function prefilterSetting()
	{
		$params = $this->getParams();
		$properties = $this->menuModulePrefilters();

		// List pre-filter properties
		$listFields = (array) $params->get('filter-fields');
		$listConditions = (array) $params->get('filter-conditions');
		$listValue = (array) $params->get('filter-value');
		$listAccess = (array) $params->get('filter-access');
		$listEval = (array) $params->get('filter-eval');
		$listJoins = (array) $params->get('filter-join');
		$listGrouped = (array) $params->get('filter-grouped');
		$listSearchType = FArrayHelper::array_fill(0, count($listJoins),
'prefilter');

		/* If we are rendering as a module don't pick up the menu item
options (params already set in list module)
		 * so first statement when rendering a module, 2nd when posting to the
component from a module.
		*/

		if ($properties !== '')
		{
			$prefilters = ArrayHelper::fromObject(json_decode($properties));
			$conditions = (array) $prefilters['filter-conditions'];

			if (!empty($conditions))
			{
				$fields = FArrayHelper::getValue($prefilters,
'filter-fields', array());
				$conditions = FArrayHelper::getValue($prefilters,
'filter-conditions', array());
				$values = FArrayHelper::getValue($prefilters, 'filter-value',
array());
				$access = FArrayHelper::getValue($prefilters,
'filter-access', array());
				$eval = FArrayHelper::getValue($prefilters, 'filter-eval',
array());
				$joins = FArrayHelper::getValue($prefilters, 'filter-join',
array());
				$searchType = FArrayHelper::array_fill(0, count($joins),
'menuPrefilter');

				$overrideListPrefilters =
$params->get('menu_module_prefilters_override', true);

				if ($overrideListPrefilters)
				{
					// Original behavior
					$listFields = $fields;
					$listConditions = $conditions;
					$listValue = $values;
					$listAccess = $access;
					$listEval = $eval;
					$listJoins = $joins;
					$listSearchType = $searchType;
				}
				else
				{
					// Preferred behavior but for backwards compat we need to ask users to
					// set this option in the menu/module settings
					$joins[0] = 'AND';
					$listFields = array_merge($listFields, $fields);
					$listConditions = array_merge($listConditions, $conditions);
					$listValue = array_merge($listValue, $values);
					$listAccess  = array_merge($listAccess, $access);
					$listEval = array_merge($listEval, $eval);

					$listSearchType = array_merge($listSearchType, $searchType);
					//$listGrouped[count($listGrouped) -1] = '1';
					$listJoins = array_merge($listJoins, $joins);

					$listGrouped = array_merge($listGrouped, FArrayHelper::array_fill(0,
count($joins), 0));
				}
			}
		}

		return array($listFields, $listConditions, $listValue, $listAccess,
			$listEval, $listJoins, $listGrouped, $listSearchType);
	}

	/**
	 * Creates array of prefilters
	 * Set to public 15/04/2013
	 *
	 * @param   array  &$filters  filters
	 *
	 * @return  array	prefilters combined with filters
	 */
	public function getPrefilterArray(&$filters)
	{
		if (!isset($this->prefilters))
		{
			$elements = $this->getElements('filtername', false, false);
			list($filterFields, $filterConditions, $filterValues, $filterAccess,
				$filterEvals, $filterJoins, $filterGroupeds, $listSearchType) =
$this->prefilterSetting();


			for ($i = 0; $i < count($filterFields); $i++)
			{
				if (!array_key_exists(0, $filterJoins) || $filterJoins[0] ==
'')
				{
					$filterJoins[0] = 'AND';
				}

				$join = FArrayHelper::getValue($filterJoins, $i, 'AND');

				if (trim(StringHelper::strtolower($join)) == 'where')
				{
					$join = 'AND';
				}

				$filter = $filterFields[$i];
				$condition = $filterConditions[$i];
				$searchType = ArrayHelper::getValue($listSearchType, $i,
'prefilter');
				$selValue = FArrayHelper::getValue($filterValues, $i, '');
				$filterEval = FArrayHelper::getValue($filterEvals, $i, false);
				$filterGrouped = FArrayHelper::getValue($filterGroupeds, $i, false);
				$selAccess = $filterAccess[$i];

				if (!$this->mustApplyFilter($selAccess))
				{
					continue;
				}

				$raw = preg_match("/_raw$/", $filter) > 0;
				$tmpFilter = $raw ? FabrikString::rtrimword($filter, '_raw')
: $filter;
				$elementModel = FArrayHelper::getValue($elements,
FabrikString::safeColName($tmpFilter), false);

				if ($elementModel === false)
				{
					/*
					 * HACK!
					 *
http://fabrikar.com/forums/index.php?threads/a-prefilter-has-been-set-up-on-an-unpublished-element.37385/#post-189201
					 * Complex set up of joined group which has a user element which is
linked to a parent one. Raw AS field has _0 applied to its name
					 * For this we'll just remove that to find the correct element.
					 */
					$tmpFilter = str_replace('_0.', '.', $tmpFilter);
					$elementModel = FArrayHelper::getValue($elements,
FabrikString::safeColName($tmpFilter), false);
				}

				if ($elementModel &&
$elementModel->getElement()->published == 0)
				{
					// Include the Log class.
					jimport('joomla.log.log');

					// Add the logger.
					Log::addLogger(array('text_file' =>
'fabrik.log.php'));

					// Start logging...
					$msg = Text::sprintf('COM_FABRIK_ERR_PREFILTER_NOT_APPLIED',
FabrikString::safeColName($tmpFilter));
					Log::add($msg,	Log::NOTICE, 'com_fabrik');

					$this->app->enqueueMessage($msg, 'notice');
					continue;
				}

				$filters['join'][] = $join;
				$filters['search_type'][] = $searchType;
				$filters['key'][] = $tmpFilter;
				$filters['value'][] = $selValue;
				$filters['origvalue'][] = $selValue;
				$filters['sqlCond'][] = '';
				$filters['no-filter-setup'][] = null;
				$filters['condition'][] = $condition;
				$filters['grouped_to_previous'][] = $filterGrouped;
				$filters['eval'][] = $filterEval;
				$filters['match'][] = ($condition == 'equals') ? 1
: 0;
				$filters['full_words_only'][] = 0;
				$filters['label'][] = '';
				$filters['access'][] = '';
				$filters['key2'][] = '';
				$filters['required'][] = 0;
				$filters['hidden'][] = false;
				$filters['elementid'][] = $elementModel !== false ?
$elementModel->getElement()->id : 0;
				$filters['raw'][] = $raw;
				$this->prefilters = true;
			}
		}

		FabrikHelperHTML::debug($filters, 'prefilters');
	}

	/**
	 * Get the total number of records in the table
	 *
	 * @return  int		total number of records
	 */
	public function getTotalRecords()
	{
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');

		// $$$ rob ensure that the limits are set - otherwise can create monster
query
		$this->setLimits();
		$context = 'com_' . $package . '.list' .
$this->getRenderContext() . '.total';

		if (isset($this->totalRecords))
		{
			$this->session->set($context, $this->totalRecords);

			return $this->totalRecords;
		}
		// $$$ rob getData() should always be run first
		if (!isset($this->data) || is_null($this->data))
		{
			$this->getData();

			return $this->totalRecords;
		}

		if ($this->mergeJoinedData())
		{
			$this->totalRecords = $this->getJoinMergeTotalRecords();
			$this->session->set($context, $this->totalRecords);

			return $this->totalRecords;
		}
	}

	/**
	 * Modified version of getTotalRecords() for use when the table join data
	 * is to be merged on the main table's primary key
	 *
	 * @return int total records
	 */
	protected function getJoinMergeTotalRecords()
	{
		$db = $this->getDb();
		$table = $this->getTable();
		$query = $db->getQuery(true);
		$query->select('COUNT(DISTINCT ' . $table->db_primary_key
. ') AS t')
			->from($table->db_table_name);

		$query = $this->buildQueryJoin($query);
		$query =
$this->buildQueryWhere($this->app->getInput()->getBool('incfilters',
true), $query);
		$query = $this->buildQueryGroupBy($query);

		$totalSql = (string) $query;
		$totalSql = $this->pluginQuery($totalSql);
		$db->setQuery($totalSql);
		FabrikHelperHTML::debug($totalSql, 'table
getJoinMergeTotalRecords');
		$total = $db->loadResult();

		return $total;
	}

	/**
	 * Load in the elements for the table's form
	 * If no form loaded for the list object then one is loaded
	 *
	 * @return  FabrikFEModelGroup[]	element objects
	 */
	public function getFormGroupElementData()
	{
		return $this->getFormModel()->getGroupsHiarachy();
	}

	/**
	 * Require the correct pagenav class based on template
	 *
	 * @param   int  $total       total
	 * @param   int  $limitStart  start
	 * @param   int  $limit       length of records to return
	 *
	 * @return  object	pageNav
	 */
	public function &getPagination($total = 0, $limitStart = 0, $limit =
0)
	{
		if (!isset($this->nav))
		{
			if ($this->randomRecords)
			{
				$limitStart = $this->getRandomLimitStart();
			}

			$params = $this->getParams();
			$this->nav = new Pagination($total, $limitStart, $limit);

			if ($limit == -1)
			{
				$this->nav->viewAll = true;
			}

			// $$$ rob set the nav link urls to the table action to avoid messed up
url links when  doing ranged filters via the querystring
			$this->nav->url = $this->getTableAction();
			$this->nav->showAllOption =
$params->get('showall-records', false);
			$this->nav->setId($this->getId());
			$this->nav->showTotal = $params->get('show-total',
false);
			$this->nav->showNav =
$this->app->getInput()->getInt('fabrik_show_nav',
$params->get('show-table-nav', 1));
			$item = $this->getTable();
			$this->nav->startLimit =
FabrikWorker::getMenuOrRequestVar('rows_per_page',
$item->rows_per_page, $this->isMambot);
			$this->nav->showDisplayNum =
$params->get('show_displaynum', true);
		}

		return $this->nav;
	}

	/**
	 * Get the random limit start val
	 *
	 * @return  int	 Limit start
	 */
	protected function getRandomLimitStart()
	{
		if (isset($this->randomLimitStart))
		{
			return $this->randomLimitStart;
		}

		$db = $this->getDb();
		$table = $this->getTable();
		/* $$$ rob @todo - do we need to add the join in here as well?
		 * added + 1 as with 4 records to show 3 4th was not shown
		*/
		$query = $db->getQuery(true);
		$query->select('FLOOR(RAND() * COUNT(*) + 1) AS ' .
$db->qn('offset'))->from($db->qn($table->db_table_name));
		$query = $this->buildQueryWhere(true, $query);
		$db->setQuery($query);
		$limitStart = $db->loadResult();

		/*$$$ rob 11/01/2011 cant do this as we don't know what the total is
yet
		 $$$ rob ensure that the limitstart + limit isn't greater than the
total
		if ($limitStart + $limit > $total) {
		$limitStart = $total - $limit;
		}
		$$$ rob 25/02/2011 if you only have say 3 records then above random will
show 1 2 or 3 records
		so decrease the random start num by the table row display num
		going to favour records at the beginning of the table though
		*/
		$limitStart -= $table->rows_per_page;

		if ($limitStart < 0)
		{
			$limitStart = 0;
		}

		$this->randomLimitStart = $limitStart;

		return $limitStart;
	}

	/**
	 * Used to determine which filter action to use.
	 * If a filter is a range then override lists setting with onsubmit
	 *
	 * @return  string
	 */
	public function getFilterAction()
	{
		if (!isset($this->real_filter_action))
		{
			// First, grab the list's setting as the default
			$table = $this->getTable();
			$this->real_filter_action = $table->filter_action;

			// Check to see if any list filter plugins require a Go button, like
radius search
			$pluginManager = FabrikWorker::getPluginManager();
			$pluginManager->getPlugInGroup('list');

			$pluginManager->runPlugins('requireFilterSubmit', $this,
'list');
			$res = $pluginManager->data;

			if (!empty($res))
			{
				if (in_array(1, $res))
				{
					// We've got at least one plugin which needs the button, so set
action and bail
					$this->real_filter_action = 'submitform';

					return $this->real_filter_action;
				}
			}

			// No list plugins expressed a preference, so check for range filters
			$form = $this->getFormModel();
			$groups = $form->getGroupsHiarachy();

			foreach ($groups as $groupModel)
			{
				$elementModels = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					$element = $elementModel->getElement();

					if (isset($element->filter_type) &&
$element->filter_type <> '')
					{
						if ($elementModel->canView() &&
$elementModel->canUseFilter() &&
$element->show_in_list_summary == '1')
						{
							// $$$ rob does need to check auto-compelte otherwise submission
occurs without the value selected.
							if ($element->filter_type == 'range' ||
$element->filter_type == 'auto-complete')
							{
								$this->real_filter_action = 'submitform';

								return $this->real_filter_action;
							}
						}
					}
				}
			}
		}

		return $this->real_filter_action;
	}

	/**
	 * Gets the part of a url to describe the key that the link links to
	 * if a table this is rowid=x
	 * if a view this is view_primary_key={where statement}
	 *
	 * @param   object  $data  current list row
	 *
	 * @return  string
	 */
	protected function getKeyIndetifier($data)
	{
		return '&rowid=' . $this->getSlug($data);
	}

	/**
	 * Format the row id slug
	 *
	 * @param   object  $row  current list row data
	 *
	 * @return  string	formatted slug
	 */
	public function getSlug($row)
	{
		if (!isset($row->slug))
		{
			return '';
		}

		$row->slug = str_replace(':', '-', $row->slug);
		$row->slug = JApplicationHelper::stringURLSafe($row->slug);

		return $row->slug;
	}

	/**
	 * Get other lists who have joins to the list db tables pk
	 *
	 * @throws ErrorException
	 *
	 * @return array of element objects that are database joins and that
	 * use this table's key as their foreign key
	 */
	public function getJoinsToThisKey()
	{
		if (is_null($this->joinsToThisKey))
		{
			$this->joinsToThisKey = array();
			$db = FabrikWorker::getDbo(true);
			$table = $this->getTable();

			if ($table->id == 0)
			{
				$this->joinsToThisKey = array();
			}
			else
			{
				$usersConfig = ComponentHelper::getParams('com_fabrik');
				$query = $db->getQuery(true);

				// Select the required fields from the table.
				$query
				->select(
						"l.db_table_name,
						el.name, el.plugin, l.label AS listlabel, l.id as list_id, \n
						el.id AS element_id, el.label AS element_label, f.id AS form_id,
						el.params AS element_params");
				$query->from('#__fabrik_elements AS el');
				$query->join('LEFT', '#__fabrik_formgroup AS fg ON
fg.group_id = el.group_id');
				$query->join('LEFT', '#__fabrik_forms AS f ON f.id =
fg.form_id');
				$query->join('LEFT', '#__fabrik_lists AS l ON
l.form_id = f.id');
				$query->join('LEFT', '#__fabrik_groups AS g ON g.id =
fg.group_id');
				$query->where('el.published = 1 AND g.published = 1');
				$query
				->where(
						"(plugin = 'databasejoin' AND el.params like
'%\"join_db_name\":\"" . $table->db_table_name
						. "\"%'
						AND el.params like  '%\"join_conn_id\":\"" .
$table->connection_id . "%') OR (plugin =
'cascadingdropdown' AND \n"
						. " el.params like
'\"%cascadingdropdown_table\":\"" . $table->id
. "\"%' \n"
						. "AND el.params like
'\"%cascadingdropdown_connection\":\"" .
$table->connection_id . "\"%') ", "OR");

				// Load in user element links as well
				// $$$rob - not convinced this is a good idea
				if ($usersConfig->get('user_elements_as_related_data',
false) == true)
				{
					$query->where("(plugin = 'user' AND
							el.params like '%\"join_conn_id\":\"" .
$table->connection_id . "%\"' )", "OR");
				}

				$db->setQuery($query);

				try
				{
					$this->joinsToThisKey = $db->loadObjectList();

					foreach ($this->joinsToThisKey as $join)
					{
						$element_params = json_decode($join->element_params);
						$join->join_key_column = $element_params->join_key_column;
					}
				}
				catch (RuntimeException $e)
				{
					throw new ErrorException('getJoinsToThisKey: ' .
$e->getMessage(), 500);
				}
			}
		}

		return $this->joinsToThisKey;
	}

	/**
	 * Get an array of elements that point to a form where their data will be
filtered
	 *
	 * @return  array
	 */
	public function getLinksToThisKey()
	{
		if (!is_null($this->linksToThisKey))
		{
			return $this->linksToThisKey;
		}

		$params = $this->getParams();
		$this->linksToThisKey = array();
		$faceted = $params->get('facetedlinks', new stdClass);

		if (!isset($faceted->linkedform))
		{
			return $this->linksToThisKey;
		}

		$linkedForms = $faceted->linkedform;
		$aAllJoinsToThisKey = $this->getJoinsToThisKey();

		foreach ($aAllJoinsToThisKey as $join)
		{
			$key =
"{$join->list_id}-{$join->form_id}-{$join->element_id}";

			// $$$ rob required for related form links. otherwise links for forms
not listed first in the admin options weren't being rendered
			$this->linksToThisKey[] = isset($linkedForms->$key) ? $join :
false;
		}

		return $this->linksToThisKey;
	}

	/**
	 * Get empty data message
	 *
	 * @return string
	 */
	public function getEmptyDataMsg()
	{
		if (isset($this->emptyMsg))
		{
			return $this->emptyMsg;
		}

		$params = $this->getParams();

		return Text::_($params->get('empty_data_msg',
'COM_FABRIK_LIST_NO_DATA_MSG'));
	}

	/**
	 * Get the message telling the user that all required filters must be
selected
	 *
	 * @return  string
	 */
	public function getRequiredMsg()
	{
		if (isset($this->emptyMsg))
		{
			return $this->emptyMsg;
		}

		return '';
	}

	private function requireFilterMsg($default = '')
	{
		$params = $this->getParams();
		$msg = $params->get('require-filter-msg', $default);

		return Text::_($msg);
	}
	/**
	 * Do we have all required filters, by both list level and element level
settings.
	 *
	 * @return  bool
	 */
	public function gotAllRequiredFilters()
	{
		if ($this->listRequiresFiltering() &&
!$this->gotOptionalFilters())
		{
			$this->emptyMsg =
$this->requireFilterMsg('COM_FABRIK_SELECT_AT_LEAST_ONE_FILTER');

			return false;
		}

		if ($this->hasRequiredElementFilters() &&
!$this->getRequiredFiltersFound())
		{
			$this->emptyMsg =
$this->requireFilterMsg('COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS');

			return false;
		}

		return true;
	}

	/**
	 * Does a filter have to be applied before we show any list data
	 *
	 * @return bool
	 */
	protected function listRequiresFiltering()
	{
		$params = $this->getParams();
		/*
		 if (!$this->getRequiredFiltersFound()) {
		return true;
		}
		*/
		switch ($params->get('require-filter', 0))
		{
			case 0:
			default:
				return false;
				break;
			case 1:
				return true;
				break;
			case 2:
				return $this->app->isClient('administrator') ? false :
true;
				break;
		}
	}

	/**
	 * Have all the required filters been met?
	 *
	 * @return  bool  true if they have if false we shouldn't show the
table data
	 */
	protected function hasRequiredElementFilters()
	{
		if (isset($this->hasRequiredElementFilters))
		{
			return $this->hasRequiredElementFilters;
		}

		$filters = $this->getFilterArray();
		$elements = $this->getElements();
		$this->hasRequiredElementFilters = false;

		foreach ($elements as $kk => $val2)
		{
			// Don't do with = as this foobars up the last elementModel
			$elementModel = $elements[$kk];
			$element = $elementModel->getElement();

			if ($element->filter_type <> '' &&
$element->filter_type != 'null')
			{
				if ($elementModel->canView() &&
$elementModel->canUseFilter())
				{
					if ($elementModel->getParams()->get('filter_required')
== 1)
					{
						$this->elementsWithRequiredFilters[] = $elementModel;
						$this->hasRequiredElementFilters = true;
					}
				}
			}
		}

		return $this->hasRequiredElementFilters;
	}

	/**
	 * Do we have any filters that aren't pre-filters
	 *
	 * @return  bool
	 */
	public function gotOptionalFilters()
	{
		$filters = $this->getFilterArray();
		$types = FArrayHelper::getValue($filters, 'search_type',
array());

		foreach ($types as $i => $type)
		{
			if ($type != 'prefilter' && $type !=
'menuPrefilter')
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * Have all the required filters been met?
	 *
	 * @return  bool  true if they have if false we shouldn't show the
table data
	 */
	public function getRequiredFiltersFound()
	{
		if (isset($this->requiredFilterFound))
		{
			return $this->requiredFilterFound;
		}

		$filters = $this->getFilterArray();

		// If no required filters, then by definition we have them all
		if (!$this->hasRequiredElementFilters())
		{
			return true;
		}
		// If no filter keys, by definition we don't have required ones
		if (!array_key_exists('key', $filters) ||
!is_array($filters['key']))
		{
			$this->emptyMsg =
$this->requireFilterMsg('COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS');

			return false;
		}

		foreach ($this->elementsWithRequiredFilters as $elementModel)
		{
			if ($elementModel->getParams()->get('filter_required')
== 1)
			{
				$name = FabrikString::safeColName($elementModel->getFullName(false,
false));
				reset($filters['key']);
				$found = false;

                foreach ($filters['key'] as $key => $val)
				{
					if ($val == $name)
					{
						$found = true;
						break;
					}
				}

				if (!$found || $filters['origvalue'][$key] == '')
				{
					$this->emptyMsg =
$this->requireFilterMsg('COM_FABRIK_PLEASE_SELECT_ALL_REQUIRED_FILTERS');

					return false;
				}
			}
		}

		return true;
	}

	/**
	 * Get filters for display in html view
	 *
	 * @param   string  $container  List container
	 * @param   string  $type       Type
	 * @param   string  $id         Html id, only used if called from viz
plugin
	 * @param   string  $ref        Js ref used when filters set for
visualizations
	 *
	 * @return array filters
	 */
	public function getFilters($container = 'listform_1', $type =
'list', $id = '', $ref = '')
	{
		if (!isset($this->viewfilters))
		{
			$profiler = Profiler::getInstance('Application');
			$this->viewfilters = array();
			JDEBUG ? $profiler->mark('fabrik makeFilters start') :
null;
			$modelFilters = $this->makeFilters($container, $type, $id, $ref);
			JDEBUG ? $profiler->mark('fabrik makeFilters end') : null;

			if (!$this->app->getInput()->get('showfilters', 1))
			{
				$this->viewfilters = array();
			}
			else
			{
				foreach ($modelFilters as $name => $filter)
				{
					$f = new stdClass;
					$f->label = $filter->label;
					$f->id = isset($filter->id) ? $filter->id : '';
					$f->element = $filter->filter;
					$f->required = isset($filter->required) ? $filter->required :
'';
					$f->displayValue = is_array($filter->displayValue) ?
implode(', ', $filter->displayValue) :
							$filter->displayValue;
					$this->viewfilters[$filter->name] = $f;
				}
			}

			FabrikWorker::getPluginManager()->runPlugins('onMakeFilters',
$this, 'list');
		}

		return $this->viewfilters;
	}

	/**
	 * Creates an array of HTML code for each filter
	 * Also adds in JS code to manage filters
	 *
	 * @param   string  $container  container
	 * @param   string  $type       type listviz
	 * @param   string  $id         html id, only used if called from viz
plugin
	 * @param   string  $ref        js filter ref, used when rendering filters
for visualizations
	 *
	 * @return  array	of html code for each filter
	 */
	protected function &makeFilters($container = 'listform_1',
$type = 'list', $id = '', $ref = '')
	{
		$aFilters = array();
		$fScript  = array();
		$opts = new stdClass;
		$opts->container = $container;
		$opts->type = $type;
		$opts->id = $type === 'list' ? $this->getId() : $id;
		$opts->ref = $this->getRenderContext();
		$opts->advancedSearch = $this->advancedSearch->opts();
		$opts->advancedSearch->controller = $type;
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$filters = $this->getFilterArray();
		$params = $this->getParams();

		// Paul Switch to 0/1 for NO/YES from AND/OR so that bootstrap classes
work but support legacy values
		if (($params->get('search-mode', '0') ==
'1')
			|| ($params->get('search-mode', '0') ==
'OR'))
		{
			// One field to search them all (and in the darkness bind them)
			$o = new stdClass;
			$o->id = 'searchall_' . $this->getRenderContext();
			$o->displayValue = '';
			$displayData = new stdClass;
			$displayData->id = $o->id;
			$displayData->searchLabel =
Text::_($params->get('search-all-label',
'COM_FABRIK_SEARCH'));;
//			$displayData->class = FabrikWorker::j3() ? 'fabrik_filter
search-query col-sm-6' : 'fabrik_filter';
			$displayData->class = 'form-control search-query';
			$displayData->v =
$this->getFilterModel()->getSearchAllValue('html');
			$displayData->requestKey =
$this->getFilterModel()->getSearchAllRequestKey();;

			if ($params->get('search-mode-advanced') == 1)
			{
				$displayData->advanced = true;
				$displayData->searchOpts = array();
				$displayData->searchOpts[] =
HTMLHelper::_('select.option', 'all',
Text::_('COM_FABRIK_ALL_OF_THESE_TERMS'));
				$displayData->searchOpts[] =
HTMLHelper::_('select.option', 'any',
Text::_('COM_FABRIK_ANY_OF_THESE_TERMS'));
				$displayData->searchOpts[] =
HTMLHelper::_('select.option', 'exact',
Text::_('COM_FABRIK_EXACT_TERMS'));
				$displayData->searchOpts[] =
HTMLHelper::_('select.option', 'none',
Text::_('COM_FABRIK_NONE_OF_THESE_TERMS'));
				$displayData->mode = $this->app->getUserStateFromRequest(
					'com_' . $package . '.list' .
$this->getRenderContext() . '.searchallmode',
					'search-mode-advanced',
					$params->get('search-mode-advanced-default',
'all')
				);
			}
			else
			{
				$displayData->advanced = false;
			}

			$layout = $this->getLayout('list.fabrik-search-all');
			$o->filter = $layout->render($displayData);

			$o->name = 'all';
			$o->label = $displayData->searchLabel;
			$o->displayValue = '';
			$aFilters[] = $o;
		}

		$counter = 0;
		/* $$$ hugh - another one of those weird ones where if we use = the
foreach loop
		 * will sometimes skip a group
		* $groups = $this->getFormGroupElementData();
		*/
		$groups = $this->getFormGroupElementData();

		foreach ($groups as $groupModel)
		{
			$groupModel->getGroup();
			$elementModels = null;
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$element = $elementModel->getElement();

				/*$$ rob added as some filter_types were null, have to double check
that this doesnt
				 * mess with showing the readonly values from search forms
				*/
				if (isset($element->filter_type) && $element->filter_type
<> '' && $element->filter_type !=
'null')
				{
					if ($elementModel->canView('list') &&
$elementModel->canUseFilter())
					{
						/* $$$ rob in faceted browsing somehow (not sure how!) some elements
from the faceted table get inserted into elementModels
						 * with their form id set - so test if its been set and if its not
the same as the current form id
						* if so then ignore
						*/
						if (isset($element->form_id) && (int) $element->form_id
!== 0 && $element->form_id !==
$this->getFormModel()->getId())
						{
							continue;
						}
						// Force the correct group model into the element model to ensure no
wierdness in getting the element name
						$elementModel->setGroupModel($groupModel);
						$o = new stdClass;
						$o->name = $elementModel->getFullName(true, false);
						$o->id = $elementModel->getHTMLId() . 'value';
						$o->filter = $elementModel->getFilter($counter, true,
$container);
						$fScript[] = $elementModel->filterJS(true, $container);
						$o->required =
$elementModel->getParams()->get('filter_required');
						$o->label = $elementModel->getListHeading();
						$o->displayValue = $elementModel->filterDisplayValues;
						$aFilters[] = $o;
						$counter++;
					}
				}
			}
		}

		$opts->filters = $aFilters;
		$opts = json_encode($opts);
		array_unshift($fScript, "\tFabrik.filter_{$container} = new
FbListFilter($opts);");
		$fScript[] = 'Fabrik.filter_' . $container .
".update();";
		$this->filterJs = implode("\n", $fScript);

		// Check for search form filters - if they exists create hidden elements
for them
		$keys = FArrayHelper::getValue($filters, 'key', array());

		foreach ($keys as $i => $key)
		{
			if ($filters['no-filter-setup'][$i] == '1'
&& !in_array($filters['search_type'][$i],
array('searchall', 'advanced',
'jpluginfilters')))
			{
				$o = new stdClass;
				/* $$$ rob - we are now setting read only filters 'filter'
var to the elements read only
				 * label for the passed in filter value
				*$o->filter = $value;
				*/
				$elementModel =
$this->getFormModel()->getElement(str_replace('`',
'', $key));
				$o->filter = FArrayHelper::getValue($filters['filter'],
$i);

				if ($elementModel)
				{
					$elementModel->getElement()->filter_type = 'hidden';
					$o->filter .= $elementModel->getFilter($counter, true);
				}

				$o->name =
FabrikString::safeColNameToArrayKey($filters['key'][$i]);
				$o->label = $filters['label'][$i];
				$o->displayValue = $elementModel->filterDisplayValues;
				$o->id = $elementModel->getHTMLId() . 'value';
				$aFilters[] = $o;
				$counter++;
			}
		}

		return $aFilters;
	}

	/**
	 * Build the advanced search link
	 *
	 * @return  string  <a href...> link
	 */
	public function getAdvancedSearchLink()
	{
		return $this->advancedSearch->link();
	}

	/**
	 * Get the URL used to open the advanced search window
	 *
	 * @return  string
	 */
	public function getAdvancedSearchURL()
	{
		return $this->advancedSearch->url();
	}

	/**
	 * Get a list of submitted advanced filters
	 *
	 * @return array advanced filter values
	 */
	public function getAdvancedFilterValues()
	{
		return $this->advancedSearch->filterValues();
	}

	/**
	 * Build an array of html data that gets inserted into the advanced search
popup view
	 *
	 * @return  array	html lists/fields
	 */
	public function getAdvancedSearchRows()
	{
		return $this->advancedSearch->getAdvancedSearchRows();
	}

	/**
	 * Fet the headings that should be shown in the csv export file
	 *
	 * @param   array  $headings  to use (key is element name value must be 1
for it to be added)
	 *
	 * @return  void
	 */
	public function setHeadingsForCSV($headings)
	{
		$asFields = $this->getAsFields();
		$newFields = array();
		$db = $this->getDb();
		$this->temp_db_key_addded = false;
		/* $$$ rob if no fields specified presume we are requesting CSV file from
URL and return
		 * all fields otherwise set the fields to be those selected in fabrik
window
		* or defined in the lists csv export settings
		*/
		if (!empty($headings))
		{
			foreach ($headings as $name => $val)
			{
				if ($val != 1)
				{
					continue;
				}

				$elModel = $this->getFormModel()->getElement($name);

				if (is_object($elModel))
				{
					$name = $elModel->getFullName(true, false);
					//$pName = $elModel->isJoin() ?
$db->qn($elModel->getJoinModel()->getJoin()->table_join .
'___params') : '';


					foreach ($asFields as $f)
					{
						if (
							(
								strstr($f, $db->qn($name))
								|| strstr($f, $db->qn($name . '_raw'))
							)
							||
							(
								$elModel->isJoin() && (
									strstr($f, $db->qn($name . '___params'))
									|| strstr($f, $db->qn($name . '_id'))
								)
							)
						)
						{
							$newFields[] = $f;
						}
					}
				}
			}

			$this->asfields = $newFields;
		}
	}

	/**
	 * Returns the table headings, separated from writable function as
	 * when group_by is selected multiple tables are written
	 * 09/07/2011 moved headingClass into array rather than string
	 *
	 * @return  array  (table headings, array columns, $aLinkElements)
	 */
	public function getHeadings()
	{
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$item = $this->getTable();
		$item->order_dir = StringHelper::strtolower($item->order_dir);
		$aTableHeadings = array();
		$headingClass = array();
		$cellClass = array();
		$params = $this->getParams();
		$w = new FabrikWorker;
		$formModel = $this->getFormModel();
		$oldLinksToForms = $this->getLinksToThisKey();
		$linksToForms = array();

		foreach ($oldLinksToForms as $join)
		{
			// $$$ hugh - another issue with getLinksToThisKey() now returning false
for some joins.
			if ($join)
			{
				$k = $join->list_id . '-' . $join->form_id .
'-' . $join->element_id;
				$linksToForms[$k] = $join;
			}
		}

		$groups = $formModel->getGroupsHiarachy();
		$groupHeadings = array();

		$orderBys = json_decode($item->order_by, true);

		if (!isset($orderBys))
		{
			$orderBys = array();
		}

		// Responsive element classes
		$listClasses =
json_decode($params->get('list_responsive_elements',
"{}"));

		if (!isset($listClasses->responsive_elements))
		{
			$listClasses = new stdClass;
			$listClasses->responsive_elements = array();
		}

		$showInList = $this->showInList();

		if (!in_array($this->outputFormat, array('pdf',
'csv')))
		{
			if ($params->get('checkboxLocation', 'end') !==
'end')
			{
				$this->addCheckBox($aTableHeadings, $headingClass, $cellClass,
!$this->canSelectRows());
			}

			if ($params->get('checkboxLocation', 'end') !==
'end')
			{
				$this->actionHeading($aTableHeadings, $headingClass, $cellClass);
			}
		}

		foreach ($groups as $groupModel)
		{
			$groupHeadingKey =
$w->parseMessageForPlaceHolder($groupModel->getGroup()->label,
array(), false);
			$groupHeadings[$groupHeadingKey] = 0;
			$elementModels = $groupModel->getPublishedListElements();

			if ($groupModel->canView('list') === false)
			{
				continue;
			}

			foreach ($elementModels as $key => $elementModel)
			{
				$element = $elementModel->getElement();

				// If we define the elements to show in the list - e.g in admin list
module then only show those elements
				if (!empty($showInList) && !in_array($element->id,
$showInList))
				{
					continue;
				}

				$groupHeadings[$groupHeadingKey]++;
				$key = $elementModel->getFullName(true, false);
				$compositeKey = !empty($showInList) ? array_search($element->id,
$showInList) . ':' . $key : $key;
				$orderKey = $elementModel->getOrderbyFullName(false);
				$elementParams = $elementModel->getParams();
				$label = $elementModel->getListHeading();
				$label = $w->parseMessageForPlaceHolder($label, array());
				$elementId = $elementModel->getId();

				if ($elementParams->get('can_order') == '1'
&& $this->outputFormat != 'csv')
				{
					$context = 'com_' . $package . '.list' .
$this->getRenderContext() . '.order.' . $elementId;
					$orderDir = $this->session->get($context);

					//  No user set order so get it from the list properties
					if (is_null($orderDir) )
					{
						$orderDirs = (array) json_decode($item->order_dir);
						$orderEls = (array) json_decode($item->order_by);
						$ix = array_search($elementId, $orderEls);

						if ($ix !== false)
						{
							$orderDir = FArrayHelper::getValue($orderDirs, $ix, '');
						}
						else
						{
							// nothing set, make an executive decision!
							$orderDir = '';
						}
					}

					$displayData = new stdClass;
					$displayData->tmpl = $this->getTmpl();
					$displayData->orderDir = $orderDir;
					$displayData->class = '';
					$displayData->key = $key;
					$displayData->orderBys = $orderBys;
					$displayData->item = $item;
					$displayData->elementParams = $elementParams;
					$displayData->label = $label;
					$layout = $this->getLayout('list.fabrik-order-heading');
					$heading = $layout->render($displayData);
				}
				else
				{
					$heading = $label;
				}

				$aTableHeadings[$compositeKey] = $heading;

				// Check responsive class
				$responsiveKey = array_search($element->id,
$listClasses->responsive_elements);
				$responsiveClass = $responsiveKey !== false ?
FArrayHelper::getValue($listClasses->responsive_class, $responsiveKey,
'') : '';

				if ($responsiveClass !== '')
				{
					$displayData = new stdClass;
					$displayData->responsiveClass = $responsiveClass;
					$layout = $this->getLayout('fabrik-responsive-class');
					$responsiveClass = $layout->render($displayData);
					$responsiveClass .= ' ';
				}

				$headingClass[$compositeKey] = array('class' =>
$responsiveClass . $elementModel->getHeadingClass(),
						'style' =>
$elementParams->get('tablecss_header'));
				$cellClass[$compositeKey] = array('class' =>
$responsiveClass . $elementModel->getCellClass(), 'style'
=> $elementParams->get('tablecss_cell'));

				// Add in classes for repeat/merge data
				if ($groupModel->canRepeat())
				{
					$cellClass[$compositeKey]['class'] .= ' repeat';
					$dis = $params->get('join-display');

					if ($dis != 'default')
					{
						$cellClass[$compositeKey]['class'] .= '-' . $dis;
					}
				}
			}

			if ($groupHeadings[$groupHeadingKey] == 0)
			{
				unset($groupHeadings[$groupHeadingKey]);
			}
		}

		if (!empty($showInList))
		{
			$aTableHeadings = $this->removeHeadingCompositKey($aTableHeadings);
			$headingClass = $this->removeHeadingCompositKey($headingClass);
			$cellClass = $this->removeHeadingCompositKey($cellClass);
		}

		if (!in_array($this->outputFormat, array('pdf',
'csv')))
		{
			if ($params->get('checkboxLocation', 'end') ===
'end')
			{
				$this->addCheckBox($aTableHeadings, $headingClass, $cellClass,
!$this->canSelectRows());
			}

			// If no elements linking to the edit form add in a edit column (only if
we have the right to edit/view of course!)
			if ($params->get('checkboxLocation', 'end') ===
'end')
			{
				$this->actionHeading($aTableHeadings, $headingClass, $cellClass);
			}

			// Create columns containing links which point to lists associated with
this list
			$faceted = $params->get('facetedlinks');
			$joinsToThisKey = $this->getJoinsToThisKey();
			$listOrder = $params->get('faceted_list_order') ?
json_decode($params->get('faceted_list_order')) : null;
			$formOrder = $params->get('faceted_form_order') ?
json_decode($params->get('faceted_form_order')) : null;

			if (is_null($listOrder))
			{
				// Not yet saved with order
				$listOrder = is_object($faceted) &&
is_object($faceted->linkedlist) ?
array_keys(ArrayHelper::fromObject($faceted->linkedlist)) : array();
			}

			if (is_null($formOrder))
			{
				// Not yet saved with order
				$formOrder = is_object($faceted) &&
is_object($faceted->linkedform) ?
array_keys(ArrayHelper::fromObject($faceted->linkedform)) : array();
			}

			foreach ($listOrder as $key)
			{
				$join = $this->facetedJoin($key);

				if ($join === false)
				{
					continue;
				}

				if (is_object($join) &&
isset($faceted->linkedlist->$key))
				{
					$facetTable = $this->facetedTable($join->list_id);
					$linkedTable = $faceted->linkedlist->$key;
					$heading = $faceted->linkedlistheader->$key;

					if ($linkedTable != '0' &&
$facetTable->canView())
					{
						$prefix = $join->element_id . '___' . $linkedTable .
'_list_heading';
						$aTableHeadings[$prefix] = empty($heading) ? $join->listlabel .
' ' . Text::_('COM_FABRIK_LIST') : Text::_($heading);
						$headingClass[$prefix] = array('class' =>
'fabrik_ordercell related ' . $prefix,
								'style' => '');
						$cellClass[$prefix] = array('class' => $prefix . '
fabrik_element related');
					}
				}
			}

			foreach ($formOrder as $key)
			{
				$join = $this->facetedJoin($key);

				if ($join === false || !isset($faceted->linkedform->$key))
				{
					continue;
				}

				$linkedForm = $faceted->linkedform->$key;

				if ($linkedForm != '0')
				{
					$heading = $faceted->linkedformheader->$key;
					$prefix = $join->db_table_name . '___' . $join->name .
'_form_heading';
					$aTableHeadings[$prefix] = empty($heading) ? $join->listlabel .
' ' . Text::_('COM_FABRIK_FORM') : Text::_($heading);
					$headingClass[$prefix] = array('class' =>
'fabrik_ordercell related ' . $prefix,
							'style' => '');
					$cellClass[$prefix] = array('class' => $prefix . '
fabrik_element related');
				}
			}
		}

		if ($this->canSelectRows())
		{
			$groupHeadings[''] = '';
		}

		$args['tableHeadings'] =& $aTableHeadings;
		$args['groupHeadings'] =& $groupHeadings;
		$args['headingClass'] =& $headingClass;
		$args['cellClass'] =& $cellClass;
		$args['data'] = $this->data;

		FabrikWorker::getPluginManager()->runPlugins('onGetPluginRowHeadings',
$this, 'list', $args);
		FabrikWorker::getPluginManager()->runPlugins('onGetPluginRowHeadings',
$this->getFormModel(), 'form', $args);

		return array($aTableHeadings, $groupHeadings, $headingClass, $cellClass);
	}

	/**
	 * Find a faceted join based on composite key
	 *
	 * @param   string  $searchKey  Key
	 *
	 * @return  mixed   False if not found, join object if found
	 */
	protected function facetedJoin($searchKey)
	{
		$facetedJoins = $this->getJoinsToThisKey();

		foreach ($facetedJoins as $join)
		{
			$key = $join->list_id . '-' . $join->form_id .
'-' . $join->element_id;

			if ($searchKey === $key)
			{
				return $join;
			}
		}

		return false;
	}

	/**
	 * Put the actions in the headings array - separated to here to enable it
to be added at the end or beginning
	 *
	 * @param   array  &$aTableHeadings  Table headings
	 * @param   array  &$headingClass    Heading classes
	 * @param   array  &$cellClass       Cell classes
	 *
	 * @return  void
	 */
	protected function actionHeading(&$aTableHeadings, &$headingClass,
&$cellClass)
	{
		$params = $this->getParams();
		$filterMethod = $params->get('show-table-filters');
		$filters = $this->getFilters('listform_' .
$this->getRenderContext(), 'list');
		$filtersUnderHeadingsAndGo = ($this->getFilterAction() ===
'submitform' && !empty($filters) && $filterMethod
> 2) ? true : false;

		// Check for conditions in https://github.com/Fabrik/fabrik/issues/621
		$details = $this->canViewDetails();

		if ($params->get('detaillink', 1) == 0)
		{
			$details = false;
		}

		$edit = $this->canEdit();

		if ($params->get('editlink', 1) == 0)
		{
			$edit = false;
		}

		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('button', $this,
'list', array('heading' => true));
		$pluginHeadings = array_filter($pluginManager->data);

		if (!empty($pluginHeadings) || $this->canSelectRows() ||
$this->canEditARow() || $details || $edit || $filtersUnderHeadingsAndGo)
		{
			// 3.0 actions now go in one column
			$headingButtons = array();

			if ($this->deletePossible())
			{
				$headingButtons[] = $this->deleteButton('', true);
			}

				$headingButtons = array_merge($headingButtons, $pluginHeadings);

				$hidecheckbox = $params->get('hidecheckbox',
'0');
				if (empty($headingButtons) || $hidecheckbox == '1' ||
!$this->canSelectRows())
				{
					$aTableHeadings['fabrik_actions'] = '';
				}
				else
				{
					if ($this->actionMethod() == 'dropdown')
					{
						$align = $params->get('checkboxLocation',
'end') == 'end' ? 'right' : 'left';
						$aTableHeadings['fabrik_actions'] =
FabrikHelperHTML::bootStrapDropDown($headingButtons, $align);
					}
					else
					{
						$aTableHeadings['fabrik_actions'] =
FabrikHelperHTML::bootStrapButtonGroup($headingButtons);
					}
				}

			$headingClass['fabrik_actions'] = array('class'
=> 'fabrik_ordercell fabrik_actions', 'style' =>
'');

			// Needed for ajax filter/nav
			$cellClass['fabrik_actions'] = array('class' =>
'fabrik_actions fabrik_element');
		}
	}

	/**
	 * Put the checkbox in the headings array - separated to here to enable it
to be added at the end or beginning
	 *
	 * @param   array  &$aTableHeadings  table headings
	 * @param   array  &$headingClass    heading classes
	 * @param   array  &$cellClass       cell classes
	 * @param   bool   $hide             hide the checkbox (row is not
selectable but we still need the chx for plugins)
	 *
	 * @return  void
	 */
	protected function addCheckBox(&$aTableHeadings, &$headingClass,
&$cellClass, $hide = false)
	{
		$params = $this->getParams();
		$hidecheckbox = $params->get('hidecheckbox', '0');
		$hidestyle = ($hidecheckbox == '1' || $hide) ?
'display:none;' : '';
		$id = 'list_' . $this->getId() . '_checkAll';
		$select = '<input type="checkbox"
name="checkAll" class="' . $id . '"
id="' . $id . '" />';
		$aTableHeadings['fabrik_select'] = $select;
		$headingClass['fabrik_select'] = array('class' =>
'fabrik_ordercell fabrik_select', 'style' =>
$hidestyle);
		// Needed for ajax filter/nav
		$cellClass['fabrik_select'] = array('class' =>
'fabrik_select fabrik_element', 'style' =>
$hidestyle);
	}

	/**
	 * Enter description here ...
	 *
	 * @param   array  $arr  array
	 *
	 * @return  array
	 */
	protected function removeHeadingCompositKey($arr)
	{
		/* $$$ hugh - horrible hack, but if we just ksort as-is, once we have
more than 9 elements,
		 * it'll start sort 0,1,10,11,2,3 etc.  There's no doubt a
cleaner way to do this,
		* but for now ... rekey with a 0 padded prefix before we ksort
		*/
		$others = array();

		// These fields shouldn't be re-ordered
		$locations['fabrik_select'] =
array_search('fabrik_select', array_keys($arr));
		$locations['fabrik_actions'] =
array_search('fabrik_actions', array_keys($arr));

		if (array_key_exists('fabrik_select', $arr))
		{
			$others['fabrik_select'] = $arr['fabrik_select'];
		}
		if (array_key_exists( 'fabrik_actions', $arr))
		{
			$others['fabrik_actions'] = $arr['fabrik_actions'];
		}

		asort($locations);

		foreach ($arr as $key => $val)
		{
			if (strstr($key, ':'))
			{
				list($part1, $part2) = explode(':', $key);
				$part1 = sprintf('%03d', $part1);
				$newKey = $part1 . ':' . $part2;
				$arr[$newKey] = $arr[$key];
			}

			//unset($arr[$key]);
		}

		ksort($arr);

		// Add the unsorted fields to the beginning or end
		$arr = array_sum($locations) <= 1 ? $others + $arr : $arr + $others;

		foreach ($arr as $key => $val)
		{
			if (strstr($key, ':'))
			{
				$bits = explode(':', $key);
				$newKey = array_pop($bits);
				$arr[$newKey] = $arr[$key];
				unset($arr[$key]);
			}
		}

		return $arr;
	}

	/**
	 * Can the user select the specified row
	 *
	 * Needs to return true to insert a checkbox in the row.
	 *
	 * @param   object  $row  row of list data
	 *
	 * @return  bool
	 */
	public function canSelectRow($row)
	{
		$canSelect =
FabrikWorker::getPluginManager()->runPlugins('onCanSelectRow',
$this, 'list', $row);

		if (in_array(false, $canSelect))
		{
			return false;
		}

		if ($this->canDelete($row))
		{
			$this->canSelectRows = true;

			return true;
		}

		$params = $this->getParams();
		$usedPlugins = (array) $params->get('plugins');

		if (empty($usedPlugins))
		{
			return false;
		}

		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->getPlugInGroup('list');
		$v = in_array(true,
$pluginManager->runPlugins('canSelectRows', $this,
'list'));

		if ($v)
		{
			$this->canSelectRows = true;
		}

		return $v;
	}

	/**
	 * Can the user select ANY row?
	 *
	 * Should the checkbox be shown in the list
	 * If you can delete then true returned, if not then check
	 * available list plugins to see if they allow for row selection
	 * if so a checkbox column appears in the table
	 *
	 * @return  bool
	 */
	public function canSelectRows()
	{
		if (!is_null($this->canSelectRows))
		{
			return $this->canSelectRows;
		}

		if ($this->canDelete() || $this->deletePossible())
		{
			$this->canSelectRows = true;

			return $this->canSelectRows;
		}

		$params = $this->getParams();
		$usedPlugins = (array) $params->get('plugins');

		if (empty($usedPlugins))
		{
			$this->canSelectRows = false;

			return $this->canSelectRows;
		}

		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->getPlugInGroup('list');
		$this->canSelectRows = in_array(true,
$pluginManager->runPlugins('canSelectRows', $this,
'list'));

		return $this->canSelectRows;
	}

	/**
	 * Clear the calculations
	 *
	 * @return  void
	 */
	public function clearCalculations()
	{
		unset($this->runCalculations);
	}

	/**
	 * return mathematical column calculations (run at doCalculations() on for
submission)
	 *
	 * @return  array  calculations
	 */
	public function getCalculations()
	{
		if (!empty($this->runCalculations))
		{
			return $this->runCalculations;
		}
		$aclGroups = $this->user->getAuthorisedViewLevels();
		$aCalculations = array();
		$formModel = $this->getFormModel();
		$aAvgs = array();
		$aSums = array();
		$aMedians = array();
		$aCounts = array();
		$aCustoms = array();
		$groups = $formModel->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$params = $elementModel->getParams();
				$elName = $elementModel->getFullName(true, false);
				$sumOn = $params->get('sum_on', '0');
				$avgOn = $params->get('avg_on', '0');
				$medianOn = $params->get('median_on', '0');
				$countOn = $params->get('count_on', '0');
				$customOn = $params->get('custom_calc_on', '0');
				$sumAccess = $params->get('sum_access', 0);
				$avgAccess = $params->get('avg_access', 0);
				$medianAccess = $params->get('median_access', 0);
				$countAccess = $params->get('count_access', 0);
				$customAccess = $params->get('custom_calc_access', 0);

				if ($sumOn && in_array($sumAccess, $aclGroups) &&
$params->get('sum_value', '') != '')
				{
					$aSums[$elName] = $params->get('sum_value',
'');
					$ser = $params->get('sum_value_serialized');

					if (is_string($ser))
					{
						// If group gone from repeat to none repeat could be array
						$aSums[$elName . '_obj'] = unserialize($ser);
					}
				}

				if ($avgOn && in_array($avgAccess, $aclGroups) &&
$params->get('avg_value', '') != '')
				{
					$aAvgs[$elName] = $params->get('avg_value',
'');
					$ser = $params->get('avg_value_serialized');

					if (is_string($ser))
					{
						$aAvgs[$elName . '_obj'] = unserialize($ser);
					}
				}

				if ($medianOn && in_array($medianAccess, $aclGroups) &&
$params->get('median_value', '') != '')
				{
					$aMedians[$elName] = $params->get('median_value',
'');
					$ser = $params->get('median_value_serialized',
'');

					if (is_string($ser))
					{
						$aMedians[$elName . '_obj'] = unserialize($ser);
					}
				}

				if ($countOn && in_array($countAccess, $aclGroups) &&
$params->get('count_value', '') != '')
				{
					$aCounts[$elName] = $params->get('count_value',
'');
					$ser = $params->get('count_value_serialized');

					if (is_string($ser))
					{
						$aCounts[$elName . '_obj'] = unserialize($ser);
					}
				}

				if ($customOn && in_array($customAccess, $aclGroups) &&
$params->get('custom_calc_value', '') !=
'')
				{
					$aCustoms[$elName] = $params->get('custom_calc_value',
'');
					$ser = $params->get('custom_calc_value_serialized');

					if (is_string($ser))
					{
						$aCounts[$elName . '_obj'] = unserialize($ser);
					}
				}
			}
		}

		$aCalculations['sums'] = $aSums;
		$aCalculations['avgs'] = $aAvgs;
		$aCalculations['medians'] = $aMedians;
		$aCalculations['count'] = $aCounts;
		$aCalculations['custom_calc'] = $aCustoms;
		$this->runCalculations = $aCalculations;

		return $aCalculations;
	}

	/**
	 * Get list headings to pass into list js oject
	 *
	 * @return  string	headings tablename___name
	 */
	public function jsonHeadings()
	{
		$aHeadings = array();
		$table = $this->getTable();
		$formModel = $this->getFormModel();
		$groups = $formModel->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($element->show_in_list_summary)
				{
					$aHeadings[] = $table->db_table_name . '___' .
$element->name;
				}
			}
		}

		return "['" . implode("','",
$aHeadings) . "']";
	}

	/**
	 * Strip the table names from the front of the key
	 *
	 * @param   array   $data   data to strip
	 * @param   string  $split  string splitter ___ or .
	 *
	 * @return  array stripped data
	 */
	public function removeTableNameFromSaveData($data, $split =
'___')
	{
		foreach ($data as $key => $val)
		{
			$aKey = explode($split, $key);

			if (count($aKey) > 1)
			{
				$newKey = $aKey[1];
				unset($data[$key]);
			}
			else
			{
				$newKey = $aKey[0];
			}

			$data[$newKey] = $val;
		}

		return $data;
	}

	/**
	 * Saves posted form data into a table
	 * data should be keyed on short name
	 *
	 * @param   array   $data            To save
	 * @param   int     $rowId           Row id to edit/updated
	 * @param   bool    $isJoin          Is the data being saved into a join
table
	 * @param   Table  $joinGroupTable  Joined group table
	 *
	 * @throws ErrorException
	 *
	 * @return  bool	int  Insert id
	 */
	public function storeRow($data, $rowId, $isJoin = false, $joinGroupTable =
null)
	{
		/**
		 * REMEMBER - if we've arrived here from the group model process(),
saving joined rows,
		 * $this list model will be for the parent list, and only
$this-table->db_primary_key and
		 * table_name will have been set to that of the joined table being saved
to.  Bit of a hack,
		 * and we need to find a better way to do this, but right now ... it is
what it is.  Just be careful!
		 */

		if (is_array($rowId))
		{
			$rowId = array_unshift($rowId);
		}

		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$origRowId = $rowId;

		// Don't save a record if no data collected
		if ($isJoin && empty($data))
		{
			return;
		}

		$input = $this->app->getInput();
		$fabrikDb = $this->getDb();
		$table = $this->getTable();
		$formModel = $this->getFormModel();

		if ($isJoin)
		{
			$this->getFormGroupElementData();
		}

		$oRecord = new stdClass;
		$aBindData = array();
		$noRepeatFields = array();
		$c = 0;
		$groups = $formModel->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$group = $groupModel->getGroup();
			/*
			 * $$$rob this following if statement avoids this scenario from
happening:
			* you have a form with joins to two other tables
			* each joined group has a field called 'password'
			* first group's password is set to password plugin, second to field
			* on update if no password entered for first field data should not be
updated as recordInDatabase() return false
			* however, as we were iterating over all groups, the 2nd password
field's data is used instead!
			* this if statement ensures we only look at the correct group
			*/
			if ($isJoin == false || $group->id == $joinGroupTable->id)
			{
				if (($isJoin && $groupModel->isJoin()) || (!$isJoin
&& !$groupModel->isJoin()))
				{
					$elementModels = $groupModel->getPublishedElements();

					/*
					 * If the group is un-editable - then the form won't contain the
group data, thus we don't want to add blank data into $oRecord
					 * @see
http://fabrikar.com/forums/index.php?threads/changing-access-level-for-a-group-corrupts-data.34067/
					 */
					if (!$groupModel->canView('form'))
					{
						continue;
					}

					foreach ($elementModels as $elementModel)
					{
						$element = $elementModel->getElement();
						$key = $element->name;

						// For radio buttons and drop-downs otherwise nothing is stored for
them??
						$postKey = array_key_exists($key . '_raw', $data) ? $key .
'_raw' : $key;

						if ($elementModel->recordInDatabase($data))
						{
							if (array_key_exists($key, $data) && !in_array($key,
$noRepeatFields))
							{
								$noRepeatFields[] = $key;
								$lastKey = $key;
								$val = $elementModel->storeDatabaseFormat($data[$postKey],
$data);
								$elementModel->updateRowId($rowId);

								if (isset($formModel->formData) &&
array_key_exists('fabrik_copy_from_table',
$formModel->formData))
								{
									$val = $elementModel->onCopyRow($val);
								}

								if (isset($formModel->formData) &&
array_key_exists('Copy', $formModel->formData))
								{
									$val = $elementModel->onSaveAsCopy($val);
								}

								if ($elementModel->dataIsNull($data, $val))
								{
									$val = null;
								}

								$oRecord->$key = $val;
								$aBindData[$key] = $val;

								if ($elementModel->isJoin() && $isJoin &&
array_key_exists('params', $data))
								{
									// Add in params object set by element plugin - eg fileupload
element rotation/scale
									$oRecord->params = FArrayHelper::getValue($data,
'params');
									$aBindData[$key] = $oRecord->params;
								}

								$c++;
							}
						}
					}
				}
			}
		}

		$primaryKey = FabrikString::shortColName($this->getPrimaryKey());

		if ($rowId != '' && $c == 1 && $lastKey ==
$primaryKey)
		{
			return;
		}
		/*
		 * $$$ rob - correct rowid is now inserted into the form's rowid
hidden field
		* even when useing usekey and -1, we just need to check if we are adding
a new record and if so set rowid to 0
		* PHP8: now 0!='', so rowid has to be '' to get
insertID below
		*/
		if (!$isJoin && $input->get('usekey_newrecord',
false))
		{
			$rowId = '';
			$origRowId = '';
		}

		$primaryKey = str_replace("`", "", $primaryKey);

		// $$$ hugh - if we do this, CSV importing can't maintain existing
keys
		if (!$this->importingCSV)
		{
			// If its a repeat group which is also the primary group $primaryKey was
not set.
			if ($primaryKey)
			{
				if (isset($oRecord->$primaryKey) &&
is_numeric($oRecord->$primaryKey))
				{
					if (!empty($rowid))
					{
						$oRecord->$primaryKey = $rowId;
					}
				}
			}
		}

		if (empty($origRowId))
		{
			/**
			 * $$$ rob added test for auto_inc as sugarid key is set from
storeDatabaseFormat() and needs to be maintained
			 * $$$ rob don't do this when importing via CSV as we want to
maintain existing keys (hence check on task var
			 * $$$ hugh - except ... if we are importing CSV and NOT overwriting, we
need to remove the PK, as the CSV code
			 * will have set the PK to empty.  So we have to remove it from the
record, otherwise it'll get written out as 0.
			 * The importingCSV and csvOverwriting vars are set in insertData() in
the csv import model
			 *
			 * NOTE - for the new csvOverwriting test, I'm also using
$this->importingCSV, rather than checking the task input,
			 * as I'm not sure if the latter gets set on front and backend,
whereas the importingCSV variable definitely gets
			 * set in the CSV import model.
			 */
			$task = strtolower($input->get('task'));

			if (
				($this->importingCSV && !$this->csvOverwriting)
				||
				(
					($primaryKey !== '' && $table->auto_inc == true)
					&&
					$task !== 'doimport'
				)
			)
			{
				unset($oRecord->$primaryKey);
			}

			try
			{
				$ok = $this->insertObject($table->db_table_name, $oRecord,
$primaryKey, false);
			}
			catch (Exception $e)
			{
				$ok= false;
			}
		}
		else
		{
			try
			{
				$ok = $this->updateObject($table->db_table_name, $oRecord,
$primaryKey, true);
			}
			catch (Exception $e)
			{
				$ok= false;
			}
		}

		$this->_tmpSQL = $fabrikDb->getQuery();

		if (!$ok)
		{
			$q = JDEBUG ? $fabrikDb->getQuery() : '';
			throw new Error('Store row failed: ' . $q . ' ' .
$e->getMessage(). ' ; ' . "Please inform your web-site
owner", 500);
		}
		else
		{
			// Clean the cache.
			Factory::getCache('com_' . $package)->clean();

			// $$$ rob new as if you update a record the insertid() returns 0
			$this->lastInsertId = ($rowId == '') ?
$fabrikDb->insertid() : $rowId;

			// $$$ hugh - if insertid() returned 0, probably means auto-inc is
turned off, so see if PK was set in data
			if (empty($this->lastInsertId))
			{
				if (empty($table->auto_inc))
				{
					if (isset($oRecord->$primaryKey))
					{
						$this->lastInsertId = $oRecord->$primaryKey;
					}
				}
			}

			return $this->lastInsertId;
		}
	}

	/**
	 * hack! copied from mysqli db driver to enable AES_ENCRYPT calls
	 *
	 * @param   string  $table        table name
	 * @param   object  &$object      update object
	 * @param   string  $keyName      name of pk field
	 * @param   bool    $updateNulls  update null values
	 *
	 * @throws Exception
	 *
	 * @return  mixed  query result
	 */
	public function updateObject($table, &$object, $keyName, $updateNulls
= true)
	{
		$db = $this->getDb();
		$secret = $this->config->get('secret');
		$fmtSql = 'UPDATE ' . $db->qn($table) . ' SET %s WHERE
%s';
		$tmp = array();

		foreach (get_object_vars($object) as $k => $v)
		{
			if (is_array($v) or is_object($v) or $k[0] == '_')
			{
				// Internal or NA field
				continue;
			}

			if ($k == $keyName)
			{
				// PK not to be updated
				$where = $keyName . '=' . $db->q($v);
				continue;
			}

			if ($v === null)
			{
				if ($updateNulls)
				{
					$val = 'NULL';
				}
				else
				{
					continue;
				}
			}
			else
			{
				$val = $db->q($v);
			}

			if (in_array($k, $this->encrypt))
			{
				$val = "AES_ENCRYPT($val, '$secret')";
			}

			$tmp[] = $db->qn($k) . '=' . $val;
		}

		$db->setQuery(sprintf($fmtSql, implode(",", $tmp), $where));
		$db->execute();

		FabrikHelperHTML::debug((string) $db->getQuery(), 'list model
updateObject:');

		return true;
	}

	/**
	 * Hack! copied from mysqli db driver to enable AES_ENCRYPT calls
	 * Inserts a row into a table based on an objects properties
	 *
	 * @param   string  $table    The name of the table
	 * @param   object  &$object  An object whose properties match table
fields
	 * @param   string  $keyName  The name of the primary key. If provided the
object property is updated.
	 *
	 * @thorws Exception
	 *
	 * @return  bool
	 */
	public function insertObject($table, &$object, $keyName = null)
	{
		$db = $this->getDb();
		$secret = $this->config->get('secret');
		$fmtSql = 'INSERT INTO ' . $db->qn($table) . ' ( %s )
VALUES ( %s ) ';
		$fields = array();
		$values = array();

		foreach (get_object_vars($object) as $k => $v)
		{
			if (is_array($v) or is_object($v) or $v === null)
			{
				continue;
			}

			if ($k[0] == '_')
			{
				// Internal field
				continue;
			}

			$fields[] = $db->qn($k);
			$val = $db->q($v);

			if (in_array($k, $this->encrypt))
			{
				$val = "AES_ENCRYPT($val, '$secret')";
			}

			$values[] = $val;
		}

		$db->setQuery(sprintf($fmtSql, implode(",", $fields),
implode(",", $values)));
		$db->execute();

		$id = $db->insertid();

		if ($keyName && $id)
		{
			$object->$keyName = $id;
		}

		FabrikHelperHTML::debug((string) $db->getQuery(), 'list model
insertObject:');

		return true;
	}

	/**
	 * If an element is set to readonly, and has a default value selected then
insert this
	 * data into the array that is to be bound to the table record
	 *
	 * @param   array   &$data           List data
	 * @param   object  &$oRecord        To bind to table row
	 * @param   int     $isJoin          Is record join record
	 * @param   int     $rowId           Row id
	 * @param   Table  $joinGroupTable  Join group table
	 *
	 * @since	1.0.6
	 *
	 * @deprecated  since 3.0.7 - we should be using formmodel
addEncrytedVarsToArray() only
	 *
	 * @return  void
	 */
	protected function addDefaultDataFromRO(&$data, &$oRecord,
$isJoin, $rowId, $joinGroupTable)
	{
		// $$$ rob since 1.0.6 : 10 June 08
		// Get the current record - not that which was posted
		$formModel = $this->getFormModel();
		$input = $this->app->getInput();

		if (is_null($this->origData))
		{
			/* $$$ hugh FIXME - doesn't work for rowid=-1 / usekey submissions,
			 * ends up querying "WHERE foo.userid =
'<rowid>'" instead of <userid>
			* OK for now, as we should catch RO data from the encrypted vars check
			* later in this method.
			*/
			if (empty($rowId))
			{
				$this->origData = $origData = array();
			}
			else
			{
				$sql = $formModel->buildQuery();
				$db = $this->getDb();
				$db->setQuery($sql);
				$origData = $db->loadObject();
				$origData = ArrayHelper::fromObject($origData);
				$origData = is_array($origData) ? $origData : array();
				$this->origData = $origData;
			}
		}
		else
		{
			$origData = $this->origData;
		}

		$groups = $formModel->getGroupsHiarachy();

		/* $$$ hugh - seems like there's no point in doing this chunk if
there is no
		 $origData to work with?  Not sure if there's ever a valid reason
for doing so,
		but it certainly breaks things like onCopyRow(), where (for instance)
user
		elements will get reset to 0 by this code.
		*/
		$repeatGroupCounts = $input->get('fabrik_repeat_group',
array(), 'array');

		if (!empty($origData))
		{
			$gCounter = 0;

			foreach ($groups as $groupModel)
			{
				if (($isJoin && $groupModel->isJoin()) || (!$isJoin
&& !$groupModel->isJoin()))
				{
					$elementModels = $groupModel->getPublishedElements();

					foreach ($elementModels as $elementModel)
					{
						// $$$ rob 25/02/2011 unviewable elements are now also being
encrypted
						// if (!$elementModel->canUse() &&
$elementModel->canView()) {
						if (!$elementModel->canUse())
						{
							$element = $elementModel->getElement();
							$fullkey = $elementModel->getFullName(true, false);

							// $$$ rob 24/01/2012 if a previous joined data set had a ro element
then if we werent checkign that group is the
							// same as the join group then the insert failed as data from other
joins added into the current join
							if ($isJoin && ($groupModel->getId() !=
$joinGroupTable->id))
							{
								continue;
							}

							$key = $element->name;

							// $$$ hugh - allow submission plugins to override RO data
							// TODO - test this for joined data
							if ($formModel->updatedByPlugin($fullkey))
							{
								continue;
							}
							// Force a reload of the default value with $origData
							unset($elementModel->defaults);
							$default = array();
							$repeatGroupCount = FArrayHelper::getValue($repeatGroupCounts,
$groupModel->getGroup()->id);

							for ($repeatCount = 0; $repeatCount < $repeatGroupCount;
$repeatCount++)
							{
								$def = $elementModel->getValue($origData, $repeatCount);

								if (is_array($def))
								{
									// Radio buttons getValue() returns an array already so don't
array the array.
									$default = $def;
								}
								else
								{
									$default[] = $def;
								}
							}

							$default = count($default) == 1 ? $default[0] :
json_encode($default);
							$data[$key] = $default;
							$oRecord->$key = $default;
						}
					}
				}

				$gCounter++;
			}
		}

		$copy = $input->getBool('Copy');

		// Check crypted querystring vars (encrypted in form/view.html.php )
_cryptQueryString
		if (array_key_exists('fabrik_vars', $_REQUEST) &&
array_key_exists('querystring',
$_REQUEST['fabrik_vars']))
		{
			$crypt = FabrikWorker::getCrypt();

			foreach ($_REQUEST['fabrik_vars']['querystring'] as
$key => $encrypted)
			{
				// $$$ hugh - allow submission plugins to override RO data
				// TODO - test this for joined data
				if ($formModel->updatedByPlugin($key))
				{
					continue;
				}

				$key = FabrikString::shortColName($key);

				/* $$$ hugh - trying to fix issue where encrypted elements from a main
group end up being added to
				 * a joined group's field list for the update/insert on the joined
row(s).
				*/
				/*
				 * $$$ rob - commenting it out as this was stopping data that was not
viewable or editable from being included
				* in $data. New test added inside foreach loop below
				**/
				/* if (!array_key_exists($key, $data))
				 {
				continue;
				} */
				foreach ($groups as $groupModel)
				{
					// New test to replace if (!array_key_exists($key, $data))
					// $$$ hugh - this stops elements from joined groups being added to
main row, but see 'else'
					if ($isJoin)
					{
						if ($groupModel->getGroup()->id != $joinGroupTable->id)
						{
							continue;
						}
					}
					else
					{
						// $$$ hugh - need test here if not $isJoin, to stop keys from joined
groups being added to main row!
						if ($groupModel->isJoin())
						{
							continue;
						}
					}

					$elementModels = $groupModel->getPublishedElements();

					foreach ($elementModels as $elementModel)
					{
						$element = $elementModel->getElement();

						/*
						 * $$$ hugh - I have a feeling this test is a Bad Thing <tm> as
it is using short keys,
						 * so if two joined groups share the same element name(s) ...
						 */
						if ($element->name == $key)
						{
							// Don't overwrite if something has been entered

							// $$$ rob 25/02/2011 unviewable elements are now also being
encrypted
							// if (!$elementModel->canUse() &&
$elementModel->canView()) {
							if (!$elementModel->canUse())
							{
								// Repeat groups
								$default = array();
								$repeatGroupCount = FArrayHelper::getValue($repeatGroupCounts,
$groupModel->getGroup()->id);

								for ($repeatCount = 0; $repeatCount < $repeatGroupCount;
$repeatCount++)
								{
									$enc = FArrayHelper::getValue($encrypted, $repeatCount);

									if (is_array($enc))
									{
										$v = array();

										foreach ($enc as $e)
										{
											$e = urldecode($e);
											$v[] = empty($e) ? '' : $crypt->decrypt($e);
										}

										$v = json_encode($v);
									}
									else
									{
										$enc = urldecode($enc);
										$v = !empty($enc) ? $crypt->decrypt($enc) : '';
									}
								}

								/* $$$ hugh - also gets called in storeRow(), not sure if we really
need to
								 * call it here?  And if we do, then we should probably be calling
onStoreRow
								* as well, if $data['fabrik_copy_from_table'] is set? 
Can't remember why,
								* but we differentiate between the two, with onCopyRow being when a
row is copied
								* using the list plugin, and onSaveAsCopy when the form plugin is
used.
								*/
								if ($copy)
								{
									$v = $elementModel->onSaveAsCopy($v);
								}

								$data[$key] = $v;
								$oRecord->$key = $v;
							}

							break 2;
						}
					}
				}
			}
		}
	}

	/**
	 * Called when the form is submitted to perform calculations
	 *
	 * @return  void
	 */
	public function doCalculations()
	{
		/*
		if ($this->config->get('dbtype') ===
'pdomysql')
		{
			echo $this->cacheDoCalculations($this, $this->getId());
		}
		else
		{
			$cache = FabrikWorker::getCache($this);
			$cache->get(array(get_class($this), 'cacheDoCalculations'),
$this, $this->getId());
		}
		*/
		$cache = FabrikWorker::getCache($this);
		$cache->get(array(get_class($this), 'cacheDoCalculations'),
$this->getId());
	}

	/**
	 * Cache do calculations
	 *
	 * @param   int  $listId  List id
	 *
	 * @return  void
	 */
	public static function cacheDoCalculations($listId)
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('cacheDoCalculations: start') :
null;

		$listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$listModel->setId($listId);
		$formModel = $listModel->getFormModel();

		JDEBUG ? $profiler->mark('cacheDoCalculations, getGroupsHiarachy:
start') : null;
		$groups = $formModel->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$params = $elementModel->getParams();
				$update = false;

				if ($params->get('sum_on', 0) == 1)
				{
					JDEBUG ? $profiler->mark('cacheDoCalculations, sum_on:
start') : null;
					$aSumCals = $elementModel->sum($listModel);
					$params->set('sum_value_serialized',
serialize($aSumCals[1]));
					$params->set('sum_value', $aSumCals[0]);
					$update = true;
				}

				if ($params->get('avg_on', 0) == 1)
				{
					JDEBUG ? $profiler->mark('cacheDoCalculations, avg_on:
start') : null;
					$aAvgCals = $elementModel->avg($listModel);
					$params->set('avg_value_serialized',
serialize($aAvgCals[1]));
					$params->set('avg_value', $aAvgCals[0]);
					$update = true;
				}

				if ($params->get('median_on', 0) == 1)
				{
					JDEBUG ? $profiler->mark('cacheDoCalculations, median_on:
start') : null;
					$medians = $elementModel->median($listModel);
					$params->set('median_value_serialized',
serialize($medians[1]));
					$params->set('median_value', $medians[0]);
					$update = true;
				}

				if ($params->get('count_on', 0) == 1)
				{
					JDEBUG ? $profiler->mark('cacheDoCalculations, count_on:
start') : null;
					$aCountCals = $elementModel->count($listModel);
					$params->set('count_value_serialized',
serialize($aCountCals[1]));
					$params->set('count_value', $aCountCals[0]);
					$update = true;
				}

				if ($params->get('custom_calc_on', 0) == 1)
				{
					JDEBUG ? $profiler->mark('cacheDoCalculations, custom_calc_on:
start') : null;
					$aCustomCalcCals = $elementModel->custom_calc($listModel);
					$params->set('custom_calc_value_serialized',
serialize($aCustomCalcCals[1]));
					$params->set('custom_calc_value', $aCustomCalcCals[0]);
					$update = true;
				}

				if ($update)
				{
					JDEBUG ? $profiler->mark('cacheDoCalculations, storeAttribs:
start') : null;
					$elementModel->storeAttribs();
				}
			}
		}
	}

	/**
	 * Check to see if pre-filter should be applied
	 *
	 * @param   int  $gid  view access level to check against
	 *
	 * @return  bool  Must apply filter
	 */
	protected function mustApplyFilter($gid)
	{
		return in_array($gid, $this->user->getAuthorisedViewLevels());
	}

	/**
	 * Set the connection id - used when creating a new table
	 *
	 * @param   int  $id  connection id
	 *
	 * @return  void
	 */
	public function setConnectionId($id)
	{
		$this->getTable()->connection_id = $id;
	}

	/**
	 * Get group by (can be set via qs group_by var)
	 *
	 * @return  string
	 */
	public function getGroupBy()
	{
		$elementModel = $this->getGroupByElement();

		if (!$elementModel)
		{
			return '';
		}

		return $elementModel->getFullName(true, false);
	}

	/**
	 * Get the element ids for list ordering
	 *
	 * @since  3.0.7
	 *
	 * @return  array  element ids
	 */
	public function getOrderBys()
	{
		$item = $this->getTable();
		$orderBys = FabrikWorker::JSONtoData($item->order_by, true);
		$formModel = $this->getFormModel();

		foreach ($orderBys as &$orderBy)
		{
			$elementModel = $formModel->getElement($orderBy, true);
			$orderBy = $elementModel ? $elementModel->getId() : '';
		}

		return $orderBys;
	}

	/**
	 * Test if the main J user can create mySQL tables
	 *
	 * @return  bool
	 */
	public function canCreateDbTable()
	{
		return true;
	}

	/**
	 * Make id element
	 *
	 * @param   int  $groupId  element group id
	 *
	 * @since Fabrik 3.0
	 *
	 * @return  void
	 */
	public function makeIdElement($groupId)
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$element = $pluginManager->getPlugIn('internalid',
'element');
		$item = $element->getDefaultProperties();
		$item->name = $item->label = 'id';
		$item->group_id = $groupId;

		// PR#2031 do not show repeat group parent_id in list by default
		$item->show_in_list_summary = 0;

		if (!$item->store())
		{
			//JError::raiseWarning(500, $item->getError());
			\Joomla\CMS\Factory::getApplication()->enqueueMessage($item->getError(),
'error');

			return false;
		}

		return true;
	}

	/**
	 * Make foreign key element
	 *
	 * @param   int  $groupId  element group id
	 *
	 * @since   Fabrik 3.0
	 *
	 * @return void
	 */
	public function makeFkElement($groupId)
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$element = $pluginManager->getPlugIn('field',
'element');
		$item = $element->getDefaultProperties();
		$item->name = $item->label = 'parent_id';
		$item->hidden = 1;
		$item->group_id = $groupId;

		// PR#2031 do not show repeat group parent_id in list by default
		$item->show_in_list_summary = 0;

		if (!$item->store())
		{
			//JError::raiseWarning(500, $item->getError());
			\Joomla\CMS\Factory::getApplication()->enqueueMessage($item->getError(),
'error');

			return false;
		}

		return true;
	}

	/**
	 * Updates the table record to point to the newly created form
	 *
	 * @param   int  $formId  form id
	 *
	 * @deprecated - not used
	 *
	 * @return  mixed  null/error
	 */
	protected function _updateFormId($formId)
	{
		$item = $this->getTable();
		$item->form_id = $formId;

		if (!$item->store())
		{
			//return JError::raiseWarning(500, $item->getError());
			return
\Joomla\CMS\Factory::getApplication()->enqueueMessage($item->getError(),
'error');
		}
	}

	/**
	 * Get the tables primary key and if the primary key is auto increment
	 *
	 * @param   string  $table  Optional table name (used when getting pk to
joined tables)
	 *
	 * @return  mixed	If ok returns array(key, extra, type, name) otherwise
	 */
	public function getPrimaryKeyAndExtra($table = null)
	{
		$origColNames = $this->getDBFields($table);
		$keys = array();
		$origColNamesByName = array();

		if (is_array($origColNames))
		{
			foreach ($origColNames as $origColName)
			{
				$colName = $origColName->Field;
				$key = $origColName->Key;
				$extra = $origColName->Extra;
				$type = $origColName->Type;

				if ($key == "PRI")
				{
					$keys[] = array("key" => $key, "extra" =>
$extra, "type" => $type, "colname" => $colName);
				}
				else
				{
					// $$$ hugh - if we never find a PRI, it may be a view, and we'll
need this info in the Hail Mary.
					$origColNamesByName[$colName] = $origColName;
				}
			}
		}

		if (empty($keys))
		{
			// $$$ hugh - might be a view, so Hail Mary attempt to find it in our
lists
			// $$$ So ... see if we know about it, and if so, fake out the PK
details
			$db = FabrikWorker::getDbo(true);
			$query = $db->getQuery(true);
			$query->select('db_primary_key')->from('#__fabrik_lists')->where('db_table_name
= ' . $db->q($table));
			$db->setQuery($query);
			$joinPk = $db->loadResult();
			$shortColName = '';

			if (!empty($joinPk))
			{
				$shortColName = FabrikString::shortColName($joinPk);
			}
			else
			{
				// probably a view which hasn't been added as a list, try Final
Desperate Hail Mary, see if 'id' exists
				if (array_key_exists('id', $origColNamesByName))
				{
					$this->app->enqueueMessage(Text::_('COM_FABRIK_LIST_JOIN_NO_PK_USED_ID'));
					$shortColName = 'id';
				}
				else
				{
					$this->app->enqueueMessage(Text::_('COM_FABRIK_LIST_JOIN_NO_PK'));
				}
			}

			if (!empty($shortColName) && array_key_exists($shortColName,
$origColNamesByName))
			{
				$origColName = $origColNamesByName[$shortColName];
				$key         = $origColName->Key;
				$extra       = $origColName->Extra;
				$type        = $origColName->Type;
				$keys[]      = array('colname' => $shortColName,
'type' => $type, 'extra' => $extra,
'key' => $key);
			}
		}

		return empty($keys) ? false : $keys;
	}

	/**
	 * Run the pre-filter sql and replace any placeholders in the subsequent
pre-filter
	 *
	 * @param   mixed  $selValue  string/array pre-filter value
	 *
	 * @return  mixed  string/array pre-filter value
	 */
	protected function prefilterParse($selValue)
	{
		$isstring = false;

		if (is_string($selValue))
		{
			$isstring = true;
			$selValue = array($selValue);
		}

		$preSQL = $this->getParams()->get('prefilter_query') ?
htmlspecialchars_decode($this->getParams()->get('prefilter_query'),
ENT_QUOTES) : null;

		if (!empty($preSQL) && trim($preSQL) != '')
		{
			$db = FabrikWorker::getDbo();
			$w = new FabrikWorker;
			$w->replaceRequest($preSQL);
			$preSQL = $w->parseMessageForPlaceHolder($preSQL);
			$db->setQuery($preSQL);
			$q = $db->loadObjectList();

			if (!$q)
			{
				// Try the table's connection db for the query
				$thisDb = $this->getDb();
				$thisDb->setQuery($preSQL);
				$q = $thisDb->loadObjectList();
			}

			if (!empty($q))
			{
				$q = $q[0];
			}
		}

		if (isset($q))
		{
			foreach ($q as $key => $val)
			{
				if (substr($key, 0, 1) != '_')
				{
					$found = false;

					for ($i = 0; $i < count($selValue); $i++)
					{
						if (strstr($selValue[$i], '{$q-&gt;' . $key))
						{
							$found = true;
							$pattern = '{$q-&gt;' . $key . "}";
						}

						if (strstr($selValue[$i], '{$q->' . $key))
						{
							$found = true;
							$pattern = '{$q->' . $key . "}";
						}

						if ($found)
						{
							$selValue[$i] = str_replace($pattern, $val, $selValue[$i]);
						}
					}
				}
			}
		}
		else
		{
			/* Parse for default values only
			 * $$$ hugh - this pattern is being greedy, so for example ...
			 * foo {$my->id} bar {$my->id} bosh
			 * ... matches everything from first to last brace, like ...
			 * {$my->id} bar {$my->id}
			 *$pattern = "/({[^}]+}).*}?/s";
			 */
			$pattern = "/({[^}]+})/";

			for ($i = 0; $i < count($selValue); $i++)
			{
				$ok = preg_match($pattern, $selValue[$i], $matches);

				foreach ($matches as $match)
				{
					$matchX = StringHelper::substr($match, 1, StringHelper::strlen($match)
- 2);

					// A default option was set so lets use that
					if (strstr($matchX, '|'))
					{
						$bits = explode('|', $matchX);
						$selValue[$i] = str_replace($match, $bits[1], $selValue[$i]);
					}
				}
			}
		}

		$selValue = $isstring ? $selValue[0] : $selValue;

		// Replace {authorisedViewLevels} with array of view levels the user can
access
		if (is_array($selValue))
		{
			foreach ($selValue as &$v)
			{
				if (strstr($v, '{authorisedViewLevels}'))
				{
					$v = $this->user->getAuthorisedViewLevels();
				}
			}
		}
		else
		{
			if (strstr($selValue, '{authorisedViewLevels}'))
			{
				$selValue = $this->user->getAuthorisedViewLevels();
			}
		}

		return $selValue;
	}

	/**
	 * Get the lists db table's indexes
	 *
	 * @param   string  $table   table name, only needed if join
	 *
	 * @return array  list indexes
	 */
	protected function getIndexes($table = '')
	{
		if (empty($table))
		{
			$table = $this->getTable()->db_table_name;
		}
		if (!isset($this->indexes))
		{
			$this->indexes = array();
		}
		if (!array_key_exists($table, $this->indexes))
		{
			$db = $this->getDb();
			$db->setQuery('SHOW INDEXES FROM ' . $db->qn($table));
			$this->indexes[$table] = $db->loadObjectList();
		}

		return $this->indexes[$table];
	}

	/**
	 * Add an index to the table
	 *
	 * @param   string  $field   field name
	 * @param   string  $prefix  index name prefix (allows you to
differentiate between indexes created in
	 * different parts of fabrik)
	 * @param   string  $type    index type
	 * @param   string  $size    index length
	 *
	 * @return void
	 */
	public function addIndex($field, $prefix = '', $type =
'INDEX', $size = '')
	{
		if (is_numeric($field))
		{
			$el = $this->getFormModel()->getElement($field, true);
			$field = $el->getFullName(true, false);
		}

		/* $$$ hugh - @TODO $field is in 'table.element' format but
$indexes
		 * has Column_name as just 'element' ... so we're always
rebuilding indexes!
		* I'm in the middle of fixing something else, must come back and fix
this!!
		* OK, moved these two lines from below to here
		*/
		$field = str_replace('_raw', '', $field);

		// $$$ rob 29/03/2011 ensure its in tablename___elementname format
		$field = str_replace('.', '___', $field);

		// $$$ rob 28/02/2011 if index in joined table we need to use that the
make the key on
		if (!strstr($field, '___'))
		{
			$table = $this->getTable()->db_table_name;
		}
		else
		{
			$fieldParts = explode('___', $field);
			$table = array_shift($fieldParts);
		}

		$field = FabrikString::shortColName($field);

		$indexes = $this->getIndexes($table);

		FArrayHelper::filter($indexes, 'Column_name', $field);

		if (!empty($indexes))
		{
			// An index already exists on that column name no need to add
			return;
		}

		$db = $this->getDb();

		if ($field == '')
		{
			return;
		}

		if ($size != '')
		{
			$size = '( ' . $size . ' )';
		}

		$this->dropIndex($field, $prefix, $type, $table);
		$query = ' ALTER TABLE ' . $db->qn($table) . ' ADD
INDEX ' . $db->qn("fb_{$prefix}_{$field}_{$type}") .
' ('
				. $db->qn($field) . ' ' . $size . ')';
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (RuntimeException $e)
		{
			// Try to suppress error
			$this->setError($e->getMessage());
		}
	}

	/**
	 * Drop an index
	 *
	 * @param   string  $field   field name
	 * @param   string  $prefix  index name prefix (allows you to
differentiate between indexes created in
	 * different parts of fabrik)
	 * @param   string  $type    table name @since 29/03/2011
	 * @param   string  $table   db table name
	 *
	 * @return  string  index type
	 */
	public function dropIndex($field, $prefix = '', $type =
'INDEX', $table = '')
	{
		$db = $this->getDb();
		$table = $table == '' ? $this->getTable()->db_table_name
: $table;
		$field = FabrikString::shortColName($field);

		if ($field == '')
		{
			return;
		}

		$db->setQuery("SHOW INDEX FROM " . $db->qn($table));
		$dbIndexes = $db->loadObjectList();

		if (is_array($dbIndexes))
		{
			foreach ($dbIndexes as $index)
			{
				if ($index->Key_name == "fb_{$prefix}_{$field}_{$type}")
				{
					$db->setQuery("ALTER TABLE " . $db->qn($table) .
" DROP INDEX " .
$db->qn("fb_{$prefix}_{$field}_{$type}"));

					try
					{
						$db->execute();
					}
					catch (Exception $e)
					{
						$this->setError($e->getMessage());
					}
					break;
				}
			}
		}
	}

	/**
	 * Drop all indexes for a give element name
	 * required when encrypting text fields which have a key on them , as
blobs cant have keys
	 *
	 * @param   string  $field  field name to drop
	 * @param   string  $table  table to drop from
	 *
	 * @return  void
	 */
	public function dropColumnNameIndex($field, $table = '')
	{
		$db = $this->getDb();
		$table = $table == '' ? $this->getTable()->db_table_name
: $table;
		$field = FabrikString::shortColName($field);

		if ($field == '')
		{
			return;
		}

		$db->setQuery("SHOW INDEX FROM " . $db->qn($table) .
' WHERE Column_name = ' . $db->q($field));
		$dbIndexes = $db->loadObjectList();

		foreach ($dbIndexes as $index)
		{
			$db->setQuery(" ALTER TABLE " . $db->qn($table) . "
DROP INDEX " . $db->qn($index->Key_name));
			$db->execute();
		}
	}

	/**
	 * Delete joined records when deleting the main row
	 *
	 * @param   string  $val  quoted primary key values from the main
table's rows that are to be deleted
	 *
	 * @return  void
	 */
	protected function deleteJoinedRows($val)
	{
		$db = $this->getDb();
		$query = $db->getQuery(true);
		$params = $this->getParams();

		if ($params->get('delete-joined-rows', false))
		{
			$joins = $this->getJoins();

			for ($i = 0; $i < count($joins); $i++)
			{
				$join = $joins[$i];

				if ((int) $join->list_id !== 0)
				{
					$query->clear();
					$query->delete($db->qn($join->table_join))->where($db->qn($join->table_join_key)
. ' IN (' . $val . ')');
					$db->setQuery($query);
					$db->execute();
				}
			}
		}
	}

	/**
	 * Deletes records from a table
	 *
	 * @param   mixed   &$ids  Key values to delete (string or array)
	 * @param   string  $key   Key to use (leave empty to default to the
list's key)
	 *
	 * @throws  Exception  If no key found or main delete row fails (perhaps
due to INNODB foreign constraints)
	 *
	 * @return  bool
	 */
	public function deleteRows(&$ids, $key = '')
	{
		if (!is_array($ids))
		{
			$ids = array($ids);
		}

		$val = $ids;
		$table = $this->getTable();
		$db = $this->getDb();

		if ($key == '')
		{
			$key = $table->db_primary_key;

			if ($key == '')
			{
				throw new
Exception(Text::_('COM_FABRIK_NO_KEY_FOUND_FOR_THIS_TABLE'));
			}
		}

		$c = count($val);

		foreach ($val as &$v)
		{
			$v = $db->q($v);
		}

		$val = implode(',', $val);

		/**
		 *
		 * $$$ rob - if we are not deleting joined rows then only load in the
first row
		 * otherwise load in all rows so we can apply onDeleteRows() to all the
data
		 *
		 * $$$ hugh - added setLimits, otherwise session limits from AJAX nav
will override us
		 */
		if ($this->getParams()->get('delete-joined-rows', false)
== false)
		{
			$nav = $this->getPagination($c, 0, $c);
			$this->setLimits(0, $c);
		}
		else
		{
			$this->setLimits(0, -1);
		}

		$this->setPluginQueryWhere('list.deleteRows', $key . '
IN (' . $val . ')');

		/* $$$ hugh - need to clear cached data, 'cos we called
getTotalRecords from the controller, which now
		 * calls getData(), and will have cached all rows on this page, not just
the ones being deleted, which means
		* things like form and element onDelete plugins will get handed a whole
page of rows, not just the ones
		* selected for delete!  Ooops.
		*/
		$this->reset();
		$rows = $this->getData();

		/* $$$ hugh - we need to check delete perms, see:
		 * http://fabrikar.com/forums/showthread.php?p=102670#post102670
		* Short version, if user has access for a table plugin, they get a
checkbox on the row, but may not have
		* delete access on that row.
		*/
		$removed_id = false;

		foreach ($rows as &$group)
		{
			foreach ($group as $group_key => $row)
			{
				if (!$this->canDelete($row))
				{
					// Can't delete, so remove row data from $rows, and the id from
$ids, and queue a message
					foreach ($ids as $id_key => $id)
					{
						if ($id == $row->__pk_val)
						{
							unset($ids[$id_key]);
							continue;
						}
					}

					unset($group[$group_key]);
					$this->app->enqueueMessage('NO PERMISSION TO DELETE
ROW');
					$removed_id = true;
				}
			}
		}

		// See if we have any rows left to delete after checking perms
		if (empty($ids))
		{
			return;
		}
		// Redo $val list of ids in case we zapped any on canDelete check
		if ($removed_id)
		{
			$val = $ids;
			$c = count($val);

			foreach ($val as &$v)
			{
				$v = $db->q($v);
			}

			$val = implode(',', $val);
		}

		$this->rowsToDelete = $rows;
		$groupModels = $this->getFormGroupElementData();

		foreach ($groupModels as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elementModel->onDeleteRows($rows);
			}
		}

		$pluginManager = FabrikWorker::getPluginManager();

		/* $$$ hugh - added onDeleteRowsForm plugin (needed it so fabrikjuser
form plugin can delete users)
		 * NOTE - had to call it onDeleteRowsForm rather than onDeleteRows,
otherwise runPlugins() automagically
		* runs the element onDeleteRows(), which we already do above.  And with
the code as-is, that won't work
		* from runPlugins() 'cos it won't pass it the $rows it needs. 
So i have to sidestep the issue by using
		* a different trigger name.  Added a default onDeleteRowsForm() to
plugin-form.php, and implemented
		* (and tested) user deletion in fabrikjuser.php using this trigger.  All
seems to work.  7/28/2009
		*/

		if (in_array(false,
$pluginManager->runPlugins('onDeleteRowsForm',
$this->getFormModel(), 'form', $rows)))
		{
			return false;
		}

		$pluginManager->getPlugInGroup('list');

		if (in_array(false,
$pluginManager->runPlugins('onDeleteRows', $this,
'list')))
		{
			return false;
		}

		$query = $db->getQuery(true);
		$query->delete($db->qn($table->db_table_name))->where($key .
' IN (' . $val . ')');
		$db->setQuery($query);
		$db->execute();

		$this->deleteJoinedRows($val);

		// Clean the cache.
		$cache =
Factory::getCache($this->app->getInput()->get('option'));
		$cache->clean();

		$this->unsetPluginQueryWhere('list.deleteRows');

		if (in_array(false,
$pluginManager->runPlugins('onAfterDeleteRowsForm',
$this->getFormModel(), 'form', $rows)))
		{
			return false;
		}

		if (in_array(false,
$pluginManager->runPlugins('onAfterDeleteRows', $this,
'list')))
		{
			return false;
		}

		return true;
	}

	/**
	 * Remove all records from the table
	 *
	 * @return  mixed
	 */
	public function dropData()
	{
		$db = $this->getDb();
		$query = $db->getQuery(true);
		$table = $this->getTable();
		$query->delete($db->qn($table->db_table_name));
		$db->setQuery($query);
		$db->execute();

		// Clean the cache.
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		Factory::getCache('com_' . $package)->clean();

		return true;
	}

	/**
	 * Drop the table containing the fabriktables data and drop any internal
joins db tables.
	 *
	 * @return  mixed
	 */
	public function drop()
	{
		$db = $this->getDb();
		$item = $this->getTable();
		$db->dropTable($item->db_table_name);

		// Remove any groups that were set to be repeating and hence were storing
in their own db table.
		$joinModels = $this->getInternalRepeatJoins();

		foreach ($joinModels as $joinModel)
		{
			if ($joinModel->getJoin()->table_join !== '')
			{
				$db->dropTable($joinModel->getJoin()->table_join);
			}
		}

		return true;
	}

	/**
	 * Get an array of join models relating to the groups which were set to be
repeating and thus thier data
	 * stored in a separate db table
	 *
	 * @return  array  join models.
	 */
	public function getInternalRepeatJoins()
	{
		$return = array();
		$groupModels = $this->getFormGroupElementData();

		// Remove any groups that were set to be repeating and hence were storing
in their own db table.
		foreach ($groupModels as $groupModel)
		{
			if ($groupModel->isJoin())
			{
				$joinModel = $groupModel->getJoinModel();
				$join = $joinModel->getJoin();
				$joinParams = is_string($join->params) ?
json_decode($join->params) : $join->params;

				if (isset($joinParams->type) && $joinParams->type ===
'group')
				{
					$return[] = $joinModel;
				}
			}
		}

		return $return;
	}

	/**
	 * Truncate the main db table and any internal joined groups
	 *
	 * @return  void
	 */
	public function truncate()
	{
		$db = $this->getDb();
		$item = $this->getTable();

		$pluginManager = FabrikWorker::getPluginManager();

		$formModel = $this->getFormModel();
		$pluginManager->runPlugins('onBeforeTruncate', $this,
'list');
		$pluginManager->runPlugins('onBeforeTruncate', $formModel,
'form');

		// Remove any groups that were set to be repeating and hence were storing
in their own db table.
		$joinModels = $this->getInternalRepeatJoins();

		foreach ($joinModels as $joinModel)
		{
			$db->setQuery('TRUNCATE ' .
$db->qn($joinModel->getJoin()->table_join));
			$db->execute();
		}

		$db->setQuery('TRUNCATE ' .
$db->qn($item->db_table_name));
		$db->execute();

		// 3.0 clear filters (resets limitstart so that subsequently added
records are shown)
		$this->getFilterModel()->clearFilters();

		// Clean the cache.
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		Factory::getCache('com_' . $package)->clean();
	}

	/**
	 * Test if a field already exists in the database
	 *
	 * @param   string  $field         field to test
	 * @param   array   $ignore        id's to ignore
	 * @param   int     $elGroupModel  group ID of element
	 *
	 * @return  bool
	 */
	public function fieldExists($field, $ignore = array(), $elGroupModel =
null)
	{
		$field = StringHelper::strtolower($field);
		$groupModels = $this->getFormGroupElementData();

		foreach ($groupModels as $groupModel)
		{
			if (
				(!$groupModel->isJoin() && !$elGroupModel->isJoin())
				||
				($groupModel->getId() == $elGroupModel->getId())
			)
			{
				// Don't check groups that aren't in this table
				$elementModels = $groupModel->getMyElements();

				foreach ($elementModels as $elementModel)
				{
					$element = $elementModel->getElement();
					$n = StringHelper::strtolower($element->name);

					if (StringHelper::strtolower($element->name) == $field &&
!in_array($element->id, $ignore))
					{
						return true;
					}
				}
			}
		}

		return false;
	}

	/**
	 * Build a drop-down list of fields
	 *
	 * @param   int     $cnnId           Connection id to use
	 * @param   string  $tbl             Table to load fields for
	 * @param   string  $incSelect       Show "please select" top
option
	 * @param   bool    $incTableName    Append field name values with table
name
	 * @param   string  $selectListName  Name of drop down
	 * @param   string  $selected        Selected option
	 * @param   string  $className       Class name
	 *
	 * @return  string	html to be added to DOM
	 */
	public function getFieldsDropDown($cnnId, $tbl, $incSelect, $incTableName
= false, $selectListName = 'order_by', $selected = null,
		$className = "inputbox")
	{
		$this->setConnectionId($cnnId);
		$aFields = $this->getDBFields($tbl);
		$fieldNames = array();

		if ($incSelect != '')
		{
			$fieldNames[] = HTMLHelper::_('select.option', '',
$incSelect);
		}

		if (is_array($aFields))
		{
			foreach ($aFields as $oField)
			{
				if ($incTableName)
				{
					$fieldNames[] = HTMLHelper::_('select.option', $tbl .
'___' . $oField->Field, $oField->Field);
				}
				else
				{
					$fieldNames[] = HTMLHelper::_('select.option',
$oField->Field);
				}
			}
		}

		$opts = 'class="' . $className . '"
size="1" ';
		$fieldDropDown = HTMLHelper::_('select.genericlist',
$fieldNames, $selectListName, $opts, 'value', 'text',
$selected);

		return str_replace("\n", "", $fieldDropDown);
	}

	/**
	 * Create the RSS href link to go in the table template
	 * Always returns FRONT end URL - as /administrator links will not be
accessible for a feed reader
	 *
	 * @return  string	RSS link
	 */
	public function getRSSFeedLink()
	{
		$link = '';
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');

		if ($this->getParams()->get('rss') == '1')
		{
			$base = JURI::getInstance()->toString(array('scheme',
'user', 'pass', 'host', 'port',
'path'));

			// $$$ rob test fabrik's own feed renderer
			$link = $base . '?option=com_' . $package .
'&view=list&listid=' . $this->getId();
//			$version = new Version;

//			if (version_compare($version->RELEASE, '3.8',
'>=')) {
				$link .= "&format=feed";
//			}
//			else
//			{
//				$link .= "&format=fabrikfeed";
//			}

			if (!$this->app->isClient('administrator'))
			{
				$link = Route::_($link);
			}
		}

		return $link;
	}

	/**
	 * Iterates through string to replace every
	 * {placeholder} with row data
	 * (added by hugh, does the same thing as parseMessageForPlaceHolder in
parent
	 * class, but for rows instead of forms)
	 *
	 * NOTE - I can't remember why I added this way back when in 2.x,
instead of using the helper function,
	 * I just know there was a good reason, to do with the helper func making
assumptions about something
	 * (I think to do with how form data is formatted) which weren't true
when rendering list data.  I have
	 * a suspicion that in the intervening years, the helper func and the way
we format data may now be
	 * copacetic, and we could do away with this separation, and just use the
normal helper func.  Might be
	 * worth testing, as this code looks like it has suffered bitrot, and
doesn't do a number of things the main
	 * helper func now does.
	 *
	 * @param   string  $msg         text to parse
	 * @param   array   &$row        of row data
	 * @param   bool    $addSlashes  add slashes to the replaced data (default
= false) set to true in fabrikcalc element
	 *
	 * @return  string  parsed message
	 */
	public function parseMessageForRowHolder($msg, &$row, $addSlashes =
false)
	{
		$this->aRow = $row;

		if (!strstr($msg, '{'))
		{
			return $msg;
		}

		$this->parseAddSlases = $addSlashes;
		$msg = FabrikWorker::replaceWithUserData($msg);
		$msg = FabrikWorker::replaceWithGlobals($msg);
		$msg = preg_replace("/{}/", "", $msg);
		$this->rowIdentifierAdded = false;
		/* replace {element name} with form data */
		/* $$$ hugh - testing changing the regex so we don't blow away PHP
structures!  Added the \s so
		 * we only match non-space chars in {}'s.  So unless you have some
code like "if (blah) {foo;}", PHP
		* block level {}'s should remain unmolested.
		*/
		$msg = preg_replace_callback("/{[^}\s]+}/i", array($this,
'replaceWithRowData'), $msg);

		$lang = $this->lang->getTag();
		$lang = str_replace('-', '_', $lang);
		$msg = str_replace('{lang}', $lang, $msg);

		return $msg;
	}

	/**
	 * Called from parseMessageForRowHolder to iterate through string to
replace
	 * {placeholder} with row data
	 *
	 * @param   array  $matches  found in parseMessageForRowHolder
	 *
	 * @return  string	posted data that corresponds with placeholder
	 */
	private function replaceWithRowData($matches)
	{
		$match = $matches[0];

		// $$$ felixkat - J! plugin closings, i.e  {/foo} were getting caught
here.
		if (preg_match('[{/]', $match))
		{
			return $match;
		}

		$config = Factory::getApplication()->getConfig();
		$prefix = $config->get('dbprefix');
		$match  = str_replace('#__', $prefix, $match);

		/* strip the {} */
		$match = StringHelper::substr($match, 1, StringHelper::strlen($match) -
2);

		// $$$ hugh - in case any {$my->foo} or {$_SERVER->FOO} paterns are
left over, avoid 'undefined index' warnings
		if (preg_match('#^\$#', $match))
		{
			return '';
		}

		$match = str_replace('.', '___', $match);

		// $$$ hugh - allow use of {$rowpk} or {rowpk} to mean the rowid of the
row within a table
		if ($match == 'rowpk' || $match == '$rowpk' || $match
== 'rowid')
		{
			$this->rowIdentifierAdded = true;
			$match = '__pk_val';
		}

		$match = preg_replace("/ /", "_", $match);

		if ($match == 'formid')
		{
			return $this->getFormModel()->getId();
		}

		$return = FArrayHelper::getValue($this->aRow, $match);

		if (is_array($return))
		{
			$this->parseAddSlases = true;
			$return = json_encode($return);
		}

		if ($this->parseAddSlases)
		{
			$return = htmlspecialchars($return, ENT_QUOTES, 'UTF-8');
		}

		return $return;
	}

	/**
	 * This is just way too confuins - view details link now always returns a
view details link and not an edit link ?!!!
	 * get the link to view the records details
	 *
	 * @param   object  &$row  active list row
	 * @param   string  $view  3.0 depreciated
	 *
	 * @return  string	url of view details link
	 *
	 * @since  3.0
	 *
	 * @return  string  link
	 */
	public function viewDetailsLink(&$row, $view = null)
	{
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$itemId = FabrikWorker::itemId();
		$keyIdentifier = $this->getKeyIndetifier($row);
		$table = $this->getTable();
		$view = 'details';
		$customLink = $this->getCustomLink('url',
'details');

		if (trim($customLink) === '')
		{
			$link = '';

			// $$$ hugh - if we don't do this on feeds, links with sub-folders
in root get screwed up because no BASE_HREF is set
			if ($this->app->getInput()->get('format',
'') == 'fabrikfeed'
				|| $this->app->getInput()->get('format',
'') == 'feed')
			{
				$link .= COM_FABRIK_LIVESITE;
			}

			if ($this->app->isClient('administrator'))
			{
				$link .= 'index.php?option=com_' . $package .
'&task=' . $view . '.view&formid=' .
$table->form_id . '&listid=' . $this->getId() .
$keyIdentifier;
			}
			else
			{
				$link .= 'index.php?option=com_' . $package .
'&view=' . $view . '&formid=' .
$table->form_id . $keyIdentifier . '&Itemid=' . $itemId;
			}

			$link = Route::_($link);
		}
		else
		{
			// Custom link
			$link = $this->makeCustomLink($customLink, $row);
		}

		return $link;
	}

	/**
	 * Create a custom edit/view details link
	 *
	 * @param   string  $link  link
	 * @param   object  $row   row's data
	 *
	 * @return  string  custom link
	 */
	protected function makeCustomLink($link, $row)
	{
		$link = htmlspecialchars($link);
		$keyIdentifier = $this->getKeyIndetifier($row);
		$row = ArrayHelper::fromObject($row);
		$link = $this->parseMessageForRowHolder($link, $row);

		// special case, if someone is using a link element placeholder as a
custom link
		if (FabrikWorker::isJSON($link))
		{
			$test = FabrikWorker::JSONtoData($link);
			if (is_object($test) && isset($test->link))
			{
				$link = $test->link;
			}
		}

		if (preg_match('/([\?&]rowid=)/',
htmlspecialchars_decode($link)))
		{
			$this->rowIdentifierAdded = true;
		}

		if ($this->rowIdentifierAdded === false)
		{
			if (strstr($link, '?'))
			{
				$link .= $keyIdentifier;
			}
			else
			{
				$link .= '?' . str_replace('&', '',
$keyIdentifier);
			}
		}

		$link = Route::_($link);

		return $link;
	}

	/**
	 * Get a custom link
	 *
	 * @param   string  $type  link type
	 * @param   string  $mode  edit/details link
	 *
	 * @return  string  link
	 */
	protected function getCustomLink($type = 'url', $mode =
'edit')
	{
		$params = $this->getParams();

		if ($type === 'url')
		{
			$str = ($mode == 'edit') ?
$params->get('editurl') :
$params->get('detailurl');
		}
		else
		{
			$str = ($mode == 'edit') ?
$params->get('editurl_attribs') :
$params->get('detailurl_attribs');
		}

		$w = new FabrikWorker;

		return $w->parseMessageForPlaceHolder($str);
	}

	/**
	 * Get the link to edit the records details
	 *
	 * @param   object  &$row  Active table row
	 *
	 * @return  string  Url of view details link
	 */
	public function editLink(&$row)
	{
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$itemId = FabrikWorker::itemId();
		$keyIdentifier = $this->getKeyIndetifier($row);
		$table = $this->getTable();
		$customLink = $this->getCustomLink('url', 'edit');

		if ($customLink == '')
		{
			if ($this->app->isClient('administrator'))
			{
				$url = 'index.php?option=com_' . $package .
'&task=form.view&formid=' . $table->form_id .
$keyIdentifier;
			}
			else
			{
				$url = 'index.php?option=com_' . $package .
'&view=form&Itemid=' . $itemId . '&formid='
. $table->form_id . $keyIdentifier . '&listid='
						. $this->getId();
			}

			$link = Route::_($url);
		}
		else
		{
			$link = $this->makeCustomLink($customLink, $row);
		}

		return $link;
	}

	/**
	 * Make the drop sql statement for the table
	 *
	 * @return  string|bool  drop table sql
	 */
	public function getDropTableSQL()
	{
		$db = FabrikWorker::getDbo();
		$genTable = $this->getGenericTableName();

		if ($genTable === '')
		{
			return false;
		}

		return 'DROP TABLE IF EXISTS ' . $db->qn($genTable);
	}

	/**
	 * Convert a prefix__tablename to #__tablename
	 *
	 * @return  string  table name
	 */
	public function getGenericTableName()
	{
		$table = $this->getTable();

		return str_replace($this->app->get('dbprefix'),
'#__', $table->db_table_name);
	}

	/**
	 * Make the create sql statement for the table
	 *
	 * @param   bool    $addIfNotExists  add 'if not exists' to
query
	 * @param   string  $table           table to get sql for(leave out to use
models table)
	 *
	 * @return  string	sql to drop & or create table
	 */
	public function getCreateTableSQL($addIfNotExists = false, $table = null)
	{
		$addIfNotExists = $addIfNotExists ? 'IF NOT EXISTS ' :
'';

		if (is_null($table))
		{
			$table = $this->getGenericTableName();
		}

		$fields = $this->getDBFields($table);
		$primaryKey = '';
		$sql = '';
		$table = FabrikString::safeColName($table);

		if (is_array($fields))
		{
			$sql .= "CREATE TABLE $addIfNotExists" . $table . "
(\n";

			foreach ($fields as $field)
			{
				$field->Field = FabrikString::safeColName($field->Field);

				if ($field->Key == 'PRI' && $field->Extra ==
'auto_increment')
				{
					$primaryKey = "PRIMARY KEY ($field->Field)";
				}

				$sql .= "$field->Field ";
				$sql .= ' ' . $field->Type . ' ';

				if ($field->Null == '')
				{
					$sql .= " NOT NULL ";
				}

				if ($field->Default != '' && $field->Key !=
'PRI')
				{
					if ($field->Default == 'CURRENT_TIMESTAMP')
					{
						$sql .= "DEFAULT $field->Default";
					}
					else
					{
						$sql .= "DEFAULT '$field->Default'";
					}
				}

				$sql .= $field->Extra . ",\n";
			}

			if ($primaryKey == '')
			{
				$sql = rtrim($sql, ",\n");
			}

			$sql .= $primaryKey . ");";
		}

		return $sql;
	}

	/**
	 * Make the create sql statement for inserting the table data
	 * used in package export
	 *
	 * @param   object  $oExporter  exporter
	 *
	 * @deprecated - not used?
	 *
	 * @return  string	sql to drop & or create table
	 */
	public function getInsertRowsSQL($oExporter)
	{
		@set_time_limit(300);
		$table = $this->getTable();
		$memoryLimit = FabrikWorker::getMemoryLimit();
		$db = $this->getDb();
		/*
		 * don't load in all the table data as on large tables this gives a
memory error
		* in fact this wasn't the problem, but rather the $sql var becomes
too large to hold in memory
		* going to try saving to a file on the server and then compressing that
and sending it as a header for download
		*/
		$query = $db->getQuery(true);
		$query->select($table->db_primary_key)->from($table->db_table_name);
		$db->setQuery($query);
		$keys = $db->loadColumn();
		$sql = '';
		$query = $db->getQuery(true);
		$dump_buffer_len = 0;

		if (is_array($keys))
		{
			foreach ($keys as $id)
			{
				$query->clear();
				$query->select('*')->from($table->db_table_name)->where($table->db_primary_key
= $id);
				$db->setQuery($query);
				$row = $db->loadObject();
				$fmtSql = "\t<query>INSERT INTO " .
$table->db_table_name . " ( %s ) VALUES ( %s )</query>";
				$values = array();
				$fields = array();

				foreach ($row as $k => $v)
				{
					$fields[] = $db->qn($k);
					$values[] = $db->q($v);
				}

				$sql .= sprintf($fmtSql, implode(",", $fields),
implode(",", $values));
				$sql .= "\n";
				$dump_buffer_len += StringHelper::strlen($sql);

				if ($dump_buffer_len > $memoryLimit)
				{
					$oExporter->writeExportBuffer($sql);
					$sql = "";
					$dump_buffer_len = 0;
				}

				unset($values);
				unset($fmtSql);
			}
		}

		$oExporter->writeExportBuffer($sql);
	}

	/**
	 * Get a row of data from the table
	 *
	 * @param   int   $id        Id
	 * @param   bool  $format    The data
	 * @param   bool  $loadJoin  Load the rows joined data @since 2.0.5 (used
in J Content plugin)
	 *
	 * @return  object	Row
	 */
	public function getRow($id, $format = false, $loadJoin = false)
	{
		if (is_null($this->rows))
		{
			$this->rows = array();
		}

		$sig = $id . '.' . $format . '.' . $loadJoin;

		if (array_key_exists($sig, $this->rows))
		{
			return $this->rows[$sig];
		}

		$fabrikDb = $this->getDb();
		$formModel = $this->getFormModel();
		$formModel->reset();
		$this->reset();
		$formModel->rowId = $id;

		$sql = $formModel->buildQuery();
		$fabrikDb->setQuery($sql);

		if (!$loadJoin)
		{
			if ($format == true)
			{
				$row = $fabrikDb->loadObject();
				if (is_null($row))
				{
					$row = array();
				}
				else
				{
					$row = array($row);
				}
				$this->formatData($row);
				/* $$$ hugh - if table is grouped, formatData will have turned $row
into an
				 * assoc array, so can't assume 0 is first key.
				* $this->rows[$sig] = $row[0][0];
				*/
				$row = FArrayHelper::getValue($row, FArrayHelper::firstKey($row),
array());
				$this->rows[$sig] = FArrayHelper::getValue($row, 0, new stdClass);
			}
			else
			{
				$this->rows[$sig] = $fabrikDb->loadObject();
			}
		}
		else
		{
			$rows = $fabrikDb->loadObjectList();
			$formModel->setJoinData($rows);

			if ($format == true)
			{
				$rows = array(ArrayHelper::toObject($rows));
				$this->formatData($rows);
				$rows = $rows[0];
				/* $$$ hugh - if list is grouped, formatData will have re-index as
assoc array,
				 /* so can't assume 0 is first key.
				*/
				$this->rows[$sig] = FArrayHelper::getValue($rows,
FArrayHelper::firstKey($rows), array());
			}
			else
			{
				// Content plugin - rows is 1 dimensional array
				$this->rows[$sig] = $rows;
			}
		}

		if (is_array($this->rows[$sig]))
		{
			$this->rows[$sig] = ArrayHelper::toObject($this->rows[$sig]);
		}

		return $this->rows[$sig];
	}

	/**
	 * Find a row in the table that matches " key LIKE '%val'
"
	 *
	 * @param   string  $key     key
	 * @param   string  $val     value
	 * @param   bool    $format  format the row
	 *
	 * @return  object	row
	 */
	public function findRow($key, $val, $format = false)
	{
		$input = $this->app->getInput();
		$useKey = $input->get('usekey');
		$useKeyComparison = $input->get('usekey_comparison');
		$input->set('usekey', $key);
		$input->set('usekey_comparison', 'like');
		$row = $this->getRow($val, $format);
		$input->set('usekey', $useKey);
		$input->set('usekey_comparison', $useKeyComparison);

		return $row;
	}

	/**
	 * Ajax get record specified by row id
	 *
	 * @param   string  $mode  mode
	 *
	 * @return  string  json encoded row
	 */
	public function xRecord($mode = 'table')
	{
		$input = $this->app->getInput();
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$fabrikDb = $this->getDb();
		$cursor = $input->getInt('cursor', 1);
		$this->outputFormat = 'json';
		$nav = $this->getPagination(1, $cursor, 1);

		if ($mode == 'table')
		{
			$query = $this->buildQuery();
			$this->setBigSelects();
			$fabrikDb->setQuery($query, $this->limitStart,
$this->limitLength);
			$data = $fabrikDb->loadObjectList();
		}
		else
		{
			// Get the row id
			$table = $this->getTable();
			$query = $fabrikDb->getQuery(true);
			$query->select($table->db_primary_key)->from($table->db_table_name);
			$query = $this->buildQueryJoin($query);
			$query = $this->buildQueryOrder($query);
			$fabrikDb->setQuery($query, $nav->limitstart, $nav->limit);
			$rowId = $fabrikDb->loadResult();
			$input->set('rowid', $rowId);
			$formId = $input->getInt('formid');
			$this->app->redirect('index.php?option=' . $package .
'&view=form&formid=' . $formId . '&rowid='
. $rowId . '&format=raw');
		}

		return json_encode($data);
	}

	/**
	 * Ajax get next record
	 *
	 * @return  string  json object representing record/row
	 */
	public function nextRecord()
	{
		$cursor = $this->app->getInput()->getInt('cursor', 1);
		$this->outputFormat = 'json';
		$this->getPagination(1, $cursor, 1);
		$data = $this->getData();
		echo json_encode($data);
	}

	/**
	 * Ajax get previous record
	 *
	 * @return  string json  object representing record/row
	 */
	public function previousRecord()
	{
		$cursor = $this->app->getInput()->getInt('cursor', 1);
		$this->outputFormat = 'json';
		$this->getPagination(1, $cursor - 2, 1);
		$data = $this->getData();

		return json_encode($data);
	}

	/**
	 * Ajax get first record
	 *
	 * @return  string  json object representing record/row
	 */
	public function firstRecord()
	{
		$this->outputFormat = 'json';
		$this->getPagination(1, 0, 1);
		$data = $this->getData();

		return json_encode($data);
	}

	/**
	 * Ajax get last record
	 *
	 * @return  string  json object representing record/row
	 */
	public function lastRecord()
	{
		$total = $this->app->getInput()->getInt('total', 0);
		$this->outputFormat = 'json';
		$this->getPagination(1, $total - 1, 1);
		$data = $this->getData();

		return json_encode($data);
	}

	/**
	 * Get a single column of data from the table, test for element filters
	 *
	 * @param   mixed  $col       Column to grab. Element full name or id
	 * @param   bool   $distinct  Select distinct values only
	 * @param   array  $opts      Options: filterLimit bool - should limit to
filter_list_max global param (default true)
	 *                                     where - additional where filter to
apply to query (@since 3.0.8)
	 *
	 * @return  array  Values for the column - empty array if no results found
	 */
	public function getColumnData($col, $distinct = true, $opts = array())
	{
		if (!array_key_exists($col, $this->columnData))
		{
			$fbConfig = ComponentHelper::getParams('com_fabrik');
			$cache = FabrikWorker::getCache($this);
			$opts['filters'] = $this->filters;

//			$res = $cache->get(array(get_class($this), 'columnData'),
$this->getId(), $col, $distinct, $opts);
// $this->getId(), $col, $distinct, $opts are parameters for function
columnData not for $cache->get
			$args = [$this->getId(), $col, $distinct, $opts];
			$res = $cache->get(array(get_class($this), 'columnData'),
$args);

			if (is_null($res))
			{
				$this->app->enqueueMessage('list model getColumn Data for
' . $col . ' failed', 'notice');
				$res = array();
			}

			if ((int) $fbConfig->get('filter_list_max', 100) ==
count($res))
			{
				$this->app->enqueueMessage(Text::sprintf('COM_FABRIK_FILTER_LIST_MAX_REACHED',
$col), 'notice');
			}

			$this->columnData[$col] = $res;
		}

		return $this->columnData[$col];
	}

	/**
	 * Cached method to grab a column's data, called from getColumnData()
	 *
	 * @param   int    $listId    List id
	 * @param   mixed  $col       Column to grab. Element full name or id
	 * @param   bool   $distinct  Select distinct values only
	 * @param   array  $opts      Options: filterLimit bool - should limit to
filter_list_max global param (default true)
	 *                                     where - additional where filter to
apply to query (@since 3.0.8)
	 *
	 * @since   3.0.7
	 *
	 * @return  array  Column's values
	 */
	public static function columnData($listId, $col, $distinct = true, $opts =
array()) //columnData($args)
	{
		/** @var FabrikFEModelList $listModel */
		$listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$listModel->setId($listId);
		$listModel->filters = FArrayHelper::getValue($opts,
'filters');
		$table = $listModel->getTable();
		$fbConfig = ComponentHelper::getParams('com_fabrik');
		$db = $listModel->getDb();
		$el = $listModel->getFormModel()->getElement($col);
		$col = $db->qn($col);
		$el->encryptFieldName($col);
		$tableName = $table->db_table_name;
		$tableName = FabrikString::safeColName($tableName);
		$query = $db->getQuery(true);
		$query->select('DISTINCT(' . $col .
')')->from($tableName);
		$query = $listModel->buildQueryJoin($query);
		$query = $listModel->buildQueryWhere(false, $query);
		$query = $listModel->pluginQuery($query);
		$filterLimit = FArrayHelper::getValue($opts, 'filterLimit',
true);
		$where = FArrayHelper::getValue($opts, 'where', '');

		if ($where != '')
		{
			$query->where($where);
		}

		if ($filterLimit)
		{
			$db->setQuery($query, 0,
$fbConfig->get('filter_list_max', 100));
		}
		else
		{
			$db->setQuery($query);
		}

		$res = $db->loadColumn(0);

		return $res;
	}

	/**
	 * Determine how the model does filtering and navigation
	 *
	 * @return  bool  ajax true /post false; default post
	 */
	public function isAjax()
	{
		$params = $this->getParams();

		if (is_null($this->ajax))
		{
			// $$$ rob 11/07/2011 if post method set to ajax in request use that
over the list_nav option
			$input = $this->app->getInput();

			if ($input->get('ajax', false) == '1')
			{
				$this->ajax = true;
			}
			else
			{
				$this->ajax = $params->get('list_ajax',
$input->getBool('ajax', false));
			}
		}

		return (bool) $this->ajax;
	}

	/**
	 * Model edit/add links can be set separately to the ajax option
	 *
	 * @return  bool
	 */
	protected function isAjaxLinks()
	{
		$params = $this->getParams();
		$ajax = $this->isAjax();

		return (bool) $params->get('list_ajax_links', $ajax);
	}

	/**
	 * Get an array of the table's elements that match a certain plugin
type
	 *
	 * @param   string  $plugin  name
	 *
	 * @return  PlgFabrik_Element[]	matched element models
	 */
	public function getElementsOfType($plugin)
	{
		$found = array();
		$groups = $this->getFormGroupElementData();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getMyElements();

			foreach ($elementModels as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($element->plugin == $plugin)
				{
					$found[] = $elementModel;
				}
			}
		}

		return $found;
	}

	/**
	 * Get all the elements in the list
	 *
	 * @param   mixed  $key            Key to key returned array on, currently
accepts null, '', 'id', or 'filtername'
	 * @param   bool   $showInTable    Show in table default true
	 * @param   bool   $onlyPublished  Return only published elements
	 *
	 * @return  PlgFabrik_Element[]	table element models
	 */
	public function getElements($key = 0, $showInTable = true, $onlyPublished
= true)
	{
		if (!isset($this->elements))
		{
			$this->elements = array();
		}

		$sig = $key . '.' . (int) $showInTable;

		if (!array_key_exists($sig, $this->elements))
		{
			$this->elements[$sig] = array();
			$groups = $this->getFormGroupElementData();

			foreach (array_keys($groups) as $gid)
			{
				$groupModel = $groups[$gid];
				$elementModels = $groupModel->getMyElements();

				foreach ($elementModels as $elementModel)
				{
					$element = $elementModel->getElement();

					if ($element->published == 0 && $onlyPublished)
					{
						continue;
					}

					$dbKey = $key == 'filtername' ?
trim($elementModel->getFilterFullName()) :
trim($elementModel->getFullName(true, false));

					switch ($key)
					{
						case 'safecolname':
							// Deprecated (except for querystring filters and inline edit)
						case 'filtername':
							// $$$ rob hack to ensure that querystring filters dont use the
concat string when getting the
							// Dbkey for the element, otherwise related data doesn't work
							$origConcat =
$elementModel->getParams()->get('join_val_column_concat');
							$elementModel->getParams()->set('join_val_column_concat',
'');

							// $$$ rob if prefilter was using _raw field then we need to assign
the model twice to both possible keys
							if (is_a($elementModel, 'PlgFabrik_ElementDatabasejoin'))
							{
								$dbKey2 =
FabrikString::safeColName($elementModel->getFullName(false, false));
								$this->elements[$sig][$dbKey2] = $elementModel;
							}

							$elementModel->getParams()->set('join_val_column_concat',
$origConcat);
							$this->elements[$sig][$dbKey] = $elementModel;
							break;
						case 'id':
							$this->elements[$sig][$element->id] = $elementModel;
							break;
						default:
							$this->elements[$sig][] = $elementModel;
							break;
					}
				}
			}
		}

		return $this->elements[$sig];
	}

	/**
	 * Does the list need to include the slimbox js code
	 *
	 * @return  bool
	 */
	public function requiresSlimbox()
	{
		$fbConfig = ComponentHelper::getParams('com_fabrik');

		if ($fbConfig->get('include_lightbox_js', 1) == 2)
		{
			return true;
		}

		$form = $this->getFormModel();
		$groups = $form->getGroupsHiarachy();

		foreach ($groups as $group)
		{
			$elements = $group->getPublishedElements();

			foreach ($elements as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($element->show_in_list_summary &&
$elementModel->requiresLightBox())
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Does the list need to include the slimbox js code
	 *
	 * @return  bool
	 */
	public function requiresSlideshow()
	{
		$form = $this->getFormModel();
		$groups = $form->getGroupsHiarachy();

		foreach ($groups as $group)
		{
			$elements = $group->getPublishedElements();

			foreach ($elements as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($element->show_in_list_summary &&
$elementModel->requiresSlideshow())
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Get pluginManager (get reference to form's plugin manager
	 *
	 * @deprecated - use FabrikWorker::getPluginManager() instead since 3.0b
	 *
	 * @return  object  plugin manager model
	 */
	public function getPluginManager()
	{
		return FabrikWorker::getPluginManager();
	}

	/**
	 * Called via advanced search to load in a given element filter
	 *
	 * @return string html for filter
	 */
	public function getAdvancedElementFilter()
	{
		return $this->advancedSearch->elementFilter();
	}

	/**
	 * Get add button label
	 *
	 * @since   3.1rc1
	 *
	 * @return  string
	 */
	public function addLabel()
	{
		$params = $this->getParams();

		return Text::_($params->get('addlabel',
Text::_('COM_FABRIK_ADD')));
	}

	/**
	 * Get add button label
	 *
	 * @since   3.1rc1
	 *
	 * @return  string
	 */
	public function addIcon()
	{
		$params = $this->getParams();

		return $params->get('list_add_icon', 'plus');
	}

	/**
	 * Get view details button label
	 *
	 * @since   3.1rc1
	 *
	 * @param   object  &$row  active table row
	 *
	 * @return  string
	 */
	public function viewLabel($row)
	{
		$params = $this->getParams();
		$row = ArrayHelper::fromObject($row);

		return
Text::_($this->parseMessageForRowHolder($params->get('detaillabel',
Text::_('COM_FABRIK_VIEW')), $row));
	}

	/**
	 * Get edit row button label
	 *
	 * @param   object  $row  active table row
	 *
	 * @since   3.1rc1
	 *
	 * @return  string
	 */
	public function editLabel($row)
	{
		$params = $this->getParams();
		$row = ArrayHelper::fromObject($row);

		return
Text::_($this->parseMessageForRowHolder($params->get('editlabel',
Text::_('COM_FABRIK_EDIT')), $row));
	}

	/**
	 * Build the list's add record link
	 * if a querystring filter has been passed in to the table then apply this
to the link
	 * this means that table->faceted table->add will auto select the
data you browsed on
	 *
	 * @return string  url
	 */
	public function getAddRecordLink()
	{
		$qs = array();
		$w = new FabrikWorker;
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$input = $this->app->getInput();
		$itemId = FabrikWorker::itemId();
		$params = $this->getParams();
		$url = FabrikWorker::getMenuOrRequestVar('addurl',
$params->get('addurl', ''), $this->isMambot);
		$filters = $this->getRequestData();
		$keys = FArrayHelper::getValue($filters, 'key', array());
		$vals = FArrayHelper::getValue($filters, 'value', array());
		$types = FArrayHelper::getValue($filters, 'search_type',
array());

		for ($i = 0; $i < count($keys); $i++)
		{
			$filterType = FArrayHelper::getValue($types, $i, '');

			// Append content plugin filters or querystring filters
			if (in_array($filterType, array('jpluginfilters',
'querystring')))
			{
				$qs[FabrikString::safeColNameToArrayKey($keys[$i]) . '_raw']
= $vals[$i];
			}
		}

		$querystring = array();

		if (!empty($url))
		{
			// call replaceWithGlobals to handle any {formview} replacement before
query string handling
			$url = $w->replaceWithGlobals($url);
			$addurl_parts = explode('?', $url);

			if (count($addurl_parts) > 1)
			{
				$url = $addurl_parts[0];

				foreach (explode('&', $addurl_parts[1]) as $urlvar)
				{
					$key_value = explode('=', $urlvar);
					$querystring[$key_value[0]] = $key_value[1];
				}
			}
		}

		// $$$ rob needs the item id for when sef urls are turned on
		if (!array_key_exists('Itemid', $querystring))
		{
			$qs['Itemid'] = $itemId;
		}

		if (empty($url))
		{
			$formModel = $this->getFormModel();
			$qs['option'] = 'com_' . $package;

			if ($this->app->isClient('administrator'))
			{
				$qs['task'] = 'form.view';
			}
			else
			{
				$qs['view'] = 'form';
			}

			$qs['formid'] = $this->getTable()->form_id;
			$qs['rowid'] = '';

			/* $$$ hugh - testing social profile session hash, which may get set by
things like
			 * the CB or JomSocial plugin.  Needed so things like the
'user' element can derive the
			* user ID of the profile being viewed, to which a record is being added.
			*/
			if ($input->get('fabrik_social_profile_hash', '')
!= '')
			{
				$qs['fabrik_social_profile_hash'] =
$input->get('fabrik_social_profile_hash', '');
			}
		}

		$qs = array_merge($qs, $querystring);
		$qsArgs = array();

		foreach ($qs as $key => $val)
		{
			if (!is_array($val))
			{
				$qsArgs[] = $key . '=' . $val;
			}
			else
			{
				// Rob says do nothing if a multi-value array
			}
		}

		$qs = implode('&', $qsArgs);
		$qs = $w->parseMessageForPlaceHolder($qs, $_REQUEST);

		return !empty($url) ? Route::_($url . '?' . $qs) :
Route::_('index.php?' . $qs);
	}

	/**
	 * Create the JS to load element list JS
	 *
	 * @param   array  &$srcs  JS scripts to load
	 *
	 * @return  string  script
	 */
	public function getElementJs(&$srcs)
	{
		$form = $this->getFormModel();
		$script = '';
		$groups = $form->getGroupsHiarachy();
		$run = array();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$element = $elementModel->getElement();

				if (!in_array($element->plugin, $run))
				{
					$run[] = $element->plugin;
					$elementModel->tableJavascriptClass($srcs);
				}

				$script .= $elementModel->elementListJavascript();
			}
		}

		return $script;
	}

	/**
	 * Return the url for the list form - this url is used when submitting
searches, and ordering
	 *
	 * @return  string  action url
	 */
	public function getTableAction()
	{
		if (isset($this->tableAction))
		{
			return $this->tableAction;
		}

		$input = $this->app->getInput();
		$option = $input->get('option');

		// Get the router
		$router = $this->app->getRouter();
		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');

		/* $$$ rob force these to be 0 once the menu item has been loaded for the
first time
		 * subsequent loads of the link should have this set to 0. When the menu
item is re-clicked
		* rest filters is set to 1 again
		*/
		$router->setVar('resetfilters', 0);

		if ($option !== $package)
		{
			// $$$ rob these can't be set by the menu item, but can be set in
{fabrik....}
			$router->setVar('clearordering', 0);
			$router->setVar('clearfilters', 0);
		}

		$queryVars = $router->getVars();
		$form = $this->getFormModel();
		$page = 'index.php?';

		foreach ($queryVars as $k => $v)
		{
			$rawK = FabrikString::rtrimword($k, '_raw');
			$el = $form->getElement($k);

			if ($el === false)
			{
				$el = $form->getElement($rawK);
			}

			if (is_array($v))
			{
				/* $$$ rob if you were using URL filters such as
				 *
				* &jos_fabble_activity___create_date[value][]=now
				*
&jos_fabble_activity___create_date[value][]=%2B2%20week&jos_fabble_activity___create_date[condition]=BETWEEN
				*
				* then we don't want to re-add them to the table action.
				* Instead they are aded to the filter sessions and reapplied that way
				* otherwise we ended up with elementname=Array in the query string
				*/

				/*
				 * $$$ hugh ... yeah, but $v is still an array, so we need to deal with
it
				 * if it isn't an element ... like (say) ids[]=1&ids[]=2 in a
table plugin, like
				 * email list
				 */
				if ($el === false && $k !== 'fabrik___filter')
				{
					foreach ($v as $v1)
					{
						$qs[] = $k . '[]=' . $v1;
					}
				}
			}
			else
			{
				if ($el === false)
				{
					$qs[] = $k . '=' . $v;
				}
				else
				{
					/* $$$ e-kinst
					 * let's keep &id for com_content - in other case in Content
Plugin
					* we have incorrect action in form and as a result bad pagination
URLS.
					* In any case this will not be excessive (I suppose)
					*/
					if ($k == 'id' && $option ==
'com_content')
					{
						// At least. May be even  $option != 'com_fabrik'
						$qs[] = $k . '=' . $v;
					}
					// Check if its a tag element if it is we want to clear that when we
clear the form
					// (if the filter was set via the url we generally want to keep it
though

					/* 28/12/2011 $$$ rob testing never keeping querystring filters in the
qs but instead always
					 * adding them to the filters (if no filter set up in element settings
then hidden fields added anyway
					 		* this is to try to get round issue of related data
(countries->regions) filter region from country list,
					 		* then clear filters (ok) but then if you go to 2nd page of results
country url filter re-applied
					 		*/
					/* if($el->getElement()->plugin !== 'textarea'
&& $el->getParams()->get('textarea-tagify') !==
true) {
					 $qs[] = "$k=$v";
					} */
				}
			}
		}

		// keep XSS checkers happy
		foreach ($qs as &$q)
        {
            $q = htmlspecialchars($q, ENT_QUOTES, 'UTF-8');
        }

		$action = $page . implode('&amp;', $qs);
		$action =
preg_replace("/limitstart{$this->getId()}=(\d+)?(&amp;|)/",
'', $action);
		$action = FabrikString::removeQSVar($action,
'fabrik_incsessionfilters');
		$action = FabrikString::rtrimword($action, '&');
		$this->tableAction = Route::_($action);

		return $this->tableAction;
	}

	/**
	 * Allow plugins to add arbitrary WHERE clauses.  Gets checked in
buildQueryWhere().
	 *
	 * @param   string  $pluginName   Plugin name
	 * @param   string  $whereClause  Where clause (WITHOUT prepended
where/and etc)
	 *
	 * @return  bool
	 */
	public function setPluginQueryWhere($pluginName, $whereClause)
	{
		// Strip any prepended conditions off
		$whereClause = preg_replace('#(^where |^and |^or )#i',
'', $whereClause);

		if (trim($whereClause) === '')
		{
			return;
		}
		/* only do anything if it's a different clause ...
		 * if it's the same, no need to clear the table data, can use cached
		*/
		if (!array_key_exists($pluginName, $this->pluginQueryWhere) ||
$whereClause != $this->pluginQueryWhere[$pluginName])
		{
			// Set the internal data, which will get used in buildQueryWhere
			$this->pluginQueryWhere[$pluginName] = $whereClause;
			/* as we are modifying the main getData query, we need to make sure and
			 * clear table data, forcing next getData() to do the query again, no
cache
			*/
			$this->resetQuery();
		}
		// Return true just for the heck of it
		return true;
	}

	/**
	 * Plugins sometimes need to clear their where clauses
	 *
	 * @param   string  $pluginName  Plugin name
	 *
	 * @return  bool
	 */
	public function unsetPluginQueryWhere($pluginName)
	{
		if (array_key_exists($pluginName, $this->pluginQueryWhere))
		{
			unset($this->pluginQueryWhere[$pluginName]);
		}

		return true;
	}

	/**
	 * If all filters are set to read only then don't return a clear
button
	 * otherwise do
	 *
	 * @return  string	clear filter button link
	 */
	public function getClearButton()
	{
		$filters = $this->getFilters('listform_' .
$this->getRenderContext(), 'list');
		$params = $this->getParams();

		if (count($filters) > 0 ||
$params->get('advanced-filter'))
		{
			$displayData = new stdClass;
			$displayData->tmpl = $this->getTmpl();
			$layout = $this->getLayout('list.fabrik-clear-button');

			return $layout->render($displayData);
		}
		else
		{
			return '';
		}
	}

	/**
	 * Get the join display mode - merge, normal or reduce
	 *
	 * @return  string	1 if merge, 2 if reduce, 0 if no merge or reduce
	 */
	public function mergeJoinedData()
	{
		$params = $this->getParams();
		$display = $params->get('join-display', '');

		switch ($display)
		{
			case 'merge':
				$merge = 1;
				break;
			case 'reduce':
				$merge = 2;
				break;
			default:
				$merge = 0;
				break;
		}

		return $merge;
	}

	/**
	 * Ask each element to preFormatFormJoins() for $data
	 *
	 * @param   array  &$data  to pre-format
	 *
	 * @return  void
	 */
	protected function preFormatFormJoins(&$data)
	{
		$form = $this->getFormModel();
		$this->_aLinkElements = array();

		// $$$ hugh - temp foreach fix
		$groups = $form->getGroupsHiarachy();
		$ec = count($data);

		foreach ($groups as $groupModel)
		{
			/*
			 * $$$ rob 29/10/2012 - see
http://fabrikar.com/forums/showthread.php?t=28830
			* Calc may be set to show in list via menu item, but
groupModel::getPublishedListElements() doesn't know
			* this. Seems best to run all calcs regardless of whether they are set
to show in list.
			*/
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$col = $elementModel->getFullName(true, false);

				if (!empty($data) && property_exists($data[0], $col))
				{
					for ($i = 0; $i < $ec; $i++)
					{
						$thisRow = $data[$i];
						$colData = $thisRow->$col;
						$data[$i]->$col = $elementModel->preFormatFormJoins($colData,
$thisRow);
					}
				}
			}
		}
	}

	/**
	 * Get the list's primary key field. Takes its value from the admin
form options (so no inspection of the actual db
	 * table)
	 *
	 * @param  bool  $step  False return dot syntax, true uses ___
	 *
	 * @return string
	 */
	public function getPrimaryKey($step = false)
	{
		$k = $this->getTable()->db_primary_key;

		if ($step)
		{
			$k = FabrikString::safeColNameToArrayKey($k);
		}

		return $k;
	}

	/**
	 * $$$ rob 19/10/2011 now called before formatData() from getData() as
otherwise element tips (created in element->renderListData())
	 * only contained first merged records data and not all merged records
	 *
	 * Collapses 'repeated joined' rows into a single row.
	 * If a group is not repeating we just use the first row's data (as
subsequent rows will contain the same data
	 * Otherwise if the group is repeating we append each repeated
record's data into the first row's data
	 * All rows except the first row for each group are then unset (as unique
subsequent row's data will be contained within
	 * the first row)
	 *
	 * @param   array  &$data  list data
	 *
	 * @return  void
	 */
	protected function formatForJoins(&$data)
	{
		$merge = $this->mergeJoinedData();

		if (empty($merge))
		{
			return;
		}

		$dbPrimaryKey = $this->getPrimaryKey(true);
		$formModel = $this->getFormModel();
		$db = $this->getDb();
		FabrikHelperHTML::debug($data, 'render:before formatForJoins');

		$last_pk = '';
		$last_i = 0;
		$count = count($data);
		$canRepeats = array();
		$canRepeatsTables = array();
		$canRepeatsKeys = array();
		$canRepeatsPkValues = array();
		$remove = array();
		$first_pk_i = array();

		if (empty($data))
		{
			return;
		}
		/* First, go round first row of data, and prep some stuff.
		 * Basically, if doing a "reduce data" merge (merge == 2), we
need to know what the
		* PK element is for each joined group (well, for each element, really)
		*/
		foreach ($data[0] as $key => $val)
		{
			$shortKey = FabrikString::rtrimword($key, '_raw');
			/* $$$ hugh - had to cache this stuff, because if you have a lot of rows
and a lot of elements,
			 * doing this many hundreds of times causes huge slowdown, exceeding max
script execution time!
			* And we really only need to do it once for the first row.
			*/
			if (!isset($canRepeats[$shortKey]))
			{
				$elementModel = $formModel->getElement($shortKey);

				// $$$ rob - testing for linking join which is repeat but linked join
which is not - still need separate info from linked to join
				// $canRepeats[$shortKey] = $elementModel ?
($elementModel->getGroup()->canRepeat()) : 0;
				if ($merge == 2 && $elementModel)
				{
					if ($elementModel->getGroup()->canRepeat() ||
$elementModel->getGroup()->isJoin())
					{
						// We need to work out the PK of the joined table.
						// So first, get the table name.
						$group = $elementModel->getGroup();
						$join = $group->getJoinModel()->getJoin();
						$join_table_name = $join->table_join;

						// We have the table name, so see if we already have it cached ...
						if (!isset($canRepeatsTables[$join_table_name]))
						{
							// We don't have it yet, so grab the PK
							$keys = $this->getPrimaryKeyAndExtra($join_table_name);

							if (!empty($keys) && array_key_exists('key',
$keys[0]))
							{
								// OK, now we have the PK for the table
								$canRepeatsTables[$join_table_name] = $keys[0];
							}
							else
							{
								// $$$ hugh - might be a view, so Hail Mary attempt to get PK
								$query = $db->getQuery(true);
								$query->select('db_primary_key')->from('#__fabrik_lists')
								->where('db_table_name = ' .
$db->q($join_table_name));
								$db->setQuery($query);
								$joinPk = $db->loadResult();

								if (!empty($joinPk))
								{
									$canRepeatsTables[$join_table_name] = array('colname'
=> FabrikString::shortColName($joinPk));
								}
							}
						}
						// Hopefully we now have the PK
						if (isset($canRepeatsTables[$join_table_name]))
						{
							$canRepeatsKeys[$shortKey] = $join_table_name . '___' .
$canRepeatsTables[$join_table_name]['colname'];
						}

						$crk_sk = $canRepeatsKeys[$shortKey];

						// Create the array if it doesn't exist
						if (!isset($canRepeatsPkValues[$crk_sk]))
						{
							$canRepeatsPkValues[$crk_sk] = array();
						}
						// Now store the
						if (!isset($canRepeatsPkValues[$crk_sk][0]) and
isset($data[0]->$crk_sk))
						{
							$canRepeatsPkValues[$crk_sk][0] = $data[0]->$crk_sk;
						}
					}
				}

				$canRepeats[$shortKey] = $elementModel ?
($elementModel->getGroup()->canRepeat() ||
$elementModel->getGroup()->isJoin()) : 0;
			}
		}

		for ($i = 0; $i < $count; $i++)
		{
			// $$$rob if rendering J article in PDF format __pk_val not in pdf table
view
			$next_pk = isset($data[$i]->__pk_val) ? $data[$i]->__pk_val :
$data[$i]->$dbPrimaryKey;


			//if (!empty($last_pk) && ($last_pk == $next_pk))
			if (array_key_exists($next_pk, $first_pk_i))
			{
				foreach ($data[$i] as $key => $val)
				{
					$origKey = $key;
					$shortKey = FabrikString::rtrimword($key, '_raw');

					if ($canRepeats[$shortKey])
					{
						if ($merge == 2
							&&
!isset($canRepeatsPkValues[$canRepeatsKeys[$shortKey]][$i])
							&& isset($data[$i]->{$canRepeatsKeys[$shortKey]}))
						{
							$canRepeatsPkValues[$canRepeatsKeys[$shortKey]][$i] =
$data[$i]->{$canRepeatsKeys[$shortKey]};
						}

						if ($origKey == $shortKey)
						{
							/* $$$ rob - this was just appending data with a <br> but as
we do thie before the data is formatted
							 * it was causing all sorts of issues for list rendering of links,
dates etc. So now turn the data into
							* an array and at the end of this method loop over the data to
encode the array into a json object.
							*/
							$do_merge = true;

							if ($merge == 2)
							{
								$pk_vals =
array_count_values(array_filter($canRepeatsPkValues[$canRepeatsKeys[$shortKey]]));

								if (isset($data[$i]->{$canRepeatsKeys[$shortKey]}))
								{
									if ($pk_vals[$data[$i]->{$canRepeatsKeys[$shortKey]}] > 1)
									{
										$do_merge = false;
									}
								}
							}

							if ($do_merge)
							{
								/* The raw data is not altererd at the moment - not sure that that
seems correct but can't see any issues
								 * with it currently
								* $$$ hugh - added processing of raw data, needed for _raw
placeholders
								* in things like custom links
								*/
								/*
								$data[$last_i]->$key = (array) $data[$last_i]->$key;
								array_push($data[$last_i]->$key, $val);
								*/
								$data[$first_pk_i[$next_pk]]->$key = (array)
$data[$first_pk_i[$next_pk]]->$key;

								// if first occurrence is null, casting to array will give empty
array
								if (count($data[$first_pk_i[$next_pk]]->$key) === 0)
								{
									array_push($data[$first_pk_i[$next_pk]]->$key, null);
								}

								array_push($data[$first_pk_i[$next_pk]]->$key, $val);

								$rawKey = $key . '_raw';

								if (isset($data[$i]->$rawKey))
								{
									$rawval = $data[$i]->$rawKey;
									/*
									$data[$last_i]->$rawKey = (array) $data[$last_i]->$rawKey;
									array_push($data[$last_i]->$rawKey, $rawval);
									*/
									$data[$first_pk_i[$next_pk]]->$rawKey = (array)
$data[$first_pk_i[$next_pk]]->$rawKey;
									array_push($data[$first_pk_i[$next_pk]]->$rawKey, $rawval);
								}
							}
						}
						else
						{
							/* $$$ hugh - don't think we need this, now we're
processing _raw data?
							 if (!is_array($data[$last_i]->$origKey)) {
							$json= $val;
							$data[$last_i]->$origKey = json_encode($json);
							}
							*/
						}
					}
				}

				$remove[] = $i;
				continue;
			}
			else
			{
				$first_pk_i[$next_pk] = $i;

				if ($merge == 2)
				{
					foreach ($data[$i] as $key => $val)
					{
						$origKey = $key;
						$shortKey = FabrikString::rtrimword($key, '_raw');

						if ($canRepeats[$shortKey]
							&&
!isset($canRepeatsPkValues[$canRepeatsKeys[$shortKey]][$i])
							&& isset($data[$i]->{$canRepeatsKeys[$shortKey]}))
						{
							$canRepeatsPkValues[$canRepeatsKeys[$shortKey]][$i] =
$data[$i]->{$canRepeatsKeys[$shortKey]};
						}
					}
				}

				$last_i = $i;

				// $$$rob if rendering J article in PDF format __pk_val not in pdf
table view
				$last_pk = $next_pk;
			}
			// $$$ rob ensure that we have a sequential set of keys otherwise ajax
json will turn array into object
			$data = array_values($data);
		}

		for ($c = count($remove) - 1; $c >= 0; $c--)
		{
			unset($data[$remove[$c]]);
		}
		// $$$ rob loop over any data that was merged into an array and turn that
into a json object
		foreach ($data as $gKey => $d)
		{
			foreach ($d as $k => $v)
			{
				if (is_array($v))
				{
					$notNull = false;

					foreach ($v as &$v2)
					{
						if ($v2 !== null)
						{
							$notNull = true;
							$v2 = FabrikWorker::JSONtoData($v2);
						}
					}

					if ($notNull)
					{
						$v               = json_encode($v);
						$data[$gKey]->$k = $v;
					}
					else
					{
						$data[$gKey]->$k = "";
					}
				}
			}
		}

		$data = array_values($data);
	}

	/**
	 * Does the list model have an associated table (can occur when form model
	 * which does not store in db, gets its list model)
	 *
	 * @return boolean
	 */
	public function noTable()
	{
		$id = $this->getId();

		return (bool) empty($id);
	}

	/**
	 * Save an individual element value to the fabrik db
	 *
	 * @param   string  $rowId  row id
	 * @param   string  $key    key
	 * @param   string  $value  value
	 *
	 * @return  void
	 */
	public function storeCell($rowId, $key, $value)
	{
		$data[$key] = $value;

		// Ensure the primary key is set in $data
		$primaryKey = FabrikString::shortColName($this->getPrimaryKey());
		$primaryKey = str_replace("`", "", $primaryKey);

		if (!isset($data[$primaryKey]))
		{
			$data[$primaryKey] = $rowId;
		}

		$this->storeRow($data, $rowId);
	}

	/**
	 * Increment a value in a cell
	 *
	 * @param   string  $rowId  Row's id
	 * @param   string  $key    Field to increment
	 * @param   string  $dir    -1/1 etc
	 *
	 * @return  bool
	 */
	public function incrementCell($rowId, $key, $dir)
	{
		$db = $this->getDb();
		$table = $this->getTable();
		$query = "UPDATE $table->db_table_name SET $key = COALESCE($key,
0)  + $dir WHERE $table->db_primary_key = " . $db->q($rowId);
		$db->setQuery($query);

		return $db->execute();
	}

	/**
	 * Set model sate
	 *
	 * @return  void
	 */
	protected function populateState()
	{
		$input = $this->app->getInput();

		if (!$this->app->isClient('administrator'))
		{
			// Load the menu item / component parameters.
			$params = $this->app->getParams();
			$this->setState('params', $params);

			// Load state from the request.
			$pk = $input->getInt('listid',
$params->get('listid'));
		}
		else
		{
			$pk = $input->getInt('listid');
		}

		$this->setState('list.id', $pk);
		$offset = $input->getInt('limitstart');
		$this->setState('list.offset', $offset);
	}

	/**
	 * Get the output format
	 *
	 * @return  string	Outputformat
	 */
	public function getOutPutFormat()
	{
		return $this->outputFormat;
	}

	/**
	 * Set the list output format
	 *
	 * @param   string  $f  Format html/pdf/raw/csv
	 *
	 * @return  void
	 */
	public function setOutputFormat($f)
	{
		$this->outputFormat = $f;
	}

	/**
	 * Update a series of rows with a key = val , works across joined tables
	 *
	 * @param   array   $ids         Pk values to update
	 * @param   string  $col         Key to update should be in format
'table.element'
	 * @param   string  $val         Val to set to
	 * @param   string  $update      Optional update statement, over-rides
$col = null
	 * @param   mixed   $joinPkVal   If deleting a joined record, this value
can specify which joined row to update
	 *                               if left blank then all rows are updated.
	 *
	 * @return  void
	 */

	public function updateRows($ids, $col, $val, $update = '',
$joinPkVal = null)
	{
		if (empty($col) && empty($update))
		{
			return;
		}

		if (empty($ids))
		{
			return;
		}

		$db = $this->getDb();
		$this->getPagination(1, 0, 1);
		$data = $this->getData();

		// $$$ rob don't un-shift as this messes up for grouped data
		// $data = array_shift($data);
		$table = $this->getTable();

		$update = $update == '' ? $col . ' = ' .
$db->q($val) : $update;
		$colBits = explode('.', $col);
		$tbl = array_shift($colBits);

		$joinFound = false;
		// $joins = $this->getJoins();

		// If the update element is in a join replace the key and table name with
the join table's name and key
		$groupModels = $this->getFormGroupElementData();

		foreach ($groupModels as $groupModel)
		{
			if ($groupModel->isJoin())
			{
				$joinModel = $groupModel->getJoinModel();
				$join = $joinModel->getJoin();

				if ($tbl === $join->table_join)
				{
					$joinFound = true;
					$k = $joinModel->getForeignID();
					$dbk = $db->qn($joinModel->getForeignID('.'));
					$db_table_name = $tbl;

					foreach ($data as $groupData)
					{
						foreach ($groupData as $d)
						{
							$v = $d->{$k . '_raw'};

							if ($v != '')
							{
								$ids[] = $db->q($v);
							}
						}
					}
					$ids = array_unique($ids);

					if (!empty($ids))
					{
						$query = $db->getQuery(true);
						$ids = implode(',', $ids);
						$query->update($db_table_name)->set($update);

						if (!is_null($joinPkVal))
						{
							$query->where($dbk . ' = ' . $db->q($joinPkVal));
						} else
						{
							$query->where($dbk . ' IN (' . $ids . ')');
						}

						$db->setQuery($query);
						$db->execute();
					}
				}
			}
		}

		if (!$joinFound)
		{
			$ids = ArrayHelper::toInteger($ids);
			$ids = implode(',', $ids);
			$dbk = $k = $table->db_primary_key;
			$db_table_name = $table->db_table_name;
			$query = $db->getQuery(true);
			$query->update($db_table_name)->set($update)->where($dbk .
' IN (' . $ids . ')');
			$db->setQuery($query);
			$db->execute();
		}
	}

	/**
	 * Update a single row with a key = val, does NOT work across joins, main
table only
	 *
	 * @param   array   $id      Pk value to update
	 * @param   string  $col     Key to update should be in format
'table.element'
	 * @param   string  $val     Val to set to
	 *
	 * @return  void
	 */
	public function updateRow($id, $col, $val)
	{
		$field = FabrikString::shortColname($col);

		if (empty($field) || empty($id))
		{
			return;
		}

		$db = $this->getDb();
		$table = $this->getTable();
		$query = $db->getQuery(true);
		$query
			->update($db->qn($table->db_table_name))
			->set($db->qn($field) . ' = ' . $db->q($val))
			->where($table->db_primary_key . ' = ' .
$db->q($id));
		$db->setQuery($query);
		$db->execute();
	}

	/**
	 * unset a series of model properties
	 *
	 * @return  void
	 */
	public function reset()
	{
		unset($this->whereSQL);
		unset($this->table);
		unset($this->filters);
		unset($this->prefilters);
		unset($this->params);
		unset($this->viewfilters);

		// $$$ hugh - added some more stuff to clear, as per:
		// http://fabrikar.com/forums/showthread.php?p=115122#post115122
		unset($this->asfields);
		unset($this->formModel);
		unset($this->filterModel);
		unset($this->searchAllAsFields);
		unset($this->joinsSQL);
		unset($this->joins);
		unset($this->orderBy);
		unset($this->_joinsNoCdd);
		unset($this->elements);
		unset($this->data);
		unset($this->tmpl);
		unset($this->selectedOrderFields);
	}

	/**
	 * make sure a new getData query wil recreate data and query from scratch
	 *
	 * @return  void
	 */
	public function resetQuery()
	{
		unset($this->whereSQL);
		unset($this->orderBy);
		unset($this->data);
	}

	/**
	 * Get the lists <table> class
	 *
	 * @return string
	 */
	public function htmlClass()
	{
		$params = $this->getParams();
		$class = array('table');

		if ($params->get('bootstrap_stripped_class', true))
		{
			$class[] = 'table-striped';
		}

		if ($params->get('bootstrap_bordered_class'))
		{
			$class[] = 'table-bordered';
		}

		if ($params->get('bootstrap_condensed_class'))
		{
			$class[] = 'table-condensed table-sm ';
		}

		if ($params->get('bootstrap_hover_class', true))
		{
			$class[] = 'table-hover';
		}

		return implode(' ', $class);
	}

	/**
	 * Get the table template
	 *
	 * @since 3.0
	 *
	 * @return string template name
	 */
	public function getTmpl()
	{
		if (!isset($this->tmpl))
		{
			$input = $this->app->getInput();
			$item = $this->getTable();
			$params = $this->getParams();
			$document = Factory::getDocument();

			if ($this->app->isClient('administrator'))
			{
				$this->tmpl = $input->get('layout',
$params->get('admin_template'));
			}
			else
			{
				$this->tmpl = $input->get('layout',
$item->template);

				if ($this->app->scope !== 'mod_fabrik_list')
				{
					$this->tmpl =
FabrikWorker::getMenuOrRequestVar('fabriklayout', $this->tmpl,
$this->isMambot);
					/* $$$ rob 10/03/2012 changed menu param to listlayout to avoid the
list menu item
					 * options also being used for the form/details view template
					*/
					$this->tmpl = FabrikWorker::getMenuOrRequestVar(
						'listlayout',
						$this->tmpl,
						$this->isMambot,
						'menu',
						array(
							'listid' => $this->getId()
						)
					);
				}
			}

			if ($this->tmpl == '')
			{
				$this->tmpl = 'bootstrap';
			}

			/*
			if ($this->app->scope !== 'mod_fabrik_list')
			{
				$this->tmpl =
FabrikWorker::getMenuOrRequestVar('listlayout', $this->tmpl,
$this->isMambot);
			}
			*/

			if ($document->getType() === 'pdf')
			{
				$this->tmpl = $input->get('pdf_template',
$params->get('pdf_template', $this->tmpl));
			}

			// Migration test
//			if (FabrikWorker::j3())
//			{
				$modFolder = JPATH_SITE . '/templates/' .
$this->app->getTemplate() . '/html/com_fabrik/list/' .
$this->tmpl;
				$componentFolder = JPATH_SITE .
'/components/com_fabrik/views/list/tmpl/' . $this->tmpl;
/*
			}
			else
			{
				$modFolder = JPATH_SITE . '/templates/' .
$this->app->getTemplate() . '/themes/' . $this->tmpl;
				$componentFolder = JPATH_SITE .
'/components/com_fabrik/views/list/tmpl25/' . $this->tmpl;
			}
*/
			if (!Folder::exists($componentFolder) &&
!Folder::exists($modFolder))
			{
//				$this->tmpl = FabrikWorker::j3() ? 'bootstrap' :
'default';
				$this->tmpl = 'bootstrap';
			}
		}

		return $this->tmpl;
	}

	/**
	 * Set the lists elements' tempate to that of the list's
	 *
	 * @return  void
	 */
	protected function setElementTmpl()
	{
		$tmpl = $this->getTmpl();
		$groups = $this->getFormModel()->getGroupsHiarachy();
		$params = $this->getParams();

		foreach ($groups as $groupModel)
		{
			if (($params->get('group_by_template', '') !==
'' && $this->getGroupBy() != '') ||
$this->outputFormat == 'csv'
				|| $this->outputFormat == 'feed')
			{
				$elementModels = $groupModel->getPublishedElements();
			}
			else
			{
				$elementModels = $groupModel->getPublishedListElements();
			}

			foreach ($elementModels as $elementModel)
			{
				$elementModel->tmpl = $tmpl;
			}
		}
	}

	/**
	 * Short cut to test if the lists connection is the same as the Joomla
database
	 *
	 * @return bool
	 */
	public function inJDb()
	{
		return $this->getConnection()->isJdb();
	}

	/**
	 * Checks : J template html override css file then fabrik list tmpl
template css file. Including them if found
	 *
	 * @since 3.0 loads lists's css files
	 *
	 * @return  void
	 */
	public function getListCss()
	{
		$tmpl = $this->getTmpl();
//		$jTmplFolder = FabrikWorker::j3() ? 'tmpl' :
'tmpl25';
		$jTmplFolder = 'tmpl';

		// Check for a form template file (code moved from view)
		if ($tmpl != '')
		{
			$qs = '?c=' . $this->getRenderContext();

			// $$$rob need &amp; for pdf output which is parsed through xml
parser otherwise fails
			$qs .= '&amp;buttoncount=' . $this->rowActionCount;

			// $$$ hugh - adding format, so custom CSS can do things like adding
overrides for PDF
			$qs .= '&amp;format=' .
$this->app->getInput()->get('format', 'html');

			$overRide = 'templates/' . $this->app->getTemplate() .
'/html/com_fabrik/list/' . $tmpl . '/template_css.php'
. $qs;

			if (!FabrikHelperHTML::stylesheetFromPath($overRide))
			{
				FabrikHelperHTML::stylesheetFromPath('components/com_fabrik/views/list/'
. $jTmplFolder . '/' . $tmpl . '/template_css.php' .
$qs);
			}
			/* $$$ hugh - as per Skype conversation with Rob, decided to re-instate
the custom.css convention.  So I'm adding two files:
			 * custom.css - for backward compatibility with existing 2.x custom.css
			* custom_css.php - what we'll recommend people use for custom css
moving forward.
			*/
			if (!FabrikHelperHTML::stylesheetFromPath('templates/' .
$this->app->getTemplate() . '/html/com_fabrik/list/' .
$tmpl . '/custom.css' . $qs))
			{
				FabrikHelperHTML::stylesheetFromPath('components/com_fabrik/views/list/'
. $jTmplFolder . '/' . $tmpl . '/custom.css');
			}

			if (!FabrikHelperHTML::stylesheetFromPath('templates/' .
$this->app->getTemplate() . '/html/com_fabrik/list/' .
$tmpl . '/custom_css.php' . $qs))
			{
				$displayData              = new stdClass;
				$displayData->tmpl        = $tmpl;
				$displayData->qs          = $qs;
				$displayData->jTmplFolder = $jTmplFolder;
				$displayData->listModel   = $this;
				$layout = $this->getLayout('list.fabrik-custom-css-qs');
				$path = $layout->render($displayData);

				FabrikHelperHTML::stylesheetFromPath($path);
			}
		}
	}

	/**
	 * Get a unique list identifier (enables the same list to be rendered in
component and module at same time)
	 *
	 * @return  string
	 */
	public function getRenderContext()
	{
		if ($this->renderContext === '')
		{
			$this->setRenderContext($this->getId());
		}

		return $this->getId() . $this->renderContext;
	}

	/**
	 * Lists can be rendered in articles, as components and in modules
	 * we need to set a unique reference for them to avoid conflicts
	 *
	 * @param   int  $id  Module/component list id
	 *
	 * @return  void
	 */
	public function setRenderContext($id = null)
	{
		$input = $this->app->getInput();
		$task = $input->getCmd('task');
		$scope = $this->app->scope;

		/**
		 * Meh, nasty hack for nasty gotcha.  If a list is being rendered in a
content plugin inside a form (intro /
		 * outro), the app scope will be com_fabrik.  If that plugin sets a
'jpluginfilter' (foo___bar=XYZ), that
		 * filter will be stored with a com_fabrik render context, and will then
get applied in the component view
		 * of that list.  When we run plugins, we already set 'option'
input to com_content.  So let's check to see if
		 * we have a scope of com_fabrik, and an 'option' of something
else.  If so, use the 'option' as the scope.
		 */
		if ($input->get('option', 'com_fabrik') !==
'com_fabrik' && $this->app->scope ===
'com_fabrik')
		{
			$scope = $input->get('option');
		}

		if (!empty($task) && strstr($task, '.'))
		{
			$task = explode('.', $task);
			$task = array_pop($task);
		}

		// $$$ rob if admin filter task = filter and not list.filter
		if ($task == 'filter' ||
($this->app->isClient('administrator') &&
$input->get('task') == 'filter'))
		{
			$this->setRenderContextFromRequest();
		}
		else
		{
			$task = $input->getString('task');
			if ((($task == 'list.view' || $task == 'list.delete'
|| $task === 'view' || $task == 'list.doPlugin')
&& $input->get('format') == 'raw')
				|| $input->get('layout') == '_advancedsearch' ||
$task === 'list.elementFilter'
				|| $input->get('setListRefFromRequest') == 1)
			{
				// Testing for ajax nav in content plugin or in advanced search
				$this->setRenderContextFromRequest();
			}
			else
			{
				$this->renderContext = '_' . $scope . '_' . $id;
			}
		}

		if ($this->renderContext == '')
		{
			$this->renderContext = '_' . $scope . '_' . $id;
		}
	}

	/**
	 * When dealing with ajax requests filtering etc we want to take the
listref from the
	 * request array
	 *
	 * @return  string	listref
	 */

	protected function setRenderContextFromRequest()
	{
		$listRef = $this->app->getInput()->get('listref',
'');

		if ($listRef === '')
		{
			$this->renderContext = '';
		}
		else
		{
			$listRef = explode('_', $listRef);
			array_shift($listRef);
			$this->renderContext = '_' . implode('_',
$listRef);
		}

		return $this->renderContext;
	}

	/**
	 * Get lists group by headings
	 *
	 * @return   array  heading names
	 */
	public function getGroupByHeadings()
	{
		$formModel = $this->getFormModel();
		$input = $this->app->getInput();
		$base = JURI::getInstance();
		$base = $base->toString(array('scheme', 'user',
'pass', 'host', 'port', 'path'));
		$qs = $input->server->get('QUERY_STRING', '',
'string');

		if (!empty($qs) && StringHelper::stristr($qs,
'group_by'))
		{
			$qs = FabrikString::removeQSVar($qs, 'group_by');
			$qs = FabrikString::ltrimword($qs, '?');
			$qs = str_replace('&', '&amp;', $qs);
		}

		$url = $base;

		if (!empty($qs))
		{
			$url .= StringHelper::strpos($url, '?') !== false ?
'&amp;' : '?';
			$url .= $qs;
		}

		$url .= StringHelper::strpos($url, '?') !== false ?
'&amp;' : '?';
		$a = array();
		list($h, $x, $b, $c) = $this->getHeadings();
		$o = new stdClass;
		$o->label = Text::_('COM_FABRIK_NONE');
		$o->group_by = '';
		$a[$url . 'group_by=0'] = $o;

		foreach ($h as $key => $v)
		{
			if (!in_array($key, array('fabrik_select',
'fabrik_edit', 'fabrik_view',
'fabrik_delete', 'fabrik_actions')))
			{
				/**
				 * $$$ hugh - other junk is showing up in $h, like
85___14-14-86_list_heading, or element
				 * names ending in _form_heading.  May not be the most efficient
method, but we need to
				 * test if $key exists as an element, as well as the simple in_array()
test above.
				 */

				if ($formModel->hasElement($key, false, false))
				{
					$thisUrl = $url . 'group_by=' . $key;
					$o = new stdClass;
					$o->label = strip_tags($v);
					$o->group_by = $key;
					$a[$thisUrl] = $o;
				}
			}
		}

		return $a;
	}

	/**
	 * Get a list of elements to export in the csv file.
	 *
	 * @since 3.0b
	 *
	 * @return array full element names.
	 */
	public function getCsvFields()
	{
		$params = $this->getParams();
		$formModel = $this->getFormModel();
		$csvFields = array();

		if ($params->get('csv_which_elements', 'selected')
== 'visible')
		{
			$csvIds = $this->getAllPublishedListElementIDs();
		}
		elseif ($params->get('csv_which_elements',
'selected') == 'all')
		{
			// Export code will export all, if list is empty
			$csvIds = array();
		}
		elseif ($params->get('csv_elements') == '' ||
$params->get('csv_elements') == 'null')
		{
			$csvIds = array();
		}
		else
		{
			$csvIds =
json_decode($params->get('csv_elements'))->show_in_csv;
		}

		foreach ($csvIds as $id)
		{
			if ($id !== '')
			{
				$elementModel = $formModel->getElement($id, true);

				if ($elementModel !== false)
				{
					$csvFields[$elementModel->getFullName(true, false)] = 1;
				}
			}
		}

		return $csvFields;
	}

	/**
	 * Helper function for view to determine if filters should be shown
	 *
	 * @return  bool
	 */
	public function getShowFilters()
	{
		$filters = $this->getFilters('listform_' .
$this->getRenderContext());
		$params = $this->getParams();
		$filterMode = (int) $params->get('show-table-filters');

		return (count($filters) > 0 && $filterMode !== 0) &&
$this->app->getInput()->get('showfilters', 1) == 1 ?
true : false;
	}

	/**
	 * Get the number of buttons that are rendered for the list
	 *
	 * @return  number
	 */
	protected function getButtonCount()
	{
		$buttonCount = 0;

		return $buttonCount;
	}

	/**
	 * Helper view function to determine if any buttons are shown
	 *
	 * @return  bool
	 */
	public function getHasButtons()
	{
		$params = $this->getParams();

		if (($this->canAdd() &&
$params->get('show-table-add')) || $this->getShowFilters()
			|| $this->advancedSearch->link() || $this->canGroupBy() ||
$this->canCSVExport()
			|| $this->canCSVImport() || $params->get('rss') ||
$params->get('pdf') || $this->canEmpty())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Compacts the ordering sequence of the selected records
	 *
	 * @param   string  $colId  column name to order on
	 * @param   string  $where  additional where query to limit ordering to a
particular subset of records
	 *
	 * @since   3.0.5
	 *
	 * @return  bool
	 */
	public function reorder($colId, $where = '')
	{
		$elementModel = $this->getFormModel()->getElement($colId, true);
		$asFields = array();
		$fields = array();
		$elementModel->getAsField_html($asFields, $fields);
		$col = $asFields[0];
		$field = explode("AS", $col);
		$field = array_shift($field);
		$db = $this->getDb();
		$k = $this->getPrimaryKey();
		$tbl = $this->getTable()->db_table_name;

		// Get the primary keys and ordering values for the selection.
		$query = $db->getQuery(true);
		$query->select($k . ' AS id, ' . $field . ' AS
ordering');
		$query->from($tbl);
		$query->where($field . ' >= 0');
		$query->order($field);

		// Setup the extra where and ordering clause data.
		if ($where)
		{
			$query->where($where);
		}

		$db->setQuery($query);
		$rows = $db->loadObjectList();

		// Compact the ordering values.
		foreach ($rows as $i => $row)
		{
			// Only update rows that are necessary.
			if ($row->ordering != $i + 1)
			{
				// Update the row ordering field.
				$query = $db->getQuery(true);
				$query->update($tbl);
				$query->set($field . ' = ' . ($i + 1));
				$query->where($k . ' = ' . $db->q($row->id));
				$db->setQuery($query);
				$db->execute();
			}
		}

		return true;
	}

	/**
	 * Load the JS files into the document
	 *
	 * @param   array  &$scripts  reference: js script srcs to load in the
head
	 *
	 * @return  null
	 */
	public function getCustomJsAction(&$scripts)
	{
		$scriptKey = 'list_' . $this->getId();

		if (File::exists(COM_FABRIK_FRONTEND . '/js/table_' .
$this->getId() . '.js'))
		{
			$scripts[$scriptKey] = 'components/com_fabrik/js/table_' .
$this->getId() . '.js';
		}

		if (File::exists(COM_FABRIK_FRONTEND . '/js/list_' .
$this->getId() . '.js'))
		{
			$scripts[$scriptKey] = 'components/com_fabrik/js/list_' .
$this->getId() . '.js';
		}
	}

	/**
	 * When saving an element it can effect the list parameters, update them
here.
	 *
	 * @param   object  $elementModel  element model
	 *
	 * @deprecated since 3.0b
	 *
	 * @since 3.0.6
	 *
	 * @return  void
	 */
	public function updateFromElement($elementModel)
	{
	}

	/**
	 * Get / set formatAll, which forces formatData() to ignore 'show in
table'
	 * and just format everything, needed by things like the table email
plugin.
	 * If called without an arg, just returns current setting.
	 *
	 * $$$ hugh - doesn't work, now that finesseData() is called via
call_user_func().
	 *
	 * @param   bool  $format_all  optional arg to set format
	 *
	 * @return  bool
	 */
	public function formatAll($format_all = null)
	{
		if (isset($format_all))
		{
			$this->format_all = $format_all;
		}

		return $this->format_all;
	}

	/**
	 * Copy rows
	 *
	 * @param   mixed  $ids  array or string of row ids to copy
	 *
	 * @since	3.0.6
	 *
	 * @return  bool	all rows copied (true) or false if a row copy fails.
	 */
	public function copyRows($ids)
	{
		$ids = (array) $ids;
		$formModel = $this->getFormModel();
		$formModel->copyingRow(true);
		$state = true;

		foreach ($ids as $id)
		{
			$formModel->rowId = $id;
			$formModel->unsetData();
			$row = $formModel->getData();
			$formModel->copyFromRaw($row, true);
			$row['Copy'] = '1';
			$row['fabrik_copy_from_table'] = '1';
			$formModel->formData = $row;

			if (!$formModel->process())
			{
				$state = false;
			}
		}

		return $state;
	}

	/**
	 * Return an array of element ID's of all published and visible list
elements
	 * Created to call from GetCsvFields()
	 *
	 * @return   array  array of element IDs
	 */
	public function getAllPublishedListElementIDs()
	{
		$ids = array();
		$form = $this->getFormModel();
		$groups = $form->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedListElements();

			foreach ($elementModels as $key => $elementModel)
			{
				$ids[] = $elementModel->getId();
			}
		}

		return $ids;
	}

	/**
	 * Return an array of elements which are set to always render
	 *
	 * @param   bool  $not_shown_only  Only return elements which have
'always render' enabled, AND are not displayed in the list
	 * @param   int   $groupid         Only return elements in this group
	 *
	 * @return  bool  array of element models
	 */
	public function getAlwaysRenderElements($not_shown_only = true, $groupId =
0)
	{
		$form = $this->getFormModel();
		$alwaysRender = array();
		$groups = $form->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			if ($groupId)
			{
				if ($groupModel->getId() !== $groupId)
				{
					continue;
				}
			}

			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				if ($elementModel->isAlwaysRender($not_shown_only))
				{
					$alwaysRender[] = $elementModel;
				}
			}
		}

		return $alwaysRender;
	}

	/**
	 * Does the list have any 'always render' elements?
	 *
	 * @return   bool
	 */
	public function hasAlwaysRenderElements()
	{
		$alwaysRender = $this->getAlwaysRenderElements();

		return !empty($alwaysRender);
	}

	/**
	 * Get the name of the tab field
	 *
	 * @return string  tablename___elementname
	 */
	private function getTabField()
	{
		if (!isset($this->tabsField))
		{
			$params = $this->getParams();
			$tabsField = $params->get('tabs_field', '');
			$this->tabsField = FabrikString::safeColNameToArrayKey($tabsField);
		}

		return $this->tabsField;
	}

	/**
	 * Get tab categories and merge as necessary to get down to tab limit
	 *
	 * @return   array  Tabs
	 */
	private function getTabCategories()
	{
		/**
		 * 2013-07-19 Paul - This function determines the tabs to be shown at the
top of the list table.
		 * The tabs are defined by the contents of a user specified field e.g for
alphabetic tabs you might
		 * use a calc field with the first character of a surname.
		 * To prevent a list of
		 **/
		$params = $this->getParams();
		$tabsField = $tabsElName = $this->getTabField();

		if (empty($tabsField))
		{
			return array();
		}

		list($tableName, $tabsField) = explode('___', $tabsField);
		$table = $this->getTable();

		if ($tableName != $table->db_table_name)
		{
			$this->app->enqueueMessage(sprintf(Text::_('COM_FABRIK_LIST_TABS_TABLE_ERROR'),
$tableName, $table->db_table_name), 'error');

			return array();
		}

		$tabsMax = (int) $params->get('tabs_max', 10);
		$tabsAll = (bool) $params->get('tabs_all', '1');

		// @FIXME - starting to implement code to handle join elements, not
cooked yet

		$formModel = $this->getFormModel();
		$elementModel = $formModel->getElement($tabsElName);
		$isDropdown = (is_subclass_of($elementModel,
'PlgFabrik_ElementDropdown') || get_class($elementModel) ==
'PlgFabrik_ElementDropdown');
		$is_join = (is_subclass_of($elementModel,
'PlgFabrik_ElementDatabasejoin') || get_class($elementModel) ==
'PlgFabrik_ElementDatabasejoin');
		if (!$is_join)
		{
			// Get values and count in the tab field
			$db = $this->getDb();
			$query = $db->getQuery(true);
			$query->select(array($tabsField, 'Count(' . $tabsField .
') as count'))
				->from($db->qn($table->db_table_name))
				->group($tabsField)
				->order($tabsField);
		}
		else
		{
			$this->app->enqueueMessage(sprintf(Text::_('COM_FABRIK_LIST_TABS_TABLE_ERROR'),
$tableName, $table->db_table_name), 'error');
			$joinTable = $elementModel->getJoinModel()->getJoin();
			$fullFk = $joinTable->table_join . '___' .
$joinTable->table_join_key;
			return array();
		}

		/**
		 * Filters include any existing tab filters - so we cannot calculate tabs
based on any user set filters
		 * or pre-filters, until we can exclude them from being used here.
		
$this->buildQueryWhere($this->app->getInput()->getInt('incfilters',
1), $query, false);
		 **/
		$db->setQuery($query);
		FabrikHelperHTML::debug($query->dump(), 'list getTabCategories
query:' . $table->label);
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark('before fabrik list tabs query
run') : null;
		$db->execute();
		$counts = $db->loadRowList();
		JDEBUG ? $profiler->mark('after fabrik list tabs query run')
: null;
		FabrikHelperHTML::debug($counts, 'list getTabCategories counts:
' . $table->label);

		if ($isDropdown) {
			/* Convert element values to names */
			foreach ($counts as $key => $count) {
				$counts[$key][0] =
$elementModel->getLabelForValue($counts[$key][0]);
			}
			/* Now sort it by these labels */
			usort($counts, function($a, $b) {
				return strcmp($a[0], $b[0]);
			});
		}
		
		/**
		 * We consolidate by finding the two consecutive rows with the smallest
total and merging them.
		 * To avoid excessive looping if user tabField is too fragmented, we
should skip tabs if
		 * we will iterate more than 100 times.
		 **/
		if (count($counts) - $tabsMax > 100)
		{
			$this->app->enqueueMessage(sprintf(Text::_('COM_FABRIK_LIST_TABS_MERGE_ERROR'),
count($counts), $tabsMax), 'notice');

			return array();
		}

		$tabs = array();

		if ($tabsAll)
		{
			// Set value to null to differentiate between all and empty string
values
			$tabs[] = array(Text::_('COM_FABRIK_LIST_TABS_ALL'), null);
		}

		while (count($counts) > $tabsMax)
		{
			/**
			 * Primary algorithm is to find the two consecutive rows whose total
count is smallest and merge them.
			 *
			 * If this turns out to be too time consuming in real-life scenarios, we
can add further optimisation
			 * by adding logic to the loop so that first time through it sums the
total of count, and
			 * second time through it merges any consecutive rows whose values total
less than a small proportion (say 1/4)
			 * of the total count / tabs. This will not be completely optimum but
will be a whole lot quicker for many small
			 * categories than the base iteration. Using 1/4 should result in no
more than 3 further iterations per tab to get to
			 * the number of tabs required. In this case we can probably remove the
test / error message above.
			 **/
			$minCount = 999999999;
			$minIndex = 0;

			for ($i = 1; $i < count($counts); $i++)
			{
				$totCount = $counts[$i - 1][1] + $counts[$i][1];

				if ($totCount < $minCount)
				{
					$minCount = $totCount;
					$minIndex = $i;
				}
			}

			// Merge mins
			$counts[$minIndex - 1][0] = (array) $counts[$minIndex - 1][0];
			$counts[$minIndex][0] = (array) $counts[$minIndex][0];
			$counts[$minIndex - 1][0] = array($counts[$minIndex - 1][0][0],
end($counts[$minIndex][0]));
			$counts[$minIndex - 1][1] += $counts[$minIndex][1];

			// Array_splice not working as advertised - working like array_slice for
some reason!!
			// $counts = array_splice($counts, $minIndex, 1);
			unset($counts[$minIndex]);
			$counts = array_values($counts);
		}

		JDEBUG ? $profiler->mark('after fabrik list tabs counts
merge') : null;
		FabrikHelperHTML::debug($counts, 'list getTabCategories merged
counts: ' . $table->label);

		for ($i = 0; $i < count($counts); $i++)
		{
			if (is_array($counts[$i][0]))
			{
				$tabs[] = array($counts[$i][0][0] . '-' . $counts[$i][0][1],
$counts[$i][0]);
			}
			else
			{
				$tabLabel = empty($counts[$i][0]) ? '-' : $counts[$i][0];
				$tabs[] = array($tabLabel, $counts[$i][0]);
			}
		}

		return $tabs;
	}

	/**
	 * Set the List's tab HTML
	 *
	 * @return  array  Tabs
	 */
	public function loadTabs()
	{ 
		$this->tabs = array();
		$tabs = $this->getTabCategories();

		if (!is_array($tabs) || empty($tabs))
		{
			return $this->tabs;
		}

		$package = $this->app->getUserState('com_fabrik.package',
'fabrik');
		$listId = $this->getId();
		$tabsField = $this->getTabField();
		if ($this->app->isClient('site')) {
			$menu = "menu".
$this->app->getMenu()->getActive()->id;
		} else {
			$menu = "admin".Factory::getUser()->id;
		}

		$inputArray = $this->app->getInput()->getArray();
		$isPagination = array_key_exists($this->session->getFormToken(),
$inputArray);

		/* get the default rows per page, menu then table then system, whichever
is first */
		$defaultRowsPerPage = "";
		if ($this->app->isClient('site')) {
			$defaultRowsPerPage =
$this->app->getMenu()->getActive()->getParams()->get('rows_per_page');
		}
		if (empty($defaultRowsPerPage)) {
			$defaultRowsPerPage = $this->getTable()->rows_per_page;
		}
		if (empty($defaultRowsPerPage)) {
			$defaultRowsPerPage = $this->app->get('list_limit', 10);
		}

		/* get the various current uri parts */
		$uri = JURI::getInstance();
		$uriActiveTab = $uri->getVar($tabsField, null);
		/* If the tabsField is an array then we are showing merged tabs, we need
the merged tabs names for the activeTabName */
		if (is_array($uriActiveTab)) {
			$uriActiveTab = implode('-',
$uriActiveTab['value']);
		}

		/* Null to indicate that the limitstart is not set in the url due to
direct menu access) */
		$ActiveTabLimitStart = FArrayHelper::getValue($inputArray,
'limitstart'.$listId, $uri->getVar('limitstart' .
$listId, null));	
		$ActiveTabLimit = FArrayHelper::getValue($inputArray,
'limit'.$listId, $uri->getVar('limit' . $listId,
null));

		/* Get the cached tabs */
		$context = 'com_'.$package.$menu.'list'.$listId;
		$cachedTabs =
unserialize($this->app->getUserState($context.'tabs'));

		if (empty($cachedTabs)) {
			$originalUri = clone($uri);
			/* Build the tabs array */
			foreach ($tabs as $i => $tabArray)
			{
				$row = new stdClass;
				list($label, $range) = $tabArray;
				$row->label = $label;
				$row->isAllTab = ($label ==
Text::_('COM_FABRIK_LIST_TABS_ALL'));
				
				if (is_null($range) || $row->isAllTab)
				{
					$originalUri->delVar($tabsField);
				}
				elseif (!is_array($range))
				{
					$originalUri->setVar($tabsField, urlencode($range));
				}
				else
				{
					list($low, $high) = $range;
					$row->mergeArray =
array('value'=>array(urlencode($low), urlencode($high)),
'condition' => 'BETWEEN');
					$originalUri->setVar($tabsField, $row->mergeArray);
				}
			
				$row->id = 'list_tabs_' . $this->getId() .
'_' . $i;
				$row->js = false;
				$originalUri->setVar('limit'.$listId,
is_null($ActiveTabLimit) ? $defaultRowsPerPage : $ActiveTabLimit);
				$originalUri->setVar('limitstart'.$listId,
is_null($ActiveTabLimitStart) ? 0 : $ActiveTabLimitStart);
				$row->href = $originalUri->toString();
				if ($i == 0) {
					$row->class='active';
				}
				$cachedTabs[$label] = $row;
			} 
		}
		/* Find which tab was last active */
		foreach($cachedTabs as $key => $data) {
			if (isset($data->class) && strpos($data->class,
'active') !== false) {
				$lastActiveTab = $key;
				break;
			}
		}

		/* Set the latest limits */
		$uri->setVar('limit'.$listId, is_null($ActiveTabLimit) ?
$defaultRowsPerPage : $ActiveTabLimit);
		$uri->setVar('limitstart'.$listId,
is_null($ActiveTabLimitStart) ? 0 : $ActiveTabLimitStart);

		/* Handle pagination, the pagination has already happened so are just
clearing this stuff from the uri */
		if ($isPagination) {
			$uri->setVar('clearordering', null);
			$uri->setVar('clearfilters', null);
			$uriActiveTab = $lastActiveTab;
		}
		/* Force a filter reset */
		$uri->setVar('resetfilters', 1);
		
		/* Clear this if we just processed a delete */
		$uri->setVar('fabrik_show_in_list', null);
		
		/* if we still do not have an active tab this must be the first call from
the menu, default to the first tab */
		if (is_null($uriActiveTab)) {
			$uriActiveTab = FArrayHelper::firstKey($cachedTabs);
		}

		/* If we have changed tabs, clear the last active tabs active class */
		if ($lastActiveTab != $uriActiveTab) {
				unset($cachedTabs[$lastActiveTab]->class); 
		}

		/* If the active tab is not the All tab, set the tabField to filter on */
		if ($cachedTabs[$uriActiveTab]->isAllTab != 1) {
			if (property_exists($cachedTabs[$uriActiveTab], 'mergeArray'))
{
				$uri->setVar($tabsField, $cachedTabs[$uriActiveTab]->mergeArray);
			} else {
				$uri->setVar($tabsField, $uriActiveTab);
			}
		}

		/* Update the active tab href and set it active */
		$cachedTabs[$uriActiveTab]->href = $uri->toString();
		$cachedTabs[$uriActiveTab]->class = 'active';

		/* When we first display the list the menu does not have the tabField
filter set
		 * so all the records are in the list. This is OK when there is an All
tab as it
		 * wants all the list data, but when no All tab we need to filter on the
tab field
		 * name of the first tab, so now that we have the href for the first tab
all set
		 * we will simply do a redirect to it and all should be well 
		 */
		if (is_null($ActiveTabLimitStart) && is_null($ActiveTabLimit)) {
			$this->app->redirect($cachedTabs[$uriActiveTab]->href);
		}
		
		$this->app->setUserState($context.'tabs',
serialize($cachedTabs));

		return $this->tabs = $cachedTabs;
	}

	/**
	 * Is the element selected for either 'OR user edit' or 'OR
use delete' acl
	 *
	 * @param   string  $name  Element full name
	 *
	 * @return boolean
	 */
	public function isUserDoElement($name)
	{
		$acl_types = array('allow_edit_details2',
'allow_delete2');
		$params = $this->getParams();

		foreach ($acl_types as $acl_type)
		{
			$userDoCol = $params->get($acl_type, '');

			if ($userDoCol != '')
			{
				$userDoCol = FabrikString::safeColNameToArrayKey($userDoCol);

				if ($userDoCol == $name)
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Build array for list toggle column feature
	 *
	 * @since 3.1rc3
	 *
	 * @return array
	 */
	public function toggleCols()
	{
		$w = new FabrikWorker;
		$formModel = $this->getFormModel();
		$groups = $formModel->getGroupsHiarachy();
		$showInList = $this->showInList();
		$cols = array();

		foreach ($groups as $groupModel)
		{
			if ($groupModel->canView('list') === false)
			{
				continue;
			}

			$elementModels = $groupModel->getPublishedListElements();

			if (count($elementModels) > 0)
			{
				$group = $groupModel->getGroup();
				$groupLabel = $w->parseMessageForPlaceHolder($group->label,
array(), false);
				$cols[$group->id]['name'] = $groupLabel;
				$cols[$group->id]['elements'] = array();

				foreach ($elementModels as $key => $elementModel)
				{
					$element = $elementModel->getElement();

					// If we define the elements to show in the list - e.g in admin list
module then only show those elements
					if (!empty($showInList) && !in_array($element->id,
$showInList))
					{
						continue;
					}

					$cols[$group->id]['elements'][$elementModel->getFullName(true,
false)] = $elementModel->getElement()->label;
				}
			}
		}

		return $cols;
	}

	/**
	 * Set the table label (title), overwrites table->label
	 *
	 * @since 3.4
	 *
	 * @param  string  $label  label to use for list
	 */
	public function setLabel($label)
	{
		$this->getTable()->label = $label;
	}

	/**
	 * Set the table label (title), overwrites table->label
	 *
	 * @since 3.4
	 *
	 * @param  string  $label  label to use for list
	 */
	public function getLabel()
	{
		return $this->getTable()->label;
	}

	/**
	 * Get a list LayoutInterface file
	 *
	 * @param   string  $type  form/details/list
	 * @param   array   $paths  Optional paths to add as includes
	 *
	 * @return LayoutFile
	 */
	public function getLayout($name, $paths = array(), $options = array())
	{
		$paths[] = COM_FABRIK_FRONTEND . '/views/list/tmpl/' .
$this->getTmpl() . '/layouts';
		$paths[] = COM_FABRIK_FRONTEND . '/views/list/tmpl/' .
$this->getTmpl() . '/layouts/list_' . $this->getId();
		$paths[] = JPATH_THEMES . '/' .
Factory::getApplication()->getTemplate() .
'/html/layouts/com_fabrik/list_' . $this->getId();
		$layout  = FabrikHelperHTML::getLayout($name, $paths, $options);

		return $layout;
	}

}
models/listfilter.php000064400000147320151165347420010740 0ustar00<?php
/**
 * Fabrik List Filter Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Factory;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;

/**
 * List filter model
 *
 * @package  Fabrik
 * @since    3.0
 */
class FabrikFEModelListfilter extends FabModel
{
	/**
	 * Request
	 *
	 * @var array
	 */
	protected $request = null;

	/**
	 * List model
	 *
	 * @var FabrikFEModelList
	 */
	protected $listModel;

	/**
	 * Set the list model
	 *
	 * @param   FabrikFEModelList  $model  list model
	 *
	 * @return  void
	 */
	public function setListModel($model)
	{
		$this->listModel = $model;
	}

	/**
	 * get the table from the listModel
	 *
	 * @param   string  $name     table name
	 * @param   string  $prefix   prefix name
	 * @param   array   $options  config
	 *
	 * @return void
	 */
	public function getTable($name = '', $prefix =
'Table', $options = array())
	{
		return $this->listModel->getTable();
	}

	/**
	 * $$$ rob activelistid set in content plugin only clear filters on active
list (otherwise with n tables in article all qs filters are removed)
	 *
	 * @return  bool - is the list currently being rendered the list that
initially triggered the filter
	 */
	protected function activeTable()
	{
		$input = $this->app->getInput();

		return $input->getInt('id') ==
$input->getInt('activelistid') ||
$input->get('activelistid') == '';
	}

	/**
	 * unset request
	 *
	 * @return  void
	 */
	public function destroyRequest()
	{
		unset($this->request);
	}

	/**
	 * This merges session data for the fromForm with any request data
	 * allowing us to filter data results from both search forms and filters
	 *
	 * @return array
	 */
	public function getFilters()
	{
		$input = $this->app->getInput();

		// Form or detailed views should not apply filters? what about
querystrings to set up the default values?
		if ($input->get('view') == 'details' ||
$input->get('view') == 'form')
		{
			$this->request = array();

			return $this->request;
		}

		if (isset($this->request))
		{
			return $this->request;
		}

		$profiler = Profiler::getInstance('Application');
		$filters = array();

		// $$$ rob clears all list filters, and does NOT apply any
		// other filters to the table, even if in querystring
		if ($input->getInt('clearfilters') === 1 &&
$this->activeTable())
		{
			$this->clearFilters();
			$this->request = array();

			return $this->request;
		}

		if ($input->get('replacefilters') == 1)
		{
			$this->clearFilters();
		}

		/**
		 * $$$ fehers The filter is cleared and applied at once without having to
clear it first and then apply it (would have to be two clicks).
		 * useful in querystring filters if you want to clear old filters and
apply new filters
		 */

		// $$$ rob 20/03/2011 - request resetfilters should overwrite menu option
- otherwise filter then nav will remove filter.
		if (
			!$input->get('incfilters', 0)
			&& (
			    $input->get('filterclear') == 1
                || FabrikWorker::getMenuOrRequestVar(
                    'resetfilters',
                    0,
                    false,
                    'request',
                    array('listid' =>
$this->listModel->getId())
                ) == 1
            )
			&& $this->activeTable())
		{
			$this->clearFilters();
		}

		JDEBUG ? $profiler->mark('listfilter:cleared') : null;

		// Overwrite filters with querystring filter
		$this->getQuerystringFilters($filters);
		JDEBUG ? $profiler->mark('listfilter:querystring filters
got') : null;
		FabrikHelperHTML::debug($filters, 'filter array: after querystring
filters');
		$request = $this->getPostFilterArray();
		JDEBUG ? $profiler->mark('listfilter:request got') : null;
		$this->counter = count(FArrayHelper::getValue($request,
'key', array()));

		// Overwrite filters with session filters (fabrik_incsessionfilters set
to false in listModel::getRecordCounts / for faceted data counts
		if ($input->get('fabrik_incsessionfilters', true))
		{
			$this->getSessionFilters($filters);
		}

		FabrikHelperHTML::debug($filters, 'filter array: after session
filters');
		JDEBUG ? $profiler->mark('listfilter:session filters got') :
null;

		// The search form search all has lower priority than the filter search
all and search form filters
		$this->getSearchFormSearchAllFilters($filters);

		// Overwrite session filters with search form filters
		$this->getSearchFormFilters($filters);
		FabrikHelperHTML::debug($filters, 'filter array: search form');

		// Overwrite filters with 'search all' filter
		$this->getSearchAllFilters($filters);
		JDEBUG ? $profiler->mark('listfilter:search all done') :
null;

		// Finally overwrite filters with post filters
		$this->getPostFilters($filters);
		JDEBUG ? $profiler->mark('listfilter:post filters got') :
null;
		FabrikHelperHTML::debug($filters, 'filter array: after
getpostfilters');
		$this->request = $filters;
		FabrikHelperHTML::debug($this->request, 'filter array');
		$this->checkAccess($filters);
		$this->normalizeKeys($filters);

		return $filters;
	}

	/**
	 * With prefilter and search all - 2nd time you use the search all the
array keys
	 * seem incorrect - resulting in an incorrect query.
	 * Use this to force each $filter['property'] array to start at
0 and increment
	 *
	 * @param   array  &$filters  list filters
	 *
	 * @since   3.0.6
	 *
	 * @return  void
	 */
	private function normalizeKeys(&$filters)
	{
		$properties = array_keys($filters);

		foreach ($properties as $property)
		{
			if (is_array($filters[$property]))
			{
				$filters[$property] = array_values($filters[$property]);
			}
			else
			{
				$filters[$property] = array();
			}
		}
	}

	/**
	 * $$$ rob if the filter should not be applied due to its acl level then
set its condition so that it
	 * will always return true. Do this rather than unsetting the filter - as
this removes the selected option
	 * from the filter forms field. Can be used in conjunction with a list
filter plugin to override a normal filters option with the
	 * plugins option, e.g. load all university's courses OR [plugin
option] load remote courses run by selected university
	 * e.g
http://www.epics-ve.eu/index.php?option=com_fabrik&view=list&listid=5
	 *
	 * @param   array  &$filters  list filters
	 *
	 * @return  void
	 */
	public function checkAccess(&$filters)
	{
		$access = FArrayHelper::getValue($filters, 'access', array());
		$viewLevels = $this->user->getAuthorisedViewLevels();

		foreach ($access as $key => $selAccess)
		{
			// $$$ hugh - fix for where certain elements got created with 0 as the
			// the default for filter_access, which isn't a legal value, should
be 1
			$selAccess = $selAccess == '0' ? '1' : $selAccess;
			$i = $filters['key'][$key];

			if (!in_array($selAccess, $viewLevels))
			{
				$filters['sqlCond'][$key] = '1=1';
			}
		}

		FabrikHelperHTML::debug($filters, 'filter array: after access taken
into account');
	}

	/**
	 * Get the advanced search mode.  If doing a J! global search, use the J!
search mode.  Otherwise, use
	 * the list's advanced search mode.
	 *
	 * @return  string
	 */
	private function getAdvancedSearchMode()
	{
		if ($this->app->getInput()->get('option',
'') === 'com_search')
		{
			$mode = $this->app->getInput()->get(
				'searchphrase',
				$this->listModel->getParams()->get('search-mode-advanced-default',
'any')
			);
		}
		else
		{
			$mode = $this->app->getUserStateFromRequest(
				'com_' . $this->package . '.list' .
$this->listModel->getRenderContext() . '.searchallmode',
				'search-mode-advanced',
				$this->listModel->getParams()->get('search-mode-advanced-default',
'any')
			);
		}

		return $mode;
	}

	/**
	 * get the search all posted (or session) value
	 *
	 * @param   string  $mode  html (performs htmlspecialchars on value) OR
'query' (adds slashes and url decodes)
	 *
	 * @return  string
	 */
	public function getSearchAllValue($mode = 'html')
	{
		$identifier = $this->listModel->getRenderContext();

		// Test new option to have one field to search them all
		$key = 'com_' . $this->package . '.list' .
$identifier . '.filter.searchall';

		// Seems like post keys 'name.1' get turned into
'name_1'
		$requestKey = $this->getSearchAllRequestKey();
		$v = $this->app->getUserStateFromRequest($key, $requestKey,
'');

		if (trim($v) == '')
		{
			$fromFormId = $this->app->getUserState('com_' .
$this->package . '.searchform.fromForm', '');

			if ($fromFormId !=
$this->listModel->getFormModel()->getForm()->id)
			{
				$v = $this->app->getUserState('com_' .
$this->package . '.searchform.form' . $fromFormId .
'.searchall', '');
			}
		}

		if (!empty($v))
		{
			// if advanced (boolean), strip out words < MySQL full text min chars
			if
($this->listModel->getParams()->get('search-mode-advanced'))
			{
				$searchMode = $this->getAdvancedSearchMode();
				$v = $this->testBooleanSearchLength($v, $searchMode);
			}

			$v = $mode == 'html' ? htmlspecialchars($v, ENT_QUOTES) :
addslashes(urldecode($v));
		}

		return $v;
	}

	/**
	 * small method just to return the inout name for the lists search all
field
	 *
	 * @return string
	 */

	public function getSearchAllRequestKey()
	{
		$identifier = $this->listModel->getRenderContext();

		return 'fabrik_list_filter_all_' . $identifier;
	}

	/**
	 * Check if the search all field (name=fabrik_list_filter_all) has
submitted data
	 *
	 * If it has then go through all elements, and add in a filter
	 * for each element whose data type matches the search type
	 * (e.g. if searching a string then ignore int() fields)
	 *
	 * If another filter has posted some data then don't add in a
'search all' record for that filter
	 *
	 * @param   array  &$filters  filter array
	 *
	 * @return  void
	 */
	private function getSearchAllFilters(&$filters)
	{
		$input = $this->app->getInput();
		$requestKey = $this->getSearchAllRequestKey();
		$search = $this->getSearchAllValue('query');

		if ($search == '')
		{
			if (array_key_exists($requestKey, $_POST))
			{
				// Empty search string sent unset any searchall filters
				$ks = array_keys($filters);
				$filterKeys = array_keys(FArrayHelper::getValue($filters,
'search_type', array()));

				foreach ($filterKeys as $filterKey)
				{
					if (FArrayHelper::getValue($filters['search_type'],
$filterKey, '') == 'searchall')
					{
						foreach ($ks as $k)
						{
							/**
							 * $$$ rob 10/04/2012  simply unsetting the array leaves the array
pointer, but somewhere we recreate
							 * $filters['search_type'] so its index becomes out of
sync. see http://fabrikar.com/forums/showthread.php?t=25698
							 * unset($filters[$k][$filterKey]);
							 */
							$filters[$k] = array();
						}
					}
				}
			}
		}

		if ($search == '')
		{
			// Clear full text search all
			if (array_key_exists($requestKey, $_POST))
			{
				$this->clearAFilter($filters, 9999);
			}

			return;
		}

		$listId = $input->getInt('listid', -1);

		// Check that we actually have the correct list id (or -1 if filter from
viz)
		if ($this->listModel->getTable()->id == $listId || $listId ==
-1)
		{
			if
($this->listModel->getParams()->get('search-mode-advanced'))
			{
				$this->doBooleanSearch($filters, $search);
			}
			else
			{
				$this->insertSearchAllIntoFilters($filters, $search);
			}
		}
	}

	/**
	 * clear specific filter data all from filters
	 *
	 * @param   array  &$filters  array filters
	 * @param   int    $id        index
	 *
	 * @return  void
	 */
	public function clearAFilter(&$filters, $id)
	{
		$keys = array_keys($filters);

		foreach ($keys as $key)
		{
			/**
			 * $$$ hugh - couple of folk have reported getting PHP error
"Cannot unset string offsets"
			 * which means sometimes $filters->foo is a string.  Putting a
band-aid on it for now,
			 * but really should try and find out why sometimes we have strings
rather than arrays.
			 */
			if (is_array($filters[$key]))
			{
				unset($filters[$key][$id]);
			}
		}
	}

	/**
	 * For extended search all test if the search string is long enough
	 *
	 * @param   string  $search  search string
	 * @param   string  $mode  search mode
	 *
	 * @since 3.0.6
	 *
	 * @throws UnexpectedValueException
	 *
	 * @return  bool	search string long enough?
	 */
	protected function testBooleanSearchLength($search, $mode =
'any')
	{
		static $min = null;

		if (!isset($min))
		{
			$this->_db->setQuery('SHOW VARIABLES LIKE
\'ft_min_word_len\'');
			$res = $this->_db->loadObject();
			$min = (int) $res->Value;
		}

		if ($mode !== 'exact')
		{
			$search = explode(' ', $search);
		}
		else
		{
			$search = (array) $search;
		}

		foreach ($search as $k => $s)
		{
			if (StringHelper::strlen($s) < $min)
			{
				unset($search[$k]);
			}
		}

		$search = implode(' ', $search);

		return $search;
	}

	/**
	 * Do a boolean search
	 *
	 * @param   array   &$filters  filter array
	 * @param   string  $search    term
	 *
	 * @return  void
	 */
	private function doBooleanSearch(&$filters, $search)
	{
		$input = $this->app->getInput();
		$mode = $this->getAdvancedSearchMode();

		if (trim($search) == '')
		{
			return;
		}

		$search = $this->testBooleanSearchLength($search, $mode);

		if (trim($search) == '')
		{
			return;
		}

		$search = explode(' ', $search);

		switch ($mode)
		{
			case 'all':
				$operator = '+';
				break;
			case 'none':
				$operator = '-';
				break;
			default:
			case 'exact':
			case 'any':
				$operator = '';
				break;
		}

		if ($mode !== 'exact')
		{
			foreach ($search as &$s)
			{
				$s = $operator . $s . '*';
			}
		}

		$search = implode(' ', $search);

		if ($mode == 'exact')
		{
			$search = '"' . $search . '"';
		}

		if ($mode == 'none')
		{
			/**
			 * Have to do it like this as the -operator removes records matched from
			 * previous +operators (so if you just have -operator)
			 * no records are returned
			 */
			$search = '+(a* b* c* d* e* f* g* h* i* j* k* l* m* n* o* p* q* r*
s* t* u* v* w* x* y* z*) ' . $search;
		}

		$input->set('override_join_val_column_concat', 1);
		$names = $this->listModel->getSearchAllFields();

		if (empty($names))
		{
			return;
		}

		$input->set('override_join_val_column_concat', 0);
		$names = implode(", ", $names);
		$filters['value'][9999] = $search;
		$filters['condition'][9999] = 'AGAINST';
		$filters['join'][9999] = 'AND';
		$filters['no-filter-setup'][9999] = 0;
		$filters['hidden'][9999] = 0;
		$filters['key'][9999] = "MATCH(" . $names .
")";
		$filters['key2'][9999] = "MATCH(" . $names .
")";
		$filters['search_type'][9999] = 'searchall';
		$filters['match'][9999] = 1;
		$filters['full_words_only'][9999] = 0;
		$filters['eval'][9999] = 0;
		$filters['required'][9999] = 0;
		$filters['access'][9999] = 0;
		$filters['grouped_to_previous'][9999] = 1;
		$filters['label'][9999] = '';
		$filters['elementid'][9999] = -1;
		$filters['raw'][9999] = false;
	}

	/**
	 * removes any search or filters from the list
	 *
	 * @return  void
	 */
	public function clearFilters()
	{
		$registry = $this->session->get('registry');
		$id = $this->app->getInput()->get('listref',
$this->listModel->getRenderContext());
		$tid = 'list' . $id;
		$listContext = 'com_' . $this->package . '.list' .
$id . '.';
		$context = $listContext . 'filter';
		$this->app->setUserState($listContext . 'limitstart', 0);

		if (!is_object($registry))
		{
			return;
		}

		$reg = $registry->get($context, new stdClass);
		/**
		 * $$$ rob jpluginfilters search_types are those which have been set
inside the
		 * Joomla content plugin e.g. {fabrik view=list id=1
tablename___elementname=foo}
		 * these should not be removed when the list filters are cleared
		 * see:
		 * http://fabrikar.com
		 *
/forums/index.php?threads/many-to-many-relationship-show-all-related-items-as-list-on-the-joined-list-details.36697/
		 * #post-184335
		 */
		$reg = ArrayHelper::fromObject($reg);
		$searchTypes = FArrayHelper::getValue($reg, 'search_type',
array());

		for ($i = 0; $i < count($searchTypes); $i++)
		{
			if ($this->canClear($searchTypes[$i]))
			{
				$this->clearAFilter($reg, $i);
			}
		}

		$reg['searchall'] = '';
		$reg = ArrayHelper::toObject($reg);
		$registry->set($context, $reg);
		$reg = $registry->get($context, new stdClass);

		// Reset plugin filter
		//$$$trob: not sure what this should do or ever has done or was running
at all, $tid is a string, no object (already in F3).
		//Just a fix for the notice
https://fabrikar.com/forums/index.php?threads/error-log-fabrik.53837/
		if (isset($registry->_registry) &&
isset($registry->_registry['com_' .
$this->package]['data']->$tid->plugins))
		{
			unset($registry->_registry['com_' .
$this->package]['data']->$tid->plugins);
		}

		$key = 'com_' . $this->package . '.' . $tid .
'.searchall';
		$this->app->setUserState($key, '');
		$fromFormId = $this->app->getUserState('com_' .
$this->package . '.searchform.fromForm');

		if ($fromFormId !=
$this->listModel->getFormModel()->get('id'))
		{
			$this->app->setUserState('com_' . $this->package .
'.searchform.form' . $fromFormId . '.searchall',
'');
		}
	}

	/**
	 * Can we clear a filter.
	 * Filters set by the content plugin ($searchType == jpluginfilters) can
only be unset if you are not viewing the content plugin but instead
	 * a menu item, which points at the same list AND when that menu item has
its resetfilters option set to yes.
	 *
	 * @param   string  $searchType  Search type string
	 *
	 * @return boolean
	 */
	protected function canClear($searchType)
	{
		if (!$this->app->isClient('administrator') &&
$this->activeTable())
		{
			$menus = $this->app->getMenu();
			$menu = $menus->getActive();

			if (is_object($menu))
			{
				$menuListId = ArrayHelper::getValue($menu->query,
'listid', '');
				$thisListId = $this->listModel->getId();

				if ($menuListId == $thisListId &&
$menu->getParams()->get('resetfilters') == 1)
				{
					return true;
				}
			}
		}

		return $searchType === 'jpluginfilters' ? false : true;
	}

	/**
	 * Get users default access level
	 *
	 * @return  int  access level
	 */
	protected function defaultAccessLevel()
	{
		$accessLevels = $this->user->getAuthorisedViewLevels();

		return FArrayHelper::getValue($accessLevels, 0, 1);
	}

	/**
	 * Insert search all string into filters
	 *
	 * @param   array   &$filters  list filters
	 * @param   string  $search    search string
	 *
	 * @return null
	 */
	private function insertSearchAllIntoFilters(&$filters, $search)
	{
		$elements = $this->listModel->getElements('id', false);
		$keys = array_keys($elements);
		$i = 0;
		$condition = 'REGEXP';
		$orig_search = $search;
		$searchable = false;

		foreach ($keys as $elid)
		{
			// $$$ hugh - need to reset $search each time round, in case
getFilterValue has escaped something,
			// like foo.exe to foo\\\.exe ... otherwise each time round we double
the number of \s's
			$search = $orig_search;
			$elementModel = $elements[$elid];

			if (!$elementModel->includeInSearchAll(false, $search))
			{
				continue;
			}

			$searchable = true;
			$k = $elementModel->getFullName(false, false);
			$k = FabrikString::safeColName($k);

			// Lower case for search on accented characters e.g. ??
			$k = 'LOWER(' . $k . ')';

			$key = array_key_exists('key', $filters) ? array_search($k,
$filters['key']) : false;

			/**
			 * $$$ rob 28/06/2011 see
http://fabrikar.com/forums/showthread.php?t=26006
			 * This line was setting eval to 1 as array_search returns the key,
think we want the value
			 */
			// $eval = array_key_exists('eval', $filters) ?
array_search($k, $filters['eval']) : FABRIKFILTER_TEXT;
			$eval = array_key_exists('eval', $filters) ?
FArrayHelper::getValue($filters['eval'], $key, FABRIKFILTER_TEXT)
: FABRIKFILTER_TEXT;

			if (!is_a($elementModel, 'PlgFabrik_ElementDatabasejoin'))
			{
				$fieldDesc = $elementModel->getFieldDescription();

				if (StringHelper::stristr($fieldDesc, 'INT'))
				{
					if (is_numeric($search) && $condition == '=')
					{
						$eval = FABRIKFILTER_NOQUOTES;
					}
				}

				$k2 = null;
			}
			else
			{
				if ($elementModel->isJoin())
				{
					$k2 = $elementModel->buildQueryElementConcat('', false);
				}
				else
				{
					$k2 = $elementModel->getJoinLabelColumn();
				}

				$k = $k2 = 'LOWER(' . $k2 . ')';
			}

			// Retest as $k has been modified and may now exist.
			if (!$key)
			{
				$key = array_key_exists('key', $filters) ? array_search($k,
$filters['key']) : false;
			}

			$element = $elementModel->getElement();
			//$elParams = $elementModel->getParams();
			$access = $this->defaultAccessLevel();

			// $$$ rob so search all on checkboxes/radio buttons etc. will take the
search value of 'one' and return '1'
			$newSearch = $elementModel->getFilterValue($search, $condition,
$eval);
			$newCondition = $newSearch[1];
			$newSearch = $newSearch[0];


			if ($key !== false)
			{
				$filters['orig_condition'][$key] = $condition;
				$filters['value'][$key] = $newSearch;
				$filters['condition'][$key] = $newCondition;
				$filters['join'][$key] = 'OR';
				$filters['no-filter-setup'][$key] = ($element->filter_type
== '') ? 1 : 0;
				$filters['hidden'][$key] = ($element->filter_type ==
'') ? 1 : 0;
				$filters['key'][$key] = $k;
				$filters['key2'][$key] = $k2;
				$filters['search_type'][$key] = 'searchall';
				$filters['match'][$key] = 1;
				$filters['full_words_only'][$key] = 0;
				$filters['eval'][$key] = $eval;
				$filters['required'][$key] = 0;
				$filters['access'][$key] = $access;
				/**
				 * $$$ rob 16/06/2011 - changed this. If search all and search on post
then change post filter.
				 * The grouped_to_previous was being set from 1 to 0 - giving
				 * incorrect query. AFAICT grouped_to_previous should always be 1 for
search_all.
				 * And testing if the element name = 0 seems v wrong :)
				 */
				// $filters['grouped_to_previous'][$key] = $k == 0 ? 0 : 1;
				$filters['grouped_to_previous'][$key] = 1;
				$filters['label'][$key] = $elementModel->getListHeading();
				$filters['raw'][$key] = false;
			}
			else
			{
				$filters['orig_condition'][] = $condition;
				$filters['value'][] = $newSearch;
				$filters['condition'][] = $condition;
				$filters['join'][] = 'OR';
				$filters['no-filter-setup'][] = ($element->filter_type ==
'') ? 1 : 0;
				$filters['hidden'][] = ($element->filter_type ==
'') ? 1 : 0;
				$filters['key'][] = $k;
				$filters['key2'][] = $k2;
				$filters['search_type'][] = 'searchall';
				$filters['match'][] = 1;
				$filters['full_words_only'][] = 0;
				$filters['eval'][] = $eval;
				$filters['required'][] = 0;
				$filters['access'][] = $access;
				/**
				 * $$$ rob having grouped_to_previous as 1 was barfing this list view
for beate, when doing a search all:
				 *
http://test.xx-factory.de/index.php?option=com_fabrik&view=list&listid=31&calculations=0&Itemid=16&resetfilters=0
				 */
				// $filters['grouped_to_previous'][] = 0;//1;

				/**
				 * $$$ rob 16/06/2011 - Yeah but no! - if you have search all AND a
post filter -
				 * the post filter should filter a subset of the search
				 * all data, so setting grouped_to_previous to 1 gives you a query of:
				 * where (el = 'searchall' OR el = 'searchall') AND
el = 'post value'
				 */
				$filters['grouped_to_previous'][] = 1;
				$filters['label'][] = $elementModel->getListHeading();
				$filters['elementid'][] = $element->id;
				$filters['raw'][] = false;
			}

			$i++;
		}

		if (!$searchable)
		{
			$this->app->enqueueMessage(Text::_('COM_FABRIK_NOTICE_SEARCH_ALL_BUT_NO_ELEMENTS'));
		}
	}

	/**
	 * Insert search form's search all filters
	 *
	 * @param   array  &$filters  list filters
	 *
	 * @return  void
	 */
	private function getSearchFormSearchAllFilters(&$filters)
	{
		// See if there was a search all created from a search form
		$formModel = $this->listModel->getFormModel();
		$key = 'com_' . $this->package .
'.searchform.fromForm';
		$fromFormId = $this->app->getUserState($key);

		if ($fromFormId != $formModel->getId())
		{
			$search = $this->app->getUserState('com_' .
$this->package . '.searchform.form' . $fromFormId .
'.searchall');

			if (empty($search) || trim($search) == '')
			{
				return;
			}

			$this->insertSearchAllIntoFilters($filters, $search);
		}
	}

	/**
	 * Get search form id
	 *
	 * @return  int  search form id
	 */
	private function getSearchFormId()
	{
		$key = 'com_' . $this->package .
'.searchform.fromForm';

		return $this->app->getUserState($key);
	}

	/**
	 * Set search form id
	 *
	 * @param   int  $id  form id
	 *
	 * @return  void
	 */
	private function setSearchFormId($id = null)
	{
		$key = 'com_' . $this->package .
'.searchform.fromForm';
		$this->app->setUserState($key, $id);
	}

	/**
	 * Get search form filters
	 *
	 * @param   array  &$filters  list filters
	 *
	 * @return  void
	 */
	private function getSearchFormFilters(&$filters)
	{
		$fromFormId = $this->getSearchFormId();

		if (!empty($fromFormId))
		{
			$formModel = $this->listModel->getFormModel();
			$db = FabrikWorker::getDbo();
			$lookupKeys = FArrayHelper::getValue($filters, 'key',
array());

			if ($fromFormId != $formModel->get('id'))
			{
				$fromForm =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Form',
'FabrikFEModel');
				$fromForm->setId($fromFormId);
				//$fromFormParams = $fromForm->getParams();
				/**
				 * $$$ hugh Added $filter_elements from 'filter_name'
				 * which we'll need in the case of $elid not being in $elements
for search forms
				 */
				$elements = $this->listModel->getElements('id');
				$filter_elements =
$this->listModel->getElements('filtername');
				$tableName =
$db->qn($this->listModel->getTable()->db_table_name);
				$searchFilters = $this->app->getUserState('com_' .
$this->package . '.searchform.form' . $fromFormId .
'.filters');

				// check if key set, might not be if (say) checkbox filters on search
form with no selection
				if (array_key_exists('key', $searchFilters))
				{
					for ($i = 0; $i < count($searchFilters['key']); $i++)
					{
						$eval  = FABRIKFILTER_TEXT;
						$found = false;
						$key   = $searchFilters['key'][$i];
						$elid  = $searchFilters['elementid'][$i];

						if (array_key_exists($elid, $elements))
						{
							$found        = true;
							$elementModel = $elements[$elid];
						}
						else
						{
							// If sent from a search form - the table name will be blank
							$key = explode('.', $key);
							$key = $tableName . '.' . array_pop($key);

							if (array_key_exists($key, $filter_elements))
							{
								$found        = true;
								$elementModel = $filter_elements["$key"];
							}
							else
							{
								// $$$ rob - I've not actually tested this code
								$joins = $this->listModel->getJoins();

								foreach ($joins as $join)
								{
									$key = explode('.', $key);
									$key = $db->qn($join->table_join) . '.' .
array_pop($key);

									if (array_key_exists($key, $filter_elements))
									{
										$found        = true;
										$elementModel = $filter_elements[$key];
										break;
									}
								}
							}
						}

						if (!isset($elementModel) || !is_a($elementModel,
'plgFabrik_Element') || $found === false)
						{
							// Could be looking for an element which exists in a join
							continue;
						}

						$index    = array_key_exists('key', $filters) ?
array_search($key, $lookupKeys) : false;
						$element  = $elementModel->getElement();
						$elParams = $elementModel->getParams();
						$grouped  = array_key_exists($i,
$searchFilters['grouped_to_previous']) ?
$searchFilters['grouped_to_previous'][$i] : 0;

						$join = $searchFilters['join'][$i];

						if ($index === false)
						{
							$filters['value'][]               =
$searchFilters['value'][$i];
							$filters['condition'][]           =
$elementModel->getDefaultFilterCondition();
							$filters['join'][]                = $join;
							$filters['no-filter-setup'][]     =
($element->filter_type == '') ? 1 : 0;
							$filters['hidden'][]              =
($element->filter_type == '') ? 1 : 0;
							$filters['key'][]                 = $key;
							$filters['search_type'][]         = 'search';
							$filters['match'][]               =
$element->filter_exact_match;
							$filters['full_words_only'][]     =
$elParams->get('full_words_only');
							$filters['eval'][]                = $eval;
							$filters['required'][]            =
$elParams->get('filter_required');
							$filters['access'][]              =
$elParams->get('filter_access');
							$filters['grouped_to_previous'][] = $grouped;
							$filters['label'][]               =
$elementModel->getListHeading();
							$filters['raw'][]                 = false;
						}
						else
						{
							unset($lookupKeys[$index]);
							$filters['value'][$index]               =
$searchFilters['value'][$i];
							$filters['condition'][$index]           =
$elementModel->getDefaultFilterCondition();
							$filters['join'][$index]                = $join;
							$filters['no-filter-setup'][$index]     =
($element->filter_type == '') ? 1 : 0;
							$filters['hidden'][$index]              =
($element->filter_type == '') ? 1 : 0;
							$filters['key'][$index]                 = $key;
							$filters['search_type'][$index]         =
'search';
							$filters['match'][$index]               =
$element->filter_exact_match;
							$filters['full_words_only'][$index]     =
$elParams->get('full_words_only');
							$filters['eval'][$index]                = $eval;
							$filters['required'][$index]            =
$elParams->get('filter_required');
							$filters['access'][$index]              =
$elParams->get('filter_access');
							$filters['grouped_to_previous'][$index] = $grouped;
							$filters['label'][$index]               =
$elementModel->getListHeading();
							$filters['raw'][$index]                 = false;
						}

						$filters['elementid'][] = $element->id;
					}
				}
			}

			/**
			 * unset the search form id so we wont reuse the search data
			 * until a new search is performed
			 */
			$this->setSearchFormId(null);
		}
	}

	/**
	 * Get any querystring filters that can be applied to the list
	 * you can simple do tablename___elementname=value
	 * or if you want more control you can do
	 *
	 *
tablename___elementname[value]=value&tablename_elementname[condition]=OR
etc.
	 *
	 * @param   array  &$filters  list filters
	 *
	 * @return  void
	 */
	private function getQuerystringFilters(&$filters)
	{
		//$item = $this->listModel->getTable();
		$filter = InputFilter::getInstance();
		$request = $filter->clean($_GET, 'array');
		$formModel = $this->listModel->getFormModel();
		$filterKeys = array_keys($filters);

		foreach ($request as $key => $val)
		{
			$oldKey = $key;
			$key = FabrikString::safeColName($key);
			$index = array_key_exists('key', $filters) ?
array_search($key, $filters['key']) : false;

			if ($index !== false)
			{
				foreach ($filterKeys as $fKey)
				{
					if (is_array($filters[$fKey]) && array_key_exists($index,
$filters[$fKey]))
					{
						unset($filters[$fKey][$index]);

						// Reindex array
						$filters[$fKey] = array_values($filters[$fKey]);
					}
				}
			}

			$raw = 0;

			if (substr($oldKey, -4, 4) == '_raw')
			{
				$raw = 1;

				// Without this line related data links
'listname___elementname_raw=X' where not having their filter
applied
				$key = FabrikString::safeColName(FabrikString::rtrimword($oldKey,
'_raw'));
			}

			$elementModel =
$formModel->getElement(FabrikString::rtrimword($oldKey,
'_raw'), false, false);

			if (!is_a($elementModel, 'PlgFabrik_Element'))
			{
				continue;
			}

			$eval = is_array($val) ? FArrayHelper::getValue($val, 'eval',
FABRIKFILTER_TEXT) : FABRIKFILTER_TEXT;
			$condition = is_array($val) ? FArrayHelper::getValue($val,
'condition', $elementModel->getDefaultFilterCondition())
				: $elementModel->getDefaultFilterCondition();

			{
				$fieldDesc = $elementModel->getFieldDescription();

				if (StringHelper::stristr($fieldDesc, 'INT'))
				{
					if (is_numeric($val) && $condition == '=')
					{
						$eval = FABRIKFILTER_NOQUOTES;
					}
				}
			}

			// Add request filter to end of filter array
			if (is_array($val))
			{
				$value = FArrayHelper::getValue($val, 'value', '');
				$join = FArrayHelper::getValue($val, 'join',
'AND');
				$grouped = FArrayHelper::getValue($val,
'grouped_to_previous', 0);

				/**
				 * do a ranged querystring search with this syntax
				 *
?element_test___time_date[value][]=2009-08-07&element_test___time_date[value][]=2009-08-10&element_test___time_date[condition]=BETWEEN
				 */
				if (is_array($value) && strtoupper($condition) !==
'BETWEEN' && strtoupper($condition) !== 'IN')
				{
					// If we aren't doing a ranged search
					foreach ($value as $vk => $avalue)
					{
						// If ??? entered in qs then that is converted to %E9 which urldecode
will convert back
						$value = addslashes(urldecode($avalue));
						$acondition = (is_array($condition) && array_key_exists($vk,
$condition)) ? $condition[$vk] : $condition;
						$ajoin = (is_array($join) && array_key_exists($vk, $join)) ?
$join[$vk] : $join;
						$agrouped = (is_array($grouped) && array_key_exists($vk,
$grouped)) ? $grouped[$vk] : $grouped;
						$this->indQueryString($elementModel, $filters, $avalue,
$acondition, $ajoin, $agrouped, $eval, $key, $raw);
					}
				}
				else
				{
					if (is_string($value))
					{
						$value = addslashes(urldecode($value));
					}

					$this->indQueryString($elementModel, $filters, $value, $condition,
$join, $grouped, $eval, $key, $raw);
				}
			}
			else
			{
				// If ??? entered in qs then that is converted to %E9 which urldecode
will convert back
				$value = addslashes(urldecode($val));
				$join = 'AND';
				$grouped = 0;
				$this->indQueryString($elementModel, $filters, $value, $condition,
$join, $grouped, $eval, $key, $raw);
			}
		}
	}

	/**
	 * Insert individual querystring filter into filter array
	 *
	 * @param   object  $elementModel  element model
	 * @param   array   &$filters      filter array
	 * @param   mixed   $value         value
	 * @param   string  $condition     condition
	 * @param   string  $join          join
	 * @param   bool    $grouped       is grouped
	 * @param   bool    $eval          is eval
	 * @param   string  $key           element key
	 * @param   bool    $raw           is the filter a raw filter
(tablename___elementname_raw=foo)
	 *
	 * @return  void
	 */
	private function indQueryString($elementModel, &$filters, $value,
$condition, $join, $grouped, $eval, $key, $raw = false)
	{
		$input = $this->app->getInput();
		$element = $elementModel->getElement();
		$elParams = $elementModel->getParams();

		if (is_string($value))
		{
			$value = trim($value);
			// $$$ hugh - allow {$my->id} (etc) here, maybe allow other
placeholders?
			$value = FabrikWorker::replaceWithUserData($value);
		}

		$k2 = FabrikString::safeColNameToArrayKey($key);
		/**
		 * $$$ rob fabrik_sticky_filters set in J content plugin
		 * Treat these as prefilters so we don't unset them
		 * when we clear the filters
		 */
		$stickyFilters = $input->get('fabrik_sticky_filters',
array(), 'array');
		$filterType = in_array($k2 . '_raw', $stickyFilters)
			|| in_array($k2, $stickyFilters) ? 'jpluginfilters' :
'querystring';
		$filters['value'][] = $value;
		$filters['condition'][] = urldecode($condition);
		$filters['join'][] = $join;
		$filters['no-filter-setup'][] = ($element->filter_type ==
'') ? 1 : 0;
		$filters['hidden'][] = ($element->filter_type ==
'') ? 1 : 0;
		$filters['key'][] = $key;
		$filters['key2'][] = '';
		$filters['search_type'][] = $filterType;
		$filters['match'][] = $element->filter_exact_match;
		$filters['full_words_only'][] =
$elParams->get('full_words_only');
		$filters['eval'][] = $eval;
		$filters['required'][] =
$elParams->get('filter_required');
		$filters['access'][] =
$elParams->get('filter_access');
		$filters['grouped_to_previous'][] = $grouped;
		$filters['label'][] = $elementModel->getListHeading();
		$filters['elementid'][] = $element->id;
		$filters['raw'][] = $raw;
	}

	/**
	 * Get post filters
	 *
	 * @return  array
	 */
	private function getPostFilterArray()
	{
		if (!isset($this->request))
		{
			//$item = $this->listModel->getTable();
			$filter = InputFilter::getInstance();
			$request = $filter->clean($_POST, 'array');
			/**
			 * Use request ONLY if you want to test an ajax post with params in url
			 * $request	= $filter->clean($_REQUEST, 'array');
			 */
			$k = 'list_' . $this->listModel->getRenderContext();

			if (array_key_exists('fabrik___filter', $request) &&
array_key_exists($k, $request['fabrik___filter']))
			{
				$this->request = $request['fabrik___filter'][$k];
			}
			else
			{
				$this->request = array();
			}
		}

		return $this->request;
	}

	/**
	 * Overwrite session and search all filters with posted data
	 *
	 * @param   array  &$filters  filter array
	 *
	 * @since   3.5.1
	 *
	 * @throws  UnexpectedValueException
	 *
	 * @return  void
	 */
	private function getPostFilters(&$filters)
	{
		$input = $this->app->getInput();
		//$item = $this->listModel->getTable();
		$request = $this->getPostFilterArray();
		$elements = $this->listModel->getElements('id');
		$filterKeys = array_keys($filters);
		$values = FArrayHelper::getValue($request, 'value', array());
		$searchTypes = FArrayHelper::getValue($filters, 'search_type',
array());
		$conditions = FArrayHelper::getValue($request, 'condition',
array());

		$usedMerges = array();

		FabrikHelperHTML::debug($filters, 'filter array: start
getPostFilters');

		if (!empty($request) && array_key_exists('key',
$request))
		{
			$keyInts = array_keys($request['key']);
			$ajaxPost =
StringHelper::strtolower($input->server->get('HTTP_X_REQUESTED_WITH',''));
			$this->listModel->ajaxPost = $ajaxPost;
			$this->listModel->postValues = $values;

			foreach ($keyInts as $i)
			{
				$value = FArrayHelper::getValue($values, $i, '');
				$key = FArrayHelper::getValue($request['key'], $i);
				$elid = FArrayHelper::getValue($request['elementid'], $i);
				$condition = FArrayHelper::getValue($conditions, $i);

				if ($key == '')
				{
					continue;
				}

				// Index is the filter index for a previous filter that uses the same
element id
				if (!in_array($elid, $usedMerges))
				{
					$index = array_key_exists('elementid', $filters) ?
array_search($elid, (array) $filters['elementid']) : false;
				}
				else
				{
					$index = false;
				}

				if ($index !== false)
				{
					$usedMerges[] = $elid;
				}

				/**
				 * $$$rob empty post filters SHOULD overwrite previous filters, as the
user has submitted
				 * this filter with nothing selected
				 */
				/*if (is_string($value) && trim($value) == '') {
				    continue;
				}
				 */

				// $$$ rob set a var for empty value - regardless of whether its an
array or string
				$emptyValue =
					(
						(is_string($value) && trim($value) == '')
						|| (is_array($value) && trim(implode('', $value))
== '')
					)
					&& ($condition !== 'EMPTY' && $condition !==
'NOTEMPTY');

				/**
				 * $$rob ok the above meant that require filters stopped working as
soon as you submitted
				 * an empty search!
				 * So now  add in the empty search IF there is NOT a previous filter in
the search data
				 */
				if ($emptyValue && $index === false)
				{
					continue;
				}

				/**
				 * $$$ rob if we are posting an empty value then we really have to
clear the filter out from the
				 * session. Otherwise the filter is run as "where field =
''"
				 */
				if ($emptyValue && $index !== false)
				{
					/*
					 * Testing clearing only if normal filter, previous test on searchType
!= 'searchall'
					 * meant advanced search filters were removed on page nav
					 */
					if (FArrayHelper::getValue($searchTypes, $index) ==
'normal')
					{
						$this->clearAFilter($filters, $index);
					}
					// $$$ rob - regardless of whether the filter was added by search all
or not - don't overwrite it with post filter
					continue;
				}

				$origCondition = $condition;
				$filters['orig_condition'][] = $condition;

				if ($condition === 'EMPTY')
				{
					$condition = '=';
					$value = '';
				}

				if ($condition === 'NOTEMPTY')
				{
					$condition = '<>';
					$value = '';
				}


				$elementModel = $elements[$elid];

				if (!is_a($elementModel, 'PlgFabrik_Element'))
				{
					continue;
				}

				// Date element's have specific empty values
				if ($origCondition === 'EMPTY' || $origCondition ===
'NOTEMPTY')
				{
					$value = $elementModel->emptyFilterValue();
				}

				// If the request key is already in the filter array - unset it
				if ($index !== false)
				{
					foreach ($filterKeys as $fKey)
					{
						if (is_array($filters[$fKey]) && array_key_exists($index,
$filters[$fKey]))
						{
							// Don't unset search all filters when the value is empty and
continue so we don't add in a new filter
							if (FArrayHelper::getValue($searchTypes, $index) ==
'searchall' && $value == '')
							{
								continue 2;
							}

							// $$$rob we DO need to unset
							unset($filters[$fKey][$index]);
						}
					}
				}

				if (is_array($value))
				{
					// Ensure the array is indexed starting at 0.
					$value = array_values($value);

					// Empty ranged data test
					if (FArrayHelper::getValue($value, 0) == '' &&
FArrayHelper::getValue($value, 1) == '')
					{
						continue;
					}
				}

				$eval = is_array($value) ? FArrayHelper::getValue($value,
'eval', FABRIKFILTER_TEXT) : FABRIKFILTER_TEXT;

				if (!is_a($elementModel, 'PlgFabrik_ElementDatabasejoin'))
				{
					$fieldDesc = $elementModel->getFieldDescription();

					if (StringHelper::stristr($fieldDesc, 'INT'))
					{
						if (is_numeric($value) && $request['condition'][$i]
== '=')
						{
							$eval = FABRIKFILTER_NOQUOTES;
						}
					}
				}

				/**
				 * $$$ rob - search all and dropdown filter: Search first on searchall
= usa, then select dropdown to usa.
				 * post filter query overwrites search all query, but uses add so =
where id REGEX 'USA' AND country LIKE '%USA'
				 * this code swaps the first
				 */
				$joinMode = StringHelper::strtolower($request['join'][$i]) !=
'where' ? $request['join'][$i] : 'AND';

				if (!empty($filters))
				{
					if ($i == 0)
					{
						$joinModes = FArrayHelper::getValue($filters, 'join',
array('AND'));
						$joinMode = array_pop($joinModes);

						// $$$ rob - If search all made, then the post filters should filter
further the results
						$tmpSearchTypes = FArrayHelper::getValue($filters,
'search_type', array('normal'));
						$lastSearchType = array_pop($tmpSearchTypes);

						if ($lastSearchType == 'searchall')
						{
							$joinMode = 'AND';
						}
					}
				}

				// Add request filter to end of filter array
				$element = $elementModel->getElement();
				$elParams = $elementModel->getParams();
				$filters['value'][] = $value;
				$filters['condition'][] = urldecode($condition);
				$filters['join'][] = $joinMode;
				$filters['no-filter-setup'][] = ($element->filter_type ==
'') ? 1 : 0;
				$filters['hidden'][] = ($element->filter_type ==
'') ? 1 : 0;
				$elKey = htmlspecialchars_decode($elementModel->getFilterFullName(),
ENT_QUOTES);
				$decodedKey = urldecode($key);


				if ($decodedKey !== $elKey)
				{
					throw new UnexpectedValueException(Text::_('Unexpected key for
list filter'));
				}

				$filters['key'][] = $decodedKey;

				$filters['search_type'][] =
FArrayHelper::getValue($request['search_type'], $i,
'normal');
				$filters['match'][] = $element->filter_exact_match;
				$filters['full_words_only'][] =
$elParams->get('full_words_only');
				$filters['eval'][] = $eval;
				$filters['required'][] =
$elParams->get('filter_required');
				$filters['access'][] =
$elParams->get('filter_access');
				$filters['grouped_to_previous'][] =
FArrayHelper::getValue($request['grouped_to_previous'], $i,
'0');
				$filters['label'][] = $elementModel->getListHeading();
				$filters['elementid'][] = $elid;
				$filters['raw'][] = false;
			}
		}

		$this->listModel->tmpFilters = $filters;
		FabrikHelperHTML::debug($filters, 'filter array: before
onGetPostFilter');
		FabrikWorker::getPluginManager()->runPlugins('onGetPostFilter',
$this->listModel, 'list', $filters);
		FabrikHelperHTML::debug($filters, 'filter array: after
onGetPostFilter');
		$filters = $this->listModel->tmpFilters;
	}

	/**
	 * load up filters stored in the session from previous searches
	 *
	 * @param   array  &$filters  list filters
	 *
	 * @return  void
	 */
	private function getSessionFilters(&$filters)
	{
		$profiler = Profiler::getInstance('Application');
		$elements = $this->listModel->getElements('id');
		$identifier = $this->app->getInput()->get('listref',
$this->listModel->getRenderContext());
		$key = 'com_' . $this->package . '.list' .
$identifier . '.filter';
		$sessionFilters =
ArrayHelper::fromObject($this->app->getUserState($key));
		$filterKeys = array_keys($filters);

		if (!is_array($sessionFilters) || !array_key_exists('key',
$sessionFilters))
		{
			return;
		}

		// If we are coming from a search form ignore session filters
		$fromFormId = $this->getSearchFormId();
		$formModel = $this->listModel->getFormModel();

		if (!is_null($fromFormId) && $fromFormId !==
$formModel->getId())
		{
			return;
		}
		// End ignore
		$request = $this->getPostFilterArray();
		JDEBUG ? $profiler->mark('listfilter:session filters
getPostFilterArray') : null;
		$key = 'com_' . $this->package . '.list' .
$identifier . '.filter.searchall';
		$requestKey = $this->getSearchAllRequestKey();
		JDEBUG ? $profiler->mark('listfilter:session filters
getSearchAllRequestKey') : null;
		$pluginKeys = $this->getPluginFilterKeys();
		JDEBUG ? $profiler->mark('listfilter:session filters
getPluginFilterKeys') : null;
		$search = $this->app->getUserStateFromRequest($key, $requestKey);
		$postKeys = FArrayHelper::getValue($request, 'key', array());

		for ($i = 0; $i < count($sessionFilters['key']); $i++)
		{
			$elid = FArrayHelper::getValue($sessionFilters['elementid'],
$i);
			$key = FArrayHelper::getValue($sessionFilters['key'], $i,
null);
			$index = FArrayHelper::getValue($filters['elementid'], $key,
false);
			$origCondition =
FArrayHelper::getValue($filters['orig_condition'], $i,
'');

			// Used by radius search plugin
			$sqlConds = FArrayHelper::getValue($sessionFilters, 'sqlCond',
array());

			if ($index !== false)
			{
				foreach ($filterKeys as $fKey)
				{
					if (is_array($filters[$fKey]) && array_key_exists($index,
$filters[$fKey]))
					{
						/**
						 * $$$rob test1
						 * with the line below uncomment, the unset caused only first filter
from query string to work, e..g
						 *
&element_test___user[value][0]=aaassss&element_test___user[value][1]=X
Administrator&element_test___user[join][1]=OR
						 * converted to:
						 * WHERE `#__users`.`name` REGEXP 'aaassss' OR
`#___users`.`name` REGEXP ' X Administrator'
						 *
						 * unset($filters[$fKey][$index]);
						 */

						$filters[$fKey] = array_values($filters[$fKey]);
					}
				}
			}

			$value = $sessionFilters['value'][$i];
			$key2 = array_key_exists('key2', $sessionFilters) ?
FArrayHelper::getValue($sessionFilters['key2'], $i, '')
: '';

			if ($elid == -1)
			{
				// Search all boolean mode
				$eval = 0;
				$condition = 'AGAINST';
				$origCondition = 'AGAINST';
				$join = 'AND';
				$noFiltersSetup = 0;
				$hidden = 0;
				$search_type = 'searchall';
				$match = 1;
				$fullWordsOnly = 0;
				$required = 0;
				$access = $this->defaultAccessLevel();
				$grouped = 1;
				$label = '';
				/**
				 * $$$ rob force the counter to always be the same for extended search
all
				 * stops issue of multiple search alls being applied
				 */
				$counter = 9999;
				$raw = 0;
				$sqlCond = null;
			}
			else
			{
				$elementModel = FArrayHelper::getValue($elements, $elid);

				if (!is_a($elementModel, 'plgFabrik_Element') &&
!in_array($elid, $pluginKeys))
				{
					continue;
				}
				// Check list plugins
				if (in_array($elid, $pluginKeys))
				{
					$condition = $sessionFilters['condition'][$i];
					$origCondition = $sessionFilters['orig_condition'][$i];
					$eval = $sessionFilters['eval'][$i];
					$search_type = $sessionFilters['search_type'][$i];
					$join = $sessionFilters['join'][$i];
					$grouped = $sessionFilters['grouped_to_previous'][$i];
					$noFiltersSetup = $sessionFilters['no-filter-setup'][$i];
					$hidden = $sessionFilters['hidden'][$i];
					$match = $sessionFilters['match'][$i];
					$fullWordsOnly = $sessionFilters['full_words_only'][$i];
					$required = $sessionFilters['required'][$i];
					$access = $sessionFilters['access'][$i];
					$label = $sessionFilters['label'][$i];
					$sqlCond = FArrayHelper::getValue($sqlConds, $i);
					$raw = $sessionFilters['raw'][$i];
					$counter = $elid;
				}
				else
				{
					$sqlCond = null;
					$condition = array_key_exists($i,
$sessionFilters['condition']) ?
$sessionFilters['condition'][$i]
						: $elementModel->getDefaultFilterCondition();

					$origFound = array_key_exists('orig_condition',
$sessionFilters) && array_key_exists($i,
$sessionFilters['orig_condition']);
					$origCondition = $origFound ?
$sessionFilters['orig_condition'][$i] :
$elementModel->getDefaultFilterCondition();
					$raw = array_key_exists($i, $sessionFilters['raw']) ?
$sessionFilters['raw'][$i] : 0;
					$eval = array_key_exists($i, $sessionFilters['eval']) ?
$sessionFilters['eval'][$i] : FABRIKFILTER_TEXT;

					if (!is_a($elementModel, 'PlgFabrik_ElementDatabasejoin'))
					{
						$fieldDesc = $elementModel->getFieldDescription();

						if (StringHelper::stristr($fieldDesc, 'INT'))
						{
							if (is_numeric($search) && $condition == '=')
							{
								$eval = FABRIKFILTER_NOQUOTES;
							}
						}
					}

					/**
					 * add request filter to end of filter array
					 * with advanced search and then page nav this wasn't right
					 */
					$search_type = array_key_exists($i,
$sessionFilters['search_type']) ?
$sessionFilters['search_type'][$i]
						: $elementModel->getDefaultFilterCondition();

					$join = $sessionFilters['join'][$i];
					$grouped = array_key_exists($i,
$sessionFilters['grouped_to_previous']) ?
$sessionFilters['grouped_to_previous'][$i] : 0;

					$element = $elementModel->getElement();
					$elParams = $elementModel->getParams();
					$noFiltersSetup = ($element->filter_type == '') ? 1 : 0;
					$hidden = ($element->filter_type == '') ? 1 : 0;
					$match = $element->filter_exact_match;
					$fullWordsOnly = $elParams->get('full_words_only');
					$required = $elParams->get('filter_required');
					$access = $elParams->get('filter_access');
					$label = $elementModel->getListHeading();

					/**
					 * $$$ rob if the session filter is also in the request data then set
it to use the same key as the post data
					 * when the post data is processed it should then overwrite these
values
					 */
					$counter = array_search($key, $postKeys) !== false ?
array_search($key, $postKeys) : $this->counter;
				}
			}

			/**
			 * $$$ hugh - attempting to stop plugin filters getting overwritten
			 * PLUGIN FILTER SAGA
			 * So ... if this $filter is a pluginfilter, lets NOT overwrite it
			 */
			if (array_key_exists('search_type', $filters) &&
array_key_exists($counter, $filters['search_type'])
				&& $filters['search_type'][$counter] ==
'jpluginfilters')
			{
				continue;
			}

			$filters['value'][$counter] = $value;
			$filters['condition'][$counter] = $condition;
			$filters['join'][$counter] = $join;
			$filters['no-filter-setup'][$counter] = $noFiltersSetup;
			$filters['hidden'][$counter] = $hidden;
			$filters['key'][$counter] = $key;
			$filters['key2'][$counter] = $key2;
			$filters['search_type'][$counter] = $search_type;
			$filters['match'][$counter] = $match;
			$filters['full_words_only'][$counter] = $fullWordsOnly;
			$filters['eval'][$counter] = $eval;
			$filters['required'][$counter] = $required;
			$filters['access'][$counter] = $access;
			$filters['grouped_to_previous'][$counter] = $grouped;
			$filters['label'][$counter] = $label;
			$filters['elementid'][$counter] = $elid;
			$filters['sqlCond'][$counter] = $sqlCond;
			$filters['raw'][$counter] = $raw;
			$filters['orig_condition'][$counter] = $origCondition;

			if (array_search($key, $postKeys) === false)
			{
				$this->counter++;
			}
		}
	}

	/**
	 * Get an array of the lists's plugin filter keys
	 *
	 * @return  array  key names
	 */
	public function getPluginFilterKeys()
	{
		$pluginManager = FabrikWorker::getPluginManager();
		$pluginManager->runPlugins('onGetFilterKey',
$this->listModel, 'list');

		return $pluginManager->data;
	}
}
models/oai.php000064400000037370151165347420007332 0ustar00<?php
/**
 * Fabrik Open Archive Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\CMS\Date\Date;

jimport('joomla.application.component.model');

/**
 * Fabrik Open Archive Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.4
 */
class FabrikFEModelOai extends FabModel
{

	/**
	 * Delimiter used in unique resource identifier
	 *
	 * @var string
	 */
	private $delimiter = ':';

	/**
	 * @var DOMDocument
	 */
	public $dom;

	private $listModel;

	/**
	 * Single getRecord record
	 *
	 * @var array
	 */
	private $record = array();

	public function __construct(array $config)
	{
		$this->dom                     = new DOMDocument('1.0',
'utf-8');
		$this->dom->preserveWhiteSpace = false;
		$this->dom->formatOutput       = true;
		parent::__construct($config);
	}

	/**
	 * Set the list model
	 *
	 * @param $listModel
	 */
	public function setListModel($listModel)
	{
		$this->listModel = $listModel;
	}

	/**
	 * Build the document header section
	 *
	 * @return DOMNode
	 */
	public function root()
	{
		$oai = $this->dom->createElement('OAI-PMH');

		$oai->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns',
			'http://www.openarchives.org/OAI/2.0/'
		);

		$oai->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:dcterms',
			'http://purl.org/dc/terms/'
		);

		$oai->setAttributeNS('http://www.w3.org/2000/xmlns/',
			'xmlns:dcmitype',
			'http://purl.org/dc/dcmitype/');

		$oai->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:xsi',
			'http://www.w3.org/2001/XMLSchema-instance'
		);

		$oai->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance',
'schemaLocation', 'http://www.openarchives.org/OAI/2.0/
http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd');

		return $oai;
	}

	/**
	 * Map a set of node attributes to a node.
	 *
	 * @param DOMNode $node
	 * @param array   $attributes
	 */
	public function nodeAttributes(&$node, $attributes)
	{
		foreach ($attributes as $key => $value)
		{
			$attribute        = $this->dom->createAttribute($key);
			$attribute->value = $value;
			$node->appendChild($attribute);
		}
	}

	/**
	 * Create response date
	 *
	 * @return DOMElement
	 */
	public function responseDate()
	{
		return $this->dom->createElement('responseDate',
date('c'));
	}

	/**
	 * Get OAI Base URL
	 *
	 * @return string
	 */
	private function baseUrl()
	{
		$uri = Juri::getInstance()->toString(array('scheme',
'host', 'path')) .
'?option=com_fabrik&controller=oai&format=oai';

		return htmlspecialchars($uri, ENT_COMPAT, 'UTF-8');
	}

	/**
	 * Create the request DOM element
	 *
	 * @return DOMElement
	 */
	public function requestElement()
	{
		$node = $this->dom->createElement('request',
$this->baseUrl());

		return $node;
	}

	/**
	 * @param DOMElement $node
	 */
	private function addNameSpace(&$node)
	{
		$node->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns',
			'http://www.openarchives.org/OAI/2.0/'
		);

		$node->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:xsi',
			'http://www.w3.org/2001/XMLSchema-instance'
		);

		$node->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance',
			'schemaLocation', 'http://www.openarchives.org/OAI/2.0/
http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd');

	}

	public function getOAIElements()
	{
		$params = $this->listModel->getParams();

		return json_decode($params->get('open_archive_elements'));
	}

	/**
	 * @param DOMElement $node
	 */
	public function appendChild($node)
	{
		$this->dom->appendChild($node);
	}

	/**
	 * @param      $name
	 * @param null $value
	 *
	 * @return DOMElement
	 */
	public function createElement($name, $value = null)
	{
		return $this->dom->createElement($name, $value);
	}

	/**
	 * Generate the repository identifier
	 *
	 * @return DOMElement
	 */
	private function repositoryIdentifierElement()
	{
		$repositoryIdentifier = $this->repositoryIdentifier();

		return $this->dom->createElement('repositoryIdentifier',
$repositoryIdentifier);
	}

	/**
	 * @return string
	 */
	public function repositoryIdentifier()
	{
		$config = ComponentHelper::getParams('com_fabrik');

		return $config->get('oai_repository_identifier',
			Juri::getInstance()->toString(array('host')));
	}

	/**
	 * Generate the Error XML response
	 *
	 * @param array $err error and code values.
	 *
	 * @return string
	 */
	public function generateError($err)
	{
		$root = $this->root();
		$root->appendChild($this->responseDate());
		$root->appendChild($this->requestElement());
		$error = $this->dom->createElement('error',
$err['msg']);
		$this->nodeAttributes($error, array('code' =>
$err['code']));
		$root->appendChild($error);
		$this->dom->appendChild($root);

		return $this->dom->saveXML();
	}

	/**
	 * Check a record identifier
	 *
	 *  oai:site.com:{listid}/{recordid}
	 *
	 * @param string $identifier E.g. 'oai:fabrik.rocks:17/1'
	 *
	 * @return bool
	 */
	public function checkIdentifier($identifier)
	{
		$record = $this->getListRowIdFromIdentifier($identifier);

		if (!$record)
		{
			return false;
		}

		$listId = $record[0];
		$rowId  = $record[1];

		/** @var FabrikFEModelList $listModel */
		$listModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$listModel->setId($listId);
		$formModel = $listModel->getFormModel();
		$formModel->setRowId($rowId);
		$row = $formModel->getData();

		if (!array_key_exists('__pk_val', $row))
		{
			return false;
		}

		return true;
	}

	/**
	 * Get the list and row id array data from the record identifier string
	 *
	 * @param   string $identifier
	 *
	 * @return array|bool
	 */
	public function getListRowIdFromIdentifier($identifier)
	{
		$prefix = 'oai:' . $this->repositoryIdentifier() .
':';

		if (!strstr($identifier, $prefix))
		{
			return false;
		}

		$identifier = str_replace($prefix, '', $identifier);

		return explode('/', $identifier);
	}

	/**
	 * // <resumptionToken completeListSize="13239"
cursor="0">T3hz</resumptionToken>
	 */
	public function resumptionToken($total, $filter)
	{
		$limitStart  = $this->listModel->limitStart;
		$limitLength = $this->listModel->limitLength;
		$listId      = $this->listModel->getId();
		$value       = 'limitstart' . $listId . '=' .
($limitStart + $limitLength);
		$dateEl      = $this->dateElName();

		$range = $filter[$dateEl]['value'];
		$value .= '&from=' . $range[0] . '&until=' .
$range[1];
		$token = $this->dom->createElement('resumptionToken',
urlencode($value));
		$this->nodeAttributes($token, array('completeListSize' =>
$total, 'cursor' => $limitStart));

		return $token;
	}

	/**
	 * Get the (raw) full element name for the date field.
	 *
	 * @param boolean $raw Append _raw to the element name
	 *
	 * @return string
	 */
	public function dateElName($raw = true)
	{
		$formModel = $this->listModel->getFormModel();
		$suffix    = $raw ? '_raw' : '';
		$params    = $this->listModel->getParams();

		return
$formModel->getElement($params->get('open_archive_timestamp'),
true)
			->getFullName(true, false) . $suffix;
	}

	public function supportMetaDataPrefix($prefix)
	{
		return $prefix === 'oai_dc';
	}

	/**
	 * Create the Identity XML response
	 *
	 * @return string
	 */
	public function identity()
	{
		$config = Factory::getApplication()->getConfig();

		$root = $this->root();
		$root->appendChild($this->responseDate());
		//$root->appendChild($this->requestElement());
		$request = $this->requestElement();
		$this->nodeAttributes($request, array('verb' =>
'Identify'));
		$root->appendChild($request);
		$identify = $this->dom->createElement('Identify');
		$identify->appendChild($this->dom->createElement('repositoryName',
$config->get('sitename')));
		$identify->appendChild($this->dom->createElement('baseURL',
$this->baseUrl()));
		$identify->appendChild($this->dom->createElement('protocolVersion',
'2.0'));
		$identify->appendChild($this->dom->createElement('adminEmail',
$config->get('mailfrom')));
		$identify->appendChild($this->dom->createElement('earliestDatestamp',
'1970-01-01T00:00:00Z'));
		$identify->appendChild($this->dom->createElement('deletedRecord',
'no'));
		$identify->appendChild($this->dom->createElement('granularity',
'YYYY-MM-DD'));

		$desc       = $this->dom->createElement('description');
		$identifier =
$this->dom->createElement('oai-identifier');
		//$this->addNameSpace($identifier);

		$identifier->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns',
			'http://www.openarchives.org/OAI/2.0/oai-identifier'
		);

		$identifier->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:xsi',
			'http://www.w3.org/2001/XMLSchema-instance'
		);

		$identifier->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance',
			'schemaLocation',
'http://www.openarchives.org/OAI/2.0/oai-identifier
http://www.openarchives.org/OAI/2.0/oai-identifier.xsd');

		$identifier->appendChild($this->dom->createElement('scheme',
'oai'));

		$identifier->appendChild($this->repositoryIdentifierElement());
		$identifier->appendChild($this->dom->createElement('delimiter',
$this->delimiter));
		$sample = 'oai:' . $this->repositoryIdentifier() .
':4/255';
		$identifier->appendChild($this->dom->createElement('sampleIdentifier',
$sample));
		$desc->appendChild($identifier);
		$identify->appendChild($desc);
		$root->appendChild($identify);
		$this->dom->appendChild($root);

		return $this->dom->saveXML();
	}

	/**
	 * Build the row's <oai_dc:dc> node (Dublin core date)
	 * Setting the attribute name space
	 *
	 * @return DOMNode
	 */
	public function rowOaiDc()
	{
		$oaiDc = $this->createElement('oai_dc:dc');

		$oaiDc->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:oai_dc',
			'http://www.openarchives.org/OAI/2.0/oai_dc/'
		);

		$oaiDc->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:dc',
			'http://purl.org/dc/elements/1.1/'
		);

		/*$oaiDc->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:dcterms',
			'http://purl.org/dc/terms/'
		);*/

		$oaiDc->setAttributeNS(
			'http://www.w3.org/2000/xmlns/',
			'xmlns:xsi',
			'http://www.w3.org/2001/XMLSchema-instance'
		);

		$oaiDc->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance',
'schemaLocation',
			'http://www.openarchives.org/OAI/2.0/oai_dc/
http://www.openarchives.org/OAI/2.0/oai_dc.xsd');

		return $oaiDc;
	}

	/**
	 * @param array $record
	 */
	public function setRecord($record = array())
	{
		$this->record = $record;
	}

	/**
	 * @return DOMElement
	 */
	public function getRecordHeader()
	{
		$dateEl = $this->dateElName();

		if (!array_key_exists('__pk_val', $this->record))
		{
			throw new UnexpectedValueException('__pk_val value not
defined');
		}

		if (!array_key_exists($dateEl, $this->record))
		{
			throw new UnexpectedValueException('date timestamp element not
defined');
		}

		$header = $this->dom->createElement('header');

		$header->appendChild($this->dom->createElement('identifier',
$this->recordIdentifier()));

		$timestamp = new Date($this->record[$dateEl]);
		$header->appendChild($this->dom->createElement('datestamp',
$timestamp->format('Y-m-d')));

		return $header;
	}

	private function recordIdentifier()
	{
		$prefix = 'oai:' . $this->repositoryIdentifier() .
':';
		$prefix .= $this->listModel->getId();
		$prefix .= '/' . $this->record['__pk_val'];

		return $prefix;
	}

	/**
	 * Get an individual record
	 *
	 * @return DOMDocument
	 */
	public function getRecord()
	{
		$root     = $this->root();
		$header   = $this->getRecordHeader();
		$metaData = $this->getRecordMetaData();
		$root->appendChild($this->responseDate());
		$request = $this->requestElement();
		$this->nodeAttributes($request, array('verb' =>
'GetRecord', 'identifier' =>
$this->recordIdentifier(),
			'metadataPrefix' => 'oai_dc'));
		$root->appendChild($request);

		$getRecord = $this->dom->createElement('GetRecord');
		$record    = $this->dom->createElement('record');

		$record->appendChild($header);
		$record->appendChild($metaData);

		$getRecord->appendChild($record);
		$root->appendChild($getRecord);
		$this->dom->appendChild($root);

		return $this->dom;
	}

	/**
	 * @return DOMElement
	 */
	public function getRecordMetaData()
	{
		$metaData = $this->dom->createElement('metadata');
		$row      = $this->rowOaiDc();

		$this->dcRow($row, $this->record);
		$metaData->appendChild($row);
		return $metaData;
	}

	/**
	 * @param DOMElement &$node To append Dublin Core data to
	 * @param object     $row   Data
	 */
	public function dcRow(&$node, $row)
	{
		if (is_array($row))
		{
			$row = ArrayHelper::toObject($row);
		}

		$elements  = $this->getOAIElements();
		$formModel = $this->listModel->getFormModel();
		$i         = 0;

		foreach ($elements->dublin_core_element as $elementId)
		{
			$elementKey = $formModel->getElement($elementId,
true)->getFullName(true, false);

			if ($elements->raw[$i] === '1')
			{
				$elementKey .= '_raw';
			}

			$nodeValue = isset($row->$elementKey) ? $row->$elementKey :
'';
			$nodeType  = strtolower($elements->dublin_core_type[$i]);
			$nodeType  = str_replace('dc.', 'dc:', $nodeType);

			if (!is_string($nodeValue))
			{
				$nodeValue = json_encode($nodeValue);
			}

			$nodeValue = html_entity_decode($nodeValue, null, "UTF-8");
			$child = $this->createElement($nodeType, $nodeValue);
			$node->appendChild($child);

			$i++;
		}
	}

	/**
	 * Get the list id from the setName
	 *
	 * @param string $setName
	 *
	 * @return mixed
	 */
	public function listIdFromSetName($setName)
	{
		$db    = $this->_db;
		$query = $db->getQuery(true);
		$query->select('id')->from('#__fabrik_lists')
			->where('params LIKE
\'%"open_archive_set_spec":"' . $setName .
'"%\'')
			->where('params LIKE
\'%"open_archive_active":"1"%\'');
		$db->setQuery($query);

		return $db->loadResult();
	}

	/**
	 * Create OAI listSet data
	 *
	 * @return DOMDocument
	 */
	public function listSets()
	{
		$root = $this->root();
		$root->appendChild($this->responseDate());
		$request = $this->requestElement();
		$this->nodeAttributes($request, array('verb' =>
'ListSets'));
		$root->appendChild($request);
		$listSet = $this->dom->createElement('ListSets');
		$db      = $this->_db;
		$query   = $db->getQuery(true);
		$query->select('id, label,
params')->from('#__fabrik_lists');
		$db->setQuery($query);
		$lists = $db->loadObjectList();

		foreach ($lists as $list)
		{
			$params = new Registry($list->params);

			if ((bool) $params->get('open_archive_active', 0))
			{
				$set = $this->dom->createElement('set');
				$set->appendChild($this->dom->createElement('setSpec',
$params->get('open_archive_set_spec')));
				$set->appendChild($this->dom->createElement('setName',
$list->label));
				$listSet->appendChild($set);
			}
		}

		$root->appendChild($listSet);
		$this->dom->appendChild($root);

		return $this->dom;
	}

	/**
	 * List the meta data formats - currently we only support dublin core.
	 *
	 * @param string $identifier
	 *
	 * @return DOMDocument
	 */
	public function listMetaDataFormats($identifier = '')
	{
		$root = $this->root();
		$root->appendChild($this->responseDate());
		$request = $this->requestElement();
		$this->nodeAttributes($request, array('verb' =>
'ListMetadataFormats', 'identifier' =>
$identifier));
		$root->appendChild($request);
		$list   =
$this->dom->createElement('ListMetadataFormats');
		$format = $this->dom->createElement('metadataFormat');
		$format->appendChild($this->dom->createElement('metadataPrefix',
'oai_dc'));
		$format->appendChild($this->dom->createElement('schema',
'http://www.openarchives.org/OAI/2.0/oai_dc.xsd'));
		$format->appendChild($this->dom->createElement('metadataNamespace',
'http://www.openarchives.org/OAI/2.0/oai_dc/'));
		$list->appendChild($format);
		$root->appendChild($list);
		$this->dom->appendChild($root);

		return $this->dom;
	}

}
models/parent.php000064400000001660151165347420010044 0ustar00<?php
/**
 * Extend JModel with Fabrik specific methods
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// ROB don't think this is used - use fabrik.php model instead

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Model\BaseDatabaseModel;

jimport('joomla.application.component.model');

/**
 * Extend JModel with Fabrik specific methods
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */

class FabrikFEModel extends BaseDatabaseModel
{
	/**
	 * required for compatibility with mambo 4.5.4
	 *
	 * @param   mixed  $value  value to set all properties to default null
	 *
	 * @return  null
	 */

	public function reset($value = null)
	{
		$keys = $this->getProperties();

		foreach ($keys as $k)
		{
			$this->$k = $value;
		}
	}
}
models/plugin-cron.php000064400000007000151165347420011002 0ustar00<?php
/**
 * Fabrik Plugin Cron Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Table\Table;
use Joomla\CMS\Factory;

jimport('joomla.application.component.model');

/**
 * Fabrik Plugin Cron Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */

class PlgFabrik_Cron extends FabrikPlugin
{
	/**
	 * Plugin item
	 *
	 * @var object
	 */
	protected $row = null;

	/**
	 * Log
	 *
	 * @var string
	 */
	protected $log = null;


	/**
	 * Allow plugin to stop rescheduling
	 *
	 * @var bool
	 */
	public $reschedule = true;

	/**
	 * Get the db row
	 *
	 * @param   bool  $force  force reload
	 *
	 * @return  object
	 */
	public function &getTable($force = false)
	{
		if (!$this->row || $force)
		{
			Table::addIncludePath(JPATH_ADMINISTRATOR .
'/components/com_fabrik/tables');
			$row = FabTable::getInstance('Cron', 'FabrikTable');
			$row->load($this->id);
			$this->row = $row;
		}

		return $this->row;
	}

	/**
	 * Whether cron should automagically load table data
	 *
	 * @return  bool
	 */
	public function requiresTableData()
	{
		return true;
	}

	/**
	 * Get the log out put
	 *
	 * @return  string
	 */
	public function getLog()
	{
		return $this->log;
	}

	/**
	 * Only applicable to cron plugins but as there's no sub class for
them
	 * the methods here for now
	 * Determines if the cron plug-in should be run - if require_qs is true
	 * then fabrik_cron=1 needs to be in the query string
	 *
	 * @return  bool
	 */
	public function queryStringActivated()
	{
		$params = $this->getParams();
		
		// Felixkat
		$session = Factory::getSession();
		$fabrikCron = new stdClass();
		$fabrikCron->dropData =
$params->get('cron_importcsv_dropdata');
		$fabrikCron->requireJS = $params->get('require_qs');
		$secret = $params->get('require_qs_secret', '');
		$fabrikCron->secret =
$this->app->getInput()->getString('fabrik_cron',
'') === $secret;
		$session->set('fabrikCron', $fabrikCron);
		// Felixkat

		if (!$params->get('require_qs', false))
		{
			// Querystring not required so plugin should be activated
			return true;
		}

		// check to see if a specific keyword is needed to run this plugin
		if ($secret = $params->get('require_qs_secret',
''))
		{
			return
$this->app->getInput()->getString('fabrik_cron',
'') === $secret;
		}
		else
		{
			return $this->app->getInput()->getInt('fabrik_cron',
0) === 1;
		}
	}

	/**
	 * Only applicable to cron plugins but as there's no sub class for
them
	 * the methods here for now
	 *
	 * Check if we should do run gating for this cron job, whereby we set the
task to unpublished
	 * until it has finished running, to prevent multiple copies running.
	 *
	 * @return  bool
	 */
	public function doRunGating()
	{
		$params = $this->getParams();

		return $params->get('cron_rungate', '0') ===
'1';
	}

	/**
	 * Allow plugin to decide if it wants to be rescheduled
	 *
	 * @param   bool  $reschedule  Switch to turn off rescheduling if set to
false
	 *
	 * @return  bool
	 */
	public function shouldReschedule($reschedule = true)
	{
		if ($reschedule === false)
		{
			$this->reschedule = false;
		}

		return $this->reschedule;
	}

	/**
	 * Do the plugin action
	 *
	 * @param   array &$data data
	 * @param   object  &$listModel  List model
	 *
	 * @return  int  number of records updated
	 */
	public function process(&$data, &$listModel)
	{
		return 0;
	}
}
models/plugin-form.php000064400000040717151165347430011021 0ustar00<?php
/**
 * Fabrik Plugin From Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Profiler\Profiler;
use Fabrik\Helpers\LayoutFile;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;

jimport('joomla.application.component.model');

/**
 * Fabrik Plugin From Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class PlgFabrik_Form extends FabrikPlugin
{
	/**
	 * Formatted email data
	 *
	 * @var array
	 */
	protected $emailData = null;

	/**
	 * HTML to return from plugin rendering
	 *
	 * @var string
	 */
	protected $html = '';

	/**
	 * Uses session during processing
	 *
	 * @var bool
	 */
	protected $usesSession = false;

	/**
	 * Data
	 *
	 * @var array
	 */
	protected $data = array();

	/**
	 * J! Log
	 *
	 * @var  object
	 */
	protected $log = null;

	/**
	 * Run from form model when deleting record
	 *
	 * @param   array &$groups Form data for deletion
	 *
	 * @return  bool
	 */
	public function onDeleteRowsForm(&$groups)
	{
		return true;
	}

	/**
	 * Run from list model when deleting rows
	 *
	 * @param   array &$groups List data for deletion
	 *
	 * @return  bool
	 */
	public function onAfterDeleteRowsForm(&$groups)
	{
		return true;
	}

	/**
	 * Run right at the beginning of the form processing
	 *
	 * @return    bool
	 */
	public function onBeforeProcess()
	{
		return true;
	}

	/**
	 * Run if form validation fails
	 *
	 * @return    bool
	 */
	public function onError()
	{
	}

	/**
	 * Run before table calculations are applied
	 *
	 * @return    bool
	 */
	public function onBeforeCalculations()
	{
		return true;
	}

	/**
	 * Run right at the end of the form processing
	 * form needs to be set to record in database for this to hook to be
called
	 *
	 * @return    bool
	 */
	public function onAfterProcess()
	{
		return true;
	}

	/**
	 * Alter the returned plugin manager's result
	 *
	 * @param   string $method Method
	 *
	 * @return bool
	 */
	public function customProcessResult($method)
	{
		return true;
	}

	/**
	 * Sets up HTML to be injected into the form's bottom
	 *
	 * @return void
	 */
	public function getBottomContent()
	{
		$this->html = '';
	}

	/**
	 * Inject custom html into the bottom of the form
	 *
	 * @param   int $c plugin counter
	 *
	 * @return  string  html
	 */
	public function getBottomContent_result($c)
	{
		return $this->html;
	}

	/**
	 * Store the html to insert at the top of the form
	 *
	 * @return  bool
	 */
	public function getTopContent()
	{
		$this->html = '';
	}

	/**
	 * Get any html that needs to be written at the top of the form
	 *
	 * @return  string  html
	 */
	public function getTopContent_result()
	{
		return $this->html;
	}

	/**
	 * Sets up any end html (after form close tag)
	 *
	 * @return  void
	 */
	public function getEndContent()
	{
		$this->html = '';
	}

	/**
	 * Get any html that needs to be written after the form close tag
	 *
	 * @return    string    html
	 */
	public function getEndContent_result()
	{
		return $this->html;
	}

	/**
	 * Helper method used in plugin onProcess() methods. Gets the form's
data merged
	 * with the email data. So raw values are those of the submitted form and
labels are
	 * those of the element model's getEmailValue() method (if found)
	 *
	 * @since   3.1rc1
	 *
	 * @return  array
	 */
	public function getProcessData()
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark("getProcessData: start") : null;

		$model = $this->getModel();

		// See comments in getEmailData() about caching in $this vs $model
		unset($this->emailData);
		unset($model->emailData);
		$d          = isset($model->formDataWithTableName) ?
$model->formDataWithTableName : array();
		$this->data = array_merge($d, $this->getEmailData());
		JDEBUG ? $profiler->mark("getProcessData: end") : null;

		return $this->data;
	}

	/**
	 * Convert the posted form data to the data to be shown in the email
	 * e.g. radio buttons swap their values for the value's label
	 *
	 * @return array email data
	 */
	public function getEmailData()
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark("getEmailData: start") : null;

		/**
		 * NOTE - $$$ hugh - 9/17/2014  - we were originally caching in
$this->emailData, but that provides no caching help at all,
		 * as "this" is a plugin model, and the cache needs to be on
the form model.  So changed it to use
		 * the $model->emailData.  But for backward compatibility, we will
continue to store a copy in $this.  This change has
		 * yielded huge speed gains on form submission for larger forms (in my
testing, more than cutting it in half),
		 * as until this change we were re-buiding the $emailData from scratch
for every element on the form, which didn't
		 * become apparent till we added the fabrikdebug=2 to allows profiling of
submissions, and added the extra profiling
		 * marks for the submission processing
		 *
		 * ... which is great, but ...
		 *
		 * I have a sneaky suspicion it may have some unforeseen side effects for
things like calcs, in certain corner
		 * cases where this function gets called early in submission processing. 
So watch out for that.  If calcs start
		 * showing up with incorrect values in emails, this is probably why.
		 */

		$model = $this->getModel();

		if (isset($model->emailData))
		{
			JDEBUG ? $profiler->mark("getEmailData: cached") : null;

			return $model->emailData;
		}

		/** @var FabrikFEModelForm $model */
		$model = $this->getModel();

		if (is_null($model->formDataWithTableName))
		{
			return array();
		}

		$model->isAjax();
		/* $$$rob don't render the form - there's no need and it gives
a warning about an unfound rowid
		 * $$$ rob also it sets the fromModels rowid to an + int even if we are
submitting a new form
		 * which means that form plug-ins set to run on new only don't get
triggered if they appear after
		 * fabrikemail/fabrikreceipt
		 * Now instead the pk value is taken from the tableModel->lastInsertId
and inserted at the end of this method
		 *$model->render();
		 *
		 * $$$ hugh - hmmmm problem with that is, there's quite a few things
that need the rowid, if we're running
		 * 'onAfterProcess' ... I think we need to have a separate
$model->isNewRow, or some such, which gets set at
		 * the start of processing, and anything which needs to know if
we're new vs edit uses that, rather than looking
		 * for rowid / __pk_val, or whatever.
		 */

		$listModel = $model->getListModel();
		$editable  = $model->isEditable();
		$model->setEditable(false);

		if (is_object($listModel))
		{
			$joins = $listModel->getJoins();
			$model->getJoinGroupIds($joins);
		}

		$this->emailData  = array();
		$model->emailData = array();

		// $$$ hugh - temp foreach fix
		$groups = $model->getGroupsHiarachy();

		foreach ($groups as $gKey => $groupModel)
		{
			$groupParams = $groupModel->getParams();

			// Check if group is actually a table join
			$repeatGroup = 1;

			if ($groupModel->canRepeat())
			{
				if ($groupModel->isJoin())
				{
					$joinModel = $groupModel->getJoinModel();
					$joinTable = $joinModel->getJoin();

					if (is_object($joinTable))
					{
						if (!$groupParams->get('repeat_group_show_first'))
						{
							continue;
						}

						// Need to duplicate this perhaps per the number of times
						// that a repeat group occurs in the default data?

						$elementModels = $groupModel->getPublishedElements();
						reset($elementModels);

						if (!empty($elementModels))
						{
							$tmpElement        = current($elementModels);
							$smallerElHTMLName = $tmpElement->getFullName(true, false);
							$tmpEl             =
FArrayHelper::getValue($model->formDataWithTableName,
$smallerElHTMLName, array(), 'array');
							$repeatGroup       = count($tmpEl);
						}
					}
				}
			}

			$groupModel->repeatTotal = $repeatGroup;

			for ($c = 0; $c < $repeatGroup; $c++)
			{
				$elementModels = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					// Force reload?
					$elementModel->defaults          = null;
					$elementModel->_repeatGroupTotal = $repeatGroup - 1;

					$k   = $elementModel->getFullName(true, false);
					$key = $elementModel->getFullName(true, false);

					// Used for working out if the element should behave as if it was
					// in a new form (joined grouped) even when editing a record
					$elementModel->inRepeatGroup = $groupModel->canRepeat();
					$elementModel->_inJoin       = $groupModel->isJoin();
					$elementModel->setEditable(false);

					if ($groupModel->isJoin())
					{
						if ($groupModel->canRepeat())
						{
							$raw                              =
FArrayHelper::getValue($model->formDataWithTableName[$k], $c,
'');
							$this->emailData[$k . '_raw'][$c] = $raw;
							$this->emailData[$k][$c]          =
$elementModel->getEmailValue($raw, $model->formDataWithTableName,
$c);
							continue;
						}
						else
						{
							// E.g. ajax file upload - repeat data in none-repeat group
							if (array_key_exists($k, $model->formDataWithTableName)
&& is_array($model->formDataWithTableName[$k]))
							{
								foreach ($model->formDataWithTableName[$k] as $multiKey =>
$multiData)
								{
									$this->emailData[$k . '_raw'][$multiKey] =
$multiData;
									$this->emailData[$k][$multiKey]          =
$elementModel->getEmailValue($multiData,
$model->formDataWithTableName, $multiData);
								}
								continue;
							}
						}
					}
					elseif (array_key_exists($key, $model->formDataWithTableName))
					{
						$rawValue = FArrayHelper::getValue($model->formDataWithTableName,
$k . '_raw', '');

						if ($rawValue == '')
						{
							$this->emailData[$k . '_raw'] =
$model->formDataWithTableName[$key];
						}
						else
						{
							/* Things like the user element only have their raw value filled in
at this point
							 * so don't overwrite that with the blank none-raw value
							 * the none-raw value is add in getEmailValue()
							 */
							$this->emailData[$k . '_raw'] = $rawValue;
						}
					}

					$emailValue = '';

					if (array_key_exists($k . '_raw', $this->emailData))
					{
						$emailValue = $this->emailData[$k . '_raw'];
					}
					elseif (array_key_exists($k, $this->emailData))
					{
						$emailValue = $this->emailData[$k];
					}

					/**
					 * $$$ hugh - no idea why we wouldn't call getEmailValue() for
multiselect joins, happened in this commit:
					 *
https://github.com/Fabrik/fabrik/commit/06a03dbb430281951f00b9b3b691ea015a52ac7b
					 * ... but afaict, it's bogus, as otherwise multiselect joins
never get processed in to labels, and stay as raw values.
					 */
					//if (!$elementModel->isJoin())
					//{
					$this->emailData[$k] = $elementModel->getEmailValue($emailValue,
$model->formDataWithTableName, $c);
					//}
				}
			}
		}

		$pk = $listModel->getPrimaryKey(true);

		// If form contained joins then this was altering the exiting pk data to
be the joined table's id - not good!
		if (is_object($listModel) && empty($this->emailData[$pk]))
		{
			$this->emailData[$pk]          = $listModel->lastInsertId;
			$this->emailData[$pk . '_raw'] =
$listModel->lastInsertId;
		}

		$model->setEditable($editable);
		$model->emailData = $this->emailData;

		JDEBUG ? $profiler->mark("getEmailData: end") : null;

		return $this->emailData;
	}

	/**
	 * Set redirect URL for process plugins that navigate to a 3rd party site
	 * and then return to the site E.g Paypal.
	 *
	 * @param string $url
	 */
	protected function setDelayedRedirect($url)
	{
		$formModel = $this->model;
		$context = $formModel->getRedirectContext();

		/* $$$ hugh - fixing issue with new redirect, which now needs to be an
array.
		 * Not sure if we need to preserve existing session data, or just create
a new surl array,
		 * to force ONLY redirect to PayPal?
		 */
		$urls = (array) $this->session->get($context . 'url',
array());
		$urls[$this->renderOrder] = $url;
		$this->session->set($context . 'url', $urls);
		$this->session->set($context . 'redirect_content_how',
'samepage');
	}

	/**
	 * Get the class to manage the plugin
	 * to ensure that the file is loaded only once
	 *
	 * @since   3.1b
	 *
	 * @return void
	 */
	public function formJavascriptClass()
	{
		$formModel = $this->getModel();
		$ext       = FabrikHelperHTML::isDebug() ? '.js' :
'-min.js';
		$name      = $this->_name;
		static $jsClasses;

		if (!isset($jsClasses))
		{
			$jsClasses = array();
		}

		// Load up the default script

		$script = 'plugins/fabrik_form/' . $name . '/' .
$name . $ext;

		if (empty($jsClasses[$script]))
		{
			$formModel->formPluginShim[ucfirst($name)] = $script;
			$jsClasses[$script]                        = 1;
		}
	}

	/**
	 * Get a list of admins which should receive emails
	 *
	 * @return  array  admin user objects
	 */
	protected function getAdminInfo()
	{
		$query = $this->_db->getQuery(true);
		$query->select('id, name, email,
sendEmail')->from('#__users')->where('sendEmail =
1');
		$this->_db->setQuery($query);
		$rows = $this->_db->loadObjectList();

		return $rows;
	}

	/**
	 * Does the plugin use session.on
	 *
	 * @since  3.0.8
	 *
	 * @return  void
	 */
	public function usesSession()
	{
		$this->usesSession = false;
	}

	/**
	 * Does the plugin use session.on - returned results
	 *
	 * @since  3.0.8
	 *
	 * @return    bool  session.on
	 */

	public function usesSession_result()
	{
		return $this->usesSession;
	}

	/**
	 * Get the element's LayoutInterface file
	 * Its actually an instance of LayoutFile which inverses the ordering
added include paths.
	 * In LayoutFile the addedPath takes precedence over the default paths,
which makes more sense!
	 *
	 * @param   string $type form/details/list
	 *
	 * @return LayoutFile
	 */
	public function getLayout($type)
	{
		$name     = get_class($this);
		$name     =
strtolower(StringHelper::str_ireplace('PlgFabrik_Form',
'', $name));
		$basePath = COM_FABRIK_BASE . '/plugins/fabrik_form/' . $name .
'/layouts';
		$layout   = new LayoutFile('fabrik-form-' . $name .
'-' . $type, $basePath, array('debug' => false,
'component' => 'com_fabrik', 'client'
=> 'site'));
		$layout->addIncludePaths(JPATH_THEMES . '/' .
$this->app->getTemplate() . '/html/layouts');
		$layout->addIncludePaths(JPATH_THEMES . '/' .
$this->app->getTemplate() . '/html/layouts/com_fabrik');

		return $layout;
	}

	/**
	 * Get the fields value regardless of whether its in joined data or no
	 *
	 * @param   string $pName   Params property name to get the value for
	 * @param   array  $data    Posted form data
	 * @param   mixed  $default Default value
	 *
	 * @return  mixed  value
	 */
	public function getFieldValue($pName, $data, $default = '')
	{
		$params = $this->getParams();

		if ($params->get($pName, '') === '')
		{
			return $default;
		}

		$elementModel =
FabrikWorker::getPluginManager()->getElementPlugin($params->get($pName));
		$name         = $elementModel->getFullName(true, false);

		return ArrayHelper::getValue($data, $name, $default);
	}

	/**
	 * Get an element name
	 *
	 * @param   string $pname Params property name to look up
	 * @param   bool   $short Short (true) or full (false) element name,
default false/full
	 *
	 * @return    string    element full name
	 */
	public function getFieldName($pname, $short = false)
	{
		$params = $this->getParams();

		if ($params->get($pname) == '')
		{
			return '';
		}

		$value = $params->get($pname);

		if (is_numeric($value))
		{
			$elementModel =
FabrikWorker::getPluginManager()->getElementPlugin($value);

			return $short ? $elementModel->getElement()->name :
$elementModel->getFullName();
		}
		else
		{
			return $short ? FabrikString::shortColName($value) :
FabrikString::safeColNameToArrayKey($value);
		}
	}

	/**
	 * Replace a plugin parameter value with data parsed via
parseMessageForPlaceholder
	 *
	 * @param string $pName Parameter name
	 *
	 * @return string
	 */
	public function placeholder($pName)
	{
		$params = $this->getParams();
		$w      = new FabrikWorker;

		return $w->parseMessageForPlaceHolder($params->get($pName),
$this->data);
	}

	/**
	 * Log a message
	 *
	 * @param  string $msgType The dotted message type
	 * @param  string $msg     The log message
	 */
	protected function doLog($msgType, $msg)
	{
		if ($this->log === null)
		{
			$this->log                = FabTable::getInstance('log',
'FabrikTable');
			$this->log->referring_url =
$this->app->getInput()->server->getString('REQUEST_URI');
		}
		$this->log->message_type = $msgType;
		$this->log->message      = $msg;
		$this->log->id           = '';
		$this->log->store();
	}
}
models/plugin-list.php000064400000024574151165347430011034 0ustar00<?php
/**
 * Fabrik Plugin From Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Filesystem\File;
use Joomla\String\StringHelper;

jimport('joomla.application.component.model');

use Fabrik\Helpers\LayoutFile;

/**
 * Fabrik Plugin From Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class PlgFabrik_List extends FabrikPlugin
{
	/**
	 * Button prefix
	 *
	 * @var string
	 */
	protected $buttonPrefix = '';

	/**
	 * JavaScript code to ini js object
	 *
	 * @var string
	 */
	protected $jsInstance = null;

	/**
	 * Get the parameter name that defines the plugins acl access
	 *
	 * @return  string
	 */
	protected function getAclParam()
	{
		return '';
	}

	/**
	 * Determine if we use the plugin or not
	 * both location and event criteria have to be match when form plug-in
	 *
	 * @param   string $location Location to trigger plugin on
	 * @param   string $event    Event to trigger plugin on
	 *
	 * @return  bool  true if we should run the plugin otherwise false
	 */
	public function canUse($location = null, $event = null)
	{
		$aclParam = $this->getAclParam();

		if ($aclParam == '')
		{
			return true;
		}

		$params = $this->getParams();
		$groups = $this->user->getAuthorisedViewLevels();

		return in_array($params->get($aclParam), $groups);
	}

	/**
	 * Can the plug-in select list rows
	 *
	 * @return  bool
	 */
	public function canSelectRows()
	{
		return false;
	}

	/**
	 * Can the plug-in use AJAX
	 *
	 * @return  bool
	 */
	public function canAJAX()
	{
		return true;
	}

	/**
	 * Get the button label
	 *
	 * @return  string
	 */
	protected function buttonLabel()
	{
		$s = StringHelper::strtoupper($this->buttonPrefix);

		return Text::_('PLG_LIST_' . $s . '_' . $s);
	}

	/**
	 * Prep the button if needed
	 *
	 * @param   array &$args Arguments
	 *
	 * @since  3.0.6.2
	 *
	 * @return  bool;
	 */
	public function button(&$args)
	{
		$model              = $this->getModel();
		$this->buttonAction = $model->actionMethod();
		$this->context      = $model->getRenderContext();

		return false;
	}

	/**
	 * Build the HTML for the plug-in button
	 *
	 * @return  string
	 */
	public function button_result()
	{
		if ($this->canUse())
		{
			$p  = $this->onGetFilterKey_result();
//			$j3 = FabrikWorker::j3();
//			$j3 = true;
			FabrikHelperHTML::addPath('plugins/fabrik_list/' . $p .
'/images/', 'image', 'list');
			$name = $this->_getButtonName();
			$label = $this->buttonLabel();
			$imageName = $this->getImageName();
			$tmpl = $this->getModel()->getTmpl();
			$properties = array();
			$opts       = array(
				'forceImage' => false
			);

			if (FabrikWorker::isImageExtension($imageName))
			{
				$opts['forceImage'] = true;
			}


			$img = FabrikHelperHTML::image($imageName, 'list', $tmpl,
$properties, false, $opts);
			$text = $this->buttonAction == 'dropdown' ? $label :
'<span class="hidden">' . $label .
'</span>';

//			if ($j3 && $this->buttonAction != 'dropdown')
			if ($this->buttonAction != 'dropdown')
			{
				$layout = FabrikHelperHTML::getLayout('fabrik-button');
				$layoutData = (object) array(
					'tag' => 'a',
					'attributes' => 'data-list="' .
$this->context . '" title="' . $label .
'"',
					'class' => $name . ' listplugin btn-default',
					'label' => $img . ' ' . $text
				);

				return $layout->render($layoutData);
			}
			else
			{
				$a = '<a href="#" data-list="' .
$this->context . '" class="' . $name . '
listplugin" title="' . $label . '">';

				return $a . $img . ' ' . $text . '</a>';
			}
		}

		return '';
	}

	/**
	 * Get button image
	 *
	 * @since   3.1b
	 *
	 * @return   string  image
	 */
	protected function getImageName()
	{
		return $this->getParams()->get('list_' .
$this->buttonPrefix . '_image_name', $this->buttonPrefix .
'.png');
	}

	/**
	 * Build an array of properties to ini the plugins JS objects
	 *
	 * @return  stdClass
	 */
	public function getElementJSOptions()
	{
		$opts          = new stdClass;
		$model         = $this->getModel();
		$opts->ref     = $model->getRenderContext();
		$opts->name    = $this->_getButtonName();
		$opts->listid  = $model->getId();
		$opts->canAJAX = $this->canAJAX();

		return $opts;
	}

	/**
	 * Return the javascript to create an instance of the class defined in
formJavascriptClass
	 *
	 * @param   array $args [0] => string table's form id to contain
plugin
	 *
	 * @return    bool
	 */
	public function onLoadJavascriptInstance($args)
	{
		Text::script('COM_FABRIK_PLEASE_SELECT_A_ROW');

		return true;
	}

	/**
	 * onGetData method
	 *
	 * @param   &$args  Array  Additional options passed into the method
when the plugin is called
	 *
	 * @return bool currently ignored
	 */
	public function onLoadData(&$args)
	{
		return true;
	}

	/**
	 * onFiltersGot method - run after the list has created filters
	 *
	 * @return bool currently ignored
	 */
	public function onFiltersGot()
	{
		return true;
	}

	/**
	 * Provide some default text that most table plugins will need
	 * (this object will then be json encoded by the plugin and passed
	 * to it's js class
	 *
	 * @depreciated since 3.0
	 *
	 * @return  object  language
	 */
	protected function _getLang()
	{
		$lang = new stdClass;

		return $lang;
	}

	/**
	 * Get the html name for the button
	 *
	 * @return  string
	 */

	protected function _getButtonName()
	{
		return $this->buttonPrefix . '-' . $this->renderOrder;
	}

	/**
	 * Preflight check to ensure that the list plugin should process
	 *
	 * @return    string|boolean
	 */
	public function process_preflightCheck()
	{
		if ($this->buttonPrefix == '')
		{
			return false;
		}

		$input             = $this->app->getInput();
		$postedRenderOrder =
$input->getInt('fabrik_listplugin_renderOrder', -1);

		return $input->get('fabrik_listplugin_name') ==
$this->buttonPrefix && $this->renderOrder ==
$postedRenderOrder;
	}

	/**
	 * Get a key name specific to the plugin class to use as the reference
	 * for the plugins filter data
	 * (Normal filter data is filtered on the element id, but here we use the
plugin name)
	 *
	 * @return  string  key
	 */
	public function onGetFilterKey()
	{
		$this->filterKey =
StringHelper::strtolower(str_ireplace('PlgFabrik_List',
'', get_class($this)));

		return $this->filterKey;
	}

	/**
	 * Call onGetFilterKey() from plugin manager
	 *
	 * @return  string
	 */
	public function onGetFilterKey_result()
	{
		if (!isset($this->filterKey))
		{
			$this->onGetFilterKey();
		}

		return $this->filterKey;
	}

	/**
	 * Plugins should use their own name space for storing their session data
	 * e.g radius search plugin stores its search values here
	 *
	 * @return  string
	 */
	protected function getSessionContext()
	{
		return 'com_' . $this->package . '.list' .
$this->model->getRenderContext() . '.plugins.' .
$this->onGetFilterKey() . '.';
	}

	/**
	 * Used to assign the js code created in onLoadJavascriptInstance()
	 * to the table view.
	 *
	 * @return  string  javascript to create instance. Instance name must be
'el'
	 */
	public function onLoadJavascriptInstance_result()
	{
		return $this->jsInstance;
	}

	/**
	 * Allows to to alter the table's select query
	 *
	 * @param   array &$args Arguments - first value is an object with a
JQuery object
	 *                       contains the current query:
	 *                       $args[0]->query
	 *
	 * @return  void;
	 */
	public function onQueryBuilt(&$args)
	{
	}

	/**
	 * Load the javascript class that manages plugin interaction
	 * should only be called once
	 *
	 * @return  string  javascript class file
	 */
	public function loadJavascriptClass()
	{
		return true;
	}

	/**
	 * Get the src(s) for the list plugin js class
	 *
	 * @return  mixed   array or null. If array then key is class name and
value
	 * is relative path to either compressed or uncompress js file.
	 */
	public function loadJavascriptClass_result()
	{
		$this->onGetFilterKey();
		$p = $this->onGetFilterKey_result();
		$ext = FabrikHelperHTML::isDebug() ? '.js' :
'-min.js';
		$file = 'plugins/fabrik_list/' . $p . '/' . $p .
$ext;

		if (File::exists(JPATH_SITE . '/' . $file))
		{
			return array('FbList' . ucfirst(($p)) => $file);
		}
		else
		{
			return null;
		}
	}

	public function loadJavascriptClassName()
	{
		return true;
	}

	public function loadJavascriptClassName_result()
	{
		return '';
	}

	/**
	 * Shouldn't do anything here - but needed for the result return
	 *
	 * @since   3.1b
	 *
	 * @return  void
	 */
	public function requireJSShim()
	{
	}

	/**
	 * Get the shim require.js logic for loading the list class.
	 * -min suffix added elsewhere.
	 *
	 * @since   3.1b
	 *
	 * @return  object  shim
	 */
	public function requireJSShim_result()
	{
		$deps                                                      = new
stdClass;
		$deps->deps                                                =
array('fab/list-plugin');
		$shim['list/' . $this->filterKey . '/' .
$this->filterKey] = $deps;

		return $shim;
	}

	/**
	 * Overridden by plugins if necessary.
	 * If the plugin is a filter plugin, return true if it needs the
'form submit'
	 * method, i.e. the Go button.  Implemented specifically for radius search
plugin.
	 *
	 * @return  null
	 */
	public function requireFilterSubmit()
	{
	}

	/**
	 * Overridden by plugins if necessary.
	 * If the plugin is a filter plugin, return true if it needs the
'form submit'
	 * method, i.e. the Go button.  Implemented specifically for radius search
plugin.
	 *
	 * @return  bool
	 */
	public function requireFilterSubmit_result()
	{
		return false;
	}

	/**
	 * Get the element's LayoutInterface file
	 * Its actually an instance of LayoutFile which inverses the ordering
added include paths.
	 * In LayoutFile the addedPath takes precedence over the default paths,
which makes more sense!
	 *
	 * @param   string $type form/details/list
	 *
	 * @return LayoutFile
	 */
	public function getLayout($type)
	{
		$name     = get_class($this);
		$name     =
strtolower(StringHelper::str_ireplace('PlgFabrik_List',
'', $name));
		$basePath = COM_FABRIK_BASE . '/plugins/fabrik_list/' . $name .
'/layouts';
		$layout   = new LayoutFile('fabrik-list-' . $name .
'-' . $type, $basePath, array('debug' => false,
'component' => 'com_fabrik', 'client'
=> 'site'));
		$layout->addIncludePaths(JPATH_THEMES . '/' .
$this->app->getTemplate() . '/html/layouts');

		return $layout;
	}
}
models/plugin.php000064400000071251151165347430010055 0ustar00<?php
/**
 * Base Fabrik Plugin Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Language\Language;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Version;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Session\Session;
use Joomla\CMS\User\User;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Fabrik\Helpers\Php;

jimport('joomla.application.component.model');

/**
 * Base Fabrik Plugin Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikPlugin extends CMSPlugin
{
	/**
	 * path to xml file
	 *
	 * @var string
	 */
	public $xmlPath = null;

	/**
	 * Params (must be public)
	 *
	 * @var Registry
	 */
	public $params = null;

	/**
	 * Plugin id
	 *
	 * @var int
	 */
	protected $id = null;

	/**
	 * Plugin data
	 *
	 * @var Table
	 */
	protected $row = null;

	/**
	 * Order that the plugin is rendered
	 *
	 * @var int
	 */
	public $renderOrder = null;

	/**
	 * Form
	 *
	 * @var Form
	 */
	public $jform = null;

	/**
	 * Model
	 *
	 * @var JModel
	 */
	public $model = null;

	/**
	 * @var JDatabaseDriver
	 */
	protected $_db;

	/**
	 * @var Registry
	 */
	protected $config;

	/**
	 * @var User
	 */
	protected $user;

	/**
	 * @var CMSApplication
	 */
	protected $app;

	/**
	 * @var Language
	 */
	protected $lang;

	/**
	 * @var Date
	 */
	protected $date;

	/**
	 * @var Session
	 */
	protected $session;

	/**
	 * App
	 *
	 * @var string
	 */
	protected $package = 'fabrik';

	/**
	 * Set the plugin id
	 *
	 * @param   int $id id to use
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		$this->id = $id;
	}

	/**
	 * Get plugin id
	 *
	 * @return  int  id
	 */
	public function getId()
	{
		return $this->id;
	}

	/**
	 * Set model
	 *
	 * @param   JModel &$model Plugin model
	 *
	 * @return  void
	 */
	public function setModel(&$model)
	{
		$this->model = $model;
	}

	/**
	 * Get Model
	 *
	 * @return JModel
	 */
	public function getModel()
	{
		return $this->model;
	}

	/**
	 * Get the plugin name
	 *
	 * @return string
	 */
	public function getName()
	{
		return isset($this->name) ? $this->name : get_class($this);
	}

	/**
	 * Constructor
	 *
	 * @param   object &$subject The object to observe
	 * @param   array  $config   An array that holds the plugin configuration
	 */
	public function __construct(&$subject, $config = array())
	{
		parent::__construct($subject, $config);
		$this->_db     = ArrayHelper::getValue($config, 'db',
Factory::getContainer()->get('DatabaseDriver'));
		$this->config  = ArrayHelper::getValue($config, 'config',
Factory::getApplication()->getConfig());
		$this->user    = ArrayHelper::getValue($config, 'user',
Factory::getUser());
		$this->app     = ArrayHelper::getValue($config, 'app',
Factory::getApplication());
		$this->lang    = ArrayHelper::getValue($config, 'lang',
Factory::getApplication()->getLanguage());
		$this->date    = ArrayHelper::getValue($config, 'date',
Factory::getDate());
		$this->session = ArrayHelper::getValue($config, 'session',
Factory::getSession());
		$this->package =
$this->app->getUserState('com_fabrik.package',
'fabrik');
		$this->loadLanguage();
	}

	/**
	 * Get the Form object for the plugin
	 *
	 * @return Form
	 */
	public function getJForm()
	{
		if (!isset($this->jform))
		{
			$type        = str_replace('fabrik_', '',
$this->_type);
			$formType    = $type . '-options';
			$formName    = 'com_fabrik.' . $formType;
			$controlName = 'jform';
			$this->jform = new Form($formName, array('control' =>
$controlName));
		}

		return $this->jform;
	}

	/**
	 * Create bootstrap horizontal tab headings from fieldset labels
	 * Used for rendering viz plugin options
	 *
	 * @param   Form $form          Plugin form
	 * @param   array &$output       Plugin render output
	 * @param   int   $repeatCounter Repeat count for plugin
	 *
	 * @since   3.1
	 *
	 * @return  void
	 */
	protected function renderFromNavTabHeadings($form, &$output,
$repeatCounter = 0)
	{
		$fieldsets = $form->getFieldsets();

		if (count($fieldsets) <= 1)
		{
			return;
		}

		$tabs = array();
		$i    = 0;

		foreach ($fieldsets as $fieldset)
		{
			if (isset($fieldset->modal) && $fieldset->modal)
			{
				continue;
			}

			$tab        = new stdClass;
			$tab->href  = 'tab-' . $fieldset->name . '-' .
$repeatCounter;
			$tab->id    = 'tab-' . $fieldset->name;
			$tab->class = $i === 0 ? 'active' : '';
			$tab->label = $fieldset->label;
			$tabs[]     = $tab;
			$i++;
		}

		$displayData       = new stdClass;
		$displayData->tabs = $tabs;
		$layout            =
FabrikHelperHTML::getLayout('fabrik-tabs');
		$output[]          = $layout->render($displayData);
	}

	/**
	 * Get the plugin's jForm
	 *
	 * @param null $repeatCounter
	 *
	 * @return Form
	 */
	public function getPluginForm($repeatCounter = null)
	{
		$path = JPATH_SITE . '/plugins/' . $this->_type .
'/' . $this->_name;
		Form::addFormPath($path);
		$xmlFile = $path . '/forms/fields.xml';
		$form    = self::getJForm();	// We must call our getJForm function, $this
points to the element not this plugin.
		// Used by fields when rendering the [x] part of their repeat name
		// see administrator/components/com_fabrik/classes/formfield.php
getName()
		$form->repeatCounter = $repeatCounter;

		// Add the plugin specific fields to the form.
		$form->loadFile($xmlFile, false);

		return $form;
	}

	/**
	 * Render the element admin settings
	 *
	 * @param   array  $data          Admin data
	 * @param   int    $repeatCounter Repeat plugin counter
	 * @param   string $mode          How the fieldsets should be rendered
currently support 'nav-tabs' (@since 3.1)
	 *
	 * @return  string    admin html
	 */
	public function onRenderAdminSettings($data = array(), $repeatCounter =
null, $mode = null)
	{
		$this->makeDbTable();
//		$version = new Version;
//		$j3      = version_compare($version->RELEASE, '3.0') >=
0 ? true : false;
//		$j3      = true;
		$type    = str_replace('fabrik_', '',
$this->_type);

		$form         = $this->getPluginForm($repeatCounter);
		$repeatScript = array();

		// Copy over the data into the params array - plugin fields can have data
in either
		// jform[params][name] or jform[name]
		$dontMove = array('width', 'height');

		if (!array_key_exists('params', $data))
		{
			$data['params'] = array();
		}

		foreach ($data as $key => $val)
		{
			if (is_object($val))
			{
				$val                  = isset($val->$repeatCounter) ?
$val->$repeatCounter : '';
				$data['params'][$key] = $val;
			}
			else
			{
				if (is_array($val))
				{
					$data['params'][$key] = FArrayHelper::getValue($val,
$repeatCounter, '');
				}
				else
				{
					// Textarea now stores width/height in params, don't want to copy
over old w/h values into the params array
					if (!in_array($key, $dontMove))
					{
						$data['params'][$key] = $val;
					}
				}
			}
		}
		// Bind the plugins data to the form
		$form->bind($data);

		// $$$ rob 27/04/2011 - listfields element needs to know things like the
group_id, and
		// as bind() only saves the values from $data with a corresponding xml
field we set the raw data as well
		$form->rawData      = $data;
		$str                = array();
		$repeatGroupCounter = 0;

		// Paul - If there is a string for plugin_DESCRIPTION then display this
as a legend
		$inistr = strtoupper('PLG_' . $type . '_' .
$this->_name . '_DESCRIPTION');
		$inival = Text::_($inistr);

		if ($inistr != $inival)
		{
			// Handle strings with HTML
			$inival2 = '';

			/**
			 * $$$ hugh - this was blowing up with the massively useful error
"Cannot parse
			 * XML 0" and refusing to load the plugin if the description has
any non-XML-ish HTML
			 * markup, or if there was some malformed HTML.  So redoing it with a
regular expression,
			 * which may not match on some formats, as I haven't done a huge
amount of testing,
			 * but at least it won't error out!
			 */

			/*
			if (substr($inival, 0, 3) == '<p>' || substr($inival, 0,
3) == '<p ')
			{
				$xml = new SimpleXMLElement('<xml>' . $inival .
'</xml>');
				$lines = $xml->xpath('/xml/p[position()<2]');

				while (list( , $node) = each($lines))
				{
					$legend = $node;
				}

				$inival2 = str_replace($legend, '', $inival);
				$inival = $legend;
			}
			*/
			$p_re    = '#^\s*(<p\s*\S*\s*>.*?</p>)#i';
			$matches = array();

			if (preg_match($p_re, $inival, $matches))
			{
				$inival2 = preg_replace($p_re, '', $inival);
				$inival  = $matches[1];
			}
			elseif (substr($inival, 0, 1) != '<' &&
strpos($inival, '<br') > 0)
			{
				// Separate first part for legend and convert rest to paras
				$lines  = preg_split('/<br\s*\/\s*>/', $inival,
PREG_SPLIT_NO_EMPTY);
				$inival = $lines[0];
				unset($lines[0]);
				$inival2 = '<b><p>' .
implode('</p>\n<p>', $lines) .
'<br/><br/></p></b>';
			}

			$str[] = '<legend>' . $inival .
'</legend>';

			if ($inival2 != '')
			{
				$str[] = $inival2;
			}
		}

		if ($mode === 'nav-tabs')
		{
			$this->renderFromNavTabHeadings($form, $str, $repeatCounter);
			$str[] = '<div class="tab-content">';
		}

		$c         = 0;
		$fieldsets = $form->getFieldsets();

		if (count($fieldsets) <= 1)
		{
			$mode = null;
		}

		// Filer the forms fieldsets for those starting with the correct
$searchName prefix
		foreach ($fieldsets as $fieldset)
		{
			if ($mode === 'nav-tabs')
			{
				$tabClass = $c === 0 ? ' active' : '';
				$str[]    = '<div role="tabpanel"
class="tab-pane' . $tabClass . '" id="tab-' .
$fieldset->name . '-' . $repeatCounter .
'">';
			}

			$class = $type . 'Settings page-' . $this->_name;
			$repeat = isset($fieldset->repeatcontrols) &&
$fieldset->repeatcontrols == 1;

			// Bind data for repeat groups
			$repeatDataMax = 1;

			if ($repeat)
			{
				$opts            = new stdClass;
				$opts->repeatmin = (isset($fieldset->repeatmin)) ?
$fieldset->repeatmin : 1;
				$repeatScript[]  = "new
FbRepeatGroup('$fieldset->name', " . json_encode($opts) .
');';
				$repeatData      = array();

				foreach ($form->getFieldset($fieldset->name) as $field)
				{
					if (is_array($field->value) && $repeatDataMax <
count($field->value))
					{
						$repeatDataMax = count($field->value);
					}
				}

				$form->bind($repeatData);
			}

			$id    = isset($fieldset->name) ? ' id="' .
$fieldset->name . '"' : '';
			$style = isset($fieldset->modal) && $fieldset->modal ?
'style="display:none"' : '';
			$str[] = '<fieldset class="' . $class .
'"' . $id . ' ' . $style . '>';

			if ($mode == '' && $fieldset->label !=
'')
			{
				$str[] = '<legend>' . Text::_($fieldset->label) .
'</legend>';
			}

			$form->repeat = $repeat;
//			$j3           = FabrikWorker::j3();
//			$j3           = true;

			if ($repeat)
			{
//				if ($j3)
//				{
					$str[] = '<a class="btn" href="#"
data-button="addButton">' .
FabrikHelperHTML::icon('icon-plus',
Text::_('COM_FABRIK_ADD')) . '</a>';
					$str[] = '<a class="btn" href="#"
data-button="deleteButton">' .
FabrikHelperHTML::icon('icon-minus',
Text::_('COM_FABRIK_REMOVE')) . '</a>';
/*
				}
				else
				{
					$str[] = '<a class="addButton" href="#"
data-button="addButton">' .
FabrikHelperHTML::icon('icon-plus',
Text::_('COM_FABRIK_ADD')) . '</a>';
				}
*/
			}

			for ($r = 0; $r < $repeatDataMax; $r++)
			{
				if ($repeat)
				{
					$str[]               = '<div
class="repeatGroup">';
					$form->repeatCounter = $r;
				}

//				if (!$j3)
//				{
//					$str[] = '<ul class="adminformlist">';
//				}

				foreach ($form->getFieldset($fieldset->name) as $field)
				{
					if ($repeat)
					{
						if (is_array($field->value))
						{
							if (array_key_exists($r, $field->value))
							{
								$field->setValue($field->value[$r]);
							}
							else
							{
								$field->setValue('');
							}
						}
					}

//					if ($j3)
//					{
						if ($field->showon)
						{
							$showOns = FormHelper::parseShowOnConditions($field->showon,
$field->formControl, $field->group);

							if ($field->repeat)
							{
								foreach ($showOns as &$showOn)
								{
									$showOn['field'] .= '[' .
$form->repeatCounter . ']';
								}
							}

							$dataShowOn = ' data-showon=\'' .
json_encode($showOns) . '\'';

						}
						else
						{
							$dataShowOn = '';
						}
						$str[] = '<div class="control-group"' .
$dataShowOn . '>';
						$str[] = '<div class="control-label">' .
$field->label . '</div>';
//						$str[] = '<div class="controls">' .
$field->input . '</div>';
						$str[] = '<div>' . $field->input .
'</div>';
						$str[] = '</div>';
/*
					}
					else
					{
						$str[] = '<li>' . $field->label . $field->input
. '</li>';
					}
*/
				}

//				if ($repeat && !$j3)
//				{
//					$str[] = '<li><a class="removeButton delete
btn" href="#">' .
FabrikHelperHTML::icon('icon-minus-sign',
Text::_('COM_FABRIK_REMOVE'))
//						. '</a></li>';
//				}

//				if (!$j3)
//				{
//					$str[] = '</ul>';
//				}

				if ($repeat)
				{
					$str[] = "</div>";
				}
			}

			$str[] = '</fieldset>';

			if ($mode === 'nav-tabs')
			{
				$str[] = '</div>';
			}

			$c++;
		}

		if ($mode === 'nav-tabs')
		{
			$str[] = '</div>';
		}

		if (!empty($repeatScript))
		{
			$repeatScript = "window.addEvent('domready', function ()
{\n" . implode("\n", $repeatScript) . "\n})\n";
			FabrikHelperHTML::script('administrator/components/com_fabrik/models/fields/repeatgroup.js',
$repeatScript);
		}

		return implode("\n", $str);
	}

	/**
	 * Used in plugin manager runPlugins to set the correct repeat set of
	 * data for the plugin
	 *
	 * @param   object &$params       Original params
	 * @param   int    $repeatCounter Repeat group counter
	 *
	 * @return   object  params
	 */
	public function setParams(&$params, $repeatCounter)
	{
		$opts = $params->toArray();
		$data = array();

		foreach ($opts as $key => $val)
		{
			if (is_array($val))
			{
				$data[$key] = FArrayHelper::getValue($val, $repeatCounter);
			}
			else
			{
				$data[$key] = $val;
			}
		}

		$this->params = new Registry(json_encode($data));

		return $this->params;
	}

	/**
	 * Load params
	 *
	 * @return  Registry  params
	 */
	public function getParams()
	{
		if (!isset($this->params))
		{
			$row          = $this->getRow();
			$this->params = new Registry($row->params);
		}

		return $this->params;
	}

	/**
	 * Get db row/item loaded with id
	 *
	 * @return  Table
	 */
	protected function getRow()
	{
		if (!isset($this->row))
		{
			$this->row = $this->getTable($this->_type);
			$this->row->load($this->id);
		}

		return $this->row;
	}

	/**
	 * Set db row/item
	 *
	 * @param   Table $row db item
	 *
	 * @return  void
	 */
	public function setRow($row)
	{
		$this->row = $row;
	}

	/**
	 *  Get db row/item loaded
	 *
	 * @return  FabTableExtension
	 */
	public function getTable()
	{
		return FabTable::getInstance('Extension', 'Table');
	}

	/**
	 * Determine if we use the plugin or not
	 * both location and event criteria have to be match when form plug-in
	 *
	 * @param   string $location Location to trigger plugin on
	 * @param   string $event    Event to trigger plugin on
	 *
	 * @return  bool  true if we should run the plugin otherwise false
	 */
	public function canUse($location = null, $event = null)
	{
		$ok    = false;
		$model = $this->getModel();

		switch ($location)
		{
			case 'front':
				if (!$this->app->isClient('administrator'))
				{
					$ok = true;
				}
				break;
			case 'back':
				if ($this->app->isClient('administrator'))
				{
					$ok = true;
				}
				break;
			case 'both':
				$ok = true;
				break;
		}

		if ($ok)
		{
			// $$$ hugh @FIXME - added copyingRow() stuff to form model, need to do
it
			// for list model as well.
			$k = property_exists($model,'origRowId') &&
isset($model->origRowId) ? 'origRowId' : 'rowId';

			switch ($event)
			{
				case 'new':
					if (empty($model->$k) === false)
					{
						$ok = isset($model->copyingRow) ? $model->copyingRow() : false;
					}

					break;
				case 'edit':
					if (empty($model->$k) === true)
					{
						/** $$$ hugh - don't think this is right, as it'll return
true when it shouldn't.
						 * Think if this row is being copied, then by definition it's
not being edited, it's new.
						 * For now, just set $ok to false;
						 * $ok = $ok = isset($model->copyingRow) ?
!$model->copyingRow() : false;
						 */
						$ok = false;
					}

					break;
			}
		}

		return $ok;
	}

	/**
	 * Custom process plugin result
	 *
	 * @param   string $method Method
	 *
	 * @return boolean
	 */
	public function customProcessResult($method)
	{
		return true;
	}

	/**
	 * J1.6 plugin wrapper for ajax_tables
	 *
	 * @return  void
	 */

	public function onAjax_tables()
	{
		$this->ajax_tables();
	}

	/**
	 * Ajax function to return a string of table drop down options
	 * based on cid variable in query string
	 *
	 * @return  void
	 */
	public function ajax_tables()
	{
		$input           = $this->app->getInput();
		$cid             = $input->getInt('cid', -1);
		$rows            = array();
		$showFabrikLists = $input->get('showf', false);

		if ($showFabrikLists)
		{
			$db = FabrikWorker::getDbo(true);

			if ($cid !== 0)
			{
				$query = $db->getQuery(true);
				$query->select('id,
label')->from('#__fabrik_lists')->where('connection_id
= ' . $cid)->where('published <>
-2')->order('label ASC');
				$db->setQuery($query);
				$rows = $db->loadObjectList();
			}

			$default        = new stdClass;
			$default->id    = '';
			$default->label = Text::_('COM_FABRIK_PLEASE_SELECT');
			array_unshift($rows, $default);
		}
		else
		{
			if ($cid !== 0)
			{
				$cnn =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Connection',
'FabrikFEModel');
				$cnn->setId($cid);
				$db = $cnn->getDb();
				$db->setQuery("SHOW TABLES");
				$rows = (array) $db->loadColumn();
			}

			array_unshift($rows, '');
		}

		echo json_encode($rows);
	}

	/**
	 * J1.6 plugin wrapper for ajax_fields
	 *
	 * @return  void
	 */
	public function onAjax_fields()
	{
		$this->ajax_fields();
	}

	/**
	 * Get a list of fields
	 *
	 * @return  string  json encoded list of fields
	 */
	public function ajax_fields()
	{
		$input   = $this->app->getInput();
		$tid     = $input->get('t');
		$keyType = $input->getInt('k', 1);

		// If true show all fields if false show fabrik elements
		$showAll = $input->getBool('showall', false);

		// Should we highlight the PK as a recommended option
		$highlightPk = $input->getBool('highlightpk');

		// Only used if showall = false, includes validations as separate entries
		$incCalculations = $input->get('calcs', false);
		$arr             = array();

		try
		{
			if ($showAll)
			{
				// Show all db columns
				$cid = $input->get('cid', -1);
				$cnn =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Connection',
'FabrikFEModel');
				$cnn->setId($cid);
				$db = $cnn->getDb();

				if ($tid != '')
				{
					if (is_numeric($tid))
					{
						// If loading on a numeric list id get the list db table name
						$jDb   = FabrikWorker::getDbo(true);
						$query = $jDb->getQuery(true);
						$query->select('db_table_name')->from('#__fabrik_lists')->where('id
= ' . (int) $tid);
						$jDb->setQuery($query);
						$tid = $jDb->loadResult();
					}

					$db->setQuery('DESCRIBE ' . $db->qn($tid));
					$rows = $db->loadObjectList();

					if (is_array($rows))
					{
						foreach ($rows as $r)
						{
							$c        = new stdClass;
							$c->value = $r->Field;
							$c->label = $r->Field;

							if ($highlightPk && $r->Key === 'PRI')
							{
								$c->label .= ' [' .
Text::_('COM_FABRIK_RECOMMENDED') . ']';
								array_unshift($arr, $c);
							}
							else
							{
								$arr[$r->Field] = $c;
							}
						}

						ksort($arr);
						$arr = array_values($arr);
					}
				}
			}
			else
			{
				/*
				 * show fabrik elements in the table
				* $keyType 1 = $element->id;
				* $keyType 2 = tablename___elementname
				*/
				/** @var FabrikFEModelList $model */
				$model =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
				$model->setId($tid);
				$table       = $model->getTable();
				$db          = $model->getDb();
				$groups      = $model->getFormGroupElementData();
				$published   = $input->get('published', false);
				$showInTable = $input->get('showintable', false);
				$showRaw     = $input->getBool('showRaw', false);

				foreach ($groups as $g => $groupModel)
				{
					if ($groupModel->isJoin())
					{
						if ($input->get('excludejoined') == 1)
						{
							continue;
						}

						$joinModel = $groupModel->getJoinModel();
						$join      = $joinModel->getJoin();
					}

					if ($published == true)
					{
						$elementModels = $groups[$g]->getPublishedElements();
					}
					else
					{
						$elementModels = $groups[$g]->getMyElements();
					}

					foreach ($elementModels as $e => $eVal)
					{
						$element = $eVal->getElement();

						if ($showInTable == true && $element->show_in_list_summary
== 0)
						{
							continue;
						}

						if ($keyType == 1)
						{
							$v = $element->id;
						}
						else
						{
							/*
							 * @TODO if in repeat group this is going to add [] to name - is
this really
							* what we want? In timeline viz options I've simply stripped
out the [] off the end
							* as a temp hack
							*/
							$useStep = $keyType === 2 ? true : false;
							$v       = $eVal->getFullName($useStep);
						}

						$c        = new stdClass;
						$c->value = $v;
						$label    = FabrikString::getShortDdLabel($element->label);

						if ($groupModel->isJoin())
						{
							$label = $join->table_join . '.' . $label;
						}

						$c->label = $label;

						// Show hightlight primary key and shift to top of options
						if ($highlightPk && $table->db_primary_key ===
$db->qn($eVal->getFullName(false, false)))
						{
							$c->label .= ' [' .
Text::_('COM_FABRIK_RECOMMENDED') . ']';
							array_unshift($arr, $c);
						}
						else
						{
							$arr[] = $c;

							if ($showRaw && is_a($eVal,
'PlgFabrik_ElementDatabasejoin'))
							{
								$useStep = $keyType === 2 ? true : false;
								$rawVal = $eVal->getRawColumn($useStep);
								$rawVal = str_replace('`', '', $rawVal);
								$c        = new stdClass;
								$c->value = $rawVal;
								$c->label = $label . ' (raw)';
								$arr[] = $c;
							}
						}

						if ($incCalculations)
						{
							$params = $eVal->getParams();

							if ($params->get('sum_on', 0))
							{
								$c        = new stdClass;
								$c->value = 'sum___' . $v;
								$c->label = Text::_('COM_FABRIK_SUM') . ': '
. $label;
								$arr[]    = $c;
							}

							if ($params->get('avg_on', 0))
							{
								$c        = new stdClass;
								$c->value = 'avg___' . $v;
								$c->label = Text::_('COM_FABRIK_AVERAGE') . ':
' . $label;
								$arr[]    = $c;
							}

							if ($params->get('median_on', 0))
							{
								$c        = new stdClass;
								$c->value = 'med___' . $v;
								$c->label = Text::_('COM_FABRIK_MEDIAN') . ':
' . $label;
								$arr[]    = $c;
							}

							if ($params->get('count_on', 0))
							{
								$c        = new stdClass;
								$c->value = 'cnt___' . $v;
								$c->label = Text::_('COM_FABRIK_COUNT') . ':
' . $label;
								$arr[]    = $c;
							}

							if ($params->get('custom_calc_on', 0))
							{
								$c        = new stdClass;
								$c->value = 'cnt___' . $v;
								$c->label = Text::_('COM_FABRIK_CUSTOM') . ':
' . $label;
								$arr[]    = $c;
							}
						}
					}
				}
			}
		} catch (RuntimeException $err)
		{
			// Ignore errors as you could be swapping between connections, with old
db table name selected.
		}

		array_unshift($arr, HTMLHelper::_('select.option',
'', Text::_('COM_FABRIK_PLEASE_SELECT'),
'value', 'label'));
		echo json_encode($arr);
	}

	/**
	 * Get js for managing the plugin in J admin
	 *
	 * @param   string $name  plugin name
	 * @param   string $label plugin label
	 * @param   string $html  html (not sure what this is?)
	 *
	 * @return  string  JS code to ini adminplugin class
	 */
/*	public function onGetAdminJs($name, $label, $html)
	{
		$opts   = $this->getAdminJsOpts($html);
		$opts   = json_encode($opts);
		$script = "new fabrikAdminPlugin('$name',
'$label', $opts)";

		return $script;
	}*/

	/**
	 * Get the options to ini the J Admin js plugin controller class
	 *
	 * @param   string $html HTML?
	 *
	 * @return  object
	 */
	protected function getAdminJsOpts($html)
	{
		$opts           = new stdClass;
		$opts->livesite = COM_FABRIK_LIVESITE;
		$opts->html     = $html;

		return $opts;
	}

	/**
	 * If true then the plugin is stating that any subsequent plugin in the
same group
	 * should not be run.
	 *
	 * @param   string $method Current plug-in call method e.g. onBeforeStore
	 *
	 * @return  bool
	 */
	public function runAway($method)
	{
		return false;
	}

	/**
	 * Process the plugin, called when form is submitted
	 *
	 * @param   string   $paramName    Param name which contains the PHP code
to eval
	 * @param   array    $data         Data
	 * @param   Registry $params       Plugin parameters - hacky fix ini email
plugin where in
	 *                                 php 5.3.29 email params were getting
confused between multiple plugin instances
	 *
	 * @return  bool
	 */
	protected function shouldProcess($paramName, $data = null, $params = null)
	{
		if (is_null($data))
		{
			$data = $this->data;
		}

		if (is_null($params))
		{
			$params = $this->getParams();
		}

		$condition = $params->get($paramName,'');
		$formModel = $this->getModel();
		$w         = new FabrikWorker;

		if (trim($condition) == '')
		{
			return true;
		}

		if (!is_null($formModel))
		{
			$origData = $formModel->getOrigData();
			$origData = ArrayHelper::fromObject($origData[0]);
		}
		else
		{
			$origData = array();
		}

		$condition = trim($w->parseMessageForPlaceHolder($condition, $data));
		FabrikWorker::clearEval();
		$res = Php::Eval(['code' => $condition,
'vars'=>['data'=>$data, 'origData'
=> $origData, 'formModel' => $formModel]]);
		FabrikWorker::logEval($res, 'Caught exception on eval of ' .
$formModel->label . ' plugin condition: %s');

		if (is_null($res))
		{
			return true;
		}

		return $res;
	}

	/**
	 * Translates numeric entities to UTF-8
	 *
	 * @param   array $ord preg replace call back matched
	 *
	 * @return  string
	 */
	protected function replace_num_entity($ord)
	{
		$ord = $ord[1];

		if (preg_match('/^x([0-9a-f]+)$/i', $ord, $match))
		{
			$ord = hexdec($match[1]);
		}
		else
		{
			$ord = intval($ord);
		}

		$noBytes = 0;
		$byte    = array();

		if ($ord < 128)
		{
			return chr($ord);
		}
		elseif ($ord < 2048)
		{
			$noBytes = 2;
		}
		elseif ($ord < 65536)
		{
			$noBytes = 3;
		}
		elseif ($ord < 1114112)
		{
			$noBytes = 4;
		}
		else
		{
			return '';
		}

		switch ($noBytes)
		{
			case 2:
				$prefix = array(31, 192);
				break;
			case 3:
				$prefix = array(15, 224);
				break;
			case 4:
				$prefix = array(7, 240);
				break;
		}

		for ($i = 0; $i < $noBytes; $i++)
		{
			$byte[$noBytes - $i - 1] = (($ord & (63 * pow(2, 6 * $i))) / pow(2,
6 * $i)) & 63 | 128;
		}

		$byte[0] = ($byte[0] & $prefix[0]) | $prefix[1];
		$ret     = '';

		for ($i = 0; $i < $noBytes; $i++)
		{
			$ret .= chr($byte[$i]);
		}

		return $ret;
	}

	/**
	 * Get the plugin manager
	 *
	 * @since      3.0
	 *
	 * @deprecated use FabrikWorker::getPluginManager()
	 *
	 * @return  FabrikFEModelPluginmanager
	 */
	protected function getPluginManager()
	{
		return FabrikWorker::getPluginManager();
	}

	/**
	 * Get user ids from group ids
	 *
	 * @param   array  $sendTo User group id
	 * @param   string $field  Field to return from user group. Default =
'id'
	 *
	 * @since   3.0.7
	 *
	 * @return  array  users' property defined in $field
	 */
	protected function getUsersInGroups($sendTo, $field = 'id')
	{
		if (empty($sendTo))
		{
			return array();
		}

		$db    = FabrikWorker::getDbo();
		$query = $db->getQuery(true);
		$query->select('DISTINCT(' . $field .
')')->from('#__users AS
u')->join('LEFT', '#__user_usergroup_map AS m ON
u.id = m.user_id')
			->where('m.group_id IN (' . implode(', ',
$sendTo) . ')');
		$db->setQuery($query);

		return $db->loadColumn();
	}

	/**
	 * Make db tables if found, called from onRenderAdminSettings - seems
plugins cant run their own sql files atm
	 *
	 * @since   3.1a
	 *
	 * @return  void
	 */
	protected function makeDbTable()
	{
		$db = FabrikWorker::getDbo();

		// Attempt to create the db table?
		$file = COM_FABRIK_BASE . '/plugins/' . $this->_type .
'/' . $this->_name . '/sql/install.mysql.uft8.sql';

		if (File::exists($file))
		{
			$sql  = file_get_contents($file);
			$sqls = explode(';', $sql);

			if (!empty($sqls))
			{
				foreach ($sqls as $sql)
				{
					if (trim($sql) !== '')
					{
						$db->setQuery($sql);
						$db->execute();
					}
				}
			}
		}
	}
}
models/pluginmanager.php000064400000047210151165347430011406
0ustar00<?php
/**
 * Fabrik Plugin Manager Class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\String\StringHelper;
//use Joomla\CMS\Dispatcher\Dispatcher;
use Joomla\Event\Dispatcher as EventDispatcher;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.model');
jimport('joomla.filesystem.file');

/**
 * Fabrik Plugin Manager Class
 *
 * @package  Fabrik
 * @since    3.0
 */

class FabrikFEModelPluginmanager extends FabModel
{
	/**
	 * plugins
	 *
	 * @var array
	 */
	public $plugIns = array();

	/**
	 * Groups
	 *
	 * @var array
	 */
	protected $group = null;

	/**
	 * # of plugins run
	 *
	 * @var int
	 */
	protected $runPlugins = 0;

	/**
	 * Element lists
	 *
	 * @var array
	 */
	protected $elementLists = array();

	/**
	 * Contains out put from run plugins
	 *
	 * @var array
	 */
	public $data = array();

	/**
	 * Contains plugin model
	 *
	 * @var array
	 */
	public $dataModels = array();

	/**
	 * Array of array of form plugins - keyed on group id
	 *
	 * @var  array
	 */
	protected $formPlugins = array();

	/**
	 * @var array
	 */
	protected $_AbstractplugIns = array();

	/**
	 * Get a html drop down list of the element types with this objs element
type selected as default
	 *
	 * @param   string  $default       Selected option
	 * @param   string  $name          Html name for drop down
	 * @param   string  $extra         Extra info for drop down
	 * @param   string  $defaultLabel  Html element type list
	 *
	 * @return  string
	 */
	public function getElementTypeDd($default, $name = 'plugin',
$extra = 'class="inputbox elementtype" 
size="1"', $defaultLabel = '')
	{
		$hash = $default . $name . $extra . $defaultLabel;

		if (!array_key_exists($hash, $this->elementLists))
		{
			if ($defaultLabel == '')
			{
				$defaultLabel = Text::_('COM_FABRIK_PLEASE_SELECT');
			}

			$a = array(HTMLHelper::_('select.option', '',
$defaultLabel));
			$elementsTypes = $this->_getList();
			$elementsTypes = array_merge($a, $elementsTypes);
			$this->elementLists[$hash] =
HTMLHelper::_('select.genericlist', $elementsTypes, $name,
$extra, 'value', 'text', $default);
		}

		return $this->elementLists[$hash];
	}

	/**
	 * Can the pluginmanager be used
	 *
	 * @deprecated
	 *
	 * @return  true
	 */
	public function canUse()
	{
		return true;
	}

	/**
	 * Get an unordered list (<ul>) of plugins
	 *
	 * @param   string  $group  Plugin group
	 * @param   string  $id     Ul id
	 *
	 * @return  string  <ul>
	 */
	public function getList($group, $id)
	{
		$str = '<ul id="' . $id . '">';
		$elementsTypes = $this->_getList();

		foreach ($elementsTypes as $plugin)
		{
			$str .= '<li>' . $plugin->text .
'</li>';
		}

		$str .= '</ul>';

		return $str;
	}

	/**
	 * Get a list of plugin ids/names for us in in a drop down list
	 * if no group set defaults to element list
	 *
	 * @param   object  $query       Query
	 * @param   int     $limitstart  Limit start
	 * @param   int     $limit       # of records to return
	 *
	 * @return  array	plugin list
	 */
	protected function _getList($query = null, $limitstart = 0, $limit = 0)
	{
		$db = FabrikWorker::getDbo(true);

		if (is_null($this->group))
		{
			$this->group = 'element';
		}

		$query = $db->getQuery(true);
		$folder = $db->q('fabrik_' . $this->group);
		$query->select('element AS value, name AS
text')->from('#__extensions')->where('folder
=' . $folder);
		$db->setQuery($query);
		$elementsTypes = $db->loadObjectList();

		return $elementsTypes;
	}

	/**
	 * Get a certain group of plugins
	 *
	 * @param   string  $group  Plugin group to load
	 *
	 * @return  array	Plugins
	 */
	public function &getPlugInGroup($group)
	{
		if (array_key_exists($group, $this->plugIns))
		{
			return $this->plugIns[$group];
		}
		else
		{
			return $this->loadPlugInGroup($group);
		}
	}

	/**
	 * Add to the document head all element js files
	 * used in calendar to ensure all element js files are loaded from
unserialized form
	 *
	 * @return void
	 */
	public function loadJS()
	{
		$plugins = Folder::folders(JPATH_SITE .
'/plugins/fabrik_element', '.', false, false);
		$files = array();

		foreach ($plugins as $plugin)
		{
			$files[] = JPATH_SITE . '/plugins/fabrik_element/' . $plugin .
'/' . $plugin . '.js';
		}

		foreach ($files as $f)
		{
			$f = str_replace("\\", "/", str_replace(JPATH_SITE,
'', $f));
			$file = basename($f);
			$folder = dirname($f);
			$folder = FabrikString::ltrimword($folder, '/') .
'/';
			FabrikHelperHTML::script($folder . $file);
		}
	}

	/**
	 * Loads ABSTRACT version of a plugin group
	 *
	 * @param   string  $group  Plugin type -
element/form/list/cron/validationrule supported
	 *
	 * @return  array
	 */
	protected function &loadPlugInGroup($group)
	{
		// $$$ rob 16/12/2011 - this was setting $this->plugIns, but if you
had 2 lists as admin modules
		// and the first list had plugins, then the second list would remove that
plugin when this method was run
		$folder = 'fabrik_' . $group;
		$this->_AbstractplugIns[$group] = array();
		$plugins = PluginHelper::getPlugin($folder);

		foreach ($plugins as $plugin)
		{
			$this->_AbstractplugIns[$group][$plugin->name] = $plugin;
		}

		return $this->_AbstractplugIns[$group];
	}

	/**
	 * Load an individual plugin
	 *
	 * @param   string  $className  Plugin name e.g. fabrikfield
	 * @param   string  $group      Plugin type element/ form or list
	 *
	 * @return  object	Plugin
	 */
	public function getPlugIn($className = '', $group =
'')
	{
		if ($className != '' && (array_key_exists($group,
$this->plugIns) && array_key_exists($className,
$this->plugIns[$group])))
		{
			return $this->plugIns[$group][$className];
		}
		else
		{
			// $$$ rob 04/06/2011 hmm this was never caching the plugin so we were
always loading it
			// return $this->loadPlugIn($className, $group);
			$this->plugIns[$group][$className] = $this->loadPlugIn($className,
$group);

			return $this->plugIns[$group][$className];
		}
	}

	/**
	 * Load in the actual plugin objects for a given group
	 *
	 * @param   string  $group  Plugin group
	 *
	 * @return  array	Plugins
	 */
	public function getPlugInGroupPlugins($group)
	{
		$plugins = $this->getPlugInGroup($group);
		$r = array();

		foreach ($plugins as $plugin)
		{
			$r[] = $this->loadPlugIn($plugin->name, $group);
		}

		return $r;
	}

	/**
	 * Load plugin
	 *
	 * @param   string  $className  Plugin name e.g. fabrikfield
	 * @param   string  $group      Plugin type element/ form or list
	 *
	 * @throws RuntimeException
	 *
	 * @return  FabrikPlugin Plugin object
	 */
	public function loadPlugIn($className = '', $group =
'')
	{
		if ($group == 'table')
		{
			$group = 'list';
		}

		$group = StringHelper::strtolower($group);

		if (!PluginHelper::isEnabled('fabrik_' . $group, $className))
        {
            throw new RuntimeException('plugin manager: plugin is
disabled or ACL protected: ' . $className);
        }

		PluginHelper::importPlugin('fabrik_' . $group, $className);
//H		$dispatcher = JEventDispatcher::getInstance();
		$dispatcher = Factory::getApplication()->getDispatcher();
		if ($className != '')
		{
			$file = JPATH_PLUGINS . '/fabrik_' . $group . '/' .
$className . '/' . $className . '.php';

			if (File::exists($file))
			{
				require_once $file;
			}
			else
			{
				$file = JPATH_PLUGINS . '/fabrik_' . $group . '/' .
$className . '/models/' . $className . '.php';

				if (File::exists($file))
				{
					require_once $file;
				}
				else
				{
					throw new RuntimeException('plugin manager: did not load ' .
$file);
				}
			}
		}

		$class = 'plgFabrik_' . (!empty($group) ?
StringHelper::ucfirst($group) : '') . (!empty($className) ?
StringHelper::ucfirst($className) : '');
		$conf = array();
		$conf['name'] = !empty($className) ?
StringHelper::strtolower($className) : '';
		$conf['type'] = StringHelper::strtolower('fabrik_' .
$group);
            $plugIn = null;

		if (class_exists($class))
		{
			$plugIn = new $class($dispatcher, $conf);//H don't know if this is
correct
		}
		else
		{
			// Allow for namespaced plugins
			$class = 'Fabrik\\Plugins\\' . StringHelper::ucfirst($group) .
'\\' . StringHelper::ucfirst($className);
			$plugIn = new $class($dispatcher, $conf);
		}
		// Needed for viz
		$client = ApplicationHelper::getClientInfo(0);
		$lang = $this->lang;
		$folder = 'fabrik_' . $group;
		$langFile = 'plg_' . $folder . '_' . $className;
		$langPath = $client->path . '/plugins/' . $folder .
'/' . $className;

		// load both default and current, so untranslated strings fall back to
default
		$lang->load($langFile, $langPath, $lang->getDefault(), false,
false);
		$lang->load($langFile, $langPath, null, false, false);

		// Load system ini file
		$langFile .= '.sys';
		$lang->load($langFile, $langPath, $lang->getDefault(), false,
false);
		$lang->load($langFile, $langPath, null, false, false);

		if (!is_object($plugIn))
		{
			throw new RuntimeException('plugin manager: did not load ' .
$group . '.' . $className);
		}

		return $plugIn;
	}

	/**
	 * Unset a form's element plugins
	 *
	 * @param   JModel  $formModel  Form model
	 *
	 * @since   3.1b
	 *
	 * @return  void
	 */
	public function clearFormPlugins($formModel)
	{
		$sig = $this->package . '.' .
$formModel->get('id');
		unset($this->formPlugins[$sig]);
	}

	/**
	 * Load all the forms element plugins
	 *
	 * @param   object  &$form  Form model
	 *
	 * @return  array	Group objects with plugin objects loaded in
group->elements
	 */
	public function getFormPlugins(&$form)
	{
		$profiler = Profiler::getInstance('Application');

		if (!isset($this->formPlugins))
		{
			$this->formPlugins = array();
		}

		// Ensure packages load their own form
		$sig = $this->package . '.' . $form->get('id');
		JDEBUG ? $profiler->mark('pluginmanager:getFormPlugins:start -
' . $sig) : null;

		if (!array_key_exists($sig, $this->formPlugins))
		{
			$this->formPlugins[$sig] = array();
			$lang = $this->lang;
			$folder = 'fabrik_element';
			$client = ApplicationHelper::getClientInfo(0);
			$groupIds = $form->getGroupIds();

			if (empty($groupIds))
			{
				// New form
				return array();
			}

			/**
			 * Changed this code to use two separate queries, rather than joining
#__extensions on the
			 * plugin name, as the J! 3.5 release changed collation of J! table, and
this breaks the
			 * for some sites with older MySQL or non-standard collation
			 */

			// build list of plugins used on this form ...
			$db = FabrikWorker::getDbo(true);
			$query = $db->getQuery(true);
			$select = '*, e.name AS name, e.id AS id, e.published AS published,
e.label AS label,'
				. 'e.plugin, e.params AS params, e.access AS access, e.ordering AS
ordering';
			$query->select($select);
			$query->from('#__fabrik_elements AS e');
			$query->where('group_id IN (' . implode(',',
$groupIds) . ')');

			// Ignore trashed elements
			$query->where('e.published != -2');
			$query->order("group_id, e.ordering");
			$db->setQuery($query);

			$elements = $db->loadObjectList();

			// now build list of all available Fabrik plugins ...
			$query->clear();
			$query
				->select('element')
				->from('#__extensions')
				->where('folder = "fabrik_element"')
				->where('enabled = "1"', 'AND');
			$db->setQuery($query);
			$extensions = $db->loadObjectList('element');
			// Don't assign the elements into Joomla's main dispatcher as
this causes out of memory errors in J1.6rc1
//H			$dispatcher = new JDispatcher;
			$dispatcher    = Factory::getApplication()->getDispatcher();
			$groupModels = $form->getGroups();
			$group = 'element';

			foreach ($elements as $element)
			{
				// see if this plugin has been uninstalled or unpubished in J!
				if (!array_key_exists($element->plugin, $extensions))
				{
					continue;
				}

				JDEBUG ? $profiler->mark('pluginmanager:getFormPlugins:' .
$element->id . '' . $element->plugin) : null;
				require_once JPATH_PLUGINS . '/fabrik_element/' .
$element->plugin . '/' . $element->plugin .
'.php';
				$class = 'PlgFabrik_Element' . $element->plugin;

				if (class_exists($class))
				{
					$pluginModel = new $class($dispatcher, array());
					//bootPlugin($plugin, $type)  where $type = fabrik_element and $plugin
= field
//H					$pluginModel =
Factory::getApplication()->bootPlugin($element->plugin,
'PlgFabrik_Element');
				}
				else
				{
					// Allow for namespaced plugins
					$class = 'Fabrik\\Plugins\\' . StringHelper::ucfirst($group)
. '\\' . StringHelper::ucfirst($element->plugin);
					$pluginModel = new $class($dispatcher, array());
//H					$pluginModel =
Factory::getApplication()->bootPlugin($element->plugin,
'PlgFabrik_Element');
				}

				if (!is_object($pluginModel))
				{
					continue;
				}

				$pluginModel->xmlPath = COM_FABRIK_FRONTEND . '/plugins/'
. $group . '/' . $element->plugin . '/' .
$element->plugin . '.xml';
				$pluginModel->setId($element->id);
				$groupModel = $groupModels[$element->group_id];

				$langFile = 'plg_' . $folder . '_' .
$element->plugin;
				$langPath = $client->path . '/plugins/' . $folder .
'/' . $element->plugin;

				// load both default and current, so untranslated strings fall back to
default
				$lang->load($langFile, $langPath, $lang->getDefault(), false,
false);
				$lang->load($langFile, $langPath, null, false, false);

				$listModel = $form->getListModel();
				$pluginModel->setContext($groupModel, $form, $listModel);
				$pluginModel->bindToElement($element);
				$groupModel->elements[$pluginModel->getId()] = $pluginModel;
			}

			foreach ($groupModels as $groupId => $g)
			{
				$this->formPlugins[$sig][$groupId] = $g;
			}
		}

		return $this->formPlugins[$sig];
	}

	/**
	 * Short cut to get an element plugin
	 *
	 * @param   int  $id  Element id
	 *
	 * @return PlgFabrik_Element  Element plugin
	 */
	public function getElementPlugin($id)
	{
		return $this->getPluginFromId($id);
	}

	/**
	 * Get a plugin based on its id
	 *
	 * @param   int     $id    Plugin id
	 * @param   string  $type  Plugin type
	 *
	 * @return PlgFabrik_Element|?  plugin
	 */
	public function getPluginFromId($id, $type = 'Element')
	{
		$el = FabTable::getInstance($type, 'FabrikTable');
		$el->load($id);
		$o = $this->loadPlugIn($el->plugin, $type);
		$o->setId($id);

		switch ($type)
		{
			default:
				$o->getTable();
				break;
			case 'Element':
				$o->getElement();
				break;
		}

		return $o;
	}

	/**
	 * not used
	 *
	 * @param   string  $group          Name of plugin group to load
	 * @param   array   $lists          List of default element lists
	 * @param   array   &$elementModel  List of default and plugin element
lists
	 *
	 * @deprecated
	 *
	 * @return  void
	 */
	protected function loadLists($group, $lists, &$elementModel)
	{
	}

	/**
	 * Run form & element plugins - yeah!
	 *
	 * @param   string  $method        To check and call - corresponds to
stage of form processing
	 * @param   object  &$parentModel  Model calling the plugin form/list
	 * @param   string  $type          Plugin type to call form/list
	 *
	 * @return  array	of bools: false if error found and processed, otherwise
true
	 */
	public function runPlugins($method, &$parentModel, $type =
'form')
	{
		$profiler = Profiler::getInstance('Application');
		JDEBUG ? $profiler->mark("runPlugins: start: $method") :
null;

		if ($type == 'form')
		{
			/**
			 * $$$ rob allow for list plugins to hook into form plugin calls -
methods are mapped as:
			 * form method = 'onLoad' => list method =>
'onFormLoad'
			 */
			$tmethod = 'onForm' . FabrikString::ltrimword($method,
'on');
			$listModel = $parentModel->getListModel();
			$this->runPlugins($tmethod, $listModel, 'list');
		}

		$params = $parentModel->getParams();
		$return = array();
		$usedPlugins = (array) $params->get('plugins');
		$usedLocations = (array) $params->get('plugin_locations');
		$usedEvents = (array) $params->get('plugin_events');
		$states = (array) $params->get('plugin_state');
		$this->data = array();

		if ($type != 'list')
		{
			if (method_exists($parentModel, 'getGroupsHiarachy'))
			{
				$groups = $parentModel->getGroupsHiarachy();

				foreach ($groups as $groupModel)
				{
					$elementModels = $groupModel->getPublishedElements();

					foreach ($elementModels as $elementModel)
					{
						if (method_exists($elementModel, $method))
						{
							JDEBUG ? $profiler->mark("runPlugins: start element method:
$method") : null;
							$elementModel->$method($parentModel);
						}
					}
				}
			}
		}

		$c = 0;
		$runPlugins = 0;
		/**
		 * if true then a plugin has returned true from runAway()
		 * which means that any other plugin in the same group should not be run.
		 */
		$runningAway = false;
		$mainData = array();

		foreach ($usedPlugins as $usedPlugin)
		{
			if ($runningAway)
			{
				// "I soiled my armour I was so scared!"
				break;
			}

			$state = FArrayHelper::getValue($states, $c, 1);

			if ($state == false)
			{
				$c++;
				continue;
			}

			if ($usedPlugin != '')
			{
				$plugin = $this->getPlugIn($usedPlugin, $type);

				// Testing this if statement as onLoad was being called on form email
plugin when no method available
				if (method_exists($plugin, $method))
				{
					JDEBUG ? $profiler->mark("runPlugins: method_exists:
$usedPlugin, $method") : null;

					$plugin->renderOrder = $c;
					$modelTable = $parentModel->getTable();
					$pluginParams = $plugin->setParams($params, $c);
					$location = FArrayHelper::getValue($usedLocations, $c);
					$event = FArrayHelper::getValue($usedEvents, $c);
					$plugin->setModel($parentModel);

					if ($plugin->canUse($location, $event))
					{
						$pluginArgs = array();

						if (func_num_args() > 3)
						{
							$t = func_get_args();
							$pluginArgs = array_splice($t, 3);
						}

						$preflightMethod = $method . '_preflightCheck';
						$preflightCheck = method_exists($plugin, $preflightMethod) ?
$plugin->$preflightMethod($pluginArgs)
							: true;

						if ($preflightCheck)
						{
							JDEBUG ? $profiler->mark("runPlugins: preflight OK,
starting: $usedPlugin, $method") : null;
							$ok = $plugin->$method($pluginArgs);

							if ($ok === false)
							{
								$return[] = false;

								// if we were processing and it errored out, we need to pick up any
error messages
								if ($method === 'process')
								{
									$m = $method . '_result';
									if (method_exists($plugin, $m))
									{
										$this->data[] = $mainData[] = $plugin->$m($c);
										$this->dataModels[] = $plugin;
									}
								}
							}
							else
							{
								$thisReturn = $plugin->customProcessResult($method);
								$return[] = $thisReturn;
								$m = $method . '_result';

								if (method_exists($plugin, $m))
								{
									$this->data[] = $mainData[] = $plugin->$m($c);
									$this->dataModels[] = $plugin;
								}
							}

							$runPlugins++;

							if ($plugin->runAway($method))
							{
								$runningAway = true;
							}

							//$mainData = $this->data;

							if ($type == 'list' && $method !==
'observe')
							{
								$this->runPlugins('observe', $parentModel,
'list', $plugin, $method);
							}

							//$this->data = $mainData;
						}
					}
				}

				$c++;
			}
		}

		$this->data = $mainData;
		$this->runPlugins = $runPlugins;

		JDEBUG ? $profiler->mark("runPlugins: end: $method") : null;

		return array_unique($return);
	}

	/**
	 * Test if a plugin is installed
	 *
	 * @param   string  $group   Plugin group
	 * @param   string  $plugin  Plugin name
	 *
	 * @return  bool
	 */
	public function pluginExists($group, $plugin)
	{
		$plugins = $this->loadPlugInGroup($group);

		if (in_array($plugin, array_keys($plugins)))
		{
			return true;
		}

		return false;
	}
}
models/validation_rule.php000064400000022511151165347430011733
0ustar00<?php
/**
 * Fabrik Validation Rule Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Form\Form;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\String\StringHelper;
use Fabrik\Helpers\Php;

jimport('joomla.application.component.model');

require_once JPATH_SITE .
'/components/com_fabrik/models/plugin.php';

/**
 * Fabrik Validation Rule Model
 *
 * @package  Fabrik
 * @since    3.0
 */
class PlgFabrik_Validationrule extends FabrikPlugin
{
	/**
	 * Plugin name
	 *
	 * @var string
	 */
	protected $pluginName = null;

	/**
	 * Validation rule's element model
	 *
	 * @var PlgFabrik_Element
	 */
	public $elementModel = null;

	/**
	 * Error message
	 *
	 * @var string
	 */
	protected $errorMsg = null;

	/**
	 * Validate the elements data against the rule
	 *
	 * @param   string  $data           To check
	 * @param   int     $repeatCounter  Repeat group counter
	 *
	 * @return  bool  true if validation passes, false if fails
	 */
	public function validate($data, $repeatCounter)
	{
		return true;
	}

	/**
	 * Checks if the validation should replace the submitted element data
	 * if so then the replaced data is returned otherwise original data
returned
	 *
	 * @param   string  $data           Original data
	 * @param   int     $repeatCounter  Repeat group counter
	 *
	 * @return  string	original or replaced data
	 */
	public function replace($data, $repeatCounter)
	{
		return $data;
	}

	/**
	 * Looks at the validation condition & evaluates it
	 * if evaluation is true then the validation rule is applied
	 *
	 * @param   string  $data  Elements data
	 * @param   int     $repeatCounter  Repeat group counter
	 *
	 * @return  bool	apply validation
	 */
	public function shouldValidate($data, $repeatCounter = 0)
	{
		if (!$this->shouldValidateIn())
		{
			return false;
		}

		if (!$this->shouldValidateOn())
		{
			return false;
		}

		if (!$this->shouldValidateHidden($data, $repeatCounter))
		{
			return false;
		}

		$params = $this->getParams();
		$condition = trim($params->get($this->pluginName .
'-validation_condition', ''));

		if ($condition == '')
		{
			return true;
		}

		$w = new FabrikWorker;
		$groupModel = $this->elementModel->getGroupModel();
		$inRepeat = $groupModel->canRepeat();

		if ($inRepeat)
		{
			// Replace repeat data array with current repeatCounter value to ensure
placeholders work.
			// E.g. return {'table___field}' == '1';
			$f = InputFilter::getInstance();
			$post = $f->clean($_REQUEST, 'array');
			$groupElements = $groupModel->getMyElements();

			foreach ($groupElements as $element)
			{
				$name = $element->getFullName(true, false);
				$elementData = ArrayHelper::getValue($post, $name, array());
				// things like buttons don't submit data, so check for empty
				if (!empty($elementData))
				{
					$post[$name]          = ArrayHelper::getValue($elementData,
$repeatCounter, '');
					$rawData              = ArrayHelper::getValue($post, $name .
'_raw', array());
					$post[$name . '_raw'] = ArrayHelper::getValue($rawData,
$repeatCounter, '');
				}
				else{
					$post[$name] = '';
					$post[$name . '_raw'] = '';
				}
			}
		}
		else
		{
			$post = null;
		}

		// unused by us, but available for user's to use
		$formModel = $this->elementModel->getFormModel();
		$condition = trim($w->parseMessageForPlaceHolder($condition, $post));
		FabrikWorker::clearEval();
		$res = Php::Eval(['code' => $condition,
'vars'=>['formModel'=>$formModel,
'data'=>$data]]);
		FabrikWorker::logEval($res, 'Caught exception on eval in validation
condition : %s');

		if (is_null($res))
		{
			return true;
		}

		return $res;
	}

	/**
	 * Checks in/on to see if this validation is applicable
	 *
	 * @return  bool	apply validation
	 */
	public function canValidate()
	{
		if (!$this->shouldValidateIn())
		{
			return false;
		}

		if (!$this->shouldValidateOn())
		{
			return false;
		}

		return true;
	}

	/**
	 * Should the validation be run - based on whether in admin/front end
	 *
	 * @return boolean
	 */
	protected function shouldValidateIn()
	{
		$params = $this->getParams();
		$in = $params->get('validate_in', 'both');

		$admin = $this->app->isClient('administrator');

		if ($in === 'both')
		{
			return true;
		}

		if ($admin && $in === 'back')
		{
			return true;
		}

		if (!$admin && $in === 'front')
		{
			return true;
		}

		return false;
	}

	/**
	 * Should the validation be run - based on whether new record or editing
existing
	 *
	 * @return boolean
	 */
	protected function shouldValidateOn()
	{
		$params = $this->getParams();
		$on = $params->get('validation_on', 'both');
		$rowId = $this->elementModel->getFormModel()->getRowId();

		if ($on === 'both')
		{
			return true;
		}

		if ($rowId === '' && $on === 'new')
		{
			return true;
		}

		if ($rowId !== '' && $on === 'edit')
		{
			return true;
		}

		return false;
	}

	/*
	* Should the validation be run - based on whether the element was hidden
by an FX
	*
	* @return boolean
	*/
	protected function shouldValidateHidden($data, $repeatCounter)
	{
		$params = $this->getParams();
		$validateHidden = $params->get('validate_hidden',
'1') === '1';

		// if validate hidden is set, just return true, we don't care about
the state
		if ($validateHidden)
		{
			return true;
		}

		$name = $this->elementModel->getHTMLId($repeatCounter);
		$hiddenElements = ArrayHelper::getValue($this->formModel->formData,
'hiddenElements', '[]');
		$hiddenElements = json_decode($hiddenElements);

		return !in_array($name, $hiddenElements);

	}

	/**
	 * Get the warning message
	 *
	 * @return  string
	 */
	public function getMessage()
	{
		if (isset($this->errorMsg))
		{
			return $this->errorMsg;
		}

		$params = $this->getParams();
		$v = $params->get($this->pluginName . '-message',
'');

		if ($v === '')
		{
			$v = 'COM_FABRIK_FAILED_VALIDATION';
		}

		$this->errorMsg = Text::_($v);

		return $this->errorMsg;
	}

	/**
	 * Set the error message
	 *
	 * @param   string  $msg  New error message
	 *
	 * @since   3.0.9
	 *
	 * @return  void
	 */
	public function setMessage($msg)
	{
		$this->errorMsg = $msg;
	}

	/**
	 * Now show only on validation icon next to the element name and put icons
and text inside hover text
	 * gets the validation rule icon
	 *
	 * @param   int     $c     Repeat group counter
	 * @param   string  $tmpl  Template folder name
	 *
	 * @deprecated @since 3.0.5
	 *
	 * @return  string
	 */
	public function getIcon($c = 0, $tmpl = '')
	{
		$name = $this->elementModel->validator->getIcon($c);
		FabrikHelperHTML::image($name, 'form', $tmpl,
array('class' => $this->pluginName));
	}

	/**
	 * Get the base icon image as defined by the J Plugin options
	 *
	 * @since   3.1b2
	 *
	 * @return  string
	 */
	public function iconImage()
	{
		$plugin = PluginHelper::getPlugin('fabrik_validationrule',
$this->pluginName);
		$elIcon = $this->params->get('icon', '');

		/**
		 * $$$ hugh - this code doesn't belong here, but am working on an
issue whereby if a validation rule plugin
		 * hasn't been saved yet on the backend, the 'icon' param
won't be in the the extensions table yet, so we
		 * will have to get it from the manifest XML.
		 *
		 * NOTE - commenting this out, so I don't lose this chunk of code,
and can come back and work on this later
		 */
		/*
		if ($plugin->params === '{}')
		{
			$plugin_form = $this->getForm();
			Form::addFormPath(JPATH_SITE .
'/plugins/fabrik_validationrule/' .
$this->get('pluginName'));
			$xmlFile = JPATH_SITE . '/plugins/fabrik_validationrule/' .
$this->get('pluginName') . '/' .
$this->get('pluginName') . '.xml';
			$xml = $this->jform->loadFile($xmlFile, false);
			$params_fieldset = $plugin_form->getFieldset('params');
		}
		*/

		if (empty($elIcon))
		{
			$params = new Registry($plugin->params);
			$elIcon = $params->get('icon', 'star');
		}

		return $elIcon;
	}

	/**
	 * Get hover text with icon
	 *
	 * @param   int     $c     Validation render order
	 * @param   string  $tmpl  Template folder name
	 *
	 * @return  string
	 */
	public function getHoverText($c = null, $tmpl = '')
	{
		$i = '';
		if ($this->params->get('show_icon', '1') ===
'1')
		{
			$name = $this->elementModel->validator->getIcon($c);
			$i    = FabrikHelperHTML::image($name, 'form', $tmpl,
array('class' => $this->pluginName));
		}

		return $i . ' ' . $this->getLabel();
	}

	/**
	 * Gets the hover/alt text that appears over the validation rule icon in
the form
	 *
	 * @return  string	label
	 */
	protected function getLabel()
	{
		$params = $this->getParams();
		$tipText = $params->get('tip_text', '');

		if ($tipText !== '')
		{
			return Text::_($tipText);
		}

		if ($this->allowEmpty())
		{
			return Text::_('PLG_VALIDATIONRULE_' .
StringHelper::strtoupper($this->pluginName) .
'_ALLOWEMPTY_LABEL');
		}
		else
		{
			return Text::_('PLG_VALIDATIONRULE_' .
StringHelper::strtoupper($this->pluginName) . '_LABEL');
		}
	}

	/**
	 * Does the validation allow empty value?
	 * Default is false, can be overridden on per-validation basis (such as
isnumeric)
	 *
	 * @return  bool
	 */
	protected function allowEmpty()
	{
		return false;
	}

	/**
	 * Attach js validation code - runs in addition to the main validation
code.
	 */
	public function js()
	{
	}
}
models/visualization.php000064400000035203151165347430011455
0ustar00<?php
/**
 * Fabrik Visualization Model
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Filesystem\File;
use Joomla\String\StringHelper;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

jimport('joomla.application.component.model');

require_once JPATH_SITE .
'/components/com_fabrik/models/plugin.php';

/**
 * Fabrik Visualization Model
 *
 * @package  Fabrik
 * @since    3.0
 */
class FabrikFEModelVisualization extends FabModel
{
	protected $pluginParams = null;

	protected $row = null;
	protected $_row = null;

	/** @var object params*/
	protected $params = null;

	/**
	 * Url for filter form
	 *
	 * @var string
	 */
	protected $getFilterFormURL = null;

	public $srcBase = "plugins/fabrik_visualization/";

	public $pathBase = null;

	/**
	 * JS code to ini list filters
	 *
	 * @var string
	 */
	protected $filterJs = null;

	/**
	 * Constructor
	 *
	 * @param   array  $config  An array of configuration options (name,
state, dbo, table_path, ignore_request).
	 *
	 * @since   11.1
	 */

	public function __construct($config = array())
	{
		$this->pathBase = JPATH_SITE .
'/plugins/fabrik_visualization/';

		// 3.0 compat
		$this->_row =& $this->row;
		parent::__construct($config);
	}

	/**
	 * Set an array of list id's whose data is used inside the
visualization
	 *
	 * @return  void
	 */

	protected function setListIds()
	{
		if (!isset($this->listids))
		{
			$this->listids = array();
		}
	}

	/**
	 * Should the viz show the list filters
	 *
	 * @return boolean
	 */
	public function showFilters()
	{
		$input = $this->app->getInput();
		$params = $this->getParams();

		return (int) $input->get('showfilters',
$params->get('show_filters')) === 1 ? true : false;
	}

	/**
	 * Deprecated use getParams() instead
	 *
	 * @deprecated  since 3.1b
	 *
	 * @return  Registry
	 */
	public function getPluginParams()
	{
		return $this->getParams();
	}

	/**
	 * Alias to getVisualization()
	 *
	 * @since	3.0.6
	 *
	 * @return  FabTable viz
	 */
	public function getRow()
	{
		return $this->getVisualization();
	}

	/**
	 * Get the item
	 *
	 * @return  FabrikTableVisualization
	 */
	public function getVisualization()
	{
		if (!isset($this->row))
		{
			$this->row = FabTable::getInstance('Visualization',
'FabrikTable');
			$this->row->load($this->getState('id'));
			$this->setListIds();

			// Needed to load the language file!
			$pluginManager = FabrikWorker::getPluginManager();
			$pluginManager->getPlugIn($this->_row->plugin,
'visualization');
		}

		return $this->row;
	}

	/**
	 * Render the visualization
	 *
	 * @return  void
	 */
	public function render()
	{
		// Overwrite in plugin
	}

	/**
	 * Get the visualizations list models
	 *
	 * @return FabrikFEModelList[] List models
	 */
	public function getlistModels()
	{
		if (!isset($this->tables))
		{
			$this->tables = array();
            $c = 0;

            foreach ($this->listids as $id)
            {
                if (!array_key_exists($id, $this->tables))
                {
                    $listModel =
BaseDatabaseModel::getInstance('List',
'FabrikFEModel');
                    $listModel->setId($id);
                    $listModel->getTable();
                    $this->tables[$id . '-' . $c] =
$listModel;
                }

                $c++;
            }
        }


		return $this->tables;
	}

	/**
	 * Get a list model
	 *
	 * @param   int  $id  list model id
     * @param   int  $c   repeat count
	 *
	 * @return  FabrikFEModelList	fabrik list model
	 */
	protected function &getlistModel($id, $c)
	{
		$lists = $this->getlistModels();

		return $lists[$id . '-' . $c];
	}

	/**
	 * Make HTML container div id
	 *
	 * @return string
	 */
	public function getContainerId()
	{
		return $this->getJSRenderContext();
	}

	/**
	 * Get all list model's filters
	 *
	 * @return array table filters
	 */
	public function getFilters()
	{
		$params = $this->getParams();
		$name = StringHelper::strtolower(str_replace('fabrikModel',
'', get_class($this)));
		$filters = array();
		$showFilters = $params->get($name . '_show_filters',
array());
		$listModels = $this->getlistModels();
		$js = array();
		$i = 0;

		foreach ($listModels as $listModel)
		{
			$show = (bool) FArrayHelper::getValue($showFilters, $i, true);

			if ($show)
			{
				$ref = $this->getRenderContext();
				$id = $this->getId();
				$listModel->getFilterArray();
				$filters[$listModel->getTable()->label] =
$listModel->getFilters($this->getContainerId(),
'visualization', $id, $ref);
				$js[] = $listModel->filterJs;
			}

			$i++;
		}

		$this->filterJs = implode("\n", $js);
		$this->getRequireFilterMsg();

		return $filters;
	}

	/**
	 * Build an array of the lists' query where statements
	 *
	 * @return  array  keyed on list id.
	 */
	public function buildQueryWhere()
	{
		$filters = array();
		$listModels = $this->getlistModels();

		foreach ($listModels as $listModel)
		{
			$filters[$listModel->getId()] = $listModel->buildQueryWhere();
		}

		return $filters;
	}

	/**
	 * Get the JS code to ini the list filters
	 *
	 * @since   3.0.6
	 *
	 * @return  string  js code
	 */
	public function getFilterJs()
	{
		if (is_null($this->filterJs))
		{
			$this->getFilters();
		}

		return $this->filterJs;
	}

	/**
	 * Create advanced search links
	 *
	 * @since    3.0.7
	 *
	 * @return   string
	 */
	public function getAdvancedSearchLink()
	{
		$links = array();
		$listModels = $this->getlistModels();

		foreach ($listModels as $listModel)
		{
			$params = $listModel->getParams();

			if ($params->get('advanced-filter', '0'))
			{
				$table = $listModel->getTable();
				$url = COM_FABRIK_LIVESITE . 'index.php?option=com_' .
$this->package .
					'&amp;format=partial&amp;view=list&amp;layout=_advancedsearch&amp;tmpl=component&amp;listid='
					. $table->id . '&amp;nextview=' .
$this->app->getInput()->get('view', 'list')
					. '&scope&amp;=' . $this->app->scope;

				$url .= '&amp;tkn=' . Session::getFormToken();
				$links[$table->label] = $url;
			}
		}

		$title = '<span>' .
Text::_('COM_FABRIK_ADVANCED_SEARCH') .
'</span>';
		$opts = array('alt' =>
Text::_('COM_FABRIK_ADVANCED_SEARCH'), 'class' =>
'fabrikTip', 'opts' =>
'{"notice":true}', 'title' => $title);
		$img = FabrikHelperHTML::image('find', 'list',
'', $opts);

		if (count($links) === 1)
		{
			return '<a href="' . array_pop($links) . '"
class="advanced-search-link">' . $img .
'</a>';
		}
		else
		{
			$str = $img . '<ul>';

			foreach ($links as $label => $url)
			{
				$str .= '<li><a href="' . $url . '"
class="advanced-search-link">' . $label .
'</a></li>';
			}

			$str = '</ul>';

			return $str;
		}
	}

	/**
	 * Get Viz render context
	 *
	 * @since   3.0.6
	 *
	 * @return  string  render context
	 */
	public function getRenderContext()
	{
		$input = $this->app->getInput();
		$id = $this->getId();

		// Calendar in content plugin - choose event form needs to know its from
a content plugin.
		return $input->get('renderContext', $id . '_' .
$this->app->scope . '_' . $id);
	}

	/**
	 * Get the JS unique name that is assigned to the viz JS object
	 *
	 * @since   3.0.6
	 *
	 * @return  string  js viz id
	 */
	public function getJSRenderContext()
	{
		return 'visualization_' . $this->getRenderContext();
	}

	/**
	 * Set the url for the filter form's action
	 *
	 * @return  string	action url
	 */

	public function getFilterFormURL()
	{
		if (isset($this->getFilterFormURL))
		{
			return $this->getFilterFormURL;
		}

		$input = $this->app->getInput();
		$option = $input->get('option');

		// Get the router
		$router = $this->app->getRouter();
		/**
		 * $$$ rob force these to be 0 once the menu item has been loaded for the
first time
		 * subsequent loads of the link should have this set to 0. When the menu
item is re-clicked
		 * rest filters is set to 1 again
		 */
		$router->setVar('resetfilters', 0);

		if ($option !== 'com_' . $this->package)
		{
			// $$$ rob these can't be set by the menu item, but can be set in
{fabrik....}
			$router->setVar('clearordering', 0);
			$router->setVar('clearfilters', 0);
		}

		$queryVars = $router->getVars();
		$page = 'index.php?';

		foreach ($queryVars as $k => $v)
		{
			$qs[] = $k . '=' . $v;
		}

		$action = $page . implode("&amp;", $qs);

		// Limitstart gets added in the pagination model
		$action = preg_replace("/limitstart" .
$this->getState('id') . "}=(.*)?(&|)/",
'', $action);
		$action = FabrikString::rtrimword($action, "&");
		$this->getFilterFormURL = Route::_($action);

		return $this->getFilterFormURL;
	}

	/**
	 * Get List Model's Required Filter message
	 *
	 * @return  void
	 */
	protected function getRequireFilterMsg()
	{
		$listModels = $this->getlistModels();

		foreach ($listModels as $model)
		{
			if (!$model->gotAllRequiredFilters())
			{
				$this->app->enqueueMessage($model->getRequiredMsg(),
'notice');
			}
		}
	}

	/**
	 * Set visualization prefilters
	 *
	 * @return  void
	 */
	public function setPrefilters()
	{
		$listModels = $this->getListModels();
		$params = $this->getParams();
		$preFilters = (array) $params->get('prefilters');
		$c = 0;

		foreach ($listModels as &$listModel)
		{
			// Set pre-filter params
			$listParams = $listModel->getParams();
			$preFilter = FArrayHelper::getValue($preFilters, $c);
			$preFilter = ArrayHelper::fromObject(json_decode($preFilter));
			$conditions = FArrayHelper::getValue($preFilter,
'filter-conditions', array(), 'array');

			if (!empty($conditions))
			{
				$fields = $preFilter['filter-fields'];

				foreach ($fields as &$f)
				{
					$f = FabrikString::safeColName($f);
					$f = str_replace('`', '', $f);
				}

                if
($listParams->get('menu_module_prefilters_override', true))
                {
                    // override the list's filters with module's
                    $listParams->set('filter-join',
$preFilter['filter-join']);
                    $listParams->set('filter-fields',
$fields);
                    $listParams->set('filter-conditions',
$preFilter['filter-conditions']);
                    $listParams->set('filter-value',
$preFilter['filter-value']);
                    $listParams->set('filter-access',
$preFilter['filter-access']);
                    $listParams->set('filter-eval',
$preFilter['filter-eval']);
                }
                else
                {
                    // merge module filters into list's
                    $listFields = (array)
$listParams->get('filter-fields');
                    $listConditions = (array)
$listParams->get('filter-conditions');
                    $listValue = (array)
$listParams->get('filter-value');
                    $listAccess = (array)
$listParams->get('filter-access');
                    $listEval = (array)
$listParams->get('filter-eval');
                    $listJoins = (array)
$listParams->get('filter-join');
                    $listJoins[0] = 'AND';

                    $listParams->set('filter-join',
array_merge($listJoins, $preFilter['filter-join']));
                    $listParams->set('filter-fields',
array_merge($listFields, $fields));
                    $listParams->set('filter-conditions',
array_merge($listConditions, $preFilter['filter-conditions']));
                    $listParams->set('filter-value',
array_merge($listValue, $preFilter['filter-value']));
                    $listParams->set('filter-access',
array_merge($listAccess, $preFilter['filter-access']));
                    $listParams->set('filter-eval',
array_merge($listEval, $preFilter['filter-eval']));
                }

            }

			$c ++;
		}
	}

	/**
	 * Should be overwritten in plugin viz model
	 *
	 * @return  bool
	 */
	public function getRequiredFiltersFound()
	{
		$listModels = $this->getListModels();

		foreach ($listModels as $listModel)
		{
			if (!$listModel->getRequiredFiltersFound())
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * Load in any table plugin classes
	 * needed for radius search filter
	 *
	 * @param   array  &$srcs  existing src file
	 *
	 * @return  array	js file paths
	 */
	public function getPluginJsClasses(&$srcs = array())
	{
		$listModels = $this->getListModels();

		foreach ($listModels as $model)
		{
			$model->getPluginJsClasses($srcs);
		}

		return $srcs;
	}

	/**
	 * Get the js code to create instances of js list plugin classes
	 * needed for radius search filter
	 *
	 * @return  array
	 */
	public function getPluginJsObjects()
	{
		$str = array();
		$listModels = $this->getListModels();

		foreach ($listModels as $model)
		{
			$src = $model->getPluginJsClasses($src);
			$tmp = $model->getPluginJsObjects($this->getContainerId());
			$str = array_merge($str, $tmp);
		}

		return $str;
	}

	/**
	 * Get the requirejs shim for the visualization
	 * Load all the list plugin requirements
	 *
	 * @since  3.1rc
	 *
	 * @return array
	 */
	public function getShim()
	{
		$listModels = $this->getListModels();
		$shim = array();

		foreach ($listModels as $model)
		{
			$src = $model->getPluginJsClasses($src, $shim);
		}

		return $shim;
	}

	/**
	 * Method to set the table id
	 *
	 * @param   int  $id  viz id
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		$this->setState('id', $id);

		// $$$ rob not sure why but we need this getState() here when assinging
id from admin view
		$this->getState();
	}

	/**
	 * Get viz params
	 *
	 * @return  object  params
	 */
	public function getParams()
	{
		if (is_null($this->params))
		{
			$v = $this->getVisualization();
			$input = $this->app->getInput();
			$this->params = new Registry($v->params);
			$this->params->set('show-title',
$input->getInt('show-title',
$this->params->get('show-title', 1)));
		}

		return $this->params;
	}

	/**
	 * Get viz id
	 *
	 * @return  int  id
	 */
	public function getId()
	{
		return $this->getState('id');
	}

	/**
	 * Can the use view the visualization (checks published and access level)
	 *
	 * @return boolean
	 */
	public function canView()
	{
		$groups = $this->user->getAuthorisedViewLevels();
		$row = $this->getRow();

		if ($row->published == 0)
		{
			return false;
		}

		return in_array($row->access, $groups);
	}

	/**
	 * Load the JS files into the document
	 *
	 * @param   array  &$scripts  Js script sources to load in the head
	 *
	 * @return null
	 */
	public function getCustomJsAction(&$scripts)
	{
		$views = array(
			'visualization',
			'viz'
		);
		$scriptsKey = 'viz_' . $this->getId();

		foreach ($views as $view)
		{
			if (File::exists(COM_FABRIK_FRONTEND . '/js/' . $view .
'_' . $this->getId() . '.js'))
			{
				$scripts[$scriptsKey] = 'components/com_fabrik/js/' . $view .
'_' . $this->getId() . '.js';
			}
		}
	}
}
models/webservice.php000064400000017130151165347430010711 0ustar00<?php
/**
 * Abstract web service class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Factory;
use Joomla\String\StringHelper;
use Fabrik\Helpers\Php;

jimport('joomla.application.component.model');

/**
 * Abstract web service class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.5
 */
abstract class FabrikWebService
{
	/**
	 * FabrikWebService instances container.
	 *
	 * @since  3.0.5
	 *
	 * @var    array
	 */

	protected static $instances = array();

	/**
	 * Get web service instance
	 *
	 * @param   array  $options  initial state options
	 *
	 * @throws Exception
	 *
	 * @return  FabrikWebService
	 */

	public static function getInstance($options = array())
	{
		// Sanitize the database connector options.
		$options['driver'] = (isset($options['driver'])) ?
preg_replace('/[^A-Z0-9_\.-]/i', '',
$options['driver']) : 'soap';
		$options['endpoint'] = (isset($options['endpoint']))
? $options['endpoint'] : null;

		// Get the options signature for the database connector.
		$signature = md5(serialize($options));

		// If we already have a database connector instance for these options
then just use that.
		if (empty(self::$instances[$signature]))
		{
			// Derive the class name from the driver.
			$class = 'FabrikWebService' .
StringHelper::ucfirst($options['driver']);

			// If the class doesn't exist, let's look for it and register
it.
			if (!class_exists($class))
			{
				// Derive the file path for the driver class.
				$path = dirname(__FILE__) . '/webservice/' .
$options['driver'] . '.php';

				// If the file exists register the class with our class loader.
				if (file_exists($path))
				{
					JLoader::register($class, $path);
				}
				// If it doesn't exist we are at an impasse so throw an exception.
				else
				{
					throw new
Exception(Text::sprintf('JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER',
$options['driver']));
				}
			}
			// If the class still doesn't exist we have nothing left to do but
throw an exception.  We did our best.
			if (!class_exists($class))
			{
				throw new
Exception(Text::sprintf('JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER',
$options['driver']));
			}
			// Create our new FabrikWebService connector based on the options given.
			try
			{
				$instance = new $class($options);
			}
			catch (Exception $e)
			{
				throw new
Exception(Text::sprintf('JLIB_DATABASE_ERROR_CONNECT_DATABASE',
$e->getMessage()));
			}

			// Set the new connector to the global instances based on signature.
			self::$instances[$signature] = $instance;
		}

		return self::$instances[$signature];
	}

	/**
	 * Set the map which defines which webservice fields are mapped to
	 * which Fabrik fields
	 *
	 * @param   array  $map  service map
	 *
	 * @return  void
	 */

	public function setMap($map)
	{
		/* How to map the data from the web service to a Fabrik list:

		 $this->map = array(
		 array('from' => '{EventId}', 'to' =>
$fk),
		array('from' => '{Genre}', 'to' =>
'genres'),
		array('from' => '{DoorOpen}', 'to' =>
'Event_date'),
		array('from' => '{DoorClosed}', 'to'
=> 'Event_date_end'),
		array('from' => '{DoorClosed}', 'to'
=> 'Event_publish_end'),
		array('from' => '{IsFreeEntrance}', 'to'
=> 'ticket_cost', 'value' => 0, 'match'
=> 'true'),
		array('from' => '{AvailabilityStatus}',
'to' => 'ticket_cost', 'value' => 3,
'match' => 'false'),
		array('from' => '{ShortText}', 'to'
=> 'Event_description_short'),
		array('from' => '{Title} ({SubTitle})',
'to' => 'Event_title'),
		array('from' => '{Price}', 'to' =>
'Event_price_presale', 'match' =>
			'foreach($d->Price as $p) { if($p->TicketType ==
\'Normaal\') { return $p->Price;}} return false;',
'eval' => true),
		array('from' => '{Price}', 'to' =>
'Event_price_door',
			'match' => 'foreach($d->Price as $p) {
if($p->TicketType == \'Dagkassa\') { return $p->Price;}}
return false;', 'eval' => true)
		); */
		$this->map = $map;
	}

	/**
	 * Map web service data to Fabrik fields
	 *
	 * @param   array   $datas  web service data
	 * @param   string  $fk     foreign key
	 *
	 * @return  array mapped data
	 */

	public function map($datas, $fk)
	{
		$return = array();
		$w = new FabrikWorker;

		foreach ($datas as $data)
		{
			$row = array();

			foreach ($this->map as $map)
			{
				$to = $map['to'];
				$map['from'] =
$w->parseMessageForPlaceHolder($map['from'], $data, false);

				if (FArrayHelper::getValue($map, 'match', '') !==
'')
				{
					if (FArrayHelper::getValue($map, 'eval') == 1)
					{
						$res = Php::Eval(['code' => $map['match']]);

						if ($res !== false)
						{
							$row[$to] = $res;
						}
					}
					else
					{
						if ($map['match'] == $map['from'])
						{
							$row[$to] = $map['value'];
						}
					}
				}
				else
				{
					$row[$to] = $map['from'];
				}
			}

			$return[] = $row;
		}

		return $return;
	}

	/**
	 * Query the web service to get the data
	 *
	 * @param   string  $method      method to call at web service (soap only)
	 * @param   array   $options     key value filters to send to web service
to filter the data
	 * @param   string  $startPoint  startPoint of actual data, if soap this
is an xpath expression,
	 * otherwise its a key.key2.key3 string to traverse the returned data to
arrive at the data to map to the fabrik list
	 * @param   string  $result      result method name - soap only, if not
set then "$method . 'Result' will be used.
	 *
	 * @return	array	series of objects which can then be bound to the list
using storeLocally()
	 */

	public abstract function get($method, $options = array(), $startPoint =
null, $result = null);

	/**
	 * Store the data obtained from get() in a list
	 *
	 * @param   object  $listModel  list model to store the data in
	 * @param   array   $data       data obtained from get()
	 * @param   string  $fk         foreign key to map records in $data to the
list models data.
	 * @param   bool    $update     should existing matched rows be updated or
not?
	 *
	 * @return  void
	 */

	public function storeLocally($listModel, $data, $fk, $update)
	{
		$data = $this->map($data, $fk);
		$item = $listModel->getTable();
		$formModel = $listModel->getFormModel();
		$db = $listModel->getDb();
		$item = $listModel->getTable();

		$query = $db->getQuery(true);
		$query->select($item->db_primary_key . ' AS id, ' .
$fk)->from($item->db_table_name);
		$db->setQuery($query);
		$ids = $db->loadObjectList($fk);
		$formModel->getGroupsHiarachy();
		$this->updateCount = 0;
		$this->addedCount = 0;
		$primaryKey = FabrikString::shortColName($item->db_primary_key);
		$primaryKey = str_replace("`", "", $primaryKey);

		foreach ($data as $row)
		{
			foreach ($row as $k => $v)
			{
				$elementModel = $formModel->getElement($k, true);
				$row[$k] = $elementModel->fromXMLFormat($v);
			}

			$pk = '';

			if (array_key_exists($row[$fk], $ids) && $row[$fk] !=
'')
			{
				$pk = $ids[$row[$fk]]->id;
			}

			if (!$update && $pk !== '')
			{
				continue;
			}

			if ($pk == '')
			{
				$this->addedCount++;
			}
			else
			{
				$this->updateCount++;
			}


			$row[$primaryKey] = $pk;

			$listModel->storeRow($row, $pk);

		}
	}

	/**
	 * Parse the filter values into driver type
	 *
	 * @param   string  $val   value
	 * @param   string  $type  type
	 *
	 * @return  string
	 */

	public function getFilterValue($val, $type)
	{
		switch ($type)
		{
			case 'bool':
				$val = (bool) $val;
				break;
			case 'date':
				$d = Factory::getDate($val);
				$val = $d->toISO8601();
				break;
			case 'text':
				break;
		}

		return $val;
	}
}
models/webservice/rest.php000064400000004523151165347430011670
0ustar00<?php
/**
 * REST web service
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.model');

/**
 * REST web service
 *
 * @package  Fabrik
 * @since    3.0
 */

class FabrikWebServiceRest extends FabrikWebService
{
	/**
	 * Constructor
	 *
	 * @param   array  $options  ini state
	 */

	public function __construct($options)
	{
		$this->options = $options;
	}

	/**
	 * Query the web service to get the data
	 *
	 * @param   string  $method      method to call at web service (soap only)
	 * @param   array   $options     key value filters to send to web service
to filter the data
	 * @param   string  $startPoint  startPoint of actual data, if soap this
is an xpath expression,
	 * otherwise its a key.key2.key3 string to traverse the returned data to
arrive at the data to map to the fabrik list
	 * @param   string  $result      result method name - soap only, if not
set then "$method . 'Result' will be used.
	 *
	 * @return	array	series of objects which can then be bound to the list
using storeLocally()
	 */

	public function get($method, $options = array(), $startPoint = null,
$result = null)
	{
		$url = $this->options['endpoint'];
		$url = trim($url);

		if (!strstr($url, '?'))
		{
			$url .= '?';
		}

		foreach ($options as $k => $v)
		{
			$url .= '&' . $k . '=' . $v;
		}

		$session = curl_init($url);
		curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($session, CURLOPT_HTTPGET, true);
		curl_setopt($session, CURLOPT_POST, false);
		$json = curl_exec($session);

		if ($json === false)
		{
			$error = 'Fabrik webservice rest: CURL err: ' .
curl_error($session);
			throw new Exception($error, 500);

			return array();
		}
		else
		{
			$phpObj = json_decode($json);

			if (!is_null($phpObj))
			{
				if (!empty($startPoint))
				{
					$startPoints = explode('.', $startPoint);

					foreach ($startPoints as $p)
					{
						$phpObj = &$phpObj->$p;
					}
				}

				return $phpObj;
			}
			else
			{
				$error = (string) $json === '' ? 'Fabrik webservice
rest: Returned data not parseable as JSON' : (string) $json;
				throw new Exception($error, 500);

				return array();
			}
		}
	}
}
models/webservice/soap.php000064400000003736151165347440011663
0ustar00<?php
/**
 * SOAP web service
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

jimport('joomla.application.component.model');

/**
 * SOAP web service
 *
 * @package  Fabrik
 * @since    3.0
 */

class FabrikWebServiceSoap extends FabrikWebService
{
	/**
	 * Constructor
	 *
	 * @param   array  $options  ini state
	 */

	public function __construct($options)
	{
		ini_set("soap.wsdl_cache_enabled", 0);
		$this->client = new SoapClient($options['endpoint']);
	}

	/**
	 * get SOAP clients function
	 *
	 * @return  null
	 */

	public function getFunctions()
	{
		$functions = $this->client->__getFunctions();
	}

	/**
	 * Query the web service to get the data
	 *
	 * @param   string  $method      to call at web service (soap only)
	 * @param   array   $options     key value filters to send to web service
to filter the data
	 * @param   string  $startPoint  of actual data, if soap this is an xpath
expression,
	 * otherwise its a key.key2.key3 string to traverse the returned data to
arrive at the data to map to the fabrik list
	 * @param   string  $result      method name - soap only, if not set then
"$method . 'Result' will be used
	 *
	 * @return  array	series of objects which can then be bound to the list
using storeLocally()
	 */

	public function get($method, $options = array(), $startPoint = null,
$result = null)
	{
		if (is_null($result))
		{
			$result = $method . 'Result';
		}

		$xml = $this->client->$method($options);
		$data = Factory::getXML($xml->$result, false);

		if (!is_null($startPoint))
		{
			$data = $data->xpath($startPoint);
		}

		$return = array();

		// Convert xml nodes into simple objects
		foreach ($data as $xmlElement)
		{
			$json = json_encode($xmlElement);
			$return[] = json_decode($json);
		}

		return $return;
	}
}
models/webservice/yql.php000064400000004135151165347440011520
0ustar00<?php
/**
 * YQL web service
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.model');

/**
 * YQL web service
 *
 * @package  Fabrik
 * @since    3.0
 */

class FabrikWebServiceYql extends FabrikWebService
{
	/**
	 * Constructor
	 *
	 * @param   array  $options  ini state
	 */

	public function __construct($options)
	{
		$this->options = $options;
		ini_set("soap.wsdl_cache_enabled", 0);
	}

	/**
	 * get clients function
	 *
	 * @return  false
	 */

	public function getFunctions()
	{
		return false;
	}

	/**
	 * Query the web service to get the data
	 *
	 * @param   string  $method      to call at web service (soap only)
	 * @param   array   $options     key value filters to send to web service
to filter the data
	 * @param   string  $startPoint  of actual data, if soap this is an xpath
expression,
	 * otherwise its a key.key2.key3 string to traverse the returned data to
arrive at the data to map to the fabrik list
	 * @param   string  $result      method name - soap only, if not set then
"$method . 'Result' will be used
	 *
	 * @return  array	series of objects which can then be bound to the list
using storeLocally()
	 */

	public function get($method, $options = array(), $startPoint = null,
$result = null)
	{
		if (!strstr($method, 'where'))
		{
			$method .= ' where ';
		}

		foreach ($options as $k => $v)
		{
			$method .= $k . '=\'' . $v . '\'';
		}

		$url = $this->options['endpoint'] . '?q=' .
urlencode($method) . '&format=json';

		// Make call with cURL
		$session = curl_init($url);
		curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
		$json = curl_exec($session);
		$phpObj = json_decode($json);

		if (!is_null($phpObj->query->results))
		{
			$res = $phpObj->query->results;
			$startPoints = explode('.', $startPoint);

			foreach ($startPoints as $p)
			{
				$res = &$res->$p;
			}

			return $res;
		}
		else
		{
			return array();
		}
	}
}
views/article/metadata.xml000064400000000175151165347440011643
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<view hidden="true" title="Article">
	</view>
</metadata>
views/article/tmpl/labels-above/default_group.php000064400000001374151165347440016224
0ustar00<?php
/**
 * Labels Above Articles Template - Group details
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

?>
<ul>
<?php foreach ( $this->elements as $element) {
	?>
	<li <?php echo @$element->column;?> class="<?php echo
$element->containerClass;?>">
		<?php echo $element->label;?>
		<div class="fabrikElement <?php echo
$element->bsClass;?>">
			<?php echo $element->element;?>

		</div>
		<div class="fabrikErrorMessage">
				<?php echo $element->error;?>
			</div>
		<div style="clear:both"></div>
	</li>
	<?php }?>
</ul>views/article/tmpl/labels-above/default_relateddata.php000064400000001026151165347440017334
0ustar00<?php
/**
 * Labels Above Article Template: Related Data
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if (!empty($this->linkedTables)) {?>
	<ul class='linkedTables'>
		<?php foreach ($this->linkedTables as $a) { ?>
		<li>
			<?php echo implode(" ", $a);?>
			</li>
		<?php }?>
	</ul>
<?php
}?>views/article/tmpl/labels-above/default.php000064400000005014151165347440015003
0ustar00<?php
/**
 * Labels-Above Article Template - Default
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

?>
<?php if ($this->params->get('show_page_heading', 1)) {
?>
	<div class="componentheading<?php echo
$this->params->get('pageclass_sfx')?>"><?php
echo $this->escape($this->params->get('page_heading'));
?></div>
<?php } ?>
<?php $form = $this->form;
?>
<div class="fabrikForm fabrikDetails" id="<?php echo
$form->formid; ?>">
<?php
if ($this->params->get('show-title', 1)) {?>
<h1><?php echo $form->label;?></h1>
<?php }
echo $form->intro;
echo $this->plugintop;
$active = ($form->error != '') ? '' : '
fabrikHide';
echo "<div class='fabrikMainError
fabrikError$active'>" . $form->error .
"</div>";?>

	<?php
	if ($this->showEmail) {
		echo $this->emailLink;
	}
	if ($this->showPDF) {
		echo $this->pdfLink;
	}
	if ($this->showPrint) {
		echo $this->printLink;
	}
	echo $this->loadTemplate('relateddata');
	foreach ( $this->groups as $group) {
		?>
		<fieldset class="fabrikGroup" id="group<?php echo
$group->id;?>" style="<?php echo
$group->css;?>">
		<legend><?php echo $group->title;?></legend>
		<?php if ($group->canRepeat) {
			foreach ($group->subgroups as $subgroup) {
			?>
				<div class="fabrikSubGroup">
					<div class="fabrikSubGroupElements">
						<?php
						$this->elements = $subgroup;
						echo $this->loadTemplate('group');
						?>
					</div>
					<?php if ($group->editable) { ?>
						<div class="fabrikGroupRepeater">
							<?php if ($group->canAddRepeat) {?>
							<a class="addGroup" href="#">
								<?php echo FabrikHelperHTML::image('plus',
'form', $this->tmpl,
Text::_('COM_FABRIK_ADD_GROUP'));?>
							</a>
							<?php }?>
							<a class="deleteGroup" href="#">
								<?php echo FabrikHelperHTML::image('minus',
'form', $this->tmpl,
Text::_('COM_FABRIK_DELETE_GROUP'));?>
							</a>
						</div>
					<?php } ?>
				</div>
				<?php
			}
		} else {
			$this->elements = $group->elements;
			echo $this->loadTemplate('group');
		}?>
	</fieldset>
<?php
	}
	echo $this->hiddenFields;
	?>
	<?php echo $this->pluginbottom; ?>
	<div class="fabrikActions"><?php echo
$form->resetButton;?> <?php echo $form->submitButton;?>
	<?php echo $form->copyButton  . " " .
$form->gobackButton . ' ' . $this->message?>
	</div>
</div>
<?php
echo FabrikHelperHTML::keepalive();
?>views/article/tmpl/labels-above/images/add.png000064400000006777151165347470015375
0ustar00�PNG


IHDR�a	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR
RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!��
e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$
ɈQ"K�5H1R�T
UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB
aAHXLXN�H�
$4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�,
+ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_��
c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v
m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�|
(�h���S�������c3-�gAMA��|�Q�
cHRMz%������u0�`:�o�_�FIDATxڤ�Khe�����y�m��T�F
b^֤B�E��Z"J�K݈�D!n�""���N�`QQ	�Ѧ�ƾH0��7!�M�Ϲs矙�Eiѵgw�ۜs4��G�O�f�X�$Ɂ��:���50�v���X�K��f��g�e�Son
���l�ki{����=ö.4bb�z7�.����1{�a3��\�(����'�>3�iͰ\��@�D�$I�R����=2�k����7C�Q$�M����O�ǎ��<
EGT���0R�Rc����������G�o])�?�7����Yٞ���e	�I�>�*��P�HU�o���4}7H9��bOk�����{/��H�7�T���&������K�f���"nF`��ͷ?�#��sP��U�F�5Ȁ{?�e��sh�h�V�����}"L�N9,%MjA����q��ǯU��9DO�R�\�8E,}SCi�
d��(��L-����K�c<�幑SL>�۹�qD��״qM�e@�T���v�њr���ȤB�j4�2RU1
��mb���Q;
�K}7?����d=S8�F���wY,�J��bK�)V�x��
�;iQ+�'�_\��/�e��b	�"db�
Kgp��k�t�Zjgg�^2]��(�\G)���}�����ڲ)�AH{�h8��gY�˼�ֹז�'��2e��ϲw�w˿<:�ugWgNs]A���V�sg��>/��2�J���:�����ݽ��G*Z��.���,���_�3�h���BIEND�B`�views/article/tmpl/labels-above/images/del.png000064400000001505151165347470015371
0ustar00�PNG


IHDR�agAMA��7��tEXtSoftwareAdobe
ImageReadyq�e<�IDATxڤSMLA�f���R��i���I*�&��=A�	���x�B��1�z4&�D�E"�D9���&B�	��K��B���?]�Y���I^vvf��7����	�3�}���E�u(F�����\kkg���`h��������ڄ,I��<�B��/�Y��UU���+�D���a�AA(�A�2��S���Y�]ep�K@CrC0������i���u�K%�@�a�k�n����y<�&'�8BV-j��;�����$�����~�@����i`77�;:�I�F���+�a�;�ч-�V��b
�"�Xs�r9(/,�����PU�g9�|ݗ���L�yxj�*�f�����Sq��f��&�_�j���^$�N��D"���A�D�clL����p���$��e����/�S�6��8�(Ȱ,�d��d]�!��ဲ���(��'�F��ᑇg��|�.1YY���i2_[�fB[�u8	4@6A��d�0g	���\*�V�>�kjp�q�a���Sq|
�,
FF_Y�W�)���;;��f���TRFDCK��m���L"��ɲ�V
f��C%���=ü�ko?�R(��	�lc����p���̋�\n؎������\�ijzv����y��Tc�����l"�YYy�T*=�	��͊ÿG5����輎����覩/�r;��E��g��FG���_k^��IEND�B`�views/article/tmpl/labels-above/template.css000064400000000340151165347470015173
0ustar00.fabrikLabel{
	padding-right:15px;
	display:inline;
}

.fabrikGroupRepeater{
	float:left;
	width:19%;
}

.fabrikSubGroup{
	clear:both;
}
.fabrikSubGroupElements{
	width:80%;
	float:left;
}

.fabrikElement{
	margin-right:0;
}views/cron/view.html.php000064400000005246151165347470011314
0ustar00<?php
/**
 * Fabrik Cron View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.view');

/**
 * Cron view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewCron extends FabrikView
{
	/**
	 * Display
	 *
	 * @param   string $tmpl Template
	 *
	 * @return  void
	 */

	public function display($tmpl = 'default')
	{
		$srcs  = FabrikHelperHTML::framework();
		$input = $this->app->getInput();
		FabrikHelperHTML::script($srcs);
		$model       = $this->getModel();
		$usersConfig = ComponentHelper::getParams('com_fabrik');
		$model->setId($input->getInt('id',
$usersConfig->get('visualizationid',
$input->getInt('visualizationid', 0))));
		$visualization = $model->getVisualization();
		$pluginParams  = $model->getPluginParams();

		$pluginManager =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Pluginmanager',
'FabrikModel');
		$plugin        = $pluginManager->getPlugIn($visualization->plugin,
'visualization');
		$plugin->_row  = $visualization;

		if ($visualization->published == 0)
		{
			$this->app->enqueueMessage(Text::_('COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED'),
'warning');

			return '';
		}

		// Plugin is basically a model
		$pluginTask = $input->get('plugintask', 'render',
'request');

		// @FIXME cant set params directly like this, but I think plugin model
setParams() is not right
		$plugin->_params = $pluginParams;
		$tmpl            =
$plugin->getParams()->get('calendar_layout', $tmpl);
		$plugin->$pluginTask($this);
		$this->plugin = $plugin;
		$this->addTemplatePath($this->_basePath . '/plugins/' .
$this->_name . '/' . $plugin->_name . '/tmpl/' .
$tmpl);
		$root = $this->app->isClient('administrator') ?
JPATH_ADMINISTRATOR : JPATH_SITE;
		$this->addTemplatePath($root . '/templates/' .
$this->app->getTemplate() .
'/html/com_fabrik/visualization/' . $plugin->_name .
'/' . $tmpl);
		$ab_css_file = JPATH_SITE . '/plugins/fabrik_visualization/' .
$plugin->_name . '/tmpl/' . $tmpl . '/template.css';

		if (File::exists($ab_css_file))
		{
			HTMLHelper::stylesheet('template.css',
'plugins/fabrik_visualization/' . $plugin->_name .
'/tmpl/' . $tmpl . '/', true);
		}

		echo parent::display();
	}

	/**
	 * Just for plugin
	 *
	 * @return  void
	 */
	public function setId()
	{
	}
}
views/csv/tmpl/default.php000064400000000634151165347470011625
0ustar00<?php
/**
 * CSV View
 *
 * @package Joomla
 * @subpackage Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
*/

// No direct access
defined('_JEXEC') or die('Restricted access');

?>
<form name="listform_<?php echo $this->id?>"
id="listform_<?php echo $this->id?>">
</form>
<!-- secret hihi hello line! (H)
-->views/csv/view.html.php000064400000010407151165347470011141
0ustar00<?php
/**
 * CSV View Front End View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Factory;

jimport('joomla.application.component.view');

/**
 * CSV View Front End View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewCsv extends FabrikView
{
	/**
	 * Display the view
	 *
	 * @param   string $tpl Template name
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 */
	public function display($tpl = null)
	{
		$this->listid =
$this->app->getInput()->get('listid', 0);
		$listModel    =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$listModel->setId($this->listid);
		$this->setModel($listModel, true);
		$this->table = $listModel->getTable();
		$data        = array();
		$this->getManagementJS($data);
		$this->id   = $listModel->getId();
		$this->form = $listModel->getForm();
		$this->shim();

		if (!$listModel->canCSVExport())
		{
			throw new RuntimeException('Naughty naughty!', 400);
		}

		$this->addTemplatePath(JPATH_SITE .
'/components/com_fabrik/views/csv/tmpl');

		return parent::display($tpl);
	}

	/**
	 * Ini the Fabrik requirejs framework files
	 *
	 * @return  void
	 */
	protected function shim()
	{
		$shim             = array();
		$dep              = new stdClass;
		$dep->deps        = array('fab/fabrik',
'fab/listfilter', 'fab/advanced-search',
'fab/encoder');
		$shim['fab/list'] = $dep;
		FabrikHelperHTML::iniRequireJS($shim);
	}

	/**
	 * Get the js needed for the view
	 *
	 * @param   array $data empty array
	 *
	 * @return  void
	 */

	protected function getManagementJS($data = array())
	{
		$model          = $this->getModel();
		$listId         = $model->getId();
		$script         = array();
		$opts           = new stdClass;
		$opts->admin    =
$this->app->isClient('administrator');
		$opts->form     = 'listform_' . $listId;
		$opts->headings = $model->jsonHeadings();
		list($this->headings, $groupHeadings, $this->headingClass,
$this->cellClass) = $model->getHeadings();
		$labels = $this->headings;

		foreach ($labels as &$l)
		{
			$l = strip_tags($l);
		}

		$listParams            = $model->getParams();
		$opts->labels          = $labels;
		$opts->csvChoose       = (bool)
$listParams->get('csv_frontend_selection');
		$csvOpts               = new stdClass;
		$csvOpts->excel        = (int)
$listParams->get('csv_format');
		$csvOpts->inctabledata = (int)
$listParams->get('csv_include_data');
		$csvOpts->incraw       = (int)
$listParams->get('csv_include_raw_data');
		$csvOpts->inccalcs     = (int)
$listParams->get('csv_include_calculations');
		$csvOpts->custom_qs    =
$listParams->get('csv_custom_qs', '');
		$opts->csvOpts         = $csvOpts;
		$opts->csvFields       = $this->get('CsvFields');
		$csvOpts->incfilters   = 0;
		$opts->view            = 'csv';

		// $$$rob if you are loading a table in a window from a form db join
select record option
		// then we want to know the id of the window so we can set its
showSpinner() method
		$opts->winid = $this->app->getInput()->get('winid',
'');
		$opts        = json_encode($opts);

		Text::script('COM_FABRIK_CSV_COMPLETE');
		Text::script('COM_FABRIK_CSV_DOWNLOAD_HERE');
		Text::script('COM_FABRIK_CONFIRM_DELETE');
		Text::script('COM_FABRIK_CSV_DOWNLOADING');
		Text::script('COM_FABRIK_FILE_TYPE');
		Text::script('COM_FABRIK_INCLUDE_FILTERS');
		Text::script('COM_FABRIK_INCLUDE_RAW_DATA');
		Text::script('COM_FABRIK_INCLUDE_DATA');
		Text::script('COM_FABRIK_INCLUDE_CALCULATIONS');
		Text::script('COM_FABRIK_EXPORT');
		Text::script('COM_FABRIK_LOADING');
		Text::script('COM_FABRIK_RECORDS');
		Text::script('JNO');
		Text::script('JYES');
		Text::script('COM_FABRIK_SAVING_TO');

		$srcs   = FabrikHelperHTML::framework();
		$srcs['ListPlugin'] =
'media/com_fabrik/js/list-plugin.js';
		$srcs['List'] = 'media/com_fabrik/js/list.js';

		$script[] = 'var list = new FbList(' . $listId . ','
. $opts . ');';
		$script[] = 'Fabrik.addBlock(\'list_' . $listId .
'\', list);';
		FabrikHelperHTML::script($srcs, implode("\n", $script));
	}
}
views/details/tmpl/bootstrap_tabs/custom_css_example.php000064400000003333151165347500017747
0ustar00<?php
/**
 * Default Form Template: Custom CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

/**
 * If you need to make small adjustments or additions to the CSS for a
Fabrik
 * template, you can create a custom_css.php file, which will be loaded
after
 * the main template_css.php for the template.
 *
 * This file will be invoked as a PHP file, so the view type and form ID
 * can be used in order to narrow the scope of any style changes.  You do
 * this by prepending #{$view}_$c to any selectors you use.  This will
become
 * (say) #form_12, or #details_11, which will be the HTML ID of your form
 * on the page.
 *
 * See examples below, which you should remove if you copy this file.
 *
 * Don't edit anything outside of the BEGIN and END comments.
 *
 * For more on custom CSS, see the Wiki at:
 *
 *
http://www.fabrikar.com/forums/index.php?wiki/form-and-details-templates/#the-custom-css-file
 *
 * NOTE - for backward compatibility with Fabrik 2.1, and in case you
 * just prefer a simpler CSS file, without the added PHP parsing that
 * allows you to be be more specific in your selectors, we will also
include
 * a custom.css we find in the same location as this file.
 *
 */

header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
$rowid = isset($_REQUEST['rowid']) ? $_REQUEST['rowid']
: '';
$form = $view . '_' . $c;
if ($rowid !== '')
{
	$form .= '_' . $rowid;
}
echo "

/* BEGIN - Your CSS styling starts here */

#$form .foobar {
	display: none;
}

/* END - Your CSS styling ends here */

";
?>
views/details/tmpl/bootstrap_tabs/default_actions.php000064400000001765151165347500017225
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - actions
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$form = $this->form;
if ($this->hasActions) : ?>
<div class="fabrikActions form-actions">
	<div class="row-fluid">
		<div class="col-sm-4 btn-group">
			<?php
			echo $form->submitButton. ' ';
			echo $form->applyButton . ' ';
			echo $form->copyButton;
			?>
		</div>
		<?php if ($form->gobackButton . $form->resetButton .
$form->deleteButton !== '') : ?>
		<div class="col-sm-4"><!-- No Page buttons
--></div>
		<div class="col-sm-4">
			<div class="pull-right btn-group">
				<?php
				echo $form->gobackButton . ' ' . $this->message;
				echo $form->resetButton . ' ';
				echo $form->deleteButton;
				?>
			</div>
		</div>
		<?php endif; ?>
	</div>
</div>
<?php endif;
views/details/tmpl/bootstrap_tabs/default_buttons.php000064400000001165151165347500017255
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - buttons
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if ($this->showEmail || $this->showPDF || $this->showPrint): ?>
	<div class="pull-right">
	<?php
	if ($this->showPrint):
		echo $this->printLink;
	endif;

	if ($this->showEmail):
		echo $this->emailLink;
	endif;

	if ($this->showPDF):
		echo $this->pdfLink;
	endif;
	?>
	</div>
<?php
endif;
views/details/tmpl/bootstrap_tabs/default_group_details.php000064400000001430151165347500020413
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - group details
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

foreach ($this->elements as $element) :
	if ($element->startRow) :?>
		<div class="row-fluid">
	<?php
	endif;

	if (!$element->hidden) :?>
		<div class="<?php echo $element->span;?>">
			<div class="row-fluid">
				<div class="col-sm-4"><em><?php echo
$element->label_raw ?></em></div>
				<div class="col-sm-8"><?php echo
$element->element;?></div>
			</div>
		</div>

	<?php
	endif;
	if ($element->endRow) :?>
		</div>
	<?php
	endif;
endforeach;
views/details/tmpl/bootstrap_tabs/default_group_labels_above.php000064400000001026151165347500021405
0ustar00<?php
/**
 * Bootstrap Form Template: Labels Above
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element;
?>
<div class="mt-3">
<?php echo $element->label;?>
    <div class="fabrikElement <?php echo
$element->bsClass;?>">
    	<?php echo $element->element;?>
    </div>
</div>views/details/tmpl/bootstrap_tabs/default_group_labels_none.php000064400000001046151165347500021252
0ustar00<?php
/**
 * Bootstrap Form Template: Labels None
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element;
?>
<div class="mt-3">
<span class="d-none"><?php echo
$element->label;?></span>

<div class="fabrikElement <?php echo
$element->bsClass;?>">
	<?php echo $element->element;?>
</div>
</div>views/details/tmpl/bootstrap_tabs/default_group_labels_side.php000064400000001532151165347500021237
0ustar00<?php
/**
 * Bootstrap Form Template: Group Labels Side
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element; 
$width = 10;	// default input width
if (property_exists($element, 'bsClass') &&
!empty($element->bsClass)) {
	/* Get the selected value and normalize it withing the 10 columns allowed
for the field */
	$width = min((int)substr($element->bsClass,
strrpos($element->bsClass, '-')+1), 12);
	$width = (int)round(($width*10)/12);
}
?>
<div class="row mt-3">
	<?php echo $element->label;?>
	<div class="fabrikElement col-sm-<?php echo
$width;?>">
		<?php echo $element->element;?>
</div>
</div>views/details/tmpl/bootstrap_tabs/default_group.php000064400000002706151165347530016720
0ustar00<?php
/**
 * Bootstrap Details Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$rowStarted = false;
$layout          =
FabrikHelperHTML::getLayout('form.fabrik-control-group');

foreach ($this->elements as $element) :
	$this->element = $element;
	$this->element->single = $single = $element->startRow &&
$element->endRow;

	$displayData = array(
		'class' => $element->containerClass .
($element->hidden ? ' d-none' : ''),
		'startRow' => $element->startRow,
		'endRow' => $element->endRow,
		'column' => $element->column,
	);

	$labelsAbove = $element->dlabels;

	if ($labelsAbove == 1)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}
	elseif ($labelsAbove == 2)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_none');
	}
	elseif ($labelsAbove == 0)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_side');
	}
	else
	{
		// Multi columns - best to use simplified layout with labels above field
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}

	echo $layout->render((object) $displayData);
endforeach;
// If the last element was not closing the row add an additional div
if ($rowStarted === true) :?>
</div><!-- end row-fluid for open row -->
<?php endif;?>

views/details/tmpl/bootstrap_tabs/default_relateddata.php000064400000001050151165347530020025
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - related data
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if (!empty($this->linkedTables)) :?>
	<ul class='linkedTables'>
		<?php foreach ($this->linkedTables as $a) : ?>
		<li>
			<?php echo implode(" ", $a);?>
			</li>
		<?php
		endforeach;
		?>
	</ul>
<?php
endif;views/details/tmpl/bootstrap_tabs/default_repeatgroup_row.php000064400000003235151165347530021006
0ustar00<?php
/**
 * Default Form: Repeat group rendered as a table, <tr> template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

$group = $this->group;
?>
<tr class="fabrikSubGroupElements fabrikSubGroup">
<?php foreach ($this->elements as $element) :
	?>
	<td class="<?php echo $element->containerClass;
?>">
	<?php
	if ($this->tipLocation == 'above') :
	?>
		<div><?php echo $element->tipAbove; ?></div>
	<?php
	endif;
	echo $element->errorTag; ?>
	<div class="fabrikElement <?php echo
$element->bsClass;?>">
		<?php echo $element->element; ?>
	</div>

	<?php if ($this->tipLocation == 'side') :
		echo $element->tipSide;
	endif;
	if ($this->tipLocation == 'below') : ?>
		<div>
			<?php echo $element->tipBelow; ?>
		</div>
	<?php endif;
	?>
	</td>
	<?php
	endforeach;
 	if ($group->editable) : ?>
		<td class="fabrikGroupRepeater">
			<div class="pull-right">
			<?php if ($group->canAddRepeat) :
				$add = FabrikHelperHTML::image('plus', 'form',
$this->tmpl, array('class' => 'fabrikTip
tip-small', 'title' =>
Text::_('COM_FABRIK_ADD_GROUP')));
				?>
				<a class="addGroup" href="#"><?php echo
$add?></a>
			<?php
			endif;
			if ($group->canDeleteRepeat) :?>
			<a class="deleteGroup" href="#">
				<?php echo FabrikHelperHTML::image('minus',
'form', $this->tmpl, array('class' =>
'fabrikTip tip-small', 'title' =>
Text::_('COM_FABRIK_DELETE_GROUP')));?>
			</a>
			<?php endif;?>
			</div>
		</td>
	<?php endif; ?>
</tr>views/details/tmpl/bootstrap_tabs/default_repeatgroup_table.php000064400000002222151165347530021261
0ustar00<?php
/**
 * Default Form Template: Repeat group rendered as a table
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0.7
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$group = $this->group;
?>
<table class="table table-striped repeatGroupTable">
	<thead>
		<tr>
	<?php
	// Add in the table heading
	$firstGroup = $group->subgroups[0];
	foreach ($firstGroup as $el) :
		$style = $el->hidden ? 'style="display:none"' :
'';
		?>
		<th <?php echo $style; ?> class="<?php echo
$el->containerClass?>">
			<?php echo $el->label_raw?>
		</th>
		<?php
	endforeach;

	// This column will contain the add/delete buttons
	if ($group->editable) : ?>
	<th></th>
	<?php
	endif;
	?>
	</tr>
	</thead>
	<tbody>
		<?php

		if (!$group->newGroup) :
			// Load each repeated group in a <tr>
			$this->i = 0;
			foreach ($group->subgroups as $subgroup) :
				$this->elements = $subgroup;
				echo $this->loadTemplate('repeatgroup_row');
				$this->i ++;
			endforeach;
		endif;
		?>
	</tbody>
</table>
views/details/tmpl/bootstrap_tabs/default_repeatgroup.php000064400000002070151165347530020113
0ustar00<?php
/**
 * Bootstrap_tabs Details Template: Repeat group rendered as standard form
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

$input = Factory::getApplication()->input;
$group = $this->group;
if (!$group->newGroup) :
	$i = 1;
	$w = new FabrikWorker;

	foreach ($group->subgroups as $subgroup) :
		$introData = array_merge($input->getArray(), array('i' =>
$i));
		?>
		<div class="fabrikSubGroup">
			<div data-role="group-repeat-intro">
				<?php echo $w->parseMessageForPlaceHolder($group->repeatIntro,
$introData);?>
			</div>
			<div class="fabrikSubGroupElements">
				<?php

				// Load each group in a <ul>
				$this->elements = $subgroup;
				echo $this->loadTemplate('group');
				?>
			</div><!-- end fabrikSubGroupElements -->
		</div><!-- end fabrikSubGroup -->
		<?php
		$i ++;
	endforeach;
endif;
views/details/tmpl/bootstrap_tabs/default.php000064400000007474151165347530015513
0ustar00<?php
/**
 * Bootstrap Tabs Form Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$form = $this->form;
$model = $this->getModel();
$groupTmpl = $model->editable ? 'group' :
'group_details';
$active = ($form->error != '') ? '' : '
fabrikHide';

if ($this->params->get('show_page_heading', 1)) : ?>
	<div class="componentheading<?php echo
$this->params->get('pageclass_sfx')?>">
	<?php echo
$this->escape($this->params->get('page_heading')); ?>
	</div>
<?php
endif;

if ($this->params->get('show-title', 1)) :?>
	<div class="page-header">
		<h1><?php echo $form->label;?></h1>
	</div>
<?php
endif;

echo $form->intro;

?>
	<div class="fabrikForm fabrikDetails" id="<?php echo
$form->formid; ?>">
<?php
echo $this->plugintop;
?>

<div class="fabrikMainError alert alert-error fabrikError<?php
echo $active?>">
	<button class="close"
data-dismiss="alert">×</button>
	<?php echo $form->error?>
</div>

<div class="row-fluid nav">
	<div class="col-sm-6 pull-right">
		<?php
		echo $this->loadTemplate('buttons');
		?>
	</div>
	<div class="col-sm-6">
		<?php
		echo $this->loadTemplate('relateddata');
		?>
	</div>
</div>
	<?php
	$tabs = array();
	$i = 0;

	foreach ($this->groups as $group) :
		$tabId = $this->form->id . '_' . (int)$this->rowid .
'_' . $i;
		// If this is multi-page then groups are consolidated until a group with
a page break
		// So we should only show a tab if: it is first tab, or if it is a page
break
		if (!$model->isMultiPage() || $i === 0 || $group->splitPage) :
			$tab = new stdClass;
			$tab->id = 'group' . $group->id . '_tab';
			$tab->class = $i === 0 ? 'active' : '';
			$tab->class .= ' ' . $tab->id . '_tab';
			$tab->css = $group->css;
			$tab->href = 'group-tab' . $tabId;
			$tab->label = !empty($group->title) ? $group->title :
$group->name;;
			$tabs[] = $tab;
			$i ++;
		endif;
	endforeach;
	?>
<?php
echo
FabrikHelperHTML::getLayout('fabrik-tabs')->render((object)
array('tabs' => $tabs));
?>
<div class="tab-content">
	<?php

	$i = 0;
	foreach ($this->groups as $group) :
		$this->group = $group;
		$tabId = $this->form->id . '_' . (int)$this->rowid .
'_' . $i;
	    $class = 'group' . $group->id . '_tab_content';

		if ($i == 0 || !$model->isMultiPage() || $group->splitPage) :
			if ($i != 0) :
				echo '</div>';
			endif;
			?>
			<div role="tabpanel" class="<?php echo $class;
?> tab-pane<?php if ($i == 0) echo " active"?>"
id="group-tab<?php echo $tabId;?>">
			<?php
			$i++;
		endif; ?>
			<fieldset class="<?php echo $group->class; ?>"
id="group<?php echo $group->id;?>" style="<?php
echo $group->css;?>">
				<?php
				if ($group->showLegend) :?>
					<legend class="legend"><?php echo
$group->title;?></legend>
				<?php
				endif;

				if (!empty($group->intro)) : ?>
					<div class="groupintro"><?php echo $group->intro
?></div>
				<?php
				endif;

				/* Load the group template - this can be :
				 *  * default_group.php - standard group non-repeating rendered as an
unordered list
				 *  * default_repeatgroup.php - repeat group rendered as an unordered
list
				 *  * default_repeatgroup_table.php - repeat group rendered in a table.
				 */
				$this->elements = $group->elements;
				echo $this->loadTemplate($group->tmpl);

				if (!empty($group->outro)) : ?>
					<div class="groupoutro"><?php echo $group->outro
?></div>
				<?php
				endif;
			?>
			</fieldset>
		<?php
	endforeach;
	?>
	</div>
</div>
<?php
if ($model->editable) : ?>
<div class="fabrikHiddenFields">
	<?php echo $this->hiddenFields; ?>
</div>
<?php
endif;

echo $this->pluginbottom;
echo $this->loadTemplate('actions');
?>

</div>
<?php
echo $form->outro;
echo $this->pluginend;
echo FabrikHelperHTML::keepalive();
views/details/tmpl/bootstrap_tabs/template_css.php000064400000001143151165347530016535
0ustar00<?php
/**
 * Fabrik Form View Template: Bootstrap Tab CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
echo "

.fabrikGroup {
clear: left;
}

/* missing from some bootstrap templates (like JoomlArt) */

.row-fluid:before,
.row-fluid:after {
	display: table;
	content: \"\";
	line-height: 0;
}

.row-fluid:after {
	clear: both;
}
";
?>views/details/tmpl/bootstrap/custom_css_example.php000064400000003340151165347530016737
0ustar00<?php
/**
 * Default Form Template: Custom CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

/**
 * If you need to make small adjustments or additions to the CSS for a
Fabrik
 * template, you can create a custom_css.php file, which will be loaded
after
 * the main template_css.php for the template.
 *
 * This file will be invoked as a PHP file, so the view type and form ID
 * can be used in order to narrow the scope of any style changes.  You do
 * this by prepending #{$view}_$c to any selectors you use.  This will
become
 * (say) #form_12, or #details_11, which will be the HTML ID of your form
 * on the page.
 *
 * See examples below, which you should remove if you copy this file.
 *
 * Don't edit anything outside of the BEGIN and END comments.
 *
 * For more on custom CSS, see the Wiki at:
 *
 *
http://www.fabrikar.com/forums/index.php?wiki/form-and-details-templates/#the-custom-css-file
 *
 * NOTE - for backward compatibility with Fabrik 2.1, and in case you
 * just prefer a simpler CSS file, without the added PHP parsing that
 * allows you to be be more specific in your selectors, we will also
include
 * a custom.css we find in the same location as this file.
 *
 */

header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
$rowid = isset($_REQUEST['rowid']) ? $_REQUEST['rowid']
: '';
$form = $view . '_' . $c;
if ($rowid !== '')
{
	$form .= '_' . $rowid;
}
echo <<<EOT

/* BEGIN - Your CSS styling starts here */

#$form .foobar {
	display: none;
}

/* END - Your CSS styling ends here */

EOT;

views/details/tmpl/bootstrap/default_actions.php000064400000001276151165347530016214
0ustar00<?php
/**
 * Bootstrap Details Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$form = $this->form;
if ($this->hasActions) : ?>
<div class="fabrikActions form-actions">
	<div class="row-fluid">
		<div class="<?php echo
FabrikHelperHTML::getGridSpan('12'); ?>">
			<div class="btn-group">
				<?php echo $form->prevButton . ' ' .
$form->nextButton;
				echo $form->gobackButton  . ' ' . $this->message;
				?>
			</div>
		</div>
	</div>
</div>
<?php
endif;views/details/tmpl/bootstrap/default_buttons.php000064400000000746151165347530016253
0ustar00<?php
/**
 * Bootstrap Details Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if ($this->showEmail):
	echo $this->emailLink;
endif;

if ($this->showPDF):
	echo $this->pdfLink;
endif;

if ($this->showPrint):
	echo $this->printLink;
endif;
views/details/tmpl/bootstrap/default_group_labels_above.php000064400000001026151165347530020377
0ustar00<?php
/**
 * Bootstrap Form Template: Labels Above
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element;
?>
<div class="mt-3">
<?php echo $element->label;?>
    <div class="fabrikElement <?php echo
$element->bsClass;?>">
    	<?php echo $element->element;?>
    </div>
</div>views/details/tmpl/bootstrap/default_group_labels_none.php000064400000001046151165347530020244
0ustar00<?php
/**
 * Bootstrap Form Template: Labels None
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element;
?>
<div class="mt-3">
<span class="d-none"><?php echo
$element->label;?></span>

<div class="fabrikElement <?php echo
$element->bsClass;?>">
	<?php echo $element->element;?>
</div>
</div>views/details/tmpl/bootstrap/default_group_labels_side.php000064400000001532151165347530020231
0ustar00<?php
/**
 * Bootstrap Form Template: Group Labels Side
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element; 
$width = 10;	// default input width
if (property_exists($element, 'bsClass') &&
!empty($element->bsClass)) {
	/* Get the selected value and normalize it withing the 10 columns allowed
for the field */
	$width = min((int)substr($element->bsClass,
strrpos($element->bsClass, '-')+1), 12);
	$width = (int)round(($width*10)/12);
}
?>
<div class="row mt-3">
	<?php echo $element->label;?>
	<div class="fabrikElement col-sm-<?php echo
$width;?>">
		<?php echo $element->element;?>
</div>
</div>views/details/tmpl/bootstrap/default_group.php000064400000003062151165347530015703
0ustar00<?php
/**
 * Bootstrap Details Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$rowStarted = 0;
$layout          =
FabrikHelperHTML::getLayout('form.fabrik-control-group');

foreach ($this->elements as $element) :
	$this->element = $element;
	$this->element->single = $single = $element->startRow &&
$element->endRow;

	$rowStarted = $rowStarted + (int)$element->startRow -
(int)$element->endRow; //see
getLayout('form.fabrik-control-group')

	$displayData = array(
		'class' => $element->containerClass .
($element->hidden ? ' d-none' : ''),
		'startRow' => $element->startRow,
		'endRow' => $element->endRow,
		'column' => $element->column,
	);

	$labelsAbove = $element->dlabels;

	if ($labelsAbove == 1)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}
	elseif ($labelsAbove == 2)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_none');
	}
	elseif ($labelsAbove == 0)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_side');
	}
	else
	{
		// Multi columns - best to use simplified layout with labels above field
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}

	echo $layout->render((object) $displayData);
endforeach;
// If the last element was not closing the row add an additional div
if ($rowStarted >0) :?>
</div><!-- end row for open row -->
<?php endif;?>

views/details/tmpl/bootstrap/default_relateddata.php000064400000001005151165347530017014
0ustar00<?php
/**
 * Bootstrap Details Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if (!empty($this->linkedTables)) {?>
	<ul class='linkedTables'>
		<?php foreach ($this->linkedTables as $a) { ?>
		<li>
			<?php echo implode(" ", $a);?>
			</li>
		<?php }?>
	</ul>
<?php
}?>views/details/tmpl/bootstrap/default_repeatgroup_row.php000064400000003312151165347530017771
0ustar00<?php
/**
 * Bootstrap Details: Repeat group rendered as a table, <tr> template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

$group = $this->group;
?>
<tr class="fabrikSubGroupElements fabrikSubGroup">
<?php foreach ($this->elements as $element) :
	$style = $element->hidden ? 'style="display:none"'
: '';
	?>
	<td class="<?php echo $element->containerClass; ?>"
<?php echo $style; ?>>
	<?php
	if ($this->tipLocation == 'above') :
	?>
		<div><?php echo $element->tipAbove; ?></div>
	<?php
	endif;
	echo $element->errorTag; ?>
	<div class="fabrikElement <?php echo
$element->bsClass;?>">
		<?php echo $element->element; ?>
	</div>

	<?php if ($this->tipLocation == 'side') :
		echo $element->tipSide;
	endif;
	if ($this->tipLocation == 'below') : ?>
		<div>
			<?php echo $element->tipBelow; ?>
		</div>
	<?php endif;
	?>
	</td>
	<?php
	endforeach;
 	if ($group->editable) : ?>
		<td class="fabrikGroupRepeater pull-right">
			<?php if ($group->canAddRepeat) :?>
			<a class="addGroup" href="#">
				<?php echo FabrikHelperHTML::image('plus',
'form', $this->tmpl, array('class' =>
'fabrikTip tip-small', 'title' =>
Text::_('COM_FABRIK_ADD_GROUP')));?>
			</a>
			<?php
			endif;
			if ($group->canDeleteRepeat) :?>
			<a class="deleteGroup" href="#">
				<?php echo FabrikHelperHTML::image('minus',
'form', $this->tmpl, array('class' =>
'fabrikTip tip-small', 'title' =>
Text::_('COM_FABRIK_DELETE_GROUP')));?>
			</a>
			<?php endif;?>
		</td>
	<?php endif; ?>
</tr>views/details/tmpl/bootstrap/default_repeatgroup_table.php000064400000002227151165347530020255
0ustar00<?php
/**
 * Bootstrap Details Template: Repeat group rendered as a table
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0.7
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$group = $this->group;
?>
<table class="table table-striped repeatGroupTable">
	<thead>
		<tr>
	<?php
	// Add in the table heading
	$firstGroup = $group->subgroups[0];
	foreach ($firstGroup as $el) :
		$style = $el->hidden ? 'style="display:none"' :
'';
		?>
		<th <?php echo $style; ?> class="<?php echo
$el->containerClass?>">
			<?php echo $el->label_raw?>
		</th>
		<?php
	endforeach;

	// This column will contain the add/delete buttons
	if ($group->editable) : ?>
	<th></th>
	<?php
	endif;
	?>
	</tr>
	</thead>
	<tbody>
		<?php

		if (!$group->newGroup) :
			// Load each repeated group in a <tr>
			$this->i = 0;
			foreach ($group->subgroups as $subgroup) :
				$this->elements = $subgroup;
				echo $this->loadTemplate('repeatgroup_row');
				$this->i ++;
			endforeach;
		endif;
		?>
	</tbody>
</table>
views/details/tmpl/bootstrap/default_repeatgroup.php000064400000002063151165347540017105
0ustar00<?php
/**
 * Bootstrap Details Template: Repeat group rendered as standard form
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

$input = Factory::getApplication()->input;
$group = $this->group;
if (!$group->newGroup) :
	$i = 1;
	$w = new FabrikWorker;

	foreach ($group->subgroups as $subgroup) :
		$introData = array_merge($input->getArray(), array('i' =>
$i));
		?>
		<div class="fabrikSubGroup">
			<div data-role="group-repeat-intro">
				<?php echo $w->parseMessageForPlaceHolder($group->repeatIntro,
$introData);?>
			</div>

			<div class="fabrikSubGroupElements">
				<?php

				// Load each group in a <ul>
				$this->elements = $subgroup;
				echo $this->loadTemplate('group');
				?>
			</div><!-- end fabrikSubGroupElements -->
		</div><!-- end fabrikSubGroup -->
		<?php
		$i ++;
	endforeach;
endif;views/details/tmpl/bootstrap/default.php000064400000004436151165347540014476
0ustar00<?php
/**
 * Bootstrap Details Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$form = $this->form;
$model = $this->getModel();

if ($this->params->get('show_page_heading', 1)) : ?>
	<div class="componentheading<?php echo
$this->params->get('pageclass_sfx')?>">
		<?php echo
$this->escape($this->params->get('page_heading')); ?>
	</div>
<?php
endif;

if ($this->params->get('show-title', 1)) :?>
<div class="page-header">
	<h1><?php echo $form->label;?></h1>
</div>
<?php
endif;

echo $form->intro;

if ($this->isMambot) :
	echo '<div class="fabrikForm fabrikDetails
fabrikIsMambot" id="' . $form->formid .
'">';
else :
	echo '<div class="fabrikForm fabrikDetails"
id="' . $form->formid . '">';
endif;

echo $this->plugintop;
?>
<div class="row-fluid nav">
	<div class="<?php echo FabrikHelperHTML::getGridSpan(6); ?>
pull-right">
		<?php
		echo $this->loadTemplate('buttons');
		?>
	</div>
	<div class="<?php echo FabrikHelperHTML::getGridSpan(6);
?>">
		<?php
		echo $this->loadTemplate('relateddata');
		?>
	</div>
</div>
<?php

foreach ($this->groups as $group) :
	$this->group = $group;
	?>

		<fieldset class="<?php echo $group->class; ?>"
id="group<?php echo $group->id;?>" style="<?php
echo $group->css;?>">

		<?php
		if ($group->showLegend) :?>
				<legend class="mt-3 legend"><?php echo
$group->title;?></legend>
		<?php endif;

		if (!empty($group->intro)) : ?>
			<div class="groupintro"><?php echo $group->intro
?></div>
		<?php
		endif;

		// Load the group template - this can be :
		//  * default_group.php - standard group non-repeating rendered as an
unordered list
		//  * default_repeatgroup.php - repeat group rendered as an unordered
list
		//  * default_repeatgroup_table.php - repeat group rendered in a table.

		$this->elements = $group->elements;
		echo $this->loadTemplate($group->tmpl);

		if (!empty($group->outro)) : ?>
			<div class="groupoutro"><?php echo $group->outro
?></div>
		<?php
		endif;
		?>
	</fieldset>
<?php
endforeach;

echo $this->pluginbottom;
echo $this->loadTemplate('actions');
echo '</div>';
echo $form->outro;
echo $this->pluginend;
views/details/tmpl/bootstrap/template_css.php000064400000001173151165347540015530
0ustar00<?php
header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
$rowid = isset($_REQUEST['rowid']) ? $_REQUEST['rowid']
: '';
$form = $view . '_' . $c;

if ($rowid !== '')
{
	$form .= '_' . $rowid;
}

echo <<<EOT
/* missing from some bootstrap templates (like JoomlArt) */

.row-fluid:before,
.row-fluid:after {
	display: table;
	content: "";
	line-height: 0;
}

.row-fluid:after {
	clear: both;
}

/* Override BS2 form horizontal labels for details view when fabrik form
module */
.fabrikDetails.fabrikIsMambot .control-label {
	width: auto;
	text-align: left;
}
EOT;
views/details/tmpl/default.xml000064400000002677151165347540012477
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<layout title="Details">
		<message>
			<![CDATA[STANDARD Fabrik details layout]]>
		</message>
	</layout>
	<fields name="request">
		<fieldset
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="request">
	
				<field description="COM_FABRIK_FIELD_FORM_DESC"
label="COM_FABRIK_FIELD_FORM_LABEL" name="formid"
type="formlist"/>
				
			</fieldset>
	</fields>
	
	<fields
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="params">

		<fieldset label="COM_FABRIK_OPTIONS"
name="params">

			<field type="text"
				name="rowid"
				description="COM_FABRIK_FIELD_ROW_ID_DESC"
				label="COM_FABRIK_FIELD_ROW_ID_LABEL" size="3"
/>

			<field name="usekey" 
				type="text"
				description="COM_FABRIK_FIELD_KEY_NAME_DESC"
				label="COM_FABRIK_FIELD_KEY_NAME_LABEL"
				size="15" />

			<field name="random"
				type="radio"
				default="0"
				class="btn-group"
				layout="joomla.form.field.radio.switcher"
				description="COM_FABRIK_FIELD_SHOW_RANDOM_RECORDS_DESC"
				label="COM_FABRIK_FIELD_SHOW_RANDOM_RECORDS_LABEL">
					<option value="0">JNO</option>
					<option value="1">JYES</option>
			</field>

			<field name="fabriklayout"
type="fabrikfolderlist"
				description="COM_FABRIK_FIELD_FORM_TEMPLATE_DESC"
				directory="/components/com_fabrik/views/details/tmpl/"
				label="COM_FABRIK_FIELD_FORM_TEMPLATE_LABEL" />

		</fieldset>
	</fields>
</metadata>
views/details/tmpl/wellington_pdf/layouts/form/fabrik-custom-css-qs.php000064400000000716151165347560022467
0ustar00<?php
/**
 * Form control group
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.4
 */
defined('JPATH_BASE') or die;
$d = $displayData;
$path = 'components/com_fabrik/views/' . $d->view .
'/' . $d->jTmplFolder . '/' . $d->tmpl .
'/custom_css.php' . $d->qs;
$path .= '&amp;color=00FF00';
echo $path;

views/element/metadata.xml000064400000000175151165347560011654
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<view hidden="true" title="Element">
	</view>
</metadata>
views/element/view.html.php000064400000001570151165347560012000
0ustar00<?php
/**
 * Fabrik Front End Element View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

/**
 * Fabrik Front End Element View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewElement extends FabrikView
{
	/**
	 * Element id (not used?)
	 *
	 * @var int
	 */
	protected $id = null;

	/**
	 * Set id
	 *
	 * @param   int  $id  Element id
	 *
	 * @deprecated ?
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		$this->id = $id;
	}

	/**
	 * Display the template
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
	}
}
views/element/view.raw.php000064400000002413151165347560011622
0ustar00<?php
/**
 * Single element raw view
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

jimport('joomla.application.component.view');

/**
 * Single element raw view
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewElement extends FabrikView
{
	/**
	 * Element id (not used?)
	 *
	 * @var int
	 */
	protected $id = null;

	/**
	 * Is mambot (not used?)
	 *
	 * @var bool
	 */
	public $isMambot = null;

	/**
	 * Set id
	 *
	 * @param   int  $id  Element id
	 *
	 * @deprecated ?
	 *
	 * @return  void
	 */
	public function setId($id)
	{
		$this->id = $id;
	}

	/**
	 * Display the template
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		$input = $this->app->getInput();
		$pluginManager =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Pluginmanager',
'FabrikFEModel');
		$ids = $input->get('plugin', array(), 'array');

		foreach ($ids as $id)
		{
			$plugin = $pluginManager->getElementPlugin($id);
		}
	}
}
views/emailform/metadata.xml000064400000000200151165347560012163
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<view hidden="true" title="Email form">
	</view>
</metadata>
views/emailform/view.html.php000064400000007117151165347570012326
0ustar00<?php
/**
 * Email form view
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Factory;
use Joomla\String\StringHelper;

jimport('joomla.application.component.view');

/**
 * Fabrik Email Form View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewEmailform extends FabrikView
{
	public $rowId = null;

	public $params = null;

	public $isMambot = null;

	public $id = null;

	/**
	 * Display
	 *
	 * @param   string $tpl Template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		FabrikHelperHTML::framework();
		FabrikHelperHTML::iniRequireJS();
		$input  = $this->app->getInput();
		$model  = $this->getModel('form');
		$filter = InputFilter::getInstance();
		$post   = $filter->clean($_POST, 'array');

		if (!array_key_exists('youremail', $post))
		{
			FabrikHelperHTML::emailForm($model);
		}
		else
		{
			$to = $input->getString('email', '');

			if ($this->sendMail($to))
			{
				$this->app->enqueueMessage(Text::_('COM_FABRIK_THIS_ITEM_HAS_BEEN_SENT_TO')
. ' ' . $to, 'success');
			}

			FabrikHelperHTML::emailSent();
		}
	}

	/**
	 * Send email
	 *
	 * @param   string $email Email
	 *
	 * @throws RuntimeException
	 *
	 * @return  bool
	 */
	public function sendMail($email)
	{
		Session::checkToken() or die('Invalid Token');
		$input = $this->app->getInput();

		/*
		 * First, make sure the form was posted from a browser.
		 * For basic web-forms, we don't care about anything
		 * other than requests from a browser:
		 */
		if (is_null($input->server->get('HTTP_USER_AGENT')))
		{
			throw new RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'),
500);
		}

		// Make sure the form was indeed POST'ed:
		//  (requires your html form to use: action="post")
		if (!$input->server->get('REQUEST_METHOD') ==
'POST')
		{
			throw new RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'),
500);
		}

		// Attempt to defend against header injections:
		$badStrings = array('Content-Type:', 'MIME-Version:',
'Content-Transfer-Encoding:', 'bcc:', 'cc:');

		// Loop through each POST'ed value and test if it contains
		// one of the $badStrings:
		foreach ($_POST as $k => $v)
		{
			foreach ($badStrings as $v2)
			{
				if (StringHelper::strpos($v, $v2) !== false)
				{
					throw new RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'),
500);
				}
			}
		}

		// Made it past spammer test, free up some memory
		// and continue rest of script:
		unset($k, $v, $v2, $badStrings);
		$email           = $input->getString('email', '');
		$yourName        = $input->getString('yourname',
'');
		$yourEmail       = $input->getString('youremail',
'');
		$subject_default = Text::sprintf('Email from', $yourName);
		$subject         = $input->getString('subject',
$subject_default);
		jimport('joomla.mail.helper');

		if (!$email || !$yourEmail || (FabrikWorker::isEmail($email) == false) ||
(FabrikWorker::isEmail($yourEmail) == false))
		{
			$this->app->enqueueMessage(Text::_('PHPMAILER_INVALID_ADDRESS'));
		}

		$siteName = $this->config->get('sitename');

		// Link sent in email
		$link = $input->get('referrer', '',
'string');

		// Message text
		$msg = Text::sprintf('COM_FABRIK_EMAIL_MSG', $siteName,
$yourName, $yourEmail, $link);

		// Mail function
		$mail = Factory::getMailer();

		return $mail->sendMail($yourEmail, $yourName, $email, $subject, $msg);
	}
}
views/FabrikView.php000064400000003331151165347570010461 0ustar00<?php
/**
 * Base Fabrik view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\Document\Document;
use Joomla\CMS\Session\Session;
use Joomla\CMS\User\User;
use Joomla\CMS\Factory;
use Joomla\Utilities\ArrayHelper;

jimport('joomla.application.component.view');

/**
 * Class FabrikView
 */
class FabrikView extends HtmlView
{
	/**
	 * @var JApplicationCMS
	 */
	protected $app;

	/**
	 * @var User
	 */
	protected $user;

	/**
	 * @var string
	 */
	protected $package;

	/**
	 * @var Session
	 */
	protected $session;

	/**
	 * @var Document
	 */
	protected $doc;

	/**
	 * @var JDatabaseDriver
	 */
	protected $db;

	/**
	 * @var Registry
	 */
	protected $config;

	/**
	 * Constructor
	 *
	 * @param   array $config A named configuration array for object
construction.
	 *
	 */
	public function __construct($config = array())
	{
		$this->app     = ArrayHelper::getValue($config, 'app',
Factory::getApplication());
		$this->user    = ArrayHelper::getValue($config, 'user',
Factory::getUser());
		$this->package =
$this->app->getUserState('com_fabrik.package',
'fabrik');
		$this->session = ArrayHelper::getValue($config, 'session',
Factory::getSession());
		$this->doc     = ArrayHelper::getValue($config, 'doc',
Factory::getDocument());
		$this->db      = ArrayHelper::getValue($config, 'db',
Factory::getContainer()->get('DatabaseDriver'));
		$this->config  = ArrayHelper::getValue($config, 'config',
Factory::getApplication()->getConfig());
		parent::__construct($config);
	}
}views/form/tmpl/bootstrap_tabs/custom_css_example.php000064400000003334151165347570017275
0ustar00<?php
/**
 * Default Form Template: Custom CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

/**
 * If you need to make small adjustments or additions to the CSS for a
Fabrik
 * template, you can create a custom_css.php file, which will be loaded
after
 * the main template_css.php for the template.
 *
 * This file will be invoked as a PHP file, so the view type and form ID
 * can be used in order to narrow the scope of any style changes.  You do
 * this by prepending #{$view}_$c to any selectors you use.  This will
become
 * (say) #form_12, or #details_11, which will be the HTML ID of your form
 * on the page.
 *
 * See examples below, which you should remove if you copy this file.
 *
 * Don't edit anything outside of the BEGIN and END comments.
 *
 * For more on custom CSS, see the Wiki at:
 *
 *
http://www.fabrikar.com/forums/index.php?wiki/form-and-details-templates/#the-custom-css-file
 *
 * NOTE - for backward compatibility with Fabrik 2.1, and in case you
 * just prefer a simpler CSS file, without the added PHP parsing that
 * allows you to be be more specific in your selectors, we will also
include
 * a custom.css we find in the same location as this file.
 *
 */

header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
$rowid = isset($_REQUEST['rowid']) ? $_REQUEST['rowid']
: '';
$form = $view . '_' . $c;
if ($rowid !== '')
{
	$form .= '_' . $rowid;
}
echo "

/* BEGIN - Your CSS styling starts here */

#{$form} .foobar {
	display: none;
}

/* END - Your CSS styling ends here */

";
?>views/form/tmpl/bootstrap_tabs/default_actions.php000064400000000660151165347570016543
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - Actions
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

include(JPATH_SITE .
"/components/com_fabrik/views/form/tmpl/bootstrap/default_actions.php");
views/form/tmpl/bootstrap_tabs/default_buttons.php000064400000000660151165347570016601
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - buttons
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

include(JPATH_SITE .
"/components/com_fabrik/views/form/tmpl/bootstrap/default_buttons.php");
views/form/tmpl/bootstrap_tabs/default_group_details.php000064400000001546151165347570017750
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - group details
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

foreach ($this->elements as $element) :
	if ($element->startRow) :?>
		<div class="row-fluid">
	<?php
	endif;

	if (!$element->hidden) :?>
		<div class="<?php echo $element->span;?>">
			<div class="row-fluid">
				<div class="<?php echo FabrikHelperHTML::getGridSpan(4);
?>"><em><?php echo $element->label_raw
?></em></div>
				<div class="<?php echo FabrikHelperHTML::getGridSpan(8);
?>"><?php echo $element->element;?></div>
			</div>
		</div>

	<?php
	endif;
	if ($element->endRow) :?>
		</div>
	<?php
	endif;
endforeach;
views/form/tmpl/bootstrap_tabs/default_group_labels_above.php000064400000000676151165347570020744
0ustar00<?php
/**
 * Bootstrap Tabs Form Template: Labels Above
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

include(JPATH_SITE .
"/components/com_fabrik/views/form/tmpl/bootstrap/default_group_labels_above.php");views/form/tmpl/bootstrap_tabs/default_group_labels_none.php000064400000000675151165347600020600
0ustar00<?php
/**
 * Bootstrap Tabs Form Template: Labels None
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

include(JPATH_SITE .
"/components/com_fabrik/views/form/tmpl/bootstrap/default_group_labels_none.php");
views/form/tmpl/bootstrap_tabs/default_group_labels_side.php000064400000000703151165347600020555
0ustar00<?php
/**
 * Bootstrap Tabs Form Template: Group Labels Side
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

include(JPATH_SITE .
"/components/com_fabrik/views/form/tmpl/bootstrap/default_group_labels_side.php");
views/form/tmpl/bootstrap_tabs/default_group.php000064400000003237151165347600016234
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - group details
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$rowStarted      = false;
$layout          =
FabrikHelperHTML::getLayout('form.fabrik-control-group');

foreach ($this->elements as $element) :
	$this->element = $element;
	$this->class = 'fabrikErrorMessage';

	// Don't display hidden element's as otherwise they wreck
multi-column layouts
	if (trim($element->error) !== '') :
		$element->error = $this->errorIcon . ' ' .
$element->error;
		$element->containerClass .= ' error';
		$this->class .= ' help-inline text-danger';
	endif;

	$displayData = array(
		'class' => $element->containerClass .
($element->hidden ? ' d-none' : ''),
		'startRow' => $element->startRow,
		'endRow' => $element->endRow,
		'column' => $element->column,
	);

	$labelsAbove = $element->labels;

	if ($labelsAbove == 1)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}
	elseif ($labelsAbove == 2)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_none');
	}
	elseif (isset($element->span) && ($element->span ==
FabrikHelperHTML::getGridSpan(12) || $element->span == '') ||
$labelsAbove == 0)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_side');
	}
	else
	{
		// Multi columns - best to use simplified layout with labels above field
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}

	echo $layout->render((object) $displayData);

	?><?php
endforeach;
views/form/tmpl/bootstrap_tabs/default_relateddata.php000064400000001050151165347600017341
0ustar00<?php
/**
 * Bootstrap Tabs Form Template - related data
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if (!empty($this->linkedTables)) :?>
	<ul class='linkedTables'>
		<?php foreach ($this->linkedTables as $a) : ?>
		<li>
			<?php echo implode(" ", $a);?>
			</li>
		<?php
		endforeach;
		?>
	</ul>
<?php
endif;views/form/tmpl/bootstrap_tabs/default_repeatgroup_row.php000064400000002637151165347600020327
0ustar00<?php
/**
 * Default Form: Repeat group rendered as a table, <tr> template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$group = $this->group;
?>
<tr class="fabrikSubGroupElements fabrikSubGroup">
<?php
if ($group->canOrder) :
?>
    <td><?php echo
FabrikHelperHTML::icon('icon-menu-2'); ?></td>
<?php
endif;
foreach ($this->elements as $element) :
	?>
	<td class="<?php echo $element->containerClass;
?>">
	<?php
	if ($this->tipLocation == 'above') :
	?>
		<div><?php echo $element->tipAbove; ?></div>
	<?php
	endif;
	echo $element->errorTag; ?>
	<div class="fabrikElement <?php echo
$element->bsClass;?>">
		<?php echo $element->element; ?>
	</div>

	<?php if ($this->tipLocation == 'side') :
		echo $element->tipSide;
	endif;
	if ($this->tipLocation == 'below') : ?>
		<div>
			<?php echo $element->tipBelow; ?>
		</div>
	<?php endif;
	?>
	</td>
	<?php
	endforeach;
 	if ($group->editable) : ?>
		<td class="">
			<div class="fabrikGroupRepeater float-end btn-group-sm">
				<?php if ($group->canAddRepeat) :
					echo $this->addRepeatGroupButtonRow;
				endif;
				if ($group->canDeleteRepeat) :
					echo $this->removeRepeatGroupButtonRow;
				endif;?>
			</div>
		</td>
	<?php endif; ?>
</tr>views/form/tmpl/bootstrap_tabs/default_repeatgroup_table.php000064400000002417151165347600020603
0ustar00<?php
/**
 * Default Form Template: Repeat group rendered as a table
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0.7
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$group = $this->group;
?>
<table class="table table-striped repeatGroupTable">
	<thead>
		<tr>
	<?php
	// Add in the table heading
    if ($group->canOrder) :
    ?>
        <th
data-role="fabrik-group-sort-handle"></th>
    <?php
    endif;
	$firstGroup = $group->subgroups[0];
	foreach ($firstGroup as $el) :
		$style = $el->hidden ? 'style="display:none"' :
'';
		?>
		<th <?php echo $style; ?> class="<?php echo
$el->containerClass?>">
			<?php echo $el->label_raw?>
		</th>
		<?php
	endforeach;

	// This column will contain the add/delete buttons
	if ($group->editable) : ?>
	<th data-role="fabrik-group-repeaters" class="
btn-group-sm"></th>
	<?php
	endif;
	?>
	</tr>
	</thead>
	<tbody>
		<?php

		// Load each repeated group in a <tr>
		$this->i = 0;
		foreach ($group->subgroups as $subgroup) :
			$this->elements = $subgroup;
			echo $this->loadTemplate('repeatgroup_row');
			$this->i ++;
		endforeach;
		?>
	</tbody>
</table>
views/form/tmpl/bootstrap_tabs/default_repeatgroup.php000064400000002616151165347600017435
0ustar00<?php
/**
 * Bootstrap Form Template: Repeat group rendered as standard form
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

$input = Factory::getApplication()->input;
$group = $this->group;
$w = new FabrikWorker;
$i = 1;

foreach ($group->subgroups as $subgroup) :
	$introData = array_merge($input->getArray(), array('i' =>
$i));
	?>
	<div class="fabrikSubGroup">
		<div data-role="group-repeat-intro">
			<?php echo $w->parseMessageForPlaceHolder($group->repeatIntro,
$introData);?>
		</div>
	<?php
		// Add the add/remove repeat group buttons
		if ($group->editable && ($group->canAddRepeat ||
$group->canDeleteRepeat)) : ?>
			<div class="fabrikGroupRepeater text-end btn-group-sm">
				<?php if ($group->canAddRepeat) :
					echo $this->addRepeatGroupButton;
				endif;
				if ($group->canDeleteRepeat) :
					echo $this->removeRepeatGroupButton;
				endif;?>
			</div>
		<?php
		endif;
		?>
		<div class="fabrikSubGroupElements">
			<?php

			// Load each group in a <ul>
			$this->elements = $subgroup;
			echo $this->loadTemplate('group');
			?>
		</div><!-- end fabrikSubGroupElements -->
	</div><!-- end fabrikSubGroup -->
	<?php
	$i++;
endforeach;
views/form/tmpl/bootstrap_tabs/default.php000064400000010350151165347600015012
0ustar00<?php
/**
 * Bootstrap Tabs Form Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Factory;

$form = $this->form;
$model = $this->getModel();
$groupTmpl = $model->editable ? 'group' :
'group_details';
$active = ($form->error != '') ? '' : '
fabrikHide';

if ($model->isMultiPage() && FabrikHelperHTML::isDebug())
{
	$app = Factory::getApplication();
	$app->enqueueMessage(Text::_('COM_FABRIK_ERR_TAB_FORM_TEMPLATE_INCOMPATIBLE_WITH_MULTIPAGE_FORMS'),
'error');
}

if ($this->params->get('show_page_heading', 1)) : ?>
	<div class="componentheading<?php echo
$this->params->get('pageclass_sfx')?>">
	<?php echo
$this->escape($this->params->get('page_heading')); ?>
	</div>
<?php
endif;

if ($this->params->get('show-title', 1)) :?>
	<div class="page-header">
		<h1><?php echo $form->label;?></h1>
	</div>
<?php
endif;

echo $form->intro;
?>
<form method="post" <?php echo $form->attribs?>>
<?php
echo $this->plugintop;
?>

<div class="fabrikMainError alert alert-danger alert-dismissible
fabrikError<?php echo $active?>">
	<button class="btn-close" data-bs-dismiss="alert"
aria-label="<?php echo Text::_('JCLOSE');
?>"></button>
	<?php echo $form->error?>
</div>

<div class="row-fluid nav">
	<div class="col-sm-6 pull-right">
		<?php
		echo $this->loadTemplate('buttons');
		?>
	</div>
	<div class="col-sm-6">
		<?php
		echo $this->loadTemplate('relateddata');
		?>
	</div>
</div>


<?php
$i = 0;
$tabs = array();
$is_err = false;

foreach ($this->groups as $group) :
	foreach ($group->elements as $element) {
		if ($element->error != '') {
			$is_err = true;
			break;
		}
	}
	$err_class = $is_err ? ' fabrikErrorGroup' : '';
	$tabId = $this->form->id . '_' . (int)$this->rowid .
'_' . $i;
	// If this is multi-page then groups are consolidated until a group with a
page break
	// So we should only show a tab if: it is first tab, or if it is a page
break
	if (!$model->isMultiPage() || $i === 0 || $group->splitPage) :
		$is_err = false;
		$tab = new stdClass;
		$tab->id = 'group' . $group->id . '_tab';
		$tab->class = $err_class;
		$tab->css = $group->css;
		$tab->href = 'group-tab' . $tabId;
		$tab->label = !empty($group->title) ? $group->title :
$group->name;;
		$tabs[] = $tab;
		$i ++;
	endif;
endforeach;

echo
FabrikHelperHTML::getLayout('fabrik-tabs')->render((object)
array('tabs' => $tabs));
?>

<div class="tab-content">
	<?php

	$i = 0;
	foreach ($this->groups as $group) :
		$this->group = $group;
		$tabId = $this->form->id . '_' . (int)$this->rowid .
'_' . $i;
		$class = 'group' . $group->id . '_tab_content';

		if ($i == 0 || !$model->isMultiPage() || $group->splitPage) :
			if ($i != 0) :
				echo '</div>';
			endif;
			?>
			<div role="tabpanel" class="<?php echo $class;
?> tab-pane<?php if ($i == 0) echo " active"?>"
id="group-tab<?php echo $tabId;?>">
			<?php
			$i++;
		endif; ?>
			<fieldset class="<?php echo $group->class; ?>"
id="group<?php echo $group->id;?>" style="<?php
echo $group->css;?>">
				<?php
				if ($group->showLegend) : ?>
					<legend class="legend mt-3"><?php echo
$group->title;?></legend>
				<?php
				endif;

				if (!empty($group->intro)) : ?>
					<div class="groupintro"><?php echo $group->intro
?></div>
				<?php
				endif;

				/* Load the group template - this can be :
				 *  * default_group.php - standard group non-repeating rendered as an
unordered list
				 *  * default_repeatgroup.php - repeat group rendered as an unordered
list
				 *  * default_repeatgroup_table.php - repeat group rendered in a table.
				 */
				$this->elements = $group->elements;
				echo $this->loadTemplate($group->tmpl);

				if (!empty($group->outro)) : ?>
					<div class="groupoutro"><?php echo $group->outro
?></div>
				<?php
				endif;
			?>
			</fieldset>
		<?php
	endforeach;
	?>
	</div>
</div>
<?php
if ($model->editable) : ?>
<div class="fabrikHiddenFields">
	<?php echo $this->hiddenFields; ?>
</div>
<?php
endif;

echo $this->pluginbottom;
echo $this->loadTemplate('actions');
?>
</form>
<?php
echo $form->outro;
echo $this->pluginend;
echo FabrikHelperHTML::keepalive();
?>
views/form/tmpl/bootstrap_tabs/template_css.php000064400000001540151165347600016052
0ustar00<?php
/**
 * Fabrik Form View Template: Bootstrap Tab CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
echo "

.fabrikGroup {
clear: left;
}

/* color & highlight group with validation errors */
.fabrikErrorGroup {
    background-color: rgb(242, 222, 222) !important;
  color: #b94a48;
}
/*Repeat group order icon*/
.icon-menu-2 {cursor:move;}
/*BS5 ajax validation: icons overriding dropdown caret*/
.fabrikinput.form-select.is-invalid,.fabrikinput.form-select.is-valid {
    background-position: right 1rem center, center right 0.1rem !important;
	 padding-right:0 !important;
}
";
?>
views/form/tmpl/bootstrap/custom_css_example.php000064400000004212151165347610016253
0ustar00<?php
/**
 * Default Form Template: Custom CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

/**
 * If you need to make small adjustments or additions to the CSS for a
Fabrik
 * template, you can create a custom_css.php file, which will be loaded
after
 * the main template_css.php for the template.
 *
 * This file will be invoked as a PHP file, so the view type, form ID and
row ID
 * can be used in order to narrow the scope of any style changes.  A new
form will
 * have an ID of "form_X" (where X is the form's numeric
ID), while edit forms (for existing
 * rows) will have an ID of "form_X_Y" (where Y is the rowid). 
Detail views will always
 * be of the format "details_X_Y".
 *
 * So to apply styles for (say) form ID 123, you would use ...
 *
 * #form_123, #form_123_$rowid { ... }
 *
 * Or to style for any form / row, it would just be ...
 *
 * #$form { ... }
 *
 * See examples below, which you should remove if you copy this file.
 *
 * Don't edit anything outside of the BEGIN and END comments.
 *
 * For more on custom CSS, see the Wiki at:
 *
 *
http://www.fabrikar.com/forums/index.php?wiki/form-and-details-templates/#the-custom-css-file
 *
 * NOTE - for backward compatibility with Fabrik 2.1, and in case you
 * just prefer a simpler CSS file, without the added PHP parsing that
 * allows you to be be more specific in your selectors, we will also
include
 * a custom.css we find in the same location as this file.
 *
 */

header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
$rowid = isset($_REQUEST['rowid']) ? $_REQUEST['rowid']
: '';
$form = $view . '_' . $c;
if ($rowid !== '')
{
	$form .= '_' . $rowid;
}
echo <<<EOT

/* BEGIN - Your CSS styling starts here */

#$form .foobar {
	display: none;
}

#form_123 .foobar, #form_123_$rowid .foobar {
	display: none;
}
/*For styling tooltips
.tooltip > .tooltip-inner {
    background-color: lightgrey; 
    color: black; 
}
*/
/* END - Your CSS styling ends here */

EOT;
views/form/tmpl/bootstrap/default_actions.php000064400000003166151165347610015531
0ustar00<?php
/**
 * Bootstrap Form Template - Actions
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$form = $this->form;
if ($this->hasActions) : ?>
<div class="fabrikActions form-actions mt-3">
	<div class="btn-toolbar justify-content-between"
role="toolbar" aria-label="Fabrik Actions">
		<?php if ( $form->submitButton || $form->applyButton ||
$form->copyButton ): ?>
			<div class="btn-group" role="group"
airia-label="Submit-Apply-Copy">
				<?php
				echo $form->submitButton . ' ';
				echo $form->applyButton . ' ';
				echo $form->copyButton;
				?>
			</div>
		<?php endif; ?>
		<?php if ($form->customButtons): ?>
			<div class="btn-group" role="group"
airia-label="Fabrik Custom Buttons">
				<?php echo $form->customButtons; ?>
			</div>
		<?php endif; ?>
		<?php if ( $form->prevButton || $form->nextButton ): ?>
			<div class="btn-group" role="group"
airia-label="Previous-Next Buttons">
				<?php echo $form->prevButton . ' ' .
$form->nextButton; ?>
			</div>
		<?php endif; ?>
		<?php if ( $form->gobackButton || $form->resetButton ||
$form->deleteButton || $form->clearMultipageSessionButton): ?>
			<div class="btn-group" role="group"
airia-label="Back-Reset-Delete-MultiSession Buttons">
				<?php
				echo $form->gobackButton;
				echo $form->resetButton;
				echo $form->deleteButton;
				echo $form->clearMultipageSessionButton;
				?>
			</div>
		<?php

		endif;
		 ?>
	</div>
</div>
<?php
endif;
views/form/tmpl/bootstrap/default_buttons.php000064400000001160151165347610015557
0ustar00<?php
/**
 * Bootstrap Form Template - buttons
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if ($this->showEmail || $this->showPDF || $this->showPrint): ?>
	<div class="pull-right">
	<?php
	if ($this->showPrint):
		echo $this->printLink;
	endif;

	if ($this->showEmail):
		echo $this->emailLink;
	endif;

	if ($this->showPDF):
		echo $this->pdfLink;
	endif;
	?>
	</div>
<?php
endif;
views/form/tmpl/bootstrap/default_group_details.php000064400000001551151165347610016726
0ustar00<?php
/**
 * Bootstrap Form Template - group details
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

foreach ($this->elements as $element) :
	 if (!$element->hidden) {
		if ($element->startRow) :?>
			<div class="row-fluid">
		<?php
		endif;
		?>

		<div class="<?php echo $element->span;?>">
			<div class="row-fluid">
				<div class="<?php echo FabrikHelperHTML::getGridSpan(4);
?>"><em><?php echo $element->label_raw
?></em></div>
				<div class="<?php echo FabrikHelperHTML::getGridSpan(8);
?>"><?php echo $element->element;?></div>
			</div>
		</div>

	<?php
	if ($element->endRow) :
	?>
		</div>
	<?php
	endif;
	}
endforeach; ?>
views/form/tmpl/bootstrap/default_group_labels_above.php000064400000001671151165347610017722
0ustar00<?php
/**
 * Bootstrap Form Template: Labels Above
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element;
?>
<div class="mt-3">
<?php echo $element->label;?>

<?php if ($this->tipLocation == 'above') : ?>
	<span class=""><?php echo $element->tipAbove
?></span>
<?php endif ?>

<div class="fabrikElement <?php echo
$element->bsClass;?>">
	<?php echo $element->element;?>
</div>

<div class="<?php echo $this->class?>">
	<?php echo $element->error ?>
</div>

<?php if ($this->tipLocation == 'side') : ?>
	<span class=""><?php echo $element->tipSide
?></span>
<?php endif ?>

<?php if ($this->tipLocation == 'below') :?>
	<span class=""><?php echo $element->tipBelow
?></span>
<?php endif ?>
</div>views/form/tmpl/bootstrap/default_group_labels_none.php000064400000001724151165347610017564
0ustar00<?php
/**
 * Bootstrap Form Template: Labels None
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element;
?>
<div class="mt-3">
<span class="d-none"><?php echo
$element->label;?></span>

<?php if ($this->tipLocation == 'above') : ?>
	<span class=""><?php echo $element->tipAbove
?></span>
<?php endif ?>

<div class="fabrikElement <?php echo
$element->bsClass;?>">
	<?php echo $element->element;?>
</div>

<div class="<?php echo $this->class?>">
	<?php echo $element->error ?>
</div>

<?php if ($this->tipLocation == 'side') : ?>
	<span class=""><?php echo $element->tipSide
?></span>
<?php endif ?>

<?php if ($this->tipLocation == 'below') :?>
	<span class=""><?php echo $element->tipBelow
?></span>
<?php endif ?>
</div>views/form/tmpl/bootstrap/default_group_labels_side.php000064400000002407151165347620017551
0ustar00<?php
/**
 * Bootstrap Form Template: Group Labels Side
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$element = $this->element; 
$width = 10;	// default input width
if (property_exists($element, 'bsClass') &&
!empty($element->bsClass)) {
	/* Get the selected value and normalize it withing the 10 columns allowed
for the field */
	$width = min((int)substr($element->bsClass,
strrpos($element->bsClass, '-')+1), 12);
	$width = (int)round(($width*10)/12);
}
?>
<div class="row mt-3">
<?php echo $element->label;?>

<?php if ($this->tipLocation == 'above') : ?>
	<span class=""><?php echo $element->tipAbove
?></span>
<?php endif ?>

<div class="fabrikElement col-sm-<?php echo $width;
?>">
	<?php echo $element->element;?>
</div>

<div class="<?php echo $this->class?>">
	<?php echo $element->error ?>
</div>

<?php if ($this->tipLocation == 'side') : ?>
	<span class=""><?php echo $element->tipSide
?></span>
<?php endif ?>

<?php if ($this->tipLocation == 'below') :?>
	<span class=""><?php echo $element->tipBelow
?></span>
<?php endif ?>
</div>views/form/tmpl/bootstrap/default_group.php000064400000003451151165347620015223
0ustar00<?php
/**
 * Bootstrap Form Template - Group
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$layout          =
FabrikHelperHTML::getLayout('form.fabrik-control-group');
$rowStarted = 0;
foreach ($this->elements as $element) :
	$this->element = $element;
	$this->class = 'fabrikErrorMessage';

	// Don't display hidden element's as otherwise they wreck
multi-column layouts
	if (trim($element->error) !== '') :
		$element->error = $this->errorIcon . ' ' .
$element->error;
		$element->containerClass .= ' error';
		$this->class .= ' help-inline text-danger';
	endif;
	$rowStarted = $rowStarted + (int)$element->startRow -
(int)$element->endRow; //see
getLayout('form.fabrik-control-group')

	$displayData = array(
		'class' => $element->containerClass .
($element->hidden ? ' d-none' : ''),
		'startRow' => $element->startRow,
		'endRow' => $element->endRow,
		'column' => $element->column,
	);

	$labelsAbove = $element->labels;

	if ($labelsAbove == 1)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}
	elseif ($labelsAbove == 2)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_none');
	}
	elseif ($labelsAbove == 0)
	{
		$displayData['row'] =
$this->loadTemplate('group_labels_side');
	}
	else
	{
		// Multi columns - best to use simplified layout with labels above field
		$displayData['row'] =
$this->loadTemplate('group_labels_above');
	}

	echo $layout->render((object) $displayData);

	?><?php
endforeach;
// If the last element was not closing the row add an additional div
if ($rowStarted > 0) :?>
</div><!-- end row for open row -->
<?php
endif;?>views/form/tmpl/bootstrap/default_relateddata.php000064400000001020151165347620016327
0ustar00<?php
/**
 * Bootstrap Form Template: Related Data
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

if (!empty($this->linkedTables)) {?>
	<ul class='linkedTables'>
		<?php foreach ($this->linkedTables as $a) { ?>
		<li>
			<?php echo implode(" ", $a);?>
			</li>
		<?php }?>
	</ul>
<?php
}?>views/form/tmpl/bootstrap/default_repeatgroup_row.php000064400000002757151165347620017323
0ustar00<?php
/**
 * Default Form: Repeat group rendered as a table, <tr> template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$group = $this->group;
?>
<tr class="fabrikSubGroupElements fabrikSubGroup">
<?php
if ($group->canOrder) :
?>
    <td><?php echo
FabrikHelperHTML::icon('icon-menu-2'); ?></td>
<?php
endif;

foreach ($this->elements as $element) :
	$style = $element->hidden ? 'style="display:none"'
: '';
	?>
	<td class="<?php echo $element->containerClass; ?>"
<?php echo $style?>>
	<?php
	if ($this->tipLocation == 'above') :
	?>
		<div><?php echo $element->tipAbove; ?></div>
	<?php
	endif;
	echo $element->errorTag; ?>
	<div class="fabrikElement <?php echo
$element->bsClass;?>">
		<?php echo $element->element; ?>
	</div>

	<?php if ($this->tipLocation == 'side') :
		echo $element->tipSide;
	endif;
	if ($this->tipLocation == 'below') : ?>
		<div>
			<?php echo $element->tipBelow; ?>
		</div>
	<?php endif;
	?>
	</td>
	<?php
	endforeach;
 	if ($group->editable) : ?>
		<td class="">
			<div class="fabrikGroupRepeater float-end btn-group-sm">
			<?php
			if ($group->canAddRepeat) :
				echo $this->addRepeatGroupButtonRow;
			endif;
			if ($group->canDeleteRepeat) :
				echo $this->removeRepeatGroupButtonRow;
			endif;
			?>
			</div>
		</td>
	<?php endif; ?>
</tr>views/form/tmpl/bootstrap/default_repeatgroup_table.php000064400000002417151165347620017574
0ustar00<?php
/**
 * Default Form Template: Repeat group rendered as a table
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0.7
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$group = $this->group;
?>
<table class="table table-striped repeatGroupTable">
	<thead>
		<tr>
	<?php
	// Add in the table heading
    if ($group->canOrder) :
    ?>
        <th
data-role="fabrik-group-sort-handle"></th>
    <?php
    endif;
	$firstGroup = $group->subgroups[0];
	foreach ($firstGroup as $el) :
		$style = $el->hidden ? 'style="display:none"' :
'';
		?>
		<th <?php echo $style; ?> class="<?php echo
$el->containerClass?>">
			<?php echo $el->label_raw?>
		</th>
		<?php
	endforeach;

	// This column will contain the add/delete buttons
	if ($group->editable) : ?>
	<th data-role="fabrik-group-repeaters" class="
btn-group-sm"></th>
	<?php
	endif;
	?>
	</tr>
	</thead>
	<tbody>
		<?php

		// Load each repeated group in a <tr>
		$this->i = 0;
		foreach ($group->subgroups as $subgroup) :
			$this->elements = $subgroup;
			echo $this->loadTemplate('repeatgroup_row');
			$this->i ++;
		endforeach;
		?>
	</tbody>
</table>
views/form/tmpl/bootstrap/default_repeatgroup.php000064400000002617151165347620016427
0ustar00<?php
/**
 * Bootstrap Form Template: Repeat group rendered as standard form
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

$input = Factory::getApplication()->input;
$group = $this->group;
$i = 1;
$w = new FabrikWorker;

foreach ($group->subgroups as $subgroup) :
	$introData = array_merge($input->getArray(), array('i' =>
$i));
	?>
	<div class="fabrikSubGroup">
		<div data-role="group-repeat-intro">
			<?php echo $w->parseMessageForPlaceHolder($group->repeatIntro,
$introData);?>
		</div>
	<?php
		// Add the add/remove repeat group buttons
		if ($group->editable && ($group->canAddRepeat ||
$group->canDeleteRepeat)) : ?>
			<div class="fabrikGroupRepeater text-end btn-group-sm">
				<?php if ($group->canAddRepeat) :
					echo $this->addRepeatGroupButton;
				endif;
				if ($group->canDeleteRepeat) :
					echo $this->removeRepeatGroupButton;
				endif;?>
			</div>
		<?php
		endif;
		?>
		<div class="fabrikSubGroupElements">
			<?php

			// Load each group in a <ul>
			$this->elements = $subgroup;
			echo $this->loadTemplate('group');
			?>
		</div><!-- end fabrikSubGroupElements -->
	</div><!-- end fabrikSubGroup -->
	<?php
	$i ++;
endforeach;
views/form/tmpl/bootstrap/default.php000064400000005533151165347640014014
0ustar00<?php
/**
 * Bootstrap Form Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\Language\Text;

$form = $this->form;
$model = $this->getModel();
$groupTmpl = $model->editable ? 'group' :
'group_details';
$active = ($form->error != '') ? '' : '
fabrikHide';

$pageClass = $this->params->get('pageclass_sfx',
'');

if ($pageClass !== '') :
	echo '<div class="' . $pageClass .
'">';
endif;

if ($this->params->get('show_page_heading', 1)) : ?>
	<div class="componentheading<?php echo
$this->params->get('pageclass_sfx')?>">
		<?php echo
$this->escape($this->params->get('page_heading')); ?>
	</div>
<?php
endif;

if ($this->params->get('show-title', 1)) :?>
<div class="page-header">
	<h1><?php echo $form->label;?></h1>
</div>
<?php
endif;

echo $form->intro;
?>
<form method="post" <?php echo $form->attribs?>>
<?php
echo $this->plugintop;
?>

<div class="fabrikMainError alert alert-danger alert-dismissible
fabrikError<?php echo $active?>">
	<button class="btn-close" data-bs-dismiss="alert"
aria-label="<?php echo Text::_('JCLOSE');
?>"></button>
	<?php echo $form->error; ?>
</div>

<div class="row-fluid nav">
	<div class="<?php echo FabrikHelperHTML::getGridSpan(6); ?>
pull-right">
		<?php
		echo $this->loadTemplate('buttons');
		?>
	</div>
	<div class="<?php echo FabrikHelperHTML::getGridSpan(6);
?>">
		<?php
		echo $this->loadTemplate('relateddata');
		?>
	</div>
</div>

<?php
foreach ($this->groups as $group) :
	$this->group = $group;
	?>

	<fieldset class="<?php echo $group->class; ?>"
id="group<?php echo $group->id;?>" style="<?php
echo $group->css;?>">
		<?php
		if ($group->showLegend) :?>
			<legend class="mt-3 legend"><?php echo
$group->title;?></legend>
		<?php
		endif;

		if (!empty($group->intro)) : ?>
			<div class="groupintro"><?php echo $group->intro
?></div>
		<?php
		endif;

		/* Load the group template - this can be :
		 *  * default_group.php - standard group non-repeating rendered as an
unordered list
		 *  * default_repeatgroup.php - repeat group rendered as an unordered
list
		 *  * default_repeatgroup_table.php - repeat group rendered in a table.
		 */
		$this->elements = $group->elements;
		echo $this->loadTemplate($group->tmpl);

		if (!empty($group->outro)) : ?>
			<div class="groupoutro"><?php echo $group->outro
?></div>
		<?php
		endif;
	?>
	</fieldset>
<?php
endforeach;
if ($model->editable) : ?>
<div class="fabrikHiddenFields">
	<?php echo $this->hiddenFields; ?>
</div>
<?php
endif;

echo $this->pluginbottom;
echo $this->loadTemplate('actions');
?>
</form>
<?php
echo $form->outro;
echo $this->pluginend;
echo FabrikHelperHTML::keepalive();

if ($pageClass !== '') :
	echo '</div>';
endif;
views/form/tmpl/bootstrap/template_css.php000064400000001305151165347640015044
0ustar00<?php
/**
 * Fabrik Form Template: Bootstrap CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

header('Content-type: text/css');
$c = (int) $_REQUEST['c'];
$view = isset($_REQUEST['view']) ? $_REQUEST['view'] :
'form';
echo "

.fabrikGroup {
clear: left;
}
/*Repeat group order icon*/
.icon-menu-2 {cursor:move;}

/*BS5 ajax validation: icons overriding dropdown caret*/
.fabrikinput.form-select.is-invalid,.fabrikinput.form-select.is-valid {
    background-position: right 1rem center, center right 0.1rem !important;
	 padding-right:0 !important;
}
";
?>
views/form/tmpl/default.xml000064400000003303151165347640012001
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<layout title="Form">
		<message>
			<![CDATA[STANDARD Fabrik form layout]]>
		</message>
	</layout>
	<fields name="request">
		<fieldset
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="request">
				
				<field name="formid"
					type="formlist"
					label="COM_FABRIK_FIELD_FORM_LABEL"
					description="COM_FABRIK_FIELD_FORM_DESC"
				/>
				
			</fieldset>
	</fields>
	
	<fields
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="params">
		<fieldset name="params"
label="COM_FABRIK_MENU_FORM_OPTIONS">
				
			<field name="rowid"
				type="text"
				size="3"
				label="COM_FABRIK_FIELD_ROW_ID_LABEL"
				description="COM_FABRIK_FIELD_ROW_ID_DESC"
			/>
				
			<field name="usekey"
				type="text"
				size="15"
				label="COM_FABRIK_FIELD_KEY_NAME_LABEL"
				description="COM_FABRIK_FIELD_KEY_NAME_DESC"
			/>
				
			<field name="random"
				type="radio"
				class="btn-group"
				default="0"
				layout="joomla.form.field.radio.switcher"
				label="COM_FABRIK_FIELD_SHOW_RANDOM_RECORDS_LABEL"
				description="COM_FABRIK_FIELD_SHOW_RANDOM_RECORDS_DESC"
			>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
			</field>
			
			<field name="fabriklayout"
				type="fabriktemplate"
				view="form"
				hide_default="0" hide_none="1"
				label="COM_FABRIK_FIELD_FORM_TEMPLATE_LABEL"
				description="COM_FABRIK_FIELD_FORM_TEMPLATE_DESC"
			/>


			<field name="extra_query_string"
			       type="text"
			       size="50"
			       label="COM_FABRIK_FIELD_EXTRA_QUERY_STRING_LABEL"
			       description="COM_FABRIK_FIELD_EXTRA_QUERY_STRING_DESC"
/>

			</fieldset>
	</fields>
</metadata>
views/form/view.base.php000064400000133453151165347640011265
0ustar00<?php
/**
 * Base Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Editor\Editor;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Profiler\Profiler;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.view');

/**
 * Base Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewFormBase extends FabrikView
{
	/**
	 * Is the view rendering inside the Fabrik Joomla content plugin
	 *
	 * @var  bool
	 */
	public $isMambot = null;

	/**
	 * Viewing access level
	 *
	 * @var  int
	 */
	public $access = null;

	/**
	 * Does the form have any actions?
	 *
	 * @var bool
	 */
	public $hasActions = false;

	/**
	 * Form hidden fields
	 *
	 * @var string
	 */
	public $hiddenFields = '';

	public $showPrint = false;
	public $showPDF = false;
	public $showEmail = false;
	public $pluginbottom = '';
	public $plugintop = '';
	public $isMultiPage = false;
	public $pluginend = '';
	public $tipLocation = 'above';
	public $rowid = '';

	/**
	 * Preview the form, used in content type admin page.
	 */
	public function preview()
	{
		/** @var FabrikFEModelForm $model */
		$model        = $this->getModel('form');
		$tmpl         = $model->getTmpl();
		$this->tmpl   = $tmpl;
		$this->form   = $this->prepareFormTable();
		$this->params = new Registry;
		$this->groups = $model->getGroupView($tmpl);
		$this->_repeatGroupButtons($tmpl);
		$this->setTmplFolders($tmpl);
	}

	/**
	 * Set the repeat group button layouts
	 *
	 * @param   string $tmpl Template
	 */
	private function _repeatGroupButtons($tmpl)
	{
		$formModel                        = $this->getModel();
		$btnData                          = (object) array('tmpl' =>
$tmpl);
		$this->removeRepeatGroupButton    =
$formModel->getLayout('form.fabrik-repeat-group-delete')->render($btnData);
		$this->addRepeatGroupButton       =
$formModel->getLayout('form.fabrik-repeat-group-add')->render($btnData);
		$this->removeRepeatGroupButtonRow =
$formModel->getLayout('form.fabrik-repeat-group-row-delete')->render($btnData);
		$this->addRepeatGroupButtonRow    =
$formModel->getLayout('form.fabrik-repeat-group-row-add')->render($btnData);
	}

	/**
	 * Main setup routine for displaying the form/detail view
	 *
	 * @param   string $tpl template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$profiler = Profiler::getInstance('Application');
		$input    = $this->app->getInput();
		$w        = new FabrikWorker;

		/** @var FabrikFEModelForm $model */
		$model = $this->getModel('form');

		if (!$model)
		{
			// Dodgy URL - can't find the form name see
https://github.com/Fabrik/fabrik/issues/1248
			return;
		}

		$model->isMambot = $this->isMambot;

		if ($model->render() === false)
		{
			return false;
		}

		$this->isMultiPage = $model->isMultiPage();
		list($this->plugintop, $this->pluginbottom, $this->pluginend) =
$model->getFormPluginHTML();
		$listModel = $model->getlistModel();

		if (!$this->canAccess())
		{
			return false;
		}

		JDEBUG ? $profiler->mark('form view before join group ids
got') : null;

		if (!$listModel->noTable())
		{
			$joins = $listModel->getJoins();
			$model->getJoinGroupIds($joins);
		}

		$params = $model->getParams();
		$this->setTitle($w, $params);

		FabrikHelperHTML::debug($params->get('note'),
'note');
		$params->def('icons',
$this->app->get('icons'));
		$params->set('popup', ($input->get('tmpl') ==
'component') ? 1 : 0);

		$this->editable = $model->isEditable();
		$form           = $this->prepareFormTable();
		$clearErrors    = false;

		// Module rendered without ajax, we need to assign the session errors
back into the model
		if ($model->isMambot)
		{
			$this->package =
$this->app->getUserState('com_fabrik.package',
'fabrik');
			$context       = $model->getSessionContext();
			$model->errors = $this->session->get($context .
'errors', array());
			$clearErrors   = true;
		}

		JDEBUG ? $profiler->mark('form view before validation classes
loaded') : null;

		$tmpl       = $model->getTmpl();
		$this->tmpl = $tmpl;

		$this->_addButtons();
		JDEBUG ? $profiler->mark('form view before group view got')
: null;

		$this->groups = $model->getGroupView($tmpl);
		$this->_repeatGroupButtons($tmpl);

		JDEBUG ? $profiler->mark('form view after group view got') :
null;
		$this->data        = $model->tmplData;
		$this->params      = $params;
		$this->tipLocation = $params->get('tiplocation');

		FabrikHelperHTML::debug($this->groups, 'form:view:groups');

		$this->setTmplFolders($tmpl);
		$this->_addJavascript($listModel->getId());
		JDEBUG ? $profiler->mark('form view: after add js') : null;
		$this->_loadTmplBottom($form);
		JDEBUG ? $profiler->mark('form view: after tmpl bottom
loaded') : null;
		$this->form = $form;
		JDEBUG ? $profiler->mark('form view: form assigned as ref')
: null;
		$list       = new stdClass;
		$list->id   = $form->record_in_database ?
$model->getListModel()->getTable()->id : 0;
		$this->list = $list;
		JDEBUG ? $profiler->mark('form view: before
getRelatedTables()') : null;
		$this->linkedTables = $model->getRelatedTables();
		JDEBUG ? $profiler->mark('form view: after
getRelatedTables()') : null;
		$this->setMessage();

		// If rendered as a module (non ajax) and we have inserted the session
errors, clear them from the session.
		if ($clearErrors)
		{
			$model->clearErrors();
		}

		JDEBUG ? $profiler->mark('form view before template load') :
null;
	}

	/**
	 * Test the form exists and can be accessed
	 * @return bool
	 */
	protected function canAccess()
	{
		$model = $this->getModel();

		if ($model->getForm()->get('id', '') ===
'')
		{
			throw new UnexpectedValueException('Form does not exists');
		}
		if (!$model->canPublish())
		{
			if (!$this->app->isClient('administrator'))
			{
				echo Text::_('COM_FABRIK_FORM_NOT_PUBLISHED');

				return false;
			}
		}

		$this->rowid  = $model->getRowId();
		$this->access = $model->checkAccessFromListSettings();

		if ($this->access == 0)
		{
			$this->app->enqueueMessage(Text::_('JERROR_ALERTNOAUTHOR'),
'error');

			return false;
		}

		return true;
	}

	/**
	 * Prepare the form table for use in the templates
	 *
	 * @return FabTable
	 */
	private function prepareFormTable()
	{
		$model        = $this->getModel();
		$form         = $model->getForm();
		$form->label  = Text::_($model->getLabel());
		$form->intro  = Text::_($model->getIntro());
		$form->outro  = Text::_($model->getOutro());
		$form->action = $model->getAction();
		$form->class  = $model->getFormClass();
		$form->formid = $model->isEditable() ? 'form_' .
$model->getId() : 'details_' . $model->getId();
		$form->name   = 'form_' . $model->getId();

		if ((string) $this->rowid !== '')
		{
			$form->formid .= '_' . $this->rowid;
		}

		$form->error = $form->error === '' ?
Text::_('COM_FABRIK_FAILED_VALIDATION') :
Text::_($form->error);

		if (!empty($model->formErrorMsg))
		{
			$form->error .= '<br />' . $model->formErrorMsg;
		}

		$form->origerror = $form->error;
		$form->error     = $model->hasErrors() ? $form->error :
'';
		$form->attribs   = ' class="' . $form->class .
'" name="' . $form->name . '"
id="' .
			$form->formid . '" enctype="' .
$model->getFormEncType() . '"';

		return $form;
	}

	/**
	 * Add the template folder paths
	 *
	 * @param $tmpl
	 */
	private function setTmplFolders($tmpl)
	{
		// Force front end templates
		$this->_basePath = COM_FABRIK_FRONTEND . '/views';
		$model           = $this->getModel();
//		$jTmplFolder     = FabrikWorker::j3() ? 'tmpl' :
'tmpl25';
		$jTmplFolder     = 'tmpl';
		$folder          = $model->isEditable() ? 'form' :
'details';
		$this->addTemplatePath($this->_basePath . '/' . $folder .
'/' . $jTmplFolder . '/' . $tmpl);

		$root = $this->app->isClient('administrator') ?
JPATH_ADMINISTRATOR : JPATH_SITE;
		$this->addTemplatePath($root . '/templates/' .
$this->app->getTemplate() . '/html/com_fabrik/' . $folder .
'/' . $tmpl);
	}

	/**
	 * Finally output the HTML, running Joomla content plugins if needed
	 *
	 * @return  void
	 */
	public function output()
	{
		$w      = new FabrikWorker;
		$text   = $this->loadTemplate();
		$model  = $this->getModel();
		$params = $model->getParams();
		$view = $model->isEditable() === false ? 'details' :
'form';

		if ($params->get('process-jplugins', 2) == 1
			|| ($params->get('process-jplugins', 2) == 2 &&
$model->isEditable() === false)
			|| ($params->get('process-jplugins', 2) == 3 &&
$model->isEditable() === true)
		)
		{
			$cloak = $view === 'details' &&
$this->app->getInput()->get('format') !==
'pdf';
			FabrikHelperHTML::runContentPlugins($text, $cloak);
		}

		// Allows you to use {placeholders} in form template Only replacing data
accessible to the users acl.

		$text = $w->parseMessageForPlaceHolder($text,
$model->accessibleData($view));
		echo $text;
	}

	/**
	 * Set template message when using session multi-pages
	 *
	 * @return  void
	 */
	private function setMessage()
	{
		$model   = $this->getModel();
		$message = '';

		if (!$model->isMultiPage())
		{
			$this->message = '';

			return;
		}

		if ($model->sessionModel)
		{
			$this->message = $model->sessionModel->status;

			// See http://fabrikar.com/forums/showpost.php?p=73833&postcount=14
			// if ($model->sessionModel->statusid ==
_FABRIKFORMSESSION_LOADED_FROM_COOKIE) {

			if ($model->sessionModel->last_page > 0)
			{
				$message .= ' <a href="#"
class="clearSession">' .
Text::_('COM_FABRIK_CLEAR') . '</a>';
			}
		}

		$this->message = $message;
	}

	/**
	 * Set the page title
	 *
	 * @param   object $w       parent worker
	 * @param   object &$params parameters
	 *
	 * @return  void
	 */
	protected function setTitle($w, &$params)
	{
		/** @var FabrikFEModelForm $model */
		$model = $this->getModel();
		$input = $this->app->getInput();
		$title = '';

		if (!$this->app->isClient('administrator'))
		{
			$menus = $this->app->getMenu();
			$menu  = $menus->getActive();

			// If there is a menu item available AND the form is not rendered in a
content plugin or module
			if (is_object($menu) && !$this->isMambot)
			{
				$menuParams = is_a($menu->getParams(), 'Registry') ||
is_a($menu->getParams(), 'Registry') ? $menu->getParams() :
new Registry($menu->getParams());
				$params->set('page_heading',
Text::_($menuParams->get('page_heading', '')));
				$params->set('show_page_heading',
$menuParams->get('show_page_heading', 0));
				$params->set('pageclass_sfx',
$menuParams->get('pageclass_sfx'));
				$browserTitle =
$model->getPageTitle(Text::_($menuParams->get('page_title')));
				$this->doc->setTitle($w->parseMessageForPlaceHolder($browserTitle,
$_REQUEST));
			}
			else
			{
				$params->set('show_page_heading',
$input->getInt('show_page_heading', 0));
				$params->set('page_heading',
Text::_($input->get('title', $title, 'string')));
				$params->set('show-title',
$input->getInt('show-title',
$params->get('show-title')));
			}

			if (!$this->isMambot)
			{
				$titleData = array_merge($_REQUEST, $model->data);
				$title     =
$w->parseMessageForPlaceHolder(Text::_($params->get('page_heading')),
$titleData, false);
				$params->set('page_heading', $title);
			}
		}
		else
		{
			$params->set('page_heading', Text::_($title));
			$params->set('show_page_heading', 0);
		}
	}

	/**
	 * Add buttons to the view e.g. print, pdf
	 *
	 * @return  void
	 */
	protected function _addButtons()
	{
		$input = $this->app->getInput();

		if ($input->get('format') === 'pdf')
		{
			// If we're rendering as PDF, no point showing any buttons
			$this->showEmail = false;
			$this->showPrint = false;
			$this->showPDF   = false;

			return;
		}

		$fbConfig = ComponentHelper::getParams('com_fabrik');

		/** @var FabrikFEModelForm $model */
		$model           = $this->getModel();
		$params          = $model->getParams();
		$this->showEmail = $params->get('email',
$fbConfig->get('form_email', 0));
		$this->emailLink = '';
		$this->printLink = '';
		$this->pdfLink   = '';
		$this->pdfURL    = '';
		$this->emailURL  = '';
		$this->printURL  = '';
		$this->showPrint = $params->get('print',
$fbConfig->get('form_print', 0));

		if ($this->showPrint)
		{
			$text            = FabrikHelperHTML::image('print');
			$text            .= Text::_('COM_FABRIK_PRINT_ICON_LABEL');
			$this->printLink = '<a href="#" class="btn
btn-default fabrikPrintIcon" onclick="window.print();return
false;">' . $text . '</a>';
		}

		if ($input->get('tmpl') != 'component')
		{
			if ($this->showEmail)
			{
				$this->emailLink = FabrikHelperHTML::emailIcon($model, $params);
				$this->emailURL  = FabrikHelperHTML::emailURL($model);
			}
		}
		//Also in popup window create first a printURL
..&tmpl=component&iframe=1&print=1...
		if ($input->get('print', 0) != 1)
		{

			if ($this->showPrint)
			{
				$this->printLink = FabrikHelperHTML::printIcon($model, $params);
				$this->printURL  = FabrikHelperHTML::printURL($model);
			}
		}

		// 0 = no, 1 = both, 2 = form only, 3 = details only
		$this->showPDF = $params->get('pdf',
$fbConfig->get('form_pdf', false));

		if ($this->showPDF === '2' &&
!$model->isEditable())
		{
			$this->showPDF = false;
		}

		if ($this->showPDF === '3' &&
$model->isEditable())
		{
			$this->showPDF = false;
		}

		if ($this->showPDF)
		{
			if (FabrikWorker::canPdf(false))
			{
				if ($this->app->isClient('administrator'))
				{
					$this->pdfURL = 'index.php?option=com_' .
$this->package .
'&task=details.view&format=pdf&formid=' .
$model->getId() . '&rowid=' . $model->getRowId();
				}
				else
				{
					$this->pdfURL = 'index.php?option=com_' .
$this->package . '&view=details&formid=' .
$model->getId() . '&rowid=' . $model->getRowId() .
'&format=pdf';
				}

				$this->pdfURL           = Route::_($this->pdfURL);
				$layout                 =
FabrikHelperHTML::getLayout('form.fabrik-pdf-icon');
				$pdfDisplayData         = new stdClass;
				$pdfDisplayData->pdfURL = $this->pdfURL;
				$pdfDisplayData->tmpl   = $this->tmpl;

				$this->pdfLink = $layout->render($pdfDisplayData);
			}
		}
	}

	/**
	 * Append the form javascript into the document head
	 *
	 * @param   int $listId table id
	 *
	 * @return  void|boolean
	 */
	protected function _addJavascript($listId)
	{
		$pluginManager = FabrikWorker::getPluginManager();

		/** @var FabrikFEModelForm $model */
		$model = $this->getModel();
		$model->elementJsJLayouts();
		$params                = $model->getParams();
		$aLoadedElementPlugins = array();
		$jsActions             = array();
		$bKey                  = $model->jsKey();
		$mediaFolder = FabrikHelperHTML::getMediaFolder();
		$srcs                  = array_merge(
			array(
				'FloatingTips' => $mediaFolder .
'/tipsBootStrapMock.js',
				'FbForm' => $mediaFolder . '/form.js',
				'Fabrik' => $mediaFolder . '/fabrik.js'
			),
			FabrikHelperHTML::framework());
		$shim                  = array();

		$groups = $model->getGroupsHiarachy();

		$liveSiteReq[] = $mediaFolder . '/tipsBootStrapMock.js';
		$tablesorter = false;

		foreach ($groups as $groupModel)
		{
			$groupParams = $groupModel->getParams();
			if ($groupParams->get('repeat_sortable', '0') ===
'2')
			{
				$tablesorter = true;

				break;
			}
		}

		if (!defined('_JOS_FABRIK_FORMJS_INCLUDED'))
		{
			define('_JOS_FABRIK_FORMJS_INCLUDED', 1);
			FabrikHelperHTML::slimbox();

			$dep       = new stdClass;
			$dep->deps = array(
				'fab/element',
				'lib/form_placeholder/Form.Placeholder'
			);

			$deps                         = new stdClass;
			$deps->deps                   = array('fab/fabrik',
'fab/element', 'fab/form-submit');
			$shim['fab/elementlist'] = $deps;

			$srcs['Placeholder'] =
'media/com_fabrik/js/lib/form_placeholder/Form.Placeholder.js';
			$srcs['FormSubmit'] = $mediaFolder .
'/form-submit.js';
			$srcs['Element'] = $mediaFolder . '/element.js';

			if ($tablesorter)
			{
				$dep->deps[] =
'lib/form_placeholder/jquery.tablesorter.combined';
				//$dep->deps[] =
'lib/form_placeholder/jquery.tablesorter.widgets.min';
				$srcs['TableSorter']        =
'media/com_fabrik/js/lib/tablesorter/jquery.tablesorter.combined.js';
				//$srcs['TableSorterWidgets'] =
'media/com_fabrik/js/lib/tablesorter/jquery.tablesorter.widgets.min.js';
				//$srcs['TableSorterNetwork'] =
'media/com_fabrik/js/lib/tablesorter/parsers/parser-network.min.js';
				FabrikHelperHTML::stylesheetFromPath('media/com_fabrik/js/lib/tablesorter/theme.blue.min.css');
			}

			$shim['fabrik/form'] = $dep;
		}

		$aWYSIWYGNames = array();

		foreach ($groups as $groupModel)
		{
			$groupParams = $groupModel->getParams();

			if ($groupParams->get('repeat_sortable', '0') ===
'2')
			{
				if (!array_key_exists('TableSorter', $srcs))
				{
					$srcs['TableSorter'] =
'media/com_fabrik/js/lib/tablesorter/jquery.tablesorter.min.js';
					$srcs['TableSorteWidgetsr'] =
'media/com_fabrik/js/lib/tablesorter/jquery.tablesorter.widgets.min.js';
					//$srcs['TableSorterNetwork'] =
'media/com_fabrik/js/lib/tablesorter/parsers/parser-network.min.js';
					FabrikHelperHTML::stylesheetFromPath('media/com_fabrik/js/lib/tablesorter/theme.blue.min.css');
				}
			}

			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$res = $elementModel->useEditor();

				if ($res !== false && $elementModel->canUse() &&
$model->isEditable())
				{
					$aWYSIWYGNames[] = $res;
				}

				// Load in once the element js class files
				$element = $elementModel->getElement();

				if (!in_array($element->plugin, $aLoadedElementPlugins))
				{
					/* $$$ hugh - certain elements, like file-upload, need to load
different JS files
					 * on a per-element basis, so as a test fix, I modified the
file-upload's formJavaScriptClass to return false,
					* and test for that here, so as to not add it to
aLoadedElementPlugins[].  The existing 'static' tests in
					* formJavascriptClass() should still prevent scripts being added
twice.
					*/
					if ($elementModel->formJavascriptClass($srcs, '', $shim)
!== false)
					{
						$aLoadedElementPlugins[] = $element->plugin;
					}
				}

				$eventMax = ($groupModel->repeatTotal == 0) ? 1 :
$groupModel->repeatTotal;

				for ($c = 0; $c < $eventMax; $c++)
				{
					$jsAct = $elementModel->getFormattedJSActions($bKey, $c);

					if (!empty($jsAct))
					{
						$jsActions[] = $jsAct;
					}
				}
			}
		}

		FabrikHelperHTML::iniRequireJS($shim);
		$actions = trim(implode("\n", $jsActions));
		FabrikHelperHTML::windows('a.fabrikWin');
		FabrikHelperHTML::tips('.hasTip', array(),
"$('$bKey')");
		$model->getFormCss();
		$opts = $this->jsOpts();

		$model->jsOpts = $opts;
		$pluginManager->runPlugins('onJSOpts', $model);

		$opts = json_encode($model->jsOpts);

		if (!FabrikHelperHTML::inAjaxLoadedPage())
		{
			Text::script('COM_FABRIK_VALIDATING');
            Text::script('COM_FABRIK_MUST_VALIDATE');
			Text::script('COM_FABRIK_SUCCESS');
			Text::script('COM_FABRIK_NO_REPEAT_GROUP_DATA');
			Text::script('COM_FABRIK_VALIDATION_ERROR');
			Text::script('COM_FABRIK_CONFIRM_DELETE_1');
		}

		Text::script('COM_FABRIK_FORM_SAVED');

		// $$$ rob don't declare as var $bKey, but rather assign to window,
as if loaded via ajax window the function is wrapped
		// inside an anonymous function, and therefore $bKey wont be available as
a global var in window
		$script   = array();
		$script[] = "\t\tvar $bKey = new FbForm(" . $model->getId()
. ", $opts);";
		$script[] = "\t\tFabrik.addBlock('$bKey', $bKey);";
		// Instantiate js objects for each element
		$vstr      = "\n";
		$groups    = $model->getGroupsHiarachy();
		$script[]  = "\t{$bKey}.addElements(";
		$groupedJs = new stdClass;

		foreach ($groups as $groupModel)
		{
			$groupId             = $groupModel->getGroup()->id;
			$groupedJs->$groupId = array();

			if (!$groupModel->canView('form'))
			{
				continue;
			}

			$elementJs     = array();
			$elementModels = $groupModel->getPublishedElements();

			// $$$ rob if repeatTotal is 0 we still want to add the js objects as
the els are only hidden
			$max = $groupModel->repeatTotal > 0 ? $groupModel->repeatTotal
: 1;

			foreach ($elementModels as $elementModel)
			{
				$element = $elementModel->getElement();

				if ($element->published == 0)
				{
					continue;
				}

				// If the view is a form then we should always add the js as long as
the element is editable or viewable
				// if the view is details then we should only add the js if the element
is viewable.
				if (($elementModel->canUse() && $model->isEditable()) ||
$elementModel->canView())
				{
					for ($c = 0; $c < $max; $c++)
					{
						$ref = $elementModel->elementJavascript($c);

						if (!empty($ref))
						{
							$elementJs[] = $ref;
						}

						$validations = $elementModel->validator->findAll();

						if (!empty($validations) && $elementModel->isEditable())
						{
							$watchElements = $elementModel->getValidationWatchElements($c);

							foreach ($watchElements as $watchElement)
							{
								$vstr .= "\t$bKey.watchValidation('" .
$watchElement['id'] . "', '" .
$watchElement['triggerEvent'] . "');\n";
							}
						}
					}
				}
			}

			$groupedJs->$groupId = $elementJs;
		}

		$json = json_encode($groupedJs);

		/*
		 * Ran across an issue where encrypted fields that don't decrypt
properly, for example if you do an
		 * Akeeba clone with Kickstart that changes the secret, will cause a
JSON_ERROR_UTF8 because the data
		 * is binary blob.  Should really handle the error better, but for now
just make sure there's an error message
		 * so we (support staff) at least know what's going on.
		 */
		if ($json === false)
		{
			$this->app->enqueueMessage('JSON encode error! ' .
json_last_error_msg());
			return false;
		}

		$script[] = $json;
		$script[] = "\t);";
		$script[] = $actions;
		$script[] = $vstr;

		// Placeholder
		$script[] = "\tnew Form.Placeholder('.fabrikForm
input');";
		$this->_addJavascriptSumbit($script, $listId, $aWYSIWYGNames);

		if (FabrikHelperHTML::inAjaxLoadedPage())
		{
			$tipOpts  = FabrikHelperHTML::tipOpts();
			$script[] = "new FloatingTips('#" . $bKey . "
.fabrikTip', " . json_encode($tipOpts) . ");";
		}

		$res = $pluginManager->runPlugins('onJSReady', $model);

		if (in_array(false, $res))
		{
			return false;
		}

		$str = implode("\n", $script);
		$model->getCustomJsAction($srcs);

		$pluginManager->runPlugins('onAfterJSLoad', $model);

		// 3.1 call form js plugin code within main require method
		$srcs = array_merge($srcs, $model->formPluginShim);
		$str .= "\n$bKey.addPlugins({";
		$plugins = array();

		foreach ($model->formPluginJS as $pluginName => $pluginStr)
		{
			$plugins[] = "'$pluginName': $pluginStr";
		}

		$str .= implode(',', $plugins) . "});\n";

		FabrikHelperHTML::script($srcs, $str);
	}

	/**
	 * Load the JavaScript ini options
	 *
	 * @since  3.1b
	 *
	 * @return stdClass
	 */
	protected function jsOpts()
	{
		$input = $this->app->getInput();

		/** @var FabrikFEModelForm $model */
		$model                = $this->getModel();
		$fbConfig             =
ComponentHelper::getParams('com_fabrik');
		$form                 = $model->getForm();
		$params               = $model->getParams();
		$listModel            = $model->getlistModel();
		$table                = $listModel->getTable();
		$opts                 = new stdClass;
		$opts->admin          =
$this->app->isClient('administrator');
		$opts->ajax           = $model->isAjax();
		$opts->ajaxValidation = (bool)
$params->get('ajax_validations');
		$opts->lang           = FabrikWorker::getMultiLangURLCode();
		$opts->toggleSubmit   = (bool)
$params->get('ajax_validations_toggle_submit');
		$opts->showLoader     = (bool)
$params->get('show_loader_on_submit', '0');
		$key                  =
FabrikString::safeColNameToArrayKey($table->db_primary_key);
		$opts->primaryKey     = $key;
		$opts->error          = @$form->origerror;
		$opts->pages          = $model->getPages();
		$opts->plugins        = array();
		$opts->multipage_save = (int) $model->saveMultiPage();
		$opts->editable       = $model->isEditable();
		$opts->print          = (bool) $input->getInt('print');
		$startPage            = isset($model->sessionModel->last_page) ?
(int) $model->sessionModel->last_page : 0;

		if ($startPage !== 0)
		{
		    if ($this->app->getInput()->get('view',
'form') === 'form') {
               
$this->app->enqueueMessage(Text::_('COM_FABRIK_RESTARTING_MULTIPAGE_FORM'));
            }
		}
		else
		{
			// Form submitted but fails validation - needs to go to the last page
			$startPage = $input->getInt('currentPage', 0);
		}

		$opts->start_page    = $startPage;
		$opts->inlineMessage = (bool) $this->isMambot;

		// $$$rob don't int this as keys may be string
		$opts->rowid = (string) $model->getRowId();

		// 3.0 needed for ajax requests
		$opts->listid = (int)
$this->get('ListModel')->getId();

//		$errorIcon       = FabrikWorker::j3() ?
$fbConfig->get('error_icon', 'exclamation-sign') :
'alert.png';
		$errorIcon       = $fbConfig->get('error_icon',
'exclamation-sign');
		$this->errorIcon = FabrikHelperHTML::image($errorIcon,
'form', $this->tmpl);

		$imgs               = new stdClass;
		$imgs->alert        = FabrikHelperHTML::image($errorIcon,
'form', $this->tmpl, '', true);
		$imgs->action_check =
FabrikHelperHTML::image('action_check.png', 'form',
$this->tmpl, '', true);

		//$imgs->ajax_loader =
FabrikHelperHTML::image('ajax-loader.gif', 'form',
$this->tmpl, '', false);
		$imgs->ajax_loader = FabrikHelperHTML::icon('icon-spinner
icon-spin');
		$opts->images      = $imgs;

		// $$$rob if you are loading a list in a window from a form db join
select record option
		// then we want to know the id of the window so we can set its
showSpinner() method

		// 3.0 changed to fabrik_window_id (automatically appended by
Fabrik.Window xhr request to load window data
		// use getRaw to preserve URL /'s, as window JS will keep them in id
		$opts->fabrik_window_id =
$input->getRaw('fabrik_window_id', '');
		$opts->submitOnEnter    = (bool)
$params->get('submit_on_enter', false);

		// For editing groups with joined data and an empty joined record (i.e.
no joined records)
		$hidden         = array();
		$maxRepeat      = array();
		$minRepeat      = array();
		$showMaxRepeats = array();
		$minMaxErrMsg   = array();
		$numRepeatEls   = array();
		$noDataMsg      = array();

		foreach ($this->groups as $g)
		{
			$hidden[$g->id]         = $g->startHidden;
			$maxRepeat[$g->id]      = $g->maxRepeat;
			$minRepeat[$g->id]      = $g->minRepeat;
			$numRepeatEls[$g->id]   =
FabrikString::safeColNameToArrayKey($g->numRepeatElement);
			$showMaxRepeats[$g->id] = $g->showMaxRepeats;
			$minMaxErrMsg[$g->id]   = Text::_($g->minMaxErrMsg);
			$noDataMsg[$g->id]      = Text::_($g->noDataMsg);
		}

		$opts->hiddenGroup    = $hidden;
		$opts->maxRepeat      = $maxRepeat;
		$opts->minRepeat      = $minRepeat;
		$opts->showMaxRepeats = $showMaxRepeats;
		$opts->minMaxErrMsg   = $minMaxErrMsg;
		$opts->numRepeatEls   = $numRepeatEls;
		$opts->noDataMsg      = $noDataMsg;

		// $$$ hugh adding these so calc element can easily find joined and
repeated join groups
		// when it needs to add observe events ... don't ask ... LOL!
		$opts->join_group_ids  = array();
		$opts->group_repeats   = array();
		$opts->group_joins_ids = array();
		$groups                = $model->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			if ($groupModel->getGroup()->is_join)
			{
				$joinParams = $groupModel->getJoinModel()->getJoin()->params;

				if (!(is_a($joinParams, 'Registry') || is_a($joinParams,
'Registry')))
				{
					$joinParams = new Registry($joinParams);
				}

				$groupId                                                =
$groupModel->getGroup()->id;
				$opts->group_pk_ids[$groupId]                           =
FabrikString::safeColNameToArrayKey($joinParams->get('pk'));
				$opts->join_group_ids[$groupModel->getGroup()->join_id] =
(int) $groupModel->getGroup()->id;
				$opts->group_join_ids[$groupId]                         = (int)
$groupModel->getGroup()->join_id;
				$opts->group_repeats[$groupId]                          =
$groupModel->canRepeat();
				$opts->group_copy_element_values[$groupId]              =
$groupModel->canCopyElementValues();
				$opts->group_repeat_intro[$groupId]                     =
$groupModel->getParams()->get('repeat_intro',
'');
				$opts->group_repeat_sortable[$groupId]                  =
$groupModel->getParams()->get('repeat_sortable',
'') === '1';
				$opts->group_repeat_tablesort[$groupId]                  =
$groupModel->getParams()->get('repeat_sortable',
'') === '2';
				$opts->group_repeat_order_element[$groupId]             =
$groupModel->getParams()->get('repeat_order_element',
'');
			}
		}

		return $opts;
	}

	/**
	 * Append JS code for form submit
	 *
	 * @param   array &$script       Scripts
	 * @param   int   $listId        List id
	 * @param   array $aWYSIWYGNames WYSIWYG editor names
	 *
	 * @since   3.1b
	 * @return  void
	 */
	protected function _addJavascriptSumbit(&$script, $listId,
$aWYSIWYGNames)
	{
		$script[] = "\tfunction submit_form() {";

		$script[] = "\treturn false;";
		$script[] = "}";
		$script[] = "function submitbutton(button) {";
		$script[] = "\tif (button==\"cancel\") {";
		$script[] = "\t\tdocument.location = '" .
Route::_('index.php?option=com_' . $this->package .
'&task=viewTable&cid=' . $listId) . "';";
		$script[] = "\t}";
		$script[] = "\tif (button == \"cancelShowForm\") {";
		$script[] = "\t\treturn false;";
		$script[] = "\t}";
		$script[] = "}";
	}

	/**
	 * Create the form bottom hidden fields
	 *
	 * @param   object &$form Object containing form view properties
	 *
	 * @return  void
	 */
	protected function _loadTmplBottom(&$form)
	{
		$input  = $this->app->getInput();
		$itemId = FabrikWorker::itemId();

		/** @var FabrikFEModelForm $model */
		$model     = $this->getModel();
		$listModel = $model->getListModel();
		$row       = ArrayHelper::toObject($model->data);
		$canDelete = $listModel->canDelete($row);
		$params    = $model->getParams();
		$task      = 'form.process';
		$refer     = $input->server->get('HTTP_REFERER',
'', 'string');

		// $$$rob - if returning from a failed validation then we should use the
fabrik_referrer post var
		$refer = str_replace('&', '&amp;',
$input->get('fabrik_referrer', $refer, 'string'));

		$thisRowId = is_array($model->getRowId()) ? implode('|',
$model->getRowId()) : $model->getRowId();
		$fields    = array();
		$fields[]  = '<input type="hidden"
name="listid" value="' . $listModel->getId() .
'" />';
		$fields[]  = '<input type="hidden"
name="listref" value="' . $listModel->getId() .
'" />';
		$fields[]  = '<input type="hidden"
name="rowid" value="' . $thisRowId . '"
/>';
		$fields[]  = '<input type="hidden"
name="Itemid" value="' . $itemId . '"
/>';
		$fields[]  = '<input type="hidden"
name="option" value="com_' . $this->package .
'" />';
		$fields[]  = '<input type="hidden"
name="task" value="' . $task . '"
/>';
		$fields[]  = '<input type="hidden"
name="isMambot" value="' . $this->isMambot .
'" />';
		$fields[]  = '<input type="hidden"
name="formid" value="' . $model->get('id')
. '" />';
		$fields[]  = '<input type="hidden"
name="returntoform" value="0" />';
		$fields[]  = '<input type="hidden"
name="fabrik_referrer" value="' . $refer . '"
/>';
		$fields[]  = '<input type="hidden"
name="fabrik_ajax" value="' . (int) $model->isAjax()
. '" />';
		$fields[]  = '<input type="hidden"
name="package" value="' .
$this->app->getUserState('com_fabrik.package',
'fabrik') . '" />';
		$fields[]  = '<input type="hidden"
name="packageId" value="' . $model->packageId .
'" />';

		if ($model->noData)
		{
			$fields[] = '<input type="hidden"
name="nodata" value="1"" />';
		}
		else
		{
			$fields[] = '<input type="hidden"
name="nodata" value="0" />';
		}

		/*
		if ($input->get('fabrikdebug', '') ===
'2')
        {
            $fields[]  = '<input type="hidden"
name="fabrikdebug" value="2" />';
        }
		*/

		// Allow things like join element with frontend Add to squash redirects
		if ($input->getInt('noredirect', 0) !== 0)
		{
			$fields[] = '<input type="hidden"
name="noredirect" value="1" />';
		}

		if ($useKey = FabrikWorker::getMenuOrRequestVar('usekey',
''))
		{
			// $$$rob v's been set from -1 to the actual row id - so ignore
usekey not sure if we should comment this out
			// see http://fabrikar.com/forums/showthread.php?t=10297&page=5

			$fields[] = '<input type="hidden"
name="usekey" value="' . $useKey . '"
/>';
			$pk_val   = FArrayHelper::getValue($model->data,
$listModel->getPrimaryKey(true));

			if (empty($pk_val))
			{
				$fields[] = '<input type="hidden"
name="usekey_newrecord" value="1" />';
			}
		}

		/** $$$ hugh - testing a fix for pagination issue when submitting a
'search form'.
		 * If this is a search form, we need to clear 'limitstart',
otherwise ... say we
		 * were last on page 4 of the (unfiltered) target table, and the search
yields less than 4 pages,
		 * we end up with a blank table 'cos the wrong LIMIT's are
applied to the query
		 */
		$saveInSessions = $params->get('save_insession',
'');

		if (is_array($saveInSessions))
		{
			foreach ($saveInSessions as $saveInSession)
			{
				if ($saveInSession == '1')
				{
					$fields[] = '<input type="hidden"
name="limitstart" value="0" />';
					break;
				}
			}
		}

		$fields[]    = HTMLHelper::_('form.token');
		$resetLabel  = Text::_($params->get('reset_button_label'));
		$resetIcon   = $params->get('reset_icon', '');
		$copyLabel   = Text::_($params->get('copy_button_label'));
		$copyIcon    = $params->get('copy_icon', '');
		$applyLabel  = Text::_($params->get('apply_button_label'));
		$applyIcon   = $params->get('apply_icon', '');
		$deleteLabel = Text::_($params->get('delete_button_label',
'Delete'));
		$deleteIcon  = $params->get('delete_icon', '');
		$goBackLabel = Text::_($params->get('goback_button_label'));
		$goBackIcon  = $params->get('goback_icon', '');
		$btnLayout   = FabrikHelperHTML::getLayout('fabrik-button');

		if ($resetIcon !== '')
		{
			$resetIcon  = FabrikHelperHTML::icon($resetIcon);
			$before     = $params->get('reset_icon_location',
'before') == 'before';
			$resetLabel = $before ? $resetIcon . '&nbsp;' .
$resetLabel : $resetLabel . '&nbsp;' . $resetIcon;
		}

		$layoutData = (object) array(
			'type' => 'reset',
			'class' => $params->get('reset_button_class',
'btn-outline-warning') . ' button clearSession',
			'name' => 'Reset',
			'label' => $resetLabel,
			'formModel' => $model
		);

		$form->resetButton = $params->get('reset_button', 0)
&& $this->editable == '1' ?
$btnLayout->render($layoutData) : '';

		if ($copyIcon !== '')
		{
			$copyIcon  = FabrikHelperHTML::icon($copyIcon);
			$copyLabel = $params->get('copy_icon_location',
'before') == 'before' ? $copyIcon .
'&nbsp;' . $copyLabel : $copyLabel . '&nbsp;' .
$copyIcon;
		}

		$layoutData       = (object) array(
			'type' => 'submit',
			'class' => $params->get('copy_button_class',
'btn-outline-dark') . ' button',
			'name' => 'Copy',
			'label' => $copyLabel,
			'formModel' => $model
		);
		$form->copyButton = $params->get('copy_button', 0)
&& $this->editable && $model->getRowId() !=
''
			? $btnLayout->render($layoutData) : '';

		if ($applyIcon !== '')
		{
			$applyIcon  = FabrikHelperHTML::icon($applyIcon);
			$before     = $params->get('apply_icon_location',
'before') == 'before';
			$applyLabel = $before ? $applyIcon . '&nbsp;' .
$applyLabel : $applyLabel . '&nbsp;' . $applyIcon;
		}

		$layoutData = (object) array(
			'type' => $model->isAjax() ? 'button' :
'submit',
			'class' => $params->get('apply_button_class',
'btn-outline-primary') . ' button',
			'name' => 'apply',
			'label' => $applyLabel,
			'formModel' => $model
		);

		$form->applyButton = $params->get('apply_button', 0)
&& $this->editable
			? $btnLayout->render($layoutData) : '';

		if ($deleteIcon !== '')
		{
			$deleteIcon  = FabrikHelperHTML::icon($deleteIcon);
			$before      = $params->get('delete_icon_location',
'before') == 'before';
			$deleteLabel = $before ? $deleteIcon . '&nbsp;' .
$deleteLabel : $deleteLabel . '&nbsp;' . $deleteIcon;
		}

		$layoutData = (object) array(
			'type' => 'submit',
			'class' => $params->get('delete_button_class',
'btn-outline-danger') . ' button',
			'name' => 'delete',
			'label' => $deleteLabel,
			'formModel' => $model
		);

		$form->deleteButton = $params->get('delete_button', 0)
&& $canDelete && $this->editable && $thisRowId
!= ''
			? $btnLayout->render($layoutData) : '';

		if ($goBackIcon !== '')
		{
			$goBackIcon  = FabrikHelperHTML::icon($goBackIcon);
			$before      = $params->get('goback_icon_location',
'before') == 'before';
			$goBackLabel = $before ? $goBackIcon . '&nbsp;' .
$goBackLabel : $goBackLabel . '&nbsp;' . $goBackIcon;
		}


		$layoutData = (object) array(
			'type' => 'button',
			'class' => 'clearSession',
			'name' => '',
			'label' =>
Text::_('COM_FABRIK_CLEAR_MULTI_PAGE_SESSION'),
			'formModel' => $model
		);

		$multiPageSession = $model->sessionModel &&
$model->sessionModel->last_page > 0;
		$form->clearMultipageSessionButton = $multiPageSession ?
$btnLayout->render($layoutData) : '';

		if (!$this->isMambot)
		{
			$layoutData = (object) array(
				'type' => 'button',
				'class' =>
$params->get('goback_button_class',
'btn-outline-dark') . ' button',
				'name' => 'Goback',
				'label' => $goBackLabel,
				'attributes' => $model->isAjax() ? '' :
FabrikWorker::goBackAction(),
				'formModel' => $model
			);

			$form->gobackButton = $params->get('goback_button', 0) ?
$btnLayout->render($layoutData) : '';
		}
		else
		{
			$form->gobackButton = '';
		}

		if ($model->isEditable() &&
$params->get('submit_button', 1))
		{
			$submitClass = FabrikString::clean($form->submit_button_label);
			$submitIcon  = $params->get('save_icon', '');
			$submitLabel = Text::_($form->submit_button_label);

			if ($submitIcon !== '')
			{
				$submitIcon  = FabrikHelperHTML::icon($submitIcon);
				$before      = $params->get('save_icon_location',
'before') == 'before';
				$submitLabel = $before ? $submitIcon . '&nbsp;' .
$submitLabel : $submitLabel . '&nbsp;' . $submitIcon;
			}

			$layoutData = (object) array(
				'type' => $model->isAjax() ? 'button' :
'submit',
				'class' => $params->get('save_button_class',
'btn-outline-primary') . ' button ' . $submitClass,
				'name' => 'Submit',
				'label' => $submitLabel,
				'id' => 'fabrikSubmit_' . $model->getId(),
				'formModel' => $model
			);

			$form->submitButton = $btnLayout->render($layoutData);
		}
		else
		{
			$form->submitButton = '';
		}

		$layoutData = (object) array(
			'formModel' => $model,
			'row' => $row,
			'rowid' => $thisRowId,
			'itemid' => $itemId
		);
		$form->customButtons =
$model->getLayout('form.fabrik-custom-button')->render($layoutData);

		if ($this->isMultiPage)
		{
			$layoutData       = (object) array(
				'type' => 'button',
				'class' => 'fabrikPagePrevious button
btn-outline-dark',
				'name' => 'fabrikPagePrevious',
				'label' =>
FabrikHelperHTML::icon('icon-previous',
Text::_('COM_FABRIK_PREV')),
				'formModel' => $model
			);
			$form->prevButton = $btnLayout->render($layoutData);

			$layoutData = (object) array(
				'type' => 'button',
				'class' => 'fabrikPageNext button
btn-outline-dark',
				'name' => 'fabrikPageNext',
				'label' => Text::_('COM_FABRIK_NEXT') .
'&nbsp;' . FabrikHelperHTML::icon('icon-next'),
				'formModel' => $model
			);

			$form->nextButton = $btnLayout->render($layoutData);
		}
		else
		{
			$form->nextButton = '';
			$form->prevButton = '';
		}

		// $$$ hugh - hide actions section if we're printing or format=PDF,
or if not actions selected
		$noButtons = (
			empty($form->nextButton)
			&& empty($form->prevButton)
			&& empty($form->submitButton)
			&& empty($form->gobackButton)
			&& empty($form->deleteButton)
			&& empty($form->applyButton)
			&& empty($form->copyButton)
			&& empty($form->resetButton)
			&& empty($form->clearMultipageSessionButton)
			&& empty($form->customButtons)
		);

		$this->hasActions = ($input->get('print', '0')
== '1' || $input->get('format') === 'pdf'
|| $noButtons) ? false : true;

		$format   = $model->isAjax() ? 'raw' : 'html';
		$fields[] = '<input type="hidden"
name="format" value="' . $format . '"
/>';
		$groups   = $model->getGroupsHiarachy();
		$origRowIds = array();

		if ($model->hasErrors())
		{
			$origRowIds =
$this->app->getInput()->getRaw('fabrik_group_rowids',
array());
		}

		foreach ($groups as $groupModel)
		{
			if ($groupModel->isJoin())
			{
				$groupId = $groupModel->getId();

				if (array_key_exists($groupId, $origRowIds))
				{
					$groupRowIds = htmlentities($origRowIds[$groupId]);
				}
				else
				{
					$groupPk = $groupModel->getJoinModel()->getForeignId();

					// Use raw otherwise we inject the actual <input> into the
hidden field's value
					$groupPk     .= '_raw';
					$groupRowIds = (array) FArrayHelper::getValue($this->data,
$groupPk, array());
					$groupRowIds = htmlentities(json_encode($groupRowIds));
				}

				// Used to check against in group process(), when deleting removed
repeat groups
				$fields[] = '<input type="hidden"
name="fabrik_group_rowids[' . $groupId . ']"
value="' . $groupRowIds . '" />';
			}

			$group = $groupModel->getGroup();
			$c     = $groupModel->repeatTotal;

			// Used for validations
			$fields[] = '<input type="hidden"
name="fabrik_repeat_group[' . $group->id . ']"
value="' . $c . '" id="fabrik_repeat_group_'
				. $group->id . '_counter" />';

			// Used for validations
			$added = $input->get('fabrik_repeat_group_added', array(),
'array');
			$added = ArrayHelper::getValue($added, $group->id, '0');
			$fields[] = '<input type="hidden"
name="fabrik_repeat_group_added[' . $group->id . ']"
value="' . $added . '"
id="fabrik_repeat_group_'
				. $group->id . '_added" />';
		}

		// $$$ hugh - testing social_profile_hash stuff
		if ($input->get('fabrik_social_profile_hash', '')
!= '')
		{
			$fields[] = '<input type="hidden"
name="fabrik_social_profile_hash" value="' .
$input->get('fabrik_social_profile_hash', '')
				. '" id="fabrik_social_profile_hash" />';
		}

		$this->_cryptQueryString($fields);
		$this->_cryptViewOnlyElements($fields);
		$this->hiddenFields = implode("\n", $fields);
	}

	/**
	 * Store all fabrik querystring vars as encrypted hidden fields
	 * this is used when you have a table with a "Tables with database
join elements linking to this table" link to a
	 * form. and when the form's pk element (found in the link) is set to
read only OR if you are filtering from an
	 * url?
	 *
	 * @param   array &$fields hidden fields
	 *
	 * @return  void
	 */
	protected function _cryptQueryString(&$fields)
	{
		$crypt = FabrikWorker::getCrypt();

		/** @var FabrikFEModelForm $formModel */
		$formModel = $this->getModel();
		$filter    = InputFilter::getInstance();
		$get       = $filter->clean($_GET, 'array');

		foreach ($get as $key => $input)
		{
			// 	$$$ rob test if passing in _raw value via qs -used in fabsubs
			if (!$formModel->hasElement($key))
			{
				$key = FabrikString::rtrimword($key, '_raw');
			}

			if ($formModel->hasElement($key))
			{
				$elementModel = $formModel->getElement($key);

				if (!$elementModel->canUse())
				{
					$input = (is_array($input) &&
array_key_exists('value', $input)) ? $input['value'] :
$input;
					/** $$$ hugh - need to check if $value is an array, 'cos if it
isn't, like when presetting
					 * a new form element with &table___element=foo, getValue was
chomping it down to just first character
					 * see http://fabrikar.com/forums/showthread.php?p=82726#post82726
					 */

					if (is_array($input))
					{
						$input = FArrayHelper::getValue($input, 'raw', $input);
					}

					// $$$ hugh - the aptly named SimpleCrypt encrypt is going to barf and
toss a warning if we try
					// and encrypt a null or empty string
					if (empty($input))
					{
						$input = '';
					}
					else
					{
						$input = $crypt->encrypt($input);
					}

					$fields[] = '<input type="hidden"
name="fabrik_vars[querystring][' . $key . ']"
value="' . $input . '" />';
				}
			}
		}
	}

	/**
	 * Encrypt view only elements
	 *
	 * @param   array &$aHiddenFields Hidden fields
	 *
	 * @return  void
	 */
	protected function _cryptViewOnlyElements(&$aHiddenFields)
	{
		/** @var FabrikFEModelForm $model */
		$model  = $this->getModel();
		$crypt  = FabrikWorker::getCrypt();
		$fields = array();
		$ro     = $model->getReadOnlyVals();

		foreach ($ro as $key => $pair)
		{
			$repeatGroup = $pair['repeatgroup'];
			$isJoin      = $pair['join'];
			$input       = $pair['data'];

			// $$$ rob not sure this is correct now as I modified the readOnlyVals
structure to contain info about if its in a group
			// and it now contains the repeated group data
			$input = (is_array($input) &&
array_key_exists('value', $input)) ? $input['value'] :
$input;

			if ($repeatGroup)
			{
				$ar    = array();
				$input = (array) $input;

				foreach ($input as $i)
				{
					if (is_array($i))
					{
						// Elements with sub options in repeat group
						$i = json_encode($i);
					}

					$ar[] = $i;
				}

				$input = $isJoin ? $ar : json_encode($ar);
			}
			else
			{
				if (is_array($input))
				{
					// Elements with sub options not in repeat group
					$input = json_encode($input);
				}
			}

			if (is_array($input))
			{
				for ($x = 0; $x < count($input); $x++)
				{
					if (trim($input[$x]) !== '')
					{
						$input[$x] = $crypt->encrypt($input[$x]);
					}
				}
			}
			else
			{
				if (trim($input) !== '')
				{
					$input = $crypt->encrypt($input);
				}
			}

			$safeKey = FabrikString::rtrimword($key, '[]');

			// $$$ rob - no don't do below as it will strip out join names
join[x][fullname] => join
			// $key = preg_replace("/\[(.*)\]/", '', $key);
			if (!array_key_exists($safeKey, $fields))
			{
				$fields[$safeKey] = $input;
			}
			else
			{
				$fields[$safeKey]   = (array) $fields[$safeKey];
				$fields[$safeKey][] = $input;
			}
		}

		foreach ($fields as $key => $input)
		{
			if (is_array($input))
			{
				for ($c = 0; $c < count($input); $c++)
				{
					$i        = $input[$c];
					$fields[] = '<input type="hidden"
name="fabrik_vars[querystring][' . $key . '][' . $c .
']" value="' . $i . '" />';
				}

				unset($fields[$key]);
			}
			else
			{
				$fields[$key] = '<input type="hidden"
name="fabrik_vars[querystring][' . $key . ']"
value="' . $input . '" />';
			}
		}

		$aHiddenFields = array_merge($aHiddenFields, array_values($fields));
	}
}
views/form/view.html.php000064400000007336151165347640011317
0ustar00<?php
/**
 * HTML Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\Utilities\ArrayHelper;
use Fabrik\Helpers\StringHelper;

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/form/view.base.php';

/**
 * HTML Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewForm extends FabrikViewFormBase
{
	/**
	 * Main setup routine for displaying the form/detail view
	 *
	 * @param   string $tpl template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		if (parent::display($tpl) !== false)
		{
			$this->setCanonicalLink();
			$this->output();

			if (!$this->app->isClient('administrator'))
			{
				$this->state  = $this->get('State');
				$model        = $this->getModel();
				$this->params = $this->state->get('params');
				$row          = $model->getData();
				$w            = new FabrikWorker;

				if ($this->params->get('menu-meta_description'))
				{
					$desc =
$w->parseMessageForPlaceHolder($this->params->get('menu-meta_description'),
$row);
					$this->doc->setDescription($desc);
				}

				if ($this->params->get('menu-meta_keywords'))
				{
					$keywords =
$w->parseMessageForPlaceHolder($this->params->get('menu-meta_keywords'),
$row);
					$this->doc->setMetadata('keywords', $keywords);
				}

				if ($this->params->get('robots'))
				{
					$this->doc->setMetadata('robots',
$this->params->get('robots'));
				}

				$formModel = $this->getModel();
				$listModel = $formModel->getListModel();
				$listParams = $listModel->getParams();
				$sefSlug = $listParams->get('sef-slug', '');

				if (!empty($sefSlug))
				{
					$elementName = StringHelper::safeColNameToArrayKey($sefSlug);
					$slug = ArrayHelper::getValue($formModel->data, $elementName,
'');

					if (!empty($slug))
					{
						$pathway = $this->app->getPathway();
						$pathway->addItem($slug);
					}
				}
			}
		}
	}

	/**
	 * Set the canonical link - this is the definitive URL that Google et all,
will use
	 * to determine if duplicate URLs are the same content
	 *
	 * @return  string
	 */
	public function getCanonicalLink()
	{
		$url = '';

		if (!$this->app->isClient('administrator') &&
!$this->isMambot)
		{
			/** @var FabrikFEModelForm $model */
			$model  = $this->getModel();
			$data   = $model->getData();
			$formId = $model->getId();
			$slug   =
$model->getListModel()->getSlug(ArrayHelper::toObject($data));
			$rowId  = $slug === '' ? $model->getRowId() : $slug;
			$view   = $model->isEditable() ? 'form' :
'details';
			$itemId = FabrikWorker::itemId();
            $url    = 'index.php?option=com_fabrik' .
'&view=' . $view . '&formid=' . $formId .
'&rowid=' . $rowId;
            if (!empty($itemId))
            {
                $url .= '&Itemid=' . $itemId;
            }
       }
       return Route::_($url,true,Route::TLS_IGNORE,true);
	}

	/**
	 * Set the canonical link - this is the definitive URL that Google et all,
will use
	 * to determine if duplicate URLs are the same content
	 *
	 * @throws Exception
	 */
	public function setCanonicalLink()
	{
		if (!$this->app->isClient('administrator') &&
!$this->isMambot)
		{
			$url = $this->getCanonicalLink();

			// Set a flag so that the system plugin can clear out any other
canonical links.
			$this->session->set('fabrik.clearCanonical', true);
			try
			{
				$this->doc->addCustomTag('<link rel="canonical"
href="' . htmlspecialchars($url) . '" />');
			} catch (Exception $err)
			{

			}

		}
	}
}
views/form/view.oai.php000064400000003321151165347640011111
0ustar00<?php
/**
 * Fabrik Raw Form View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/form/view.base.php';

/**
 * Fabrik Raw Form View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewForm extends FabrikViewFormBase
{
	/**
	 * Access value
	 *
	 * @var  int
	 */
	public $access = null;

	/**
	 * @var FabrikFEModelOai
	 */
	private $oaiModel;

	/**
	 * Constructor
	 *
	 * @param   array $config A named configuration array for object
construction.
	 *
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);
		$this->oaiModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Oai',
'FabrikFEModel');
	}

	/**
	 * Execute and display a template script.
	 *
	 * @param   string $tpl The name of the template file to parse;
automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 */
	public function display($tpl = null)
	{
		$this->doc->setMimeEncoding('application/xml');
		$model = $this->getModel('form');
		$model->render();

		// @TODO replace with OAI errors.
		if (!$this->canAccess())
		{
			return false;
		}

		$listModel = $model->getListModel();
		$this->oaiModel->setListModel($listModel);
		$this->oaiModel->setRecord($model->getData());
		$dom = $this->oaiModel->getRecord();
		echo $dom->saveXML();
	}

}
views/form/view.partial.php000064400000003123151165347640011775
0ustar00<?php
/**
 * HTML Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/form/view.base.php';

/**
 * HTML Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewForm extends FabrikViewFormBase
{
	/**
	 * Main setup routine for displaying the form/detail view
	 *
	 * @param   string $tpl template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		if (parent::display($tpl) !== false)
		{
			$this->output();

			if (!$this->app->isClient('administrator'))
			{
				$this->state  = $this->get('State');
				$model        = $this->getModel();
				$this->params = $this->state->get('params');
				$row          = $model->getData();
				$w            = new FabrikWorker;

				if ($this->params->get('menu-meta_description'))
				{
					$desc =
$w->parseMessageForPlaceHolder($this->params->get('menu-meta_description'),
$row);
					$this->doc->setDescription($desc);
				}

				if ($this->params->get('menu-meta_keywords'))
				{
					$keywords =
$w->parseMessageForPlaceHolder($this->params->get('menu-meta_keywords'),
$row);
					$this->doc->setMetadata('keywords', $keywords);
				}

				if ($this->params->get('robots'))
				{
					$this->doc->setMetadata('robots',
$this->params->get('robots'));
				}
			}
		}
	}
}
views/form/view.pdf.php000064400000003731151165347640011117
0ustar00<?php
/**
 * PDF Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/form/view.base.php';

/**
 * PDF Form view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewForm extends FabrikViewFormBase
{
	/**
	 * Main setup routine for displaying the form/detail view
	 *
	 * @param   string $tpl template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		FabrikWorker::canPdf(true);

		if (parent::display($tpl) !== false)
		{
			/** @var JDocumentpdf $document */
			$document = $this->doc;

			/** @var FabrikFEModelList $model */
			$model       = $this->getModel();
			$params      = $model->getParams();
			$size        =
$this->app->getInput()->get('pdf_size',
$params->get('pdf_size', 'A4'));
			$orientation =
$this->app->getInput()->get('pdf_orientation',
$params->get('pdf_orientation', 'portrait'));
			$document->setPaper($size, $orientation);

			if
($this->app->getInput()->get('pdf_include_bootstrap',
$params->get('pdf_include_bootstrap', '0')) ===
'1')
			{
				FabrikhelperHTML::loadBootstrapCSS(true);
			}

			$this->output();
		}
	}

	/**
	 * Set the page title
	 *
	 * @param   object $w       parent worker
	 * @param   object &$params parameters
	 *
	 * @return  void
	 */
	protected function setTitle($w, &$params)
	{
		parent::setTitle($w, $params);

		$model = $this->getModel();

		// Set the download file name based on the document title

		$layout                 =
$model->getLayout('form.fabrik-pdf-title');
		$displayData         = new stdClass;
		$displayData->doc	= $this->doc;
		$displayData->model	= $this->getModel();

		$this->doc->setName($layout->render($displayData));
	}
}
views/form/view.raw.php000064400000010216151165347640011133
0ustar00<?php
/**
 * Fabrik Raw Form View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
use Fabrik\Helpers\ArrayHelper;

defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/form/view.base.php';

/**
 * Fabrik Raw Form View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewForm extends FabrikViewFormBase
{
	/**
	 * Access value
	 *
	 * @var  int
	 */
	public $access = null;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string $tpl The name of the template file to parse;
automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 */
	public function display($tpl = null)
	{
		$input = $this->app->getInput();
		$model = $this->getModel('form');

		// Get the active menu item
		$model->render();

		$listModel = $model->getListModel();

		if (!$this->canAccess())
		{
			return false; 
		}

		if (is_object($listModel))
		{
			$joins = $listModel->getJoins();
			$model->getJoinGroupIds($joins);
		}

		$params = $model->getParams();
		$params->def('icons',
$this->app->get('icons'));
		$pop = ($input->get('tmpl') == 'component') ? 1 :
0;
		$params->set('popup', $pop);
		$view = $input->get('view', 'form');

		if ($view == 'details')
		{
			$model->setEditable(false);
		}

		$groups    = $model->getGroupsHiarachy();
		$gkeys     = array_keys($groups);
		$JSONarray = array();
		$JSONHtml  = array();

		for ($i = 0; $i < count($gkeys); $i++)
		{
			$groupModel  = $groups[$gkeys[$i]];
			$groupTable  = $groupModel->getGroup();
			$group       = new stdClass;
			$groupParams = $groupModel->getParams();
			$aElements   = array();

			// Check if group is actually a table join
			$repeatGroup = 1;
			$foreignKey  = null;

			if ($groupModel->canRepeat())
			{
				if ($groupModel->isJoin())
				{
					$joinModel  = $groupModel->getJoinModel();
					$joinTable  = $joinModel->getJoin();
					$foreignKey = '';

					if (is_object($joinTable))
					{
						$foreignKey = $joinTable->table_join_key;

						// $$$ rob test!!!
						if (!$groupModel->canView('form'))
						{
							continue;
						}

						$elementModels = $groupModel->getPublishedElements();
						reset($elementModels);
						$tmpElement        = current($elementModels);
						$smallerElHTMLName = $tmpElement->getFullName(true, false);
						$repeatGroup       = count((array)
ArrayHelper::getValue($model->data, $smallerElHTMLName, array()));
					}
				}
			}

			$groupModel->repeatTotal = $repeatGroup;
			$aSubGroups              = array();

			for ($c = 0; $c < $repeatGroup; $c++)
			{
				$aSubGroupElements = array();
				$elCount           = 0;
				$elementModels     = $groupModel->getPublishedElements();

				foreach ($elementModels as $elementModel)
				{
					if (!$model->isEditable())
					{
						/* $$$ rob 22/03/2011 changes element keys by appending
"_id" to the end, means that
						 * db join add append data doesn't work if for example the popup
form is set to allow adding,
						 * but not editing records
						 * $elementModel->inDetailedView = true;
						 */
						$elementModel->setEditable(false);
					}

					// Force reload?
					$elementModel->HTMLids = null;
					$elementHTMLId         = $elementModel->getHTMLId($c);

					if (!$model->isEditable())
					{
						$JSONarray[$elementHTMLId] =
$elementModel->getROValue($model->data, $c);
					}
					else
					{
						$JSONarray[$elementHTMLId] =
$elementModel->getValue($model->data, $c);
					}
					// Test for paginate plugin
					if (!$model->isEditable())
					{
						$elementModel->HTMLids        = null;
						$elementModel->inDetailedView = true;
					}

					$JSONHtml[$elementHTMLId] =
htmlentities($elementModel->render($model->data, $c), ENT_QUOTES,
'UTF-8');
				}
			}
		}

		$data = array("id" => $model->getId(), 'model'
=> 'table', "errors" => $model->errors,
"data" => $JSONarray, 'html' => $JSONHtml,
			'post' => $_REQUEST);
		echo json_encode($data);
	}
}
views/form/view.word.php000064400000004341151165347640011317
0ustar00<?php
/**
 * MS Word/Open office .doc Fabrik Form view class
 * Very rough go at implementing .doc rendering based on the fact that they
can read HTML
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\String\Normalise;

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/form/view.base.php';

/**
 * MS Word/Open office .doc Fabrik Form view class
 * Very rough go at implementing .doc rendering based on the fact that they
can read HTML
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.7
 */
class FabrikViewForm extends FabrikViewFormBase
{
	/**
	 * Main setup routine for displaying the form/detail view
	 *
	 * @param   string $tpl template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		if (parent::display($tpl) !== false)
		{
			$this->output();

			if (!$this->app->isClient('administrator'))
			{
				$this->state  = $this->get('State');
				$model        = $this->getModel();
				$this->params = $this->state->get('params');
				$row          = $model->getData();
				$w            = new FabrikWorker;

				if ($this->params->get('menu-meta_description'))
				{
					$desc =
$w->parseMessageForPlaceHolder($this->params->get('menu-meta_description'),
$row);
					$this->doc->setDescription($desc);
				}

				if ($this->params->get('menu-meta_keywords'))
				{
					$keywords =
$w->parseMessageForPlaceHolder($this->params->get('menu-meta_keywords'),
$row);
					$this->doc->setMetadata('keywords', $keywords);
				}

				if ($this->params->get('robots'))
				{
					$this->doc->setMetadata('robots',
$this->params->get('robots'));
				}

				// Set the response to indicate a file download
				$this->app->setHeader('Content-Type',
'application/vnd.ms-word');
				$name = $this->getModel()->getTable()->label;
				$name = Normalise::toDashSeparated($name);
				$this->app->setHeader('Content-Disposition',
"attachment;filename=\"" . $name . ".doc\"");
				$this->doc->setMimeEncoding('text/html;
charset=Windows-1252', false);
			}
		}
	}
}
views/identity/view.oai.php000064400000001753151165347640012006
0ustar00<?php
/**
 * Fabrik Open Archive Initiative Identity
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/form/view.base.php';

/**
 * Fabrik Open Archive Initiative Identity View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.4
 */
class FabrikViewIdentity extends FabrikViewFormBase
{
	/**
	 * Display the Identity
	 *
	 * @param   string $tpl The name of the template file to parse;
automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 */
	public function display($tpl = null)
	{
		$this->doc->setMimeEncoding('application/xml');

		echo $this->getModel()->identity();

		return true;
	}
}
views/import/metadata.xml000064400000000174151165347640011533
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<view hidden="true" title="Import">
	</view>
</metadata>
views/import/tmpl/bootstrap.php000064400000006156151165347640012741
0ustar00<?php
/**
 * Admin Import Tmpl
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;

$url = Route::_('index.php');
HTMLHelper::_('bootstrap.tooltip');
FabrikHelperHTML::formvalidation();
$action = Route::_('index.php?option=com_fabrik');
$app = Factory::getApplication();
$listId = $app->getInput()->getInt('listid');
$itemId   = FabrikWorker::itemId();

?>
<form enctype="multipart/form-data" action="<?php echo
$action ?>" method="post" name="adminForm"
id="fabrik-form" class="form-validate">
	<input type="hidden" name="listid"
value="<?php echo $listId; ?>" />
    <?php
    if (!empty($itemId)) :
    ?>
        <input type="hidden" name="Itemid"
value="<?php echo $itemId; ?>" />
    <?php
    endif;
    ?>
	<h2><?php echo
Text::sprintf('COM_FABRIK_CSV_IMPORT_HEADING',
$this->listName); ?></h2>
	<?php foreach ($this->fieldsets as $fieldset) :
	?>
	<fieldset>
		<?php foreach ($this->form->getFieldSet($fieldset) as $field) :
			echo $field->renderField();
		endforeach; ?>
	</fieldset>
	<?php endforeach;?>

	<input type="hidden" name="task"
value="import.doimport" />
  	<?php echo HTMLHelper::_('form.token');
	echo HTMLHelper::_('behavior.keepalive'); ?>
	<input type="submit" class="btn btn-primary"
value="<?php echo
Text::_('COM_FABRIK_IMPORT_CSV')?>" />
</form>

<script type="text/javascript">
	/* Hate this here but cheap hack for radio button js code - why o why is
this not part of JUX? */
window.addEvent('domready', function () {
	document.id('fabrik-form').getElements(".btn-group
input").each(function (input) {
		var label = document.getElement('label[for=' + input.id +
']');
		label.addClass('btn');
		if (input.checked) {
			v = input.get('value');
			if (v === '') {
				label.addClass('active btn-primary');
			} else if (v === '0') {
				label.addClass('active btn-danger');
			} else {
				label.addClass('active btn-success');
			}
		}
	});

	document.id('fabrik-form').addEvent('mouseup:relay(.btn-group
label)', function (e, label) {
		var id, input;
		id = label.get('for');
		if (id !== '') {
			input = document.id(id);
		}
		if (typeOf(input) === 'null') {
			input = label.getElement('input');
		}
		this.setButtonGroupCSS(input);
	}.bind(this));

});

function setButtonGroupCSS(input) {
	var label;
	if (input.id !== '') {
		label = document.getElement('label[for=' + input.id +
']');
	}
	if (typeOf(label) === 'null') {
		label = input.getParent('label.btn');
	}
	var v = input.get('value');
	if (!input.get('checked')) {
		label.getParent('.btn-group').getElements('label').removeClass('active').removeClass('btn-success').removeClass('btn-danger').removeClass('btn-primary');
		if (v === '') {
			label.addClass('active btn-primary');
		} else if (v.toInt() === 0) {
			label.addClass('active btn-danger');
		} else {
			label.addClass('active btn-success');
		}
		input.set('checked', true);
	}
}
</script>
views/import/tmpl/default.php000064400000002741151165347640012344
0ustar00<?php
/**
 * Import View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;

$url = Route::_('index.php');
HTMLHelper::_('bootstrap.tooltip');
FabrikHelperHTML::formvalidation();
$action = Route::_('index.php?option=com_fabrik');
$app = Factory::getApplication();
$listId = $app->getInput()->getInt('listid');
?>
<form enctype="multipart/form-data" action="<?php echo
$action ?>" method="post" name="adminForm"
id="fabrik-form" class="form-validate">
<div class="width-100 fltlft">
	<input type="hidden" name="listid"
value="<?php echo $listId; ?>" />
	<h2><?php echo
Text::sprintf('COM_FABRIK_CSV_IMPORT_HEADING',
$this->listName); ?></h2>
	<?php foreach ($this->fieldsets as $fieldset) :?>
	<fieldset class="adminform">
		<ul>
		<?php foreach ($this->form->getFieldset($fieldset) as $field)
:?>
			<li>
				<?php echo $field->label . $field->input; ?>
			</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
	<?php endforeach;?>

	<input type="hidden" name="task"
value="import.doimport" />
  	<?php echo HTMLHelper::_('form.token');
	echo HTMLHelper::_('behavior.keepalive'); ?>
	<input type="submit" value="<?php echo
Text::_('COM_FABRIK_IMPORT_CSV')?>" />
	</div>
</form>
views/import/tmpl/default.xml000064400000000467151165347640012360
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<layout title="Fabrik import layout">
		<message>
			<![CDATA[STANDARD Fabrik import layout]]>
		</message>
	</layout>
	<state>
		<description>Link to import data page</description>
		<url>
		</url>
		<params>
		</params>
	</state>
</metadata>
views/import/view.html.php000064400000004604151165347640011661
0ustar00<?php
/**
 * View class for CSV import
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;
use Joomla\Utilities\ArrayHelper;

jimport('joomla.application.component.view');

/**
 * View class for CSV import
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewImport extends FabrikView
{
	/**
	 * Display the view
	 *
	 * @param   string $tpl template
	 *
	 * @return  this
	 */
	public function display($tpl = null)
	{
		$srcs = FabrikHelperHTML::framework();
		FabrikHelperHTML::script($srcs);
        FabrikHelperHTML::iniRequireJs();
		$input        = $this->app->getInput();
		$this->listid = $input->getInt('listid', 0);
		$this->model  =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$this->model->setId($this->listid);
		$this->table = $this->model->getTable();
		$this->form  = $this->get('Form');

		if (!$this->model->canCSVImport())
		{
			throw new RuntimeException('Naughty naughty!', 400);
		}

//		$layout = FabrikWorker::j3() ? 'bootstrap' :
'default';
		$layout = 'bootstrap';
		$this->setLayout($layout);
		$this->fieldsets = $this->setFieldSets();
		parent::display($tpl);

		return $this;
	}

	/**
	 * Set which fieldsets should be used
	 *
	 * @since   3.0.7
	 *
	 * @return  array  fieldset names
	 */
	private function setFieldSets()
	{
		$input = $this->app->getInput();

		// From list data view in admin
		$id = $input->getInt('listid', 0);

		// From list of lists checkbox selection
		$cid = $input->get('cid', array(0), 'array');
		$cid = ArrayHelper::toInteger($cid);

		if ($id === 0)
		{
			$id = $cid[0];
		}

		if (($id !== 0))
		{
			//Force loading from J! database (but there are other issues if J!DB is
not the default connection)
			$db    = FabrikWorker::getDbo(true);
			$query = $db->getQuery(true);
			$query->select('label')->from('#__fabrik_lists')->where('id
= ' . $id);
			$db->setQuery($query);
			$this->listName = $db->loadResult();
		}

		$fieldsets = array('details');

		if ($this->model->canEmpty())
		{
			$fieldsets[] = 'drop';
		}

		$fieldsets[] = $id === 0 ? 'creation' : 'append';
		$fieldsets[] = 'format';

		return $fieldsets;
	}
}
views/list/tmpl/_advancedsearch.php000064400000005245151165347640013455
0ustar00<?php
/**
 * Fabrik List Template: Advanced Search
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Factory;

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();

$app = Factory::getApplication();
$input = $app->getInput();
?>
<form method="post" action="<?php echo
$this->action?>" class="advancedSearch_<?php echo
$this->listref?>">
	<a class="addbutton advanced-search-add btn-success btn
btn-sm" href="#">
		<?php echo FabrikHelperHTML::image('plus', 'list',
$this->tmpl);?>
		<?php echo Text::_('COM_FABRIK_ADD')?>
	</a>
	<div id="advancedSearchContainer">
	<table class="advanced-search-list table table-striped
table-condensed">
		<tbody>
			<?php foreach ($this->rows as $row) :?>
			<tr>
				<td><span><?php echo
$row['join'];?></span></td>
				<td><?php echo $row['element'] .
$row['type'] . $row['grouped'];?>
				</td>
				<td><?php echo $row['condition'];?></td>
				<td class='filtervalue'
style='min-width:10em'></td>
				<td>
				<div class="button-group">
					<a class="advanced-search-remove-row btn btn-danger
btn-sm" href="#">
						<?php echo FabrikHelperHTML::image('minus',
'list', $this->tmpl);?>
					</a>
				</div>
				</td>
			</tr>
			<?php endforeach;?>

		</tbody>
		<thead>
			<tr class="fabrik___heading title">
				<th></th>
				<th><?php echo
Text::_('COM_FABRIK_ELEMENT')?></th>
				<th><?php echo
Text::_('COM_FABRIK_CONDITION')?></th>
				<th><?php echo
Text::_('COM_FABRIK_VALUE')?></th>
				<th><?php echo
Text::_('COM_FABRIK_DELETE')?></th>
			</tr>
			</thead>
	</table>
	</div>
	<input type="submit"
		value="<?php echo
Text::_('COM_FABRIK_APPLY')?>"
		class="button btn btn-primary fabrikFilter
advanced-search-apply"
		name="applyAdvFabrikFilter"
		type="button">

	<input value="<?php echo
Text::_('COM_FABRIK_CLEAR')?>" class="button btn
advanced-search-clearall" type="button">
	<input type="hidden" name="advanced-search"
value="1" />
	<input type="hidden" name="<?php echo
$input->get('tkn', 'request')?>"
value="1" />

	<?php
	$scope = $input->get('scope', 'com_fabrik');
	if ($scope == 'com_fabrik') :?>
		<input type="hidden" name="option"
value="<?php echo $input->get('option')?>"
/>
		<input type="hidden" name="view"
value="<?php echo $input->get('nextview',
'list'); ?>" />
		<input type="hidden" name="listid"
value="<?php echo $this->listid?>" />
		<input type="hidden" name="task"
value="<?php echo $input->get('nextview',
'list'); ?>.filter" />
	<?php
	endif;
	?>
</form>
views/list/tmpl/bootstrap/custom_css_example.php000064400000002743151165347660016277
0ustar00<?php
/**
 * Fabrik List Template: Default Custom CSS
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

/**
* If you need to make small adjustments or additions to the CSS for a
Fabrik
* list template, you can create a custom_css.php file, which will be loaded
after
* the main template_css.php for the template.
*
* This file will be invoked as a PHP file, so the list ID
* can be used in order to narrow the scope of any style changes.  You do
* this by prepending #listform_$c to any selectors you use.  This will
become
* (say) #listform_12, owhich will be the HTML ID of your list on the page.
*
* See examples below, which you should remove if you copy this file.
*
* Don't edit anything outside of the BEGIN and END comments.
*
* For more on custom CSS, see the Wiki at:
*
*
http://www.fabrikar.com/forums/index.php?wiki/form-and-details-templates/#the-custom-css-file
*
* NOTE - for backward compatibility with Fabrik 2.1, and in case you
* just prefer a simpler CSS file, without the added PHP parsing that
* allows you to be be more specific in your selectors, we will also include
* a custom.css we find in the same location as this file.
*
*/

header('Content-type: text/css');
$c = $_REQUEST['c'];
echo <<<EOT
/* BEGIN - Your CSS styling starts here */

#listform_$c {
	margin-top: 25px !important;
}

/* END - Your CSS styling ends here */
EOT;
views/list/tmpl/bootstrap/default_buttons_btn_group.php000064400000004524151165347660017662
0ustar00<?php
/**
 * Bootstrap List Template - Buttons
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

?>
<div class="btn-group">
	<?php if ($this->canGroupBy) :?>
		<div class="btn-group">
			<a href="#" class="btn dropdown-toggle groupBy"
data-bs-toggle="dropdown">
				<?php echo FabrikHelperHTML::icon('icon-list-view',
Text::_('COM_FABRIK_GROUP_BY'));?>
			</a>
			<ul class="dropdown-menu">
				<?php foreach ($this->groupByHeadings as $url => $obj) {?>
					<li><a data-groupby="<?php echo
$obj->group_by?>" href="<?php echo
$url?>"><?php echo $obj->label?></a></li>
				<?php
				}?>
			</ul>
		</div>
	<?php endif ?>

	<?php if ($this->showAdd) {?>
		<a class="addbutton btn addRecord" href="<?php echo
$this->addRecordLink;?>">
			<?php echo FabrikHelperHTML::icon('icon-plus',
$this->addLabel);?>
		</a>
	<?php }?>

	<?php if ($this->showClearFilters) :?>
		<a class="clearFilters btn" href="#">
			<?php echo FabrikHelperHTML::icon('icon-refresh',
Text::_('COM_FABRIK_CLEAR')); ?>
		</a>
	<?php endif ?>

	<?php if ($this->showCSV) {?>
		<a href="#" class="btn csvExportButton">
			<?php echo FabrikHelperHTML::icon('icon-upload',
Text::_('COM_FABRIK_EXPORT_TO_CSV')); ?>
		</a>
	<?php }?>

	<?php if ($this->advancedSearch !== '') : ?>
		<a href="<?php echo $this->advancedSearchURL?>"
class="btn advanced-search-link">
			<?php echo FabrikHelperHTML::icon('icon-search',
Text::_('COM_FABRIK_ADVANCED_SEARCH')); ?>
		</a>
	<?php endif?>

	<?php if ($this->showCSVImport) {?>
		<a href="<?php echo $this->csvImportLink;?>"
class="btn csvImportButton">
			<?php echo FabrikHelperHTML::icon('icon-download',
Text::_('COM_FABRIK_IMPORT_FROM_CSV')); ?>
		</a>
	<?php }?>

	<?php if ($this->showRSS) {?>
		<a href="<?php echo $this->rssLink;?>"
class="btn feedButton">
			<?php echo FabrikHelperHTML::image('feed.png',
'list', $this->tmpl);?>
			<?php echo Text::_('COM_FABRIK_SUBSCRIBE_RSS');?>
		</a>
	<?php }
	if ($this->showPDF) {?>
			<a href="<?php echo $this->pdfLink;?>"
class="btn pdfButton">
				<?php echo FabrikHelperHTML::icon('icon-file',
Text::_('COM_FABRIK_PDF')); ?>
			</a>
	<?php }?>


</div>
<p></p>
views/list/tmpl/bootstrap/default_buttons.php000064400000012222151165347660015575
0ustar00<?php
/**
 * Bootstrap List Template - Buttons
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

?>
<div class="row justify-content-between pb-3 pe-3">

	<div class=" col-auto fabrikButtonsContainer">
		<div class="row row-cols-auto align-items-start">
			<?php if ($this->showAdd) :?>
				<div class="col px-0">
					<a class="addbutton addRecord btn " href="<?php
echo $this->addRecordLink;?>">
						<?php echo FabrikHelperHTML::icon('icon-plus',
$this->addLabel);?>
					</a>
				</div>
			<?php endif; ?>
			<?php if ($this->showToggleCols) :?>
				<div class="col px-0">
					<?php echo $this->loadTemplate('togglecols');?>
				</div>
			<?php endif; ?>
			<?php if ($this->canGroupBy) : ?>
				<div class="col px-0">
					<?php
					$displayData = new stdClass;
					$displayData->icon =
FabrikHelperHTML::icon('icon-list-view');
					$displayData->label = Text::_('COM_FABRIK_GROUP_BY');
					$displayData->links = array();
					foreach ($this->groupByHeadings as $url => $obj) :
						$displayData->links[] = '<a  class="nav-link"
data-groupby="' . $obj->group_by . '"
href="' . $url . '">' . $obj->label .
'</a>';
					endforeach;

					$layout =
$this->getModel()->getLayout('fabrik-nav-dropdown');
					echo $layout->render($displayData);
					?>
				</div>
			<?php endif;

			if (($this->showClearFilters && (($this->filterMode === 3
|| $this->filterMode === 4))  || $this->bootShowFilters == false)) :
				$clearFiltersClass = $this->gotOptionalFilters ? "clearFilters
hasFilters" : "clearFilters"; ?>
				<div class="col px-0">
					<a class="btn  <?php echo $clearFiltersClass; ?>"
href="#">
						<?php echo FabrikHelperHTML::icon('icon-undo',
Text::_('COM_FABRIK_CLEAR'));?>
					</a>
				</div>
			<?php endif;

			if ($this->showFilters && $this->toggleFilters) :?>
				<div class="col px-0">
					<?php if ($this->filterMode === 5) :
					?>
						<a href="#filter_modal" data-bs-toggle="modal"
class="btn ">
							<?php echo $this->buttons->filter;?>
							<span><?php echo
Text::_('COM_FABRIK_FILTER');?></span>
						</a>
							<?php
					else:
					?>
					<a href="#" class="toggleFilters btn "
data-filter-mode="<?php echo $this->filterMode;?>">
						<?php echo $this->buttons->filter;?>
						<span><?php echo
Text::_('COM_FABRIK_FILTER');?></span>
					</a>
						<?php endif;
					?>
				</div>

			<?php endif;
			if ($this->advancedSearch !== '') : ?>
				<div class="col px-0">
					<a href="<?php echo $this->advancedSearchURL?>"
class="advanced-search-link btn ">
						<?php echo FabrikHelperHTML::icon('icon-search',
Text::_('COM_FABRIK_ADVANCED_SEARCH'));?>
					</a>
				</div>
			<?php endif;

			if ($this->showCSVImport || $this->showCSV) :?>
			<div class="col px-0" >
				<?php
				$displayData = new stdClass;
				$displayData->icon =
FabrikHelperHTML::icon('icon-upload');
				$displayData->label = Text::_('COM_FABRIK_CSV');
				$displayData->links = array();
				if ($this->showCSVImport) :
					$displayData->links[] = '<a href="' .
$this->csvImportLink . '" class="csvImportButton
nav-link">' .
FabrikHelperHTML::icon('icon-download',
Text::_('COM_FABRIK_IMPORT_FROM_CSV'))  . '</a>';
				endif;
				if ($this->showCSV) :
					$displayData->links[] = '<a href="#"
class="csvExportButton nav-link">' .
FabrikHelperHTML::icon('icon-upload',
Text::_('COM_FABRIK_EXPORT_TO_CSV')) . '</a>';
				endif;
				$layout =
$this->getModel()->getLayout('fabrik-nav-dropdown');
				echo $layout->render($displayData);
				?>
			</div>
			<?php endif;

			if ($this->showRSS) :?>
			<div class="col px-0">
					<a href="<?php echo $this->rssLink;?>"
class="feedButton">
						<div class="row row-cols-auto">
							<div class="col pe-0"><?php echo
FabrikHelperHTML::image('feed.png', 'list',
$this->tmpl);?></div>
							<div class="col ps-1"><?php echo
Text::_('COM_FABRIK_SUBSCRIBE_RSS');?></div>
						</div>
					</a>
			</div>
			<?php
			endif;

			if ($this->showPDF) :?>
				<div class="col px-0">
					<a href="<?php echo $this->pdfLink;?>"
class="pdfButton btn ">
						<?php echo FabrikHelperHTML::icon('icon-file',
Text::_('COM_FABRIK_PDF'));?>
					</a>
				</div>
			<?php endif;

			if ($this->emptyLink) :?>
				<div class="col px-0">
					<a class="doempty btn " href="<?php echo
$this->emptyLink;?>">
						<?php echo FabrikHelperHTML::icon('icon-ban',
Text::_('COM_FABRIK_EMPTY'));?>
					</a>
				</div>
			<?php
			endif;
		?>
		</div>
	</div>

<?php if (array_key_exists('all', $this->filters)) {
?>
	<div class="col-auto align-self-center fabrikSearchAll">
		<div class="row row-cols-auto align-items-end "<?php echo
$this->filter_action != 'onchange' ?
'class="input-append"' : ''?>>
				<?php
				if (array_key_exists('all', $this->filters)) {
					echo $this->filters['all']->element;
					if ($this->filter_action != 'onchange') {
						echo '<input type="button" class="btn btn-info
btn-sm fabrik_filter_submit button" value="' .
Text::_('COM_FABRIK_GO') . '" name="filter"
>';
					};
				}; ?>

		</div>
	</div>
<?php
}
?>
</div>views/list/tmpl/bootstrap/default_headings.php000064400000003532151165347660015665
0ustar00<?php
/**
 * Bootstrap List Template: Default Headings
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
$btnLayout  =
$this->getModel()->getLayout('fabrik-button');
$layoutData = (object) array(
	'class' => 'btn-info btn-sm fabrik_filter_submit
button',
	'name' => 'filter',
	'label' => FabrikHelperHTML::icon('icon-filter',
Text::_('COM_FABRIK_GO'))
);
?>
	<tr class="fabrik___heading">
		<?php foreach ($this->headings as $key => $heading) :
			$h = $this->headingClass[$key];
			$style = empty($h['style']) ? '' :
'style="' . $h['style'] . '"';
?>
			<th class="heading <?php echo $h['class']
?>" <?php echo $style ?>>
				<span><?php echo $heading; ?></span>
			</th>
		<?php endforeach; ?>
	</tr>

<?php if (($this->filterMode === 3 || $this->filterMode === 4)
&& count($this->filters) <> 0) : ?>
	<tr class="fabrikFilterContainer">
		<?php foreach ($this->headings as $key => $heading) :
			$h = $this->headingClass[$key];
			$style = empty($h['style']) ? '' :
'style="' . $h['style'] . '"';
			?>
			<th class="<?php echo $h['class'] ?>"
<?php echo $style ?>>
				<?php
				if (array_key_exists($key, $this->filters)) :

					$filter = $this->filters[$key];
					$required = $filter->required == 1 ? ' notempty' :
'';
					?>
					<div class="listfilter<?php echo $required; ?>
pull-left">
						<?php echo $filter->element; ?>
					</div>
				<?php elseif ($key == 'fabrik_actions' &&
$this->filter_action != 'onchange') :
					?>
					<div style="text-align:center">
						<?php echo $btnLayout->render($layoutData); ?>
					</div>
				<?php endif; ?>
			</th>
		<?php endforeach; ?>
	</tr>
<?php endif;
?>views/list/tmpl/bootstrap/default_pagination.php000064400000007220151165347660016232
0ustar00<?php
/**
 * Fabrik List Template: Admin Bootstrap pagination
 *
 * @package		Joomla.Administrator
 * @subpackage	Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Factory;

/**
 * This is a file to add template specific chrome to pagination rendering.
 *
 * pagination_list_footer
 *	Input variable $list is an array with offsets:
 *		$list[prefix]		: string
 *		$list[limit]		: int
 *		$list[limitstart]	: int
 *		$list[total]		: int
 *		$list[limitfield]	: string
 *		$list[pagescounter]	: string
 *		$list[pageslinks]	: string
 *
 * pagination_list_render
 *	Input variable $list is an array with offsets:
 *		$list[all]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[start]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[previous]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[next]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[end]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[pages]
 *			[{PAGE}][data]		: string
 *			[{PAGE}][active]	: boolean
 *
 * pagination_item_active
 *	Input variable $item is an object with fields:
 *		$item->base	: integer
 *		$item->prefix	: string
 *		$item->link	: string
 *		$item->text	: string
 *
 * pagination_item_inactive
 *	Input variable $item is an object with fields:
 *		$item->base	: integer
 *		$item->prefix	: string
 *		$item->link	: string
 *		$item->text	: string
 *
 * This gives template designers ultimate control over how pagination is
rendered.
 *
 * NOTE: If you override pagination_item_active OR pagination_item_inactive
you MUST override them both
 */
/*
function fabrik_pagination_list_footer($list)
{
	// Initialise variables.
	$lang = Factory::getApplication()->getLanguage();
	$html = "<div class=\"container\"><div
class=\"pagination\">\n";

	$html .= "\n<div class=\"limit\">" .
Text::_('JGLOBAL_DISPLAY_NUM') . $list['limitfield'] .
"</div>";
	$html .= $list['pageslinks'];
	$html .= "\n<div class=\"limit\">" .
$list['pagescounter'] . "</div>";

	$html .= "\n<input type=\"hidden\" name=\"" .
$list['prefix'] . "limitstart\" value=\"" .
$list['limitstart'] . "\" />";
	$html .= "\n</div></div>";

	return $html;
}
 */

/* Commented out because /components/com_fabrik/helpers/pagination.php does
not call this routine
function fabrik_pagination_list_footer($list, $paginator)
{
	// Initialize variables
	$html = array();
	$html[] = '<div class="list-footer">';
	$limitLabel = $paginator->showDisplayNum ?
Text::_('COM_FABRIK_DISPLAY_NUM') : '';
	$html[] = '<div class="limit
input-prepend"><button class="add-on">' .
$limitLabel  . '</button>' . $list['limitfield']
. '</div>';
	$html[] = $list['pageslinks'];
	$html[] = '<div class="counter">' .
$list['pagescounter'] . '</div>';
	$html[] = '<input type="hidden"
name="limitstart' . $paginator->_id . '"
id="limitstart' . $paginator->_id . '"
value="' . $list['limitstart'] . '"
/>';
	$html[] = '</div>';
	return implode("\n", $html);
}
*/

if (!function_exists('fabrik_pagination_item_active'))
{
	function fabrik_pagination_item_active(&$item, $listid)
	{
		switch ($item->key)
		{
			case 'previous':
				$rel = 'rel="prev" ';
				break;
			case 'next':
				$rel = 'rel="next" ';
				break;
			default:
				$rel = '';
		}
		return '<a ' . $rel . 'title="' .
$item->text . '" href="' . $item->link .
'" class="page-link">' . $item->text .
'</a>';
	}
}

if (!function_exists('fabrik_pagination_item_inactive'))
{
	function fabrik_pagination_item_inactive(&$item)
	{
		return '<a href="#"
class="page-link">' . $item->text .
'</a>';
	}
}
views/list/tmpl/bootstrap/default_row.php000064400000001363151165347660014712
0ustar00<?php
/**
 * Fabrik List Template: Admin Row
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

?>
<tr id="<?php echo $this->_row->id;?>"
class="<?php echo $this->_row->class;?>">
	<?php foreach ($this->headings as $heading => $label) {
		$style = empty($this->cellClass[$heading]['style']) ?
'' :
'style="'.$this->cellClass[$heading]['style'].'"';
		?>
		<td class="<?php echo
$this->cellClass[$heading]['class']?>" <?php echo
$style?>>
			<?php echo isset($this->_row->data) ?
$this->_row->data->$heading : '';?>
		</td>
	<?php }?>
</tr>
views/list/tmpl/bootstrap/default_tabs.php000064400000000375151165347660015036
0ustar00<?php

// No direct access
defined('_JEXEC') or die('Restricted access');

if (!empty($this->tabs)) :
?>
<div>
	<?php
	echo
$this->getModel()->getLayout('list.fabrik-list-tabs')->render((object)
array('tabs' => $this->tabs));
	?>
</div>
<?php
endif; ?>
views/list/tmpl/bootstrap/default_togglecols.php000064400000002405151165347700016236
0ustar00<?php
/**
 * Bootstrap List Template - Toggle columns widget
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
?>
<li class="dropdown togglecols">
	<a href="#" class="dropdown-toggle btn"
data-bs-toggle="dropdown" >
		<?php echo FabrikHelperHTML::icon('icon-eye-open',
Text::_('COM_FABRIK_TOGGLE')); ?>
		<b class="caret"></b>
	</a>
	<ul class="dropdown-menu">
	<?php
	$groups = array();

	foreach ($this->toggleCols as $group) :
		?>
		<li>
			<a data-bs-toggle-group="<?php echo
$group['name']?>"
data-bs-toggle-state="open">
				<?php echo FabrikHelperHTML::icon('icon-eye-open'); ?>
				<strong><?php echo
Text::_($group['name']);?></strong>
			</a>
		</li>
		<?php
		foreach ($group['elements'] as $element => $label) :
		?>
		<li>
			<a data-bs-toggle-col="<?php echo $element?>"
data-bs-toggle-parent-group="<?php echo
$group['name']?>"
data-bs-toggle-state="open">
				<?php echo FabrikHelperHTML::icon('icon-eye-open',
Text::_($label)); ?>
			</a>
		</li>
		<?php
		endforeach;

	endforeach;

	?>
	</ul>
</li>
views/list/tmpl/bootstrap/default.php000064400000010321151165347700014010
0ustar00<?php
/**
 * Bootstrap List Template - Default
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

$pageClass = $this->params->get('pageclass_sfx',
'');

if ($pageClass !== '') :
	echo '<div class="' . $pageClass .
'">';
endif;

if ($this->tablePicker != '') : ?>
	<div style="text-align:right"><?php echo
Text::_('COM_FABRIK_LIST') ?>: <?php echo
$this->tablePicker; ?></div>
<?php
endif;

if ($this->params->get('show_page_heading')) :
	echo '<h1>' .
$this->params->get('page_heading') .
'</h1>';
endif;

if ($this->showTitle == 1) : ?>
	<div class="page-header">
		<h1><?php echo $this->table->label;?></h1>
	</div>
<?php
endif;

// Intro outside of form to allow for other lists/forms to be injected.
echo $this->table->intro;

?>
<form class="fabrikForm form-search" action="<?php
echo $this->table->action;?>" method="post"
id="<?php echo $this->formid;?>"
name="fabrikList">
<div class="container-fluid text-bg-light">
	<?php
	if ($this->hasButtons):
		echo $this->loadTemplate('buttons');
	endif;?>

	<?php
	if ($this->showFilters && $this->bootShowFilters) :
		echo $this->layoutFilters();
	endif;
	?>
</div>
<?php	
//for some really ODD reason loading the headings template inside the group
//template causes an error as $this->_path['template']
doesn't contain the correct
// path to this template - go figure!
$headingsHtml = $this->loadTemplate('headings');
echo $this->loadTemplate('tabs');
?>

<div class="fabrikDataContainer table-responsive">

<?php foreach ($this->pluginBeforeList as $c) :
	echo $c;
endforeach;
?>
	<table class="<?php echo $this->list->class;?>"
id="list_<?php echo $this->table->renderid;?>" >
        <colgroup>
            <?php foreach ($this->headings as $key => $heading) :
?>
				<col class="col-<?php echo $key; ?>">
            <?php endforeach; ?>
        </colgroup>
		 <thead><?php echo $headingsHtml?></thead>
		 <tfoot>
			<tr class="fabrik___heading">
				<td colspan="<?php echo
count($this->headings);?>">
					<?php echo $this->nav;?>
				</td>
			</tr>
		 </tfoot>
		<?php
		if ($this->isGrouped && empty($this->rows)) :
			?>
			<tbody style="<?php echo $this->emptyStyle?>">
				<tr class="groupDataMsg">
					<td class="emptyDataMessage" style="<?php echo
$this->emptyStyle?>" colspan="<?php echo
count($this->headings)?>">
						<div class="emptyDataMessage" style="<?php echo
$this->emptyStyle?>">
							<?php echo $this->emptyDataMessage; ?>
						</div>
					</td>
				</tr>
			</tbody>
			<?php
		endif;
		$gCounter = 0;
		foreach ($this->rows as $groupedBy => $group) :
			if ($this->isGrouped) : ?>
			<tbody>
				<tr class="fabrik_groupheading info">
					<td colspan="<?php echo $this->colCount;?>">
						<?php echo $this->layoutGroupHeading($groupedBy, $group); ?>
					</td>
				</tr>
			</tbody>
			<?php endif ?>
			<tbody class="fabrik_groupdata">
				<tr class="groupDataMsg" style="<?php echo
$this->emptyStyle?>">
					<td class="emptyDataMessage" style="<?php echo
$this->emptyStyle?>" colspan="<?php echo
count($this->headings)?>">
						<div class="emptyDataMessage" style="<?php echo
$this->emptyStyle?>">
							<?php echo $this->emptyDataMessage; ?>
						</div>
					</td>
				</tr>
			<?php
			foreach ($group as $this->_row) :
				echo $this->loadTemplate('row');
		 	endforeach
		 	?>
		 	</tbody>
			<?php if ($this->hasCalculations) : ?>
			<tfoot>
				<tr class="fabrik_calculations">

				<?php
				foreach ($this->headings as $key => $heading) :
					$h = $this->headingClass[$key];
					$style = empty($h['style']) ? '' :
'style="' . $h['style'] . '"';?>
					<td class="<?php echo $h['class']?>"
<?php echo $style?>>
						<?php
						$cal = $this->calculations[$key];
						echo array_key_exists($groupedBy, $cal->grouped) ?
$cal->grouped[$groupedBy] : $cal->calc;
						?>
					</td>
				<?php
				endforeach;
				?>

				</tr>
			</tfoot>
			<?php endif ?>
		<?php
		$gCounter++;
		endforeach?>
	</table>
	<?php print_r($this->hiddenFields);?>
</div>
</form>
<?php
echo $this->table->outro;
if ($pageClass !== '') :
	echo '</div>';
endif;
?>
views/list/tmpl/bootstrap/template_css.php000064400000002524151165347700015055
0ustar00<?php
/**
 * Fabrik List Template: Bootstrap
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

header('Content-type: text/css');
$c = $_REQUEST['c'];
//buttonCount = (int) $_REQUEST['buttoncount'];
//$buttonTotal = $buttonCount === 0 ? '100%' : 30 * $buttonCount
."px";
echo "
.fabrikButtonsContainer li.dropdown-item {border-bottom:1px solid
grey;padding: 0.5rem 1rem;}
.fabrikButtonsContainer li.dropdown-item a {text-decoration:none;}

.fabrikButtonsContainer .hasFilters, .fabrikFilterContainer .hasFilters
{color:red;}

.fabrikDataContainer {
	clear:both;
	max-width:100%;}
	
.fabrikDataContainer .table thead th {
white-space: initial;}

ul.fabrikRepeatData {
	list-style: none;
	list-style-position:inside;
	margin: 0;
	padding-left: 0;
}
.fabrikRepeatData > li {
	white-space: nowrap;
	max-width:350px;
	overflow:hidden;
	text-overflow: ellipsis;
}
td.repeat-merge div, td.repeat-reduce div,
td.repeat-merge i, td.repeat-reduce i {
padding: 5px !important;
}

.nav li {
list-style: none;
}

.filtertable_horiz {
	display: inline-block;
	vertical-align: top;
}

.fabrikListFilterCheckbox {
	text-align: left;
}

.fabrikDateListFilterRange {
	text-align: left;
}
/* added for J!4 */
.btn-group {margin:0}
";?>
views/list/tmpl/default.xml000064400000025346151165347700012021
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
    <layout title="List">
        <message>
            <![CDATA[STANDARD Fabrik list layout]]>
        </message>
    </layout>

	<fields name="request">
		<fieldset
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="request">

            <field name="listid"
                   type="fabriktables"
                   label="COM_FABRIK_MENU_LIST_LABEL"
                   description="COM_FABRIK_MENU_LIST_DESC"
            />

        </fieldset>
	</fields>
	<fields
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="params">
        <fieldset name="params"
label="COM_FABRIK_MENU_LIST_OPTIONS">

            <field name="addurl"
                   type="text"
                   class="col-sm-10"
                   size="50"
                   label="COM_FABRIK_FIELD_ADD_URL_LABEL"
                   description="COM_FABRIK_FIELD_ADD_URL_DESC"
            />

            <field name="show-title"
                   type="radio"
                   class="btn-group"
                   default="1"
 				layout="joomla.form.field.radio.switcher"
                  label="COM_FABRIK_SHOW_TITLE_LABEL"
                   description="COM_FABRIK_SHOW_TITLE_DESC"
            >
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>

            <field name="calculations"
                   type="radio"
                   class="btn-group"
                   default="0"
 				layout="joomla.form.field.radio.switcher"
                  label="COM_FABRIK_MENU_LIST_RELOAD_CALCS_LABEL"
                  
description="COM_FABRIK_MENU_LIST_RELOAD_CALCS_DESC"
            >
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>

            <field name="listlayout"
                   type="fabriktemplate"
                   view="list"
                   label="COM_FABRIK_MENU_LIST_TMPL_LABEL"
                   description="COM_FABRIK_MENU_LIST_TMPL_DESC"
            />

            <field name="fabriklayout"
                   type="fabriktemplate"
                   view="form"
                   label="COM_FABRIK_MENU_LIST_FORM_TMPL_LABEL"
                  
description="COM_FABRIK_MENU_LIST_FORM_TMPL_DESC"
            />

            <field name="resetfilters"
                   type="radio"
                   class="btn-group"
                   default="0"
				layout="joomla.form.field.radio.switcher"
                  
description="COM_FABRIK_FIELD_RESET_FILTERS_DESC"
                   label="COM_FABRIK_FIELD_RESET_FILTERS_LABEL"
            >
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>

            <field name="list_elements"
                   type="fabrikmodalrepeat"
                   label="COM_FABRIK_LIST_ELEMENTS_LABEL"
                   description="COM_FABRIK_LIST_ELEMENTS_DESC"
            >
                <fields name="params">
                    <fieldset modal="true"
name="list_elements_modal" repeat="true">
                        <field name="show_in_list"
                               type="listfields"
                               multiple="true"
                              
label="COM_FABRIK_LIST_ELEMENTS_HEADING"
                               size="-9999"
                        />
                    </fieldset>
                </fields>
            </field>

            <field name="prefilters"
                   filter="raw"
                   type="fabrikmodalrepeat"
                   class="prefilters-modal"
                   label="COM_FABRIK_LIST_PREFILTERS_LABEL"
                   description="COM_FABRIK_LIST_PREFILTERS_DESC"
            >
                <fields name="params">
                    <fieldset name="prefilters_modal"
modal="true" repeat="true">

                        <field name="filter-join"
                               type="list"
                               default="OR"
                               label=""
                               size="-9999"
                        >
                            <option
value="AND">AND</option>
                            <option
value="OR">OR</option>
                        </field>

                        <field name="filter-fields"
                               type="listfields"
                               raw="true"
                               valueformat="tableelement"
                              
label="COM_FABRIK_LIST_ELEMENTS_HEADING"
                               size="-9999"
                        />

                        <field name="filter-conditions"
                               type="list"
                              
label="COM_FABRIK_LIST_CONDITION_LABEL"
                               size="-9999"
                        >
                            <option
value="equals">EQUALS</option>
                            <option value="notequals">NOT
EQUAL TO</option>
                            <option value="begins">BEGINS
WITH</option>
                            <option
value="contains">CONTAINS</option>
                            <option value="ends">ENDS
WITH</option>
                            <option
value="greaterthan">GREATER THAN</option>
                            <option
value="greaterthanequals">GREATER THAN OR
EQUALS</option>
                            <option value="lessthan">LESS
THAN</option>
                            <option value="IS NULL">IS
NULL</option>
                            <option
value="lessthanequals">LESS THAN OR EQUALS</option>
                            <option
value="in">IN</option>
                            <option value="not_in">NOT
IN</option>
                            <option
value="thisyear">COM_FABRIK_THIS_YEAR</option>
                            <option
value="earlierthisyear">COM_FABRIK_EARLIER_THIS_YEAR</option>
                            <option
value="laterthisyear">COM_FABRIK_LATER_THIS_YEAR</option>
                            <option
value="yesterday">COM_FABRIK_YESTERDAY</option>
                            <option
value="today">COM_FABRIK_TODAY</option>
                            <option
value="tomorrow">COM_FABRIK_TOMORROW</option>
                            <option
value="thismonth">COM_FABRIK_THIS_MONTH</option>
                            <option
value="lastmonth">COM_FABRIK_LAST_MONTH</option>
                            <option
value="nextmonth">COM_FABRIK_NEXT_MONTH</option>
                            <option
value="nextweek1">COM_FABRIK_NEXT_WEEK1</option>
                            <option
value="birthday">COM_FABRIK_BIRTHDAY_TODAY</option>
                        </field>

                        <field name="filter-value"
                               type="text"
                               filter="raw"
                              
label="COM_FABRIK_LIST_FILTER_VALUE_HEADING"
                        />

                        <field name="filter-eval"
                               type="list"
                               size="-9999"
                               label="COM_FABRIK_TYPE"
                        >
                            <option
value="0">COM_FABRIK_TEXT</option>
                            <option
value="1">COM_FABRIK_EVAL</option>
                            <option
value="2">COM_FABRIK_QUERY</option>
                            <option
value="3">COM_FABRIK_NO_QUOTES</option>
                        </field>

                        <field name="filter-access"
                               type="accesslevel"
                              
label="COM_FABRIK_LIST_FILTER_ACCESS_HEADING"
                               size="-9999"
                        />

                    </fieldset>
                </fields>
            </field>

            <field name="rows_per_page"
                   type="text"
                   default="10"
                   class="col-sm-2"
                   size="5"
                   label="COM_FABRIK_FIELD_ROWS_PER_PAGE_LABEL"
                  
description="COM_FABRIK_FIELD_ROWS_PER_PAGE_DESC"
            />

            <field name="popup_width"
                   type="text"
                   default="340"
                   class="col-sm-2"
                   size="5"
                   label="COM_FABRIK_MENU_CSV_POPUP_WIDTH_LABEL"
                  
description="COM_FABRIK_MENU_CSV_POPUP_WIDTH_DESC"
            />

            <field name="popup_opts_width"
                   type="text"
                   default="200"
                   class="col-sm-2"
                   size="5"
                  
label="COM_FABRIK_MENU_CSV_POPUP_OPTS_WIDTH_LABEL"
                  
description="COM_FABRIK_MENU_CSV_POPUP_OPTS_WIDTH_DESC"
            />

            <field name="csv_import_extensions"
                   type="text"
                   class="col-sm-6"
                   size="20"
                   default="txt,csv,tsv"
                  
label="COM_FABRIK_FIELD_CSV_IMPORT_EXTENSIONS_LABEL"
                  
description="COM_FABRIK_FIELD_CSV_IMPORT_EXTENSIONS_DESC"
            />

            <field name="csv_import_sil_only"
                   type="radio"
                   class="btn-group"
                   default="0"
				layout="joomla.form.field.radio.switcher"
                  
description="COM_FABRIK_FIELD_CSV_IMPORT_SIL_ONLY_DESC"
                  
label="COM_FABRIK_FIELD_CSV_IMPORT_SIL_ONLY_LABEL"
            >
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>

            <field name="csv_import_dropdata"
                   type="radio"
                   class="btn-group"
                   default="0"
 				layout="joomla.form.field.radio.switcher"
                 
description="COM_FABRIK_FIELD_CSV_IMPORT_DROPDATA_DESC"
                  
label="COM_FABRIK_FIELD_CSV_IMPORT_DROPDATA_LABEL"
            >
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>


            <field name="csv_import_overwrite"
                   type="radio"
                   class="btn-group"
                   default="0"
 				layout="joomla.form.field.radio.switcher"
                 
description="COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_DESC"
                  
label="COM_FABRIK_FIELD_CSV_IMPORT_OVERWRITE_LABEL"
            >
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>

            <field name="list_extra_query_string"
                   type="text"
                   class="col-sm-10"
                   size="40"
                  
label="COM_FABRIK_FIELD_EXTRA_QUERY_STRING_LABEL"
                  
description="COM_FABRIK_FIELD_EXTRA_QUERY_STRING_DESC"
            />
        </fieldset>
    </fields>
</metadata>views/list/tmpl/div/default_buttons.php000064400000012214151165347700014336
0ustar00<?php
/**
 * Div List Template - Buttons
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2023  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

?>
<div class="row justify-content-between pb-3 pe-3">

	<div class=" col-auto fabrikButtonsContainer">
		<div class="row row-cols-auto align-items-start">
			<?php if ($this->showAdd) :?>
				<div class="col px-0">
					<a class="addbutton addRecord btn " href="<?php
echo $this->addRecordLink;?>">
						<?php echo FabrikHelperHTML::icon('icon-plus',
$this->addLabel);?>
					</a>
				</div>
			<?php endif; ?>
			<?php if ($this->showToggleCols) :?>
				<div class="col px-0">
					<?php echo $this->loadTemplate('togglecols');?>
				</div>
			<?php endif; ?>
			<?php if ($this->canGroupBy) : ?>
				<div class="col px-0">
					<?php
					$displayData = new stdClass;
					$displayData->icon =
FabrikHelperHTML::icon('icon-list-view');
					$displayData->label = Text::_('COM_FABRIK_GROUP_BY');
					$displayData->links = array();
					foreach ($this->groupByHeadings as $url => $obj) :
						$displayData->links[] = '<a  class="nav-link"
data-groupby="' . $obj->group_by . '"
href="' . $url . '">' . $obj->label .
'</a>';
					endforeach;

					$layout =
$this->getModel()->getLayout('fabrik-nav-dropdown');
					echo $layout->render($displayData);
					?>
				</div>
			<?php endif;

			if (($this->showClearFilters && (($this->filterMode === 3
|| $this->filterMode === 4))  || $this->bootShowFilters == false)) :
				$clearFiltersClass = $this->gotOptionalFilters ? "clearFilters
hasFilters" : "clearFilters"; ?>
				<div class="col px-0">
					<a class="btn  <?php echo $clearFiltersClass; ?>"
href="#">
						<?php echo FabrikHelperHTML::icon('icon-undo',
Text::_('COM_FABRIK_CLEAR'));?>
					</a>
				</div>
			<?php endif;

			if ($this->showFilters && $this->toggleFilters) :?>
				<div class="col px-0">
					<?php if ($this->filterMode === 5) :
					?>
						<a href="#filter_modal" data-bs-toggle="modal"
class="btn ">
							<?php echo $this->buttons->filter;?>
							<span><?php echo
Text::_('COM_FABRIK_FILTER');?></span>
						</a>
							<?php
					else:
					?>
					<a href="#" class="toggleFilters btn "
data-filter-mode="<?php echo $this->filterMode;?>">
						<?php echo $this->buttons->filter;?>
						<span><?php echo
Text::_('COM_FABRIK_FILTER');?></span>
					</a>
						<?php endif;
					?>
				</div>

			<?php endif;
			if ($this->advancedSearch !== '') : ?>
				<div class="col px-0">
					<a href="<?php echo $this->advancedSearchURL?>"
class="advanced-search-link btn ">
						<?php echo FabrikHelperHTML::icon('icon-search',
Text::_('COM_FABRIK_ADVANCED_SEARCH'));?>
					</a>
				</div>
			<?php endif;

			if ($this->showCSVImport || $this->showCSV) :?>
			<div class="col px-0" >
				<?php
				$displayData = new stdClass;
				$displayData->icon =
FabrikHelperHTML::icon('icon-upload');
				$displayData->label = Text::_('COM_FABRIK_CSV');
				$displayData->links = array();
				if ($this->showCSVImport) :
					$displayData->links[] = '<a href="' .
$this->csvImportLink . '" class="csvImportButton
nav-link">' .
FabrikHelperHTML::icon('icon-download',
Text::_('COM_FABRIK_IMPORT_FROM_CSV'))  . '</a>';
				endif;
				if ($this->showCSV) :
					$displayData->links[] = '<a href="#"
class="csvExportButton nav-link">' .
FabrikHelperHTML::icon('icon-upload',
Text::_('COM_FABRIK_EXPORT_TO_CSV')) . '</a>';
				endif;
				$layout =
$this->getModel()->getLayout('fabrik-nav-dropdown');
				echo $layout->render($displayData);
				?>
			</div>
			<?php endif;

			if ($this->showRSS) :?>
			<div class="col px-0">
					<a href="<?php echo $this->rssLink;?>"
class="feedButton">
						<div class="row row-cols-auto">
							<div class="col pe-0"><?php echo
FabrikHelperHTML::image('feed.png', 'list',
$this->tmpl);?></div>
							<div class="col ps-1"><?php echo
Text::_('COM_FABRIK_SUBSCRIBE_RSS');?></div>
						</div>
					</a>
			</div>
			<?php
			endif;

			if ($this->showPDF) :?>
				<div class="col px-0">
					<a href="<?php echo $this->pdfLink;?>"
class="pdfButton btn ">
						<?php echo FabrikHelperHTML::icon('icon-file',
Text::_('COM_FABRIK_PDF'));?>
					</a>
				</div>
			<?php endif;

			if ($this->emptyLink) :?>
				<div class="col px-0">
					<a class="doempty btn " href="<?php echo
$this->emptyLink;?>">
						<?php echo FabrikHelperHTML::icon('icon-ban',
Text::_('COM_FABRIK_EMPTY'));?>
					</a>
				</div>
			<?php
			endif;
		?>
		</div>
	</div>

<?php if (array_key_exists('all', $this->filters)) {
?>
	<div class="col-auto align-self-center fabrikSearchAll">
		<div class="row row-cols-auto align-items-end "<?php echo
$this->filter_action != 'onchange' ?
'class="input-append"' : ''?>>
				<?php
				if (array_key_exists('all', $this->filters)) {
					echo $this->filters['all']->element;
					if ($this->filter_action != 'onchange') {
						echo '<input type="button" class="btn btn-info
btn-sm fabrik_filter_submit button" value="' .
Text::_('COM_FABRIK_GO') . '" name="filter"
>';
					};
				}; ?>

		</div>
	</div>
<?php
}
?>
</div>views/list/tmpl/div/default_empty_row.php000064400000001635151165347700014672
0ustar00<?php
/**
 * Fabrik List Empty Row Template: Div
 *
 * This template is needed in order to wrap the Bootstrap grid wrapper
around a row template, for use by the
 * list JS when handling AJAX refreshes that start with an empty list.  You
shouldn't need to modify this for
 * your custom div templates, EXCEPT to set $columns to the same as your
default_row.php.
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

// The number of columns to split the list rows into
$columns = 3;

$items = array();

$items[] = $this->loadTemplate('row');

$class = 'fabrik_row';
$grid = FabrikHelperHTML::bootstrapGrid($items, $columns, $class, false,
'');
array_pop($grid);
array_shift($grid);

echo implode("\n", $grid);

?>
views/list/tmpl/div/default_pagination.php000064400000007220151165347700014772
0ustar00<?php
/**
 * Fabrik List Template: Admin Bootstrap pagination
 *
 * @package		Joomla.Administrator
 * @subpackage	Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Factory;

/**
 * This is a file to add template specific chrome to pagination rendering.
 *
 * pagination_list_footer
 *	Input variable $list is an array with offsets:
 *		$list[prefix]		: string
 *		$list[limit]		: int
 *		$list[limitstart]	: int
 *		$list[total]		: int
 *		$list[limitfield]	: string
 *		$list[pagescounter]	: string
 *		$list[pageslinks]	: string
 *
 * pagination_list_render
 *	Input variable $list is an array with offsets:
 *		$list[all]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[start]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[previous]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[next]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[end]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[pages]
 *			[{PAGE}][data]		: string
 *			[{PAGE}][active]	: boolean
 *
 * pagination_item_active
 *	Input variable $item is an object with fields:
 *		$item->base	: integer
 *		$item->prefix	: string
 *		$item->link	: string
 *		$item->text	: string
 *
 * pagination_item_inactive
 *	Input variable $item is an object with fields:
 *		$item->base	: integer
 *		$item->prefix	: string
 *		$item->link	: string
 *		$item->text	: string
 *
 * This gives template designers ultimate control over how pagination is
rendered.
 *
 * NOTE: If you override pagination_item_active OR pagination_item_inactive
you MUST override them both
 */
/*
function fabrik_pagination_list_footer($list)
{
	// Initialise variables.
	$lang = Factory::getApplication()->getLanguage();
	$html = "<div class=\"container\"><div
class=\"pagination\">\n";

	$html .= "\n<div class=\"limit\">" .
Text::_('JGLOBAL_DISPLAY_NUM') . $list['limitfield'] .
"</div>";
	$html .= $list['pageslinks'];
	$html .= "\n<div class=\"limit\">" .
$list['pagescounter'] . "</div>";

	$html .= "\n<input type=\"hidden\" name=\"" .
$list['prefix'] . "limitstart\" value=\"" .
$list['limitstart'] . "\" />";
	$html .= "\n</div></div>";

	return $html;
}
 */

/* Commented out because /components/com_fabrik/helpers/pagination.php does
not call this routine
function fabrik_pagination_list_footer($list, $paginator)
{
	// Initialize variables
	$html = array();
	$html[] = '<div class="list-footer">';
	$limitLabel = $paginator->showDisplayNum ?
Text::_('COM_FABRIK_DISPLAY_NUM') : '';
	$html[] = '<div class="limit
input-prepend"><button class="add-on">' .
$limitLabel  . '</button>' . $list['limitfield']
. '</div>';
	$html[] = $list['pageslinks'];
	$html[] = '<div class="counter">' .
$list['pagescounter'] . '</div>';
	$html[] = '<input type="hidden"
name="limitstart' . $paginator->_id . '"
id="limitstart' . $paginator->_id . '"
value="' . $list['limitstart'] . '"
/>';
	$html[] = '</div>';
	return implode("\n", $html);
}
*/

if (!function_exists('fabrik_pagination_item_active'))
{
	function fabrik_pagination_item_active(&$item, $listid)
	{
		switch ($item->key)
		{
			case 'previous':
				$rel = 'rel="prev" ';
				break;
			case 'next':
				$rel = 'rel="next" ';
				break;
			default:
				$rel = '';
		}
		return '<a ' . $rel . 'title="' .
$item->text . '" href="' . $item->link .
'" class="page-link">' . $item->text .
'</a>';
	}
}

if (!function_exists('fabrik_pagination_item_inactive'))
{
	function fabrik_pagination_item_inactive(&$item)
	{
		return '<a href="#"
class="page-link">' . $item->text .
'</a>';
	}
}
views/list/tmpl/div/default_row.php000064400000002635151165347700013455
0ustar00<?php
/**
 * Fabrik List Template: Div Row
 * Note the div cell container is now generated in the default template
 * in FabrikHelperHTML::bootstrapGrid();
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

$rowClass = isset($this->_row->rowClass) ?
$this->_row->rowClass : '';
?>
<div class="fabrik_divrow <?php echo $rowClass; ?>" >
<?php foreach ($this->headings as $heading => $label) :
	$d = @$this->_row->data->$heading;
	
	//skip empty elements but don't skip the checkbox (delete, list
plugins)
	if (isset($this->showEmpty) && $this->showEmpty === false
&& trim(strip_tags($d)) == '' && $heading !=
'fabrik_select') :
		continue;
	endif;
	$h = $this->headingClass[$heading];
	$c = $this->cellClass[$heading];
	$hStyle = empty($h['style']) ? '' :
'style="' . $h['style'] . '"';
	$cStyle = empty($c['style']) ? '' :
'style="'. $c['style'].'"';
	?>
    <div class="fabrikDivElement">
		<?php if (isset($this->showLabels) && $this->showLabels
&& $heading != 'fabrik_select' && $heading !=
'fabrik_actions') :
			echo '<span class="muted " ' . $hStyle .
'>' . $label . ': </span>';
		endif; ?>

		<?php echo '<span class="' . $c['class'] .
'" ' . $cStyle . '>' . $d .
'</span>'; ?>
	</div>
	<?php
endforeach;
?>
</div>
views/list/tmpl/div/default_togglecols.php000064400000002404151165347700015002
0ustar00<?php
/**
 * Bootstrap Div Template - Toggle columns widget
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2023  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.1
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
?>
<li class="dropdown togglecols">
	<a href="#" class="dropdown-toggle btn"
data-bs-toggle="dropdown" >
		<?php echo FabrikHelperHTML::icon('icon-eye-open',
Text::_('COM_FABRIK_TOGGLE')); ?>
		<b class="caret"></b>
	</a>
	<ul class="dropdown-menu">
	<?php
	$groups = array();

	foreach ($this->toggleCols as $group) :
		?>
		<li>
			<a data-bs-toggle-group="<?php echo
$group['name']?>"
data-bs-toggle-state="open">
				<?php echo FabrikHelperHTML::icon('icon-eye-open'); ?>
				<strong><?php echo
Text::_($group['name']);?></strong>
			</a>
		</li>
		<?php
		foreach ($group['elements'] as $element => $label) :
		?>
		<li>
			<a data-bs-toggle-col="<?php echo $element?>"
data-bs-toggle-parent-group="<?php echo
$group['name']?>"
data-bs-toggle-state="open">
				<?php echo FabrikHelperHTML::icon('icon-eye-open',
Text::_($label)); ?>
			</a>
		</li>
		<?php
		endforeach;

	endforeach;

	?>
	</ul>
</li>
views/list/tmpl/div/default.php000064400000005153151165347700012564
0ustar00<?php
/**
 * Fabrik List Template: Div
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;

// The number of columns to split the list rows into
$columns = 3;

// Show the labels next to the data:
$this->showLabels = false;

// Show empty data
$this->showEmpty = true;


$pageClass = $this->params->get('pageclass_sfx',
'');

if ($pageClass !== '') :
	echo '<div class="' . $pageClass .
'">';
endif;

?>
<?php if ($this->tablePicker != '') { ?>
	<div style="text-align:right"><?php echo
Text::_('COM_FABRIK_LIST') ?>: <?php echo
$this->tablePicker; ?></div>
<?php }

if ($this->params->get('show_page_heading')) :
	echo '<h1>' .
$this->params->get('page_heading') .
'</h1>';
endif;

if ($this->showTitle == 1) { ?>
	<h1><?php echo $this->table->label;?></h1>
<?php }?>

<?php echo $this->table->intro;?>
<form class="fabrikForm" action="<?php echo
$this->table->action;?>" method="post"
id="<?php echo $this->formid;?>"
name="fabrikList">

<?php
if ($this->hasButtons):
	echo $this->loadTemplate('buttons');
endif;

if ($this->showFilters) {
	echo $this->layoutFilters();
}
?>

<div class="fabrikDataContainer" data-cols="<?php echo
$columns;?>">

<?php foreach ($this->pluginBeforeList as $c) {
	echo $c;
}?>
<div class="fabrikList <?php echo
$this->list->class;?>" id="list_<?php echo
$this->table->renderid;?>" >

	<?php
	$gCounter = 0;
	foreach ($this->rows as $groupedBy => $group) :?>
	<?php
	if ($this->isGrouped) :
		$imgProps = array('alt' =>
Text::_('COM_FABRIK_TOGGLE'), 'data-role' =>
'toggle', 'data-expand-icon' => 'fa
fa-arrow-down', 'data-collapse-icon' => 'fa
fa-arrow-right');
	?>
	<div class="fabrik_groupheading">
		<?php echo $this->layoutGroupHeading($groupedBy, $group); ?>
	</div>
	<?php
	endif;
	?>
	<div class="fabrik_groupdata">
		<div class="groupDataMsg">
			<div class="emptyDataMessage" style="<?php echo
$this->emptyStyle?>">
				<?php echo $this->emptyDataMessage; ?>
			</div>
		</div>

	<?php

	$items = array();
	
	foreach ($group as $this->_row) :
		$item = new stdClass;
		$item->rowdata = $this->loadTemplate('row');
		$item->spanId = $this->_row->id;
		$items[] = $item;
	endforeach;
	$class = 'fabrik_row ';
	echo FabrikHelperHTML::bootstrapGrid($items, $columns, $class, true,
'');

	?>
	</div>
	<?php
	endforeach;
?>

</div>
<?php
echo $this->nav;
print_r($this->hiddenFields);?>
</div>

</form>
<?php
echo $this->table->outro;

if ($pageClass !== '') :
	echo '</div>';
endif;
?>
views/list/tmpl/div/javascript.js000064400000001377151165347700013137
0ustar00/**
 * List helper
 *
 * @copyright: Copyright (C) 2005-2016  Media A-Team, Inc. - All rights
reserved.
 * @license:   GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

window.addEvent('fabrik.loaded', function() {
	Array.mfrom($$('.fabrikList tr')).each(function(r){
		document.id(r).addEvent('mouseover', function(e){
			if (r.hasClass('oddRow0') || r.hasClass('oddRow1')){
				r.addClass('fabrikHover');
			}
		}, r);

		document.id(r).addEvent('mouseout', function(e){
			r.removeClass('fabrikHover');
		}, r);

		document.id(r).addEvent('click', function(e){
			if (r.hasClass('oddRow0') || r.hasClass('oddRow1')){
				$$('.fabrikList tr').each(function(rx){
					rx.removeClass('fabrikRowClick');
				});
				r.addClass('fabrikRowClick');
			}
		}, r);
	});
})
views/list/tmpl/div/template_css.php000064400000002671151165347700013625
0ustar00<?php
/**
 * Fabrik List Template: Div CSS (including CSS for format=pdf)
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2023  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

header('Content-type: text/css');
$c = $_REQUEST['c'];

$pdf_format = array_key_exists("format",$_REQUEST)?
$_REQUEST['format']=='pdf' : false;
echo "
.fabrikButtonsContainer .hasFilters, .fabrikFilterContainer .hasFilters
{color:red;}
ul.fabrikRepeatData {
	list-style: none;
	list-style-position:inside;
	margin: 0;
	padding-left: 0;
}

/** Hide the checkbox in each record*/

#listform_$c .fabrikList .fabrik_select {
	display: none;
}

#listform_$c .row	{margin-bottom:1em;}
#listform_$c .fabrik_divrow {position: relative;height: 100%;}
#listform_$c .table-bordered .fabrik_divrow {    border: solid 1px;padding:
5px;}

/*action buttons as dropown*/
#listform_$c .fabrik_action {
	position: absolute;
	top: 10px;
	right: 10px;
}

";
//For (dom)pdf set flex to inline-block
if ($pdf_format) echo "
#listform_$c .row {position:relative;display:block;    page-break-inside:
avoid}
#listform_$c .fabrik_row
{display:inline-block;position:relative;vertical-align:top;}
#listform_$c .fabrik_divrow {height:auto;}
#listform_$c .col-sm-2 {width:16%}
#listform_$c .col-sm-3 {width:24%}
#listform_$c .col-sm-4 {width:32%}
#listform_$c .col-sm-6 {width:48%}
#listform_$c .col-sm-12 {width:96%}
";?>
views/list/view.base.php000064400000105755151165347700011276
0ustar00<?php
/**
 * Base List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Filesystem\File;
use Joomla\Registry\Registry;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.view');

/**
 * Base List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewListBase extends FabrikView
{
	/**
	 * @var Registry
	 */
	public $params;

	public $isMambot = null;

	/**
	 * Build CSV export options and JS code
	 *
	 * @param $opts
	 * @param $model
	 */
	protected function csvJS(&$opts, $model)
	{
		$params                = $model->getParams();
		$w                     = new FabrikWorker;
		$opts->csvChoose       = (bool)
$params->get('csv_frontend_selection');
		$csvOpts               = new stdClass;
		$csvOpts->excel        = (int)
$params->get('csv_format');
		$csvOpts->inctabledata = (int)
$params->get('csv_include_data');
		$csvOpts->incraw       = (int)
$params->get('csv_include_raw_data');
		$csvOpts->inccalcs     = (int)
$params->get('csv_include_calculations');
		$csvOpts->custom_qs    = $params->get('csv_custom_qs',
'');

		$itemId = FabrikWorker::itemId();
		$exportUrl = 'index.php?option=com_' . $this->package .
'&view=list&listid=' . $this->getModel()->getId();

		if (!empty($itemId))
		{
			$exportUrl .= '&Itemid=' . $itemId;
		}

		$exportUrl .= '&format=csv';
		$csvOpts->exportLink   = Route::_($exportUrl, false);

		$w->replaceRequest($csvOpts->custom_qs);
		$csvOpts->incfilters   = (int)
$params->get('incfilters');
		$csvOpts->popupwidth   =
FabrikWorker::getMenuOrRequestVar('popup_width','340',false,'menu');
		$csvOpts->optswidth    =
FabrikWorker::getMenuOrRequestVar('popup_opts_width','200',false,'menu');
		$opts->csvOpts         = $csvOpts;
		$opts->csvFields       = $model->getCsvFields();
		$modalOpts             = array(
			'content' => '',
			'id' => 'ajax_links',
			'title' => 'Export csv jlayout',
			'modal' => true,
			'expandable' => false
		);

		if ($opts->csvChoose)
		{
			$modalOpts['footer'] = 'export';
			$layout              = $model->getLayout('fabrik-button');
			$layoutData          = (object) array(
				'name' => 'submit',
				'class' => 'exportCSVButton btn-primary',
				'label' => Text::_('COM_FABRIK_EXPORT')
			);

			$modalOpts['footer'] = $layout->render($layoutData);
		}

		FabrikHelperHTML::jLayoutJs('exportcsv',
'fabrik-modal', (object) $modalOpts);
	}

	/**
	 * Get JS objects
	 *
	 * @param   array $data list data
	 *
	 * @return  void
	 */
	protected function getManagementJS($data = array())
	{
		$input  = $this->app->getInput();
		$itemId = FabrikWorker::itemId();

		/** @var FabrikFEModelList $model */
		$model              = $this->getModel();
		$params             = $model->getParams();
		$item               = $model->getTable();
		$listRef            = $model->getRenderContext();
		$listId             = $model->getId();
		$formModel          = $model->getFormModel();
		$elementsNotInTable = $formModel->getElementsNotInTable();
		$toggleCols         = (bool) $params->get('toggle_cols',
false);
		$ajax               = (int) $model->isAjax();
		$ajaxLinks          = (bool) $params->get('list_ajax_links',
$ajax);
		$opts               = new stdClass;
		$pluginManager      = FabrikWorker::getPluginManager();

		if ($ajaxLinks)
		{
			$modalTitle = 'test';

			$modalOpts = array(
				'content' => '',
				'id' => 'ajax_links',
				'title' => Text::_($modalTitle),
				'modal' => false,
				'expandable' => true
			);
			FabrikHelperHTML::jLayoutJs('ajax_links',
'fabrik-modal', (object) $modalOpts);
		}

		// Advanced search

		if ($params->get('advanced-filter'))
		{
			$modalOpts = array(
				'content' => '',
				'id' => 'advanced-filter',
				'title' =>
Text::_('COM_FABRIK_FIELD_ADVANCED_SEARCH_LABEL'),
				'modal' => false,
				'expandable' => true
			);
			FabrikHelperHTML::jLayoutJs('advanced-filter',
'fabrik-modal', (object) $modalOpts);
		}

		FabrikHelperHTML::jLayoutJs('modal-state-label',
'list.fabrik-filters-modal-state-label', $layoutData = (object)
array(
			'label' => '',
			'displayValue' => '',
			'key' => ''
		));

		$this->csvJS($opts, $model);

		if ($model->requiresSlimbox())
		{
			FabrikHelperHTML::slimbox();
		}

		if ($model->requiresSlideshow())
		{
			FabrikHelperHTML::slideshow();
		}

		$src  = FabrikHelperHTML::framework();
		$shim = array();

		$dep                 = new stdClass;
		$dep->deps           = array();
		$shim['fab/list']    = $dep;
		$src['FbList']       =
FabrikHelperHTML::mediaFile('list.js');
		$src['FbListFilter'] =
FabrikHelperHTML::mediaFile('listfilter.js');
		$src['ListPlugin']   =
FabrikHelperHTML::mediaFile('list-plugin.js');
		$src                 = $model->getPluginJsClasses($src, $shim);

		$pluginManager->runPlugins('loadJavascriptClassName',
$model, 'list');

		$pluginManager->data = array_filter($pluginManager->data, function
($v)
		{
			return $v !== '';
		});

		$model->getCustomJsAction($src);

		$tmpl       = $model->getTmpl();
		$this->tmpl = $tmpl;

		$model->getListCss();

		// Check for a custom js file and include it if it exists
		$aJsPath = JPATH_SITE .
'/components/com_fabrik/views/list/tmpl/' . $tmpl .
'/javascript.js';

		if (File::exists($aJsPath))
		{
			$src['CustomJs'] =
'components/com_fabrik/views/list/tmpl/' . $tmpl .
'/javascript.js';
		}

		$origRows   = $this->rows;
		$this->rows = array(array());

		$tmpItemid = !isset($itemId) ? 0 : $itemId;

		$this->_row       = new stdClass;
		$script           = array();
		$params           = $model->getParams();
		$opts->admin      =
$this->app->isClient('administrator');
		$opts->ajax       = $ajax;
		$opts->ajax_links = $ajaxLinks;

		$opts->links           = array('detail' =>
$params->get('detailurl', ''), 'edit'
=> $params->get('editurl', ''), 'add'
=> $params->get('addurl', ''));
		$opts->filterMethod    = $this->filter_action;
		$opts->advancedFilters = $model->getAdvancedFilterValues();
		$opts->resetFilters    = (bool)
FabrikWorker::getMenuOrRequestVar('resetfilters', 0, false,
'request');
		$opts->form            = 'listform_' . $listRef;
		$this->listref         = $listRef;
		$opts->headings        = $model->jsonHeadings();
		$labels                = $this->headings;

		foreach ($labels as &$l)
		{
			$l = strip_tags($l);
		}

		$opts->labels         = $labels;
		$opts->primaryKey     = $item->db_primary_key;
		$opts->Itemid         = $tmpItemid;
		$opts->listRef        = $listRef;
		$opts->formid         = $model->getFormModel()->getId();
		$opts->canEdit        = $model->canEdit() ? '1' :
'0';
		$opts->canView        = $model->canView() ? '1' :
'0';
		$opts->page           = Route::_('index.php');
		$opts->isGrouped      = $this->isGrouped;
		$opts->toggleCols     = $toggleCols;
//		$opts->j3             = FabrikWorker::j3();
		$opts->j3             = true;
		$opts->singleOrdering = (bool) $model->singleOrdering();

		// Reset data back to original settings
		$this->rows = $origRows;

		$formEls = array();

		foreach ($elementsNotInTable as $tmpElement)
		{
			$oo        = new stdClass;
			$oo->name  = $tmpElement->name;
			$oo->label = $tmpElement->label;
			$formEls[] = $oo;
		}

		$opts->formels             = $formEls;
		$opts->fabrik_show_in_list =
$input->get('fabrik_show_in_list', array(),
'array');
		$opts->popup_width         = $params->get('popup_width',
'');
		$opts->popup_height        = $params->get('popup_height',
'');
		$xOffset                   = $params->get('popup_offset_x',
'');
		$yOffset                   = $params->get('popup_offset_y',
'');

		if ($xOffset !== '')
		{
			$opts->popup_offset_x = (int) $xOffset;
		}

		if ($yOffset !== '')
		{
			$opts->popup_offset_y = (int) $yOffset;
		}

		/**
		 * Added the $nodata object as we now weed something to pass in just to
keep editLabel
		 * and viewLabel happy, after adding placeholder replacement to the
labels for a Pro user,
		 * because the tooltips said we did that, which we never actually did.
		 *
		 *
http://fabrikar.com/forums/index.php?threads/placeholders-in-list-links-and-labels.37726/#post-191081
		 *
		 * However, this means that using placeholders will yield funky labels
for the popups, as
		 * this isn't per row.  So we may need to not use editLabel /
viewLabel here any more,
		 * and just use the default COM_FABRIK_VIEW/EDIT.  Or add YAFO's,
::sigh::.
		 *
		 * But for now, it's too corner case to worry about!
		 */
		$nodata                            = new stdClass();
		$opts->popup_edit_label            = $model->editLabel($nodata);
		$opts->popup_view_label            = $model->viewLabel($nodata);
		$opts->popup_add_label             = $model->addLabel();
		$opts->limitLength                 = $model->limitLength;
		$opts->limitStart                  = $model->limitStart;
		$opts->tmpl                        = $tmpl;
		$opts->data                        = $data;
		$opts->groupByOpts                 = new stdClass;
		$opts->groupByOpts->isGrouped      = (bool) $this->isGrouped;
		$opts->groupByOpts->collapseOthers = (bool)
$params->get('group_by_collapse_others', false);
		$opts->groupByOpts->startCollapsed = (bool)
$input->get('start_collapsed',
$params->get('group_by_start_collapsed', false));
//		$opts->groupByOpts->bootstrap      = FabrikWorker::j3();
		$opts->groupByOpts->bootstrap      = true;

		// If table data starts as empty then we need the html from the row
		// template otherwise we can't add a row to the table
		ob_start();
		$this->_row        = new stdClass;
		$this->_row->id    = '';
		$this->_row->class = 'fabrik_row';

		// nasty hack for div templates
		if (File::exists(JPATH_ROOT .
'/components/com_fabrik/views/list/tmpl/' . $tmpl .
'/default_empty_row.php'))
		{
			echo $this->loadTemplate('empty_row');
		}
		else
		{
			echo $this->loadTemplate('row');
		}

		$opts->itemTemplate = ob_get_contents();
		ob_end_clean();

		// $$$rob if you are loading a table in a window from a form db join
select record option
		// then we want to know the id of the window so we can set its
showSpinner() method
		$opts->winid = $input->get('winid', '');

		$this->jsText();

		$script[] = "window.addEvent('domready', function ()
{";
		$script[] = "\tvar list = new FbList('$listId',";
		$script[] = "\t" . json_encode($opts);
		$script[] = "\t);";
		$script[] = "\tFabrik.addBlock('list_{$listRef}',
list);";

		// Add in plugin objects
		$pluginManager->runPlugins('onLoadJavascriptInstance',
$model, 'list');
		$aObjs = $pluginManager->data;

		if (!empty($aObjs))
		{
			$script[] = "list.addPlugins([\n";
			$script[] = "\t" . implode(",\n  ", $aObjs);
			$script[] = "]);";
		}

		// @since 3.0 inserts content before the start of the list render
(currently on f3 tmpl only)
		$pluginManager->runPlugins('onGetContentBeforeList', $model,
'list');
		$this->pluginBeforeList = $pluginManager->data;
		$script[]               = $model->filterJs;
		$script[]               = $this->getModel()->getElementJs($src);

		// End domready wrapper
		$script[] = '})';
		$script   = implode("\n", $script);

		FabrikHelperHTML::iniRequireJS($shim);
		FabrikHelperHTML::script($src, $script);
	}

	private function jsText()
	{
		Text::script('COM_FABRIK_PREV');
		Text::script('COM_FABRIK_SELECT_ROWS_FOR_DELETION');
		Text::script('JYES');
		Text::script('JNO');
		Text::script('COM_FABRIK_SELECT_COLUMNS_TO_EXPORT');
		Text::script('COM_FABRIK_INCLUDE_FILTERS');
		Text::script('COM_FABRIK_INCLUDE_DATA');
		Text::script('COM_FABRIK_INCLUDE_RAW_DATA');
		Text::script('COM_FABRIK_INCLUDE_CALCULATIONS');
		Text::script('COM_FABRIK_EXPORT');
		Text::script('COM_FABRIK_START');
		Text::script('COM_FABRIK_NEXT');
		Text::script('COM_FABRIK_END');
		Text::script('COM_FABRIK_PAGE');
		Text::script('COM_FABRIK_OF');
		Text::script('COM_FABRIK_LOADING');
		Text::script('COM_FABRIK_RECORDS');
		Text::script('COM_FABRIK_SAVING_TO');
		Text::script('COM_FABRIK_CONFIRM_DROP');
		Text::script('COM_FABRIK_CONFIRM_DELETE_1');
		Text::script('COM_FABRIK_NO_RECORDS');
		Text::script('COM_FABRIK_CSV_COMPLETE');
		Text::script('COM_FABRIK_CSV_DOWNLOAD_HERE');
		Text::script('COM_FABRIK_CONFIRM_DELETE');
		Text::script('COM_FABRIK_CSV_DOWNLOADING');
		Text::script('COM_FABRIK_FILE_TYPE');
		Text::script('COM_FABRIK_ADVANCED_SEARCH');
		Text::script('COM_FABRIK_FORM_FIELDS');
		Text::script('COM_FABRIK_VIEW');

		// Keyboard short cuts
		Text::script('COM_FABRIK_LIST_SHORTCUTS_ADD');
		Text::script('COM_FABRIK_LIST_SHORTCUTS_EDIT');
		Text::script('COM_FABRIK_LIST_SHORTCUTS_DELETE');
		Text::script('COM_FABRIK_LIST_SHORTCUTS_FILTER');
	}

	/**
	 * Display the template
	 *
	 * @param   sting $tpl template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		if ($this->getLayout() == '_advancedsearch')
		{
			$this->advancedSearch($tpl);

			return;
		}

		$fbConfig = ComponentHelper::getParams('com_fabrik');
		$profiler = Profiler::getInstance('Application');
		$input    = $this->app->getInput();
		$itemId   = FabrikWorker::itemId();

		/** @var FabrikFEModelList $model */
		$model = $this->getModel();

        if (!$this->access($model))
        {
            return false;
        }

		// Force front end templates
		$tmpl            = $model->getTmpl();
		$this->_basePath = COM_FABRIK_FRONTEND . '/views';
//		$jTmplFolder     = FabrikWorker::j3() ? 'tmpl' :
'tmpl25';
		$jTmplFolder     = 'tmpl';
		$this->addTemplatePath($this->_basePath . '/' .
$this->_name . '/' . $jTmplFolder . '/' . $tmpl);

		$root = $this->app->isClient('administrator') ?
JPATH_ADMINISTRATOR : JPATH_SITE;
		$this->addTemplatePath($root . '/templates/' .
$this->app->getTemplate() . '/html/com_fabrik/list/' .
$tmpl);
		$item = $model->getTable();
		$data = $model->render();
		$w    = new FabrikWorker;

		// Add in some styling short cuts
		$c    = 0;
		$form = $model->getFormModel();
		$nav  = $model->getPagination();

		foreach ($data as $groupk => $group)
		{
			$num_rows = 1;

			foreach (array_keys($group) as $i)
			{
				$o = new stdClass;

				// $$$ rob moved merge wip code to FabrikModelTable::formatForJoins() -
should contain fix for pagination
				$o->data           = $data[$groupk][$i];
				$o->cursor         = $num_rows + $nav->limitstart;
				$o->total          = $nav->total;
				$o->id             = 'list_' .
$model->getRenderContext() . '_row_' .
@$o->data->__pk_val;
				$o->class          = 'fabrik_row oddRow' . $c;
				$data[$groupk][$i] = $o;
				$c                 = 1 - $c;
				$num_rows++;
			}
		}

		$groups = $form->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elementModel->setContext($groupModel, $form, $model);
				$elementModel->setRowClass($data);
			}
		}

		$this->rows = $data;
		reset($this->rows);

		// Cant use numeric key '0' as group by uses grouped name as
key
		$firstRow                   = current($this->rows);
		$this->requiredFiltersFound = $model->getRequiredFiltersFound();
		$this->advancedSearch       = $model->getAdvancedSearchLink();
		$this->advancedSearchURL    = $model->getAdvancedSearchURL();
		$this->nodata               = (empty($this->rows) ||
(count($this->rows) == 1 && empty($firstRow)) ||
!$this->requiredFiltersFound) ? true : false;
		$this->tableStyle           = $this->nodata ?
'display:none' : '';
		$this->emptyStyle           = $this->nodata ? '' :
'display:none';
		$params                     = $model->getParams();

		if (!class_exists('\Joomla\CMS\Application\SiteApplication'))
//should never be the case
		{
			require_once JPATH_ROOT . '/includes/app.php';
		}

		$this->setTitle($w, $params, $model);

		// Deprecated (keep in case people use them in old templates)
		$this->table                = new stdClass;
		$this->table->label         =
FabrikString::translate($w->parseMessageForPlaceHolder($item->label,
$_REQUEST));
		$this->table->intro         =
$params->get('show_intro', 1) == 0 ? '' :
FabrikString::translate($w->parseMessageForPlaceHolder($item->introduction));
		$this->table->outro         =
$params->get('show_outro', 1) == 0 ? '' :
FabrikString::translate($w->parseMessageForPlaceHolder($params->get('outro')));
		$this->table->id            = $item->id;
		$this->table->renderid      = $model->getRenderContext();
		$this->table->db_table_name = $item->db_table_name;

		// End deprecated
		$this->list           = $this->table;
		$this->list->class    = $model->htmlClass();
		$this->group_by       = $item->group_by;
		$this->form           = new stdClass;
		$this->form->id       = $item->form_id;
		$this->renderContext  = $model->getRenderContext();
		$this->formid         = 'listform_' .
$this->renderContext;
		$form                 = $model->getFormModel();
		$this->table->action  = $model->getTableAction();
		$this->showCSV        = $model->canCSVExport();
		$this->showCSVImport  = $model->canCSVImport();
		$this->toggleCols     = $model->toggleCols();
		$this->showToggleCols = (bool)
$params->get('toggle_cols', false);
		$this->canGroupBy     = $model->canGroupBy();
		$this->navigation     = $nav;
		$this->nav            =
$nav->getListFooter($this->renderContext, $model->getTmpl());
		$this->nav            = '<div
class="fabrikNav">' . $this->nav .
'</div>';
		$this->fabrik_userid  = $this->user->get('id');
		$this->canDelete      = $model->deletePossible() ? true : false;
		$this->limitLength    = $model->limitLength;
		$this->ajax           = $model->isAjax();
		$this->showTitle      =
FabrikWorker::getMenuOrRequestVar('show-title',
$params->get('show-title', 1), $this->isMambot,
'request');

		// 3.0 observed in list.js & html moved into fabrik_actions rollover
		$this->showPDF = $params->get('pdf',
$fbConfig->get('list_pdf', false));

		if ($this->showPDF)
		{
			$this->showPdf = FabrikWorker::canPdf(false);
		}

		$this->emptyLink     = $model->canEmpty() ? '#' :
'';

		if ($this->showCSVImport)
		{
			$this->csvImportLink = 'index.php?option=com_' .
$this->package .
'&view=import&filetype=csv&listid=' . $item->id;
			$this->csvImportLink .= empty($itemId) ? '' :
'&Itemid=' . $itemId;
			$this->csvImportLink = Route::_($this->csvImportLink);
		}
		else
		{
			$this->csvImportLink = '';
		}

		$this->showAdd       = $model->canAdd();

		if ($this->showAdd)
		{
			if ($params->get('show-table-add', 1))
			{
				$this->addRecordLink = $model->getAddRecordLink();
			}
			else
			{
				$this->showAdd = false;
			}
		}

		$this->addLabel = $model->addLabel();
		$this->addIcon  = $model->addIcon();
		$this->showRSS  = $params->get('rss', 0) == 0 ? 0 : 1;

		if ($this->showRSS)
		{
			$this->rssLink = $model->getRSSFeedLink();

			if ($this->rssLink != '' &&
$this->app->getInput()->get('format') ===
'html')
			{
				$attribs = array('type' =>
'application/rss+xml', 'title' => 'RSS
2.0');
				$this->doc->addHeadLink($this->rssLink, 'alternate',
'rel', $attribs);
			}
		}

		if ($this->app->isClient('administrator'))
		{
			// Admin always uses com_fabrik option
			$this->pdfLink =
Route::_('index.php?option=com_fabrik&task=list.view&listid='
. $item->id . '&format=pdf&tmpl=component');
		}
		else
		{
			$pdfLink = 'index.php?option=com_' . $this->package .
'&Itemid=' . $itemId .
'&view=list&format=pdf&listid=' . $item->id;

			if (!$this->nodata)
			{
				// If some data is shown then ensure that menu links reset filters
(combined with require filters) doesn't produce an empty data set for
the pdf
				$pdfLink .= '&resetfilters=0';
			}

			if ($this->app->getInput()->get('group_by',
'') !== '')
            {
                $pdfLink .= '&group_by=' .
$this->app->getInput()->get('group_by', '');
            }

            // Add the listref so we get the right filters if doing PDF
from a module or content plugin
            $pdfLink .=
'&setListRefFromRequest=1&listref=' .
$model->getRenderContext();
			$this->pdfLink = Route::_($pdfLink);
		}

		list($this->headings, $groupHeadings, $this->headingClass,
$this->cellClass) = $model->getHeadings();

		$this->groupByHeadings = $model->getGroupByHeadings();
		$this->filter_action   = $model->getFilterAction();
		JDEBUG ? $profiler->mark('fabrik getfilters start') : null;
		$this->filters = $model->getFilters('listform_' .
$this->renderContext);
		$this->filterMode       = (int)
$params->get('show-table-filters');
		$fKeys                 = array_keys($this->filters);

		$this->bootShowFilters = (count($fKeys) === 1 && $fKeys[0] ===
'all') || $this->filterMode === 0 ? false : true;

		$this->clearFliterLink = $model->getClearButton();
		JDEBUG ? $profiler->mark('fabrik getfilters end') : null;
		
		$this->toggleFilters    = in_array($this->filterMode, array(2, 4,
5));
		$this->showFilters      = $model->getShowFilters();
		$this->filterCols       = (int)
$params->get('list_filter_cols', '1');
		$this->showClearFilters = ($this->showFilters ||
$params->get('advanced-filter')) ? true : false;

		$this->emptyDataMessage = $model->getEmptyDataMsg();
		$this->groupheadings    = $groupHeadings;
		$this->calculations     =
$this->_getCalculations($this->headings);
		$this->isGrouped        = !($model->getGroupBy() == '');
		$this->colCount         = count($this->headings);

		$this->hasButtons     = $model->getHasButtons();
		$this->grouptemplates = $model->groupTemplates;
		$this->grouptemplatesExtra = $model->groupTemplatesExtra;
		$this->gotOptionalFilters = $model->gotOptionalFilters();
		$this->params         = $params;
		$this->loadTemplateBottom();
		$this->getManagementJS($this->rows);

		// Get dropdown list of other tables for quick nav in admin
		$this->tablePicker = $params->get('show-table-picker',
$input->get('list-picker', true)) &&
$this->app->isClient('administrator') &&
$this->app->getInput()->get('format') !==
'pdf' ? FabrikHelperHTML::tableList($this->table->id) :
'';

		$this->buttons();
		$this->pluginTopButtons = $model->getPluginTopButtons();
	}

	/**
	 * Model check for publish/access
	 *
	 * @param   JModel $model List model
	 *
	 * @return boolean
	 */
	protected function access($model)
	{
		if (!$model->canPublish())
		{
			echo Text::_('COM_FABRIK_LIST_NOT_PUBLISHED');

			return false;
		}

		if (!$model->canView())
		{
			echo Text::_('JERROR_ALERTNOAUTHOR');

			return false;
		}

		return true;
	}

	/**
	 * Set page title
	 *
	 * @param   FabrikWorker $w       Fabrik worker
	 * @param   object       &$params List params
	 * @param   object       $model   List model
	 *
	 * @return  void
	 */
	protected function setTitle($w, &$params, $model)
	{
		$input = $this->app->getInput();
		$menus = $this->app->getMenu();
		$menu  = $menus->getActive();

		/**
		 * Because the application sets a default page title, we need to get it
		 * right from the menu item itself
		 * if there is a menu item available AND the form is not rendered in a
content plugin or module
		 */
		if (is_object($menu) && !$this->isMambot)
		{
			$menu_params = new Registry((string) $menu->getParams());
			$params->set('page_heading',
Text::_($menu_params->get('page_heading')));
			$params->set('show_page_heading',
$menu_params->get('show_page_heading'));
			$params->set('pageclass_sfx',
$menu_params->get('pageclass_sfx'));
			$params->set('page_title',
Text::_($menu_params->get('page_title', $menu->title)));
		}
		else
		{
			$params->set('show_page_heading',
$input->getInt('show_page_heading', 0));
			$params->set('page_heading',
Text::_($input->get('title', '',
'string')));
		}

		$params->set('show-title',
$input->getInt('show-title',
$params->get('show-title')));
		$title = $params->get('page_title');

		if (empty($title))
		{
			$title = $this->app->get('sitename');
		}

		if (!$this->isMambot)
		{
			$this->doc->setTitle($w->parseMessageForPlaceHolder($title,
$_REQUEST, false));
		}
	}

	/**
	 * Actually load the template and echo the view html
	 * will process jplugins if required.
	 *
	 * @return  void
	 */
	protected function output()
	{
		$profiler = Profiler::getInstance('Application');
		$text     = $this->loadTemplate();
		JDEBUG ? $profiler->mark('template loaded') : null;
		$model  = $this->getModel();
		$params = $model->getParams();

		if ($params->get('process-jplugins'))
		{
			$cloak = $params->get('cloak_emails', '0') ===
'1' &&
$this->app->getInput()->get('format') !==
'pdf';
			FabrikHelperHTML::runContentPlugins($text, $cloak);
		}

		JDEBUG ? $profiler->mark('end fabrik display') : null;

		// $$$ rob 09/06/2011 no need for isMambot test? should use ob_start() in
module / plugin to capture the output
		echo $text;
	}

	/**
	 * Build an object with the button icons based on the current tmpl
	 *
	 * @return  void
	 */
	protected function buttons()
	{
		$model                     = $this->getModel();
		$this->buttons             = new stdClass;
		$buttonProperties          = array('class' =>
'fabrikTip', 'opts' =>
'{"notice":true}',
			'title' => '<span>' .
Text::_('COM_FABRIK_EXPORT_TO_CSV') . '</span>');
		$buttonProperties['alt']   =
Text::_('COM_FABRIK_EXPORT_TO_CSV');
		$this->buttons->csvexport  =
FabrikHelperHTML::image('csv-export.png', 'list',
$this->tmpl, $buttonProperties);
		$buttonProperties['title'] = '<span>' .
Text::_('COM_FABRIK_IMPORT_FROM_CSV') .
'</span>';
		$buttonProperties['alt']   =
Text::_('COM_FABRIK_IMPORT_TO_CSV');
		$this->buttons->csvimport  =
FabrikHelperHTML::image('csv-import.png', 'list',
$this->tmpl, $buttonProperties);
		$buttonProperties['title'] = '<span>' .
Text::_('COM_FABRIK_SUBSCRIBE_RSS') . '</span>';
		$buttonProperties['alt']   =
Text::_('COM_FABRIK_SUBSCRIBE_RSS');
		$this->buttons->feed       =
FabrikHelperHTML::image('feed.png', 'list',
$this->tmpl, $buttonProperties);
		$buttonProperties['title'] = '<span>' .
Text::_('COM_FABRIK_EMPTY') . '</span>';
		$buttonProperties['alt']   =
Text::_('COM_FABRIK_EMPTY');
		$this->buttons->empty      =
FabrikHelperHTML::image('trash.png', 'list',
$this->tmpl, $buttonProperties);

		$buttonProperties['title'] = '<span>' .
Text::_('COM_FABRIK_GROUP_BY') . '</span>';
		$buttonProperties['alt']   =
Text::_('COM_FABRIK_GROUP_BY');
		$this->buttons->groupby    =
FabrikHelperHTML::image('list-view', 'list',
$this->tmpl, $buttonProperties);

		unset($buttonProperties['title']);
		$buttonProperties['alt'] =
Text::_('COM_FABRIK_FILTER');
		$this->buttons->filter   =
FabrikHelperHTML::image('filter', 'list',
$this->tmpl, $buttonProperties);

		$addLabel                  = $model->addLabel();
		$buttonProperties['title'] = '<span>' .
$addLabel . '</span>';
		$buttonProperties['alt']   = $addLabel;
		$this->buttons->add        =
FabrikHelperHTML::image('plus-sign.png', 'list',
$this->tmpl, $buttonProperties);

		$buttonProperties['title'] = '<span>' .
Text::_('COM_FABRIK_PDF') . '</span>';
		$buttonProperties['alt']   =
Text::_('COM_FABRIK_PDF');
		$this->buttons->pdf        =
FabrikHelperHTML::image('pdf.png', 'list',
$this->tmpl, $buttonProperties);
	}

	/**
	 * Get the list calculations
	 *
	 * @param   array $aCols Columns
	 *
	 * @return  array
	 */
	protected function _getCalculations($aCols)
	{
		$aData     = array();
		$found     = false;
		$model     = $this->getModel();
		$modelCals = $model->getCalculations();

		foreach ($aCols as $key => $val)
		{
			$calc            = '';
			$res             = '';
			$oCalcs          = new stdClass;
			$oCalcs->grouped = array();

			if (array_key_exists($key, $modelCals['sums']))
			{
				$found = true;
				$res   = $modelCals['sums'][$key];
				$calc .= $res;
				$tmpKey          = str_replace('.', '___', $key) .
'_calc_sum';
				$oCalcs->$tmpKey = $res;
			}

			if (array_key_exists($key . '_obj',
$modelCals['sums']))
			{
				$found = true;
				$res   = $modelCals['sums'][$key . '_obj'];

				foreach ($res as $k => $v)
				{
					if ($k != 'calc')
					{
						if (!array_key_exists($k, $oCalcs->grouped))
						{
							$oCalcs->grouped[$k] = '';
						}

						$oCalcs->grouped[$k] .= '<span
class="calclabel">' . $v->calLabel .
':</span> ' . $v->value . '<br />';
					}
				}
			}

			if (array_key_exists($key, $modelCals['avgs']))
			{
				$found = true;
				$res   = $modelCals['avgs'][$key];
				$calc .= $res;
				$tmpKey          = str_replace('.', '___', $key) .
'_calc_average';
				$oCalcs->$tmpKey = $res;
			}

			if (array_key_exists($key . '_obj',
$modelCals['avgs']))
			{
				$found = true;
				$res   = $modelCals['avgs'][$key . '_obj'];

				foreach ($res as $k => $v)
				{
					if ($k != 'calc')
					{
						if (!array_key_exists($k, $oCalcs->grouped))
						{
							$oCalcs->grouped[$k] = '';
						}

						$oCalcs->grouped[$k] .= '<span
class="calclabel">' . $v->calLabel .
':</span> ' . $v->value . '<br />';
					}
				}
			}

			if (array_key_exists($key . '_obj',
$modelCals['medians']))
			{
				$found = true;
				$res   = $modelCals['medians'][$key . '_obj'];

				foreach ($res as $k => $v)
				{
					if ($k != 'calc')
					{
						if (!array_key_exists($k, $oCalcs->grouped))
						{
							$oCalcs->grouped[$k] = '';
						}

						$oCalcs->grouped[$k] .= '<span
class="calclabel">' . $v->calLabel .
':</span> ' . $v->value . '<br />';
					}
				}
			}

			if (array_key_exists($key, $modelCals['medians']))
			{
				$found = true;
				$res   = $modelCals['medians'][$key];
				$calc .= $res;
				$tmpKey          = str_replace('.', '___', $key) .
"_calc_median";
				$oCalcs->$tmpKey = $res;
			}

			if (array_key_exists($key . '_obj',
$modelCals['count']))
			{
				$found = true;
				$res   = $modelCals['count'][$key . '_obj'];

				foreach ($res as $k => $v)
				{
					if ($k != 'calc')
					{
						if (!array_key_exists($k, $oCalcs->grouped))
						{
							$oCalcs->grouped[$k] = '';
						}

						$oCalcs->grouped[$k] .= '<span
class="calclabel">' . $v->calLabel .
':</span> ' . $v->value . '<br />';
					}
				}
			}

			if (array_key_exists($key, $modelCals['count']))
			{
				$res = $modelCals['count'][$key];
				$calc .= $res;
				$tmpKey          = str_replace('.', '___', $key) .
"_calc_count";
				$oCalcs->$tmpKey = $res;
				$found           = true;
			}

			if (array_key_exists($key . '_obj',
$modelCals['custom_calc']))
			{
				$found = true;
				$res   = $modelCals['custom_calc'][$key . '_obj'];

				foreach ($res as $k => $v)
				{
					if ($k != 'calc')
					{
						if (!array_key_exists($k, $oCalcs->grouped))
						{
							$oCalcs->grouped[$k] = '';
						}

						$oCalcs->grouped[$k] .= '<span
class="calclabel">' . $v->calLabel .
':</span> ' . $v->value . '<br />';
					}
				}
			}

			if (array_key_exists($key, $modelCals['custom_calc']))
			{
				$res = $modelCals['custom_calc'][$key];
				$calc .= $res;
				$tmpKey          = str_replace('.', '___', $key) .
"_calc_custom_calc";
				$oCalcs->$tmpKey = $res;
				$found           = true;
			}

			$key          = str_replace('.', '___', $key);
			$oCalcs->calc = $calc;
			$aData[$key]  = $oCalcs;
		}

		$this->hasCalculations = $found;

		return $aData;
	}

	/**
	 * Get the table's forms hidden fields
	 *
	 * @return  string  hidden fields
	 */
	protected function loadTemplateBottom()
	{
		$input  = $this->app->getInput();
		$itemId = FabrikWorker::itemId();
		$model  = $this->getModel();
		$item   = $model->getTable();

		$reffer             = str_replace('&',
'&amp;', $input->server->get('REQUEST_URI',
'', 'string'));
		$reffer             = FabrikString::removeQSVar($reffer,
'fabrik_incsessionfilters');
		$this->hiddenFields = array();

		// $$$ rob 15/12/2011 - if in com_content then doing this means you cant
delete rows
		$this->hiddenFields[] = '<input type="hidden"
name="option" value="' .
$input->get('option', 'com_fabrik') . '"
/>';

		// $$$ rob 28/12/2011 but when using com_content as a value you cant
filter!
		// $this->hiddenFields[] = '<input type="hidden"
name="option" value="com_fabrik" />';
		$this->hiddenFields[] = '<input type="hidden"
name="orderdir" value="' .
$input->get('orderdir') . '" />';
		$this->hiddenFields[] = '<input type="hidden"
name="orderby" value="' .
$input->get('orderby') . '" />';

		// $$$ rob if the content plugin has temporarily set the view to list
then get view from origview var, if that doesn't exist
		// revert to view var. Used when showing table in article/blog layouts
		$view                 = $input->get('origview',
$input->get('view', 'list'));
		$this->hiddenFields[] = '<input type="hidden"
name="view" value="' . $view . '"
/>';
		$this->hiddenFields[] = '<input type="hidden"
name="listid" value="' . $item->id .
'"/>';
		$this->hiddenFields[] = '<input type="hidden"
name="listref" value="' . $this->renderContext .
'"/>';
		$this->hiddenFields[] = '<input type="hidden"
name="Itemid" value="' . $itemId .
'"/>';

		// Removed in favour of using list_{id}_limit dropdown box
		$this->hiddenFields[] = '<input type="hidden"
name="fabrik_referrer" value="' . $reffer .
'" />';
		$this->hiddenFields[] = HTMLHelper::_('form.token');
		$this->hiddenFields[] = '<input type="hidden"
name="format" value="html" />';

		// $packageId = $input->getInt('packageId', 0);
		// $$$ rob testing for ajax table in module
		$packageId            = $model->packageId;
		$this->hiddenFields[] = '<input type="hidden"
name="packageId" value="' . $packageId . '"
/>';

		if ($this->app->isClient('administrator'))
		{
			$this->hiddenFields[] = '<input type="hidden"
name="task" value="list.view" />';
		}
		else
		{
			$this->hiddenFields[] = '<input type="hidden"
name="task" value="" />';
		}

		$this->hiddenFields[] = '<input type="hidden"
name="fabrik_listplugin_name" value="" />';
		$this->hiddenFields[] = '<input type="hidden"
name="fabrik_listplugin_renderOrder" value=""
/>';

		// $$$ hugh - added this so plugins have somewhere to stuff any random
data they need during submit
		$this->hiddenFields[] = '<input type="hidden"
name="fabrik_listplugin_options" value="" />';
		$this->hiddenFields[] = '<input type="hidden"
name="incfilters" value="1" />';

		// $$$ hugh - testing social profile hash stuff
		if ($input->get('fabrik_social_profile_hash', '')
!= '')
		{
			$this->hiddenFields[] = '<input type="hidden"
name="fabrik_social_profile_hash" value="' .
$input->get('fabrik_social_profile_hash', '',
'string')
				. '" />';
		}

		$this->hiddenFields = implode("\n", $this->hiddenFields);
	}

	/**
	 * Set the advanced search template
	 *
	 * @param   string $tpl template
	 *
	 * @return  void
	 */
	protected function advancedSearch($tpl)
	{
		$input      = $this->app->getInput();
		$model      = $this->getModel();
		$id         = $model->getState('list.id');
		$this->tmpl = $model->getTmpl();
		$model->setRenderContext($id);
		$this->listref = $model->getRenderContext();

		// Advanced search script loaded in list view - avoids timing issues with
i.e. loading the ajax content and script
		$this->rows   = $model->getAdvancedSearchRows();
		$action       = $input->server->get('HTTP_REFERER',
'index.php?option=com_' . $this->package, 'string');
		$this->action = $action;
		$this->listid = $id;
	}

	/**
	 * Get the canonical link
	 *
	 * @return  string
	 */
	public function getCanonicalLink()
	{
		$url = '';

		if (!$this->app->isClient('administrator') &&
!$this->isMambot)
		{
			$model = $this->getModel();
			$id    = $model->getId();
			$itemId = FabrikWorker::itemId();
            $url    = 'index.php?option=com_fabrik' .
'&view=list&listid=' . $id;
            if (!empty($itemId))
            {
                $url .= '&Itemid=' . $itemId;
            }
       }
        return Route::_($url,true,Route::TLS_IGNORE,true);
	}

}
views/list/view.csv.php000064400000006700151165347700011145
0ustar00<?php
/**
 * CSV Fabrik List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Factory;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * CSV Fabrik List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse;
automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 */
	public function display($tpl = null)
	{
		$input = $this->app->getInput();
		$input->set('fabrik_storesessionfilters', false);

		/** @var FabrikFEModelCSVExport $exporter */
		$exporter =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Csvexport',
'FabrikFEModel');

		/** @var FabrikFEModelList $model */
		$model =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('List',
'FabrikFEModel');
		$model->setId($input->getInt('listid'));

		if (!parent::access($model))
		{
			exit;
		}

		$model->setOutPutFormat('csv');
		$exporter->model = $model;
		$input->set('limitstart' . $model->getId(),
$input->getInt('start', 0));
		$limit = $exporter->getStep();
		$input->set('limit' . $model->getId(), $limit);

		// $$$ rob moved here from csvimport::getHeadings as we need to do this
before we get
		// the list total
		$selectedFields = $input->get('fields', array(),
'array');
		$model->setHeadingsForCSV($selectedFields);

		if (empty($model->asfields))
		{
			throw new LengthException('CSV Export - no fields found',
500);
		}

		$request = $model->getRequestData();
		$model->storeRequestData($request);

		$key = 'fabrik.list.' . $model->getId() .
'csv.total';
		$start = $input->getInt('start', 0);

		// If we are asking for a new export - clear previous total as list may
be filtered differently
		if ($start === 0)
		{
			$this->session->clear($key);
		}

		if (!$this->session->has($key))
		{
			// Only get the total if not set - otherwise causes memory issues when
we downloading
			$total = $model->getTotalRecords();
			$this->session->set($key, $total);
		}
		else
		{
			$total = $this->session->get($key);
		}

		if ((int) $total === 0)
		{
			$notice = new stdClass;
			$notice->err = Text::_('COM_FABRIK_CSV_EXPORT_NO_RECORDS');
			echo json_encode($notice);

			return;
		}

		if ($start < $total)
		{
			$download = (bool) $input->getInt('download', true);
			$canDownload = ($start + $limit >= $total) && $download;
			$exporter->writeFile($total, $canDownload);

			if ($canDownload)
			{
				$this->download($model, $exporter, $key);
			}
		}
		else
		{
			$this->download($model, $exporter, $key);
		}

		return;
	}

	/**
     * Start the download process
     *
	 * @param   FabrikFEModelList       $model
	 * @param   FabrikFEModelCSVExport  $exporter
	 * @param   string                  $key
	 *
	 * @throws Exception
	 */
	protected function download($model, $exporter, $key)
	{
		$input = $this->app->getInput();
		$input->set('limitstart' . $model->getId(), 0);

		// Remove the total from the session
		$this->session->clear($key);
		$exporter->downloadFile();
	}
}
views/list/view.fabrikfeed.php000064400000024461151165347700012440
0ustar00<?php
/**
 * PDF Fabrik List view class, including closures
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Router\Route;
use \Joomla\Registry\Registry;
use Joomla\String\StringHelper;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * PDF Fabrik List view class, including closures
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */

class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Display the Feed
	 *
	 * @param   sting  $tpl  template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		$input = $this->app->getInput();
		$itemId = FabrikWorker::itemId();
		$model = $this->getModel();
		$model->setOutPutFormat('feed');

		$this->app->allowCache(true);

		if (!parent::access($model))
		{
			exit;
		}

		$this->doc->_itemTags = array();

		// $$$ hugh - modified this so you can enable QS filters on RSS links
		// by setting &incfilters=1
		$input->set('incfilters',
$input->getInt('incfilters', 0));
		$table = $model->getTable();
		$model->render();
		$params = $model->getParams();

		if ($params->get('rss') == '0')
		{
			return '';
		}

		$formModel = $model->getFormModel();
		$form = $formModel->getForm();
		$aJoinsToThisKey = $model->getJoinsToThisKey();

		// Get headings
		$aTableHeadings = array();
		$groupModels = $formModel->getGroupsHiarachy();
		$titleEl = $params->get('feed_title');
		$dateEl = (int) $params->get('feed_date');

		//$imageEl = $formModel->getElement($imageEl, true);
		$titleEl = $formModel->getElement($titleEl, true);
		$dateEl = $formModel->getElement($dateEl, true);
		$titleElName = $titleEl === false ? '' :
$titleEl->getFullName(true, false);
		$dateElName = $dateEl === false ? '' :
$dateEl->getFullName(true, false);
		$dateElNameRaw = $dateElName . '_raw';

		foreach ($groupModels as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$element = $elementModel->getElement();
				$elParams = $elementModel->getParams();

				if ($elParams->get('show_in_rss_feed') == '1')
				{
					$heading = $element->label;

					if ($elParams->get('show_label_in_rss_feed') ==
'1')
					{
						$aTableHeadings[$heading]['label'] = $heading;
					}
					else
					{
						$aTableHeadings[$heading]['label'] = '';
					}

					$aTableHeadings[$heading]['colName'] =
$elementModel->getFullName();
					$aTableHeadings[$heading]['dbField'] = $element->name;

					// $$$ hugh - adding enclosure stuff for podcasting
					if ($element->plugin == 'fileupload' ||
$elParams->get('use_as_rss_enclosure', '0') ==
'1')
					{
						$aTableHeadings[$heading]['enclosure'] = true;
					}
					else
					{
						$aTableHeadings[$heading]['enclosure'] = false;
					}
				}
			}
		}

		foreach ($aJoinsToThisKey as $element)
		{
			$element = $elementModel->getElement();
			$elParams = new Registry($element->attribs);

			if ($elParams->get('show_in_rss_feed') == '1')
			{
				$heading = $element->label;

				if ($elParams->get('show_label_in_rss_feed') ==
'1')
				{
					$aTableHeadings[$heading]['label'] = $heading;
				}
				else
				{
					$aTableHeadings[$heading]['label'] = '';
				}

				$aTableHeadings[$heading]['colName'] =
$element->db_table_name . "___" . $element->name;
				$aTableHeadings[$heading]['dbField'] = $element->name;

				// $$$ hugh - adding enclosure stuff for podcasting
				if ($element->plugin == 'fileupload' ||
$elParams->get('use_as_rss_enclosure', '0') ==
'1')
				{
					$aTableHeadings[$heading]['enclosure'] = true;
				}
				else
				{
					$aTableHeadings[$heading]['enclosure'] = false;
				}
			}
		}

		$w = new FabrikWorker;
		$rows = $model->getData();

		$this->doc->title =
htmlspecialchars($w->parseMessageForPlaceHolder($table->label,
$_REQUEST), ENT_COMPAT, 'UTF-8');
		$this->doc->description =
htmlspecialchars(trim(strip_tags($w->parseMessageForPlaceHolder($table->introduction,
$_REQUEST))));
		$this->doc->link = Route::_('index.php?option=com_' .
$this->package . '&view=list&listid=' . $table->id
. '&Itemid=' . $itemId);

		$this->addImage($params);

		// Check for a custom css file and include it if it exists
		$tmpl = $input->get('layout', $table->template);
		$cssPath = COM_FABRIK_FRONTEND . 'views/list/tmpl/' . $tmpl .
'/feed.css';

		if (file_exists($cssPath))
		{
			$this->doc->addStyleSheet(COM_FABRIK_LIVESITE .
'components/com_fabrik/views/list/tmpl/' . $tmpl .
'/feed.css');
		}

		$view = $model->canEdit() ? 'form' : 'details';

		// List of tags to look for in the row data
		// If they are there don't put them in the desc but put them in as a
separate item param
		$rssTags = array(
				'<georss:point>' =>
'xmlns:georss="http://www.georss.org/georss"'
		);

		foreach ($rows as $group)
		{
			foreach ($group as $row)
			{
				// Get the content
				$str2 = '';
				$str = '';
				$tStart = '<table
style="margin-top:10px;padding-top:10px;">';
				$title = '';
				$item = new JFabrikFeedItem;
				$enclosures = array();

				foreach ($aTableHeadings as $heading => $dbColName)
				{
					if ($dbColName['enclosure'])
					{
						// $$$ hugh - diddling around trying to add enclosures
						$colName = $dbColName['colName'] . '_raw';
						$enclosureUrl = $row->$colName;

						if (!empty($enclosureUrl))
						{
							$remoteFile = false;

							// Element value should either be a full path, or relative to J!
base
							if (strstr($enclosureUrl, 'http://') &&
!strstr($enclosureUrl, COM_FABRIK_LIVESITE))
							{
								$enclosureFile = $enclosureUrl;
								$remoteFile = true;
							}
							elseif (strstr($enclosureUrl, COM_FABRIK_LIVESITE))
							{
								$enclosureFile = str_replace(COM_FABRIK_LIVESITE, COM_FABRIK_BASE,
$enclosureUrl);
							}
							elseif (preg_match('#^' . COM_FABRIK_BASE . "#",
$enclosureUrl))
							{
								$enclosureFile = $enclosureUrl;
								$enclosureUrl = str_replace(COM_FABRIK_BASE, '',
$enclosureUrl);
							}
							else
							{
								$enclosureUrl = ltrim($enclosureUrl, '/\\');
								$enclosureFile = COM_FABRIK_BASE . $enclosureUrl;
								$enclosureUrl = COM_FABRIK_LIVESITE . str_replace('\\',
'/', $enclosureUrl);
							}

							if ($remoteFile || (file_exists($enclosureFile) &&
!is_dir($enclosureFile)))
							{
								$enclosureType = '';

								if ($enclosureType =
FabrikWorker::getPodcastMimeType($enclosureFile))
								{
									$enclosure_size = $this->get_filesize($enclosureFile,
$remoteFile);
									$enclosures[] = array(
											'url' => $enclosureUrl,
											'length' => $enclosure_size,
											'type' => $enclosureType
									);
									/**
									 * No need to insert the URL in the description, as feed readers
should
									 * automagically show 'media' when they see an
'enclosure', so just move on ..
									 */
									continue;
								}
							}
						}
					}

					if ($title == '')
					{
						// Set a default title
						$title = $row->{$dbColName['colName']};
					}

					// Rob - was stripping tags - but aren't they valid in the
content?
					$rssContent = $row->{$dbColName['colName']};
					$found = false;

					foreach ($rssTags as $rssTag => $namespace)
					{
						if (strstr($rssContent, $rssTag))
						{
							$found = true;
							$rssTag = StringHelper::substr($rssTag, 1,
StringHelper::strlen($rssTag) - 2);

							if (!strstr($this->doc->_namespace, $namespace))
							{
								$this->doc->_itemTags[] = $rssTag;
								$this->doc->_namespace .= $namespace . " ";
							}

							break;
						}
					}

					if ($found)
					{
						$item->{$rssTag} = $rssContent;
					}
					else
					{
						if ($dbColName['label'] == '')
						{
							$str2 .= $rssContent . "<br />\n";
						}
						else
						{
							$str .= "<tr><td>" .
$dbColName['label'] . ":</td><td>" .
$rssContent . "</td></tr>\n";
						}
					}
				}

				if (isset($row->$titleElName))
				{
					$title = $row->$titleElName;
				}


				if (FArrayHelper::getValue($dbColName, 'label') !=
'')
				{
					$str = $tStart . $str . "</table>";
				}
				else
				{
					$str = $str2;
				}

				// Url link to article
				$link = Route::_('index.php?option=com_' . $this->package
. '&view=' . $view . '&listid=' . $table->id
. '&formid=' . $form->id
					. '&rowid=' . $row->slug
					);
				$guid = COM_FABRIK_LIVESITE . 'index.php?option=com_' .
$this->package . '&view=' . $view .
'&listid=' . $table->id . '&formid='
					. $form->id . '&rowid=' . $row->slug;

				// Strip html from feed item description text
				$author = @$row->created_by_alias ? @$row->created_by_alias :
@$row->author;

				$item->date = isset($row->$dateElName) &&
$row->$dateElName ? date('r',
strtotime(@$row->$dateElNameRaw)) : '';

				// Load individual item creator class

				$item->title = $title;
				$item->link = $link;
				$item->guid = $guid;
				$item->description = $str;

				// $$$ hugh - not quite sure where we were expecting $row->category
to come from.  Comment out for now.
				// $item->category = $row->category;

				foreach ($enclosures as $enclosure)
				{
					$item->setEnclosure($enclosure);
				}

				// Loads item info into rss array
				$res = $this->doc->addItem($item);
			}
		}
	}

	/**
	 * Add <image> to document
	 *
	 * @param   object  $params    Registry list parameters
	 *
	 * @return  document
	 */
	private function addImage($params)
	{
		$imageSrc = $params->get('feed_image_src', '');

		if ($imageSrc !== '')
		{
			$image = new stdClass;
			$image->url = $imageSrc;
			$image->title = $this->doc->title;
			$image->link = $this->doc->link;
			$image->width = '';
			$image->height = '';
			$image->description = '';
			$this->doc->image = $image;
		}

		return $this->doc;
	}

	/**
	 * Get file size
	 *
	 * @param   string  $path    File path
	 * @param   bool    $remote  Remote file, if true attempt to load file via
Curl
	 *
	 * @return mixed|number
	 */
	protected function get_filesize($path, $remote = false)
	{
		if ($remote)
		{
			$ch = curl_init($path);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_HEADER, true);
			curl_setopt($ch, CURLOPT_NOBODY, true);
			$data = curl_exec($ch);
			$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
			curl_close($ch);

			return $size;
		}
		else
		{
			return filesize($path);
		}
	}
}
views/list/view.feed.php000064400000034106151165347700011256
0ustar00<?php
/**
 * PDF Fabrik List view class, including closures
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Router\Route;
use \Joomla\Registry\Registry;
use Joomla\CMS\Document\Feed\FeedItem;
use Joomla\CMS\Document\Feed\FeedEnclosure;
use Joomla\String\StringHelper;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * PDF Fabrik List view class, including closures
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */

class FabrikViewList extends FabrikViewListBase
{
    /**
     * Display the Feed
     *
     * @param   sting  $tpl  template
     *
     * @return void
     */
    public function display($tpl = null)
    {
        $input = $this->app->getInput();
        $itemId = FabrikWorker::itemId();
        $model = $this->getModel();
        $model->setOutPutFormat('feed');

        $this->app->allowCache(true);

        if (!parent::access($model))
        {
            exit;
        }

        $this->doc->_itemTags = array();

        // $$$ hugh - modified this so you can enable QS filters on RSS
links
        // by setting &incfilters=1
        $input->set('incfilters',
$input->getInt('incfilters', 0));
        $table = $model->getTable();
        $model->render();
        $params = $model->getParams();

        if ($params->get('rss') == '0')
        {
            return '';
        }

        $formModel = $model->getFormModel();
        $form = $formModel->getForm();
        $aJoinsToThisKey = $model->getJoinsToThisKey();

        // Get headings
        $aTableHeadings = array();
        $groupModels = $formModel->getGroupsHiarachy();
        $titleEl = $params->get('feed_title');
        $dateEl = (int) $params->get('feed_date');

        //$imageEl = $formModel->getElement($imageEl, true);
        $titleEl = $formModel->getElement($titleEl, true);
        $dateEl = $formModel->getElement($dateEl, true);
        $titleElName = $titleEl === false ? '' :
$titleEl->getFullName(true, false);
        $dateElName = $dateEl === false ? '' :
$dateEl->getFullName(true, false);
        $dateElNameRaw = $dateElName . '_raw';

        foreach ($groupModels as $groupModel)
        {
            $elementModels = $groupModel->getPublishedElements();

            foreach ($elementModels as $elementModel)
            {
                $element = $elementModel->getElement();
                $elParams = $elementModel->getParams();

                if ($elParams->get('show_in_rss_feed') ==
'1')
                {
                    $heading = $element->label;

                    if
($elParams->get('show_label_in_rss_feed') == '1')
                    {
                        $aTableHeadings[$heading]['label'] =
$heading;
                    }
                    else
                    {
                        $aTableHeadings[$heading]['label'] =
'';
                    }

                    $aTableHeadings[$heading]['colName'] =
$elementModel->getFullName();
                    $aTableHeadings[$heading]['dbField'] =
$element->name;

                    // $$$ hugh - adding enclosure stuff for podcasting
                    if ($element->plugin == 'fileupload' ||
$elParams->get('use_as_rss_enclosure', '0') ==
'1')
                    {
                        $aTableHeadings[$heading]['enclosure'] =
true;
                    }
                    else
                    {
                        $aTableHeadings[$heading]['enclosure'] =
false;
                    }
                }
            }
        }

        foreach ($aJoinsToThisKey as $element)
        {
            $element = $elementModel->getElement();
            $elParams = new Registry($element->attribs);

            if ($elParams->get('show_in_rss_feed') ==
'1')
            {
                $heading = $element->label;

                if ($elParams->get('show_label_in_rss_feed')
== '1')
                {
                    $aTableHeadings[$heading]['label'] =
$heading;
                }
                else
                {
                    $aTableHeadings[$heading]['label'] =
'';
                }

                $aTableHeadings[$heading]['colName'] =
$element->db_table_name . "___" . $element->name;
                $aTableHeadings[$heading]['dbField'] =
$element->name;

                // $$$ hugh - adding enclosure stuff for podcasting
                if ($element->plugin == 'fileupload' ||
$elParams->get('use_as_rss_enclosure', '0') ==
'1')
                {
                    $aTableHeadings[$heading]['enclosure'] =
true;
                }
                else
                {
                    $aTableHeadings[$heading]['enclosure'] =
false;
                }
            }
        }

        $w = new FabrikWorker;
        $rows = $model->getData();

        $this->doc->title =
htmlspecialchars($w->parseMessageForPlaceHolder($table->label,
$_REQUEST), ENT_COMPAT, 'UTF-8');
        $this->doc->description =
htmlspecialchars(trim(strip_tags($w->parseMessageForPlaceHolder($table->introduction,
$_REQUEST))));
        $this->doc->link = Route::_('index.php?option=com_'
. $this->package . '&view=list&listid=' .
$table->id . '&Itemid=' . $itemId);

        $this->addImage($params);

        // Check for a custom css file and include it if it exists
        $tmpl = $input->get('layout', $table->template);
        $cssPath = COM_FABRIK_FRONTEND . 'views/list/tmpl/' .
$tmpl . '/feed.css';

        if (file_exists($cssPath))
        {
            $this->doc->addStyleSheet(COM_FABRIK_LIVESITE .
'components/com_fabrik/views/list/tmpl/' . $tmpl .
'/feed.css');
        }

        $view = $model->canEdit() ? 'form' :
'details';

        // List of tags to look for in the row data
        // If they are there don't put them in the desc but put them
in as a separate item param
        $rssTags = array(
            '<georss:point>' =>
'xmlns:georss="http://www.georss.org/georss"'
        );

        foreach ($rows as $group)
        {
            foreach ($group as $row)
            {
                // Get the content
                $str2 = '';
                $str = '';
                $tStart = '<table
style="margin-top:10px;padding-top:10px;">';
                $title = '';
                $item = new FeedItem();
                $enclosures = array();

                foreach ($aTableHeadings as $heading => $dbColName)
                {
                    if ($dbColName['enclosure'])
                    {
                        // $$$ hugh - diddling around trying to add
enclosures
                        $colName = $dbColName['colName'] .
'_raw';
                        $enclosureUrl = $row->$colName;

                        if (!empty($enclosureUrl))
                        {
                            $remoteFile = false;

                            // Element value should either be a full path,
or relative to J! base
                            if (strstr($enclosureUrl, 'http://')
&& !strstr($enclosureUrl, COM_FABRIK_LIVESITE))
                            {
                                $enclosureFile = $enclosureUrl;
                                $remoteFile = true;
                            }
                            elseif (strstr($enclosureUrl,
COM_FABRIK_LIVESITE))
                            {
                                $enclosureFile =
str_replace(COM_FABRIK_LIVESITE, COM_FABRIK_BASE, $enclosureUrl);
                            }
                            elseif (preg_match('#^' .
COM_FABRIK_BASE . '#', $enclosureUrl))
                            {
                                $enclosureFile = $enclosureUrl;
                                $enclosureUrl =
str_replace(COM_FABRIK_BASE, '', $enclosureUrl);
                            }
                            else
                            {
                                $enclosureUrl = ltrim($enclosureUrl,
'/\\');
                                $enclosureFile = COM_FABRIK_BASE .
$enclosureUrl;
                                $enclosureUrl = COM_FABRIK_LIVESITE .
str_replace('\\', '/', $enclosureUrl);
                            }

                            if ($remoteFile || (file_exists($enclosureFile)
&& !is_dir($enclosureFile)))
                            {
                                $enclosureType = '';

                                if ($enclosureType =
FabrikWorker::getPodcastMimeType($enclosureFile))
                                {
                                    $enclosure_size =
$this->get_filesize($enclosureFile, $remoteFile);
                                    $enclosure = new FeedEnclosure();
                                    $enclosure->url = $enclosureUrl;
                                    $enclosure->length =
$enclosure_size;
                                    $enclosure->type = $enclosureType;
                                    $enclosures[] = $enclosure;

                                    /**
                                     * No need to insert the URL in the
description, as feed readers should
                                     * automagically show 'media'
when they see an 'enclosure', so just move on ..
                                     */
                                    continue;
                                }
                            }
                        }
                    }

                    if ($title == '')
                    {
                        // Set a default title
                        $title =
$row->{$dbColName['colName']};
                    }

                    // Rob - was stripping tags - but aren't they
valid in the content?
                    $rssContent =
$row->{$dbColName['colName']};
                    $found = false;

                    foreach ($rssTags as $rssTag => $namespace)
                    {
                        if (strstr($rssContent, $rssTag))
                        {
                            $found = true;
                            $rssTag = StringHelper::substr($rssTag, 1,
StringHelper::strlen($rssTag) - 2);

                            if (!strstr($this->doc->_namespace,
$namespace))
                            {
                                $this->doc->_itemTags[] = $rssTag;
                                $this->doc->_namespace .= $namespace
. " ";
                            }

                            break;
                        }
                    }

                    if ($found)
                    {
                        $item->{$rssTag} = $rssContent;
                    }
                    else
                    {
                        if ($dbColName['label'] == '')
                        {
                            $str2 .= $rssContent . "<br
/>\n";
                        }
                        else
                        {
                            $str .= "<tr><td>" .
$dbColName['label'] . ":</td><td>" .
$rssContent . "</td></tr>\n";
                        }
                    }
                }

                if (isset($row->$titleElName))
                {
                    $title = $row->$titleElName;
                }


                if (FArrayHelper::getValue($dbColName, 'label')
!= '')
                {
                    $str = $tStart . $str . "</table>";
                }
                else
                {
                    $str = $str2;
                }

                // Url link to article
                $link = Route::_('index.php?option=com_' .
$this->package . '&view=' . $view .
'&listid=' . $table->id . '&formid=' .
$form->id
                    . '&rowid=' . $row->slug
                );
                $guid = COM_FABRIK_LIVESITE .
'index.php?option=com_' . $this->package .
'&view=' . $view . '&listid=' . $table->id .
'&formid='
                    . $form->id . '&rowid=' .
$row->slug;

                // Strip html from feed item description text
                $author = @$row->created_by_alias ?
@$row->created_by_alias : @$row->author;

                $item->date = isset($row->$dateElName) &&
$row->$dateElName ? date('r',
strtotime(@$row->$dateElNameRaw)) : '';

                // Load individual item creator class

                $item->title = $title;
                $item->link = $link;
                $item->guid = $guid;
                $item->description = $str;

                // $$$ hugh - not quite sure where we were expecting
$row->category to come from.  Comment out for now.
                // $item->category = $row->category;

                foreach ($enclosures as $enclosure)
                {
                    $item->setEnclosure($enclosure);
                }

                // Loads item info into rss array
                $res = $this->doc->addItem($item);
            }
        }
    }

    /**
     * Add <image> to document
     *
     * @param   object  $params    Registry list parameters
     *
     * @return  document
     */
    private function addImage($params)
    {
        $imageSrc = $params->get('feed_image_src',
'');

        if ($imageSrc !== '')
        {
            $image = new stdClass;
            $image->url = $imageSrc;
            $image->title = $this->doc->title;
            $image->link = $this->doc->link;
            $image->width = '';
            $image->height = '';
            $image->description = '';
            $this->doc->image = $image;
        }

        return $this->doc;
    }

    /**
     * Get file size
     *
     * @param   string  $path    File path
     * @param   bool    $remote  Remote file, if true attempt to load file
via Curl
     *
     * @return mixed|number
     */
    protected function get_filesize($path, $remote = false)
    {
        if ($remote)
        {
            $ch = curl_init($path);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HEADER, true);
            curl_setopt($ch, CURLOPT_NOBODY, true);
            $data = curl_exec($ch);
            $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
            curl_close($ch);

            return $size;
        }
        else
        {
            return filesize($path);
        }
    }
}
views/list/view.html.php000064400000007506151165347700011323
0ustar00<?php
/**
 * HTML Fabrik List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Object\CMSObject;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * HTML Fabrik List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Tabbed content
	 *
	 * @var array
	 */
	public $tabs = array();

	/**
	 * Display the template
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		if (parent::display($tpl) !== false)
		{
			/** @var FabrikFEModelList $model */
			$model = $this->getModel();
			$this->setCanonicalLink();
			$this->tabs = $model->loadTabs();

			if (!$this->app->isClient('administrator') &&
isset($this->params))
			{
				/** @var CMSObject $state */
				$state = $model->getState();
				$stateParams = $state->get('params');

				if ($stateParams->get('menu-meta_description'))
				{
					$this->doc->setDescription($stateParams->get('menu-meta_description'));
				}

				if ($stateParams->get('menu-meta_keywords'))
				{
					$this->doc->setMetadata('keywords',
$stateParams->get('menu-meta_keywords'));
				}

				if ($stateParams->get('robots'))
				{
					$this->doc->setMetadata('robots',
$stateParams->get('robots'));
				}
			}

			$this->output();
		}
	}

	/**
	 * Render the group by heading as a LayoutInterface
list.fabrik-group-by-heading
	 *
	 * @param   string  $groupedBy  Group by key for $this->grouptemplates
	 * @param   array   $group      Group data
	 *
	 * @return string
	 */
	public function layoutGroupHeading($groupedBy, $group)
	{
		$displayData = new stdClass;
		$displayData->emptyDataMessage = $this->emptyDataMessage;
		$displayData->tmpl = $this->tmpl;
		$displayData->title = $this->grouptemplates[$groupedBy];
		$displayData->extra = $this->grouptemplatesExtra[$groupedBy];
		$displayData->count = count($group);
		$displayData->group_by_show_count =
$this->params->get('group_by_show_count','1');
		$layout =
$this->getModel()->getLayout('list.fabrik-group-by-heading');

		return $layout->render($displayData);
	}

	/**
	 * Create and render layout of the list's filters
	 *
	 * @return string
	 */
	public function layoutFilters()
	{
		$displayData = new stdClass;
		$displayData->filterMode = $this->filterMode;
		$displayData->toggleFilters = $this->toggleFilters;
		$displayData->filterCols = (int)$this->filterCols;
		$displayData->showClearFilters = $this->showClearFilters;
		$displayData->gotOptionalFilters = $this->gotOptionalFilters;
		$displayData->filters = $this->filters;
		$displayData->filter_action = $this->filter_action;
        $displayData->buttons = $this->buttons;

		if ($this->filterMode === 5)
		{
			$layoutFile = 'fabrik-filters-modal';
		}
		else
		{

			$layoutFile = $this->filterCols > 1 ?
'fabrik-filters-bootstrap' : 'fabrik-filters';
		}

		$layout = $this->getModel()->getLayout('list.' .
$layoutFile);

		return $layout->render($displayData);
	}

	/**
	 * Set the canonical link - this is the definitive URL that Google et all,
will use
	 * to determine if duplicate URLs are the same content
	 *
	 * @throws Exception
	 */
	public function setCanonicalLink()
	{
		if (!$this->app->isClient('administrator') &&
!$this->isMambot)
		{
			$url = $this->getCanonicalLink();

			// Set a flag so that the system plugin can clear out any other
canonical links.
			$this->session->set('fabrik.clearCanonical', true);
			$this->doc->addCustomTag('<link rel="canonical"
href="' . htmlspecialchars($url) . '" />');
		}
	}
}
views/list/view.json.php000064400000001744151165347700011326
0ustar00<?php
/**
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * List JSON view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.1
 */
class FabrikViewlist extends FabrikViewListBase
{
	/**
	 * Display a json object representing the table data.
	 * Not used for updating fabrik list, use raw view for that, here in case
you want to export the data to another application
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$model = $this->getModel();
		$model->setId($this->app->getInput()->getInt('listid'));

		if (!parent::access($model))
		{
			exit;
		}

		$data = $model->getData();
		echo json_encode($data);
	}
}
views/list/view.oai.php000064400000015062151165347700011123
0ustar00<?php
/**
 * Open Archive Initiative List Records View
 * http://www.openarchives.org/OAI/2.0/openarchivesprotocol.htm#ListRecords
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;
use Joomla\CMS\Date\Date;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * Open Archive Initiative List Records View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.4
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Row identifier
	 *
	 * @var string
	 */
	private $rowIdentifier = '';

	/**
	 * @var FabrikFEModelOai
	 */
	private $oaiModel;

	/**
	 * Constructor
	 *
	 * @param   array $config A named configuration array for object
construction.
	 *
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);
		$this->oaiModel =
Factory::getApplication()->bootComponent('com_fabrik')->getMVCFactory()->createModel('Oai',
'FabrikFEModel');
	}

	/**
	 * Display the Feed
	 *
	 * @param   sting $tpl template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		$this->doc->setMimeEncoding('application/xml');
		$model = $this->getModel();
		$this->oaiModel->setListModel($model);
		$root = $this->oaiModel->root();
		$root->appendChild($this->oaiModel->responseDate());
		$root->appendChild($this->request());

		$this->params = $model->getParams();
		$model->setOutPutFormat('feed');
		$this->app->allowCache(true);

		if (!parent::access($model))
		{
			exit;
		}

		$filter = $this->filter();

		foreach ($filter as $key => $val)
		{
			$_GET[$key] = $val;
		}

		$model->render();
		$rows  = $model->getData();
		$total = $model->getTotalRecords();

		if ($total === 0)
		{
			echo $this->model->generateError(array('code' =>
'noRecordsMatch', 'msg' => 'No records
matched'));
		}

		$this->rowIdentifier = 'oai:' .
$this->oaiModel->repositoryIdentifier() . ':' .
$model->getId() . '/';
		$listRecords         = $this->listRecords($rows);

		if ($total > count($rows))
		{
			$listRecords->appendChild($this->oaiModel->resumptionToken($total,
$filter));
		}

		$root->appendChild($listRecords);
		$this->oaiModel->appendChild($root);
		print_r($this->oaiModel->dom->saveXML());
	}

	/**
	 * Work out the filters to apply to the list - basically the from and
until querystring vars
	 *
	 * @return array
	 */
	private function filter()
	{
		$this->app->getInput()->set('clearfilters', 1);
		$this->app->getInput()->set('fabrik_incsessionfilters',
false);
		// Lets support only the Y-m-d OAI format for now (so no time allowed)
		$dateEl = $this->oaiModel->dateElName();
		$from   = Date::createFromFormat('Y-m-d',
$this->app->getInput()->get('from', ''));
		if ($from !== false)
		{
			$from = $from->setTime(0, 0, 0)->format('Y-m-d H:i:s');
		}

		$until = Date::createFromFormat('Y-m-d',
$this->app->getInput()->get('until', ''));
		if ($until !== false)
		{
			$until = $until->setTime(0, 0, 0)->format('Y-m-d
H:i:s');
		}

		if ($from === false & $until !== false)
		{
			$from = '1970-01-01 00:00:00';
		}

		if ($from !== false & $until === false)
		{
			$until = new Date();
			$until = $until->format('Y-m-d H:i:s');
		}

		return array($dateEl => array('condition' =>
'BETWEEN',
			'value' => array($from, $until)
		));
	}

	/**
	 * List Records
	 *
	 * @param $rows
	 *
	 * @return DOMElement
	 */
	private function listRecords($rows)
	{
		$listRecords =
$this->oaiModel->createElement('ListRecords');

		foreach ($rows as $group)
		{
			foreach ($group as $row)
			{
				$record   = $this->oaiModel->createElement('record');
				$metaData = $this->oaiModel->createElement('metadata');
				$oaiDc    = $this->oaiModel->rowOaiDc($row);
				$header   = $this->rowHeader($row);
				$about    = $this->rowAbout($row);
				$this->oaiModel->dcRow($oaiDc, $row);
				$metaData->appendChild($oaiDc);
				$record->appendChild($header);
				$record->appendChild($metaData);
				$record->appendChild($about);
				$listRecords->appendChild($record);

			}
		}

		return $listRecords;
	}

	/**
	 * Build a rows <header> node
	 *
	 * @param object $row
	 *
	 * @return DOMNode
	 */
	private function rowHeader($row)
	{
		$header       = $this->oaiModel->createElement('header');
		$dateStampKey = $this->oaiModel->dateElName();
		$dateStamp    =
Factory::getDate($row->$dateStampKey)->format('Y-m-d');
		$header->appendChild($this->oaiModel->createElement('identifier',
$this->rowIdentifier . $row->__pk_val));
		$header->appendChild($this->oaiModel->createElement('datestamp',
$dateStamp));

		return $header;
	}

	/**
	 * Build a row's <about> node
	 *
	 * @param object $row
	 *
	 * @return DOMNode
	 */
	private function rowAbout($row)
	{
		$about = $this->oaiModel->createElement('about');
		//$provenance = $this->rowProvenance($row);
		$rights = $this->rowRights($row);
		$about->appendChild($rights);

		return $about;
	}

	/**
	 * @return DOMElement
	 */
	private function request()
	{
		$model      = $this->getModel();
		$input      = $this->app->getInput();
		$request    = $this->oaiModel->requestElement();
		$listParams = $model->getParams();
		$attributes = array(
			'verb' => 'ListRecords',
			'set' =>
$listParams->get('open_archive_set_spec'),
			'metadataPrefix' =>
$input->get('metadataPrefix', 'oai_dc')

		);

		if ($input->get('from', '') !== '')
		{
			$attributes['from'] = $input->get('from');
		}
		if ($input->get('until', '') !== '')
		{
			$attributes['until'] = $input->get('until');
		}
		$this->oaiModel->nodeAttributes($request, $attributes);

		return $request;

	}

	/**
	 * Not implemented yet - but would describe the provenance of the original
data
	 *
	 * @param $row
	 */
	private function rowProvenance($row)
	{
	}

	/**
	 * Describes a records copy right info
	 *
	 * @param $row
	 *
	 * @return DOMElement
	 */
	private function rowRights($row)
	{
		$rights     = $this->oaiModel->createElement('rights');
		$attributes = array(
			"xmlns" =>
"http://www.openarchives.org/OAI/2.0/rights/",
			"xmlns:xsi" =>
"http://www.w3.org/2001/XMLSchema-instance",
			"xsi:schemaLocation" =>
"http://www.openarchives.org/OAI/2.0/rights/
                                  
http://www.openarchives.org/OAI/2.0/rights.xsd"
		);
		$this->oaiModel->nodeAttributes($rights, $attributes);

		$rightsReference =
$this->oaiModel->createElement('rightsReference');
		$this->oaiModel->nodeAttributes($rightsReference,
array('ref' =>
$this->params->get('open_archive_license')));
		$rights->appendChild($rightsReference);

		return $rights;
	}

}
views/list/view.partial.php000064400000006645151165347700012016
0ustar00<?php
/**
 * HTML Partial Fabrik List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Layout\LayoutInterface;
use Joomla\CMS\Object\CMSObject;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * HTML Partial Fabrik List view class. Renders HTML without <head>
or wrapped in <body>
 * Any Ajax request requiring HTML should add
"&foramt=partial" to the URL. This avoids us
 * potentially reloading jQuery in the <head> which is problematic as
that replaces the main page's
 * jQuery object and removes any additional functions that had previously
been assigned
 * such as JQuery UI, or fullcalendar
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.4.3
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Tabbed content
	 *
	 * @var array
	 */
	public $tabs = array();

	/**
	 * Display the template
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		if (parent::display($tpl) !== false)
		{
			/** @var FabrikFEModelList $model */
			$model = $this->getModel();
			$this->tabs = $model->loadTabs();

			if (!$this->app->isClient('administrator') &&
isset($this->params))
			{
				/** @var CMSObject $state */
				$state = $model->getState();
				$stateParams = $state->get('params');

				if ($stateParams->get('menu-meta_description'))
				{
					$this->doc->setDescription($stateParams->get('menu-meta_description'));
				}

				if ($stateParams->get('menu-meta_keywords'))
				{
					$this->doc->setMetadata('keywords',
$stateParams->get('menu-meta_keywords'));
				}

				if ($stateParams->get('robots'))
				{
					$this->doc->setMetadata('robots',
$stateParams->get('robots'));
				}
			}

			$this->output();
		}
	}

	/**
	 * Render the group by heading as a LayoutInterface
list.fabrik-group-by-heading
	 *
	 * @param   string  $groupedBy  Group by key for $this->grouptemplates
	 * @param   array   $group      Group data
	 *
	 * @return string
	 */
	public function layoutGroupHeading($groupedBy, $group)
	{
		$displayData = new stdClass;
		$displayData->emptyDataMessage = $this->emptyDataMessage;
		$displayData->tmpl = $this->tmpl;
		$displayData->title = $this->grouptemplates[$groupedBy];
		$displayData->extra = $this->grouptemplatesExtra[$groupedBy];
		$displayData->count = count($group);
		$displayData->group_by_show_count =
$this->params->get('group_by_show_count','1');
		$layout =
$this->getModel()->getLayout('list.fabrik-group-by-heading');

		return $layout->render($displayData);
	}

	/**
	 * Create and render layout of the list's filters
	 *
	 * @return string
	 */
	public function layoutFilters()
	{
		$displayData = new stdClass;
		$displayData->filterMode = $this->filterMode;
		$displayData->toggleFilters = $this->toggleFilters;
		$displayData->filterCols = $this->filterCols;
		$displayData->showClearFilters = $this->showClearFilters;
		$displayData->gotOptionalFilters = $this->gotOptionalFilters;
		$displayData->filters = $this->filters;
		$displayData->filter_action = $this->filter_action;
		$layoutFile =  $this->filterMode === 5 ?
'fabrik-filters-modal' : 'fabrik-filters';
		$layout = $this->getModel()->getLayout('list.' .
$layoutFile);

		return $layout->render($displayData);
	}
}
views/list/view.pdf.php000064400000005430151165347700011122
0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 * @since       3.0.5
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Layout\LayoutInterface;
use Fabrik\Document\PdfDocument;

jimport('joomla.application.component.view');
require_once COM_FABRIK_FRONTEND . '/views/list/view.base.php';

/**
 * PDF List view
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.5
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Display the template
	 *
	 * @param   sting  $tpl  Template
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		FabrikWorker::canPdf(true);

		if (parent::display($tpl) !== false)
		{
			$model = $this->getModel();
			$params = $model->getParams();
			$size        =
$this->app->getInput()->get('pdf_size',
$params->get('pdf_size', 'A4'));
			$orientation =
$this->app->getInput()->get('pdf_orientation',
$params->get('pdf_orientation', 'portrait'));
			$this->doc->setPaper($size, $orientation);
			$this->nav = '';
			$this->showPDF = false;
			$this->showRSS = false;
			$this->emptyLink = false;
			//$this->filters = array();
			$this->showFilters = false;
			$this->filterMode = 0;
			$this->hasButtons = false;

			if
($this->app->getInput()->get('pdf_include_bootstrap',
$params->get('pdf_include_bootstrap', '0')) ===
'1')
			{
				FabrikhelperHTML::loadBootstrapCSS(true);
			}

			$this->output();
		}
	}

	/**
	 * Build an object with the button icons based on the current tmpl
	 *
	 * @return  void
	 */
	protected function buttons()
	{
		// Don't add buttons as pdf is not interactive
		$this->buttons = new stdClass;
	}

	/**
	 * Set page title
	 *
	 * @param   object  $w        Fabrikworker
	 * @param   object  &$params  list params
	 * @param   object  $model    list model
	 *
	 * @return  void
	 */
	protected function setTitle($w, &$params, $model)
	{
		parent::setTitle($w, $params, $model);

		// Set the download file name based on the document title
		$this->doc->setName($this->doc->getTitle());
	}
		/**
	 * Render the group by heading as a LayoutInterface
list.fabrik-group-by-heading

	 *
	 * @param   string  $groupedBy  Group by key for $this->grouptemplates
	 * @param   array   $group      Group data



	 *
	 * @return string
	 */
	public function layoutGroupHeading($groupedBy, $group)

	{
		$displayData = new stdClass;
		$displayData->emptyDataMessage = $this->emptyDataMessage;
		$displayData->tmpl = $this->tmpl;
		$displayData->title = $this->grouptemplates[$groupedBy];
		$displayData->count = count($group);
		$layout =
$this->getModel()->getLayout('list.fabrik-group-by-heading');


		return $layout->render($displayData);


	}
}
views/list/view.raw.php000064400000010451151165347700011141
0ustar00<?php
/**
 * Raw Fabrik List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\Utilities\ArrayHelper;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * Raw Fabrik List view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Display the template
	 *
	 * @param   sting  $tpl  template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		$input = $this->app->getInput();

		/** @var FabrikFEModelList $model */
		$model = $this->getModel();
		$model->setId($input->getInt('listid'));

		if (!parent::access($model))
		{
			exit;
		}

		$table = $model->getTable();
		$params = $model->getParams();
		$rowId = $input->getString('rowid', '',
'string');
		$data = $model->render();
		list($this->headings, $groupHeadings, $this->headingClass,
$this->cellClass) = $this->get('Headings');
		$this->emptyDataMessage = $this->get('EmptyDataMsg');
		$nav = $model->getPagination();
		$form = $model->getFormModel();
		$c = 0;

		foreach ($data as $groupKey => $group)
		{
			foreach ($group as $i => $x)
			{
				$o = new stdClass;

				if (is_object($data[$groupKey]))
				{
					$o->data = ArrayHelper::fromObject($data[$groupKey]);
				}
				else
				{
					$o->data = $data[$groupKey][$i];
				}

				// should really stick this in a layout to match how it is built in
list.fabrik-group-by-heading
				if (array_key_exists($groupKey, $model->groupTemplates))
				{
					$o->groupHeading = $model->groupTemplates[$groupKey];
					if ($params->get('group_by_show_count','1') ==
'1')
					{
						$o->groupHeading .= '<span
class="groupCount">( ' . count($group) . '
)</span>';
					}
				}

				$o->cursor = $i + $nav->limitstart;
				$o->total = $nav->total;
				$o->id = 'list_' . $model->getRenderContext() .
'_row_' . @$o->data->__pk_val;
				$o->class = 'fabrik_row oddRow' . $c;

				if (is_object($data[$groupKey]))
				{
					$data[$groupKey] = $o;
				}
				else
				{
					$data[$groupKey][$i] = $o;
				}

				$c = 1 - $c;
			}
		}

		$groups = $form->getGroupsHiarachy();

		foreach ($groups as $groupModel)
		{
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elementModel->setContext($groupModel, $form, $model);
				$elementModel->setRowClass($data);
			}
		}

		$d = array('id' => $table->id, 'listRef' =>
$input->get('listref'), 'rowid' => $rowId,
'model' => 'list', 'data' => $data,
			'headings' => $this->headings, 'formid' =>
$model->getTable()->form_id,
			'lastInsertedRow' =>
$this->session->get('lastInsertedRow', 'test'));

		$d['nav'] = get_object_vars($nav);
		$tmpl = $input->get('tmpl', $this->getTmpl());
		$d['htmlnav'] = $params->get('show-table-nav', 1)
? $nav->getListFooter($model->getId(), $tmpl) : '';
		$d['calculations'] = $model->getCalculations();
		$d['hasFilters'] = $model->gotOptionalFilters();
		$d['searchallvalue'] =
$model->getFilterModel()->getSearchAllValue('html');

		// $$$ hugh - see if we have a message to include, set by a list plugin
		$context = 'com_' . $this->package . '.list' .
$model->getRenderContext();

		if ($this->session->has($context . '.msg'))
		{
			$d['msg'] = $this->session->get($context .
'.msg');

			if ($this->session->has($context . '.showmsg'))
			{
                $d['showmsg'] =
$this->session->get($context . '.showmsg');
            }
			else
            {
                $d['showmsg'] = true;
            }

			$this->session->clear($context . '.msg');
            $this->session->clear($context . '.showmsg');
		}

		echo json_encode($d);
	}

	/**
	 * Get the view template name
	 *
	 * @return  string template name
	 */
	private function getTmpl()
	{
		$input = $this->app->getInput();
		$model = $this->getModel();
		$table = $model->getTable();
		$params = $model->getParams();

		if ($this->app->isClient('administrator'))
		{
			$tmpl = $params->get('admin_template');

			if ($tmpl == -1 || $tmpl == '')
			{
				$tmpl = $input->get('layout', $table->template);
			}
		}
		else
		{
			$tmpl = $input->get('layout', $table->template);
		}

		return $tmpl;
	}
}
views/list/view.tags.php000064400000004471151165347730011316
0ustar00<?php
/**
 * Fabrik Raw Form View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');
require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * Fabrik Raw Form View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string $tpl The name of the template file to parse;
automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 */
	public function display($tpl = null)
	{
		$input = $this->app->getInput();
		
		$model = $this->getModel();
		$model->setId($input->getInt('listid'));
		// Get the active menu item

		if (!parent::access($model))
		{
			exit;
		}

		$form = $model->getFormModel();
		$joins = $model->getJoins();
		$form->getJoinGroupIds($joins);

		//$params = $model->getParams();
		//$params->def('icons',
$this->app->get('icons'));
		//$pop = ($input->get('tmpl') == 'component') ? 1
: 0;
		//$params->set('popup', $pop);
		$view = $input->get('view', 'list');

		$groups    = $form->getGroupsHiarachy();
		$gkeys     = array_keys($groups);
		$JSONarray = array();
		$JSONHtml  = array();

		for ($i = 0; $i < count($gkeys); $i++)
		{
			$groupModel  = $groups[$gkeys[$i]];
			$groupTable  = $groupModel->getGroup();
			$group       = new stdClass;
			$groupParams = $groupModel->getParams();
			$aElements   = array();

			// Check if group is actually a table join
			$repeatGroup = 1;
			$foreignKey  = null;
			$elementModels = $groupModel->getPublishedElements();

			foreach ($elementModels as $elementModel)
			{
				$elId = $elementModel->getElement()->id;
				$fullname = $elementModel->getFullName(true, false);
				
				if ($elementModel->getElement()->plugin == 'tags'
&& $elId == $input->get('elID'))
				{
					$data = $elementModel->allTagsJSON($elId);
					foreach($data as $d)
					{
						if (stristr($d->text, $input->get('like')))
						{
							$tagdata[] = $d; 
						}
					}
				}

			}
		}
		echo json_encode($tagdata);
	}
}
views/list/view.word.php000064400000003702151165347730011327
0ustar00<?php
/**
 * MS Word/Open office .doc Fabrik List view class
 * Very rough go at implementing .doc rendering based on the fact that they
can read HTML
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\String\Normalise;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * MS Word/Open office .doc Fabrik List view class
 * Very rough go at implementing .doc rendering based on the fact that they
can read HTML
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.7
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Display the template
	 *
	 * @param   sting  $tpl  template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		if (parent::display($tpl) !== false)
		{
			if (!$this->app->isClient('administrator'))
			{
				$state = $this->get('State');
				$this->params = $state->get('params');

				if ($this->params->get('menu-meta_description'))
				{
					$this->doc->setDescription($this->params->get('menu-meta_description'));
				}

				if ($this->params->get('menu-meta_keywords'))
				{
					$this->doc->setMetadata('keywords',
$this->params->get('menu-meta_keywords'));
				}

				if ($this->params->get('robots'))
				{
					$this->doc->setMetadata('robots',
$this->params->get('robots'));
				}
			}

			// Set the response to indicate a file download
			$this->app->setHeader('Content-Type',
'application/vnd.ms-word');
			$name = $this->getModel()->getTable()->label;
			$name = Normalise::toDashSeparated($name);
			$this->app->setHeader('Content-Disposition',
"attachment;filename=\"" . $name . ".doc\"");
			$this->doc->setMimeEncoding('text/html;
charset=Windows-1252', false);
			$this->output();
		}
	}

	public function layoutFilters()
	{
		return '';
	}
}
views/list/view.yql.php000064400000002202151165347730011153
0ustar00<?php
/**
 * Display the template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Component\ComponentHelper;

require_once JPATH_SITE .
'/components/com_fabrik/views/list/view.base.php';

/**
 * List YQL view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewList extends FabrikViewListBase
{
	/**
	 * Display the template
	 *
	 * @param   sting  $tpl  template
	 *
	 * @return void
	 */
	public function display($tpl = null)
	{
		$model = $this->getModel();
		$input = $this->app->getInput();
		$usersConfig = ComponentHelper::getParams('com_fabrik');
		$model->setId($input->getInt('listid',
$usersConfig->get('listid')));
		$model->render();
		$table = $model->getTable();
		$this->doc->title = $table->label;
		$this->doc->description = $table->introduction;
		$this->doc->copyright = '';
		$this->doc->listid = $table->id;
		$this->doc->items = $model->getData();
	}
}
views/visualization/tmpl/default.php000064400000000541151165347730013727
0ustar00<?php
/**
 * Visualization Template
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

// This file intentionally blank below this line
?>views/visualization/tmpl/default.xml000064400000002144151165347730013741
0ustar00<?xml version="1.0" encoding="utf-8"
standalone="no"?>
<metadata>
	<layout title="Visualization">
		<message>
			<![CDATA[Visualization]]>
		</message>
	</layout>
	<fields name="request">
		<fieldset
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="request">
			<field default="0" description=""
label="Select Instance" name="id"
type="visualizationlist"/>
		</fieldset>
	</fields>
	<fields
addfieldpath="/administrator/components/com_fabrik/models/fields"
name="params">
		<fieldset label="COM_FABRIK_OPTIONS"
name="params">
			<field default="0"
				class="btn-group"
				layout="joomla.form.field.radio.switcher"
				description="COM_FABRIK_FIELD_RESET_FILTERS_DESC"
label="COM_FABRIK_FIELD_RESET_FILTERS_LABEL"
name="resetfilters" type="radio">
					<option value="0">JNO</option>
					<option value="1">JYES</option>
			</field>

			<field name="viz_extra_query_string"
				   type="text"
				   class="input-xlarge"
				   size="40"
				   label="COM_FABRIK_FIELD_EXTRA_QUERY_STRING_LABEL"
				   description="COM_FABRIK_FIELD_EXTRA_QUERY_STRING_DESC"
			/>
		</fieldset>
	</fields>
</metadata>
views/visualization/view.html.php000064400000005213151165347730013245
0ustar00<?php
/**
 * Visualization View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.view');

/**
 * Viz HTML view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewVisualization extends FabrikView
{
	/**
	 * Display
	 *
	 * @param   string  $tmpl  Template
	 *
	 * @return  void
	 */
	public function display($tmpl = 'default')
	{
		$srcs = FabrikHelperHTML::framework();
		$input = $this->app->getInput();
		FabrikHelperHTML::script($srcs);
		$model = $this->getModel();
		$usersConfig = ComponentHelper::getParams('com_fabrik');
		$model->setId($input->get('id',
$usersConfig->get('visualizationid',
$input->getInt('visualizationid', 0))));
		$visualization = $model->getVisualization();
		$params = $model->getParams();
		$pluginManager =
BaseDatabaseModel::getInstance('Pluginmanager',
'FabrikFEModel');
		$plugin = $pluginManager->getPlugIn($visualization->plugin,
'visualization');
		$plugin->setRow($visualization);

		if ($visualization->published == 0)
		{
			$this->app->enqueueMessage(Text::_('COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED'),
'error');
			return;
		}

		// Plugin is basically a model
		$pluginTask = $input->get('plugintask', 'render',
'request');

		// @FIXME cant set params directly like this, but I think plugin model
setParams() is not right
		$plugin->params = $params;
		$tmpl = $plugin->getParams()->get('calendar_layout',
$tmpl);
		$plugin->$pluginTask($this);
		$this->plugin = $plugin;
		$jTmplFolder = 'tmpl';
		$this->addTemplatePath($this->_basePath . '/plugins/' .
$this->_name . '/' . $plugin->_name . '/' .
$jTmplFolder . '/' . $tmpl);

		$root = $this->app->

isClient('administrator') ? JPATH_ADMINISTRATOR : JPATH_SITE;
		$this->addTemplatePath($root . '/templates/' .
$this->app->getTemplate() .
'/html/com_fabrik/visualization/' . $plugin->_name .
'/' . $tmpl);
		$ab_css_file = JPATH_SITE . '/plugins/fabrik_visualization/' .
$plugin->_name . '/tmpl/' . $tmpl . '/template.css';

		if (File::exists($ab_css_file))
		{
			HTMLHelper::stylesheet('template.css',
'plugins/fabrik_visualization/' . $plugin->_name .
'/tmpl/' . $tmpl . '/', true);
		}

		echo parent::display();
	}

	/**
	 * Just for plugin
	 *
	 * @return  void
	 */
	public function setId()
	{
	}
}
views/visualization/view.partial.php000064400000006023151165347730013735
0ustar00<?php
/**
 * Visualization View
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\HTML\HTMLHelper;

jimport('joomla.application.component.view');

/**
 * HTML Partial Fabrik Visualization view class. Renders HTML without
<head> or wrapped in <body>
 * Any Ajax request requiring HTML should add
"&foramt=partial" to the URL. This avoids us
 * potentially reloading jQuery in the <head> which is problematic as
that replaces the main page's
 * jQuery object and removes any additional functions that had previously
been assigned
 * such as JQuery UI, or fullcalendar
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.4.3
 */
class FabrikViewVisualization extends FabrikView
{
	/**
	 * Display
	 *
	 * @param   string  $tmpl  Template
	 *
	 * @return  void
	 */
	public function display($tmpl = 'default')
	{
		$srcs = FabrikHelperHTML::framework();
		$input = $this->app->getInput();
		FabrikHelperHTML::script($srcs);
		$model = $this->getModel();
		$usersConfig = ComponentHelper::getParams('com_fabrik');
		$model->setId($input->get('id',
$usersConfig->get('visualizationid',
$input->getInt('visualizationid', 0))));
		$visualization = $model->getVisualization();
		$params = $model->getParams();
		$pluginManager =
BaseDatabaseModel::getInstance('Pluginmanager',
'FabrikFEModel');
		$plugin = $pluginManager->getPlugIn($visualization->plugin,
'visualization');
		$plugin->setRow($visualization);

		if ($visualization->published == 0)
		{
			$this->app->enqueueMessage(Text::_('COM_FABRIK_SORRY_THIS_VISUALIZATION_IS_UNPUBLISHED'),
'error');
			return;
		}

		// Plugin is basically a model
		$pluginTask = $input->get('plugintask', 'render',
'request');

		// @FIXME cant set params directly like this, but I think plugin model
setParams() is not right
		$plugin->params = $params;
		$tmpl = $plugin->getParams()->get('calendar_layout',
$tmpl);
		$plugin->$pluginTask($this);
		$this->plugin = $plugin;
		$jTmplFolder = 'tmpl';
		$this->addTemplatePath($this->_basePath . '/plugins/' .
$this->_name . '/' . $plugin->_name . '/' .
$jTmplFolder . '/' . $tmpl);

		$root = $this->app->

isClient('administrator') ? JPATH_ADMINISTRATOR : JPATH_SITE;
		$this->addTemplatePath($root . '/templates/' .
$this->app->getTemplate() .
'/html/com_fabrik/visualization/' . $plugin->_name .
'/' . $tmpl);
		$ab_css_file = JPATH_SITE . '/plugins/fabrik_visualization/' .
$plugin->_name . '/tmpl/' . $tmpl . '/template.css';

		if (File::exists($ab_css_file))
		{
			HTMLHelper::stylesheet('template.css',
'plugins/fabrik_visualization/' . $plugin->_name .
'/tmpl/' . $tmpl . '/', true);
		}

		echo parent::display();
	}

	/**
	 * Just for plugin
	 *
	 * @return  void
	 */
	public function setId()
	{
	}
}
views/visualization/view.raw.php000064400000001141151165347730013066
0ustar00<?php
/**
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

/**
 * Raw Viz view class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0.6
 */
class FabrikViewVisualization extends FabrikView
{
	/**
	 * Display
	 *
	 * @param   string  $tmpl  Template
	 *
	 * @return  void
	 */
	public function display($tmpl = 'default')
	{
	}
}
controller.php000064400000005444151165347730007463 0ustar00<?php
/**
 * Fabrik Front end controller
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Factory;
use Fabrik\Helpers\Html;
use Fabrik\Helpers\Worker;

/**
 * Fabrik Component Controller
 * DEPRECIATED - should always get directed to specific controller
 *
 * @static
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       1.5
 */

class FabrikController extends BaseController
{
	/**
	 * Is the controller inside a content plug-in
	 *
	 * @var  bool
	 */
	public $isMambot = false;

	/**
	 * Id used from content plugin when caching turned on to ensure correct
element rendered)
	 *
	 * @var  int
	 */
	public $cacheId = 0;

	/**
	 * Display the view
	 *
	 * @param   bool   $cachable   If true, the view output will be cached -
NOTE not actually used to control caching!!!
	 * @param   array  $urlparams  An array of safe url parameters and their
variable types, for valid values see {@link InputFilter::clean()}.
	 *
	 * @return  null
	 */

	public function display($cachable = false, $urlparams = false)
	{
		$app = Factory::getApplication();
		$input = $app->getInput();
		$package = $app->getUserState('com_fabrik.package',
'fabrik');

		// Menu links use fabriklayout parameters rather than layout
		$flayout = $input->get('fabriklayout');

		if ($flayout != '')
		{
			$input->set('layout', $flayout);
		}

		$document = Factory::getDocument();

		$viewName = $input->get('view', 'form');
		$modelName = $viewName;

		if ($viewName == 'emailform')
		{
			$modelName = 'form';
		}

		if ($viewName == 'details')
		{
			$viewName = 'form';
			$modelName = 'form';
		}

		$viewType = $document->getType();

		// Set the default view name from the Request
		$view = $this->getView($viewName, $viewType);

		// Push a model into the view
		if ($model = $this->getModel($modelName))
		{
			$view->setModel($model, true);
		}

		// Display the view

		$view->error = $this->getError();

		if (($viewName = 'form' || $viewName = 'details'))
		{
			$cachable = true;
		}

		$user = Factory::getUser();

		if (Worker::useCache() && !$this->isMambot)
		{
			$user = Factory::getUser();
			$uri = JURI::getInstance();
			$uri = $uri->toString(array('path', 'query'));
			$cacheid = serialize(array($uri, $input->post,
$user->get('id'), get_class($view), 'display',
$this->cacheId));
			$cache = Factory::getCache('com_' . $package,
'view');
			Html::addToSessionCacheIds($cacheid);
			echo $cache->get($view, 'display', $cacheid);
		}
		else
		{
			return $view->display();
		}
	}
}
fabrik.php000064400000012361151165347730006532 0ustar00<?php
/**
 * Access point to render Fabrik component
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Document\Document;
use Joomla\CMS\Log\Log;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\String\StringHelper;

jimport('joomla.application.component.helper');
jimport('joomla.filesystem.file');

if (!defined('COM_FABRIK_FRONTEND'))
{
	throw new
RuntimeException(Text::_('COM_FABRIK_SYSTEM_PLUGIN_NOT_ACTIVE'),
400);
}

jimport('joomla.log.log');

if (JDEBUG)
{
	// Add the logger.
	Log::addLogger(array('text_file' =>
'fabrik.log.php'));
}

require_once JPATH_COMPONENT . '/controller.php';
$app = Factory::getApplication();
$app->set('jquery', true);
$input = $app->getInput();

$layout = $app->getInput()->get('layout', '');
$view = $app->getInput()->get('view');
if (in_array($view, ["element", "list",
"form", "group"]) && !in_array($layout,
["confirmupdate"])) {
	$file = 'blockuserinput.js';
	$loc = FabrikHelperHTML::isDebug() ? Juri::root() .
'media/com_fabrik/js/' : Juri::root()
.'media/com_fabrik/js/dist/';
	Factory::getDocument()->addScript($loc.$file);
	Text::script("COM_FABRIK_STILL_LOADING");
}

/**
 * Test for YQL & XML document type
 * use the format request value to check for document type
 */
$docs = array("yql", "xml");

foreach ($docs as $d)
{
	if ($input->getCmd("type") == $d)
	{
		// Get the class
		require_once JPATH_SITE .
'/administrator/components/com_fabrik/classes/' . $d .
'document.php';

		// Replace the document
		$document = Factory::getDocument();
		$docClass = 'Document' . StringHelper::strtoupper($d);
		$document = new $docClass;
	}
}

BaseDatabaseModel::addIncludePath(JPATH_COMPONENT . '/models');

// $$$ rob if you want to you can override any fabrik model by copying it
from
// models/ to models/adaptors the copied file will overwrite (NOT extend)
the original
BaseDatabaseModel::addIncludePath(JPATH_COMPONENT .
'/models/adaptors');

$controllerName = $input->getCmd('view');

// Check for a plugin controller

// Call a plugin controller via the url :
// &controller=visualization.calendar

$isPlugin = false;
$cName = $input->getCmd('controller');

if (!empty($cName) && StringHelper::strpos($cName, '.')
!= false)
{
	list($type, $name) = explode('.', $cName);

	if ($type == 'visualization')
	{
		require_once JPATH_COMPONENT .
'/controllers/visualization.php';
	}

	$path = JPATH_SITE . '/plugins/fabrik_' . $type . '/'
. $name . '/controllers/' . $name . '.php';

	if (File::exists($path))
	{
		require_once $path;
		$isPlugin = true;
		$controller = $type . $name;
	}
	else
	{
		$controller = '';
	}
}
else
{
	// Its not a plugin
	// map controller to view - load if exists

	/**
	 * $$$ rob was a simple $controller = view, which was giving an error when
trying to save a popup
	 * form to the calendar viz
	 * May simply be the best idea to remove main controller and have
different controllers for each view
	 */

	// Hack for package
	if ($input->getCmd('view') == 'package' ||
$input->getCmd('view') == 'list')
	{
		$controller = $input->getCmd('view');
	}
	else
	{
		$controller = $cName === 'oai' ? $cName : $controllerName;
	}

	$path = JPATH_COMPONENT . '/controllers/' . $controller .
'.php';

	if (File::exists($path))
	{
		require_once $path;
	}
	else
	{
		$controller = '';
	}
}

/**
 * Create the controller if the task is in the form view.task then get
 * the specific controller for that class - otherwise use $controller to
load
 * required controller class
 */
$task = $input->getCmd('task');
if (!empty($task) && strpos($task, '.') !== false)
{
	$controllerTask = explode('.',
$input->getCmd('task'));
	$controller = array_shift($controllerTask);
	$className = 'FabrikController' .
StringHelper::ucfirst($controller);
	$path = JPATH_COMPONENT . '/controllers/' . $controller .
'.php';

	if (File::exists($path))
	{
		require_once $path;

		// Needed to process J content plugin (form)
		$input->set('view', $controller);
		$task = array_pop($controllerTask);
		$controller = new $className;
	}
	else
	{
		$controller = BaseController::getInstance('Fabrik');
	}
}
else
{
	$className = 'FabrikController' .
StringHelper::ucfirst($controller);
	$controller = new $className;
	$task = $input->getCmd('task');
}

if ($isPlugin)
{
	// Add in plugin view
	$controller->addViewPath(JPATH_SITE . '/plugins/fabrik_' .
$type . '/' . $name . '/views');

	// Add the model path
	$modelpaths = BaseDatabaseModel::addIncludePath(JPATH_SITE .
'/plugins/fabrik_' . $type . '/' . $name .
'/models');
}

$package = $input->get('package', 'fabrik');
$app->setUserState('com_fabrik.package', $package);

if ($input->get('yql') == 1)
{
	$opts = array('driver' => 'yql',
'endpoint' =>
'https://query.yahooapis.com/v1/public/yql');

	$service = FabrikWebService::getInstance($opts);
	$query = "select * from upcoming.events where
location='London'";
	$program = $service->get($query, array(), 'event', null);
}
// End web service testing

$controller->execute($task);

// Redirect if set by the controller
$controller->redirect();
router.php000064400000021615151165347730006616 0ustar00<?php
/**
 * build route
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Language\Text;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Menu\AbstractMenu;
use Joomla\CMS\Factory;
use Joomla\Utilities\ArrayHelper;
use Fabrik\Helpers\Worker;

/**
 * if using file extensions sef and htaccess :
 * you need to edit your .htaccess file to:
 *
 * RewriteCond %{REQUEST_URI}
(/|\.csv|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
 *
 * otherwise the csv exporter will give you a 404 error
 *
 */

/**
 * build route
 *
 * @param   object  &$query  uri?
 *
 * @return  array url
 */
function fabrikBuildRoute(&$query)
{
	$segments = array();
	$app = Factory::getApplication();
	$menu = $app->getMenu();

	if (empty($query['Itemid']))
	{
		$menuItem = $menu->getActive();
		$menuItemGiven = false;
	}
	else
	{
		$menuItem = $menu->getItem($query['Itemid']);
		$menuItemGiven = true;
	}

	// Are we dealing with a view that is attached to a menu item
https://github.com/Fabrik/fabrik/issues/498?
	$hasMenu = _fabrikRouteMatchesMenuItem($query, $menuItem);

	if ($hasMenu)
	{
		unset($query['view']);

		if (isset($query['catid']))
		{
			unset($query['catid']);
		}

		if (isset($query['layout']))
		{
			unset($query['layout']);
		}

		unset($query['id']);

		if (isset($query['listid']))
		{
			unset($query['listid']);
		}

		if (isset($query['rowid']))
		{
			unset($query['rowid']);
		}

		if (isset($query['formid']))
		{
			unset($query['formid']);
		}

		return $segments;
	}

	if (isset($query['c']))
	{
		// $segments[] = $query['c'];//remove from sef url
		unset($query['c']);
	}

	if (isset($query['task']))
	{
		$segments[] = $query['task'];
		unset($query['task']);
	}

	if (isset($query['view']))
	{
		$view = $query['view'];
		$segments[] = $view;
		unset($query['view']);
	}
	else
	{
		$view = '';
	}

	if (isset($query['id']))
	{
		$segments[] = $query['id'];
		unset($query['id']);
	}

	if (isset($query['layout']))
	{
		$segments[] = $query['layout'];
		unset($query['layout']);
	}

	if (isset($query['formid']))
	{
		$segments[] = $query['formid'];
		unset($query['formid']);
	}

	// $$$ hugh - looks like we still have some links using 'fabrik'
instead of 'formid'
	if (isset($query['fabrik']))
	{
		$segments[] = $query['fabrik'];
		unset($query['fabrik']);
	}

	if (isset($query['listid']))
	{
		if ($view != 'form' && $view != 'details')
		{
			$segments[] = $query['listid'];
		}

		unset($query['listid']);
	}

	if (isset($query['rowid']))
	{
		$segments[] = $query['rowid'];
		unset($query['rowid']);
	}

	/* $$$trob: Don't use calculations as SEF segment (there may be old
wrong Fabrik 2/3 menu links, it will break SEF list view)
	if (isset($query['calculations']))
	{
		$segments[] = $query['calculations'];
		unset($query['calculations']);
	}
	*/

	if (isset($query['filetype']))
	{
		$segments[] = $query['filetype'];
		unset($query['filetype']);
	}

	if (isset($query['format']))
	{
		// Was causing error when sef on, url rewrite on and suffix add to url
on.
		// $segments[] = $query['format'];

		/**
		 * Don't unset as with sef urls and extensions on - if we unset it
		 * the url's prefix is set to .html
		 *
		 *  unset($query['format']);
		 */
	}

	if (isset($query['type']))
	{
		$segments[] = $query['type'];
		unset($query['type']);
	}

	// Test
	if (isset($query['fabriklayout']))
	{
		$segments[] = $query['fabriklayout'];
		unset($query['fabriklayout']);
	}

	return $segments;
}

/**
 * Ascertain is the route that is being parsed is the same as the menu item
desginated in
 * its Itemid value.
 *
 * @param $query
 * @param $menuItem
 *
 * @return bool
 */
function _fabrikRouteMatchesMenuItem($query, $menuItem)
{
	if (!$menuItem instanceof Joomla\CMS\Menu\MenuItem ||
!isset($query['view']))
	{
		return false;
	}
	$queryView = ArrayHelper::getValue($query, 'view');
	$menuView = ArrayHelper::getValue($menuItem->query, 'view');

	if ($queryView !== $menuView)
	{
		return false;
	}
	unset($query['Itemid']);
	if (isset($query['lang'])) unset($query['lang']);

	switch ($queryView)
	{
		case 'list':
			if (!isset($query['listid']))
			{
				$query['listid'] = $query['id'];
				unset($query['id']);
			}

			break;

		case 'details':
		case 'form':
			if (isset($query['rowid']) &&
!isset($menuItem->query['rowid']))
			{
				$menuItem->query['rowid'] = $query['rowid'];
			}

			break;
	}

	return $query === $menuItem->query;

	return true;
}

/**
 * parse route
 *
 * @param   array  $segments  url
 *
 * @return  array vars
 */

function fabrikParseRoute(&$segments)
{
	// $vars are what Joomla then uses for its $_REQUEST array
	$vars = array();
	$view = $segments[0];

	if (strstr($view, '.'))
	{
		$view = explode('.', $view);
		$view = array_shift($view);
	}

	/**
	 * View (controller not passed into segments)
	 *
	 * $$$ hugh - don't use FArrayHelper::getValue() here, use original
ArrayHelper.  Don't ask.
	 * Well, since you asked, some users are reporting issues with the helper
not having been
	 * loaded (some bizarre 3rd party system plugin doing funky things), and
since we don't need
	 * what our wrapper does for this simple usage ... yes, we could
specifically load our helper here,
	 * and (dear reader) if you wanna do that be my guest.
	 * J!4: unset processed segments
	 */

	$viewFound = true;

	switch ($view)
	{
		case 'form':
		case 'details':
		case 'emailform':
			$vars['view'] = $segments[0];
			$vars['formid'] = ArrayHelper::getValue($segments, 1, 0);
			$vars['rowid'] = ArrayHelper::getValue($segments, 2,
'');
			$vars['format'] = ArrayHelper::getValue($segments, 3,
'html');
			unset($segments[0]);
			unset($segments[1]);
			unset($segments[2]);
			unset($segments[3]);
			break;
		case 'table':
		case 'list':
			$vars['view'] = ArrayHelper::getValue($segments, 0,
'');
			$vars['listid'] = ArrayHelper::getValue($segments, 1, 0);
			unset($segments[0]);
			unset($segments[1]);
			break;
		case 'import':
			$vars['view'] = 'import';
			$vars['listid'] = ArrayHelper::getValue($segments, 1, 0);
			$vars['filetype'] = ArrayHelper::getValue($segments, 2, 0);
			unset($segments[0]);
			unset($segments[1]);
			unset($segments[2]);
			break;
		case 'visualization':
			$vars['view'] = 'visualization';
			$vars['id'] = ArrayHelper::getValue($segments, 1, 0);
			$vars['format'] = ArrayHelper::getValue($segments, 2,
'html');
			unset($segments[0]);
			unset($segments[1]);
			unset($segments[2]);
			break;
		default:
			$viewFound = false;
			break;
	}

	 /*
	 * if a Fabrik view is home page, and this is a 404, no segments, but J!
will still try and route com_fabrik
	 * So have a peek at the active menu, and break down the link
	  *
	  * 7/25/2017, made this behavior an option, as can cause SEF issues with
duplicate pages
	 */
/* //Henk removed this for J!4
    $config = ComponentHelper::getParams('com_fabrik');
    $home404 = $config->get('fabrik_home_404', '0')
=== '1';

	if (!$home404 && !$viewFound)
	{
		$app   = Factory::getApplication();
		$app->enqueueMessage(Text::_('JGLOBAL_RESOURCE_NOT_FOUND'));
		$menus = AbstractMenu::getInstance('site');
		$menu  = $menus->getActive();
		$link  = parse_url($menu->link);
		$qs    = array();
		if (array_key_exists('query', $link))
		{
			parse_str($link['query'], $qs);
			$option = ArrayHelper::getValue($qs, 'option', '');
			if ($option == 'com_fabrik')
			{
				switch ($qs['view'])
				{
					case 'form':
					case 'details':
					case 'emailform':
						$vars['view']   = $qs['view'];
						$vars['formid'] = ArrayHelper::getValue($qs,
'formid', '');
						$vars['rowid']  = ArrayHelper::getValue($qs,
'rowid', '');
						$vars['format'] = ArrayHelper::getValue($qs,
'format', 'html');
						$viewFound = true;
						break;
					case 'table':
					case 'list':
						$vars['view']   = $qs['view'];
						$vars['listid'] = ArrayHelper::getValue($qs,
'listid', '');
						$viewFound = true;
						break;
					case 'import':
						$vars['view']     = 'import';
						$vars['listid']   = ArrayHelper::getValue($qs,
'listid', '');
						$vars['filetype'] = ArrayHelper::getValue($qs,
'filetype', '');
						$viewFound = true;
						break;
					case 'visualization':
						$vars['view']   = 'visualization';
						$vars['id']     = ArrayHelper::getValue($qs,
'id', '');
						$vars['format'] = ArrayHelper::getValue($qs,
'format', 'html');
						$viewFound = true;
						break;
					default:
						break;
				}
			}
		}
	}
*/
	if (!$viewFound)
	{
		//JError::raiseError(404,
Text::_('JGLOBAL_RESOURCE_NOT_FOUND'));
        throw new
\Exception(Text::_('JGLOBAL_RESOURCE_NOT_FOUND'), 404);
	}
	
	//J!4 Router will fail if there are unprocessed segments. So create
warning/log and reset segments
	if (count($segments) >0)
	{
		FabrikWorker::logError('Incomplete Fabrik routing. vars: ' .
implode(',',$vars) . '; ignored segments: '.
implode(',',$segments), 'warning');
		$segments = [];
	}

	return $vars;
}
user_ajax_example.php000064400000007432151165347730010773 0ustar00<?php
/**
 * User ajax example
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @copyright   Copyright (C) 2005-2020  Media A-Team, Inc. - All rights
reserved.
 * @license     GNU/GPL http://www.gnu.org/copyleft/gpl.html
 */

// No direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;

/**
 * @TODO - rewrite example JS with jQuery AJAX
 *
 * This is an example file.  To use userAjax, copy this file to
user_ajax.php,
 * and insert your function into the userAjax class, as per the example
 * userExists() function.  To call your AJAX method, use a URL of this
format from
 * your custom JS code:
 *
 *
index.php?option=com_fabrik&format=raw&task=plugin.userAjax&method=userExists&username="
+ myUsername;
 *
 * Fabrik will automatically try and call the function name specified in
your 'method='.
 * You are responsible for grabbing any other parameters, using:
 *
 *  $app = Factory::getApplication();
 *  $input = $app->getInput();
 *  $input->getString('variablename');
 *
 * as per the $myUsername example in userExists() below.
 *
 * The userExists() example is designed to test if a username given in a
text element
 * exists.  If it does, an alert will pop up, then the field will be
cleared and the cursor re-focused to it.
 *
 * The easiest way to call AJAX from your JS is to use the Mootools Ajax
class, for instance:
 *
 * function userExists(myUsername,refocus) {
 *	 var url =
"index.php?option=com_fabrik&format=raw&task=plugin.userAjax&method=userExists&username="
+ myUsername;
 *	 new Request({url:url,
 *		onComplete: function(response) {
 *			if (response != '') {
 *				alert(response);
 *				refocus.value = '';
 *				refocus.focus();
 *			}
 *		}
 *	 }).send();
 *}
 *
 * In this case, the above code is called from the 'onchange'
trigger
 * of a text element like this:
 *
 * var thisElement =
Fabrik.getBlock('form_1').elements.get('jos_fabrik_formdata_13___username');
 * var myUsername = thisElement.get('value');
 * userExists(myUsername,thisElement);
 *
 * Note that there may be better ways of doing this, the above is just the
way I found
 * to get it done.  The element JS grabs the content of the text field, and
also supplies
 * the element object, so the userExists() function can then empty and
refocus if the
 * specified username already exists.
 *
 * Another example of using Mootools Ajax might be something like this,
which assumes a function
 * in this file called buildStateDropDown() (not shown here), which would
build the dropdown
 * menu for a list of states which you want to update on the fly (for
instance if you
 * have a "Country" dropdown, and wish to repopulate the State
menu when it changes):
 *
 * function ajaxTest() {
 *	 var url =
"index.php?option=com_fabrik&format=raw&task=plugin.userAjax&method=etStateDropDown";
 *	 new Request({url:url,
 *		method: 'get',
 *		update: document.id('jos_fabrik_formdata_13___states')
 *	 }).send();
 * }
 *
 * The important note here is the 'update' parameter, which tells
Mootools the ID of the
 * form element you want to replace with the AJAX response.
 *
 */

/**
 * Define your userAjax class
 *
 * @package     Joomla
 * @subpackage  Fabrik
 * @since       3.0
 */

class UserAjax
{
	/**
	 * This is the method that is run. You should echo out the result you
which to return to the browser
	 *
	 * @return  void
	 */

	public function userExists()
	{
		$db = FabrikWorker::getDbo();
		$query = $db->getQuery(true);
		$retStr = '';
		$app = Factory::getApplication();
		$input = $app->getInput();
		$myUsername = $input->get('username', '');
		$query->select('name')->from('#__users')->where('username
= ' . $db->quote($myUsername));
		$db->setQuery($query, 1, 0);
		$result = $db->loadResult();

		if ($thisName = $result)
		{
			$retStr = "The username $myUsername is already in use by
$thisName";
		}

		echo $retStr;
	}
}