device_detector 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 611332d50a55f1fae0ed0c5fe904f4270f97a0e2
4
- data.tar.gz: d93d89627f6273e2dc7a00a687c27ce99d4c7620
3
+ metadata.gz: f73cba454031ad8e9b62806a487cf3fe52bc50a2
4
+ data.tar.gz: 677525ac1133c59eb2a7900faf31077546787e45
5
5
  SHA512:
6
- metadata.gz: a9e5e7d8620e42d6ffb46b9f72ce7bff5d721982ea6cea5c93c04e8044241b7452a85c3bb8642f57783b0ade34732fd110197380abace240eacf9be48d9fe115
7
- data.tar.gz: 381bb1bbd102a11fb02245652a354e7d206e04459f78b2dca86e1312f722e39e315099a04f6505ee62e327cd3026c2003b517dd1f9eb25f11c493b49e24c9b2d
6
+ metadata.gz: a196b3ad6f3da4dcf8eb447fb721fc1671870fb1fcd3fc7cf2326917896079777f4188b19ae2fe84433a050567bab5ff8917418112329021822f6490482b0f0d
7
+ data.tar.gz: 4f823b5ab1ce904da8202d12225c09db755d82876c06baaffb2371d838e9779440bedb67e98e03bb76be9f544942490463c95adeb04eb0210003e755165bf652
data/README.md CHANGED
@@ -38,15 +38,24 @@ Or install it yourself as:
38
38
  user_agent = 'foo'
39
39
  client = DeviceDetector.new(user_agent)
40
40
 
41
- client.name # => Chrome
41
+ client.name # => 'Chrome'
42
42
  client.full_version # => '30.0.1599.69'
43
- client.known? # => true, will return false if user_agent is unknown
44
43
 
45
- client.os_name # => Mac
44
+ client.os_name # => 'Mac'
46
45
  client.os_full_version # => '10_8_5'
46
+
47
+ # For many devices, you can also query the device name (usually the model name)
48
+ # Look into regexes/devices/mobiles.yml to see what devices can be detected
49
+ client.device_name # => 'iPhone 5'
50
+ client.device_type # => 'smartphone'
47
51
  ```
48
52
 
49
53
  `DeviceDetector` will return `nil` on all attributes, if the `user_agent` is unknown.
54
+ You can make a check to ensure the client has been detected:
55
+
56
+ ```ruby
57
+ client.known? # => will return false if user_agent is unknown
58
+ ```
50
59
 
51
60
  ### Memory cache
52
61
 
@@ -54,17 +63,27 @@ client.os_full_version # => '10_8_5'
54
63
  You can tune the amount of keys that will get saved in the cache:
55
64
 
56
65
  ```ruby
57
-
58
66
  # You have to call this code **before** you initialize the Detector
59
67
  DeviceDetector.configure do |config|
60
68
  config.max_cache_keys = 20_000 # if you have enough RAM, proceed with care
61
69
  end
62
70
  ```
63
71
 
72
+ ## Maintainers
73
+
74
+ - Mati Sojka: https://github.com/yagooar
75
+ - Ben Zimmer: https://github.com/benzimmer
76
+
77
+ ## Contributors
78
+
79
+ Thanks a lot to the following contributors:
80
+
81
+ - Peter Gao: https://github.com/peteygao
82
+
64
83
  ## Contributing
65
84
 
66
- 1. Fork it ( https://github.com/[my-github-username]/device_detector/fork )
85
+ 1. Fork it ( https://github.com/podigee/device_detector/fork )
67
86
  2. Create your feature branch (`git checkout -b my-new-feature`)
68
87
  3. Commit your changes (`git commit -am 'Add some feature'`)
69
88
  4. Push to the branch (`git push origin my-new-feature`)
70
- 5. Create a new Pull Request
89
+ 5. Create a new Pull Request (compare with develop)
@@ -4,11 +4,14 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
5
 
6
6
  require 'device_detector/version'
7
+ require 'device_detector/metadata_extractor'
7
8
  require 'device_detector/version_extractor'
9
+ require 'device_detector/model_extractor'
8
10
  require 'device_detector/memory_cache'
9
11
  require 'device_detector/parser'
10
12
  require 'device_detector/bot'
11
13
  require 'device_detector/client'
14
+ require 'device_detector/device'
12
15
  require 'device_detector/os'
13
16
 
14
17
  class DeviceDetector
@@ -35,6 +38,14 @@ class DeviceDetector
35
38
  os.full_version
36
39
  end
37
40
 
41
+ def device_name
42
+ device.name
43
+ end
44
+
45
+ def device_type
46
+ device.type
47
+ end
48
+
38
49
  def known?
39
50
  client.known?
40
51
  end
@@ -84,6 +95,10 @@ class DeviceDetector
84
95
  @client ||= Client.new(user_agent)
85
96
  end
86
97
 
98
+ def device
99
+ @device ||= Device.new(user_agent)
100
+ end
101
+
87
102
  def os
88
103
  @os ||= OS.new(user_agent)
89
104
  end
@@ -0,0 +1,46 @@
1
+ class DeviceDetector
2
+ class Device < Parser
3
+
4
+ def known?
5
+ regex_meta.any?
6
+ end
7
+
8
+ def name
9
+ ModelExtractor.new(user_agent, regex_meta).call
10
+ end
11
+
12
+ def type
13
+ regex_meta['device']
14
+ end
15
+
16
+ private
17
+
18
+ def filenames
19
+ [
20
+ 'devices/mobiles.yml'
21
+ ]
22
+ end
23
+
24
+ def self.parse_regexes(regexes)
25
+ regexes.map { |base, nest|
26
+
27
+ if !nest.nil? && nest.key?('models')
28
+ parse_regexes nest['models']
29
+ else
30
+ case base
31
+ when Hash
32
+ base['regex'] = Regexp.new base['regex']
33
+ base
34
+ when String
35
+ nest['regex'] = Regexp.new nest['regex']
36
+ nest
37
+ else
38
+ fail "#{filenames.join(', ')} regexes are either malformed or format has changes."
39
+ end
40
+ end
41
+
42
+ }.flatten
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,38 @@
1
+ class DeviceDetector
2
+ class MetadataExtractor < Struct.new(:user_agent, :regex_meta)
3
+
4
+ def call
5
+ regex_meta.any? ? extract_metadata : nil
6
+ end
7
+
8
+ private
9
+
10
+ def metadata_string
11
+ message = "#{self.name} (a child of MetadataExtractor) must implement the '#{__method__}' method."
12
+ fail NotImplementedError, message
13
+ end
14
+
15
+ def extract_metadata
16
+ user_agent.match(regex) do |match_data|
17
+ replace_metadata_string_with(match_data)
18
+ end
19
+ end
20
+
21
+ def replace_metadata_string_with(match_data)
22
+ string = metadata_string
23
+
24
+ 1.upto(9) do |index|
25
+ matched_data = String(match_data[index])
26
+ string = string.gsub(/\$#{index}/, matched_data)
27
+ end
28
+
29
+ string.strip
30
+ end
31
+
32
+ def regex
33
+ Regexp.new(regex_meta['regex'])
34
+ end
35
+
36
+ end
37
+ end
38
+
@@ -0,0 +1,11 @@
1
+ class DeviceDetector
2
+ class ModelExtractor < MetadataExtractor
3
+
4
+ private
5
+
6
+ def metadata_string
7
+ String(regex_meta['model'])
8
+ end
9
+
10
+ end
11
+ end
@@ -1,7 +1,7 @@
1
1
  class DeviceDetector
2
2
  class Parser < Struct.new(:user_agent)
3
3
 
4
- ROOT = Pathname.new(File.expand_path('../../..', __FILE__))
4
+ ROOT = File.expand_path('../../..', __FILE__)
5
5
 
6
6
  def name
7
7
  regex_meta['name']
@@ -43,13 +43,18 @@ class DeviceDetector
43
43
  def self.regexes_for(filepaths)
44
44
  @regexes ||=
45
45
  begin
46
- regexes = YAML.load(filepaths.map { |filepath| File.read(filepath) }.join)
47
- regexes.map do |meta|
48
- meta['regex'] = Regexp.new(meta['regex'])
49
- meta
50
- end
46
+ raw_files = filepaths.map { |filepath| File.read(filepath) }.join
47
+ regexes = YAML.load(raw_files)
48
+ parse_regexes(regexes)
51
49
  end
52
50
  end
53
51
 
52
+ def self.parse_regexes(regexes)
53
+ regexes.map do |meta|
54
+ meta['regex'] = Regexp.new(meta['regex'])
55
+ meta
56
+ end
57
+ end
58
+
54
59
  end
55
60
  end
@@ -1,3 +1,3 @@
1
1
  class DeviceDetector
2
- VERSION = '0.3.1'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -1,34 +1,10 @@
1
1
  class DeviceDetector
2
- class VersionExtractor < Struct.new(:user_agent, :regex_meta)
3
-
4
- def call
5
- regex_meta.any? ? extract_version : nil
6
- end
2
+ class VersionExtractor < MetadataExtractor
7
3
 
8
4
  private
9
5
 
10
- def version_string
11
- regex_meta['version']
12
- end
13
-
14
- def extract_version
15
- user_agent.match(regex) do |match_data|
16
- replace_version_string_with(match_data)
17
- end
18
- end
19
-
20
- def replace_version_string_with(match_data)
21
- string = version_string
22
-
23
- 1.upto(9) do |index|
24
- string = string.gsub(/\$#{index}/, match_data[index]) if match_data[index]
25
- end
26
-
27
- string
28
- end
29
-
30
- def regex
31
- Regexp.new(regex_meta['regex'])
6
+ def metadata_string
7
+ String(regex_meta['version'])
32
8
  end
33
9
 
34
10
  end
data/regexes/browsers.yml CHANGED
@@ -5,6 +5,14 @@
5
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
6
  ###############
7
7
 
8
+ #newer versions of IE
9
+ - regex: 'Edge[ /](\d+[\.\d]+)'
10
+ name: 'Internet Explorer'
11
+ version: '$1'
12
+ engine:
13
+ default: 'Edge'
14
+
15
+
8
16
  #SailfishBrowser
9
17
  - regex: 'SailfishBrowser(?:/(\d+[\.\d]+))?'
10
18
  name: 'Sailfish Browser'
@@ -627,6 +635,11 @@
627
635
  engine:
628
636
  default: 'Blink'
629
637
 
638
+ # MIUI Browser
639
+ - regex: 'MIUIBrowser(?:/(\d+[\.\d]+))?'
640
+ name: 'MIUI Browser'
641
+ version: '$1'
642
+
630
643
  #Nokia Browser
631
644
  - regex: '(?:NokiaBrowser|BrowserNG)(?:/(\d+[\.\d]+))?'
632
645
  name: 'Nokia Browser'
@@ -739,4 +752,3 @@
739
752
  version: '$1'
740
753
  engine:
741
754
  default: 'WebKit'
742
-
@@ -0,0 +1,2412 @@
1
+ ###############
2
+ # Device Detector - The Universal Device Detection library for parsing User Agents
3
+ #
4
+ # @link http://piwik.org
5
+ # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
+ ###############
7
+
8
+ 'Tunisie Telecom':
9
+ regex: 'StarTrail TT Build'
10
+ device: 'smartphone'
11
+ model: 'StarTrail'
12
+
13
+ # SFR
14
+ SFR:
15
+ regex: 'StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem|StarTab'
16
+ device: 'smartphone'
17
+ models:
18
+ - regex: 'StarXtrem Build'
19
+ model: 'StarXtrem' # ZTE
20
+ - regex: 'StarTrail Build'
21
+ model: 'StarTrail' # ZTE
22
+ - regex: 'StarTrail II Build'
23
+ model: 'StarTrail 2' # Huawei Ascend Y200
24
+ - regex: 'StarTrail III Build'
25
+ model: 'StarTrail 3' # ZTE
26
+ - regex: 'StarTrail ?4 Build'
27
+ model: 'StarTrail 4' # ZTE Blade Q
28
+ - regex: 'StarShine Build'
29
+ model: 'StarShine' # Huawei U8180
30
+ - regex: 'StarShine II Build'
31
+ model: 'StarShine 2' # ZTE
32
+ - regex: 'STARADDICT Build'
33
+ model: 'Staraddict' # ZTE
34
+ - regex: 'STARADDICT II Build'
35
+ model: 'Staraddict 2' # Alcatel One Touch 995
36
+ - regex: 'STARADDICT II Plus Build'
37
+ model: 'Staraddict 2 Plus' # ZTE Grand X
38
+ - regex: 'STARADDICT III Build'
39
+ model: 'Staraddict 3' # Coolpad 8861U
40
+ - regex: 'StarText Build'
41
+ model: 'StarText' # ZTE
42
+ - regex: 'StarText II Build'
43
+ model: 'StarText 2' # ZTE
44
+ - regex: 'StarNaute Build'
45
+ model: 'StarNaute' # ZTE Amigo
46
+ - regex: 'StarNaute II Build'
47
+ model: 'StarNaute 2' # ZTE
48
+ - regex: 'StarTab'
49
+ model: 'StarTab'
50
+ device: 'tablet'
51
+
52
+ - regex: '((?:StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem)[^;/]*) Build'
53
+ model: '$1'
54
+
55
+ # HTC
56
+ HTC:
57
+ regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G Build|(Desire|Sensation|Evo ?3D)[ _]?([^;/]+) Build|(Amaze[ _]4G|One ?[XELSV\+]+) Build|SPV E6[05]0'
58
+ device: 'smartphone'
59
+ models:
60
+ # explicit smartphone models
61
+ - regex: 'ADR6300'
62
+ model: 'Droid Incredible'
63
+ - regex: 'ADR6400L'
64
+ model: 'ThunderBolt'
65
+ - regex: 'ADR6410LRA'
66
+ model: 'Droid Incredible 3'
67
+ - regex: 'SPV E600'
68
+ model: 'Excalibur'
69
+ - regex: 'SPV E650'
70
+ model: 'Vox'
71
+
72
+ - regex: 'NexusHD2' # custom rom for hd2
73
+ model: 'HD2'
74
+ - regex: 'HTC[ _-]((?:Flyer|P715a).*) Build'
75
+ device: 'tablet'
76
+ model: '$1'
77
+ - regex: 'HTC[ _]([^/;]+) [0-9]+(?:\.[0-9]+)+ Build'
78
+ model: '$1'
79
+ - regex: 'HTC[ _]([^/;]+) Build'
80
+ model: '$1'
81
+ - regex: 'HTC[ _]([a-z0-9]+[ _-]?(?:[a-z0-9_+\-])*)'
82
+ model: '$1'
83
+ - regex: 'USCCHTC(\d+)'
84
+ model: '$1'
85
+ - regex: 'Sprint (ATP.*) Build'
86
+ device: 'tablet'
87
+ model: '$1 (Sprint)'
88
+ - regex: 'Sprint (APA.*) Build'
89
+ model: '$1 (Sprint)'
90
+ - regex: 'HTC(?:[\-/ ])?([a-z0-9\-_]+)'
91
+ model: '$1'
92
+ - regex: 'HTC;(?: )?([a-z0-9 ]+)'
93
+ model: '$1'
94
+ - regex: '(Desire|Sensation|Evo ?3D)[ _]?([^;/]+) Build'
95
+ model: '$1 $2'
96
+ - regex: '(Amaze[ _]4G|One ?[XELSV\+]*) Build'
97
+ model: '$1'
98
+ - regex: '(ADR.+) Build'
99
+ model: '$1'
100
+ - regex: '(ADR[a-z0-9]+)'
101
+ model: '$1'
102
+
103
+ # NOKIA
104
+ Nokia:
105
+ regex: 'Nokia|Lumia|Maemo RX|portalmmm/2\.0 N7|portalmmm/2\.0 NK|nok[0-9]+|Symbian.*\s([a-z0-9]+)$'
106
+ device: 'smartphone'
107
+ models:
108
+ - regex: 'Nokia(N[0-9]+)'
109
+ model: '$1'
110
+ - regex: 'Nokia-([a-z0-9]+)'
111
+ model: 'N$1'
112
+ - regex: 'NOKIA; ([a-z0-9\- ]+)'
113
+ model: '$1'
114
+ - regex: 'NOKIA[ _]?([a-z0-9\-]+)'
115
+ model: '$1'
116
+ - regex: 'NOKIA/([a-z0-9 ]+)'
117
+ model: '$1'
118
+ - regex: '(Lumia [a-z0-9\-]+)'
119
+ model: '$1'
120
+ - regex: 'Maemo RX-51 ([a-z0-9]+)'
121
+ model: '$1'
122
+ - regex: 'Maemo RX-34'
123
+ model: 'N800'
124
+ - regex: 'NokiaInternal|Nokia-WAP-Toolkit|Nokia-MIT-Browser|Nokia Mobile|Nokia Browser|Nokia/Series'
125
+ model: ''
126
+ - regex: 'portalmmm/2\.0 (N7[37]|NK[a-z0-9]+)'
127
+ model: '$1'
128
+ - regex: 'nok([0-9]+)'
129
+ model: '$1'
130
+ - regex: 'Symbian.*\s([a-z0-9]+)$'
131
+ device: 'feature phone'
132
+ model: '$1'
133
+
134
+ # CnM
135
+ CnM:
136
+ regex: 'CnM'
137
+ device: 'tablet'
138
+ models:
139
+ - regex: 'CnM[ \-](?:Touchpad|TP)[ \-]([0-9\.]+)'
140
+ model: 'Touchpad $1'
141
+
142
+ # RIM/BlackBerry
143
+ RIM:
144
+ regex: 'BB10;|BlackBerry|rim[0-9]+|PlayBook'
145
+ device: 'smartphone'
146
+ models:
147
+ - regex: 'BB10; ([a-z0-9\- ]+)\)'
148
+ model: 'BlackBerry $1'
149
+ - regex: 'PlayBook.+RIM Tablet OS'
150
+ model: 'BlackBerry Playbook'
151
+ device: 'tablet'
152
+ - regex: 'BlackBerry(?: )?([a-z0-9]+)'
153
+ model: 'BlackBerry $1'
154
+ - regex: 'rim([0-9]+)'
155
+ model: 'BlackBerry $1'
156
+ - regex: 'BlackBerry'
157
+ model: 'BlackBerry'
158
+
159
+ # PALM
160
+ Palm:
161
+ regex: '(?:Pre|Pixi)/(\d+)\.(\d+)|Palm|Treo|Xiino'
162
+ device: 'smartphone'
163
+ models:
164
+ - regex: '((?:Pre|Pixi))/(\d+\.\d+)'
165
+ model: '$1 $2'
166
+ - regex: 'Palm(?:[ -])?((?!OS|Source)[a-z0-9]+)'
167
+ model: '$1'
168
+ - regex: 'Treo([a-z0-9]+)'
169
+ model: 'Treo $1'
170
+ - regex: 'Tungsten'
171
+ model: 'Tungsten'
172
+ - regex: 'Xiino' # Browser for Palm OS only
173
+ model: ''
174
+
175
+ # HP
176
+ HP:
177
+ regex: 'TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP Slate|HP [78]'
178
+ device: 'smartphone'
179
+ models:
180
+ - regex: 'HP ([78][^/;]*) Build'
181
+ model: 'Slate $1'
182
+ device: 'tablet'
183
+ - regex: 'HP Slate ?(.+) Build'
184
+ model: 'Slate $1'
185
+ device: 'tablet'
186
+ - regex: 'HP Slate ?([0-9]+)'
187
+ model: 'Slate $1'
188
+ device: 'tablet'
189
+ - regex: 'TouchPad/(\d+\.\d+)|hp-tablet'
190
+ model: 'TouchPad'
191
+ device: 'tablet'
192
+ - regex: 'HP(?: )?iPAQ(?: )?([a-z0-9]+)'
193
+ model: 'iPAQ $1'
194
+ - regex: 'webOS.*(P160U)'
195
+ model: 'Veer'
196
+
197
+ # TiPhone
198
+ TiPhone:
199
+ regex: 'TiPhone ?([a-z0-9]+)'
200
+ device: 'smartphone'
201
+ model: '$1'
202
+
203
+ # Apple
204
+ Apple:
205
+ regex: 'AppleTV|(?:Apple-)?(?:iPad|iPhone)'
206
+ models:
207
+ # specific smartphone devices
208
+ - regex: '(?:Apple-)?iPhone1[C,]1'
209
+ model: 'iPhone'
210
+ device: 'smartphone'
211
+ - regex: '(?:Apple-)?iPhone1[C,]2'
212
+ model: 'iPhone 3G'
213
+ device: 'smartphone'
214
+ - regex: '(?:Apple-)?iPhone2[C,]1'
215
+ model: 'iPhone 3GS'
216
+ device: 'smartphone'
217
+ - regex: '(?:Apple-)?iPhone3[C,][123]'
218
+ model: 'iPhone 4'
219
+ device: 'smartphone'
220
+ - regex: '(?:Apple-)?iPhone4[C,]1'
221
+ model: 'iPhone 4S'
222
+ device: 'smartphone'
223
+ - regex: '(?:Apple-)?iPhone5[C,][12]'
224
+ model: 'iPhone 5'
225
+ device: 'smartphone'
226
+ - regex: '(?:Apple-)?iPhone5[C,][34]'
227
+ model: 'iPhone 5C'
228
+ device: 'smartphone'
229
+ - regex: '(?:Apple-)?iPhone6[C,][12]'
230
+ model: 'iPhone 5S'
231
+ device: 'smartphone'
232
+ - regex: '(?:Apple-)?iPhone7[C,]1'
233
+ model: 'iPhone 6 Plus'
234
+ device: 'smartphone'
235
+ - regex: '(?:Apple-)?iPhone7[C,]2'
236
+ model: 'iPhone 6'
237
+ device: 'smartphone'
238
+
239
+ # specific tablet devices
240
+ - regex: '(?:Apple-)?iPad1[C,]1'
241
+ model: 'iPad'
242
+ device: 'tablet'
243
+ - regex: '(?:Apple-)?iPad2[C,][1234]'
244
+ model: 'iPad 2'
245
+ device: 'tablet'
246
+ - regex: '(?:Apple-)?iPad2[C,][567]'
247
+ model: 'iPad Mini'
248
+ device: 'tablet'
249
+ - regex: '(?:Apple-)?iPad3[C,][123]'
250
+ model: 'iPad 3'
251
+ device: 'tablet'
252
+ - regex: '(?:Apple-)?iPad3[C,][456]'
253
+ model: 'iPad 4'
254
+ device: 'tablet'
255
+ - regex: '(?:Apple-)?iPad4[C,][123]'
256
+ model: 'iPad Air'
257
+ device: 'tablet'
258
+ - regex: '(?:Apple-)?iPad4[C,][456]'
259
+ model: 'iPad Mini 2'
260
+ device: 'tablet'
261
+ - regex: '(?:Apple-)?iPad4[C,][789]'
262
+ model: 'iPad Mini 3'
263
+ device: 'tablet'
264
+ - regex: '(?:Apple-)?iPad5[C,][34]'
265
+ model: 'iPad Air 2'
266
+
267
+
268
+ - regex: 'AppleTV'
269
+ model: 'Apple TV'
270
+ device: 'tv'
271
+ - regex: '(?:Apple-)?iPad'
272
+ model: 'iPad'
273
+ device: 'tablet'
274
+ - regex: '(?:Apple-)?iPhone ?(3GS?|4S?|5[CS]?|6(:? Plus)?)?'
275
+ model: 'iPhone $1'
276
+ device: 'smartphone'
277
+
278
+ # micromax
279
+ MicroMax:
280
+ regex: 'MicroMax[ \-\_]?[a-z0-9]+'
281
+ device: 'smartphone'
282
+ models:
283
+ - regex: 'MicroMax(?:[ \-\_])?(P[a-z0-9]+)'
284
+ model: '$1'
285
+ device: 'tablet'
286
+ - regex: 'MicroMax(?:[ \-\_])?([a-z0-9]+)'
287
+ model: '$1'
288
+
289
+ # 3Q
290
+ 3Q:
291
+ regex: '(AC0731B|AC1024C|AC7803C|BC9710AM|EL72B|LC0720C|LC0723B|LC0725B|LC0804B|LC0808B|LC0809B|LC0810C|LC0816C|LC0901D|LC1016C|MT0724B|MT0729B|MT0729D|MT0811B|OC1020A|RC0709B|RC0710B|RC0718C|RC0719H|RC0721B|RC0722C|RC0726B|RC0734H|RC0743H|RC0817C|RC1018C|RC1019G|RC1025F|RC1301C|RC7802F|RC9711B|RC9712C|RC9716B|RC9717B|RC9724C|RC9726C|RC9727F|RC9730C|RC9731C|TS0807B|TS1013B|VM0711A|VM1017A|RC0813C|QS9719D|QS9718C|QS9715F|QS1023H|QS0815C|QS0730C|QS0728C|QS0717D|QS0716D|QS0715C|MT7801C)'
292
+ device: 'tablet'
293
+ model: '$1'
294
+
295
+ # Acer
296
+ Acer:
297
+ regex: 'acer|a(?:101|110|200|210|211|500|501|510|511|700|701) Build|Android.*V360 Build|A1-830|A1-81[01]|A3-A1[01]|B1-7[12][01]|B1-A71|S5[12]0'
298
+ device: 'smartphone'
299
+ models:
300
+ # explicit tablet models
301
+ - regex: 'A1-81[01]'
302
+ model: 'Iconia A'
303
+ device: 'tablet'
304
+ - regex: 'A1-830'
305
+ model: 'Iconia A1'
306
+ device: 'tablet'
307
+ - regex: 'A3-A1[01]'
308
+ model: 'Iconia A3'
309
+ device: 'tablet'
310
+ - regex: 'B1-7[12][01]|B1-A71'
311
+ model: 'Iconia B1'
312
+ device: 'tablet'
313
+
314
+ # explicit smartphone models
315
+ - regex: 'Android.*V360 Build'
316
+ model: 'Liquid E1'
317
+ - regex: 'S510 Build'
318
+ model: 'Liquid S1'
319
+ - regex: 'S520 Build'
320
+ model: 'Liquid S2'
321
+
322
+ - regex: 'Acer; ?([^;\)]+)'
323
+ model: '$1'
324
+ - regex: 'Acer[ _-]?([^;\)]+) Build'
325
+ model: '$1'
326
+ - regex: 'acer[\-_]([a-z0-9]+)'
327
+ model: '$1'
328
+ - regex: 'a(101|110|200|210|211|500|501|510|511|700|701) Build'
329
+ model: 'Iconia Tab A$1'
330
+ device: 'tablet'
331
+
332
+ # Airness
333
+ Airness:
334
+ regex: 'AIRNESS-([\w0-9]+)'
335
+ device: 'feature phone'
336
+ model: '$1'
337
+
338
+ # Alcatel
339
+ Alcatel:
340
+ regex: 'Alcatel|Alc[a-z0-9]+|One ?Touch'
341
+ device: 'smartphone'
342
+ models:
343
+ - regex: '(?:Alcatel[ _])?One[ _]?Touch[ _]((?:T[0-9]+|TAB[^/;]+|EVO[78](?:HD)?)) Build'
344
+ device: 'tablet'
345
+ model: 'One Touch $1'
346
+ - regex: '(?:Alcatel[ _])?One[ _]?Touch([^/;]*) Build'
347
+ model: 'One Touch$1'
348
+ - regex: 'Alcatel UP'
349
+ model: ''
350
+ - regex: 'ALCATEL([^/;]+) Build'
351
+ model: '$1'
352
+ - regex: 'ALCATEL[ \-]?([^/;\)]+)'
353
+ model: '$1'
354
+ - regex: 'ALCATEL_([^/;\)]+)'
355
+ model: '$1'
356
+ - regex: 'Alc([a-z0-9]+)'
357
+ model: '$1'
358
+
359
+ # Amoi
360
+ Amoi:
361
+ regex: 'Amoi'
362
+ device: 'smartphone'
363
+ models:
364
+ - regex: 'Amoi[\- /]([a-z0-9]+)'
365
+ model: '$1'
366
+ - regex: 'Amoisonic-([a-z0-9]+)'
367
+ model: '$1'
368
+
369
+ # Archos
370
+ Archos:
371
+ regex: 'Archos'
372
+ device: 'smartphone'
373
+ models:
374
+ - regex: 'Archos ?5 Build'
375
+ device: 'tablet'
376
+ model: '5'
377
+ - regex: 'Archos ([^/;]*(?:PAD)[^/;]*) Build'
378
+ device: 'tablet'
379
+ model: '$1'
380
+ - regex: 'Archos ((?:[789]|10)[0-9]?[a-z]* ?(?:G9|G10|Helium|Titanium|Cobalt|Platinum|Xenon|Carbon|Neon|XS|IT)[^/;]*) Build'
381
+ device: 'tablet'
382
+ model: '$1'
383
+ - regex: 'Archos ([a-z0-9 ]+) Build'
384
+ model: '$1'
385
+ - regex: 'Archos ([a-z0-9]+)'
386
+ model: '$1'
387
+
388
+ # Axxion
389
+ Axxion:
390
+ regex: 'Axxion ATAB-[0-9]+ Build'
391
+ device: 'tablet'
392
+ models:
393
+ - regex: 'Axxion ATAB-([0-9]+) Build'
394
+ model: 'ATAB-$1'
395
+
396
+ # Meu
397
+ MEU:
398
+ regex: 'MEU ([a-z0-9]+) Build'
399
+ device: 'smartphone'
400
+ model: '$1'
401
+
402
+ # Arnova
403
+ Arnova:
404
+ regex: 'arnova|AN[0-9]'
405
+ device: 'tablet'
406
+ models:
407
+ - regex: 'Arnova ([^/;]*) Build'
408
+ model: '$1'
409
+ - regex: 'AN([0-9][a-z0-9]+)'
410
+ model: '$1'
411
+
412
+ # Asus
413
+ Asus:
414
+ regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|K00[0-9a-z] Build'
415
+ device: 'smartphone'
416
+ models:
417
+ # explicit tablet models
418
+ - regex: 'ME171 Build'
419
+ model: 'Eee Pad MeMO 171'
420
+ device: 'tablet'
421
+ - regex: 'ME172V'
422
+ model: 'MeMO Pad'
423
+ device: 'tablet'
424
+ - regex: 'ME302C Build'
425
+ model: 'MeMO Pad FHD 10'
426
+ device: 'tablet'
427
+ - regex: 'ME302KL Build'
428
+ model: 'MeMO Pad FHD 10 LTE'
429
+ device: 'tablet'
430
+ - regex: 'ME301T Build'
431
+ model: 'MeMO Pad Smart 10'
432
+ device: 'tablet'
433
+ - regex: 'ME371MG Build'
434
+ model: 'Fonepad'
435
+ device: 'tablet'
436
+ - regex: 'K00U|ME173X Build'
437
+ model: 'MeMO Pad HD 7'
438
+ device: 'tablet'
439
+ - regex: 'K00L Build'
440
+ model: 'MeMO Pad 8'
441
+ device: 'tablet'
442
+ - regex: 'K00S Build'
443
+ model: 'MeMO Pad HD 7 Dual SIM'
444
+ device: 'tablet'
445
+ - regex: 'K00E Build'
446
+ model: 'Fonepad 7'
447
+ device: 'tablet'
448
+ - regex: 'K00Z Build'
449
+ model: 'Fonepad 7 Dual SIM'
450
+ device: 'tablet'
451
+ - regex: 'K00F Build'
452
+ model: 'MeMO Pad 10'
453
+ device: 'tablet'
454
+ - regex: 'K00G Build'
455
+ model: 'Fonepad Note 6'
456
+ device: 'tablet'
457
+ - regex: 'K00C Build'
458
+ model: 'Transformer Pad TF701T'
459
+ device: 'tablet'
460
+ - regex: 'TF300T Build'
461
+ model: 'Transformer Pad TF300T'
462
+ device: 'tablet'
463
+ - regex: 'Slider SL101'
464
+ model: 'Eee Pad Slider SL101'
465
+ device: 'tablet'
466
+
467
+ # explicit smartphone models
468
+ - regex: '(?:ASUS_)?T00[IQ]'
469
+ model: 'ZenFone 4'
470
+
471
+ # general detections
472
+ - regex: 'Asus(?:-|;)?([a-z0-9]+)'
473
+ model: '$1'
474
+ - regex: '(PadFone(?: [^;/]+)?) Build'
475
+ model: '$1'
476
+ - regex: '(PadFone(?: [a-z0-9]+)?)'
477
+ model: '$1'
478
+ - regex: '(?:Asus|Transformer) ((?:Pad |Prime )?TF[0-9a-z]+)'
479
+ device: 'tablet'
480
+ model: 'Transformer $1'
481
+
482
+ # Audiovox
483
+ Audiovox:
484
+ regex: 'Audiovox|CDM|UTS(?:TARCOM)?\-|audio[a-z0-9\-]+'
485
+ device: 'smartphone'
486
+ models:
487
+ - regex: 'Audiovox[_\-]([a-z0-9\-]+)'
488
+ model: '$1'
489
+ - regex: 'CDM(?:-)?([a-z0-9]+)'
490
+ model: 'CDM-$1'
491
+ - regex: 'UTS(?:TARCOM)?-([a-z0-9\-]+)'
492
+ model: 'CDM-$1'
493
+ - regex: 'audio([a-z0-9\-]+)'
494
+ model: 'CDM-$1'
495
+
496
+ # Avvio
497
+ Avvio:
498
+ regex: 'Avvio[ _]([a-z0-9\-]+)'
499
+ device: 'smartphone'
500
+ models:
501
+ - regex: 'Avvio[ _]PAD'
502
+ model: 'PAD'
503
+ device: 'tablet'
504
+ - regex: 'Avvio[ _]([a-z0-9\-]+)'
505
+ model: '$1'
506
+
507
+ #Barnes & Noble
508
+ 'Barnes & Noble':
509
+ regex: 'Nook|BN[TR]V[0-9]+'
510
+ device: 'tablet'
511
+ models:
512
+ - regex: 'Nook([a-z0-9]+)'
513
+ model: 'Nook $1'
514
+ - regex: 'Nook[ _]([^/;]+)[ _]Build'
515
+ model: 'Nook $1'
516
+ - regex: '(BN[TR]V[0-9]+)'
517
+ model: 'Nook $1'
518
+
519
+ # Blu
520
+ Blu:
521
+ regex: 'blu ([^/;]+) Build'
522
+ device: 'smartphone'
523
+ model: '$1'
524
+
525
+ #BBK
526
+ BBK:
527
+ regex: 'vivo'
528
+ device: 'smartphone'
529
+ models:
530
+ - regex: 'vivo ([^/;]+) Build'
531
+ model: 'Vivo $1'
532
+ - regex: 'vivo_([a-z0-9]+)'
533
+ model: 'Vivo $1'
534
+
535
+ # Bird
536
+ Bird:
537
+ regex: 'BIRD[\-. _]([^;/]+)'
538
+ device: 'feature phone'
539
+ models:
540
+ - regex: 'BIRD[\-. _]([^;/]+) Build'
541
+ model: '$1'
542
+ - regex: 'BIRD[\-. _]([^;/]+)_TD'
543
+ model: '$1'
544
+ - regex: 'BIRD[\-. _]([^;/]+)'
545
+ model: '$1'
546
+
547
+ # Becker
548
+ Becker:
549
+ regex: 'Becker-([a-z0-9]+)'
550
+ device: 'feature phone'
551
+ model: '$1'
552
+
553
+ # Beetel
554
+ Beetel:
555
+ regex: 'Beetel ([a-z0-9]+)'
556
+ device: 'feature phone'
557
+ model: '$1'
558
+
559
+ # BenQ-Siemens
560
+ BenQ-Siemens:
561
+ regex: 'BENQ-SIEMENS - ([a-z0-9]+)'
562
+ device: 'feature phone'
563
+ model: '$1'
564
+
565
+ # BenQ
566
+ BenQ:
567
+ regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
568
+ device: 'feature phone'
569
+ model: '$1'
570
+
571
+ # Bmobile
572
+ Bmobile:
573
+ regex: 'Bmobile_([a-z0-9]+)'
574
+ device: 'smartphone'
575
+ model: '$1'
576
+
577
+ # bq
578
+ bq:
579
+ regex: 'bq [^/;]+ Build'
580
+ device: 'tablet'
581
+ models:
582
+ - regex: 'bq (Aquaris[^/;]*) Build'
583
+ model: '$1'
584
+ device: 'smartphone'
585
+ - regex: 'bq ([^/;]+) Build'
586
+ model: '$1'
587
+
588
+ # Capitel
589
+ Capitel:
590
+ regex: 'Capitel-([a-z0-9]+)'
591
+ device: 'feature phone'
592
+ model: '$1'
593
+
594
+ # Cat
595
+ Cat:
596
+ regex: 'Cat ?(tablet|stargate|nova)'
597
+ device: 'tablet'
598
+ models:
599
+ - regex: 'Cat ?(?:tablet)? ?((?:Galactica|Nova|StarGate|PHOENIX)[^/;]*) Build'
600
+ model: '$1'
601
+ - regex: 'Cat ?tablet'
602
+ model: 'Nova'
603
+
604
+ # Celkon
605
+ Celkon:
606
+ regex: 'Celkon'
607
+ device: 'smartphone'
608
+ models:
609
+ - regex: 'Celkon[ _*](C[78]20)'
610
+ model: '$1'
611
+ device: 'tablet'
612
+ - regex: 'Celkon[ _*](CT[^;/]+) Build'
613
+ model: '$1'
614
+ device: 'tablet'
615
+ - regex: 'Celkon[ _*]([^;/]+) Build'
616
+ model: '$1'
617
+ - regex: 'Celkon[\. _*]([^;/\)]+)[\)/]'
618
+ model: '$1'
619
+
620
+ # Cherry Mobile
621
+ 'Cherry Mobile':
622
+ regex: 'Cherry|Flare2X|Fusion Bolt'
623
+ device: 'smartphone'
624
+ models:
625
+ - regex: 'Cherry(?: ?Mobile)?[ _]?([^/;]+) Build'
626
+ model: '$1'
627
+ - regex: '(Flare2X)'
628
+ model: '$1'
629
+ - regex: '(Fusion Bolt)'
630
+ model: '$1'
631
+ device: 'tablet'
632
+
633
+ # Compal
634
+ Compal:
635
+ regex: 'Compal-[a-z0-9]+'
636
+ device: 'feature phone'
637
+ model: '$1'
638
+
639
+ # ConCorde
640
+ ConCorde:
641
+ regex: 'ConCorde ([^/;]+) Build'
642
+ device: 'smartphone'
643
+ models:
644
+ - regex: 'ConCorde Tab ?([^/;]+) Build'
645
+ model: 'Tab $1'
646
+ device: 'tablet'
647
+ - regex: 'ConCorde ReadMan ?([^/;]+) Build'
648
+ model: 'ReadMan $1'
649
+ device: 'tablet'
650
+ - regex: 'ConCorde ([^/;]+) Build'
651
+ model: '$1'
652
+
653
+ # Coolpad
654
+ Coolpad:
655
+ regex: '(?:YL-)?Coolpad'
656
+ device: 'smartphone'
657
+ models:
658
+ - regex: '(?:YL-)?Coolpad[ _-]?([^/;]+) Build'
659
+ model: '$1'
660
+ - regex: '(?:YL-)?Coolpad[ _-]?([a-z0-9-]+)'
661
+ model: '$1'
662
+
663
+ # Cricket
664
+ Cricket:
665
+ regex: 'Cricket-([a-z0-9]+)'
666
+ device: 'feature phone'
667
+ model: '$1'
668
+
669
+ # Crius
670
+ 'Crius Mea':
671
+ regex: '(Q7A\+?) Build'
672
+ device: 'tablet'
673
+ model: '$1'
674
+
675
+ # Cube
676
+ Cube:
677
+ regex: 'Cube|(U[0-9]+GT(?:[0-9]|[\-_][a-z]+)|K8GT)'
678
+ device: 'tablet'
679
+ models:
680
+ - regex: '(U[0-9]+GT(?:[0-9]|[\-_][a-z]+))'
681
+ model: '$1'
682
+ - regex: '(K8GT)'
683
+ model: '$1'
684
+
685
+ # Danew
686
+ Danew:
687
+ regex: 'Dslide ?([^;/]+) Build'
688
+ device: 'tablet'
689
+ model: 'DSlide $1'
690
+
691
+ # Denver Electronics
692
+ Denver:
693
+ regex: '(TA[CDQ]-[0-9]+)'
694
+ device: 'tablet'
695
+ model: '$1'
696
+
697
+ # Dell
698
+ Dell:
699
+ regex: 'Dell'
700
+ device: 'smartphone'
701
+ models:
702
+ - regex: 'Dell ((?:Streak|Venue)[^/;]*) Build'
703
+ model: '$1'
704
+ device: 'tablet'
705
+ - regex: 'Dell; ((?:Streak|Venue)[^;/\)]*)'
706
+ model: '$1'
707
+ device: 'tablet'
708
+ - regex: 'Dell; ([^;/\)]+)'
709
+ model: '$1'
710
+ - regex: 'Dell[ _-]([^/;]+) Build'
711
+ model: '$1'
712
+
713
+ # Dbtel
714
+ Dbtel:
715
+ regex: 'DBTEL(?:[\-/])?([a-z0-9]+)'
716
+ device: 'feature phone'
717
+ model: '$1'
718
+
719
+ # Dicam
720
+ Dicam:
721
+ regex: 'DICAM-([a-z0-9]+)'
722
+ device: 'feature phone'
723
+ model: '$1'
724
+
725
+ # DoCoMo
726
+ DoCoMo:
727
+ regex: 'DoCoMo|\;FOMA|KGT/1\.0'
728
+ device: 'feature phone'
729
+ models:
730
+ - regex: 'DoCoMo/[12]\.0[/ ]([a-z0-9]+)'
731
+ model: '$1'
732
+ - regex: '([a-z0-9]+)(?:_W)?\;FOMA'
733
+ model: '$1'
734
+ - regex: 'KGT/1\.0 ([a-z0-9]+)'
735
+ model: '$1'
736
+
737
+ # Doogee
738
+ Doogee:
739
+ regex: '((?:BIGBOY|COLLO[23]?|DAGGER|DISCOVERY|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER) DG[0-9]+) Build'
740
+ device: 'smartphone'
741
+ model: '$1'
742
+
743
+ # Dopod
744
+ Dopod:
745
+ regex: 'Dopod(?: )?([a-z0-9]+)'
746
+ device: 'feature phone'
747
+ model: '$1'
748
+
749
+ # E-Boda
750
+ E-Boda:
751
+ regex: 'E-Boda'
752
+ device: 'smartphone'
753
+ models:
754
+ - regex: 'E-Boda ((?:Revo|Izzycomm|Essential|Intelligence|Supreme)[^/;]+) Build'
755
+ device: 'tablet'
756
+ model: '$1'
757
+ - regex: 'E-Boda ([^/;]+) Build'
758
+ model: '$1'
759
+
760
+ # Easypix
761
+ Easypix:
762
+ regex: 'EasyPad|EasyPhone'
763
+ device: 'smartphone'
764
+ models:
765
+ - regex: '(EasyPhone[^/;]+) Build'
766
+ model: '$1'
767
+ - regex: '(EasyPad[^/;]+) Build'
768
+ model: '$1'
769
+ device: 'tablet'
770
+
771
+ # Ericy
772
+ Ericy:
773
+ regex: 'Ericy-([a-z0-9]+)'
774
+ device: 'feature phone'
775
+ model: '$1'
776
+
777
+ # Sony Ericsson
778
+ Sony Ericsson:
779
+ regex: 'Sony ?Ericsson|portalmmm/2\.0 K|(?:WT|LT|SO|ST|SK)[0-9]+[a-z]*[0-9]*(?: Build|\))|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build'
780
+ device: 'smartphone'
781
+ models:
782
+ # explicit smartphone models
783
+ - regex: '(?:SonyEricsson)?CK13i'
784
+ model: 'txt'
785
+ - regex: '(?:SonyEricsson)?CK15[ai]'
786
+ model: 'txt pro'
787
+ - regex: '(?:SonyEricsson)?E10[ai]v?'
788
+ model: 'Xperia X10 mini'
789
+ - regex: '(?:SonyEricsson)?E15[ai]v?'
790
+ model: 'Xperia X8'
791
+ - regex: '(?:SonyEricsson)?LT15[ai]v?'
792
+ model: 'Xperia arc'
793
+ - regex: '(?:SonyEricsson)?LT18[ai]v?'
794
+ model: 'Xperia arc S'
795
+ - regex: '(?:SonyEricsson)?X10[ai]v?'
796
+ model: 'Xperia X10'
797
+
798
+ - regex: 'SonyEricsson([a-z0-9]+) Build'
799
+ model: '$1'
800
+ - regex: 'Sony(?: )?Ericsson ?([a-z0-9\-]+)'
801
+ model: '$1'
802
+ - regex: '((?:WT|LT|SO|ST|SK)[0-9]+[a-z]*[0-9]*)(?: Build|\))'
803
+ model: '$1'
804
+ - regex: '(MT[0-9]{2}[a-z]?) Build'
805
+ model: '$1'
806
+ - regex: 'portalmmm/2.0 K([a-z0-9]+)'
807
+ model: 'K$1'
808
+
809
+ # Ericsson
810
+ Ericsson:
811
+ regex: '(?:Ericsson(?:/ )?[a-z0-9]+)|(?:R380 2.0 WAP1.1)'
812
+ device: 'feature phone'
813
+ models:
814
+ - regex: 'Ericsson(?:/ )?([a-z0-9]+)'
815
+ model: '$1'
816
+ - regex: 'R380 2.0 WAP1.1'
817
+ model: 'R380'
818
+
819
+ # eTouch
820
+ eTouch:
821
+ regex: 'eTouch ?([a-z0-9]+)'
822
+ device: 'smartphone'
823
+ model: '$1'
824
+
825
+ # Storex
826
+ Storex:
827
+ regex: "eZee[^a-z]*Tab ?([^;/]*) Build"
828
+ device: 'tablet'
829
+ model: "eZee'Tab$1"
830
+
831
+ # Evertek
832
+ Evertek:
833
+ regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy)[^/;]*) Build'
834
+ device: 'smartphone'
835
+ model: '$1'
836
+
837
+ # Ezze
838
+ Ezze:
839
+ regex: 'EZZE-|EZ[a-z0-9]+'
840
+ device: 'feature phone'
841
+ models:
842
+ - regex: 'EZZE-([a-z0-9]+)'
843
+ model: '$1'
844
+ - regex: 'EZ([a-z0-9]+)'
845
+ model: 'EZ$1'
846
+
847
+ # Ezio
848
+ Ezio:
849
+ regex: 'EZIO-([a-z0-9]+)'
850
+ device: 'feature phone'
851
+ model: '$1'
852
+
853
+ # Gemini
854
+ Gemini:
855
+ regex: '(GEM[0-9]+[a-z]*)'
856
+ device: 'tablet'
857
+ model: '$1'
858
+
859
+ # Gigabyte
860
+ Gigabyte:
861
+ regex: 'GSmart [a-z0-9 ]+ Build|Gigabyte-[a-z0-9]+'
862
+ device: 'smartphone'
863
+ models:
864
+ - regex: '(GSmart [a-z0-9 ]+) Build'
865
+ model: '$1'
866
+ - regex: 'Gigabyte-([a-z0-9]+)'
867
+ model: '$1'
868
+
869
+ # Gigaset
870
+ Gigaset:
871
+ regex: 'Gigaset QV(1030|830)'
872
+ device: 'tablet'
873
+ model: 'Gigaset QV$1'
874
+
875
+ # Gionee
876
+ Gionee:
877
+ regex: 'GIONEE-[a-z0-9]+'
878
+ device: 'smartphone'
879
+ models:
880
+ - regex: 'GIONEE-([a-z0-9]+).*Android'
881
+ model: '$1'
882
+ - regex: 'Android.*GIONEE-([a-z0-9]+)'
883
+ model: '$1'
884
+ - regex: 'GIONEE-([a-z0-9]+)'
885
+ model: '$1'
886
+ device: 'feature phone'
887
+
888
+ # Google
889
+ Google:
890
+ regex: 'Nexus|GoogleTV|Glass'
891
+ device: 'smartphone'
892
+ models:
893
+ - regex: 'Glass'
894
+ model: 'Glass'
895
+ - regex: 'Galaxy Nexus'
896
+ model: 'Galaxy Nexus'
897
+ - regex: '(Nexus (?:S|4|5|6|One))'
898
+ model: '$1'
899
+ - regex: '(Nexus (?:7|9|10))'
900
+ device: 'tablet'
901
+ model: '$1'
902
+ - regex: 'GoogleTV'
903
+ device: 'tv'
904
+ model: 'GoogleTV'
905
+
906
+ # Gradiente
907
+ Gradiente:
908
+ regex: 'GRADIENTE'
909
+ device: 'feature phone'
910
+ models:
911
+ - regex: 'GRADIENTE-([a-z0-9]+)'
912
+ model: '$1'
913
+ - regex: 'GRADIENTE ([a-z0-9\-]+)'
914
+ model: '$1'
915
+
916
+ # Grundig
917
+ Grundig:
918
+ regex: 'GR?-TB[0-9]+[a-z]*|GRUNDIG|portalmmm/2\.0 G'
919
+ device: 'tv'
920
+ models:
921
+ - regex: '(GR?-TB[0-9]+[a-z]*)'
922
+ device: 'tablet'
923
+ model: '$1'
924
+ - regex: 'GRUNDIG ([a-z0-9]+)'
925
+ model: '$1'
926
+ - regex: 'portalmmm/2\.0 G([a-z0-9]+)'
927
+ model: 'G$1'
928
+
929
+ # Haier
930
+ Haier:
931
+ regex: 'Haier'
932
+ device: 'smartphone'
933
+ models:
934
+ - regex: 'Haier[ _-](H[WT]-[^/;]+) Build'
935
+ model: '$1'
936
+ - regex: 'Haier[ _-](H[WT]-[a-z0-9_-]+)'
937
+ model: '$1'
938
+ - regex: 'Haier[ _-](sy[0-9]+)'
939
+ model: '$1'
940
+ - regex: 'Haier[ _-]([a-z0-9\-]+)'
941
+ model: '$1'
942
+ device: 'feature phone'
943
+
944
+ # Huawei
945
+ Huawei:
946
+ regex: '(HW-)?Huawei|Ideos|vodafone[a-z0-9]+'
947
+ device: 'smartphone'
948
+ models:
949
+ - regex: '(MediaPad[^/;]*) Build'
950
+ device: 'tablet'
951
+ model: '$1'
952
+ - regex: 'Ideos([^;/]*) Build'
953
+ model: 'Ideos$1'
954
+ - regex: 'Huawei[ _-]?([^/;]*) Build'
955
+ model: '$1'
956
+ - regex: '(?:HW-)?Huawei(?:/1\.0/0?(?:Huawei))?[_\- /]?([a-z0-9\-_]+)'
957
+ model: '$1'
958
+ - regex: 'Huawei; ([a-z0-9 -]+)'
959
+ model: '$1'
960
+ - regex: 'vodafone([a-z0-9]+)'
961
+ model: 'Vodafone $1'
962
+
963
+ # iBall
964
+ iBall:
965
+ regex: 'iBall[ _]([^/;]*)[ _]Build'
966
+ device: 'tablet'
967
+ model: '$1'
968
+
969
+ iBerry:
970
+ regex: 'AUXUS ([^/;]+) Build'
971
+ device: 'smartphone'
972
+ models:
973
+ - regex: 'AUXUS (Core[^/;]+) Build'
974
+ device: 'tablet'
975
+ model: '$1'
976
+ - regex: 'AUXUS ([^/;]+) Build'
977
+ model: '$1'
978
+
979
+ # Infinix
980
+ Infinix:
981
+ regex: 'Infinix'
982
+ device: 'smartphone'
983
+ models:
984
+ - regex: 'Infinix (X[78]00)'
985
+ device: 'tablet'
986
+ model: '$1'
987
+ - regex: 'Infinix (X\d+)'
988
+ model: '$1'
989
+ - regex: 'Infinix[ _]([a-z0-9_-]+)'
990
+ model: '$1'
991
+
992
+ # Inkti
993
+ Inkti:
994
+ regex: 'intki[ _]([^/;]*)[ _]Build'
995
+ device: 'smartphone'
996
+ model: '$1'
997
+
998
+ # Innostream
999
+ Innostream:
1000
+ regex: 'INNO([a-z0-9]+)'
1001
+ device: 'feature phone'
1002
+ model: 'INNO$1'
1003
+
1004
+ # Inq
1005
+ INQ:
1006
+ regex: 'INQ[/ ]'
1007
+ device: 'feature phone'
1008
+ models:
1009
+ - regex: 'INQ/([a-z0-9\-]+)'
1010
+ model: '$1'
1011
+ - regex: 'INQ ([^;/]+) Build'
1012
+ model: '$1'
1013
+ device: 'smartphone'
1014
+
1015
+ # Intex
1016
+ Intex:
1017
+ regex: 'Intex|(Aqua|Cloud)[ _\.]([^/;\)]+)(?:[ _]Build|(?<!Build)/|\))'
1018
+ device: 'smartphone'
1019
+ models:
1020
+ - regex: 'Intex[ _]([^/;]*)[ _]Build'
1021
+ model: '$1'
1022
+ - regex: '(Aqua|Cloud)[ _\.]([^/;\)]+)(?:[ _]Build|(?<!Build)/|\))'
1023
+ model: '$1 $2'
1024
+ - regex: 'Intex[ _]([a-z0-9_+-]+)'
1025
+ model: '$1'
1026
+
1027
+ # i-mate
1028
+ i-mate:
1029
+ regex: 'i-mate ([a-z0-9]+)'
1030
+ device: 'feature phone'
1031
+ model: '$1'
1032
+
1033
+ # i-mobile
1034
+ i-mobile:
1035
+ regex: 'i-mobile ?[a-z0-9]+'
1036
+ device: 'feature phone'
1037
+ models:
1038
+ - regex: 'i-mobile (i-note[^/;]*) Build'
1039
+ model: '$1'
1040
+ device: 'tablet'
1041
+ - regex: 'i-mobile ((?:IQ|i-style)[^/;]*) Build'
1042
+ model: '$1'
1043
+ device: 'smartphone'
1044
+ - regex: 'i-mobile(?: )?([a-z0-9\- ]+) Build'
1045
+ model: '$1'
1046
+ - regex: 'i-mobile(?: )?([a-z0-9]+)'
1047
+ model: '$1'
1048
+
1049
+ # ikomo
1050
+ iKoMo:
1051
+ regex: 'iKoMo ([a-z0-9]+)'
1052
+ device: 'feature phone'
1053
+ model: '$1'
1054
+
1055
+ # iTel
1056
+ iTel:
1057
+ regex: 'itel|iNote'
1058
+ device: 'smartphone'
1059
+ models:
1060
+ - regex: 'iNote ([^/;]*)Build'
1061
+ model: 'iNote $1'
1062
+ - regex: 'iNote_([a-z0-9\-_]+)'
1063
+ model: 'iNote $1'
1064
+ - regex: 'iTel ([^/;]*)Build'
1065
+ model: '$1'
1066
+ - regex: 'iTel_([a-z0-9\-_]*)'
1067
+ model: '$1'
1068
+
1069
+ #Jiayu
1070
+ Jiayu:
1071
+ regex: '(JY-[a-z0-9]+) Build'
1072
+ device: 'smartphone'
1073
+ model: '$1'
1074
+
1075
+ # Jolla
1076
+ Jolla:
1077
+ regex: 'Jolla'
1078
+ device: 'smartphone'
1079
+ model: ''
1080
+
1081
+ # Kazam
1082
+ Kazam:
1083
+ regex: 'Kazam ([^;/]+) Build|Trooper_X[0-9][0-9] Build'
1084
+ device: 'smartphone'
1085
+ models:
1086
+ - regex: 'Trooper_X([0-9])([0-9]) Build'
1087
+ model: 'Trooper X$1.$2'
1088
+ - regex: 'Kazam ([^;/]+) Build'
1089
+ model: '$1'
1090
+
1091
+ # KT-Tech
1092
+ KT-Tech:
1093
+ regex: '(KM-[a-z0-9]+|EV-[a-z0-9]+) Build'
1094
+ device: 'smartphone'
1095
+ model: '$1'
1096
+
1097
+ # kddi
1098
+ KDDI:
1099
+ regex: 'kddi-([a-z0-9]+)'
1100
+ device: 'feature phone'
1101
+ model: '$1'
1102
+
1103
+ #k-touch
1104
+ K-Touch:
1105
+ regex: 'K-Touch[ _][a-z0-9]+'
1106
+ device: 'smartphone'
1107
+ models:
1108
+ - regex: 'K-Touch[ _]([^/;]*)[ _]Build'
1109
+ model: '$1'
1110
+ - regex: 'K-Touch[ _]([a-z0-9]+)'
1111
+ model: '$1'
1112
+
1113
+ # kyocera
1114
+ Kyocera:
1115
+ regex: 'Kyocera|KWC-|QC-|C5170|C5155|C5215|C6750|C6522N?|S2151'
1116
+ device: 'smartphone'
1117
+ models:
1118
+ # explicit smartphone models
1119
+ - regex: 'C5155'
1120
+ model: 'Rise'
1121
+ - regex: 'C5170'
1122
+ model: 'Hydro'
1123
+ - regex: 'C5215'
1124
+ model: 'Hydro EDGE'
1125
+ - regex: 'C6522N?'
1126
+ model: 'Hydro XTRM'
1127
+ - regex: 'C6750'
1128
+ model: 'Hydro ELITE'
1129
+
1130
+ # explicit feature phone models
1131
+ - regex: 'S2151'
1132
+ model: 'Coast'
1133
+ device: 'feature phone'
1134
+
1135
+ - regex: 'Kyocera-KZ-([a-z0-9]+)'
1136
+ model: 'KZ $1'
1137
+ - regex: 'Kyocera(?:[\-/])?([a-z0-9]+)'
1138
+ model: '$1'
1139
+ - regex: '(?:KWC|QC)-([a-z0-9]+)'
1140
+ model: '$1'
1141
+
1142
+ # Lava
1143
+ Lava:
1144
+ regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
1145
+ device: 'smartphone'
1146
+ models:
1147
+ - regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
1148
+ model: 'Iris $1'
1149
+
1150
+ # lanix
1151
+ Lanix:
1152
+ regex: 'LANIX-([a-z0-9]+)'
1153
+ device: 'feature phone'
1154
+ model: '$1'
1155
+
1156
+ # lct
1157
+ LCT:
1158
+ regex: 'LCT_([a-z0-9]+)'
1159
+ device: 'feature phone'
1160
+ model: '$1'
1161
+
1162
+ # lenco
1163
+ Lenco:
1164
+ regex: 'Lenco ([^/;]*) Build'
1165
+ device: 'tablet'
1166
+ model: '$1'
1167
+
1168
+ # lenovo
1169
+ Lenovo:
1170
+ regex: '(?:LNV-)?Lenovo|IdeaTab'
1171
+ device: 'smartphone'
1172
+ models:
1173
+ - regex: 'Lenovo (B[0-9]+[^/;]*) Build'
1174
+ model: 'IdeaTab $1'
1175
+ device: 'tablet'
1176
+ - regex: 'Lenovo ([^/;]*) Build'
1177
+ model: '$1'
1178
+ - regex: '(?:LNV-|Lenovo-)?Lenovo[ \-_]([a-z0-9_+-]+)'
1179
+ model: '$1'
1180
+ - regex: 'IdeaTab[ \-_]?([a-z0-9]+)'
1181
+ model: 'IdeaTab $1'
1182
+ device: 'tablet'
1183
+
1184
+ # lexibook
1185
+ Lexibook:
1186
+ regex: '(MFC[0-9]{3}[a-z]{2,})'
1187
+ device: 'tablet'
1188
+ models:
1189
+ # Explicit tablet models
1190
+ - regex: 'MFC191FR'
1191
+ model: 'Tablet Ultra 3 XL'
1192
+ - regex: 'MFC045FR'
1193
+ model: 'TabTab'
1194
+ - regex: 'MFC163FR'
1195
+ model: 'Tablet Master 3'
1196
+ - regex: 'MFC142FR'
1197
+ model: 'Tablet Kids'
1198
+ - regex: 'MFC250FR'
1199
+ model: 'Tablet Junior'
1200
+ - regex: 'MFC270FR'
1201
+ model: 'Tablet Junior Power Touch'
1202
+ - regex: 'MFC280FR'
1203
+ model: 'Tablet Junior 2'
1204
+ - regex: 'MFC156FR'
1205
+ model: 'Tablet One'
1206
+ - regex: 'MFC155FR'
1207
+ model: 'Tablet Master'
1208
+ - regex: 'MFC157FR'
1209
+ model: 'Tablet Master 2'
1210
+ - regex: 'MFC17[05]FR'
1211
+ model: 'Tablet Ultra'
1212
+ - regex: 'MFC375FR'
1213
+ model: 'Tablet Ultra 2'
1214
+ - regex: 'MFC162FR'
1215
+ model: 'Power Tablet'
1216
+ - regex: 'MFC180FR'
1217
+ model: 'Tablet Advanced'
1218
+ - regex: 'MFC181FR'
1219
+ model: 'Tablet Advanced 2'
1220
+ - regex: 'MFC500FR'
1221
+ model: 'Tablet XL'
1222
+ - regex: 'MFC190BBFR'
1223
+ model: 'Barbie Tablet'
1224
+ - regex: 'MFC195DCFR'
1225
+ model: 'Tablet Disney Cars HD'
1226
+ - regex: 'MFC195FUFR'
1227
+ model: 'Furby Tablet'
1228
+ - regex: 'MFC195DPFR'
1229
+ model: 'Tablet Disney Princesse HD'
1230
+ - regex: 'MFC140FR'
1231
+ model: 'LapTab'
1232
+ - regex: 'MFC141FR'
1233
+ model: 'LapTab 2'
1234
+
1235
+ - regex: '(MFC[0-9]{3}[a-z]{2,})'
1236
+ model: '$1'
1237
+
1238
+ # lg
1239
+ LG:
1240
+ regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|VX[0-9]+'
1241
+ device: 'smartphone'
1242
+ models:
1243
+ - regex: 'LGE_DLNA_SDK|NetCast'
1244
+ device: 'tv'
1245
+ model: 'NetCast'
1246
+ - regex: 'LGE(?: |-LG| LG-AX|-)([a-z0-9]+)'
1247
+ model: '$1'
1248
+ - regex: 'LGE;([a-z0-9\-]+)'
1249
+ model: '$1'
1250
+ - regex: 'LG[ _-](V90.*|Optimus[ _-]Pad.*) Build'
1251
+ device: 'tablet'
1252
+ model: '$1'
1253
+ - regex: 'LG(?:/|-LG| |-)?([^/;]*) Build'
1254
+ model: '$1'
1255
+ - regex: 'LG(?:/|-LG| |-)?([a-z0-9]+)'
1256
+ model: '$1'
1257
+ - regex: 'LG; ([a-z0-9 ]+)'
1258
+ model: '$1'
1259
+ - regex: 'portalmmm/2.0 ((?:KE|KG|KP|L3)[a-z0-9]+)'
1260
+ model: '$1'
1261
+ - regex: '(VX[0-9]+)'
1262
+ model: '$1'
1263
+
1264
+ # Logicom
1265
+ Logicom:
1266
+ regex: '(TAB950|TAB1062|E731|E812|E912|E1031) Build'
1267
+ device: 'tablet'
1268
+ model: '$1'
1269
+
1270
+ # microsoft
1271
+ Microsoft:
1272
+ regex: 'KIN\.(One|Two)'
1273
+ device: 'feature phone'
1274
+ model: 'Kin $1'
1275
+
1276
+ # Konka
1277
+ Konka:
1278
+ regex: 'KONKA[_ ]([a-z0-9]+)'
1279
+ device: 'smartphone'
1280
+ models:
1281
+ # Explicit smartphone models
1282
+ - regex: 'E5660S'
1283
+ model: 'Viva 5660s'
1284
+ - regex: 'W830'
1285
+ model: 'Tango 830'
1286
+ - regex: 'W(9[67]0)'
1287
+ model: 'Expose $1'
1288
+ - regex: 'W990'
1289
+ model: 'Tuxedo 990'
1290
+
1291
+ - regex: 'KONKA[_ ]([a-z0-9]+)'
1292
+ device: 'feature phone'
1293
+ model: '$1'
1294
+
1295
+ # Karbonn
1296
+ Karbonn:
1297
+ regex: '(?:Browser-)?Karbonn'
1298
+ device: 'smartphone'
1299
+ models:
1300
+ - regex: 'Karbonn ([a-z0-9]+) WAP-Browser'
1301
+ model: '$1'
1302
+ device: 'feature phone'
1303
+ - regex: 'WAP Browser-Karbonn ([a-z0-9]+)/'
1304
+ model: '$1'
1305
+ device: 'feature phone'
1306
+ - regex: 'Karbonn_([^;/)]+)'
1307
+ model: '$1'
1308
+ - regex: 'Karbonn ([^;/]+) Build'
1309
+ model: '$1'
1310
+ - regex: 'Karbonn ([^;/]+)/'
1311
+ model: '$1'
1312
+
1313
+ # Sagem
1314
+ Sagem:
1315
+ regex: 'SAGEM|portalmmm/2.0 (?:SG|my)'
1316
+ device: 'smartphone'
1317
+ models:
1318
+ - regex: 'SAGEM-(my[a-z0-9-]+)'
1319
+ model: '$1'
1320
+ device: 'feature phone'
1321
+ - regex: 'SAGEM ([a-z0-9]+)'
1322
+ model: '$1'
1323
+ - regex: 'SAGEM-([a-z0-9\-]+)'
1324
+ model: '$1'
1325
+ - regex: 'portalmmm/2.0 ((?:SG|my)[a-z0-9]+)'
1326
+ model: '$1'
1327
+
1328
+ # Coby Kyros
1329
+ Coby Kyros:
1330
+ regex: '(MID(?:1024|1125|1126|1045|1048|1060|1065|4331|7012|7015A?|7016|7022|7032|7035|7036|7042|7047|7048|7052|7065|7120|8024|8042|8048|8065|8125|8127|8128|9724|9740|9742)) Build'
1331
+ device: 'tablet'
1332
+ model: '$1'
1333
+
1334
+ # Mpman
1335
+ Mpman:
1336
+ regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7) Build'
1337
+ device: 'tablet'
1338
+ models:
1339
+ - regex: '((?:MPQC|MPDC)[0-9]+[^/;]+) Build'
1340
+ model: '$1'
1341
+ - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7) Build'
1342
+ model: '$1'
1343
+ - regex: '(PH(?:150|340|350|360|451|500|520))'
1344
+ model: '$1'
1345
+ device: 'smartphone'
1346
+
1347
+
1348
+ # Manta Multimedia
1349
+ Manta Multimedia:
1350
+ regex: '(MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|1001|1002|1003|1004(?: 3G)?|1005|7802|9701|9702)) Build'
1351
+ device: 'tablet'
1352
+ model: '$1'
1353
+
1354
+ #Medion
1355
+ Medion:
1356
+ regex: 'Medion|(?:MD_)?LIFETAB'
1357
+ device: 'smartphone'
1358
+ models:
1359
+ - regex: '(?:MD_)?LIFETAB_([a-z0-9]+)'
1360
+ device: 'tablet'
1361
+ model: 'Lifetab $1'
1362
+ - regex: 'Medion(?: Smartphone)? ([^/;]+) Build'
1363
+ model: '$1'
1364
+
1365
+ # Memup
1366
+ Memup:
1367
+ regex: 'SlidePad ?([^;/]*) Build'
1368
+ device: 'tablet'
1369
+ model: 'SlidePad $1'
1370
+
1371
+ # mio
1372
+ Mio:
1373
+ regex: 'MIO(?:/)?([a-z0-9]+)'
1374
+ device: 'smartphone'
1375
+ model: '$1'
1376
+
1377
+ # mitsubishi
1378
+ Mitsubishi:
1379
+ regex: 'MITSU|portalmmm/[12]\.0 M'
1380
+ device: 'feature phone'
1381
+ models:
1382
+ - regex: 'MITSU/[a-z0-9.]+ \(([a-z0-9]+)\)'
1383
+ model: '$1'
1384
+ - regex: 'MITSU[ \-]?([a-z0-9]+)'
1385
+ model: '$1'
1386
+ - regex: 'portalmmm/[12]\.0 (M[a-z0-9]+)'
1387
+ model: '$1'
1388
+
1389
+ # Mobistel
1390
+ Mobistel:
1391
+ regex: '(Cynus [^/;]+) Build'
1392
+ device: 'smartphone'
1393
+ model: '$1'
1394
+
1395
+ # motorola
1396
+ Motorola:
1397
+ regex: 'MOT|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\))?(?: Build|\))'
1398
+ device: 'smartphone'
1399
+ models:
1400
+ # Explicit feature phone models
1401
+ - regex: 'MOT-V360'
1402
+ model: 'V360'
1403
+ device: 'feature phone'
1404
+
1405
+ # Explicit smartphone models
1406
+ - regex: '(?:MOT-|Motorola-)?XT300'
1407
+ model: 'Spice'
1408
+ - regex: '(?:MOT-|Motorola-)?XT30[35]'
1409
+ model: 'Motosmart ME'
1410
+ - regex: '(?:MOT-|Motorola-)?XT31[16]'
1411
+ model: 'Fire'
1412
+ - regex: '(?:MOT-|Motorola-)?XT32[01]'
1413
+ model: 'Defy Mini'
1414
+ - regex: '(?:MOT-|Motorola-)?XT3(?:89|90)'
1415
+ model: 'Motosmart'
1416
+ - regex: '(?:MOT-|Motorola-)?XT502'
1417
+ model: 'Quench'
1418
+ - regex: '(?:MOT-|Motorola-)?XT531'
1419
+ model: 'Fire XT'
1420
+ - regex: '(?:MOT-|Motorola-)?XT535'
1421
+ model: 'Defy'
1422
+ - regex: '(?:MOT-|Motorola-)?XT55[567]C?'
1423
+ model: 'Defy XT'
1424
+ - regex: '(?:MOT-|Motorola-)?XT603'
1425
+ model: 'Admiral'
1426
+ - regex: '(?:MOT-|Motorola-)?XT610'
1427
+ model: 'Droid Pro'
1428
+ - regex: '(?:MOT-|Motorola-)?XT615'
1429
+ model: 'Motoluxe'
1430
+ - regex: '(?:MOT-|Motorola-)?XT621'
1431
+ model: 'Primus'
1432
+ - regex: '(?:MOT-|Motorola-)?XT626'
1433
+ model: 'IronRock'
1434
+ - regex: '(?:MOT-|Motorola-)?XT682'
1435
+ model: 'Atrix'
1436
+ - regex: '(?:MOT-|Motorola-)?XT685'
1437
+ model: 'Motoluxe Dual-SIM'
1438
+ - regex: '(?:MOT-|Motorola-)?XT687'
1439
+ model: 'Atrix TV'
1440
+ - regex: '(?:MOT-|Motorola-)?XT720'
1441
+ model: 'Milestone'
1442
+ - regex: '(?:MOT-|Motorola-)?XT800W'
1443
+ model: 'Glam'
1444
+ - regex: '(?:MOT-|Motorola-)?XT860'
1445
+ model: 'Milestone 3'
1446
+ - regex: '(?:MOT-|Motorola-)?XT881'
1447
+ model: 'Electrify 2'
1448
+ - regex: '(?:MOT-|Motorola-)?XT882'
1449
+ model: 'Moto XT882'
1450
+ - regex: '(?:MOT-|Motorola-)?XT88[56]'
1451
+ model: 'Droid RAZR V'
1452
+ - regex: '(?:MOT-|Motorola-)?XT890'
1453
+ model: 'Droid RAZR i'
1454
+ - regex: '(?:MOT-|Motorola-)?XT894'
1455
+ model: 'Droid 4'
1456
+ - regex: '(?:MOT-|Motorola-)?XT897'
1457
+ model: 'Photon Q'
1458
+ - regex: '(?:MOT-|Motorola-)?XT901'
1459
+ model: 'Electrify M'
1460
+ - regex: '(?:MOT-|Motorola-)?XT90[567]'
1461
+ model: 'Droid RAZR M'
1462
+ - regex: '(?:MOT-|Motorola-)?XT910S?'
1463
+ model: 'Droid RAZR'
1464
+ - regex: '(?:MOT-|Motorola-)?XT91[4568]'
1465
+ model: 'Droid RAZR D1'
1466
+ - regex: '(?:MOT-|Motorola-)?XT9(?:19|20)'
1467
+ model: 'Droid RAZR D3'
1468
+ - regex: '(?:MOT-|Motorola-)?XT925'
1469
+ model: 'Droid RAZR HD'
1470
+ - regex: '(?:MOT-|Motorola-)?XT1022'
1471
+ model: 'Moto E'
1472
+ - regex: '(?:MOT-|Motorola-)?XT1030'
1473
+ model: 'Droid Mini'
1474
+ - regex: '(?:MOT-|Motorola-)?XT10(?:28|3[1234])'
1475
+ model: 'Moto G'
1476
+ - regex: '(?:MOT-|Motorola-)?XT10(?:49|5[23568]|60)'
1477
+ model: 'Moto X'
1478
+ - regex: '(?:MOT-|Motorola-)?XT1080'
1479
+ model: 'Droid Ultra'
1480
+
1481
+ - regex: 'Motorola[ _\-]([a-z0-9]+)'
1482
+ model: '$1'
1483
+ - regex: 'MOTORAZR[ _\-]([a-z0-9]+)'
1484
+ model: 'RAZR $1'
1485
+ - regex: 'MOTORIZR[ _\-]([a-z0-9]+)'
1486
+ model: 'RIZR $1'
1487
+ - regex: 'MOT[O]?[_\-]?([a-z0-9.]+)'
1488
+ model: '$1'
1489
+ - regex: '(?<!AN)DROID ?([a-z0-9 ]*) Build'
1490
+ model: 'DROID $1'
1491
+ - regex: '(?<!AN)DROID ?([a-z0-9]+)'
1492
+ model: 'DROID $1'
1493
+ - regex: 'portalmmm/2.0 ((?:E378i|L6|L7|V3)[a-z0-9]+)'
1494
+ model: '$1'
1495
+ - regex: '(XOOM [^;/]*)Build'
1496
+ device: 'tablet'
1497
+ model: '$1'
1498
+ - regex: '(MZ[0-9]{3}) Build'
1499
+ device: 'tablet'
1500
+ model: '$1'
1501
+ - regex: '((?:ME|MB|XT)[0-9]{3,4}(?:\(Defy\))?) Build'
1502
+ model: '$1'
1503
+
1504
+ # myphone
1505
+ MyPhone:
1506
+ regex: '(?:MyPhone|MyPad) .+ Build'
1507
+ device: 'smartphone'
1508
+ models:
1509
+ - regex: 'MyPad (.+) Build'
1510
+ model: 'MyPad $1'
1511
+ device: 'tablet'
1512
+ - regex: 'MyPhone (.+) Build'
1513
+ model: '$1'
1514
+
1515
+ # nec
1516
+ NEC:
1517
+ regex: 'NEC|KGT/2\.0|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N'
1518
+ device: 'smartphone'
1519
+ models:
1520
+ - regex: '(?:NEC-|KGT/2\.0 )([a-z0-9]+)'
1521
+ model: '$1'
1522
+ - regex: 'portalmmm/1\.0 ((?:DB|N)[a-z0-9]+)'
1523
+ model: '$1'
1524
+ - regex: '(?:portalmmm|o2imode)/2\.0[ ,](N[a-z0-9]+)'
1525
+ model: '$1'
1526
+
1527
+ # newgen
1528
+ Newgen:
1529
+ regex: 'NEWGEN\-([a-z0-9]+)'
1530
+ device: 'feature phone'
1531
+ model: '$1'
1532
+
1533
+ # ngm
1534
+ NGM:
1535
+ regex: 'NGM_[a-z0-9]+|(Forward|Dynamic)[ _][^/;]+(?:Build|/)'
1536
+ device: 'smartphone'
1537
+ models:
1538
+ - regex: '((?:Forward|Dynamic)[ _][^/;]+) Build'
1539
+ model: '$1'
1540
+ - regex: '((?:Forward|Dynamic)[ _][^/;]+)/'
1541
+ model: '$1'
1542
+ - regex: 'NGM_([a-z0-9]+)'
1543
+ model: '$1'
1544
+
1545
+ # nexian
1546
+ Nexian:
1547
+ regex: 'S?Nexian'
1548
+ device: 'smartphone'
1549
+ models:
1550
+ - regex: 'S?Nexian[ ]?([a-z0-9\-]+)'
1551
+ model: '$1'
1552
+ - regex: 'S?Nexian-([a-z0-9]+)'
1553
+ model: '$1'
1554
+
1555
+ # o2
1556
+ O2:
1557
+ regex: 'Xda|O2[ \-]|COCOON'
1558
+ device: 'smartphone'
1559
+ models:
1560
+ - regex: '(Xda[ _][a-z0-9_]+)'
1561
+ model: '$1'
1562
+ - regex: '(COCOON)'
1563
+ model: '$1'
1564
+ - regex: 'O2 ([a-z0-9 ]+)'
1565
+ model: '$1'
1566
+ - regex: 'O2-([a-z0-9]+)'
1567
+ model: '$1'
1568
+
1569
+ # onda
1570
+ Onda:
1571
+ regex: 'Onda'
1572
+ device: 'smartphone'
1573
+ models:
1574
+ # explicit tablet models
1575
+ - regex: 'ONDA MID'
1576
+ model: 'MID'
1577
+ device: 'tablet'
1578
+
1579
+ - regex: '([a-z0-9]+)[ _]Onda'
1580
+ model: '$1'
1581
+ - regex: 'Onda ([a-z0-9]+)'
1582
+ model: '$1'
1583
+
1584
+ # oppo
1585
+ OPPO:
1586
+ regex: 'OPPO[ _]?([a-z0-9]+)|X9006'
1587
+ device: 'smartphone'
1588
+ models:
1589
+ - regex: 'OPPO[ _]?([a-z0-9]+)'
1590
+ model: '$1'
1591
+ - regex: 'X9006'
1592
+ model: 'Find 7a'
1593
+
1594
+ # Opsson
1595
+ Opsson:
1596
+ regex: 'Opsson ([^/;]+) Build'
1597
+ device: 'smartphone'
1598
+ model: '$1'
1599
+
1600
+ # orange
1601
+ Orange:
1602
+ regex: 'SPV[ \-]?([a-z0-9]+)|Orange ([^/;]+) Build'
1603
+ device: 'smartphone'
1604
+ models:
1605
+ - regex: 'Orange ([^/;]+) Build'
1606
+ model: '$1'
1607
+ - regex: 'SPV[ \-]?([a-z0-9]+)'
1608
+ model: 'SPV $1'
1609
+
1610
+ # Oysters
1611
+ Oysters:
1612
+ regex: 'Oysters'
1613
+ device: 'tablet'
1614
+ models:
1615
+ - regex: 'Oysters ((?:Arctic|Indian|Atlantic|Pacific)[^/;]+) Build'
1616
+ device: 'smartphone'
1617
+ model: '$1'
1618
+ - regex: 'Oysters ([^/;]+) Build'
1619
+ model: '$1'
1620
+
1621
+ # panasonic
1622
+ Panasonic:
1623
+ regex: 'Panasonic'
1624
+ device: 'smartphone'
1625
+ models:
1626
+ - regex: 'Panasonic MIL DLNA'
1627
+ device: 'tv'
1628
+ model: 'Viera Cast'
1629
+ - regex: 'Panasonic[ \-]?([a-z0-9]+)'
1630
+ model: '$1'
1631
+ - regex: 'portalmmm/2.0 (P[a-z0-9]+)'
1632
+ model: '$1'
1633
+
1634
+ # philips
1635
+ Philips:
1636
+ regex: 'Philips'
1637
+ device: 'smartphone'
1638
+ models:
1639
+ - regex: 'Philips-FISIO ([a-z0-9]+)'
1640
+ model: 'Fisio $1'
1641
+ - regex: 'Philips[ ]?([a-z0-9]+)'
1642
+ model: '$1'
1643
+ - regex: 'Philips-([a-z0-9\-@]+)'
1644
+ model: '$1'
1645
+
1646
+ # phoneOne
1647
+ phoneOne:
1648
+ regex: 'phoneOne[ \-]?([a-z0-9]+)'
1649
+ device: 'smartphone'
1650
+ model: '$1'
1651
+
1652
+ # Rover
1653
+ Rover:
1654
+ regex: 'Rover ([0-9]+)'
1655
+ device: 'feature phone'
1656
+ model: '$1'
1657
+
1658
+ # Siemens
1659
+ Siemens:
1660
+ regex: 'SIEMENS|SIE-|portalmmm/2\.0 SI|S55|SL45i'
1661
+ device: 'smartphone'
1662
+ models:
1663
+ - regex: 'SIEMENS[ \-]([a-z0-9]+)'
1664
+ model: '$1'
1665
+ - regex: 'SIE(?:MENS )?[\-]?([a-z0-9]+)'
1666
+ model: '$1'
1667
+ - regex: '(S55|SL45i)'
1668
+ model: '$1'
1669
+ - regex: 'portalmmm/2.0 (SI[a-z0-9]+)'
1670
+ model: '$1'
1671
+
1672
+ # Samsung
1673
+ Samsung:
1674
+ regex: 'SAMSUNG|SC-(?:02C|04E|01F)|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]'
1675
+ device: 'smartphone'
1676
+ models:
1677
+ # explicit tablet models
1678
+ - regex: '(?:SAMSUNG-)?GT-P1000M?'
1679
+ device: 'tablet'
1680
+ model: 'GALAXY Tab'
1681
+ - regex: '(?:SAMSUNG-)?GT-P3100B?'
1682
+ device: 'tablet'
1683
+ model: 'GALAXY Tab 2 7"'
1684
+ - regex: '(?:SAMSUNG-)?GT-P311[03]'
1685
+ device: 'tablet'
1686
+ model: 'GALAXY Tab 2 7" WiFi'
1687
+ - regex: '(?:SAMSUNG-)?GT-P5100'
1688
+ device: 'tablet'
1689
+ model: 'GALAXY Tab 2 10.1"'
1690
+ - regex: '(?:SAMSUNG-)?GT-P511[03]'
1691
+ device: 'tablet'
1692
+ model: 'GALAXY Tab 2 10.1" WiFi'
1693
+ - regex: '(?:SAMSUNG-)?GT-P5200'
1694
+ device: 'tablet'
1695
+ model: 'GALAXY Tab 3 10.1"'
1696
+ - regex: '(?:SAMSUNG-)?GT-P5210'
1697
+ device: 'tablet'
1698
+ model: 'GALAXY Tab 3 10.1" WiFi'
1699
+ - regex: '(?:SAMSUNG-)?GT-P5220'
1700
+ device: 'tablet'
1701
+ model: 'GALAXY Tab 3 10.1" LTE'
1702
+ - regex: '(?:SAMSUNG-)?GT-P6200'
1703
+ device: 'tablet'
1704
+ model: 'GALAXY Tab 7" Plus'
1705
+ - regex: '(?:SAMSUNG-)?GT-P6201'
1706
+ device: 'tablet'
1707
+ model: 'GALAXY Tab 7" Plus N'
1708
+ - regex: '(?:SAMSUNG-)?GT-P6810'
1709
+ device: 'tablet'
1710
+ model: 'GALAXY Tab 7.7"'
1711
+ - regex: '(?:SAMSUNG-)?GT-P7100'
1712
+ device: 'tablet'
1713
+ model: 'GALAXY Tab 10.1v'
1714
+ - regex: '(?:SAMSUNG-)?GT-P7500'
1715
+ device: 'tablet'
1716
+ model: 'GALAXY Tab 10.1" P7500'
1717
+ - regex: '(?:SAMSUNG-)?SM-P600'
1718
+ device: 'tablet'
1719
+ model: 'GALAXY Note 10.1" 2014 Edition WiFi'
1720
+ - regex: '(?:SAMSUNG-)?SM-P60[12]'
1721
+ device: 'tablet'
1722
+ model: 'GALAXY Note 10.1" 2014 Edition'
1723
+ - regex: '(?:SAMSUNG-)?SM-P605'
1724
+ device: 'tablet'
1725
+ model: 'GALAXY Note 10.1" 2014 Edition LTE'
1726
+ - regex: '(?:SAMSUNG-)?SM-P900'
1727
+ device: 'tablet'
1728
+ model: 'GALAXY NotePRO 12.2" WiFi'
1729
+ - regex: '(?:SAMSUNG-)?SM-P901'
1730
+ device: 'tablet'
1731
+ model: 'GALAXY NotePRO 12.2"'
1732
+ - regex: '(?:SAMSUNG-)?SM-P905'
1733
+ device: 'tablet'
1734
+ model: 'GALAXY NotePRO 12.2" LTE'
1735
+ - regex: '(?:SAMSUNG-)?SM-T110'
1736
+ device: 'tablet'
1737
+ model: 'GALAXY Tab 3 7.0" Lite WiFi'
1738
+ - regex: '(?:SAMSUNG-)?SM-T111'
1739
+ device: 'tablet'
1740
+ model: 'GALAXY Tab 3 7.0" Lite'
1741
+ - regex: '(?:SAMSUNG-)?SM-T2105'
1742
+ device: 'tablet'
1743
+ model: 'GALAXY Tab 3 7.0" Kids'
1744
+ - regex: '(?:SAMSUNG-)?SM-T210R?'
1745
+ device: 'tablet'
1746
+ model: 'GALAXY Tab 3 7.0" WiFi'
1747
+ - regex: '(?:SAMSUNG-)?SM-T21(?:1|7[AS])'
1748
+ device: 'tablet'
1749
+ model: 'GALAXY Tab 3 7.0"'
1750
+ - regex: '(?:SAMSUNG-)?SM-T230(?:NU)?'
1751
+ device: 'tablet'
1752
+ model: 'GALAXY Tab 4 7.0" WiFi'
1753
+ - regex: '(?:SAMSUNG-)?SM-T310'
1754
+ device: 'tablet'
1755
+ model: 'GALAXY Tab 3 8.0" WiFi'
1756
+ - regex: '(?:SAMSUNG-)?SM-T311'
1757
+ device: 'tablet'
1758
+ model: 'GALAXY Tab 3 8.0"'
1759
+ - regex: '(?:SAMSUNG-)?SM-T315'
1760
+ device: 'tablet'
1761
+ model: 'GALAXY Tab 3 8.0" LTE'
1762
+ - regex: '(?:SAMSUNG-)?SM-T520'
1763
+ device: 'tablet'
1764
+ model: 'GALAXY TabPRO 10.1" WiFi'
1765
+ - regex: '(?:SAMSUNG-)?SM-T320'
1766
+ device: 'tablet'
1767
+ model: 'GALAXY TabPRO 8.4" WiFi'
1768
+ - regex: '(?:SAMSUNG-)?SM-T325'
1769
+ device: 'tablet'
1770
+ model: 'GALAXY TabPRO 8.4" LTE'
1771
+ - regex: '(?:SAMSUNG-)?SM-T525'
1772
+ device: 'tablet'
1773
+ model: 'GALAXY TabPRO 10.1" LTE'
1774
+ - regex: '(?:SAMSUNG-)?SM-T530(?:NU)?'
1775
+ device: 'tablet'
1776
+ model: 'GALAXY Tab 4 10.1" WiFi'
1777
+ - regex: '(?:SAMSUNG-)?SM-T900'
1778
+ device: 'tablet'
1779
+ model: 'GALAXY TabPRO 12.2" WiFi'
1780
+
1781
+ # explicit smartphone models
1782
+ - regex: '(?:SAMSUNG-)?SM-C101'
1783
+ model: 'GALAXY S4 zoom'
1784
+ - regex: '(?:SAMSUNG-)?SM-C115'
1785
+ model: 'GALAXY K zoom'
1786
+ - regex: '(?:SAMSUNG-)?SM-G350'
1787
+ model: 'GALAXY CORE Plus'
1788
+ - regex: '(?:SAMSUNG-)?SM-G386F'
1789
+ model: 'GALAXY CORE LTE'
1790
+ - regex: '(?:SAMSUNG-)?SM-G3815'
1791
+ model: 'GALAXY EXPRESS II'
1792
+ - regex: '(?:SAMSUNG-)?SM-G9009D'
1793
+ model: 'GALAXY S5 Dual-SIM'
1794
+ - regex: '(?:SAMSUNG-)?SM-G900'
1795
+ model: 'GALAXY S5'
1796
+ - regex: '(?:SAMSUNG-)?SM-N7502'
1797
+ model: 'Galaxy Note 3 Neo Duos'
1798
+ - regex: '(?:SAMSUNG-)?SM-N750[L50]?'
1799
+ model: 'Galaxy Note 3 Neo'
1800
+ - regex: '(?:SAMSUNG-)?SM-N9002'
1801
+ model: 'GALAXY Note 3 Duos'
1802
+ - regex: '(?:SAMSUNG-)?SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?'
1803
+ model: 'GALAXY Note 3'
1804
+ - regex: '(?:SAMSUNG-)?SM-N910'
1805
+ model: 'GALAXY Note 4'
1806
+ - regex: '(?:SAMSUNG-)?SM-N915'
1807
+ model: 'GALAXY Note 4 Edge'
1808
+
1809
+ # general detections
1810
+ - regex: '(?:SAMSUNG-)?(GT-(P|N8|N5)[0-9]+[a-z]?)'
1811
+ device: 'tablet'
1812
+ model: '$1'
1813
+ - regex: 'SC-02C'
1814
+ model: 'GALAXY S II'
1815
+ - regex: 'SC-01F'
1816
+ model: 'GALAXY Note 3'
1817
+ - regex: 'SC-04E'
1818
+ model: 'GALAXY S4'
1819
+ - regex: '(?:SAMSUNG-)?((?:SM-[TNP]|GT-P)[a-z0-9_-]+)'
1820
+ device: 'tablet'
1821
+ model: '$1'
1822
+ - regex: '((?:SCH|SGH|SPH|SHV|SHW|GT|SM)-[a-z0-9_-]+)'
1823
+ model: '$1'
1824
+ - regex: 'SAMSUNG[\-][ ]?([a-z0-9]+[\-_][a-z0-9]+)'
1825
+ model: '$1'
1826
+ - regex: 'SAMSUNG;[ ]?([a-z0-9]+[\-_][a-z0-9]+)'
1827
+ model: '$1'
1828
+ - regex: 'SAMSUNG[ _/-]?([a-z0-9\-]+)'
1829
+ model: '$1'
1830
+ - regex: 'SAMSUNG;[ ]?([a-z0-9 ]+)'
1831
+ model: '$1'
1832
+ - regex: 'SEC-([a-z0-9]+)'
1833
+ model: '$1'
1834
+ - regex: 'SAM-([a-z0-9]+)'
1835
+ model: 'SCH-$1'
1836
+ - regex: 'SMART-TV'
1837
+ device: 'tv'
1838
+ model: 'Smart TV'
1839
+ - regex: 'Galaxy ([^/;]+) Build'
1840
+ model: 'GALAXY $1'
1841
+ - regex: 'Galaxy ([a-z0-9]+)'
1842
+ model: 'GALAXY $1'
1843
+ - regex: '(?:portalmmm|o2imode)/2\.0 ([SZ][a-z0-9]+)'
1844
+ model: '$1'
1845
+ - regex: 'sam([rua][0-9]+)'
1846
+ model: 'SCH-$1'
1847
+
1848
+ # SuperSonic
1849
+ SuperSonic:
1850
+ regex: '(SC-[0-9]+[a-z]+)'
1851
+ device: 'tablet'
1852
+ model: '$1'
1853
+
1854
+ # Sumvision
1855
+ Sumvision:
1856
+ regex: '(Cyclone [^/;]+) Build'
1857
+ device: 'tablet'
1858
+ model: '$1'
1859
+
1860
+ # pantech
1861
+ Pantech:
1862
+ regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+ Build|ADR910L'
1863
+ device: 'smartphone'
1864
+ models:
1865
+ # explicit smartphone models
1866
+ - regex: 'ADR910L'
1867
+ model: 'Star Q'
1868
+
1869
+ - regex: 'Pantech[ \-]?([a-z0-9]+)'
1870
+ model: '$1'
1871
+ - regex: 'Pantech_([a-z0-9\-]+)'
1872
+ model: '$1'
1873
+ - regex: '(P[GTN]-[a-z0-9]+)'
1874
+ model: '$1'
1875
+ - regex: '(TX[T]?[0-9]+)'
1876
+ model: '$1'
1877
+ - regex: '(IM-[a-z0-9]+) Build'
1878
+ model: '$1'
1879
+
1880
+ #Polaroid
1881
+ Polaroid:
1882
+ regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+ Build|MID(?:1014|0714)'
1883
+ device: 'tablet'
1884
+ models:
1885
+ - regex: '(MID(?:1014|0714))'
1886
+ model: '$1'
1887
+ - regex: '((?:PMID|MIDC)[0-9a-z]+) Build'
1888
+ model: '$1'
1889
+ - regex: 'Polaroid'
1890
+ model: ''
1891
+
1892
+ # PolyPad
1893
+ PolyPad:
1894
+ regex: 'POLY ?PAD'
1895
+ device: 'tablet'
1896
+ models:
1897
+ - regex: 'POLY ?PAD[_ \.]([a-z0-9]+) Build'
1898
+ model: '$1'
1899
+ - regex: 'POLY ?PAD[_\.]([a-z0-9]+)'
1900
+ model: '$1'
1901
+
1902
+ # Positivo
1903
+ Positivo:
1904
+ regex: 'YPY_S450'
1905
+ device: 'smartphone'
1906
+ models:
1907
+ - regex: 'YPY_S450'
1908
+ model: 'YPY S450'
1909
+
1910
+ # Prestigio
1911
+ Prestigio:
1912
+ regex: '(?:PMP|PAP)[0-9]+[a-z0-9_]+ Build'
1913
+ device: 'tablet'
1914
+ models:
1915
+ - regex: '(PMP[0-9]+[a-z0-9_]+) Build'
1916
+ model: '$1'
1917
+ - regex: '(PAP[0-9]+[a-z0-9_]+) Build'
1918
+ model: '$1'
1919
+ device: 'smartphone'
1920
+
1921
+ # Sanyo
1922
+ Sanyo:
1923
+ regex: 'Sanyo|MobilePhone[ ;]'
1924
+ device: 'feature phone'
1925
+ models:
1926
+ # explicit feature phone models
1927
+ - regex: 'SCP-?6750'
1928
+ model: 'Katana Eclipse X'
1929
+ - regex: 'SCP-?6760'
1930
+ model: 'Incognito'
1931
+ - regex: 'SCP-?6780'
1932
+ model: 'Innuendo'
1933
+
1934
+ - regex: 'SANYO[ \-_]([a-z0-9\-]+)'
1935
+ model: '$1'
1936
+ - regex: 'MobilePhone ([a-z0-9\-]+)'
1937
+ model: '$1'
1938
+
1939
+ # Qilive
1940
+ Qilive:
1941
+ regex: 'Qilive [0-9][^;/]*'
1942
+ device: 'smartphone'
1943
+ models:
1944
+ - regex: 'Qilive ([0-5][^;/]*) Build'
1945
+ model: '$1'
1946
+ - regex: 'Qilive ([0-5][^;/]*)/'
1947
+ model: '$1'
1948
+ - regex: 'Qilive ([6-9][^;/]*) Build'
1949
+ model: '$1'
1950
+ device: 'tablet'
1951
+ - regex: 'Qilive ([6-9][^;/]*)/'
1952
+ model: '$1'
1953
+ device: 'tablet'
1954
+
1955
+ # Quechua
1956
+ Quechua:
1957
+ regex: 'Quechua Phone 5'
1958
+ device: 'smartphone'
1959
+ model: 'Quechua Phone 5'
1960
+
1961
+ # Ramos
1962
+ Ramos:
1963
+ regex: 'Ramos ?([^/;]+) Build'
1964
+ device: 'tablet'
1965
+ model: '$1'
1966
+
1967
+ # Sendo
1968
+ Sendo:
1969
+ regex: 'Sendo([a-z0-9]+)'
1970
+ device: 'feature phone'
1971
+ model: '$1'
1972
+
1973
+ # Spice
1974
+ Spice:
1975
+ regex: 'Spice'
1976
+ device: 'smartphone'
1977
+ models:
1978
+ - regex: 'Spice[ _-]?([^/;]+)(?:[\)]| Build)'
1979
+ model: '$1'
1980
+ - regex: 'Spice[ _-]?([^/;]+)(?:/|$)'
1981
+ model: '$1'
1982
+
1983
+ # Sharp
1984
+ Sharp:
1985
+ regex: 'SHARP|SBM|SH-[0-9]+[a-z]? Build|AQUOS'
1986
+ device: 'smartphone'
1987
+ models:
1988
+ # explicit smartphone models
1989
+ - regex: 'SH-02E'
1990
+ model: 'Aquos Phone Zeta'
1991
+ - regex: 'SH06D'
1992
+ model: 'Aquos Phone SH-06D'
1993
+
1994
+ # explicit tablet models
1995
+ - regex: 'SH-08E'
1996
+ device: 'tablet'
1997
+ model: 'Sharp Aquos Pad'
1998
+
1999
+ - regex: 'SHARP-AQUOS|AQUOSBrowser'
2000
+ device: 'tv'
2001
+ model: 'Aquos Net Plus'
2002
+ - regex: 'SHARP[ \-]([a-z0-9\-]+)'
2003
+ model: '$1'
2004
+ - regex: '(?:SHARP|SBM)([a-z0-9]+)'
2005
+ model: '$1'
2006
+ - regex: '(SH-[0-9]+[a-z]?) Build'
2007
+ model: '$1'
2008
+
2009
+ # Softbank
2010
+ Softbank:
2011
+ regex: 'Softbank|J-PHONE'
2012
+ device: 'smartphone'
2013
+ models:
2014
+ - regex: 'Softbank/[12]\.0/([a-z0-9]+)'
2015
+ model: '$1'
2016
+ - regex: '([a-z0-9]+);Softbank;'
2017
+ model: '$1'
2018
+ - regex: 'J-PHONE/[0-9]\.[0-9]/([a-z0-9\-]+)'
2019
+ model: '$1'
2020
+
2021
+ # Sony
2022
+ Sony:
2023
+ regex: 'Sony(?! ?Ericsson)|SGP|Xperia|C1[569]0[45]|C2[01]0[45]|C2305|C530[236]|C5502|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D530[36]|D5322|D5503|D65(?:0[23]|43)|LT22i|XL39H'
2024
+ device: 'smartphone'
2025
+ models:
2026
+ # explicit smartphone models
2027
+ - regex: '(?:Sony)?C150[45]'
2028
+ model: 'Xperia E'
2029
+ - regex: '(?:Sony)?C160[45]'
2030
+ model: 'Xperia E Dual'
2031
+ - regex: '(?:Sony)?C190[45]'
2032
+ model: 'Xperia M'
2033
+ - regex: '(?:Sony)?C200[45]'
2034
+ model: 'Xperia M Dual'
2035
+ - regex: '(?:Sony)?C210[45]'
2036
+ model: 'Xperia L'
2037
+ - regex: '(?:Sony)?C2305'
2038
+ model: 'Xperia C'
2039
+ - regex: '(?:Sony)?C530[236]'
2040
+ model: 'Xperia SP'
2041
+ - regex: '(?:Sony)?C5502'
2042
+ model: 'Xperia ZR'
2043
+ - regex: '(?:Sony)?C650[236]'
2044
+ model: 'Xperia ZL'
2045
+ - regex: '(?:Sony)?C66(?:0[236]|16)'
2046
+ model: 'Xperia Z'
2047
+ - regex: '(?:Sony)?(?:C68(?:0[26]|[34]3)|XL39H)'
2048
+ model: 'Xperia Z Ultra'
2049
+ - regex: '(?:Sony)?C69(?:0[236]|16|43)'
2050
+ model: 'Xperia Z1'
2051
+ - regex: '(?:Sony)?D200[45]'
2052
+ model: 'Xperia E1'
2053
+ - regex: '(?:Sony)?D21(?:0[45]|14)'
2054
+ model: 'Xperia E1 Dual'
2055
+ - regex: '(?:Sony)?D22(?:0[236]|43)'
2056
+ model: 'Xperia E3'
2057
+ - regex: '(?:Sony)?D2212'
2058
+ model: 'Xperia E3 Dual'
2059
+ - regex: '(?:Sony)?D2302'
2060
+ model: 'Xperia M2 Dual'
2061
+ - regex: '(?:Sony)?D230[356]'
2062
+ model: 'Xperia M2'
2063
+ - regex: '(?:Sony)?D530[36]'
2064
+ model: 'Xperia T2 Ultra'
2065
+ - regex: '(?:Sony)?D5322'
2066
+ model: 'Xperia T2 Ultra Dual'
2067
+ - regex: '(?:Sony)?D5503'
2068
+ model: 'Xperia Z1 Compact'
2069
+ - regex: '(?:Sony)?D65(?:0[23]|43)'
2070
+ model: 'Xperia Z2'
2071
+
2072
+ # explicit tablet models
2073
+ - regex: 'SGP(?:311|312|321) Build'
2074
+ model: 'Xperia Tablet Z'
2075
+ device: 'tablet'
2076
+ - regex: 'SGP(?:511|512|521) Build'
2077
+ model: 'Xperia Tablet Z2'
2078
+ device: 'tablet'
2079
+ - regex: 'SGP(?:6[24]1) Build'
2080
+ model: 'Xperia Tablet Z3 Compact'
2081
+ device: 'tablet'
2082
+ - regex: 'SGPT(?:12|121|122|123|13|131|132|133) Build'
2083
+ model: 'Xperia Tablet S'
2084
+ device: 'tablet'
2085
+
2086
+ # general detections
2087
+ - regex: 'Sony (Tablet[^/;]*) Build'
2088
+ model: '$1'
2089
+ device: 'tablet'
2090
+ - regex: '(SGP[^/;]*) Build'
2091
+ model: '$1'
2092
+ device: 'tablet'
2093
+ - regex: 'Xperia ([^/;]*Tablet[^/;]*) Build'
2094
+ model: 'Xperia $1'
2095
+ device: 'tablet'
2096
+ - regex: 'Xperia ([^;/]+) Build'
2097
+ model: 'Xperia $1'
2098
+ - regex: 'Sony[ ]?([^/;]*) Build'
2099
+ model: '$1'
2100
+ - regex: 'Sony[ ]?([a-z0-9\-]+)'
2101
+ model: '$1'
2102
+
2103
+ # Kindle
2104
+ Kindle:
2105
+ regex: 'KF(?:OT|TT|JWI|JWA|SOWI|APWI|THWI) Build|Kindle|Silk/\d+\.\d+'
2106
+ device: 'tablet'
2107
+ models:
2108
+ - regex: 'KFTT Build'
2109
+ model: 'Kindle Fire HD'
2110
+ - regex: 'KFJWI Build'
2111
+ model: 'Kindle Fire HD 8.9" WiFi'
2112
+ - regex: 'KFJWA Build'
2113
+ model: 'Kindle Fire HD 8.9" 4G'
2114
+ - regex: 'KFSOWI Build'
2115
+ model: 'Kindle Fire HD 7" WiFi'
2116
+ - regex: 'KFTHWI Build'
2117
+ model: 'Kindle Fire HDX 7" WiFi'
2118
+ - regex: 'KFTHWA Build'
2119
+ model: 'Kindle Fire HDX 7" 4G'
2120
+ - regex: 'KFAPWI Build'
2121
+ model: 'Kindle Fire HDX 8.9" WiFi'
2122
+ - regex: 'KFAPWA Build'
2123
+ model: 'Kindle Fire HDX 8.9" 4G'
2124
+ - regex: 'KFOT|Kindle Fire|Silk/\d+\.\d+'
2125
+ model: 'Kindle Fire'
2126
+ - regex: 'Kindle'
2127
+ model: 'Kindle'
2128
+
2129
+ # Symphony
2130
+ Symphony:
2131
+ regex: 'SYMPHONY[ \_]([a-z0-9]+)'
2132
+ device: 'smartphone'
2133
+ model: '$1'
2134
+
2135
+ # Qtek
2136
+ Qtek:
2137
+ regex: 'Qtek[ _]?([a-z0-9]+)'
2138
+ device: 'smartphone'
2139
+ model: '$1'
2140
+
2141
+ # T-Mobile
2142
+ T-Mobile:
2143
+ regex: 'T-Mobile[ _][a-z0-9 ]+'
2144
+ device: 'smartphone'
2145
+ models:
2146
+ - regex: 'T-Mobile[ _]([a-z0-9_ ]+) Build'
2147
+ model: '$1'
2148
+ - regex: 'T-Mobile[ _]([a-z0-9_ ]+)'
2149
+ model: '$1'
2150
+
2151
+ # Tcl
2152
+ TCL:
2153
+ regex: 'TCL-([a-z0-9]+)'
2154
+ device: 'smartphone'
2155
+ model: '$1'
2156
+
2157
+ # Tecno Mobile
2158
+ Tecno Mobile:
2159
+ regex: 'Tecno'
2160
+ device: 'smartphone'
2161
+ models:
2162
+ - regex: 'Tecno ([^;/]+) Build'
2163
+ model: '$1'
2164
+ - regex: 'Tecno_?([a-z0-9_-]+)'
2165
+ model: '$1'
2166
+
2167
+ # teXet
2168
+ teXet:
2169
+ regex: '(NaviPad [^/;]*) Build'
2170
+ device: 'tablet'
2171
+ model: '$1'
2172
+
2173
+ # Telit
2174
+ Telit:
2175
+ regex: 'Telit'
2176
+ device: 'feature phone'
2177
+ models:
2178
+ - regex: 'Telit_Mobile_Terminals-([a-z0-9]+)'
2179
+ model: '$1'
2180
+ - regex: 'Telit[\-_]?([a-z0-9]+)'
2181
+ model: '$1'
2182
+
2183
+ # Tianyu
2184
+ TIANYU:
2185
+ regex: 'TIANYU'
2186
+ device: 'feature phone'
2187
+ models:
2188
+ - regex: 'TIANYU ([a-z0-9]+)'
2189
+ model: '$1'
2190
+ - regex: 'TIANYU-KTOUCH/([a-z0-9]+)'
2191
+ model: '$1'
2192
+
2193
+ # Tolino
2194
+ Tolino:
2195
+ regex: 'Tolino Tab ([^/;]+) Build'
2196
+ device: 'tablet'
2197
+ model: 'Tolino Tab $1'
2198
+
2199
+ # Toplux
2200
+ Toplux:
2201
+ regex: 'Toplux ([a-z0-9]+)'
2202
+ device: 'feature phone'
2203
+ model: '$1'
2204
+
2205
+ #TVC
2206
+ TVC:
2207
+ regex: '(NuclearSX-SP5)'
2208
+ device: 'smartphone'
2209
+ model: 'Nuclear SX-SP5'
2210
+
2211
+ # UTStarcom
2212
+ UTStarcom:
2213
+ regex: 'utstar[ _-]?([a-z0-9]+)'
2214
+ device: 'feature phone'
2215
+ model: '$1'
2216
+
2217
+ # ViewSonic
2218
+ ViewSonic:
2219
+ regex: 'ViewSonic|VSD[0-9]+ Build'
2220
+ device: 'smart display'
2221
+ models:
2222
+ - regex: 'ViewSonic-ViewPad([a-z0-9]+) Build'
2223
+ model: 'ViewPad $1'
2224
+ device: 'tablet'
2225
+ - regex: '(VSD[0-9]+) Build'
2226
+ model: '$1'
2227
+
2228
+ # Vitelcom
2229
+ Vitelcom:
2230
+ regex: 'Vitelcom|portalmmm/[12].0 TSM'
2231
+ device: 'feature phone'
2232
+ models:
2233
+ - regex: 'TSM-([a-z0-9]+)'
2234
+ model: '$1'
2235
+ - regex: 'TSM([a-z0-9\-]+)'
2236
+ model: '$1'
2237
+ - regex: 'portalmmm/[12].0 (TSM[a-z0-9 ]+)'
2238
+ model: '$1'
2239
+
2240
+ # VK Mobile
2241
+ VK Mobile:
2242
+ regex: 'VK[\-]?([a-z0-9 ]+)'
2243
+ device: 'feature phone'
2244
+ model: '$1'
2245
+
2246
+ # Vertu
2247
+ Vertu:
2248
+ regex: 'Vertu[ ]?([a-z0-9]+)'
2249
+ device: 'feature phone'
2250
+ model: '$1'
2251
+
2252
+ # Videocon
2253
+ Videocon:
2254
+ regex: 'Videocon[_ ]([a-z0-9]+)'
2255
+ device: 'smartphone'
2256
+ model: '$1'
2257
+
2258
+ # Voxtel
2259
+ Voxtel:
2260
+ regex: 'Voxtel_([a-z0-9]+)'
2261
+ device: 'feature phone'
2262
+ model: '$1'
2263
+
2264
+ # Wellcom
2265
+ WellcoM:
2266
+ regex: 'WELLCOM[ _\-/]([a-z0-9]+)'
2267
+ device: 'smartphone'
2268
+ model: '$1'
2269
+
2270
+ # Wiko
2271
+ Wiko:
2272
+ regex: '(?:Wiko-)?(?:CINK|IGGY|Stairway|Rainbow|Highway|Darkside|Darkmoon|Darkfull|Darknight|Sublim|Ozzy|Barry)'
2273
+ device: 'smartphone'
2274
+ models:
2275
+ - regex: '(?:Wiko-)?CINK(.*) Build'
2276
+ model: 'Cink$1'
2277
+ - regex: '(?:Wiko-)?CINK[ _-]([a-z0-9]+)'
2278
+ model: 'Cink $1'
2279
+ - regex: '(?:Wiko-)?IGGY(.*) Build'
2280
+ model: 'Iggy$1'
2281
+ - regex: '(?:Wiko-)?IGGY[ _-]([a-z0-9]+)'
2282
+ model: 'Iggy $1'
2283
+ - regex: 'Stairway'
2284
+ model: 'Stairway'
2285
+ - regex: 'Highway'
2286
+ model: 'Highway'
2287
+ - regex: 'Rainbow'
2288
+ model: 'Rainbow'
2289
+ - regex: 'Darkside'
2290
+ model: 'Darkside'
2291
+ - regex: 'Darkmoon'
2292
+ model: 'Darkmoon'
2293
+ - regex: 'Darkfull'
2294
+ model: 'Darkfull'
2295
+ - regex: 'Darknight'
2296
+ model: 'Darknight'
2297
+ - regex: 'Sublim'
2298
+ model: 'Sublim'
2299
+ - regex: 'Ozzy'
2300
+ model: 'Ozzy'
2301
+ - regex: 'Barry'
2302
+ model: 'Barry'
2303
+
2304
+ # Wolder
2305
+ Wolder:
2306
+ regex: 'miSmart|miTab'
2307
+ device: 'smartphone'
2308
+ models:
2309
+ - regex: 'miSmart[ -_]?([^/]+) Build'
2310
+ model: 'miSmart $1'
2311
+ - regex: 'miTab[ -_]?([^/]+) Build'
2312
+ device: 'tablet'
2313
+ model: 'miTab $1'
2314
+
2315
+ # Wonu
2316
+ Wonu:
2317
+ regex: 'Wonu ([a-z0-9]+)'
2318
+ device: 'feature phone'
2319
+ model: '$1'
2320
+
2321
+ # Woxter
2322
+ Woxter:
2323
+ regex: 'Woxter (.+) Build'
2324
+ device: 'tablet'
2325
+ model: '$1'
2326
+
2327
+ #Xiaomi
2328
+ Xiaomi:
2329
+ regex: '(MI [a-z0-9]+|MI-One[ _]Plus) Build'
2330
+ device: 'smartphone'
2331
+ model: '$1'
2332
+
2333
+ #Yuandao
2334
+ Yuandao:
2335
+ regex: 'N101[ _]DUAL(?:[ _]CORE)?(?:[ _]?2|\|\|)?(?:[ _]V11)? Build'
2336
+ device: 'tablet'
2337
+ model: 'N101'
2338
+
2339
+ # Zonda
2340
+ Zonda:
2341
+ regex: '(ZM(?:CK|EM|TFTV|TN)[a-z0-9]+)'
2342
+ device: 'feature phone'
2343
+ model: '$1'
2344
+
2345
+ # Toshiba
2346
+ Toshiba:
2347
+ regex: 'Toshiba|portalmmm/[12].0 TS'
2348
+ device: 'smartphone'
2349
+ models:
2350
+ - regex: 'Toshiba[ /_\-]?([a-z0-9_ -]+) Build'
2351
+ model: '$1'
2352
+ - regex: 'Toshiba[ /_\-]?([a-z0-9_-]+)'
2353
+ model: '$1'
2354
+ - regex: 'portalmmm/[12].0 (TS[a-z0-9 ]+)'
2355
+ model: '$1'
2356
+
2357
+ # Fly
2358
+ Fly:
2359
+ regex: 'Fly(?!Flow|touch)|MERIDIAN-'
2360
+ device: 'smartphone'
2361
+ models:
2362
+ - regex: 'Fly[ _\-]?([a-z0-9_]+)/'
2363
+ model: '$1'
2364
+ device: 'feature phone'
2365
+ - regex: 'Flylife[ _\-]?(.*) Build'
2366
+ model: 'Flylife $1'
2367
+ device: 'tablet'
2368
+ - regex: 'Fly[ _\-]?([a-z0-9]+)'
2369
+ model: '$1'
2370
+ - regex: 'MERIDIAN-([a-z0-9]+)'
2371
+ model: '$1'
2372
+
2373
+ # Web TV
2374
+ Web TV:
2375
+ regex: 'WebTV/(\d+\.\d+)'
2376
+ device: 'tv'
2377
+ model: ''
2378
+
2379
+ # Zopo
2380
+ Zopo:
2381
+ regex: '(?:ZOPO[_ ])?(ZP[0-9]{2,}[^/;]+) Build'
2382
+ device: 'smartphone'
2383
+ model: '$1'
2384
+
2385
+ # ZTE
2386
+ ZTE:
2387
+ regex: 'ZTE|Z331|N799D|([a-z0-9]+)_USA_Cricket'
2388
+ device: 'smartphone'
2389
+ models:
2390
+ # Explicit smartphone models
2391
+ - regex: 'N799D'
2392
+ model: 'MTS Blaze 4'
2393
+
2394
+ - regex: '([a-z0-9]+)_USA_Cricket'
2395
+ model: '$1'
2396
+ - regex: 'ZTE[\- ](V98|V96A|V81|V70) Build'
2397
+ model: '$1'
2398
+ device: 'tablet'
2399
+ - regex: 'ZTE[\- ]([a-z0-9\-_ ]+) Build'
2400
+ model: '$1'
2401
+ - regex: 'ZTE-(?:G |G-)?([a-z0-9 _]+)'
2402
+ model: '$1'
2403
+ - regex: 'ZTE[ _]([a-z0-9]+)'
2404
+ model: '$1'
2405
+ - regex: 'Z331'
2406
+ model: 'Z331'
2407
+
2408
+ # Symbian to Nokia ??
2409
+ # Change name from Nokia to other to not change above Nokia element
2410
+ #Nokia:
2411
+ # regex: 'Symbian'
2412
+ # device: 'feature phone'