@hyperwatch/useragent 3.7.4 → 3.9.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.
@@ -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+)|)'
@@ -95,7 +95,7 @@ user_agent_parsers:
95
95
  family_replacement: 'Tableau'
96
96
 
97
97
  # Adobe CreativeCloud
98
- - regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
98
+ - regex: 'AppleWebKit/\d{1,10}\.\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\d+)\.(\d+).(\d+)'
99
99
  family_replacement: 'Adobe CreativeCloud'
100
100
 
101
101
  # Salesforce
@@ -110,7 +110,7 @@ user_agent_parsers:
110
110
  family_replacement: 'FacebookBot'
111
111
 
112
112
  # Google Plus
113
- - regex: 'Google.*/\+/web/snippet'
113
+ - regex: 'Google.{0,50}/\+/web/snippet'
114
114
  family_replacement: 'GooglePlusBot'
115
115
 
116
116
  # Gmail
@@ -128,24 +128,24 @@ user_agent_parsers:
128
128
  # Bots Pattern 'name/0.0.0'
129
129
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
130
130
  # 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+)|)'
131
+ - 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
132
 
133
133
  # MSIECrawler
134
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
134
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
135
135
  family_replacement: 'MSIECrawler'
136
136
 
137
137
  # DAVdroid
138
138
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
139
139
 
140
140
  # 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+)|)|)'
141
+ - 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
142
 
143
143
  # Pinterestbot
144
144
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
145
145
  family_replacement: 'Pinterestbot'
146
146
 
147
147
  # 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+)|)|)|)'
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|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
149
 
150
150
  # AWS S3 Clients
151
151
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
@@ -166,21 +166,22 @@ user_agent_parsers:
166
166
  # Facebook
167
167
  # Must come before "Bots General matcher" to catch OrangeBotswana
168
168
  # Facebook Messenger must go before Facebook
169
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
169
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
170
+
170
171
  family_replacement: 'Facebook Messenger'
171
172
  # Facebook
172
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
174
  family_replacement: 'Facebook'
174
175
  # Sometimes Facebook does not specify a version (FBAV)
175
- - regex: '\[FB.*;'
176
+ - regex: '\[FB.{0,300};'
176
177
  family_replacement: 'Facebook'
177
178
 
178
179
  # 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+)|)|)'
180
+ - 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
181
  # 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+)|)|)'
182
+ - regex: '^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
182
183
  # 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+)|)|)'
184
+ - 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
185
 
185
186
  # HbbTV standard defines what features the browser should understand.
186
187
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -196,32 +197,32 @@ user_agent_parsers:
196
197
 
197
198
  # Social Networks (non-Facebook)
198
199
  # Pinterest
199
- - regex: '\[(Pinterest)/[^\]]+\]'
200
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
200
201
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
201
202
  # Instagram app
202
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
203
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
203
204
  # Flipboard app
204
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
206
  # Flipboard-briefing app
206
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
208
  # Onefootball app
208
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
210
  # Snapchat
210
211
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
211
212
  # Twitter
212
213
  - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
213
214
  family_replacement: 'Twitter'
214
215
 
216
+ # Phantom app
217
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|android).(\d+)\.(\d+)\.(\d+)'
218
+ family_replacement: 'Phantom'
219
+
215
220
  # aspiegel.com spider (owned by Huawei)
216
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
221
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
217
222
  family_replacement: 'Spider'
218
- brand_replacement: 'Spider'
219
- model_replacement: 'Smartphone'
220
223
 
221
224
  - regex: 'AspiegelBot'
222
225
  family_replacement: 'Spider'
223
- brand_replacement: 'Spider'
224
- model_replacement: 'Desktop'
225
226
 
226
227
  # Basilisk
227
228
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -238,7 +239,7 @@ user_agent_parsers:
238
239
  family_replacement: 'Firefox Mobile'
239
240
  - regex: '(Fennec)/(\d+)\.(\d+)'
240
241
  family_replacement: 'Firefox Mobile'
241
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
242
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
242
243
  family_replacement: 'Firefox Mobile'
243
244
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
244
245
  family_replacement: 'Firefox ($1)'
@@ -252,7 +253,7 @@ user_agent_parsers:
252
253
  family_replacement: 'Firefox Beta'
253
254
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
254
255
  family_replacement: 'Firefox ($1)'
255
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
256
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
256
257
  family_replacement: 'MicroB'
257
258
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
258
259
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -284,24 +285,24 @@ user_agent_parsers:
284
285
 
285
286
  # Opera will stop at 9.80 and hide the real version in the Version string.
286
287
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
287
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
288
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
288
289
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
289
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
290
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
290
291
  family_replacement: 'Opera Mobile'
291
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
292
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
292
293
  family_replacement: 'Opera Mobile'
293
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
294
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
294
295
  family_replacement: 'Opera Mobile'
295
296
  - regex: 'Opera Mobi'
296
297
  family_replacement: 'Opera Mobile'
297
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
298
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
298
299
 
299
300
  # Opera 14 for Android uses a WebKit render engine.
300
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
301
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
301
302
  family_replacement: 'Opera Mobile'
302
303
 
303
304
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
304
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
305
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
305
306
  family_replacement: 'Opera'
306
307
 
307
308
  # Opera Coast
@@ -313,7 +314,7 @@ user_agent_parsers:
313
314
  family_replacement: 'Opera Mini'
314
315
 
315
316
  # Opera Neon
316
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
317
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
317
318
  family_replacement: 'Opera Neon'
318
319
 
319
320
  # Palm WebOS looks a lot like Safari.
@@ -360,7 +361,7 @@ user_agent_parsers:
360
361
 
361
362
  - regex: '(Symphony) (\d+).(\d+)'
362
363
 
363
- - regex: 'PLAYSTATION 3.+WebKit'
364
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
364
365
  family_replacement: 'NetFront NX'
365
366
  - regex: 'PLAYSTATION 3'
366
367
  family_replacement: 'NetFront'
@@ -369,7 +370,7 @@ user_agent_parsers:
369
370
  - regex: '(PlayStation Vita)'
370
371
  family_replacement: 'NetFront NX'
371
372
 
372
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
373
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
373
374
  family_replacement: 'NetFront NX'
374
375
  - regex: '(Nintendo 3DS)'
375
376
  family_replacement: 'NetFront NX'
@@ -382,9 +383,9 @@ user_agent_parsers:
382
383
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
383
384
 
384
385
  # Edge Mobile
385
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
386
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
386
387
  family_replacement: 'Edge Mobile'
387
- - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
388
+ - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
388
389
  family_replacement: 'Edge Mobile'
389
390
 
390
391
  # Samsung Internet (based on Chrome, but lacking some features)
@@ -430,7 +431,7 @@ user_agent_parsers:
430
431
  family_replacement: 'TopBuzz'
431
432
 
432
433
  # Google Search App on Android, eg:
433
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
434
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
434
435
  family_replacement: 'Google'
435
436
 
436
437
  # QQ Browsers
@@ -441,10 +442,18 @@ user_agent_parsers:
441
442
  - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
442
443
  family_replacement: 'QQ Browser'
443
444
 
445
+ # DuckDuckGo
446
+ - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)'
447
+ family_replacement: 'DuckDuckGo Mobile'
448
+
449
+ # Tenta Browser
450
+ - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
451
+ family_replacement: 'Tenta Browser'
452
+
444
453
  # Chrome Mobile
445
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
454
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
446
455
  family_replacement: 'Chrome Mobile WebView'
447
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
456
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
448
457
  family_replacement: 'Chrome Mobile WebView'
449
458
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
459
  family_replacement: 'Chrome Mobile'
@@ -452,7 +461,7 @@ user_agent_parsers:
452
461
  family_replacement: 'Chrome Mobile iOS'
453
462
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
454
463
  family_replacement: 'Chrome Mobile'
455
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
464
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
456
465
  family_replacement: 'Chrome Mobile'
457
466
 
458
467
  # Chrome Frame must come before MSIE.
@@ -482,7 +491,7 @@ user_agent_parsers:
482
491
  family_replacement: 'Yandex Browser'
483
492
 
484
493
  # Mail.ru Amigo/Internet Browser (Chromium-based)
485
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
494
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
486
495
  family_replacement: 'Mail.ru Chromium Browser'
487
496
 
488
497
  # AOL Browser (IE-based)
@@ -509,6 +518,13 @@ user_agent_parsers:
509
518
  # @ref: http://www.ghost.org
510
519
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
511
520
 
521
+ # Palo Alto GlobalProtect Linux
522
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
523
+
524
+ # Surveyon https://www.surveyon.com/
525
+ - regex: '^(surveyon)/(\d+)\.(\d+)\.(\d+)'
526
+ family_replacement: 'Surveyon'
527
+
512
528
  #### END SPECIAL CASES TOP ####
513
529
 
514
530
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -549,7 +565,7 @@ user_agent_parsers:
549
565
  - regex: 'Microsoft Office (Word) 2014'
550
566
 
551
567
  # Windows Live Mail
552
- - regex: 'Outlook-Express\/7\.0.*'
568
+ - regex: 'Outlook-Express\/7\.0'
553
569
  family_replacement: 'Windows Live Mail'
554
570
 
555
571
  # Apple Air Mail
@@ -589,7 +605,7 @@ user_agent_parsers:
589
605
  family_replacement: 'Brave'
590
606
 
591
607
  # Iron Browser ~since version 50
592
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
608
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
593
609
  family_replacement: 'Iron'
594
610
 
595
611
  # Dolphin Browser
@@ -665,13 +681,13 @@ user_agent_parsers:
665
681
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
666
682
  - regex: '^(Stitcher)/iOS'
667
683
  - regex: '^(Stitcher)/Android'
668
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
684
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
669
685
  - regex: ' (VLC) for'
670
686
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
671
687
  family_replacement: 'VLC'
672
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
673
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
674
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
688
+ - regex: '^(foobar)\S{1,10}/(\d+)\.(\d+|)\.?([\da-z]+|)'
689
+ - regex: '^(Clementine)\S{1,10} (\d+)\.(\d+|)\.?(\d+|)'
690
+ - regex: '(amarok)/(\d+)\.(\d+|)\.?(\d+|)'
675
691
  family_replacement: 'Amarok'
676
692
  - regex: '(Custom)-Feed Reader'
677
693
 
@@ -705,7 +721,7 @@ user_agent_parsers:
705
721
 
706
722
  # desktop mode
707
723
  # http://www.anandtech.com/show/3982/windows-phone-7-review
708
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
724
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
709
725
  family_replacement: 'IE Large Screen'
710
726
 
711
727
  # Nextcloud desktop sync client
@@ -722,6 +738,17 @@ user_agent_parsers:
722
738
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
723
739
  family_replacement: 'Skype'
724
740
 
741
+ # OpenVAS Scanner
742
+ - regex: '(OpenVAS)(?:-VT)?(?:[ \/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
743
+ family_replacement: 'OpenVAS Scanner'
744
+
745
+ # AnyConnect
746
+ - regex: '(AnyConnect)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
747
+
748
+ # Monitis
749
+ - regex: 'compatible; monitis'
750
+ family_replacement: 'Monitis'
751
+
725
752
  #### END MAIN CASES ####
726
753
 
727
754
  #### SPECIAL CASES ####
@@ -758,15 +785,15 @@ user_agent_parsers:
758
785
  family_replacement: 'TopBuzz'
759
786
 
760
787
  # @note: iOS / OSX Applications
761
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
788
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
762
789
  family_replacement: 'Google'
763
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
790
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
764
791
  family_replacement: 'Mobile Safari'
765
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
792
+ - regex: '(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\d+)_(\d+)(?:_(\d+)|).{0,30} AppleNews\/\d+\.\d+(?:\.\d+|)'
766
793
  family_replacement: 'Mobile Safari UI/WKWebView'
767
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
794
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
768
795
  family_replacement: 'Mobile Safari UI/WKWebView'
769
- - regex: '(iPod|iPod touch|iPhone|iPad).* Safari'
796
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
770
797
  family_replacement: 'Mobile Safari'
771
798
  - regex: '(iPod|iPod touch|iPhone|iPad)'
772
799
  family_replacement: 'Mobile Safari UI/WKWebView'
@@ -817,9 +844,9 @@ user_agent_parsers:
817
844
  - regex: '(Nokia)[EN]?(\d+)'
818
845
 
819
846
  # BlackBerry devices
820
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
847
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
821
848
  family_replacement: 'BlackBerry WebKit'
822
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
849
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
823
850
  family_replacement: 'BlackBerry WebKit'
824
851
  - regex: '(Black[bB]erry)\s?(\d+)'
825
852
  family_replacement: 'BlackBerry'
@@ -839,18 +866,15 @@ user_agent_parsers:
839
866
 
840
867
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
841
868
 
842
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
843
- # family_replacement: 'iPad'
844
-
845
869
  # Phantomjs, should go before Safari
846
870
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
847
871
 
848
872
  # WebKit Nightly
849
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
873
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
850
874
  family_replacement: 'WebKit Nightly'
851
875
 
852
876
  # Safari
853
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
877
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
854
878
  family_replacement: 'Safari'
855
879
  # Safari didn't provide "Version/d.d.d" prior to 3.0
856
880
  - regex: '(Safari)/\d+'
@@ -906,7 +930,30 @@ user_agent_parsers:
906
930
  family_replacement: 'Python Requests'
907
931
 
908
932
  # headless user-agents
909
- - 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+)|)|)'
933
+ - 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)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
934
+
935
+ # CloudFoundry
936
+ - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
937
+ family_replacement: 'CloudFoundry'
938
+
939
+ # SAP Leonardo
940
+ - regex: '^(sap-leonardo-iot-sdk-nodejs) \/ (\d+)\.(\d+)\.(\d+)'
941
+
942
+ # SAP Netweaver Application Server
943
+ - regex: '^(SAP NetWeaver Application Server) \(1.0;(\d{1})(\d{2})\)'
944
+
945
+ # HttpClient
946
+ - regex: '^(\w+-HTTPClient)\/(\d+)\.(\d+)-(\S+)'
947
+ family_replacement: 'HTTPClient'
948
+
949
+ # go-cli
950
+ - regex: '^(go-cli)\s(\d+)\.(\d+).(\S+)'
951
+
952
+ # Other Clients with the pattern <Name>/[v]<Major>.<Minor>[.<Patch>]
953
+ - regex: '^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\/v?(\d+)\.(\d+)\.?(\d*)'
954
+
955
+ ## Clints with the pattern <Name>
956
+ - regex: '^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)'
910
957
 
911
958
  # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
912
959
  - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
@@ -914,9 +961,25 @@ user_agent_parsers:
914
961
 
915
962
  - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
916
963
 
964
+ # minio-go (https://github.com/minio/minio-go)
965
+ - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
966
+
967
+ # ureq - minimal request library in rust (https://github.com/algesten/ureq)
968
+ - regex: '^(ureq)[/ ](\d+)\.(\d+).(\d+)'
969
+
970
+ # http.rb - HTTP (The Gem! a.k.a. http.rb) - a fast Ruby HTTP client
971
+ # (https://github.com/httprb/http/blob/3aa7470288deb81f7d7b982c1e2381871049dcbb/lib/http/request.rb#L27)
972
+ - regex: '^(http\.rb)/(\d+)\.(\d+).(\d+)'
973
+
974
+ # Guzzle, PHP HTTP client (https://docs.guzzlephp.org/)
975
+ - regex: '^(GuzzleHttp)/(\d+)\.(\d+).(\d+)'
976
+
977
+ # lorien/grab - Web Scraping Framework (https://github.com/lorien/grab)
978
+ - regex: '^(grab)\b'
979
+
917
980
  # Cloud Storage Clients
918
981
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
919
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
982
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
920
983
  - regex: '(S3Gof3r)'
921
984
  # IBM COS (Cloud Object Storage) API
922
985
  - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
@@ -939,6 +1002,20 @@ user_agent_parsers:
939
1002
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
940
1003
  family_replacement: 'ViaFree'
941
1004
 
1005
+ # Transmit (https://library.panic.com/transmit/)
1006
+ - regex: '(Transmit)/(\d+)\.(\d+)\.(\d+)'
1007
+
1008
+ # Download Master (https://downloadmaster.ru/)
1009
+ - regex: '(Download Master)'
1010
+
1011
+ # HTTrack crawler
1012
+ - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1013
+
1014
+ # SerenityOS (https://serenityos.org)
1015
+ # https://github.com/SerenityOS/serenity/blob/2e1bbcb0faeae92d7595b8e0b022a8cdcecca07e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L27
1016
+ - regex: 'SerenityOS'
1017
+ family_replacement: 'SerenityOS Browser'
1018
+
942
1019
  os_parsers:
943
1020
  ##########
944
1021
  # HbbTV vendors
@@ -954,7 +1031,7 @@ os_parsers:
954
1031
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
955
1032
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
956
1033
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
957
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1034
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
958
1035
 
959
1036
  # LG is consistent too, but we need to add manually the year model
960
1037
  #Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)
@@ -973,9 +1050,9 @@ os_parsers:
973
1050
  os_replacement: 'Samsung'
974
1051
  os_v1_replacement: '2011'
975
1052
  # manage the two models of 2013
976
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
1053
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC'
977
1054
  os_v2_replacement: 'UE40F7000'
978
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
1055
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC'
979
1056
  os_v2_replacement: 'UE32F4500'
980
1057
  # generic Samsung (works starting in 2012)
981
1058
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -983,26 +1060,26 @@ os_parsers:
983
1060
  # Philips : not found any other way than a manual mapping
984
1061
  # 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
985
1062
  # 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
986
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1063
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
987
1064
  os_v1_replacement: '2013'
988
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1065
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
989
1066
  os_v1_replacement: '2012'
990
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1067
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
991
1068
  os_v1_replacement: '2011'
992
1069
 
993
1070
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
994
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
1071
+ - regex: 'HbbTV/\d+\.\d+\.\d+.{0,100}(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
995
1072
  os_replacement: 'FireHbbTV'
996
1073
 
997
1074
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
998
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
1075
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
999
1076
 
1000
1077
  # aspiegel.com spider (owned by Huawei)
1001
1078
  - regex: 'AspiegelBot'
1002
1079
  os_replacement: 'Other'
1003
1080
 
1004
1081
  ##########
1005
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
1082
+ # @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
1006
1083
  # 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)...
1007
1084
  # 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)...
1008
1085
  # 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)...
@@ -1011,12 +1088,12 @@ os_parsers:
1011
1088
 
1012
1089
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
1013
1090
 
1014
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
1015
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
1091
+ # Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
1092
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
1016
1093
  os_replacement: 'iOS'
1017
1094
 
1018
1095
  # Special case for old ArcGIS Mobile products
1019
- - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]+|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1096
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1020
1097
 
1021
1098
  # Special case for new ArcGIS Mobile products
1022
1099
  - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
@@ -1048,16 +1125,17 @@ os_parsers:
1048
1125
 
1049
1126
  # Android 9; Android 10;
1050
1127
  - regex: '(Android) (\d+);'
1128
+ - regex: '(Android): (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1051
1129
 
1052
1130
  # UCWEB
1053
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1131
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
1054
1132
  os_replacement: 'Android'
1055
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1133
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1056
1134
  os_replacement: 'iOS'
1057
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1135
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1058
1136
  os_replacement: 'Windows Phone'
1059
1137
  # JUC
1060
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1138
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
1061
1139
  os_replacement: 'Android'
1062
1140
 
1063
1141
  # Salesforce
@@ -1075,7 +1153,7 @@ os_parsers:
1075
1153
  # properly identify as Chrome OS
1076
1154
  #
1077
1155
  # 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
1078
- - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
1156
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
1079
1157
  os_replacement: 'Chrome OS'
1080
1158
 
1081
1159
  ##########
@@ -1167,7 +1245,7 @@ os_parsers:
1167
1245
  os_v1_replacement: '95'
1168
1246
 
1169
1247
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1170
- - regex: '^Box.*Windows/([\d.]+);'
1248
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1171
1249
  os_replacement: 'Windows'
1172
1250
  os_v1_replacement: '$1'
1173
1251
 
@@ -1184,33 +1262,33 @@ os_parsers:
1184
1262
  ##########
1185
1263
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1186
1264
  os_replacement: 'Mac OS X'
1187
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1265
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1188
1266
  os_replacement: 'Mac OS X'
1189
1267
  os_v1_replacement: '$1'
1190
1268
  os_v2_replacement: '$2'
1191
1269
  os_v3_replacement: '$3'
1192
1270
  # Leopard
1193
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1271
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1194
1272
  os_replacement: 'Mac OS X'
1195
1273
  os_v1_replacement: '10'
1196
1274
  os_v2_replacement: '5'
1197
1275
  # Snow Leopard
1198
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1276
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1199
1277
  os_replacement: 'Mac OS X'
1200
1278
  os_v1_replacement: '10'
1201
1279
  os_v2_replacement: '6'
1202
1280
  # Lion
1203
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1281
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1204
1282
  os_replacement: 'Mac OS X'
1205
1283
  os_v1_replacement: '10'
1206
1284
  os_v2_replacement: '7'
1207
1285
  # Mountain Lion
1208
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1286
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1209
1287
  os_replacement: 'Mac OS X'
1210
1288
  os_v1_replacement: '10'
1211
1289
  os_v2_replacement: '8'
1212
1290
  # Mavericks
1213
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1291
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1214
1292
  os_replacement: 'Mac OS X'
1215
1293
  os_v1_replacement: '10'
1216
1294
  os_v2_replacement: '9'
@@ -1227,7 +1305,7 @@ os_parsers:
1227
1305
  - regex: '(?:PPC|Intel) (Mac OS X)'
1228
1306
 
1229
1307
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1230
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1308
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1231
1309
  os_replacement: 'Mac OS X'
1232
1310
 
1233
1311
  ##########
@@ -1238,7 +1316,7 @@ os_parsers:
1238
1316
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1239
1317
  os_replacement: 'ATV OS X'
1240
1318
 
1241
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1319
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1242
1320
  os_replacement: 'iOS'
1243
1321
 
1244
1322
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1246,15 +1324,15 @@ os_parsers:
1246
1324
  os_replacement: 'iOS'
1247
1325
 
1248
1326
  # few more stragglers
1249
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
1327
+ - regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
1250
1328
  os_replacement: 'iOS'
1251
1329
 
1252
1330
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1253
1331
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1254
1332
  # See: http://user-agents.me/cfnetwork-version-list
1255
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1333
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1256
1334
  os_replacement: 'iOS'
1257
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
1335
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
1258
1336
  os_replacement: 'iOS'
1259
1337
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1260
1338
  os_replacement: 'iOS'
@@ -1289,17 +1367,17 @@ os_parsers:
1289
1367
  os_replacement: 'Mac OS X'
1290
1368
  os_v1_replacement: '10'
1291
1369
  os_v2_replacement: '11'
1292
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1370
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1293
1371
  os_replacement: 'iOS'
1294
1372
  os_v1_replacement: '9'
1295
1373
  os_v2_replacement: '3'
1296
1374
  os_v3_replacement: '1'
1297
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1375
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1298
1376
  os_replacement: 'iOS'
1299
1377
  os_v1_replacement: '9'
1300
1378
  os_v2_replacement: '3'
1301
1379
  os_v3_replacement: '2'
1302
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1380
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1303
1381
  os_replacement: 'iOS'
1304
1382
  os_v1_replacement: '9'
1305
1383
  os_v2_replacement: '3'
@@ -1320,15 +1398,15 @@ os_parsers:
1320
1398
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1321
1399
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1322
1400
  ##########
1323
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1401
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1324
1402
  os_replacement: 'Mac OS X'
1325
1403
  os_v1_replacement: '10'
1326
1404
  os_v2_replacement: '13'
1327
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1405
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1328
1406
  os_replacement: 'Mac OS X'
1329
1407
  os_v1_replacement: '10'
1330
1408
  os_v2_replacement: '12'
1331
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1409
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1332
1410
  os_replacement: 'Mac OS X'
1333
1411
  os_v1_replacement: '10'
1334
1412
  os_v2_replacement: '11'
@@ -1336,87 +1414,185 @@ os_parsers:
1336
1414
  # CFNetwork iOS Apps
1337
1415
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1338
1416
  ##########
1339
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1417
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1340
1418
  os_replacement: 'iOS'
1341
1419
  os_v1_replacement: '1'
1342
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1420
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1343
1421
  os_replacement: 'iOS'
1344
1422
  os_v1_replacement: '4'
1345
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1423
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1346
1424
  os_replacement: 'iOS'
1347
1425
  os_v1_replacement: '5'
1348
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1426
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1349
1427
  os_replacement: 'iOS'
1350
1428
  os_v1_replacement: '6'
1351
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1429
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1352
1430
  os_replacement: 'iOS'
1353
1431
  os_v1_replacement: '7'
1354
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1432
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1355
1433
  os_replacement: 'iOS'
1356
1434
  os_v1_replacement: '8'
1357
1435
  os_v2_replacement: '0'
1358
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1436
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1359
1437
  os_replacement: 'iOS'
1360
1438
  os_v1_replacement: '9'
1361
1439
  os_v2_replacement: '0'
1362
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1440
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1363
1441
  os_replacement: 'iOS'
1364
1442
  os_v1_replacement: '10'
1365
1443
  os_v2_replacement: '3'
1366
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1444
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1367
1445
  os_replacement: 'iOS'
1368
1446
  os_v1_replacement: '10'
1369
1447
  os_v2_replacement: '3'
1370
1448
  os_v3_replacement: '2'
1371
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1449
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1372
1450
  os_replacement: 'iOS'
1373
1451
  os_v1_replacement: '10'
1374
1452
  os_v2_replacement: '3'
1375
1453
  os_v3_replacement: '3'
1376
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1454
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1377
1455
  os_replacement: 'iOS'
1378
1456
  os_v1_replacement: '10'
1379
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1457
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1380
1458
  os_replacement: 'iOS'
1381
1459
  os_v1_replacement: '11'
1382
1460
  os_v2_replacement: '0'
1383
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1461
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1384
1462
  os_replacement: 'iOS'
1385
1463
  os_v1_replacement: '11'
1386
1464
  os_v2_replacement: '1'
1387
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1465
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1388
1466
  os_replacement: 'iOS'
1389
1467
  os_v1_replacement: '11'
1390
1468
  os_v2_replacement: '2'
1391
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1469
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1392
1470
  os_replacement: 'iOS'
1393
1471
  os_v1_replacement: '11'
1394
1472
  os_v2_replacement: '2'
1395
1473
  os_v3_replacement: '6'
1396
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1474
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1397
1475
  os_replacement: 'iOS'
1398
1476
  os_v1_replacement: '11'
1399
1477
  os_v2_replacement: '3'
1400
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1478
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1401
1479
  os_replacement: 'iOS'
1402
1480
  os_v1_replacement: '11'
1403
1481
  os_v2_replacement: '4'
1404
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1482
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1405
1483
  os_replacement: 'iOS'
1406
1484
  os_v1_replacement: '11'
1407
1485
  os_v2_replacement: '4'
1408
1486
  os_v3_replacement: '1'
1409
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1487
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1410
1488
  os_replacement: 'iOS'
1411
1489
  os_v1_replacement: '11'
1412
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1490
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1413
1491
  os_replacement: 'iOS'
1414
1492
  os_v1_replacement: '12'
1415
1493
  os_v2_replacement: '0'
1416
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1494
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1495
+ os_replacement: 'iOS'
1496
+ os_v1_replacement: '12'
1497
+ os_v2_replacement: '1'
1498
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.5\.\d+'
1499
+ os_replacement: 'iOS'
1500
+ os_v1_replacement: '12'
1501
+ os_v2_replacement: '2'
1502
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.6\.\d+'
1417
1503
  os_replacement: 'iOS'
1418
1504
  os_v1_replacement: '12'
1419
- - regex: 'CFNetwork/.* Darwin/'
1505
+ os_v2_replacement: '3'
1506
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.7\.\d+'
1507
+ os_replacement: 'iOS'
1508
+ os_v1_replacement: '12'
1509
+ os_v2_replacement: '4'
1510
+ - regex: 'CFNetwork/9.{0,100} Darwin/(18)\.\d+'
1511
+ os_replacement: 'iOS'
1512
+ os_v1_replacement: '12'
1513
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.2\.\d+'
1514
+ os_replacement: 'iOS'
1515
+ os_v1_replacement: '13'
1516
+ os_v2_replacement: '3'
1517
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.3\.\d+'
1518
+ os_replacement: 'iOS'
1519
+ os_v1_replacement: '13'
1520
+ os_v2_replacement: '3'
1521
+ os_v3_replacement: '1'
1522
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.4\.\d+'
1523
+ os_replacement: 'iOS'
1524
+ os_v1_replacement: '13'
1525
+ os_v2_replacement: '4'
1526
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.5\.\d+'
1527
+ os_replacement: 'iOS'
1528
+ os_v1_replacement: '13'
1529
+ os_v2_replacement: '5'
1530
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.6\.\d+'
1531
+ os_replacement: 'iOS'
1532
+ os_v1_replacement: '13'
1533
+ os_v2_replacement: '6'
1534
+ - regex: 'CFNetwork/1[01].{0,100} Darwin/19\.\d+'
1535
+ os_replacement: 'iOS'
1536
+ os_v1_replacement: '13'
1537
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.1\.\d+'
1538
+ os_replacement: 'iOS'
1539
+ os_v1_replacement: '14'
1540
+ os_v2_replacement: '2'
1541
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.2\.\d+'
1542
+ os_replacement: 'iOS'
1543
+ os_v1_replacement: '14'
1544
+ os_v2_replacement: '3'
1545
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.3\.\d+'
1546
+ os_replacement: 'iOS'
1547
+ os_v1_replacement: '14'
1548
+ os_v2_replacement: '4'
1549
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.4\.\d+'
1550
+ os_replacement: 'iOS'
1551
+ os_v1_replacement: '14'
1552
+ os_v2_replacement: '5'
1553
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.5\.\d+'
1554
+ os_replacement: 'iOS'
1555
+ os_v1_replacement: '14'
1556
+ os_v2_replacement: '6'
1557
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.6\.\d+'
1558
+ os_replacement: 'iOS'
1559
+ os_v1_replacement: '14'
1560
+ os_v2_replacement: '8'
1561
+ - regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
1562
+ os_replacement: 'iOS'
1563
+ os_v1_replacement: '14'
1564
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.0\.\d+'
1565
+ os_replacement: 'iOS'
1566
+ os_v1_replacement: '15'
1567
+ os_v2_replacement: '0'
1568
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.1\.\d+'
1569
+ os_replacement: 'iOS'
1570
+ os_v1_replacement: '15'
1571
+ os_v2_replacement: '1'
1572
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.2\.\d+'
1573
+ os_replacement: 'iOS'
1574
+ os_v1_replacement: '15'
1575
+ os_v2_replacement: '2'
1576
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.3\.\d+'
1577
+ os_replacement: 'iOS'
1578
+ os_v1_replacement: '15'
1579
+ os_v2_replacement: '3'
1580
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.4\.\d+'
1581
+ os_replacement: 'iOS'
1582
+ os_v1_replacement: '15'
1583
+ os_v2_replacement: '4'
1584
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.5\.\d+'
1585
+ os_replacement: 'iOS'
1586
+ os_v1_replacement: '15'
1587
+ os_v2_replacement: '5'
1588
+ - regex: 'CFNetwork/13.{0,100} Darwin/21\.6\.\d+'
1589
+ os_replacement: 'iOS'
1590
+ os_v1_replacement: '15'
1591
+ os_v2_replacement: '6'
1592
+ - regex: 'CFNetwork/.{0,100} Darwin/(21)\.\d+'
1593
+ os_replacement: 'iOS'
1594
+ os_v1_replacement: '15'
1595
+ - regex: 'CFNetwork/.{0,100} Darwin/'
1420
1596
  os_replacement: 'iOS'
1421
1597
 
1422
1598
  # iOS Apps
@@ -1427,7 +1603,7 @@ os_parsers:
1427
1603
  ##########
1428
1604
  # Apple Watch
1429
1605
  ##########
1430
- - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
1606
+ - regex: '(watchOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
1431
1607
  os_replacement: 'WatchOS'
1432
1608
 
1433
1609
  ##########################
@@ -1470,9 +1646,9 @@ os_parsers:
1470
1646
  ##########
1471
1647
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1472
1648
  os_replacement: 'Symbian OS'
1473
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1649
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1474
1650
  os_replacement: 'Symbian^3 Anna'
1475
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1651
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1476
1652
  os_replacement: 'Symbian^3 Belle'
1477
1653
  - regex: '(Symbian/3)'
1478
1654
  os_replacement: 'Symbian^3'
@@ -1489,11 +1665,11 @@ os_parsers:
1489
1665
  ##########
1490
1666
  # BlackBerry devices
1491
1667
  ##########
1492
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1668
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1493
1669
  os_replacement: 'BlackBerry OS'
1494
1670
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1495
1671
  os_replacement: 'BlackBerry OS'
1496
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1672
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1497
1673
  os_replacement: 'BlackBerry OS'
1498
1674
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1499
1675
  os_replacement: 'BlackBerry Tablet OS'
@@ -1511,44 +1687,44 @@ os_parsers:
1511
1687
  ##########
1512
1688
  # Firefox OS
1513
1689
  ##########
1514
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1690
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1515
1691
  os_replacement: 'Firefox OS'
1516
1692
  os_v1_replacement: '1'
1517
1693
  os_v2_replacement: '0'
1518
1694
  os_v3_replacement: '1'
1519
1695
 
1520
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1696
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1521
1697
  os_replacement: 'Firefox OS'
1522
1698
  os_v1_replacement: '1'
1523
1699
  os_v2_replacement: '1'
1524
1700
 
1525
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1701
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1526
1702
  os_replacement: 'Firefox OS'
1527
1703
  os_v1_replacement: '1'
1528
1704
  os_v2_replacement: '2'
1529
1705
 
1530
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1706
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1531
1707
  os_replacement: 'Firefox OS'
1532
1708
  os_v1_replacement: '1'
1533
1709
  os_v2_replacement: '3'
1534
1710
 
1535
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1711
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1536
1712
  os_replacement: 'Firefox OS'
1537
1713
  os_v1_replacement: '1'
1538
1714
  os_v2_replacement: '4'
1539
1715
 
1540
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1716
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1541
1717
  os_replacement: 'Firefox OS'
1542
1718
  os_v1_replacement: '2'
1543
1719
  os_v2_replacement: '0'
1544
1720
 
1545
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1721
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1546
1722
  os_replacement: 'Firefox OS'
1547
1723
  os_v1_replacement: '2'
1548
1724
  os_v2_replacement: '1'
1549
1725
 
1550
1726
  # Firefox OS Generic
1551
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1727
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1552
1728
  os_replacement: 'Firefox OS'
1553
1729
 
1554
1730
  ##########
@@ -1589,7 +1765,7 @@ os_parsers:
1589
1765
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1590
1766
 
1591
1767
  # Gentoo Linux + Kernel Version
1592
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1768
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1593
1769
  os_replacement: 'Gentoo'
1594
1770
 
1595
1771
  # Opera Mini Bada
@@ -1597,7 +1773,7 @@ os_parsers:
1597
1773
 
1598
1774
  # just os
1599
1775
  - regex: '(Windows|Android|WeTab|Maemo|Web0S)'
1600
- - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
1776
+ - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|SerenityOS|(?:Free|Open|Net|\b)BSD)'
1601
1777
  # Linux + Kernel Version
1602
1778
  - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
1603
1779
  - regex: 'SunOS'
@@ -1620,19 +1796,19 @@ device_parsers:
1620
1796
  # Mobile Spiders
1621
1797
  # Catch the mobile crawler before checking for iPhones / Androids.
1622
1798
  #########
1623
- - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1799
+ - 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)'
1624
1800
  regex_flag: 'i'
1625
1801
  device_replacement: 'Spider'
1626
1802
  brand_replacement: 'Spider'
1627
1803
  model_replacement: 'Smartphone'
1628
- - 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)'
1804
+ - 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)'
1629
1805
  regex_flag: 'i'
1630
1806
  device_replacement: 'Spider'
1631
1807
  brand_replacement: 'Spider'
1632
1808
  model_replacement: 'Feature Phone'
1633
1809
 
1634
1810
  # PTST / WebPageTest.org crawlers
1635
- - regex: ' PTST/\d+(?:\.)?\d+$'
1811
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1636
1812
  device_replacement: 'Spider'
1637
1813
  brand_replacement: 'Spider'
1638
1814
 
@@ -1642,11 +1818,11 @@ device_parsers:
1642
1818
  brand_replacement: 'Spider'
1643
1819
 
1644
1820
  # aspiegel.com spider (owned by Huawei)
1645
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
1821
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1646
1822
  device_replacement: 'Spider'
1647
1823
  brand_replacement: 'Spider'
1648
1824
  model_replacement: 'Smartphone'
1649
- - regex: 'Mozilla.*AspiegelBot'
1825
+ - regex: 'Mozilla.{0,200}AspiegelBot'
1650
1826
  device_replacement: 'Spider'
1651
1827
  brand_replacement: 'Spider'
1652
1828
  model_replacement: 'Desktop'
@@ -1655,7 +1831,7 @@ device_parsers:
1655
1831
  # WebBrowser for SmartWatch
1656
1832
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1657
1833
  #########
1658
- - regex: '\bSmartWatch {0,2}\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};'
1834
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1659
1835
  device_replacement: '$1 $2'
1660
1836
  brand_replacement: '$1'
1661
1837
  model_replacement: '$2'
@@ -1667,16 +1843,16 @@ device_parsers:
1667
1843
  ######################################################################
1668
1844
 
1669
1845
  # Android Application
1670
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1846
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1671
1847
  device_replacement: '$1 $2'
1672
1848
  brand_replacement: '$1$2'
1673
1849
  model_replacement: '$3'
1674
- - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
1850
+ - regex: 'Android Application[^\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.{1,200}) \w{1,20} - '
1675
1851
  regex_flag: 'i'
1676
1852
  device_replacement: '$1 $2'
1677
1853
  brand_replacement: '$1'
1678
1854
  model_replacement: '$2'
1679
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1855
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1680
1856
  device_replacement: '$1 $2'
1681
1857
  brand_replacement: '$1'
1682
1858
  model_replacement: '$2'
@@ -1685,11 +1861,11 @@ device_parsers:
1685
1861
  # 3Q
1686
1862
  # @ref: http://www.3q-int.com/
1687
1863
  #########
1688
- - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1864
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1689
1865
  device_replacement: '3Q $1'
1690
1866
  brand_replacement: '3Q'
1691
1867
  model_replacement: '$1'
1692
- - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1868
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1693
1869
  device_replacement: '3Q $1'
1694
1870
  brand_replacement: '3Q'
1695
1871
  model_replacement: '$1'
@@ -1698,19 +1874,19 @@ device_parsers:
1698
1874
  # Acer
1699
1875
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1700
1876
  #########
1701
- - 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)'
1877
+ - 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)'
1702
1878
  device_replacement: '$1'
1703
1879
  brand_replacement: 'Acer'
1704
1880
  model_replacement: '$1'
1705
- - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1881
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1706
1882
  device_replacement: '$1'
1707
1883
  brand_replacement: 'Acer'
1708
1884
  model_replacement: '$1'
1709
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1885
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1710
1886
  device_replacement: '$1'
1711
1887
  brand_replacement: 'Acer'
1712
1888
  model_replacement: '$1'
1713
- - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1889
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1714
1890
  device_replacement: '$1$2'
1715
1891
  brand_replacement: 'Acer'
1716
1892
  model_replacement: '$2'
@@ -1721,7 +1897,7 @@ device_parsers:
1721
1897
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1722
1898
  # custom ROM builds for Vega
1723
1899
  #########
1724
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1900
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1725
1901
  device_replacement: '$1$2'
1726
1902
  brand_replacement: 'Advent'
1727
1903
  model_replacement: '$2'
@@ -1730,7 +1906,7 @@ device_parsers:
1730
1906
  # Ainol
1731
1907
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1732
1908
  #########
1733
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
1909
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1734
1910
  device_replacement: '$1$2'
1735
1911
  brand_replacement: 'Ainol'
1736
1912
  model_replacement: '$2'
@@ -1739,12 +1915,12 @@ device_parsers:
1739
1915
  # Airis
1740
1916
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1741
1917
  #########
1742
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
1918
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1743
1919
  regex_flag: 'i'
1744
1920
  device_replacement: '$1'
1745
1921
  brand_replacement: 'Airis'
1746
1922
  model_replacement: '$1'
1747
- - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
1923
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1748
1924
  regex_flag: 'i'
1749
1925
  device_replacement: '$1'
1750
1926
  brand_replacement: 'Airis'
@@ -1754,7 +1930,7 @@ device_parsers:
1754
1930
  # Airpad
1755
1931
  # @ref: ??
1756
1932
  #########
1757
- - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
1933
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1758
1934
  device_replacement: 'Airpad $1'
1759
1935
  brand_replacement: 'Airpad'
1760
1936
  model_replacement: '$1'
@@ -1763,29 +1939,29 @@ device_parsers:
1763
1939
  # Alcatel - TCT
1764
1940
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1765
1941
  #########
1766
- - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1942
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1767
1943
  device_replacement: 'Alcatel One Touch $2'
1768
1944
  brand_replacement: 'Alcatel'
1769
1945
  model_replacement: 'One Touch $2'
1770
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
1946
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1771
1947
  regex_flag: 'i'
1772
1948
  device_replacement: 'Alcatel One Touch $1'
1773
1949
  brand_replacement: 'Alcatel'
1774
1950
  model_replacement: 'One Touch $1'
1775
- - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1951
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1776
1952
  device_replacement: '$1 $2'
1777
1953
  brand_replacement: '$1'
1778
1954
  model_replacement: '$2'
1779
1955
  # operator specific models
1780
- - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1956
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1781
1957
  device_replacement: 'Alcatel $1'
1782
1958
  brand_replacement: 'Alcatel'
1783
1959
  model_replacement: '$1'
1784
- - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
1960
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1785
1961
  device_replacement: 'Alcatel One Touch 998'
1786
1962
  brand_replacement: 'Alcatel'
1787
1963
  model_replacement: 'One Touch 998'
1788
- - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
1964
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1789
1965
  device_replacement: 'Alcatel One Touch 918D'
1790
1966
  brand_replacement: 'Alcatel'
1791
1967
  model_replacement: 'One Touch 918D'
@@ -1794,7 +1970,7 @@ device_parsers:
1794
1970
  # Allfine
1795
1971
  # @ref: http://www.myallfine.com/Products.asp
1796
1972
  #########
1797
- - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
1973
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1798
1974
  device_replacement: '$1'
1799
1975
  brand_replacement: 'Allfine'
1800
1976
  model_replacement: '$1'
@@ -1803,15 +1979,15 @@ device_parsers:
1803
1979
  # Allview
1804
1980
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1805
1981
  #########
1806
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
1982
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1807
1983
  device_replacement: '$1$2'
1808
1984
  brand_replacement: 'Allview'
1809
1985
  model_replacement: '$2'
1810
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1986
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1811
1987
  device_replacement: '$1$2'
1812
1988
  brand_replacement: 'Allview'
1813
1989
  model_replacement: '$2'
1814
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1990
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1815
1991
  device_replacement: '$1$2'
1816
1992
  brand_replacement: 'Allview'
1817
1993
  model_replacement: '$2'
@@ -1821,11 +1997,11 @@ device_parsers:
1821
1997
  # @ref: http://www.allwinner.com/
1822
1998
  # @models: A31 (13.3"),A20,A10,
1823
1999
  #########
1824
- - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
2000
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1825
2001
  device_replacement: '$1'
1826
2002
  brand_replacement: 'Allwinner'
1827
2003
  model_replacement: '$1'
1828
- - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
2004
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1829
2005
  device_replacement: '$1 $2'
1830
2006
  brand_replacement: 'Allwinner'
1831
2007
  model_replacement: '$1'
@@ -1834,7 +2010,7 @@ device_parsers:
1834
2010
  # Amaway
1835
2011
  # @ref: http://www.amaway.cn/
1836
2012
  #########
1837
- - 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)'
2013
+ - 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)'
1838
2014
  device_replacement: '$1'
1839
2015
  brand_replacement: 'Amaway'
1840
2016
  model_replacement: '$1'
@@ -1843,11 +2019,11 @@ device_parsers:
1843
2019
  # Amoi
1844
2020
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1845
2021
  #########
1846
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2022
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1847
2023
  device_replacement: 'Amoi $1'
1848
2024
  brand_replacement: 'Amoi'
1849
2025
  model_replacement: '$1'
1850
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
2026
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1851
2027
  device_replacement: 'Amoi $1'
1852
2028
  brand_replacement: 'Amoi'
1853
2029
  model_replacement: '$1'
@@ -1856,7 +2032,7 @@ device_parsers:
1856
2032
  # Aoc
1857
2033
  # @ref: http://latin.aoc.com/media_tablet
1858
2034
  #########
1859
- - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
2035
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1860
2036
  device_replacement: '$1'
1861
2037
  brand_replacement: 'Aoc'
1862
2038
  model_replacement: '$1'
@@ -1867,11 +2043,11 @@ device_parsers:
1867
2043
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1868
2044
  # @note: brand owned by luckystar
1869
2045
  #########
1870
- - 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)'
2046
+ - 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)'
1871
2047
  device_replacement: 'Aoson $1'
1872
2048
  brand_replacement: 'Aoson'
1873
2049
  model_replacement: '$1'
1874
- - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
2050
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1875
2051
  regex_flag: 'i'
1876
2052
  device_replacement: 'Aoson $1'
1877
2053
  brand_replacement: 'Aoson'
@@ -1881,7 +2057,7 @@ device_parsers:
1881
2057
  # Apanda
1882
2058
  # @ref: http://www.apanda.com.cn/
1883
2059
  #########
1884
- - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2060
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1885
2061
  device_replacement: 'Apanda $1'
1886
2062
  brand_replacement: 'Apanda'
1887
2063
  model_replacement: '$1'
@@ -1891,23 +2067,23 @@ device_parsers:
1891
2067
  # @ref: http://www.archos.com/de/products/tablets.html
1892
2068
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1893
2069
  #########
1894
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
2070
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1895
2071
  device_replacement: 'Archos $1'
1896
2072
  brand_replacement: 'Archos'
1897
2073
  model_replacement: '$1'
1898
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2074
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1899
2075
  device_replacement: 'Archos $1'
1900
2076
  brand_replacement: 'Archos'
1901
2077
  model_replacement: '$1'
1902
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2078
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1903
2079
  device_replacement: 'Archos $1'
1904
2080
  brand_replacement: 'Archos'
1905
2081
  model_replacement: '$1'
1906
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
2082
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1907
2083
  device_replacement: 'Archos $1'
1908
2084
  brand_replacement: 'Archos'
1909
2085
  model_replacement: '$1'
1910
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
2086
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1911
2087
  device_replacement: 'Archos $1'
1912
2088
  brand_replacement: 'Archos'
1913
2089
  model_replacement: '$1'
@@ -1916,11 +2092,11 @@ device_parsers:
1916
2092
  # A-rival
1917
2093
  # @ref: http://www.a-rival.de/de/
1918
2094
  #########
1919
- - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
2095
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1920
2096
  device_replacement: '$1'
1921
2097
  brand_replacement: 'Arival'
1922
2098
  model_replacement: '$1'
1923
- - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2099
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1924
2100
  device_replacement: '$1 $2'
1925
2101
  brand_replacement: 'Arival'
1926
2102
  model_replacement: '$1 $2'
@@ -1929,11 +2105,11 @@ device_parsers:
1929
2105
  # Arnova
1930
2106
  # @ref: http://arnovatech.com/
1931
2107
  #########
1932
- - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
2108
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1933
2109
  device_replacement: 'Arnova $1'
1934
2110
  brand_replacement: 'Arnova'
1935
2111
  model_replacement: '$1'
1936
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2112
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1937
2113
  device_replacement: 'Arnova $1'
1938
2114
  brand_replacement: 'Arnova'
1939
2115
  model_replacement: '$1'
@@ -1942,7 +2118,7 @@ device_parsers:
1942
2118
  # Assistant
1943
2119
  # @ref: http://www.assistant.ua
1944
2120
  #########
1945
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
2121
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1946
2122
  device_replacement: 'Assistant $1-$2'
1947
2123
  brand_replacement: 'Assistant'
1948
2124
  model_replacement: '$1-$2'
@@ -1951,11 +2127,11 @@ device_parsers:
1951
2127
  # Asus
1952
2128
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1953
2129
  #########
1954
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
2130
+ - 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)'
1955
2131
  device_replacement: 'Asus $1'
1956
2132
  brand_replacement: 'Asus'
1957
2133
  model_replacement: '$1'
1958
- - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
2134
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1959
2135
  device_replacement: 'Asus $1'
1960
2136
  brand_replacement: 'Asus'
1961
2137
  model_replacement: '$1'
@@ -1963,11 +2139,11 @@ device_parsers:
1963
2139
  #########
1964
2140
  # Garmin-Asus
1965
2141
  #########
1966
- - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
2142
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1967
2143
  device_replacement: 'Garmin-Asus $1'
1968
2144
  brand_replacement: 'Garmin-Asus'
1969
2145
  model_replacement: '$1'
1970
- - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
2146
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1971
2147
  device_replacement: 'Garmin $1'
1972
2148
  brand_replacement: 'Garmin-Asus'
1973
2149
  model_replacement: '$1'
@@ -1976,7 +2152,7 @@ device_parsers:
1976
2152
  # Attab
1977
2153
  # @ref: http://www.theattab.com/
1978
2154
  #########
1979
- - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
2155
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1980
2156
  device_replacement: '$1'
1981
2157
  brand_replacement: 'Attab'
1982
2158
  model_replacement: '$1'
@@ -1986,7 +2162,7 @@ device_parsers:
1986
2162
  # @ref: ??
1987
2163
  # @note: Take care with Docomo T-01 Toshiba
1988
2164
  #########
1989
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
2165
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1990
2166
  device_replacement: '$1'
1991
2167
  brand_replacement: 'Audiosonic'
1992
2168
  model_replacement: '$1'
@@ -1995,7 +2171,7 @@ device_parsers:
1995
2171
  # Axioo
1996
2172
  # @ref: http://www.axiooworld.com/ww/index.php
1997
2173
  #########
1998
- - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
2174
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
1999
2175
  regex_flag: 'i'
2000
2176
  device_replacement: 'Axioo $1$2 $3'
2001
2177
  brand_replacement: 'Axioo'
@@ -2005,7 +2181,7 @@ device_parsers:
2005
2181
  # Azend
2006
2182
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
2007
2183
  #########
2008
- - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2184
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2009
2185
  device_replacement: '$1'
2010
2186
  brand_replacement: 'Azend'
2011
2187
  model_replacement: '$1'
@@ -2014,7 +2190,7 @@ device_parsers:
2014
2190
  # Bak
2015
2191
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
2016
2192
  #########
2017
- - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2193
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2018
2194
  regex_flag: 'i'
2019
2195
  device_replacement: '$1'
2020
2196
  brand_replacement: 'Bak'
@@ -2025,7 +2201,7 @@ device_parsers:
2025
2201
  # @ref: http://www.bedove.com/product.html
2026
2202
  # @models: HY6501|HY5001|X12|X21|I5
2027
2203
  #########
2028
- - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2204
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2029
2205
  device_replacement: 'Bedove $1'
2030
2206
  brand_replacement: 'Bedove'
2031
2207
  model_replacement: '$1'
@@ -2034,7 +2210,7 @@ device_parsers:
2034
2210
  # Benss
2035
2211
  # @ref: http://www.benss.net/
2036
2212
  #########
2037
- - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2213
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2038
2214
  device_replacement: 'Benss $1'
2039
2215
  brand_replacement: 'Benss'
2040
2216
  model_replacement: '$1'
@@ -2044,7 +2220,7 @@ device_parsers:
2044
2220
  # @ref: http://uk.blackberry.com/
2045
2221
  # @note: Android Apps seams to be used here
2046
2222
  #########
2047
- - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
2223
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2048
2224
  device_replacement: '$1 $2'
2049
2225
  brand_replacement: 'Blackberry'
2050
2226
  model_replacement: '$2'
@@ -2053,11 +2229,11 @@ device_parsers:
2053
2229
  # Blackbird
2054
2230
  # @ref: http://iblackbird.co.kr
2055
2231
  #########
2056
- - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
2232
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
2057
2233
  device_replacement: '$1 $2'
2058
2234
  brand_replacement: '$1'
2059
2235
  model_replacement: '$2'
2060
- - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
2236
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
2061
2237
  device_replacement: '$1 $2'
2062
2238
  brand_replacement: '$1'
2063
2239
  model_replacement: '$2'
@@ -2067,7 +2243,7 @@ device_parsers:
2067
2243
  # @ref: http://www.blaupunkt.com
2068
2244
  #########
2069
2245
  # Endeavour
2070
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
2246
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2071
2247
  device_replacement: 'Blaupunkt $1'
2072
2248
  brand_replacement: 'Blaupunkt'
2073
2249
  model_replacement: '$1'
@@ -2076,12 +2252,12 @@ device_parsers:
2076
2252
  # Blu
2077
2253
  # @ref: http://bluproducts.com
2078
2254
  #########
2079
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
2255
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2080
2256
  device_replacement: '$1$2'
2081
2257
  brand_replacement: 'Blu'
2082
2258
  model_replacement: '$2'
2083
2259
  # BMOBILE = operator branded device
2084
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2260
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2085
2261
  device_replacement: '$1'
2086
2262
  brand_replacement: 'Blu'
2087
2263
  model_replacement: '$1'
@@ -2091,7 +2267,7 @@ device_parsers:
2091
2267
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
2092
2268
  #########
2093
2269
  # tablet
2094
- - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
2270
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2095
2271
  device_replacement: '$1'
2096
2272
  brand_replacement: 'Blusens'
2097
2273
  model_replacement: '$1'
@@ -2102,7 +2278,7 @@ device_parsers:
2102
2278
  # @note: Might collide with Maxx as AX is used also there.
2103
2279
  #########
2104
2280
  # smartphone
2105
- - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
2281
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
2106
2282
  device_replacement: '$1'
2107
2283
  brand_replacement: 'Bmobile'
2108
2284
  model_replacement: '$1'
@@ -2111,11 +2287,11 @@ device_parsers:
2111
2287
  # bq
2112
2288
  # @ref: http://bqreaders.com
2113
2289
  #########
2114
- - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
2290
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
2115
2291
  device_replacement: '$1 $2'
2116
2292
  brand_replacement: 'bq'
2117
2293
  model_replacement: '$2'
2118
- - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
2294
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2119
2295
  device_replacement: '$1'
2120
2296
  brand_replacement: 'bq'
2121
2297
  model_replacement: '$1'
@@ -2124,7 +2300,7 @@ device_parsers:
2124
2300
  # Braun Phototechnik
2125
2301
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
2126
2302
  #########
2127
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
2303
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2128
2304
  device_replacement: '$1'
2129
2305
  brand_replacement: 'Braun'
2130
2306
  model_replacement: '$1'
@@ -2133,7 +2309,7 @@ device_parsers:
2133
2309
  # Broncho
2134
2310
  # @ref: http://www.broncho.cn/
2135
2311
  #########
2136
- - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2312
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2137
2313
  device_replacement: '$1 $2'
2138
2314
  brand_replacement: '$1'
2139
2315
  model_replacement: '$2'
@@ -2142,7 +2318,7 @@ device_parsers:
2142
2318
  # Captiva
2143
2319
  # @ref: http://www.captiva-power.de
2144
2320
  #########
2145
- - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2321
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2146
2322
  device_replacement: 'Captiva $1'
2147
2323
  brand_replacement: 'Captiva'
2148
2324
  model_replacement: '$1'
@@ -2151,7 +2327,7 @@ device_parsers:
2151
2327
  # Casio
2152
2328
  # @ref: http://www.casiogzone.com/
2153
2329
  #########
2154
- - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2330
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2155
2331
  device_replacement: '$1'
2156
2332
  brand_replacement: 'Casio'
2157
2333
  model_replacement: '$1'
@@ -2160,15 +2336,15 @@ device_parsers:
2160
2336
  # Cat
2161
2337
  # @ref: http://www.cat-sound.com
2162
2338
  #########
2163
- - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2339
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2164
2340
  device_replacement: 'Cat $1'
2165
2341
  brand_replacement: 'Cat'
2166
2342
  model_replacement: '$1'
2167
- - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2343
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2168
2344
  device_replacement: 'Cat $1'
2169
2345
  brand_replacement: 'Cat'
2170
2346
  model_replacement: '$1'
2171
- - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2347
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2172
2348
  device_replacement: '$1'
2173
2349
  brand_replacement: 'Cat'
2174
2350
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2178,7 +2354,7 @@ device_parsers:
2178
2354
  # @ref: http://www.celkonmobiles.com/?_a=products
2179
2355
  # @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
2180
2356
  #########
2181
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2357
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2182
2358
  device_replacement: '$1'
2183
2359
  brand_replacement: 'Celkon'
2184
2360
  model_replacement: '$1'
@@ -2186,12 +2362,12 @@ device_parsers:
2186
2362
  device_replacement: '$1'
2187
2363
  brand_replacement: 'Celkon'
2188
2364
  model_replacement: '$1'
2189
- - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2365
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2190
2366
  device_replacement: '$1$2'
2191
2367
  brand_replacement: 'Celkon'
2192
2368
  model_replacement: '$1$2'
2193
2369
  # smartphones
2194
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2370
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2195
2371
  device_replacement: '$1'
2196
2372
  brand_replacement: 'Celkon'
2197
2373
  model_replacement: '$1'
@@ -2202,7 +2378,7 @@ device_parsers:
2202
2378
  # @brief: China manufacturer makes tablets for different small brands
2203
2379
  # (eg. http://www.zeepad.net/index.html)
2204
2380
  #########
2205
- - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2381
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2206
2382
  device_replacement: '$1'
2207
2383
  brand_replacement: 'ChangJia'
2208
2384
  model_replacement: '$1'
@@ -2211,15 +2387,15 @@ device_parsers:
2211
2387
  # Cloudfone
2212
2388
  # @ref: http://www.cloudfonemobile.com/
2213
2389
  #########
2214
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2390
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2215
2391
  device_replacement: '$1 $2 $3'
2216
2392
  brand_replacement: 'Cloudfone'
2217
2393
  model_replacement: '$1 $2 $3'
2218
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2394
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2219
2395
  device_replacement: 'Cloudfone $1 $2'
2220
2396
  brand_replacement: 'Cloudfone'
2221
2397
  model_replacement: 'Cloudfone $1 $2'
2222
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2398
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2223
2399
  device_replacement: '$1 $2'
2224
2400
  brand_replacement: 'Cloudfone'
2225
2401
  model_replacement: '$1 $2'
@@ -2228,7 +2404,7 @@ device_parsers:
2228
2404
  # Cmx
2229
2405
  # @ref: http://cmx.at/de/
2230
2406
  #########
2231
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2407
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2232
2408
  regex_flag: 'i'
2233
2409
  device_replacement: '$1'
2234
2410
  brand_replacement: 'Cmx'
@@ -2239,7 +2415,7 @@ device_parsers:
2239
2415
  # @ref: http://cobykyros.com
2240
2416
  # @note: Be careful with MID\d{3} from MpMan or Manta
2241
2417
  #########
2242
- - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
2418
+ - regex: '; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\)])'
2243
2419
  device_replacement: 'CobyKyros $1$2'
2244
2420
  brand_replacement: 'CobyKyros'
2245
2421
  model_replacement: '$1$2'
@@ -2248,7 +2424,7 @@ device_parsers:
2248
2424
  # Coolpad
2249
2425
  # @ref: ??
2250
2426
  #########
2251
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2427
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2252
2428
  device_replacement: '$1$2'
2253
2429
  brand_replacement: 'Coolpad'
2254
2430
  model_replacement: '$1$2'
@@ -2257,7 +2433,7 @@ device_parsers:
2257
2433
  # Cube
2258
2434
  # @ref: http://www.cube-tablet.com/buy-products.html
2259
2435
  #########
2260
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2436
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2261
2437
  regex_flag: 'i'
2262
2438
  device_replacement: '$1$2'
2263
2439
  brand_replacement: 'Cube'
@@ -2267,12 +2443,12 @@ device_parsers:
2267
2443
  # Cubot
2268
2444
  # @ref: http://www.cubotmall.com/
2269
2445
  #########
2270
- - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2446
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2271
2447
  regex_flag: 'i'
2272
2448
  device_replacement: '$1'
2273
2449
  brand_replacement: 'Cubot'
2274
2450
  model_replacement: '$1'
2275
- - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2451
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2276
2452
  regex_flag: 'i'
2277
2453
  device_replacement: '$1'
2278
2454
  brand_replacement: 'Cubot'
@@ -2282,7 +2458,7 @@ device_parsers:
2282
2458
  # Danew
2283
2459
  # @ref: http://www.danew.com/produits-tablette.php
2284
2460
  #########
2285
- - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2461
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2286
2462
  device_replacement: '$1'
2287
2463
  brand_replacement: 'Danew'
2288
2464
  model_replacement: '$1'
@@ -2296,39 +2472,35 @@ device_parsers:
2296
2472
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2297
2473
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2298
2474
  #########
2299
- - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2475
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2300
2476
  device_replacement: 'Dell $1$2'
2301
2477
  brand_replacement: 'Dell'
2302
2478
  model_replacement: '$1$2'
2303
- - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2479
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2304
2480
  device_replacement: 'Dell $1'
2305
2481
  brand_replacement: 'Dell'
2306
2482
  model_replacement: 'Streak'
2307
- - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2483
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2308
2484
  device_replacement: 'Dell $1'
2309
2485
  brand_replacement: 'Dell'
2310
2486
  model_replacement: 'Streak'
2311
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2487
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2312
2488
  device_replacement: 'Dell $1'
2313
2489
  brand_replacement: 'Dell'
2314
2490
  model_replacement: 'Streak Pro'
2315
- - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2491
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2316
2492
  device_replacement: 'Dell $1'
2317
2493
  brand_replacement: 'Dell'
2318
2494
  model_replacement: 'Streak 7'
2319
- - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2320
- device_replacement: 'Dell $1'
2321
- brand_replacement: 'Dell'
2322
- model_replacement: '$1'
2323
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2495
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2324
2496
  device_replacement: 'Dell $1'
2325
2497
  brand_replacement: 'Dell'
2326
2498
  model_replacement: '$1'
2327
- - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2499
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2328
2500
  device_replacement: 'Dell $1'
2329
2501
  brand_replacement: 'Dell'
2330
2502
  model_replacement: '$1'
2331
- - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2503
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2332
2504
  device_replacement: 'Dell $1'
2333
2505
  brand_replacement: 'Dell'
2334
2506
  model_replacement: '$1'
@@ -2337,7 +2509,7 @@ device_parsers:
2337
2509
  # Denver
2338
2510
  # @ref: http://www.denver-electronics.com/tablets1/
2339
2511
  #########
2340
- - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2512
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2341
2513
  device_replacement: '$1'
2342
2514
  brand_replacement: 'Denver'
2343
2515
  model_replacement: '$1'
@@ -2346,7 +2518,7 @@ device_parsers:
2346
2518
  # Dex
2347
2519
  # @ref: http://dex.ua/
2348
2520
  #########
2349
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2521
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2350
2522
  device_replacement: '$1'
2351
2523
  brand_replacement: 'Dex'
2352
2524
  model_replacement: '$1'
@@ -2355,7 +2527,7 @@ device_parsers:
2355
2527
  # DNS AirTab
2356
2528
  # @ref: http://www.dns-shop.ru/
2357
2529
  #########
2358
- - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2530
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2359
2531
  device_replacement: '$1 $2'
2360
2532
  brand_replacement: 'DNS'
2361
2533
  model_replacement: '$1 $2'
@@ -2364,43 +2536,43 @@ device_parsers:
2364
2536
  # Docomo (Operator Branded Device)
2365
2537
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2366
2538
  #########
2367
- - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2539
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2368
2540
  device_replacement: '$1'
2369
2541
  brand_replacement: 'Fujitsu'
2370
2542
  model_replacement: '$1'
2371
- - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2543
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2372
2544
  device_replacement: '$1'
2373
2545
  brand_replacement: 'HTC'
2374
2546
  model_replacement: 'Magic'
2375
- - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2547
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2376
2548
  device_replacement: '$1'
2377
2549
  brand_replacement: 'HTC'
2378
2550
  model_replacement: '$1'
2379
- - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2551
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2380
2552
  device_replacement: '$1'
2381
2553
  brand_replacement: 'LG'
2382
2554
  model_replacement: '$1'
2383
- - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2555
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2384
2556
  device_replacement: '$1'
2385
2557
  brand_replacement: 'Nec'
2386
2558
  model_replacement: '$1'
2387
- - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2559
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2388
2560
  device_replacement: '$1'
2389
2561
  brand_replacement: 'Panasonic'
2390
2562
  model_replacement: '$1'
2391
- - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2563
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2392
2564
  device_replacement: '$1'
2393
2565
  brand_replacement: 'Samsung'
2394
2566
  model_replacement: '$1'
2395
- - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2567
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2396
2568
  device_replacement: '$1'
2397
2569
  brand_replacement: 'Sharp'
2398
2570
  model_replacement: '$1'
2399
- - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2571
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2400
2572
  device_replacement: '$1'
2401
2573
  brand_replacement: 'SonyEricsson'
2402
2574
  model_replacement: '$1'
2403
- - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2575
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2404
2576
  device_replacement: '$1'
2405
2577
  brand_replacement: 'Toshiba'
2406
2578
  model_replacement: '$1'
@@ -2409,7 +2581,7 @@ device_parsers:
2409
2581
  # DOOV
2410
2582
  # @ref: http://www.doov.com.cn/
2411
2583
  #########
2412
- - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2584
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2413
2585
  device_replacement: '$1 $2'
2414
2586
  brand_replacement: 'DOOV'
2415
2587
  model_replacement: '$2'
@@ -2418,7 +2590,7 @@ device_parsers:
2418
2590
  # Enot
2419
2591
  # @ref: http://www.enot.ua/
2420
2592
  #########
2421
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2593
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2422
2594
  device_replacement: '$1 $2'
2423
2595
  brand_replacement: 'Enot'
2424
2596
  model_replacement: '$2'
@@ -2427,11 +2599,11 @@ device_parsers:
2427
2599
  # Evercoss
2428
2600
  # @ref: http://evercoss.com/android/
2429
2601
  #########
2430
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2602
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2431
2603
  device_replacement: 'CROSS $1'
2432
2604
  brand_replacement: 'Evercoss'
2433
2605
  model_replacement: 'Cross $1'
2434
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2606
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2435
2607
  device_replacement: '$1 $2'
2436
2608
  brand_replacement: 'Evercoss'
2437
2609
  model_replacement: 'Cross $2'
@@ -2440,7 +2612,7 @@ device_parsers:
2440
2612
  # Explay
2441
2613
  # @ref: http://explay.ru/
2442
2614
  #########
2443
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2615
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2444
2616
  device_replacement: '$1'
2445
2617
  brand_replacement: 'Explay'
2446
2618
  model_replacement: '$1'
@@ -2449,11 +2621,11 @@ device_parsers:
2449
2621
  # Fly
2450
2622
  # @ref: http://www.fly-phone.com/
2451
2623
  #########
2452
- - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2624
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2453
2625
  device_replacement: '$1'
2454
2626
  brand_replacement: 'Fly'
2455
2627
  model_replacement: '$1'
2456
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2628
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2457
2629
  device_replacement: '$1 $2'
2458
2630
  brand_replacement: 'Fly'
2459
2631
  model_replacement: '$2'
@@ -2462,7 +2634,7 @@ device_parsers:
2462
2634
  # Fujitsu
2463
2635
  # @ref: http://www.fujitsu.com/global/
2464
2636
  #########
2465
- - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2637
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2466
2638
  device_replacement: '$1'
2467
2639
  brand_replacement: 'Fujitsu'
2468
2640
  model_replacement: '$1'
@@ -2471,7 +2643,7 @@ device_parsers:
2471
2643
  # Galapad
2472
2644
  # @ref: http://www.galapad.net/product.html
2473
2645
  #########
2474
- - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2646
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2475
2647
  device_replacement: '$1'
2476
2648
  brand_replacement: 'Galapad'
2477
2649
  model_replacement: '$1'
@@ -2480,7 +2652,7 @@ device_parsers:
2480
2652
  # Geeksphone
2481
2653
  # @ref: http://www.geeksphone.com/
2482
2654
  #########
2483
- - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2655
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2484
2656
  device_replacement: '$1 $2'
2485
2657
  brand_replacement: '$1'
2486
2658
  model_replacement: '$2'
@@ -2489,8 +2661,7 @@ device_parsers:
2489
2661
  # Gfive
2490
2662
  # @ref: http://www.gfivemobile.com/en
2491
2663
  #########
2492
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2493
- - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2664
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2494
2665
  device_replacement: '$1 $2'
2495
2666
  brand_replacement: 'Gfive'
2496
2667
  model_replacement: '$2'
@@ -2499,16 +2670,16 @@ device_parsers:
2499
2670
  # Gionee
2500
2671
  # @ref: http://www.gionee.com/
2501
2672
  #########
2502
- - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2673
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2503
2674
  regex_flag: 'i'
2504
2675
  device_replacement: '$1 $2'
2505
2676
  brand_replacement: 'Gionee'
2506
2677
  model_replacement: '$2'
2507
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2678
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2508
2679
  device_replacement: 'Gionee $1'
2509
2680
  brand_replacement: 'Gionee'
2510
2681
  model_replacement: '$1'
2511
- - regex: '; *(E3) Build/JOP40D'
2682
+ - regex: '; {0,2}(E3) Build/JOP40D'
2512
2683
  device_replacement: 'Gionee $1'
2513
2684
  brand_replacement: 'Gionee'
2514
2685
  model_replacement: '$1'
@@ -2522,11 +2693,11 @@ device_parsers:
2522
2693
  # GoClever
2523
2694
  # @ref: http://www.goclever.com
2524
2695
  #########
2525
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2696
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2526
2697
  device_replacement: 'GoClever $1'
2527
2698
  brand_replacement: 'GoClever'
2528
2699
  model_replacement: '$1'
2529
- - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2700
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2530
2701
  device_replacement: 'GoClever $1'
2531
2702
  brand_replacement: 'GoClever'
2532
2703
  model_replacement: '$1'
@@ -2535,20 +2706,24 @@ device_parsers:
2535
2706
  # Google
2536
2707
  # @ref: http://www.google.de/glass/start/
2537
2708
  #########
2538
- - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2709
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2539
2710
  device_replacement: '$1'
2540
2711
  brand_replacement: 'Google'
2541
2712
  model_replacement: '$1'
2542
- - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2543
- device_replacement: '$1'
2713
+ - regex: '; {0,2}([g|G]oogle)? (Pixel[ a-zA-z0-9]{1,100});(?: Build|.{0,50}\) AppleWebKit)'
2714
+ device_replacement: '$2'
2544
2715
  brand_replacement: 'Google'
2545
- model_replacement: '$1'
2716
+ model_replacement: '$2'
2717
+ - regex: '; {0,2}([g|G]oogle)? (Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2718
+ device_replacement: '$2'
2719
+ brand_replacement: 'Google'
2720
+ model_replacement: '$2'
2546
2721
 
2547
2722
  #########
2548
2723
  # Gigabyte
2549
2724
  # @ref: http://gsmart.gigabytecm.com/en/
2550
2725
  #########
2551
- - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2726
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2552
2727
  device_replacement: '$1 $2'
2553
2728
  brand_replacement: 'Gigabyte'
2554
2729
  model_replacement: '$1 $2'
@@ -2557,7 +2732,7 @@ device_parsers:
2557
2732
  # Freescale development boards
2558
2733
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2559
2734
  #########
2560
- - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2735
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2561
2736
  device_replacement: 'Freescale $1'
2562
2737
  brand_replacement: 'Freescale'
2563
2738
  model_replacement: '$1'
@@ -2567,11 +2742,11 @@ device_parsers:
2567
2742
  # @ref: http://www.haier.com/
2568
2743
  # @ref: http://www.haier.com/de/produkte/tablet/
2569
2744
  #########
2570
- - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2745
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2571
2746
  device_replacement: 'Haier $1'
2572
2747
  brand_replacement: 'Haier'
2573
2748
  model_replacement: '$1'
2574
- - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2749
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2575
2750
  device_replacement: 'Haipad $1'
2576
2751
  brand_replacement: 'Haipad'
2577
2752
  model_replacement: '$1'
@@ -2581,7 +2756,7 @@ device_parsers:
2581
2756
  # @ref: http://www.haipad.net/
2582
2757
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2583
2758
  #########
2584
- - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2759
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2585
2760
  device_replacement: 'Haipad $1'
2586
2761
  brand_replacement: 'Haipad'
2587
2762
  model_replacement: '$1'
@@ -2591,7 +2766,7 @@ device_parsers:
2591
2766
  # @ref: http://www.hannspree.eu/
2592
2767
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2593
2768
  #########
2594
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2769
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2595
2770
  device_replacement: 'Hannspree $1'
2596
2771
  brand_replacement: 'Hannspree'
2597
2772
  model_replacement: '$1'
@@ -2600,11 +2775,11 @@ device_parsers:
2600
2775
  # HCLme
2601
2776
  # @ref: http://www.hclmetablet.com/india/
2602
2777
  #########
2603
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2778
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2604
2779
  device_replacement: 'HCLme $1'
2605
2780
  brand_replacement: 'HCLme'
2606
2781
  model_replacement: '$1'
2607
- - regex: '; *([^;\/]+) Build/HCL'
2782
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2608
2783
  device_replacement: 'HCLme $1'
2609
2784
  brand_replacement: 'HCLme'
2610
2785
  model_replacement: '$1'
@@ -2613,7 +2788,7 @@ device_parsers:
2613
2788
  # Hena
2614
2789
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2615
2790
  #########
2616
- - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2791
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2617
2792
  device_replacement: 'Hena $1'
2618
2793
  brand_replacement: 'Hena'
2619
2794
  model_replacement: '$1'
@@ -2622,11 +2797,11 @@ device_parsers:
2622
2797
  # Hisense
2623
2798
  # @ref: http://www.hisense.com/
2624
2799
  #########
2625
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2800
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2626
2801
  device_replacement: 'Hisense $1'
2627
2802
  brand_replacement: 'Hisense'
2628
2803
  model_replacement: '$1'
2629
- - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2804
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2630
2805
  regex_flag: 'i'
2631
2806
  device_replacement: 'Hisense $1'
2632
2807
  brand_replacement: 'Hisense'
@@ -2636,7 +2811,7 @@ device_parsers:
2636
2811
  # hitech
2637
2812
  # @ref: http://www.hitech-mobiles.com/
2638
2813
  #########
2639
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2814
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2640
2815
  device_replacement: 'AMAZE $1$2'
2641
2816
  brand_replacement: 'hitech'
2642
2817
  model_replacement: 'AMAZE $1$2'
@@ -2645,15 +2820,15 @@ device_parsers:
2645
2820
  # HP
2646
2821
  # @ref: http://www.hp.com/
2647
2822
  #########
2648
- - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2823
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2649
2824
  device_replacement: 'HP $1'
2650
2825
  brand_replacement: 'HP'
2651
2826
  model_replacement: '$1'
2652
- - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2827
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2653
2828
  device_replacement: 'HP $1'
2654
2829
  brand_replacement: 'HP'
2655
2830
  model_replacement: '$1'
2656
- - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2831
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2657
2832
  device_replacement: 'HP TouchPad'
2658
2833
  brand_replacement: 'HP'
2659
2834
  model_replacement: 'TouchPad'
@@ -2663,62 +2838,66 @@ device_parsers:
2663
2838
  # @ref: http://www.huaweidevice.com
2664
2839
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2665
2840
  #########
2666
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2841
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2667
2842
  device_replacement: '$1$2'
2668
2843
  brand_replacement: 'Huawei'
2669
2844
  model_replacement: '$2'
2670
- - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)\)'
2845
+ - regex: '; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\d+[^\);]{1,50})\)'
2671
2846
  device_replacement: '$1'
2672
2847
  brand_replacement: 'Huawei'
2673
2848
  model_replacement: '$2'
2674
- - regex: '; *(S7|M860) Build'
2849
+ - regex: '; {0,2}(S7|M860) Build'
2675
2850
  device_replacement: '$1'
2676
2851
  brand_replacement: 'Huawei'
2677
2852
  model_replacement: '$1'
2678
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2853
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2679
2854
  device_replacement: '$1$2'
2680
2855
  brand_replacement: 'Huawei'
2681
2856
  model_replacement: '$2'
2682
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2857
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2683
2858
  device_replacement: '$1$2'
2684
2859
  brand_replacement: 'Huawei'
2685
2860
  model_replacement: '$2'
2686
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2861
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2687
2862
  device_replacement: '$1$2'
2688
2863
  brand_replacement: 'Huawei'
2689
2864
  model_replacement: '$2'
2690
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2865
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2691
2866
  device_replacement: '$1$2'
2692
2867
  brand_replacement: 'Huawei'
2693
2868
  model_replacement: '$2'
2694
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
2869
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2695
2870
  device_replacement: '$1'
2696
2871
  brand_replacement: 'Huawei'
2697
2872
  model_replacement: '$1'
2698
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2873
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2699
2874
  device_replacement: '$1'
2700
2875
  brand_replacement: 'Huawei'
2701
2876
  model_replacement: '$1'
2702
- - regex: '; *([Uu])([89]\d{3}) Build'
2877
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2703
2878
  device_replacement: '$1$2'
2704
2879
  brand_replacement: 'Huawei'
2705
2880
  model_replacement: 'U$2'
2706
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
2881
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2707
2882
  device_replacement: 'Huawei Ideos$1'
2708
2883
  brand_replacement: 'Huawei'
2709
2884
  model_replacement: 'Ideos$1'
2710
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
2885
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2711
2886
  device_replacement: 'Huawei Ideos$1'
2712
2887
  brand_replacement: 'Huawei'
2713
2888
  model_replacement: 'Ideos$1'
2714
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
2889
+ - regex: '; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]'
2715
2890
  device_replacement: 'Huawei $1'
2716
2891
  brand_replacement: 'Huawei'
2717
2892
  model_replacement: '$1'
2718
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2893
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2719
2894
  device_replacement: 'Huawei $1'
2720
2895
  brand_replacement: 'Huawei'
2721
2896
  model_replacement: '$1'
2897
+ - regex: '; {0,2}([^;]{1,200}) Build/(HONOR|Honor)'
2898
+ device_replacement: 'Huawei Honor $1'
2899
+ brand_replacement: 'Huawei'
2900
+ model_replacement: 'Honor $1'
2722
2901
 
2723
2902
  #########
2724
2903
  # HTC
@@ -2726,7 +2905,7 @@ device_parsers:
2726
2905
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2727
2906
  #########
2728
2907
 
2729
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
2908
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2730
2909
  device_replacement: 'HTC $1'
2731
2910
  brand_replacement: 'HTC'
2732
2911
  model_replacement: '$1'
@@ -2734,59 +2913,59 @@ device_parsers:
2734
2913
  # Android HTC with Version Number matcher
2735
2914
  # ; HTC_0P3Z11/1.12.161.3 Build
2736
2915
  # ;HTC_A3335 V2.38.841.1 Build
2737
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2916
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2738
2917
  device_replacement: 'HTC $1'
2739
2918
  brand_replacement: 'HTC'
2740
2919
  model_replacement: '$1'
2741
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2920
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2742
2921
  device_replacement: 'HTC $1 $2'
2743
2922
  brand_replacement: 'HTC'
2744
2923
  model_replacement: '$1 $2'
2745
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2924
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2746
2925
  device_replacement: 'HTC $1 $2 $3'
2747
2926
  brand_replacement: 'HTC'
2748
2927
  model_replacement: '$1 $2 $3'
2749
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2928
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2750
2929
  device_replacement: 'HTC $1 $2 $3 $4'
2751
2930
  brand_replacement: 'HTC'
2752
2931
  model_replacement: '$1 $2 $3 $4'
2753
2932
 
2754
2933
  # Android HTC without Version Number matcher
2755
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
2934
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2756
2935
  device_replacement: 'HTC $1'
2757
2936
  brand_replacement: 'HTC'
2758
2937
  model_replacement: '$1'
2759
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
2938
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2760
2939
  device_replacement: 'HTC $1 $2'
2761
2940
  brand_replacement: 'HTC'
2762
2941
  model_replacement: '$1 $2'
2763
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
2942
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2764
2943
  device_replacement: 'HTC $1 $2 $3'
2765
2944
  brand_replacement: 'HTC'
2766
2945
  model_replacement: '$1 $2 $3'
2767
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
2946
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2768
2947
  device_replacement: 'HTC $1 $2 $3 $4'
2769
2948
  brand_replacement: 'HTC'
2770
2949
  model_replacement: '$1 $2 $3 $4'
2771
2950
 
2772
2951
  # HTC Streaming Player
2773
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
2952
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2774
2953
  device_replacement: 'HTC $1'
2775
2954
  brand_replacement: 'HTC'
2776
2955
  model_replacement: '$1'
2777
2956
  # general matcher for anything else
2778
- - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2957
+ - regex: '(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2779
2958
  regex_flag: 'i'
2780
2959
  device_replacement: 'HTC $1'
2781
2960
  brand_replacement: 'HTC'
2782
2961
  model_replacement: '$1'
2783
2962
  # Android matchers without HTC
2784
- - 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|[/;\(\)])'
2963
+ - 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|[/;\(\)])'
2785
2964
  regex_flag: 'i'
2786
2965
  device_replacement: 'HTC $1'
2787
2966
  brand_replacement: 'HTC'
2788
2967
  model_replacement: '$1'
2789
- - 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)'
2968
+ - 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)'
2790
2969
  regex_flag: 'i'
2791
2970
  device_replacement: 'HTC $1 $2'
2792
2971
  brand_replacement: 'HTC'
@@ -2796,16 +2975,16 @@ device_parsers:
2796
2975
  # Hyundai
2797
2976
  # @ref: http://www.hyundaitechnologies.com
2798
2977
  #########
2799
- - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
2978
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2800
2979
  device_replacement: 'Hyundai $1'
2801
2980
  brand_replacement: 'Hyundai'
2802
2981
  model_replacement: '$1'
2803
- - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
2982
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2804
2983
  device_replacement: 'Hyundai $1'
2805
2984
  brand_replacement: 'Hyundai'
2806
2985
  model_replacement: '$1'
2807
2986
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2808
- - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2987
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2809
2988
  device_replacement: 'Hyundai $1'
2810
2989
  brand_replacement: 'Hyundai'
2811
2990
  model_replacement: '$1'
@@ -2814,12 +2993,12 @@ device_parsers:
2814
2993
  # iBall
2815
2994
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2816
2995
  #########
2817
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2996
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2818
2997
  regex_flag: 'i'
2819
2998
  device_replacement: '$1 $2'
2820
2999
  brand_replacement: 'iBall'
2821
3000
  model_replacement: '$1 $2'
2822
- - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
3001
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2823
3002
  regex_flag: 'i'
2824
3003
  device_replacement: '$1 $2'
2825
3004
  brand_replacement: 'iBall'
@@ -2829,7 +3008,7 @@ device_parsers:
2829
3008
  # IconBIT
2830
3009
  # @ref: http://www.iconbit.com/catalog/tablets/
2831
3010
  #########
2832
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
3011
+ - regex: '; {0,2}(NT-\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\) AppleWebKit)'
2833
3012
  device_replacement: '$1'
2834
3013
  brand_replacement: 'IconBIT'
2835
3014
  model_replacement: '$1'
@@ -2838,7 +3017,7 @@ device_parsers:
2838
3017
  # IMO
2839
3018
  # @ref: http://www.ponselimo.com/
2840
3019
  #########
2841
- - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3020
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2842
3021
  regex_flag: 'i'
2843
3022
  device_replacement: '$1 $2'
2844
3023
  brand_replacement: 'IMO'
@@ -2848,12 +3027,12 @@ device_parsers:
2848
3027
  # i-mobile
2849
3028
  # @ref: http://www.i-mobilephone.com/
2850
3029
  #########
2851
- - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
3030
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2852
3031
  regex_flag: 'i'
2853
3032
  device_replacement: 'i-mobile $1'
2854
3033
  brand_replacement: 'imobile'
2855
3034
  model_replacement: '$1'
2856
- - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
3035
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2857
3036
  regex_flag: 'i'
2858
3037
  device_replacement: 'i-mobile $1'
2859
3038
  brand_replacement: 'imobile'
@@ -2863,7 +3042,7 @@ device_parsers:
2863
3042
  # Impression
2864
3043
  # @ref: http://impression.ua/planshetnye-kompyutery
2865
3044
  #########
2866
- - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
3045
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2867
3046
  device_replacement: '$1 $2'
2868
3047
  brand_replacement: 'Impression'
2869
3048
  model_replacement: '$1 $2'
@@ -2872,7 +3051,7 @@ device_parsers:
2872
3051
  # Infinix
2873
3052
  # @ref: http://www.infinixmobility.com/index.html
2874
3053
  #########
2875
- - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3054
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2876
3055
  device_replacement: '$1 $2'
2877
3056
  brand_replacement: 'Infinix'
2878
3057
  model_replacement: '$2'
@@ -2881,7 +3060,7 @@ device_parsers:
2881
3060
  # Informer
2882
3061
  # @ref: ??
2883
3062
  #########
2884
- - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
3063
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2885
3064
  device_replacement: '$1 $2'
2886
3065
  brand_replacement: 'Informer'
2887
3066
  model_replacement: '$2'
@@ -2891,7 +3070,7 @@ device_parsers:
2891
3070
  # @ref: http://www.intenso.de
2892
3071
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2893
3072
  #########
2894
- - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
3073
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2895
3074
  device_replacement: 'Intenso $1'
2896
3075
  brand_replacement: 'Intenso'
2897
3076
  model_replacement: '$1 $2'
@@ -2902,21 +3081,21 @@ device_parsers:
2902
3081
  # @note: Zync also offers a "Cloud Z5" device
2903
3082
  #########
2904
3083
  # smartphones
2905
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
3084
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2906
3085
  device_replacement: '$1$2$3'
2907
3086
  brand_replacement: 'Intex'
2908
3087
  model_replacement: '$1 $3'
2909
3088
  # matches "INTEX CLOUD X1"
2910
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3089
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2911
3090
  device_replacement: '$1 $2'
2912
3091
  brand_replacement: 'Intex'
2913
3092
  model_replacement: '$1 $2'
2914
3093
  # tablets
2915
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3094
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2916
3095
  device_replacement: '$1 $2 $3'
2917
3096
  brand_replacement: 'Intex'
2918
3097
  model_replacement: 'iBuddy $2 $3'
2919
- - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
3098
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2920
3099
  device_replacement: '$1 $2'
2921
3100
  brand_replacement: 'Intex'
2922
3101
  model_replacement: 'iBuddy $2'
@@ -2925,7 +3104,7 @@ device_parsers:
2925
3104
  # iOCEAN
2926
3105
  # @ref: http://www.iocean.cc/
2927
3106
  #########
2928
- - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
3107
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2929
3108
  regex_flag: 'i'
2930
3109
  device_replacement: '$1 $2'
2931
3110
  brand_replacement: 'iOCEAN'
@@ -2935,7 +3114,7 @@ device_parsers:
2935
3114
  # i.onik
2936
3115
  # @ref: http://www.i-onik.de/
2937
3116
  #########
2938
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
3117
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2939
3118
  device_replacement: 'ionik $1'
2940
3119
  brand_replacement: 'ionik'
2941
3120
  model_replacement: '$1'
@@ -2944,7 +3123,7 @@ device_parsers:
2944
3123
  # IRU.ru
2945
3124
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2946
3125
  #########
2947
- - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
3126
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2948
3127
  device_replacement: '$1'
2949
3128
  brand_replacement: 'Iru'
2950
3129
  model_replacement: '$1'
@@ -2953,7 +3132,7 @@ device_parsers:
2953
3132
  # Itel Mobile
2954
3133
  # @ref: https://www.itel-mobile.com/global/products/
2955
3134
  #########
2956
- - regex: '; *itel ([^;/]*)(?: Build|\) AppleWebKit)'
3135
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
2957
3136
  device_replacement: 'Itel $1'
2958
3137
  brand_replacement: 'Itel'
2959
3138
  model_replacement: '$1'
@@ -2963,11 +3142,11 @@ device_parsers:
2963
3142
  # @ref: http://www.ivio.com/mobile.php
2964
3143
  # @models: DG80,DG20,DE38,DE88,MD70
2965
3144
  #########
2966
- - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
3145
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2967
3146
  device_replacement: '$1'
2968
3147
  brand_replacement: 'Ivio'
2969
3148
  model_replacement: '$1'
2970
- - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3149
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2971
3150
  device_replacement: '$1'
2972
3151
  brand_replacement: 'Ivio'
2973
3152
  model_replacement: '$1'
@@ -2976,7 +3155,7 @@ device_parsers:
2976
3155
  # Jaytech
2977
3156
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2978
3157
  #########
2979
- - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
3158
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2980
3159
  device_replacement: '$1'
2981
3160
  brand_replacement: 'Jaytech'
2982
3161
  model_replacement: '$1'
@@ -2985,7 +3164,7 @@ device_parsers:
2985
3164
  # Jiayu
2986
3165
  # @ref: http://www.ejiayu.com/en/Product.html
2987
3166
  #########
2988
- - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
3167
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2989
3168
  device_replacement: '$1'
2990
3169
  brand_replacement: 'Jiayu'
2991
3170
  model_replacement: '$1'
@@ -2994,7 +3173,7 @@ device_parsers:
2994
3173
  # JXD
2995
3174
  # @ref: http://www.jxd.hk/
2996
3175
  #########
2997
- - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3176
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2998
3177
  device_replacement: '$1 $2'
2999
3178
  brand_replacement: 'JXD'
3000
3179
  model_replacement: '$2'
@@ -3003,16 +3182,16 @@ device_parsers:
3003
3182
  # Karbonn
3004
3183
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
3005
3184
  #########
3006
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3185
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
3007
3186
  regex_flag: 'i'
3008
3187
  device_replacement: '$1'
3009
3188
  brand_replacement: 'Karbonn'
3010
3189
  model_replacement: '$1'
3011
- - regex: '; *([^;]+) Build/Karbonn'
3190
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
3012
3191
  device_replacement: '$1'
3013
3192
  brand_replacement: 'Karbonn'
3014
3193
  model_replacement: '$1'
3015
- - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3194
+ - regex: '; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3016
3195
  device_replacement: '$1'
3017
3196
  brand_replacement: 'Karbonn'
3018
3197
  model_replacement: '$1'
@@ -3021,84 +3200,84 @@ device_parsers:
3021
3200
  # KDDI (Operator Branded Device)
3022
3201
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3023
3202
  #########
3024
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3203
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3025
3204
  device_replacement: '$1'
3026
3205
  brand_replacement: 'Sharp'
3027
3206
  model_replacement: '$1'
3028
- - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
3207
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
3029
3208
  device_replacement: '$1'
3030
3209
  brand_replacement: 'Regza'
3031
3210
  model_replacement: '$1'
3032
- - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3211
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3033
3212
  device_replacement: '$1'
3034
3213
  brand_replacement: 'Pantech'
3035
3214
  model_replacement: '$1'
3036
- - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
3215
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
3037
3216
  device_replacement: '$1'
3038
3217
  brand_replacement: 'SonyEricsson'
3039
3218
  model_replacement: 'Xperia Acro'
3040
- - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
3219
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
3041
3220
  device_replacement: '$1'
3042
3221
  brand_replacement: 'Casio'
3043
3222
  model_replacement: 'GzOne $1'
3044
- - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
3223
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
3045
3224
  device_replacement: '$1'
3046
3225
  brand_replacement: 'LG'
3047
3226
  model_replacement: 'Optimus X'
3048
- - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
3227
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
3049
3228
  device_replacement: '$1'
3050
3229
  brand_replacement: 'Medias'
3051
3230
  model_replacement: '$1'
3052
- - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
3231
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
3053
3232
  device_replacement: '$1'
3054
3233
  brand_replacement: 'Pantech'
3055
3234
  model_replacement: 'MIRACH'
3056
- - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
3235
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
3057
3236
  device_replacement: '$1'
3058
3237
  brand_replacement: 'Fujitsu'
3059
3238
  model_replacement: 'Arrows ES'
3060
3239
  # @ref: https://ja.wikipedia.org/wiki/IS12M
3061
- - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
3240
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
3062
3241
  device_replacement: '$1'
3063
3242
  brand_replacement: 'Motorola'
3064
3243
  model_replacement: 'XT909'
3065
- - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
3244
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
3066
3245
  device_replacement: '$1'
3067
3246
  brand_replacement: 'SonyEricsson'
3068
3247
  model_replacement: 'Xperia Acro HD'
3069
- - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
3248
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
3070
3249
  device_replacement: '$1'
3071
3250
  brand_replacement: 'Fujitsu'
3072
3251
  model_replacement: 'Arrowz Z'
3073
- - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
3252
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
3074
3253
  device_replacement: '$1'
3075
3254
  brand_replacement: 'HTC'
3076
3255
  model_replacement: 'EVO'
3077
- - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
3256
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
3078
3257
  device_replacement: '$1'
3079
3258
  brand_replacement: 'Kyocera'
3080
3259
  model_replacement: 'DIGNO'
3081
- - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
3260
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
3082
3261
  device_replacement: '$1'
3083
3262
  brand_replacement: 'Motorola'
3084
3263
  model_replacement: 'Photon'
3085
- - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
3264
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
3086
3265
  device_replacement: '$1'
3087
3266
  brand_replacement: 'Samsung'
3088
3267
  model_replacement: 'GALAXY S II WiMAX'
3089
- - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
3268
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
3090
3269
  device_replacement: '$1'
3091
3270
  brand_replacement: 'HTC'
3092
3271
  model_replacement: 'EVO 3D'
3093
- - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
3272
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
3094
3273
  device_replacement: '$1'
3095
3274
  brand_replacement: 'HTC'
3096
3275
  model_replacement: 'J'
3097
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3276
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3098
3277
  device_replacement: '$1'
3099
3278
  brand_replacement: 'KDDI'
3100
3279
  model_replacement: '$1'
3101
- - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
3280
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3102
3281
  device_replacement: '$1'
3103
3282
  brand_replacement: 'KDDI'
3104
3283
  model_replacement: '$1'
@@ -3107,7 +3286,7 @@ device_parsers:
3107
3286
  # Kingcom
3108
3287
  # @ref: http://www.e-kingcom.com
3109
3288
  #########
3110
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3289
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3111
3290
  device_replacement: '$1 $2'
3112
3291
  brand_replacement: 'Kingcom'
3113
3292
  model_replacement: '$1 $2'
@@ -3117,7 +3296,7 @@ device_parsers:
3117
3296
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
3118
3297
  # @ref: http://www.kobo.com/devices#tablets
3119
3298
  #########
3120
- - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3299
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3121
3300
  regex_flag: 'i'
3122
3301
  device_replacement: '$1'
3123
3302
  brand_replacement: 'Kobo'
@@ -3131,7 +3310,7 @@ device_parsers:
3131
3310
  # K-Touch
3132
3311
  # @ref: ??
3133
3312
  #########
3134
- - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3313
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3135
3314
  regex_flag: 'i'
3136
3315
  device_replacement: '$1 $2'
3137
3316
  brand_replacement: 'Ktouch'
@@ -3141,7 +3320,7 @@ device_parsers:
3141
3320
  # KT Tech
3142
3321
  # @ref: http://www.kttech.co.kr
3143
3322
  #########
3144
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3323
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3145
3324
  regex_flag: 'i'
3146
3325
  device_replacement: '$1'
3147
3326
  brand_replacement: 'KTtech'
@@ -3151,7 +3330,7 @@ device_parsers:
3151
3330
  # Kyocera
3152
3331
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3153
3332
  #########
3154
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3333
+ - regex: '; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3155
3334
  device_replacement: '$1'
3156
3335
  brand_replacement: 'Kyocera'
3157
3336
  model_replacement: '$1'
@@ -3160,12 +3339,12 @@ device_parsers:
3160
3339
  # Lava
3161
3340
  # @ref: http://www.lavamobiles.com/
3162
3341
  #########
3163
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3342
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3164
3343
  regex_flag: 'i'
3165
3344
  device_replacement: 'Iris $1'
3166
3345
  brand_replacement: 'Lava'
3167
3346
  model_replacement: 'Iris $1'
3168
- - regex: '; *LAVA[ _]([^;/]+) Build'
3347
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3169
3348
  device_replacement: '$1'
3170
3349
  brand_replacement: 'Lava'
3171
3350
  model_replacement: '$1'
@@ -3174,7 +3353,7 @@ device_parsers:
3174
3353
  # Lemon
3175
3354
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3176
3355
  #########
3177
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3356
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3178
3357
  device_replacement: 'Lemon $1$2'
3179
3358
  brand_replacement: 'Lemon'
3180
3359
  model_replacement: '$1$2'
@@ -3183,11 +3362,11 @@ device_parsers:
3183
3362
  # Lenco
3184
3363
  # @ref: http://www.lenco.com/c/tablets/
3185
3364
  #########
3186
- - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3365
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3187
3366
  device_replacement: 'Lenco $1'
3188
3367
  brand_replacement: 'Lenco'
3189
3368
  model_replacement: '$1'
3190
- - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3369
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3191
3370
  device_replacement: 'Lenco $1'
3192
3371
  brand_replacement: 'Lenco'
3193
3372
  model_replacement: '$1'
@@ -3196,23 +3375,23 @@ device_parsers:
3196
3375
  # Lenovo
3197
3376
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3198
3377
  #########
3199
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3378
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3200
3379
  device_replacement: '$1'
3201
3380
  brand_replacement: 'Lenovo'
3202
3381
  model_replacement: '$1'
3203
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3382
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3204
3383
  device_replacement: 'Lenovo $1 $2'
3205
3384
  brand_replacement: 'Lenovo'
3206
3385
  model_replacement: '$1 $2'
3207
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3386
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3208
3387
  device_replacement: 'Lenovo $1 $2'
3209
3388
  brand_replacement: 'Lenovo'
3210
3389
  model_replacement: '$1 $2'
3211
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3390
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3212
3391
  device_replacement: 'Lenovo $1 $2'
3213
3392
  brand_replacement: 'Lenovo'
3214
3393
  model_replacement: '$1 $2'
3215
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3394
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3216
3395
  device_replacement: 'Lenovo $1'
3217
3396
  brand_replacement: 'Lenovo'
3218
3397
  model_replacement: '$1'
@@ -3220,11 +3399,11 @@ device_parsers:
3220
3399
  device_replacement: 'Lenovo $1 $2 $3'
3221
3400
  brand_replacement: 'Lenovo'
3222
3401
  model_replacement: '$1 $2 $3'
3223
- - regex: '; *(?:Ideapad |)K1 Build/'
3402
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3224
3403
  device_replacement: 'Lenovo Ideapad K1'
3225
3404
  brand_replacement: 'Lenovo'
3226
3405
  model_replacement: 'Ideapad K1'
3227
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3406
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3228
3407
  device_replacement: '$1'
3229
3408
  brand_replacement: 'Lenovo'
3230
3409
  model_replacement: '$1'
@@ -3237,7 +3416,7 @@ device_parsers:
3237
3416
  # Lexibook
3238
3417
  # @ref: http://www.lexibook.com/fr
3239
3418
  #########
3240
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3419
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3241
3420
  device_replacement: '$1$2'
3242
3421
  brand_replacement: 'Lexibook'
3243
3422
  model_replacement: '$1$2'
@@ -3246,23 +3425,23 @@ device_parsers:
3246
3425
  # LG
3247
3426
  # @ref: http://www.lg.com/uk/mobile
3248
3427
  #########
3249
- - 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|;)'
3428
+ - 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|;)'
3250
3429
  device_replacement: '$1'
3251
3430
  brand_replacement: 'LG'
3252
3431
  model_replacement: '$1'
3253
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
3432
+ - regex: '[;:] {0,2}(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) {0,2}(?:Build|[;\)])'
3254
3433
  device_replacement: '$1'
3255
3434
  brand_replacement: 'LG'
3256
3435
  model_replacement: '$1'
3257
- - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3436
+ - regex: '; {0,2}(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3258
3437
  device_replacement: '$1$2'
3259
3438
  brand_replacement: 'LG'
3260
3439
  model_replacement: '$2'
3261
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3440
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3262
3441
  device_replacement: '$1$2'
3263
3442
  brand_replacement: 'LG'
3264
3443
  model_replacement: '$2'
3265
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3444
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3266
3445
  device_replacement: '$1 $2'
3267
3446
  brand_replacement: 'LG'
3268
3447
  model_replacement: '$2'
@@ -3275,11 +3454,11 @@ device_parsers:
3275
3454
  # Malata
3276
3455
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3277
3456
  #########
3278
- - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3457
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3279
3458
  device_replacement: '$1'
3280
3459
  brand_replacement: 'Malata'
3281
3460
  model_replacement: '$1'
3282
- - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3461
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3283
3462
  device_replacement: '$1'
3284
3463
  brand_replacement: 'Malata'
3285
3464
  model_replacement: '$1'
@@ -3288,7 +3467,7 @@ device_parsers:
3288
3467
  # Manta
3289
3468
  # @ref: http://www.manta.com.pl/en
3290
3469
  #########
3291
- - 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)'
3470
+ - 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)'
3292
3471
  device_replacement: '$1'
3293
3472
  brand_replacement: 'Manta'
3294
3473
  model_replacement: '$1'
@@ -3297,7 +3476,7 @@ device_parsers:
3297
3476
  # Match
3298
3477
  # @ref: http://www.match.net.cn/products.asp
3299
3478
  #########
3300
- - 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)'
3479
+ - 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)'
3301
3480
  device_replacement: '$1'
3302
3481
  brand_replacement: 'Match'
3303
3482
  model_replacement: '$1'
@@ -3311,7 +3490,7 @@ device_parsers:
3311
3490
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3312
3491
  # @note: Need more User-Agents!!!
3313
3492
  #########
3314
- - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3493
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3315
3494
  device_replacement: 'Maxx $1'
3316
3495
  brand_replacement: 'Maxx'
3317
3496
  model_replacement: '$1'
@@ -3320,11 +3499,11 @@ device_parsers:
3320
3499
  # Mediacom
3321
3500
  # @ref: http://www.mediacomeurope.it/
3322
3501
  #########
3323
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3502
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3324
3503
  device_replacement: 'Mediacom $1'
3325
3504
  brand_replacement: 'Mediacom'
3326
3505
  model_replacement: '$1'
3327
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3506
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3328
3507
  device_replacement: 'Mediacom $1'
3329
3508
  brand_replacement: 'Mediacom'
3330
3509
  model_replacement: '$1'
@@ -3333,12 +3512,12 @@ device_parsers:
3333
3512
  # Medion
3334
3513
  # @ref: http://www.medion.com/en/
3335
3514
  #########
3336
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3515
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3337
3516
  regex_flag: 'i'
3338
3517
  device_replacement: 'Medion Lifetab $1'
3339
3518
  brand_replacement: 'Medion'
3340
3519
  model_replacement: 'Lifetab $1'
3341
- - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3520
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3342
3521
  device_replacement: 'Medion $1'
3343
3522
  brand_replacement: 'Medion'
3344
3523
  model_replacement: '$1'
@@ -3347,11 +3526,11 @@ device_parsers:
3347
3526
  # Meizu
3348
3527
  # @ref: http://www.meizu.com
3349
3528
  #########
3350
- - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3529
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3351
3530
  device_replacement: 'Meizu $1'
3352
3531
  brand_replacement: 'Meizu'
3353
3532
  model_replacement: '$1'
3354
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3533
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3355
3534
  device_replacement: 'Meizu $1'
3356
3535
  brand_replacement: 'Meizu'
3357
3536
  model_replacement: '$1'
@@ -3360,28 +3539,28 @@ device_parsers:
3360
3539
  # Micromax
3361
3540
  # @ref: http://www.micromaxinfo.com
3362
3541
  #########
3363
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3542
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3364
3543
  regex_flag: 'i'
3365
3544
  device_replacement: 'Micromax $1$2'
3366
3545
  brand_replacement: 'Micromax'
3367
3546
  model_replacement: '$1$2'
3368
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3547
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3369
3548
  regex_flag: 'i'
3370
3549
  device_replacement: 'Micromax $1'
3371
3550
  brand_replacement: 'Micromax'
3372
3551
  model_replacement: '$1'
3373
3552
  # be carefull here with Acer e.g. A500
3374
- - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3553
+ - regex: '; {0,2}(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3375
3554
  regex_flag: 'i'
3376
3555
  device_replacement: 'Micromax $1'
3377
3556
  brand_replacement: 'Micromax'
3378
3557
  model_replacement: '$1'
3379
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3558
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3380
3559
  regex_flag: 'i'
3381
3560
  device_replacement: 'Micromax $1'
3382
3561
  brand_replacement: 'Micromax'
3383
3562
  model_replacement: '$1'
3384
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3563
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3385
3564
  regex_flag: 'i'
3386
3565
  device_replacement: 'Micromax $1'
3387
3566
  brand_replacement: 'Micromax'
@@ -3391,7 +3570,7 @@ device_parsers:
3391
3570
  # Mito
3392
3571
  # @ref: http://new.mitomobile.com/
3393
3572
  #########
3394
- - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3573
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3395
3574
  regex_flag: 'i'
3396
3575
  device_replacement: '$1 $2'
3397
3576
  brand_replacement: 'Mito'
@@ -3401,7 +3580,7 @@ device_parsers:
3401
3580
  # Mobistel
3402
3581
  # @ref: http://www.mobistel.com/
3403
3582
  #########
3404
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3583
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3405
3584
  regex_flag: 'i'
3406
3585
  device_replacement: '$1 $2'
3407
3586
  brand_replacement: 'Mobistel'
@@ -3411,12 +3590,12 @@ device_parsers:
3411
3590
  # Modecom
3412
3591
  # @ref: http://www.modecom.eu/tablets/portal/
3413
3592
  #########
3414
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3593
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3415
3594
  regex_flag: 'i'
3416
3595
  device_replacement: '$1$2 $3'
3417
3596
  brand_replacement: 'Modecom'
3418
3597
  model_replacement: '$2 $3'
3419
- - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3598
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3420
3599
  regex_flag: 'i'
3421
3600
  device_replacement: '$1 $2'
3422
3601
  brand_replacement: 'Modecom'
@@ -3426,32 +3605,32 @@ device_parsers:
3426
3605
  # Motorola
3427
3606
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3428
3607
  #########
3429
- - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3608
+ - regex: '; {0,2}(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3430
3609
  device_replacement: 'Motorola $1'
3431
3610
  brand_replacement: 'Motorola'
3432
3611
  model_replacement: '$1'
3433
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3612
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3434
3613
  device_replacement: 'Motorola $1$2'
3435
3614
  brand_replacement: 'Motorola'
3436
3615
  model_replacement: '$2'
3437
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3616
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3438
3617
  regex_flag: 'i'
3439
3618
  device_replacement: 'Motorola $1'
3440
3619
  brand_replacement: 'Motorola'
3441
3620
  model_replacement: 'DROID X'
3442
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3621
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3443
3622
  device_replacement: 'Motorola $1'
3444
3623
  brand_replacement: 'Motorola'
3445
3624
  model_replacement: '$1'
3446
- - 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'
3625
+ - 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'
3447
3626
  device_replacement: '$1'
3448
3627
  brand_replacement: 'Motorola'
3449
3628
  model_replacement: '$1'
3450
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3629
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3451
3630
  device_replacement: '$1$2'
3452
3631
  brand_replacement: 'Motorola'
3453
3632
  model_replacement: '$2'
3454
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3633
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3455
3634
  device_replacement: '$1$2'
3456
3635
  brand_replacement: 'Motorola'
3457
3636
  model_replacement: '$2'
@@ -3460,7 +3639,7 @@ device_parsers:
3460
3639
  # MpMan
3461
3640
  # @ref: http://www.mpmaneurope.com
3462
3641
  #########
3463
- - 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)'
3642
+ - 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)'
3464
3643
  device_replacement: '$1'
3465
3644
  brand_replacement: 'Mpman'
3466
3645
  model_replacement: '$1'
@@ -3469,7 +3648,7 @@ device_parsers:
3469
3648
  # MSI
3470
3649
  # @ref: http://www.msi.com/product/windpad/
3471
3650
  #########
3472
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3651
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3473
3652
  regex_flag: 'i'
3474
3653
  device_replacement: '$1'
3475
3654
  brand_replacement: 'Msi'
@@ -3479,7 +3658,7 @@ device_parsers:
3479
3658
  # Multilaser
3480
3659
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3481
3660
  #########
3482
- - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3661
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3483
3662
  device_replacement: '$1'
3484
3663
  brand_replacement: 'Multilaser'
3485
3664
  model_replacement: '$1'
@@ -3488,15 +3667,15 @@ device_parsers:
3488
3667
  # MyPhone
3489
3668
  # @ref: http://myphone.com.ph/
3490
3669
  #########
3491
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3670
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3492
3671
  device_replacement: '$1$2 $3'
3493
3672
  brand_replacement: 'MyPhone'
3494
3673
  model_replacement: '$1$2 $3'
3495
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3674
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3496
3675
  device_replacement: '$1$2 $3'
3497
3676
  brand_replacement: 'MyPhone'
3498
3677
  model_replacement: '$3'
3499
- - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3678
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3500
3679
  regex_flag: 'i'
3501
3680
  device_replacement: '$1 $2'
3502
3681
  brand_replacement: 'MyPhone'
@@ -3506,7 +3685,7 @@ device_parsers:
3506
3685
  # Mytab
3507
3686
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3508
3687
  #########
3509
- - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3688
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3510
3689
  device_replacement: '$1'
3511
3690
  brand_replacement: 'Mytab'
3512
3691
  model_replacement: '$1'
@@ -3515,7 +3694,7 @@ device_parsers:
3515
3694
  # Nabi
3516
3695
  # @ref: https://www.nabitablet.com
3517
3696
  #########
3518
- - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3697
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3519
3698
  device_replacement: '$1$2'
3520
3699
  brand_replacement: 'Nabi'
3521
3700
  model_replacement: '$2'
@@ -3524,15 +3703,15 @@ device_parsers:
3524
3703
  # Nec Medias
3525
3704
  # @ref: http://www.n-keitai.com/
3526
3705
  #########
3527
- - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3706
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3528
3707
  device_replacement: '$1'
3529
3708
  brand_replacement: 'Nec'
3530
3709
  model_replacement: '$1'
3531
- - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3710
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3532
3711
  device_replacement: '$1$2'
3533
3712
  brand_replacement: 'Nec'
3534
3713
  model_replacement: '$2'
3535
- - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3714
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3536
3715
  device_replacement: '$1'
3537
3716
  brand_replacement: 'Nec'
3538
3717
  model_replacement: 'Lifetouch Note'
@@ -3541,7 +3720,7 @@ device_parsers:
3541
3720
  # Nextbook
3542
3721
  # @ref: http://nextbookusa.com
3543
3722
  #########
3544
- - 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|[\);])'
3723
+ - 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|[\);])'
3545
3724
  device_replacement: '$1'
3546
3725
  brand_replacement: 'Nextbook'
3547
3726
  model_replacement: '$1'
@@ -3550,12 +3729,12 @@ device_parsers:
3550
3729
  # Nokia
3551
3730
  # @ref: http://www.nokia.com
3552
3731
  #########
3553
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3732
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3554
3733
  regex_flag: 'i'
3555
3734
  device_replacement: '$1$2$3'
3556
3735
  brand_replacement: 'Nokia'
3557
3736
  model_replacement: '$3'
3558
- - regex: '; *(TA\-\d{4})(?: Build|\) AppleWebKit)'
3737
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3559
3738
  device_replacement: 'Nokia $1'
3560
3739
  brand_replacement: 'Nokia'
3561
3740
  model_replacement: '$1'
@@ -3565,11 +3744,11 @@ device_parsers:
3565
3744
  # @ref:
3566
3745
  # TODO nook browser/1.0
3567
3746
  #########
3568
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3747
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3569
3748
  device_replacement: '$1$2'
3570
3749
  brand_replacement: 'Nook'
3571
3750
  model_replacement: '$2'
3572
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3751
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3573
3752
  device_replacement: '$1$2'
3574
3753
  brand_replacement: 'Nook'
3575
3754
  model_replacement: '$2'
@@ -3582,7 +3761,7 @@ device_parsers:
3582
3761
  # Olivetti
3583
3762
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3584
3763
  #########
3585
- - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3764
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3586
3765
  device_replacement: 'Olivetti $1'
3587
3766
  brand_replacement: 'Olivetti'
3588
3767
  model_replacement: '$1'
@@ -3593,7 +3772,7 @@ device_parsers:
3593
3772
  # @note: MID tablets might get matched by CobyKyros first
3594
3773
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3595
3774
  #########
3596
- - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3775
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3597
3776
  device_replacement: 'Omega $1'
3598
3777
  brand_replacement: 'Omega'
3599
3778
  model_replacement: '$1'
@@ -3606,7 +3785,7 @@ device_parsers:
3606
3785
  # OpenPeak
3607
3786
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3608
3787
  #########
3609
- - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3788
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3610
3789
  device_replacement: 'Openpeak $1'
3611
3790
  brand_replacement: 'Openpeak'
3612
3791
  model_replacement: '$1'
@@ -3615,18 +3794,18 @@ device_parsers:
3615
3794
  # Oppo
3616
3795
  # @ref: http://en.oppo.com/products/
3617
3796
  #########
3618
- - 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)'
3797
+ - 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)'
3619
3798
  device_replacement: 'Oppo $1'
3620
3799
  brand_replacement: 'Oppo'
3621
3800
  model_replacement: '$1'
3622
- - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3801
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3623
3802
  device_replacement: 'Oppo $1'
3624
3803
  brand_replacement: 'Oppo'
3625
3804
  model_replacement: '$1'
3626
- - regex: '; *(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3805
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3627
3806
  device_replacement: 'Oppo $1'
3628
3807
  brand_replacement: 'Oppo'
3629
- - regex: '; *(A1601)(?: Build|\) AppleWebKit)'
3808
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3630
3809
  device_replacement: 'Oppo F1s'
3631
3810
  brand_replacement: 'Oppo'
3632
3811
  model_replacement: '$1'
@@ -3635,20 +3814,20 @@ device_parsers:
3635
3814
  # Odys
3636
3815
  # @ref: http://odys.de
3637
3816
  #########
3638
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3817
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3639
3818
  device_replacement: 'Odys $1'
3640
3819
  brand_replacement: 'Odys'
3641
3820
  model_replacement: '$1'
3642
- - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3821
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3643
3822
  device_replacement: 'Odys $1 $2'
3644
3823
  brand_replacement: 'Odys'
3645
3824
  model_replacement: '$1 $2'
3646
- - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3825
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3647
3826
  device_replacement: 'Odys $1 $2 $3'
3648
3827
  brand_replacement: 'Odys'
3649
3828
  model_replacement: '$1 $2 $3'
3650
3829
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3651
- - 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)'
3830
+ - 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)'
3652
3831
  device_replacement: 'Odys $1'
3653
3832
  brand_replacement: 'Odys'
3654
3833
  model_replacement: '$1'
@@ -3665,12 +3844,24 @@ device_parsers:
3665
3844
  device_replacement: 'OnePlus $1'
3666
3845
  brand_replacement: 'OnePlus'
3667
3846
  model_replacement: '$1'
3847
+ - 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)'
3848
+ device_replacement: 'OnePlus $1'
3849
+ brand_replacement: 'OnePlus'
3850
+ model_replacement: 'OnePlus $1'
3851
+ - regex: '; (OnePlus[ a-zA-z0-9]{0,50});((?: Build|.{0,50}\) AppleWebKit))'
3852
+ device_replacement: '$1'
3853
+ brand_replacement: 'OnePlus'
3854
+ model_replacement: '$1'
3855
+ - regex: '; (OnePlus[ a-zA-z0-9]{0,50})((?: Build|\) AppleWebKit))'
3856
+ device_replacement: '$1'
3857
+ brand_replacement: 'OnePlus'
3858
+ model_replacement: '$1'
3668
3859
 
3669
3860
  #########
3670
3861
  # Orion
3671
3862
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3672
3863
  #########
3673
- - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
3864
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3674
3865
  device_replacement: 'Orion $1'
3675
3866
  brand_replacement: 'Orion'
3676
3867
  model_replacement: '$1'
@@ -3679,7 +3870,7 @@ device_parsers:
3679
3870
  # PackardBell
3680
3871
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3681
3872
  #########
3682
- - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
3873
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3683
3874
  device_replacement: 'PackardBell $1'
3684
3875
  brand_replacement: 'PackardBell'
3685
3876
  model_replacement: '$1'
@@ -3690,17 +3881,17 @@ device_parsers:
3690
3881
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3691
3882
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3692
3883
  #########
3693
- - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
3884
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3694
3885
  device_replacement: '$1 $2'
3695
3886
  brand_replacement: '$1'
3696
3887
  model_replacement: '$2'
3697
3888
  # Toughpad
3698
- - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3889
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3699
3890
  device_replacement: 'Panasonic $1'
3700
3891
  brand_replacement: 'Panasonic'
3701
3892
  model_replacement: '$1'
3702
3893
  # Eluga Power
3703
- - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
3894
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3704
3895
  device_replacement: 'Panasonic $1'
3705
3896
  brand_replacement: 'Panasonic'
3706
3897
  model_replacement: '$1'
@@ -3711,15 +3902,15 @@ device_parsers:
3711
3902
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3712
3903
  # @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
3713
3904
  #########
3714
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
3905
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3715
3906
  device_replacement: 'Pantech $1$2'
3716
3907
  brand_replacement: 'Pantech'
3717
3908
  model_replacement: '$1$2'
3718
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3909
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3719
3910
  device_replacement: '$1'
3720
3911
  brand_replacement: 'Pantech'
3721
3912
  model_replacement: '$1'
3722
- - regex: '; *Pantech([^;/]+).* Build/'
3913
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3723
3914
  device_replacement: 'Pantech $1'
3724
3915
  brand_replacement: 'Pantech'
3725
3916
  model_replacement: '$1'
@@ -3728,7 +3919,7 @@ device_parsers:
3728
3919
  # Papayre
3729
3920
  # @ref: http://grammata.es/
3730
3921
  #########
3731
- - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3922
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3732
3923
  regex_flag: 'i'
3733
3924
  device_replacement: '$1 $2'
3734
3925
  brand_replacement: 'Papyre'
@@ -3738,7 +3929,7 @@ device_parsers:
3738
3929
  # Pearl
3739
3930
  # @ref: http://www.pearl.de/c-1540.shtml
3740
3931
  #########
3741
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
3932
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3742
3933
  device_replacement: 'Pearl $1'
3743
3934
  brand_replacement: 'Pearl'
3744
3935
  model_replacement: '$1'
@@ -3751,11 +3942,11 @@ device_parsers:
3751
3942
  device_replacement: 'Phicomm $1'
3752
3943
  brand_replacement: 'Phicomm'
3753
3944
  model_replacement: '$1'
3754
- - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
3945
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3755
3946
  device_replacement: 'Phicomm $1'
3756
3947
  brand_replacement: 'Phicomm'
3757
3948
  model_replacement: '$1'
3758
- - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
3949
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3759
3950
  device_replacement: 'Phicomm $1'
3760
3951
  brand_replacement: 'Phicomm'
3761
3952
  model_replacement: '$1'
@@ -3767,11 +3958,11 @@ device_parsers:
3767
3958
  # @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
3768
3959
  #########
3769
3960
  # @note: this a best guess according to available philips models. Need more User-Agents
3770
- - 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)'
3961
+ - 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)'
3771
3962
  device_replacement: '$1'
3772
3963
  brand_replacement: 'Philips'
3773
3964
  model_replacement: '$1'
3774
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3965
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3775
3966
  device_replacement: 'Philips $1'
3776
3967
  brand_replacement: 'Philips'
3777
3968
  model_replacement: '$1'
@@ -3780,7 +3971,7 @@ device_parsers:
3780
3971
  # Pipo
3781
3972
  # @ref: http://www.pipo.cn/En/
3782
3973
  #########
3783
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3974
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3784
3975
  device_replacement: 'Pipo $1$2'
3785
3976
  brand_replacement: 'Pipo'
3786
3977
  model_replacement: '$1$2'
@@ -3789,7 +3980,7 @@ device_parsers:
3789
3980
  # Ployer
3790
3981
  # @ref: http://en.ployer.cn/
3791
3982
  #########
3792
- - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
3983
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3793
3984
  device_replacement: '$1'
3794
3985
  brand_replacement: 'Ployer'
3795
3986
  model_replacement: '$1'
@@ -3798,11 +3989,11 @@ device_parsers:
3798
3989
  # Polaroid/ Acho
3799
3990
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3800
3991
  #########
3801
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
3992
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3802
3993
  device_replacement: '$1'
3803
3994
  brand_replacement: 'Polaroid'
3804
3995
  model_replacement: '$1'
3805
- - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3996
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3806
3997
  device_replacement: '$1'
3807
3998
  brand_replacement: 'Polaroid'
3808
3999
  model_replacement: '$1'
@@ -3812,7 +4003,7 @@ device_parsers:
3812
4003
  # @ref: http://pompmobileshop.com/
3813
4004
  #########
3814
4005
  #~ TODO
3815
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
4006
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3816
4007
  device_replacement: '$1 $2'
3817
4008
  brand_replacement: 'Pomp'
3818
4009
  model_replacement: '$2'
@@ -3821,11 +4012,11 @@ device_parsers:
3821
4012
  # Positivo
3822
4013
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3823
4014
  #########
3824
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
4015
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3825
4016
  device_replacement: '$1'
3826
4017
  brand_replacement: 'Positivo'
3827
4018
  model_replacement: '$1'
3828
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
4019
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3829
4020
  device_replacement: '$1'
3830
4021
  brand_replacement: 'Positivo'
3831
4022
  model_replacement: '$1'
@@ -3835,15 +4026,15 @@ device_parsers:
3835
4026
  # @ref: http://www.pointofview-online.com/default2.php
3836
4027
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3837
4028
  #########
3838
- - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
4029
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3839
4030
  device_replacement: '$1'
3840
4031
  brand_replacement: 'POV'
3841
4032
  model_replacement: '$1'
3842
- - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
4033
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3843
4034
  device_replacement: 'POV $1'
3844
4035
  brand_replacement: 'POV'
3845
4036
  model_replacement: '$1'
3846
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
4037
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3847
4038
  device_replacement: 'POV $1'
3848
4039
  brand_replacement: 'POV'
3849
4040
  model_replacement: '$1'
@@ -3853,7 +4044,7 @@ device_parsers:
3853
4044
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3854
4045
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3855
4046
  #########
3856
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
4047
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3857
4048
  device_replacement: 'Prestigio $1'
3858
4049
  brand_replacement: 'Prestigio'
3859
4050
  model_replacement: '$1'
@@ -3862,7 +4053,7 @@ device_parsers:
3862
4053
  # Proscan
3863
4054
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3864
4055
  #########
3865
- - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
4056
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3866
4057
  device_replacement: '$1'
3867
4058
  brand_replacement: 'Proscan'
3868
4059
  model_replacement: '$1'
@@ -3871,15 +4062,15 @@ device_parsers:
3871
4062
  # QMobile
3872
4063
  # @ref: http://www.qmobile.com.pk/
3873
4064
  #########
3874
- - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
4065
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3875
4066
  device_replacement: '$1 $2'
3876
4067
  brand_replacement: 'Qmobile'
3877
4068
  model_replacement: '$1 $2'
3878
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
4069
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3879
4070
  device_replacement: 'Qmobile $2 $3'
3880
4071
  brand_replacement: 'Qmobile'
3881
4072
  model_replacement: '$2 $3'
3882
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
4073
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3883
4074
  device_replacement: 'Qmobile $2'
3884
4075
  brand_replacement: 'Qmobile'
3885
4076
  model_replacement: '$2'
@@ -3888,11 +4079,11 @@ device_parsers:
3888
4079
  # Qmobilevn
3889
4080
  # @ref: http://qmobile.vn/san-pham.html
3890
4081
  #########
3891
- - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4082
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3892
4083
  device_replacement: '$1 $2'
3893
4084
  brand_replacement: 'Qmobilevn'
3894
4085
  model_replacement: '$2'
3895
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
4086
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3896
4087
  device_replacement: '$1 $2'
3897
4088
  brand_replacement: 'Qmobilevn'
3898
4089
  model_replacement: '$2'
@@ -3901,7 +4092,7 @@ device_parsers:
3901
4092
  # Quanta
3902
4093
  # @ref: ?
3903
4094
  #########
3904
- - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
4095
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3905
4096
  device_replacement: '$1'
3906
4097
  brand_replacement: 'Quanta'
3907
4098
  model_replacement: '$1'
@@ -3924,7 +4115,7 @@ device_parsers:
3924
4115
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3925
4116
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3926
4117
  #########
3927
- - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
4118
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3928
4119
  device_replacement: '$1'
3929
4120
  brand_replacement: 'Rockchip'
3930
4121
  model_replacement: '$1'
@@ -3937,55 +4128,55 @@ device_parsers:
3937
4128
  # Samsung Android Devices
3938
4129
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3939
4130
  #########
3940
- - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
4131
+ - 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/'
3941
4132
  device_replacement: 'Samsung $1$2'
3942
4133
  brand_replacement: 'Samsung'
3943
4134
  model_replacement: '$2'
3944
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4135
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3945
4136
  device_replacement: 'Samsung $1$2'
3946
4137
  brand_replacement: 'Samsung'
3947
4138
  model_replacement: '$2'
3948
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4139
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3949
4140
  device_replacement: 'Samsung $2'
3950
4141
  brand_replacement: 'Samsung'
3951
4142
  model_replacement: '$2'
3952
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
4143
+ - regex: '; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
3953
4144
  device_replacement: 'Samsung $1'
3954
4145
  brand_replacement: 'Samsung'
3955
4146
  model_replacement: '$1'
3956
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4147
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3957
4148
  device_replacement: 'Samsung $2'
3958
4149
  brand_replacement: 'Samsung'
3959
4150
  model_replacement: '$2'
3960
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4151
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3961
4152
  device_replacement: 'Samsung $1$2$3'
3962
4153
  brand_replacement: 'Samsung'
3963
4154
  model_replacement: '$2'
3964
- - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
4155
+ - regex: '(?:; {0,2}|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
3965
4156
  device_replacement: 'Samsung $1'
3966
4157
  brand_replacement: 'Samsung'
3967
4158
  model_replacement: '$1'
3968
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4159
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3969
4160
  device_replacement: 'Samsung $1$2'
3970
4161
  brand_replacement: 'Samsung'
3971
4162
  model_replacement: '$2'
3972
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4163
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3973
4164
  device_replacement: 'Samsung $1'
3974
4165
  brand_replacement: 'Samsung'
3975
4166
  model_replacement: '$1'
3976
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4167
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3977
4168
  device_replacement: 'Samsung $1'
3978
4169
  brand_replacement: 'Samsung'
3979
4170
  model_replacement: '$1'
3980
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4171
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3981
4172
  device_replacement: 'Samsung $1'
3982
4173
  brand_replacement: 'Samsung'
3983
4174
  model_replacement: '$1'
3984
- - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
4175
+ - regex: '; {0,2}(Behold ?(?:2|II)|YP\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build'
3985
4176
  device_replacement: 'Samsung $1'
3986
4177
  brand_replacement: 'Samsung'
3987
4178
  model_replacement: '$1'
3988
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
4179
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
3989
4180
  device_replacement: 'Samsung $1'
3990
4181
  brand_replacement: 'Samsung'
3991
4182
  model_replacement: '$1'
@@ -3995,11 +4186,11 @@ device_parsers:
3995
4186
  # @ref: http://www.sharp-phone.com/en/index.html
3996
4187
  # @ref: http://www.android.com/devices/?country=all&m=sharp
3997
4188
  #########
3998
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
4189
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3999
4190
  device_replacement: '$1'
4000
4191
  brand_replacement: 'Sharp'
4001
4192
  model_replacement: '$1'
4002
- - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
4193
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4003
4194
  device_replacement: '$1$2'
4004
4195
  brand_replacement: 'Sharp'
4005
4196
  model_replacement: '$2'
@@ -4008,15 +4199,15 @@ device_parsers:
4008
4199
  # Simvalley
4009
4200
  # @ref: http://www.simvalley-mobile.de/
4010
4201
  #########
4011
- - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4202
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4012
4203
  device_replacement: '$1'
4013
4204
  brand_replacement: 'Simvalley'
4014
4205
  model_replacement: '$1'
4015
- - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4206
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4016
4207
  device_replacement: '$1'
4017
4208
  brand_replacement: 'Simvalley'
4018
4209
  model_replacement: '$1'
4019
- - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4210
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4020
4211
  device_replacement: '$1'
4021
4212
  brand_replacement: 'Simvalley'
4022
4213
  model_replacement: '$1'
@@ -4026,7 +4217,7 @@ device_parsers:
4026
4217
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
4027
4218
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
4028
4219
  #########
4029
- - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
4220
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
4030
4221
  device_replacement: '$1'
4031
4222
  brand_replacement: 'SKtelesys'
4032
4223
  model_replacement: '$1'
@@ -4035,11 +4226,11 @@ device_parsers:
4035
4226
  # Skytex
4036
4227
  # @ref: http://skytex.com/android
4037
4228
  #########
4038
- - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
4229
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4039
4230
  device_replacement: '$1'
4040
4231
  brand_replacement: 'Skytex'
4041
4232
  model_replacement: '$1'
4042
- - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
4233
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4043
4234
  device_replacement: '$1'
4044
4235
  brand_replacement: 'Skytex'
4045
4236
  model_replacement: '$1'
@@ -4049,7 +4240,7 @@ device_parsers:
4049
4240
  # @ref: http://en.smartdevices.com.cn/Products/
4050
4241
  # @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
4051
4242
  #########
4052
- - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4243
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4053
4244
  device_replacement: '$1 $2'
4054
4245
  brand_replacement: '$1'
4055
4246
  model_replacement: '$2'
@@ -4059,7 +4250,7 @@ device_parsers:
4059
4250
  # @ref: http://www.smartbitt.com/
4060
4251
  # @missing: SBT Useragents
4061
4252
  #########
4062
- - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
4253
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4063
4254
  device_replacement: '$1'
4064
4255
  brand_replacement: 'Smartbitt'
4065
4256
  model_replacement: '$1'
@@ -4068,15 +4259,15 @@ device_parsers:
4068
4259
  # Softbank (Operator Branded Devices)
4069
4260
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
4070
4261
  #########
4071
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4262
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4072
4263
  device_replacement: '$1'
4073
4264
  brand_replacement: 'Sharp'
4074
4265
  model_replacement: '$1'
4075
- - regex: '; *(003P|101P|101P11C|102P) Build'
4266
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
4076
4267
  device_replacement: '$1'
4077
4268
  brand_replacement: 'Panasonic'
4078
4269
  model_replacement: '$1'
4079
- - regex: '; *(00\dZ) Build/'
4270
+ - regex: '; {0,2}(00\dZ) Build/'
4080
4271
  device_replacement: '$1'
4081
4272
  brand_replacement: 'ZTE'
4082
4273
  model_replacement: '$1'
@@ -4084,11 +4275,11 @@ device_parsers:
4084
4275
  device_replacement: '$1'
4085
4276
  brand_replacement: 'HTC'
4086
4277
  model_replacement: '$1'
4087
- - regex: '; *(001HT|X06HT) Build'
4278
+ - regex: '; {0,2}(001HT|X06HT) Build'
4088
4279
  device_replacement: '$1'
4089
4280
  brand_replacement: 'HTC'
4090
4281
  model_replacement: '$1'
4091
- - regex: '; *(201M) Build'
4282
+ - regex: '; {0,2}(201M) Build'
4092
4283
  device_replacement: '$1'
4093
4284
  brand_replacement: 'Motorola'
4094
4285
  model_replacement: 'XT902'
@@ -4098,11 +4289,11 @@ device_parsers:
4098
4289
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
4099
4290
  # @note: Must come before SonyEricsson
4100
4291
  #########
4101
- - regex: '; *(ST\d{4}.*)Build/ST'
4292
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
4102
4293
  device_replacement: 'Trekstor $1'
4103
4294
  brand_replacement: 'Trekstor'
4104
4295
  model_replacement: '$1'
4105
- - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
4296
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
4106
4297
  device_replacement: 'Trekstor $1'
4107
4298
  brand_replacement: 'Trekstor'
4108
4299
  model_replacement: '$1'
@@ -4114,16 +4305,16 @@ device_parsers:
4114
4305
  # @TODO: type!
4115
4306
  #########
4116
4307
  # android matchers
4117
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4308
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
4118
4309
  device_replacement: '$1$2'
4119
4310
  brand_replacement: 'SonyEricsson'
4120
4311
  model_replacement: '$2'
4121
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4312
+ - regex: '; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4122
4313
  device_replacement: '$1'
4123
4314
  brand_replacement: 'SonyEricsson'
4124
4315
  model_replacement: '$1'
4125
4316
  # TODO X\d+ is wrong
4126
- - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
4317
+ - regex: '; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]{0,50}) Build'
4127
4318
  regex_flag: 'i'
4128
4319
  device_replacement: '$1'
4129
4320
  brand_replacement: 'SonyEricsson'
@@ -4135,31 +4326,31 @@ device_parsers:
4135
4326
  # @ref: http://www.sonymobile.com/global-en/products/phones/
4136
4327
  # @ref: http://www.sony.jp/tablet/
4137
4328
  #########
4138
- - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
4329
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4139
4330
  device_replacement: 'Sony $1'
4140
4331
  brand_replacement: 'Sony'
4141
4332
  model_replacement: '$1'
4142
- - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
4333
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4143
4334
  device_replacement: 'Sony $1'
4144
4335
  brand_replacement: 'Sony'
4145
4336
  model_replacement: '$1'
4146
- - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4337
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4147
4338
  device_replacement: '$1 $2'
4148
4339
  brand_replacement: '$1'
4149
4340
  model_replacement: '$2'
4150
- - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
4341
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4151
4342
  device_replacement: '$1'
4152
4343
  brand_replacement: 'Sony'
4153
4344
  model_replacement: '$1'
4154
- - 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)'
4345
+ - 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)'
4155
4346
  device_replacement: '$1'
4156
4347
  brand_replacement: 'Sony'
4157
4348
  model_replacement: '$1'
4158
- - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4349
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4159
4350
  device_replacement: '$1'
4160
4351
  brand_replacement: 'Sony'
4161
4352
  model_replacement: '$1'
4162
- - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4353
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4163
4354
  device_replacement: '$1'
4164
4355
  brand_replacement: 'Sony'
4165
4356
  model_replacement: '$1'
@@ -4182,7 +4373,7 @@ device_parsers:
4182
4373
  # Spice
4183
4374
  # @ref: http://www.spicemobilephones.co.in/
4184
4375
  #########
4185
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4376
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4186
4377
  device_replacement: '$1$2$3$4'
4187
4378
  brand_replacement: 'Spice'
4188
4379
  model_replacement: 'Mi$4'
@@ -4191,7 +4382,7 @@ device_parsers:
4191
4382
  # Sprint (Operator Branded Devices)
4192
4383
  # @ref:
4193
4384
  #########
4194
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4385
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4195
4386
  device_replacement: '$1$2'
4196
4387
  brand_replacement: 'Sprint'
4197
4388
  model_replacement: '$2'
@@ -4204,7 +4395,7 @@ device_parsers:
4204
4395
  # Tagi
4205
4396
  # @ref: ??
4206
4397
  #########
4207
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4398
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4208
4399
  device_replacement: '$1$2$3'
4209
4400
  brand_replacement: 'Tagi'
4210
4401
  model_replacement: '$2$3'
@@ -4213,7 +4404,7 @@ device_parsers:
4213
4404
  # Tecmobile
4214
4405
  # @ref: http://www.tecmobile.com/
4215
4406
  #########
4216
- - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4407
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4217
4408
  device_replacement: 'Tecmobile $1'
4218
4409
  brand_replacement: 'Tecmobile'
4219
4410
  model_replacement: '$1'
@@ -4222,7 +4413,7 @@ device_parsers:
4222
4413
  # Tecno
4223
4414
  # @ref: www.tecno-mobile.com/‎
4224
4415
  #########
4225
- - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4416
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4226
4417
  device_replacement: '$1$2'
4227
4418
  brand_replacement: 'Tecno'
4228
4419
  model_replacement: '$2'
@@ -4231,7 +4422,7 @@ device_parsers:
4231
4422
  # Telechips, Techvision evaluation boards
4232
4423
  # @ref:
4233
4424
  #########
4234
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4425
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4235
4426
  regex_flag: 'i'
4236
4427
  device_replacement: '$1 $2'
4237
4428
  brand_replacement: '$1'
@@ -4242,7 +4433,7 @@ device_parsers:
4242
4433
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4243
4434
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4244
4435
  #########
4245
- - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4436
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4246
4437
  device_replacement: '$1'
4247
4438
  brand_replacement: 'Telstra'
4248
4439
  model_replacement: '$1'
@@ -4251,7 +4442,7 @@ device_parsers:
4251
4442
  # Terra
4252
4443
  # @ref: http://www.wortmann.de/
4253
4444
  #########
4254
- - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4445
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4255
4446
  device_replacement: 'Terra $1$2'
4256
4447
  brand_replacement: 'Terra'
4257
4448
  model_replacement: '$1$2'
@@ -4260,7 +4451,7 @@ device_parsers:
4260
4451
  # Texet
4261
4452
  # @ref: http://www.texet.ru/tablet/
4262
4453
  #########
4263
- - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4454
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4264
4455
  device_replacement: '$1'
4265
4456
  brand_replacement: 'Texet'
4266
4457
  model_replacement: '$1'
@@ -4269,11 +4460,11 @@ device_parsers:
4269
4460
  # Thalia
4270
4461
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4271
4462
  #########
4272
- - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4463
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4273
4464
  device_replacement: '$1'
4274
4465
  brand_replacement: 'Thalia'
4275
4466
  model_replacement: '$1'
4276
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4467
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4277
4468
  device_replacement: '$1'
4278
4469
  brand_replacement: 'Thalia'
4279
4470
  model_replacement: 'Tolino Shine'
@@ -4283,11 +4474,11 @@ device_parsers:
4283
4474
  # @ref: http://en.thl.com.cn/Mobile
4284
4475
  # @ref: http://thlmobilestore.com
4285
4476
  #########
4286
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4477
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4287
4478
  device_replacement: '$1 $2'
4288
4479
  brand_replacement: 'Thl'
4289
4480
  model_replacement: '$2'
4290
- - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4481
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4291
4482
  device_replacement: '$1'
4292
4483
  brand_replacement: 'Thl'
4293
4484
  model_replacement: '$1'
@@ -4296,28 +4487,28 @@ device_parsers:
4296
4487
  # T-Mobile (Operator Branded Devices)
4297
4488
  #########
4298
4489
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4299
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4490
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4300
4491
  device_replacement: '$1'
4301
4492
  brand_replacement: 'HTC'
4302
4493
  model_replacement: 'Hero'
4303
4494
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4304
- - regex: '; *(T-Mobile[ _]G2) Build'
4495
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4305
4496
  device_replacement: '$1'
4306
4497
  brand_replacement: 'HTC'
4307
4498
  model_replacement: 'Desire Z'
4308
- - regex: '; *(T-Mobile myTouch Q) Build'
4499
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4309
4500
  device_replacement: '$1'
4310
4501
  brand_replacement: 'Huawei'
4311
4502
  model_replacement: 'U8730'
4312
- - regex: '; *(T-Mobile myTouch) Build'
4503
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4313
4504
  device_replacement: '$1'
4314
4505
  brand_replacement: 'Huawei'
4315
4506
  model_replacement: 'U8680'
4316
- - regex: '; *(T-Mobile_Espresso) Build'
4507
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4317
4508
  device_replacement: '$1'
4318
4509
  brand_replacement: 'HTC'
4319
4510
  model_replacement: 'Espresso'
4320
- - regex: '; *(T-Mobile G1) Build'
4511
+ - regex: '; {0,2}(T-Mobile G1) Build'
4321
4512
  device_replacement: '$1'
4322
4513
  brand_replacement: 'HTC'
4323
4514
  model_replacement: 'Dream'
@@ -4325,11 +4516,11 @@ device_parsers:
4325
4516
  device_replacement: '$1$2 $3 $4'
4326
4517
  brand_replacement: 'HTC'
4327
4518
  model_replacement: '$2 $3 $4'
4328
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4519
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4329
4520
  device_replacement: '$1 $2 $3'
4330
4521
  brand_replacement: 'Tmobile'
4331
4522
  model_replacement: '$2 $3'
4332
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4523
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4333
4524
  device_replacement: '$1 $2'
4334
4525
  brand_replacement: 'Tmobile'
4335
4526
  model_replacement: '$2'
@@ -4347,7 +4538,7 @@ device_parsers:
4347
4538
  # Tooky
4348
4539
  # @ref: http://www.tookymobile.com/
4349
4540
  #########
4350
- - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4541
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4351
4542
  regex_flag: 'i'
4352
4543
  device_replacement: '$1 $2'
4353
4544
  brand_replacement: 'Tooky'
@@ -4362,11 +4553,11 @@ device_parsers:
4362
4553
  device_replacement: '$1'
4363
4554
  brand_replacement: 'Toshiba'
4364
4555
  model_replacement: 'Folio 100'
4365
- - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4556
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4366
4557
  device_replacement: '$1'
4367
4558
  brand_replacement: 'Toshiba'
4368
4559
  model_replacement: 'Folio 100'
4369
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4560
+ - 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)'
4370
4561
  device_replacement: 'Toshiba $1'
4371
4562
  brand_replacement: 'Toshiba'
4372
4563
  model_replacement: '$1'
@@ -4375,12 +4566,12 @@ device_parsers:
4375
4566
  # Touchmate
4376
4567
  # @ref: http://touchmatepc.com/new/
4377
4568
  #########
4378
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4569
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4379
4570
  device_replacement: '$1'
4380
4571
  brand_replacement: 'Touchmate'
4381
4572
  model_replacement: '$1'
4382
4573
  # @todo: needs verification user-agents missing
4383
- - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4574
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4384
4575
  device_replacement: '$1'
4385
4576
  brand_replacement: 'Touchmate'
4386
4577
  model_replacement: '$1'
@@ -4389,11 +4580,11 @@ device_parsers:
4389
4580
  # Treq
4390
4581
  # @ref: http://www.treq.co.id/product
4391
4582
  #########
4392
- - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4583
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4393
4584
  device_replacement: '$1'
4394
4585
  brand_replacement: 'Treq'
4395
4586
  model_replacement: '$1'
4396
- - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4587
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4397
4588
  regex_flag: 'i'
4398
4589
  device_replacement: '$1$2'
4399
4590
  brand_replacement: 'Treq'
@@ -4405,21 +4596,40 @@ device_parsers:
4405
4596
  # @models: A936|A603|X-5|X-3
4406
4597
  #########
4407
4598
  # @todo: guessed markers
4408
- - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4599
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4409
4600
  device_replacement: '$1'
4410
4601
  brand_replacement: 'Umeox'
4411
4602
  model_replacement: '$1'
4412
4603
  # @todo: guessed markers
4413
- - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4604
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4414
4605
  device_replacement: '$1'
4415
4606
  brand_replacement: 'Umeox'
4416
4607
  model_replacement: '$1'
4417
4608
 
4609
+ #########
4610
+ # Vernee
4611
+ # @ref: http://vernee.cc/
4612
+ # @models: Thor - Thor E
4613
+ #########
4614
+ - regex: '; thor Build/'
4615
+ device_replacement: 'Thor'
4616
+ brand_replacement: 'Vernee'
4617
+ model_replacement: 'Thor'
4618
+ # Regex to modidy for Thor Plus (don't find example UA)
4619
+ - regex: '; Thor (E)? Build/'
4620
+ device_replacement: 'Thor $1'
4621
+ brand_replacement: 'Vernee'
4622
+ model_replacement: 'Thor'
4623
+ - regex: '; Apollo Lite Build/'
4624
+ device_replacement: 'Apollo Lite'
4625
+ brand_replacement: 'Vernee'
4626
+ model_replacement: 'Apollo'
4627
+
4418
4628
  #########
4419
4629
  # Versus
4420
4630
  # @ref: http://versusuk.com/support.html
4421
4631
  #########
4422
- - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4632
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4423
4633
  regex_flag: 'i'
4424
4634
  device_replacement: 'Versus $1'
4425
4635
  brand_replacement: 'Versus'
@@ -4429,7 +4639,7 @@ device_parsers:
4429
4639
  # Vertu
4430
4640
  # @ref: http://www.vertu.com/
4431
4641
  #########
4432
- - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4642
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4433
4643
  device_replacement: '$1 $2'
4434
4644
  brand_replacement: 'Vertu'
4435
4645
  model_replacement: '$2'
@@ -4438,7 +4648,7 @@ device_parsers:
4438
4648
  # Videocon
4439
4649
  # @ref: http://www.videoconmobiles.com
4440
4650
  #########
4441
- - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4651
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4442
4652
  device_replacement: '$1 $2'
4443
4653
  brand_replacement: 'Videocon'
4444
4654
  model_replacement: '$2'
@@ -4451,15 +4661,15 @@ device_parsers:
4451
4661
  # Viewsonic
4452
4662
  # @ref: http://viewsonic.com
4453
4663
  #########
4454
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4664
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4455
4665
  device_replacement: '$1'
4456
4666
  brand_replacement: 'Viewsonic'
4457
4667
  model_replacement: '$1'
4458
- - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4668
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4459
4669
  device_replacement: '$1$2'
4460
4670
  brand_replacement: 'Viewsonic'
4461
4671
  model_replacement: '$2'
4462
- - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4672
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4463
4673
  device_replacement: '$1'
4464
4674
  brand_replacement: 'Viewsonic'
4465
4675
  model_replacement: '$1'
@@ -4468,7 +4678,7 @@ device_parsers:
4468
4678
  # vivo
4469
4679
  # @ref: http://vivo.cn/
4470
4680
  #########
4471
- - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4681
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4472
4682
  device_replacement: '$1 $2'
4473
4683
  brand_replacement: 'vivo'
4474
4684
  model_replacement: '$2'
@@ -4477,7 +4687,7 @@ device_parsers:
4477
4687
  # Vodafone (Operator Branded Devices)
4478
4688
  # @ref: ??
4479
4689
  #########
4480
- - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4690
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4481
4691
  device_replacement: '$1 $2'
4482
4692
  brand_replacement: '$1'
4483
4693
  model_replacement: '$2'
@@ -4486,7 +4696,7 @@ device_parsers:
4486
4696
  # Walton
4487
4697
  # @ref: http://www.waltonbd.com/
4488
4698
  #########
4489
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4699
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4490
4700
  regex_flag: 'i'
4491
4701
  device_replacement: 'Walton $1'
4492
4702
  brand_replacement: 'Walton'
@@ -4496,7 +4706,7 @@ device_parsers:
4496
4706
  # Wiko
4497
4707
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4498
4708
  #########
4499
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
4709
+ - regex: '; {0,2}(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4500
4710
  regex_flag: 'i'
4501
4711
  device_replacement: 'Wiko $1'
4502
4712
  brand_replacement: 'Wiko'
@@ -4506,7 +4716,7 @@ device_parsers:
4506
4716
  # WellcoM
4507
4717
  # @ref: ??
4508
4718
  #########
4509
- - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4719
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4510
4720
  device_replacement: 'Wellcom $1'
4511
4721
  brand_replacement: 'Wellcom'
4512
4722
  model_replacement: '$1'
@@ -4524,7 +4734,7 @@ device_parsers:
4524
4734
  # Wolfgang
4525
4735
  # @ref: http://wolfgangmobile.com/
4526
4736
  #########
4527
- - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4737
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4528
4738
  device_replacement: 'Wolfgang $1'
4529
4739
  brand_replacement: 'Wolfgang'
4530
4740
  model_replacement: '$1'
@@ -4533,7 +4743,7 @@ device_parsers:
4533
4743
  # Woxter
4534
4744
  # @ref: http://www.woxter.es/es-es/categories/index
4535
4745
  #########
4536
- - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4746
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4537
4747
  device_replacement: 'Woxter $1'
4538
4748
  brand_replacement: 'Woxter'
4539
4749
  model_replacement: '$1'
@@ -4542,7 +4752,7 @@ device_parsers:
4542
4752
  # Yarvik Zania
4543
4753
  # @ref: http://yarvik.com
4544
4754
  #########
4545
- - 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)'
4755
+ - 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)'
4546
4756
  device_replacement: 'Yarvik $1'
4547
4757
  brand_replacement: 'Yarvik'
4548
4758
  model_replacement: '$1'
@@ -4556,7 +4766,7 @@ device_parsers:
4556
4766
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4557
4767
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4558
4768
  #########
4559
- - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4769
+ - regex: '; {0,2}([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4560
4770
  device_replacement: 'Yifang $1$2$3'
4561
4771
  brand_replacement: 'Yifang'
4562
4772
  model_replacement: '$2'
@@ -4565,19 +4775,19 @@ device_parsers:
4565
4775
  # XiaoMi
4566
4776
  # @ref: http://www.xiaomi.com/event/buyphone
4567
4777
  #########
4568
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4778
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4569
4779
  device_replacement: 'XiaoMi $1'
4570
4780
  brand_replacement: 'XiaoMi'
4571
4781
  model_replacement: '$1'
4572
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4782
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4573
4783
  device_replacement: 'XiaoMi $1'
4574
4784
  brand_replacement: 'XiaoMi'
4575
4785
  model_replacement: '$1'
4576
- - regex: '; *(MIX) (Build|MIUI)/'
4786
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4577
4787
  device_replacement: 'XiaoMi $1'
4578
4788
  brand_replacement: 'XiaoMi'
4579
4789
  model_replacement: '$1'
4580
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4790
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4581
4791
  device_replacement: 'XiaoMi $1'
4582
4792
  brand_replacement: 'XiaoMi'
4583
4793
  model_replacement: '$1'
@@ -4586,17 +4796,17 @@ device_parsers:
4586
4796
  # Xolo
4587
4797
  # @ref: http://www.xolo.in/
4588
4798
  #########
4589
- - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4799
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4590
4800
  regex_flag: 'i'
4591
4801
  device_replacement: 'Xolo $1'
4592
4802
  brand_replacement: 'Xolo'
4593
4803
  model_replacement: '$1'
4594
- - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4804
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4595
4805
  regex_flag: 'i'
4596
4806
  device_replacement: 'Xolo $1'
4597
4807
  brand_replacement: 'Xolo'
4598
4808
  model_replacement: '$1'
4599
- - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4809
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4600
4810
  regex_flag: 'i'
4601
4811
  device_replacement: 'Xolo $1'
4602
4812
  brand_replacement: 'Xolo'
@@ -4606,7 +4816,7 @@ device_parsers:
4606
4816
  # Xoro
4607
4817
  # @ref: http://www.xoro.de/produkte/
4608
4818
  #########
4609
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4819
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4610
4820
  device_replacement: 'Xoro $1'
4611
4821
  brand_replacement: 'Xoro'
4612
4822
  model_replacement: '$1'
@@ -4615,7 +4825,7 @@ device_parsers:
4615
4825
  # Zopo
4616
4826
  # @ref: http://www.zopomobiles.com/products.html
4617
4827
  #########
4618
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4828
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4619
4829
  device_replacement: '$1$2$3'
4620
4830
  brand_replacement: 'Zopo'
4621
4831
  model_replacement: '$1$2$3'
@@ -4624,11 +4834,11 @@ device_parsers:
4624
4834
  # ZiiLabs
4625
4835
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4626
4836
  #########
4627
- - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4837
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4628
4838
  device_replacement: '$1 $2'
4629
4839
  brand_replacement: 'ZiiLabs'
4630
4840
  model_replacement: '$2'
4631
- - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4841
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4632
4842
  device_replacement: '$1 $2'
4633
4843
  brand_replacement: 'ZiiLabs'
4634
4844
  model_replacement: '$2'
@@ -4637,36 +4847,36 @@ device_parsers:
4637
4847
  # ZTE
4638
4848
  # @ref: http://www.ztedevices.com/
4639
4849
  #########
4640
- - 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)'
4850
+ - 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)'
4641
4851
  device_replacement: '$1'
4642
4852
  brand_replacement: 'ZTE'
4643
4853
  model_replacement: '$1'
4644
- - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
4854
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4645
4855
  device_replacement: '$1'
4646
4856
  brand_replacement: 'ZTE'
4647
4857
  model_replacement: '$1'
4648
- - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
4858
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4649
4859
  device_replacement: '$1'
4650
4860
  brand_replacement: 'ZTE'
4651
4861
  model_replacement: '$1'
4652
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4862
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4653
4863
  device_replacement: 'ZTE Blade$1'
4654
4864
  brand_replacement: 'ZTE'
4655
4865
  model_replacement: 'Blade$1'
4656
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4866
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4657
4867
  device_replacement: 'ZTE Skate$1'
4658
4868
  brand_replacement: 'ZTE'
4659
4869
  model_replacement: 'Skate$1'
4660
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4870
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4661
4871
  device_replacement: '$1$2'
4662
4872
  brand_replacement: 'ZTE'
4663
4873
  model_replacement: '$1$2'
4664
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
4874
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4665
4875
  device_replacement: 'ZTE $1'
4666
4876
  brand_replacement: 'ZTE'
4667
4877
  model_replacement: '$1'
4668
4878
  # operator specific
4669
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
4879
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4670
4880
  device_replacement: '$1 $2'
4671
4881
  brand_replacement: 'ZTE'
4672
4882
  model_replacement: '$1 $2'
@@ -4675,7 +4885,7 @@ device_parsers:
4675
4885
  device_replacement: '$1'
4676
4886
  brand_replacement: 'ZTE'
4677
4887
  model_replacement: '$1'
4678
- - regex: '; *(vp9plus)\)'
4888
+ - regex: '; {0,2}(vp9plus)\)'
4679
4889
  device_replacement: '$1'
4680
4890
  brand_replacement: 'ZTE'
4681
4891
  model_replacement: '$1'
@@ -4735,7 +4945,7 @@ device_parsers:
4735
4945
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4736
4946
  brand_replacement: 'Amazon'
4737
4947
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4738
- - regex: '; ?Amazon ([^;/]+) Build\b'
4948
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4739
4949
  device_replacement: '$1'
4740
4950
  brand_replacement: 'Amazon'
4741
4951
  model_replacement: '$1'
@@ -4758,22 +4968,22 @@ device_parsers:
4758
4968
 
4759
4969
  #########
4760
4970
  # Devices from chinese manufacturer(s)
4761
- # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
4971
+ # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.{0,200}
4762
4972
  #########
4763
- - regex: '(sprd)\-([^/]+)/'
4973
+ - regex: '(sprd)\-([^/]{1,50})/'
4764
4974
  device_replacement: '$1 $2'
4765
4975
  brand_replacement: '$1'
4766
4976
  model_replacement: '$2'
4767
4977
  # @ref: http://eshinechina.en.alibaba.com/
4768
- - regex: '; *(H\d{2}00\+?) Build'
4978
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4769
4979
  device_replacement: '$1'
4770
4980
  brand_replacement: 'Hero'
4771
4981
  model_replacement: '$1'
4772
- - regex: '; *(iphone|iPhone5) Build/'
4982
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4773
4983
  device_replacement: 'Xianghe $1'
4774
4984
  brand_replacement: 'Xianghe'
4775
4985
  model_replacement: '$1'
4776
- - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
4986
+ - regex: '; {0,2}(e\d{4}[a-z]?_?v\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/'
4777
4987
  device_replacement: 'Xianghe $1'
4778
4988
  brand_replacement: 'Xianghe'
4779
4989
  model_replacement: '$1'
@@ -4795,7 +5005,7 @@ device_parsers:
4795
5005
  #########
4796
5006
  # Alcatel Windows Phones
4797
5007
  #########
4798
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
5008
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\)]+)'
4799
5009
  device_replacement: 'Alcatel $1'
4800
5010
  brand_replacement: 'Alcatel'
4801
5011
  model_replacement: '$1'
@@ -4803,8 +5013,7 @@ device_parsers:
4803
5013
  #########
4804
5014
  # Asus Windows Phones
4805
5015
  #########
4806
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4807
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
5016
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\)]+)'
4808
5017
  device_replacement: 'Asus $1'
4809
5018
  brand_replacement: 'Asus'
4810
5019
  model_replacement: '$1'
@@ -4812,7 +5021,7 @@ device_parsers:
4812
5021
  #########
4813
5022
  # Dell Windows Phones
4814
5023
  #########
4815
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
5024
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\)]+)'
4816
5025
  device_replacement: 'Dell $1'
4817
5026
  brand_replacement: 'Dell'
4818
5027
  model_replacement: '$1'
@@ -4820,7 +5029,7 @@ device_parsers:
4820
5029
  #########
4821
5030
  # HTC Windows Phones
4822
5031
  #########
4823
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
5032
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\)]+)'
4824
5033
  device_replacement: 'HTC $1'
4825
5034
  brand_replacement: 'HTC'
4826
5035
  model_replacement: '$1'
@@ -4828,7 +5037,7 @@ device_parsers:
4828
5037
  #########
4829
5038
  # Huawei Windows Phones
4830
5039
  #########
4831
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
5040
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\)]+)'
4832
5041
  device_replacement: 'Huawei $1'
4833
5042
  brand_replacement: 'Huawei'
4834
5043
  model_replacement: '$1'
@@ -4836,7 +5045,7 @@ device_parsers:
4836
5045
  #########
4837
5046
  # LG Windows Phones
4838
5047
  #########
4839
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
5048
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \-]|)([^;,\)]+)'
4840
5049
  device_replacement: 'LG $1'
4841
5050
  brand_replacement: 'LG'
4842
5051
  model_replacement: '$1'
@@ -4844,15 +5053,15 @@ device_parsers:
4844
5053
  #########
4845
5054
  # Noka Windows Phones
4846
5055
  #########
4847
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
5056
+ - 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}[^;\)]*)'
4848
5057
  device_replacement: 'Lumia $1'
4849
5058
  brand_replacement: 'Nokia'
4850
5059
  model_replacement: 'Lumia $1'
4851
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
5060
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\d{3,})'
4852
5061
  device_replacement: 'Nokia $1'
4853
5062
  brand_replacement: 'Nokia'
4854
5063
  model_replacement: '$1'
4855
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
5064
+ - regex: '(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
4856
5065
  device_replacement: 'Nokia $1'
4857
5066
  brand_replacement: 'Nokia'
4858
5067
  model_replacement: '$1'
@@ -4860,7 +5069,7 @@ device_parsers:
4860
5069
  #########
4861
5070
  # Microsoft Windows Phones
4862
5071
  #########
4863
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
5072
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\)]+)'
4864
5073
  device_replacement: 'Microsoft $1'
4865
5074
  brand_replacement: 'Microsoft'
4866
5075
  model_replacement: '$1'
@@ -4868,7 +5077,7 @@ device_parsers:
4868
5077
  #########
4869
5078
  # Samsung Windows Phones
4870
5079
  #########
4871
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
5080
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\.\)]+)'
4872
5081
  device_replacement: 'Samsung $1'
4873
5082
  brand_replacement: 'Samsung'
4874
5083
  model_replacement: '$1'
@@ -4876,7 +5085,7 @@ device_parsers:
4876
5085
  #########
4877
5086
  # Toshiba Windows Phones
4878
5087
  #########
4879
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
5088
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\)]+)'
4880
5089
  device_replacement: 'Toshiba $1'
4881
5090
  brand_replacement: 'Toshiba'
4882
5091
  model_replacement: '$1'
@@ -4884,7 +5093,7 @@ device_parsers:
4884
5093
  #########
4885
5094
  # Generic Windows Phones
4886
5095
  #########
4887
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
5096
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\)]+)'
4888
5097
  device_replacement: '$1 $2'
4889
5098
  brand_replacement: '$1'
4890
5099
  model_replacement: '$2'
@@ -4896,7 +5105,7 @@ device_parsers:
4896
5105
  #########
4897
5106
  # Samsung Bada Phones
4898
5107
  #########
4899
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5108
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4900
5109
  device_replacement: 'Samsung $1'
4901
5110
  brand_replacement: 'Samsung'
4902
5111
  model_replacement: '$1'
@@ -4904,11 +5113,11 @@ device_parsers:
4904
5113
  #########
4905
5114
  # Firefox OS
4906
5115
  #########
4907
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5116
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4908
5117
  device_replacement: 'Alcatel $1 $2 $3'
4909
5118
  brand_replacement: 'Alcatel'
4910
5119
  model_replacement: 'One Touch $3'
4911
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5120
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4912
5121
  device_replacement: 'ZTE $1$2'
4913
5122
  brand_replacement: 'ZTE'
4914
5123
  model_replacement: '$1$2'
@@ -4916,15 +5125,15 @@ device_parsers:
4916
5125
  #########
4917
5126
  # KaiOS
4918
5127
  #########
4919
- - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
5128
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
4920
5129
  device_replacement: 'Alcatel $1'
4921
5130
  brand_replacement: 'Alcatel'
4922
5131
  model_replacement: '$1'
4923
- - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5132
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4924
5133
  device_replacement: 'LYF $1'
4925
5134
  brand_replacement: 'LYF'
4926
5135
  model_replacement: '$1'
4927
- - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5136
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4928
5137
  device_replacement: 'Nokia $1'
4929
5138
  brand_replacement: 'Nokia'
4930
5139
  model_replacement: '$1'
@@ -4937,7 +5146,7 @@ device_parsers:
4937
5146
  device_replacement: 'Nokia $1'
4938
5147
  brand_replacement: 'Nokia'
4939
5148
  model_replacement: '$1$2'
4940
- - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
5149
+ - regex: '(?:NOKIA|Nokia)(?:\-| {0,2})(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
4941
5150
  device_replacement: 'Nokia $1$2$3'
4942
5151
  brand_replacement: 'Nokia'
4943
5152
  model_replacement: '$1$2$3'
@@ -4946,12 +5155,12 @@ device_parsers:
4946
5155
  brand_replacement: 'Nokia'
4947
5156
  model_replacement: 'Lumia $1'
4948
5157
  # UCWEB Browser on Symbian
4949
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
5158
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\)'
4950
5159
  device_replacement: '$1 $2'
4951
5160
  brand_replacement: '$1'
4952
5161
  model_replacement: '$2'
4953
5162
  # Nokia Symbian
4954
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5163
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4955
5164
  device_replacement: 'Nokia $1'
4956
5165
  brand_replacement: 'Nokia'
4957
5166
  model_replacement: '$1'
@@ -4964,7 +5173,7 @@ device_parsers:
4964
5173
  device_replacement: 'BlackBerry $1'
4965
5174
  brand_replacement: 'BlackBerry'
4966
5175
  model_replacement: '$1'
4967
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5176
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4968
5177
  device_replacement: 'BlackBerry Playbook'
4969
5178
  brand_replacement: 'BlackBerry'
4970
5179
  model_replacement: 'Playbook'
@@ -4996,7 +5205,7 @@ device_parsers:
4996
5205
  device_replacement: 'Palm Treo $1'
4997
5206
  brand_replacement: 'Palm'
4998
5207
  model_replacement: 'Treo $1'
4999
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5208
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
5000
5209
  device_replacement: 'HP Veer'
5001
5210
  brand_replacement: 'HP'
5002
5211
  model_replacement: 'Veer'
@@ -5004,7 +5213,7 @@ device_parsers:
5004
5213
  device_replacement: 'HP TouchPad'
5005
5214
  brand_replacement: 'HP'
5006
5215
  model_replacement: 'TouchPad'
5007
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5216
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
5008
5217
  device_replacement: 'HP iPAQ $1'
5009
5218
  brand_replacement: 'HP'
5010
5219
  model_replacement: 'iPAQ $1'
@@ -5072,18 +5281,18 @@ device_parsers:
5072
5281
  brand_replacement: 'Apple'
5073
5282
  model_replacement: 'iPhone'
5074
5283
  # @note: desktop applications show device info
5075
- - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5284
+ - regex: 'CFNetwork/.{0,100} Darwin/\d.{0,100}\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5076
5285
  device_replacement: '$1$2,$3'
5077
5286
  brand_replacement: 'Apple'
5078
5287
  model_replacement: '$1$2,$3'
5079
5288
  # @note: newer desktop applications don't show device info
5080
5289
  # This is here so as to not have them recorded as iOS-Device
5081
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5290
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5082
5291
  device_replacement: 'Mac'
5083
5292
  brand_replacement: 'Apple'
5084
5293
  model_replacement: 'Mac'
5085
5294
  # @note: iOS applications do not show device info
5086
- - regex: 'CFNetwork/.* Darwin/\d'
5295
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
5087
5296
  device_replacement: 'iOS-Device'
5088
5297
  brand_replacement: 'Apple'
5089
5298
  model_replacement: 'iOS-Device'
@@ -5127,7 +5336,7 @@ device_parsers:
5127
5336
  device_replacement: 'Asus $1'
5128
5337
  brand_replacement: 'Asus'
5129
5338
  model_replacement: '$1'
5130
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5339
+ - regex: '(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5131
5340
  device_replacement: 'Asus $1'
5132
5341
  brand_replacement: 'Asus'
5133
5342
  model_replacement: '$1'
@@ -5159,11 +5368,11 @@ device_parsers:
5159
5368
  device_replacement: 'DoCoMo $1'
5160
5369
  brand_replacement: 'DoCoMo'
5161
5370
  model_replacement: '$1'
5162
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5371
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
5163
5372
  device_replacement: 'DoCoMo $1'
5164
5373
  brand_replacement: 'DoCoMo'
5165
5374
  model_replacement: '$1'
5166
- - regex: '([A-Za-z0-9]+);FOMA'
5375
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
5167
5376
  device_replacement: 'DoCoMo $1'
5168
5377
  brand_replacement: 'DoCoMo'
5169
5378
  model_replacement: '$1'
@@ -5171,7 +5380,7 @@ device_parsers:
5171
5380
  ##########
5172
5381
  # htc
5173
5382
  ##########
5174
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5383
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5175
5384
  device_replacement: 'HTC $1'
5176
5385
  brand_replacement: 'HTC'
5177
5386
  model_replacement: '$1'
@@ -5232,18 +5441,18 @@ device_parsers:
5232
5441
  device_replacement: '$1'
5233
5442
  brand_replacement: '$2'
5234
5443
  model_replacement: '$3'
5235
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
5444
+ - regex: '(HbbTV)/1\.1\.1.{0,200}CE-HTML/1\.\d;(Vendor/|)(THOM[^;]{0,200}?)[;\s].{0,30}(LF[^;]{1,200});?'
5236
5445
  device_replacement: '$1'
5237
5446
  brand_replacement: 'Thomson'
5238
5447
  model_replacement: '$4'
5239
- - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
5448
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); {0,2}CE-HTML(?:/1\.\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});'
5240
5449
  device_replacement: '$1'
5241
5450
  brand_replacement: '$2'
5242
5451
  model_replacement: '$3'
5243
5452
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5244
5453
  device_replacement: '$1'
5245
5454
  brand_replacement: 'Samsung'
5246
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})'
5455
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5247
5456
  device_replacement: '$1'
5248
5457
  brand_replacement: '$2$3'
5249
5458
  model_replacement: '$4'
@@ -5253,7 +5462,7 @@ device_parsers:
5253
5462
  ##########
5254
5463
  # LGE NetCast TV
5255
5464
  ##########
5256
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5465
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5257
5466
  device_replacement: 'NetCast$2'
5258
5467
  brand_replacement: 'LG'
5259
5468
  model_replacement: '$1'
@@ -5261,11 +5470,11 @@ device_parsers:
5261
5470
  ##########
5262
5471
  # InettvBrowser
5263
5472
  ##########
5264
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
5473
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5265
5474
  device_replacement: 'Inettv'
5266
5475
  brand_replacement: '$1'
5267
5476
  model_replacement: '$2'
5268
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
5477
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5269
5478
  device_replacement: 'Inettv'
5270
5479
  brand_replacement: 'Generic_Inettv'
5271
5480
  model_replacement: '$1'
@@ -5302,7 +5511,7 @@ device_parsers:
5302
5511
  device_replacement: 'Microsoft $1'
5303
5512
  brand_replacement: 'Microsoft'
5304
5513
  model_replacement: '$1'
5305
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5514
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5306
5515
  device_replacement: '$1'
5307
5516
  brand_replacement: 'Microsoft'
5308
5517
  model_replacement: '$1'
@@ -5326,6 +5535,14 @@ device_parsers:
5326
5535
  device_replacement: 'Motorola $1'
5327
5536
  brand_replacement: 'Motorola'
5328
5537
  model_replacement: '$1'
5538
+ - regex: '; (moto[ a-zA-z0-9()]{0,50});((?: Build|.{0,50}\) AppleWebKit))'
5539
+ device_replacement: '$1'
5540
+ brand_replacement: 'Motorola'
5541
+ model_replacement: '$1'
5542
+ - regex: '; {0,2}(moto)(.{0,50})(?: Build|\) AppleWebKit)'
5543
+ device_replacement: 'Motorola$2'
5544
+ brand_replacement: 'Motorola'
5545
+ model_replacement: '$2'
5329
5546
 
5330
5547
  ##########
5331
5548
  # nintendo
@@ -5363,12 +5580,12 @@ device_parsers:
5363
5580
  # Samsung
5364
5581
  ##########
5365
5582
  # Samsung Smart-TV
5366
- - regex: '(SMART-TV); .* Tizen '
5583
+ - regex: '(SMART-TV); .{0,200} Tizen '
5367
5584
  device_replacement: 'Samsung $1'
5368
5585
  brand_replacement: 'Samsung'
5369
5586
  model_replacement: '$1'
5370
5587
  # Samsung Symbian Devices
5371
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5588
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5372
5589
  device_replacement: 'Samsung $1'
5373
5590
  brand_replacement: 'Samsung'
5374
5591
  model_replacement: '$1'
@@ -5376,7 +5593,7 @@ device_parsers:
5376
5593
  device_replacement: '$1 $2$3'
5377
5594
  brand_replacement: '$1'
5378
5595
  model_replacement: '$2-$3'
5379
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5596
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5380
5597
  device_replacement: '$1'
5381
5598
  brand_replacement: 'Samsung'
5382
5599
  model_replacement: '$1'
@@ -5423,7 +5640,7 @@ device_parsers:
5423
5640
  ##########
5424
5641
  # Sony
5425
5642
  ##########
5426
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5643
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5427
5644
  device_replacement: '$2 $1'
5428
5645
  brand_replacement: '$2'
5429
5646
  model_replacement: '$1'
@@ -5457,33 +5674,33 @@ device_parsers:
5457
5674
  #########
5458
5675
  # Android General Device Matching (far from perfect)
5459
5676
  #########
5460
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
5677
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\))'
5461
5678
  brand_replacement: 'Generic_Android'
5462
5679
  model_replacement: '$1'
5463
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
5680
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5464
5681
  brand_replacement: 'Generic_Android'
5465
5682
  model_replacement: '$1'
5466
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
5683
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5467
5684
  brand_replacement: 'Generic_Android'
5468
5685
  model_replacement: '$1'
5469
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
5686
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{0,2}\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5470
5687
  brand_replacement: 'Generic_Android'
5471
5688
  model_replacement: '$1'
5472
5689
  # No build info at all - "Build" follows locale immediately
5473
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5690
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5474
5691
  device_replacement: 'Generic Smartphone'
5475
5692
  brand_replacement: 'Generic'
5476
5693
  model_replacement: 'Smartphone'
5477
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5694
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,3}\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\))'
5478
5695
  brand_replacement: 'Generic_Android'
5479
5696
  model_replacement: '$1'
5480
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5697
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5481
5698
  brand_replacement: 'Generic_Android'
5482
5699
  model_replacement: '$1'
5483
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5700
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5484
5701
  brand_replacement: 'Generic_Android_Tablet'
5485
5702
  model_replacement: '$1'
5486
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5703
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5487
5704
  brand_replacement: 'Generic_Android'
5488
5705
  model_replacement: '$1'
5489
5706
 
@@ -5508,7 +5725,7 @@ device_parsers:
5508
5725
  ##########
5509
5726
  # Generic Tablet
5510
5727
  ##########
5511
- - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
5728
+ - regex: '(Android 3\.\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))'
5512
5729
  regex_flag: 'i'
5513
5730
  device_replacement: 'Generic Tablet'
5514
5731
  brand_replacement: 'Generic'
@@ -5517,7 +5734,7 @@ device_parsers:
5517
5734
  ##########
5518
5735
  # Generic Smart Phone
5519
5736
  ##########
5520
- - 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)'
5737
+ - 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)'
5521
5738
  device_replacement: 'Generic Smartphone'
5522
5739
  brand_replacement: 'Generic'
5523
5740
  model_replacement: 'Smartphone'
@@ -5530,7 +5747,7 @@ device_parsers:
5530
5747
  ##########
5531
5748
  # Spiders (this is a hack...)
5532
5749
  ##########
5533
- - 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)'
5750
+ - 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)'
5534
5751
  regex_flag: 'i'
5535
5752
  device_replacement: 'Spider'
5536
5753
  brand_replacement: 'Spider'