Example #1
0
 function getItems()
 {
     // Get a storage key.
     $store = $this->getStoreId('getItems');
     // Try to load the data from internal storage.
     if (!empty($this->cache[$store])) {
         return $this->cache[$store];
     }
     $search = $this->getState('filter.search');
     $searchid = $this->getState('filter.searchid');
     $searchpe = $this->getState('filter.searchpe');
     // Load the list items.
     $items = parent::getItems();
     // If emtpy or an error, just return.
     if (empty($items)) {
         return array();
     }
     //oseExit($items);
     $db = oseDB::instance();
     // Inject the values back into the array.
     foreach ($items as $k => $item) {
         $order_id = null;
         if ($item->msc_id > 0) {
             $params = oseJson::decode($item->params);
             $order_id = oseGetValue($params, 'order_id', 0);
             $query = " SELECT `title` FROM `#__osemsc_acl`" . " WHERE `id` = '{$item->msc_id}'";
             $db->setQuery($query);
             $item->membership = $db->loadResult();
             $query = " SELECT *" . " FROM `#__osemsc_order_fix`" . " WHERE `member_id` = '{$item->id}'";
             $db->setQuery($query);
             $ofItem = oseDB::loadItem('obj');
             $item->paypal_email = oseObject::getValue($ofItem, 'email', $item->email);
         } else {
             $item->expired_date = null;
             $item->status = '';
         }
         if (empty($search) && empty($searchid) && empty($searchpe)) {
             //return array();
         } else {
             //$item->order_number = null;
             if (!empty($order_id)) {
                 $query = " SELECT `order_id`,`order_number`,`payment_serial_number`,`order_status`" . " FROM `#__osemsc_order`" . " WHERE `order_id` = '{$order_id}'";
                 $db->setQuery($query);
                 $oItem = oseDB::loadItem('obj');
                 $item->order_number = $oItem->order_number;
                 $item->order_id = $oItem->order_id;
                 $item->payment_serial_number = $oItem->payment_serial_number;
                 $item->order_status = $oItem->order_status;
             } else {
             }
         }
         $items[$k] = $item;
     }
     // Add the items to the internal cache.
     $this->cache[$store] = $items;
     return $this->cache[$store];
 }
Example #2
0
 function __construct($p = array())
 {
     $this->user_id = oseGetValue($p, 'user_id');
     if (empty($this->user_id)) {
         $user = oseCall('user2')->instance();
         $this->user_id = $user->get('id');
     }
     $p = oseSetValue($p, 'user_id', $this->user_id);
     $this->set('p', $p);
 }
Example #3
0
 function __construct($p = array())
 {
     parent::__construct($p);
     if (count($this->get('_type')) < 1) {
         $db = oseDB::instance();
         $query = " SELECT * FROM `{$this->_tableType}`";
         $db->setQuery($query);
         $this->set('_type', oseDB::loadList('obj', 'id'));
     }
     if ($this->get('id', 0) > 0) {
         $info = $this->getTypeInfo();
         unset($info['id']);
         if (isset($info['params'])) {
             $info['typeParams'] = oseGetValue($info, 'params');
             unset($info['params']);
         }
         $this->setProperties($info);
     } else {
         $this->set('_isNew', true);
     }
 }
Example #4
0
 static function getValue($item, $key, $default = null)
 {
     return oseGetValue($item, $key, $default);
 }
Example #5
0
 function getExt($type)
 {
     $db = oseDB::instance();
     if (OSEMSCVERSION >= '7.0.0') {
         $query = "SELECT * FROM `#__osemsc_ext`" . " WHERE `msc_id` = '{$this->id}' AND `type`=" . $db->Quote($type);
     } else {
         $query = "SELECT * FROM `#__osemsc_ext`" . " WHERE `id` = '{$this->id}' AND `type`=" . $db->Quote($type);
     }
     $db->setQuery($query);
     $item = oseDB::loadItem();
     $item['params'] = oseJson::decode(oseGetValue($item, 'params', '{}'), true);
     $item = array_merge($item, $item['params']);
     unset($item['params']);
     $ext = $this->get('_ext');
     $ext[$type] = $item;
     $this->set('_ext', $ext);
     return $item;
 }
Example #6
0
 function instance($type = 'item', $params = array())
 {
     if (strtolower($type) == 'item') {
         require_once dirname(__FILE__) . DS . 'oseContractItem.php';
         $class = $this->prefix . "Item";
         if (isset($params['item'])) {
             $item = oseGetValue($params, 'item', array());
             $instance = new $class($item);
         } elseif (isset($params['id']) && $params['id'] > 0) {
             $id = oseGetValue($params, 'id', 0);
             $db = oseDB::instance();
             $query = " SELECT * FROM `#__ose_contract_list`" . " WHERE `id` = '{$id}'";
             $db->setQuery($query);
             $item = oseDB::loadItem();
             $instance = new $class($item);
         } else {
             $instance = new $class();
             return $instance;
         }
         return $instance;
     } elseif (strtolower($type) == 'itemtype') {
         require_once dirname(__FILE__) . DS . 'oseContractItem.php';
         $id = oseGetValue($params, 'id', 0);
         $type_id = oseGetValue($params, 'type_id', 0);
         $db = oseDB::instance();
         $query = " SELECT * FORM `#__ose_contract_type`" . " WHERE `id` = '{$type_id}'";
         $db->setQuery($query);
         $item = oseDB::loadItem('obj');
         require_once dirname(__FILE__) . DS . 'type' . DS . $item->name . '.php';
         $class = $this->_prefix . $item->name;
         $instance = new $class(array('id' => $this->get('id')));
         return $instance;
     } elseif (strtolower($type) == 'plan') {
         require_once dirname(__FILE__) . DS . $this->prefix . ucfirst($type) . '.php';
         $class = $this->prefix . ucfirst($type);
         if (isset($params['item'])) {
             $item = oseGetValue($params, 'item', array());
             $instance = new $class($item);
         } elseif (isset($params['id']) && $params['id'] > 0) {
             $id = oseGetValue($params, 'id', 0);
             $db = oseDB::instance();
             $query = " SELECT * FROM `#__osemsc_acl`" . " WHERE `id` = '{$id}'";
             $db->setQuery($query);
             $item = oseDB::loadItem();
             $instance = new $class($item);
         } else {
             $instance = new $class();
             return $instance;
         }
         return $instance;
     } elseif (strtolower($type) == 'addon') {
         require_once dirname(__FILE__) . DS . $this->prefix . ucfirst($type) . '.php';
         //$class = $this->prefix.ucfirst($type);
         $class = 'oseMscAddonV7';
         if (!empty($params)) {
             $instance = new $class($params);
         } else {
             $instance = new $class();
             return $instance;
         }
         return $instance;
     } else {
         return null;
     }
 }
Example #7
0
 protected function joinFromPayment($params)
 {
     $db = oseDB::instance();
     $msc = oseRegistry::call('msc');
     $member_id = $params['member_id'];
     $msc_id = $params['msc_id'];
     $order_id = $params['order_id'];
     $result = array();
     if (empty($msc_id)) {
         $result['success'] = false;
         $result['title'] = $result['status'] = 'Error';
         $result['content'] = $result['result'] = JText::_('Please Select A Membership First');
         return $result;
     }
     $member = oseRegistry::call('member');
     $member->instance($member_id);
     $updated = $member->joinMsc($msc_id);
     if ($updated) {
         $list = oseMscAddon::getAddonList('join', false, 1, 'obj');
         foreach ($list as $addon) {
             $action_name = oseMscAddon::getActionName($addon, 'save', 'join');
             $result = oseMscAddon::runAction($action_name, $params, true, false);
             if (!$result['success']) {
                 self::cancelMsc($params);
                 return $result;
             }
         }
         $userInfo = $member->getBasicInfo('obj');
         // get order params
         $ext = $msc->getExtInfo($msc_id, 'msc', 'obj');
         if (oseGetValue($ext, 'wel_email', false) && !$this->isLicensee) {
             $email = $member->getInstance('email');
             $emailTempDetail = $email->getDoc($ext->wel_email, 'obj');
             $variables = $email->getEmailVariablesWelcome($order_id, $msc_id);
             $emailParams = $email->buildEmailParams($emailTempDetail->type);
             $emailDetail = $email->transEmail($emailTempDetail, $variables, $emailParams);
             $email->sendEmail($emailDetail, $userInfo->email);
             $emailConfig = oseMscConfig::getConfig('email', 'obj');
             if ($emailConfig->sendWel2Admin) {
                 $email->sendToAdminGroup($emailDetail, $emailConfig->admin_group);
             }
         }
         $result = array();
         $result['success'] = true;
         $result['title'] = $result['status'] = 'Done';
         $result['content'] = $result['result'] = JText::_('MEMBERSHIP_JOIN_SUCCEED');
     } else {
         $result['success'] = false;
         $result['title'] = $result['status'] = 'Error';
         $result['content'] = $result['result'] = JText::_('MEMBERSHIP_JOIN_FAILED');
     }
     return $result;
 }
Example #8
0
	public static function cancel($params)
	{
		$result = array();
		$result['success'] = true;

		if(empty($params['allow_work']))
		{
			$result['success'] = false;
			$result['title'] = 'Error';
			$result['content'] = JText::_("Error");
			return $result;
		}
		unset($params['allow_work']);
		$member_id = $params['member_id'];
		$msc_id = $params['msc_id'];
		$user = JFactory::getUser($member_id);
		
		$db = oseDB::instance();
		
		$query = "SELECT * FROM `#__osemsc_member`"
				." WHERE `msc_id` = '{$msc_id}' AND `member_id` = '{$member_id}'"
				;
		$db->setQuery($query);
		$memInfo = oseDB::loadItem('obj');
		$memParams = oseJson::decode($memInfo->params,true);

		$order_id = $memParams['order_id'];
		$order_item_id = $memParams['order_item_id'];
		$query = " SELECT * FROM `#__osemsc_order`"
		." WHERE `order_id` = '{$order_id}'"
		;
		$db->setQuery($query);
		$order = oseDB::loadItem('obj');
		$oParams = oseJson::decode($order->params);
		//$msc_option = oseObject::getValue($oParams,'msc_option');
		
		$query = " SELECT * FROM `#__osemsc_order_item`"
				." WHERE `order_id` = '{$order_id}'"
				;
		$db->setQuery($query);
		$order_item = oseDB::loadItem('obj');
		$iParams = oseJson::decode($order_item->params);
		$msc_option = $iParams->msc_option;
		
		if(oseGetValue($oParams,'isLicensee',0))
		{
			$result['success'] = true;
			$result['title'] = JText::_('Done');
			$result['content'] = JText::_("Done");
				
			return $result;
		}

		$query = " SELECT * FROM `#__osemsc_ext`"
				." WHERE `id` = '{$msc_id}' AND `type` = 'oselic'"
				;
		$db->setQuery($query);
		$data = oseDB::loadItem('obj');
		$data = oseJson::decode($data->params);
		$data = oseObject::getValue($data,$msc_option,array());
		
		if( oseObject::getValue($data,'enable_license') )
		{
			oseRegistry :: register('user2', 'user2');
			oseRegistry :: register('lic', 'lic');
			oseRegistry :: register('email', 'email');
			oseRegistry :: register('locale', 'locale');
			$user = oseCall('user2')->instance( $member_id,'lic');
			
			$query = " SELECT * FROM `#__oselic_type_license_key`"
			." WHERE `license_id` = '{$oParams->license_id}' AND `licensee_id` > 0"
			;
			$db->setQuery($query);
			$licenseKeys = oseDB::loadList('obj');
			
			foreach($licenseKeys as $licenseKey)
			{
				if(!empty($licenseKey->licensee_id))
				{
					switch($licenseKey->app)
					{
						case('msc'):
							//version
							oseAppConfig::load( 'mscv6' );
							break;
						default:
							oseAppConfig::load($licenseKey->app);
						break;
					}
					$user = oseCall('user2')->instance($licenseKey->licensee_id,$licenseKey->app);
					$user->cancel($licenseKey->entry_id,$licenseKey->app);
				}
				else
				{
					continue;
				}
			}
				
			// delete license info
			oseDB::delete('#__oselic_type_license_key',array('license_id'=>$oParams->license_id));
			$updated = oseDB::delete('#__oselic_type_license',array('id'=>$oParams->license_id));
		}
		
		

		$result['success'] = true;
		$result['title'] = JText::_('Done');
		$result['content'] = JText::_("Done");

		return $result;

	}
Example #9
0
function oseGetAppTitle($app, $id, $entry_option = null)
{
    $db = oseDB::instance();
    switch ($app) {
        case 'contract':
            $query = " SELECT * FROM `#__ose_contract_plan`" . " WHERE `id` = '{$id}'";
            break;
        case 'msc':
            $query = " SELECT * FROM `#__osemsc_acl`" . " WHERE `id` = '{$id}'";
            break;
    }
    $db->setQuery($query);
    $appItem = oseDB::loadItem('obj');
    if (oseGetValue($appItem, 'parent_id', 0) > 1) {
        $title = oseGetAppTitle($app, $appItem->parent_id) . '-' . $appItem->title;
        return $title;
    } elseif ($app == 'msc' && oseGetVersion('com_osemsc') < 6 && !empty($entry_option)) {
        $query = "SELECT * FROM `#__osemsc_ext`" . " WHERE `type` = 'payment' AND `id` = '{$id}'";
        $db->setQuery($query);
        $planPayment = oseDB::loadItem('obj');
        $options = oseJSON::decode($planPayment->params, true);
        $option = oseGetValue($options, $entry_option, array());
        $title = $appItem->title . '-' . oseGetValue($option, 'optionname', '');
        return $title;
    } else {
        return $appItem->title;
    }
}
Example #10
0
 public static function getAdminGroup($app)
 {
     $config = self::load($app, '', 'obj');
     if (oseGetValue($config, 'admin_group', false) != false) {
         $mode = oseJson::decode($item->value);
     } else {
         $version = oseHTML::getJoomlaVersion();
         if ($version >= '1.6') {
             $db = JFactory::getDBO();
             $db->setQuery("SELECT id FROM #__usergroups");
             $groups = $db->loadObjectList();
             $admin_groups = array();
             foreach ($groups as $group) {
                 if (JAccess::checkGroup($group->id, 'core.login.admin')) {
                     $admin_groups[] = $group->id;
                 } elseif (JAccess::checkGroup($group->id, 'core.admin')) {
                     $admin_groups[] = $group->id;
                 }
             }
             $admin_groups = array_unique($admin_groups);
             return $admin_groups;
         } else {
             $mode = '[24,25]';
             $mode = oseJson::decode($mode);
         }
     }
     return $mode;
 }
Example #11
0
 function expire($id, $entry_type = 'msc', $entry_option = null)
 {
     $db = oseDB::instance();
     $query = " SELECT * FROM `{$this->_table}`" . " WHERE `msc_id`='{$id}' AND `member_id`='{$this->user_id}'";
     $db->setQuery($query);
     $item = oseDB::loadItem('obj');
     $mscInfo = $this->find($id);
     if (empty($info) || !in_array($info->get('status'), array(1, 3))) {
         // no need to quit if empty
         $result = array();
         $result['success'] = false;
         $result['title'] = JText::_('ERROR');
         $result['content'] = JText::_('NO_MEMBERSHIP_TO_CANCEL');
         return $result;
     }
     $info->set('status', 'expired');
     $updated = $info->update();
     // cancel addon
     if ($updated) {
         $addon = oseCall('msc')->instance('addon', array('user_id' => $this->user_id, 'mm_id' => $item->id));
         $jResult = $addon->runActionGroup('join', 'expire', false);
         $updated = $jResult['success'];
         if ($updated) {
             return $jResult;
         }
     }
     if ($updated) {
         $addon = oseCall('msc')->instance('addon', array('user_id' => $this->user_id, 'mm_id' => $item->id));
         $jResult = $addon->runActionGroup('join', 'cancel', false);
         $updated = $jResult['success'];
         if ($updated) {
             // cancel email
             $msc = oseCall('msc')->instance('plan', array('id' => $id));
             $mscExtmsc = $msc->getExt('msc');
             $exp_email = oseGetValue($mscExtmsc, 'exp_email');
             if (empty($exp_email)) {
                 $config = oseConfig::load($entry_type, 'email', 'obj');
                 $exp_email = oseGetValue($config, 'default_exp_email', 0);
             }
             if ($exp_email) {
                 $email = oseCall('email');
                 $eObj = $email->getEmail($exp_email);
                 $content = array();
                 $user = oseCall('user2')->instance($this->user_id);
                 $content['user'] = (object) $user->outputPayment($entry_type);
                 $mem = new stdClass();
                 $content['member'] = $mem;
                 $eObj->setEmailVariables($content);
                 $eObj->transEmail();
                 $eTemp = $eObj->output();
                 $email->sendEmail($eTemp, $this->get('email'));
                 //
                 if (oseGetValue($config, 'sendExp2Admin', false)) {
                     //$group = oseConfig::getAdminGroup('contract');
                     $group = explode(',', oseGetValue($config, 'email_admin_group'));
                     if (empty($group)) {
                         $group = oseConfig::getAdminGroup($entry_type);
                     }
                     $email->sendToGroup($eTemp, $group);
                 }
             }
             $result['success'] = true;
             $result['title'] = JText::_('SUCCESS');
             $result['content'] = JText::_('MEMBERSHIP_CANCEL_SUCCESS');
         }
         $result['success'] = true;
         $result['title'] = JText::_('SUCCESS');
         $result['content'] = JText::_('MEMBERSHIP_JOIN_SUCCEED');
     } else {
         $result['success'] = false;
         $result['title'] = JText::_('ERROR');
         $result['content'] = JText::_('MEMBERSHIP_JOIN_FAILED');
     }
     return $result;
 }
Example #12
0
	public static function renew($params)
	{
		$result = array();

	$result = array();
		$result['success'] = true;
		
		if(empty($params['allow_work']))
		{
			$result['success'] = false;
			$result['title'] = 'Error';
			$result['content'] = JText::_("Error");
			return $result;
		}
		unset($params['allow_work']);
		
		//oseExit($params);
		$db = oseDB::instance();
		$post = JRequest::get('post');
		$msc_id = $params['msc_id'];
		$member_id = $params['member_id'];
		$order_id = $params['order_id'];
		$order_item_id = $params['order_item_id'];
		
		if(empty($msc_id))
		{
			$result['success'] = false;
			$result['title'] = 'Error';
			$result['content'] = JText::_("Renew Msc: No Msc ID");
			return $result;
		}
		
		$query = " SELECT * FROM `#__osemsc_order`"
				." WHERE `order_id` = '{$order_id}'"
				;
		$db->setQuery($query);
		$order = oseDB::loadItem('obj');
		$oParams = oseJson::decode($order->params);
		//$msc_option = oseObject::getValue($oParams,'msc_option');
		
		$query = " SELECT * FROM `#__osemsc_order_item`"
				." WHERE `order_id` = '{$order_id}'"
				;
		$db->setQuery($query);
		$order_item = oseDB::loadItem('obj');
		$iParams = oseJson::decode($order_item->params);
		$msc_option = $iParams->msc_option;
		
		if(oseGetValue($oParams,'isLicensee',0))
		{
			$result['success'] = true;
			$result['title'] = JText::_('Done');
			$result['content'] = JText::_("Done");
			
			return $result;
		}
		
		$query = " SELECT * FROM `#__osemsc_ext`"
				." WHERE `id` = '{$msc_id}' AND `type` = 'oselic'"
				;
		$db->setQuery($query);
		$data = oseDB::loadItem('obj');
		$data = oseJson::decode($data->params);
		$data = oseObject::getValue($data,$msc_option,array());
		
		if( oseObject::getValue($data,'enable_license') )
		{
			oseRegistry :: register('user2', 'user2');
			
			oseRegistry :: register('lic', 'lic');
			oseRegistry :: register('email', 'email');
			oseRegistry :: register('locale', 'locale');
			$user = oseCall('user2')->instance( $member_id,'lic');
			$user->join( $data->license_id );
			
			$query = " SELECT * FROM `#__oselic_type_license`"
			." WHERE `user_id` = '{$member_id}'"
			." ORDER BY `id` DESC"
			." LIMIT 1"
			;
			$db->setQuery($query);
			$license = oseDB::loadItem('obj');
			$oParams->license_id = $license->id;

			$vals = array();
			$vals['order_id'] = $order_id;
			$vals['params'] = oseJson::encode($oParams);
			oseDB::update('#__osemsc_order','order_id',$vals);
			
			if( oseObject::getValue($data,'member_expiry_mode') == 1 )
			{
				$query = " SELECT * FROM `#__osemsc_member`"
				." WHERE `msc_id` = '{$msc_id}' AND `member_id` = '{$member_id}'"
				;
				$db->setQuery($query);
				$memInfo = oseDB::loadItem('obj');
					
				$vals = array();
				$vals['id'] = $license->id;
				$vals['expiry_date'] = $memInfo->expired_date;
				oseDB::update('#__oselic_type_license','id',$vals);
			}
			elseif( oseObject::getValue($data,'member_expiry_mode') == 2 )
			{
				$vals = array();
				$vals['id'] = $license->id;
				$vals['expiry_date'] = oseObject::getValue($data,'expiry_date');
				oseDB::update('#__oselic_type_license','id',$vals);
			}
		}
		

		$result['success'] = true;
		$result['title'] = JText::_('Done');
		$result['content'] = JText::_("Done");

		return $result;

	}
Example #13
0
 function __construct($info = array())
 {
     $params = oseGetValue($info, 'params');
     if (!empty($info)) {
         if (empty($params)) {
             $info = oseSetValue($info, 'params', '{}');
         }
         foreach ($info as $key => $value) {
             if (in_array($key, array('params', 'data', 'transactions'))) {
                 if (!is_array($value) && !is_object($value) && is_string($value)) {
                     if ($key == 'data') {
                         $this->set($key, oseJson::decode($value, true));
                     } else {
                         $this->set($key, oseJson::decode($value));
                     }
                 } else {
                     if (empty($value)) {
                         $this->set($key, $this->get($key));
                     } else {
                         $this->set($key, $value);
                     }
                 }
             } else {
                 $this->set($key, $value);
             }
         }
     } else {
         if (empty($params)) {
             $params = new stdClass();
             $this->set('params', $params);
         }
     }
 }
Example #14
0
 function load($data)
 {
     $i = 1;
     foreach ($data as $key => $item) {
         $ordering = oseGetValue($item, 'ordering', false);
         if (!$ordering) {
             if ($ordering != $i) {
                 $item = oseSetValue($item, 'ordering', $i);
                 $data[$key] = $item;
             }
         } else {
             $item = oseSetValue($item, 'ordering', $i);
             $data[$key] = $item;
         }
         $i++;
     }
     $this->data = $data;
 }
Example #15
0
 function treerecurse($id, $indent, $list, &$children)
 {
     $db = oseDB::instance();
     if (isset($children[$id])) {
         $total = count($children[$id]);
         $i = 0;
         foreach ($children[$id] as $node) {
             $id = $node->id;
             if (isset($children[$node->id])) {
                 if ($node->ordering == 1) {
                     if ($node->parent_id != 0) {
                         $parent = $this->getParentNode($node, 'obj');
                         $query = " UPDATE `{$this->_table}` " . " SET lft = " . oseGetValue($parent, 'lft') . " +1" . " WHERE id = {$node->id} ";
                         $db->setQuery($query);
                         oseDB::query();
                     }
                 } else {
                     $preSibling = $this->getSiblingNode($node, -1, 'obj');
                     $query = " UPDATE `{$this->_table}` " . " SET lft = " . oseGetValue($preSibling, 'rgt') . " +1" . " WHERE id = {$node->id} ";
                     $db->setQuery($query);
                     oseDB::query();
                 }
                 $this->TreeRecurse($id, $indent, $list, $children);
             } else {
                 if ($node->ordering == 1) {
                     if ($node->parent_id != 0) {
                         $parent = $this->getParentNode($node, 'obj');
                         $lft = oseGetValue($parent, 'lft');
                         $query = " UPDATE `{$this->_table}` " . " SET lft = {$lft} +1, rgt = {$lft} +2" . " WHERE id = {$node->id} ";
                         $db->setQuery($query);
                         oseDB::query();
                     }
                 } else {
                     $preSibling = $this->getSiblingNode($node, -1, 'obj');
                     $rgt = oseGetValue($preSibling, 'rgt');
                     $query = " UPDATE `{$this->_table}` " . " SET lft = {$rgt} +1,rgt = {$rgt} +2" . " WHERE id = {$node->id} ";
                     $db->setQuery($query);
                     oseDB::query();
                 }
             }
             if ($i == $total - 1) {
                 $node = $this->getNode($node->id, 'obj');
                 $query = " UPDATE `{$this->_table}` " . " SET rgt = {$node->rgt} + 1 " . " WHERE id = {$node->parent_id} ";
                 $db->setQuery($query);
                 oseDB::query();
             }
             $i++;
         }
     }
     return true;
 }