--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
Dear Release Team,
Please consider unblocking package uap-core
This is a new release that fixes a A Regular Expression Denial of
Service (ReDoS) bug: CVE-2018-20164.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=922717
I've attached the output from debdiff between the versions in testing
and unstable.
Thanks,
Edward Betts
unblock uap-core/20190213-2
diff -Nru uap-core-20181019/CONTRIBUTING.md uap-core-20190213/CONTRIBUTING.md
--- uap-core-20181019/CONTRIBUTING.md 2018-10-19 17:08:22.000000000 +0100
+++ uap-core-20190213/CONTRIBUTING.md 2019-02-13 17:27:26.000000000 +0000
@@ -10,9 +10,10 @@
* `tests/test_device.yaml`
* `tests/test_os.yaml`
* `tests/test_ua.yaml`
-5. Push your branch to GitHub and submit a pull request
-6. Monitor the pull request to make sure the Travis build succeeds. If it
fails simply make the necessary changes to your branch and push it. Travis will
re-test the changes.
+5. Check that your regex is not vulnerable to
[ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS)
using the test in `tests/regexes.js`
+6. Push your branch to GitHub and submit a pull request
+7. Monitor the pull request to make sure the Travis build succeeds. If it
fails simply make the necessary changes to your branch and push it. Travis will
re-test the changes.
That's it. If you don't feel comfortable forking the project or modifying the
YAML you can also [submit an
issue](https://github.com/ua-parser/uap-core/issues) that includes the
appropriate user agent string and the expected results of parsing.
-Thanks!
\ No newline at end of file
+Thanks!
diff -Nru uap-core-20181019/debian/changelog uap-core-20190213/debian/changelog
--- uap-core-20181019/debian/changelog 2018-11-08 17:24:23.000000000 +0000
+++ uap-core-20190213/debian/changelog 2019-03-20 17:14:03.000000000 +0000
@@ -1,3 +1,19 @@
+uap-core (20190213-2) unstable; urgency=high
+
+ * The previous release was mistakenly based on 20180219-1, meaning that
+ the changes in 20180503-1 and 20181019-1 were missing.
+ * Restore missing changes. Closes: #924969
+
+ -- Edward Betts <edw...@4angle.com> Wed, 20 Mar 2019 17:14:03 +0000
+
+uap-core (20190213-1) unstable; urgency=high
+
+ * New upstream release Closes: #922717
+ - CVE-2018-20164: Regular Expression Denial of Service
+ * debian/control: update Standards-Version
+
+ -- Edward Betts <edw...@4angle.com> Tue, 05 Mar 2019 12:29:24 +0000
+
uap-core (20181019-1) unstable; urgency=medium
* New upstream release
diff -Nru uap-core-20181019/debian/control uap-core-20190213/debian/control
--- uap-core-20181019/debian/control 2018-11-08 17:24:23.000000000 +0000
+++ uap-core-20190213/debian/control 2019-03-20 17:14:03.000000000 +0000
@@ -3,7 +3,7 @@
Priority: optional
Maintainer: Edward Betts <edw...@4angle.com>
Build-Depends: debhelper (>= 11)
-Standards-Version: 4.2.1
+Standards-Version: 4.3.0
Homepage: https://github.com/ua-parser/uap-core
Package: uap-core
diff -Nru uap-core-20181019/.gitignore uap-core-20190213/.gitignore
--- uap-core-20181019/.gitignore 2018-10-19 17:08:22.000000000 +0100
+++ uap-core-20190213/.gitignore 2019-02-13 17:27:26.000000000 +0000
@@ -1,3 +1,5 @@
.DS_Store
node_modules/
package-lock.json
+*.tgz
+*.log
diff -Nru uap-core-20181019/.npmignore uap-core-20190213/.npmignore
--- uap-core-20181019/.npmignore 1970-01-01 01:00:00.000000000 +0100
+++ uap-core-20190213/.npmignore 2019-02-13 17:27:26.000000000 +0000
@@ -0,0 +1,8 @@
+node_modules/
+test_resources/
+tests/
+tmp/
+*.bak
+*.tgz
+*.log
+.*
diff -Nru uap-core-20181019/.npmrc uap-core-20190213/.npmrc
--- uap-core-20181019/.npmrc 1970-01-01 01:00:00.000000000 +0100
+++ uap-core-20190213/.npmrc 2019-02-13 17:27:26.000000000 +0000
@@ -0,0 +1 @@
+package-lock=false
diff -Nru uap-core-20181019/package.json uap-core-20190213/package.json
--- uap-core-20181019/package.json 2018-10-19 17:08:22.000000000 +0100
+++ uap-core-20190213/package.json 2019-02-13 17:27:26.000000000 +0000
@@ -1,7 +1,7 @@
{
"name": "uap-core",
"description": "The regex file necessary to build language ports of
Browserscope's user agent parser.",
- "version": "0.5.0",
+ "version": "0.6.5",
"maintainers": [
{
"name": "Tobie Langel",
@@ -25,11 +25,12 @@
}
],
"devDependencies": {
- "yamlparser": ">=0.0.2",
"mocha": "*",
- "uap-ref-impl": "ua-parser/uap-ref-impl"
+ "safe-regex": "^2.0.1",
+ "uap-ref-impl": "git+https://github.com/ua-parser/uap-ref-impl#master",
+ "yamlparser": ">=0.0.2"
},
"scripts": {
- "test": "mocha -u tdd -R min ./tests/test.js"
+ "test": "mocha --opts ./tests/mocha.opts ./tests"
}
}
diff -Nru uap-core-20181019/README.md uap-core-20190213/README.md
--- uap-core-20181019/README.md 2018-10-19 17:08:22.000000000 +0100
+++ uap-core-20190213/README.md 2019-02-13 17:27:26.000000000 +0000
@@ -8,6 +8,7 @@
Maintainers
-----------
+* [Com Menthol](https://github.com/commenthol)
* [Lindsey Simon](https://github.com/elsigh)
([@elsigh](https://twitter.com/elsigh))
* [Tobie Langel](https://github.com/tobie)
([@tobie](https://twitter.com/tobie))
diff -Nru uap-core-20181019/regexes.yaml uap-core-20190213/regexes.yaml
--- uap-core-20181019/regexes.yaml 2018-10-19 17:08:22.000000000 +0100
+++ uap-core-20190213/regexes.yaml 2019-02-13 17:27:26.000000000 +0000
@@ -7,9 +7,9 @@
family_replacement: 'AntennaPod'
- regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
- regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
- - regex: '^(.*)-iPad/(\d+)\.?(\d+)?.?(\d+)?.?(\d+)? CFNetwork'
- - regex: '^(.*)-iPhone/(\d+)\.?(\d+)?.?(\d+)?.?(\d+)? CFNetwork'
- - regex: '^(.*)/(\d+)\.?(\d+)?.?(\d+)?.?(\d+)? CFNetwork'
+ - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
+ - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
+ - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
# Podcast catchers
- regex: '(espn\.go)'
@@ -23,16 +23,23 @@
- regex: ' (Rivo) RHYTHM'
# @note: iOS / OSX Applications
- - regex: '(CFNetwork)(?:/(\d+)\.(\d+)\.?(\d+)?)?'
+ - regex: '(CFNetwork)(?:/(\d+)\.(\d+)(?:\.(\d+)|)|)'
family_replacement: 'CFNetwork'
# Pingdom
- - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
+ - regex: '(Pingdom\.com_bot_version_)(\d+)\.(\d+)'
family_replacement: 'PingdomBot'
# 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like
Gecko) PingdomTMS/0.8.5 Safari/534.34'
- regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'PingdomBot'
+ # PTST / WebPageTest.org crawlers
+ - regex: ' (PTST)/(\d+)\.(\d+)$'
+ family_replacement: 'WebPageTest.org bot'
+
+ # Datanyze.com spider
+ - regex: 'X11; (Datanyze); Linux'
+
# New Relic Pinger
- regex: '(NewRelicPinger)/(\d+)\.(\d+)'
family_replacement: 'NewRelicPingerBot'
@@ -57,11 +64,11 @@
family_replacement: 'GooglePlusBot'
# Gmail
- - regex: 'via ggpht.com GoogleImageProxy'
+ - regex: 'via ggpht\.com GoogleImageProxy'
family_replacement: 'GmailImageProxy'
# Yahoo
- - regex: 'YahooMailProxy;
https://help.yahoo.com/kb/yahoo-mail-proxy-SLN28749.html'
+ - regex: 'YahooMailProxy;
https://help\.yahoo\.com/kb/yahoo-mail-proxy-SLN28749\.html'
family_replacement: 'YahooMailProxy'
# Twitter
@@ -69,37 +76,37 @@
family_replacement: 'TwitterBot'
# Bots Pattern '/name-0.0'
- - regex:
'/((?:Ant-)?Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[
\-](\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex:
'/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[
\-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Bots Pattern 'name/0.0'
- - regex:
'\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex:
'\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# MSIECrawler
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d?)?;.* MSIECrawler'
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
family_replacement: 'MSIECrawler'
# DAVdroid
- - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
# Downloader ...
- - regex:
'(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[
/](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex:
'(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[
/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
# Pinterestbot
- - regex:
'(Pinterest(?:bot)?)/(\d+)(?:\.(\d+)(?:\.(\d+))?)?[;\s\(]+\+https://www.pinterest.com/bot.html'
+ - regex:
'(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
family_replacement: 'Pinterestbot'
# Bots
- - regex: '(1470\.net crawler|50\.nu|8bo Crawler
Bot|Aboundex|Accoona-[A-z]+-Agent|AdsBot-Google(?:-[a-z]+)?|altavista|AppEngine-Google|archive.*?\.org_bot|archiver|Ask
Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]+)*|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader(?:
[A-Za-z]+)*|boitho.com-dc|BotSeer|BUbiNG|\b\w*favicon\w*\b|\bYeti(?:-[a-z]+)?|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]+-)?Googlebot(?:-[a-zA-Z]+)?|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]+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
.*? Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media *)?|msrbot|Mtps Feed
Aggregation
System|netresearch|Netvibes|NewsGator[^/]*|^NING|Nutch[^/]*|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo
Screenshot
Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival
IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy
Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny
RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay
bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]+|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s)?
Link Sleuth|Xerka [A-z]+Bot|yacy(?:bot)?|Yahoo[a-z]*Seeker|Yahoo!
Slurp|Yandex\w+|YodaoBot(?:-[A-z]+)?|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[
/]v?(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(CSimpleSpider|Cityreview
Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus
Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends
Crawler|USyd-NLP-Spider|SiteCat
Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo
Crawler
Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask
Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader
Blog Indexer|BoardReader Favicon
Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?:
bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\)
Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed
Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite
Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google
SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion
Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee
Bot|LinkAider|LinkedInBot|Lite
Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft
.{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed
Aggregation
System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo
Screenshot
Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival
IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy
Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny
RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay
bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|)
Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo!
Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[
/]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
# AWS S3 Clients
# must come before "Bots General matcher" to catch "boto"/"boto3" before
"bot"
- - regex:
'\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex:
'\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
# Bots General matcher 'name/0.0'
- - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9
\-_\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*))/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
- # Bots General matcher 'name 0.0'
- - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9
_\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*))
(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
- # Bots containing spider|scrape|bot(but not CUBOT)|Crawl
- - regex: '((?:[A-z0-9]+|[A-z\-]+ ?)?(?: the
)?(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[A-Za-z0-9-]*(?:[^C][^Uu])[Bb]ot|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]*)(?:(?:[
/]| v)(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - 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+)|)|)'
+ # Bots containing bot(but not CUBOT)
+ - regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]|
v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
+ # Bots containing spider|scrape|Crawl
+ - 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+)|)|)'
# HbbTV standard defines what features the browser should understand.
# but it's like targeting "HTML5 browsers", effective browser support
depends on the model
@@ -107,21 +114,21 @@
- regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \('
# must go before Firefox to catch Chimera/SeaMonkey/Camino/Waterfox
- - regex:
'(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)?'
+ - regex:
'(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*|)'
# Social Networks
# Facebook Messenger must go before Facebook
- - regex:
'\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex:
'\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
family_replacement: 'Facebook Messenger'
# Facebook
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
family_replacement: 'Facebook'
# Sometimes Facebook does not specify a version (FBAV)
- regex: '\[FB.*;'
family_replacement: 'Facebook'
# Pinterest
- regex: '\[(Pinterest)/[^\]]+\]'
- - regex: '(Pinterest)(?: for Android(?:
Tablet)?)?/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex: '(Pinterest)(?: for Android(?:
Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Instagram app
- regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
# Flipboard app
@@ -138,7 +145,7 @@
family_replacement: 'Basilisk'
# Pale Moon
- - regex: '(PaleMoon)/(\d+)\.(\d+)\.?(\d+)?'
+ - regex: '(PaleMoon)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Pale Moon'
# Firefox
@@ -150,22 +157,22 @@
family_replacement: 'Firefox Mobile'
- regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
family_replacement: 'Firefox Mobile'
- - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
+ - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
family_replacement: 'Firefox ($1)'
- regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
family_replacement: 'Firefox Alpha'
- regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
family_replacement: 'Firefox Beta'
- - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)'
+ - regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(a\d+[a-z]*)'
family_replacement: 'Firefox Alpha'
- - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)'
+ - regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(b\d+[a-z]*)'
family_replacement: 'Firefox Beta'
- - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
+ - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
family_replacement: 'Firefox ($1)'
- regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
family_replacement: 'MicroB'
- - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
- - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+))?(\.(\d+))?'
+ - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
+ - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
family_replacement: 'Firefox iOS'
# e.g.: Flock/2.0b2
@@ -181,7 +188,7 @@
- regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
family_replacement: 'Netscape'
- - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+)?'
+ - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+|)'
family_replacement: 'Netscape'
- regex: '(MyIBrow)/(\d+)\.(\d+)'
@@ -194,8 +201,8 @@
# Opera will stop at 9.80 and hide the real version in the Version string.
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?'
- - regex: '(Opera Mini)(?:/att)?/?(\d+)?(?:\.(\d+))?(?:\.(\d+))?'
+ - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
+ - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
- regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
family_replacement: 'Opera Mobile'
- regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
@@ -204,7 +211,7 @@
family_replacement: 'Opera Mobile'
- regex: 'Opera Mobi'
family_replacement: 'Opera Mobile'
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
# Opera 14 for Android uses a WebKit render engine.
- regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
@@ -227,7 +234,7 @@
family_replacement: 'Opera Neon'
# Palm WebOS looks a lot like Safari.
- - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'webOS Browser'
# LuaKit has no version info.
@@ -243,20 +250,20 @@
- regex: 'Gecko/\d+ (Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
# Swiftfox
- - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
+ - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre|)) \(Swiftfox\)'
family_replacement: 'Swiftfox'
- - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)'
+ - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*|) \(Swiftfox\)'
family_replacement: 'Swiftfox'
# Rekonq
- - regex: '(rekonq)/(\d+)\.(\d+)\.?(\d+)? Safari'
+ - regex: '(rekonq)/(\d+)\.(\d+)(?:\.(\d+)|) Safari'
family_replacement: 'Rekonq'
- regex: 'rekonq'
family_replacement: 'Rekonq'
# Conkeror lowercase/uppercase
# http://conkeror.org/
- - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?'
+ - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Conkeror'
# catches lower case konqueror
@@ -285,11 +292,11 @@
family_replacement: 'NetFront NX'
# Amazon Silk, should go before Safari and Chrome Mobile
- - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
+ - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)'
family_replacement: 'Amazon Silk'
# @ref: http://www.puffinbrowser.com
- - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
# Edge Mobile
- regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
@@ -300,26 +307,43 @@
family_replacement: 'Samsung Internet'
# Seznam.cz browser (based on WebKit)
- - regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Seznam prohlížeč'
# Coc Coc browser, based on Chrome (used in Vietnam)
- - regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Coc Coc'
# Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
- - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
family_replacement: 'Baidu Browser'
- regex: '(FlyFlow)/(\d+)\.(\d+)'
family_replacement: 'Baidu Explorer'
# MxBrowser is Maxthon. Must go before Mobile Chrome for Android
- - regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Maxthon'
# Crosswalk must go before Mobile Chrome for Android
- regex: '(Crosswalk)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
+ # LINE https://line.me/en/
+ # Must go before Mobile Chrome for Android
+ - regex: '(Line)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'LINE'
+
+ # MiuiBrowser should got before Mobile Chrome for Android
+ - regex: '(MiuiBrowser)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'MiuiBrowser'
+
+ # Mint Browser should got before Mobile Chrome for Android
+ - regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Mint Browser'
+
+ # Google Search App on Android, eg:
+ - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Google'
+
# Chrome Mobile
- regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile WebView'
@@ -347,11 +371,11 @@
family_replacement: 'Sogou Explorer'
# QQ Browsers
- - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
family_replacement: 'QQ Browser Mini'
- - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
family_replacement: 'QQ Browser Mobile'
- - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
family_replacement: 'QQ Browser'
# Rackspace Monitoring
@@ -373,7 +397,7 @@
- regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
# Podcast catcher Applications using iTunes
- - regex: '(PodCruncher|Downcast)[ /]?(\d+)\.?(\d+)?\.?(\d+)?\.?(\d+)?'
+ - regex: '(PodCruncher|Downcast)[
/]?(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
# Box Notes https://www.box.com/resources/downloads
# Must be before Electron
@@ -397,7 +421,7 @@
# HipChat provides a version on Mac, but not on Windows.
# Needs to be before Chrome on Windows, and AppleMail on Mac.
- - regex: '(HipChat)/?(\d+)?'
+ - regex: '(HipChat)/?(\d+|)'
family_replacement: 'HipChat Desktop Client'
# Browser/major_version.minor_version.beta_version
@@ -423,15 +447,18 @@
family_replacement: 'Outlook'
v1_replacement: '2016'
+ # Word 2014
+ - regex: 'Microsoft Office (Word) 2014'
+
# Windows Live Mail
- regex: 'Outlook-Express\/7\.0.*'
family_replacement: 'Windows Live Mail'
# Apple Air Mail
- - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+)|)'
# Thunderbird
- - regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre)?))?'
+ - regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre|))|)'
family_replacement: 'Thunderbird'
# Postbox
@@ -439,18 +466,18 @@
family_replacement: 'Postbox'
# Barca
- - regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Barca'
# Lotus Notes
- - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Lotus Notes'
# Vivaldi uses "Vivaldi"
- regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
# Edge/major_version.minor_version
- - regex: '(Edge)/(\d+)(?:\.(\d+))?'
+ - regex: '(Edge)/(\d+)(?:\.(\d+)|)'
# Brave Browser https://brave.com/
- regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
@@ -462,23 +489,23 @@
# Dolphin Browser
# @ref: http://www.dolphin.com
- - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)\.?(\d+)?'
+ - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)(?:\.(\d+)|)'
# Headless Chrome
# https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
- - regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+))?'
+ - regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+)|)'
# Evolution Mail CardDav/CalDav integration
- regex: '(Evolution)/(\d+)\.(\d+)\.(\d+\.\d+)'
# Roundcube Mail CardDav plugin
- - regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev)?)'
+ - regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev|))'
# Browser/major_version.minor_version
- - regex:
'(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera
Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space
Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen
Browser|Polaris|Abrowser|Planetweb|ICE
Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex:
'(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera
Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space
Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen
Browser|Polaris|Abrowser|Planetweb|ICE
Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+)|)'
# Chrome/Chromium/major_version.minor_version
- - regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+))?(?:\.(\d+))?'
+ - regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
##########
# IE Mobile needs to happen before Android to catch cases such as:
@@ -498,8 +525,8 @@
# Podcast catchers
- regex: '^(bPod|Pocket Casts|Player FM)$'
- regex: '^(AlexaMediaPlayer|VLC)/(\d+)\.(\d+)\.([^.\s]+)'
- - regex:
'^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)\.?(\d+)?\.?(\d+)?'
- - regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]+)?\.?([^.\s]+)?'
+ - regex:
'^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
+ - regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
- regex: '^(bPod|Player FM) BMID/(\S+)'
- regex: '^(Podcast ?Addict)/v(\d+) '
- regex: '^(Podcast ?Addict) '
@@ -509,8 +536,8 @@
- regex: '(CITA) RSS Aggregator/(\d+)\.(\d+)'
- regex: '(Pocket Casts)$'
- regex: '(Player FM)$'
- - regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine)
(\d+)\.(\d+)\.?([^.\s]+)?\.?([^.\s]+)?'
- - regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]+)?\.?([^.\s]+)?'
+ - regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine)
(\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
- regex: '(Player FM|Pocket
Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)'
- regex: '(QuickTime)\.(\d+)\.(\d+)\.(\d+)'
- regex: '(Kinoma)(\d+)'
@@ -518,35 +545,35 @@
family_replacement: 'FancyMusic'
- regex: 'EspnDownloadManager'
family_replacement: 'ESPN'
- - regex: '(ESPN) Radio (\d+)\.(\d+)\.?(\d+)? ?(?:rv:(\d+))? '
- - regex: '(podracer|jPodder) v ?(\d+)\.(\d+)\.?(\d+)?'
+ - regex: '(ESPN) Radio (\d+)\.(\d+)(?:\.(\d+)|) ?(?:rv:(\d+)|) '
+ - regex: '(podracer|jPodder) v ?(\d+)\.(\d+)(?:\.(\d+)|)'
- regex: '(ZDM)/(\d+)\.(\d+)[; ]?'
- - regex: '(Zune|BeyondPod) (\d+)\.?(\d+)?[\);]'
+ - regex: '(Zune|BeyondPod) (\d+)(?:\.(\d+)|)[\);]'
- regex: '(WMPlayer)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
- regex: '^(Lavf)'
family_replacement: 'WMPlayer'
- - regex: '^(RSSRadio)[ /]?(\d+)?'
+ - regex: '^(RSSRadio)[ /]?(\d+|)'
- regex: '(RSS_Radio) (\d+)\.(\d+)'
family_replacement: 'RSSRadio'
- regex: '(Podkicker) \S+/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Podkicker'
- - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)\.?(\d+)?'
+ - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
- regex: '^(Stitcher)/iOS'
- regex: '^(Stitcher)/Android'
- regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
- regex: ' (VLC) for'
- regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'VLC'
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+)?\.?([^.\s]+)?'
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+)?\.?([^.\s]+)?'
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+)?\.?([^.\s]+)?'
+ - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
family_replacement: 'Amarok'
- regex: '(Custom)-Feed Reader'
# Browser major_version.minor_version.beta_version (space instead of slash)
- regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo
Browser) (\d+)\.(\d+)\.(\d+)'
# Browser major_version.minor_version (space instead of slash)
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft
SkyDriveSync|The Bat!) (\d+)\.(\d+)\.?(\d+)?'
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft
SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)'
# Kindle WebKit
- regex: '(Kindle)/(\d+)\.(\d+)'
@@ -586,12 +613,16 @@
- regex: '(ownCloud-android)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Owncloud'
+ # Skype for Business
+ - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
+ family_replacement: 'Skype'
+
#### END MAIN CASES ####
#### SPECIAL CASES ####
- regex: '(Obigo)InternetBrowser'
- regex: '(Obigo)\-Browser'
- - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
+ - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+)|)'
family_replacement: 'Obigo'
- regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
@@ -610,21 +641,21 @@
- regex: '(Embider)/(\d+)\.(\d+)'
family_replacement: 'Polaris'
- - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+)?'
+ - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
family_replacement: 'Bon Echo'
# @note: iOS / OSX Applications
- regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
family_replacement: 'Google'
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))?.*[ +]Safari'
+ - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
family_replacement: 'Mobile Safari'
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[
+](\d+)_(\d+)(?:_(\d+))?.* AppleNews\/\d+\.\d+\.\d+?'
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[
+](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
family_replacement: 'Mobile Safari UI/WKWebView'
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Mobile Safari UI/WKWebView'
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[
+](\d+)_(\d+)(?:_(\d+))?.*Mobile.*[ +]Safari'
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[
+](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari'
family_replacement: 'Mobile Safari'
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[
+](\d+)_(\d+)(?:_(\d+))?.*Mobile'
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[
+](\d+)_(\d+)(?:_(\d+)|).*Mobile'
family_replacement: 'Mobile Safari UI/WKWebView'
- regex: '(iPod|iPhone|iPad).* Safari'
family_replacement: 'Mobile Safari'
@@ -697,18 +728,18 @@
- regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
+ #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
# family_replacement: 'iPad'
# Phantomjs, should go before Safari
- regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
# WebKit Nightly
- - regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari'
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
family_replacement: 'WebKit Nightly'
# Safari
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
family_replacement: 'Safari'
# Safari didn't provide "Version/d.d.d" prior to 3.0
- regex: '(Safari)/\d+'
@@ -743,7 +774,7 @@
v1_replacement: '8'
# Espial
- - regex: '(Espial)/(\d+)(?:\.(\d+))?(?:\.(\d+))?'
+ - regex: '(Espial)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Apple Mail
@@ -755,7 +786,7 @@
# AFTER IE11
# BEFORE all other IE
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
- - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
+ - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
- regex: '([MS]?IE) (\d+)\.(\d+)'
family_replacement: 'IE'
@@ -764,13 +795,13 @@
family_replacement: 'Python Requests'
# headless user-agents
- - regex:
'\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian
APT-HTTP|Ubuntu
APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD
ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex:
'\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian
APT-HTTP|Ubuntu
APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD
ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
- - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+)*'
+ - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
# Cloud Storage Clients
- - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+)?'
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com)?'
+ - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
+ - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
# rclone - rsync for cloud storage - https://rclone.org/
- regex: '^(rclone)/v(\d+)\.(\d+)'
@@ -784,6 +815,10 @@
# Box Drive and Box Sync https://www.box.com/resources/downloads
- regex: '^(Box(?: Sync)?)/(\d+)\.(\d+)\.(\d+)'
+ # ViaFree streaming app https://www.viafree.{dk|se|no}
+ - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'ViaFree'
+
os_parsers:
##########
# HbbTV vendors
@@ -829,11 +864,11 @@
# Philips : not found any other way than a manual mapping
# 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
# 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
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/4'
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
os_v1_replacement: '2013'
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/3'
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
os_v1_replacement: '2012'
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/2'
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
os_v1_replacement: '2011'
# the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;)
firetv-firefox-plugin 1.1.20
@@ -854,14 +889,14 @@
- regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
# Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously
detected as Android
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[
+]+(\d+)[_\.](\d+)(?:[_\.](\d+))?.*Outlook-iOS-Android'
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[
+]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
os_replacement: 'iOS'
##########
# Android
# can actually detect rooted android os. do we care?
##########
- - regex: '(Android)[ \-/](\d+)\.?(\d+)?(?:[.\-]([a-z0-9]+))?'
+ - regex: '(Android)[ \-/](\d+)(?:\.(\d+)|)(?:[.\-]([a-z0-9]+)|)'
- regex: '(Android) Donut'
os_v1_replacement: '1'
@@ -883,18 +918,18 @@
os_v1_replacement: '3'
# UCWEB
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?;'
+ - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
os_replacement: 'Android'
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+))?;'
+ - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
os_replacement: 'iOS'
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))?;'
+ - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
os_replacement: 'Windows Phone'
# JUC
- - regex: '^(JUC).*; ?U; ?(?:Android)?(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+))?'
+ - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
os_replacement: 'Android'
# Salesforce
- - regex: '(android)\s(?:mobile\/)(\d+)(?:\.?(\d+))?(?:\.?(\d+))?'
+ - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
os_replacement: 'Android'
##########
@@ -908,7 +943,7 @@
# properly identify as Chrome OS
#
# 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
- - regex: '(x86_64|aarch64)\
(\d+)+\.(\d+)+\.(\d+)+.*Chrome.*(?:CitrixChromeApp)$'
+ - regex: '(x86_64|aarch64)\
(\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
os_replacement: 'Chrome OS'
##########
@@ -945,8 +980,6 @@
os_replacement: 'Windows'
os_v1_replacement: 'ME'
- - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows
7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
-
- regex: '(Windows NT 6\.2; ARM;)'
os_replacement: 'Windows'
os_v1_replacement: 'RT'
@@ -989,7 +1022,7 @@
os_replacement: 'Windows'
os_v1_replacement: 'CE'
- - regex: 'Win ?(95|98|3.1|NT|ME|2000)'
+ - regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)'
os_replacement: 'Windows'
os_v1_replacement: '$1'
@@ -1017,13 +1050,13 @@
# @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
# @ref: http://www.puredarwin.org/curious/versions
##########
- - regex: '((?:Mac[ +]?|; )OS[
+]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+))?|Mach-O)'
+ - regex: '((?:Mac[ +]?|; )OS[
+]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
os_replacement: 'Mac OS X'
- - regex: '(\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*)'
+ - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
os_replacement: 'Mac OS X'
- os_v1_replacement: '$2'
- os_v2_replacement: '$3'
- os_v3_replacement: '$4'
+ os_v1_replacement: '$1'
+ os_v2_replacement: '$2'
+ os_v3_replacement: '$3'
# Leopard
- regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
os_replacement: 'Mac OS X'
@@ -1062,7 +1095,7 @@
- regex: '(?:PPC|Intel) (Mac OS X)'
# Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+))?'
+ - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
os_replacement: 'Mac OS X'
##########
@@ -1070,10 +1103,10 @@
# http://en.wikipedia.org/wiki/IOS_version_history
##########
# keep this above generic iOS, since AppleTV UAs contain 'CPU OS'
- - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+))?'
+ - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
os_replacement: 'ATV OS X'
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[
+]+(\d+)[_\.](\d+)(?:[_\.](\d+))?'
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[
+]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
os_replacement: 'iOS'
# remaining cases are mostly only opera uas, so catch opera as to not catch
iphone spoofs
@@ -1255,7 +1288,7 @@
os_replacement: 'iOS'
# iOS Apps
- - regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d;
)|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?'
+ - regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d;
)|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+)|)'
os_replacement: 'iOS'
- regex: '\((iOS);'
@@ -1264,10 +1297,16 @@
##########################
- regex: 'Outlook-(iOS)/\d+\.\d+\.prod\.iphone'
+ ##########################
+ # iOS devices, the same regex matches mobile safari webviews
+ ##########################
+ - regex: '(iPod|iPhone|iPad)'
+ os_replacement: 'iOS'
+
##########
# Apple TV
##########
- - regex: '(tvOS)/(\d+).(\d+)'
+ - regex: '(tvOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'tvOS'
##########
@@ -1276,7 +1315,7 @@
# http://code.google.com/p/chromium-os/issues/detail?id=11573
# http://code.google.com/p/chromium-os/issues/detail?id=13790
##########
- - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'Chrome OS'
##########
@@ -1284,8 +1323,8 @@
##########
- regex: '([Dd]ebian)'
os_replacement: 'Debian'
- - regex: '(Linux Mint)(?:/(\d+))?'
- - regex: '(Mandriva)(?: Linux)?/(?:[\d.-]+m[a-z]{2}(\d+).(\d))?'
+ - regex: '(Linux Mint)(?:/(\d+)|)'
+ - regex: '(Mandriva)(?: Linux|)/(?:[\d.-]+m[a-z]{2}(\d+).(\d)|)'
##########
# Symbian + Symbian OS
@@ -1314,9 +1353,9 @@
##########
- regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
os_replacement: 'BlackBerry OS'
- - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'BlackBerry OS'
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'BlackBerry OS'
- regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
os_replacement: 'BlackBerry Tablet OS'
@@ -1383,20 +1422,20 @@
##########
# Google TV
##########
- - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))?|/[\da-z]+)'
+ - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+)|)|/[\da-z]+)'
- regex: '(WebTV)/(\d+).(\d+)'
##########
# Chromecast
##########
- - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+))?)?'
+ - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
os_replacement: 'Chromecast'
##########
# Misc mobile
##########
- - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'webOS'
- regex: '(VRE);'
@@ -1404,10 +1443,10 @@
# Generic patterns
# since the majority of os cases are very specific, these go last
##########
- - regex: '(Fedora|Red
Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/
](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex: '(Fedora|Red
Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/
](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Gentoo Linux + Kernel Version
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))?.*gentoo'
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
os_replacement: 'Gentoo'
# Opera Mini Bada
@@ -1417,7 +1456,7 @@
- regex: '(Windows|Android|WeTab|Maemo|Web0S)'
- regex: '(Ubuntu|Kubuntu|Arch
Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red
Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
# Linux + Kernel Version
- - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))?)?'
+ - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
- regex: 'SunOS'
os_replacement: 'Solaris'
# Wget/x.x.x (linux-gnu)
@@ -1448,6 +1487,16 @@
brand_replacement: 'Spider'
model_replacement: 'Feature Phone'
+ # PTST / WebPageTest.org crawlers
+ - regex: ' PTST/\d+\.\d+$'
+ device_replacement: 'Spider'
+ brand_replacement: 'Spider'
+
+ # Datanyze.com spider
+ - regex: 'X11; Datanyze; Linux'
+ device_replacement: 'Spider'
+ brand_replacement: 'Spider'
+
#########
# WebBrowser for SmartWatch
# @ref:
https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
@@ -1464,7 +1513,7 @@
######################################################################
# Android Application
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson)? (.+) \w+ - '
+ - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
device_replacement: '$1 $2'
brand_replacement: '$1$2'
model_replacement: '$3'
@@ -1495,7 +1544,7 @@
# Acer
# @ref: http://us.acer.com/ac/en/US/content/group/tablets
#########
- - 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'
+ - 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'
device_replacement: '$1'
brand_replacement: 'Acer'
model_replacement: '$1'
@@ -1518,7 +1567,7 @@
# @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
# custom ROM builds for Vega
#########
- - regex: '; *(Advent )?(Vega(?:Bean|Comb)?).* Build'
+ - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build'
device_replacement: '$1$2'
brand_replacement: 'Advent'
model_replacement: '$2'
@@ -1527,7 +1576,7 @@
# Ainol
# @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
#########
- - regex: '; *(Ainol )?((?:NOVO|[Nn]ovo)[^;/]+) Build'
+ - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build'
device_replacement: '$1$2'
brand_replacement: 'Ainol'
model_replacement: '$2'
@@ -1564,7 +1613,7 @@
device_replacement: 'Alcatel One Touch $2'
brand_replacement: 'Alcatel'
model_replacement: 'One Touch $2'
- - regex: '; *(?:alcatel[ _])?(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);?
Build'
+ - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);?
Build'
regex_flag: 'i'
device_replacement: 'Alcatel One Touch $1'
brand_replacement: 'Alcatel'
@@ -1604,7 +1653,7 @@
device_replacement: '$1$2'
brand_replacement: 'Allview'
model_replacement: '$2'
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)?(AX1_Shine|AX2_Frenzy) Build'
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build'
device_replacement: '$1$2'
brand_replacement: 'Allview'
model_replacement: '$2'
@@ -1664,7 +1713,7 @@
# @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
# @note: brand owned by luckystar
#########
- - 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'
+ - 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'
device_replacement: 'Aoson $1'
brand_replacement: 'Aoson'
model_replacement: '$1'
@@ -1739,7 +1788,7 @@
# Assistant
# @ref: http://www.assistant.ua
#########
- - regex: '; *(?:ASSISTANT )?(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
+ - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
device_replacement: 'Assistant $1-$2'
brand_replacement: 'Assistant'
model_replacement: '$1-$2'
@@ -1748,7 +1797,7 @@
# Asus
# @ref: http://www.asus.com/uk/Tablets_Mobile/
#########
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?:
2013)?|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
+ - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?:
2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
@@ -2296,7 +2345,7 @@
# Gionee
# @ref: http://www.gionee.com/
#########
- - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+)? Build'
+ - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build'
regex_flag: 'i'
device_replacement: '$1 $2'
brand_replacement: 'Gionee'
@@ -2460,7 +2509,7 @@
# @ref: http://www.huaweidevice.com
# @note: Needs to be before HTC due to Desire HD Build on U8815
#########
- - regex: '; *(HUAWEI |Huawei-)?([UY][^;/]+)
Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
+ - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+)
Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
device_replacement: '$1$2'
brand_replacement: 'Huawei'
model_replacement: '$2'
@@ -2476,7 +2525,7 @@
device_replacement: '$1$2'
brand_replacement: 'Huawei'
model_replacement: '$2'
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _])?Ascend[ _])([^;/]+) Build'
+ - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
device_replacement: '$1$2'
brand_replacement: 'Huawei'
model_replacement: '$2'
@@ -2531,33 +2580,33 @@
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+))?(?:[/\\]1\.0 | V|/|
+)\d+\.\d[\d\.]*(?: *Build|\))'
+ - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/|
+)\d+\.\d[\d\.]*(?: *Build|\))'
device_replacement: 'HTC $1 $2'
brand_replacement: 'HTC'
model_replacement: '$1 $2'
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^
_/]+))?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
+ - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^
_/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
device_replacement: 'HTC $1 $2 $3'
brand_replacement: 'HTC'
model_replacement: '$1 $2 $3'
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[
_/]([^ _/]+))?)?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
+ - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[
_/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
device_replacement: 'HTC $1 $2 $3 $4'
brand_replacement: 'HTC'
model_replacement: '$1 $2 $3 $4'
# Android HTC without Version Number matcher
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/;]+)(?: *Build|[;\)]| -
)'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| -
)'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^
_/;\)]+))?(?: *Build|[;\)]| - )'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^
_/;\)]+)|)(?: *Build|[;\)]| - )'
device_replacement: 'HTC $1 $2'
brand_replacement: 'HTC'
model_replacement: '$1 $2'
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^
_/]+)(?:[ _/]([^ _/;\)]+))?)?(?: *Build|[;\)]| - )'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^
_/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
device_replacement: 'HTC $1 $2 $3'
brand_replacement: 'HTC'
model_replacement: '$1 $2 $3'
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^
_/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+))?)?)?(?: *Build|[;\)]| - )'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^
_/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
device_replacement: 'HTC $1 $2 $3 $4'
brand_replacement: 'HTC'
model_replacement: '$1 $2 $3 $4'
@@ -2568,7 +2617,7 @@
brand_replacement: 'HTC'
model_replacement: '$1'
# general matcher for anything else
- - regex: '(?:[;,] *|^)(?:htccn_chs-)?HTC[ _-]?([^;]+?)(?:
*Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
+ - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?:
*Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
regex_flag: 'i'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
@@ -2607,12 +2656,12 @@
# iBall
# @ref: http://www.iball.co.in/Category/Mobiles/22
#########
- - regex: '; *(?:iBall[ _\-])?(Andi)[ _]?(\d[^;/]*) Build'
+ - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build'
regex_flag: 'i'
device_replacement: '$1 $2'
brand_replacement: 'iBall'
model_replacement: '$1 $2'
- - regex: '; *(IBall)(?:[ _]([^;/]+))? Build'
+ - regex: '; *(IBall)(?:[ _]([^;/]+)|) Build'
regex_flag: 'i'
device_replacement: '$1 $2'
brand_replacement: 'iBall'
@@ -2622,7 +2671,7 @@
# IconBIT
# @ref: http://www.iconbit.com/catalog/tablets/
#########
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?:
S/N:[^;/]+)? Build'
+ - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?:
S/N:[^;/]+|) Build'
device_replacement: '$1'
brand_replacement: 'IconBIT'
model_replacement: '$1'
@@ -2695,17 +2744,17 @@
# @note: Zync also offers a "Cloud Z5" device
#########
# smartphones
- - regex: '; *(?:Intex[ _])?(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
+ - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
device_replacement: '$1$2$3'
brand_replacement: 'Intex'
model_replacement: '$1 $3'
# matches "INTEX CLOUD X1"
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+))?
*(?:Build|;)'
+ - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|)
*(?:Build|;)'
device_replacement: '$1 $2'
brand_replacement: 'Intex'
model_replacement: '$1 $2'
# tablets
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| )?([^;/]*) *(?:Build|;)'
+ - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
device_replacement: '$1 $2 $3'
brand_replacement: 'Intex'
model_replacement: 'iBuddy $2 $3'
@@ -2728,7 +2777,7 @@
# i.onik
# @ref: http://www.i-onik.de/
#########
- - regex: '; *(TP\d+(?:\.\d+)?\-\d[^;/]+) Build'
+ - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build'
device_replacement: 'ionik $1'
brand_replacement: 'ionik'
model_replacement: '$1'
@@ -2944,7 +2993,7 @@
# Lava
# @ref: http://www.lavamobiles.com/
#########
- - regex: '; *(?:LAVA[ _])?IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
+ - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
regex_flag: 'i'
device_replacement: 'Iris $1'
brand_replacement: 'Lava'
@@ -2996,15 +3045,15 @@
device_replacement: 'Lenovo $1 $2'
brand_replacement: 'Lenovo'
model_replacement: '$1 $2'
- - regex: '; *(?:LNV-)?(?:=?[Ll]enovo[ _\-]?|LENOVO[
_])+(.+?)(?:Build|[;/\)])'
+ - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
device_replacement: 'Lenovo $1'
brand_replacement: 'Lenovo'
model_replacement: '$1'
- - regex: '[;,] (?:Vodafone )?(SmartTab) ?(II) ?(\d+) Build/'
+ - regex: '[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\d+) Build/'
device_replacement: 'Lenovo $1 $2 $3'
brand_replacement: 'Lenovo'
model_replacement: '$1 $2 $3'
- - regex: '; *(?:Ideapad )?K1 Build/'
+ - regex: '; *(?:Ideapad |)K1 Build/'
device_replacement: 'Lenovo Ideapad K1'
brand_replacement: 'Lenovo'
model_replacement: 'Ideapad K1'
@@ -3034,7 +3083,7 @@
device_replacement: '$1'
brand_replacement: 'LG'
model_replacement: '$1'
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+)? *(?:Build|[;\)])'
+ - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
device_replacement: '$1'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -3117,7 +3166,7 @@
# Medion
# @ref: http://www.medion.com/en/
#########
- - regex: '; *(?:MD_)?LIFETAB[ _]([^;/]+) Build'
+ - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build'
regex_flag: 'i'
device_replacement: 'Medion Lifetab $1'
brand_replacement: 'Medion'
@@ -3195,7 +3244,7 @@
# Modecom
# @ref: http://www.modecom.eu/tablets/portal/
#########
- - regex: '; *(MODECOM )?(FreeTab) ?([^;/]+) Build'
+ - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build'
regex_flag: 'i'
device_replacement: '$1$2 $3'
brand_replacement: 'Modecom'
@@ -3253,7 +3302,7 @@
# MSI
# @ref: http://www.msi.com/product/windpad/
#########
- - regex: '; *(?:MSI[ _])?(Primo\d+|Enjoy[ _\-][^;/]+) Build'
+ - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build'
regex_flag: 'i'
device_replacement: '$1'
brand_replacement: 'Msi'
@@ -3280,7 +3329,7 @@
device_replacement: '$1$2 $3'
brand_replacement: 'MyPhone'
model_replacement: '$3'
- - regex: '; *(A\d+)[ _](Duo)? Build'
+ - regex: '; *(A\d+)[ _](Duo|) Build'
regex_flag: 'i'
device_replacement: '$1 $2'
brand_replacement: 'MyPhone'
@@ -3349,7 +3398,7 @@
device_replacement: '$1$2'
brand_replacement: 'Nook'
model_replacement: '$2'
- - regex: '; *(NOOK
)?(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
+ - regex: '; *(NOOK
|)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
device_replacement: '$1$2'
brand_replacement: 'Nook'
model_replacement: '$2'
@@ -3484,11 +3533,11 @@
# @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
# @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
#########
- - regex: '; *(SKY[ _])?(IM\-[AT]\d{3}[^;/]+).* Build/'
+ - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
device_replacement: 'Pantech $1$2'
brand_replacement: 'Pantech'
model_replacement: '$1$2'
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G)?)
Build/'
+ - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|))
Build/'
device_replacement: '$1'
brand_replacement: 'Pantech'
model_replacement: '$1'
@@ -3571,7 +3620,7 @@
# Polaroid/ Acho
# @ref:
http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
#########
- - regex: '; *(?:Polaroid[
_])?((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*)? Build/'
+ - regex: '; *(?:Polaroid[
_]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/'
device_replacement: '$1'
brand_replacement: 'Polaroid'
model_replacement: '$1'
@@ -3598,7 +3647,7 @@
device_replacement: '$1'
brand_replacement: 'Positivo'
model_replacement: '$1'
- - regex: '; *(?:Positivo )?((?:YPY|Ypy)[^;/]+) Build/'
+ - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/'
device_replacement: '$1'
brand_replacement: 'Positivo'
model_replacement: '$1'
@@ -3626,7 +3675,7 @@
# @ref: http://www.prestigio.com/catalogue/MultiPhones
# @ref: http://www.prestigio.com/catalogue/MultiPads
#########
- - regex: '; *(?:Prestigio )?((?:PAP|PMP)\d[^;/]+) Build/'
+ - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/'
device_replacement: 'Prestigio $1'
brand_replacement: 'Prestigio'
model_replacement: '$1'
@@ -3644,7 +3693,7 @@
# QMobile
# @ref: http://www.qmobile.com.pk/
#########
- - regex: '; *(A2|A5|A8|A900)_?(Classic)? Build'
+ - regex: '; *(A2|A5|A8|A900)_?(Classic|) Build'
device_replacement: '$1 $2'
brand_replacement: 'Qmobile'
model_replacement: '$1 $2'
@@ -3710,11 +3759,11 @@
# Samsung Android Devices
# @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
#########
- - regex: '; *(SAMSUNG |Samsung )?((?:Galaxy (?:Note
II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
+ - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note
II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
device_replacement: 'Samsung $1$2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *(Google )?(Nexus [Ss](?: 4G)?) Build/'
+ - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
device_replacement: 'Samsung $1$2'
brand_replacement: 'Samsung'
model_replacement: '$2'
@@ -3722,15 +3771,15 @@
device_replacement: 'Samsung $2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus
4G)?) Build/'
+ - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus
4G|)) Build/'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
- - regex: '; *(SAMSUNG[ _\-] *)+([^;/]+) Build'
+ - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
device_replacement: 'Samsung $2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *(SAMSUNG-)?(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
+ - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
device_replacement: 'Samsung $1$2$3'
brand_replacement: 'Samsung'
model_replacement: '$2'
@@ -3742,11 +3791,11 @@
device_replacement: 'Samsung $1$2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build'
+ - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build'
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
@@ -3883,7 +3932,7 @@
device_replacement: '$1$2'
brand_replacement: 'SonyEricsson'
model_replacement: '$2'
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o)?|R800i|U20i)
Build'
+ - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i)
Build'
device_replacement: '$1'
brand_replacement: 'SonyEricsson'
model_replacement: '$1'
@@ -3947,7 +3996,7 @@
# Spice
# @ref: http://www.spicemobilephones.co.in/
#########
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?)?([Mm][Ii])([
_\-])?(\d{3}[^;/]*) Build/'
+ - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([
_\-]|)(\d{3}[^;/]*) Build/'
device_replacement: '$1$2$3$4'
brand_replacement: 'Spice'
model_replacement: 'Mi$4'
@@ -4086,7 +4135,7 @@
device_replacement: '$1'
brand_replacement: 'HTC'
model_replacement: 'Dream'
- - regex: '\b(T-Mobile ?)?(myTouch)[ _]?([34]G)[ _]?([^\/]*)
(?:Mozilla|Build)'
+ - regex: '\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\/]*)
(?:Mozilla|Build)'
device_replacement: '$1$2 $3 $4'
brand_replacement: 'HTC'
model_replacement: '$2 $3 $4'
@@ -4131,7 +4180,7 @@
device_replacement: '$1'
brand_replacement: 'Toshiba'
model_replacement: 'Folio 100'
- - regex: ';
*(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a)?|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)
Build/'
+ - regex: ';
*(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)
Build/'
device_replacement: 'Toshiba $1'
brand_replacement: 'Toshiba'
model_replacement: '$1'
@@ -4251,7 +4300,7 @@
# Walton
# @ref: http://www.waltonbd.com/
#########
- - regex: '; *(?:Walton[ _\-])?(Primo[ _\-][^;/]+) Build'
+ - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build'
regex_flag: 'i'
device_replacement: 'Walton $1'
brand_replacement: 'Walton'
@@ -4261,7 +4310,7 @@
# Wiko
# @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
#########
- - regex: '; *(?:WIKO[
\-])?(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK
[^;/]+) Build/'
+ - regex: '; *(?:WIKO[
\-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK
[^;/]+) Build/'
regex_flag: 'i'
device_replacement: 'Wiko $1'
brand_replacement: 'Wiko'
@@ -4307,7 +4356,7 @@
# Yarvik Zania
# @ref: http://yarvik.com
#########
- - 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/'
+ - 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/'
device_replacement: 'Yarvik $1'
brand_replacement: 'Yarvik'
model_replacement: '$1'
@@ -4330,7 +4379,7 @@
# XiaoMi
# @ref: http://www.xiaomi.com/event/buyphone
#########
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note )?[^;/]*) (Build|MIUI)/'
+ - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
device_replacement: 'XiaoMi $1'
brand_replacement: 'XiaoMi'
model_replacement: '$1'
@@ -4496,7 +4545,7 @@
device_replacement: 'Kindle'
brand_replacement: 'Amazon'
model_replacement: 'Kindle'
- - regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))? Build\b'
+ - regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|) Build\b'
device_replacement: 'Kindle Fire'
brand_replacement: 'Amazon'
model_replacement: 'Kindle Fire$2'
@@ -4548,7 +4597,7 @@
#########
# Alcatel Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?)?(?:ALCATEL)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
device_replacement: 'Alcatel $1'
brand_replacement: 'Alcatel'
model_replacement: '$1'
@@ -4556,8 +4605,8 @@
#########
# Asus Windows Phones
#########
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
+ #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
@@ -4565,7 +4614,7 @@
#########
# Dell Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?)?(?:DELL|Dell)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
device_replacement: 'Dell $1'
brand_replacement: 'Dell'
model_replacement: '$1'
@@ -4573,7 +4622,7 @@
#########
# HTC Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?)?(?:HTC|Htc|HTC_blocked[^;]*)[^;]*;
*(?:HTC)?([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*;
*(?:HTC|)([^;,\)]+)'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
@@ -4581,7 +4630,7 @@
#########
# Huawei Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?)?(?:HUAWEI)[^;]*; *(?:HUAWEI )?([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
device_replacement: 'Huawei $1'
brand_replacement: 'Huawei'
model_replacement: '$1'
@@ -4589,7 +4638,7 @@
#########
# LG Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?)?(?:LG|Lg)[^;]*; *(?:LG[ \-])?([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
device_replacement: 'LG $1'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -4597,15 +4646,15 @@
#########
# Noka Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?)?(?:rv:11; )?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA
?|[Ll]umia ?)*(\d{3,}[^;\)]*)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA
?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
device_replacement: 'Lumia $1'
brand_replacement: 'Nokia'
model_replacement: 'Lumia $1'
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
device_replacement: 'Nokia $1'
brand_replacement: 'Nokia'
model_replacement: '$1'
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;)
?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA
?|[Ll]umia ?)*([^;\)]+)'
+ - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;)
?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA
?|[Ll]umia ?|)([^;\)]+)'
device_replacement: 'Nokia $1'
brand_replacement: 'Nokia'
model_replacement: '$1'
@@ -4613,7 +4662,7 @@
#########
# Microsoft Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?)?(?:Microsoft(?: Corporation)?)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
device_replacement: 'Microsoft $1'
brand_replacement: 'Microsoft'
model_replacement: '$1'
@@ -4621,7 +4670,7 @@
#########
# Samsung Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?)?(?:SAMSUNG)[^;]*; *(?:SAMSUNG )?([^;,\.\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
@@ -4629,7 +4678,7 @@
#########
# Toshiba Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?)?(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*;
*([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*;
*([^;,\)]+)'
device_replacement: 'Toshiba $1'
brand_replacement: 'Toshiba'
model_replacement: '$1'
@@ -4637,7 +4686,7 @@
#########
# Generic Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?)?([^;]+); *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch;
?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
device_replacement: '$1 $2'
brand_replacement: '$1'
model_replacement: '$2'
@@ -4657,7 +4706,7 @@
#########
# Firefox OS
#########
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+)?;
rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|);
rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
device_replacement: 'Alcatel $1 $2 $3'
brand_replacement: 'Alcatel'
model_replacement: 'One Touch $3'
@@ -4688,7 +4737,7 @@
brand_replacement: '$1'
model_replacement: '$2'
# Nokia Symbian
- - regex: '\(Symbian(?:/3)?; U; ([^;]+);'
+ - regex: '\(Symbian(?:/3|); U; ([^;]+);'
device_replacement: 'Nokia $1'
brand_replacement: 'Nokia'
model_replacement: '$1'
@@ -4733,7 +4782,7 @@
device_replacement: 'Palm Treo $1'
brand_replacement: 'Palm'
model_replacement: 'Treo $1'
- - regex: 'webOS.*(P160U(?:NA)?)/(\d+).(\d+)'
+ - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
device_replacement: 'HP Veer'
brand_replacement: 'HP'
model_replacement: 'Veer'
@@ -4860,7 +4909,7 @@
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime)
|Transformer |Padfone |Nexus[ _])?[A-Za-z0-9]+)'
+ - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime)
|Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
@@ -4901,7 +4950,7 @@
##########
# htc
##########
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/)?HTC[ _\-;]?
*(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]?
*(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
@@ -4958,11 +5007,11 @@
device_replacement: '$1'
brand_replacement: '$2'
model_replacement: '$3'
- - regex:
'(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/)*(THOM[^;]*?)[;\s](?:.*SW-Version/.*)*(LF[^;]+);?'
+ - regex:
'(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
device_replacement: '$1'
brand_replacement: 'Thomson'
model_replacement: '$4'
- - regex: '(HbbTV)(?:/1\.1\.1)?(?: ?\(;;;;;\))?; *CE-HTML(?:/1\.\d)?; *([^
]+) ([^;]+);'
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^
]+) ([^;]+);'
device_replacement: '$1'
brand_replacement: '$2'
model_replacement: '$3'
@@ -4979,7 +5028,7 @@
##########
# LGE NetCast TV
##########
- - regex: 'LGE; (?:Media\/)?([^;]*);[^;]*;[^;]*;?\); "?LG
NetCast(\.TV|\.Media)?-\d+'
+ - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG
NetCast(\.TV|\.Media|)-\d+'
device_replacement: 'NetCast$2'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -5008,7 +5057,7 @@
brand_replacement: '$1'
model_replacement: '$2'
# other LG phones
- - regex: '\b(?:LGE[ \-]LG\-(?:AX)?|LGE |LGE?-LG|LGE?[ \-]|LG[
/\-]|lg[\-])([A-Za-z0-9]+)\b'
+ - regex: '\b(?:LGE[ \-]LG\-(?:AX|)|LGE |LGE?-LG|LGE?[ \-]|LG[
/\-]|lg[\-])([A-Za-z0-9]+)\b'
device_replacement: 'LG $1'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -5153,7 +5202,7 @@
device_replacement: '$2 $1'
brand_replacement: '$2'
model_replacement: '$1'
- - regex: '(Sony)(?:BDP\/|\/)?([^ /;\)]+)[ /;\)]'
+ - regex: '(Sony)(?:BDP\/|\/|)([^ /;\)]+)[ /;\)]'
device_replacement: '$1 $2'
brand_replacement: '$1'
model_replacement: '$2'
@@ -5189,21 +5238,21 @@
- regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *;
*(.+?) Build[/ ]'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2};
*[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?) Build[/ ]'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|);
*[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?) Build[/ ]'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{0,2}\- *; *(.+?)
Build[/ ]'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *;
*(.+?) Build[/ ]'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
# No build info at all - "Build" follows locale immediately
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2};
*[a-z]{0,2}[_\-]?[A-Za-z]{0,2};? Build[/ ]'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|);
*[a-z]{0,2}[_\-]?[A-Za-z]{0,2};? Build[/ ]'
device_replacement: 'Generic Smartphone'
brand_replacement: 'Generic'
model_replacement: 'Smartphone'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *\-?[A-Za-z]{2}; *(.+?) Build[/
]'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)
Build[/ ]'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}(?:;.*)?; *(.+?) Build[/ ]'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?) Build[/ ]'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
diff -Nru uap-core-20181019/test_resources/pgts_browser_list.yaml
uap-core-20190213/test_resources/pgts_browser_list.yaml
--- uap-core-20181019/test_resources/pgts_browser_list.yaml 2018-10-19
17:08:22.000000000 +0100
+++ uap-core-20190213/test_resources/pgts_browser_list.yaml 2019-02-13
17:27:26.000000000 +0000
@@ -39415,9 +39415,9 @@
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0;
3COM U.S. Robotics)'
- family: 'Robotics'
- major:
- minor:
+ family: 'IE'
+ major: '6'
+ minor: '0'
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0; ABN
AMRO)'
@@ -63409,7 +63409,7 @@
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows XP
Professional Bot v.5.)'
- family: 'XP Professional Bot'
+ family: 'Windows XP Professional Bot'
major:
minor:
patch:
diff -Nru uap-core-20181019/tests/mocha.opts uap-core-20190213/tests/mocha.opts
--- uap-core-20181019/tests/mocha.opts 1970-01-01 01:00:00.000000000 +0100
+++ uap-core-20190213/tests/mocha.opts 2019-02-13 17:27:26.000000000 +0000
@@ -0,0 +1,3 @@
+--ui tdd
+--reporter min
+--check-leaks
diff -Nru uap-core-20181019/tests/regexes.js uap-core-20190213/tests/regexes.js
--- uap-core-20181019/tests/regexes.js 1970-01-01 01:00:00.000000000 +0100
+++ uap-core-20190213/tests/regexes.js 2019-02-13 17:27:26.000000000 +0000
@@ -0,0 +1,36 @@
+'use strict'
+
+var assert = require('assert')
+var path = require('path')
+var fs = require('fs')
+var yaml = require('yamlparser')
+var regexes = readYAML('../regexes.yaml')
+var safe = require('safe-regex')
+var refImpl = require('uap-ref-impl')
+
+function readYAML (fileName) {
+ var file = path.join(__dirname, fileName)
+ var data = fs.readFileSync(file, 'utf8')
+ return yaml.eval(data)
+}
+
+suite('regexes', function () {
+ Object.keys(regexes).forEach(function (parser) {
+ suite(parser, function () {
+ regexes[parser].forEach(function(item) {
+ test(item.regex, function () {
+ assert.ok(safe(item.regex))
+ })
+ })
+ })
+ })
+
+ test('should not backtrack', function () {
+ var parse = refImpl(regexes).parse
+ var ua = Array(3200).fill('a').join('')
+ var start = Date.now()
+ parse(ua)
+ var diff = Date.now() - start
+ assert.ok(diff < 500, diff)
+ })
+})
diff -Nru uap-core-20181019/tests/test_device.yaml
uap-core-20190213/tests/test_device.yaml
--- uap-core-20181019/tests/test_device.yaml 2018-10-19 17:08:22.000000000
+0100
+++ uap-core-20190213/tests/test_device.yaml 2019-02-13 17:27:26.000000000
+0000
@@ -650,6 +650,26 @@
brand: 'Spider'
model: 'Desktop'
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0;
rv:11.0) like Gecko PTST/1.0'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/64.0.3282.0 Safari/537.36 PTST/1.0'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)
Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146
Mobile Safari/537.36 PTST/180521.140508'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
- user_agent_string: 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34
(KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
family: 'Spider'
brand: 'Spider'
diff -Nru uap-core-20181019/tests/test_os.yaml
uap-core-20190213/tests/test_os.yaml
--- uap-core-20181019/tests/test_os.yaml 2018-10-19 17:08:22.000000000
+0100
+++ uap-core-20190213/tests/test_os.yaml 2019-02-13 17:27:26.000000000
+0000
@@ -427,6 +427,13 @@
patch:
patch_minor:
+ - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+ family: 'Linux'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
- user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36
(KHTML, like Gecko; Google Web Preview) Chrome/27.0 .1453 Safari/537.36.'
family: 'Linux'
major:
@@ -736,15 +743,15 @@
patch_minor:
- user_agent_string: 'ICE Browser/5.05 (Java 1.4.0; Windows 2000 5.0 x86)'
- family: 'Windows 2000'
- major:
+ family: 'Windows'
+ major: '2000'
minor:
patch:
patch_minor:
- user_agent_string: 'NCSA_Mosaic/2.0 (Windows 3.1)'
- family: 'Windows 3.1'
- major:
+ family: 'Windows'
+ major: '3.1'
minor:
patch:
patch_minor:
@@ -2419,6 +2426,13 @@
patch: '4'
patch_minor:
+ - user_agent_string: 'Zendesk for iPhone 1.2.1 (4395)'
+ family: 'iOS'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
- user_agent_string:
'Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_11_6)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/52.0.2743.116+Safari/537.36'
family: 'Mac OS X'
major: '10'
@@ -2580,21 +2594,21 @@
minor: '2'
patch: '5'
patch_minor:
-
+
- user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS
X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 Flipboard/4.2.2'
family: 'iOS'
major: '11'
minor: '2'
patch: '6'
patch_minor:
-
+
- user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G610F
Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/63.0.3239.111 Mobile Safari/537.36 Flipboard/4.1.9/4323,4.1.9.4323'
family: 'Android'
major: '7'
minor: '0'
patch:
patch_minor:
-
+
- user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930F
Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/64.0.3282.137 Mobile Safari/537.36 Onefootball/Android/9.10.6'
family: 'Android'
major: '7'
@@ -2608,7 +2622,7 @@
minor: '0'
patch:
patch_minor:
-
+
- user_agent_string: 'Wget/1.18 (linux-gnu)'
family: 'Linux'
major:
@@ -2635,28 +2649,28 @@
major: '8'
minor: '0'
patch: '0'
- patch_minor:
+ patch_minor:
- user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/7.0
(SM-G955U) Salesforce1/15.2 Native uid_4ec4068eddf27447 ftr_ Cordova/6.2.3'
family: 'Android'
major: '7'
minor: '0'
- patch:
- patch_minor:
-
+ patch:
+ patch_minor:
+
- user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/9 (SM-G955U)
Salesforce1/15.2 Native uid_4ec4068eddf27447 ftr_ Cordova/6.2.3'
family: 'Android'
major: '9'
minor:
- patch:
- patch_minor:
+ patch:
+ patch_minor:
- user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Pixel
Build/PPP3.180510.008) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/67.0.3396.81 Mobile Safari/537.36'
family: 'Android'
major: '9'
minor:
- patch:
- patch_minor:
+ patch:
+ patch_minor:
- user_agent_string: 'Mozilla/5.0 (X11; Windows aarch64 10718.88.2)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36
CitrixChromeApp'
family: 'Chrome OS'
@@ -2679,3 +2693,86 @@
patch:
patch_minor:
+ - user_agent_string: 'ViaFree-DK/3.8.3 (com.MTGx.ViaFree.dk; build:7383; iOS
12.1.0) Alamofire/4.7.0'
+ family: 'iOS'
+ major: '12'
+ minor: '1'
+ patch: '0'
+ patch_minor:
+
+ - user_agent_string: 'Viafree-tvOS-DK/3.7.1 (com.MTGx.ViaFree.dk;
build:7341; tvOS 12.1.0) Alamofire/4.7.0'
+ family: 'tvOS'
+ major: '12'
+ minor: '1'
+ patch: '0'
+ patch_minor:
+
+ - user_agent_string: 'iTunes/12.7.1 (Windows; Microsoft Windows 7 Ultimate
Edition Service Pack 1 (Build 7601)) AppleWebKit/7604.3005.2001.1'
+ family: 'Windows'
+ major: '7'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'iTunes/12.1.3 (Windows; Microsoft Windows XP
Professional Service Pack 3 (Build 2600)) AppleWebKit/7600.1017.9000.3'
+ family: 'Windows'
+ major: 'XP'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'iTunes/12.1.3 (Windows; Microsoft Windows Vista
Business Edition Service Pack 2 (Build 6002)) AppleWebKit/7600.1017.9000.3 '
+ family: 'Windows'
+ major: 'Vista'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.01; Windows 98; Linux
3.3.8-3.3) [Netgem; 7.7.01-51; i-Player; netbox; sezmi_totalgem]'
+ family: 'Windows'
+ major: '98'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/2.0 (compatible; MSIE 3.0; Windows 3.1)'
+ family: 'Windows'
+ major: '3.1'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 4.0; rv:52.0) Gecko/20100101
Firefox/52.0'
+ family: 'Windows'
+ major: 'NT'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera
5.11 [de]'
+ family: 'Windows'
+ major: 'ME'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Microsoft Internet Explorer/1.0 (Windows 95)'
+ family: 'Windows'
+ major: '95'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows
CE,BrailleNote; IEMobile 7.11)'
+ family: 'Windows'
+ major: 'CE'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows 2000; U) Opera 7.0 [en]'
+ family: 'Windows'
+ major: '2000'
+ minor:
+ patch:
+ patch_minor:
diff -Nru uap-core-20181019/tests/test_ua.yaml
uap-core-20190213/tests/test_ua.yaml
--- uap-core-20181019/tests/test_ua.yaml 2018-10-19 17:08:22.000000000
+0100
+++ uap-core-20190213/tests/test_ua.yaml 2019-02-13 17:27:26.000000000
+0000
@@ -1797,6 +1797,30 @@
minor: '0'
patch: '1'
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0;
rv:11.0) like Gecko PTST/1.0'
+ family: 'WebPageTest.org bot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/64.0.3282.0 Safari/537.36 PTST/1.0'
+ family: 'WebPageTest.org bot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)
Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146
Mobile Safari/537.36 PTST/180521.140508'
+ family: 'WebPageTest.org bot'
+ major: '180521'
+ minor: '140508'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+ family: 'Datanyze'
+ major:
+ minor:
+ patch:
+
- user_agent_string: 'CazoodleBot/CazoodleBot-0.1 (CazoodleBot Crawler;
http://www.cazoodle.com/cazoodlebot; cazoodle...@cazoodle.com)'
family: 'CazoodleBot'
major: '0'
@@ -4741,7 +4765,7 @@
patch:
- user_agent_string: 'FAST-mSEARCH Crawler 0.1 (ber...@fast.no)'
- family: 'mSEARCH Crawler'
+ family: 'FAST-mSEARCH Crawler'
major: '0'
minor: '1'
patch:
@@ -6908,6 +6932,18 @@
minor: '45'
patch: '2454'
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)
AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 Safari Line/7.12.0'
+ family: 'LINE'
+ major: '7'
+ minor: '12'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1; FTJ152B Build/LMY47D;
wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81
Mobile Safari/537.36 Line/6.4.1'
+ family: 'LINE'
+ major: '6'
+ minor: '4'
+ patch: '1'
+
- user_agent_string: 'Mozilla/5.0 (Linux; Android 4.1.2; GT-S7710
Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166
Mobile'
family: 'Chrome Mobile'
major: '18'
@@ -6929,6 +6965,18 @@
patch: '0'
patch_minor: '0'
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 6.0.1; ru-ru; Redmi 4
Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.3.6-g'
+ family: 'MiuiBrowser'
+ major: '10'
+ minor: '3'
+ patch: '6'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 7.1.2; ru-ru; Redmi 4A
Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/Mint Browser/1.3.3'
+ family: 'Mint Browser'
+ major: '1'
+ minor: '3'
+ patch: '3'
+
- user_agent_string: 'Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41
(KHTML, like Gecko) Large Screen WebAppManager Safari/537.41'
family: 'Safari'
major:
@@ -7724,3 +7772,45 @@
minor: '0'
patch: '169645775'
+ - user_agent_string: 'ViaFree-DK/3.8.3 (com.MTGx.ViaFree.dk; build:7383; iOS
12.1.0) Alamofire/4.7.0'
+ family: 'ViaFree'
+ major: '3'
+ minor: '8'
+ patch: '3'
+
+ - user_agent_string: 'Viafree-tvOS-DK/3.7.1 (com.MTGx.ViaFree.dk;
build:7341; tvOS 12.1.0) Alamofire/4.7.0'
+ family: 'ViaFree'
+ major: '3'
+ minor: '7'
+ patch: '1'
+
+ - user_agent_string: 'OC/15.0.5071.1000 (Skype for Business)'
+ family: 'Skype'
+ major: '15'
+ minor: '0'
+ patch: '5071'
+ patch_minor: '1000'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.1.0; TA-1024
Build/OPR1.170623.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64'
+ family: 'Google'
+ major: '8'
+ minor: '65'
+ patch: '5'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F
Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64'
+ family: 'Google'
+ major: '8'
+ minor: '65'
+ patch: '5'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Pixel 3
Build/PQ1A.181205.006; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64'
+ family: 'Google'
+ major: '8'
+ minor: '65'
+ patch: '5'
+
+ - user_agent_string: 'Microsoft Office Word 2014'
+ family: 'Word'
+ major:
+ minor:
+ patch:
diff -Nru uap-core-20181019/.travis.yml uap-core-20190213/.travis.yml
--- uap-core-20181019/.travis.yml 2018-10-19 17:08:22.000000000 +0100
+++ uap-core-20190213/.travis.yml 2019-02-13 17:27:26.000000000 +0000
@@ -1,14 +1,13 @@
sudo: false
language: node_js
node_js:
- - 4
- - 6
- 8
+ - 10
- node
script:
- "npm test"
-
+
notifications:
irc: "chat.freenode.net#ua-parser"
--- End Message ---