user_agent_parser 2.5.2 → 2.5.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of user_agent_parser might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2108d04c3b134892dfe8b64a8d922b43cefce3234b97883229c2f94987231fe9
4
- data.tar.gz: 21ae5ddc52e16c080c20dd7c573f0a0daa46602cdb36ad963f7c408a3122c46d
3
+ metadata.gz: 74b02298a0828b22d71e294ab077e484496ebb8fda03dbf41e3d01db8c2de4ea
4
+ data.tar.gz: 005e91640c3294abd45ab9eb31405bf5a5b245606606712da136d959b112b3d3
5
5
  SHA512:
6
- metadata.gz: fa1854eb92882b92b497775861a4c0063ad644d09f6294e0c629f88eb2bd8dd6e1442140076ed787b7d35f46f7f1c0f13a61df178a6db902b75a5184899166f0
7
- data.tar.gz: 58235ccba086edc533135b48e49c8b9750c0582b94a87570c4b02878e0fddad9ae69e79218faa2df43aa78c06b66fec10eeb55e958f276bb09416b70b29b4243
6
+ metadata.gz: adf323d558143989636c1635dd97b0559c455aa339a68ca230212be2c34672cc951234fa6db8d2e5d684ab23fe8b04a1927de872da7194219324ad482f325812
7
+ data.tar.gz: a4fa3dd7b32670821dfb547f217951ba2e6ecc639327e24e19f805c258881ec55bc681834d42e43b09ab789bd9d5614065ae7eba0501cdcaca1133a87d56602d
@@ -2,12 +2,14 @@
2
2
 
3
3
  module UserAgentParser
4
4
  class Device
5
+ DEFAULT_FAMILY = 'Other'
6
+
5
7
  attr_reader :family, :model, :brand
6
8
 
7
9
  alias name family
8
10
 
9
11
  def initialize(family = nil, model = nil, brand = nil)
10
- @family = family || 'Other'
12
+ @family = family || DEFAULT_FAMILY
11
13
  @model = model || @family
12
14
  @brand = brand
13
15
  end
@@ -2,11 +2,13 @@
2
2
 
3
3
  module UserAgentParser
4
4
  class OperatingSystem
5
+ DEFAULT_FAMILY = 'Other'
6
+
5
7
  attr_reader :family, :version
6
8
 
7
9
  alias name family
8
10
 
9
- def initialize(family = 'Other', version = nil)
11
+ def initialize(family = DEFAULT_FAMILY, version = nil)
10
12
  @family = family
11
13
  @version = version
12
14
  end
@@ -2,12 +2,14 @@
2
2
 
3
3
  module UserAgentParser
4
4
  class UserAgent
5
+ DEFAULT_FAMILY = 'Other'
6
+
5
7
  attr_reader :family, :version, :os, :device
6
8
 
7
9
  alias name family
8
10
 
9
11
  def initialize(family = nil, version = nil, os = nil, device = nil)
10
- @family = family || 'Other'
12
+ @family = family || DEFAULT_FAMILY
11
13
  @version = version
12
14
  @os = os
13
15
  @device = device
@@ -2,6 +2,7 @@ user_agent_parsers:
2
2
  #### SPECIAL CASES TOP ####
3
3
 
4
4
  # CFNetwork Podcast catcher Applications
5
+ - regex: '^(Luminary)[Stage]+/(\d+) CFNetwork'
5
6
  - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
6
7
  - regex: '(Antenna)/(\d+) CFNetwork'
7
8
  family_replacement: 'AntennaPod'
@@ -12,6 +13,7 @@ user_agent_parsers:
12
13
  - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
13
14
 
14
15
  # Podcast catchers
16
+ - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
15
17
  - regex: '(espn\.go)'
16
18
  family_replacement: 'ESPN'
17
19
  - regex: '(espnradio\.com)'
@@ -48,6 +50,10 @@ user_agent_parsers:
48
50
  - regex: '(Tableau)/(\d+)\.(\d+)'
49
51
  family_replacement: 'Tableau'
50
52
 
53
+ # Adobe CreativeCloud
54
+ - regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
55
+ family_replacement: 'Adobe CreativeCloud'
56
+
51
57
  # Salesforce
52
58
  - regex: '(Salesforce)(?:.)\/(\d+)\.(\d?)'
53
59
 
@@ -73,12 +79,12 @@ user_agent_parsers:
73
79
 
74
80
  # Twitter
75
81
  - regex: '(Twitterbot)/(\d+)\.(\d+)'
76
- family_replacement: 'TwitterBot'
82
+ family_replacement: 'Twitterbot'
77
83
 
78
- # Bots Pattern '/name-0.0'
84
+ # Bots Pattern 'name/0.0.0'
79
85
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
80
- # Bots Pattern 'name/0.0'
81
- - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
86
+ # Bots Pattern 'name/0.0.0'
87
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
82
88
 
83
89
  # MSIECrawler
84
90
  - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
@@ -88,18 +94,18 @@ user_agent_parsers:
88
94
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
89
95
 
90
96
  # Downloader ...
91
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
97
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
92
98
 
93
99
  # Pinterestbot
94
100
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
95
101
  family_replacement: 'Pinterestbot'
96
102
 
97
103
  # Bots
98
- - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
104
+ - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
99
105
 
100
106
  # AWS S3 Clients
101
107
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
102
- - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
108
+ - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
103
109
 
104
110
  # Facebook
105
111
  # Must come before "Bots General matcher" to catch OrangeBotswana
@@ -146,6 +152,9 @@ user_agent_parsers:
146
152
  - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
147
153
  # Snapchat
148
154
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
155
+ # Twitter
156
+ - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
157
+ family_replacement: 'Twitter'
149
158
 
150
159
  # Basilisk
151
160
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -308,6 +317,10 @@ user_agent_parsers:
308
317
  # Edge Mobile
309
318
  - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
310
319
  family_replacement: 'Edge Mobile'
320
+ - regex: '(EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
321
+ family_replacement: 'Edge Mobile'
322
+ - regex: '(EdgiOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
323
+ family_replacement: 'Edge Mobile'
311
324
 
312
325
  # Samsung Internet (based on Chrome, but lacking some features)
313
326
  - regex: '(SamsungBrowser)/(\d+)\.(\d+)'
@@ -347,9 +360,21 @@ user_agent_parsers:
347
360
  - regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
348
361
  family_replacement: 'Mint Browser'
349
362
 
363
+ # TopBuzz Android must go before Chrome Mobile WebView
364
+ - regex: '(TopBuzz)/(\d+).(\d+).(\d+)'
365
+ family_replacement: 'TopBuzz'
366
+
350
367
  # Google Search App on Android, eg:
351
368
  - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
352
369
  family_replacement: 'Google'
370
+
371
+ # QQ Browsers
372
+ - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
373
+ family_replacement: 'QQ Browser Mini'
374
+ - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
375
+ family_replacement: 'QQ Browser Mobile'
376
+ - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
377
+ family_replacement: 'QQ Browser'
353
378
 
354
379
  # Chrome Mobile
355
380
  - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
@@ -377,14 +402,6 @@ user_agent_parsers:
377
402
  - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
378
403
  family_replacement: 'Sogou Explorer'
379
404
 
380
- # QQ Browsers
381
- - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
382
- family_replacement: 'QQ Browser Mini'
383
- - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
384
- family_replacement: 'QQ Browser Mobile'
385
- - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
386
- family_replacement: 'QQ Browser'
387
-
388
405
  # Rackspace Monitoring
389
406
  - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
390
407
  family_replacement: 'RackspaceBot'
@@ -417,6 +434,9 @@ user_agent_parsers:
417
434
  - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)'
418
435
  family_replacement: 'Whale'
419
436
 
437
+ # 1Password
438
+ - regex: '(1Password)/(\d+)\.(\d+)\.(\d+)'
439
+
420
440
  # Ghost
421
441
  # @ref: http://www.ghost.org
422
442
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
@@ -454,7 +474,7 @@ user_agent_parsers:
454
474
  v1_replacement: '2013'
455
475
 
456
476
  # Outlook 2016
457
- - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+'
477
+ - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+|MSOffice 16'
458
478
  family_replacement: 'Outlook'
459
479
  v1_replacement: '2016'
460
480
 
@@ -484,6 +504,11 @@ user_agent_parsers:
484
504
  - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
485
505
  family_replacement: 'Lotus Notes'
486
506
 
507
+ # Superhuman Mail Client
508
+ # @ref: https://www.superhuman.com
509
+ - regex: 'Superhuman'
510
+ family_replacement: 'Superhuman'
511
+
487
512
  # Vivaldi uses "Vivaldi"
488
513
  - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
489
514
 
@@ -657,6 +682,14 @@ user_agent_parsers:
657
682
  - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
658
683
  family_replacement: 'Bon Echo'
659
684
 
685
+ # topbuzz on IOS
686
+ - regex: '(TopBuzz) com.alex.NewsMaster/(\d+).(\d+).(\d+)'
687
+ family_replacement: 'TopBuzz'
688
+ - regex: '(TopBuzz) com.mobilesrepublic.newsrepublic/(\d+).(\d+).(\d+)'
689
+ family_replacement: 'TopBuzz'
690
+ - regex: '(TopBuzz) com.topbuzz.videoen/(\d+).(\d+).(\d+)'
691
+ family_replacement: 'TopBuzz'
692
+
660
693
  # @note: iOS / OSX Applications
661
694
  - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
662
695
  family_replacement: 'Google'
@@ -810,13 +843,23 @@ user_agent_parsers:
810
843
  family_replacement: 'Python Requests'
811
844
 
812
845
  # headless user-agents
813
- - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
846
+ - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
847
+
848
+ # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
849
+ - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
850
+ # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
851
+ - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
814
852
 
815
853
  - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
816
854
 
817
855
  # Cloud Storage Clients
818
856
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
819
857
  - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
858
+ - regex: '(S3Gof3r)'
859
+ # IBM COS (Cloud Object Storage) API
860
+ - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
861
+ # rusoto - Rusoto - AWS SDK for Rust - https://github.com/rusoto/rusoto
862
+ - regex: '^(rusoto)/(\d+)\.(\d+)\.(\d+)'
820
863
  # rclone - rsync for cloud storage - https://rclone.org/
821
864
  - regex: '^(rclone)/v(\d+)\.(\d+)'
822
865
 
@@ -932,6 +975,9 @@ os_parsers:
932
975
  - regex: '(Android) Honeycomb'
933
976
  os_v1_replacement: '3'
934
977
 
978
+ # Android 9; Android 10;
979
+ - regex: '(Android) (\d+);'
980
+
935
981
  # UCWEB
936
982
  - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
937
983
  os_replacement: 'Android'
@@ -1385,6 +1431,12 @@ os_parsers:
1385
1431
  - regex: '(Black[Bb]erry)'
1386
1432
  os_replacement: 'BlackBerry OS'
1387
1433
 
1434
+ ##########
1435
+ # KaiOS
1436
+ ##########
1437
+ - regex: '(K[Aa][Ii]OS)\/(\d+)\.(\d+)(?:\.(\d+)|)'
1438
+ os_replacement: 'KaiOS'
1439
+
1388
1440
  ##########
1389
1441
  # Firefox OS
1390
1442
  ##########
@@ -1487,6 +1539,8 @@ os_parsers:
1487
1539
  os_replacement: 'Red Hat'
1488
1540
  - regex: '\((freebsd)(\d+)\.(\d+)\)'
1489
1541
  os_replacement: 'FreeBSD'
1542
+ - regex: 'linux'
1543
+ os_replacement: 'Linux'
1490
1544
 
1491
1545
  # Roku Digital-Video-Players https://www.roku.com/
1492
1546
  - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
@@ -1552,11 +1606,11 @@ device_parsers:
1552
1606
  # 3Q
1553
1607
  # @ref: http://www.3q-int.com/
1554
1608
  #########
1555
- - regex: '; *([BLRQ]C\d{4}[A-Z]+) +Build/'
1609
+ - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1556
1610
  device_replacement: '3Q $1'
1557
1611
  brand_replacement: '3Q'
1558
1612
  model_replacement: '$1'
1559
- - regex: '; *(?:3Q_)([^;/]+) +Build'
1613
+ - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1560
1614
  device_replacement: '3Q $1'
1561
1615
  brand_replacement: '3Q'
1562
1616
  model_replacement: '$1'
@@ -1565,19 +1619,19 @@ device_parsers:
1565
1619
  # Acer
1566
1620
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1567
1621
  #########
1568
- - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build'
1622
+ - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\) AppleWebKit)'
1569
1623
  device_replacement: '$1'
1570
1624
  brand_replacement: 'Acer'
1571
1625
  model_replacement: '$1'
1572
- - regex: '; *Acer Iconia Tab ([^;/]+) Build'
1626
+ - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1573
1627
  device_replacement: '$1'
1574
1628
  brand_replacement: 'Acer'
1575
1629
  model_replacement: '$1'
1576
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+) Build'
1630
+ - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1577
1631
  device_replacement: '$1'
1578
1632
  brand_replacement: 'Acer'
1579
1633
  model_replacement: '$1'
1580
- - regex: '; *(Acer |ACER )([^;/]+) Build'
1634
+ - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1581
1635
  device_replacement: '$1$2'
1582
1636
  brand_replacement: 'Acer'
1583
1637
  model_replacement: '$2'
@@ -1588,7 +1642,7 @@ device_parsers:
1588
1642
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1589
1643
  # custom ROM builds for Vega
1590
1644
  #########
1591
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build'
1645
+ - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1592
1646
  device_replacement: '$1$2'
1593
1647
  brand_replacement: 'Advent'
1594
1648
  model_replacement: '$2'
@@ -1597,7 +1651,7 @@ device_parsers:
1597
1651
  # Ainol
1598
1652
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1599
1653
  #########
1600
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build'
1654
+ - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
1601
1655
  device_replacement: '$1$2'
1602
1656
  brand_replacement: 'Ainol'
1603
1657
  model_replacement: '$2'
@@ -1611,7 +1665,7 @@ device_parsers:
1611
1665
  device_replacement: '$1'
1612
1666
  brand_replacement: 'Airis'
1613
1667
  model_replacement: '$1'
1614
- - regex: '; *(OnePAD[^;/]+) Build'
1668
+ - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
1615
1669
  regex_flag: 'i'
1616
1670
  device_replacement: '$1'
1617
1671
  brand_replacement: 'Airis'
@@ -1621,7 +1675,7 @@ device_parsers:
1621
1675
  # Airpad
1622
1676
  # @ref: ??
1623
1677
  #########
1624
- - regex: '; *Airpad[ \-]([^;/]+) Build'
1678
+ - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
1625
1679
  device_replacement: 'Airpad $1'
1626
1680
  brand_replacement: 'Airpad'
1627
1681
  model_replacement: '$1'
@@ -1630,29 +1684,29 @@ device_parsers:
1630
1684
  # Alcatel - TCT
1631
1685
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1632
1686
  #########
1633
- - regex: '; *(one ?touch) (EVO7|T10|T20) Build'
1687
+ - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1634
1688
  device_replacement: 'Alcatel One Touch $2'
1635
1689
  brand_replacement: 'Alcatel'
1636
1690
  model_replacement: 'One Touch $2'
1637
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
1691
+ - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
1638
1692
  regex_flag: 'i'
1639
1693
  device_replacement: 'Alcatel One Touch $1'
1640
1694
  brand_replacement: 'Alcatel'
1641
1695
  model_replacement: 'One Touch $1'
1642
- - regex: '; *(TCL)[ _]([^;/]+) Build'
1696
+ - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1643
1697
  device_replacement: '$1 $2'
1644
1698
  brand_replacement: '$1'
1645
1699
  model_replacement: '$2'
1646
1700
  # operator specific models
1647
- - regex: '; *(Vodafone Smart II|Optimus_Madrid) Build'
1701
+ - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1648
1702
  device_replacement: 'Alcatel $1'
1649
1703
  brand_replacement: 'Alcatel'
1650
1704
  model_replacement: '$1'
1651
- - regex: '; *BASE_Lutea_3 Build'
1705
+ - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
1652
1706
  device_replacement: 'Alcatel One Touch 998'
1653
1707
  brand_replacement: 'Alcatel'
1654
1708
  model_replacement: 'One Touch 998'
1655
- - regex: '; *BASE_Varia Build'
1709
+ - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
1656
1710
  device_replacement: 'Alcatel One Touch 918D'
1657
1711
  brand_replacement: 'Alcatel'
1658
1712
  model_replacement: 'One Touch 918D'
@@ -1661,7 +1715,7 @@ device_parsers:
1661
1715
  # Allfine
1662
1716
  # @ref: http://www.myallfine.com/Products.asp
1663
1717
  #########
1664
- - regex: '; *((?:FINE|Fine)\d[^;/]+) Build'
1718
+ - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
1665
1719
  device_replacement: '$1'
1666
1720
  brand_replacement: 'Allfine'
1667
1721
  model_replacement: '$1'
@@ -1670,15 +1724,15 @@ device_parsers:
1670
1724
  # Allview
1671
1725
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1672
1726
  #########
1673
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*) Build/'
1727
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
1674
1728
  device_replacement: '$1$2'
1675
1729
  brand_replacement: 'Allview'
1676
1730
  model_replacement: '$2'
1677
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build'
1731
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1678
1732
  device_replacement: '$1$2'
1679
1733
  brand_replacement: 'Allview'
1680
1734
  model_replacement: '$2'
1681
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*) Build'
1735
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1682
1736
  device_replacement: '$1$2'
1683
1737
  brand_replacement: 'Allview'
1684
1738
  model_replacement: '$2'
@@ -1688,11 +1742,11 @@ device_parsers:
1688
1742
  # @ref: http://www.allwinner.com/
1689
1743
  # @models: A31 (13.3"),A20,A10,
1690
1744
  #########
1691
- - regex: '; *(A13-MID) Build'
1745
+ - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
1692
1746
  device_replacement: '$1'
1693
1747
  brand_replacement: 'Allwinner'
1694
1748
  model_replacement: '$1'
1695
- - regex: '; *(Allwinner)[ _\-]?([^;/]+) Build'
1749
+ - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
1696
1750
  device_replacement: '$1 $2'
1697
1751
  brand_replacement: 'Allwinner'
1698
1752
  model_replacement: '$1'
@@ -1701,7 +1755,7 @@ device_parsers:
1701
1755
  # Amaway
1702
1756
  # @ref: http://www.amaway.cn/
1703
1757
  #########
1704
- - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80) Build'
1758
+ - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
1705
1759
  device_replacement: '$1'
1706
1760
  brand_replacement: 'Amaway'
1707
1761
  model_replacement: '$1'
@@ -1710,11 +1764,11 @@ device_parsers:
1710
1764
  # Amoi
1711
1765
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1712
1766
  #########
1713
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+) Build'
1767
+ - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1714
1768
  device_replacement: 'Amoi $1'
1715
1769
  brand_replacement: 'Amoi'
1716
1770
  model_replacement: '$1'
1717
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+) Linux'
1771
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
1718
1772
  device_replacement: 'Amoi $1'
1719
1773
  brand_replacement: 'Amoi'
1720
1774
  model_replacement: '$1'
@@ -1723,7 +1777,7 @@ device_parsers:
1723
1777
  # Aoc
1724
1778
  # @ref: http://latin.aoc.com/media_tablet
1725
1779
  #########
1726
- - regex: '; *(MW(?:0[789]|10)[^;/]+) Build'
1780
+ - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
1727
1781
  device_replacement: '$1'
1728
1782
  brand_replacement: 'Aoc'
1729
1783
  model_replacement: '$1'
@@ -1734,11 +1788,11 @@ device_parsers:
1734
1788
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1735
1789
  # @note: brand owned by luckystar
1736
1790
  #########
1737
- - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build'
1791
+ - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
1738
1792
  device_replacement: 'Aoson $1'
1739
1793
  brand_replacement: 'Aoson'
1740
1794
  model_replacement: '$1'
1741
- - regex: '; *Aoson ([^;/]+) Build'
1795
+ - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
1742
1796
  regex_flag: 'i'
1743
1797
  device_replacement: 'Aoson $1'
1744
1798
  brand_replacement: 'Aoson'
@@ -1748,7 +1802,7 @@ device_parsers:
1748
1802
  # Apanda
1749
1803
  # @ref: http://www.apanda.com.cn/
1750
1804
  #########
1751
- - regex: '; *[Aa]panda[ _\-]([^;/]+) Build'
1805
+ - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
1752
1806
  device_replacement: 'Apanda $1'
1753
1807
  brand_replacement: 'Apanda'
1754
1808
  model_replacement: '$1'
@@ -1758,7 +1812,7 @@ device_parsers:
1758
1812
  # @ref: http://www.archos.com/de/products/tablets.html
1759
1813
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1760
1814
  #########
1761
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|[;/\(\)\-])'
1815
+ - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
1762
1816
  device_replacement: 'Archos $1'
1763
1817
  brand_replacement: 'Archos'
1764
1818
  model_replacement: '$1'
@@ -1770,11 +1824,11 @@ device_parsers:
1770
1824
  device_replacement: 'Archos $1'
1771
1825
  brand_replacement: 'Archos'
1772
1826
  model_replacement: '$1'
1773
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4}) Build'
1827
+ - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1774
1828
  device_replacement: 'Archos $1'
1775
1829
  brand_replacement: 'Archos'
1776
1830
  model_replacement: '$1'
1777
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9) Build'
1831
+ - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1778
1832
  device_replacement: 'Archos $1'
1779
1833
  brand_replacement: 'Archos'
1780
1834
  model_replacement: '$1'
@@ -1783,11 +1837,11 @@ device_parsers:
1783
1837
  # A-rival
1784
1838
  # @ref: http://www.a-rival.de/de/
1785
1839
  #########
1786
- - regex: '; *(PAD-FMD[^;/]+) Build'
1840
+ - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
1787
1841
  device_replacement: '$1'
1788
1842
  brand_replacement: 'Arival'
1789
1843
  model_replacement: '$1'
1790
- - regex: '; *(BioniQ) ?([^;/]+) Build'
1844
+ - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
1791
1845
  device_replacement: '$1 $2'
1792
1846
  brand_replacement: 'Arival'
1793
1847
  model_replacement: '$1 $2'
@@ -1796,11 +1850,11 @@ device_parsers:
1796
1850
  # Arnova
1797
1851
  # @ref: http://arnovatech.com/
1798
1852
  #########
1799
- - regex: '; *(AN\d[^;/]+|ARCHM\d+) Build'
1853
+ - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
1800
1854
  device_replacement: 'Arnova $1'
1801
1855
  brand_replacement: 'Arnova'
1802
1856
  model_replacement: '$1'
1803
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+) Build'
1857
+ - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
1804
1858
  device_replacement: 'Arnova $1'
1805
1859
  brand_replacement: 'Arnova'
1806
1860
  model_replacement: '$1'
@@ -1809,7 +1863,7 @@ device_parsers:
1809
1863
  # Assistant
1810
1864
  # @ref: http://www.assistant.ua
1811
1865
  #########
1812
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
1866
+ - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1813
1867
  device_replacement: 'Assistant $1-$2'
1814
1868
  brand_replacement: 'Assistant'
1815
1869
  model_replacement: '$1-$2'
@@ -1818,11 +1872,11 @@ device_parsers:
1818
1872
  # Asus
1819
1873
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1820
1874
  #########
1821
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
1875
+ - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
1822
1876
  device_replacement: 'Asus $1'
1823
1877
  brand_replacement: 'Asus'
1824
1878
  model_replacement: '$1'
1825
- - regex: '; *ASUS[ _]*([^;/]+) Build'
1879
+ - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
1826
1880
  device_replacement: 'Asus $1'
1827
1881
  brand_replacement: 'Asus'
1828
1882
  model_replacement: '$1'
@@ -1830,11 +1884,11 @@ device_parsers:
1830
1884
  #########
1831
1885
  # Garmin-Asus
1832
1886
  #########
1833
- - regex: '; *Garmin-Asus ([^;/]+) Build'
1887
+ - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
1834
1888
  device_replacement: 'Garmin-Asus $1'
1835
1889
  brand_replacement: 'Garmin-Asus'
1836
1890
  model_replacement: '$1'
1837
- - regex: '; *(Garminfone) Build'
1891
+ - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
1838
1892
  device_replacement: 'Garmin $1'
1839
1893
  brand_replacement: 'Garmin-Asus'
1840
1894
  model_replacement: '$1'
@@ -1843,7 +1897,7 @@ device_parsers:
1843
1897
  # Attab
1844
1898
  # @ref: http://www.theattab.com/
1845
1899
  #########
1846
- - regex: '; (@TAB-[^;/]+) Build'
1900
+ - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
1847
1901
  device_replacement: '$1'
1848
1902
  brand_replacement: 'Attab'
1849
1903
  model_replacement: '$1'
@@ -1853,7 +1907,7 @@ device_parsers:
1853
1907
  # @ref: ??
1854
1908
  # @note: Take care with Docomo T-01 Toshiba
1855
1909
  #########
1856
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+) Build'
1910
+ - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
1857
1911
  device_replacement: '$1'
1858
1912
  brand_replacement: 'Audiosonic'
1859
1913
  model_replacement: '$1'
@@ -1862,7 +1916,7 @@ device_parsers:
1862
1916
  # Axioo
1863
1917
  # @ref: http://www.axiooworld.com/ww/index.php
1864
1918
  #########
1865
- - regex: '; *(?:Axioo[ _\-]([^;/]+)|(picopad)[ _\-]([^;/]+)) Build'
1919
+ - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
1866
1920
  regex_flag: 'i'
1867
1921
  device_replacement: 'Axioo $1$2 $3'
1868
1922
  brand_replacement: 'Axioo'
@@ -1872,7 +1926,7 @@ device_parsers:
1872
1926
  # Azend
1873
1927
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
1874
1928
  #########
1875
- - regex: '; *(V(?:100|700|800)[^;/]*) Build'
1929
+ - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
1876
1930
  device_replacement: '$1'
1877
1931
  brand_replacement: 'Azend'
1878
1932
  model_replacement: '$1'
@@ -1881,7 +1935,7 @@ device_parsers:
1881
1935
  # Bak
1882
1936
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
1883
1937
  #########
1884
- - regex: '; *(IBAK\-[^;/]*) Build'
1938
+ - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
1885
1939
  regex_flag: 'i'
1886
1940
  device_replacement: '$1'
1887
1941
  brand_replacement: 'Bak'
@@ -1892,7 +1946,7 @@ device_parsers:
1892
1946
  # @ref: http://www.bedove.com/product.html
1893
1947
  # @models: HY6501|HY5001|X12|X21|I5
1894
1948
  #########
1895
- - regex: '; *(HY5001|HY6501|X12|X21|I5) Build'
1949
+ - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
1896
1950
  device_replacement: 'Bedove $1'
1897
1951
  brand_replacement: 'Bedove'
1898
1952
  model_replacement: '$1'
@@ -1901,7 +1955,7 @@ device_parsers:
1901
1955
  # Benss
1902
1956
  # @ref: http://www.benss.net/
1903
1957
  #########
1904
- - regex: '; *(JC-[^;/]*) Build'
1958
+ - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
1905
1959
  device_replacement: 'Benss $1'
1906
1960
  brand_replacement: 'Benss'
1907
1961
  model_replacement: '$1'
@@ -1911,7 +1965,7 @@ device_parsers:
1911
1965
  # @ref: http://uk.blackberry.com/
1912
1966
  # @note: Android Apps seams to be used here
1913
1967
  #########
1914
- - regex: '; *(BB) ([^;/]+) Build'
1968
+ - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
1915
1969
  device_replacement: '$1 $2'
1916
1970
  brand_replacement: 'Blackberry'
1917
1971
  model_replacement: '$2'
@@ -1920,11 +1974,11 @@ device_parsers:
1920
1974
  # Blackbird
1921
1975
  # @ref: http://iblackbird.co.kr
1922
1976
  #########
1923
- - regex: '; *(BlackBird)[ _](I8.*) Build'
1977
+ - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
1924
1978
  device_replacement: '$1 $2'
1925
1979
  brand_replacement: '$1'
1926
1980
  model_replacement: '$2'
1927
- - regex: '; *(BlackBird)[ _](.*) Build'
1981
+ - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
1928
1982
  device_replacement: '$1 $2'
1929
1983
  brand_replacement: '$1'
1930
1984
  model_replacement: '$2'
@@ -1934,7 +1988,7 @@ device_parsers:
1934
1988
  # @ref: http://www.blaupunkt.com
1935
1989
  #########
1936
1990
  # Endeavour
1937
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+) Build'
1991
+ - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
1938
1992
  device_replacement: 'Blaupunkt $1'
1939
1993
  brand_replacement: 'Blaupunkt'
1940
1994
  model_replacement: '$1'
@@ -1943,12 +1997,12 @@ device_parsers:
1943
1997
  # Blu
1944
1998
  # @ref: http://bluproducts.com
1945
1999
  #########
1946
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+) Build'
2000
+ - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
1947
2001
  device_replacement: '$1$2'
1948
2002
  brand_replacement: 'Blu'
1949
2003
  model_replacement: '$2'
1950
2004
  # BMOBILE = operator branded device
1951
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5) Build'
2005
+ - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
1952
2006
  device_replacement: '$1'
1953
2007
  brand_replacement: 'Blu'
1954
2008
  model_replacement: '$1'
@@ -1958,7 +2012,7 @@ device_parsers:
1958
2012
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
1959
2013
  #########
1960
2014
  # tablet
1961
- - regex: '; *(TOUCH\d[^;/]+) Build'
2015
+ - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
1962
2016
  device_replacement: '$1'
1963
2017
  brand_replacement: 'Blusens'
1964
2018
  model_replacement: '$1'
@@ -1969,7 +2023,7 @@ device_parsers:
1969
2023
  # @note: Might collide with Maxx as AX is used also there.
1970
2024
  #########
1971
2025
  # smartphone
1972
- - regex: '; *(AX5\d+) Build'
2026
+ - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
1973
2027
  device_replacement: '$1'
1974
2028
  brand_replacement: 'Bmobile'
1975
2029
  model_replacement: '$1'
@@ -1978,11 +2032,11 @@ device_parsers:
1978
2032
  # bq
1979
2033
  # @ref: http://bqreaders.com
1980
2034
  #########
1981
- - regex: '; *([Bb]q) ([^;/]+);? Build'
2035
+ - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
1982
2036
  device_replacement: '$1 $2'
1983
2037
  brand_replacement: 'bq'
1984
2038
  model_replacement: '$2'
1985
- - regex: '; *(Maxwell [^;/]+) Build'
2039
+ - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
1986
2040
  device_replacement: '$1'
1987
2041
  brand_replacement: 'bq'
1988
2042
  model_replacement: '$1'
@@ -1991,7 +2045,7 @@ device_parsers:
1991
2045
  # Braun Phototechnik
1992
2046
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
1993
2047
  #########
1994
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+) Build'
2048
+ - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
1995
2049
  device_replacement: '$1'
1996
2050
  brand_replacement: 'Braun'
1997
2051
  model_replacement: '$1'
@@ -2000,7 +2054,7 @@ device_parsers:
2000
2054
  # Broncho
2001
2055
  # @ref: http://www.broncho.cn/
2002
2056
  #########
2003
- - regex: '; *(Broncho) ([^;/]+) Build'
2057
+ - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2004
2058
  device_replacement: '$1 $2'
2005
2059
  brand_replacement: '$1'
2006
2060
  model_replacement: '$2'
@@ -2009,7 +2063,7 @@ device_parsers:
2009
2063
  # Captiva
2010
2064
  # @ref: http://www.captiva-power.de
2011
2065
  #########
2012
- - regex: '; *CAPTIVA ([^;/]+) Build'
2066
+ - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2013
2067
  device_replacement: 'Captiva $1'
2014
2068
  brand_replacement: 'Captiva'
2015
2069
  model_replacement: '$1'
@@ -2018,7 +2072,7 @@ device_parsers:
2018
2072
  # Casio
2019
2073
  # @ref: http://www.casiogzone.com/
2020
2074
  #########
2021
- - regex: '; *(C771|CAL21|IS11CA) Build'
2075
+ - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2022
2076
  device_replacement: '$1'
2023
2077
  brand_replacement: 'Casio'
2024
2078
  model_replacement: '$1'
@@ -2027,15 +2081,15 @@ device_parsers:
2027
2081
  # Cat
2028
2082
  # @ref: http://www.cat-sound.com
2029
2083
  #########
2030
- - regex: '; *(?:Cat|CAT) ([^;/]+) Build'
2084
+ - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2031
2085
  device_replacement: 'Cat $1'
2032
2086
  brand_replacement: 'Cat'
2033
2087
  model_replacement: '$1'
2034
- - regex: '; *(?:Cat)(Nova.*) Build'
2088
+ - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2035
2089
  device_replacement: 'Cat $1'
2036
2090
  brand_replacement: 'Cat'
2037
2091
  model_replacement: '$1'
2038
- - regex: '; *(INM8002KP|ADM8000KP_[AB]) Build'
2092
+ - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2039
2093
  device_replacement: '$1'
2040
2094
  brand_replacement: 'Cat'
2041
2095
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2053,7 +2107,7 @@ device_parsers:
2053
2107
  device_replacement: '$1'
2054
2108
  brand_replacement: 'Celkon'
2055
2109
  model_replacement: '$1'
2056
- - regex: '; *(CT)-?(\d+) Build'
2110
+ - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2057
2111
  device_replacement: '$1$2'
2058
2112
  brand_replacement: 'Celkon'
2059
2113
  model_replacement: '$1$2'
@@ -2069,7 +2123,7 @@ device_parsers:
2069
2123
  # @brief: China manufacturer makes tablets for different small brands
2070
2124
  # (eg. http://www.zeepad.net/index.html)
2071
2125
  #########
2072
- - regex: '; *(TPC[0-9]{4,5}) Build'
2126
+ - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2073
2127
  device_replacement: '$1'
2074
2128
  brand_replacement: 'ChangJia'
2075
2129
  model_replacement: '$1'
@@ -2078,15 +2132,15 @@ device_parsers:
2078
2132
  # Cloudfone
2079
2133
  # @ref: http://www.cloudfonemobile.com/
2080
2134
  #########
2081
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+) Build'
2135
+ - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2082
2136
  device_replacement: '$1 $2 $3'
2083
2137
  brand_replacement: 'Cloudfone'
2084
2138
  model_replacement: '$1 $2 $3'
2085
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+) Build'
2139
+ - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2086
2140
  device_replacement: 'Cloudfone $1 $2'
2087
2141
  brand_replacement: 'Cloudfone'
2088
2142
  model_replacement: 'Cloudfone $1 $2'
2089
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+) Build'
2143
+ - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2090
2144
  device_replacement: '$1 $2'
2091
2145
  brand_replacement: 'Cloudfone'
2092
2146
  model_replacement: '$1 $2'
@@ -2095,7 +2149,7 @@ device_parsers:
2095
2149
  # Cmx
2096
2150
  # @ref: http://cmx.at/de/
2097
2151
  #########
2098
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+) Build'
2152
+ - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2099
2153
  regex_flag: 'i'
2100
2154
  device_replacement: '$1'
2101
2155
  brand_replacement: 'Cmx'
@@ -2115,7 +2169,7 @@ device_parsers:
2115
2169
  # Coolpad
2116
2170
  # @ref: ??
2117
2171
  #########
2118
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+) Build'
2172
+ - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2119
2173
  device_replacement: '$1$2'
2120
2174
  brand_replacement: 'Coolpad'
2121
2175
  model_replacement: '$1$2'
@@ -2124,7 +2178,7 @@ device_parsers:
2124
2178
  # Cube
2125
2179
  # @ref: http://www.cube-tablet.com/buy-products.html
2126
2180
  #########
2127
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*|A5300) Build'
2181
+ - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2128
2182
  regex_flag: 'i'
2129
2183
  device_replacement: '$1$2'
2130
2184
  brand_replacement: 'Cube'
@@ -2134,12 +2188,12 @@ device_parsers:
2134
2188
  # Cubot
2135
2189
  # @ref: http://www.cubotmall.com/
2136
2190
  #########
2137
- - regex: '; *CUBOT ([^;/]+) Build'
2191
+ - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2138
2192
  regex_flag: 'i'
2139
2193
  device_replacement: '$1'
2140
2194
  brand_replacement: 'Cubot'
2141
2195
  model_replacement: '$1'
2142
- - regex: '; *(BOBBY) Build'
2196
+ - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2143
2197
  regex_flag: 'i'
2144
2198
  device_replacement: '$1'
2145
2199
  brand_replacement: 'Cubot'
@@ -2149,7 +2203,7 @@ device_parsers:
2149
2203
  # Danew
2150
2204
  # @ref: http://www.danew.com/produits-tablette.php
2151
2205
  #########
2152
- - regex: '; *(Dslide [^;/]+) Build'
2206
+ - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2153
2207
  device_replacement: '$1'
2154
2208
  brand_replacement: 'Danew'
2155
2209
  model_replacement: '$1'
@@ -2163,39 +2217,39 @@ device_parsers:
2163
2217
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2164
2218
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2165
2219
  #########
2166
- - regex: '; *(XCD)[ _]?(28|35) Build'
2220
+ - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2167
2221
  device_replacement: 'Dell $1$2'
2168
2222
  brand_replacement: 'Dell'
2169
2223
  model_replacement: '$1$2'
2170
- - regex: '; *(001DL) Build'
2224
+ - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2171
2225
  device_replacement: 'Dell $1'
2172
2226
  brand_replacement: 'Dell'
2173
2227
  model_replacement: 'Streak'
2174
- - regex: '; *(?:Dell|DELL) (Streak) Build'
2228
+ - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2175
2229
  device_replacement: 'Dell $1'
2176
2230
  brand_replacement: 'Dell'
2177
2231
  model_replacement: 'Streak'
2178
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*) Build'
2232
+ - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2179
2233
  device_replacement: 'Dell $1'
2180
2234
  brand_replacement: 'Dell'
2181
2235
  model_replacement: 'Streak Pro'
2182
- - regex: '; *([Ss]treak ?7) Build'
2236
+ - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2183
2237
  device_replacement: 'Dell $1'
2184
2238
  brand_replacement: 'Dell'
2185
2239
  model_replacement: 'Streak 7'
2186
- - regex: '; *(Mini-3iX) Build'
2240
+ - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2187
2241
  device_replacement: 'Dell $1'
2188
2242
  brand_replacement: 'Dell'
2189
2243
  model_replacement: '$1'
2190
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*|Streak[ _]Pro) Build'
2244
+ - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2191
2245
  device_replacement: 'Dell $1'
2192
2246
  brand_replacement: 'Dell'
2193
2247
  model_replacement: '$1'
2194
- - regex: '; *Dell[ _]([^;/]+) Build'
2248
+ - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2195
2249
  device_replacement: 'Dell $1'
2196
2250
  brand_replacement: 'Dell'
2197
2251
  model_replacement: '$1'
2198
- - regex: '; *Dell ([^;/]+) Build'
2252
+ - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2199
2253
  device_replacement: 'Dell $1'
2200
2254
  brand_replacement: 'Dell'
2201
2255
  model_replacement: '$1'
@@ -2204,7 +2258,7 @@ device_parsers:
2204
2258
  # Denver
2205
2259
  # @ref: http://www.denver-electronics.com/tablets1/
2206
2260
  #########
2207
- - regex: '; *(TA[CD]-\d+[^;/]*) Build'
2261
+ - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2208
2262
  device_replacement: '$1'
2209
2263
  brand_replacement: 'Denver'
2210
2264
  model_replacement: '$1'
@@ -2213,7 +2267,7 @@ device_parsers:
2213
2267
  # Dex
2214
2268
  # @ref: http://dex.ua/
2215
2269
  #########
2216
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?) Build'
2270
+ - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2217
2271
  device_replacement: '$1'
2218
2272
  brand_replacement: 'Dex'
2219
2273
  model_replacement: '$1'
@@ -2222,7 +2276,7 @@ device_parsers:
2222
2276
  # DNS AirTab
2223
2277
  # @ref: http://www.dns-shop.ru/
2224
2278
  #########
2225
- - regex: '; *(AirTab)[ _\-]([^;/]+) Build'
2279
+ - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2226
2280
  device_replacement: '$1 $2'
2227
2281
  brand_replacement: 'DNS'
2228
2282
  model_replacement: '$1 $2'
@@ -2231,43 +2285,43 @@ device_parsers:
2231
2285
  # Docomo (Operator Branded Device)
2232
2286
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2233
2287
  #########
2234
- - regex: '; *(F\-\d[^;/]+) Build'
2288
+ - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2235
2289
  device_replacement: '$1'
2236
2290
  brand_replacement: 'Fujitsu'
2237
2291
  model_replacement: '$1'
2238
- - regex: '; *(HT-03A) Build'
2292
+ - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2239
2293
  device_replacement: '$1'
2240
2294
  brand_replacement: 'HTC'
2241
2295
  model_replacement: 'Magic'
2242
- - regex: '; *(HT\-\d[^;/]+) Build'
2296
+ - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2243
2297
  device_replacement: '$1'
2244
2298
  brand_replacement: 'HTC'
2245
2299
  model_replacement: '$1'
2246
- - regex: '; *(L\-\d[^;/]+) Build'
2300
+ - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2247
2301
  device_replacement: '$1'
2248
2302
  brand_replacement: 'LG'
2249
2303
  model_replacement: '$1'
2250
- - regex: '; *(N\-\d[^;/]+) Build'
2304
+ - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2251
2305
  device_replacement: '$1'
2252
2306
  brand_replacement: 'Nec'
2253
2307
  model_replacement: '$1'
2254
- - regex: '; *(P\-\d[^;/]+) Build'
2308
+ - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2255
2309
  device_replacement: '$1'
2256
2310
  brand_replacement: 'Panasonic'
2257
2311
  model_replacement: '$1'
2258
- - regex: '; *(SC\-\d[^;/]+) Build'
2312
+ - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2259
2313
  device_replacement: '$1'
2260
2314
  brand_replacement: 'Samsung'
2261
2315
  model_replacement: '$1'
2262
- - regex: '; *(SH\-\d[^;/]+) Build'
2316
+ - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2263
2317
  device_replacement: '$1'
2264
2318
  brand_replacement: 'Sharp'
2265
2319
  model_replacement: '$1'
2266
- - regex: '; *(SO\-\d[^;/]+) Build'
2320
+ - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2267
2321
  device_replacement: '$1'
2268
2322
  brand_replacement: 'SonyEricsson'
2269
2323
  model_replacement: '$1'
2270
- - regex: '; *(T\-0[12][^;/]+) Build'
2324
+ - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2271
2325
  device_replacement: '$1'
2272
2326
  brand_replacement: 'Toshiba'
2273
2327
  model_replacement: '$1'
@@ -2276,7 +2330,7 @@ device_parsers:
2276
2330
  # DOOV
2277
2331
  # @ref: http://www.doov.com.cn/
2278
2332
  #########
2279
- - regex: '; *(DOOV)[ _]([^;/]+) Build'
2333
+ - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2280
2334
  device_replacement: '$1 $2'
2281
2335
  brand_replacement: 'DOOV'
2282
2336
  model_replacement: '$2'
@@ -2285,7 +2339,7 @@ device_parsers:
2285
2339
  # Enot
2286
2340
  # @ref: http://www.enot.ua/
2287
2341
  #########
2288
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+) Build'
2342
+ - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2289
2343
  device_replacement: '$1 $2'
2290
2344
  brand_replacement: 'Enot'
2291
2345
  model_replacement: '$2'
@@ -2298,7 +2352,7 @@ device_parsers:
2298
2352
  device_replacement: 'CROSS $1'
2299
2353
  brand_replacement: 'Evercoss'
2300
2354
  model_replacement: 'Cross $1'
2301
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+) Build'
2355
+ - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2302
2356
  device_replacement: '$1 $2'
2303
2357
  brand_replacement: 'Evercoss'
2304
2358
  model_replacement: 'Cross $2'
@@ -2316,11 +2370,11 @@ device_parsers:
2316
2370
  # Fly
2317
2371
  # @ref: http://www.fly-phone.com/
2318
2372
  #########
2319
- - regex: '; *(IQ.*) Build'
2373
+ - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2320
2374
  device_replacement: '$1'
2321
2375
  brand_replacement: 'Fly'
2322
2376
  model_replacement: '$1'
2323
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+|F[34]\d+[^;]*);? Build'
2377
+ - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2324
2378
  device_replacement: '$1 $2'
2325
2379
  brand_replacement: 'Fly'
2326
2380
  model_replacement: '$2'
@@ -2329,7 +2383,7 @@ device_parsers:
2329
2383
  # Fujitsu
2330
2384
  # @ref: http://www.fujitsu.com/global/
2331
2385
  #########
2332
- - regex: '; *(M532|Q572|FJL21) Build/'
2386
+ - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2333
2387
  device_replacement: '$1'
2334
2388
  brand_replacement: 'Fujitsu'
2335
2389
  model_replacement: '$1'
@@ -2338,7 +2392,7 @@ device_parsers:
2338
2392
  # Galapad
2339
2393
  # @ref: http://www.galapad.net/product.html
2340
2394
  #########
2341
- - regex: '; *(G1) Build'
2395
+ - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2342
2396
  device_replacement: '$1'
2343
2397
  brand_replacement: 'Galapad'
2344
2398
  model_replacement: '$1'
@@ -2347,7 +2401,7 @@ device_parsers:
2347
2401
  # Geeksphone
2348
2402
  # @ref: http://www.geeksphone.com/
2349
2403
  #########
2350
- - regex: '; *(Geeksphone) ([^;/]+) Build'
2404
+ - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2351
2405
  device_replacement: '$1 $2'
2352
2406
  brand_replacement: '$1'
2353
2407
  model_replacement: '$2'
@@ -2357,7 +2411,7 @@ device_parsers:
2357
2411
  # @ref: http://www.gfivemobile.com/en
2358
2412
  #########
2359
2413
  #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2360
- - regex: '; *(G[^F]?FIVE) ([^;/]+) Build'
2414
+ - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2361
2415
  device_replacement: '$1 $2'
2362
2416
  brand_replacement: 'Gfive'
2363
2417
  model_replacement: '$2'
@@ -2366,12 +2420,12 @@ device_parsers:
2366
2420
  # Gionee
2367
2421
  # @ref: http://www.gionee.com/
2368
2422
  #########
2369
- - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build'
2423
+ - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2370
2424
  regex_flag: 'i'
2371
2425
  device_replacement: '$1 $2'
2372
2426
  brand_replacement: 'Gionee'
2373
2427
  model_replacement: '$2'
2374
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1) Build'
2428
+ - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2375
2429
  device_replacement: 'Gionee $1'
2376
2430
  brand_replacement: 'Gionee'
2377
2431
  model_replacement: '$1'
@@ -2389,11 +2443,11 @@ device_parsers:
2389
2443
  # GoClever
2390
2444
  # @ref: http://www.goclever.com
2391
2445
  #########
2392
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB) Build'
2446
+ - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2393
2447
  device_replacement: 'GoClever $1'
2394
2448
  brand_replacement: 'GoClever'
2395
2449
  model_replacement: '$1'
2396
- - regex: '; *GOCLEVER ([^;/]+) Build'
2450
+ - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2397
2451
  device_replacement: 'GoClever $1'
2398
2452
  brand_replacement: 'GoClever'
2399
2453
  model_replacement: '$1'
@@ -2402,11 +2456,11 @@ device_parsers:
2402
2456
  # Google
2403
2457
  # @ref: http://www.google.de/glass/start/
2404
2458
  #########
2405
- - regex: '; *(Glass \d+) Build'
2459
+ - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2406
2460
  device_replacement: '$1'
2407
2461
  brand_replacement: 'Google'
2408
2462
  model_replacement: '$1'
2409
- - regex: '; *(Pixel.*) Build'
2463
+ - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2410
2464
  device_replacement: '$1'
2411
2465
  brand_replacement: 'Google'
2412
2466
  model_replacement: '$1'
@@ -2415,7 +2469,7 @@ device_parsers:
2415
2469
  # Gigabyte
2416
2470
  # @ref: http://gsmart.gigabytecm.com/en/
2417
2471
  #########
2418
- - regex: '; *(GSmart)[ -]([^/]+) Build'
2472
+ - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2419
2473
  device_replacement: '$1 $2'
2420
2474
  brand_replacement: 'Gigabyte'
2421
2475
  model_replacement: '$1 $2'
@@ -2424,7 +2478,7 @@ device_parsers:
2424
2478
  # Freescale development boards
2425
2479
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2426
2480
  #########
2427
- - regex: '; *(imx5[13]_[^/]+) Build'
2481
+ - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2428
2482
  device_replacement: 'Freescale $1'
2429
2483
  brand_replacement: 'Freescale'
2430
2484
  model_replacement: '$1'
@@ -2434,11 +2488,11 @@ device_parsers:
2434
2488
  # @ref: http://www.haier.com/
2435
2489
  # @ref: http://www.haier.com/de/produkte/tablet/
2436
2490
  #########
2437
- - regex: '; *Haier[ _\-]([^/]+) Build'
2491
+ - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2438
2492
  device_replacement: 'Haier $1'
2439
2493
  brand_replacement: 'Haier'
2440
2494
  model_replacement: '$1'
2441
- - regex: '; *(PAD1016) Build'
2495
+ - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2442
2496
  device_replacement: 'Haipad $1'
2443
2497
  brand_replacement: 'Haipad'
2444
2498
  model_replacement: '$1'
@@ -2448,7 +2502,7 @@ device_parsers:
2448
2502
  # @ref: http://www.haipad.net/
2449
2503
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2450
2504
  #########
2451
- - regex: '; *(M701|M7|M8|M9) Build'
2505
+ - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2452
2506
  device_replacement: 'Haipad $1'
2453
2507
  brand_replacement: 'Haipad'
2454
2508
  model_replacement: '$1'
@@ -2480,7 +2534,7 @@ device_parsers:
2480
2534
  # Hena
2481
2535
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2482
2536
  #########
2483
- - regex: '; *(MID-?\d{4}C[EM]) Build'
2537
+ - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2484
2538
  device_replacement: 'Hena $1'
2485
2539
  brand_replacement: 'Hena'
2486
2540
  model_replacement: '$1'
@@ -2489,11 +2543,11 @@ device_parsers:
2489
2543
  # Hisense
2490
2544
  # @ref: http://www.hisense.com/
2491
2545
  #########
2492
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+) Build'
2546
+ - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2493
2547
  device_replacement: 'Hisense $1'
2494
2548
  brand_replacement: 'Hisense'
2495
2549
  model_replacement: '$1'
2496
- - regex: '; *(andromax[^;/]+) Build'
2550
+ - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2497
2551
  regex_flag: 'i'
2498
2552
  device_replacement: 'Hisense $1'
2499
2553
  brand_replacement: 'Hisense'
@@ -2503,7 +2557,7 @@ device_parsers:
2503
2557
  # hitech
2504
2558
  # @ref: http://www.hitech-mobiles.com/
2505
2559
  #########
2506
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE) Build'
2560
+ - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2507
2561
  device_replacement: 'AMAZE $1$2'
2508
2562
  brand_replacement: 'hitech'
2509
2563
  model_replacement: 'AMAZE $1$2'
@@ -2512,15 +2566,15 @@ device_parsers:
2512
2566
  # HP
2513
2567
  # @ref: http://www.hp.com/
2514
2568
  #########
2515
- - regex: '; *(PlayBook) Build'
2569
+ - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2516
2570
  device_replacement: 'HP $1'
2517
2571
  brand_replacement: 'HP'
2518
2572
  model_replacement: '$1'
2519
- - regex: '; *HP ([^/]+) Build'
2573
+ - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2520
2574
  device_replacement: 'HP $1'
2521
2575
  brand_replacement: 'HP'
2522
2576
  model_replacement: '$1'
2523
- - regex: '; *([^/]+_tenderloin) Build'
2577
+ - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2524
2578
  device_replacement: 'HP TouchPad'
2525
2579
  brand_replacement: 'HP'
2526
2580
  model_replacement: 'TouchPad'
@@ -2663,16 +2717,16 @@ device_parsers:
2663
2717
  # Hyundai
2664
2718
  # @ref: http://www.hyundaitechnologies.com
2665
2719
  #########
2666
- - regex: '; *HYUNDAI (T\d[^/]*) Build'
2720
+ - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
2667
2721
  device_replacement: 'Hyundai $1'
2668
2722
  brand_replacement: 'Hyundai'
2669
2723
  model_replacement: '$1'
2670
- - regex: '; *HYUNDAI ([^;/]+) Build'
2724
+ - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
2671
2725
  device_replacement: 'Hyundai $1'
2672
2726
  brand_replacement: 'Hyundai'
2673
2727
  model_replacement: '$1'
2674
2728
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2675
- - regex: '; *(X700|Hold X|MB-6900) Build'
2729
+ - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2676
2730
  device_replacement: 'Hyundai $1'
2677
2731
  brand_replacement: 'Hyundai'
2678
2732
  model_replacement: '$1'
@@ -2681,12 +2735,12 @@ device_parsers:
2681
2735
  # iBall
2682
2736
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2683
2737
  #########
2684
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build'
2738
+ - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2685
2739
  regex_flag: 'i'
2686
2740
  device_replacement: '$1 $2'
2687
2741
  brand_replacement: 'iBall'
2688
2742
  model_replacement: '$1 $2'
2689
- - regex: '; *(IBall)(?:[ _]([^;/]+)|) Build'
2743
+ - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
2690
2744
  regex_flag: 'i'
2691
2745
  device_replacement: '$1 $2'
2692
2746
  brand_replacement: 'iBall'
@@ -2696,7 +2750,7 @@ device_parsers:
2696
2750
  # IconBIT
2697
2751
  # @ref: http://www.iconbit.com/catalog/tablets/
2698
2752
  #########
2699
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|) Build'
2753
+ - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
2700
2754
  device_replacement: '$1'
2701
2755
  brand_replacement: 'IconBIT'
2702
2756
  model_replacement: '$1'
@@ -2705,7 +2759,7 @@ device_parsers:
2705
2759
  # IMO
2706
2760
  # @ref: http://www.ponselimo.com/
2707
2761
  #########
2708
- - regex: '; *(IMO)[ _]([^;/]+) Build'
2762
+ - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2709
2763
  regex_flag: 'i'
2710
2764
  device_replacement: '$1 $2'
2711
2765
  brand_replacement: 'IMO'
@@ -2715,12 +2769,12 @@ device_parsers:
2715
2769
  # i-mobile
2716
2770
  # @ref: http://www.i-mobilephone.com/
2717
2771
  #########
2718
- - regex: '; *i-?mobile[ _]([^/]+) Build/'
2772
+ - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
2719
2773
  regex_flag: 'i'
2720
2774
  device_replacement: 'i-mobile $1'
2721
2775
  brand_replacement: 'imobile'
2722
2776
  model_replacement: '$1'
2723
- - regex: '; *(i-(?:style|note)[^/]*) Build/'
2777
+ - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
2724
2778
  regex_flag: 'i'
2725
2779
  device_replacement: 'i-mobile $1'
2726
2780
  brand_replacement: 'imobile'
@@ -2730,7 +2784,7 @@ device_parsers:
2730
2784
  # Impression
2731
2785
  # @ref: http://impression.ua/planshetnye-kompyutery
2732
2786
  #########
2733
- - regex: '; *(ImPAD) ?(\d+(?:.)*) Build'
2787
+ - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
2734
2788
  device_replacement: '$1 $2'
2735
2789
  brand_replacement: 'Impression'
2736
2790
  model_replacement: '$1 $2'
@@ -2739,7 +2793,7 @@ device_parsers:
2739
2793
  # Infinix
2740
2794
  # @ref: http://www.infinixmobility.com/index.html
2741
2795
  #########
2742
- - regex: '; *(Infinix)[ _]([^;/]+) Build'
2796
+ - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2743
2797
  device_replacement: '$1 $2'
2744
2798
  brand_replacement: 'Infinix'
2745
2799
  model_replacement: '$2'
@@ -2748,7 +2802,7 @@ device_parsers:
2748
2802
  # Informer
2749
2803
  # @ref: ??
2750
2804
  #########
2751
- - regex: '; *(Informer)[ \-]([^;/]+) Build'
2805
+ - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
2752
2806
  device_replacement: '$1 $2'
2753
2807
  brand_replacement: 'Informer'
2754
2808
  model_replacement: '$2'
@@ -2758,7 +2812,7 @@ device_parsers:
2758
2812
  # @ref: http://www.intenso.de
2759
2813
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2760
2814
  #########
2761
- - regex: '; *(TAB) ?([78][12]4) Build'
2815
+ - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2762
2816
  device_replacement: 'Intenso $1'
2763
2817
  brand_replacement: 'Intenso'
2764
2818
  model_replacement: '$1 $2'
@@ -2769,7 +2823,7 @@ device_parsers:
2769
2823
  # @note: Zync also offers a "Cloud Z5" device
2770
2824
  #########
2771
2825
  # smartphones
2772
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
2826
+ - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
2773
2827
  device_replacement: '$1$2$3'
2774
2828
  brand_replacement: 'Intex'
2775
2829
  model_replacement: '$1 $3'
@@ -2783,7 +2837,7 @@ device_parsers:
2783
2837
  device_replacement: '$1 $2 $3'
2784
2838
  brand_replacement: 'Intex'
2785
2839
  model_replacement: 'iBuddy $2 $3'
2786
- - regex: '; *(I-Buddy)[ _]([^;/]+) *(?:Build|;)'
2840
+ - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
2787
2841
  device_replacement: '$1 $2'
2788
2842
  brand_replacement: 'Intex'
2789
2843
  model_replacement: 'iBuddy $2'
@@ -2792,7 +2846,7 @@ device_parsers:
2792
2846
  # iOCEAN
2793
2847
  # @ref: http://www.iocean.cc/
2794
2848
  #########
2795
- - regex: '; *(iOCEAN) ([^/]+) Build'
2849
+ - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
2796
2850
  regex_flag: 'i'
2797
2851
  device_replacement: '$1 $2'
2798
2852
  brand_replacement: 'iOCEAN'
@@ -2802,7 +2856,7 @@ device_parsers:
2802
2856
  # i.onik
2803
2857
  # @ref: http://www.i-onik.de/
2804
2858
  #########
2805
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build'
2859
+ - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2806
2860
  device_replacement: 'ionik $1'
2807
2861
  brand_replacement: 'ionik'
2808
2862
  model_replacement: '$1'
@@ -2811,7 +2865,7 @@ device_parsers:
2811
2865
  # IRU.ru
2812
2866
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2813
2867
  #########
2814
- - regex: '; *(M702pro) Build'
2868
+ - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
2815
2869
  device_replacement: '$1'
2816
2870
  brand_replacement: 'Iru'
2817
2871
  model_replacement: '$1'
@@ -2821,11 +2875,11 @@ device_parsers:
2821
2875
  # @ref: http://www.ivio.com/mobile.php
2822
2876
  # @models: DG80,DG20,DE38,DE88,MD70
2823
2877
  #########
2824
- - regex: '; *(DE88Plus|MD70) Build'
2878
+ - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2825
2879
  device_replacement: '$1'
2826
2880
  brand_replacement: 'Ivio'
2827
2881
  model_replacement: '$1'
2828
- - regex: '; *IVIO[_\-]([^;/]+) Build'
2882
+ - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2829
2883
  device_replacement: '$1'
2830
2884
  brand_replacement: 'Ivio'
2831
2885
  model_replacement: '$1'
@@ -2834,7 +2888,7 @@ device_parsers:
2834
2888
  # Jaytech
2835
2889
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2836
2890
  #########
2837
- - regex: '; *(TPC-\d+|JAY-TECH) Build'
2891
+ - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2838
2892
  device_replacement: '$1'
2839
2893
  brand_replacement: 'Jaytech'
2840
2894
  model_replacement: '$1'
@@ -2843,7 +2897,7 @@ device_parsers:
2843
2897
  # Jiayu
2844
2898
  # @ref: http://www.ejiayu.com/en/Product.html
2845
2899
  #########
2846
- - regex: '; *(JY-[^;/]+|G[234]S?) Build'
2900
+ - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
2847
2901
  device_replacement: '$1'
2848
2902
  brand_replacement: 'Jiayu'
2849
2903
  model_replacement: '$1'
@@ -2852,7 +2906,7 @@ device_parsers:
2852
2906
  # JXD
2853
2907
  # @ref: http://www.jxd.hk/
2854
2908
  #########
2855
- - regex: '; *(JXD)[ _\-]([^;/]+) Build'
2909
+ - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2856
2910
  device_replacement: '$1 $2'
2857
2911
  brand_replacement: 'JXD'
2858
2912
  model_replacement: '$2'
@@ -2879,84 +2933,84 @@ device_parsers:
2879
2933
  # KDDI (Operator Branded Device)
2880
2934
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2881
2935
  #########
2882
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH) Build'
2936
+ - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
2883
2937
  device_replacement: '$1'
2884
2938
  brand_replacement: 'Sharp'
2885
2939
  model_replacement: '$1'
2886
- - regex: '; *(IS04) Build'
2940
+ - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
2887
2941
  device_replacement: '$1'
2888
2942
  brand_replacement: 'Regza'
2889
2943
  model_replacement: '$1'
2890
- - regex: '; *(IS06|IS\d{2}PT) Build'
2944
+ - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
2891
2945
  device_replacement: '$1'
2892
2946
  brand_replacement: 'Pantech'
2893
2947
  model_replacement: '$1'
2894
- - regex: '; *(IS11S) Build'
2948
+ - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
2895
2949
  device_replacement: '$1'
2896
2950
  brand_replacement: 'SonyEricsson'
2897
2951
  model_replacement: 'Xperia Acro'
2898
- - regex: '; *(IS11CA) Build'
2952
+ - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
2899
2953
  device_replacement: '$1'
2900
2954
  brand_replacement: 'Casio'
2901
2955
  model_replacement: 'GzOne $1'
2902
- - regex: '; *(IS11LG) Build'
2956
+ - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
2903
2957
  device_replacement: '$1'
2904
2958
  brand_replacement: 'LG'
2905
2959
  model_replacement: 'Optimus X'
2906
- - regex: '; *(IS11N) Build'
2960
+ - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
2907
2961
  device_replacement: '$1'
2908
2962
  brand_replacement: 'Medias'
2909
2963
  model_replacement: '$1'
2910
- - regex: '; *(IS11PT) Build'
2964
+ - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
2911
2965
  device_replacement: '$1'
2912
2966
  brand_replacement: 'Pantech'
2913
2967
  model_replacement: 'MIRACH'
2914
- - regex: '; *(IS12F) Build'
2968
+ - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
2915
2969
  device_replacement: '$1'
2916
2970
  brand_replacement: 'Fujitsu'
2917
2971
  model_replacement: 'Arrows ES'
2918
2972
  # @ref: https://ja.wikipedia.org/wiki/IS12M
2919
- - regex: '; *(IS12M) Build'
2973
+ - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
2920
2974
  device_replacement: '$1'
2921
2975
  brand_replacement: 'Motorola'
2922
2976
  model_replacement: 'XT909'
2923
- - regex: '; *(IS12S) Build'
2977
+ - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
2924
2978
  device_replacement: '$1'
2925
2979
  brand_replacement: 'SonyEricsson'
2926
2980
  model_replacement: 'Xperia Acro HD'
2927
- - regex: '; *(ISW11F) Build'
2981
+ - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
2928
2982
  device_replacement: '$1'
2929
2983
  brand_replacement: 'Fujitsu'
2930
2984
  model_replacement: 'Arrowz Z'
2931
- - regex: '; *(ISW11HT) Build'
2985
+ - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
2932
2986
  device_replacement: '$1'
2933
2987
  brand_replacement: 'HTC'
2934
2988
  model_replacement: 'EVO'
2935
- - regex: '; *(ISW11K) Build'
2989
+ - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
2936
2990
  device_replacement: '$1'
2937
2991
  brand_replacement: 'Kyocera'
2938
2992
  model_replacement: 'DIGNO'
2939
- - regex: '; *(ISW11M) Build'
2993
+ - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
2940
2994
  device_replacement: '$1'
2941
2995
  brand_replacement: 'Motorola'
2942
2996
  model_replacement: 'Photon'
2943
- - regex: '; *(ISW11SC) Build'
2997
+ - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
2944
2998
  device_replacement: '$1'
2945
2999
  brand_replacement: 'Samsung'
2946
3000
  model_replacement: 'GALAXY S II WiMAX'
2947
- - regex: '; *(ISW12HT) Build'
3001
+ - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
2948
3002
  device_replacement: '$1'
2949
3003
  brand_replacement: 'HTC'
2950
3004
  model_replacement: 'EVO 3D'
2951
- - regex: '; *(ISW13HT) Build'
3005
+ - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
2952
3006
  device_replacement: '$1'
2953
3007
  brand_replacement: 'HTC'
2954
3008
  model_replacement: 'J'
2955
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2}) Build'
3009
+ - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
2956
3010
  device_replacement: '$1'
2957
3011
  brand_replacement: 'KDDI'
2958
3012
  model_replacement: '$1'
2959
- - regex: '; *(INFOBAR [^;/]+) Build'
3013
+ - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
2960
3014
  device_replacement: '$1'
2961
3015
  brand_replacement: 'KDDI'
2962
3016
  model_replacement: '$1'
@@ -2965,7 +3019,7 @@ device_parsers:
2965
3019
  # Kingcom
2966
3020
  # @ref: http://www.e-kingcom.com
2967
3021
  #########
2968
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+) Build/'
3022
+ - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2969
3023
  device_replacement: '$1 $2'
2970
3024
  brand_replacement: 'Kingcom'
2971
3025
  model_replacement: '$1 $2'
@@ -2975,7 +3029,7 @@ device_parsers:
2975
3029
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
2976
3030
  # @ref: http://www.kobo.com/devices#tablets
2977
3031
  #########
2978
- - regex: '; *(Vox|VOX|Arc|K080) Build/'
3032
+ - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
2979
3033
  regex_flag: 'i'
2980
3034
  device_replacement: '$1'
2981
3035
  brand_replacement: 'Kobo'
@@ -2989,7 +3043,7 @@ device_parsers:
2989
3043
  # K-Touch
2990
3044
  # @ref: ??
2991
3045
  #########
2992
- - regex: '; *(K-Touch)[ _]([^;/]+) Build'
3046
+ - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2993
3047
  regex_flag: 'i'
2994
3048
  device_replacement: '$1 $2'
2995
3049
  brand_replacement: 'Ktouch'
@@ -2999,7 +3053,7 @@ device_parsers:
2999
3053
  # KT Tech
3000
3054
  # @ref: http://www.kttech.co.kr
3001
3055
  #########
3002
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?) Build'
3056
+ - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3003
3057
  regex_flag: 'i'
3004
3058
  device_replacement: '$1'
3005
3059
  brand_replacement: 'KTtech'
@@ -3009,7 +3063,7 @@ device_parsers:
3009
3063
  # Kyocera
3010
3064
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3011
3065
  #########
3012
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2}) Build/'
3066
+ - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3013
3067
  device_replacement: '$1'
3014
3068
  brand_replacement: 'Kyocera'
3015
3069
  model_replacement: '$1'
@@ -3032,7 +3086,7 @@ device_parsers:
3032
3086
  # Lemon
3033
3087
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3034
3088
  #########
3035
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_? Build'
3089
+ - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3036
3090
  device_replacement: 'Lemon $1$2'
3037
3091
  brand_replacement: 'Lemon'
3038
3092
  model_replacement: '$1$2'
@@ -3041,11 +3095,11 @@ device_parsers:
3041
3095
  # Lenco
3042
3096
  # @ref: http://www.lenco.com/c/tablets/
3043
3097
  #########
3044
- - regex: '; *(TAB-1012) Build/'
3098
+ - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3045
3099
  device_replacement: 'Lenco $1'
3046
3100
  brand_replacement: 'Lenco'
3047
3101
  model_replacement: '$1'
3048
- - regex: '; Lenco ([^;/]+) Build/'
3102
+ - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3049
3103
  device_replacement: 'Lenco $1'
3050
3104
  brand_replacement: 'Lenco'
3051
3105
  model_replacement: '$1'
@@ -3095,7 +3149,7 @@ device_parsers:
3095
3149
  # Lexibook
3096
3150
  # @ref: http://www.lexibook.com/fr
3097
3151
  #########
3098
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),? Build'
3152
+ - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3099
3153
  device_replacement: '$1$2'
3100
3154
  brand_replacement: 'Lexibook'
3101
3155
  model_replacement: '$1$2'
@@ -3133,11 +3187,11 @@ device_parsers:
3133
3187
  # Malata
3134
3188
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3135
3189
  #########
3136
- - regex: '; *((?:SMB|smb)[^;/]+) Build/'
3190
+ - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3137
3191
  device_replacement: '$1'
3138
3192
  brand_replacement: 'Malata'
3139
3193
  model_replacement: '$1'
3140
- - regex: '; *(?:Malata|MALATA) ([^;/]+) Build/'
3194
+ - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3141
3195
  device_replacement: '$1'
3142
3196
  brand_replacement: 'Malata'
3143
3197
  model_replacement: '$1'
@@ -3146,7 +3200,7 @@ device_parsers:
3146
3200
  # Manta
3147
3201
  # @ref: http://www.manta.com.pl/en
3148
3202
  #########
3149
- - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9]) Build/'
3203
+ - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3150
3204
  device_replacement: '$1'
3151
3205
  brand_replacement: 'Manta'
3152
3206
  model_replacement: '$1'
@@ -3155,7 +3209,7 @@ device_parsers:
3155
3209
  # Match
3156
3210
  # @ref: http://www.match.net.cn/products.asp
3157
3211
  #########
3158
- - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980) Build/'
3212
+ - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
3159
3213
  device_replacement: '$1'
3160
3214
  brand_replacement: 'Match'
3161
3215
  model_replacement: '$1'
@@ -3169,7 +3223,7 @@ device_parsers:
3169
3223
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3170
3224
  # @note: Need more User-Agents!!!
3171
3225
  #########
3172
- - regex: '; *(GenxDroid7|MSD7.*|AX\d.*|Tab 701|Tab 722) Build/'
3226
+ - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3173
3227
  device_replacement: 'Maxx $1'
3174
3228
  brand_replacement: 'Maxx'
3175
3229
  model_replacement: '$1'
@@ -3178,11 +3232,11 @@ device_parsers:
3178
3232
  # Mediacom
3179
3233
  # @ref: http://www.mediacomeurope.it/
3180
3234
  #########
3181
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+) Build'
3235
+ - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3182
3236
  device_replacement: 'Mediacom $1'
3183
3237
  brand_replacement: 'Mediacom'
3184
3238
  model_replacement: '$1'
3185
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+) Build'
3239
+ - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3186
3240
  device_replacement: 'Mediacom $1'
3187
3241
  brand_replacement: 'Mediacom'
3188
3242
  model_replacement: '$1'
@@ -3191,12 +3245,12 @@ device_parsers:
3191
3245
  # Medion
3192
3246
  # @ref: http://www.medion.com/en/
3193
3247
  #########
3194
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build'
3248
+ - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3195
3249
  regex_flag: 'i'
3196
3250
  device_replacement: 'Medion Lifetab $1'
3197
3251
  brand_replacement: 'Medion'
3198
3252
  model_replacement: 'Lifetab $1'
3199
- - regex: '; *MEDION ([^;/]+) Build'
3253
+ - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3200
3254
  device_replacement: 'Medion $1'
3201
3255
  brand_replacement: 'Medion'
3202
3256
  model_replacement: '$1'
@@ -3205,7 +3259,7 @@ device_parsers:
3205
3259
  # Meizu
3206
3260
  # @ref: http://www.meizu.com
3207
3261
  #########
3208
- - regex: '; *(M030|M031|M035|M040|M065|m9) Build'
3262
+ - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3209
3263
  device_replacement: 'Meizu $1'
3210
3264
  brand_replacement: 'Meizu'
3211
3265
  model_replacement: '$1'
@@ -3249,7 +3303,7 @@ device_parsers:
3249
3303
  # Mito
3250
3304
  # @ref: http://new.mitomobile.com/
3251
3305
  #########
3252
- - regex: '; *(MITO)[ _\-]?([^;/]+) Build'
3306
+ - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3253
3307
  regex_flag: 'i'
3254
3308
  device_replacement: '$1 $2'
3255
3309
  brand_replacement: 'Mito'
@@ -3269,12 +3323,12 @@ device_parsers:
3269
3323
  # Modecom
3270
3324
  # @ref: http://www.modecom.eu/tablets/portal/
3271
3325
  #########
3272
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build'
3326
+ - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3273
3327
  regex_flag: 'i'
3274
3328
  device_replacement: '$1$2 $3'
3275
3329
  brand_replacement: 'Modecom'
3276
3330
  model_replacement: '$2 $3'
3277
- - regex: '; *(MODECOM )([^;/]+) Build'
3331
+ - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3278
3332
  regex_flag: 'i'
3279
3333
  device_replacement: '$1 $2'
3280
3334
  brand_replacement: 'Modecom'
@@ -3318,7 +3372,7 @@ device_parsers:
3318
3372
  # MpMan
3319
3373
  # @ref: http://www.mpmaneurope.com
3320
3374
  #########
3321
- - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*) Build'
3375
+ - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
3322
3376
  device_replacement: '$1'
3323
3377
  brand_replacement: 'Mpman'
3324
3378
  model_replacement: '$1'
@@ -3327,7 +3381,7 @@ device_parsers:
3327
3381
  # MSI
3328
3382
  # @ref: http://www.msi.com/product/windpad/
3329
3383
  #########
3330
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build'
3384
+ - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3331
3385
  regex_flag: 'i'
3332
3386
  device_replacement: '$1'
3333
3387
  brand_replacement: 'Msi'
@@ -3337,7 +3391,7 @@ device_parsers:
3337
3391
  # Multilaser
3338
3392
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3339
3393
  #########
3340
- - regex: '; *Multilaser[ _]([^;/]+) Build'
3394
+ - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3341
3395
  device_replacement: '$1'
3342
3396
  brand_replacement: 'Multilaser'
3343
3397
  model_replacement: '$1'
@@ -3346,15 +3400,15 @@ device_parsers:
3346
3400
  # MyPhone
3347
3401
  # @ref: http://myphone.com.ph/
3348
3402
  #########
3349
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+) Build'
3403
+ - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3350
3404
  device_replacement: '$1$2 $3'
3351
3405
  brand_replacement: 'MyPhone'
3352
3406
  model_replacement: '$1$2 $3'
3353
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+) Build'
3407
+ - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3354
3408
  device_replacement: '$1$2 $3'
3355
3409
  brand_replacement: 'MyPhone'
3356
3410
  model_replacement: '$3'
3357
- - regex: '; *(A\d+)[ _](Duo|) Build'
3411
+ - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3358
3412
  regex_flag: 'i'
3359
3413
  device_replacement: '$1 $2'
3360
3414
  brand_replacement: 'MyPhone'
@@ -3364,7 +3418,7 @@ device_parsers:
3364
3418
  # Mytab
3365
3419
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3366
3420
  #########
3367
- - regex: '; *(myTab[^;/]*) Build'
3421
+ - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3368
3422
  device_replacement: '$1'
3369
3423
  brand_replacement: 'Mytab'
3370
3424
  model_replacement: '$1'
@@ -3373,7 +3427,7 @@ device_parsers:
3373
3427
  # Nabi
3374
3428
  # @ref: https://www.nabitablet.com
3375
3429
  #########
3376
- - regex: '; *(NABI2?-)([^;/]+) Build/'
3430
+ - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3377
3431
  device_replacement: '$1$2'
3378
3432
  brand_replacement: 'Nabi'
3379
3433
  model_replacement: '$2'
@@ -3382,15 +3436,15 @@ device_parsers:
3382
3436
  # Nec Medias
3383
3437
  # @ref: http://www.n-keitai.com/
3384
3438
  #########
3385
- - regex: '; *(N-\d+[CDE]) Build/'
3439
+ - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3386
3440
  device_replacement: '$1'
3387
3441
  brand_replacement: 'Nec'
3388
3442
  model_replacement: '$1'
3389
- - regex: '; ?(NEC-)(.*) Build/'
3443
+ - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3390
3444
  device_replacement: '$1$2'
3391
3445
  brand_replacement: 'Nec'
3392
3446
  model_replacement: '$2'
3393
- - regex: '; *(LT-NA7) Build/'
3447
+ - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3394
3448
  device_replacement: '$1'
3395
3449
  brand_replacement: 'Nec'
3396
3450
  model_replacement: 'Lifetouch Note'
@@ -3399,7 +3453,7 @@ device_parsers:
3399
3453
  # Nextbook
3400
3454
  # @ref: http://nextbookusa.com
3401
3455
  #########
3402
- - regex: '; *(NXM\d+[A-z0-9_]*|Next\d[A-z0-9_ \-]*|NEXT\d[A-z0-9_ \-]*|Nextbook [A-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3456
+ - regex: '; *(NXM\d+[A-Za-z0-9_]*|Next\d[A-Za-z0-9_ \-]*|NEXT\d[A-Za-z0-9_ \-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3403
3457
  device_replacement: '$1'
3404
3458
  brand_replacement: 'Nextbook'
3405
3459
  model_replacement: '$1'
@@ -3419,11 +3473,11 @@ device_parsers:
3419
3473
  # @ref:
3420
3474
  # TODO nook browser/1.0
3421
3475
  #########
3422
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+) Build'
3476
+ - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3423
3477
  device_replacement: '$1$2'
3424
3478
  brand_replacement: 'Nook'
3425
3479
  model_replacement: '$2'
3426
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
3480
+ - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3427
3481
  device_replacement: '$1$2'
3428
3482
  brand_replacement: 'Nook'
3429
3483
  model_replacement: '$2'
@@ -3436,7 +3490,7 @@ device_parsers:
3436
3490
  # Olivetti
3437
3491
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3438
3492
  #########
3439
- - regex: '; *(OP110|OliPad[^;/]+) Build'
3493
+ - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3440
3494
  device_replacement: 'Olivetti $1'
3441
3495
  brand_replacement: 'Olivetti'
3442
3496
  model_replacement: '$1'
@@ -3447,7 +3501,7 @@ device_parsers:
3447
3501
  # @note: MID tablets might get matched by CobyKyros first
3448
3502
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3449
3503
  #########
3450
- - regex: '; *OMEGA[ _\-](MID[^;/]+) Build'
3504
+ - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3451
3505
  device_replacement: 'Omega $1'
3452
3506
  brand_replacement: 'Omega'
3453
3507
  model_replacement: '$1'
@@ -3460,7 +3514,7 @@ device_parsers:
3460
3514
  # OpenPeak
3461
3515
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3462
3516
  #########
3463
- - regex: '; *((?:CIUS|cius)[^;/]*) Build'
3517
+ - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3464
3518
  device_replacement: 'Openpeak $1'
3465
3519
  brand_replacement: 'Openpeak'
3466
3520
  model_replacement: '$1'
@@ -3469,11 +3523,11 @@ device_parsers:
3469
3523
  # Oppo
3470
3524
  # @ref: http://en.oppo.com/products/
3471
3525
  #########
3472
- - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2}) Build'
3526
+ - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2})(?: Build|\) AppleWebKit)'
3473
3527
  device_replacement: 'Oppo $1'
3474
3528
  brand_replacement: 'Oppo'
3475
3529
  model_replacement: '$1'
3476
- - regex: '; *OPPO ?([^;/]+) Build/'
3530
+ - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3477
3531
  device_replacement: 'Oppo $1'
3478
3532
  brand_replacement: 'Oppo'
3479
3533
  model_replacement: '$1'
@@ -3482,20 +3536,20 @@ device_parsers:
3482
3536
  # Odys
3483
3537
  # @ref: http://odys.de
3484
3538
  #########
3485
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+) Build'
3539
+ - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3486
3540
  device_replacement: 'Odys $1'
3487
3541
  brand_replacement: 'Odys'
3488
3542
  model_replacement: '$1'
3489
- - regex: '; *(SELECT) ?(7) Build'
3543
+ - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3490
3544
  device_replacement: 'Odys $1 $2'
3491
3545
  brand_replacement: 'Odys'
3492
3546
  model_replacement: '$1 $2'
3493
- - regex: '; *(PEDI)_(PLUS)_(W) Build'
3547
+ - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3494
3548
  device_replacement: 'Odys $1 $2 $3'
3495
3549
  brand_replacement: 'Odys'
3496
3550
  model_replacement: '$1 $2 $3'
3497
3551
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3498
- - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO) Build'
3552
+ - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
3499
3553
  device_replacement: 'Odys $1'
3500
3554
  brand_replacement: 'Odys'
3501
3555
  model_replacement: '$1'
@@ -3504,11 +3558,11 @@ device_parsers:
3504
3558
  # OnePlus
3505
3559
  # @ref https://oneplus.net/
3506
3560
  #########
3507
- - regex: '; (ONE [a-zA-Z]\d+) Build/'
3561
+ - regex: '; (ONE [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3508
3562
  device_replacement: 'OnePlus $1'
3509
3563
  brand_replacement: 'OnePlus'
3510
3564
  model_replacement: '$1'
3511
- - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build/|)'
3565
+ - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3512
3566
  device_replacement: 'OnePlus $1'
3513
3567
  brand_replacement: 'OnePlus'
3514
3568
  model_replacement: '$1'
@@ -3517,7 +3571,7 @@ device_parsers:
3517
3571
  # Orion
3518
3572
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3519
3573
  #########
3520
- - regex: '; *(TP-\d+) Build/'
3574
+ - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
3521
3575
  device_replacement: 'Orion $1'
3522
3576
  brand_replacement: 'Orion'
3523
3577
  model_replacement: '$1'
@@ -3526,7 +3580,7 @@ device_parsers:
3526
3580
  # PackardBell
3527
3581
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3528
3582
  #########
3529
- - regex: '; *(G100W?) Build/'
3583
+ - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
3530
3584
  device_replacement: 'PackardBell $1'
3531
3585
  brand_replacement: 'PackardBell'
3532
3586
  model_replacement: '$1'
@@ -3537,17 +3591,17 @@ device_parsers:
3537
3591
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3538
3592
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3539
3593
  #########
3540
- - regex: '; *(Panasonic)[_ ]([^;/]+) Build'
3594
+ - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
3541
3595
  device_replacement: '$1 $2'
3542
3596
  brand_replacement: '$1'
3543
3597
  model_replacement: '$2'
3544
3598
  # Toughpad
3545
- - regex: '; *(FZ-A1B|JT-B1) Build'
3599
+ - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3546
3600
  device_replacement: 'Panasonic $1'
3547
3601
  brand_replacement: 'Panasonic'
3548
3602
  model_replacement: '$1'
3549
3603
  # Eluga Power
3550
- - regex: '; *(dL1|DL1) Build'
3604
+ - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
3551
3605
  device_replacement: 'Panasonic $1'
3552
3606
  brand_replacement: 'Panasonic'
3553
3607
  model_replacement: '$1'
@@ -3575,7 +3629,7 @@ device_parsers:
3575
3629
  # Papayre
3576
3630
  # @ref: http://grammata.es/
3577
3631
  #########
3578
- - regex: '; *(papyre)[ _\-]([^;/]+) Build/'
3632
+ - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3579
3633
  regex_flag: 'i'
3580
3634
  device_replacement: '$1 $2'
3581
3635
  brand_replacement: 'Papyre'
@@ -3585,7 +3639,7 @@ device_parsers:
3585
3639
  # Pearl
3586
3640
  # @ref: http://www.pearl.de/c-1540.shtml
3587
3641
  #########
3588
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+) Build/'
3642
+ - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
3589
3643
  device_replacement: 'Pearl $1'
3590
3644
  brand_replacement: 'Pearl'
3591
3645
  model_replacement: '$1'
@@ -3594,15 +3648,15 @@ device_parsers:
3594
3648
  # Phicomm
3595
3649
  # @ref: http://www.phicomm.com.cn/
3596
3650
  #########
3597
- - regex: '; PHICOMM (i800) Build/'
3651
+ - regex: '; PHICOMM (i800)(?: Build|\) AppleWebKit)'
3598
3652
  device_replacement: 'Phicomm $1'
3599
3653
  brand_replacement: 'Phicomm'
3600
3654
  model_replacement: '$1'
3601
- - regex: '; PHICOMM ([^;/]+) Build/'
3655
+ - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
3602
3656
  device_replacement: 'Phicomm $1'
3603
3657
  brand_replacement: 'Phicomm'
3604
3658
  model_replacement: '$1'
3605
- - regex: '; *(FWS\d{3}[^;/]+) Build/'
3659
+ - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
3606
3660
  device_replacement: 'Phicomm $1'
3607
3661
  brand_replacement: 'Phicomm'
3608
3662
  model_replacement: '$1'
@@ -3614,11 +3668,11 @@ device_parsers:
3614
3668
  # @ref: http://www.support.philips.com/support/catalog/products.jsp?_dyncharset=UTF-8&country=&categoryid=ENTERTAINMENT_TABLETS_SU_CN_CARE&userLanguage=en&navCount=0&groupId=&catalogType=&navAction=push&userCountry=cn&title=Entertainment+Tablets&cateId=TABLETS_CA_CN_CARE
3615
3669
  #########
3616
3670
  # @note: this a best guess according to available philips models. Need more User-Agents
3617
- - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930) Build'
3671
+ - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
3618
3672
  device_replacement: '$1'
3619
3673
  brand_replacement: 'Philips'
3620
3674
  model_replacement: '$1'
3621
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+) Build'
3675
+ - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3622
3676
  device_replacement: 'Philips $1'
3623
3677
  brand_replacement: 'Philips'
3624
3678
  model_replacement: '$1'
@@ -3627,7 +3681,7 @@ device_parsers:
3627
3681
  # Pipo
3628
3682
  # @ref: http://www.pipo.cn/En/
3629
3683
  #########
3630
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)? Build'
3684
+ - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3631
3685
  device_replacement: 'Pipo $1$2'
3632
3686
  brand_replacement: 'Pipo'
3633
3687
  model_replacement: '$1$2'
@@ -3636,7 +3690,7 @@ device_parsers:
3636
3690
  # Ployer
3637
3691
  # @ref: http://en.ployer.cn/
3638
3692
  #########
3639
- - regex: '; *(MOMO[^;/]+) Build'
3693
+ - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
3640
3694
  device_replacement: '$1'
3641
3695
  brand_replacement: 'Ployer'
3642
3696
  model_replacement: '$1'
@@ -3645,11 +3699,11 @@ device_parsers:
3645
3699
  # Polaroid/ Acho
3646
3700
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3647
3701
  #########
3648
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/'
3702
+ - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
3649
3703
  device_replacement: '$1'
3650
3704
  brand_replacement: 'Polaroid'
3651
3705
  model_replacement: '$1'
3652
- - regex: '; *(?:Polaroid )(Tablet) Build/'
3706
+ - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3653
3707
  device_replacement: '$1'
3654
3708
  brand_replacement: 'Polaroid'
3655
3709
  model_replacement: '$1'
@@ -3668,11 +3722,11 @@ device_parsers:
3668
3722
  # Positivo
3669
3723
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3670
3724
  #########
3671
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA) Build/'
3725
+ - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3672
3726
  device_replacement: '$1'
3673
3727
  brand_replacement: 'Positivo'
3674
3728
  model_replacement: '$1'
3675
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/'
3729
+ - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
3676
3730
  device_replacement: '$1'
3677
3731
  brand_replacement: 'Positivo'
3678
3732
  model_replacement: '$1'
@@ -3682,15 +3736,15 @@ device_parsers:
3682
3736
  # @ref: http://www.pointofview-online.com/default2.php
3683
3737
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3684
3738
  #########
3685
- - regex: '; *(MOB-[^;/]+) Build/'
3739
+ - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
3686
3740
  device_replacement: '$1'
3687
3741
  brand_replacement: 'POV'
3688
3742
  model_replacement: '$1'
3689
- - regex: '; *POV[ _\-]([^;/]+) Build/'
3743
+ - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3690
3744
  device_replacement: 'POV $1'
3691
3745
  brand_replacement: 'POV'
3692
3746
  model_replacement: '$1'
3693
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*) Build/'
3747
+ - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3694
3748
  device_replacement: 'POV $1'
3695
3749
  brand_replacement: 'POV'
3696
3750
  model_replacement: '$1'
@@ -3700,7 +3754,7 @@ device_parsers:
3700
3754
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3701
3755
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3702
3756
  #########
3703
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/'
3757
+ - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
3704
3758
  device_replacement: 'Prestigio $1'
3705
3759
  brand_replacement: 'Prestigio'
3706
3760
  model_replacement: '$1'
@@ -3709,7 +3763,7 @@ device_parsers:
3709
3763
  # Proscan
3710
3764
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3711
3765
  #########
3712
- - regex: '; *(PLT[0-9]{4}.*) Build/'
3766
+ - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
3713
3767
  device_replacement: '$1'
3714
3768
  brand_replacement: 'Proscan'
3715
3769
  model_replacement: '$1'
@@ -3718,15 +3772,15 @@ device_parsers:
3718
3772
  # QMobile
3719
3773
  # @ref: http://www.qmobile.com.pk/
3720
3774
  #########
3721
- - regex: '; *(A2|A5|A8|A900)_?(Classic|) Build'
3775
+ - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3722
3776
  device_replacement: '$1 $2'
3723
3777
  brand_replacement: 'Qmobile'
3724
3778
  model_replacement: '$1 $2'
3725
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+) Build'
3779
+ - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3726
3780
  device_replacement: 'Qmobile $2 $3'
3727
3781
  brand_replacement: 'Qmobile'
3728
3782
  model_replacement: '$2 $3'
3729
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+) Build'
3783
+ - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
3730
3784
  device_replacement: 'Qmobile $2'
3731
3785
  brand_replacement: 'Qmobile'
3732
3786
  model_replacement: '$2'
@@ -3735,11 +3789,11 @@ device_parsers:
3735
3789
  # Qmobilevn
3736
3790
  # @ref: http://qmobile.vn/san-pham.html
3737
3791
  #########
3738
- - regex: '; *(Q\-Smart)[ _]([^;/]+) Build/'
3792
+ - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3739
3793
  device_replacement: '$1 $2'
3740
3794
  brand_replacement: 'Qmobilevn'
3741
3795
  model_replacement: '$2'
3742
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+) Build/'
3796
+ - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
3743
3797
  device_replacement: '$1 $2'
3744
3798
  brand_replacement: 'Qmobilevn'
3745
3799
  model_replacement: '$2'
@@ -3748,7 +3802,7 @@ device_parsers:
3748
3802
  # Quanta
3749
3803
  # @ref: ?
3750
3804
  #########
3751
- - regex: '; *(TA1013) Build'
3805
+ - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
3752
3806
  device_replacement: '$1'
3753
3807
  brand_replacement: 'Quanta'
3754
3808
  model_replacement: '$1'
@@ -3757,11 +3811,11 @@ device_parsers:
3757
3811
  # RCA
3758
3812
  # @ref: http://rcamobilephone.com/
3759
3813
  #########
3760
- - regex: '; (RCT\w+) Build/'
3814
+ - regex: '; (RCT\w+)(?: Build|\) AppleWebKit)'
3761
3815
  device_replacement: '$1'
3762
3816
  brand_replacement: 'RCA'
3763
3817
  model_replacement: '$1'
3764
- - regex: '; RCA (\w+) Build/'
3818
+ - regex: '; RCA (\w+)(?: Build|\) AppleWebKit)'
3765
3819
  device_replacement: 'RCA $1'
3766
3820
  brand_replacement: 'RCA'
3767
3821
  model_replacement: '$1'
@@ -3771,7 +3825,7 @@ device_parsers:
3771
3825
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3772
3826
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3773
3827
  #########
3774
- - regex: '; *(RK\d+),? Build/'
3828
+ - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
3775
3829
  device_replacement: '$1'
3776
3830
  brand_replacement: 'Rockchip'
3777
3831
  model_replacement: '$1'
@@ -3842,11 +3896,11 @@ device_parsers:
3842
3896
  # @ref: http://www.sharp-phone.com/en/index.html
3843
3897
  # @ref: http://www.android.com/devices/?country=all&m=sharp
3844
3898
  #########
3845
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+) Build'
3899
+ - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
3846
3900
  device_replacement: '$1'
3847
3901
  brand_replacement: 'Sharp'
3848
3902
  model_replacement: '$1'
3849
- - regex: '; *(SHARP[ -])([^;/]+) Build'
3903
+ - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
3850
3904
  device_replacement: '$1$2'
3851
3905
  brand_replacement: 'Sharp'
3852
3906
  model_replacement: '$2'
@@ -3855,15 +3909,15 @@ device_parsers:
3855
3909
  # Simvalley
3856
3910
  # @ref: http://www.simvalley-mobile.de/
3857
3911
  #########
3858
- - regex: '; *(SPX[_\-]\d[^;/]*) Build/'
3912
+ - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
3859
3913
  device_replacement: '$1'
3860
3914
  brand_replacement: 'Simvalley'
3861
3915
  model_replacement: '$1'
3862
- - regex: '; *(SX7\-PEARL\.GmbH) Build/'
3916
+ - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
3863
3917
  device_replacement: '$1'
3864
3918
  brand_replacement: 'Simvalley'
3865
3919
  model_replacement: '$1'
3866
- - regex: '; *(SP[T]?\-\d{2}[^;/]*) Build/'
3920
+ - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
3867
3921
  device_replacement: '$1'
3868
3922
  brand_replacement: 'Simvalley'
3869
3923
  model_replacement: '$1'
@@ -3873,7 +3927,7 @@ device_parsers:
3873
3927
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
3874
3928
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
3875
3929
  #########
3876
- - regex: '; *(SK\-.*) Build/'
3930
+ - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
3877
3931
  device_replacement: '$1'
3878
3932
  brand_replacement: 'SKtelesys'
3879
3933
  model_replacement: '$1'
@@ -3882,11 +3936,11 @@ device_parsers:
3882
3936
  # Skytex
3883
3937
  # @ref: http://skytex.com/android
3884
3938
  #########
3885
- - regex: '; *(?:SKYTEX|SX)-([^;/]+) Build'
3939
+ - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
3886
3940
  device_replacement: '$1'
3887
3941
  brand_replacement: 'Skytex'
3888
3942
  model_replacement: '$1'
3889
- - regex: '; *(IMAGINE [^;/]+) Build'
3943
+ - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
3890
3944
  device_replacement: '$1'
3891
3945
  brand_replacement: 'Skytex'
3892
3946
  model_replacement: '$1'
@@ -3896,7 +3950,7 @@ device_parsers:
3896
3950
  # @ref: http://en.smartdevices.com.cn/Products/
3897
3951
  # @models: Z8, X7, U7H, U7, T30, T20, Ten3, V5-II, T7-3G, SmartQ5, K7, S7, Q8, T19, Ten2, Ten, R10, T7, R7, V5, V7, SmartQ7
3898
3952
  #########
3899
- - regex: '; *(SmartQ) ?([^;/]+) Build/'
3953
+ - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3900
3954
  device_replacement: '$1 $2'
3901
3955
  brand_replacement: '$1'
3902
3956
  model_replacement: '$2'
@@ -3906,7 +3960,7 @@ device_parsers:
3906
3960
  # @ref: http://www.smartbitt.com/
3907
3961
  # @missing: SBT Useragents
3908
3962
  #########
3909
- - regex: '; *(WF7C|WF10C|SBT[^;/]+) Build'
3963
+ - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
3910
3964
  device_replacement: '$1'
3911
3965
  brand_replacement: 'Smartbitt'
3912
3966
  model_replacement: '$1'
@@ -3949,7 +4003,7 @@ device_parsers:
3949
4003
  device_replacement: 'Trekstor $1'
3950
4004
  brand_replacement: 'Trekstor'
3951
4005
  model_replacement: '$1'
3952
- - regex: '; *(ST\d{4}.*) Build/'
4006
+ - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
3953
4007
  device_replacement: 'Trekstor $1'
3954
4008
  brand_replacement: 'Trekstor'
3955
4009
  model_replacement: '$1'
@@ -3982,31 +4036,31 @@ device_parsers:
3982
4036
  # @ref: http://www.sonymobile.com/global-en/products/phones/
3983
4037
  # @ref: http://www.sony.jp/tablet/
3984
4038
  #########
3985
- - regex: '; Sony (Tablet[^;/]+) Build'
4039
+ - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
3986
4040
  device_replacement: 'Sony $1'
3987
4041
  brand_replacement: 'Sony'
3988
4042
  model_replacement: '$1'
3989
- - regex: '; Sony ([^;/]+) Build'
4043
+ - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
3990
4044
  device_replacement: 'Sony $1'
3991
4045
  brand_replacement: 'Sony'
3992
4046
  model_replacement: '$1'
3993
- - regex: '; *(Sony)([A-Za-z0-9\-]+) Build'
4047
+ - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
3994
4048
  device_replacement: '$1 $2'
3995
4049
  brand_replacement: '$1'
3996
4050
  model_replacement: '$2'
3997
- - regex: '; *(Xperia [^;/]+) Build'
4051
+ - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
3998
4052
  device_replacement: '$1'
3999
4053
  brand_replacement: 'Sony'
4000
4054
  model_replacement: '$1'
4001
- - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2}) Build'
4055
+ - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
4002
4056
  device_replacement: '$1'
4003
4057
  brand_replacement: 'Sony'
4004
4058
  model_replacement: '$1'
4005
- - regex: '; *(SGP\d{3}|SGPT\d{2}) Build'
4059
+ - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4006
4060
  device_replacement: '$1'
4007
4061
  brand_replacement: 'Sony'
4008
4062
  model_replacement: '$1'
4009
- - regex: '; *(NW-Z1000Series) Build'
4063
+ - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4010
4064
  device_replacement: '$1'
4011
4065
  brand_replacement: 'Sony'
4012
4066
  model_replacement: '$1'
@@ -4029,7 +4083,7 @@ device_parsers:
4029
4083
  # Spice
4030
4084
  # @ref: http://www.spicemobilephones.co.in/
4031
4085
  #########
4032
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*) Build/'
4086
+ - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4033
4087
  device_replacement: '$1$2$3$4'
4034
4088
  brand_replacement: 'Spice'
4035
4089
  model_replacement: 'Mi$4'
@@ -4051,7 +4105,7 @@ device_parsers:
4051
4105
  # Tagi
4052
4106
  # @ref: ??
4053
4107
  #########
4054
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+) Build/'
4108
+ - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4055
4109
  device_replacement: '$1$2$3'
4056
4110
  brand_replacement: 'Tagi'
4057
4111
  model_replacement: '$2$3'
@@ -4060,7 +4114,7 @@ device_parsers:
4060
4114
  # Tecmobile
4061
4115
  # @ref: http://www.tecmobile.com/
4062
4116
  #########
4063
- - regex: '; *(Oyster500|Opal 800) Build'
4117
+ - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4064
4118
  device_replacement: 'Tecmobile $1'
4065
4119
  brand_replacement: 'Tecmobile'
4066
4120
  model_replacement: '$1'
@@ -4069,7 +4123,7 @@ device_parsers:
4069
4123
  # Tecno
4070
4124
  # @ref: www.tecno-mobile.com/‎
4071
4125
  #########
4072
- - regex: '; *(TECNO[ _])([^;/]+) Build/'
4126
+ - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4073
4127
  device_replacement: '$1$2'
4074
4128
  brand_replacement: 'Tecno'
4075
4129
  model_replacement: '$2'
@@ -4089,7 +4143,7 @@ device_parsers:
4089
4143
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4090
4144
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4091
4145
  #########
4092
- - regex: '; *(T-Hub2) Build/'
4146
+ - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4093
4147
  device_replacement: '$1'
4094
4148
  brand_replacement: 'Telstra'
4095
4149
  model_replacement: '$1'
@@ -4098,7 +4152,7 @@ device_parsers:
4098
4152
  # Terra
4099
4153
  # @ref: http://www.wortmann.de/
4100
4154
  #########
4101
- - regex: '; *(PAD) ?(100[12]) Build/'
4155
+ - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4102
4156
  device_replacement: 'Terra $1$2'
4103
4157
  brand_replacement: 'Terra'
4104
4158
  model_replacement: '$1$2'
@@ -4107,7 +4161,7 @@ device_parsers:
4107
4161
  # Texet
4108
4162
  # @ref: http://www.texet.ru/tablet/
4109
4163
  #########
4110
- - regex: '; *(T[BM]-\d{3}[^;/]+) Build/'
4164
+ - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4111
4165
  device_replacement: '$1'
4112
4166
  brand_replacement: 'Texet'
4113
4167
  model_replacement: '$1'
@@ -4116,7 +4170,7 @@ device_parsers:
4116
4170
  # Thalia
4117
4171
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4118
4172
  #########
4119
- - regex: '; *(tolino [^;/]+) Build'
4173
+ - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4120
4174
  device_replacement: '$1'
4121
4175
  brand_replacement: 'Thalia'
4122
4176
  model_replacement: '$1'
@@ -4130,11 +4184,11 @@ device_parsers:
4130
4184
  # @ref: http://en.thl.com.cn/Mobile
4131
4185
  # @ref: http://thlmobilestore.com
4132
4186
  #########
4133
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+) Build/'
4187
+ - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4134
4188
  device_replacement: '$1 $2'
4135
4189
  brand_replacement: 'Thl'
4136
4190
  model_replacement: '$2'
4137
- - regex: '; *(T100|T200|T5|W100|W200|W8s) Build/'
4191
+ - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4138
4192
  device_replacement: '$1'
4139
4193
  brand_replacement: 'Thl'
4140
4194
  model_replacement: '$1'
@@ -4185,7 +4239,7 @@ device_parsers:
4185
4239
  # Tomtec
4186
4240
  # @ref: http://www.tom-tec.eu/pages/tablets.php
4187
4241
  #########
4188
- - regex: ' (ATP[0-9]{4}) Build'
4242
+ - regex: ' (ATP[0-9]{4})(?: Build|\) AppleWebKit)'
4189
4243
  device_replacement: '$1'
4190
4244
  brand_replacement: 'Tomtec'
4191
4245
  model_replacement: '$1'
@@ -4194,7 +4248,7 @@ device_parsers:
4194
4248
  # Tooky
4195
4249
  # @ref: http://www.tookymobile.com/
4196
4250
  #########
4197
- - regex: ' *(TOOKY)[ _\-]([^;/]+) ?(?:Build|;)'
4251
+ - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4198
4252
  regex_flag: 'i'
4199
4253
  device_replacement: '$1 $2'
4200
4254
  brand_replacement: 'Tooky'
@@ -4209,11 +4263,11 @@ device_parsers:
4209
4263
  device_replacement: '$1'
4210
4264
  brand_replacement: 'Toshiba'
4211
4265
  model_replacement: 'Folio 100'
4212
- - regex: '; *([Ff]olio ?100) Build/'
4266
+ - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4213
4267
  device_replacement: '$1'
4214
4268
  brand_replacement: 'Toshiba'
4215
4269
  model_replacement: 'Folio 100'
4216
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
4270
+ - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4217
4271
  device_replacement: 'Toshiba $1'
4218
4272
  brand_replacement: 'Toshiba'
4219
4273
  model_replacement: '$1'
@@ -4222,12 +4276,12 @@ device_parsers:
4222
4276
  # Touchmate
4223
4277
  # @ref: http://touchmatepc.com/new/
4224
4278
  #########
4225
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750) Build'
4279
+ - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4226
4280
  device_replacement: '$1'
4227
4281
  brand_replacement: 'Touchmate'
4228
4282
  model_replacement: '$1'
4229
4283
  # @todo: needs verification user-agents missing
4230
- - regex: '; *(TM-SM\d+[^;/]+) Build'
4284
+ - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4231
4285
  device_replacement: '$1'
4232
4286
  brand_replacement: 'Touchmate'
4233
4287
  model_replacement: '$1'
@@ -4236,11 +4290,11 @@ device_parsers:
4236
4290
  # Treq
4237
4291
  # @ref: http://www.treq.co.id/product
4238
4292
  #########
4239
- - regex: '; *(A10 [Bb]asic2?) Build/'
4293
+ - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4240
4294
  device_replacement: '$1'
4241
4295
  brand_replacement: 'Treq'
4242
4296
  model_replacement: '$1'
4243
- - regex: '; *(TREQ[ _\-])([^;/]+) Build'
4297
+ - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4244
4298
  regex_flag: 'i'
4245
4299
  device_replacement: '$1$2'
4246
4300
  brand_replacement: 'Treq'
@@ -4252,12 +4306,12 @@ device_parsers:
4252
4306
  # @models: A936|A603|X-5|X-3
4253
4307
  #########
4254
4308
  # @todo: guessed markers
4255
- - regex: '; *(X-?5|X-?3) Build/'
4309
+ - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4256
4310
  device_replacement: '$1'
4257
4311
  brand_replacement: 'Umeox'
4258
4312
  model_replacement: '$1'
4259
4313
  # @todo: guessed markers
4260
- - regex: '; *(A502\+?|A936|A603|X1|X2) Build/'
4314
+ - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4261
4315
  device_replacement: '$1'
4262
4316
  brand_replacement: 'Umeox'
4263
4317
  model_replacement: '$1'
@@ -4266,7 +4320,7 @@ device_parsers:
4266
4320
  # Versus
4267
4321
  # @ref: http://versusuk.com/support.html
4268
4322
  #########
4269
- - regex: '(TOUCH(?:TAB|PAD).+?) Build/'
4323
+ - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4270
4324
  regex_flag: 'i'
4271
4325
  device_replacement: 'Versus $1'
4272
4326
  brand_replacement: 'Versus'
@@ -4276,7 +4330,7 @@ device_parsers:
4276
4330
  # Vertu
4277
4331
  # @ref: http://www.vertu.com/
4278
4332
  #########
4279
- - regex: '(VERTU) ([^;/]+) Build/'
4333
+ - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4280
4334
  device_replacement: '$1 $2'
4281
4335
  brand_replacement: 'Vertu'
4282
4336
  model_replacement: '$2'
@@ -4285,11 +4339,11 @@ device_parsers:
4285
4339
  # Videocon
4286
4340
  # @ref: http://www.videoconmobiles.com
4287
4341
  #########
4288
- - regex: '; *(Videocon)[ _\-]([^;/]+) *(?:Build|;)'
4342
+ - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4289
4343
  device_replacement: '$1 $2'
4290
4344
  brand_replacement: 'Videocon'
4291
4345
  model_replacement: '$2'
4292
- - regex: ' (VT\d{2}[A-Za-z]*) Build'
4346
+ - regex: ' (VT\d{2}[A-Za-z]*)(?: Build|\) AppleWebKit)'
4293
4347
  device_replacement: '$1'
4294
4348
  brand_replacement: 'Videocon'
4295
4349
  model_replacement: '$1'
@@ -4298,15 +4352,15 @@ device_parsers:
4298
4352
  # Viewsonic
4299
4353
  # @ref: http://viewsonic.com
4300
4354
  #########
4301
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+) Build/'
4355
+ - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4302
4356
  device_replacement: '$1'
4303
4357
  brand_replacement: 'Viewsonic'
4304
4358
  model_replacement: '$1'
4305
- - regex: '; *(ViewSonic-)([^;/]+) Build/'
4359
+ - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4306
4360
  device_replacement: '$1$2'
4307
4361
  brand_replacement: 'Viewsonic'
4308
4362
  model_replacement: '$2'
4309
- - regex: '; *(GTablet.*) Build/'
4363
+ - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4310
4364
  device_replacement: '$1'
4311
4365
  brand_replacement: 'Viewsonic'
4312
4366
  model_replacement: '$1'
@@ -4315,7 +4369,7 @@ device_parsers:
4315
4369
  # vivo
4316
4370
  # @ref: http://vivo.cn/
4317
4371
  #########
4318
- - regex: '; *([Vv]ivo)[ _]([^;/]+) Build'
4372
+ - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4319
4373
  device_replacement: '$1 $2'
4320
4374
  brand_replacement: 'vivo'
4321
4375
  model_replacement: '$2'
@@ -4324,7 +4378,7 @@ device_parsers:
4324
4378
  # Vodafone (Operator Branded Devices)
4325
4379
  # @ref: ??
4326
4380
  #########
4327
- - regex: '(Vodafone) (.*) Build/'
4381
+ - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4328
4382
  device_replacement: '$1 $2'
4329
4383
  brand_replacement: '$1'
4330
4384
  model_replacement: '$2'
@@ -4333,7 +4387,7 @@ device_parsers:
4333
4387
  # Walton
4334
4388
  # @ref: http://www.waltonbd.com/
4335
4389
  #########
4336
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build'
4390
+ - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4337
4391
  regex_flag: 'i'
4338
4392
  device_replacement: 'Walton $1'
4339
4393
  brand_replacement: 'Walton'
@@ -4343,7 +4397,7 @@ device_parsers:
4343
4397
  # Wiko
4344
4398
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4345
4399
  #########
4346
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
4400
+ - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
4347
4401
  regex_flag: 'i'
4348
4402
  device_replacement: 'Wiko $1'
4349
4403
  brand_replacement: 'Wiko'
@@ -4353,7 +4407,7 @@ device_parsers:
4353
4407
  # WellcoM
4354
4408
  # @ref: ??
4355
4409
  #########
4356
- - regex: '; *WellcoM-([^;/]+) Build'
4410
+ - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4357
4411
  device_replacement: 'Wellcom $1'
4358
4412
  brand_replacement: 'Wellcom'
4359
4413
  model_replacement: '$1'
@@ -4371,7 +4425,7 @@ device_parsers:
4371
4425
  # Wolfgang
4372
4426
  # @ref: http://wolfgangmobile.com/
4373
4427
  #########
4374
- - regex: '; *(AT-AS[^;/]+) Build'
4428
+ - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4375
4429
  device_replacement: 'Wolfgang $1'
4376
4430
  brand_replacement: 'Wolfgang'
4377
4431
  model_replacement: '$1'
@@ -4380,7 +4434,7 @@ device_parsers:
4380
4434
  # Woxter
4381
4435
  # @ref: http://www.woxter.es/es-es/categories/index
4382
4436
  #########
4383
- - regex: '; *(?:Woxter|Wxt) ([^;/]+) Build'
4437
+ - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4384
4438
  device_replacement: 'Woxter $1'
4385
4439
  brand_replacement: 'Woxter'
4386
4440
  model_replacement: '$1'
@@ -4389,7 +4443,7 @@ device_parsers:
4389
4443
  # Yarvik Zania
4390
4444
  # @ref: http://yarvik.com
4391
4445
  #########
4392
- - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/'
4446
+ - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
4393
4447
  device_replacement: 'Yarvik $1'
4394
4448
  brand_replacement: 'Yarvik'
4395
4449
  model_replacement: '$1'
@@ -4433,17 +4487,17 @@ device_parsers:
4433
4487
  # Xolo
4434
4488
  # @ref: http://www.xolo.in/
4435
4489
  #########
4436
- - regex: '; *XOLO[ _]([^;/]*tab.*) Build'
4490
+ - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4437
4491
  regex_flag: 'i'
4438
4492
  device_replacement: 'Xolo $1'
4439
4493
  brand_replacement: 'Xolo'
4440
4494
  model_replacement: '$1'
4441
- - regex: '; *XOLO[ _]([^;/]+) Build'
4495
+ - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4442
4496
  regex_flag: 'i'
4443
4497
  device_replacement: 'Xolo $1'
4444
4498
  brand_replacement: 'Xolo'
4445
4499
  model_replacement: '$1'
4446
- - regex: '; *(q\d0{2,3}[a-z]?) Build'
4500
+ - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4447
4501
  regex_flag: 'i'
4448
4502
  device_replacement: 'Xolo $1'
4449
4503
  brand_replacement: 'Xolo'
@@ -4453,7 +4507,7 @@ device_parsers:
4453
4507
  # Xoro
4454
4508
  # @ref: http://www.xoro.de/produkte/
4455
4509
  #########
4456
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/]) Build'
4510
+ - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4457
4511
  device_replacement: 'Xoro $1'
4458
4512
  brand_replacement: 'Xoro'
4459
4513
  model_replacement: '$1'
@@ -4462,7 +4516,7 @@ device_parsers:
4462
4516
  # Zopo
4463
4517
  # @ref: http://www.zopomobiles.com/products.html
4464
4518
  #########
4465
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379])) Build'
4519
+ - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4466
4520
  device_replacement: '$1$2$3'
4467
4521
  brand_replacement: 'Zopo'
4468
4522
  model_replacement: '$1$2$3'
@@ -4471,11 +4525,11 @@ device_parsers:
4471
4525
  # ZiiLabs
4472
4526
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4473
4527
  #########
4474
- - regex: '; *(ZiiLABS) (Zii[^;/]*) Build'
4528
+ - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4475
4529
  device_replacement: '$1 $2'
4476
4530
  brand_replacement: 'ZiiLabs'
4477
4531
  model_replacement: '$2'
4478
- - regex: '; *(Zii)_([^;/]*) Build'
4532
+ - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4479
4533
  device_replacement: '$1 $2'
4480
4534
  brand_replacement: 'ZiiLabs'
4481
4535
  model_replacement: '$2'
@@ -4484,40 +4538,40 @@ device_parsers:
4484
4538
  # ZTE
4485
4539
  # @ref: http://www.ztedevices.com/
4486
4540
  #########
4487
- - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*|Era|Memo[^;]*)|JOE|(?:Kis|KIS)\b[^;]*|Libra|Light [^;]*|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*|RacerII|RACERII|San Francisco[^;]*|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?) Build'
4541
+ - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4488
4542
  device_replacement: '$1'
4489
4543
  brand_replacement: 'ZTE'
4490
4544
  model_replacement: '$1'
4491
- - regex: '; *([A-Z]\d+)_USA_[^;]* Build'
4545
+ - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
4492
4546
  device_replacement: '$1'
4493
4547
  brand_replacement: 'ZTE'
4494
4548
  model_replacement: '$1'
4495
- - regex: '; *(SmartTab\d+)[^;]* Build'
4549
+ - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
4496
4550
  device_replacement: '$1'
4497
4551
  brand_replacement: 'ZTE'
4498
4552
  model_replacement: '$1'
4499
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*) Build'
4553
+ - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4500
4554
  device_replacement: 'ZTE Blade$1'
4501
4555
  brand_replacement: 'ZTE'
4502
4556
  model_replacement: 'Blade$1'
4503
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*) Build'
4557
+ - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4504
4558
  device_replacement: 'ZTE Skate$1'
4505
4559
  brand_replacement: 'ZTE'
4506
4560
  model_replacement: 'Skate$1'
4507
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco) Build'
4561
+ - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4508
4562
  device_replacement: '$1$2'
4509
4563
  brand_replacement: 'ZTE'
4510
4564
  model_replacement: '$1$2'
4511
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+) Build'
4565
+ - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
4512
4566
  device_replacement: 'ZTE $1'
4513
4567
  brand_replacement: 'ZTE'
4514
4568
  model_replacement: '$1'
4515
4569
  # operator specific
4516
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*) Build'
4570
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
4517
4571
  device_replacement: '$1 $2'
4518
4572
  brand_replacement: 'ZTE'
4519
4573
  model_replacement: '$1 $2'
4520
- - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link) Build'
4574
+ - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\) AppleWebKit)'
4521
4575
  regex_flag: 'i'
4522
4576
  device_replacement: '$1'
4523
4577
  brand_replacement: 'ZTE'
@@ -4531,7 +4585,7 @@ device_parsers:
4531
4585
  # Zync
4532
4586
  # @ref: http://www.zync.in/index.php/our-products/tablet-phablets
4533
4587
  ##########
4534
- - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900) Build/'
4588
+ - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\) AppleWebKit)'
4535
4589
  device_replacement: '$1'
4536
4590
  brand_replacement: 'Zync'
4537
4591
  model_replacement: '$1'
@@ -4751,7 +4805,7 @@ device_parsers:
4751
4805
  #########
4752
4806
  # Firefox OS
4753
4807
  #########
4754
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
4808
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
4755
4809
  device_replacement: 'Alcatel $1 $2 $3'
4756
4810
  brand_replacement: 'Alcatel'
4757
4811
  model_replacement: 'One Touch $3'
@@ -4760,11 +4814,27 @@ device_parsers:
4760
4814
  brand_replacement: 'ZTE'
4761
4815
  model_replacement: '$1$2'
4762
4816
 
4817
+ #########
4818
+ # KaiOS
4819
+ #########
4820
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
4821
+ device_replacement: 'Alcatel $1'
4822
+ brand_replacement: 'Alcatel'
4823
+ model_replacement: '$1'
4824
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
4825
+ device_replacement: 'LYF $1'
4826
+ brand_replacement: 'LYF'
4827
+ model_replacement: '$1'
4828
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
4829
+ device_replacement: 'Nokia $1'
4830
+ brand_replacement: 'Nokia'
4831
+ model_replacement: '$1'
4832
+
4763
4833
  ##########
4764
4834
  # NOKIA
4765
4835
  # @note: NokiaN8-00 comes before iphone. Sometimes spoofs iphone
4766
4836
  ##########
4767
- - regex: 'Nokia(N[0-9]+)([A-z_\-][A-z0-9_\-]*)'
4837
+ - regex: 'Nokia(N[0-9]+)([A-Za-z_\-][A-Za-z0-9_\-]*)'
4768
4838
  device_replacement: 'Nokia $1'
4769
4839
  brand_replacement: 'Nokia'
4770
4840
  model_replacement: '$1$2'
@@ -4777,7 +4847,7 @@ device_parsers:
4777
4847
  brand_replacement: 'Nokia'
4778
4848
  model_replacement: 'Lumia $1'
4779
4849
  # UCWEB Browser on Symbian
4780
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+)\)'
4850
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
4781
4851
  device_replacement: '$1 $2'
4782
4852
  brand_replacement: '$1'
4783
4853
  model_replacement: '$2'
@@ -5309,7 +5379,13 @@ device_parsers:
5309
5379
  - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5310
5380
  brand_replacement: 'Generic_Android'
5311
5381
  model_replacement: '$1'
5312
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?)( Build[/ ]|\))'
5382
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5383
+ brand_replacement: 'Generic_Android'
5384
+ model_replacement: '$1'
5385
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5386
+ brand_replacement: 'Generic_Android_Tablet'
5387
+ model_replacement: '$1'
5388
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5313
5389
  brand_replacement: 'Generic_Android'
5314
5390
  model_replacement: '$1'
5315
5391
 
@@ -5354,9 +5430,9 @@ device_parsers:
5354
5430
  model_replacement: 'Smartphone'
5355
5431
 
5356
5432
  ##########
5357
- # Spiders (this is hack...)
5433
+ # Spiders (this is a hack...)
5358
5434
  ##########
5359
- - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti)'
5435
+ - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
5360
5436
  regex_flag: 'i'
5361
5437
  device_replacement: 'Spider'
5362
5438
  brand_replacement: 'Spider'