Sindbad~EG File Manager

Current Path : /home/sarayaglobal/sarayamystair.in/libraries/foxcontact/html/
Upload File :
Current File : /home/sarayaglobal/sarayamystair.in/libraries/foxcontact/html/useragentparser.php

<?php defined("_JEXEC") or die(file_get_contents("index.html"));

/**
 * @package   Fox Contact for Joomla
 * @copyright Copyright (c) 2010 - 2015 Demis Palma. All rights reserved.
 * @license   Distributed under the terms of the GNU General Public License GNU/GPL v3 http://www.gnu.org/licenses/gpl-3.0.html
 * @see       Documentation: http://www.fox.ra.it/forum/2-documentation.html
 */


/**
 * Class FoxHtmlUserAgentParser
 * Based on UAParser.js 0.7.7 commit 1fa7137f1f311043ccf65bb94ffc5ce5f273f77f
 */
class FoxHtmlUserAgentParser
{
	///////////////
	// String map
	//////////////

	private $aryMaps = array(

		'browser' => array(
			'oldsafari' => array(
				'version' => array(
					'1.0' => '/8',
					'1.2' => '/1',
					'1.3' => '/3',
					'2.0' => '/412',
					'2.0.2' => '/416',
					'2.0.3' => '/417',
					'2.0.4' => '/419',
					'?' => '/'
				)
			)
		),

		'device' => array(
			'amazon' => array(
				'model' => array(
					'Fire Phone' => array('SD', 'KF')
				)
			),
			'sprint' => array(
				'model' => array(
					'Evo Shift 4G' => '7373KT'
				),
				'vendor' => array(
					'HTC' => 'APA',
					'Sprint' => 'Sprint'
				)
			)
		),

		'os' => array(
			'windows' => array(
				'version' => array(
					'ME' => '4.90',
					'NT 3.11' => 'NT3.51',
					'NT 4.0' => 'NT4.0',
					'2000' => 'NT 5.0',
					'XP' => array('NT 5.1', 'NT 5.2'),
					'Vista' => 'NT 6.0',
					'7' => 'NT 6.1',
					'8' => 'NT 6.2',
					'8.1' => 'NT 6.3',
					'10' => array('NT 6.4', 'NT 10.0'),
					'RT' => 'ARM'
				)
			)
		)
	);

	//////////////
	// Regex map
	/////////////
	private $aryRegexes = array();

	//default properties
	private $aryBrowserProp = array('NAME' => '-', 'VERSION' => '-');
	private $aryOS_Prop = array('NAME' => '-', 'VERSION' => '-');
	private $aryDeviceProp = array('MODEL' => '-', 'VENDOR' => '-', 'TYPE' => '-');

	//String variable which contains user agent string
	private $strUserAgent;


	function __construct($strOperateUA = '')
	{
		$this->aryRegexes = array(

			'browser' => array(
				array(

					// Presto based
					'/(opera\smini)\/([\w\.-]+)/i',
					// Opera Mini
					'/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i',
					// Opera Mobi/Tablet
					'/(opera).+version\/([\w\.]+)/i',
					// Opera > 9.80
					'/(opera)[\/\s]+([\w\.]+)/i'
					// Opera < 9.80

				),
				array(
					'NAME',
					'VERSION'
				),
				array(

					'/\s(opr)\/([\w\.]+)/i'
					// Opera Webkit
				),
				array(
					array(
						'NAME',
						'Opera'
					),
					'VERSION'
				),
				array(

					// Mixed
					'/(kindle)\/([\w\.]+)/i',
					// Kindle
					'/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i',
					// Lunascape/Maxthon/Netfront/Jasmine/Blazer

					// Trident based
					'/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i',
					// Avant/IEMobile/SlimBrowser/Baidu
					'/(?:ms|\()(ie)\s([\w\.]+)/i',
					// Internet Explorer

					// Webkit/KHTML based
					'/(rekonq)\/([\w\.]+)*/i',
					// Rekonq
					'/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i'
					// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/vivaldi
				),
				array(
					'NAME',
					'VERSION'
				),
				array(

					'/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i',
					// IE11
					'/(Edge)\/((\d+)?[\w\.]+)/i'
					// IE12
				),
				array(
					array(
						'NAME',
						'IE'
					),
					'VERSION'
				),
				array(

					'/(yabrowser)\/([\w\.]+)/i'
					// Yandex
				),
				array(
					array(
						'NAME',
						'Yandex'
					),
					'VERSION'
				),
				array(

					'/(comodo_dragon)\/([\w\.]+)/i'
					// Comodo Dragon
				),
				array(
					array(
						'NAME',
						'/_/i',
						' '
					),
					'VERSION'
				),
				array(

					'/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i',
					// Chrome/OmniWeb/Arora/Tizen/Nokia
					'/(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i'
					//UCBrowser/QQBrowser
				),
				array(
					'NAME',
					'VERSION'
				),
				array(

					'/(dolfin)\/([\w\.]+)/i'
					// Dolphin
				),
				array(
					array(
						'NAME',
						'Dolphin'
					),
					'VERSION'
				),
				array(

					'/((?:android.+)crmo|crios)\/([\w\.]+)/i'
					// Chrome for Android/iOS
				),
				array(
					array(
						'NAME',
						'Chrome'
					),
					'VERSION'
				),
				array(

					'/XiaoMi\/MiuiBrowser\/([\w\.]+)/i'
					// MIUI Browser
				),
				array(
					'VERSION',
					array(
						'NAME',
						'MIUI Browser'
					)
				),
				array(

					'/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i'
					// Android Browser
				),
				array(
					'VERSION',
					array(
						'NAME',
						'Android Browser'
					)
				),
				array(

					'/FBAV\/([\w\.]+);/i'
					// Facebook App for iOS
				),
				array(
					'VERSION',
					array(
						'NAME',
						'Facebook'
					)
				),
				array(

					'/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i'
					// Mobile Safari
				),
				array(
					'VERSION',
					array(
						'NAME',
						'Mobile Safari'
					)
				),
				array(

					'/version\/([\w\.]+).+?(mobile\s?safari|safari)/i'
					// Safari & Safari Mobile
				),
				array(
					'VERSION',
					'NAME'
				),
				array(

					'/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i'
					// Safari < 3.0
				),
				array(
					'NAME',
					array(
						'VERSION',
						'mapper_str',
						$this->aryMaps['browser']['oldsafari']['version']
					)
				),
				array(

					'/(konqueror)\/([\w\.]+)/i',
					// Konqueror
					'/(webkit|khtml)\/([\w\.]+)/i'
				),
				array(
					'NAME',
					'VERSION'
				),
				array(

					// Gecko based
					'/(navigator|netscape)\/([\w\.-]+)/i'
					// Netscape
				),
				array(
					array(
						'NAME',
						'Netscape'
					),
					'VERSION'
				),
				array(
					'/(swiftfox)/i',
					// Swiftfox
					'/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i',
					// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
					'/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i',
					// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
					'/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i',
					// Mozilla

					// Other
					'/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i',
					// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf
					'/(links)\s\(([\w\.]+)/i',
					// Links
					'/(gobrowser)\/?([\w\.]+)*/i',
					// GoBrowser
					'/(ice\s?browser)\/v?([\w\._]+)/i',
					// ICE Browser
					'/(mosaic)[\/\s]([\w\.]+)/i'
					// Mosaic
				),
				array(
					'NAME',
					'VERSION'
				)

			),
			'device' => array(
				array(

					'/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i'
					// iPad/PlayBook
				),
				array(
					'MODEL',
					'VENDOR',
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/applecoremedia\/[\w\.]+ \((ipad)/'
					// iPad
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Apple'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/(apple\s{0,1}tv)/i'
					// Apple TV
				),
				array(
					array(
						'MODEL',
						'Apple TV'
					),
					array(
						'VENDOR',
						'Apple'
					)
				),
				array(
					'/(archos)\s(gamepad2?)/i',
					// Archos
					'/(hp).+(touchpad)/i',
					// HP TouchPad
					'/(kindle)\/([\w\.]+)/i',
					// Kindle
					'/\s(nook)[\w\s]+build\/(\w+)/i',
					// Nook
					'/(dell)\s(strea[kpr\s\d]*[\dko])/i'
					// Dell Streak
				),
				array(
					'VENDOR',
					'MODEL',
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i'
					// Kindle Fire HD
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Amazon'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(
					'/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i'
					// Fire Phone
				),
				array(
					array(
						'MODEL',
						'mapper_str',
						$this->aryMaps['device']['amazon']['model']
					),
					array(
						'VENDOR',
						'Amazon'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/\((ip[honed|\s\w*]+);.+(apple)/i'
					// iPod/iPhone
				),
				array(
					'MODEL',
					'VENDOR',
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(
					'/\((ip[honed|\s\w*]+);/i'
					// iPod/iPhone
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Apple'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/(blackberry)[\s-]?(\w+)/i',
					// BlackBerry
					'/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i',
					// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron
					'/(hp)\s([\w\s]+\w)/i',
					// HP iPAQ
					'/(asus)-?(\w+)/i'
					// Asus
				),
				array(
					'VENDOR',
					'MODEL',
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(
					'/\(bb10;\s(\w+)/i'
					// BlackBerry 10
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'BlackBerry'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(
					// Asus Tablets
					'/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7)/i'
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Asus'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/(sony)\s(tablet\s[ps])\sbuild\//i',
					// Sony Tablets
					'/(sony)?(?:sgp.+)\sbuild\//i'
				),
				array(
					array(
						'VENDOR',
						'Sony'
					),
					array(
						'MODEL',
						'Xperia Tablet'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(
					'/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i'
				),
				array(
					array(
						'VENDOR',
						'Sony'
					),
					array(
						'MODEL',
						'Xperia Phone'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(
					'/\s(ouya)\s/i',
					// Ouya
					'/(nintendo)\s([wids3u]+)/i'
					// Nintendo
				),
				array(
					'VENDOR',
					'MODEL',
					array(
						'TYPE',
						'CONSOLE'
					)
				),
				array(

					'/android.+;\s(shield)\sbuild/i'
					// Nvidia
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Nvidia'
					),
					array(
						'TYPE',
						'CONSOLE'
					)
				),
				array(

					'/(playstation\s[3portablevi]+)/i'
					// Playstation
				),
				array(
					array(
						'VENDOR',
						'Sony'
					),
					'MODEL',
					array(
						'TYPE',
						'CONSOLE'
					)
				),
				array(

					'/(sprint\s(\w+))/i'
					// Sprint Phones
				),
				array(
					array(
						'VENDOR',
						'mapper_str',
						$this->aryMaps['device']['sprint']['vendor']
					),
					array(
						'MODEL',
						'mapper_str',
						$this->aryMaps['device']['sprint']['model']
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i'
					// Lenovo tablets
				),
				array(
					array(
						'VENDOR',
						'Lenovo'
					),
					'MODEL',
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i',
					// HTC
					'/(zte)-(\w+)*/i',
					// ZTE
					'/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i'
					// Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
				),
				array(
					'VENDOR',
					array(
						'MODEL',
						'/_/i',
						' '
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/(nexus\s9)/i'
					// HTC Nexus 9
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'HTC'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/[\s\(;](xbox(?:\sone)?)[\s\);]/i'
					// Microsoft Xbox
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Microsoft'
					),
					array(
						'TYPE',
						'CONSOLE'
					)
				),
				array(
					'/(kin\.[onetw]{3})/i'
					// Microsoft Kin
				),
				array(
					array(
						'MODEL',
						'/\./',
						' '
					),
					array(
						'VENDOR',
						'Microsoft'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					// Motorola
					'/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i',
					'/mot[\s-]?(\w+)*/i',
					'/(XT\d{3,4}) build\//i'
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Motorola'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(
					'/android.+\s((mz60\d|xoom[\s2]{0,2}))\sbuild\//i'
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Motorola'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n8000|sgh-t8[56]9|nexus 10))/i',
					'/((SM-T\w+))/i'
				),
				array(
					array(
						'VENDOR',
						'Samsung'
					),
					'MODEL',
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(                  // Samsung
					'/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-n900))/i',
					'/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i',
					'/sec-((sgh\w+))/i'
				),
				array(
					array(
						'VENDOR',
						'Samsung'
					),
					'MODEL',
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(
					'/(samsung);smarttv/i'
				),
				array(
					'VENDOR',
					'MODEL',
					array(
						'TYPE',
						'SMARTTV'
					)
				),
				array(

					'/\(dtv[\);].+(aquos)/i'
					// Sharp
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Sharp'
					),
					array(
						'TYPE',
						'SMARTTV'
					)
				),
				array(
					'/sie-(\w+)*/i'
					// Siemens
				),
				array(
					array(
						'VENDOR',
						'Siemens'
					),
					'MODEL',
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/(maemo|nokia).*(n900|lumia\s\d+)/i',
					// Nokia
					'/(nokia)[\s_-]?([\w-]+)*/i',
				),
				array(
					array(
						'VENDOR',
						'Nokia'
					),
					'MODEL',
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/android\s3\.[\s\w;-]{10}(a\d{3})/i'
					// Acer
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Acer'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i'
					// LG Tablet
				),
				array(
					array(
						'VENDOR',
						'LG'
					),
					'MODEL',
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(
					'/(lg) netcast\.tv/i'
					// LG SmartTV
				),
				array(
					'VENDOR',
					array(
						'TYPE',
						'SMARTTV'
					)
				),
				array(
					'/(nexus\s[45])/i',
					// LG
					'/lg[e;\s\/-]+(\w+)*/i'
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'LG'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/android.+(ideatab[a-z0-9\-\s]+)/i'
					// Lenovo
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Lenovo'
					),
					array(
						'TYPE',
						'TABLET'
					)
				),
				array(

					'/linux;.+((jolla));/i'
					// Jolla
				),
				array(
					'VENDOR',
					'MODEL',
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(
					'/((pebble))app\/[\d\.]+\s/i'
					// Pebble
				),
				array(
					'VENDOR',
					'MODEL',
					array(
						'TYPE',
						'WEARABLE'
					)
				),
				array(

					'/android.+;\s(glass)\s\d/i'
					// Google Glass
				),
				array(
					'MODEL',
					array(
						'VENDOR',
						'Google'
					),
					array(
						'TYPE',
						'WEARABLE'
					)
				),
				array(

					'/android.+(\w+)\s+build\/hm\1/i',
					// Xiaomi Hongmi 'numeric' models
					'/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i',
					// Xiaomi Hongmi
					'/android.+(mi[\s\-_]*(?:one|one[\s_]plus)?[\s_]*(?:\d\w)?)\s+build/i'
					// Xiaomi Mi
				),
				array(
					array(
						'MODEL',
						'/_/',
						' '
					),
					array(
						'VENDOR',
						'Xiaomi'
					),
					array(
						'TYPE',
						'MOBILE'
					)
				),
				array(

					'/(mobile|tablet);.+rv\:.+gecko\//i'
					// Unidentifiable
				),
				array(
					array(
						'TYPE',
						'util.lowerize'
					),
					'VENDOR',
					'MODEL'
				)
			)
		,

			'os' => array(
				array(

					// Windows based
					'/microsoft\s(windows)\s(vista|xp)/i'
					// Windows (iTunes)
				),
				array(
					'NAME',
					'VERSION'
				),
				array(
					'/(windows)\snt\s6\.2;\s(arm)/i',
					// Windows RT
					'/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i'
				),
				array(
					'NAME',
					array(
						'VERSION',
						'mapper_str',
						$this->aryMaps['os']['windows']['version']
					)
				),
				array(
					'/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i'
				),
				array(
					array(
						'NAME',
						'Windows'
					),
					array(
						'VERSION',
						'mapper_str',
						$this->aryMaps['os']['windows']['version']
					)
				),
				array(

					// Mobile/Embedded OS
					'/\((bb)(10);/i'
					// BlackBerry 10
				),
				array(
					array(
						'NAME',
						'BlackBerry'
					),
					'VERSION'
				),
				array(
					'/(blackberry)\w*\/?([\w\.]+)*/i',
					// Blackberry
					'/(tizen)[\/\s]([\w\.]+)/i',
					// Tizen
					'/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i',
					// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
					'/linux;.+(sailfish);/i'
					// Sailfish OS
				),
				array(
					'NAME',
					'VERSION'
				),
				array(
					'/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i'
					// Symbian
				),
				array(
					array(
						'NAME',
						'Symbian'
					),
					'VERSION'
				),
				array(
					'/\((series40);/i'
					// Series 40
				),
				array('NAME'),
				array(
					'/mozilla.+\(mobile;.+gecko.+firefox/i'
					// Firefox OS
				),
				array(
					array(
						'NAME',
						'Firefox OS'
					),
					'VERSION'
				),
				array(

					// Console
					'/(nintendo|playstation)\s([wids3portablevu]+)/i',
					// Nintendo/Playstation

					// GNU/Linux based
					'/(mint)[\/\s\(]?(\w+)*/i',
					// Mint
					'/(mageia|vectorlinux)[;\s]/i',
					// Mageia/VectorLinux
					'/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk)[\/\s-]?([\w\.-]+)*/i',
					// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
					// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk
					'/(hurd|linux)\s?([\w\.]+)*/i',
					// Hurd/Linux
					'/(gnu)\s?([\w\.]+)*/i'
					// GNU
				),
				array(
					'NAME',
					'VERSION'
				),
				array(

					'/(cros)\s[\w]+\s([\w\.]+\w)/i'
					// Chromium OS
				),
				array(
					array(
						'NAME',
						'Chromium OS'
					),
					'VERSION'
				),
				array(

					// Solaris
					'/(sunos)\s?([\w\.]+\d)*/i'
					// Solaris
				),
				array(
					array(
						'NAME',
						'Solaris'
					),
					'VERSION'
				),
				array(

					// BSD based
					'/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i'
					// FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
				),
				array(
					'NAME',
					'VERSION'
				),
				array(

					'/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i'
					// iOS
				),
				array(
					array(
						'NAME',
						'iOS'
					),
					array(
						'VERSION',
						'/_/i',
						'.'
					)
				),
				array(
					'/(mac\sos\sx)\s?([\w\s\.]+\w)*/i',
					'/(macintosh|mac(?=_powerpc)\s)/i'
					// Mac OS
				),
				array(
					array(
						'NAME',
						'Mac OS'
					),
					array(
						'VERSION',
						'/_/i',
						'.'
					)
				),
				array(

					// Other
					'/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i',
					// Solaris
					'/(haiku)\s(\w+)/i',
					// Haiku
					'/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i',
					// AIX
					'/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i',
					//  Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
					'/(unix)\s?([\w\.]+)*/i'
					// UNIX
				),
				array(
					'NAME',
					'VERSION'
				)
			)

		);
		$this->strUserAgent = $strOperateUA;
	}


	//Set the current user agent
	public function setUA($strOperateUA)
	{
		$this->strUserAgent = $strOperateUA;
	}


	//return the browser details
	public function getBrowser()
	{
		$aryBrowser = array_merge($this->aryBrowserProp, $this->applyRegex($this->aryRegexes['browser']));

		//Get the major version from the complete version number
		$parts = explode('.', $aryBrowser['VERSION']);
		$aryBrowser['major'] = $parts[0];

		return $aryBrowser;
	}


	//return the os details
	public function getOS()
	{
		return array_merge($this->aryOS_Prop, $this->applyRegex($this->aryRegexes['os']));
	}


	//return the device details
	public function getDevice()
	{
		return array_merge($this->aryDeviceProp, $this->applyRegex($this->aryRegexes['device']));
	}


	//Verify each regular expression
	private function applyRegex($aryRegexSet)
	{
		if ('' == $this->strUserAgent) return array();
		for ($cntrI = 0; $cntrI < count($aryRegexSet); $cntrI += 2)
		{

			for ($cntrJ = 0; $cntrJ < count($aryRegexSet[$cntrI]); $cntrJ++)
			{
				if (0 < preg_match_all($aryRegexSet[$cntrI][$cntrJ], $this->strUserAgent, $aryMatches))
				{
					$aryResultProp = $aryRegexSet[$cntrI + 1];

					$aryResult = array();

					for ($cntrK = 0; $cntrK < count($aryResultProp); $cntrK++)
					{
						if (!isset($aryMatches[$cntrK + 1][0]))
						{
							$strFinalValue = '';
						}
						else
						{
							$strFinalValue = $aryMatches[$cntrK + 1][0];
						}
						if (is_array($aryResultProp[$cntrK]))
						{

							switch (count($aryResultProp[$cntrK]))
							{
								case 2:
									if (function_exists($aryResultProp[$cntrK][1]))
									{
										// assign modified match
										$strFinalValue = $$aryResultProp[$cntrK][1]($strFinalValue);
									}
									else
									{
										// assign given value, ignore regex match
										$strFinalValue = $aryResultProp[$cntrK][1];
									}
									break;
								case 3:
									// check whether function or regex

									if (function_exists($aryResultProp[$cntrK][1]))
									{
										// call function (usually string mapper)
										$strFinalValue = $aryResultProp[$cntrK][1]($strFinalValue, $aryResultProp[$cntrK][2]);
									}
									else
									{
										// sanitize match using given regex
										$strFinalValue = preg_replace($aryResultProp[$cntrK][1], $aryResultProp[$cntrK][2], $strFinalValue);
									}
									break;
								case 4:
									if (function_exists($aryResultProp[$cntrK][3]))
									{
										$strFinalValue = $$aryResultProp[$cntrK][3]($strFinalValue, $aryResultProp[$cntrK][1], $aryResultProp[$cntrK][2]);
									}
							}

							$aryResult[$aryResultProp[$cntrK][0]] = $strFinalValue;
						}
						else
						{
							$aryResult[$aryResultProp[$cntrK]] = $strFinalValue;
						}
					}//Populate properties of array depending on the type of element
					return ($aryResult);

					break;
				}
			}//Loop through each regex

		}//Loop through each regex set
		return array();
	}
}//Class for parsing User Agent ends

//Replace final value with more user friendly details
function mapper_str($strToCheck, $aryMap)
{

	foreach ($aryMap as $keyMap => $valMap)
	{
		// check if array
		if (is_array($valMap) && count($valMap) > 0)
		{
			foreach ($valMap as $valStrMap)
			{
				if (false !== stripos($strToCheck, $valStrMap))
				{
					return $keyMap;
				}
			}
		}
		else
		{

			if (false !== stripos($strToCheck, $valMap))
			{
				return $keyMap;
			}
		}
	}
	return $strToCheck;
}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists