user_agent_parser 2.5.3 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/vendor/uap-core/regexes.yaml +903 -644
  3. metadata +7 -7
@@ -1,6 +1,50 @@
1
1
  user_agent_parsers:
2
2
  #### SPECIAL CASES TOP ####
3
3
 
4
+ # ESRI Server products
5
+ - regex: '(GeoEvent Server) (\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
6
+
7
+ # ESRI ArcGIS Desktop Products
8
+ - regex: '(ArcGIS Pro)(?: (\d+)\.(\d+)\.([^ ]+)|)'
9
+
10
+ - regex: 'ArcGIS Client Using WinInet'
11
+ family_replacement: 'ArcMap'
12
+
13
+ - regex: '(OperationsDashboard)-(?:Windows)-(\d+)\.(\d+)\.(\d+)'
14
+ family_replacement: 'Operations Dashboard for ArcGIS'
15
+
16
+ - regex: '(arcgisearth)/(\d+)\.(\d+)(?:\.(\d+)|)'
17
+ family_replacement: 'ArcGIS Earth'
18
+
19
+ - regex: 'com.esri.(earth).phone/(\d+)\.(\d+)(?:\.(\d+)|)'
20
+ family_replacement: 'ArcGIS Earth'
21
+
22
+ # ESRI ArcGIS Mobile Products
23
+ - regex: '(arcgis-explorer)/(\d+)\.(\d+)\.(\d+)'
24
+ family_replacement: 'Explorer for ArcGIS'
25
+
26
+ - regex: 'arcgis-(collector|aurora)/(\d+)\.(\d+)\.(\d+)'
27
+ family_replacement: 'Collector for ArcGIS'
28
+
29
+ - regex: '(arcgis-workforce)/(\d+)\.(\d+)\.(\d+)'
30
+ family_replacement: 'Workforce for ArcGIS'
31
+
32
+ - regex: '(Collector|Explorer|Workforce)-(?:Android|iOS)-(\d+)\.(\d+)(?:\.(\d+)|)'
33
+ family_replacement: '$1 for ArcGIS'
34
+
35
+ - regex: '(Explorer|Collector)/(\d+) CFNetwork'
36
+ family_replacement: '$1 for ArcGIS'
37
+
38
+ # ESRI ArcGIS Runtimes
39
+ - regex: 'ArcGISRuntime-(Android|iOS|NET|Qt)/(\d+)\.(\d+)(?:\.(\d+)|)'
40
+ family_replacement: 'ArcGIS Runtime SDK for $1'
41
+
42
+ - regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
43
+ family_replacement: 'ArcGIS Runtime SDK for $1'
44
+
45
+ - regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
46
+ family_replacement: 'ArcGIS Runtime SDK for $1'
47
+
4
48
  # CFNetwork Podcast catcher Applications
5
49
  - regex: '^(Luminary)[Stage]+/(\d+) CFNetwork'
6
50
  - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
@@ -8,9 +52,9 @@ user_agent_parsers:
8
52
  family_replacement: 'AntennaPod'
9
53
  - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
10
54
  - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
11
- - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
12
- - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
13
- - 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'
14
58
 
15
59
  # Podcast catchers
16
60
  - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
@@ -51,7 +95,7 @@ user_agent_parsers:
51
95
  family_replacement: 'Tableau'
52
96
 
53
97
  # Adobe CreativeCloud
54
- - 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+)'
55
99
  family_replacement: 'Adobe CreativeCloud'
56
100
 
57
101
  # Salesforce
@@ -66,7 +110,7 @@ user_agent_parsers:
66
110
  family_replacement: 'FacebookBot'
67
111
 
68
112
  # Google Plus
69
- - regex: 'Google.*/\+/web/snippet'
113
+ - regex: 'Google.{0,50}/\+/web/snippet'
70
114
  family_replacement: 'GooglePlusBot'
71
115
 
72
116
  # Gmail
@@ -84,47 +128,60 @@ user_agent_parsers:
84
128
  # Bots Pattern 'name/0.0.0'
85
129
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
86
130
  # Bots Pattern 'name/0.0.0'
87
- - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
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+)|)'
88
132
 
89
133
  # MSIECrawler
90
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
134
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
91
135
  family_replacement: 'MSIECrawler'
92
136
 
93
137
  # DAVdroid
94
138
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
95
139
 
96
140
  # Downloader ...
97
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
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+)|)|)'
98
142
 
99
143
  # Pinterestbot
100
144
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
101
145
  family_replacement: 'Pinterestbot'
102
146
 
103
147
  # Bots
104
- - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
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+)|)|)|)'
105
149
 
106
150
  # AWS S3 Clients
107
151
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
108
152
  - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
109
153
 
154
+ # SAFE FME
155
+ - regex: '(FME)\/(\d+\.\d+)\.(\d+)\.(\d+)'
156
+
157
+ # QGIS
158
+ - regex: '(QGIS)\/(\d)\.?0?(\d{1,2})\.?0?(\d{1,2})'
159
+
160
+ # JOSM
161
+ - regex: '(JOSM)/(\d+)\.(\d+)'
162
+
163
+ # Tygron Platform
164
+ - regex: '(Tygron Platform) \((\d+)\.(\d+)\.(\d+(?:\.\d+| RC \d+\.\d+))'
165
+
110
166
  # Facebook
111
167
  # Must come before "Bots General matcher" to catch OrangeBotswana
112
168
  # Facebook Messenger must go before Facebook
113
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
169
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
170
+
114
171
  family_replacement: 'Facebook Messenger'
115
172
  # Facebook
116
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
117
174
  family_replacement: 'Facebook'
118
175
  # Sometimes Facebook does not specify a version (FBAV)
119
- - regex: '\[FB.*;'
176
+ - regex: '\[FB.{0,300};'
120
177
  family_replacement: 'Facebook'
121
178
 
122
179
  # Bots General matcher 'name/0.0'
123
- - 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+)|)|)'
124
181
  # Bots containing bot(but not CUBOT)
125
- - 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+)|)|)'
126
183
  # Bots containing spider|scrape|Crawl
127
- - 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+)|)|)'
128
185
 
129
186
  # HbbTV standard defines what features the browser should understand.
130
187
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -140,22 +197,29 @@ user_agent_parsers:
140
197
 
141
198
  # Social Networks (non-Facebook)
142
199
  # Pinterest
143
- - regex: '\[(Pinterest)/[^\]]+\]'
200
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
144
201
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
145
202
  # Instagram app
146
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
203
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
147
204
  # Flipboard app
148
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
149
206
  # Flipboard-briefing app
150
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
151
208
  # Onefootball app
152
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
153
210
  # Snapchat
154
211
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
155
212
  # Twitter
156
213
  - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
157
214
  family_replacement: 'Twitter'
158
215
 
216
+ # aspiegel.com spider (owned by Huawei)
217
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
218
+ family_replacement: 'Spider'
219
+
220
+ - regex: 'AspiegelBot'
221
+ family_replacement: 'Spider'
222
+
159
223
  # Basilisk
160
224
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
161
225
  family_replacement: 'Basilisk'
@@ -171,7 +235,7 @@ user_agent_parsers:
171
235
  family_replacement: 'Firefox Mobile'
172
236
  - regex: '(Fennec)/(\d+)\.(\d+)'
173
237
  family_replacement: 'Firefox Mobile'
174
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
238
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
175
239
  family_replacement: 'Firefox Mobile'
176
240
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
177
241
  family_replacement: 'Firefox ($1)'
@@ -185,7 +249,7 @@ user_agent_parsers:
185
249
  family_replacement: 'Firefox Beta'
186
250
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
187
251
  family_replacement: 'Firefox ($1)'
188
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
252
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
189
253
  family_replacement: 'MicroB'
190
254
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
191
255
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -217,24 +281,24 @@ user_agent_parsers:
217
281
 
218
282
  # Opera will stop at 9.80 and hide the real version in the Version string.
219
283
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
220
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
284
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
221
285
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
222
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
286
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
223
287
  family_replacement: 'Opera Mobile'
224
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
288
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
225
289
  family_replacement: 'Opera Mobile'
226
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
290
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
227
291
  family_replacement: 'Opera Mobile'
228
292
  - regex: 'Opera Mobi'
229
293
  family_replacement: 'Opera Mobile'
230
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
294
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
231
295
 
232
296
  # Opera 14 for Android uses a WebKit render engine.
233
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
297
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
234
298
  family_replacement: 'Opera Mobile'
235
299
 
236
300
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
237
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
301
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
238
302
  family_replacement: 'Opera'
239
303
 
240
304
  # Opera Coast
@@ -246,7 +310,7 @@ user_agent_parsers:
246
310
  family_replacement: 'Opera Mini'
247
311
 
248
312
  # Opera Neon
249
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
313
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
250
314
  family_replacement: 'Opera Neon'
251
315
 
252
316
  # Palm WebOS looks a lot like Safari.
@@ -293,7 +357,7 @@ user_agent_parsers:
293
357
 
294
358
  - regex: '(Symphony) (\d+).(\d+)'
295
359
 
296
- - regex: 'PLAYSTATION 3.+WebKit'
360
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
297
361
  family_replacement: 'NetFront NX'
298
362
  - regex: 'PLAYSTATION 3'
299
363
  family_replacement: 'NetFront'
@@ -302,7 +366,7 @@ user_agent_parsers:
302
366
  - regex: '(PlayStation Vita)'
303
367
  family_replacement: 'NetFront NX'
304
368
 
305
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
369
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
306
370
  family_replacement: 'NetFront NX'
307
371
  - regex: '(Nintendo 3DS)'
308
372
  family_replacement: 'NetFront NX'
@@ -315,11 +379,9 @@ user_agent_parsers:
315
379
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
316
380
 
317
381
  # Edge Mobile
318
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
382
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
319
383
  family_replacement: 'Edge Mobile'
320
- - regex: '(EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
321
- family_replacement: 'Edge Mobile'
322
- - regex: '(EdgiOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
384
+ - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
323
385
  family_replacement: 'Edge Mobile'
324
386
 
325
387
  # Samsung Internet (based on Chrome, but lacking some features)
@@ -365,9 +427,9 @@ user_agent_parsers:
365
427
  family_replacement: 'TopBuzz'
366
428
 
367
429
  # Google Search App on Android, eg:
368
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
430
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
369
431
  family_replacement: 'Google'
370
-
432
+
371
433
  # QQ Browsers
372
434
  - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
373
435
  family_replacement: 'QQ Browser Mini'
@@ -376,10 +438,18 @@ user_agent_parsers:
376
438
  - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
377
439
  family_replacement: 'QQ Browser'
378
440
 
441
+ # DuckDuckGo
442
+ - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)'
443
+ family_replacement: 'DuckDuckGo Mobile'
444
+
445
+ # Tenta Browser
446
+ - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
447
+ family_replacement: 'Tenta Browser'
448
+
379
449
  # Chrome Mobile
380
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
381
451
  family_replacement: 'Chrome Mobile WebView'
382
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
452
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
383
453
  family_replacement: 'Chrome Mobile WebView'
384
454
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
385
455
  family_replacement: 'Chrome Mobile'
@@ -387,7 +457,7 @@ user_agent_parsers:
387
457
  family_replacement: 'Chrome Mobile iOS'
388
458
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
389
459
  family_replacement: 'Chrome Mobile'
390
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
460
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
391
461
  family_replacement: 'Chrome Mobile'
392
462
 
393
463
  # Chrome Frame must come before MSIE.
@@ -406,6 +476,9 @@ user_agent_parsers:
406
476
  - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
407
477
  family_replacement: 'RackspaceBot'
408
478
 
479
+ # PRTG Network Monitoring
480
+ - regex: '(PRTG Network Monitor)'
481
+
409
482
  # PyAMF
410
483
  - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
411
484
 
@@ -414,7 +487,7 @@ user_agent_parsers:
414
487
  family_replacement: 'Yandex Browser'
415
488
 
416
489
  # Mail.ru Amigo/Internet Browser (Chromium-based)
417
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
490
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
418
491
  family_replacement: 'Mail.ru Chromium Browser'
419
492
 
420
493
  # AOL Browser (IE-based)
@@ -441,6 +514,9 @@ user_agent_parsers:
441
514
  # @ref: http://www.ghost.org
442
515
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
443
516
 
517
+ # Palo Alto GlobalProtect Linux
518
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
519
+
444
520
  #### END SPECIAL CASES TOP ####
445
521
 
446
522
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -482,7 +558,7 @@ user_agent_parsers:
482
558
  - regex: 'Microsoft Office (Word) 2014'
483
559
 
484
560
  # Windows Live Mail
485
- - regex: 'Outlook-Express\/7\.0.*'
561
+ - regex: 'Outlook-Express\/7\.0'
486
562
  family_replacement: 'Windows Live Mail'
487
563
 
488
564
  # Apple Air Mail
@@ -522,7 +598,7 @@ user_agent_parsers:
522
598
  family_replacement: 'Brave'
523
599
 
524
600
  # Iron Browser ~since version 50
525
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
601
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
526
602
  family_replacement: 'Iron'
527
603
 
528
604
  # Dolphin Browser
@@ -598,20 +674,20 @@ user_agent_parsers:
598
674
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
599
675
  - regex: '^(Stitcher)/iOS'
600
676
  - regex: '^(Stitcher)/Android'
601
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
677
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
602
678
  - regex: ' (VLC) for'
603
679
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
604
680
  family_replacement: 'VLC'
605
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
606
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
607
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
681
+ - regex: '^(foobar)\S{1,10}/(\d+)\.(\d+|)\.?([\da-z]+|)'
682
+ - regex: '^(Clementine)\S{1,10} (\d+)\.(\d+|)\.?(\d+|)'
683
+ - regex: '(amarok)/(\d+)\.(\d+|)\.?(\d+|)'
608
684
  family_replacement: 'Amarok'
609
685
  - regex: '(Custom)-Feed Reader'
610
686
 
611
687
  # Browser major_version.minor_version.beta_version (space instead of slash)
612
688
  - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
613
689
  # Browser major_version.minor_version (space instead of slash)
614
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)'
690
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
615
691
 
616
692
  # Kindle WebKit
617
693
  - regex: '(Kindle)/(\d+)\.(\d+)'
@@ -638,7 +714,7 @@ user_agent_parsers:
638
714
 
639
715
  # desktop mode
640
716
  # http://www.anandtech.com/show/3982/windows-phone-7-review
641
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
717
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
642
718
  family_replacement: 'IE Large Screen'
643
719
 
644
720
  # Nextcloud desktop sync client
@@ -655,6 +731,17 @@ user_agent_parsers:
655
731
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
656
732
  family_replacement: 'Skype'
657
733
 
734
+ # OpenVAS Scanner
735
+ - regex: '(OpenVAS)(?:-VT)?(?:[ \/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
736
+ family_replacement: 'OpenVAS Scanner'
737
+
738
+ # AnyConnect
739
+ - regex: '(AnyConnect)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
740
+
741
+ # Monitis
742
+ - regex: 'compatible; monitis'
743
+ family_replacement: 'Monitis'
744
+
658
745
  #### END MAIN CASES ####
659
746
 
660
747
  #### SPECIAL CASES ####
@@ -691,21 +778,17 @@ user_agent_parsers:
691
778
  family_replacement: 'TopBuzz'
692
779
 
693
780
  # @note: iOS / OSX Applications
694
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
781
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
695
782
  family_replacement: 'Google'
696
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
783
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
697
784
  family_replacement: 'Mobile Safari'
698
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
785
+ - regex: '(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\d+)_(\d+)(?:_(\d+)|).{0,30} AppleNews\/\d+\.\d+(?:\.\d+|)'
699
786
  family_replacement: 'Mobile Safari UI/WKWebView'
700
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
787
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
701
788
  family_replacement: 'Mobile Safari UI/WKWebView'
702
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari'
789
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
703
790
  family_replacement: 'Mobile Safari'
704
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile'
705
- family_replacement: 'Mobile Safari UI/WKWebView'
706
- - regex: '(iPod|iPhone|iPad).* Safari'
707
- family_replacement: 'Mobile Safari'
708
- - regex: '(iPod|iPhone|iPad)'
791
+ - regex: '(iPod|iPod touch|iPhone|iPad)'
709
792
  family_replacement: 'Mobile Safari UI/WKWebView'
710
793
  - regex: '(Watch)(\d+),(\d+)'
711
794
  family_replacement: 'Apple $1 App'
@@ -754,9 +837,9 @@ user_agent_parsers:
754
837
  - regex: '(Nokia)[EN]?(\d+)'
755
838
 
756
839
  # BlackBerry devices
757
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
840
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
758
841
  family_replacement: 'BlackBerry WebKit'
759
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
842
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
760
843
  family_replacement: 'BlackBerry WebKit'
761
844
  - regex: '(Black[bB]erry)\s?(\d+)'
762
845
  family_replacement: 'BlackBerry'
@@ -776,18 +859,15 @@ user_agent_parsers:
776
859
 
777
860
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
778
861
 
779
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
780
- # family_replacement: 'iPad'
781
-
782
862
  # Phantomjs, should go before Safari
783
863
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
784
864
 
785
865
  # WebKit Nightly
786
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
866
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
787
867
  family_replacement: 'WebKit Nightly'
788
868
 
789
869
  # Safari
790
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
870
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
791
871
  family_replacement: 'Safari'
792
872
  # Safari didn't provide "Version/d.d.d" prior to 3.0
793
873
  - regex: '(Safari)/\d+'
@@ -836,6 +916,7 @@ user_agent_parsers:
836
916
  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
837
917
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
838
918
 
919
+
839
920
  - regex: '([MS]?IE) (\d+)\.(\d+)'
840
921
  family_replacement: 'IE'
841
922
 
@@ -843,18 +924,56 @@ user_agent_parsers:
843
924
  family_replacement: 'Python Requests'
844
925
 
845
926
  # headless user-agents
846
- - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
927
+ - 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+)|)|)'
928
+
929
+ # CloudFoundry
930
+ - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
931
+ family_replacement: 'CloudFoundry'
932
+
933
+ # SAP Leonardo
934
+ - regex: '^(sap-leonardo-iot-sdk-nodejs) \/ (\d+)\.(\d+)\.(\d+)'
935
+
936
+ # SAP Netweaver Application Server
937
+ - regex: '^(SAP NetWeaver Application Server) \(1.0;(\d{1})(\d{2})\)'
938
+
939
+ # HttpClient
940
+ - regex: '^(\w+-HTTPClient)\/(\d+)\.(\d+)-(\S+)'
941
+ family_replacement: 'HTTPClient'
942
+
943
+ # go-cli
944
+ - regex: '^(go-cli)\s(\d+)\.(\d+).(\S+)'
945
+
946
+ # Other Clients with the pattern <Name>/[v]<Major>.<Minor>[.<Patch>]
947
+ - regex: '^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\/v?(\d+)\.(\d+)\.?(\d*)'
948
+
949
+ ## Clints with the pattern <Name>
950
+ - regex: '^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)'
847
951
 
848
952
  # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
849
953
  - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
850
- # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
851
- - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
954
+ family_replacement: 'Python aiohttp'
955
+
956
+ - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
852
957
 
853
- - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
958
+ # minio-go (https://github.com/minio/minio-go)
959
+ - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
960
+
961
+ # ureq - minimal request library in rust (https://github.com/algesten/ureq)
962
+ - regex: '^(ureq)[/ ](\d+)\.(\d+).(\d+)'
963
+
964
+ # http.rb - HTTP (The Gem! a.k.a. http.rb) - a fast Ruby HTTP client
965
+ # (https://github.com/httprb/http/blob/3aa7470288deb81f7d7b982c1e2381871049dcbb/lib/http/request.rb#L27)
966
+ - regex: '^(http\.rb)/(\d+)\.(\d+).(\d+)'
967
+
968
+ # Guzzle, PHP HTTP client (https://docs.guzzlephp.org/)
969
+ - regex: '^(GuzzleHttp)/(\d+)\.(\d+).(\d+)'
970
+
971
+ # lorien/grab - Web Scraping Framework (https://github.com/lorien/grab)
972
+ - regex: '^(grab)\b'
854
973
 
855
974
  # Cloud Storage Clients
856
975
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
857
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
976
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
858
977
  - regex: '(S3Gof3r)'
859
978
  # IBM COS (Cloud Object Storage) API
860
979
  - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
@@ -877,6 +996,15 @@ user_agent_parsers:
877
996
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
878
997
  family_replacement: 'ViaFree'
879
998
 
999
+ # Transmit (https://library.panic.com/transmit/)
1000
+ - regex: '(Transmit)/(\d+)\.(\d+)\.(\d+)'
1001
+
1002
+ # Download Master (https://downloadmaster.ru/)
1003
+ - regex: '(Download Master)'
1004
+
1005
+ # HTTrack crawler
1006
+ - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1007
+
880
1008
  os_parsers:
881
1009
  ##########
882
1010
  # HbbTV vendors
@@ -892,7 +1020,7 @@ os_parsers:
892
1020
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
893
1021
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
894
1022
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
895
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1023
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
896
1024
 
897
1025
 
898
1026
  # LG is consistent too, but we need to add manually the year model
@@ -912,9 +1040,9 @@ os_parsers:
912
1040
  os_replacement: 'Samsung'
913
1041
  os_v1_replacement: '2011'
914
1042
  # manage the two models of 2013
915
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
1043
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC'
916
1044
  os_v2_replacement: 'UE40F7000'
917
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
1045
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC'
918
1046
  os_v2_replacement: 'UE32F4500'
919
1047
  # generic Samsung (works starting in 2012)
920
1048
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -922,22 +1050,26 @@ os_parsers:
922
1050
  # Philips : not found any other way than a manual mapping
923
1051
  # 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
924
1052
  # 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
925
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1053
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
926
1054
  os_v1_replacement: '2013'
927
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1055
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
928
1056
  os_v1_replacement: '2012'
929
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1057
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
930
1058
  os_v1_replacement: '2011'
931
1059
 
932
1060
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
933
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
1061
+ - regex: 'HbbTV/\d+\.\d+\.\d+.{0,100}(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
934
1062
  os_replacement: 'FireHbbTV'
935
1063
 
936
1064
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
937
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
1065
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
1066
+
1067
+ # aspiegel.com spider (owned by Huawei)
1068
+ - regex: 'AspiegelBot'
1069
+ os_replacement: 'Other'
938
1070
 
939
1071
  ##########
940
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
1072
+ # @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
941
1073
  # 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)...
942
1074
  # 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)...
943
1075
  # 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)...
@@ -946,10 +1078,16 @@ os_parsers:
946
1078
 
947
1079
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
948
1080
 
949
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
950
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
1081
+ # Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
1082
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
951
1083
  os_replacement: 'iOS'
952
1084
 
1085
+ # Special case for old ArcGIS Mobile products
1086
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1087
+
1088
+ # Special case for new ArcGIS Mobile products
1089
+ - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1090
+
953
1091
  ##########
954
1092
  # Android
955
1093
  # can actually detect rooted android os. do we care?
@@ -976,17 +1114,17 @@ os_parsers:
976
1114
  os_v1_replacement: '3'
977
1115
 
978
1116
  # Android 9; Android 10;
979
- - regex: '(Android) (\d+);'
1117
+ - regex: '(Android) (\d+);'
980
1118
 
981
1119
  # UCWEB
982
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1120
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
983
1121
  os_replacement: 'Android'
984
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1122
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
985
1123
  os_replacement: 'iOS'
986
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1124
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
987
1125
  os_replacement: 'Windows Phone'
988
1126
  # JUC
989
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1127
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
990
1128
  os_replacement: 'Android'
991
1129
 
992
1130
  # Salesforce
@@ -1004,7 +1142,7 @@ os_parsers:
1004
1142
  # properly identify as Chrome OS
1005
1143
  #
1006
1144
  # 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
1007
- - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
1145
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
1008
1146
  os_replacement: 'Chrome OS'
1009
1147
 
1010
1148
  ##########
@@ -1033,11 +1171,11 @@ os_parsers:
1033
1171
  os_replacement: 'Windows'
1034
1172
  os_v1_replacement: 'XP'
1035
1173
 
1036
- - regex: '(Windows NT 6\.1)'
1174
+ - regex: '(Win(?:dows NT |32NT\/)6\.1)'
1037
1175
  os_replacement: 'Windows'
1038
1176
  os_v1_replacement: '7'
1039
1177
 
1040
- - regex: '(Windows NT 6\.0)'
1178
+ - regex: '(Win(?:dows NT |32NT\/)6\.0)'
1041
1179
  os_replacement: 'Windows'
1042
1180
  os_v1_replacement: 'Vista'
1043
1181
 
@@ -1049,7 +1187,7 @@ os_parsers:
1049
1187
  os_replacement: 'Windows'
1050
1188
  os_v1_replacement: 'RT'
1051
1189
 
1052
- - regex: '(Windows NT 6\.2)'
1190
+ - regex: '(Win(?:dows NT |32NT\/)6\.2)'
1053
1191
  os_replacement: 'Windows'
1054
1192
  os_v1_replacement: '8'
1055
1193
 
@@ -1058,12 +1196,12 @@ os_parsers:
1058
1196
  os_v1_replacement: 'RT 8'
1059
1197
  os_v2_replacement: '1'
1060
1198
 
1061
- - regex: '(Windows NT 6\.3)'
1199
+ - regex: '(Win(?:dows NT |32NT\/)6\.3)'
1062
1200
  os_replacement: 'Windows'
1063
1201
  os_v1_replacement: '8'
1064
1202
  os_v2_replacement: '1'
1065
1203
 
1066
- - regex: '(Windows NT 6\.4)'
1204
+ - regex: '(Win(?:dows NT |32NT\/)6\.4)'
1067
1205
  os_replacement: 'Windows'
1068
1206
  os_v1_replacement: '10'
1069
1207
 
@@ -1096,7 +1234,7 @@ os_parsers:
1096
1234
  os_v1_replacement: '95'
1097
1235
 
1098
1236
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1099
- - regex: '^Box.*Windows/([\d.]+);'
1237
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1100
1238
  os_replacement: 'Windows'
1101
1239
  os_v1_replacement: '$1'
1102
1240
 
@@ -1113,33 +1251,33 @@ os_parsers:
1113
1251
  ##########
1114
1252
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1115
1253
  os_replacement: 'Mac OS X'
1116
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1254
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1117
1255
  os_replacement: 'Mac OS X'
1118
1256
  os_v1_replacement: '$1'
1119
1257
  os_v2_replacement: '$2'
1120
1258
  os_v3_replacement: '$3'
1121
1259
  # Leopard
1122
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1260
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1123
1261
  os_replacement: 'Mac OS X'
1124
1262
  os_v1_replacement: '10'
1125
1263
  os_v2_replacement: '5'
1126
1264
  # Snow Leopard
1127
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1265
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1128
1266
  os_replacement: 'Mac OS X'
1129
1267
  os_v1_replacement: '10'
1130
1268
  os_v2_replacement: '6'
1131
1269
  # Lion
1132
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1270
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1133
1271
  os_replacement: 'Mac OS X'
1134
1272
  os_v1_replacement: '10'
1135
1273
  os_v2_replacement: '7'
1136
1274
  # Mountain Lion
1137
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1275
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1138
1276
  os_replacement: 'Mac OS X'
1139
1277
  os_v1_replacement: '10'
1140
1278
  os_v2_replacement: '8'
1141
1279
  # Mavericks
1142
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1280
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1143
1281
  os_replacement: 'Mac OS X'
1144
1282
  os_v1_replacement: '10'
1145
1283
  os_v2_replacement: '9'
@@ -1156,7 +1294,7 @@ os_parsers:
1156
1294
  - regex: '(?:PPC|Intel) (Mac OS X)'
1157
1295
 
1158
1296
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1159
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1297
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1160
1298
  os_replacement: 'Mac OS X'
1161
1299
 
1162
1300
  ##########
@@ -1167,7 +1305,7 @@ os_parsers:
1167
1305
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1168
1306
  os_replacement: 'ATV OS X'
1169
1307
 
1170
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1308
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1171
1309
  os_replacement: 'iOS'
1172
1310
 
1173
1311
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1175,15 +1313,15 @@ os_parsers:
1175
1313
  os_replacement: 'iOS'
1176
1314
 
1177
1315
  # few more stragglers
1178
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
1316
+ - regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
1179
1317
  os_replacement: 'iOS'
1180
1318
 
1181
1319
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1182
1320
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1183
1321
  # See: http://user-agents.me/cfnetwork-version-list
1184
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1322
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1185
1323
  os_replacement: 'iOS'
1186
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
1324
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
1187
1325
  os_replacement: 'iOS'
1188
1326
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1189
1327
  os_replacement: 'iOS'
@@ -1218,17 +1356,17 @@ os_parsers:
1218
1356
  os_replacement: 'Mac OS X'
1219
1357
  os_v1_replacement: '10'
1220
1358
  os_v2_replacement: '11'
1221
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1359
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1222
1360
  os_replacement: 'iOS'
1223
1361
  os_v1_replacement: '9'
1224
1362
  os_v2_replacement: '3'
1225
1363
  os_v3_replacement: '1'
1226
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1364
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1227
1365
  os_replacement: 'iOS'
1228
1366
  os_v1_replacement: '9'
1229
1367
  os_v2_replacement: '3'
1230
1368
  os_v3_replacement: '2'
1231
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1369
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1232
1370
  os_replacement: 'iOS'
1233
1371
  os_v1_replacement: '9'
1234
1372
  os_v2_replacement: '3'
@@ -1249,15 +1387,15 @@ os_parsers:
1249
1387
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1250
1388
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1251
1389
  ##########
1252
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1390
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1253
1391
  os_replacement: 'Mac OS X'
1254
1392
  os_v1_replacement: '10'
1255
1393
  os_v2_replacement: '13'
1256
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1394
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1257
1395
  os_replacement: 'Mac OS X'
1258
1396
  os_v1_replacement: '10'
1259
1397
  os_v2_replacement: '12'
1260
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1398
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1261
1399
  os_replacement: 'Mac OS X'
1262
1400
  os_v1_replacement: '10'
1263
1401
  os_v2_replacement: '11'
@@ -1265,87 +1403,146 @@ os_parsers:
1265
1403
  # CFNetwork iOS Apps
1266
1404
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1267
1405
  ##########
1268
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1406
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1269
1407
  os_replacement: 'iOS'
1270
1408
  os_v1_replacement: '1'
1271
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1409
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1272
1410
  os_replacement: 'iOS'
1273
1411
  os_v1_replacement: '4'
1274
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1412
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1275
1413
  os_replacement: 'iOS'
1276
1414
  os_v1_replacement: '5'
1277
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1415
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1278
1416
  os_replacement: 'iOS'
1279
1417
  os_v1_replacement: '6'
1280
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1418
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1281
1419
  os_replacement: 'iOS'
1282
1420
  os_v1_replacement: '7'
1283
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1421
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1284
1422
  os_replacement: 'iOS'
1285
1423
  os_v1_replacement: '8'
1286
1424
  os_v2_replacement: '0'
1287
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1425
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1288
1426
  os_replacement: 'iOS'
1289
1427
  os_v1_replacement: '9'
1290
1428
  os_v2_replacement: '0'
1291
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1429
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1292
1430
  os_replacement: 'iOS'
1293
1431
  os_v1_replacement: '10'
1294
1432
  os_v2_replacement: '3'
1295
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1433
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1296
1434
  os_replacement: 'iOS'
1297
1435
  os_v1_replacement: '10'
1298
1436
  os_v2_replacement: '3'
1299
1437
  os_v3_replacement: '2'
1300
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1438
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1301
1439
  os_replacement: 'iOS'
1302
1440
  os_v1_replacement: '10'
1303
1441
  os_v2_replacement: '3'
1304
1442
  os_v3_replacement: '3'
1305
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1443
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1306
1444
  os_replacement: 'iOS'
1307
1445
  os_v1_replacement: '10'
1308
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1446
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1309
1447
  os_replacement: 'iOS'
1310
1448
  os_v1_replacement: '11'
1311
1449
  os_v2_replacement: '0'
1312
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1450
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1313
1451
  os_replacement: 'iOS'
1314
1452
  os_v1_replacement: '11'
1315
1453
  os_v2_replacement: '1'
1316
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1454
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1317
1455
  os_replacement: 'iOS'
1318
1456
  os_v1_replacement: '11'
1319
1457
  os_v2_replacement: '2'
1320
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1458
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1321
1459
  os_replacement: 'iOS'
1322
1460
  os_v1_replacement: '11'
1323
1461
  os_v2_replacement: '2'
1324
1462
  os_v3_replacement: '6'
1325
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1463
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1326
1464
  os_replacement: 'iOS'
1327
1465
  os_v1_replacement: '11'
1328
1466
  os_v2_replacement: '3'
1329
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1467
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1330
1468
  os_replacement: 'iOS'
1331
1469
  os_v1_replacement: '11'
1332
1470
  os_v2_replacement: '4'
1333
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1471
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1334
1472
  os_replacement: 'iOS'
1335
1473
  os_v1_replacement: '11'
1336
1474
  os_v2_replacement: '4'
1337
1475
  os_v3_replacement: '1'
1338
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1476
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1339
1477
  os_replacement: 'iOS'
1340
1478
  os_v1_replacement: '11'
1341
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1479
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1342
1480
  os_replacement: 'iOS'
1343
1481
  os_v1_replacement: '12'
1344
1482
  os_v2_replacement: '0'
1345
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1483
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1346
1484
  os_replacement: 'iOS'
1347
1485
  os_v1_replacement: '12'
1348
- - regex: 'CFNetwork/.* Darwin/'
1486
+ os_v2_replacement: '1'
1487
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.5\.\d+'
1488
+ os_replacement: 'iOS'
1489
+ os_v1_replacement: '12'
1490
+ os_v2_replacement: '2'
1491
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.6\.\d+'
1492
+ os_replacement: 'iOS'
1493
+ os_v1_replacement: '12'
1494
+ os_v2_replacement: '3'
1495
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.7\.\d+'
1496
+ os_replacement: 'iOS'
1497
+ os_v1_replacement: '12'
1498
+ os_v2_replacement: '4'
1499
+ - regex: 'CFNetwork/9.{0,100} Darwin/(18)\.\d+'
1500
+ os_replacement: 'iOS'
1501
+ os_v1_replacement: '12'
1502
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.2\.\d+'
1503
+ os_replacement: 'iOS'
1504
+ os_v1_replacement: '13'
1505
+ os_v2_replacement: '3'
1506
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.3\.\d+'
1507
+ os_replacement: 'iOS'
1508
+ os_v1_replacement: '13'
1509
+ os_v2_replacement: '3'
1510
+ os_v3_replacement: '1'
1511
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.4\.\d+'
1512
+ os_replacement: 'iOS'
1513
+ os_v1_replacement: '13'
1514
+ os_v2_replacement: '4'
1515
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.5\.\d+'
1516
+ os_replacement: 'iOS'
1517
+ os_v1_replacement: '13'
1518
+ os_v2_replacement: '5'
1519
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.6\.\d+'
1520
+ os_replacement: 'iOS'
1521
+ os_v1_replacement: '13'
1522
+ os_v2_replacement: '6'
1523
+ - regex: 'CFNetwork/1[01].{0,100} Darwin/19\.\d+'
1524
+ os_replacement: 'iOS'
1525
+ os_v1_replacement: '13'
1526
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.1\.\d+'
1527
+ os_replacement: 'iOS'
1528
+ os_v1_replacement: '14'
1529
+ os_v2_replacement: '2'
1530
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.2\.\d+'
1531
+ os_replacement: 'iOS'
1532
+ os_v1_replacement: '14'
1533
+ os_v2_replacement: '3'
1534
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.3\.\d+'
1535
+ os_replacement: 'iOS'
1536
+ os_v1_replacement: '14'
1537
+ os_v2_replacement: '4'
1538
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.4\.\d+'
1539
+ os_replacement: 'iOS'
1540
+ os_v1_replacement: '14'
1541
+ os_v2_replacement: '5'
1542
+ - regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
1543
+ os_replacement: 'iOS'
1544
+ os_v1_replacement: '14'
1545
+ - regex: 'CFNetwork/.{0,100} Darwin/'
1349
1546
  os_replacement: 'iOS'
1350
1547
 
1351
1548
  # iOS Apps
@@ -1356,7 +1553,7 @@ os_parsers:
1356
1553
  ##########
1357
1554
  # Apple Watch
1358
1555
  ##########
1359
- - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
1556
+ - regex: '(watchOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
1360
1557
  os_replacement: 'WatchOS'
1361
1558
 
1362
1559
  ##########################
@@ -1399,9 +1596,9 @@ os_parsers:
1399
1596
  ##########
1400
1597
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1401
1598
  os_replacement: 'Symbian OS'
1402
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1599
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1403
1600
  os_replacement: 'Symbian^3 Anna'
1404
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1601
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1405
1602
  os_replacement: 'Symbian^3 Belle'
1406
1603
  - regex: '(Symbian/3)'
1407
1604
  os_replacement: 'Symbian^3'
@@ -1418,11 +1615,11 @@ os_parsers:
1418
1615
  ##########
1419
1616
  # BlackBerry devices
1420
1617
  ##########
1421
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1618
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1422
1619
  os_replacement: 'BlackBerry OS'
1423
1620
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1424
1621
  os_replacement: 'BlackBerry OS'
1425
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1622
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1426
1623
  os_replacement: 'BlackBerry OS'
1427
1624
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1428
1625
  os_replacement: 'BlackBerry Tablet OS'
@@ -1440,44 +1637,44 @@ os_parsers:
1440
1637
  ##########
1441
1638
  # Firefox OS
1442
1639
  ##########
1443
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1640
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1444
1641
  os_replacement: 'Firefox OS'
1445
1642
  os_v1_replacement: '1'
1446
1643
  os_v2_replacement: '0'
1447
1644
  os_v3_replacement: '1'
1448
1645
 
1449
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1646
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1450
1647
  os_replacement: 'Firefox OS'
1451
1648
  os_v1_replacement: '1'
1452
1649
  os_v2_replacement: '1'
1453
1650
 
1454
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1651
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1455
1652
  os_replacement: 'Firefox OS'
1456
1653
  os_v1_replacement: '1'
1457
1654
  os_v2_replacement: '2'
1458
1655
 
1459
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1656
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1460
1657
  os_replacement: 'Firefox OS'
1461
1658
  os_v1_replacement: '1'
1462
1659
  os_v2_replacement: '3'
1463
1660
 
1464
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1661
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1465
1662
  os_replacement: 'Firefox OS'
1466
1663
  os_v1_replacement: '1'
1467
1664
  os_v2_replacement: '4'
1468
1665
 
1469
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1666
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1470
1667
  os_replacement: 'Firefox OS'
1471
1668
  os_v1_replacement: '2'
1472
1669
  os_v2_replacement: '0'
1473
1670
 
1474
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1671
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1475
1672
  os_replacement: 'Firefox OS'
1476
1673
  os_v1_replacement: '2'
1477
1674
  os_v2_replacement: '1'
1478
1675
 
1479
1676
  # Firefox OS Generic
1480
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1677
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1481
1678
  os_replacement: 'Firefox OS'
1482
1679
 
1483
1680
 
@@ -1519,7 +1716,7 @@ os_parsers:
1519
1716
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1520
1717
 
1521
1718
  # Gentoo Linux + Kernel Version
1522
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1719
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1523
1720
  os_replacement: 'Gentoo'
1524
1721
 
1525
1722
  # Opera Mini Bada
@@ -1551,19 +1748,19 @@ device_parsers:
1551
1748
  # Mobile Spiders
1552
1749
  # Catch the mobile crawler before checking for iPhones / Androids.
1553
1750
  #########
1554
- - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1751
+ - 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)'
1555
1752
  regex_flag: 'i'
1556
1753
  device_replacement: 'Spider'
1557
1754
  brand_replacement: 'Spider'
1558
1755
  model_replacement: 'Smartphone'
1559
- - 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)'
1756
+ - 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)'
1560
1757
  regex_flag: 'i'
1561
1758
  device_replacement: 'Spider'
1562
1759
  brand_replacement: 'Spider'
1563
1760
  model_replacement: 'Feature Phone'
1564
1761
 
1565
1762
  # PTST / WebPageTest.org crawlers
1566
- - regex: ' PTST/\d+(?:\.)?\d+$'
1763
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1567
1764
  device_replacement: 'Spider'
1568
1765
  brand_replacement: 'Spider'
1569
1766
 
@@ -1572,11 +1769,21 @@ device_parsers:
1572
1769
  device_replacement: 'Spider'
1573
1770
  brand_replacement: 'Spider'
1574
1771
 
1772
+ # aspiegel.com spider (owned by Huawei)
1773
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1774
+ device_replacement: 'Spider'
1775
+ brand_replacement: 'Spider'
1776
+ model_replacement: 'Smartphone'
1777
+ - regex: 'Mozilla.{0,200}AspiegelBot'
1778
+ device_replacement: 'Spider'
1779
+ brand_replacement: 'Spider'
1780
+ model_replacement: 'Desktop'
1781
+
1575
1782
  #########
1576
1783
  # WebBrowser for SmartWatch
1577
1784
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1578
1785
  #########
1579
- - regex: '\bSmartWatch *\( *([^;]+) *; *([^;]+) *;'
1786
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1580
1787
  device_replacement: '$1 $2'
1581
1788
  brand_replacement: '$1'
1582
1789
  model_replacement: '$2'
@@ -1588,16 +1795,16 @@ device_parsers:
1588
1795
  ######################################################################
1589
1796
 
1590
1797
  # Android Application
1591
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1798
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1592
1799
  device_replacement: '$1 $2'
1593
1800
  brand_replacement: '$1$2'
1594
1801
  model_replacement: '$3'
1595
- - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
1802
+ - regex: 'Android Application[^\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.{1,200}) \w{1,20} - '
1596
1803
  regex_flag: 'i'
1597
1804
  device_replacement: '$1 $2'
1598
1805
  brand_replacement: '$1'
1599
1806
  model_replacement: '$2'
1600
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1807
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1601
1808
  device_replacement: '$1 $2'
1602
1809
  brand_replacement: '$1'
1603
1810
  model_replacement: '$2'
@@ -1606,11 +1813,11 @@ device_parsers:
1606
1813
  # 3Q
1607
1814
  # @ref: http://www.3q-int.com/
1608
1815
  #########
1609
- - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1816
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1610
1817
  device_replacement: '3Q $1'
1611
1818
  brand_replacement: '3Q'
1612
1819
  model_replacement: '$1'
1613
- - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1820
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1614
1821
  device_replacement: '3Q $1'
1615
1822
  brand_replacement: '3Q'
1616
1823
  model_replacement: '$1'
@@ -1619,19 +1826,19 @@ device_parsers:
1619
1826
  # Acer
1620
1827
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1621
1828
  #########
1622
- - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\) AppleWebKit)'
1829
+ - 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)'
1623
1830
  device_replacement: '$1'
1624
1831
  brand_replacement: 'Acer'
1625
1832
  model_replacement: '$1'
1626
- - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1833
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1627
1834
  device_replacement: '$1'
1628
1835
  brand_replacement: 'Acer'
1629
1836
  model_replacement: '$1'
1630
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1837
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1631
1838
  device_replacement: '$1'
1632
1839
  brand_replacement: 'Acer'
1633
1840
  model_replacement: '$1'
1634
- - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1841
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1635
1842
  device_replacement: '$1$2'
1636
1843
  brand_replacement: 'Acer'
1637
1844
  model_replacement: '$2'
@@ -1642,7 +1849,7 @@ device_parsers:
1642
1849
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1643
1850
  # custom ROM builds for Vega
1644
1851
  #########
1645
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1852
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1646
1853
  device_replacement: '$1$2'
1647
1854
  brand_replacement: 'Advent'
1648
1855
  model_replacement: '$2'
@@ -1651,7 +1858,7 @@ device_parsers:
1651
1858
  # Ainol
1652
1859
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1653
1860
  #########
1654
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
1861
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1655
1862
  device_replacement: '$1$2'
1656
1863
  brand_replacement: 'Ainol'
1657
1864
  model_replacement: '$2'
@@ -1660,12 +1867,12 @@ device_parsers:
1660
1867
  # Airis
1661
1868
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1662
1869
  #########
1663
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
1870
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1664
1871
  regex_flag: 'i'
1665
1872
  device_replacement: '$1'
1666
1873
  brand_replacement: 'Airis'
1667
1874
  model_replacement: '$1'
1668
- - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
1875
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1669
1876
  regex_flag: 'i'
1670
1877
  device_replacement: '$1'
1671
1878
  brand_replacement: 'Airis'
@@ -1675,7 +1882,7 @@ device_parsers:
1675
1882
  # Airpad
1676
1883
  # @ref: ??
1677
1884
  #########
1678
- - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
1885
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1679
1886
  device_replacement: 'Airpad $1'
1680
1887
  brand_replacement: 'Airpad'
1681
1888
  model_replacement: '$1'
@@ -1684,29 +1891,29 @@ device_parsers:
1684
1891
  # Alcatel - TCT
1685
1892
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1686
1893
  #########
1687
- - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1894
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1688
1895
  device_replacement: 'Alcatel One Touch $2'
1689
1896
  brand_replacement: 'Alcatel'
1690
1897
  model_replacement: 'One Touch $2'
1691
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
1898
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1692
1899
  regex_flag: 'i'
1693
1900
  device_replacement: 'Alcatel One Touch $1'
1694
1901
  brand_replacement: 'Alcatel'
1695
1902
  model_replacement: 'One Touch $1'
1696
- - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1903
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1697
1904
  device_replacement: '$1 $2'
1698
1905
  brand_replacement: '$1'
1699
1906
  model_replacement: '$2'
1700
1907
  # operator specific models
1701
- - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1908
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1702
1909
  device_replacement: 'Alcatel $1'
1703
1910
  brand_replacement: 'Alcatel'
1704
1911
  model_replacement: '$1'
1705
- - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
1912
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1706
1913
  device_replacement: 'Alcatel One Touch 998'
1707
1914
  brand_replacement: 'Alcatel'
1708
1915
  model_replacement: 'One Touch 998'
1709
- - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
1916
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1710
1917
  device_replacement: 'Alcatel One Touch 918D'
1711
1918
  brand_replacement: 'Alcatel'
1712
1919
  model_replacement: 'One Touch 918D'
@@ -1715,7 +1922,7 @@ device_parsers:
1715
1922
  # Allfine
1716
1923
  # @ref: http://www.myallfine.com/Products.asp
1717
1924
  #########
1718
- - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
1925
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1719
1926
  device_replacement: '$1'
1720
1927
  brand_replacement: 'Allfine'
1721
1928
  model_replacement: '$1'
@@ -1724,15 +1931,15 @@ device_parsers:
1724
1931
  # Allview
1725
1932
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1726
1933
  #########
1727
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
1934
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1728
1935
  device_replacement: '$1$2'
1729
1936
  brand_replacement: 'Allview'
1730
1937
  model_replacement: '$2'
1731
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1938
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1732
1939
  device_replacement: '$1$2'
1733
1940
  brand_replacement: 'Allview'
1734
1941
  model_replacement: '$2'
1735
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1942
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1736
1943
  device_replacement: '$1$2'
1737
1944
  brand_replacement: 'Allview'
1738
1945
  model_replacement: '$2'
@@ -1742,11 +1949,11 @@ device_parsers:
1742
1949
  # @ref: http://www.allwinner.com/
1743
1950
  # @models: A31 (13.3"),A20,A10,
1744
1951
  #########
1745
- - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
1952
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1746
1953
  device_replacement: '$1'
1747
1954
  brand_replacement: 'Allwinner'
1748
1955
  model_replacement: '$1'
1749
- - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
1956
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1750
1957
  device_replacement: '$1 $2'
1751
1958
  brand_replacement: 'Allwinner'
1752
1959
  model_replacement: '$1'
@@ -1755,7 +1962,7 @@ device_parsers:
1755
1962
  # Amaway
1756
1963
  # @ref: http://www.amaway.cn/
1757
1964
  #########
1758
- - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
1965
+ - 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)'
1759
1966
  device_replacement: '$1'
1760
1967
  brand_replacement: 'Amaway'
1761
1968
  model_replacement: '$1'
@@ -1764,11 +1971,11 @@ device_parsers:
1764
1971
  # Amoi
1765
1972
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1766
1973
  #########
1767
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1974
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1768
1975
  device_replacement: 'Amoi $1'
1769
1976
  brand_replacement: 'Amoi'
1770
1977
  model_replacement: '$1'
1771
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
1978
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1772
1979
  device_replacement: 'Amoi $1'
1773
1980
  brand_replacement: 'Amoi'
1774
1981
  model_replacement: '$1'
@@ -1777,7 +1984,7 @@ device_parsers:
1777
1984
  # Aoc
1778
1985
  # @ref: http://latin.aoc.com/media_tablet
1779
1986
  #########
1780
- - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
1987
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1781
1988
  device_replacement: '$1'
1782
1989
  brand_replacement: 'Aoc'
1783
1990
  model_replacement: '$1'
@@ -1788,11 +1995,11 @@ device_parsers:
1788
1995
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1789
1996
  # @note: brand owned by luckystar
1790
1997
  #########
1791
- - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
1998
+ - 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)'
1792
1999
  device_replacement: 'Aoson $1'
1793
2000
  brand_replacement: 'Aoson'
1794
2001
  model_replacement: '$1'
1795
- - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
2002
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1796
2003
  regex_flag: 'i'
1797
2004
  device_replacement: 'Aoson $1'
1798
2005
  brand_replacement: 'Aoson'
@@ -1802,7 +2009,7 @@ device_parsers:
1802
2009
  # Apanda
1803
2010
  # @ref: http://www.apanda.com.cn/
1804
2011
  #########
1805
- - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2012
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1806
2013
  device_replacement: 'Apanda $1'
1807
2014
  brand_replacement: 'Apanda'
1808
2015
  model_replacement: '$1'
@@ -1812,23 +2019,23 @@ device_parsers:
1812
2019
  # @ref: http://www.archos.com/de/products/tablets.html
1813
2020
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1814
2021
  #########
1815
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
2022
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1816
2023
  device_replacement: 'Archos $1'
1817
2024
  brand_replacement: 'Archos'
1818
2025
  model_replacement: '$1'
1819
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2026
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1820
2027
  device_replacement: 'Archos $1'
1821
2028
  brand_replacement: 'Archos'
1822
2029
  model_replacement: '$1'
1823
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2030
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1824
2031
  device_replacement: 'Archos $1'
1825
2032
  brand_replacement: 'Archos'
1826
2033
  model_replacement: '$1'
1827
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
2034
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1828
2035
  device_replacement: 'Archos $1'
1829
2036
  brand_replacement: 'Archos'
1830
2037
  model_replacement: '$1'
1831
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
2038
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1832
2039
  device_replacement: 'Archos $1'
1833
2040
  brand_replacement: 'Archos'
1834
2041
  model_replacement: '$1'
@@ -1837,11 +2044,11 @@ device_parsers:
1837
2044
  # A-rival
1838
2045
  # @ref: http://www.a-rival.de/de/
1839
2046
  #########
1840
- - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
2047
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1841
2048
  device_replacement: '$1'
1842
2049
  brand_replacement: 'Arival'
1843
2050
  model_replacement: '$1'
1844
- - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2051
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1845
2052
  device_replacement: '$1 $2'
1846
2053
  brand_replacement: 'Arival'
1847
2054
  model_replacement: '$1 $2'
@@ -1850,11 +2057,11 @@ device_parsers:
1850
2057
  # Arnova
1851
2058
  # @ref: http://arnovatech.com/
1852
2059
  #########
1853
- - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
2060
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1854
2061
  device_replacement: 'Arnova $1'
1855
2062
  brand_replacement: 'Arnova'
1856
2063
  model_replacement: '$1'
1857
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2064
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1858
2065
  device_replacement: 'Arnova $1'
1859
2066
  brand_replacement: 'Arnova'
1860
2067
  model_replacement: '$1'
@@ -1863,7 +2070,7 @@ device_parsers:
1863
2070
  # Assistant
1864
2071
  # @ref: http://www.assistant.ua
1865
2072
  #########
1866
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
2073
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1867
2074
  device_replacement: 'Assistant $1-$2'
1868
2075
  brand_replacement: 'Assistant'
1869
2076
  model_replacement: '$1-$2'
@@ -1872,11 +2079,11 @@ device_parsers:
1872
2079
  # Asus
1873
2080
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1874
2081
  #########
1875
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
2082
+ - 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)'
1876
2083
  device_replacement: 'Asus $1'
1877
2084
  brand_replacement: 'Asus'
1878
2085
  model_replacement: '$1'
1879
- - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
2086
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1880
2087
  device_replacement: 'Asus $1'
1881
2088
  brand_replacement: 'Asus'
1882
2089
  model_replacement: '$1'
@@ -1884,11 +2091,11 @@ device_parsers:
1884
2091
  #########
1885
2092
  # Garmin-Asus
1886
2093
  #########
1887
- - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
2094
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1888
2095
  device_replacement: 'Garmin-Asus $1'
1889
2096
  brand_replacement: 'Garmin-Asus'
1890
2097
  model_replacement: '$1'
1891
- - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
2098
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1892
2099
  device_replacement: 'Garmin $1'
1893
2100
  brand_replacement: 'Garmin-Asus'
1894
2101
  model_replacement: '$1'
@@ -1897,7 +2104,7 @@ device_parsers:
1897
2104
  # Attab
1898
2105
  # @ref: http://www.theattab.com/
1899
2106
  #########
1900
- - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
2107
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1901
2108
  device_replacement: '$1'
1902
2109
  brand_replacement: 'Attab'
1903
2110
  model_replacement: '$1'
@@ -1907,7 +2114,7 @@ device_parsers:
1907
2114
  # @ref: ??
1908
2115
  # @note: Take care with Docomo T-01 Toshiba
1909
2116
  #########
1910
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
2117
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1911
2118
  device_replacement: '$1'
1912
2119
  brand_replacement: 'Audiosonic'
1913
2120
  model_replacement: '$1'
@@ -1916,7 +2123,7 @@ device_parsers:
1916
2123
  # Axioo
1917
2124
  # @ref: http://www.axiooworld.com/ww/index.php
1918
2125
  #########
1919
- - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
2126
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
1920
2127
  regex_flag: 'i'
1921
2128
  device_replacement: 'Axioo $1$2 $3'
1922
2129
  brand_replacement: 'Axioo'
@@ -1926,7 +2133,7 @@ device_parsers:
1926
2133
  # Azend
1927
2134
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
1928
2135
  #########
1929
- - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2136
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
1930
2137
  device_replacement: '$1'
1931
2138
  brand_replacement: 'Azend'
1932
2139
  model_replacement: '$1'
@@ -1935,7 +2142,7 @@ device_parsers:
1935
2142
  # Bak
1936
2143
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
1937
2144
  #########
1938
- - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2145
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
1939
2146
  regex_flag: 'i'
1940
2147
  device_replacement: '$1'
1941
2148
  brand_replacement: 'Bak'
@@ -1946,7 +2153,7 @@ device_parsers:
1946
2153
  # @ref: http://www.bedove.com/product.html
1947
2154
  # @models: HY6501|HY5001|X12|X21|I5
1948
2155
  #########
1949
- - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2156
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
1950
2157
  device_replacement: 'Bedove $1'
1951
2158
  brand_replacement: 'Bedove'
1952
2159
  model_replacement: '$1'
@@ -1955,7 +2162,7 @@ device_parsers:
1955
2162
  # Benss
1956
2163
  # @ref: http://www.benss.net/
1957
2164
  #########
1958
- - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2165
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
1959
2166
  device_replacement: 'Benss $1'
1960
2167
  brand_replacement: 'Benss'
1961
2168
  model_replacement: '$1'
@@ -1965,7 +2172,7 @@ device_parsers:
1965
2172
  # @ref: http://uk.blackberry.com/
1966
2173
  # @note: Android Apps seams to be used here
1967
2174
  #########
1968
- - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
2175
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1969
2176
  device_replacement: '$1 $2'
1970
2177
  brand_replacement: 'Blackberry'
1971
2178
  model_replacement: '$2'
@@ -1974,11 +2181,11 @@ device_parsers:
1974
2181
  # Blackbird
1975
2182
  # @ref: http://iblackbird.co.kr
1976
2183
  #########
1977
- - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
2184
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
1978
2185
  device_replacement: '$1 $2'
1979
2186
  brand_replacement: '$1'
1980
2187
  model_replacement: '$2'
1981
- - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
2188
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
1982
2189
  device_replacement: '$1 $2'
1983
2190
  brand_replacement: '$1'
1984
2191
  model_replacement: '$2'
@@ -1988,7 +2195,7 @@ device_parsers:
1988
2195
  # @ref: http://www.blaupunkt.com
1989
2196
  #########
1990
2197
  # Endeavour
1991
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
2198
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1992
2199
  device_replacement: 'Blaupunkt $1'
1993
2200
  brand_replacement: 'Blaupunkt'
1994
2201
  model_replacement: '$1'
@@ -1997,12 +2204,12 @@ device_parsers:
1997
2204
  # Blu
1998
2205
  # @ref: http://bluproducts.com
1999
2206
  #########
2000
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
2207
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2001
2208
  device_replacement: '$1$2'
2002
2209
  brand_replacement: 'Blu'
2003
2210
  model_replacement: '$2'
2004
2211
  # BMOBILE = operator branded device
2005
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2212
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2006
2213
  device_replacement: '$1'
2007
2214
  brand_replacement: 'Blu'
2008
2215
  model_replacement: '$1'
@@ -2012,7 +2219,7 @@ device_parsers:
2012
2219
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
2013
2220
  #########
2014
2221
  # tablet
2015
- - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
2222
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2016
2223
  device_replacement: '$1'
2017
2224
  brand_replacement: 'Blusens'
2018
2225
  model_replacement: '$1'
@@ -2023,7 +2230,7 @@ device_parsers:
2023
2230
  # @note: Might collide with Maxx as AX is used also there.
2024
2231
  #########
2025
2232
  # smartphone
2026
- - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
2233
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
2027
2234
  device_replacement: '$1'
2028
2235
  brand_replacement: 'Bmobile'
2029
2236
  model_replacement: '$1'
@@ -2032,11 +2239,11 @@ device_parsers:
2032
2239
  # bq
2033
2240
  # @ref: http://bqreaders.com
2034
2241
  #########
2035
- - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
2242
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
2036
2243
  device_replacement: '$1 $2'
2037
2244
  brand_replacement: 'bq'
2038
2245
  model_replacement: '$2'
2039
- - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
2246
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2040
2247
  device_replacement: '$1'
2041
2248
  brand_replacement: 'bq'
2042
2249
  model_replacement: '$1'
@@ -2045,7 +2252,7 @@ device_parsers:
2045
2252
  # Braun Phototechnik
2046
2253
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
2047
2254
  #########
2048
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
2255
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2049
2256
  device_replacement: '$1'
2050
2257
  brand_replacement: 'Braun'
2051
2258
  model_replacement: '$1'
@@ -2054,7 +2261,7 @@ device_parsers:
2054
2261
  # Broncho
2055
2262
  # @ref: http://www.broncho.cn/
2056
2263
  #########
2057
- - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2264
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2058
2265
  device_replacement: '$1 $2'
2059
2266
  brand_replacement: '$1'
2060
2267
  model_replacement: '$2'
@@ -2063,7 +2270,7 @@ device_parsers:
2063
2270
  # Captiva
2064
2271
  # @ref: http://www.captiva-power.de
2065
2272
  #########
2066
- - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2273
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2067
2274
  device_replacement: 'Captiva $1'
2068
2275
  brand_replacement: 'Captiva'
2069
2276
  model_replacement: '$1'
@@ -2072,7 +2279,7 @@ device_parsers:
2072
2279
  # Casio
2073
2280
  # @ref: http://www.casiogzone.com/
2074
2281
  #########
2075
- - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2282
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2076
2283
  device_replacement: '$1'
2077
2284
  brand_replacement: 'Casio'
2078
2285
  model_replacement: '$1'
@@ -2081,15 +2288,15 @@ device_parsers:
2081
2288
  # Cat
2082
2289
  # @ref: http://www.cat-sound.com
2083
2290
  #########
2084
- - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2291
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2085
2292
  device_replacement: 'Cat $1'
2086
2293
  brand_replacement: 'Cat'
2087
2294
  model_replacement: '$1'
2088
- - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2295
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2089
2296
  device_replacement: 'Cat $1'
2090
2297
  brand_replacement: 'Cat'
2091
2298
  model_replacement: '$1'
2092
- - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2299
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2093
2300
  device_replacement: '$1'
2094
2301
  brand_replacement: 'Cat'
2095
2302
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2099,7 +2306,7 @@ device_parsers:
2099
2306
  # @ref: http://www.celkonmobiles.com/?_a=products
2100
2307
  # @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
2101
2308
  #########
2102
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2309
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2103
2310
  device_replacement: '$1'
2104
2311
  brand_replacement: 'Celkon'
2105
2312
  model_replacement: '$1'
@@ -2107,12 +2314,12 @@ device_parsers:
2107
2314
  device_replacement: '$1'
2108
2315
  brand_replacement: 'Celkon'
2109
2316
  model_replacement: '$1'
2110
- - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2317
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2111
2318
  device_replacement: '$1$2'
2112
2319
  brand_replacement: 'Celkon'
2113
2320
  model_replacement: '$1$2'
2114
2321
  # smartphones
2115
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2322
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2116
2323
  device_replacement: '$1'
2117
2324
  brand_replacement: 'Celkon'
2118
2325
  model_replacement: '$1'
@@ -2123,7 +2330,7 @@ device_parsers:
2123
2330
  # @brief: China manufacturer makes tablets for different small brands
2124
2331
  # (eg. http://www.zeepad.net/index.html)
2125
2332
  #########
2126
- - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2333
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2127
2334
  device_replacement: '$1'
2128
2335
  brand_replacement: 'ChangJia'
2129
2336
  model_replacement: '$1'
@@ -2132,15 +2339,15 @@ device_parsers:
2132
2339
  # Cloudfone
2133
2340
  # @ref: http://www.cloudfonemobile.com/
2134
2341
  #########
2135
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2342
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2136
2343
  device_replacement: '$1 $2 $3'
2137
2344
  brand_replacement: 'Cloudfone'
2138
2345
  model_replacement: '$1 $2 $3'
2139
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2346
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2140
2347
  device_replacement: 'Cloudfone $1 $2'
2141
2348
  brand_replacement: 'Cloudfone'
2142
2349
  model_replacement: 'Cloudfone $1 $2'
2143
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2350
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2144
2351
  device_replacement: '$1 $2'
2145
2352
  brand_replacement: 'Cloudfone'
2146
2353
  model_replacement: '$1 $2'
@@ -2149,7 +2356,7 @@ device_parsers:
2149
2356
  # Cmx
2150
2357
  # @ref: http://cmx.at/de/
2151
2358
  #########
2152
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2359
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2153
2360
  regex_flag: 'i'
2154
2361
  device_replacement: '$1'
2155
2362
  brand_replacement: 'Cmx'
@@ -2160,7 +2367,7 @@ device_parsers:
2160
2367
  # @ref: http://cobykyros.com
2161
2368
  # @note: Be careful with MID\d{3} from MpMan or Manta
2162
2369
  #########
2163
- - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
2370
+ - regex: '; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\)])'
2164
2371
  device_replacement: 'CobyKyros $1$2'
2165
2372
  brand_replacement: 'CobyKyros'
2166
2373
  model_replacement: '$1$2'
@@ -2169,7 +2376,7 @@ device_parsers:
2169
2376
  # Coolpad
2170
2377
  # @ref: ??
2171
2378
  #########
2172
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2379
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2173
2380
  device_replacement: '$1$2'
2174
2381
  brand_replacement: 'Coolpad'
2175
2382
  model_replacement: '$1$2'
@@ -2178,7 +2385,7 @@ device_parsers:
2178
2385
  # Cube
2179
2386
  # @ref: http://www.cube-tablet.com/buy-products.html
2180
2387
  #########
2181
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2388
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2182
2389
  regex_flag: 'i'
2183
2390
  device_replacement: '$1$2'
2184
2391
  brand_replacement: 'Cube'
@@ -2188,12 +2395,12 @@ device_parsers:
2188
2395
  # Cubot
2189
2396
  # @ref: http://www.cubotmall.com/
2190
2397
  #########
2191
- - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2398
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2192
2399
  regex_flag: 'i'
2193
2400
  device_replacement: '$1'
2194
2401
  brand_replacement: 'Cubot'
2195
2402
  model_replacement: '$1'
2196
- - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2403
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2197
2404
  regex_flag: 'i'
2198
2405
  device_replacement: '$1'
2199
2406
  brand_replacement: 'Cubot'
@@ -2203,7 +2410,7 @@ device_parsers:
2203
2410
  # Danew
2204
2411
  # @ref: http://www.danew.com/produits-tablette.php
2205
2412
  #########
2206
- - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2413
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2207
2414
  device_replacement: '$1'
2208
2415
  brand_replacement: 'Danew'
2209
2416
  model_replacement: '$1'
@@ -2217,39 +2424,39 @@ device_parsers:
2217
2424
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2218
2425
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2219
2426
  #########
2220
- - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2427
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2221
2428
  device_replacement: 'Dell $1$2'
2222
2429
  brand_replacement: 'Dell'
2223
2430
  model_replacement: '$1$2'
2224
- - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2431
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2225
2432
  device_replacement: 'Dell $1'
2226
2433
  brand_replacement: 'Dell'
2227
2434
  model_replacement: 'Streak'
2228
- - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2435
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2229
2436
  device_replacement: 'Dell $1'
2230
2437
  brand_replacement: 'Dell'
2231
2438
  model_replacement: 'Streak'
2232
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2439
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2233
2440
  device_replacement: 'Dell $1'
2234
2441
  brand_replacement: 'Dell'
2235
2442
  model_replacement: 'Streak Pro'
2236
- - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2443
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2237
2444
  device_replacement: 'Dell $1'
2238
2445
  brand_replacement: 'Dell'
2239
2446
  model_replacement: 'Streak 7'
2240
- - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2447
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2241
2448
  device_replacement: 'Dell $1'
2242
2449
  brand_replacement: 'Dell'
2243
2450
  model_replacement: '$1'
2244
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2451
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2245
2452
  device_replacement: 'Dell $1'
2246
2453
  brand_replacement: 'Dell'
2247
2454
  model_replacement: '$1'
2248
- - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2455
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2249
2456
  device_replacement: 'Dell $1'
2250
2457
  brand_replacement: 'Dell'
2251
2458
  model_replacement: '$1'
2252
- - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2459
+ - regex: '; {0,2}Dell ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2253
2460
  device_replacement: 'Dell $1'
2254
2461
  brand_replacement: 'Dell'
2255
2462
  model_replacement: '$1'
@@ -2258,7 +2465,7 @@ device_parsers:
2258
2465
  # Denver
2259
2466
  # @ref: http://www.denver-electronics.com/tablets1/
2260
2467
  #########
2261
- - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2468
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2262
2469
  device_replacement: '$1'
2263
2470
  brand_replacement: 'Denver'
2264
2471
  model_replacement: '$1'
@@ -2267,7 +2474,7 @@ device_parsers:
2267
2474
  # Dex
2268
2475
  # @ref: http://dex.ua/
2269
2476
  #########
2270
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2477
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2271
2478
  device_replacement: '$1'
2272
2479
  brand_replacement: 'Dex'
2273
2480
  model_replacement: '$1'
@@ -2276,7 +2483,7 @@ device_parsers:
2276
2483
  # DNS AirTab
2277
2484
  # @ref: http://www.dns-shop.ru/
2278
2485
  #########
2279
- - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2486
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2280
2487
  device_replacement: '$1 $2'
2281
2488
  brand_replacement: 'DNS'
2282
2489
  model_replacement: '$1 $2'
@@ -2285,43 +2492,43 @@ device_parsers:
2285
2492
  # Docomo (Operator Branded Device)
2286
2493
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2287
2494
  #########
2288
- - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2495
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2289
2496
  device_replacement: '$1'
2290
2497
  brand_replacement: 'Fujitsu'
2291
2498
  model_replacement: '$1'
2292
- - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2499
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2293
2500
  device_replacement: '$1'
2294
2501
  brand_replacement: 'HTC'
2295
2502
  model_replacement: 'Magic'
2296
- - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2503
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2297
2504
  device_replacement: '$1'
2298
2505
  brand_replacement: 'HTC'
2299
2506
  model_replacement: '$1'
2300
- - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2507
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2301
2508
  device_replacement: '$1'
2302
2509
  brand_replacement: 'LG'
2303
2510
  model_replacement: '$1'
2304
- - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2511
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2305
2512
  device_replacement: '$1'
2306
2513
  brand_replacement: 'Nec'
2307
2514
  model_replacement: '$1'
2308
- - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2515
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2309
2516
  device_replacement: '$1'
2310
2517
  brand_replacement: 'Panasonic'
2311
2518
  model_replacement: '$1'
2312
- - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2519
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2313
2520
  device_replacement: '$1'
2314
2521
  brand_replacement: 'Samsung'
2315
2522
  model_replacement: '$1'
2316
- - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2523
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2317
2524
  device_replacement: '$1'
2318
2525
  brand_replacement: 'Sharp'
2319
2526
  model_replacement: '$1'
2320
- - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2527
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2321
2528
  device_replacement: '$1'
2322
2529
  brand_replacement: 'SonyEricsson'
2323
2530
  model_replacement: '$1'
2324
- - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2531
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2325
2532
  device_replacement: '$1'
2326
2533
  brand_replacement: 'Toshiba'
2327
2534
  model_replacement: '$1'
@@ -2330,7 +2537,7 @@ device_parsers:
2330
2537
  # DOOV
2331
2538
  # @ref: http://www.doov.com.cn/
2332
2539
  #########
2333
- - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2540
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2334
2541
  device_replacement: '$1 $2'
2335
2542
  brand_replacement: 'DOOV'
2336
2543
  model_replacement: '$2'
@@ -2339,7 +2546,7 @@ device_parsers:
2339
2546
  # Enot
2340
2547
  # @ref: http://www.enot.ua/
2341
2548
  #########
2342
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2549
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2343
2550
  device_replacement: '$1 $2'
2344
2551
  brand_replacement: 'Enot'
2345
2552
  model_replacement: '$2'
@@ -2348,11 +2555,11 @@ device_parsers:
2348
2555
  # Evercoss
2349
2556
  # @ref: http://evercoss.com/android/
2350
2557
  #########
2351
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2558
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2352
2559
  device_replacement: 'CROSS $1'
2353
2560
  brand_replacement: 'Evercoss'
2354
2561
  model_replacement: 'Cross $1'
2355
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2562
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2356
2563
  device_replacement: '$1 $2'
2357
2564
  brand_replacement: 'Evercoss'
2358
2565
  model_replacement: 'Cross $2'
@@ -2361,7 +2568,7 @@ device_parsers:
2361
2568
  # Explay
2362
2569
  # @ref: http://explay.ru/
2363
2570
  #########
2364
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2571
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2365
2572
  device_replacement: '$1'
2366
2573
  brand_replacement: 'Explay'
2367
2574
  model_replacement: '$1'
@@ -2370,11 +2577,11 @@ device_parsers:
2370
2577
  # Fly
2371
2578
  # @ref: http://www.fly-phone.com/
2372
2579
  #########
2373
- - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2580
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2374
2581
  device_replacement: '$1'
2375
2582
  brand_replacement: 'Fly'
2376
2583
  model_replacement: '$1'
2377
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2584
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2378
2585
  device_replacement: '$1 $2'
2379
2586
  brand_replacement: 'Fly'
2380
2587
  model_replacement: '$2'
@@ -2383,7 +2590,7 @@ device_parsers:
2383
2590
  # Fujitsu
2384
2591
  # @ref: http://www.fujitsu.com/global/
2385
2592
  #########
2386
- - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2593
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2387
2594
  device_replacement: '$1'
2388
2595
  brand_replacement: 'Fujitsu'
2389
2596
  model_replacement: '$1'
@@ -2392,7 +2599,7 @@ device_parsers:
2392
2599
  # Galapad
2393
2600
  # @ref: http://www.galapad.net/product.html
2394
2601
  #########
2395
- - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2602
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2396
2603
  device_replacement: '$1'
2397
2604
  brand_replacement: 'Galapad'
2398
2605
  model_replacement: '$1'
@@ -2401,7 +2608,7 @@ device_parsers:
2401
2608
  # Geeksphone
2402
2609
  # @ref: http://www.geeksphone.com/
2403
2610
  #########
2404
- - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2611
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2405
2612
  device_replacement: '$1 $2'
2406
2613
  brand_replacement: '$1'
2407
2614
  model_replacement: '$2'
@@ -2410,8 +2617,7 @@ device_parsers:
2410
2617
  # Gfive
2411
2618
  # @ref: http://www.gfivemobile.com/en
2412
2619
  #########
2413
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2414
- - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2620
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2415
2621
  device_replacement: '$1 $2'
2416
2622
  brand_replacement: 'Gfive'
2417
2623
  model_replacement: '$2'
@@ -2420,16 +2626,16 @@ device_parsers:
2420
2626
  # Gionee
2421
2627
  # @ref: http://www.gionee.com/
2422
2628
  #########
2423
- - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2629
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2424
2630
  regex_flag: 'i'
2425
2631
  device_replacement: '$1 $2'
2426
2632
  brand_replacement: 'Gionee'
2427
2633
  model_replacement: '$2'
2428
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2634
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2429
2635
  device_replacement: 'Gionee $1'
2430
2636
  brand_replacement: 'Gionee'
2431
2637
  model_replacement: '$1'
2432
- - regex: '; *(E3) Build/JOP40D'
2638
+ - regex: '; {0,2}(E3) Build/JOP40D'
2433
2639
  device_replacement: 'Gionee $1'
2434
2640
  brand_replacement: 'Gionee'
2435
2641
  model_replacement: '$1'
@@ -2443,11 +2649,11 @@ device_parsers:
2443
2649
  # GoClever
2444
2650
  # @ref: http://www.goclever.com
2445
2651
  #########
2446
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2652
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2447
2653
  device_replacement: 'GoClever $1'
2448
2654
  brand_replacement: 'GoClever'
2449
2655
  model_replacement: '$1'
2450
- - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2656
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2451
2657
  device_replacement: 'GoClever $1'
2452
2658
  brand_replacement: 'GoClever'
2453
2659
  model_replacement: '$1'
@@ -2456,11 +2662,11 @@ device_parsers:
2456
2662
  # Google
2457
2663
  # @ref: http://www.google.de/glass/start/
2458
2664
  #########
2459
- - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2665
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2460
2666
  device_replacement: '$1'
2461
2667
  brand_replacement: 'Google'
2462
2668
  model_replacement: '$1'
2463
- - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2669
+ - regex: '; {0,2}(Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2464
2670
  device_replacement: '$1'
2465
2671
  brand_replacement: 'Google'
2466
2672
  model_replacement: '$1'
@@ -2469,7 +2675,7 @@ device_parsers:
2469
2675
  # Gigabyte
2470
2676
  # @ref: http://gsmart.gigabytecm.com/en/
2471
2677
  #########
2472
- - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2678
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2473
2679
  device_replacement: '$1 $2'
2474
2680
  brand_replacement: 'Gigabyte'
2475
2681
  model_replacement: '$1 $2'
@@ -2478,7 +2684,7 @@ device_parsers:
2478
2684
  # Freescale development boards
2479
2685
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2480
2686
  #########
2481
- - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2687
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2482
2688
  device_replacement: 'Freescale $1'
2483
2689
  brand_replacement: 'Freescale'
2484
2690
  model_replacement: '$1'
@@ -2488,11 +2694,11 @@ device_parsers:
2488
2694
  # @ref: http://www.haier.com/
2489
2695
  # @ref: http://www.haier.com/de/produkte/tablet/
2490
2696
  #########
2491
- - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2697
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2492
2698
  device_replacement: 'Haier $1'
2493
2699
  brand_replacement: 'Haier'
2494
2700
  model_replacement: '$1'
2495
- - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2701
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2496
2702
  device_replacement: 'Haipad $1'
2497
2703
  brand_replacement: 'Haipad'
2498
2704
  model_replacement: '$1'
@@ -2502,7 +2708,7 @@ device_parsers:
2502
2708
  # @ref: http://www.haipad.net/
2503
2709
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2504
2710
  #########
2505
- - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2711
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2506
2712
  device_replacement: 'Haipad $1'
2507
2713
  brand_replacement: 'Haipad'
2508
2714
  model_replacement: '$1'
@@ -2512,7 +2718,7 @@ device_parsers:
2512
2718
  # @ref: http://www.hannspree.eu/
2513
2719
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2514
2720
  #########
2515
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2721
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2516
2722
  device_replacement: 'Hannspree $1'
2517
2723
  brand_replacement: 'Hannspree'
2518
2724
  model_replacement: '$1'
@@ -2521,11 +2727,11 @@ device_parsers:
2521
2727
  # HCLme
2522
2728
  # @ref: http://www.hclmetablet.com/india/
2523
2729
  #########
2524
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2730
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2525
2731
  device_replacement: 'HCLme $1'
2526
2732
  brand_replacement: 'HCLme'
2527
2733
  model_replacement: '$1'
2528
- - regex: '; *([^;\/]+) Build/HCL'
2734
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2529
2735
  device_replacement: 'HCLme $1'
2530
2736
  brand_replacement: 'HCLme'
2531
2737
  model_replacement: '$1'
@@ -2534,7 +2740,7 @@ device_parsers:
2534
2740
  # Hena
2535
2741
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2536
2742
  #########
2537
- - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2743
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2538
2744
  device_replacement: 'Hena $1'
2539
2745
  brand_replacement: 'Hena'
2540
2746
  model_replacement: '$1'
@@ -2543,11 +2749,11 @@ device_parsers:
2543
2749
  # Hisense
2544
2750
  # @ref: http://www.hisense.com/
2545
2751
  #########
2546
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2752
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2547
2753
  device_replacement: 'Hisense $1'
2548
2754
  brand_replacement: 'Hisense'
2549
2755
  model_replacement: '$1'
2550
- - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2756
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2551
2757
  regex_flag: 'i'
2552
2758
  device_replacement: 'Hisense $1'
2553
2759
  brand_replacement: 'Hisense'
@@ -2557,7 +2763,7 @@ device_parsers:
2557
2763
  # hitech
2558
2764
  # @ref: http://www.hitech-mobiles.com/
2559
2765
  #########
2560
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2766
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2561
2767
  device_replacement: 'AMAZE $1$2'
2562
2768
  brand_replacement: 'hitech'
2563
2769
  model_replacement: 'AMAZE $1$2'
@@ -2566,15 +2772,15 @@ device_parsers:
2566
2772
  # HP
2567
2773
  # @ref: http://www.hp.com/
2568
2774
  #########
2569
- - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2775
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2570
2776
  device_replacement: 'HP $1'
2571
2777
  brand_replacement: 'HP'
2572
2778
  model_replacement: '$1'
2573
- - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2779
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2574
2780
  device_replacement: 'HP $1'
2575
2781
  brand_replacement: 'HP'
2576
2782
  model_replacement: '$1'
2577
- - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2783
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2578
2784
  device_replacement: 'HP TouchPad'
2579
2785
  brand_replacement: 'HP'
2580
2786
  model_replacement: 'TouchPad'
@@ -2584,62 +2790,66 @@ device_parsers:
2584
2790
  # @ref: http://www.huaweidevice.com
2585
2791
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2586
2792
  #########
2587
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2793
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2588
2794
  device_replacement: '$1$2'
2589
2795
  brand_replacement: 'Huawei'
2590
2796
  model_replacement: '$2'
2591
- - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)'
2797
+ - regex: '; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\d+[^\);]{1,50})\)'
2592
2798
  device_replacement: '$1'
2593
2799
  brand_replacement: 'Huawei'
2594
2800
  model_replacement: '$2'
2595
- - regex: '; *(S7|M860) Build'
2801
+ - regex: '; {0,2}(S7|M860) Build'
2596
2802
  device_replacement: '$1'
2597
2803
  brand_replacement: 'Huawei'
2598
2804
  model_replacement: '$1'
2599
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2805
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2600
2806
  device_replacement: '$1$2'
2601
2807
  brand_replacement: 'Huawei'
2602
2808
  model_replacement: '$2'
2603
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2809
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2604
2810
  device_replacement: '$1$2'
2605
2811
  brand_replacement: 'Huawei'
2606
2812
  model_replacement: '$2'
2607
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2813
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2608
2814
  device_replacement: '$1$2'
2609
2815
  brand_replacement: 'Huawei'
2610
2816
  model_replacement: '$2'
2611
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2817
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2612
2818
  device_replacement: '$1$2'
2613
2819
  brand_replacement: 'Huawei'
2614
2820
  model_replacement: '$2'
2615
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
2821
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2616
2822
  device_replacement: '$1'
2617
2823
  brand_replacement: 'Huawei'
2618
2824
  model_replacement: '$1'
2619
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2825
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2620
2826
  device_replacement: '$1'
2621
2827
  brand_replacement: 'Huawei'
2622
2828
  model_replacement: '$1'
2623
- - regex: '; *([Uu])([89]\d{3}) Build'
2829
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2624
2830
  device_replacement: '$1$2'
2625
2831
  brand_replacement: 'Huawei'
2626
2832
  model_replacement: 'U$2'
2627
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
2833
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2628
2834
  device_replacement: 'Huawei Ideos$1'
2629
2835
  brand_replacement: 'Huawei'
2630
2836
  model_replacement: 'Ideos$1'
2631
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
2837
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2632
2838
  device_replacement: 'Huawei Ideos$1'
2633
2839
  brand_replacement: 'Huawei'
2634
2840
  model_replacement: 'Ideos$1'
2635
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
2841
+ - regex: '; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]'
2636
2842
  device_replacement: 'Huawei $1'
2637
2843
  brand_replacement: 'Huawei'
2638
2844
  model_replacement: '$1'
2639
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2845
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2640
2846
  device_replacement: 'Huawei $1'
2641
2847
  brand_replacement: 'Huawei'
2642
2848
  model_replacement: '$1'
2849
+ - regex: '; {0,2}([^;]{1,200}) Build/(HONOR|Honor)'
2850
+ device_replacement: 'Huawei Honor $1'
2851
+ brand_replacement: 'Huawei'
2852
+ model_replacement: 'Honor $1'
2643
2853
 
2644
2854
  #########
2645
2855
  # HTC
@@ -2647,7 +2857,7 @@ device_parsers:
2647
2857
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2648
2858
  #########
2649
2859
 
2650
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
2860
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2651
2861
  device_replacement: 'HTC $1'
2652
2862
  brand_replacement: 'HTC'
2653
2863
  model_replacement: '$1'
@@ -2655,59 +2865,59 @@ device_parsers:
2655
2865
  # Android HTC with Version Number matcher
2656
2866
  # ; HTC_0P3Z11/1.12.161.3 Build
2657
2867
  # ;HTC_A3335 V2.38.841.1 Build
2658
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2868
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2659
2869
  device_replacement: 'HTC $1'
2660
2870
  brand_replacement: 'HTC'
2661
2871
  model_replacement: '$1'
2662
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2872
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2663
2873
  device_replacement: 'HTC $1 $2'
2664
2874
  brand_replacement: 'HTC'
2665
2875
  model_replacement: '$1 $2'
2666
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2876
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2667
2877
  device_replacement: 'HTC $1 $2 $3'
2668
2878
  brand_replacement: 'HTC'
2669
2879
  model_replacement: '$1 $2 $3'
2670
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2880
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2671
2881
  device_replacement: 'HTC $1 $2 $3 $4'
2672
2882
  brand_replacement: 'HTC'
2673
2883
  model_replacement: '$1 $2 $3 $4'
2674
2884
 
2675
2885
  # Android HTC without Version Number matcher
2676
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
2886
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2677
2887
  device_replacement: 'HTC $1'
2678
2888
  brand_replacement: 'HTC'
2679
2889
  model_replacement: '$1'
2680
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
2890
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2681
2891
  device_replacement: 'HTC $1 $2'
2682
2892
  brand_replacement: 'HTC'
2683
2893
  model_replacement: '$1 $2'
2684
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
2894
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2685
2895
  device_replacement: 'HTC $1 $2 $3'
2686
2896
  brand_replacement: 'HTC'
2687
2897
  model_replacement: '$1 $2 $3'
2688
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
2898
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2689
2899
  device_replacement: 'HTC $1 $2 $3 $4'
2690
2900
  brand_replacement: 'HTC'
2691
2901
  model_replacement: '$1 $2 $3 $4'
2692
2902
 
2693
2903
  # HTC Streaming Player
2694
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
2904
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2695
2905
  device_replacement: 'HTC $1'
2696
2906
  brand_replacement: 'HTC'
2697
2907
  model_replacement: '$1'
2698
2908
  # general matcher for anything else
2699
- - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2909
+ - regex: '(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2700
2910
  regex_flag: 'i'
2701
2911
  device_replacement: 'HTC $1'
2702
2912
  brand_replacement: 'HTC'
2703
2913
  model_replacement: '$1'
2704
2914
  # Android matchers without HTC
2705
- - 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|[/;\(\)])'
2915
+ - 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|[/;\(\)])'
2706
2916
  regex_flag: 'i'
2707
2917
  device_replacement: 'HTC $1'
2708
2918
  brand_replacement: 'HTC'
2709
2919
  model_replacement: '$1'
2710
- - 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)'
2920
+ - 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)'
2711
2921
  regex_flag: 'i'
2712
2922
  device_replacement: 'HTC $1 $2'
2713
2923
  brand_replacement: 'HTC'
@@ -2717,16 +2927,16 @@ device_parsers:
2717
2927
  # Hyundai
2718
2928
  # @ref: http://www.hyundaitechnologies.com
2719
2929
  #########
2720
- - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
2930
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2721
2931
  device_replacement: 'Hyundai $1'
2722
2932
  brand_replacement: 'Hyundai'
2723
2933
  model_replacement: '$1'
2724
- - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
2934
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2725
2935
  device_replacement: 'Hyundai $1'
2726
2936
  brand_replacement: 'Hyundai'
2727
2937
  model_replacement: '$1'
2728
2938
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2729
- - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2939
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2730
2940
  device_replacement: 'Hyundai $1'
2731
2941
  brand_replacement: 'Hyundai'
2732
2942
  model_replacement: '$1'
@@ -2735,12 +2945,12 @@ device_parsers:
2735
2945
  # iBall
2736
2946
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2737
2947
  #########
2738
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2948
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2739
2949
  regex_flag: 'i'
2740
2950
  device_replacement: '$1 $2'
2741
2951
  brand_replacement: 'iBall'
2742
2952
  model_replacement: '$1 $2'
2743
- - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
2953
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2744
2954
  regex_flag: 'i'
2745
2955
  device_replacement: '$1 $2'
2746
2956
  brand_replacement: 'iBall'
@@ -2750,7 +2960,7 @@ device_parsers:
2750
2960
  # IconBIT
2751
2961
  # @ref: http://www.iconbit.com/catalog/tablets/
2752
2962
  #########
2753
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
2963
+ - regex: '; {0,2}(NT-\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\) AppleWebKit)'
2754
2964
  device_replacement: '$1'
2755
2965
  brand_replacement: 'IconBIT'
2756
2966
  model_replacement: '$1'
@@ -2759,7 +2969,7 @@ device_parsers:
2759
2969
  # IMO
2760
2970
  # @ref: http://www.ponselimo.com/
2761
2971
  #########
2762
- - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2972
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2763
2973
  regex_flag: 'i'
2764
2974
  device_replacement: '$1 $2'
2765
2975
  brand_replacement: 'IMO'
@@ -2769,12 +2979,12 @@ device_parsers:
2769
2979
  # i-mobile
2770
2980
  # @ref: http://www.i-mobilephone.com/
2771
2981
  #########
2772
- - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
2982
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2773
2983
  regex_flag: 'i'
2774
2984
  device_replacement: 'i-mobile $1'
2775
2985
  brand_replacement: 'imobile'
2776
2986
  model_replacement: '$1'
2777
- - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
2987
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2778
2988
  regex_flag: 'i'
2779
2989
  device_replacement: 'i-mobile $1'
2780
2990
  brand_replacement: 'imobile'
@@ -2784,7 +2994,7 @@ device_parsers:
2784
2994
  # Impression
2785
2995
  # @ref: http://impression.ua/planshetnye-kompyutery
2786
2996
  #########
2787
- - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
2997
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2788
2998
  device_replacement: '$1 $2'
2789
2999
  brand_replacement: 'Impression'
2790
3000
  model_replacement: '$1 $2'
@@ -2793,7 +3003,7 @@ device_parsers:
2793
3003
  # Infinix
2794
3004
  # @ref: http://www.infinixmobility.com/index.html
2795
3005
  #########
2796
- - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3006
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2797
3007
  device_replacement: '$1 $2'
2798
3008
  brand_replacement: 'Infinix'
2799
3009
  model_replacement: '$2'
@@ -2802,7 +3012,7 @@ device_parsers:
2802
3012
  # Informer
2803
3013
  # @ref: ??
2804
3014
  #########
2805
- - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
3015
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2806
3016
  device_replacement: '$1 $2'
2807
3017
  brand_replacement: 'Informer'
2808
3018
  model_replacement: '$2'
@@ -2812,7 +3022,7 @@ device_parsers:
2812
3022
  # @ref: http://www.intenso.de
2813
3023
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2814
3024
  #########
2815
- - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
3025
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2816
3026
  device_replacement: 'Intenso $1'
2817
3027
  brand_replacement: 'Intenso'
2818
3028
  model_replacement: '$1 $2'
@@ -2823,21 +3033,21 @@ device_parsers:
2823
3033
  # @note: Zync also offers a "Cloud Z5" device
2824
3034
  #########
2825
3035
  # smartphones
2826
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
3036
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2827
3037
  device_replacement: '$1$2$3'
2828
3038
  brand_replacement: 'Intex'
2829
3039
  model_replacement: '$1 $3'
2830
3040
  # matches "INTEX CLOUD X1"
2831
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3041
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2832
3042
  device_replacement: '$1 $2'
2833
3043
  brand_replacement: 'Intex'
2834
3044
  model_replacement: '$1 $2'
2835
3045
  # tablets
2836
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3046
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2837
3047
  device_replacement: '$1 $2 $3'
2838
3048
  brand_replacement: 'Intex'
2839
3049
  model_replacement: 'iBuddy $2 $3'
2840
- - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
3050
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2841
3051
  device_replacement: '$1 $2'
2842
3052
  brand_replacement: 'Intex'
2843
3053
  model_replacement: 'iBuddy $2'
@@ -2846,7 +3056,7 @@ device_parsers:
2846
3056
  # iOCEAN
2847
3057
  # @ref: http://www.iocean.cc/
2848
3058
  #########
2849
- - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
3059
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2850
3060
  regex_flag: 'i'
2851
3061
  device_replacement: '$1 $2'
2852
3062
  brand_replacement: 'iOCEAN'
@@ -2856,7 +3066,7 @@ device_parsers:
2856
3066
  # i.onik
2857
3067
  # @ref: http://www.i-onik.de/
2858
3068
  #########
2859
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
3069
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2860
3070
  device_replacement: 'ionik $1'
2861
3071
  brand_replacement: 'ionik'
2862
3072
  model_replacement: '$1'
@@ -2865,21 +3075,30 @@ device_parsers:
2865
3075
  # IRU.ru
2866
3076
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2867
3077
  #########
2868
- - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
3078
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2869
3079
  device_replacement: '$1'
2870
3080
  brand_replacement: 'Iru'
2871
3081
  model_replacement: '$1'
2872
3082
 
3083
+ #########
3084
+ # Itel Mobile
3085
+ # @ref: https://www.itel-mobile.com/global/products/
3086
+ #########
3087
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
3088
+ device_replacement: 'Itel $1'
3089
+ brand_replacement: 'Itel'
3090
+ model_replacement: '$1'
3091
+
2873
3092
  #########
2874
3093
  # Ivio
2875
3094
  # @ref: http://www.ivio.com/mobile.php
2876
3095
  # @models: DG80,DG20,DE38,DE88,MD70
2877
3096
  #########
2878
- - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
3097
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2879
3098
  device_replacement: '$1'
2880
3099
  brand_replacement: 'Ivio'
2881
3100
  model_replacement: '$1'
2882
- - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3101
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2883
3102
  device_replacement: '$1'
2884
3103
  brand_replacement: 'Ivio'
2885
3104
  model_replacement: '$1'
@@ -2888,7 +3107,7 @@ device_parsers:
2888
3107
  # Jaytech
2889
3108
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2890
3109
  #########
2891
- - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
3110
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2892
3111
  device_replacement: '$1'
2893
3112
  brand_replacement: 'Jaytech'
2894
3113
  model_replacement: '$1'
@@ -2897,7 +3116,7 @@ device_parsers:
2897
3116
  # Jiayu
2898
3117
  # @ref: http://www.ejiayu.com/en/Product.html
2899
3118
  #########
2900
- - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
3119
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2901
3120
  device_replacement: '$1'
2902
3121
  brand_replacement: 'Jiayu'
2903
3122
  model_replacement: '$1'
@@ -2906,7 +3125,7 @@ device_parsers:
2906
3125
  # JXD
2907
3126
  # @ref: http://www.jxd.hk/
2908
3127
  #########
2909
- - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3128
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2910
3129
  device_replacement: '$1 $2'
2911
3130
  brand_replacement: 'JXD'
2912
3131
  model_replacement: '$2'
@@ -2915,16 +3134,16 @@ device_parsers:
2915
3134
  # Karbonn
2916
3135
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
2917
3136
  #########
2918
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3137
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
2919
3138
  regex_flag: 'i'
2920
3139
  device_replacement: '$1'
2921
3140
  brand_replacement: 'Karbonn'
2922
3141
  model_replacement: '$1'
2923
- - regex: '; *([^;]+) Build/Karbonn'
3142
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
2924
3143
  device_replacement: '$1'
2925
3144
  brand_replacement: 'Karbonn'
2926
3145
  model_replacement: '$1'
2927
- - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3146
+ - regex: '; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
2928
3147
  device_replacement: '$1'
2929
3148
  brand_replacement: 'Karbonn'
2930
3149
  model_replacement: '$1'
@@ -2933,84 +3152,84 @@ device_parsers:
2933
3152
  # KDDI (Operator Branded Device)
2934
3153
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2935
3154
  #########
2936
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3155
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
2937
3156
  device_replacement: '$1'
2938
3157
  brand_replacement: 'Sharp'
2939
3158
  model_replacement: '$1'
2940
- - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
3159
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
2941
3160
  device_replacement: '$1'
2942
3161
  brand_replacement: 'Regza'
2943
3162
  model_replacement: '$1'
2944
- - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3163
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
2945
3164
  device_replacement: '$1'
2946
3165
  brand_replacement: 'Pantech'
2947
3166
  model_replacement: '$1'
2948
- - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
3167
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
2949
3168
  device_replacement: '$1'
2950
3169
  brand_replacement: 'SonyEricsson'
2951
3170
  model_replacement: 'Xperia Acro'
2952
- - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
3171
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
2953
3172
  device_replacement: '$1'
2954
3173
  brand_replacement: 'Casio'
2955
3174
  model_replacement: 'GzOne $1'
2956
- - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
3175
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
2957
3176
  device_replacement: '$1'
2958
3177
  brand_replacement: 'LG'
2959
3178
  model_replacement: 'Optimus X'
2960
- - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
3179
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
2961
3180
  device_replacement: '$1'
2962
3181
  brand_replacement: 'Medias'
2963
3182
  model_replacement: '$1'
2964
- - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
3183
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
2965
3184
  device_replacement: '$1'
2966
3185
  brand_replacement: 'Pantech'
2967
3186
  model_replacement: 'MIRACH'
2968
- - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
3187
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
2969
3188
  device_replacement: '$1'
2970
3189
  brand_replacement: 'Fujitsu'
2971
3190
  model_replacement: 'Arrows ES'
2972
3191
  # @ref: https://ja.wikipedia.org/wiki/IS12M
2973
- - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
3192
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
2974
3193
  device_replacement: '$1'
2975
3194
  brand_replacement: 'Motorola'
2976
3195
  model_replacement: 'XT909'
2977
- - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
3196
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
2978
3197
  device_replacement: '$1'
2979
3198
  brand_replacement: 'SonyEricsson'
2980
3199
  model_replacement: 'Xperia Acro HD'
2981
- - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
3200
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
2982
3201
  device_replacement: '$1'
2983
3202
  brand_replacement: 'Fujitsu'
2984
3203
  model_replacement: 'Arrowz Z'
2985
- - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
3204
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
2986
3205
  device_replacement: '$1'
2987
3206
  brand_replacement: 'HTC'
2988
3207
  model_replacement: 'EVO'
2989
- - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
3208
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
2990
3209
  device_replacement: '$1'
2991
3210
  brand_replacement: 'Kyocera'
2992
3211
  model_replacement: 'DIGNO'
2993
- - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
3212
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
2994
3213
  device_replacement: '$1'
2995
3214
  brand_replacement: 'Motorola'
2996
3215
  model_replacement: 'Photon'
2997
- - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
3216
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
2998
3217
  device_replacement: '$1'
2999
3218
  brand_replacement: 'Samsung'
3000
3219
  model_replacement: 'GALAXY S II WiMAX'
3001
- - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
3220
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
3002
3221
  device_replacement: '$1'
3003
3222
  brand_replacement: 'HTC'
3004
3223
  model_replacement: 'EVO 3D'
3005
- - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
3224
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
3006
3225
  device_replacement: '$1'
3007
3226
  brand_replacement: 'HTC'
3008
3227
  model_replacement: 'J'
3009
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3228
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3010
3229
  device_replacement: '$1'
3011
3230
  brand_replacement: 'KDDI'
3012
3231
  model_replacement: '$1'
3013
- - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
3232
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3014
3233
  device_replacement: '$1'
3015
3234
  brand_replacement: 'KDDI'
3016
3235
  model_replacement: '$1'
@@ -3019,7 +3238,7 @@ device_parsers:
3019
3238
  # Kingcom
3020
3239
  # @ref: http://www.e-kingcom.com
3021
3240
  #########
3022
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3241
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3023
3242
  device_replacement: '$1 $2'
3024
3243
  brand_replacement: 'Kingcom'
3025
3244
  model_replacement: '$1 $2'
@@ -3029,7 +3248,7 @@ device_parsers:
3029
3248
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
3030
3249
  # @ref: http://www.kobo.com/devices#tablets
3031
3250
  #########
3032
- - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3251
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3033
3252
  regex_flag: 'i'
3034
3253
  device_replacement: '$1'
3035
3254
  brand_replacement: 'Kobo'
@@ -3043,7 +3262,7 @@ device_parsers:
3043
3262
  # K-Touch
3044
3263
  # @ref: ??
3045
3264
  #########
3046
- - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3265
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3047
3266
  regex_flag: 'i'
3048
3267
  device_replacement: '$1 $2'
3049
3268
  brand_replacement: 'Ktouch'
@@ -3053,7 +3272,7 @@ device_parsers:
3053
3272
  # KT Tech
3054
3273
  # @ref: http://www.kttech.co.kr
3055
3274
  #########
3056
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3275
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3057
3276
  regex_flag: 'i'
3058
3277
  device_replacement: '$1'
3059
3278
  brand_replacement: 'KTtech'
@@ -3063,7 +3282,7 @@ device_parsers:
3063
3282
  # Kyocera
3064
3283
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3065
3284
  #########
3066
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3285
+ - regex: '; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3067
3286
  device_replacement: '$1'
3068
3287
  brand_replacement: 'Kyocera'
3069
3288
  model_replacement: '$1'
@@ -3072,12 +3291,12 @@ device_parsers:
3072
3291
  # Lava
3073
3292
  # @ref: http://www.lavamobiles.com/
3074
3293
  #########
3075
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3294
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3076
3295
  regex_flag: 'i'
3077
3296
  device_replacement: 'Iris $1'
3078
3297
  brand_replacement: 'Lava'
3079
3298
  model_replacement: 'Iris $1'
3080
- - regex: '; *LAVA[ _]([^;/]+) Build'
3299
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3081
3300
  device_replacement: '$1'
3082
3301
  brand_replacement: 'Lava'
3083
3302
  model_replacement: '$1'
@@ -3086,7 +3305,7 @@ device_parsers:
3086
3305
  # Lemon
3087
3306
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3088
3307
  #########
3089
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3308
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3090
3309
  device_replacement: 'Lemon $1$2'
3091
3310
  brand_replacement: 'Lemon'
3092
3311
  model_replacement: '$1$2'
@@ -3095,11 +3314,11 @@ device_parsers:
3095
3314
  # Lenco
3096
3315
  # @ref: http://www.lenco.com/c/tablets/
3097
3316
  #########
3098
- - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3317
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3099
3318
  device_replacement: 'Lenco $1'
3100
3319
  brand_replacement: 'Lenco'
3101
3320
  model_replacement: '$1'
3102
- - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3321
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3103
3322
  device_replacement: 'Lenco $1'
3104
3323
  brand_replacement: 'Lenco'
3105
3324
  model_replacement: '$1'
@@ -3108,23 +3327,23 @@ device_parsers:
3108
3327
  # Lenovo
3109
3328
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3110
3329
  #########
3111
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3330
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3112
3331
  device_replacement: '$1'
3113
3332
  brand_replacement: 'Lenovo'
3114
3333
  model_replacement: '$1'
3115
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3334
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3116
3335
  device_replacement: 'Lenovo $1 $2'
3117
3336
  brand_replacement: 'Lenovo'
3118
3337
  model_replacement: '$1 $2'
3119
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3338
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3120
3339
  device_replacement: 'Lenovo $1 $2'
3121
3340
  brand_replacement: 'Lenovo'
3122
3341
  model_replacement: '$1 $2'
3123
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3342
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3124
3343
  device_replacement: 'Lenovo $1 $2'
3125
3344
  brand_replacement: 'Lenovo'
3126
3345
  model_replacement: '$1 $2'
3127
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3346
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3128
3347
  device_replacement: 'Lenovo $1'
3129
3348
  brand_replacement: 'Lenovo'
3130
3349
  model_replacement: '$1'
@@ -3132,11 +3351,11 @@ device_parsers:
3132
3351
  device_replacement: 'Lenovo $1 $2 $3'
3133
3352
  brand_replacement: 'Lenovo'
3134
3353
  model_replacement: '$1 $2 $3'
3135
- - regex: '; *(?:Ideapad |)K1 Build/'
3354
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3136
3355
  device_replacement: 'Lenovo Ideapad K1'
3137
3356
  brand_replacement: 'Lenovo'
3138
3357
  model_replacement: 'Ideapad K1'
3139
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3358
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3140
3359
  device_replacement: '$1'
3141
3360
  brand_replacement: 'Lenovo'
3142
3361
  model_replacement: '$1'
@@ -3149,7 +3368,7 @@ device_parsers:
3149
3368
  # Lexibook
3150
3369
  # @ref: http://www.lexibook.com/fr
3151
3370
  #########
3152
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3371
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3153
3372
  device_replacement: '$1$2'
3154
3373
  brand_replacement: 'Lexibook'
3155
3374
  model_replacement: '$1$2'
@@ -3158,23 +3377,23 @@ device_parsers:
3158
3377
  # LG
3159
3378
  # @ref: http://www.lg.com/uk/mobile
3160
3379
  #########
3161
- - 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|;)'
3380
+ - 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|;)'
3162
3381
  device_replacement: '$1'
3163
3382
  brand_replacement: 'LG'
3164
3383
  model_replacement: '$1'
3165
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
3384
+ - regex: '[;:] {0,2}(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) {0,2}(?:Build|[;\)])'
3166
3385
  device_replacement: '$1'
3167
3386
  brand_replacement: 'LG'
3168
3387
  model_replacement: '$1'
3169
- - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3388
+ - regex: '; {0,2}(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3170
3389
  device_replacement: '$1$2'
3171
3390
  brand_replacement: 'LG'
3172
3391
  model_replacement: '$2'
3173
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3392
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3174
3393
  device_replacement: '$1$2'
3175
3394
  brand_replacement: 'LG'
3176
3395
  model_replacement: '$2'
3177
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3396
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3178
3397
  device_replacement: '$1 $2'
3179
3398
  brand_replacement: 'LG'
3180
3399
  model_replacement: '$2'
@@ -3187,11 +3406,11 @@ device_parsers:
3187
3406
  # Malata
3188
3407
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3189
3408
  #########
3190
- - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3409
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3191
3410
  device_replacement: '$1'
3192
3411
  brand_replacement: 'Malata'
3193
3412
  model_replacement: '$1'
3194
- - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3413
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3195
3414
  device_replacement: '$1'
3196
3415
  brand_replacement: 'Malata'
3197
3416
  model_replacement: '$1'
@@ -3200,7 +3419,7 @@ device_parsers:
3200
3419
  # Manta
3201
3420
  # @ref: http://www.manta.com.pl/en
3202
3421
  #########
3203
- - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3422
+ - 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)'
3204
3423
  device_replacement: '$1'
3205
3424
  brand_replacement: 'Manta'
3206
3425
  model_replacement: '$1'
@@ -3209,7 +3428,7 @@ device_parsers:
3209
3428
  # Match
3210
3429
  # @ref: http://www.match.net.cn/products.asp
3211
3430
  #########
3212
- - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
3431
+ - 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)'
3213
3432
  device_replacement: '$1'
3214
3433
  brand_replacement: 'Match'
3215
3434
  model_replacement: '$1'
@@ -3223,7 +3442,7 @@ device_parsers:
3223
3442
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3224
3443
  # @note: Need more User-Agents!!!
3225
3444
  #########
3226
- - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3445
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3227
3446
  device_replacement: 'Maxx $1'
3228
3447
  brand_replacement: 'Maxx'
3229
3448
  model_replacement: '$1'
@@ -3232,11 +3451,11 @@ device_parsers:
3232
3451
  # Mediacom
3233
3452
  # @ref: http://www.mediacomeurope.it/
3234
3453
  #########
3235
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3454
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3236
3455
  device_replacement: 'Mediacom $1'
3237
3456
  brand_replacement: 'Mediacom'
3238
3457
  model_replacement: '$1'
3239
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3458
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3240
3459
  device_replacement: 'Mediacom $1'
3241
3460
  brand_replacement: 'Mediacom'
3242
3461
  model_replacement: '$1'
@@ -3245,12 +3464,12 @@ device_parsers:
3245
3464
  # Medion
3246
3465
  # @ref: http://www.medion.com/en/
3247
3466
  #########
3248
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3467
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3249
3468
  regex_flag: 'i'
3250
3469
  device_replacement: 'Medion Lifetab $1'
3251
3470
  brand_replacement: 'Medion'
3252
3471
  model_replacement: 'Lifetab $1'
3253
- - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3472
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3254
3473
  device_replacement: 'Medion $1'
3255
3474
  brand_replacement: 'Medion'
3256
3475
  model_replacement: '$1'
@@ -3259,11 +3478,11 @@ device_parsers:
3259
3478
  # Meizu
3260
3479
  # @ref: http://www.meizu.com
3261
3480
  #########
3262
- - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3481
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3263
3482
  device_replacement: 'Meizu $1'
3264
3483
  brand_replacement: 'Meizu'
3265
3484
  model_replacement: '$1'
3266
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3485
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3267
3486
  device_replacement: 'Meizu $1'
3268
3487
  brand_replacement: 'Meizu'
3269
3488
  model_replacement: '$1'
@@ -3272,28 +3491,28 @@ device_parsers:
3272
3491
  # Micromax
3273
3492
  # @ref: http://www.micromaxinfo.com
3274
3493
  #########
3275
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3494
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3276
3495
  regex_flag: 'i'
3277
3496
  device_replacement: 'Micromax $1$2'
3278
3497
  brand_replacement: 'Micromax'
3279
3498
  model_replacement: '$1$2'
3280
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3499
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3281
3500
  regex_flag: 'i'
3282
3501
  device_replacement: 'Micromax $1'
3283
3502
  brand_replacement: 'Micromax'
3284
3503
  model_replacement: '$1'
3285
3504
  # be carefull here with Acer e.g. A500
3286
- - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3505
+ - regex: '; {0,2}(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3287
3506
  regex_flag: 'i'
3288
3507
  device_replacement: 'Micromax $1'
3289
3508
  brand_replacement: 'Micromax'
3290
3509
  model_replacement: '$1'
3291
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3510
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3292
3511
  regex_flag: 'i'
3293
3512
  device_replacement: 'Micromax $1'
3294
3513
  brand_replacement: 'Micromax'
3295
3514
  model_replacement: '$1'
3296
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3515
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3297
3516
  regex_flag: 'i'
3298
3517
  device_replacement: 'Micromax $1'
3299
3518
  brand_replacement: 'Micromax'
@@ -3303,7 +3522,7 @@ device_parsers:
3303
3522
  # Mito
3304
3523
  # @ref: http://new.mitomobile.com/
3305
3524
  #########
3306
- - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3525
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3307
3526
  regex_flag: 'i'
3308
3527
  device_replacement: '$1 $2'
3309
3528
  brand_replacement: 'Mito'
@@ -3313,7 +3532,7 @@ device_parsers:
3313
3532
  # Mobistel
3314
3533
  # @ref: http://www.mobistel.com/
3315
3534
  #########
3316
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3535
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3317
3536
  regex_flag: 'i'
3318
3537
  device_replacement: '$1 $2'
3319
3538
  brand_replacement: 'Mobistel'
@@ -3323,12 +3542,12 @@ device_parsers:
3323
3542
  # Modecom
3324
3543
  # @ref: http://www.modecom.eu/tablets/portal/
3325
3544
  #########
3326
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3545
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3327
3546
  regex_flag: 'i'
3328
3547
  device_replacement: '$1$2 $3'
3329
3548
  brand_replacement: 'Modecom'
3330
3549
  model_replacement: '$2 $3'
3331
- - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3550
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3332
3551
  regex_flag: 'i'
3333
3552
  device_replacement: '$1 $2'
3334
3553
  brand_replacement: 'Modecom'
@@ -3338,32 +3557,32 @@ device_parsers:
3338
3557
  # Motorola
3339
3558
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3340
3559
  #########
3341
- - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3560
+ - regex: '; {0,2}(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3342
3561
  device_replacement: 'Motorola $1'
3343
3562
  brand_replacement: 'Motorola'
3344
3563
  model_replacement: '$1'
3345
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3564
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3346
3565
  device_replacement: 'Motorola $1$2'
3347
3566
  brand_replacement: 'Motorola'
3348
3567
  model_replacement: '$2'
3349
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3568
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3350
3569
  regex_flag: 'i'
3351
3570
  device_replacement: 'Motorola $1'
3352
3571
  brand_replacement: 'Motorola'
3353
3572
  model_replacement: 'DROID X'
3354
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3573
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3355
3574
  device_replacement: 'Motorola $1'
3356
3575
  brand_replacement: 'Motorola'
3357
3576
  model_replacement: '$1'
3358
- - 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'
3577
+ - 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'
3359
3578
  device_replacement: '$1'
3360
3579
  brand_replacement: 'Motorola'
3361
3580
  model_replacement: '$1'
3362
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3581
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3363
3582
  device_replacement: '$1$2'
3364
3583
  brand_replacement: 'Motorola'
3365
3584
  model_replacement: '$2'
3366
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3585
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3367
3586
  device_replacement: '$1$2'
3368
3587
  brand_replacement: 'Motorola'
3369
3588
  model_replacement: '$2'
@@ -3372,7 +3591,7 @@ device_parsers:
3372
3591
  # MpMan
3373
3592
  # @ref: http://www.mpmaneurope.com
3374
3593
  #########
3375
- - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
3594
+ - 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)'
3376
3595
  device_replacement: '$1'
3377
3596
  brand_replacement: 'Mpman'
3378
3597
  model_replacement: '$1'
@@ -3381,7 +3600,7 @@ device_parsers:
3381
3600
  # MSI
3382
3601
  # @ref: http://www.msi.com/product/windpad/
3383
3602
  #########
3384
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3603
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3385
3604
  regex_flag: 'i'
3386
3605
  device_replacement: '$1'
3387
3606
  brand_replacement: 'Msi'
@@ -3391,7 +3610,7 @@ device_parsers:
3391
3610
  # Multilaser
3392
3611
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3393
3612
  #########
3394
- - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3613
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3395
3614
  device_replacement: '$1'
3396
3615
  brand_replacement: 'Multilaser'
3397
3616
  model_replacement: '$1'
@@ -3400,15 +3619,15 @@ device_parsers:
3400
3619
  # MyPhone
3401
3620
  # @ref: http://myphone.com.ph/
3402
3621
  #########
3403
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3622
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3404
3623
  device_replacement: '$1$2 $3'
3405
3624
  brand_replacement: 'MyPhone'
3406
3625
  model_replacement: '$1$2 $3'
3407
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3626
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3408
3627
  device_replacement: '$1$2 $3'
3409
3628
  brand_replacement: 'MyPhone'
3410
3629
  model_replacement: '$3'
3411
- - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3630
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3412
3631
  regex_flag: 'i'
3413
3632
  device_replacement: '$1 $2'
3414
3633
  brand_replacement: 'MyPhone'
@@ -3418,7 +3637,7 @@ device_parsers:
3418
3637
  # Mytab
3419
3638
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3420
3639
  #########
3421
- - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3640
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3422
3641
  device_replacement: '$1'
3423
3642
  brand_replacement: 'Mytab'
3424
3643
  model_replacement: '$1'
@@ -3427,7 +3646,7 @@ device_parsers:
3427
3646
  # Nabi
3428
3647
  # @ref: https://www.nabitablet.com
3429
3648
  #########
3430
- - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3649
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3431
3650
  device_replacement: '$1$2'
3432
3651
  brand_replacement: 'Nabi'
3433
3652
  model_replacement: '$2'
@@ -3436,15 +3655,15 @@ device_parsers:
3436
3655
  # Nec Medias
3437
3656
  # @ref: http://www.n-keitai.com/
3438
3657
  #########
3439
- - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3658
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3440
3659
  device_replacement: '$1'
3441
3660
  brand_replacement: 'Nec'
3442
3661
  model_replacement: '$1'
3443
- - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3662
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3444
3663
  device_replacement: '$1$2'
3445
3664
  brand_replacement: 'Nec'
3446
3665
  model_replacement: '$2'
3447
- - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3666
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3448
3667
  device_replacement: '$1'
3449
3668
  brand_replacement: 'Nec'
3450
3669
  model_replacement: 'Lifetouch Note'
@@ -3453,7 +3672,7 @@ device_parsers:
3453
3672
  # Nextbook
3454
3673
  # @ref: http://nextbookusa.com
3455
3674
  #########
3456
- - regex: '; *(NXM\d+[A-Za-z0-9_]*|Next\d[A-Za-z0-9_ \-]*|NEXT\d[A-Za-z0-9_ \-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3675
+ - 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|[\);])'
3457
3676
  device_replacement: '$1'
3458
3677
  brand_replacement: 'Nextbook'
3459
3678
  model_replacement: '$1'
@@ -3462,22 +3681,26 @@ device_parsers:
3462
3681
  # Nokia
3463
3682
  # @ref: http://www.nokia.com
3464
3683
  #########
3465
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3684
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3466
3685
  regex_flag: 'i'
3467
3686
  device_replacement: '$1$2$3'
3468
3687
  brand_replacement: 'Nokia'
3469
3688
  model_replacement: '$3'
3689
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3690
+ device_replacement: 'Nokia $1'
3691
+ brand_replacement: 'Nokia'
3692
+ model_replacement: '$1'
3470
3693
 
3471
3694
  #########
3472
3695
  # Nook
3473
3696
  # @ref:
3474
3697
  # TODO nook browser/1.0
3475
3698
  #########
3476
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3699
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3477
3700
  device_replacement: '$1$2'
3478
3701
  brand_replacement: 'Nook'
3479
3702
  model_replacement: '$2'
3480
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3703
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3481
3704
  device_replacement: '$1$2'
3482
3705
  brand_replacement: 'Nook'
3483
3706
  model_replacement: '$2'
@@ -3490,7 +3713,7 @@ device_parsers:
3490
3713
  # Olivetti
3491
3714
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3492
3715
  #########
3493
- - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3716
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3494
3717
  device_replacement: 'Olivetti $1'
3495
3718
  brand_replacement: 'Olivetti'
3496
3719
  model_replacement: '$1'
@@ -3501,7 +3724,7 @@ device_parsers:
3501
3724
  # @note: MID tablets might get matched by CobyKyros first
3502
3725
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3503
3726
  #########
3504
- - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3727
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3505
3728
  device_replacement: 'Omega $1'
3506
3729
  brand_replacement: 'Omega'
3507
3730
  model_replacement: '$1'
@@ -3514,7 +3737,7 @@ device_parsers:
3514
3737
  # OpenPeak
3515
3738
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3516
3739
  #########
3517
- - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3740
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3518
3741
  device_replacement: 'Openpeak $1'
3519
3742
  brand_replacement: 'Openpeak'
3520
3743
  model_replacement: '$1'
@@ -3523,33 +3746,40 @@ device_parsers:
3523
3746
  # Oppo
3524
3747
  # @ref: http://en.oppo.com/products/
3525
3748
  #########
3526
- - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2})(?: Build|\) AppleWebKit)'
3749
+ - 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)'
3527
3750
  device_replacement: 'Oppo $1'
3528
3751
  brand_replacement: 'Oppo'
3529
3752
  model_replacement: '$1'
3530
- - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3753
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3531
3754
  device_replacement: 'Oppo $1'
3532
3755
  brand_replacement: 'Oppo'
3533
3756
  model_replacement: '$1'
3757
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3758
+ device_replacement: 'Oppo $1'
3759
+ brand_replacement: 'Oppo'
3760
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3761
+ device_replacement: 'Oppo F1s'
3762
+ brand_replacement: 'Oppo'
3763
+ model_replacement: '$1'
3534
3764
 
3535
3765
  #########
3536
3766
  # Odys
3537
3767
  # @ref: http://odys.de
3538
3768
  #########
3539
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3769
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3540
3770
  device_replacement: 'Odys $1'
3541
3771
  brand_replacement: 'Odys'
3542
3772
  model_replacement: '$1'
3543
- - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3773
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3544
3774
  device_replacement: 'Odys $1 $2'
3545
3775
  brand_replacement: 'Odys'
3546
3776
  model_replacement: '$1 $2'
3547
- - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3777
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3548
3778
  device_replacement: 'Odys $1 $2 $3'
3549
3779
  brand_replacement: 'Odys'
3550
3780
  model_replacement: '$1 $2 $3'
3551
3781
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3552
- - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
3782
+ - 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)'
3553
3783
  device_replacement: 'Odys $1'
3554
3784
  brand_replacement: 'Odys'
3555
3785
  model_replacement: '$1'
@@ -3571,7 +3801,7 @@ device_parsers:
3571
3801
  # Orion
3572
3802
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3573
3803
  #########
3574
- - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
3804
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3575
3805
  device_replacement: 'Orion $1'
3576
3806
  brand_replacement: 'Orion'
3577
3807
  model_replacement: '$1'
@@ -3580,7 +3810,7 @@ device_parsers:
3580
3810
  # PackardBell
3581
3811
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3582
3812
  #########
3583
- - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
3813
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3584
3814
  device_replacement: 'PackardBell $1'
3585
3815
  brand_replacement: 'PackardBell'
3586
3816
  model_replacement: '$1'
@@ -3591,17 +3821,17 @@ device_parsers:
3591
3821
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3592
3822
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3593
3823
  #########
3594
- - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
3824
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3595
3825
  device_replacement: '$1 $2'
3596
3826
  brand_replacement: '$1'
3597
3827
  model_replacement: '$2'
3598
3828
  # Toughpad
3599
- - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3829
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3600
3830
  device_replacement: 'Panasonic $1'
3601
3831
  brand_replacement: 'Panasonic'
3602
3832
  model_replacement: '$1'
3603
3833
  # Eluga Power
3604
- - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
3834
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3605
3835
  device_replacement: 'Panasonic $1'
3606
3836
  brand_replacement: 'Panasonic'
3607
3837
  model_replacement: '$1'
@@ -3612,15 +3842,15 @@ device_parsers:
3612
3842
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3613
3843
  # @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
3614
3844
  #########
3615
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
3845
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3616
3846
  device_replacement: 'Pantech $1$2'
3617
3847
  brand_replacement: 'Pantech'
3618
3848
  model_replacement: '$1$2'
3619
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3849
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3620
3850
  device_replacement: '$1'
3621
3851
  brand_replacement: 'Pantech'
3622
3852
  model_replacement: '$1'
3623
- - regex: '; *Pantech([^;/]+).* Build/'
3853
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3624
3854
  device_replacement: 'Pantech $1'
3625
3855
  brand_replacement: 'Pantech'
3626
3856
  model_replacement: '$1'
@@ -3629,7 +3859,7 @@ device_parsers:
3629
3859
  # Papayre
3630
3860
  # @ref: http://grammata.es/
3631
3861
  #########
3632
- - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3862
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3633
3863
  regex_flag: 'i'
3634
3864
  device_replacement: '$1 $2'
3635
3865
  brand_replacement: 'Papyre'
@@ -3639,7 +3869,7 @@ device_parsers:
3639
3869
  # Pearl
3640
3870
  # @ref: http://www.pearl.de/c-1540.shtml
3641
3871
  #########
3642
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
3872
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3643
3873
  device_replacement: 'Pearl $1'
3644
3874
  brand_replacement: 'Pearl'
3645
3875
  model_replacement: '$1'
@@ -3652,11 +3882,11 @@ device_parsers:
3652
3882
  device_replacement: 'Phicomm $1'
3653
3883
  brand_replacement: 'Phicomm'
3654
3884
  model_replacement: '$1'
3655
- - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
3885
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3656
3886
  device_replacement: 'Phicomm $1'
3657
3887
  brand_replacement: 'Phicomm'
3658
3888
  model_replacement: '$1'
3659
- - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
3889
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3660
3890
  device_replacement: 'Phicomm $1'
3661
3891
  brand_replacement: 'Phicomm'
3662
3892
  model_replacement: '$1'
@@ -3668,11 +3898,11 @@ device_parsers:
3668
3898
  # @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
3669
3899
  #########
3670
3900
  # @note: this a best guess according to available philips models. Need more User-Agents
3671
- - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
3901
+ - 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)'
3672
3902
  device_replacement: '$1'
3673
3903
  brand_replacement: 'Philips'
3674
3904
  model_replacement: '$1'
3675
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3905
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3676
3906
  device_replacement: 'Philips $1'
3677
3907
  brand_replacement: 'Philips'
3678
3908
  model_replacement: '$1'
@@ -3681,7 +3911,7 @@ device_parsers:
3681
3911
  # Pipo
3682
3912
  # @ref: http://www.pipo.cn/En/
3683
3913
  #########
3684
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3914
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3685
3915
  device_replacement: 'Pipo $1$2'
3686
3916
  brand_replacement: 'Pipo'
3687
3917
  model_replacement: '$1$2'
@@ -3690,7 +3920,7 @@ device_parsers:
3690
3920
  # Ployer
3691
3921
  # @ref: http://en.ployer.cn/
3692
3922
  #########
3693
- - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
3923
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3694
3924
  device_replacement: '$1'
3695
3925
  brand_replacement: 'Ployer'
3696
3926
  model_replacement: '$1'
@@ -3699,11 +3929,11 @@ device_parsers:
3699
3929
  # Polaroid/ Acho
3700
3930
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3701
3931
  #########
3702
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
3932
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3703
3933
  device_replacement: '$1'
3704
3934
  brand_replacement: 'Polaroid'
3705
3935
  model_replacement: '$1'
3706
- - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3936
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3707
3937
  device_replacement: '$1'
3708
3938
  brand_replacement: 'Polaroid'
3709
3939
  model_replacement: '$1'
@@ -3713,7 +3943,7 @@ device_parsers:
3713
3943
  # @ref: http://pompmobileshop.com/
3714
3944
  #########
3715
3945
  #~ TODO
3716
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
3946
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3717
3947
  device_replacement: '$1 $2'
3718
3948
  brand_replacement: 'Pomp'
3719
3949
  model_replacement: '$2'
@@ -3722,11 +3952,11 @@ device_parsers:
3722
3952
  # Positivo
3723
3953
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3724
3954
  #########
3725
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3955
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3726
3956
  device_replacement: '$1'
3727
3957
  brand_replacement: 'Positivo'
3728
3958
  model_replacement: '$1'
3729
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
3959
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3730
3960
  device_replacement: '$1'
3731
3961
  brand_replacement: 'Positivo'
3732
3962
  model_replacement: '$1'
@@ -3736,15 +3966,15 @@ device_parsers:
3736
3966
  # @ref: http://www.pointofview-online.com/default2.php
3737
3967
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3738
3968
  #########
3739
- - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
3969
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3740
3970
  device_replacement: '$1'
3741
3971
  brand_replacement: 'POV'
3742
3972
  model_replacement: '$1'
3743
- - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3973
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3744
3974
  device_replacement: 'POV $1'
3745
3975
  brand_replacement: 'POV'
3746
3976
  model_replacement: '$1'
3747
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3977
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3748
3978
  device_replacement: 'POV $1'
3749
3979
  brand_replacement: 'POV'
3750
3980
  model_replacement: '$1'
@@ -3754,7 +3984,7 @@ device_parsers:
3754
3984
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3755
3985
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3756
3986
  #########
3757
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
3987
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3758
3988
  device_replacement: 'Prestigio $1'
3759
3989
  brand_replacement: 'Prestigio'
3760
3990
  model_replacement: '$1'
@@ -3763,7 +3993,7 @@ device_parsers:
3763
3993
  # Proscan
3764
3994
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3765
3995
  #########
3766
- - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
3996
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3767
3997
  device_replacement: '$1'
3768
3998
  brand_replacement: 'Proscan'
3769
3999
  model_replacement: '$1'
@@ -3772,15 +4002,15 @@ device_parsers:
3772
4002
  # QMobile
3773
4003
  # @ref: http://www.qmobile.com.pk/
3774
4004
  #########
3775
- - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
4005
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3776
4006
  device_replacement: '$1 $2'
3777
4007
  brand_replacement: 'Qmobile'
3778
4008
  model_replacement: '$1 $2'
3779
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
4009
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3780
4010
  device_replacement: 'Qmobile $2 $3'
3781
4011
  brand_replacement: 'Qmobile'
3782
4012
  model_replacement: '$2 $3'
3783
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
4013
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3784
4014
  device_replacement: 'Qmobile $2'
3785
4015
  brand_replacement: 'Qmobile'
3786
4016
  model_replacement: '$2'
@@ -3789,11 +4019,11 @@ device_parsers:
3789
4019
  # Qmobilevn
3790
4020
  # @ref: http://qmobile.vn/san-pham.html
3791
4021
  #########
3792
- - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4022
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3793
4023
  device_replacement: '$1 $2'
3794
4024
  brand_replacement: 'Qmobilevn'
3795
4025
  model_replacement: '$2'
3796
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
4026
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3797
4027
  device_replacement: '$1 $2'
3798
4028
  brand_replacement: 'Qmobilevn'
3799
4029
  model_replacement: '$2'
@@ -3802,7 +4032,7 @@ device_parsers:
3802
4032
  # Quanta
3803
4033
  # @ref: ?
3804
4034
  #########
3805
- - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
4035
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3806
4036
  device_replacement: '$1'
3807
4037
  brand_replacement: 'Quanta'
3808
4038
  model_replacement: '$1'
@@ -3825,7 +4055,7 @@ device_parsers:
3825
4055
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3826
4056
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3827
4057
  #########
3828
- - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
4058
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3829
4059
  device_replacement: '$1'
3830
4060
  brand_replacement: 'Rockchip'
3831
4061
  model_replacement: '$1'
@@ -3838,55 +4068,55 @@ device_parsers:
3838
4068
  # Samsung Android Devices
3839
4069
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3840
4070
  #########
3841
- - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
4071
+ - 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/'
3842
4072
  device_replacement: 'Samsung $1$2'
3843
4073
  brand_replacement: 'Samsung'
3844
4074
  model_replacement: '$2'
3845
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4075
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3846
4076
  device_replacement: 'Samsung $1$2'
3847
4077
  brand_replacement: 'Samsung'
3848
4078
  model_replacement: '$2'
3849
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4079
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3850
4080
  device_replacement: 'Samsung $2'
3851
4081
  brand_replacement: 'Samsung'
3852
4082
  model_replacement: '$2'
3853
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
4083
+ - regex: '; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
3854
4084
  device_replacement: 'Samsung $1'
3855
4085
  brand_replacement: 'Samsung'
3856
4086
  model_replacement: '$1'
3857
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4087
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3858
4088
  device_replacement: 'Samsung $2'
3859
4089
  brand_replacement: 'Samsung'
3860
4090
  model_replacement: '$2'
3861
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4091
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3862
4092
  device_replacement: 'Samsung $1$2$3'
3863
4093
  brand_replacement: 'Samsung'
3864
4094
  model_replacement: '$2'
3865
- - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
4095
+ - regex: '(?:; {0,2}|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
3866
4096
  device_replacement: 'Samsung $1'
3867
4097
  brand_replacement: 'Samsung'
3868
4098
  model_replacement: '$1'
3869
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4099
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3870
4100
  device_replacement: 'Samsung $1$2'
3871
4101
  brand_replacement: 'Samsung'
3872
4102
  model_replacement: '$2'
3873
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4103
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3874
4104
  device_replacement: 'Samsung $1'
3875
4105
  brand_replacement: 'Samsung'
3876
4106
  model_replacement: '$1'
3877
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4107
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3878
4108
  device_replacement: 'Samsung $1'
3879
4109
  brand_replacement: 'Samsung'
3880
4110
  model_replacement: '$1'
3881
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4111
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3882
4112
  device_replacement: 'Samsung $1'
3883
4113
  brand_replacement: 'Samsung'
3884
4114
  model_replacement: '$1'
3885
- - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
4115
+ - regex: '; {0,2}(Behold ?(?:2|II)|YP\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build'
3886
4116
  device_replacement: 'Samsung $1'
3887
4117
  brand_replacement: 'Samsung'
3888
4118
  model_replacement: '$1'
3889
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
4119
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
3890
4120
  device_replacement: 'Samsung $1'
3891
4121
  brand_replacement: 'Samsung'
3892
4122
  model_replacement: '$1'
@@ -3896,11 +4126,11 @@ device_parsers:
3896
4126
  # @ref: http://www.sharp-phone.com/en/index.html
3897
4127
  # @ref: http://www.android.com/devices/?country=all&m=sharp
3898
4128
  #########
3899
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
4129
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3900
4130
  device_replacement: '$1'
3901
4131
  brand_replacement: 'Sharp'
3902
4132
  model_replacement: '$1'
3903
- - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
4133
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3904
4134
  device_replacement: '$1$2'
3905
4135
  brand_replacement: 'Sharp'
3906
4136
  model_replacement: '$2'
@@ -3909,15 +4139,15 @@ device_parsers:
3909
4139
  # Simvalley
3910
4140
  # @ref: http://www.simvalley-mobile.de/
3911
4141
  #########
3912
- - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4142
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
3913
4143
  device_replacement: '$1'
3914
4144
  brand_replacement: 'Simvalley'
3915
4145
  model_replacement: '$1'
3916
- - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4146
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
3917
4147
  device_replacement: '$1'
3918
4148
  brand_replacement: 'Simvalley'
3919
4149
  model_replacement: '$1'
3920
- - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4150
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
3921
4151
  device_replacement: '$1'
3922
4152
  brand_replacement: 'Simvalley'
3923
4153
  model_replacement: '$1'
@@ -3927,7 +4157,7 @@ device_parsers:
3927
4157
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
3928
4158
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
3929
4159
  #########
3930
- - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
4160
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
3931
4161
  device_replacement: '$1'
3932
4162
  brand_replacement: 'SKtelesys'
3933
4163
  model_replacement: '$1'
@@ -3936,11 +4166,11 @@ device_parsers:
3936
4166
  # Skytex
3937
4167
  # @ref: http://skytex.com/android
3938
4168
  #########
3939
- - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
4169
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3940
4170
  device_replacement: '$1'
3941
4171
  brand_replacement: 'Skytex'
3942
4172
  model_replacement: '$1'
3943
- - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
4173
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3944
4174
  device_replacement: '$1'
3945
4175
  brand_replacement: 'Skytex'
3946
4176
  model_replacement: '$1'
@@ -3950,7 +4180,7 @@ device_parsers:
3950
4180
  # @ref: http://en.smartdevices.com.cn/Products/
3951
4181
  # @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
3952
4182
  #########
3953
- - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4183
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3954
4184
  device_replacement: '$1 $2'
3955
4185
  brand_replacement: '$1'
3956
4186
  model_replacement: '$2'
@@ -3960,7 +4190,7 @@ device_parsers:
3960
4190
  # @ref: http://www.smartbitt.com/
3961
4191
  # @missing: SBT Useragents
3962
4192
  #########
3963
- - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
4193
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3964
4194
  device_replacement: '$1'
3965
4195
  brand_replacement: 'Smartbitt'
3966
4196
  model_replacement: '$1'
@@ -3969,15 +4199,15 @@ device_parsers:
3969
4199
  # Softbank (Operator Branded Devices)
3970
4200
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3971
4201
  #########
3972
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4202
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
3973
4203
  device_replacement: '$1'
3974
4204
  brand_replacement: 'Sharp'
3975
4205
  model_replacement: '$1'
3976
- - regex: '; *(003P|101P|101P11C|102P) Build'
4206
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
3977
4207
  device_replacement: '$1'
3978
4208
  brand_replacement: 'Panasonic'
3979
4209
  model_replacement: '$1'
3980
- - regex: '; *(00\dZ) Build/'
4210
+ - regex: '; {0,2}(00\dZ) Build/'
3981
4211
  device_replacement: '$1'
3982
4212
  brand_replacement: 'ZTE'
3983
4213
  model_replacement: '$1'
@@ -3985,11 +4215,11 @@ device_parsers:
3985
4215
  device_replacement: '$1'
3986
4216
  brand_replacement: 'HTC'
3987
4217
  model_replacement: '$1'
3988
- - regex: '; *(001HT|X06HT) Build'
4218
+ - regex: '; {0,2}(001HT|X06HT) Build'
3989
4219
  device_replacement: '$1'
3990
4220
  brand_replacement: 'HTC'
3991
4221
  model_replacement: '$1'
3992
- - regex: '; *(201M) Build'
4222
+ - regex: '; {0,2}(201M) Build'
3993
4223
  device_replacement: '$1'
3994
4224
  brand_replacement: 'Motorola'
3995
4225
  model_replacement: 'XT902'
@@ -3999,11 +4229,11 @@ device_parsers:
3999
4229
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
4000
4230
  # @note: Must come before SonyEricsson
4001
4231
  #########
4002
- - regex: '; *(ST\d{4}.*)Build/ST'
4232
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
4003
4233
  device_replacement: 'Trekstor $1'
4004
4234
  brand_replacement: 'Trekstor'
4005
4235
  model_replacement: '$1'
4006
- - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
4236
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
4007
4237
  device_replacement: 'Trekstor $1'
4008
4238
  brand_replacement: 'Trekstor'
4009
4239
  model_replacement: '$1'
@@ -4015,16 +4245,16 @@ device_parsers:
4015
4245
  # @TODO: type!
4016
4246
  #########
4017
4247
  # android matchers
4018
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4248
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
4019
4249
  device_replacement: '$1$2'
4020
4250
  brand_replacement: 'SonyEricsson'
4021
4251
  model_replacement: '$2'
4022
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4252
+ - regex: '; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4023
4253
  device_replacement: '$1'
4024
4254
  brand_replacement: 'SonyEricsson'
4025
4255
  model_replacement: '$1'
4026
4256
  # TODO X\d+ is wrong
4027
- - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
4257
+ - regex: '; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]{0,50}) Build'
4028
4258
  regex_flag: 'i'
4029
4259
  device_replacement: '$1'
4030
4260
  brand_replacement: 'SonyEricsson'
@@ -4036,31 +4266,31 @@ device_parsers:
4036
4266
  # @ref: http://www.sonymobile.com/global-en/products/phones/
4037
4267
  # @ref: http://www.sony.jp/tablet/
4038
4268
  #########
4039
- - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
4269
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4040
4270
  device_replacement: 'Sony $1'
4041
4271
  brand_replacement: 'Sony'
4042
4272
  model_replacement: '$1'
4043
- - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
4273
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4044
4274
  device_replacement: 'Sony $1'
4045
4275
  brand_replacement: 'Sony'
4046
4276
  model_replacement: '$1'
4047
- - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4277
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4048
4278
  device_replacement: '$1 $2'
4049
4279
  brand_replacement: '$1'
4050
4280
  model_replacement: '$2'
4051
- - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
4281
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4052
4282
  device_replacement: '$1'
4053
4283
  brand_replacement: 'Sony'
4054
4284
  model_replacement: '$1'
4055
- - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
4285
+ - 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)'
4056
4286
  device_replacement: '$1'
4057
4287
  brand_replacement: 'Sony'
4058
4288
  model_replacement: '$1'
4059
- - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4289
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4060
4290
  device_replacement: '$1'
4061
4291
  brand_replacement: 'Sony'
4062
4292
  model_replacement: '$1'
4063
- - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4293
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4064
4294
  device_replacement: '$1'
4065
4295
  brand_replacement: 'Sony'
4066
4296
  model_replacement: '$1'
@@ -4083,7 +4313,7 @@ device_parsers:
4083
4313
  # Spice
4084
4314
  # @ref: http://www.spicemobilephones.co.in/
4085
4315
  #########
4086
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4316
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4087
4317
  device_replacement: '$1$2$3$4'
4088
4318
  brand_replacement: 'Spice'
4089
4319
  model_replacement: 'Mi$4'
@@ -4092,7 +4322,7 @@ device_parsers:
4092
4322
  # Sprint (Operator Branded Devices)
4093
4323
  # @ref:
4094
4324
  #########
4095
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4325
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4096
4326
  device_replacement: '$1$2'
4097
4327
  brand_replacement: 'Sprint'
4098
4328
  model_replacement: '$2'
@@ -4105,7 +4335,7 @@ device_parsers:
4105
4335
  # Tagi
4106
4336
  # @ref: ??
4107
4337
  #########
4108
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4338
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4109
4339
  device_replacement: '$1$2$3'
4110
4340
  brand_replacement: 'Tagi'
4111
4341
  model_replacement: '$2$3'
@@ -4114,7 +4344,7 @@ device_parsers:
4114
4344
  # Tecmobile
4115
4345
  # @ref: http://www.tecmobile.com/
4116
4346
  #########
4117
- - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4347
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4118
4348
  device_replacement: 'Tecmobile $1'
4119
4349
  brand_replacement: 'Tecmobile'
4120
4350
  model_replacement: '$1'
@@ -4123,7 +4353,7 @@ device_parsers:
4123
4353
  # Tecno
4124
4354
  # @ref: www.tecno-mobile.com/‎
4125
4355
  #########
4126
- - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4356
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4127
4357
  device_replacement: '$1$2'
4128
4358
  brand_replacement: 'Tecno'
4129
4359
  model_replacement: '$2'
@@ -4132,7 +4362,7 @@ device_parsers:
4132
4362
  # Telechips, Techvision evaluation boards
4133
4363
  # @ref:
4134
4364
  #########
4135
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4365
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4136
4366
  regex_flag: 'i'
4137
4367
  device_replacement: '$1 $2'
4138
4368
  brand_replacement: '$1'
@@ -4143,7 +4373,7 @@ device_parsers:
4143
4373
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4144
4374
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4145
4375
  #########
4146
- - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4376
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4147
4377
  device_replacement: '$1'
4148
4378
  brand_replacement: 'Telstra'
4149
4379
  model_replacement: '$1'
@@ -4152,7 +4382,7 @@ device_parsers:
4152
4382
  # Terra
4153
4383
  # @ref: http://www.wortmann.de/
4154
4384
  #########
4155
- - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4385
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4156
4386
  device_replacement: 'Terra $1$2'
4157
4387
  brand_replacement: 'Terra'
4158
4388
  model_replacement: '$1$2'
@@ -4161,7 +4391,7 @@ device_parsers:
4161
4391
  # Texet
4162
4392
  # @ref: http://www.texet.ru/tablet/
4163
4393
  #########
4164
- - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4394
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4165
4395
  device_replacement: '$1'
4166
4396
  brand_replacement: 'Texet'
4167
4397
  model_replacement: '$1'
@@ -4170,11 +4400,11 @@ device_parsers:
4170
4400
  # Thalia
4171
4401
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4172
4402
  #########
4173
- - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4403
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4174
4404
  device_replacement: '$1'
4175
4405
  brand_replacement: 'Thalia'
4176
4406
  model_replacement: '$1'
4177
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4407
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4178
4408
  device_replacement: '$1'
4179
4409
  brand_replacement: 'Thalia'
4180
4410
  model_replacement: 'Tolino Shine'
@@ -4184,11 +4414,11 @@ device_parsers:
4184
4414
  # @ref: http://en.thl.com.cn/Mobile
4185
4415
  # @ref: http://thlmobilestore.com
4186
4416
  #########
4187
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4417
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4188
4418
  device_replacement: '$1 $2'
4189
4419
  brand_replacement: 'Thl'
4190
4420
  model_replacement: '$2'
4191
- - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4421
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4192
4422
  device_replacement: '$1'
4193
4423
  brand_replacement: 'Thl'
4194
4424
  model_replacement: '$1'
@@ -4197,28 +4427,28 @@ device_parsers:
4197
4427
  # T-Mobile (Operator Branded Devices)
4198
4428
  #########
4199
4429
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4200
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4430
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4201
4431
  device_replacement: '$1'
4202
4432
  brand_replacement: 'HTC'
4203
4433
  model_replacement: 'Hero'
4204
4434
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4205
- - regex: '; *(T-Mobile[ _]G2) Build'
4435
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4206
4436
  device_replacement: '$1'
4207
4437
  brand_replacement: 'HTC'
4208
4438
  model_replacement: 'Desire Z'
4209
- - regex: '; *(T-Mobile myTouch Q) Build'
4439
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4210
4440
  device_replacement: '$1'
4211
4441
  brand_replacement: 'Huawei'
4212
4442
  model_replacement: 'U8730'
4213
- - regex: '; *(T-Mobile myTouch) Build'
4443
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4214
4444
  device_replacement: '$1'
4215
4445
  brand_replacement: 'Huawei'
4216
4446
  model_replacement: 'U8680'
4217
- - regex: '; *(T-Mobile_Espresso) Build'
4447
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4218
4448
  device_replacement: '$1'
4219
4449
  brand_replacement: 'HTC'
4220
4450
  model_replacement: 'Espresso'
4221
- - regex: '; *(T-Mobile G1) Build'
4451
+ - regex: '; {0,2}(T-Mobile G1) Build'
4222
4452
  device_replacement: '$1'
4223
4453
  brand_replacement: 'HTC'
4224
4454
  model_replacement: 'Dream'
@@ -4226,11 +4456,11 @@ device_parsers:
4226
4456
  device_replacement: '$1$2 $3 $4'
4227
4457
  brand_replacement: 'HTC'
4228
4458
  model_replacement: '$2 $3 $4'
4229
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4459
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4230
4460
  device_replacement: '$1 $2 $3'
4231
4461
  brand_replacement: 'Tmobile'
4232
4462
  model_replacement: '$2 $3'
4233
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4463
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4234
4464
  device_replacement: '$1 $2'
4235
4465
  brand_replacement: 'Tmobile'
4236
4466
  model_replacement: '$2'
@@ -4248,7 +4478,7 @@ device_parsers:
4248
4478
  # Tooky
4249
4479
  # @ref: http://www.tookymobile.com/
4250
4480
  #########
4251
- - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4481
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4252
4482
  regex_flag: 'i'
4253
4483
  device_replacement: '$1 $2'
4254
4484
  brand_replacement: 'Tooky'
@@ -4263,11 +4493,11 @@ device_parsers:
4263
4493
  device_replacement: '$1'
4264
4494
  brand_replacement: 'Toshiba'
4265
4495
  model_replacement: 'Folio 100'
4266
- - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4496
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4267
4497
  device_replacement: '$1'
4268
4498
  brand_replacement: 'Toshiba'
4269
4499
  model_replacement: 'Folio 100'
4270
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4500
+ - 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)'
4271
4501
  device_replacement: 'Toshiba $1'
4272
4502
  brand_replacement: 'Toshiba'
4273
4503
  model_replacement: '$1'
@@ -4276,12 +4506,12 @@ device_parsers:
4276
4506
  # Touchmate
4277
4507
  # @ref: http://touchmatepc.com/new/
4278
4508
  #########
4279
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4509
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4280
4510
  device_replacement: '$1'
4281
4511
  brand_replacement: 'Touchmate'
4282
4512
  model_replacement: '$1'
4283
4513
  # @todo: needs verification user-agents missing
4284
- - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4514
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4285
4515
  device_replacement: '$1'
4286
4516
  brand_replacement: 'Touchmate'
4287
4517
  model_replacement: '$1'
@@ -4290,11 +4520,11 @@ device_parsers:
4290
4520
  # Treq
4291
4521
  # @ref: http://www.treq.co.id/product
4292
4522
  #########
4293
- - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4523
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4294
4524
  device_replacement: '$1'
4295
4525
  brand_replacement: 'Treq'
4296
4526
  model_replacement: '$1'
4297
- - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4527
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4298
4528
  regex_flag: 'i'
4299
4529
  device_replacement: '$1$2'
4300
4530
  brand_replacement: 'Treq'
@@ -4306,21 +4536,40 @@ device_parsers:
4306
4536
  # @models: A936|A603|X-5|X-3
4307
4537
  #########
4308
4538
  # @todo: guessed markers
4309
- - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4539
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4310
4540
  device_replacement: '$1'
4311
4541
  brand_replacement: 'Umeox'
4312
4542
  model_replacement: '$1'
4313
4543
  # @todo: guessed markers
4314
- - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4544
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4315
4545
  device_replacement: '$1'
4316
4546
  brand_replacement: 'Umeox'
4317
4547
  model_replacement: '$1'
4318
4548
 
4549
+ #########
4550
+ # Vernee
4551
+ # @ref: http://vernee.cc/
4552
+ # @models: Thor - Thor E
4553
+ #########
4554
+ - regex: '; thor Build/'
4555
+ device_replacement: 'Thor'
4556
+ brand_replacement: 'Vernee'
4557
+ model_replacement: 'Thor'
4558
+ # Regex to modidy for Thor Plus (don't find example UA)
4559
+ - regex: '; Thor (E)? Build/'
4560
+ device_replacement: 'Thor $1'
4561
+ brand_replacement: 'Vernee'
4562
+ model_replacement: 'Thor'
4563
+ - regex: '; Apollo Lite Build/'
4564
+ device_replacement: 'Apollo Lite'
4565
+ brand_replacement: 'Vernee'
4566
+ model_replacement: 'Apollo'
4567
+
4319
4568
  #########
4320
4569
  # Versus
4321
4570
  # @ref: http://versusuk.com/support.html
4322
4571
  #########
4323
- - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4572
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4324
4573
  regex_flag: 'i'
4325
4574
  device_replacement: 'Versus $1'
4326
4575
  brand_replacement: 'Versus'
@@ -4330,7 +4579,7 @@ device_parsers:
4330
4579
  # Vertu
4331
4580
  # @ref: http://www.vertu.com/
4332
4581
  #########
4333
- - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4582
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4334
4583
  device_replacement: '$1 $2'
4335
4584
  brand_replacement: 'Vertu'
4336
4585
  model_replacement: '$2'
@@ -4339,7 +4588,7 @@ device_parsers:
4339
4588
  # Videocon
4340
4589
  # @ref: http://www.videoconmobiles.com
4341
4590
  #########
4342
- - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4591
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4343
4592
  device_replacement: '$1 $2'
4344
4593
  brand_replacement: 'Videocon'
4345
4594
  model_replacement: '$2'
@@ -4352,15 +4601,15 @@ device_parsers:
4352
4601
  # Viewsonic
4353
4602
  # @ref: http://viewsonic.com
4354
4603
  #########
4355
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4604
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4356
4605
  device_replacement: '$1'
4357
4606
  brand_replacement: 'Viewsonic'
4358
4607
  model_replacement: '$1'
4359
- - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4608
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4360
4609
  device_replacement: '$1$2'
4361
4610
  brand_replacement: 'Viewsonic'
4362
4611
  model_replacement: '$2'
4363
- - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4612
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4364
4613
  device_replacement: '$1'
4365
4614
  brand_replacement: 'Viewsonic'
4366
4615
  model_replacement: '$1'
@@ -4369,7 +4618,7 @@ device_parsers:
4369
4618
  # vivo
4370
4619
  # @ref: http://vivo.cn/
4371
4620
  #########
4372
- - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4621
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4373
4622
  device_replacement: '$1 $2'
4374
4623
  brand_replacement: 'vivo'
4375
4624
  model_replacement: '$2'
@@ -4378,7 +4627,7 @@ device_parsers:
4378
4627
  # Vodafone (Operator Branded Devices)
4379
4628
  # @ref: ??
4380
4629
  #########
4381
- - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4630
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4382
4631
  device_replacement: '$1 $2'
4383
4632
  brand_replacement: '$1'
4384
4633
  model_replacement: '$2'
@@ -4387,7 +4636,7 @@ device_parsers:
4387
4636
  # Walton
4388
4637
  # @ref: http://www.waltonbd.com/
4389
4638
  #########
4390
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4639
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4391
4640
  regex_flag: 'i'
4392
4641
  device_replacement: 'Walton $1'
4393
4642
  brand_replacement: 'Walton'
@@ -4397,7 +4646,7 @@ device_parsers:
4397
4646
  # Wiko
4398
4647
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4399
4648
  #########
4400
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
4649
+ - regex: '; {0,2}(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4401
4650
  regex_flag: 'i'
4402
4651
  device_replacement: 'Wiko $1'
4403
4652
  brand_replacement: 'Wiko'
@@ -4407,7 +4656,7 @@ device_parsers:
4407
4656
  # WellcoM
4408
4657
  # @ref: ??
4409
4658
  #########
4410
- - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4659
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4411
4660
  device_replacement: 'Wellcom $1'
4412
4661
  brand_replacement: 'Wellcom'
4413
4662
  model_replacement: '$1'
@@ -4425,7 +4674,7 @@ device_parsers:
4425
4674
  # Wolfgang
4426
4675
  # @ref: http://wolfgangmobile.com/
4427
4676
  #########
4428
- - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4677
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4429
4678
  device_replacement: 'Wolfgang $1'
4430
4679
  brand_replacement: 'Wolfgang'
4431
4680
  model_replacement: '$1'
@@ -4434,7 +4683,7 @@ device_parsers:
4434
4683
  # Woxter
4435
4684
  # @ref: http://www.woxter.es/es-es/categories/index
4436
4685
  #########
4437
- - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4686
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4438
4687
  device_replacement: 'Woxter $1'
4439
4688
  brand_replacement: 'Woxter'
4440
4689
  model_replacement: '$1'
@@ -4443,7 +4692,7 @@ device_parsers:
4443
4692
  # Yarvik Zania
4444
4693
  # @ref: http://yarvik.com
4445
4694
  #########
4446
- - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
4695
+ - 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)'
4447
4696
  device_replacement: 'Yarvik $1'
4448
4697
  brand_replacement: 'Yarvik'
4449
4698
  model_replacement: '$1'
@@ -4457,7 +4706,7 @@ device_parsers:
4457
4706
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4458
4707
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4459
4708
  #########
4460
- - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4709
+ - regex: '; {0,2}([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4461
4710
  device_replacement: 'Yifang $1$2$3'
4462
4711
  brand_replacement: 'Yifang'
4463
4712
  model_replacement: '$2'
@@ -4466,19 +4715,19 @@ device_parsers:
4466
4715
  # XiaoMi
4467
4716
  # @ref: http://www.xiaomi.com/event/buyphone
4468
4717
  #########
4469
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4718
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4470
4719
  device_replacement: 'XiaoMi $1'
4471
4720
  brand_replacement: 'XiaoMi'
4472
4721
  model_replacement: '$1'
4473
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4722
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4474
4723
  device_replacement: 'XiaoMi $1'
4475
4724
  brand_replacement: 'XiaoMi'
4476
4725
  model_replacement: '$1'
4477
- - regex: '; *(MIX) (Build|MIUI)/'
4726
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4478
4727
  device_replacement: 'XiaoMi $1'
4479
4728
  brand_replacement: 'XiaoMi'
4480
4729
  model_replacement: '$1'
4481
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4730
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4482
4731
  device_replacement: 'XiaoMi $1'
4483
4732
  brand_replacement: 'XiaoMi'
4484
4733
  model_replacement: '$1'
@@ -4487,17 +4736,17 @@ device_parsers:
4487
4736
  # Xolo
4488
4737
  # @ref: http://www.xolo.in/
4489
4738
  #########
4490
- - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4739
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4491
4740
  regex_flag: 'i'
4492
4741
  device_replacement: 'Xolo $1'
4493
4742
  brand_replacement: 'Xolo'
4494
4743
  model_replacement: '$1'
4495
- - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4744
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4496
4745
  regex_flag: 'i'
4497
4746
  device_replacement: 'Xolo $1'
4498
4747
  brand_replacement: 'Xolo'
4499
4748
  model_replacement: '$1'
4500
- - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4749
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4501
4750
  regex_flag: 'i'
4502
4751
  device_replacement: 'Xolo $1'
4503
4752
  brand_replacement: 'Xolo'
@@ -4507,7 +4756,7 @@ device_parsers:
4507
4756
  # Xoro
4508
4757
  # @ref: http://www.xoro.de/produkte/
4509
4758
  #########
4510
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4759
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4511
4760
  device_replacement: 'Xoro $1'
4512
4761
  brand_replacement: 'Xoro'
4513
4762
  model_replacement: '$1'
@@ -4516,7 +4765,7 @@ device_parsers:
4516
4765
  # Zopo
4517
4766
  # @ref: http://www.zopomobiles.com/products.html
4518
4767
  #########
4519
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4768
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4520
4769
  device_replacement: '$1$2$3'
4521
4770
  brand_replacement: 'Zopo'
4522
4771
  model_replacement: '$1$2$3'
@@ -4525,11 +4774,11 @@ device_parsers:
4525
4774
  # ZiiLabs
4526
4775
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4527
4776
  #########
4528
- - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4777
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4529
4778
  device_replacement: '$1 $2'
4530
4779
  brand_replacement: 'ZiiLabs'
4531
4780
  model_replacement: '$2'
4532
- - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4781
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4533
4782
  device_replacement: '$1 $2'
4534
4783
  brand_replacement: 'ZiiLabs'
4535
4784
  model_replacement: '$2'
@@ -4538,36 +4787,36 @@ device_parsers:
4538
4787
  # ZTE
4539
4788
  # @ref: http://www.ztedevices.com/
4540
4789
  #########
4541
- - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4790
+ - 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)'
4542
4791
  device_replacement: '$1'
4543
4792
  brand_replacement: 'ZTE'
4544
4793
  model_replacement: '$1'
4545
- - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
4794
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4546
4795
  device_replacement: '$1'
4547
4796
  brand_replacement: 'ZTE'
4548
4797
  model_replacement: '$1'
4549
- - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
4798
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4550
4799
  device_replacement: '$1'
4551
4800
  brand_replacement: 'ZTE'
4552
4801
  model_replacement: '$1'
4553
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4802
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4554
4803
  device_replacement: 'ZTE Blade$1'
4555
4804
  brand_replacement: 'ZTE'
4556
4805
  model_replacement: 'Blade$1'
4557
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4806
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4558
4807
  device_replacement: 'ZTE Skate$1'
4559
4808
  brand_replacement: 'ZTE'
4560
4809
  model_replacement: 'Skate$1'
4561
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4810
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4562
4811
  device_replacement: '$1$2'
4563
4812
  brand_replacement: 'ZTE'
4564
4813
  model_replacement: '$1$2'
4565
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
4814
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4566
4815
  device_replacement: 'ZTE $1'
4567
4816
  brand_replacement: 'ZTE'
4568
4817
  model_replacement: '$1'
4569
4818
  # operator specific
4570
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
4819
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4571
4820
  device_replacement: '$1 $2'
4572
4821
  brand_replacement: 'ZTE'
4573
4822
  model_replacement: '$1 $2'
@@ -4576,7 +4825,7 @@ device_parsers:
4576
4825
  device_replacement: '$1'
4577
4826
  brand_replacement: 'ZTE'
4578
4827
  model_replacement: '$1'
4579
- - regex: '; *(vp9plus)\)'
4828
+ - regex: '; {0,2}(vp9plus)\)'
4580
4829
  device_replacement: '$1'
4581
4830
  brand_replacement: 'ZTE'
4582
4831
  model_replacement: '$1'
@@ -4636,7 +4885,7 @@ device_parsers:
4636
4885
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4637
4886
  brand_replacement: 'Amazon'
4638
4887
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4639
- - regex: '; ?Amazon ([^;/]+) Build\b'
4888
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4640
4889
  device_replacement: '$1'
4641
4890
  brand_replacement: 'Amazon'
4642
4891
  model_replacement: '$1'
@@ -4659,22 +4908,22 @@ device_parsers:
4659
4908
 
4660
4909
  #########
4661
4910
  # Devices from chinese manufacturer(s)
4662
- # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
4911
+ # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.{0,200}
4663
4912
  #########
4664
- - regex: '(sprd)\-([^/]+)/'
4913
+ - regex: '(sprd)\-([^/]{1,50})/'
4665
4914
  device_replacement: '$1 $2'
4666
4915
  brand_replacement: '$1'
4667
4916
  model_replacement: '$2'
4668
4917
  # @ref: http://eshinechina.en.alibaba.com/
4669
- - regex: '; *(H\d{2}00\+?) Build'
4918
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4670
4919
  device_replacement: '$1'
4671
4920
  brand_replacement: 'Hero'
4672
4921
  model_replacement: '$1'
4673
- - regex: '; *(iphone|iPhone5) Build/'
4922
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4674
4923
  device_replacement: 'Xianghe $1'
4675
4924
  brand_replacement: 'Xianghe'
4676
4925
  model_replacement: '$1'
4677
- - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
4926
+ - regex: '; {0,2}(e\d{4}[a-z]?_?v\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/'
4678
4927
  device_replacement: 'Xianghe $1'
4679
4928
  brand_replacement: 'Xianghe'
4680
4929
  model_replacement: '$1'
@@ -4696,7 +4945,7 @@ device_parsers:
4696
4945
  #########
4697
4946
  # Alcatel Windows Phones
4698
4947
  #########
4699
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
4948
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\)]+)'
4700
4949
  device_replacement: 'Alcatel $1'
4701
4950
  brand_replacement: 'Alcatel'
4702
4951
  model_replacement: '$1'
@@ -4704,8 +4953,7 @@ device_parsers:
4704
4953
  #########
4705
4954
  # Asus Windows Phones
4706
4955
  #########
4707
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4708
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4956
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\)]+)'
4709
4957
  device_replacement: 'Asus $1'
4710
4958
  brand_replacement: 'Asus'
4711
4959
  model_replacement: '$1'
@@ -4713,7 +4961,7 @@ device_parsers:
4713
4961
  #########
4714
4962
  # Dell Windows Phones
4715
4963
  #########
4716
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
4964
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\)]+)'
4717
4965
  device_replacement: 'Dell $1'
4718
4966
  brand_replacement: 'Dell'
4719
4967
  model_replacement: '$1'
@@ -4721,7 +4969,7 @@ device_parsers:
4721
4969
  #########
4722
4970
  # HTC Windows Phones
4723
4971
  #########
4724
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
4972
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\)]+)'
4725
4973
  device_replacement: 'HTC $1'
4726
4974
  brand_replacement: 'HTC'
4727
4975
  model_replacement: '$1'
@@ -4729,7 +4977,7 @@ device_parsers:
4729
4977
  #########
4730
4978
  # Huawei Windows Phones
4731
4979
  #########
4732
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
4980
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\)]+)'
4733
4981
  device_replacement: 'Huawei $1'
4734
4982
  brand_replacement: 'Huawei'
4735
4983
  model_replacement: '$1'
@@ -4737,7 +4985,7 @@ device_parsers:
4737
4985
  #########
4738
4986
  # LG Windows Phones
4739
4987
  #########
4740
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
4988
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \-]|)([^;,\)]+)'
4741
4989
  device_replacement: 'LG $1'
4742
4990
  brand_replacement: 'LG'
4743
4991
  model_replacement: '$1'
@@ -4745,15 +4993,15 @@ device_parsers:
4745
4993
  #########
4746
4994
  # Noka Windows Phones
4747
4995
  #########
4748
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4996
+ - 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}[^;\)]*)'
4749
4997
  device_replacement: 'Lumia $1'
4750
4998
  brand_replacement: 'Nokia'
4751
4999
  model_replacement: 'Lumia $1'
4752
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
5000
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\d{3,})'
4753
5001
  device_replacement: 'Nokia $1'
4754
5002
  brand_replacement: 'Nokia'
4755
5003
  model_replacement: '$1'
4756
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
5004
+ - regex: '(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
4757
5005
  device_replacement: 'Nokia $1'
4758
5006
  brand_replacement: 'Nokia'
4759
5007
  model_replacement: '$1'
@@ -4761,7 +5009,7 @@ device_parsers:
4761
5009
  #########
4762
5010
  # Microsoft Windows Phones
4763
5011
  #########
4764
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
5012
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\)]+)'
4765
5013
  device_replacement: 'Microsoft $1'
4766
5014
  brand_replacement: 'Microsoft'
4767
5015
  model_replacement: '$1'
@@ -4769,7 +5017,7 @@ device_parsers:
4769
5017
  #########
4770
5018
  # Samsung Windows Phones
4771
5019
  #########
4772
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
5020
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\.\)]+)'
4773
5021
  device_replacement: 'Samsung $1'
4774
5022
  brand_replacement: 'Samsung'
4775
5023
  model_replacement: '$1'
@@ -4777,7 +5025,7 @@ device_parsers:
4777
5025
  #########
4778
5026
  # Toshiba Windows Phones
4779
5027
  #########
4780
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
5028
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\)]+)'
4781
5029
  device_replacement: 'Toshiba $1'
4782
5030
  brand_replacement: 'Toshiba'
4783
5031
  model_replacement: '$1'
@@ -4785,7 +5033,7 @@ device_parsers:
4785
5033
  #########
4786
5034
  # Generic Windows Phones
4787
5035
  #########
4788
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
5036
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\)]+)'
4789
5037
  device_replacement: '$1 $2'
4790
5038
  brand_replacement: '$1'
4791
5039
  model_replacement: '$2'
@@ -4797,7 +5045,7 @@ device_parsers:
4797
5045
  #########
4798
5046
  # Samsung Bada Phones
4799
5047
  #########
4800
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5048
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4801
5049
  device_replacement: 'Samsung $1'
4802
5050
  brand_replacement: 'Samsung'
4803
5051
  model_replacement: '$1'
@@ -4805,11 +5053,11 @@ device_parsers:
4805
5053
  #########
4806
5054
  # Firefox OS
4807
5055
  #########
4808
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5056
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4809
5057
  device_replacement: 'Alcatel $1 $2 $3'
4810
5058
  brand_replacement: 'Alcatel'
4811
5059
  model_replacement: 'One Touch $3'
4812
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5060
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4813
5061
  device_replacement: 'ZTE $1$2'
4814
5062
  brand_replacement: 'ZTE'
4815
5063
  model_replacement: '$1$2'
@@ -4817,15 +5065,15 @@ device_parsers:
4817
5065
  #########
4818
5066
  # KaiOS
4819
5067
  #########
4820
- - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
5068
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
4821
5069
  device_replacement: 'Alcatel $1'
4822
5070
  brand_replacement: 'Alcatel'
4823
5071
  model_replacement: '$1'
4824
- - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5072
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4825
5073
  device_replacement: 'LYF $1'
4826
5074
  brand_replacement: 'LYF'
4827
5075
  model_replacement: '$1'
4828
- - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5076
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4829
5077
  device_replacement: 'Nokia $1'
4830
5078
  brand_replacement: 'Nokia'
4831
5079
  model_replacement: '$1'
@@ -4838,7 +5086,7 @@ device_parsers:
4838
5086
  device_replacement: 'Nokia $1'
4839
5087
  brand_replacement: 'Nokia'
4840
5088
  model_replacement: '$1$2'
4841
- - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
5089
+ - regex: '(?:NOKIA|Nokia)(?:\-| {0,2})(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
4842
5090
  device_replacement: 'Nokia $1$2$3'
4843
5091
  brand_replacement: 'Nokia'
4844
5092
  model_replacement: '$1$2$3'
@@ -4847,12 +5095,12 @@ device_parsers:
4847
5095
  brand_replacement: 'Nokia'
4848
5096
  model_replacement: 'Lumia $1'
4849
5097
  # UCWEB Browser on Symbian
4850
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
5098
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\)'
4851
5099
  device_replacement: '$1 $2'
4852
5100
  brand_replacement: '$1'
4853
5101
  model_replacement: '$2'
4854
5102
  # Nokia Symbian
4855
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5103
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4856
5104
  device_replacement: 'Nokia $1'
4857
5105
  brand_replacement: 'Nokia'
4858
5106
  model_replacement: '$1'
@@ -4865,7 +5113,7 @@ device_parsers:
4865
5113
  device_replacement: 'BlackBerry $1'
4866
5114
  brand_replacement: 'BlackBerry'
4867
5115
  model_replacement: '$1'
4868
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5116
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4869
5117
  device_replacement: 'BlackBerry Playbook'
4870
5118
  brand_replacement: 'BlackBerry'
4871
5119
  model_replacement: 'Playbook'
@@ -4897,7 +5145,7 @@ device_parsers:
4897
5145
  device_replacement: 'Palm Treo $1'
4898
5146
  brand_replacement: 'Palm'
4899
5147
  model_replacement: 'Treo $1'
4900
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5148
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
4901
5149
  device_replacement: 'HP Veer'
4902
5150
  brand_replacement: 'HP'
4903
5151
  model_replacement: 'Veer'
@@ -4905,7 +5153,7 @@ device_parsers:
4905
5153
  device_replacement: 'HP TouchPad'
4906
5154
  brand_replacement: 'HP'
4907
5155
  model_replacement: 'TouchPad'
4908
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5156
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
4909
5157
  device_replacement: 'HP iPAQ $1'
4910
5158
  brand_replacement: 'HP'
4911
5159
  model_replacement: 'iPAQ $1'
@@ -4959,7 +5207,7 @@ device_parsers:
4959
5207
  - regex: '(Watch)(\d+,\d+)'
4960
5208
  device_replacement: 'Apple $1'
4961
5209
  brand_replacement: 'Apple'
4962
- model_replacement: 'Apple $1 $2'
5210
+ model_replacement: '$1$2'
4963
5211
  - regex: '(Apple Watch)(?:;| Simulator;)'
4964
5212
  device_replacement: '$1'
4965
5213
  brand_replacement: 'Apple'
@@ -4973,18 +5221,18 @@ device_parsers:
4973
5221
  brand_replacement: 'Apple'
4974
5222
  model_replacement: 'iPhone'
4975
5223
  # @note: desktop applications show device info
4976
- - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5224
+ - regex: 'CFNetwork/.{0,100} Darwin/\d.{0,100}\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
4977
5225
  device_replacement: '$1$2,$3'
4978
5226
  brand_replacement: 'Apple'
4979
5227
  model_replacement: '$1$2,$3'
4980
5228
  # @note: newer desktop applications don't show device info
4981
5229
  # This is here so as to not have them recorded as iOS-Device
4982
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5230
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
4983
5231
  device_replacement: 'Mac'
4984
5232
  brand_replacement: 'Apple'
4985
5233
  model_replacement: 'Mac'
4986
5234
  # @note: iOS applications do not show device info
4987
- - regex: 'CFNetwork/.* Darwin/\d'
5235
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
4988
5236
  device_replacement: 'iOS-Device'
4989
5237
  brand_replacement: 'Apple'
4990
5238
  model_replacement: 'iOS-Device'
@@ -5028,7 +5276,7 @@ device_parsers:
5028
5276
  device_replacement: 'Asus $1'
5029
5277
  brand_replacement: 'Asus'
5030
5278
  model_replacement: '$1'
5031
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5279
+ - regex: '(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5032
5280
  device_replacement: 'Asus $1'
5033
5281
  brand_replacement: 'Asus'
5034
5282
  model_replacement: '$1'
@@ -5061,11 +5309,11 @@ device_parsers:
5061
5309
  device_replacement: 'DoCoMo $1'
5062
5310
  brand_replacement: 'DoCoMo'
5063
5311
  model_replacement: '$1'
5064
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5312
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
5065
5313
  device_replacement: 'DoCoMo $1'
5066
5314
  brand_replacement: 'DoCoMo'
5067
5315
  model_replacement: '$1'
5068
- - regex: '([A-Za-z0-9]+);FOMA'
5316
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
5069
5317
  device_replacement: 'DoCoMo $1'
5070
5318
  brand_replacement: 'DoCoMo'
5071
5319
  model_replacement: '$1'
@@ -5073,7 +5321,7 @@ device_parsers:
5073
5321
  ##########
5074
5322
  # htc
5075
5323
  ##########
5076
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5324
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5077
5325
  device_replacement: 'HTC $1'
5078
5326
  brand_replacement: 'HTC'
5079
5327
  model_replacement: '$1'
@@ -5130,22 +5378,22 @@ device_parsers:
5130
5378
  # HbbTV (European and Australian standard)
5131
5379
  # written before the LG regexes, as LG is making HbbTV too
5132
5380
  ##########
5133
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(LG)E *; *([^;]*) *;[^;]*;[^;]*;\)'
5381
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \( ?;(LG)E ?;([^;]{0,30})'
5134
5382
  device_replacement: '$1'
5135
5383
  brand_replacement: '$2'
5136
5384
  model_replacement: '$3'
5137
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
5385
+ - regex: '(HbbTV)/1\.1\.1.{0,200}CE-HTML/1\.\d;(Vendor/|)(THOM[^;]{0,200}?)[;\s].{0,30}(LF[^;]{1,200});?'
5138
5386
  device_replacement: '$1'
5139
5387
  brand_replacement: 'Thomson'
5140
5388
  model_replacement: '$4'
5141
- - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
5389
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); {0,2}CE-HTML(?:/1\.\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});'
5142
5390
  device_replacement: '$1'
5143
5391
  brand_replacement: '$2'
5144
5392
  model_replacement: '$3'
5145
5393
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5146
5394
  device_replacement: '$1'
5147
5395
  brand_replacement: 'Samsung'
5148
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(?:CUS:([^;]*)|([^;]+)) *; *([^;]*) *;.*;'
5396
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5149
5397
  device_replacement: '$1'
5150
5398
  brand_replacement: '$2$3'
5151
5399
  model_replacement: '$4'
@@ -5155,7 +5403,7 @@ device_parsers:
5155
5403
  ##########
5156
5404
  # LGE NetCast TV
5157
5405
  ##########
5158
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5406
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5159
5407
  device_replacement: 'NetCast$2'
5160
5408
  brand_replacement: 'LG'
5161
5409
  model_replacement: '$1'
@@ -5163,11 +5411,11 @@ device_parsers:
5163
5411
  ##########
5164
5412
  # InettvBrowser
5165
5413
  ##########
5166
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
5414
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5167
5415
  device_replacement: 'Inettv'
5168
5416
  brand_replacement: '$1'
5169
5417
  model_replacement: '$2'
5170
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
5418
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5171
5419
  device_replacement: 'Inettv'
5172
5420
  brand_replacement: 'Generic_Inettv'
5173
5421
  model_replacement: '$1'
@@ -5204,7 +5452,7 @@ device_parsers:
5204
5452
  device_replacement: 'Microsoft $1'
5205
5453
  brand_replacement: 'Microsoft'
5206
5454
  model_replacement: '$1'
5207
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5455
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5208
5456
  device_replacement: '$1'
5209
5457
  brand_replacement: 'Microsoft'
5210
5458
  model_replacement: '$1'
@@ -5265,12 +5513,12 @@ device_parsers:
5265
5513
  # Samsung
5266
5514
  ##########
5267
5515
  # Samsung Smart-TV
5268
- - regex: '(SMART-TV); .* Tizen '
5516
+ - regex: '(SMART-TV); .{0,200} Tizen '
5269
5517
  device_replacement: 'Samsung $1'
5270
5518
  brand_replacement: 'Samsung'
5271
5519
  model_replacement: '$1'
5272
5520
  # Samsung Symbian Devices
5273
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5521
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5274
5522
  device_replacement: 'Samsung $1'
5275
5523
  brand_replacement: 'Samsung'
5276
5524
  model_replacement: '$1'
@@ -5278,7 +5526,7 @@ device_parsers:
5278
5526
  device_replacement: '$1 $2$3'
5279
5527
  brand_replacement: '$1'
5280
5528
  model_replacement: '$2-$3'
5281
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5529
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5282
5530
  device_replacement: '$1'
5283
5531
  brand_replacement: 'Samsung'
5284
5532
  model_replacement: '$1'
@@ -5325,7 +5573,7 @@ device_parsers:
5325
5573
  ##########
5326
5574
  # Sony
5327
5575
  ##########
5328
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5576
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5329
5577
  device_replacement: '$2 $1'
5330
5578
  brand_replacement: '$2'
5331
5579
  model_replacement: '$1'
@@ -5359,33 +5607,33 @@ device_parsers:
5359
5607
  #########
5360
5608
  # Android General Device Matching (far from perfect)
5361
5609
  #########
5362
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
5610
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\))'
5363
5611
  brand_replacement: 'Generic_Android'
5364
5612
  model_replacement: '$1'
5365
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
5613
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5366
5614
  brand_replacement: 'Generic_Android'
5367
5615
  model_replacement: '$1'
5368
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
5616
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5369
5617
  brand_replacement: 'Generic_Android'
5370
5618
  model_replacement: '$1'
5371
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
5619
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{0,2}\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5372
5620
  brand_replacement: 'Generic_Android'
5373
5621
  model_replacement: '$1'
5374
5622
  # No build info at all - "Build" follows locale immediately
5375
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5623
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5376
5624
  device_replacement: 'Generic Smartphone'
5377
5625
  brand_replacement: 'Generic'
5378
5626
  model_replacement: 'Smartphone'
5379
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5627
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,3}\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\))'
5380
5628
  brand_replacement: 'Generic_Android'
5381
5629
  model_replacement: '$1'
5382
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5630
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5383
5631
  brand_replacement: 'Generic_Android'
5384
5632
  model_replacement: '$1'
5385
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5633
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5386
5634
  brand_replacement: 'Generic_Android_Tablet'
5387
5635
  model_replacement: '$1'
5388
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5636
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5389
5637
  brand_replacement: 'Generic_Android'
5390
5638
  model_replacement: '$1'
5391
5639
 
@@ -5410,7 +5658,7 @@ device_parsers:
5410
5658
  ##########
5411
5659
  # Generic Tablet
5412
5660
  ##########
5413
- - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
5661
+ - regex: '(Android 3\.\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))'
5414
5662
  regex_flag: 'i'
5415
5663
  device_replacement: 'Generic Tablet'
5416
5664
  brand_replacement: 'Generic'
@@ -5419,7 +5667,7 @@ device_parsers:
5419
5667
  ##########
5420
5668
  # Generic Smart Phone
5421
5669
  ##########
5422
- - 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)'
5670
+ - 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)'
5423
5671
  device_replacement: 'Generic Smartphone'
5424
5672
  brand_replacement: 'Generic'
5425
5673
  model_replacement: 'Smartphone'
@@ -5432,7 +5680,7 @@ device_parsers:
5432
5680
  ##########
5433
5681
  # Spiders (this is a hack...)
5434
5682
  ##########
5435
- - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
5683
+ - 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)'
5436
5684
  regex_flag: 'i'
5437
5685
  device_replacement: 'Spider'
5438
5686
  brand_replacement: 'Spider'
@@ -5471,3 +5719,14 @@ device_parsers:
5471
5719
  device_replacement: 'Generic Feature Phone'
5472
5720
  brand_replacement: 'Generic'
5473
5721
  model_replacement: 'Feature Phone'
5722
+
5723
+ #########
5724
+ # Apple
5725
+ # @ref: https://www.apple.com/mac/
5726
+ # @note: lookup Mac OS, but exclude iPad, Apple TV, a HTC phone, Kindle, LG
5727
+ # @note: put this at the end, since it is hard to implement contains foo, but not contain bar1, bar 2, bar 3 in go's re2
5728
+ #########
5729
+ - regex: 'Mac OS'
5730
+ device_replacement: 'Mac'
5731
+ brand_replacement: 'Apple'
5732
+ model_replacement: 'Mac'