ua-parser-js 0.7.24 → 0.7.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ua-parser-js might be problematic. Click here for more details.

package/src/ua-parser.js CHANGED
@@ -1,5 +1,5 @@
1
- /*!
2
- * UAParser.js v0.7.24
1
+ /*!@license
2
+ * UAParser.js v0.7.28
3
3
  * Lightweight JavaScript-based User-Agent string parser
4
4
  * https://github.com/faisalman/ua-parser-js
5
5
  *
@@ -16,7 +16,7 @@
16
16
  /////////////
17
17
 
18
18
 
19
- var LIBVERSION = '0.7.24',
19
+ var LIBVERSION = '0.7.28',
20
20
  EMPTY = '',
21
21
  UNKNOWN = '?',
22
22
  FUNC_TYPE = 'function',
@@ -35,7 +35,8 @@
35
35
  TABLET = 'tablet',
36
36
  SMARTTV = 'smarttv',
37
37
  WEARABLE = 'wearable',
38
- EMBEDDED = 'embedded';
38
+ EMBEDDED = 'embedded',
39
+ UA_MAX_LENGTH = 255;
39
40
 
40
41
 
41
42
  ///////////
@@ -56,11 +57,7 @@
56
57
  return mergedRegexes;
57
58
  },
58
59
  has : function (str1, str2) {
59
- if (typeof str1 === "string") {
60
- return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
61
- } else {
62
- return false;
63
- }
60
+ return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;
64
61
  },
65
62
  lowerize : function (str) {
66
63
  return str.toLowerCase();
@@ -68,8 +65,9 @@
68
65
  major : function (version) {
69
66
  return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
70
67
  },
71
- trim : function (str) {
72
- return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
68
+ trim : function (str, len) {
69
+ str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
70
+ return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
73
71
  }
74
72
  };
75
73
 
@@ -160,7 +158,8 @@
160
158
  var maps = {
161
159
 
162
160
  browser : {
163
- oldsafari : {
161
+ // Safari < 3.0
162
+ oldSafari : {
164
163
  version : {
165
164
  '1.0' : '/8',
166
165
  '1.2' : '/1',
@@ -171,22 +170,16 @@
171
170
  '2.0.4' : '/419',
172
171
  '?' : '/'
173
172
  }
174
- }
175
- },
176
-
177
- device : {
178
- amazon : {
179
- model : {
180
- 'Fire Phone' : ['SD', 'KF']
181
- }
182
173
  },
183
- sprint : {
184
- model : {
185
- 'Evo Shift 4G' : '7373KT'
186
- },
187
- vendor : {
188
- 'HTC' : 'APA',
189
- 'Sprint' : 'Sprint'
174
+ oldEdge : {
175
+ version : {
176
+ '0.1' : '12.',
177
+ '21' : '13.',
178
+ '31' : '14.',
179
+ '39' : '15.',
180
+ '41' : '16.',
181
+ '42' : '17.',
182
+ '44' : '18.'
190
183
  }
191
184
  }
192
185
  },
@@ -220,162 +213,110 @@
220
213
 
221
214
  browser : [[
222
215
 
216
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
217
+ ], [VERSION, [NAME, 'Chrome']], [
218
+ /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
219
+ ], [VERSION, [NAME, 'Edge']], [
220
+ // breaking change (reserved for next major release):
221
+ ///edge\/([\w\.]+)/i // Old Edge (Trident)
222
+ //], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [
223
+
223
224
  // Presto based
224
225
  /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
225
- /(opera\s[mobiletab]{3,6}).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
226
- /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
227
- /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
226
+ /(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
227
+ /(opera)(?:.+version\/|[\/\s]+)([\w\.]+)/i, // Opera
228
228
  ], [NAME, VERSION], [
229
-
230
- /(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
231
- ], [[NAME, 'Opera Mini'], VERSION], [
232
-
233
- /\s(opr)\/([\w\.]+)/i // Opera Webkit
234
- ], [[NAME, 'Opera'], VERSION], [
229
+ /opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
230
+ ], [VERSION, [NAME, 'Opera Mini']], [
231
+ /\sopr\/([\w\.]+)/i // Opera Webkit
232
+ ], [VERSION, [NAME, 'Opera']], [
235
233
 
236
234
  // Mixed
237
235
  /(kindle)\/([\w\.]+)/i, // Kindle
238
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
239
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer
236
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
240
237
  // Trident based
241
- /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,
242
- // Avant/IEMobile/SlimBrowser
243
- /(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
238
+ /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
239
+ /(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
244
240
  /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
245
241
 
246
242
  // Webkit/KHTML based
247
- /(rekonq)\/([\w\.]*)/i, // Rekonq
248
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i
249
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
243
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
244
+ // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
245
+ /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
246
+ /(weibo)__([\d\.]+)/i // Weibo
250
247
  ], [NAME, VERSION], [
251
-
252
- /(konqueror)\/([\w\.]+)/i // Konqueror
253
- ], [[NAME, 'Konqueror'], VERSION], [
254
-
255
- /(trident).+rv[:\s]([\w\.]{1,9}).+like\sgecko/i // IE11
256
- ], [[NAME, 'IE'], VERSION], [
257
-
258
- /(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
259
- ], [[NAME, 'Edge'], VERSION], [
260
-
261
- /(yabrowser)\/([\w\.]+)/i // Yandex
262
- ], [[NAME, 'Yandex'], VERSION], [
263
-
264
- /(Avast)\/([\w\.]+)/i // Avast Secure Browser
265
- ], [[NAME, 'Avast Secure Browser'], VERSION], [
266
-
267
- /(AVG)\/([\w\.]+)/i // AVG Secure Browser
268
- ], [[NAME, 'AVG Secure Browser'], VERSION], [
269
-
270
- /(puffin)\/([\w\.]+)/i // Puffin
271
- ], [[NAME, 'Puffin'], VERSION], [
272
-
273
- /(focus)\/([\w\.]+)/i // Firefox Focus
274
- ], [[NAME, 'Firefox Focus'], VERSION], [
275
-
276
- /(opt)\/([\w\.]+)/i // Opera Touch
277
- ], [[NAME, 'Opera Touch'], VERSION], [
278
-
279
- /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
280
- ], [[NAME, 'UCBrowser'], VERSION], [
281
-
248
+ /(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
249
+ ], [VERSION, [NAME, 'UCBrowser']], [
250
+ /(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
251
+ ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
252
+ /micromessenger\/([\w\.]+)/i // WeChat
253
+ ], [VERSION, [NAME, 'WeChat']], [
254
+ /konqueror\/([\w\.]+)/i // Konqueror
255
+ ], [VERSION, [NAME, 'Konqueror']], [
256
+ /trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11
257
+ ], [VERSION, [NAME, 'IE']], [
258
+ /yabrowser\/([\w\.]+)/i // Yandex
259
+ ], [VERSION, [NAME, 'Yandex']], [
260
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
261
+ ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [
262
+ /focus\/([\w\.]+)/i // Firefox Focus
263
+ ], [VERSION, [NAME, 'Firefox Focus']], [
264
+ /opt\/([\w\.]+)/i // Opera Touch
265
+ ], [VERSION, [NAME, 'Opera Touch']], [
266
+ /coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
267
+ ], [VERSION, [NAME, 'Coc Coc']], [
268
+ /dolfin\/([\w\.]+)/i // Dolphin
269
+ ], [VERSION, [NAME, 'Dolphin']], [
270
+ /coast\/([\w\.]+)/i // Opera Coast
271
+ ], [VERSION, [NAME, 'Opera Coast']],
272
+ [/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
273
+ ], [VERSION, [NAME, 'MIUI Browser']], [
274
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
275
+ ], [VERSION, [NAME, 'Firefox']], [
276
+ /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
277
+ ], [[NAME, '360 Browser']], [
278
+ /(oculus|samsung|sailfish)browser\/([\w\.]+)/i
279
+ ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser
282
280
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
283
281
  ], [[NAME, /_/g, ' '], VERSION], [
284
-
285
- /(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
286
- ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
287
-
288
- /(micromessenger)\/([\w\.]+)/i // WeChat
289
- ], [[NAME, 'WeChat'], VERSION], [
290
-
291
- /(brave)\/([\w\.]+)/i // Brave browser
292
- ], [[NAME, 'Brave'], VERSION], [
293
-
294
- /(whale)\/([\w\.]+)/i // Whale browser
295
- ], [[NAME, 'Whale'], VERSION], [
296
-
297
- /(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
298
- ], [NAME, VERSION], [
299
-
300
- /(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
282
+ /\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App
283
+ /(tesla)(?:\sqtcarbrowser|\/(20[12]\d\.[\w\.-]+))/i, // Tesla
284
+ /m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
301
285
  ], [NAME, VERSION], [
302
-
303
- /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
304
- ], [NAME, VERSION], [
305
-
306
- /(baiduboxapp)[\/\s]?([\w\.]+)/i // Baidu App
307
- ], [NAME, VERSION], [
308
-
309
- /(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
310
- ], [NAME, VERSION], [
311
-
312
- /(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
313
- ], [NAME], [
314
-
286
+ /(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
315
287
  /(LBBROWSER)/i // LieBao Browser
316
288
  ], [NAME], [
317
289
 
318
- /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
319
- ], [VERSION, [NAME, 'MIUI Browser']], [
320
-
290
+ // WebView
321
291
  /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
322
292
  ], [VERSION, [NAME, 'Facebook']], [
323
-
324
293
  /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
325
294
  ], [[NAME, 'Facebook']], [
326
-
327
295
  /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
328
- /android.+(line)\/([\w\.]+)\/iab/i // Line App for Android
296
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
297
+ /(chromium|instagram)[\/\s]([\w\.-]+)/i // Chromium/Instagram
329
298
  ], [NAME, VERSION], [
299
+ /\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS
300
+ ], [VERSION, [NAME, 'GSA']], [
330
301
 
331
302
  /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
332
303
  ], [VERSION, [NAME, 'Chrome Headless']], [
333
304
 
334
305
  /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
335
- ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
306
+ ], [[NAME, 'Chrome WebView'], VERSION], [
336
307
 
337
- /((?:oculus|samsung)browser)\/([\w\.]+)/i
338
- ], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
339
-
340
- /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
308
+ /droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser
341
309
  ], [VERSION, [NAME, 'Android Browser']], [
342
310
 
343
- /(coc_coc_browser)\/([\w\.]+)/i // Coc Coc Browser
344
- ], [[NAME, 'Coc Coc'], VERSION], [
345
-
346
- /(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
347
- ], [[NAME, 'Sailfish Browser'], VERSION], [
348
-
349
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
350
- // Chrome/OmniWeb/Arora/Tizen/Nokia
311
+ /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
351
312
  ], [NAME, VERSION], [
352
313
 
353
- /(dolfin)\/([\w\.]+)/i // Dolphin
354
- ], [[NAME, 'Dolphin'], VERSION], [
355
-
356
- /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
357
- ], [[NAME, '360 Browser']], [
358
-
359
- /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
360
- ], [[NAME, 'Chrome'], VERSION], [
361
-
362
- /(coast)\/([\w\.]+)/i // Opera Coast
363
- ], [[NAME, 'Opera Coast'], VERSION], [
364
-
365
- /fxios\/([\w\.-]+)/i // Firefox for iOS
366
- ], [VERSION, [NAME, 'Firefox']], [
367
-
368
314
  /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
369
315
  ], [VERSION, [NAME, 'Mobile Safari']], [
370
-
371
316
  /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
372
317
  ], [VERSION, NAME], [
373
-
374
- /webkit.+?(gsa)\/([\w\.]+)\s.*(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
375
- ], [[NAME, 'GSA'], VERSION], [
376
-
377
318
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
378
- ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
319
+ ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [
379
320
 
380
321
  /(webkit|khtml)\/([\w\.]+)/i
381
322
  ], [NAME, VERSION], [
@@ -383,11 +324,13 @@
383
324
  // Gecko based
384
325
  /(navigator|netscape)\/([\w\.-]+)/i // Netscape
385
326
  ], [[NAME, 'Netscape'], VERSION], [
327
+ /ile\svr;\srv:([\w\.]+)\).+firefox/i // Firefox Reality
328
+ ], [VERSION, [NAME, 'Firefox Reality']], [
329
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
386
330
  /(swiftfox)/i, // Swiftfox
387
331
  /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
388
332
  // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
389
333
  /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
390
-
391
334
  // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
392
335
  /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
393
336
  /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
@@ -404,15 +347,21 @@
404
347
 
405
348
  cpu : [[
406
349
 
407
- /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64
350
+ /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64)
408
351
  ], [[ARCHITECTURE, 'amd64']], [
409
352
 
410
353
  /(ia32(?=;))/i // IA32 (quicktime)
411
354
  ], [[ARCHITECTURE, util.lowerize]], [
412
355
 
413
- /((?:i[346]|x)86)[;\)]/i // IA32
356
+ /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
414
357
  ], [[ARCHITECTURE, 'ia32']], [
415
358
 
359
+ /\b(aarch64|armv?8e?l?)\b/i // ARM64
360
+ ], [[ARCHITECTURE, 'arm64']], [
361
+
362
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
363
+ ], [[ARCHITECTURE, 'armhf']], [
364
+
416
365
  // PocketPC mistakenly identified as PowerPC
417
366
  /windows\s(ce|mobile);\sppc;/i
418
367
  ], [[ARCHITECTURE, 'arm']], [
@@ -423,277 +372,299 @@
423
372
  /(sun4\w)[;\)]/i // SPARC
424
373
  ], [[ARCHITECTURE, 'sparc']], [
425
374
 
426
- /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
375
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
427
376
  // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
428
377
  ], [[ARCHITECTURE, util.lowerize]]
429
378
  ],
430
379
 
431
380
  device : [[
432
381
 
433
- /\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
434
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
435
-
436
- /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
437
- ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
438
-
439
- /(apple\s{0,1}tv)/i // Apple TV
440
- ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple'], [TYPE, SMARTTV]], [
441
-
442
- /(archos)\s(gamepad2?)/i, // Archos
443
- /(hp).+(touchpad)/i, // HP TouchPad
444
- /(hp).+(tablet)/i, // HP Tablet
445
- /(kindle)\/([\w\.]+)/i, // Kindle
446
- /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
447
- /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
448
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
449
-
450
- /(kf[A-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
451
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
452
- /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
453
- ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
454
- /android.+aft([\w])(\sbuild\/|\))/i // Fire TV
455
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
456
-
457
- /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
458
- ], [MODEL, VENDOR, [TYPE, MOBILE]], [
459
- /\((ip[honed|\s\w*]+);/i // iPod/iPhone
382
+ //////////////////////////
383
+ // MOBILES & TABLETS
384
+ // Ordered by popularity
385
+ /////////////////////////
386
+
387
+ // Samsung
388
+ /\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus\s10)/i
389
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
390
+ /\b((?:s[cgp]h|gt|sm)-\w+|galaxy\snexus)/i,
391
+ /\ssamsung[\s-]([\w-]+)/i,
392
+ /sec-(sgh\w+)/i
393
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
394
+
395
+ // Apple
396
+ /\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
460
397
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
398
+ /\((ipad);[\w\s\),;-]+apple/i, // iPad
399
+ /applecoremedia\/[\w\.]+\s\((ipad)/i,
400
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
401
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
461
402
 
462
- /(blackberry)[\s-]?(\w+)/i, // BlackBerry
463
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
464
- // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
465
- /(hp)\s([\w\s]+\w)/i, // HP iPAQ
466
- /(asus)-?(\w+)/i // Asus
467
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
468
- /\(bb10;\s(\w+)/i // BlackBerry 10
469
- ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
470
- // Asus Tablets
471
- /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
472
- ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
473
-
474
- /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
475
- /(sony)?(?:sgp.+)\sbuild\//i
476
- ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
477
- /android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
478
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
479
-
480
- /\s(ouya)\s/i, // Ouya
481
- /(nintendo)\s([wids3u]+)/i // Nintendo
482
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
483
-
484
- /android.+;\s(shield)\sbuild/i // Nvidia
485
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
486
-
487
- /(playstation\s[34portablevi]+)/i // Playstation
488
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
489
-
490
- /(sprint\s(\w+))/i // Sprint Phones
491
- ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
492
-
493
- /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
494
- /(zte)-(\w*)/i, // ZTE
495
- /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
496
- // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
497
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
498
-
499
- /(nexus\s9)/i // HTC Nexus 9
500
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
501
-
502
- /d\/huawei([\w\s-]+)[;\)]/i, // Huawei
503
- /android.+\s(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?)/i
504
-
403
+ // Huawei
404
+ /\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\d{2})/i,
405
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
406
+ /d\/huawei([\w\s-]+)[;\)]/i,
407
+ /\b(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?|ele-l\d\d)/i,
408
+ /\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i
505
409
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
506
410
 
507
- /android.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
508
- ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
411
+ // Xiaomi
412
+ /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO
413
+ /\b;\s(\w+)\sbuild\/hm\1/i, // Xiaomi Hongmi 'numeric' models
414
+ /\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
415
+ /\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi
416
+ /\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
417
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
418
+ /\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets
419
+ ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
509
420
 
510
- /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
511
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
421
+ // OPPO
422
+ /;\s(\w+)\sbuild.+\soppo/i,
423
+ /\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i
424
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
512
425
 
513
- /[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
514
- ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
515
- /(kin\.[onetw]{3})/i // Microsoft Kin
516
- ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
426
+ // Vivo
427
+ /\svivo\s(\w+)(?:\sbuild|\))/i,
428
+ /\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i
429
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
430
+
431
+ // Realme
432
+ /\s(rmx[12]\d{3})(?:\sbuild|;)/i
433
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
517
434
 
518
- // Motorola
519
- /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
520
- /mot[\s-]?(\w*)/i,
521
- /(XT\d{3,4}) build\//i,
522
- /(nexus\s6)/i
435
+ // Motorola
436
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i,
437
+ /\smot(?:orola)?[\s-](\w*)/i,
438
+ /((?:moto[\s\w\(\)]+|xt\d{3,4}|nexus\s6)(?=\sbuild|\)))/i
523
439
  ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
524
- /android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
440
+ /\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
525
441
  ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
526
442
 
527
- /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
528
- ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
529
-
530
- /hbbtv.+maple;(\d+)/i
531
- ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
532
-
533
- /\(dtv[\);].+(aquos)/i // Sharp
534
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
535
-
536
- /android.+((sch-i[89]0\d|shw-m380s|SM-P605|SM-P610|SM-P587|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
537
- /((SM-T\w+))/i
538
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
539
- /smart-tv.+(samsung)/i
540
- ], [VENDOR, [TYPE, SMARTTV], MODEL], [
541
- /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
542
- /(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,
543
- /sec-((sgh\w+))/i
544
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
545
-
546
- /sie-(\w*)/i // Siemens
547
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
548
-
549
- /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
550
- /(nokia)[\s_-]?([\w-]*)/i
551
- ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
552
-
553
- /android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
554
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
555
-
556
- /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
443
+ // LG
444
+ /((?=lg)?[vl]k\-?\d{3})\sbuild|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i
557
445
  ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
558
- /android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
559
- ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
560
- /linux;\snetcast.+smarttv/i, // LG SmartTV
561
- /lg\snetcast\.tv-201\d/i
562
- ], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [
563
- /(nexus\s[45])/i, // LG
564
- /lg[e;\s\/-]+(\w*)/i,
565
- /android.+lg(\-?[\d\w]+)\s+build/i
446
+ /(lm-?f100[nv]?|nexus\s[45])/i,
447
+ /lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
448
+ /\blg(\-?[\d\w]+)\sbuild/i
566
449
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
567
450
 
568
- /(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
569
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
570
- /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
451
+ // Lenovo
452
+ /(ideatab[\w\-\s]+)/i,
453
+ /lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|yt[\d\w-]{6}|tb[\d\w-]{6})/i // Lenovo tablets
571
454
  ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
572
- /(lenovo)[_\s-]?([\w-]+)/i
573
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
574
455
 
575
- /linux;.+((jolla));/i // Jolla
576
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
456
+ // Nokia
457
+ /(?:maemo|nokia).*(n900|lumia\s\d+)/i,
458
+ /nokia[\s_-]?([\w\.-]*)/i
459
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
577
460
 
578
- /((pebble))app\/[\d\.]+\s/i // Pebble
579
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
461
+ // Google
462
+ /droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C
463
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
464
+ /droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel
465
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
580
466
 
581
- /android.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
582
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
467
+ // Sony
468
+ /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
469
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
470
+ /sony\stablet\s[ps]\sbuild\//i,
471
+ /(?:sony)?sgp\w+(?:\sbuild\/|\))/i
472
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
473
+
474
+ // OnePlus
475
+ /\s(kb2005|in20[12]5|be20[12][59])\b/i,
476
+ /\ba000(1)\sbuild/i, // OnePlus
477
+ /\boneplus\s(a\d{4})[\s)]/i
478
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
583
479
 
584
- /crkey/i // Google Chromecast
585
- ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
480
+ // Amazon
481
+ /(alexa)webm/i,
482
+ /(kf[a-z]{2}wi)(\sbuild\/|\))/i, // Kindle Fire without Silk
483
+ /(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
484
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
485
+ /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
486
+ ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
586
487
 
587
- /android.+;\s(glass)\s\d/i // Google Glass
588
- ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
488
+ // BlackBerry
489
+ /\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
490
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
491
+ /((?:bb[a-f]|st[hv])100-\d)/i,
492
+ /\(bb10;\s(\w+)/i // BlackBerry 10
493
+ ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
589
494
 
590
- /android.+;\s(pixel c)[\s)]/i // Google Pixel C
591
- ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
495
+ // Asus
496
+ /(?:\b|asus_)(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00[cj])/i
497
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [
498
+ /\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i
499
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [
592
500
 
593
- /android.+;\s(pixel( [2-9]a?)?( xl)?)[\s)]/i // Google Pixel
594
- ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
501
+ // HTC
502
+ /(nexus\s9)/i // HTC Nexus 9
503
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
504
+ /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
595
505
 
596
- /android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
597
- /android.+(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
598
- /android.+(redmi[\s\-_]?(?:note|k)?(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i,
599
- // Xiaomi Redmi
600
- /android.+(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i
601
- // Xiaomi Mi
602
- ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
603
- /android.+(mi[\s\-_]?(?:pad)(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i // Mi Pad tablets
604
- ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
605
- /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
506
+ // ZTE
507
+ /(zte)-(\w*)/i,
508
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
509
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
510
+
511
+ // Acer
512
+ /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
513
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
514
+
515
+ // Meizu
516
+ /droid.+;\s(m[1-5]\snote)\sbuild/i,
517
+ /\bmz-([\w-]{2,})/i
606
518
  ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
607
- /(mz)-([\w-]{2,})/i
608
- ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
609
519
 
610
- /android.+a000(1)\s+build/i, // OnePlus
611
- /android.+oneplus\s(a\d{4})[\s)]/i
612
- ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
520
+ // MIXED
521
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
522
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
523
+ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
524
+ /(asus)-?(\w+)/i, // Asus
525
+ /(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
526
+ /(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
527
+ /linux;.+(jolla);/i, // Jolla
528
+ /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
529
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
613
530
 
614
- /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
615
- ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
531
+ /(archos)\s(gamepad2?)/i, // Archos
532
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
533
+ /(kindle)\/([\w\.]+)/i, // Kindle
534
+ /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
535
+ /(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
536
+ /[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets
537
+ /[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets
538
+ /\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets
539
+ /\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone
540
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
616
541
 
617
- /android.+[;\/\s](Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
542
+ /\s(surface\sduo)\s/i // Surface Duo
543
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [
544
+ /droid\s[\d\.]+;\s(fp\du?)\sbuild/i
545
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
546
+ /\s(u304aa)\sbuild/i // AT&T
547
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
548
+ /sie-(\w*)/i // Siemens
549
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
550
+ /[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets
551
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
552
+ /[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets
618
553
  ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
619
-
620
- /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
554
+ /[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet
621
555
  ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
622
-
623
- /android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(\S(?:.*\S)?)\s+build/i // Barnes & Noble Tablet
624
- ], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
625
-
626
- /android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
556
+ /[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet
557
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
558
+ /[;\/]\s(tm\d{3}\w+)\sbuild/i
627
559
  ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
628
-
629
- /android.+;\s(k88)\sbuild/i // ZTE K Series Tablet
560
+ /;\s(k88)\sbuild/i // ZTE K Series Tablet
630
561
  ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
631
-
632
- /android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
562
+ /;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
563
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
564
+ /[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile
633
565
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
634
-
635
- /android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
566
+ /[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet
636
567
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
637
-
638
- /android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
568
+ /[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets
639
569
  ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
640
-
641
- /(android).+[;\/]\s+([YR]\d{2})\s+build/i,
642
- /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
570
+ /[;\/]\s([yr]\d{2})\sbuild/i,
571
+ /[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet
643
572
  ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
644
-
645
- /android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
573
+ /[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets
646
574
  ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
647
-
648
- /android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i // NextBook Tablets
575
+ /[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets
649
576
  ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
650
-
651
- /android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
577
+ /[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i
652
578
  ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
653
-
654
- /android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
579
+ /[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones
655
580
  ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
656
-
657
- /android.+;\s(PH-1)\s/i
581
+ /;\s(ph-1)\s/i
658
582
  ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
659
-
660
- /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
583
+ /[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets
661
584
  ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
585
+ /[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets
586
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
587
+ /[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets
588
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
589
+ /(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets
590
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
591
+ /(sprint)\s(\w+)/i // Sprint Phones
592
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
593
+ /(kin\.[onetw]{3})/i // Microsoft Kin
594
+ ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
595
+ /droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
596
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [
597
+ /droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i
598
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [
662
599
 
663
- /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
664
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
600
+ ///////////////////
601
+ // CONSOLES
602
+ ///////////////////
665
603
 
666
- /android.+[;\/]\s*(Trio[\s\w\-\.]+)\s+build/i // MachSpeed Tablets
667
- ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
604
+ /\s(ouya)\s/i, // Ouya
605
+ /(nintendo)\s([wids3utch]+)/i // Nintendo
606
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
607
+ /droid.+;\s(shield)\sbuild/i // Nvidia
608
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
609
+ /(playstation\s[345portablevi]+)/i // Playstation
610
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
611
+ /[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox
612
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
668
613
 
669
- /android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
670
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
614
+ ///////////////////
615
+ // SMARTTVS
616
+ ///////////////////
671
617
 
672
- /android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
673
- ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
618
+ /smart-tv.+(samsung)/i // Samsung
619
+ ], [VENDOR, [TYPE, SMARTTV]], [
620
+ /hbbtv.+maple;(\d+)/i
621
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
622
+ /(?:linux;\snetcast.+smarttv|lg\snetcast\.tv-201\d)/i, // LG SmartTV
623
+ ], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [
624
+ /(apple)\s?tv/i // Apple TV
625
+ ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
626
+ /crkey/i // Google Chromecast
627
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
628
+ /droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
629
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
630
+ /\(dtv[\);].+(aquos)/i // Sharp
631
+ ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
632
+ /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
633
+ ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
634
+ /[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors
635
+ ], [[TYPE, SMARTTV]], [
674
636
 
675
- //android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
676
- //], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
637
+ ///////////////////
638
+ // WEARABLES
639
+ ///////////////////
677
640
 
678
- /android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
679
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
680
- // Android Phones from Unidentified Vendors
681
- /android .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i
641
+ /((pebble))app\/[\d\.]+\s/i // Pebble
642
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
643
+ /droid.+;\s(glass)\s\d/i // Google Glass
644
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
645
+ /droid\s[\d\.]+;\s(wt63?0{2,3})\)/i
646
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [
647
+
648
+ ///////////////////
649
+ // EMBEDDED
650
+ ///////////////////
651
+
652
+ /(tesla)(?:\sqtcarbrowser|\/20[12]\d\.[\w\.-]+)/i // Tesla
653
+ ], [VENDOR, [TYPE, EMBEDDED]], [
654
+
655
+ ////////////////////
656
+ // MIXED (GENERIC)
657
+ ///////////////////
658
+
659
+ /droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
682
660
  ], [MODEL, [TYPE, MOBILE]], [
683
- // Android Tablets from Unidentified Vendors
684
- /android .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i
661
+ /droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
685
662
  ], [MODEL, [TYPE, TABLET]], [
686
-
687
663
  /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
688
664
  /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
689
- ], [[TYPE, util.lowerize], VENDOR, MODEL], [
690
-
691
- /[\s\/\(](smart-?tv)[;\)]/i // SmartTV
692
- ], [[TYPE, SMARTTV]], [
693
-
665
+ ], [[TYPE, util.lowerize]], [
694
666
  /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
695
667
  ], [MODEL, [VENDOR, 'Generic']], [
696
-
697
668
  /(phone)/i
698
669
  ], [[TYPE, MOBILE]]
699
670
  ],
@@ -707,90 +678,82 @@
707
678
  ], [VERSION, [NAME, 'Blink']], [
708
679
 
709
680
  /(presto)\/([\w\.]+)/i, // Presto
710
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
711
- // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
681
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
682
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
712
683
  /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
713
684
  /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
714
685
  ], [NAME, VERSION], [
715
686
 
716
- /rv\:([\w\.]{1,9}).+(gecko)/i // Gecko
687
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
717
688
  ], [VERSION, NAME]
718
689
  ],
719
690
 
720
691
  os : [[
721
692
 
722
- // Xbox, consider this before other Windows-based devices
723
- /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
724
-
725
- // Windows based
693
+ // Windows
726
694
  /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
727
695
  ], [NAME, VERSION], [
728
696
  /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
729
697
  /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
730
- /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
698
+ /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
731
699
  ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
732
700
  /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
733
701
  ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
734
702
 
735
- // Mobile/Embedded OS
736
- /\((bb)(10);/i // BlackBerry 10
737
- ], [[NAME, 'BlackBerry'], VERSION], [
738
- /(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
703
+ // iOS/macOS
704
+ /ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
705
+ /cfnetwork\/.+darwin/i
706
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
707
+ /(mac\sos\sx)\s?([\w\s\.]*)/i,
708
+ /(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
709
+ ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
710
+
711
+ // Mobile OSes // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
712
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
713
+ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
739
714
  /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
740
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
741
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
742
- ], [NAME, VERSION], [
743
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
744
- ], [[NAME, 'Symbian'], VERSION], [
745
715
  /\((series40);/i // Series 40
746
- ], [NAME], [
716
+ ], [NAME, VERSION], [
717
+ /\(bb(10);/i // BlackBerry 10
718
+ ], [VERSION, [NAME, 'BlackBerry']], [
719
+ /(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian
720
+ ], [VERSION, [NAME, 'Symbian']], [
747
721
  /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
748
- ], [[NAME, 'Firefox OS'], VERSION], [
722
+ ], [[NAME, 'Firefox OS']], [
723
+ /web0s;.+rt(tv)/i,
724
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
725
+ ], [VERSION, [NAME, 'webOS']], [
749
726
 
750
727
  // Google Chromecast
751
728
  /crkey\/([\d\.]+)/i // Google Chromecast
752
729
  ], [VERSION, [NAME, 'Chromecast']], [
730
+ /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
731
+ ], [[NAME, 'Chromium OS'], VERSION],[
753
732
 
754
733
  // Console
755
- /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
734
+ /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
735
+ /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
756
736
 
757
737
  // GNU/Linux based
758
- /(mint)[\/\s\(]?(\w*)/i, // Mint
738
+ /(mint)[\/\s\(\)]?(\w*)/i, // Mint
759
739
  /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
760
- /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,
740
+ /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i,
761
741
  // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
762
742
  // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
763
743
  /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
764
- /(gnu)\s?([\w\.]*)/i // GNU
765
- ], [NAME, VERSION], [
766
-
767
- /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
768
- ], [[NAME, 'Chromium OS'], VERSION],[
769
-
770
- // Solaris
771
- /(sunos)\s?([\w\.\d]*)/i // Solaris
772
- ], [[NAME, 'Solaris'], VERSION], [
744
+ /(gnu)\s?([\w\.]*)/i, // GNU
773
745
 
774
746
  // BSD based
775
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
776
- ], [NAME, VERSION],[
777
-
747
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
778
748
  /(haiku)\s(\w+)/i // Haiku
779
- ], [NAME, VERSION],[
780
-
781
- /cfnetwork\/.+darwin/i,
782
- /ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
783
- ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
784
-
785
- /(mac\sos\sx)\s?([\w\s\.]*)/i,
786
- /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
787
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
749
+ ], [NAME, VERSION], [
788
750
 
789
751
  // Other
752
+ /(sunos)\s?([\w\.\d]*)/i // Solaris
753
+ ], [[NAME, 'Solaris'], VERSION], [
790
754
  /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
791
755
  /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
792
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
793
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
756
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
794
757
  /(unix)\s?([\w\.]*)/i // UNIX
795
758
  ], [NAME, VERSION]
796
759
  ]
@@ -800,45 +763,45 @@
800
763
  /////////////////
801
764
  // Constructor
802
765
  ////////////////
803
- var UAParser = function (uastring, extensions) {
766
+ var UAParser = function (ua, extensions) {
804
767
 
805
- if (typeof uastring === 'object') {
806
- extensions = uastring;
807
- uastring = undefined;
768
+ if (typeof ua === 'object') {
769
+ extensions = ua;
770
+ ua = undefined;
808
771
  }
809
772
 
810
773
  if (!(this instanceof UAParser)) {
811
- return new UAParser(uastring, extensions).getResult();
774
+ return new UAParser(ua, extensions).getResult();
812
775
  }
813
776
 
814
- var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
815
- var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
777
+ var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
778
+ var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
816
779
 
817
780
  this.getBrowser = function () {
818
- var browser = { name: undefined, version: undefined };
819
- mapper.rgx.call(browser, ua, rgxmap.browser);
820
- browser.major = util.major(browser.version); // deprecated
821
- return browser;
781
+ var _browser = { name: undefined, version: undefined };
782
+ mapper.rgx.call(_browser, _ua, _rgxmap.browser);
783
+ _browser.major = util.major(_browser.version); // deprecated
784
+ return _browser;
822
785
  };
823
786
  this.getCPU = function () {
824
- var cpu = { architecture: undefined };
825
- mapper.rgx.call(cpu, ua, rgxmap.cpu);
826
- return cpu;
787
+ var _cpu = { architecture: undefined };
788
+ mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);
789
+ return _cpu;
827
790
  };
828
791
  this.getDevice = function () {
829
- var device = { vendor: undefined, model: undefined, type: undefined };
830
- mapper.rgx.call(device, ua, rgxmap.device);
831
- return device;
792
+ var _device = { vendor: undefined, model: undefined, type: undefined };
793
+ mapper.rgx.call(_device, _ua, _rgxmap.device);
794
+ return _device;
832
795
  };
833
796
  this.getEngine = function () {
834
- var engine = { name: undefined, version: undefined };
835
- mapper.rgx.call(engine, ua, rgxmap.engine);
836
- return engine;
797
+ var _engine = { name: undefined, version: undefined };
798
+ mapper.rgx.call(_engine, _ua, _rgxmap.engine);
799
+ return _engine;
837
800
  };
838
801
  this.getOS = function () {
839
- var os = { name: undefined, version: undefined };
840
- mapper.rgx.call(os, ua, rgxmap.os);
841
- return os;
802
+ var _os = { name: undefined, version: undefined };
803
+ mapper.rgx.call(_os, _ua, _rgxmap.os);
804
+ return _os;
842
805
  };
843
806
  this.getResult = function () {
844
807
  return {
@@ -851,12 +814,13 @@
851
814
  };
852
815
  };
853
816
  this.getUA = function () {
854
- return ua;
817
+ return _ua;
855
818
  };
856
- this.setUA = function (uastring) {
857
- ua = uastring;
819
+ this.setUA = function (ua) {
820
+ _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? util.trim(ua, UA_MAX_LENGTH) : ua;
858
821
  return this;
859
822
  };
823
+ this.setUA(_ua);
860
824
  return this;
861
825
  };
862
826
 
@@ -907,7 +871,7 @@
907
871
  define(function () {
908
872
  return UAParser;
909
873
  });
910
- } else if (window) {
874
+ } else if (typeof window !== 'undefined') {
911
875
  // browser env
912
876
  window.UAParser = UAParser;
913
877
  }
@@ -918,7 +882,7 @@
918
882
  // In AMD env the global scope should be kept clean, but jQuery is an exception.
919
883
  // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
920
884
  // and we should catch that.
921
- var $ = window && (window.jQuery || window.Zepto);
885
+ var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);
922
886
  if ($ && !$.ua) {
923
887
  var parser = new UAParser();
924
888
  $.ua = parser.getResult();