user_agent_parser 2.7.0 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,7 +41,7 @@ user_agent_parsers:
41
41
 
42
42
  - regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
43
43
  family_replacement: 'ArcGIS Runtime SDK for $1'
44
-
44
+
45
45
  - regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
46
46
  family_replacement: 'ArcGIS Runtime SDK for $1'
47
47
 
@@ -52,9 +52,9 @@ user_agent_parsers:
52
52
  family_replacement: 'AntennaPod'
53
53
  - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
54
54
  - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
55
- - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
56
- - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
57
- - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
55
+ - regex: '^(.{0,200})-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
56
+ - regex: '^(.{0,200})-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
57
+ - regex: '^(.{0,200})/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
58
58
 
59
59
  # Podcast catchers
60
60
  - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
@@ -78,6 +78,9 @@ user_agent_parsers:
78
78
  # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
79
79
  - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
80
80
  family_replacement: 'PingdomBot'
81
+ # 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36 PingdomPageSpeed/1.0 (pingbot/2.0; +http://www.pingdom.com/)'
82
+ - regex: '(PingdomPageSpeed)/(\d+)\.(\d+)'
83
+ family_replacement: 'PingdomBot'
81
84
 
82
85
  # PTST / WebPageTest.org crawlers
83
86
  - regex: ' (PTST)/(\d+)(?:\.(\d+)|)$'
@@ -95,7 +98,7 @@ user_agent_parsers:
95
98
  family_replacement: 'Tableau'
96
99
 
97
100
  # Adobe CreativeCloud
98
- - regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
101
+ - regex: 'AppleWebKit/\d{1,10}\.\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\d+)\.(\d+).(\d+)'
99
102
  family_replacement: 'Adobe CreativeCloud'
100
103
 
101
104
  # Salesforce
@@ -110,7 +113,7 @@ user_agent_parsers:
110
113
  family_replacement: 'FacebookBot'
111
114
 
112
115
  # Google Plus
113
- - regex: 'Google.*/\+/web/snippet'
116
+ - regex: 'Google.{0,50}/\+/web/snippet'
114
117
  family_replacement: 'GooglePlusBot'
115
118
 
116
119
  # Gmail
@@ -128,24 +131,24 @@ user_agent_parsers:
128
131
  # Bots Pattern 'name/0.0.0'
129
132
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
130
133
  # Bots Pattern 'name/0.0.0'
131
- - 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+)|)'
134
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|Pandora|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
132
135
 
133
136
  # MSIECrawler
134
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
137
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
135
138
  family_replacement: 'MSIECrawler'
136
139
 
137
140
  # DAVdroid
138
141
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
139
142
 
140
143
  # Downloader ...
141
- - 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+)|)|)'
144
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|PostmanRuntime|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+)|)|)'
142
145
 
143
146
  # Pinterestbot
144
147
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
145
148
  family_replacement: 'Pinterestbot'
146
149
 
147
150
  # Bots
148
- - 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|ArcGIS Hub Indexer)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
151
+ - 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|PHPCrawl|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|ArcGIS Hub Indexer)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
149
152
 
150
153
  # AWS S3 Clients
151
154
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
@@ -166,21 +169,22 @@ user_agent_parsers:
166
169
  # Facebook
167
170
  # Must come before "Bots General matcher" to catch OrangeBotswana
168
171
  # Facebook Messenger must go before Facebook
169
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
172
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
173
+
170
174
  family_replacement: 'Facebook Messenger'
171
175
  # Facebook
172
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
176
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
177
  family_replacement: 'Facebook'
174
178
  # Sometimes Facebook does not specify a version (FBAV)
175
- - regex: '\[FB.*;'
179
+ - regex: '\[FB.{0,300};'
176
180
  family_replacement: 'Facebook'
177
181
 
178
182
  # Bots General matcher 'name/0.0'
179
- - regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
183
+ - regex: '^.{0,200}?(?:\/[A-Za-z0-9\.]{0,50}|) {0,2}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
180
184
  # Bots containing bot(but not CUBOT)
181
- - regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
185
+ - regex: '^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
182
186
  # Bots containing spider|scrape|Crawl
183
- - regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
187
+ - regex: '^.{0,200}?((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
184
188
 
185
189
  # HbbTV standard defines what features the browser should understand.
186
190
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -196,32 +200,32 @@ user_agent_parsers:
196
200
 
197
201
  # Social Networks (non-Facebook)
198
202
  # Pinterest
199
- - regex: '\[(Pinterest)/[^\]]+\]'
203
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
200
204
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
201
205
  # Instagram app
202
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
206
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
203
207
  # Flipboard app
204
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
208
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
209
  # Flipboard-briefing app
206
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
210
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
211
  # Onefootball app
208
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
212
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
213
  # Snapchat
210
214
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
211
215
  # Twitter
212
216
  - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
213
217
  family_replacement: 'Twitter'
214
218
 
215
- # aspiegel.com spider (owned by Huawei)
216
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
219
+ # Phantom app
220
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|Phantom\/android).(\d+)\.(\d+)\.(\d+)'
221
+ family_replacement: 'Phantom'
222
+
223
+ # aspiegel.com spider (owned by Huawei, later called PetalBot)
224
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)'
217
225
  family_replacement: 'Spider'
218
- brand_replacement: 'Spider'
219
- model_replacement: 'Smartphone'
220
226
 
221
- - regex: 'AspiegelBot'
227
+ - regex: 'AspiegelBot|PetalBot'
222
228
  family_replacement: 'Spider'
223
- brand_replacement: 'Spider'
224
- model_replacement: 'Desktop'
225
229
 
226
230
  # Basilisk
227
231
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -238,7 +242,7 @@ user_agent_parsers:
238
242
  family_replacement: 'Firefox Mobile'
239
243
  - regex: '(Fennec)/(\d+)\.(\d+)'
240
244
  family_replacement: 'Firefox Mobile'
241
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
245
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
242
246
  family_replacement: 'Firefox Mobile'
243
247
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
244
248
  family_replacement: 'Firefox ($1)'
@@ -252,7 +256,7 @@ user_agent_parsers:
252
256
  family_replacement: 'Firefox Beta'
253
257
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
254
258
  family_replacement: 'Firefox ($1)'
255
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
259
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
256
260
  family_replacement: 'MicroB'
257
261
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
258
262
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -284,24 +288,24 @@ user_agent_parsers:
284
288
 
285
289
  # Opera will stop at 9.80 and hide the real version in the Version string.
286
290
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
287
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
291
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
288
292
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
289
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
293
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
290
294
  family_replacement: 'Opera Mobile'
291
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
295
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
292
296
  family_replacement: 'Opera Mobile'
293
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
297
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
294
298
  family_replacement: 'Opera Mobile'
295
299
  - regex: 'Opera Mobi'
296
300
  family_replacement: 'Opera Mobile'
297
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
301
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
298
302
 
299
303
  # Opera 14 for Android uses a WebKit render engine.
300
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
304
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
301
305
  family_replacement: 'Opera Mobile'
302
306
 
303
307
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
304
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
308
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
305
309
  family_replacement: 'Opera'
306
310
 
307
311
  # Opera Coast
@@ -313,7 +317,7 @@ user_agent_parsers:
313
317
  family_replacement: 'Opera Mini'
314
318
 
315
319
  # Opera Neon
316
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
320
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
317
321
  family_replacement: 'Opera Neon'
318
322
 
319
323
  # Palm WebOS looks a lot like Safari.
@@ -360,7 +364,7 @@ user_agent_parsers:
360
364
 
361
365
  - regex: '(Symphony) (\d+).(\d+)'
362
366
 
363
- - regex: 'PLAYSTATION 3.+WebKit'
367
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
364
368
  family_replacement: 'NetFront NX'
365
369
  - regex: 'PLAYSTATION 3'
366
370
  family_replacement: 'NetFront'
@@ -369,11 +373,34 @@ user_agent_parsers:
369
373
  - regex: '(PlayStation Vita)'
370
374
  family_replacement: 'NetFront NX'
371
375
 
372
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
376
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
373
377
  family_replacement: 'NetFront NX'
374
378
  - regex: '(Nintendo 3DS)'
375
379
  family_replacement: 'NetFront NX'
376
380
 
381
+ # Huawei Browser, should go before Safari and Chrome Mobile
382
+ - regex: '(HuaweiBrowser)/(\d+)\.(\d+)\.(\d+)\.\d+'
383
+ family_replacement: 'Huawei Browser'
384
+
385
+ # AVG
386
+ - regex: '(AVG)/(\d+)\.(\d+)\.(\d+)\.\d+'
387
+ family_replacement: 'AVG'
388
+
389
+ # Avast
390
+ - regex: '(AvastSecureBrowser|Avast)/(\d+)\.(\d+)\.(\d+)'
391
+ family_replacement: 'Avast Secure Browser'
392
+
393
+ # Instabridge
394
+ - regex: '(Instabridge)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
395
+
396
+ # Aloha Browser
397
+ - regex: '(AlohaBrowser)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
398
+ family_replacement: 'Aloha Browser'
399
+
400
+ # Brave Browser https://brave.com/ , should go before Safari and Chrome Mobile
401
+ - regex: '((?:B|b)rave(?:\sChrome)?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
402
+ family_replacement: 'Brave'
403
+
377
404
  # Amazon Silk, should go before Safari and Chrome Mobile
378
405
  - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)'
379
406
  family_replacement: 'Amazon Silk'
@@ -382,11 +409,15 @@ user_agent_parsers:
382
409
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
383
410
 
384
411
  # Edge Mobile
385
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
412
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
386
413
  family_replacement: 'Edge Mobile'
387
- - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
414
+ - regex: '(EdgiOS|EdgA)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
388
415
  family_replacement: 'Edge Mobile'
389
416
 
417
+ # Oculus Browser, should go before Samsung Internet
418
+ - regex: '(OculusBrowser)/(\d+)\.(\d+).0.0(?:\.([0-9\-]+)|)'
419
+ family_replacement: 'Oculus Browser'
420
+
390
421
  # Samsung Internet (based on Chrome, but lacking some features)
391
422
  - regex: '(SamsungBrowser)/(\d+)\.(\d+)'
392
423
  family_replacement: 'Samsung Internet'
@@ -430,7 +461,7 @@ user_agent_parsers:
430
461
  family_replacement: 'TopBuzz'
431
462
 
432
463
  # Google Search App on Android, eg:
433
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
464
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
434
465
  family_replacement: 'Google'
435
466
 
436
467
  # QQ Browsers
@@ -441,18 +472,38 @@ user_agent_parsers:
441
472
  - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
442
473
  family_replacement: 'QQ Browser'
443
474
 
475
+ # DuckDuckGo
476
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(DuckDuckGo)/(\d+)'
477
+ family_replacement: 'DuckDuckGo Mobile'
478
+ - regex: 'Mozilla.{1,200}(DuckDuckGo)/(\d+)'
479
+ family_replacement: 'DuckDuckGo'
480
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Ddg)/(\d+)(?:\.(\d+)|)'
481
+ family_replacement: 'DuckDuckGo Mobile'
482
+ - regex: 'Mozilla.{1,200}(Ddg)/(\d+)(?:\.(\d+)|)'
483
+ family_replacement: 'DuckDuckGo'
484
+
485
+ # Tenta Browser
486
+ - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
487
+ family_replacement: 'Tenta Browser'
488
+
489
+ # Ecosia on iOS / Android
490
+ - regex: '(Ecosia) ios@(\d+)\.(\d+)\.(\d+)\.(\d+)'
491
+ family_replacement: 'Ecosia iOS'
492
+ - regex: '(Ecosia) android@(\d+)\.(\d+)\.(\d+)\.(\d+)'
493
+ family_replacement: 'Ecosia Android'
494
+
444
495
  # Chrome Mobile
445
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
496
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
446
497
  family_replacement: 'Chrome Mobile WebView'
447
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
498
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
448
499
  family_replacement: 'Chrome Mobile WebView'
449
500
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
501
  family_replacement: 'Chrome Mobile'
451
- - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
502
+ - regex: '(CriOS)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
452
503
  family_replacement: 'Chrome Mobile iOS'
453
504
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
454
505
  family_replacement: 'Chrome Mobile'
455
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
506
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
456
507
  family_replacement: 'Chrome Mobile'
457
508
 
458
509
  # Chrome Frame must come before MSIE.
@@ -480,9 +531,11 @@ user_agent_parsers:
480
531
  # Yandex Browser
481
532
  - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)'
482
533
  family_replacement: 'Yandex Browser'
534
+ - regex: '(YaSearchBrowser)/(\d+)\.(\d+)\.(\d+)'
535
+ family_replacement: 'Yandex Browser'
483
536
 
484
537
  # Mail.ru Amigo/Internet Browser (Chromium-based)
485
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
538
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
486
539
  family_replacement: 'Mail.ru Chromium Browser'
487
540
 
488
541
  # AOL Browser (IE-based)
@@ -509,6 +562,13 @@ user_agent_parsers:
509
562
  # @ref: http://www.ghost.org
510
563
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
511
564
 
565
+ # Palo Alto GlobalProtect Linux
566
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
567
+
568
+ # Surveyon https://www.surveyon.com/
569
+ - regex: '^(surveyon)/(\d+)\.(\d+)\.(\d+)'
570
+ family_replacement: 'Surveyon'
571
+
512
572
  #### END SPECIAL CASES TOP ####
513
573
 
514
574
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -550,7 +610,7 @@ user_agent_parsers:
550
610
  - regex: 'Microsoft Office (Word) 2014'
551
611
 
552
612
  # Windows Live Mail
553
- - regex: 'Outlook-Express\/7\.0.*'
613
+ - regex: 'Outlook-Express\/7\.0'
554
614
  family_replacement: 'Windows Live Mail'
555
615
 
556
616
  # Apple Air Mail
@@ -577,20 +637,16 @@ user_agent_parsers:
577
637
  - regex: 'Superhuman'
578
638
  family_replacement: 'Superhuman'
579
639
 
580
- # Vivaldi uses "Vivaldi"
581
- - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
640
+ # Vivaldi
641
+ - regex: '(Vivaldi)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
582
642
 
583
643
  # Edge/major_version.minor_version
584
644
  # Edge with chromium Edg/major_version.minor_version.patch.minor_patch
585
645
  - regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
586
646
  family_replacement: 'Edge'
587
647
 
588
- # Brave Browser https://brave.com/
589
- - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
590
- family_replacement: 'Brave'
591
-
592
648
  # Iron Browser ~since version 50
593
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
649
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
594
650
  family_replacement: 'Iron'
595
651
 
596
652
  # Dolphin Browser
@@ -666,13 +722,13 @@ user_agent_parsers:
666
722
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
667
723
  - regex: '^(Stitcher)/iOS'
668
724
  - regex: '^(Stitcher)/Android'
669
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
725
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
670
726
  - regex: ' (VLC) for'
671
727
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
672
728
  family_replacement: 'VLC'
673
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
674
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
675
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
729
+ - regex: '^(foobar)\S{1,10}/(\d+)\.(\d+|)\.?([\da-z]+|)'
730
+ - regex: '^(Clementine)\S{1,10} (\d+)\.(\d+|)\.?(\d+|)'
731
+ - regex: '(amarok)/(\d+)\.(\d+|)\.?(\d+|)'
676
732
  family_replacement: 'Amarok'
677
733
  - regex: '(Custom)-Feed Reader'
678
734
 
@@ -706,7 +762,7 @@ user_agent_parsers:
706
762
 
707
763
  # desktop mode
708
764
  # http://www.anandtech.com/show/3982/windows-phone-7-review
709
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
765
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
710
766
  family_replacement: 'IE Large Screen'
711
767
 
712
768
  # Nextcloud desktop sync client
@@ -723,6 +779,17 @@ user_agent_parsers:
723
779
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
724
780
  family_replacement: 'Skype'
725
781
 
782
+ # OpenVAS Scanner
783
+ - regex: '(OpenVAS)(?:-VT)?(?:[ \/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
784
+ family_replacement: 'OpenVAS Scanner'
785
+
786
+ # AnyConnect
787
+ - regex: '(AnyConnect)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
788
+
789
+ # Monitis
790
+ - regex: 'compatible; monitis'
791
+ family_replacement: 'Monitis'
792
+
726
793
  #### END MAIN CASES ####
727
794
 
728
795
  #### SPECIAL CASES ####
@@ -759,15 +826,15 @@ user_agent_parsers:
759
826
  family_replacement: 'TopBuzz'
760
827
 
761
828
  # @note: iOS / OSX Applications
762
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
829
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
763
830
  family_replacement: 'Google'
764
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
831
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
765
832
  family_replacement: 'Mobile Safari'
766
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
833
+ - regex: '(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\d+)_(\d+)(?:_(\d+)|).{0,30} AppleNews\/\d+\.\d+(?:\.\d+|)'
767
834
  family_replacement: 'Mobile Safari UI/WKWebView'
768
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
835
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
769
836
  family_replacement: 'Mobile Safari UI/WKWebView'
770
- - regex: '(iPod|iPod touch|iPhone|iPad).* Safari'
837
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
771
838
  family_replacement: 'Mobile Safari'
772
839
  - regex: '(iPod|iPod touch|iPhone|iPad)'
773
840
  family_replacement: 'Mobile Safari UI/WKWebView'
@@ -818,9 +885,9 @@ user_agent_parsers:
818
885
  - regex: '(Nokia)[EN]?(\d+)'
819
886
 
820
887
  # BlackBerry devices
821
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
888
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
822
889
  family_replacement: 'BlackBerry WebKit'
823
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
890
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
824
891
  family_replacement: 'BlackBerry WebKit'
825
892
  - regex: '(Black[bB]erry)\s?(\d+)'
826
893
  family_replacement: 'BlackBerry'
@@ -840,18 +907,15 @@ user_agent_parsers:
840
907
 
841
908
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
842
909
 
843
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
844
- # family_replacement: 'iPad'
845
-
846
910
  # Phantomjs, should go before Safari
847
911
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
848
912
 
849
913
  # WebKit Nightly
850
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
914
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
851
915
  family_replacement: 'WebKit Nightly'
852
916
 
853
917
  # Safari
854
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
918
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
855
919
  family_replacement: 'Safari'
856
920
  # Safari didn't provide "Version/d.d.d" prior to 3.0
857
921
  - regex: '(Safari)/\d+'
@@ -897,9 +961,10 @@ user_agent_parsers:
897
961
  # AFTER THE EDGE CASES ABOVE!
898
962
  # AFTER IE11
899
963
  # BEFORE all other IE
900
- - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
964
+ - regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|$)'
901
965
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
902
966
 
967
+
903
968
  - regex: '([MS]?IE) (\d+)\.(\d+)'
904
969
  family_replacement: 'IE'
905
970
 
@@ -907,17 +972,58 @@ user_agent_parsers:
907
972
  family_replacement: 'Python Requests'
908
973
 
909
974
  # headless user-agents
910
- - regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
975
+ - regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC|HTTPie)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
976
+
977
+ # CloudFoundry
978
+ - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
979
+ family_replacement: 'CloudFoundry'
980
+
981
+ # SAP Leonardo
982
+ - regex: '^(sap-leonardo-iot-sdk-nodejs) \/ (\d+)\.(\d+)\.(\d+)'
983
+
984
+ # SAP Netweaver Application Server
985
+ - regex: '^(SAP NetWeaver Application Server) \(1.0;(\d{1})(\d{2})\)'
986
+
987
+ # HttpClient
988
+ - regex: '^(\w+-HTTPClient)\/(\d+)\.(\d+)-(\S+)'
989
+ family_replacement: 'HTTPClient'
990
+
991
+ # go-cli
992
+ - regex: '^(go-cli)\s(\d+)\.(\d+).(\S+)'
993
+
994
+ # Other Clients with the pattern <Name>/[v]<Major>.<Minor>[.<Patch>]
995
+ - regex: '^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\/v?(\d+)\.(\d+)\.?(\d*)'
996
+
997
+ ## Clints with the pattern <Name>
998
+ - regex: '^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)'
911
999
 
912
1000
  # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
913
1001
  - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
914
1002
  family_replacement: 'Python aiohttp'
915
1003
 
916
- - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
1004
+ - regex: '(Java)[/ ]?\d{1}\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
1005
+
1006
+ - regex: '(Java)[/ ]?(\d+)\.(\d+)\.(\d+)'
1007
+
1008
+ # minio-go (https://github.com/minio/minio-go)
1009
+ - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
1010
+
1011
+ # ureq - minimal request library in rust (https://github.com/algesten/ureq)
1012
+ - regex: '^(ureq)[/ ](\d+)\.(\d+).(\d+)'
1013
+
1014
+ # http.rb - HTTP (The Gem! a.k.a. http.rb) - a fast Ruby HTTP client
1015
+ # (https://github.com/httprb/http/blob/3aa7470288deb81f7d7b982c1e2381871049dcbb/lib/http/request.rb#L27)
1016
+ - regex: '^(http\.rb)/(\d+)\.(\d+).(\d+)'
1017
+
1018
+ # Guzzle, PHP HTTP client (https://docs.guzzlephp.org/)
1019
+ - regex: '^(GuzzleHttp)/(\d+)\.(\d+).(\d+)'
1020
+
1021
+ # lorien/grab - Web Scraping Framework (https://github.com/lorien/grab)
1022
+ - regex: '^(grab)\b'
917
1023
 
918
1024
  # Cloud Storage Clients
919
1025
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
920
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
1026
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
921
1027
  - regex: '(S3Gof3r)'
922
1028
  # IBM COS (Cloud Object Storage) API
923
1029
  - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
@@ -940,6 +1046,22 @@ user_agent_parsers:
940
1046
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
941
1047
  family_replacement: 'ViaFree'
942
1048
 
1049
+ # Transmit (https://library.panic.com/transmit/)
1050
+ - regex: '(Transmit)/(\d+)\.(\d+)\.(\d+)'
1051
+
1052
+ # Download Master (https://downloadmaster.ru/)
1053
+ - regex: '(Download Master)'
1054
+
1055
+ # HTTrack crawler
1056
+ - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1057
+
1058
+ # Ladybird Browser (https://ladybird.dev)
1059
+ # https://github.com/SerenityOS/serenity/blob/6a662e0d43810c1dbd56fbf0c123f258aa1d694e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L64
1060
+ - regex: '(Ladybird)\/(\d+)\.(\d+)'
1061
+
1062
+ # MullvadBrowser (https://mullvad.net/en/browser)
1063
+ - regex: '(MullvadBrowser)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1064
+
943
1065
  os_parsers:
944
1066
  ##########
945
1067
  # HbbTV vendors
@@ -955,7 +1077,7 @@ os_parsers:
955
1077
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
956
1078
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
957
1079
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
958
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1080
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
959
1081
 
960
1082
 
961
1083
  # LG is consistent too, but we need to add manually the year model
@@ -975,9 +1097,9 @@ os_parsers:
975
1097
  os_replacement: 'Samsung'
976
1098
  os_v1_replacement: '2011'
977
1099
  # manage the two models of 2013
978
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
1100
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC'
979
1101
  os_v2_replacement: 'UE40F7000'
980
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
1102
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC'
981
1103
  os_v2_replacement: 'UE32F4500'
982
1104
  # generic Samsung (works starting in 2012)
983
1105
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -985,26 +1107,26 @@ os_parsers:
985
1107
  # Philips : not found any other way than a manual mapping
986
1108
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
987
1109
  # Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
988
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1110
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
989
1111
  os_v1_replacement: '2013'
990
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1112
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
991
1113
  os_v1_replacement: '2012'
992
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1114
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
993
1115
  os_v1_replacement: '2011'
994
1116
 
995
1117
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
996
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
1118
+ - regex: 'HbbTV/\d+\.\d+\.\d+.{0,100}(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
997
1119
  os_replacement: 'FireHbbTV'
998
1120
 
999
1121
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
1000
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
1122
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
1001
1123
 
1002
- # aspiegel.com spider (owned by Huawei)
1003
- - regex: 'AspiegelBot'
1124
+ # aspiegel.com spider (owned by Huawei, later renamed PetalBot)
1125
+ - regex: 'AspiegelBot|PetalBot'
1004
1126
  os_replacement: 'Other'
1005
1127
 
1006
1128
  ##########
1007
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
1129
+ # @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
1008
1130
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
1009
1131
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
1010
1132
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
@@ -1013,16 +1135,39 @@ os_parsers:
1013
1135
 
1014
1136
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
1015
1137
 
1016
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
1017
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
1138
+ # Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
1139
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
1018
1140
  os_replacement: 'iOS'
1019
1141
 
1020
1142
  # Special case for old ArcGIS Mobile products
1021
- - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]+|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1143
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1022
1144
 
1023
1145
  # Special case for new ArcGIS Mobile products
1024
1146
  - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1025
1147
 
1148
+ ##########
1149
+ # Chromecast
1150
+ ##########
1151
+ # Ex: Mozilla/5.0 (Linux; Android 12.0; Build/STTL.240206.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.0 Safari/537.36 CrKey/1.56.500000 DeviceType/AndroidTV
1152
+ # These are the newer Android-based "Google TV" Chromecast devices.
1153
+ # Google stopped updating the Chromecast firmware version in these, so they always say CrKey/1.56.500000. Therefore we extract the more useful Android version instead.
1154
+ - regex: '(Android) (\d+)(?:\.(\d+)).*CrKey'
1155
+ os_replacement: 'Chromecast Android'
1156
+
1157
+ # Ex: Mozilla/5.0 (Fuchsia) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 CrKey/1.56.500000
1158
+ # These are some intermediate "Nest Hub" Chromecast devices running Fuchsia.
1159
+ - regex: 'Fuchsia.*(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
1160
+ os_replacement: 'Chromecast Fuchsia'
1161
+
1162
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/SmartSpeaker
1163
+ - regex: 'Linux.*(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|).*DeviceType/SmartSpeaker'
1164
+ os_replacement: 'Chromecast SmartSpeaker'
1165
+
1166
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/Chromecast
1167
+ # These are the oldest Chromecast devices that ran Linux.
1168
+ - regex: 'Linux.*(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
1169
+ os_replacement: 'Chromecast Linux'
1170
+
1026
1171
  ##########
1027
1172
  # Android
1028
1173
  # can actually detect rooted android os. do we care?
@@ -1050,22 +1195,29 @@ os_parsers:
1050
1195
 
1051
1196
  # Android 9; Android 10;
1052
1197
  - regex: '(Android) (\d+);'
1198
+ - regex: '(Android): (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1053
1199
 
1054
1200
  # UCWEB
1055
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1201
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
1056
1202
  os_replacement: 'Android'
1057
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1203
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1058
1204
  os_replacement: 'iOS'
1059
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1205
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1060
1206
  os_replacement: 'Windows Phone'
1061
1207
  # JUC
1062
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1208
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
1063
1209
  os_replacement: 'Android'
1064
1210
 
1065
1211
  # Salesforce
1066
1212
  - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1067
1213
  os_replacement: 'Android'
1068
1214
 
1215
+ ##########
1216
+ # Meta Quest
1217
+ ##########
1218
+ - regex: 'Quest'
1219
+ os_replacement: 'Android'
1220
+
1069
1221
  ##########
1070
1222
  # Kindle Android
1071
1223
  ##########
@@ -1077,7 +1229,7 @@ os_parsers:
1077
1229
  # properly identify as Chrome OS
1078
1230
  #
1079
1231
  # ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
1080
- - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
1232
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
1081
1233
  os_replacement: 'Chrome OS'
1082
1234
 
1083
1235
  ##########
@@ -1169,7 +1321,7 @@ os_parsers:
1169
1321
  os_v1_replacement: '95'
1170
1322
 
1171
1323
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1172
- - regex: '^Box.*Windows/([\d.]+);'
1324
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1173
1325
  os_replacement: 'Windows'
1174
1326
  os_v1_replacement: '$1'
1175
1327
 
@@ -1179,6 +1331,10 @@ os_parsers:
1179
1331
  ##########
1180
1332
  - regex: '(Tizen)[/ ](\d+)\.(\d+)'
1181
1333
 
1334
+ # Chrome and Edge on iOS with desktop mode contains Mac OS X, so it must be before any Mac OS check
1335
+ - regex: 'Intel Mac OS X.+(CriOS|EdgiOS)/\d+'
1336
+ os_replacement: 'iOS'
1337
+
1182
1338
  ##########
1183
1339
  # Mac OS
1184
1340
  # @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
@@ -1186,33 +1342,33 @@ os_parsers:
1186
1342
  ##########
1187
1343
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1188
1344
  os_replacement: 'Mac OS X'
1189
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1345
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1190
1346
  os_replacement: 'Mac OS X'
1191
1347
  os_v1_replacement: '$1'
1192
1348
  os_v2_replacement: '$2'
1193
1349
  os_v3_replacement: '$3'
1194
1350
  # Leopard
1195
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1351
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1196
1352
  os_replacement: 'Mac OS X'
1197
1353
  os_v1_replacement: '10'
1198
1354
  os_v2_replacement: '5'
1199
1355
  # Snow Leopard
1200
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1356
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1201
1357
  os_replacement: 'Mac OS X'
1202
1358
  os_v1_replacement: '10'
1203
1359
  os_v2_replacement: '6'
1204
1360
  # Lion
1205
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1361
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1206
1362
  os_replacement: 'Mac OS X'
1207
1363
  os_v1_replacement: '10'
1208
1364
  os_v2_replacement: '7'
1209
1365
  # Mountain Lion
1210
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1366
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1211
1367
  os_replacement: 'Mac OS X'
1212
1368
  os_v1_replacement: '10'
1213
1369
  os_v2_replacement: '8'
1214
1370
  # Mavericks
1215
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1371
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1216
1372
  os_replacement: 'Mac OS X'
1217
1373
  os_v1_replacement: '10'
1218
1374
  os_v2_replacement: '9'
@@ -1229,7 +1385,7 @@ os_parsers:
1229
1385
  - regex: '(?:PPC|Intel) (Mac OS X)'
1230
1386
 
1231
1387
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1232
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1388
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1233
1389
  os_replacement: 'Mac OS X'
1234
1390
 
1235
1391
  ##########
@@ -1240,7 +1396,7 @@ os_parsers:
1240
1396
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1241
1397
  os_replacement: 'ATV OS X'
1242
1398
 
1243
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1399
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1244
1400
  os_replacement: 'iOS'
1245
1401
 
1246
1402
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1248,15 +1404,15 @@ os_parsers:
1248
1404
  os_replacement: 'iOS'
1249
1405
 
1250
1406
  # few more stragglers
1251
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
1407
+ - regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
1252
1408
  os_replacement: 'iOS'
1253
1409
 
1254
1410
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1255
1411
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1256
1412
  # See: http://user-agents.me/cfnetwork-version-list
1257
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1413
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1258
1414
  os_replacement: 'iOS'
1259
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
1415
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
1260
1416
  os_replacement: 'iOS'
1261
1417
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1262
1418
  os_replacement: 'iOS'
@@ -1291,17 +1447,17 @@ os_parsers:
1291
1447
  os_replacement: 'Mac OS X'
1292
1448
  os_v1_replacement: '10'
1293
1449
  os_v2_replacement: '11'
1294
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1450
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1295
1451
  os_replacement: 'iOS'
1296
1452
  os_v1_replacement: '9'
1297
1453
  os_v2_replacement: '3'
1298
1454
  os_v3_replacement: '1'
1299
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1455
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1300
1456
  os_replacement: 'iOS'
1301
1457
  os_v1_replacement: '9'
1302
1458
  os_v2_replacement: '3'
1303
1459
  os_v3_replacement: '2'
1304
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1460
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1305
1461
  os_replacement: 'iOS'
1306
1462
  os_v1_replacement: '9'
1307
1463
  os_v2_replacement: '3'
@@ -1322,15 +1478,15 @@ os_parsers:
1322
1478
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1323
1479
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1324
1480
  ##########
1325
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1481
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1326
1482
  os_replacement: 'Mac OS X'
1327
1483
  os_v1_replacement: '10'
1328
1484
  os_v2_replacement: '13'
1329
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1485
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1330
1486
  os_replacement: 'Mac OS X'
1331
1487
  os_v1_replacement: '10'
1332
1488
  os_v2_replacement: '12'
1333
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1489
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1334
1490
  os_replacement: 'Mac OS X'
1335
1491
  os_v1_replacement: '10'
1336
1492
  os_v2_replacement: '11'
@@ -1338,87 +1494,208 @@ os_parsers:
1338
1494
  # CFNetwork iOS Apps
1339
1495
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1340
1496
  ##########
1341
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1497
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1342
1498
  os_replacement: 'iOS'
1343
1499
  os_v1_replacement: '1'
1344
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1500
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1345
1501
  os_replacement: 'iOS'
1346
1502
  os_v1_replacement: '4'
1347
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1503
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1348
1504
  os_replacement: 'iOS'
1349
1505
  os_v1_replacement: '5'
1350
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1506
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1351
1507
  os_replacement: 'iOS'
1352
1508
  os_v1_replacement: '6'
1353
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1509
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1354
1510
  os_replacement: 'iOS'
1355
1511
  os_v1_replacement: '7'
1356
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1512
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1357
1513
  os_replacement: 'iOS'
1358
1514
  os_v1_replacement: '8'
1359
1515
  os_v2_replacement: '0'
1360
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1516
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1361
1517
  os_replacement: 'iOS'
1362
1518
  os_v1_replacement: '9'
1363
1519
  os_v2_replacement: '0'
1364
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1520
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1365
1521
  os_replacement: 'iOS'
1366
1522
  os_v1_replacement: '10'
1367
1523
  os_v2_replacement: '3'
1368
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1524
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1369
1525
  os_replacement: 'iOS'
1370
1526
  os_v1_replacement: '10'
1371
1527
  os_v2_replacement: '3'
1372
1528
  os_v3_replacement: '2'
1373
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1529
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1374
1530
  os_replacement: 'iOS'
1375
1531
  os_v1_replacement: '10'
1376
1532
  os_v2_replacement: '3'
1377
1533
  os_v3_replacement: '3'
1378
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1534
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1379
1535
  os_replacement: 'iOS'
1380
1536
  os_v1_replacement: '10'
1381
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1537
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1382
1538
  os_replacement: 'iOS'
1383
1539
  os_v1_replacement: '11'
1384
1540
  os_v2_replacement: '0'
1385
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1541
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1386
1542
  os_replacement: 'iOS'
1387
1543
  os_v1_replacement: '11'
1388
1544
  os_v2_replacement: '1'
1389
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1545
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1390
1546
  os_replacement: 'iOS'
1391
1547
  os_v1_replacement: '11'
1392
1548
  os_v2_replacement: '2'
1393
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1549
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1394
1550
  os_replacement: 'iOS'
1395
1551
  os_v1_replacement: '11'
1396
1552
  os_v2_replacement: '2'
1397
1553
  os_v3_replacement: '6'
1398
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1554
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1399
1555
  os_replacement: 'iOS'
1400
1556
  os_v1_replacement: '11'
1401
1557
  os_v2_replacement: '3'
1402
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1558
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1403
1559
  os_replacement: 'iOS'
1404
1560
  os_v1_replacement: '11'
1405
1561
  os_v2_replacement: '4'
1406
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1562
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1407
1563
  os_replacement: 'iOS'
1408
1564
  os_v1_replacement: '11'
1409
1565
  os_v2_replacement: '4'
1410
1566
  os_v3_replacement: '1'
1411
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1567
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1412
1568
  os_replacement: 'iOS'
1413
1569
  os_v1_replacement: '11'
1414
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1570
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1415
1571
  os_replacement: 'iOS'
1416
1572
  os_v1_replacement: '12'
1417
1573
  os_v2_replacement: '0'
1418
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1574
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1419
1575
  os_replacement: 'iOS'
1420
1576
  os_v1_replacement: '12'
1421
- - regex: 'CFNetwork/.* Darwin/'
1577
+ os_v2_replacement: '1'
1578
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.5\.\d+'
1579
+ os_replacement: 'iOS'
1580
+ os_v1_replacement: '12'
1581
+ os_v2_replacement: '2'
1582
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.6\.\d+'
1583
+ os_replacement: 'iOS'
1584
+ os_v1_replacement: '12'
1585
+ os_v2_replacement: '3'
1586
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.7\.\d+'
1587
+ os_replacement: 'iOS'
1588
+ os_v1_replacement: '12'
1589
+ os_v2_replacement: '4'
1590
+ - regex: 'CFNetwork/9.{0,100} Darwin/(18)\.\d+'
1591
+ os_replacement: 'iOS'
1592
+ os_v1_replacement: '12'
1593
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.2\.\d+'
1594
+ os_replacement: 'iOS'
1595
+ os_v1_replacement: '13'
1596
+ os_v2_replacement: '3'
1597
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.3\.\d+'
1598
+ os_replacement: 'iOS'
1599
+ os_v1_replacement: '13'
1600
+ os_v2_replacement: '3'
1601
+ os_v3_replacement: '1'
1602
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.4\.\d+'
1603
+ os_replacement: 'iOS'
1604
+ os_v1_replacement: '13'
1605
+ os_v2_replacement: '4'
1606
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.5\.\d+'
1607
+ os_replacement: 'iOS'
1608
+ os_v1_replacement: '13'
1609
+ os_v2_replacement: '5'
1610
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.6\.\d+'
1611
+ os_replacement: 'iOS'
1612
+ os_v1_replacement: '13'
1613
+ os_v2_replacement: '6'
1614
+ - regex: 'CFNetwork/1[01].{0,100} Darwin/19\.\d+'
1615
+ os_replacement: 'iOS'
1616
+ os_v1_replacement: '13'
1617
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.1\.\d+'
1618
+ os_replacement: 'iOS'
1619
+ os_v1_replacement: '14'
1620
+ os_v2_replacement: '2'
1621
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.2\.\d+'
1622
+ os_replacement: 'iOS'
1623
+ os_v1_replacement: '14'
1624
+ os_v2_replacement: '3'
1625
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.3\.\d+'
1626
+ os_replacement: 'iOS'
1627
+ os_v1_replacement: '14'
1628
+ os_v2_replacement: '4'
1629
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.4\.\d+'
1630
+ os_replacement: 'iOS'
1631
+ os_v1_replacement: '14'
1632
+ os_v2_replacement: '5'
1633
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.5\.\d+'
1634
+ os_replacement: 'iOS'
1635
+ os_v1_replacement: '14'
1636
+ os_v2_replacement: '6'
1637
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.6\.\d+'
1638
+ os_replacement: 'iOS'
1639
+ os_v1_replacement: '14'
1640
+ os_v2_replacement: '8'
1641
+ - regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
1642
+ os_replacement: 'iOS'
1643
+ os_v1_replacement: '14'
1644
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.0\.\d+'
1645
+ os_replacement: 'iOS'
1646
+ os_v1_replacement: '15'
1647
+ os_v2_replacement: '0'
1648
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.1\.\d+'
1649
+ os_replacement: 'iOS'
1650
+ os_v1_replacement: '15'
1651
+ os_v2_replacement: '1'
1652
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.2\.\d+'
1653
+ os_replacement: 'iOS'
1654
+ os_v1_replacement: '15'
1655
+ os_v2_replacement: '2'
1656
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.3\.\d+'
1657
+ os_replacement: 'iOS'
1658
+ os_v1_replacement: '15'
1659
+ os_v2_replacement: '3'
1660
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.4\.\d+'
1661
+ os_replacement: 'iOS'
1662
+ os_v1_replacement: '15'
1663
+ os_v2_replacement: '4'
1664
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.5\.\d+'
1665
+ os_replacement: 'iOS'
1666
+ os_v1_replacement: '15'
1667
+ os_v2_replacement: '5'
1668
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.6\.\d+'
1669
+ os_replacement: 'iOS'
1670
+ os_v1_replacement: '15'
1671
+ os_v2_replacement: '6'
1672
+ - regex: 'CFNetwork/.{0,100} Darwin/(21)\.\d+'
1673
+ os_replacement: 'iOS'
1674
+ os_v1_replacement: '15'
1675
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.0\.\d+'
1676
+ os_replacement: 'iOS'
1677
+ os_v1_replacement: '16'
1678
+ os_v2_replacement: '0'
1679
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.1\.\d+'
1680
+ os_replacement: 'iOS'
1681
+ os_v1_replacement: '16'
1682
+ os_v2_replacement: '1'
1683
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.2\.\d+'
1684
+ os_replacement: 'iOS'
1685
+ os_v1_replacement: '16'
1686
+ os_v2_replacement: '2'
1687
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.3\.\d+'
1688
+ os_replacement: 'iOS'
1689
+ os_v1_replacement: '16'
1690
+ os_v2_replacement: '3'
1691
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.4\.\d+'
1692
+ os_replacement: 'iOS'
1693
+ os_v1_replacement: '16'
1694
+ os_v2_replacement: '4'
1695
+ - regex: 'CFNetwork/.{0,100} Darwin/(22)\.\d+'
1696
+ os_replacement: 'iOS'
1697
+ os_v1_replacement: '16'
1698
+ - regex: 'CFNetwork/.{0,100} Darwin/'
1422
1699
  os_replacement: 'iOS'
1423
1700
 
1424
1701
  # iOS Apps
@@ -1429,7 +1706,7 @@ os_parsers:
1429
1706
  ##########
1430
1707
  # Apple Watch
1431
1708
  ##########
1432
- - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
1709
+ - regex: '(watchOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
1433
1710
  os_replacement: 'WatchOS'
1434
1711
 
1435
1712
  ##########################
@@ -1472,9 +1749,9 @@ os_parsers:
1472
1749
  ##########
1473
1750
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1474
1751
  os_replacement: 'Symbian OS'
1475
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1752
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1476
1753
  os_replacement: 'Symbian^3 Anna'
1477
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1754
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1478
1755
  os_replacement: 'Symbian^3 Belle'
1479
1756
  - regex: '(Symbian/3)'
1480
1757
  os_replacement: 'Symbian^3'
@@ -1491,11 +1768,11 @@ os_parsers:
1491
1768
  ##########
1492
1769
  # BlackBerry devices
1493
1770
  ##########
1494
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1771
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1495
1772
  os_replacement: 'BlackBerry OS'
1496
1773
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1497
1774
  os_replacement: 'BlackBerry OS'
1498
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1775
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1499
1776
  os_replacement: 'BlackBerry OS'
1500
1777
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1501
1778
  os_replacement: 'BlackBerry Tablet OS'
@@ -1513,44 +1790,44 @@ os_parsers:
1513
1790
  ##########
1514
1791
  # Firefox OS
1515
1792
  ##########
1516
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1793
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1517
1794
  os_replacement: 'Firefox OS'
1518
1795
  os_v1_replacement: '1'
1519
1796
  os_v2_replacement: '0'
1520
1797
  os_v3_replacement: '1'
1521
1798
 
1522
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1799
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1523
1800
  os_replacement: 'Firefox OS'
1524
1801
  os_v1_replacement: '1'
1525
1802
  os_v2_replacement: '1'
1526
1803
 
1527
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1804
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1528
1805
  os_replacement: 'Firefox OS'
1529
1806
  os_v1_replacement: '1'
1530
1807
  os_v2_replacement: '2'
1531
1808
 
1532
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1809
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1533
1810
  os_replacement: 'Firefox OS'
1534
1811
  os_v1_replacement: '1'
1535
1812
  os_v2_replacement: '3'
1536
1813
 
1537
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1814
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1538
1815
  os_replacement: 'Firefox OS'
1539
1816
  os_v1_replacement: '1'
1540
1817
  os_v2_replacement: '4'
1541
1818
 
1542
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1819
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1543
1820
  os_replacement: 'Firefox OS'
1544
1821
  os_v1_replacement: '2'
1545
1822
  os_v2_replacement: '0'
1546
1823
 
1547
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1824
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1548
1825
  os_replacement: 'Firefox OS'
1549
1826
  os_v1_replacement: '2'
1550
1827
  os_v2_replacement: '1'
1551
1828
 
1552
1829
  # Firefox OS Generic
1553
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1830
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1554
1831
  os_replacement: 'Firefox OS'
1555
1832
 
1556
1833
 
@@ -1572,12 +1849,6 @@ os_parsers:
1572
1849
 
1573
1850
  - regex: '(WebTV)/(\d+).(\d+)'
1574
1851
 
1575
- ##########
1576
- # Chromecast
1577
- ##########
1578
- - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
1579
- os_replacement: 'Chromecast'
1580
-
1581
1852
  ##########
1582
1853
  # Misc mobile
1583
1854
  ##########
@@ -1592,7 +1863,7 @@ os_parsers:
1592
1863
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1593
1864
 
1594
1865
  # Gentoo Linux + Kernel Version
1595
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1866
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1596
1867
  os_replacement: 'Gentoo'
1597
1868
 
1598
1869
  # Opera Mini Bada
@@ -1600,7 +1871,7 @@ os_parsers:
1600
1871
 
1601
1872
  # just os
1602
1873
  - regex: '(Windows|Android|WeTab|Maemo|Web0S)'
1603
- - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
1874
+ - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|SerenityOS|(?:Free|Open|Net|\b)BSD)'
1604
1875
  # Linux + Kernel Version
1605
1876
  - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
1606
1877
  - regex: 'SunOS'
@@ -1624,19 +1895,19 @@ device_parsers:
1624
1895
  # Mobile Spiders
1625
1896
  # Catch the mobile crawler before checking for iPhones / Androids.
1626
1897
  #########
1627
- - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1898
+ - regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.{0,200}iPhone)'
1628
1899
  regex_flag: 'i'
1629
1900
  device_replacement: 'Spider'
1630
1901
  brand_replacement: 'Spider'
1631
1902
  model_replacement: 'Smartphone'
1632
- - regex: '(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1903
+ - regex: '^.{0,100}?(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).{0,200}(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1633
1904
  regex_flag: 'i'
1634
1905
  device_replacement: 'Spider'
1635
1906
  brand_replacement: 'Spider'
1636
1907
  model_replacement: 'Feature Phone'
1637
1908
 
1638
1909
  # PTST / WebPageTest.org crawlers
1639
- - regex: ' PTST/\d+(?:\.)?\d+$'
1910
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1640
1911
  device_replacement: 'Spider'
1641
1912
  brand_replacement: 'Spider'
1642
1913
 
@@ -1646,11 +1917,11 @@ device_parsers:
1646
1917
  brand_replacement: 'Spider'
1647
1918
 
1648
1919
  # aspiegel.com spider (owned by Huawei)
1649
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
1920
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)'
1650
1921
  device_replacement: 'Spider'
1651
1922
  brand_replacement: 'Spider'
1652
1923
  model_replacement: 'Smartphone'
1653
- - regex: 'Mozilla.*AspiegelBot'
1924
+ - regex: 'Mozilla.{0,200}(AspiegelBot|PetalBot)'
1654
1925
  device_replacement: 'Spider'
1655
1926
  brand_replacement: 'Spider'
1656
1927
  model_replacement: 'Desktop'
@@ -1659,7 +1930,7 @@ device_parsers:
1659
1930
  # WebBrowser for SmartWatch
1660
1931
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1661
1932
  #########
1662
- - regex: '\bSmartWatch {0,2}\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};'
1933
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1663
1934
  device_replacement: '$1 $2'
1664
1935
  brand_replacement: '$1'
1665
1936
  model_replacement: '$2'
@@ -1671,16 +1942,16 @@ device_parsers:
1671
1942
  ######################################################################
1672
1943
 
1673
1944
  # Android Application
1674
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1945
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1675
1946
  device_replacement: '$1 $2'
1676
1947
  brand_replacement: '$1$2'
1677
1948
  model_replacement: '$3'
1678
- - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
1949
+ - regex: 'Android Application[^\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.{1,200}) \w{1,20} - '
1679
1950
  regex_flag: 'i'
1680
1951
  device_replacement: '$1 $2'
1681
1952
  brand_replacement: '$1'
1682
1953
  model_replacement: '$2'
1683
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1954
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1684
1955
  device_replacement: '$1 $2'
1685
1956
  brand_replacement: '$1'
1686
1957
  model_replacement: '$2'
@@ -1689,11 +1960,11 @@ device_parsers:
1689
1960
  # 3Q
1690
1961
  # @ref: http://www.3q-int.com/
1691
1962
  #########
1692
- - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1963
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1693
1964
  device_replacement: '3Q $1'
1694
1965
  brand_replacement: '3Q'
1695
1966
  model_replacement: '$1'
1696
- - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1967
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1697
1968
  device_replacement: '3Q $1'
1698
1969
  brand_replacement: '3Q'
1699
1970
  model_replacement: '$1'
@@ -1702,19 +1973,19 @@ device_parsers:
1702
1973
  # Acer
1703
1974
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1704
1975
  #########
1705
- - 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)'
1976
+ - regex: 'Android [34].{0,200}; {0,2}(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[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1706
1977
  device_replacement: '$1'
1707
1978
  brand_replacement: 'Acer'
1708
1979
  model_replacement: '$1'
1709
- - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1980
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1710
1981
  device_replacement: '$1'
1711
1982
  brand_replacement: 'Acer'
1712
1983
  model_replacement: '$1'
1713
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1984
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1714
1985
  device_replacement: '$1'
1715
1986
  brand_replacement: 'Acer'
1716
1987
  model_replacement: '$1'
1717
- - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1988
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1718
1989
  device_replacement: '$1$2'
1719
1990
  brand_replacement: 'Acer'
1720
1991
  model_replacement: '$2'
@@ -1725,7 +1996,7 @@ device_parsers:
1725
1996
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1726
1997
  # custom ROM builds for Vega
1727
1998
  #########
1728
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1999
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1729
2000
  device_replacement: '$1$2'
1730
2001
  brand_replacement: 'Advent'
1731
2002
  model_replacement: '$2'
@@ -1734,7 +2005,7 @@ device_parsers:
1734
2005
  # Ainol
1735
2006
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1736
2007
  #########
1737
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
2008
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1738
2009
  device_replacement: '$1$2'
1739
2010
  brand_replacement: 'Ainol'
1740
2011
  model_replacement: '$2'
@@ -1743,12 +2014,12 @@ device_parsers:
1743
2014
  # Airis
1744
2015
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1745
2016
  #########
1746
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
2017
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1747
2018
  regex_flag: 'i'
1748
2019
  device_replacement: '$1'
1749
2020
  brand_replacement: 'Airis'
1750
2021
  model_replacement: '$1'
1751
- - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
2022
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1752
2023
  regex_flag: 'i'
1753
2024
  device_replacement: '$1'
1754
2025
  brand_replacement: 'Airis'
@@ -1758,7 +2029,7 @@ device_parsers:
1758
2029
  # Airpad
1759
2030
  # @ref: ??
1760
2031
  #########
1761
- - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
2032
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1762
2033
  device_replacement: 'Airpad $1'
1763
2034
  brand_replacement: 'Airpad'
1764
2035
  model_replacement: '$1'
@@ -1767,29 +2038,29 @@ device_parsers:
1767
2038
  # Alcatel - TCT
1768
2039
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1769
2040
  #########
1770
- - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
2041
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1771
2042
  device_replacement: 'Alcatel One Touch $2'
1772
2043
  brand_replacement: 'Alcatel'
1773
2044
  model_replacement: 'One Touch $2'
1774
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
2045
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1775
2046
  regex_flag: 'i'
1776
2047
  device_replacement: 'Alcatel One Touch $1'
1777
2048
  brand_replacement: 'Alcatel'
1778
2049
  model_replacement: 'One Touch $1'
1779
- - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2050
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1780
2051
  device_replacement: '$1 $2'
1781
2052
  brand_replacement: '$1'
1782
2053
  model_replacement: '$2'
1783
2054
  # operator specific models
1784
- - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
2055
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1785
2056
  device_replacement: 'Alcatel $1'
1786
2057
  brand_replacement: 'Alcatel'
1787
2058
  model_replacement: '$1'
1788
- - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
2059
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1789
2060
  device_replacement: 'Alcatel One Touch 998'
1790
2061
  brand_replacement: 'Alcatel'
1791
2062
  model_replacement: 'One Touch 998'
1792
- - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
2063
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1793
2064
  device_replacement: 'Alcatel One Touch 918D'
1794
2065
  brand_replacement: 'Alcatel'
1795
2066
  model_replacement: 'One Touch 918D'
@@ -1798,7 +2069,7 @@ device_parsers:
1798
2069
  # Allfine
1799
2070
  # @ref: http://www.myallfine.com/Products.asp
1800
2071
  #########
1801
- - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
2072
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1802
2073
  device_replacement: '$1'
1803
2074
  brand_replacement: 'Allfine'
1804
2075
  model_replacement: '$1'
@@ -1807,15 +2078,15 @@ device_parsers:
1807
2078
  # Allview
1808
2079
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1809
2080
  #########
1810
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
2081
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1811
2082
  device_replacement: '$1$2'
1812
2083
  brand_replacement: 'Allview'
1813
2084
  model_replacement: '$2'
1814
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
2085
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1815
2086
  device_replacement: '$1$2'
1816
2087
  brand_replacement: 'Allview'
1817
2088
  model_replacement: '$2'
1818
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
2089
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1819
2090
  device_replacement: '$1$2'
1820
2091
  brand_replacement: 'Allview'
1821
2092
  model_replacement: '$2'
@@ -1825,11 +2096,11 @@ device_parsers:
1825
2096
  # @ref: http://www.allwinner.com/
1826
2097
  # @models: A31 (13.3"),A20,A10,
1827
2098
  #########
1828
- - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
2099
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1829
2100
  device_replacement: '$1'
1830
2101
  brand_replacement: 'Allwinner'
1831
2102
  model_replacement: '$1'
1832
- - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
2103
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1833
2104
  device_replacement: '$1 $2'
1834
2105
  brand_replacement: 'Allwinner'
1835
2106
  model_replacement: '$1'
@@ -1838,7 +2109,7 @@ device_parsers:
1838
2109
  # Amaway
1839
2110
  # @ref: http://www.amaway.cn/
1840
2111
  #########
1841
- - 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)'
2112
+ - regex: '; {0,2}(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)'
1842
2113
  device_replacement: '$1'
1843
2114
  brand_replacement: 'Amaway'
1844
2115
  model_replacement: '$1'
@@ -1847,11 +2118,11 @@ device_parsers:
1847
2118
  # Amoi
1848
2119
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1849
2120
  #########
1850
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2121
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1851
2122
  device_replacement: 'Amoi $1'
1852
2123
  brand_replacement: 'Amoi'
1853
2124
  model_replacement: '$1'
1854
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
2125
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1855
2126
  device_replacement: 'Amoi $1'
1856
2127
  brand_replacement: 'Amoi'
1857
2128
  model_replacement: '$1'
@@ -1860,7 +2131,7 @@ device_parsers:
1860
2131
  # Aoc
1861
2132
  # @ref: http://latin.aoc.com/media_tablet
1862
2133
  #########
1863
- - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
2134
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1864
2135
  device_replacement: '$1'
1865
2136
  brand_replacement: 'Aoc'
1866
2137
  model_replacement: '$1'
@@ -1871,11 +2142,11 @@ device_parsers:
1871
2142
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1872
2143
  # @note: brand owned by luckystar
1873
2144
  #########
1874
- - 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)'
2145
+ - regex: '; {0,2}(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)'
1875
2146
  device_replacement: 'Aoson $1'
1876
2147
  brand_replacement: 'Aoson'
1877
2148
  model_replacement: '$1'
1878
- - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
2149
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1879
2150
  regex_flag: 'i'
1880
2151
  device_replacement: 'Aoson $1'
1881
2152
  brand_replacement: 'Aoson'
@@ -1885,7 +2156,7 @@ device_parsers:
1885
2156
  # Apanda
1886
2157
  # @ref: http://www.apanda.com.cn/
1887
2158
  #########
1888
- - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2159
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1889
2160
  device_replacement: 'Apanda $1'
1890
2161
  brand_replacement: 'Apanda'
1891
2162
  model_replacement: '$1'
@@ -1895,23 +2166,23 @@ device_parsers:
1895
2166
  # @ref: http://www.archos.com/de/products/tablets.html
1896
2167
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1897
2168
  #########
1898
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
2169
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1899
2170
  device_replacement: 'Archos $1'
1900
2171
  brand_replacement: 'Archos'
1901
2172
  model_replacement: '$1'
1902
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2173
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1903
2174
  device_replacement: 'Archos $1'
1904
2175
  brand_replacement: 'Archos'
1905
2176
  model_replacement: '$1'
1906
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2177
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1907
2178
  device_replacement: 'Archos $1'
1908
2179
  brand_replacement: 'Archos'
1909
2180
  model_replacement: '$1'
1910
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
2181
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1911
2182
  device_replacement: 'Archos $1'
1912
2183
  brand_replacement: 'Archos'
1913
2184
  model_replacement: '$1'
1914
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
2185
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1915
2186
  device_replacement: 'Archos $1'
1916
2187
  brand_replacement: 'Archos'
1917
2188
  model_replacement: '$1'
@@ -1920,11 +2191,11 @@ device_parsers:
1920
2191
  # A-rival
1921
2192
  # @ref: http://www.a-rival.de/de/
1922
2193
  #########
1923
- - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
2194
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1924
2195
  device_replacement: '$1'
1925
2196
  brand_replacement: 'Arival'
1926
2197
  model_replacement: '$1'
1927
- - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2198
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1928
2199
  device_replacement: '$1 $2'
1929
2200
  brand_replacement: 'Arival'
1930
2201
  model_replacement: '$1 $2'
@@ -1933,11 +2204,11 @@ device_parsers:
1933
2204
  # Arnova
1934
2205
  # @ref: http://arnovatech.com/
1935
2206
  #########
1936
- - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
2207
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1937
2208
  device_replacement: 'Arnova $1'
1938
2209
  brand_replacement: 'Arnova'
1939
2210
  model_replacement: '$1'
1940
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2211
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1941
2212
  device_replacement: 'Arnova $1'
1942
2213
  brand_replacement: 'Arnova'
1943
2214
  model_replacement: '$1'
@@ -1946,7 +2217,7 @@ device_parsers:
1946
2217
  # Assistant
1947
2218
  # @ref: http://www.assistant.ua
1948
2219
  #########
1949
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
2220
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1950
2221
  device_replacement: 'Assistant $1-$2'
1951
2222
  brand_replacement: 'Assistant'
1952
2223
  model_replacement: '$1-$2'
@@ -1955,11 +2226,11 @@ device_parsers:
1955
2226
  # Asus
1956
2227
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1957
2228
  #########
1958
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
2229
+ - regex: '; {0,2}(ME17\d[^;/]*|ME3\d{2}[^;/]{1,100}|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
1959
2230
  device_replacement: 'Asus $1'
1960
2231
  brand_replacement: 'Asus'
1961
2232
  model_replacement: '$1'
1962
- - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
2233
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1963
2234
  device_replacement: 'Asus $1'
1964
2235
  brand_replacement: 'Asus'
1965
2236
  model_replacement: '$1'
@@ -1967,11 +2238,11 @@ device_parsers:
1967
2238
  #########
1968
2239
  # Garmin-Asus
1969
2240
  #########
1970
- - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
2241
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1971
2242
  device_replacement: 'Garmin-Asus $1'
1972
2243
  brand_replacement: 'Garmin-Asus'
1973
2244
  model_replacement: '$1'
1974
- - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
2245
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1975
2246
  device_replacement: 'Garmin $1'
1976
2247
  brand_replacement: 'Garmin-Asus'
1977
2248
  model_replacement: '$1'
@@ -1980,7 +2251,7 @@ device_parsers:
1980
2251
  # Attab
1981
2252
  # @ref: http://www.theattab.com/
1982
2253
  #########
1983
- - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
2254
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1984
2255
  device_replacement: '$1'
1985
2256
  brand_replacement: 'Attab'
1986
2257
  model_replacement: '$1'
@@ -1990,7 +2261,7 @@ device_parsers:
1990
2261
  # @ref: ??
1991
2262
  # @note: Take care with Docomo T-01 Toshiba
1992
2263
  #########
1993
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
2264
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1994
2265
  device_replacement: '$1'
1995
2266
  brand_replacement: 'Audiosonic'
1996
2267
  model_replacement: '$1'
@@ -1999,7 +2270,7 @@ device_parsers:
1999
2270
  # Axioo
2000
2271
  # @ref: http://www.axiooworld.com/ww/index.php
2001
2272
  #########
2002
- - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
2273
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
2003
2274
  regex_flag: 'i'
2004
2275
  device_replacement: 'Axioo $1$2 $3'
2005
2276
  brand_replacement: 'Axioo'
@@ -2009,7 +2280,7 @@ device_parsers:
2009
2280
  # Azend
2010
2281
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
2011
2282
  #########
2012
- - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2283
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2013
2284
  device_replacement: '$1'
2014
2285
  brand_replacement: 'Azend'
2015
2286
  model_replacement: '$1'
@@ -2018,7 +2289,7 @@ device_parsers:
2018
2289
  # Bak
2019
2290
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
2020
2291
  #########
2021
- - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2292
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2022
2293
  regex_flag: 'i'
2023
2294
  device_replacement: '$1'
2024
2295
  brand_replacement: 'Bak'
@@ -2029,7 +2300,7 @@ device_parsers:
2029
2300
  # @ref: http://www.bedove.com/product.html
2030
2301
  # @models: HY6501|HY5001|X12|X21|I5
2031
2302
  #########
2032
- - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2303
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2033
2304
  device_replacement: 'Bedove $1'
2034
2305
  brand_replacement: 'Bedove'
2035
2306
  model_replacement: '$1'
@@ -2038,7 +2309,7 @@ device_parsers:
2038
2309
  # Benss
2039
2310
  # @ref: http://www.benss.net/
2040
2311
  #########
2041
- - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2312
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2042
2313
  device_replacement: 'Benss $1'
2043
2314
  brand_replacement: 'Benss'
2044
2315
  model_replacement: '$1'
@@ -2048,7 +2319,7 @@ device_parsers:
2048
2319
  # @ref: http://uk.blackberry.com/
2049
2320
  # @note: Android Apps seams to be used here
2050
2321
  #########
2051
- - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
2322
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2052
2323
  device_replacement: '$1 $2'
2053
2324
  brand_replacement: 'Blackberry'
2054
2325
  model_replacement: '$2'
@@ -2057,11 +2328,11 @@ device_parsers:
2057
2328
  # Blackbird
2058
2329
  # @ref: http://iblackbird.co.kr
2059
2330
  #########
2060
- - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
2331
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
2061
2332
  device_replacement: '$1 $2'
2062
2333
  brand_replacement: '$1'
2063
2334
  model_replacement: '$2'
2064
- - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
2335
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
2065
2336
  device_replacement: '$1 $2'
2066
2337
  brand_replacement: '$1'
2067
2338
  model_replacement: '$2'
@@ -2071,7 +2342,7 @@ device_parsers:
2071
2342
  # @ref: http://www.blaupunkt.com
2072
2343
  #########
2073
2344
  # Endeavour
2074
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
2345
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2075
2346
  device_replacement: 'Blaupunkt $1'
2076
2347
  brand_replacement: 'Blaupunkt'
2077
2348
  model_replacement: '$1'
@@ -2080,12 +2351,12 @@ device_parsers:
2080
2351
  # Blu
2081
2352
  # @ref: http://bluproducts.com
2082
2353
  #########
2083
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
2354
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2084
2355
  device_replacement: '$1$2'
2085
2356
  brand_replacement: 'Blu'
2086
2357
  model_replacement: '$2'
2087
2358
  # BMOBILE = operator branded device
2088
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2359
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2089
2360
  device_replacement: '$1'
2090
2361
  brand_replacement: 'Blu'
2091
2362
  model_replacement: '$1'
@@ -2095,7 +2366,7 @@ device_parsers:
2095
2366
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
2096
2367
  #########
2097
2368
  # tablet
2098
- - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
2369
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2099
2370
  device_replacement: '$1'
2100
2371
  brand_replacement: 'Blusens'
2101
2372
  model_replacement: '$1'
@@ -2106,7 +2377,7 @@ device_parsers:
2106
2377
  # @note: Might collide with Maxx as AX is used also there.
2107
2378
  #########
2108
2379
  # smartphone
2109
- - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
2380
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
2110
2381
  device_replacement: '$1'
2111
2382
  brand_replacement: 'Bmobile'
2112
2383
  model_replacement: '$1'
@@ -2115,11 +2386,11 @@ device_parsers:
2115
2386
  # bq
2116
2387
  # @ref: http://bqreaders.com
2117
2388
  #########
2118
- - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
2389
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
2119
2390
  device_replacement: '$1 $2'
2120
2391
  brand_replacement: 'bq'
2121
2392
  model_replacement: '$2'
2122
- - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
2393
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2123
2394
  device_replacement: '$1'
2124
2395
  brand_replacement: 'bq'
2125
2396
  model_replacement: '$1'
@@ -2128,7 +2399,7 @@ device_parsers:
2128
2399
  # Braun Phototechnik
2129
2400
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
2130
2401
  #########
2131
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
2402
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2132
2403
  device_replacement: '$1'
2133
2404
  brand_replacement: 'Braun'
2134
2405
  model_replacement: '$1'
@@ -2137,7 +2408,7 @@ device_parsers:
2137
2408
  # Broncho
2138
2409
  # @ref: http://www.broncho.cn/
2139
2410
  #########
2140
- - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2411
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2141
2412
  device_replacement: '$1 $2'
2142
2413
  brand_replacement: '$1'
2143
2414
  model_replacement: '$2'
@@ -2146,7 +2417,7 @@ device_parsers:
2146
2417
  # Captiva
2147
2418
  # @ref: http://www.captiva-power.de
2148
2419
  #########
2149
- - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2420
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2150
2421
  device_replacement: 'Captiva $1'
2151
2422
  brand_replacement: 'Captiva'
2152
2423
  model_replacement: '$1'
@@ -2155,7 +2426,7 @@ device_parsers:
2155
2426
  # Casio
2156
2427
  # @ref: http://www.casiogzone.com/
2157
2428
  #########
2158
- - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2429
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2159
2430
  device_replacement: '$1'
2160
2431
  brand_replacement: 'Casio'
2161
2432
  model_replacement: '$1'
@@ -2164,15 +2435,15 @@ device_parsers:
2164
2435
  # Cat
2165
2436
  # @ref: http://www.cat-sound.com
2166
2437
  #########
2167
- - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2438
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2168
2439
  device_replacement: 'Cat $1'
2169
2440
  brand_replacement: 'Cat'
2170
2441
  model_replacement: '$1'
2171
- - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2442
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2172
2443
  device_replacement: 'Cat $1'
2173
2444
  brand_replacement: 'Cat'
2174
2445
  model_replacement: '$1'
2175
- - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2446
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2176
2447
  device_replacement: '$1'
2177
2448
  brand_replacement: 'Cat'
2178
2449
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2182,7 +2453,7 @@ device_parsers:
2182
2453
  # @ref: http://www.celkonmobiles.com/?_a=products
2183
2454
  # @models: A10, A19Q, A101, A105, A107, A107\+, A112, A118, A119, A119Q, A15, A19, A20, A200, A220, A225, A22 Race, A27, A58, A59, A60, A62, A63, A64, A66, A67, A69, A75, A77, A79, A8\+, A83, A85, A86, A87, A89 Ultima, A9\+, A90, A900, A95, A97i, A98, AR 40, AR 45, AR 50, ML5
2184
2455
  #########
2185
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2456
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2186
2457
  device_replacement: '$1'
2187
2458
  brand_replacement: 'Celkon'
2188
2459
  model_replacement: '$1'
@@ -2190,12 +2461,12 @@ device_parsers:
2190
2461
  device_replacement: '$1'
2191
2462
  brand_replacement: 'Celkon'
2192
2463
  model_replacement: '$1'
2193
- - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2464
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2194
2465
  device_replacement: '$1$2'
2195
2466
  brand_replacement: 'Celkon'
2196
2467
  model_replacement: '$1$2'
2197
2468
  # smartphones
2198
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2469
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2199
2470
  device_replacement: '$1'
2200
2471
  brand_replacement: 'Celkon'
2201
2472
  model_replacement: '$1'
@@ -2206,24 +2477,57 @@ device_parsers:
2206
2477
  # @brief: China manufacturer makes tablets for different small brands
2207
2478
  # (eg. http://www.zeepad.net/index.html)
2208
2479
  #########
2209
- - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2480
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2210
2481
  device_replacement: '$1'
2211
2482
  brand_replacement: 'ChangJia'
2212
2483
  model_replacement: '$1'
2213
2484
 
2485
+ ##########
2486
+ # Chromecast
2487
+ # @ref: https://en.wikipedia.org/wiki/Chromecast#Hardware_and_design
2488
+ ##########
2489
+ # Ex: Mozilla/5.0 (Linux; Android 12.0; Build/STTL.240206.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.0 Safari/537.36 CrKey/1.56.500000 DeviceType/AndroidTV
2490
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/SmartSpeaker
2491
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/Chromecast
2492
+ # These are the newer Chromecast devices, such as smart speakers, Google TVs, etc. that have an explicit device type.
2493
+ - regex: 'CrKey.*DeviceType/([^/]*)'
2494
+ brand_replacement: 'Google'
2495
+ device_replacement: 'Chromecast'
2496
+ model_replacement: '$1'
2497
+
2498
+ # Ex: Mozilla/5.0 (Fuchsia) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 CrKey/1.56.500000
2499
+ # These are some intermediate "Nest Hub" Chromecast devices running Fuchsia.
2500
+ - regex: 'Fuchsia.*CrKey'
2501
+ brand_replacement: 'Google'
2502
+ device_replacement: 'Chromecast'
2503
+ model_replacement: 'Nest Hub'
2504
+
2505
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.47 Safari/537.36 CrKey/1.36.159268
2506
+ # These are the first generation of Chromecast devices that ran Linux. They don't specify a device type.
2507
+ - regex: 'Linux.*CrKey/1.36'
2508
+ brand_replacement: 'Google'
2509
+ device_replacement: 'Chromecast'
2510
+ model_replacement: 'First Generation'
2511
+
2512
+ # We have no data on the user agent strings of other models, except that they all report CrKey/
2513
+ - regex: 'CrKey/'
2514
+ brand_replacement: 'Google'
2515
+ device_replacement: 'Chromecast'
2516
+ model_replacement: 'Chromecast'
2517
+
2214
2518
  #########
2215
2519
  # Cloudfone
2216
2520
  # @ref: http://www.cloudfonemobile.com/
2217
2521
  #########
2218
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2522
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2219
2523
  device_replacement: '$1 $2 $3'
2220
2524
  brand_replacement: 'Cloudfone'
2221
2525
  model_replacement: '$1 $2 $3'
2222
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2526
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2223
2527
  device_replacement: 'Cloudfone $1 $2'
2224
2528
  brand_replacement: 'Cloudfone'
2225
2529
  model_replacement: 'Cloudfone $1 $2'
2226
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2530
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2227
2531
  device_replacement: '$1 $2'
2228
2532
  brand_replacement: 'Cloudfone'
2229
2533
  model_replacement: '$1 $2'
@@ -2232,7 +2536,7 @@ device_parsers:
2232
2536
  # Cmx
2233
2537
  # @ref: http://cmx.at/de/
2234
2538
  #########
2235
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2539
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2236
2540
  regex_flag: 'i'
2237
2541
  device_replacement: '$1'
2238
2542
  brand_replacement: 'Cmx'
@@ -2243,7 +2547,7 @@ device_parsers:
2243
2547
  # @ref: http://cobykyros.com
2244
2548
  # @note: Be careful with MID\d{3} from MpMan or Manta
2245
2549
  #########
2246
- - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
2550
+ - regex: '; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\)])'
2247
2551
  device_replacement: 'CobyKyros $1$2'
2248
2552
  brand_replacement: 'CobyKyros'
2249
2553
  model_replacement: '$1$2'
@@ -2252,7 +2556,7 @@ device_parsers:
2252
2556
  # Coolpad
2253
2557
  # @ref: ??
2254
2558
  #########
2255
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2559
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2256
2560
  device_replacement: '$1$2'
2257
2561
  brand_replacement: 'Coolpad'
2258
2562
  model_replacement: '$1$2'
@@ -2261,7 +2565,7 @@ device_parsers:
2261
2565
  # Cube
2262
2566
  # @ref: http://www.cube-tablet.com/buy-products.html
2263
2567
  #########
2264
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2568
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2265
2569
  regex_flag: 'i'
2266
2570
  device_replacement: '$1$2'
2267
2571
  brand_replacement: 'Cube'
@@ -2271,12 +2575,12 @@ device_parsers:
2271
2575
  # Cubot
2272
2576
  # @ref: http://www.cubotmall.com/
2273
2577
  #########
2274
- - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2578
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2275
2579
  regex_flag: 'i'
2276
2580
  device_replacement: '$1'
2277
2581
  brand_replacement: 'Cubot'
2278
2582
  model_replacement: '$1'
2279
- - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2583
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2280
2584
  regex_flag: 'i'
2281
2585
  device_replacement: '$1'
2282
2586
  brand_replacement: 'Cubot'
@@ -2286,7 +2590,7 @@ device_parsers:
2286
2590
  # Danew
2287
2591
  # @ref: http://www.danew.com/produits-tablette.php
2288
2592
  #########
2289
- - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2593
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2290
2594
  device_replacement: '$1'
2291
2595
  brand_replacement: 'Danew'
2292
2596
  model_replacement: '$1'
@@ -2300,39 +2604,35 @@ device_parsers:
2300
2604
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2301
2605
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2302
2606
  #########
2303
- - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2607
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2304
2608
  device_replacement: 'Dell $1$2'
2305
2609
  brand_replacement: 'Dell'
2306
2610
  model_replacement: '$1$2'
2307
- - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2611
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2308
2612
  device_replacement: 'Dell $1'
2309
2613
  brand_replacement: 'Dell'
2310
2614
  model_replacement: 'Streak'
2311
- - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2615
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2312
2616
  device_replacement: 'Dell $1'
2313
2617
  brand_replacement: 'Dell'
2314
2618
  model_replacement: 'Streak'
2315
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2619
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2316
2620
  device_replacement: 'Dell $1'
2317
2621
  brand_replacement: 'Dell'
2318
2622
  model_replacement: 'Streak Pro'
2319
- - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2623
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2320
2624
  device_replacement: 'Dell $1'
2321
2625
  brand_replacement: 'Dell'
2322
2626
  model_replacement: 'Streak 7'
2323
- - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2627
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2324
2628
  device_replacement: 'Dell $1'
2325
2629
  brand_replacement: 'Dell'
2326
2630
  model_replacement: '$1'
2327
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2631
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2328
2632
  device_replacement: 'Dell $1'
2329
2633
  brand_replacement: 'Dell'
2330
2634
  model_replacement: '$1'
2331
- - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2332
- device_replacement: 'Dell $1'
2333
- brand_replacement: 'Dell'
2334
- model_replacement: '$1'
2335
- - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2635
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2336
2636
  device_replacement: 'Dell $1'
2337
2637
  brand_replacement: 'Dell'
2338
2638
  model_replacement: '$1'
@@ -2341,7 +2641,7 @@ device_parsers:
2341
2641
  # Denver
2342
2642
  # @ref: http://www.denver-electronics.com/tablets1/
2343
2643
  #########
2344
- - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2644
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2345
2645
  device_replacement: '$1'
2346
2646
  brand_replacement: 'Denver'
2347
2647
  model_replacement: '$1'
@@ -2350,7 +2650,7 @@ device_parsers:
2350
2650
  # Dex
2351
2651
  # @ref: http://dex.ua/
2352
2652
  #########
2353
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2653
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2354
2654
  device_replacement: '$1'
2355
2655
  brand_replacement: 'Dex'
2356
2656
  model_replacement: '$1'
@@ -2359,7 +2659,7 @@ device_parsers:
2359
2659
  # DNS AirTab
2360
2660
  # @ref: http://www.dns-shop.ru/
2361
2661
  #########
2362
- - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2662
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2363
2663
  device_replacement: '$1 $2'
2364
2664
  brand_replacement: 'DNS'
2365
2665
  model_replacement: '$1 $2'
@@ -2368,43 +2668,43 @@ device_parsers:
2368
2668
  # Docomo (Operator Branded Device)
2369
2669
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2370
2670
  #########
2371
- - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2671
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2372
2672
  device_replacement: '$1'
2373
2673
  brand_replacement: 'Fujitsu'
2374
2674
  model_replacement: '$1'
2375
- - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2675
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2376
2676
  device_replacement: '$1'
2377
2677
  brand_replacement: 'HTC'
2378
2678
  model_replacement: 'Magic'
2379
- - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2679
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2380
2680
  device_replacement: '$1'
2381
2681
  brand_replacement: 'HTC'
2382
2682
  model_replacement: '$1'
2383
- - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2683
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2384
2684
  device_replacement: '$1'
2385
2685
  brand_replacement: 'LG'
2386
2686
  model_replacement: '$1'
2387
- - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2687
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2388
2688
  device_replacement: '$1'
2389
2689
  brand_replacement: 'Nec'
2390
2690
  model_replacement: '$1'
2391
- - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2691
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2392
2692
  device_replacement: '$1'
2393
2693
  brand_replacement: 'Panasonic'
2394
2694
  model_replacement: '$1'
2395
- - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2695
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2396
2696
  device_replacement: '$1'
2397
2697
  brand_replacement: 'Samsung'
2398
2698
  model_replacement: '$1'
2399
- - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2699
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2400
2700
  device_replacement: '$1'
2401
2701
  brand_replacement: 'Sharp'
2402
2702
  model_replacement: '$1'
2403
- - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2703
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2404
2704
  device_replacement: '$1'
2405
2705
  brand_replacement: 'SonyEricsson'
2406
2706
  model_replacement: '$1'
2407
- - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2707
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2408
2708
  device_replacement: '$1'
2409
2709
  brand_replacement: 'Toshiba'
2410
2710
  model_replacement: '$1'
@@ -2413,7 +2713,7 @@ device_parsers:
2413
2713
  # DOOV
2414
2714
  # @ref: http://www.doov.com.cn/
2415
2715
  #########
2416
- - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2716
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2417
2717
  device_replacement: '$1 $2'
2418
2718
  brand_replacement: 'DOOV'
2419
2719
  model_replacement: '$2'
@@ -2422,7 +2722,7 @@ device_parsers:
2422
2722
  # Enot
2423
2723
  # @ref: http://www.enot.ua/
2424
2724
  #########
2425
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2725
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2426
2726
  device_replacement: '$1 $2'
2427
2727
  brand_replacement: 'Enot'
2428
2728
  model_replacement: '$2'
@@ -2431,11 +2731,11 @@ device_parsers:
2431
2731
  # Evercoss
2432
2732
  # @ref: http://evercoss.com/android/
2433
2733
  #########
2434
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2734
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2435
2735
  device_replacement: 'CROSS $1'
2436
2736
  brand_replacement: 'Evercoss'
2437
2737
  model_replacement: 'Cross $1'
2438
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2738
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2439
2739
  device_replacement: '$1 $2'
2440
2740
  brand_replacement: 'Evercoss'
2441
2741
  model_replacement: 'Cross $2'
@@ -2444,7 +2744,7 @@ device_parsers:
2444
2744
  # Explay
2445
2745
  # @ref: http://explay.ru/
2446
2746
  #########
2447
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2747
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2448
2748
  device_replacement: '$1'
2449
2749
  brand_replacement: 'Explay'
2450
2750
  model_replacement: '$1'
@@ -2453,11 +2753,11 @@ device_parsers:
2453
2753
  # Fly
2454
2754
  # @ref: http://www.fly-phone.com/
2455
2755
  #########
2456
- - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2756
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2457
2757
  device_replacement: '$1'
2458
2758
  brand_replacement: 'Fly'
2459
2759
  model_replacement: '$1'
2460
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2760
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2461
2761
  device_replacement: '$1 $2'
2462
2762
  brand_replacement: 'Fly'
2463
2763
  model_replacement: '$2'
@@ -2466,7 +2766,7 @@ device_parsers:
2466
2766
  # Fujitsu
2467
2767
  # @ref: http://www.fujitsu.com/global/
2468
2768
  #########
2469
- - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2769
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2470
2770
  device_replacement: '$1'
2471
2771
  brand_replacement: 'Fujitsu'
2472
2772
  model_replacement: '$1'
@@ -2475,7 +2775,7 @@ device_parsers:
2475
2775
  # Galapad
2476
2776
  # @ref: http://www.galapad.net/product.html
2477
2777
  #########
2478
- - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2778
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2479
2779
  device_replacement: '$1'
2480
2780
  brand_replacement: 'Galapad'
2481
2781
  model_replacement: '$1'
@@ -2484,7 +2784,7 @@ device_parsers:
2484
2784
  # Geeksphone
2485
2785
  # @ref: http://www.geeksphone.com/
2486
2786
  #########
2487
- - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2787
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2488
2788
  device_replacement: '$1 $2'
2489
2789
  brand_replacement: '$1'
2490
2790
  model_replacement: '$2'
@@ -2493,8 +2793,7 @@ device_parsers:
2493
2793
  # Gfive
2494
2794
  # @ref: http://www.gfivemobile.com/en
2495
2795
  #########
2496
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2497
- - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2796
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2498
2797
  device_replacement: '$1 $2'
2499
2798
  brand_replacement: 'Gfive'
2500
2799
  model_replacement: '$2'
@@ -2503,16 +2802,16 @@ device_parsers:
2503
2802
  # Gionee
2504
2803
  # @ref: http://www.gionee.com/
2505
2804
  #########
2506
- - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2805
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2507
2806
  regex_flag: 'i'
2508
2807
  device_replacement: '$1 $2'
2509
2808
  brand_replacement: 'Gionee'
2510
2809
  model_replacement: '$2'
2511
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2810
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2512
2811
  device_replacement: 'Gionee $1'
2513
2812
  brand_replacement: 'Gionee'
2514
2813
  model_replacement: '$1'
2515
- - regex: '; *(E3) Build/JOP40D'
2814
+ - regex: '; {0,2}(E3) Build/JOP40D'
2516
2815
  device_replacement: 'Gionee $1'
2517
2816
  brand_replacement: 'Gionee'
2518
2817
  model_replacement: '$1'
@@ -2526,11 +2825,11 @@ device_parsers:
2526
2825
  # GoClever
2527
2826
  # @ref: http://www.goclever.com
2528
2827
  #########
2529
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2828
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2530
2829
  device_replacement: 'GoClever $1'
2531
2830
  brand_replacement: 'GoClever'
2532
2831
  model_replacement: '$1'
2533
- - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2832
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2534
2833
  device_replacement: 'GoClever $1'
2535
2834
  brand_replacement: 'GoClever'
2536
2835
  model_replacement: '$1'
@@ -2539,20 +2838,24 @@ device_parsers:
2539
2838
  # Google
2540
2839
  # @ref: http://www.google.de/glass/start/
2541
2840
  #########
2542
- - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2841
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2543
2842
  device_replacement: '$1'
2544
2843
  brand_replacement: 'Google'
2545
2844
  model_replacement: '$1'
2546
- - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2547
- device_replacement: '$1'
2845
+ - regex: '; {0,2}([g|G]oogle)? (Pixel[ a-zA-z0-9]{1,100});(?: Build|.{0,50}\) AppleWebKit)'
2846
+ device_replacement: '$2'
2548
2847
  brand_replacement: 'Google'
2549
- model_replacement: '$1'
2848
+ model_replacement: '$2'
2849
+ - regex: '; {0,2}([g|G]oogle)? (Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2850
+ device_replacement: '$2'
2851
+ brand_replacement: 'Google'
2852
+ model_replacement: '$2'
2550
2853
 
2551
2854
  #########
2552
2855
  # Gigabyte
2553
2856
  # @ref: http://gsmart.gigabytecm.com/en/
2554
2857
  #########
2555
- - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2858
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2556
2859
  device_replacement: '$1 $2'
2557
2860
  brand_replacement: 'Gigabyte'
2558
2861
  model_replacement: '$1 $2'
@@ -2561,7 +2864,7 @@ device_parsers:
2561
2864
  # Freescale development boards
2562
2865
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2563
2866
  #########
2564
- - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2867
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2565
2868
  device_replacement: 'Freescale $1'
2566
2869
  brand_replacement: 'Freescale'
2567
2870
  model_replacement: '$1'
@@ -2571,11 +2874,11 @@ device_parsers:
2571
2874
  # @ref: http://www.haier.com/
2572
2875
  # @ref: http://www.haier.com/de/produkte/tablet/
2573
2876
  #########
2574
- - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2877
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2575
2878
  device_replacement: 'Haier $1'
2576
2879
  brand_replacement: 'Haier'
2577
2880
  model_replacement: '$1'
2578
- - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2881
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2579
2882
  device_replacement: 'Haipad $1'
2580
2883
  brand_replacement: 'Haipad'
2581
2884
  model_replacement: '$1'
@@ -2585,7 +2888,7 @@ device_parsers:
2585
2888
  # @ref: http://www.haipad.net/
2586
2889
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2587
2890
  #########
2588
- - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2891
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2589
2892
  device_replacement: 'Haipad $1'
2590
2893
  brand_replacement: 'Haipad'
2591
2894
  model_replacement: '$1'
@@ -2595,7 +2898,7 @@ device_parsers:
2595
2898
  # @ref: http://www.hannspree.eu/
2596
2899
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2597
2900
  #########
2598
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2901
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2599
2902
  device_replacement: 'Hannspree $1'
2600
2903
  brand_replacement: 'Hannspree'
2601
2904
  model_replacement: '$1'
@@ -2604,11 +2907,11 @@ device_parsers:
2604
2907
  # HCLme
2605
2908
  # @ref: http://www.hclmetablet.com/india/
2606
2909
  #########
2607
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2910
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2608
2911
  device_replacement: 'HCLme $1'
2609
2912
  brand_replacement: 'HCLme'
2610
2913
  model_replacement: '$1'
2611
- - regex: '; *([^;\/]+) Build/HCL'
2914
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2612
2915
  device_replacement: 'HCLme $1'
2613
2916
  brand_replacement: 'HCLme'
2614
2917
  model_replacement: '$1'
@@ -2617,7 +2920,7 @@ device_parsers:
2617
2920
  # Hena
2618
2921
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2619
2922
  #########
2620
- - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2923
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2621
2924
  device_replacement: 'Hena $1'
2622
2925
  brand_replacement: 'Hena'
2623
2926
  model_replacement: '$1'
@@ -2626,11 +2929,11 @@ device_parsers:
2626
2929
  # Hisense
2627
2930
  # @ref: http://www.hisense.com/
2628
2931
  #########
2629
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2932
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2630
2933
  device_replacement: 'Hisense $1'
2631
2934
  brand_replacement: 'Hisense'
2632
2935
  model_replacement: '$1'
2633
- - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2936
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2634
2937
  regex_flag: 'i'
2635
2938
  device_replacement: 'Hisense $1'
2636
2939
  brand_replacement: 'Hisense'
@@ -2640,7 +2943,7 @@ device_parsers:
2640
2943
  # hitech
2641
2944
  # @ref: http://www.hitech-mobiles.com/
2642
2945
  #########
2643
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2946
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2644
2947
  device_replacement: 'AMAZE $1$2'
2645
2948
  brand_replacement: 'hitech'
2646
2949
  model_replacement: 'AMAZE $1$2'
@@ -2649,15 +2952,15 @@ device_parsers:
2649
2952
  # HP
2650
2953
  # @ref: http://www.hp.com/
2651
2954
  #########
2652
- - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2955
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2653
2956
  device_replacement: 'HP $1'
2654
2957
  brand_replacement: 'HP'
2655
2958
  model_replacement: '$1'
2656
- - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2959
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2657
2960
  device_replacement: 'HP $1'
2658
2961
  brand_replacement: 'HP'
2659
2962
  model_replacement: '$1'
2660
- - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2963
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2661
2964
  device_replacement: 'HP TouchPad'
2662
2965
  brand_replacement: 'HP'
2663
2966
  model_replacement: 'TouchPad'
@@ -2667,62 +2970,66 @@ device_parsers:
2667
2970
  # @ref: http://www.huaweidevice.com
2668
2971
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2669
2972
  #########
2670
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2973
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2671
2974
  device_replacement: '$1$2'
2672
2975
  brand_replacement: 'Huawei'
2673
2976
  model_replacement: '$2'
2674
- - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)\)'
2977
+ - regex: '; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\d+[^\);]{1,50})\)'
2675
2978
  device_replacement: '$1'
2676
2979
  brand_replacement: 'Huawei'
2677
2980
  model_replacement: '$2'
2678
- - regex: '; *(S7|M860) Build'
2981
+ - regex: '; {0,2}(S7|M860) Build'
2679
2982
  device_replacement: '$1'
2680
2983
  brand_replacement: 'Huawei'
2681
2984
  model_replacement: '$1'
2682
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2985
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2683
2986
  device_replacement: '$1$2'
2684
2987
  brand_replacement: 'Huawei'
2685
2988
  model_replacement: '$2'
2686
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2989
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2687
2990
  device_replacement: '$1$2'
2688
2991
  brand_replacement: 'Huawei'
2689
2992
  model_replacement: '$2'
2690
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2993
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2691
2994
  device_replacement: '$1$2'
2692
2995
  brand_replacement: 'Huawei'
2693
2996
  model_replacement: '$2'
2694
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2997
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2695
2998
  device_replacement: '$1$2'
2696
2999
  brand_replacement: 'Huawei'
2697
3000
  model_replacement: '$2'
2698
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
3001
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2699
3002
  device_replacement: '$1'
2700
3003
  brand_replacement: 'Huawei'
2701
3004
  model_replacement: '$1'
2702
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
3005
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2703
3006
  device_replacement: '$1'
2704
3007
  brand_replacement: 'Huawei'
2705
3008
  model_replacement: '$1'
2706
- - regex: '; *([Uu])([89]\d{3}) Build'
3009
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2707
3010
  device_replacement: '$1$2'
2708
3011
  brand_replacement: 'Huawei'
2709
3012
  model_replacement: 'U$2'
2710
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
3013
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2711
3014
  device_replacement: 'Huawei Ideos$1'
2712
3015
  brand_replacement: 'Huawei'
2713
3016
  model_replacement: 'Ideos$1'
2714
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
3017
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2715
3018
  device_replacement: 'Huawei Ideos$1'
2716
3019
  brand_replacement: 'Huawei'
2717
3020
  model_replacement: 'Ideos$1'
2718
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
3021
+ - regex: '; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]'
2719
3022
  device_replacement: 'Huawei $1'
2720
3023
  brand_replacement: 'Huawei'
2721
3024
  model_replacement: '$1'
2722
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
3025
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2723
3026
  device_replacement: 'Huawei $1'
2724
3027
  brand_replacement: 'Huawei'
2725
3028
  model_replacement: '$1'
3029
+ - regex: '; {0,2}([^;]{1,200}) Build/(HONOR|Honor)'
3030
+ device_replacement: 'Huawei Honor $1'
3031
+ brand_replacement: 'Huawei'
3032
+ model_replacement: 'Honor $1'
2726
3033
 
2727
3034
  #########
2728
3035
  # HTC
@@ -2730,7 +3037,7 @@ device_parsers:
2730
3037
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2731
3038
  #########
2732
3039
 
2733
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
3040
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2734
3041
  device_replacement: 'HTC $1'
2735
3042
  brand_replacement: 'HTC'
2736
3043
  model_replacement: '$1'
@@ -2738,59 +3045,59 @@ device_parsers:
2738
3045
  # Android HTC with Version Number matcher
2739
3046
  # ; HTC_0P3Z11/1.12.161.3 Build
2740
3047
  # ;HTC_A3335 V2.38.841.1 Build
2741
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
3048
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2742
3049
  device_replacement: 'HTC $1'
2743
3050
  brand_replacement: 'HTC'
2744
3051
  model_replacement: '$1'
2745
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
3052
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2746
3053
  device_replacement: 'HTC $1 $2'
2747
3054
  brand_replacement: 'HTC'
2748
3055
  model_replacement: '$1 $2'
2749
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
3056
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2750
3057
  device_replacement: 'HTC $1 $2 $3'
2751
3058
  brand_replacement: 'HTC'
2752
3059
  model_replacement: '$1 $2 $3'
2753
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
3060
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2754
3061
  device_replacement: 'HTC $1 $2 $3 $4'
2755
3062
  brand_replacement: 'HTC'
2756
3063
  model_replacement: '$1 $2 $3 $4'
2757
3064
 
2758
3065
  # Android HTC without Version Number matcher
2759
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
3066
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2760
3067
  device_replacement: 'HTC $1'
2761
3068
  brand_replacement: 'HTC'
2762
3069
  model_replacement: '$1'
2763
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
3070
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2764
3071
  device_replacement: 'HTC $1 $2'
2765
3072
  brand_replacement: 'HTC'
2766
3073
  model_replacement: '$1 $2'
2767
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
3074
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2768
3075
  device_replacement: 'HTC $1 $2 $3'
2769
3076
  brand_replacement: 'HTC'
2770
3077
  model_replacement: '$1 $2 $3'
2771
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
3078
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2772
3079
  device_replacement: 'HTC $1 $2 $3 $4'
2773
3080
  brand_replacement: 'HTC'
2774
3081
  model_replacement: '$1 $2 $3 $4'
2775
3082
 
2776
3083
  # HTC Streaming Player
2777
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
3084
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2778
3085
  device_replacement: 'HTC $1'
2779
3086
  brand_replacement: 'HTC'
2780
3087
  model_replacement: '$1'
2781
3088
  # general matcher for anything else
2782
- - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
3089
+ - regex: '(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2783
3090
  regex_flag: 'i'
2784
3091
  device_replacement: 'HTC $1'
2785
3092
  brand_replacement: 'HTC'
2786
3093
  model_replacement: '$1'
2787
3094
  # Android matchers without HTC
2788
- - regex: '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
3095
+ - regex: '; {0,2}(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2789
3096
  regex_flag: 'i'
2790
3097
  device_replacement: 'HTC $1'
2791
3098
  brand_replacement: 'HTC'
2792
3099
  model_replacement: '$1'
2793
- - regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)'
3100
+ - regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
2794
3101
  regex_flag: 'i'
2795
3102
  device_replacement: 'HTC $1 $2'
2796
3103
  brand_replacement: 'HTC'
@@ -2800,16 +3107,16 @@ device_parsers:
2800
3107
  # Hyundai
2801
3108
  # @ref: http://www.hyundaitechnologies.com
2802
3109
  #########
2803
- - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
3110
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2804
3111
  device_replacement: 'Hyundai $1'
2805
3112
  brand_replacement: 'Hyundai'
2806
3113
  model_replacement: '$1'
2807
- - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
3114
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2808
3115
  device_replacement: 'Hyundai $1'
2809
3116
  brand_replacement: 'Hyundai'
2810
3117
  model_replacement: '$1'
2811
3118
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2812
- - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
3119
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2813
3120
  device_replacement: 'Hyundai $1'
2814
3121
  brand_replacement: 'Hyundai'
2815
3122
  model_replacement: '$1'
@@ -2818,12 +3125,12 @@ device_parsers:
2818
3125
  # iBall
2819
3126
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2820
3127
  #########
2821
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
3128
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2822
3129
  regex_flag: 'i'
2823
3130
  device_replacement: '$1 $2'
2824
3131
  brand_replacement: 'iBall'
2825
3132
  model_replacement: '$1 $2'
2826
- - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
3133
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2827
3134
  regex_flag: 'i'
2828
3135
  device_replacement: '$1 $2'
2829
3136
  brand_replacement: 'iBall'
@@ -2833,7 +3140,7 @@ device_parsers:
2833
3140
  # IconBIT
2834
3141
  # @ref: http://www.iconbit.com/catalog/tablets/
2835
3142
  #########
2836
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
3143
+ - regex: '; {0,2}(NT-\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\) AppleWebKit)'
2837
3144
  device_replacement: '$1'
2838
3145
  brand_replacement: 'IconBIT'
2839
3146
  model_replacement: '$1'
@@ -2842,7 +3149,7 @@ device_parsers:
2842
3149
  # IMO
2843
3150
  # @ref: http://www.ponselimo.com/
2844
3151
  #########
2845
- - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3152
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2846
3153
  regex_flag: 'i'
2847
3154
  device_replacement: '$1 $2'
2848
3155
  brand_replacement: 'IMO'
@@ -2852,12 +3159,12 @@ device_parsers:
2852
3159
  # i-mobile
2853
3160
  # @ref: http://www.i-mobilephone.com/
2854
3161
  #########
2855
- - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
3162
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2856
3163
  regex_flag: 'i'
2857
3164
  device_replacement: 'i-mobile $1'
2858
3165
  brand_replacement: 'imobile'
2859
3166
  model_replacement: '$1'
2860
- - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
3167
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2861
3168
  regex_flag: 'i'
2862
3169
  device_replacement: 'i-mobile $1'
2863
3170
  brand_replacement: 'imobile'
@@ -2867,7 +3174,7 @@ device_parsers:
2867
3174
  # Impression
2868
3175
  # @ref: http://impression.ua/planshetnye-kompyutery
2869
3176
  #########
2870
- - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
3177
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2871
3178
  device_replacement: '$1 $2'
2872
3179
  brand_replacement: 'Impression'
2873
3180
  model_replacement: '$1 $2'
@@ -2876,7 +3183,7 @@ device_parsers:
2876
3183
  # Infinix
2877
3184
  # @ref: http://www.infinixmobility.com/index.html
2878
3185
  #########
2879
- - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3186
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2880
3187
  device_replacement: '$1 $2'
2881
3188
  brand_replacement: 'Infinix'
2882
3189
  model_replacement: '$2'
@@ -2885,7 +3192,7 @@ device_parsers:
2885
3192
  # Informer
2886
3193
  # @ref: ??
2887
3194
  #########
2888
- - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
3195
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2889
3196
  device_replacement: '$1 $2'
2890
3197
  brand_replacement: 'Informer'
2891
3198
  model_replacement: '$2'
@@ -2895,7 +3202,7 @@ device_parsers:
2895
3202
  # @ref: http://www.intenso.de
2896
3203
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2897
3204
  #########
2898
- - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
3205
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2899
3206
  device_replacement: 'Intenso $1'
2900
3207
  brand_replacement: 'Intenso'
2901
3208
  model_replacement: '$1 $2'
@@ -2906,21 +3213,21 @@ device_parsers:
2906
3213
  # @note: Zync also offers a "Cloud Z5" device
2907
3214
  #########
2908
3215
  # smartphones
2909
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
3216
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2910
3217
  device_replacement: '$1$2$3'
2911
3218
  brand_replacement: 'Intex'
2912
3219
  model_replacement: '$1 $3'
2913
3220
  # matches "INTEX CLOUD X1"
2914
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3221
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2915
3222
  device_replacement: '$1 $2'
2916
3223
  brand_replacement: 'Intex'
2917
3224
  model_replacement: '$1 $2'
2918
3225
  # tablets
2919
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3226
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2920
3227
  device_replacement: '$1 $2 $3'
2921
3228
  brand_replacement: 'Intex'
2922
3229
  model_replacement: 'iBuddy $2 $3'
2923
- - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
3230
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2924
3231
  device_replacement: '$1 $2'
2925
3232
  brand_replacement: 'Intex'
2926
3233
  model_replacement: 'iBuddy $2'
@@ -2929,7 +3236,7 @@ device_parsers:
2929
3236
  # iOCEAN
2930
3237
  # @ref: http://www.iocean.cc/
2931
3238
  #########
2932
- - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
3239
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2933
3240
  regex_flag: 'i'
2934
3241
  device_replacement: '$1 $2'
2935
3242
  brand_replacement: 'iOCEAN'
@@ -2939,7 +3246,7 @@ device_parsers:
2939
3246
  # i.onik
2940
3247
  # @ref: http://www.i-onik.de/
2941
3248
  #########
2942
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
3249
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2943
3250
  device_replacement: 'ionik $1'
2944
3251
  brand_replacement: 'ionik'
2945
3252
  model_replacement: '$1'
@@ -2948,7 +3255,7 @@ device_parsers:
2948
3255
  # IRU.ru
2949
3256
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2950
3257
  #########
2951
- - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
3258
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2952
3259
  device_replacement: '$1'
2953
3260
  brand_replacement: 'Iru'
2954
3261
  model_replacement: '$1'
@@ -2957,7 +3264,7 @@ device_parsers:
2957
3264
  # Itel Mobile
2958
3265
  # @ref: https://www.itel-mobile.com/global/products/
2959
3266
  #########
2960
- - regex: '; *itel ([^;/]*)(?: Build|\) AppleWebKit)'
3267
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
2961
3268
  device_replacement: 'Itel $1'
2962
3269
  brand_replacement: 'Itel'
2963
3270
  model_replacement: '$1'
@@ -2967,11 +3274,11 @@ device_parsers:
2967
3274
  # @ref: http://www.ivio.com/mobile.php
2968
3275
  # @models: DG80,DG20,DE38,DE88,MD70
2969
3276
  #########
2970
- - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
3277
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2971
3278
  device_replacement: '$1'
2972
3279
  brand_replacement: 'Ivio'
2973
3280
  model_replacement: '$1'
2974
- - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3281
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2975
3282
  device_replacement: '$1'
2976
3283
  brand_replacement: 'Ivio'
2977
3284
  model_replacement: '$1'
@@ -2980,7 +3287,7 @@ device_parsers:
2980
3287
  # Jaytech
2981
3288
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2982
3289
  #########
2983
- - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
3290
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2984
3291
  device_replacement: '$1'
2985
3292
  brand_replacement: 'Jaytech'
2986
3293
  model_replacement: '$1'
@@ -2989,7 +3296,7 @@ device_parsers:
2989
3296
  # Jiayu
2990
3297
  # @ref: http://www.ejiayu.com/en/Product.html
2991
3298
  #########
2992
- - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
3299
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2993
3300
  device_replacement: '$1'
2994
3301
  brand_replacement: 'Jiayu'
2995
3302
  model_replacement: '$1'
@@ -2998,7 +3305,7 @@ device_parsers:
2998
3305
  # JXD
2999
3306
  # @ref: http://www.jxd.hk/
3000
3307
  #########
3001
- - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3308
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3002
3309
  device_replacement: '$1 $2'
3003
3310
  brand_replacement: 'JXD'
3004
3311
  model_replacement: '$2'
@@ -3007,16 +3314,16 @@ device_parsers:
3007
3314
  # Karbonn
3008
3315
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
3009
3316
  #########
3010
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3317
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
3011
3318
  regex_flag: 'i'
3012
3319
  device_replacement: '$1'
3013
3320
  brand_replacement: 'Karbonn'
3014
3321
  model_replacement: '$1'
3015
- - regex: '; *([^;]+) Build/Karbonn'
3322
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
3016
3323
  device_replacement: '$1'
3017
3324
  brand_replacement: 'Karbonn'
3018
3325
  model_replacement: '$1'
3019
- - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3326
+ - regex: '; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3020
3327
  device_replacement: '$1'
3021
3328
  brand_replacement: 'Karbonn'
3022
3329
  model_replacement: '$1'
@@ -3025,84 +3332,84 @@ device_parsers:
3025
3332
  # KDDI (Operator Branded Device)
3026
3333
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3027
3334
  #########
3028
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3335
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3029
3336
  device_replacement: '$1'
3030
3337
  brand_replacement: 'Sharp'
3031
3338
  model_replacement: '$1'
3032
- - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
3339
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
3033
3340
  device_replacement: '$1'
3034
3341
  brand_replacement: 'Regza'
3035
3342
  model_replacement: '$1'
3036
- - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3343
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3037
3344
  device_replacement: '$1'
3038
3345
  brand_replacement: 'Pantech'
3039
3346
  model_replacement: '$1'
3040
- - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
3347
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
3041
3348
  device_replacement: '$1'
3042
3349
  brand_replacement: 'SonyEricsson'
3043
3350
  model_replacement: 'Xperia Acro'
3044
- - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
3351
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
3045
3352
  device_replacement: '$1'
3046
3353
  brand_replacement: 'Casio'
3047
3354
  model_replacement: 'GzOne $1'
3048
- - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
3355
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
3049
3356
  device_replacement: '$1'
3050
3357
  brand_replacement: 'LG'
3051
3358
  model_replacement: 'Optimus X'
3052
- - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
3359
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
3053
3360
  device_replacement: '$1'
3054
3361
  brand_replacement: 'Medias'
3055
3362
  model_replacement: '$1'
3056
- - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
3363
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
3057
3364
  device_replacement: '$1'
3058
3365
  brand_replacement: 'Pantech'
3059
3366
  model_replacement: 'MIRACH'
3060
- - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
3367
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
3061
3368
  device_replacement: '$1'
3062
3369
  brand_replacement: 'Fujitsu'
3063
3370
  model_replacement: 'Arrows ES'
3064
3371
  # @ref: https://ja.wikipedia.org/wiki/IS12M
3065
- - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
3372
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
3066
3373
  device_replacement: '$1'
3067
3374
  brand_replacement: 'Motorola'
3068
3375
  model_replacement: 'XT909'
3069
- - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
3376
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
3070
3377
  device_replacement: '$1'
3071
3378
  brand_replacement: 'SonyEricsson'
3072
3379
  model_replacement: 'Xperia Acro HD'
3073
- - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
3380
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
3074
3381
  device_replacement: '$1'
3075
3382
  brand_replacement: 'Fujitsu'
3076
3383
  model_replacement: 'Arrowz Z'
3077
- - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
3384
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
3078
3385
  device_replacement: '$1'
3079
3386
  brand_replacement: 'HTC'
3080
3387
  model_replacement: 'EVO'
3081
- - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
3388
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
3082
3389
  device_replacement: '$1'
3083
3390
  brand_replacement: 'Kyocera'
3084
3391
  model_replacement: 'DIGNO'
3085
- - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
3392
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
3086
3393
  device_replacement: '$1'
3087
3394
  brand_replacement: 'Motorola'
3088
3395
  model_replacement: 'Photon'
3089
- - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
3396
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
3090
3397
  device_replacement: '$1'
3091
3398
  brand_replacement: 'Samsung'
3092
3399
  model_replacement: 'GALAXY S II WiMAX'
3093
- - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
3400
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
3094
3401
  device_replacement: '$1'
3095
3402
  brand_replacement: 'HTC'
3096
3403
  model_replacement: 'EVO 3D'
3097
- - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
3404
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
3098
3405
  device_replacement: '$1'
3099
3406
  brand_replacement: 'HTC'
3100
3407
  model_replacement: 'J'
3101
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3408
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3102
3409
  device_replacement: '$1'
3103
3410
  brand_replacement: 'KDDI'
3104
3411
  model_replacement: '$1'
3105
- - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
3412
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3106
3413
  device_replacement: '$1'
3107
3414
  brand_replacement: 'KDDI'
3108
3415
  model_replacement: '$1'
@@ -3111,7 +3418,7 @@ device_parsers:
3111
3418
  # Kingcom
3112
3419
  # @ref: http://www.e-kingcom.com
3113
3420
  #########
3114
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3421
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3115
3422
  device_replacement: '$1 $2'
3116
3423
  brand_replacement: 'Kingcom'
3117
3424
  model_replacement: '$1 $2'
@@ -3121,7 +3428,7 @@ device_parsers:
3121
3428
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
3122
3429
  # @ref: http://www.kobo.com/devices#tablets
3123
3430
  #########
3124
- - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3431
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3125
3432
  regex_flag: 'i'
3126
3433
  device_replacement: '$1'
3127
3434
  brand_replacement: 'Kobo'
@@ -3135,7 +3442,7 @@ device_parsers:
3135
3442
  # K-Touch
3136
3443
  # @ref: ??
3137
3444
  #########
3138
- - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3445
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3139
3446
  regex_flag: 'i'
3140
3447
  device_replacement: '$1 $2'
3141
3448
  brand_replacement: 'Ktouch'
@@ -3145,7 +3452,7 @@ device_parsers:
3145
3452
  # KT Tech
3146
3453
  # @ref: http://www.kttech.co.kr
3147
3454
  #########
3148
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3455
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3149
3456
  regex_flag: 'i'
3150
3457
  device_replacement: '$1'
3151
3458
  brand_replacement: 'KTtech'
@@ -3155,7 +3462,7 @@ device_parsers:
3155
3462
  # Kyocera
3156
3463
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3157
3464
  #########
3158
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3465
+ - regex: '; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3159
3466
  device_replacement: '$1'
3160
3467
  brand_replacement: 'Kyocera'
3161
3468
  model_replacement: '$1'
@@ -3164,12 +3471,12 @@ device_parsers:
3164
3471
  # Lava
3165
3472
  # @ref: http://www.lavamobiles.com/
3166
3473
  #########
3167
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3474
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3168
3475
  regex_flag: 'i'
3169
3476
  device_replacement: 'Iris $1'
3170
3477
  brand_replacement: 'Lava'
3171
3478
  model_replacement: 'Iris $1'
3172
- - regex: '; *LAVA[ _]([^;/]+) Build'
3479
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3173
3480
  device_replacement: '$1'
3174
3481
  brand_replacement: 'Lava'
3175
3482
  model_replacement: '$1'
@@ -3178,7 +3485,7 @@ device_parsers:
3178
3485
  # Lemon
3179
3486
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3180
3487
  #########
3181
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3488
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3182
3489
  device_replacement: 'Lemon $1$2'
3183
3490
  brand_replacement: 'Lemon'
3184
3491
  model_replacement: '$1$2'
@@ -3187,11 +3494,11 @@ device_parsers:
3187
3494
  # Lenco
3188
3495
  # @ref: http://www.lenco.com/c/tablets/
3189
3496
  #########
3190
- - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3497
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3191
3498
  device_replacement: 'Lenco $1'
3192
3499
  brand_replacement: 'Lenco'
3193
3500
  model_replacement: '$1'
3194
- - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3501
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3195
3502
  device_replacement: 'Lenco $1'
3196
3503
  brand_replacement: 'Lenco'
3197
3504
  model_replacement: '$1'
@@ -3200,23 +3507,23 @@ device_parsers:
3200
3507
  # Lenovo
3201
3508
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3202
3509
  #########
3203
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3510
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3204
3511
  device_replacement: '$1'
3205
3512
  brand_replacement: 'Lenovo'
3206
3513
  model_replacement: '$1'
3207
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3514
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3208
3515
  device_replacement: 'Lenovo $1 $2'
3209
3516
  brand_replacement: 'Lenovo'
3210
3517
  model_replacement: '$1 $2'
3211
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3518
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3212
3519
  device_replacement: 'Lenovo $1 $2'
3213
3520
  brand_replacement: 'Lenovo'
3214
3521
  model_replacement: '$1 $2'
3215
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3522
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3216
3523
  device_replacement: 'Lenovo $1 $2'
3217
3524
  brand_replacement: 'Lenovo'
3218
3525
  model_replacement: '$1 $2'
3219
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3526
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3220
3527
  device_replacement: 'Lenovo $1'
3221
3528
  brand_replacement: 'Lenovo'
3222
3529
  model_replacement: '$1'
@@ -3224,11 +3531,11 @@ device_parsers:
3224
3531
  device_replacement: 'Lenovo $1 $2 $3'
3225
3532
  brand_replacement: 'Lenovo'
3226
3533
  model_replacement: '$1 $2 $3'
3227
- - regex: '; *(?:Ideapad |)K1 Build/'
3534
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3228
3535
  device_replacement: 'Lenovo Ideapad K1'
3229
3536
  brand_replacement: 'Lenovo'
3230
3537
  model_replacement: 'Ideapad K1'
3231
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3538
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3232
3539
  device_replacement: '$1'
3233
3540
  brand_replacement: 'Lenovo'
3234
3541
  model_replacement: '$1'
@@ -3241,7 +3548,7 @@ device_parsers:
3241
3548
  # Lexibook
3242
3549
  # @ref: http://www.lexibook.com/fr
3243
3550
  #########
3244
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3551
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3245
3552
  device_replacement: '$1$2'
3246
3553
  brand_replacement: 'Lexibook'
3247
3554
  model_replacement: '$1$2'
@@ -3250,23 +3557,23 @@ device_parsers:
3250
3557
  # LG
3251
3558
  # @ref: http://www.lg.com/uk/mobile
3252
3559
  #########
3253
- - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
3560
+ - regex: '; {0,2}(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]{1,30}|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) {0,2}(?:Build|;)'
3254
3561
  device_replacement: '$1'
3255
3562
  brand_replacement: 'LG'
3256
3563
  model_replacement: '$1'
3257
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
3564
+ - regex: '[;:] {0,2}(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) {0,2}(?:Build|[;\)])'
3258
3565
  device_replacement: '$1'
3259
3566
  brand_replacement: 'LG'
3260
3567
  model_replacement: '$1'
3261
- - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3568
+ - regex: '; {0,2}(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3262
3569
  device_replacement: '$1$2'
3263
3570
  brand_replacement: 'LG'
3264
3571
  model_replacement: '$2'
3265
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3572
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3266
3573
  device_replacement: '$1$2'
3267
3574
  brand_replacement: 'LG'
3268
3575
  model_replacement: '$2'
3269
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3576
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3270
3577
  device_replacement: '$1 $2'
3271
3578
  brand_replacement: 'LG'
3272
3579
  model_replacement: '$2'
@@ -3279,11 +3586,11 @@ device_parsers:
3279
3586
  # Malata
3280
3587
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3281
3588
  #########
3282
- - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3589
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3283
3590
  device_replacement: '$1'
3284
3591
  brand_replacement: 'Malata'
3285
3592
  model_replacement: '$1'
3286
- - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3593
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3287
3594
  device_replacement: '$1'
3288
3595
  brand_replacement: 'Malata'
3289
3596
  model_replacement: '$1'
@@ -3292,7 +3599,7 @@ device_parsers:
3292
3599
  # Manta
3293
3600
  # @ref: http://www.manta.com.pl/en
3294
3601
  #########
3295
- - 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)'
3602
+ - regex: '; {0,2}(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3296
3603
  device_replacement: '$1'
3297
3604
  brand_replacement: 'Manta'
3298
3605
  model_replacement: '$1'
@@ -3301,7 +3608,7 @@ device_parsers:
3301
3608
  # Match
3302
3609
  # @ref: http://www.match.net.cn/products.asp
3303
3610
  #########
3304
- - 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)'
3611
+ - regex: '; {0,2}(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)'
3305
3612
  device_replacement: '$1'
3306
3613
  brand_replacement: 'Match'
3307
3614
  model_replacement: '$1'
@@ -3315,7 +3622,7 @@ device_parsers:
3315
3622
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3316
3623
  # @note: Need more User-Agents!!!
3317
3624
  #########
3318
- - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3625
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3319
3626
  device_replacement: 'Maxx $1'
3320
3627
  brand_replacement: 'Maxx'
3321
3628
  model_replacement: '$1'
@@ -3324,11 +3631,11 @@ device_parsers:
3324
3631
  # Mediacom
3325
3632
  # @ref: http://www.mediacomeurope.it/
3326
3633
  #########
3327
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3634
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3328
3635
  device_replacement: 'Mediacom $1'
3329
3636
  brand_replacement: 'Mediacom'
3330
3637
  model_replacement: '$1'
3331
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3638
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3332
3639
  device_replacement: 'Mediacom $1'
3333
3640
  brand_replacement: 'Mediacom'
3334
3641
  model_replacement: '$1'
@@ -3337,12 +3644,12 @@ device_parsers:
3337
3644
  # Medion
3338
3645
  # @ref: http://www.medion.com/en/
3339
3646
  #########
3340
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3647
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3341
3648
  regex_flag: 'i'
3342
3649
  device_replacement: 'Medion Lifetab $1'
3343
3650
  brand_replacement: 'Medion'
3344
3651
  model_replacement: 'Lifetab $1'
3345
- - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3652
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3346
3653
  device_replacement: 'Medion $1'
3347
3654
  brand_replacement: 'Medion'
3348
3655
  model_replacement: '$1'
@@ -3351,41 +3658,65 @@ device_parsers:
3351
3658
  # Meizu
3352
3659
  # @ref: http://www.meizu.com
3353
3660
  #########
3354
- - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3661
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3355
3662
  device_replacement: 'Meizu $1'
3356
3663
  brand_replacement: 'Meizu'
3357
3664
  model_replacement: '$1'
3358
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3665
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3359
3666
  device_replacement: 'Meizu $1'
3360
3667
  brand_replacement: 'Meizu'
3361
3668
  model_replacement: '$1'
3362
3669
 
3670
+ #########
3671
+ # Meta
3672
+ # @ref: https://www.meta.com
3673
+ #########
3674
+ - regex: 'Quest 3'
3675
+ device_replacement: 'Quest'
3676
+ brand_replacement: 'Meta'
3677
+ model_replacement: 'Quest 3'
3678
+
3679
+ - regex: 'Quest 2'
3680
+ device_replacement: 'Quest'
3681
+ brand_replacement: 'Meta'
3682
+ model_replacement: 'Quest 2'
3683
+
3684
+ - regex: 'Quest Pro'
3685
+ device_replacement: 'Quest'
3686
+ brand_replacement: 'Meta'
3687
+ model_replacement: 'Quest Pro'
3688
+
3689
+ - regex: 'Quest'
3690
+ device_replacement: 'Quest'
3691
+ brand_replacement: 'Meta'
3692
+ model_replacement: 'Quest'
3693
+
3363
3694
  #########
3364
3695
  # Micromax
3365
3696
  # @ref: http://www.micromaxinfo.com
3366
3697
  #########
3367
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3698
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3368
3699
  regex_flag: 'i'
3369
3700
  device_replacement: 'Micromax $1$2'
3370
3701
  brand_replacement: 'Micromax'
3371
3702
  model_replacement: '$1$2'
3372
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3703
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3373
3704
  regex_flag: 'i'
3374
3705
  device_replacement: 'Micromax $1'
3375
3706
  brand_replacement: 'Micromax'
3376
3707
  model_replacement: '$1'
3377
3708
  # be carefull here with Acer e.g. A500
3378
- - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3709
+ - regex: '; {0,2}(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3379
3710
  regex_flag: 'i'
3380
3711
  device_replacement: 'Micromax $1'
3381
3712
  brand_replacement: 'Micromax'
3382
3713
  model_replacement: '$1'
3383
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3714
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3384
3715
  regex_flag: 'i'
3385
3716
  device_replacement: 'Micromax $1'
3386
3717
  brand_replacement: 'Micromax'
3387
3718
  model_replacement: '$1'
3388
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3719
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3389
3720
  regex_flag: 'i'
3390
3721
  device_replacement: 'Micromax $1'
3391
3722
  brand_replacement: 'Micromax'
@@ -3395,7 +3726,7 @@ device_parsers:
3395
3726
  # Mito
3396
3727
  # @ref: http://new.mitomobile.com/
3397
3728
  #########
3398
- - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3729
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3399
3730
  regex_flag: 'i'
3400
3731
  device_replacement: '$1 $2'
3401
3732
  brand_replacement: 'Mito'
@@ -3405,7 +3736,7 @@ device_parsers:
3405
3736
  # Mobistel
3406
3737
  # @ref: http://www.mobistel.com/
3407
3738
  #########
3408
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3739
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3409
3740
  regex_flag: 'i'
3410
3741
  device_replacement: '$1 $2'
3411
3742
  brand_replacement: 'Mobistel'
@@ -3415,12 +3746,12 @@ device_parsers:
3415
3746
  # Modecom
3416
3747
  # @ref: http://www.modecom.eu/tablets/portal/
3417
3748
  #########
3418
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3749
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3419
3750
  regex_flag: 'i'
3420
3751
  device_replacement: '$1$2 $3'
3421
3752
  brand_replacement: 'Modecom'
3422
3753
  model_replacement: '$2 $3'
3423
- - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3754
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3424
3755
  regex_flag: 'i'
3425
3756
  device_replacement: '$1 $2'
3426
3757
  brand_replacement: 'Modecom'
@@ -3430,32 +3761,32 @@ device_parsers:
3430
3761
  # Motorola
3431
3762
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3432
3763
  #########
3433
- - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3764
+ - regex: '; {0,2}(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3434
3765
  device_replacement: 'Motorola $1'
3435
3766
  brand_replacement: 'Motorola'
3436
3767
  model_replacement: '$1'
3437
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3768
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3438
3769
  device_replacement: 'Motorola $1$2'
3439
3770
  brand_replacement: 'Motorola'
3440
3771
  model_replacement: '$2'
3441
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3772
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3442
3773
  regex_flag: 'i'
3443
3774
  device_replacement: 'Motorola $1'
3444
3775
  brand_replacement: 'Motorola'
3445
3776
  model_replacement: 'DROID X'
3446
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3777
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3447
3778
  device_replacement: 'Motorola $1'
3448
3779
  brand_replacement: 'Motorola'
3449
3780
  model_replacement: '$1'
3450
- - regex: '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3781
+ - regex: '; {0,2}(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3451
3782
  device_replacement: '$1'
3452
3783
  brand_replacement: 'Motorola'
3453
3784
  model_replacement: '$1'
3454
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3785
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3455
3786
  device_replacement: '$1$2'
3456
3787
  brand_replacement: 'Motorola'
3457
3788
  model_replacement: '$2'
3458
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3789
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3459
3790
  device_replacement: '$1$2'
3460
3791
  brand_replacement: 'Motorola'
3461
3792
  model_replacement: '$2'
@@ -3464,7 +3795,7 @@ device_parsers:
3464
3795
  # MpMan
3465
3796
  # @ref: http://www.mpmaneurope.com
3466
3797
  #########
3467
- - 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)'
3798
+ - regex: '; {0,2}((?: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)'
3468
3799
  device_replacement: '$1'
3469
3800
  brand_replacement: 'Mpman'
3470
3801
  model_replacement: '$1'
@@ -3473,7 +3804,7 @@ device_parsers:
3473
3804
  # MSI
3474
3805
  # @ref: http://www.msi.com/product/windpad/
3475
3806
  #########
3476
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3807
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3477
3808
  regex_flag: 'i'
3478
3809
  device_replacement: '$1'
3479
3810
  brand_replacement: 'Msi'
@@ -3483,7 +3814,7 @@ device_parsers:
3483
3814
  # Multilaser
3484
3815
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3485
3816
  #########
3486
- - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3817
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3487
3818
  device_replacement: '$1'
3488
3819
  brand_replacement: 'Multilaser'
3489
3820
  model_replacement: '$1'
@@ -3492,15 +3823,15 @@ device_parsers:
3492
3823
  # MyPhone
3493
3824
  # @ref: http://myphone.com.ph/
3494
3825
  #########
3495
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3826
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3496
3827
  device_replacement: '$1$2 $3'
3497
3828
  brand_replacement: 'MyPhone'
3498
3829
  model_replacement: '$1$2 $3'
3499
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3830
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3500
3831
  device_replacement: '$1$2 $3'
3501
3832
  brand_replacement: 'MyPhone'
3502
3833
  model_replacement: '$3'
3503
- - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3834
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3504
3835
  regex_flag: 'i'
3505
3836
  device_replacement: '$1 $2'
3506
3837
  brand_replacement: 'MyPhone'
@@ -3510,7 +3841,7 @@ device_parsers:
3510
3841
  # Mytab
3511
3842
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3512
3843
  #########
3513
- - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3844
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3514
3845
  device_replacement: '$1'
3515
3846
  brand_replacement: 'Mytab'
3516
3847
  model_replacement: '$1'
@@ -3519,7 +3850,7 @@ device_parsers:
3519
3850
  # Nabi
3520
3851
  # @ref: https://www.nabitablet.com
3521
3852
  #########
3522
- - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3853
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3523
3854
  device_replacement: '$1$2'
3524
3855
  brand_replacement: 'Nabi'
3525
3856
  model_replacement: '$2'
@@ -3528,15 +3859,15 @@ device_parsers:
3528
3859
  # Nec Medias
3529
3860
  # @ref: http://www.n-keitai.com/
3530
3861
  #########
3531
- - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3862
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3532
3863
  device_replacement: '$1'
3533
3864
  brand_replacement: 'Nec'
3534
3865
  model_replacement: '$1'
3535
- - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3866
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3536
3867
  device_replacement: '$1$2'
3537
3868
  brand_replacement: 'Nec'
3538
3869
  model_replacement: '$2'
3539
- - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3870
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3540
3871
  device_replacement: '$1'
3541
3872
  brand_replacement: 'Nec'
3542
3873
  model_replacement: 'Lifetouch Note'
@@ -3545,7 +3876,7 @@ device_parsers:
3545
3876
  # Nextbook
3546
3877
  # @ref: http://nextbookusa.com
3547
3878
  #########
3548
- - 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|[\);])'
3879
+ - regex: '; {0,2}(NXM\d+[A-Za-z0-9_]{0,50}|Next\d[A-Za-z0-9_ \-]{0,50}|NEXT\d[A-Za-z0-9_ \-]{0,50}|Nextbook [A-Za-z0-9_ ]{0,50}|DATAM803HC|M805)(?: Build|[\);])'
3549
3880
  device_replacement: '$1'
3550
3881
  brand_replacement: 'Nextbook'
3551
3882
  model_replacement: '$1'
@@ -3554,12 +3885,12 @@ device_parsers:
3554
3885
  # Nokia
3555
3886
  # @ref: http://www.nokia.com
3556
3887
  #########
3557
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3888
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3558
3889
  regex_flag: 'i'
3559
3890
  device_replacement: '$1$2$3'
3560
3891
  brand_replacement: 'Nokia'
3561
3892
  model_replacement: '$3'
3562
- - regex: '; *(TA\-\d{4})(?: Build|\) AppleWebKit)'
3893
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3563
3894
  device_replacement: 'Nokia $1'
3564
3895
  brand_replacement: 'Nokia'
3565
3896
  model_replacement: '$1'
@@ -3569,11 +3900,11 @@ device_parsers:
3569
3900
  # @ref:
3570
3901
  # TODO nook browser/1.0
3571
3902
  #########
3572
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3903
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3573
3904
  device_replacement: '$1$2'
3574
3905
  brand_replacement: 'Nook'
3575
3906
  model_replacement: '$2'
3576
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3907
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3577
3908
  device_replacement: '$1$2'
3578
3909
  brand_replacement: 'Nook'
3579
3910
  model_replacement: '$2'
@@ -3586,7 +3917,7 @@ device_parsers:
3586
3917
  # Olivetti
3587
3918
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3588
3919
  #########
3589
- - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3920
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3590
3921
  device_replacement: 'Olivetti $1'
3591
3922
  brand_replacement: 'Olivetti'
3592
3923
  model_replacement: '$1'
@@ -3597,7 +3928,7 @@ device_parsers:
3597
3928
  # @note: MID tablets might get matched by CobyKyros first
3598
3929
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3599
3930
  #########
3600
- - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3931
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3601
3932
  device_replacement: 'Omega $1'
3602
3933
  brand_replacement: 'Omega'
3603
3934
  model_replacement: '$1'
@@ -3610,7 +3941,7 @@ device_parsers:
3610
3941
  # OpenPeak
3611
3942
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3612
3943
  #########
3613
- - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3944
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3614
3945
  device_replacement: 'Openpeak $1'
3615
3946
  brand_replacement: 'Openpeak'
3616
3947
  model_replacement: '$1'
@@ -3619,18 +3950,18 @@ device_parsers:
3619
3950
  # Oppo
3620
3951
  # @ref: http://en.oppo.com/products/
3621
3952
  #########
3622
- - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d?|U70\d{1,2}T?|X90\d{1,2}|[AFR]\d{1,2}[a-z]{1,2})(?: Build|\) AppleWebKit)'
3953
+ - regex: '; {0,2}(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d?|U70\d{1,2}T?|X90\d{1,2}|[AFR]\d{1,2}[a-z]{1,2})(?: Build|\) AppleWebKit)'
3623
3954
  device_replacement: 'Oppo $1'
3624
3955
  brand_replacement: 'Oppo'
3625
3956
  model_replacement: '$1'
3626
- - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3957
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3627
3958
  device_replacement: 'Oppo $1'
3628
3959
  brand_replacement: 'Oppo'
3629
3960
  model_replacement: '$1'
3630
- - regex: '; *(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3961
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3631
3962
  device_replacement: 'Oppo $1'
3632
3963
  brand_replacement: 'Oppo'
3633
- - regex: '; *(A1601)(?: Build|\) AppleWebKit)'
3964
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3634
3965
  device_replacement: 'Oppo F1s'
3635
3966
  brand_replacement: 'Oppo'
3636
3967
  model_replacement: '$1'
@@ -3639,20 +3970,20 @@ device_parsers:
3639
3970
  # Odys
3640
3971
  # @ref: http://odys.de
3641
3972
  #########
3642
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3973
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3643
3974
  device_replacement: 'Odys $1'
3644
3975
  brand_replacement: 'Odys'
3645
3976
  model_replacement: '$1'
3646
- - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3977
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3647
3978
  device_replacement: 'Odys $1 $2'
3648
3979
  brand_replacement: 'Odys'
3649
3980
  model_replacement: '$1 $2'
3650
- - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3981
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3651
3982
  device_replacement: 'Odys $1 $2 $3'
3652
3983
  brand_replacement: 'Odys'
3653
3984
  model_replacement: '$1 $2 $3'
3654
3985
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3655
- - 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)'
3986
+ - regex: '; {0,2}(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)'
3656
3987
  device_replacement: 'Odys $1'
3657
3988
  brand_replacement: 'Odys'
3658
3989
  model_replacement: '$1'
@@ -3669,12 +4000,24 @@ device_parsers:
3669
4000
  device_replacement: 'OnePlus $1'
3670
4001
  brand_replacement: 'OnePlus'
3671
4002
  model_replacement: '$1'
4003
+ - regex: '; {0,2}(HD1903|GM1917|IN2025|LE2115|LE2127|HD1907|BE2012|BE2025|BE2026|BE2028|BE2029|DE2117|DE2118|EB2101|GM1900|GM1910|GM1915|HD1905|HD1925|IN2015|IN2017|IN2019|KB2005|KB2007|LE2117|LE2125|BE2015|GM1903|HD1900|HD1901|HD1910|HD1913|IN2010|IN2013|IN2020|LE2111|LE2120|LE2121|LE2123|BE2011|IN2023|KB2003|LE2113|NE2215|DN2101)(?: Build|\) AppleWebKit)'
4004
+ device_replacement: 'OnePlus $1'
4005
+ brand_replacement: 'OnePlus'
4006
+ model_replacement: 'OnePlus $1'
4007
+ - regex: '; (OnePlus[ a-zA-z0-9]{0,50});((?: Build|.{0,50}\) AppleWebKit))'
4008
+ device_replacement: '$1'
4009
+ brand_replacement: 'OnePlus'
4010
+ model_replacement: '$1'
4011
+ - regex: '; (OnePlus[ a-zA-z0-9]{0,50})((?: Build|\) AppleWebKit))'
4012
+ device_replacement: '$1'
4013
+ brand_replacement: 'OnePlus'
4014
+ model_replacement: '$1'
3672
4015
 
3673
4016
  #########
3674
4017
  # Orion
3675
4018
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3676
4019
  #########
3677
- - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
4020
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3678
4021
  device_replacement: 'Orion $1'
3679
4022
  brand_replacement: 'Orion'
3680
4023
  model_replacement: '$1'
@@ -3683,7 +4026,7 @@ device_parsers:
3683
4026
  # PackardBell
3684
4027
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3685
4028
  #########
3686
- - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
4029
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3687
4030
  device_replacement: 'PackardBell $1'
3688
4031
  brand_replacement: 'PackardBell'
3689
4032
  model_replacement: '$1'
@@ -3694,17 +4037,17 @@ device_parsers:
3694
4037
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3695
4038
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3696
4039
  #########
3697
- - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
4040
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3698
4041
  device_replacement: '$1 $2'
3699
4042
  brand_replacement: '$1'
3700
4043
  model_replacement: '$2'
3701
4044
  # Toughpad
3702
- - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
4045
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3703
4046
  device_replacement: 'Panasonic $1'
3704
4047
  brand_replacement: 'Panasonic'
3705
4048
  model_replacement: '$1'
3706
4049
  # Eluga Power
3707
- - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
4050
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3708
4051
  device_replacement: 'Panasonic $1'
3709
4052
  brand_replacement: 'Panasonic'
3710
4053
  model_replacement: '$1'
@@ -3715,15 +4058,15 @@ device_parsers:
3715
4058
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3716
4059
  # @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21
3717
4060
  #########
3718
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
4061
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3719
4062
  device_replacement: 'Pantech $1$2'
3720
4063
  brand_replacement: 'Pantech'
3721
4064
  model_replacement: '$1$2'
3722
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
4065
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3723
4066
  device_replacement: '$1'
3724
4067
  brand_replacement: 'Pantech'
3725
4068
  model_replacement: '$1'
3726
- - regex: '; *Pantech([^;/]+).* Build/'
4069
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3727
4070
  device_replacement: 'Pantech $1'
3728
4071
  brand_replacement: 'Pantech'
3729
4072
  model_replacement: '$1'
@@ -3732,7 +4075,7 @@ device_parsers:
3732
4075
  # Papayre
3733
4076
  # @ref: http://grammata.es/
3734
4077
  #########
3735
- - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
4078
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3736
4079
  regex_flag: 'i'
3737
4080
  device_replacement: '$1 $2'
3738
4081
  brand_replacement: 'Papyre'
@@ -3742,7 +4085,7 @@ device_parsers:
3742
4085
  # Pearl
3743
4086
  # @ref: http://www.pearl.de/c-1540.shtml
3744
4087
  #########
3745
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
4088
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3746
4089
  device_replacement: 'Pearl $1'
3747
4090
  brand_replacement: 'Pearl'
3748
4091
  model_replacement: '$1'
@@ -3755,11 +4098,11 @@ device_parsers:
3755
4098
  device_replacement: 'Phicomm $1'
3756
4099
  brand_replacement: 'Phicomm'
3757
4100
  model_replacement: '$1'
3758
- - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
4101
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3759
4102
  device_replacement: 'Phicomm $1'
3760
4103
  brand_replacement: 'Phicomm'
3761
4104
  model_replacement: '$1'
3762
- - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4105
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3763
4106
  device_replacement: 'Phicomm $1'
3764
4107
  brand_replacement: 'Phicomm'
3765
4108
  model_replacement: '$1'
@@ -3771,11 +4114,11 @@ device_parsers:
3771
4114
  # @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
3772
4115
  #########
3773
4116
  # @note: this a best guess according to available philips models. Need more User-Agents
3774
- - 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)'
4117
+ - regex: '; {0,2}(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)'
3775
4118
  device_replacement: '$1'
3776
4119
  brand_replacement: 'Philips'
3777
4120
  model_replacement: '$1'
3778
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4121
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3779
4122
  device_replacement: 'Philips $1'
3780
4123
  brand_replacement: 'Philips'
3781
4124
  model_replacement: '$1'
@@ -3784,7 +4127,7 @@ device_parsers:
3784
4127
  # Pipo
3785
4128
  # @ref: http://www.pipo.cn/En/
3786
4129
  #########
3787
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
4130
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3788
4131
  device_replacement: 'Pipo $1$2'
3789
4132
  brand_replacement: 'Pipo'
3790
4133
  model_replacement: '$1$2'
@@ -3793,7 +4136,7 @@ device_parsers:
3793
4136
  # Ployer
3794
4137
  # @ref: http://en.ployer.cn/
3795
4138
  #########
3796
- - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
4139
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3797
4140
  device_replacement: '$1'
3798
4141
  brand_replacement: 'Ployer'
3799
4142
  model_replacement: '$1'
@@ -3802,11 +4145,11 @@ device_parsers:
3802
4145
  # Polaroid/ Acho
3803
4146
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3804
4147
  #########
3805
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
4148
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3806
4149
  device_replacement: '$1'
3807
4150
  brand_replacement: 'Polaroid'
3808
4151
  model_replacement: '$1'
3809
- - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
4152
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3810
4153
  device_replacement: '$1'
3811
4154
  brand_replacement: 'Polaroid'
3812
4155
  model_replacement: '$1'
@@ -3816,7 +4159,7 @@ device_parsers:
3816
4159
  # @ref: http://pompmobileshop.com/
3817
4160
  #########
3818
4161
  #~ TODO
3819
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
4162
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3820
4163
  device_replacement: '$1 $2'
3821
4164
  brand_replacement: 'Pomp'
3822
4165
  model_replacement: '$2'
@@ -3825,11 +4168,11 @@ device_parsers:
3825
4168
  # Positivo
3826
4169
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3827
4170
  #########
3828
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
4171
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3829
4172
  device_replacement: '$1'
3830
4173
  brand_replacement: 'Positivo'
3831
4174
  model_replacement: '$1'
3832
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
4175
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3833
4176
  device_replacement: '$1'
3834
4177
  brand_replacement: 'Positivo'
3835
4178
  model_replacement: '$1'
@@ -3839,15 +4182,15 @@ device_parsers:
3839
4182
  # @ref: http://www.pointofview-online.com/default2.php
3840
4183
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3841
4184
  #########
3842
- - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
4185
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3843
4186
  device_replacement: '$1'
3844
4187
  brand_replacement: 'POV'
3845
4188
  model_replacement: '$1'
3846
- - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
4189
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3847
4190
  device_replacement: 'POV $1'
3848
4191
  brand_replacement: 'POV'
3849
4192
  model_replacement: '$1'
3850
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
4193
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3851
4194
  device_replacement: 'POV $1'
3852
4195
  brand_replacement: 'POV'
3853
4196
  model_replacement: '$1'
@@ -3857,7 +4200,7 @@ device_parsers:
3857
4200
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3858
4201
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3859
4202
  #########
3860
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
4203
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3861
4204
  device_replacement: 'Prestigio $1'
3862
4205
  brand_replacement: 'Prestigio'
3863
4206
  model_replacement: '$1'
@@ -3866,7 +4209,7 @@ device_parsers:
3866
4209
  # Proscan
3867
4210
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3868
4211
  #########
3869
- - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
4212
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3870
4213
  device_replacement: '$1'
3871
4214
  brand_replacement: 'Proscan'
3872
4215
  model_replacement: '$1'
@@ -3875,15 +4218,15 @@ device_parsers:
3875
4218
  # QMobile
3876
4219
  # @ref: http://www.qmobile.com.pk/
3877
4220
  #########
3878
- - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
4221
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3879
4222
  device_replacement: '$1 $2'
3880
4223
  brand_replacement: 'Qmobile'
3881
4224
  model_replacement: '$1 $2'
3882
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
4225
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3883
4226
  device_replacement: 'Qmobile $2 $3'
3884
4227
  brand_replacement: 'Qmobile'
3885
4228
  model_replacement: '$2 $3'
3886
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
4229
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3887
4230
  device_replacement: 'Qmobile $2'
3888
4231
  brand_replacement: 'Qmobile'
3889
4232
  model_replacement: '$2'
@@ -3892,11 +4235,11 @@ device_parsers:
3892
4235
  # Qmobilevn
3893
4236
  # @ref: http://qmobile.vn/san-pham.html
3894
4237
  #########
3895
- - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4238
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3896
4239
  device_replacement: '$1 $2'
3897
4240
  brand_replacement: 'Qmobilevn'
3898
4241
  model_replacement: '$2'
3899
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
4242
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3900
4243
  device_replacement: '$1 $2'
3901
4244
  brand_replacement: 'Qmobilevn'
3902
4245
  model_replacement: '$2'
@@ -3905,7 +4248,7 @@ device_parsers:
3905
4248
  # Quanta
3906
4249
  # @ref: ?
3907
4250
  #########
3908
- - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
4251
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3909
4252
  device_replacement: '$1'
3910
4253
  brand_replacement: 'Quanta'
3911
4254
  model_replacement: '$1'
@@ -3928,7 +4271,7 @@ device_parsers:
3928
4271
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3929
4272
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3930
4273
  #########
3931
- - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
4274
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3932
4275
  device_replacement: '$1'
3933
4276
  brand_replacement: 'Rockchip'
3934
4277
  model_replacement: '$1'
@@ -3941,55 +4284,55 @@ device_parsers:
3941
4284
  # Samsung Android Devices
3942
4285
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3943
4286
  #########
3944
- - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
4287
+ - regex: '; {0,2}(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]{0,100})\/?[^;/]{0,50} Build/'
3945
4288
  device_replacement: 'Samsung $1$2'
3946
4289
  brand_replacement: 'Samsung'
3947
4290
  model_replacement: '$2'
3948
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4291
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3949
4292
  device_replacement: 'Samsung $1$2'
3950
4293
  brand_replacement: 'Samsung'
3951
4294
  model_replacement: '$2'
3952
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4295
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3953
4296
  device_replacement: 'Samsung $2'
3954
4297
  brand_replacement: 'Samsung'
3955
4298
  model_replacement: '$2'
3956
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
4299
+ - regex: '; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
3957
4300
  device_replacement: 'Samsung $1'
3958
4301
  brand_replacement: 'Samsung'
3959
4302
  model_replacement: '$1'
3960
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4303
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3961
4304
  device_replacement: 'Samsung $2'
3962
4305
  brand_replacement: 'Samsung'
3963
4306
  model_replacement: '$2'
3964
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4307
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3965
4308
  device_replacement: 'Samsung $1$2$3'
3966
4309
  brand_replacement: 'Samsung'
3967
4310
  model_replacement: '$2'
3968
- - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
4311
+ - regex: '(?:; {0,2}|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
3969
4312
  device_replacement: 'Samsung $1'
3970
4313
  brand_replacement: 'Samsung'
3971
4314
  model_replacement: '$1'
3972
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4315
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3973
4316
  device_replacement: 'Samsung $1$2'
3974
4317
  brand_replacement: 'Samsung'
3975
4318
  model_replacement: '$2'
3976
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4319
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3977
4320
  device_replacement: 'Samsung $1'
3978
4321
  brand_replacement: 'Samsung'
3979
4322
  model_replacement: '$1'
3980
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4323
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3981
4324
  device_replacement: 'Samsung $1'
3982
4325
  brand_replacement: 'Samsung'
3983
4326
  model_replacement: '$1'
3984
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4327
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3985
4328
  device_replacement: 'Samsung $1'
3986
4329
  brand_replacement: 'Samsung'
3987
4330
  model_replacement: '$1'
3988
- - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
4331
+ - regex: '; {0,2}(Behold ?(?:2|II)|YP\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build'
3989
4332
  device_replacement: 'Samsung $1'
3990
4333
  brand_replacement: 'Samsung'
3991
4334
  model_replacement: '$1'
3992
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
4335
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
3993
4336
  device_replacement: 'Samsung $1'
3994
4337
  brand_replacement: 'Samsung'
3995
4338
  model_replacement: '$1'
@@ -3999,11 +4342,11 @@ device_parsers:
3999
4342
  # @ref: http://www.sharp-phone.com/en/index.html
4000
4343
  # @ref: http://www.android.com/devices/?country=all&m=sharp
4001
4344
  #########
4002
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
4345
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4003
4346
  device_replacement: '$1'
4004
4347
  brand_replacement: 'Sharp'
4005
4348
  model_replacement: '$1'
4006
- - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
4349
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4007
4350
  device_replacement: '$1$2'
4008
4351
  brand_replacement: 'Sharp'
4009
4352
  model_replacement: '$2'
@@ -4012,15 +4355,15 @@ device_parsers:
4012
4355
  # Simvalley
4013
4356
  # @ref: http://www.simvalley-mobile.de/
4014
4357
  #########
4015
- - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4358
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4016
4359
  device_replacement: '$1'
4017
4360
  brand_replacement: 'Simvalley'
4018
4361
  model_replacement: '$1'
4019
- - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4362
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4020
4363
  device_replacement: '$1'
4021
4364
  brand_replacement: 'Simvalley'
4022
4365
  model_replacement: '$1'
4023
- - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4366
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4024
4367
  device_replacement: '$1'
4025
4368
  brand_replacement: 'Simvalley'
4026
4369
  model_replacement: '$1'
@@ -4030,7 +4373,7 @@ device_parsers:
4030
4373
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
4031
4374
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
4032
4375
  #########
4033
- - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
4376
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
4034
4377
  device_replacement: '$1'
4035
4378
  brand_replacement: 'SKtelesys'
4036
4379
  model_replacement: '$1'
@@ -4039,11 +4382,11 @@ device_parsers:
4039
4382
  # Skytex
4040
4383
  # @ref: http://skytex.com/android
4041
4384
  #########
4042
- - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
4385
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4043
4386
  device_replacement: '$1'
4044
4387
  brand_replacement: 'Skytex'
4045
4388
  model_replacement: '$1'
4046
- - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
4389
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4047
4390
  device_replacement: '$1'
4048
4391
  brand_replacement: 'Skytex'
4049
4392
  model_replacement: '$1'
@@ -4053,7 +4396,7 @@ device_parsers:
4053
4396
  # @ref: http://en.smartdevices.com.cn/Products/
4054
4397
  # @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
4055
4398
  #########
4056
- - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4399
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4057
4400
  device_replacement: '$1 $2'
4058
4401
  brand_replacement: '$1'
4059
4402
  model_replacement: '$2'
@@ -4063,7 +4406,7 @@ device_parsers:
4063
4406
  # @ref: http://www.smartbitt.com/
4064
4407
  # @missing: SBT Useragents
4065
4408
  #########
4066
- - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
4409
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4067
4410
  device_replacement: '$1'
4068
4411
  brand_replacement: 'Smartbitt'
4069
4412
  model_replacement: '$1'
@@ -4072,15 +4415,15 @@ device_parsers:
4072
4415
  # Softbank (Operator Branded Devices)
4073
4416
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
4074
4417
  #########
4075
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4418
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4076
4419
  device_replacement: '$1'
4077
4420
  brand_replacement: 'Sharp'
4078
4421
  model_replacement: '$1'
4079
- - regex: '; *(003P|101P|101P11C|102P) Build'
4422
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
4080
4423
  device_replacement: '$1'
4081
4424
  brand_replacement: 'Panasonic'
4082
4425
  model_replacement: '$1'
4083
- - regex: '; *(00\dZ) Build/'
4426
+ - regex: '; {0,2}(00\dZ) Build/'
4084
4427
  device_replacement: '$1'
4085
4428
  brand_replacement: 'ZTE'
4086
4429
  model_replacement: '$1'
@@ -4088,11 +4431,11 @@ device_parsers:
4088
4431
  device_replacement: '$1'
4089
4432
  brand_replacement: 'HTC'
4090
4433
  model_replacement: '$1'
4091
- - regex: '; *(001HT|X06HT) Build'
4434
+ - regex: '; {0,2}(001HT|X06HT) Build'
4092
4435
  device_replacement: '$1'
4093
4436
  brand_replacement: 'HTC'
4094
4437
  model_replacement: '$1'
4095
- - regex: '; *(201M) Build'
4438
+ - regex: '; {0,2}(201M) Build'
4096
4439
  device_replacement: '$1'
4097
4440
  brand_replacement: 'Motorola'
4098
4441
  model_replacement: 'XT902'
@@ -4102,11 +4445,11 @@ device_parsers:
4102
4445
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
4103
4446
  # @note: Must come before SonyEricsson
4104
4447
  #########
4105
- - regex: '; *(ST\d{4}.*)Build/ST'
4448
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
4106
4449
  device_replacement: 'Trekstor $1'
4107
4450
  brand_replacement: 'Trekstor'
4108
4451
  model_replacement: '$1'
4109
- - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
4452
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
4110
4453
  device_replacement: 'Trekstor $1'
4111
4454
  brand_replacement: 'Trekstor'
4112
4455
  model_replacement: '$1'
@@ -4118,16 +4461,16 @@ device_parsers:
4118
4461
  # @TODO: type!
4119
4462
  #########
4120
4463
  # android matchers
4121
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4464
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
4122
4465
  device_replacement: '$1$2'
4123
4466
  brand_replacement: 'SonyEricsson'
4124
4467
  model_replacement: '$2'
4125
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4468
+ - regex: '; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4126
4469
  device_replacement: '$1'
4127
4470
  brand_replacement: 'SonyEricsson'
4128
4471
  model_replacement: '$1'
4129
4472
  # TODO X\d+ is wrong
4130
- - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
4473
+ - regex: '; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]{0,50}) Build'
4131
4474
  regex_flag: 'i'
4132
4475
  device_replacement: '$1'
4133
4476
  brand_replacement: 'SonyEricsson'
@@ -4139,31 +4482,31 @@ device_parsers:
4139
4482
  # @ref: http://www.sonymobile.com/global-en/products/phones/
4140
4483
  # @ref: http://www.sony.jp/tablet/
4141
4484
  #########
4142
- - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
4485
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4143
4486
  device_replacement: 'Sony $1'
4144
4487
  brand_replacement: 'Sony'
4145
4488
  model_replacement: '$1'
4146
- - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
4489
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4147
4490
  device_replacement: 'Sony $1'
4148
4491
  brand_replacement: 'Sony'
4149
4492
  model_replacement: '$1'
4150
- - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4493
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4151
4494
  device_replacement: '$1 $2'
4152
4495
  brand_replacement: '$1'
4153
4496
  model_replacement: '$2'
4154
- - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
4497
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4155
4498
  device_replacement: '$1'
4156
4499
  brand_replacement: 'Sony'
4157
4500
  model_replacement: '$1'
4158
- - 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)'
4501
+ - regex: '; {0,2}(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)'
4159
4502
  device_replacement: '$1'
4160
4503
  brand_replacement: 'Sony'
4161
4504
  model_replacement: '$1'
4162
- - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4505
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4163
4506
  device_replacement: '$1'
4164
4507
  brand_replacement: 'Sony'
4165
4508
  model_replacement: '$1'
4166
- - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4509
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4167
4510
  device_replacement: '$1'
4168
4511
  brand_replacement: 'Sony'
4169
4512
  model_replacement: '$1'
@@ -4186,7 +4529,7 @@ device_parsers:
4186
4529
  # Spice
4187
4530
  # @ref: http://www.spicemobilephones.co.in/
4188
4531
  #########
4189
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4532
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4190
4533
  device_replacement: '$1$2$3$4'
4191
4534
  brand_replacement: 'Spice'
4192
4535
  model_replacement: 'Mi$4'
@@ -4195,7 +4538,7 @@ device_parsers:
4195
4538
  # Sprint (Operator Branded Devices)
4196
4539
  # @ref:
4197
4540
  #########
4198
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4541
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4199
4542
  device_replacement: '$1$2'
4200
4543
  brand_replacement: 'Sprint'
4201
4544
  model_replacement: '$2'
@@ -4208,7 +4551,7 @@ device_parsers:
4208
4551
  # Tagi
4209
4552
  # @ref: ??
4210
4553
  #########
4211
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4554
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4212
4555
  device_replacement: '$1$2$3'
4213
4556
  brand_replacement: 'Tagi'
4214
4557
  model_replacement: '$2$3'
@@ -4217,7 +4560,7 @@ device_parsers:
4217
4560
  # Tecmobile
4218
4561
  # @ref: http://www.tecmobile.com/
4219
4562
  #########
4220
- - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4563
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4221
4564
  device_replacement: 'Tecmobile $1'
4222
4565
  brand_replacement: 'Tecmobile'
4223
4566
  model_replacement: '$1'
@@ -4226,7 +4569,7 @@ device_parsers:
4226
4569
  # Tecno
4227
4570
  # @ref: www.tecno-mobile.com/‎
4228
4571
  #########
4229
- - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4572
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4230
4573
  device_replacement: '$1$2'
4231
4574
  brand_replacement: 'Tecno'
4232
4575
  model_replacement: '$2'
@@ -4235,7 +4578,7 @@ device_parsers:
4235
4578
  # Telechips, Techvision evaluation boards
4236
4579
  # @ref:
4237
4580
  #########
4238
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4581
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4239
4582
  regex_flag: 'i'
4240
4583
  device_replacement: '$1 $2'
4241
4584
  brand_replacement: '$1'
@@ -4246,7 +4589,7 @@ device_parsers:
4246
4589
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4247
4590
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4248
4591
  #########
4249
- - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4592
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4250
4593
  device_replacement: '$1'
4251
4594
  brand_replacement: 'Telstra'
4252
4595
  model_replacement: '$1'
@@ -4255,7 +4598,7 @@ device_parsers:
4255
4598
  # Terra
4256
4599
  # @ref: http://www.wortmann.de/
4257
4600
  #########
4258
- - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4601
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4259
4602
  device_replacement: 'Terra $1$2'
4260
4603
  brand_replacement: 'Terra'
4261
4604
  model_replacement: '$1$2'
@@ -4264,7 +4607,7 @@ device_parsers:
4264
4607
  # Texet
4265
4608
  # @ref: http://www.texet.ru/tablet/
4266
4609
  #########
4267
- - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4610
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4268
4611
  device_replacement: '$1'
4269
4612
  brand_replacement: 'Texet'
4270
4613
  model_replacement: '$1'
@@ -4273,11 +4616,11 @@ device_parsers:
4273
4616
  # Thalia
4274
4617
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4275
4618
  #########
4276
- - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4619
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4277
4620
  device_replacement: '$1'
4278
4621
  brand_replacement: 'Thalia'
4279
4622
  model_replacement: '$1'
4280
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4623
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4281
4624
  device_replacement: '$1'
4282
4625
  brand_replacement: 'Thalia'
4283
4626
  model_replacement: 'Tolino Shine'
@@ -4287,11 +4630,11 @@ device_parsers:
4287
4630
  # @ref: http://en.thl.com.cn/Mobile
4288
4631
  # @ref: http://thlmobilestore.com
4289
4632
  #########
4290
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4633
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4291
4634
  device_replacement: '$1 $2'
4292
4635
  brand_replacement: 'Thl'
4293
4636
  model_replacement: '$2'
4294
- - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4637
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4295
4638
  device_replacement: '$1'
4296
4639
  brand_replacement: 'Thl'
4297
4640
  model_replacement: '$1'
@@ -4300,28 +4643,28 @@ device_parsers:
4300
4643
  # T-Mobile (Operator Branded Devices)
4301
4644
  #########
4302
4645
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4303
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4646
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4304
4647
  device_replacement: '$1'
4305
4648
  brand_replacement: 'HTC'
4306
4649
  model_replacement: 'Hero'
4307
4650
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4308
- - regex: '; *(T-Mobile[ _]G2) Build'
4651
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4309
4652
  device_replacement: '$1'
4310
4653
  brand_replacement: 'HTC'
4311
4654
  model_replacement: 'Desire Z'
4312
- - regex: '; *(T-Mobile myTouch Q) Build'
4655
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4313
4656
  device_replacement: '$1'
4314
4657
  brand_replacement: 'Huawei'
4315
4658
  model_replacement: 'U8730'
4316
- - regex: '; *(T-Mobile myTouch) Build'
4659
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4317
4660
  device_replacement: '$1'
4318
4661
  brand_replacement: 'Huawei'
4319
4662
  model_replacement: 'U8680'
4320
- - regex: '; *(T-Mobile_Espresso) Build'
4663
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4321
4664
  device_replacement: '$1'
4322
4665
  brand_replacement: 'HTC'
4323
4666
  model_replacement: 'Espresso'
4324
- - regex: '; *(T-Mobile G1) Build'
4667
+ - regex: '; {0,2}(T-Mobile G1) Build'
4325
4668
  device_replacement: '$1'
4326
4669
  brand_replacement: 'HTC'
4327
4670
  model_replacement: 'Dream'
@@ -4329,11 +4672,11 @@ device_parsers:
4329
4672
  device_replacement: '$1$2 $3 $4'
4330
4673
  brand_replacement: 'HTC'
4331
4674
  model_replacement: '$2 $3 $4'
4332
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4675
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4333
4676
  device_replacement: '$1 $2 $3'
4334
4677
  brand_replacement: 'Tmobile'
4335
4678
  model_replacement: '$2 $3'
4336
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4679
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4337
4680
  device_replacement: '$1 $2'
4338
4681
  brand_replacement: 'Tmobile'
4339
4682
  model_replacement: '$2'
@@ -4351,7 +4694,7 @@ device_parsers:
4351
4694
  # Tooky
4352
4695
  # @ref: http://www.tookymobile.com/
4353
4696
  #########
4354
- - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4697
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4355
4698
  regex_flag: 'i'
4356
4699
  device_replacement: '$1 $2'
4357
4700
  brand_replacement: 'Tooky'
@@ -4366,11 +4709,11 @@ device_parsers:
4366
4709
  device_replacement: '$1'
4367
4710
  brand_replacement: 'Toshiba'
4368
4711
  model_replacement: 'Folio 100'
4369
- - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4712
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4370
4713
  device_replacement: '$1'
4371
4714
  brand_replacement: 'Toshiba'
4372
4715
  model_replacement: 'Folio 100'
4373
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4716
+ - regex: '; {0,2}(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]{1,100}|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4374
4717
  device_replacement: 'Toshiba $1'
4375
4718
  brand_replacement: 'Toshiba'
4376
4719
  model_replacement: '$1'
@@ -4379,12 +4722,12 @@ device_parsers:
4379
4722
  # Touchmate
4380
4723
  # @ref: http://touchmatepc.com/new/
4381
4724
  #########
4382
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4725
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4383
4726
  device_replacement: '$1'
4384
4727
  brand_replacement: 'Touchmate'
4385
4728
  model_replacement: '$1'
4386
4729
  # @todo: needs verification user-agents missing
4387
- - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4730
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4388
4731
  device_replacement: '$1'
4389
4732
  brand_replacement: 'Touchmate'
4390
4733
  model_replacement: '$1'
@@ -4393,11 +4736,11 @@ device_parsers:
4393
4736
  # Treq
4394
4737
  # @ref: http://www.treq.co.id/product
4395
4738
  #########
4396
- - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4739
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4397
4740
  device_replacement: '$1'
4398
4741
  brand_replacement: 'Treq'
4399
4742
  model_replacement: '$1'
4400
- - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4743
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4401
4744
  regex_flag: 'i'
4402
4745
  device_replacement: '$1$2'
4403
4746
  brand_replacement: 'Treq'
@@ -4409,21 +4752,40 @@ device_parsers:
4409
4752
  # @models: A936|A603|X-5|X-3
4410
4753
  #########
4411
4754
  # @todo: guessed markers
4412
- - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4755
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4413
4756
  device_replacement: '$1'
4414
4757
  brand_replacement: 'Umeox'
4415
4758
  model_replacement: '$1'
4416
4759
  # @todo: guessed markers
4417
- - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4760
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4418
4761
  device_replacement: '$1'
4419
4762
  brand_replacement: 'Umeox'
4420
4763
  model_replacement: '$1'
4421
4764
 
4765
+ #########
4766
+ # Vernee
4767
+ # @ref: http://vernee.cc/
4768
+ # @models: Thor - Thor E
4769
+ #########
4770
+ - regex: '; thor Build/'
4771
+ device_replacement: 'Thor'
4772
+ brand_replacement: 'Vernee'
4773
+ model_replacement: 'Thor'
4774
+ # Regex to modidy for Thor Plus (don't find example UA)
4775
+ - regex: '; Thor (E)? Build/'
4776
+ device_replacement: 'Thor $1'
4777
+ brand_replacement: 'Vernee'
4778
+ model_replacement: 'Thor'
4779
+ - regex: '; Apollo Lite Build/'
4780
+ device_replacement: 'Apollo Lite'
4781
+ brand_replacement: 'Vernee'
4782
+ model_replacement: 'Apollo'
4783
+
4422
4784
  #########
4423
4785
  # Versus
4424
4786
  # @ref: http://versusuk.com/support.html
4425
4787
  #########
4426
- - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4788
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4427
4789
  regex_flag: 'i'
4428
4790
  device_replacement: 'Versus $1'
4429
4791
  brand_replacement: 'Versus'
@@ -4433,7 +4795,7 @@ device_parsers:
4433
4795
  # Vertu
4434
4796
  # @ref: http://www.vertu.com/
4435
4797
  #########
4436
- - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4798
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4437
4799
  device_replacement: '$1 $2'
4438
4800
  brand_replacement: 'Vertu'
4439
4801
  model_replacement: '$2'
@@ -4442,7 +4804,7 @@ device_parsers:
4442
4804
  # Videocon
4443
4805
  # @ref: http://www.videoconmobiles.com
4444
4806
  #########
4445
- - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4807
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4446
4808
  device_replacement: '$1 $2'
4447
4809
  brand_replacement: 'Videocon'
4448
4810
  model_replacement: '$2'
@@ -4455,15 +4817,15 @@ device_parsers:
4455
4817
  # Viewsonic
4456
4818
  # @ref: http://viewsonic.com
4457
4819
  #########
4458
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4820
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4459
4821
  device_replacement: '$1'
4460
4822
  brand_replacement: 'Viewsonic'
4461
4823
  model_replacement: '$1'
4462
- - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4824
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4463
4825
  device_replacement: '$1$2'
4464
4826
  brand_replacement: 'Viewsonic'
4465
4827
  model_replacement: '$2'
4466
- - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4828
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4467
4829
  device_replacement: '$1'
4468
4830
  brand_replacement: 'Viewsonic'
4469
4831
  model_replacement: '$1'
@@ -4472,7 +4834,7 @@ device_parsers:
4472
4834
  # vivo
4473
4835
  # @ref: http://vivo.cn/
4474
4836
  #########
4475
- - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4837
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4476
4838
  device_replacement: '$1 $2'
4477
4839
  brand_replacement: 'vivo'
4478
4840
  model_replacement: '$2'
@@ -4481,7 +4843,7 @@ device_parsers:
4481
4843
  # Vodafone (Operator Branded Devices)
4482
4844
  # @ref: ??
4483
4845
  #########
4484
- - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4846
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4485
4847
  device_replacement: '$1 $2'
4486
4848
  brand_replacement: '$1'
4487
4849
  model_replacement: '$2'
@@ -4490,7 +4852,7 @@ device_parsers:
4490
4852
  # Walton
4491
4853
  # @ref: http://www.waltonbd.com/
4492
4854
  #########
4493
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4855
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4494
4856
  regex_flag: 'i'
4495
4857
  device_replacement: 'Walton $1'
4496
4858
  brand_replacement: 'Walton'
@@ -4500,7 +4862,7 @@ device_parsers:
4500
4862
  # Wiko
4501
4863
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4502
4864
  #########
4503
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
4865
+ - regex: '; {0,2}(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4504
4866
  regex_flag: 'i'
4505
4867
  device_replacement: 'Wiko $1'
4506
4868
  brand_replacement: 'Wiko'
@@ -4510,7 +4872,7 @@ device_parsers:
4510
4872
  # WellcoM
4511
4873
  # @ref: ??
4512
4874
  #########
4513
- - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4875
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4514
4876
  device_replacement: 'Wellcom $1'
4515
4877
  brand_replacement: 'Wellcom'
4516
4878
  model_replacement: '$1'
@@ -4528,7 +4890,7 @@ device_parsers:
4528
4890
  # Wolfgang
4529
4891
  # @ref: http://wolfgangmobile.com/
4530
4892
  #########
4531
- - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4893
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4532
4894
  device_replacement: 'Wolfgang $1'
4533
4895
  brand_replacement: 'Wolfgang'
4534
4896
  model_replacement: '$1'
@@ -4537,7 +4899,7 @@ device_parsers:
4537
4899
  # Woxter
4538
4900
  # @ref: http://www.woxter.es/es-es/categories/index
4539
4901
  #########
4540
- - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4902
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4541
4903
  device_replacement: 'Woxter $1'
4542
4904
  brand_replacement: 'Woxter'
4543
4905
  model_replacement: '$1'
@@ -4546,7 +4908,7 @@ device_parsers:
4546
4908
  # Yarvik Zania
4547
4909
  # @ref: http://yarvik.com
4548
4910
  #########
4549
- - 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)'
4911
+ - regex: '; {0,2}(?: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)'
4550
4912
  device_replacement: 'Yarvik $1'
4551
4913
  brand_replacement: 'Yarvik'
4552
4914
  model_replacement: '$1'
@@ -4560,7 +4922,7 @@ device_parsers:
4560
4922
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4561
4923
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4562
4924
  #########
4563
- - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4925
+ - regex: '; {0,2}([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4564
4926
  device_replacement: 'Yifang $1$2$3'
4565
4927
  brand_replacement: 'Yifang'
4566
4928
  model_replacement: '$2'
@@ -4569,19 +4931,19 @@ device_parsers:
4569
4931
  # XiaoMi
4570
4932
  # @ref: http://www.xiaomi.com/event/buyphone
4571
4933
  #########
4572
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4934
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4573
4935
  device_replacement: 'XiaoMi $1'
4574
4936
  brand_replacement: 'XiaoMi'
4575
4937
  model_replacement: '$1'
4576
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4938
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4577
4939
  device_replacement: 'XiaoMi $1'
4578
4940
  brand_replacement: 'XiaoMi'
4579
4941
  model_replacement: '$1'
4580
- - regex: '; *(MIX) (Build|MIUI)/'
4942
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4581
4943
  device_replacement: 'XiaoMi $1'
4582
4944
  brand_replacement: 'XiaoMi'
4583
4945
  model_replacement: '$1'
4584
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4946
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4585
4947
  device_replacement: 'XiaoMi $1'
4586
4948
  brand_replacement: 'XiaoMi'
4587
4949
  model_replacement: '$1'
@@ -4590,17 +4952,17 @@ device_parsers:
4590
4952
  # Xolo
4591
4953
  # @ref: http://www.xolo.in/
4592
4954
  #########
4593
- - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4955
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4594
4956
  regex_flag: 'i'
4595
4957
  device_replacement: 'Xolo $1'
4596
4958
  brand_replacement: 'Xolo'
4597
4959
  model_replacement: '$1'
4598
- - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4960
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4599
4961
  regex_flag: 'i'
4600
4962
  device_replacement: 'Xolo $1'
4601
4963
  brand_replacement: 'Xolo'
4602
4964
  model_replacement: '$1'
4603
- - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4965
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4604
4966
  regex_flag: 'i'
4605
4967
  device_replacement: 'Xolo $1'
4606
4968
  brand_replacement: 'Xolo'
@@ -4610,7 +4972,7 @@ device_parsers:
4610
4972
  # Xoro
4611
4973
  # @ref: http://www.xoro.de/produkte/
4612
4974
  #########
4613
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4975
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4614
4976
  device_replacement: 'Xoro $1'
4615
4977
  brand_replacement: 'Xoro'
4616
4978
  model_replacement: '$1'
@@ -4619,7 +4981,7 @@ device_parsers:
4619
4981
  # Zopo
4620
4982
  # @ref: http://www.zopomobiles.com/products.html
4621
4983
  #########
4622
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4984
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4623
4985
  device_replacement: '$1$2$3'
4624
4986
  brand_replacement: 'Zopo'
4625
4987
  model_replacement: '$1$2$3'
@@ -4628,11 +4990,11 @@ device_parsers:
4628
4990
  # ZiiLabs
4629
4991
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4630
4992
  #########
4631
- - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4993
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4632
4994
  device_replacement: '$1 $2'
4633
4995
  brand_replacement: 'ZiiLabs'
4634
4996
  model_replacement: '$2'
4635
- - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4997
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4636
4998
  device_replacement: '$1 $2'
4637
4999
  brand_replacement: 'ZiiLabs'
4638
5000
  model_replacement: '$2'
@@ -4641,36 +5003,36 @@ device_parsers:
4641
5003
  # ZTE
4642
5004
  # @ref: http://www.ztedevices.com/
4643
5005
  #########
4644
- - 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)'
5006
+ - regex: '; {0,2}(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]{0,200}?|Era|Memo[^;]{0,200}?)|JOE|(?:Kis|KIS)\b[^;]{0,200}?|Libra|Light [^;]{0,200}?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]{0,200}?|RacerII|RACERII|San Francisco[^;]{0,200}?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4645
5007
  device_replacement: '$1'
4646
5008
  brand_replacement: 'ZTE'
4647
5009
  model_replacement: '$1'
4648
- - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
5010
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4649
5011
  device_replacement: '$1'
4650
5012
  brand_replacement: 'ZTE'
4651
5013
  model_replacement: '$1'
4652
- - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
5014
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4653
5015
  device_replacement: '$1'
4654
5016
  brand_replacement: 'ZTE'
4655
5017
  model_replacement: '$1'
4656
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
5018
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4657
5019
  device_replacement: 'ZTE Blade$1'
4658
5020
  brand_replacement: 'ZTE'
4659
5021
  model_replacement: 'Blade$1'
4660
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
5022
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4661
5023
  device_replacement: 'ZTE Skate$1'
4662
5024
  brand_replacement: 'ZTE'
4663
5025
  model_replacement: 'Skate$1'
4664
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
5026
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4665
5027
  device_replacement: '$1$2'
4666
5028
  brand_replacement: 'ZTE'
4667
5029
  model_replacement: '$1$2'
4668
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
5030
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4669
5031
  device_replacement: 'ZTE $1'
4670
5032
  brand_replacement: 'ZTE'
4671
5033
  model_replacement: '$1'
4672
5034
  # operator specific
4673
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
5035
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4674
5036
  device_replacement: '$1 $2'
4675
5037
  brand_replacement: 'ZTE'
4676
5038
  model_replacement: '$1 $2'
@@ -4679,7 +5041,7 @@ device_parsers:
4679
5041
  device_replacement: '$1'
4680
5042
  brand_replacement: 'ZTE'
4681
5043
  model_replacement: '$1'
4682
- - regex: '; *(vp9plus)\)'
5044
+ - regex: '; {0,2}(vp9plus)\)'
4683
5045
  device_replacement: '$1'
4684
5046
  brand_replacement: 'ZTE'
4685
5047
  model_replacement: '$1'
@@ -4739,7 +5101,7 @@ device_parsers:
4739
5101
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4740
5102
  brand_replacement: 'Amazon'
4741
5103
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4742
- - regex: '; ?Amazon ([^;/]+) Build\b'
5104
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4743
5105
  device_replacement: '$1'
4744
5106
  brand_replacement: 'Amazon'
4745
5107
  model_replacement: '$1'
@@ -4762,22 +5124,22 @@ device_parsers:
4762
5124
 
4763
5125
  #########
4764
5126
  # Devices from chinese manufacturer(s)
4765
- # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
5127
+ # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.{0,200}
4766
5128
  #########
4767
- - regex: '(sprd)\-([^/]+)/'
5129
+ - regex: '(sprd)\-([^/]{1,50})/'
4768
5130
  device_replacement: '$1 $2'
4769
5131
  brand_replacement: '$1'
4770
5132
  model_replacement: '$2'
4771
5133
  # @ref: http://eshinechina.en.alibaba.com/
4772
- - regex: '; *(H\d{2}00\+?) Build'
5134
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4773
5135
  device_replacement: '$1'
4774
5136
  brand_replacement: 'Hero'
4775
5137
  model_replacement: '$1'
4776
- - regex: '; *(iphone|iPhone5) Build/'
5138
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4777
5139
  device_replacement: 'Xianghe $1'
4778
5140
  brand_replacement: 'Xianghe'
4779
5141
  model_replacement: '$1'
4780
- - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
5142
+ - regex: '; {0,2}(e\d{4}[a-z]?_?v\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/'
4781
5143
  device_replacement: 'Xianghe $1'
4782
5144
  brand_replacement: 'Xianghe'
4783
5145
  model_replacement: '$1'
@@ -4799,7 +5161,7 @@ device_parsers:
4799
5161
  #########
4800
5162
  # Alcatel Windows Phones
4801
5163
  #########
4802
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
5164
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\)]+)'
4803
5165
  device_replacement: 'Alcatel $1'
4804
5166
  brand_replacement: 'Alcatel'
4805
5167
  model_replacement: '$1'
@@ -4807,8 +5169,7 @@ device_parsers:
4807
5169
  #########
4808
5170
  # Asus Windows Phones
4809
5171
  #########
4810
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4811
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
5172
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\)]+)'
4812
5173
  device_replacement: 'Asus $1'
4813
5174
  brand_replacement: 'Asus'
4814
5175
  model_replacement: '$1'
@@ -4816,7 +5177,7 @@ device_parsers:
4816
5177
  #########
4817
5178
  # Dell Windows Phones
4818
5179
  #########
4819
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
5180
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\)]+)'
4820
5181
  device_replacement: 'Dell $1'
4821
5182
  brand_replacement: 'Dell'
4822
5183
  model_replacement: '$1'
@@ -4824,7 +5185,7 @@ device_parsers:
4824
5185
  #########
4825
5186
  # HTC Windows Phones
4826
5187
  #########
4827
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
5188
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\)]+)'
4828
5189
  device_replacement: 'HTC $1'
4829
5190
  brand_replacement: 'HTC'
4830
5191
  model_replacement: '$1'
@@ -4832,7 +5193,7 @@ device_parsers:
4832
5193
  #########
4833
5194
  # Huawei Windows Phones
4834
5195
  #########
4835
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
5196
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\)]+)'
4836
5197
  device_replacement: 'Huawei $1'
4837
5198
  brand_replacement: 'Huawei'
4838
5199
  model_replacement: '$1'
@@ -4840,7 +5201,7 @@ device_parsers:
4840
5201
  #########
4841
5202
  # LG Windows Phones
4842
5203
  #########
4843
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
5204
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \-]|)([^;,\)]+)'
4844
5205
  device_replacement: 'LG $1'
4845
5206
  brand_replacement: 'LG'
4846
5207
  model_replacement: '$1'
@@ -4848,15 +5209,15 @@ device_parsers:
4848
5209
  #########
4849
5210
  # Noka Windows Phones
4850
5211
  #########
4851
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
5212
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4852
5213
  device_replacement: 'Lumia $1'
4853
5214
  brand_replacement: 'Nokia'
4854
5215
  model_replacement: 'Lumia $1'
4855
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
5216
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\d{3,})'
4856
5217
  device_replacement: 'Nokia $1'
4857
5218
  brand_replacement: 'Nokia'
4858
5219
  model_replacement: '$1'
4859
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
5220
+ - regex: '(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
4860
5221
  device_replacement: 'Nokia $1'
4861
5222
  brand_replacement: 'Nokia'
4862
5223
  model_replacement: '$1'
@@ -4864,7 +5225,7 @@ device_parsers:
4864
5225
  #########
4865
5226
  # Microsoft Windows Phones
4866
5227
  #########
4867
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
5228
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\)]+)'
4868
5229
  device_replacement: 'Microsoft $1'
4869
5230
  brand_replacement: 'Microsoft'
4870
5231
  model_replacement: '$1'
@@ -4872,7 +5233,7 @@ device_parsers:
4872
5233
  #########
4873
5234
  # Samsung Windows Phones
4874
5235
  #########
4875
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
5236
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\.\)]+)'
4876
5237
  device_replacement: 'Samsung $1'
4877
5238
  brand_replacement: 'Samsung'
4878
5239
  model_replacement: '$1'
@@ -4880,7 +5241,7 @@ device_parsers:
4880
5241
  #########
4881
5242
  # Toshiba Windows Phones
4882
5243
  #########
4883
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
5244
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\)]+)'
4884
5245
  device_replacement: 'Toshiba $1'
4885
5246
  brand_replacement: 'Toshiba'
4886
5247
  model_replacement: '$1'
@@ -4888,7 +5249,7 @@ device_parsers:
4888
5249
  #########
4889
5250
  # Generic Windows Phones
4890
5251
  #########
4891
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
5252
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\)]+)'
4892
5253
  device_replacement: '$1 $2'
4893
5254
  brand_replacement: '$1'
4894
5255
  model_replacement: '$2'
@@ -4900,7 +5261,7 @@ device_parsers:
4900
5261
  #########
4901
5262
  # Samsung Bada Phones
4902
5263
  #########
4903
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5264
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4904
5265
  device_replacement: 'Samsung $1'
4905
5266
  brand_replacement: 'Samsung'
4906
5267
  model_replacement: '$1'
@@ -4908,11 +5269,11 @@ device_parsers:
4908
5269
  #########
4909
5270
  # Firefox OS
4910
5271
  #########
4911
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5272
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4912
5273
  device_replacement: 'Alcatel $1 $2 $3'
4913
5274
  brand_replacement: 'Alcatel'
4914
5275
  model_replacement: 'One Touch $3'
4915
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5276
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4916
5277
  device_replacement: 'ZTE $1$2'
4917
5278
  brand_replacement: 'ZTE'
4918
5279
  model_replacement: '$1$2'
@@ -4920,15 +5281,15 @@ device_parsers:
4920
5281
  #########
4921
5282
  # KaiOS
4922
5283
  #########
4923
- - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
5284
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
4924
5285
  device_replacement: 'Alcatel $1'
4925
5286
  brand_replacement: 'Alcatel'
4926
5287
  model_replacement: '$1'
4927
- - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5288
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4928
5289
  device_replacement: 'LYF $1'
4929
5290
  brand_replacement: 'LYF'
4930
5291
  model_replacement: '$1'
4931
- - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5292
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4932
5293
  device_replacement: 'Nokia $1'
4933
5294
  brand_replacement: 'Nokia'
4934
5295
  model_replacement: '$1'
@@ -4941,7 +5302,7 @@ device_parsers:
4941
5302
  device_replacement: 'Nokia $1'
4942
5303
  brand_replacement: 'Nokia'
4943
5304
  model_replacement: '$1$2'
4944
- - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
5305
+ - regex: '(?:NOKIA|Nokia)(?:\-| {0,2})(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
4945
5306
  device_replacement: 'Nokia $1$2$3'
4946
5307
  brand_replacement: 'Nokia'
4947
5308
  model_replacement: '$1$2$3'
@@ -4950,12 +5311,12 @@ device_parsers:
4950
5311
  brand_replacement: 'Nokia'
4951
5312
  model_replacement: 'Lumia $1'
4952
5313
  # UCWEB Browser on Symbian
4953
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
5314
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\)'
4954
5315
  device_replacement: '$1 $2'
4955
5316
  brand_replacement: '$1'
4956
5317
  model_replacement: '$2'
4957
5318
  # Nokia Symbian
4958
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5319
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4959
5320
  device_replacement: 'Nokia $1'
4960
5321
  brand_replacement: 'Nokia'
4961
5322
  model_replacement: '$1'
@@ -4968,7 +5329,7 @@ device_parsers:
4968
5329
  device_replacement: 'BlackBerry $1'
4969
5330
  brand_replacement: 'BlackBerry'
4970
5331
  model_replacement: '$1'
4971
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5332
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4972
5333
  device_replacement: 'BlackBerry Playbook'
4973
5334
  brand_replacement: 'BlackBerry'
4974
5335
  model_replacement: 'Playbook'
@@ -5000,7 +5361,7 @@ device_parsers:
5000
5361
  device_replacement: 'Palm Treo $1'
5001
5362
  brand_replacement: 'Palm'
5002
5363
  model_replacement: 'Treo $1'
5003
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5364
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
5004
5365
  device_replacement: 'HP Veer'
5005
5366
  brand_replacement: 'HP'
5006
5367
  model_replacement: 'Veer'
@@ -5008,7 +5369,7 @@ device_parsers:
5008
5369
  device_replacement: 'HP TouchPad'
5009
5370
  brand_replacement: 'HP'
5010
5371
  model_replacement: 'TouchPad'
5011
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5372
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
5012
5373
  device_replacement: 'HP iPAQ $1'
5013
5374
  brand_replacement: 'HP'
5014
5375
  model_replacement: 'iPAQ $1'
@@ -5076,18 +5437,18 @@ device_parsers:
5076
5437
  brand_replacement: 'Apple'
5077
5438
  model_replacement: 'iPhone'
5078
5439
  # @note: desktop applications show device info
5079
- - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5440
+ - regex: 'CFNetwork/.{0,100} Darwin/\d.{0,100}\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5080
5441
  device_replacement: '$1$2,$3'
5081
5442
  brand_replacement: 'Apple'
5082
5443
  model_replacement: '$1$2,$3'
5083
5444
  # @note: newer desktop applications don't show device info
5084
5445
  # This is here so as to not have them recorded as iOS-Device
5085
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5446
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5086
5447
  device_replacement: 'Mac'
5087
5448
  brand_replacement: 'Apple'
5088
5449
  model_replacement: 'Mac'
5089
5450
  # @note: iOS applications do not show device info
5090
- - regex: 'CFNetwork/.* Darwin/\d'
5451
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
5091
5452
  device_replacement: 'iOS-Device'
5092
5453
  brand_replacement: 'Apple'
5093
5454
  model_replacement: 'iOS-Device'
@@ -5131,7 +5492,7 @@ device_parsers:
5131
5492
  device_replacement: 'Asus $1'
5132
5493
  brand_replacement: 'Asus'
5133
5494
  model_replacement: '$1'
5134
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5495
+ - regex: '(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5135
5496
  device_replacement: 'Asus $1'
5136
5497
  brand_replacement: 'Asus'
5137
5498
  model_replacement: '$1'
@@ -5164,11 +5525,11 @@ device_parsers:
5164
5525
  device_replacement: 'DoCoMo $1'
5165
5526
  brand_replacement: 'DoCoMo'
5166
5527
  model_replacement: '$1'
5167
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5528
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
5168
5529
  device_replacement: 'DoCoMo $1'
5169
5530
  brand_replacement: 'DoCoMo'
5170
5531
  model_replacement: '$1'
5171
- - regex: '([A-Za-z0-9]+);FOMA'
5532
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
5172
5533
  device_replacement: 'DoCoMo $1'
5173
5534
  brand_replacement: 'DoCoMo'
5174
5535
  model_replacement: '$1'
@@ -5176,7 +5537,7 @@ device_parsers:
5176
5537
  ##########
5177
5538
  # htc
5178
5539
  ##########
5179
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5540
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5180
5541
  device_replacement: 'HTC $1'
5181
5542
  brand_replacement: 'HTC'
5182
5543
  model_replacement: '$1'
@@ -5237,18 +5598,18 @@ device_parsers:
5237
5598
  device_replacement: '$1'
5238
5599
  brand_replacement: '$2'
5239
5600
  model_replacement: '$3'
5240
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
5601
+ - regex: '(HbbTV)/1\.1\.1.{0,200}CE-HTML/1\.\d;(Vendor/|)(THOM[^;]{0,200}?)[;\s].{0,30}(LF[^;]{1,200});?'
5241
5602
  device_replacement: '$1'
5242
5603
  brand_replacement: 'Thomson'
5243
5604
  model_replacement: '$4'
5244
- - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
5605
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); {0,2}CE-HTML(?:/1\.\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});'
5245
5606
  device_replacement: '$1'
5246
5607
  brand_replacement: '$2'
5247
5608
  model_replacement: '$3'
5248
5609
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5249
5610
  device_replacement: '$1'
5250
5611
  brand_replacement: 'Samsung'
5251
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})'
5612
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5252
5613
  device_replacement: '$1'
5253
5614
  brand_replacement: '$2$3'
5254
5615
  model_replacement: '$4'
@@ -5258,7 +5619,7 @@ device_parsers:
5258
5619
  ##########
5259
5620
  # LGE NetCast TV
5260
5621
  ##########
5261
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5622
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5262
5623
  device_replacement: 'NetCast$2'
5263
5624
  brand_replacement: 'LG'
5264
5625
  model_replacement: '$1'
@@ -5266,11 +5627,11 @@ device_parsers:
5266
5627
  ##########
5267
5628
  # InettvBrowser
5268
5629
  ##########
5269
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
5630
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5270
5631
  device_replacement: 'Inettv'
5271
5632
  brand_replacement: '$1'
5272
5633
  model_replacement: '$2'
5273
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
5634
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5274
5635
  device_replacement: 'Inettv'
5275
5636
  brand_replacement: 'Generic_Inettv'
5276
5637
  model_replacement: '$1'
@@ -5307,7 +5668,7 @@ device_parsers:
5307
5668
  device_replacement: 'Microsoft $1'
5308
5669
  brand_replacement: 'Microsoft'
5309
5670
  model_replacement: '$1'
5310
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5671
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5311
5672
  device_replacement: '$1'
5312
5673
  brand_replacement: 'Microsoft'
5313
5674
  model_replacement: '$1'
@@ -5331,6 +5692,15 @@ device_parsers:
5331
5692
  device_replacement: 'Motorola $1'
5332
5693
  brand_replacement: 'Motorola'
5333
5694
  model_replacement: '$1'
5695
+ - regex: '; (moto[ a-zA-z0-9()]{0,50});((?: Build|.{0,50}\) AppleWebKit))'
5696
+ device_replacement: '$1'
5697
+ brand_replacement: 'Motorola'
5698
+ model_replacement: '$1'
5699
+ - regex: '; {0,2}(moto)(.{0,50})(?: Build|\) AppleWebKit)'
5700
+ device_replacement: 'Motorola$2'
5701
+ brand_replacement: 'Motorola'
5702
+ model_replacement: '$2'
5703
+
5334
5704
 
5335
5705
  ##########
5336
5706
  # nintendo
@@ -5339,7 +5709,7 @@ device_parsers:
5339
5709
  device_replacement: 'Nintendo Wii U'
5340
5710
  brand_replacement: 'Nintendo'
5341
5711
  model_replacement: 'Wii U'
5342
- - regex: 'Nintendo (DS|3DS|DSi|Wii);'
5712
+ - regex: 'Nintendo (Switch|DS|3DS|DSi|Wii);'
5343
5713
  device_replacement: 'Nintendo $1'
5344
5714
  brand_replacement: 'Nintendo'
5345
5715
  model_replacement: '$1'
@@ -5368,12 +5738,12 @@ device_parsers:
5368
5738
  # Samsung
5369
5739
  ##########
5370
5740
  # Samsung Smart-TV
5371
- - regex: '(SMART-TV); .* Tizen '
5741
+ - regex: '(SMART-TV); .{0,200} Tizen '
5372
5742
  device_replacement: 'Samsung $1'
5373
5743
  brand_replacement: 'Samsung'
5374
5744
  model_replacement: '$1'
5375
5745
  # Samsung Symbian Devices
5376
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5746
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5377
5747
  device_replacement: 'Samsung $1'
5378
5748
  brand_replacement: 'Samsung'
5379
5749
  model_replacement: '$1'
@@ -5381,7 +5751,7 @@ device_parsers:
5381
5751
  device_replacement: '$1 $2$3'
5382
5752
  brand_replacement: '$1'
5383
5753
  model_replacement: '$2-$3'
5384
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5754
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5385
5755
  device_replacement: '$1'
5386
5756
  brand_replacement: 'Samsung'
5387
5757
  model_replacement: '$1'
@@ -5428,7 +5798,7 @@ device_parsers:
5428
5798
  ##########
5429
5799
  # Sony
5430
5800
  ##########
5431
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5801
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5432
5802
  device_replacement: '$2 $1'
5433
5803
  brand_replacement: '$2'
5434
5804
  model_replacement: '$1'
@@ -5462,33 +5832,33 @@ device_parsers:
5462
5832
  #########
5463
5833
  # Android General Device Matching (far from perfect)
5464
5834
  #########
5465
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
5835
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\))'
5466
5836
  brand_replacement: 'Generic_Android'
5467
5837
  model_replacement: '$1'
5468
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
5838
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5469
5839
  brand_replacement: 'Generic_Android'
5470
5840
  model_replacement: '$1'
5471
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
5841
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5472
5842
  brand_replacement: 'Generic_Android'
5473
5843
  model_replacement: '$1'
5474
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
5844
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{0,2}\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5475
5845
  brand_replacement: 'Generic_Android'
5476
5846
  model_replacement: '$1'
5477
5847
  # No build info at all - "Build" follows locale immediately
5478
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5848
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5479
5849
  device_replacement: 'Generic Smartphone'
5480
5850
  brand_replacement: 'Generic'
5481
5851
  model_replacement: 'Smartphone'
5482
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5852
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,3}\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\))'
5483
5853
  brand_replacement: 'Generic_Android'
5484
5854
  model_replacement: '$1'
5485
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5855
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5486
5856
  brand_replacement: 'Generic_Android'
5487
5857
  model_replacement: '$1'
5488
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5858
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5489
5859
  brand_replacement: 'Generic_Android_Tablet'
5490
5860
  model_replacement: '$1'
5491
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5861
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5492
5862
  brand_replacement: 'Generic_Android'
5493
5863
  model_replacement: '$1'
5494
5864
 
@@ -5513,7 +5883,7 @@ device_parsers:
5513
5883
  ##########
5514
5884
  # Generic Tablet
5515
5885
  ##########
5516
- - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
5886
+ - regex: '(Android 3\.\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))'
5517
5887
  regex_flag: 'i'
5518
5888
  device_replacement: 'Generic Tablet'
5519
5889
  brand_replacement: 'Generic'
@@ -5522,7 +5892,7 @@ device_parsers:
5522
5892
  ##########
5523
5893
  # Generic Smart Phone
5524
5894
  ##########
5525
- - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\(webOS/|PalmOS)'
5895
+ - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .{1,200}Firefox/|iPhone OS|Android|MobileSafari|Windows {0,2}Phone|\(webOS/|PalmOS)'
5526
5896
  device_replacement: 'Generic Smartphone'
5527
5897
  brand_replacement: 'Generic'
5528
5898
  model_replacement: 'Smartphone'
@@ -5535,7 +5905,7 @@ device_parsers:
5535
5905
  ##########
5536
5906
  # Spiders (this is a hack...)
5537
5907
  ##########
5538
- - 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)'
5908
+ - regex: '^.{0,100}(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.{0,200}/\+/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)'
5539
5909
  regex_flag: 'i'
5540
5910
  device_replacement: 'Spider'
5541
5911
  brand_replacement: 'Spider'