summaryrefslogtreecommitdiff
path: root/src/main/resources/os.yaml
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/resources/os.yaml')
-rw-r--r--src/main/resources/os.yaml678
1 files changed, 678 insertions, 0 deletions
diff --git a/src/main/resources/os.yaml b/src/main/resources/os.yaml
new file mode 100644
index 0000000..bc8b0e3
--- /dev/null
+++ b/src/main/resources/os.yaml
@@ -0,0 +1,678 @@
+
+os_parsers:
+ ##########
+ # HbbTV vendors
+ ##########
+
+ # starts with the easy one : Panasonic seems consistent across years, hope it will continue
+ #HbbTV/1.1.1 (;Panasonic;VIERA 2011;f.532;0071-0802 2000-0000;)
+ #HbbTV/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)
+ #HbbTV/1.2.1 (;Panasonic;VIERA 2013;3.672;4101-0003 0002-0000;)
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Panasonic);VIERA ([0-9]{4});'
+
+ # Sony is consistent too but do not place year like the other
+ # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
+ # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
+ # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
+
+
+ # LG is consistent too, but we need to add manually the year model
+ #Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)
+ #Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ HbbTV/1.1.1 ( ;LGE ;NetCast 3.0 ;1.0 ;1.0M ;)
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 4.0'
+ os_v1_replacement: '2013'
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 3.0'
+ os_v1_replacement: '2012'
+
+ # Samsung is on its way of normalizing their user-agent
+ # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-FXPDEUC-1102.2;;) WebKit
+ # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-MST12DEUC-1102.1;;) WebKit
+ # HbbTV/1.1.1 (;Samsung;SmartTV2012;;;) WebKit
+ # HbbTV/1.1.1 (;;;;;) Maple_2011
+ - regex: 'HbbTV/1.1.1 \(;;;;;\) Maple_2011'
+ os_replacement: 'Samsung'
+ os_v1_replacement: '2011'
+ # manage the two models of 2013
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
+ os_v2_replacement: 'UE40F7000'
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
+ os_v2_replacement: 'UE32F4500'
+ # generic Samsung (works starting in 2012)
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
+
+ # 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'
+ os_v1_replacement: '2013'
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
+ os_v1_replacement: '2012'
+ - 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
+ - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
+ os_replacement: 'FireHbbTV'
+
+ # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
+
+ # aspiegel.com spider (owned by Huawei)
+ - regex: 'AspiegelBot'
+ os_replacement: 'Other'
+
+ ##########
+ # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
+ # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Vodafone)...
+ ##########
+
+ - 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'
+ os_replacement: 'iOS'
+
+ # Special case for old ArcGIS Mobile products
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]+|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
+
+ # Special case for new ArcGIS Mobile products
+ - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
+
+ ##########
+ # Android
+ # can actually detect rooted android os. do we care?
+ ##########
+ - regex: '(Android)[ \-/](\d+)(?:\.(\d+)|)(?:[.\-]([a-z0-9]+)|)'
+
+ - regex: '(Android) Donut'
+ os_v1_replacement: '1'
+ os_v2_replacement: '2'
+
+ - regex: '(Android) Eclair'
+ os_v1_replacement: '2'
+ os_v2_replacement: '1'
+
+ - regex: '(Android) Froyo'
+ os_v1_replacement: '2'
+ os_v2_replacement: '2'
+
+ - regex: '(Android) Gingerbread'
+ os_v1_replacement: '2'
+ os_v2_replacement: '3'
+
+ - regex: '(Android) Honeycomb'
+ os_v1_replacement: '3'
+
+ # Android 9; Android 10;
+ - regex: '(Android) (\d+);'
+
+ # UCWEB
+ - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
+ os_replacement: 'Android'
+ - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
+ os_replacement: 'iOS'
+ - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
+ os_replacement: 'Windows Phone'
+ # JUC
+ - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
+ os_replacement: 'Android'
+
+ # Salesforce
+ - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
+ os_replacement: 'Android'
+
+ ##########
+ # Kindle Android
+ ##########
+ - regex: '(Silk-Accelerated=[a-z]{4,5})'
+ os_replacement: 'Android'
+
+ # Citrix Chrome App on Chrome OS
+ # Note, this needs to come before the windows parsers as the app doesn't
+ # 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)$'
+ os_replacement: 'Chrome OS'
+
+ ##########
+ # Windows
+ # http://en.wikipedia.org/wiki/Windows_NT#Releases
+ # possibility of false positive when different marketing names share same NT kernel
+ # e.g. windows server 2003 and windows xp
+ # lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
+ # (very) roughly ordered in terms of frequency of occurence of regex (win xp currently most frequent, etc)
+ ##########
+
+ # ie mobile desktop mode
+ # spoofs nt 6.1. must come before windows 7
+ - regex: '(XBLWP7)'
+ os_replacement: 'Windows Phone'
+
+ # @note: This needs to come before Windows NT 6.1
+ - regex: '(Windows ?Mobile)'
+ os_replacement: 'Windows Mobile'
+
+ - regex: '(Windows 10)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '10'
+
+ - regex: '(Windows (?:NT 5\.2|NT 5\.1))'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'XP'
+
+ - regex: '(Win(?:dows NT |32NT\/)6\.1)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '7'
+
+ - regex: '(Win(?:dows NT |32NT\/)6\.0)'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'Vista'
+
+ - regex: '(Win 9x 4\.90)'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'ME'
+
+ - regex: '(Windows NT 6\.2; ARM;)'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'RT'
+
+ - regex: '(Win(?:dows NT |32NT\/)6\.2)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '8'
+
+ - regex: '(Windows NT 6\.3; ARM;)'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'RT 8'
+ os_v2_replacement: '1'
+
+ - regex: '(Win(?:dows NT |32NT\/)6\.3)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '8'
+ os_v2_replacement: '1'
+
+ - regex: '(Win(?:dows NT |32NT\/)6\.4)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '10'
+
+ - regex: '(Windows NT 10\.0)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '10'
+
+ - regex: '(Windows NT 5\.0)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '2000'
+
+ - regex: '(WinNT4.0)'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'NT 4.0'
+
+ - regex: '(Windows ?CE)'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'CE'
+
+ - regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '$1'
+
+ - regex: 'Win16'
+ os_replacement: 'Windows'
+ os_v1_replacement: '3.1'
+
+ - regex: 'Win32'
+ os_replacement: 'Windows'
+ os_v1_replacement: '95'
+
+ # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
+ - regex: '^Box.*Windows/([\d.]+);'
+ os_replacement: 'Windows'
+ os_v1_replacement: '$1'
+
+ ##########
+ # Tizen OS from Samsung
+ # spoofs Android so pushing it above
+ ##########
+ - regex: '(Tizen)[/ ](\d+)\.(\d+)'
+
+ ##########
+ # Mac OS
+ # @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)'
+ os_replacement: 'Mac OS X'
+ - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
+ os_replacement: 'Mac OS X'
+ 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'
+ os_v1_replacement: '10'
+ os_v2_replacement: '5'
+ # Snow Leopard
+ - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '6'
+ # Lion
+ - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '7'
+ # Mountain Lion
+ - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '8'
+ # Mavericks
+ - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '9'
+ # Yosemite is Darwin/14.x but patch versions are inconsistent in the Darwin string;
+ # more accurately covered by CFNetwork regexes downstream
+
+ # IE on Mac doesn't specify version number
+ - regex: 'Mac_PowerPC'
+ os_replacement: 'Mac OS'
+
+ # builds before tiger don't seem to specify version?
+
+ # ios devices spoof (mac os x), so including intel/ppc prefixes
+ - 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+)|)'
+ os_replacement: 'Mac OS X'
+
+ ##########
+ # iOS
+ # 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+)|)'
+ os_replacement: 'ATV OS X'
+
+ - 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
+ - regex: '(iPhone|iPad|iPod); Opera'
+ os_replacement: 'iOS'
+
+ # few more stragglers
+ - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
+ os_replacement: 'iOS'
+
+ # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
+ # whether the os maps to Mac OS, or iOS, or just Darwin.
+ # See: http://user-agents.me/cfnetwork-version-list
+ - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/(5)48\.(1)\.4'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/(4)85\.1(3)\.9'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/(6)09\.(1)\.4'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/(6)(0)9'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/6(7)2\.(1)\.13'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/6(7)2\.(1)\.(1)4'
+ os_replacement: 'iOS'
+ - regex: '(CF)(Network)/6(7)(2)\.1\.15'
+ os_replacement: 'iOS'
+ os_v1_replacement: '7'
+ os_v2_replacement: '1'
+ - regex: '(CFNetwork)/6(7)2\.(0)\.(?:2|8)'
+ os_replacement: 'iOS'
+ - regex: '(CFNetwork)/709\.1'
+ os_replacement: 'iOS'
+ os_v1_replacement: '8'
+ os_v2_replacement: '0.b5'
+ - regex: '(CF)(Network)/711\.(\d)'
+ os_replacement: 'iOS'
+ os_v1_replacement: '8'
+ - regex: '(CF)(Network)/(720)\.(\d)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '10'
+ - regex: '(CF)(Network)/(760)\.(\d)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '11'
+ - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '3'
+ os_v3_replacement: '1'
+ - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '3'
+ os_v3_replacement: '2'
+ - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '3'
+ os_v3_replacement: '5'
+ - regex: '(CF)(Network)/758\.(\d)'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ - regex: 'CFNetwork/808\.3 Darwin/16\.3\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '2'
+ os_v3_replacement: '1'
+ - regex: '(CF)(Network)/808\.(\d)'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+
+ ##########
+ # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
+ # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
+ ##########
+ - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '13'
+ - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '12'
+ - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '11'
+ ##########
+ # CFNetwork iOS Apps
+ # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
+ ##########
+ - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '1'
+ - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '4'
+ - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '5'
+ - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '6'
+ - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '7'
+ - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '8'
+ os_v2_replacement: '0'
+ - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '0'
+ - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '3'
+ - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '3'
+ os_v3_replacement: '2'
+ - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '3'
+ os_v3_replacement: '3'
+ - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '0'
+ - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '1'
+ - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '2'
+ - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '2'
+ os_v3_replacement: '6'
+ - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '3'
+ - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '4'
+ - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '4'
+ os_v3_replacement: '1'
+ - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '12'
+ os_v2_replacement: '0'
+ - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '12'
+ - regex: 'CFNetwork/.* Darwin/'
+ 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+)|)'
+ os_replacement: 'iOS'
+ - regex: '\((iOS);'
+
+ ##########
+ # Apple Watch
+ ##########
+ - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ os_replacement: 'WatchOS'
+
+ ##########################
+ # Outlook on iOS >= 2.62.0
+ ##########################
+ - 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+)(?:\.(\d+)|)'
+ os_replacement: 'tvOS'
+
+ ##########
+ # Chrome OS
+ # if version 0.0.0, probably this stuff:
+ # 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+)|)'
+ os_replacement: 'Chrome OS'
+
+ ##########
+ # Linux distros
+ ##########
+ - regex: '([Dd]ebian)'
+ os_replacement: 'Debian'
+ - regex: '(Linux Mint)(?:/(\d+)|)'
+ - regex: '(Mandriva)(?: Linux|)/(?:[\d.-]+m[a-z]{2}(\d+).(\d)|)'
+
+ ##########
+ # Symbian + Symbian OS
+ # http://en.wikipedia.org/wiki/History_of_Symbian
+ ##########
+ - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
+ os_replacement: 'Symbian OS'
+ - regex: '(Symbian/3).+NokiaBrowser/7\.3'
+ os_replacement: 'Symbian^3 Anna'
+ - regex: '(Symbian/3).+NokiaBrowser/7\.4'
+ os_replacement: 'Symbian^3 Belle'
+ - regex: '(Symbian/3)'
+ os_replacement: 'Symbian^3'
+ - regex: '\b(Series 60|SymbOS|S60Version|S60V\d|S60\b)'
+ os_replacement: 'Symbian OS'
+ - regex: '(MeeGo)'
+ - regex: 'Symbian [Oo][Ss]'
+ os_replacement: 'Symbian OS'
+ - regex: 'Series40;'
+ os_replacement: 'Nokia Series 40'
+ - regex: 'Series30Plus;'
+ os_replacement: 'Nokia Series 30 Plus'
+
+ ##########
+ # BlackBerry devices
+ ##########
+ - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
+ os_replacement: 'BlackBerry OS'
+ - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
+ os_replacement: 'BlackBerry OS'
+ - 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'
+ - regex: '(Play[Bb]ook)'
+ os_replacement: 'BlackBerry Tablet OS'
+ - regex: '(Black[Bb]erry)'
+ os_replacement: 'BlackBerry OS'
+
+ ##########
+ # KaiOS
+ ##########
+ - regex: '(K[Aa][Ii]OS)\/(\d+)\.(\d+)(?:\.(\d+)|)'
+ os_replacement: 'KaiOS'
+
+ ##########
+ # Firefox OS
+ ##########
+ - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '0'
+ os_v3_replacement: '1'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '1'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '2'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '3'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '4'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '2'
+ os_v2_replacement: '0'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '2'
+ os_v2_replacement: '1'
+
+ # Firefox OS Generic
+ - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+
+
+ ##########
+ # BREW
+ # yes, Brew is lower-cased for Brew MP
+ ##########
+ - regex: '(BREW)[ /](\d+)\.(\d+)\.(\d+)'
+ - regex: '(BREW);'
+ - regex: '(Brew MP|BMP)[ /](\d+)\.(\d+)\.(\d+)'
+ os_replacement: 'Brew MP'
+ - regex: 'BMP;'
+ os_replacement: 'Brew MP'
+
+ ##########
+ # Google TV
+ ##########
+ - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+)|)|/[\da-z]+)'
+
+ - regex: '(WebTV)/(\d+).(\d+)'
+
+ ##########
+ # Chromecast
+ ##########
+ - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
+ os_replacement: 'Chromecast'
+
+ ##########
+ # Misc mobile
+ ##########
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
+ os_replacement: 'webOS'
+ - regex: '(VRE);'
+
+ ##########
+ # Generic patterns
+ # since the majority of os cases are very specific, these go last
+ ##########
+ - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
+
+ # Gentoo Linux + Kernel Version
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
+ os_replacement: 'Gentoo'
+
+ # Opera Mini Bada
+ - regex: '\((Bada);'
+
+ # just os
+ - 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: 'SunOS'
+ os_replacement: 'Solaris'
+ # Wget/x.x.x (linux-gnu)
+ - regex: '\(linux-gnu\)'
+ os_replacement: 'Linux'
+ - regex: '\(x86_64-redhat-linux-gnu\)'
+ os_replacement: 'Red Hat'
+ - regex: '\((freebsd)(\d+)\.(\d+)\)'
+ os_replacement: 'FreeBSD'
+ - regex: 'linux'
+ os_replacement: 'Linux'
+
+ # Roku Digital-Video-Players https://www.roku.com/
+ - regex: '^(Roku)/DVP-(\d+)\.(\d+)'