Matomo Analytics – Ethical Stats. Powerful Insights. - Version 4.4.1

Version Description

Download this release

Release Info

Developer matomoteam
Plugin Icon 128x128 Matomo Analytics – Ethical Stats. Powerful Insights.
Version 4.4.1
Comparing to
See all releases

Code changes from version 4.3.1 to 4.4.1

Files changed (227) hide show
  1. app/LEGALNOTICE +3 -3
  2. app/README.md +2 -2
  3. app/config/global.ini.php +21 -1
  4. app/config/global.php +8 -0
  5. app/core/API/ApiRenderer.php +1 -1
  6. app/core/Archive/ArchiveInvalidator.php +1 -10
  7. app/core/ArchiveProcessor.php +13 -1
  8. app/core/ArchiveProcessor/Loader.php +2 -12
  9. app/core/AssetManager/UIAssetCacheBuster.php +7 -4
  10. app/core/CliMulti/Output.php +2 -2
  11. app/core/CliMulti/Process.php +44 -23
  12. app/core/Common.php +10 -32
  13. app/core/Concurrency/Lock.php +2 -3
  14. app/core/Config.php +7 -6
  15. app/core/CronArchive.php +3 -3
  16. app/core/DataAccess/ArchivingDbAdapter.php +1 -22
  17. app/core/DataAccess/LogAggregator.php +3 -7
  18. app/core/DataAccess/Model.php +62 -39
  19. app/core/DataTable.php +18 -1
  20. app/core/DataTable/Filter/PivotByDimension.php +4 -0
  21. app/core/DataTable/Renderer/Csv.php +1 -1
  22. app/core/DataTable/Row.php +12 -1
  23. app/core/Date.php +1 -1
  24. app/core/Db.php +23 -0
  25. app/core/Db/Adapter.php +41 -6
  26. app/core/Db/BatchInsert.php +2 -1
  27. app/core/DeviceDetector/DeviceDetectorFactory.php +1 -1
  28. app/core/EventDispatcher.php +9 -1
  29. app/core/Exception/NotYetInstalledException.php +8 -0
  30. app/core/Filesystem.php +7 -4
  31. app/core/FrontController.php +2 -1
  32. app/core/Http.php +59 -6
  33. app/core/IP.php +40 -14
  34. app/core/Log.php +6 -2
  35. app/core/LogDeleter.php +2 -1
  36. app/core/Mail.php +21 -1
  37. app/core/Option.php +1 -1
  38. app/core/Piwik.php +1 -1
  39. app/core/Plugin/Manager.php +1 -0
  40. app/core/Profiler.php +8 -2
  41. app/core/Site.php +4 -0
  42. app/core/Tracker.php +3 -1
  43. app/core/Tracker/Failures.php +1 -1
  44. app/core/Tracker/GoalManager.php +1 -1
  45. app/core/Tracker/PageUrl.php +2 -2
  46. app/core/Tracker/Request.php +24 -14
  47. app/core/Tracker/TrackerConfig.php +11 -1
  48. app/core/Tracker/Visit.php +2 -2
  49. app/core/Tracker/VisitorRecognizer.php +1 -1
  50. app/core/Twig.php +1 -1
  51. app/core/Updates/4.0.0-b1.php +120 -44
  52. app/core/Updates/4.0.0-b3.php +60 -0
  53. app/core/Updates/4.0.0-rc3.php +44 -0
  54. app/core/Updates/4.0.0-rc4.php +68 -0
  55. app/core/Updates/4.0.1-b1.php +56 -0
  56. app/core/Updates/4.0.4-b1.php +64 -0
  57. app/core/Updates/4.4.0-b1.php +42 -0
  58. app/core/Url.php +6 -6
  59. app/core/Validators/CharacterLength.php +1 -1
  60. app/core/Version.php +1 -1
  61. app/js/piwik.min.js +36 -36
  62. app/lang/ar.json +0 -3
  63. app/lang/be.json +0 -3
  64. app/lang/bg.json +0 -3
  65. app/lang/ca.json +0 -3
  66. app/lang/cs.json +37 -27
  67. app/lang/da.json +0 -4
  68. app/lang/de.json +118 -25
  69. app/lang/el.json +30 -10
  70. app/lang/en.json +26 -7
  71. app/lang/es-ar.json +114 -16
  72. app/lang/es.json +24 -9
  73. app/lang/et.json +0 -2
  74. app/lang/eu.json +0 -2
  75. app/lang/fa.json +0 -3
  76. app/lang/fi.json +2 -5
  77. app/lang/fr.json +2 -6
  78. app/lang/hi.json +0 -3
  79. app/lang/hu.json +0 -3
  80. app/lang/id.json +0 -3
  81. app/lang/it.json +28 -13
  82. app/lang/ja.json +2 -6
  83. app/lang/ka.json +0 -3
  84. app/lang/ko.json +0 -3
  85. app/lang/lt.json +0 -3
  86. app/lang/lv.json +0 -3
  87. app/lang/nb.json +0 -3
  88. app/lang/nl.json +2 -5
  89. app/lang/nn.json +0 -2
  90. app/lang/pl.json +0 -3
  91. app/lang/pt-br.json +46 -9
  92. app/lang/pt.json +2 -6
  93. app/lang/ro.json +0 -3
  94. app/lang/ru.json +0 -3
  95. app/lang/sk.json +0 -1
  96. app/lang/sq.json +38 -8
  97. app/lang/sr.json +4 -6
  98. app/lang/sv.json +2 -6
  99. app/lang/th.json +0 -3
  100. app/lang/tl.json +0 -3
  101. app/lang/tr.json +30 -10
  102. app/lang/uk.json +0 -3
  103. app/lang/vi.json +0 -3
  104. app/lang/zh-cn.json +2 -6
  105. app/lang/zh-tw.json +15 -9
  106. app/libs/Zend/Db/Adapter/Mysqli.php +1 -0
  107. app/libs/upgradephp/upgrade.php +0 -26
  108. app/matomo.js +36 -36
  109. app/piwik.js +36 -36
  110. app/plugins/API/Controller.php +1 -1
  111. app/plugins/API/Filter/DataComparisonFilter.php +1 -1
  112. app/plugins/API/Filter/DataComparisonFilter/ComparisonRowGenerator.php +2 -2
  113. app/plugins/Actions/Actions/ActionSiteSearch.php +3 -3
  114. app/plugins/Actions/DataTable/Filter/Actions.php +1 -1
  115. app/plugins/Actions/VisitorDetails.php +1 -1
  116. app/plugins/CoreAdminHome/Commands/InvalidateReportData.php +6 -4
  117. app/plugins/CoreAdminHome/Commands/VersionInfo.php +30 -0
  118. app/plugins/CoreAdminHome/Controller.php +1 -0
  119. app/plugins/CoreAdminHome/Emails/RecoveryCodesRegeneratedEmail.php +21 -0
  120. app/plugins/CoreAdminHome/Emails/RecoveryCodesShowedEmail.php +21 -0
  121. app/plugins/CoreAdminHome/Emails/SecurityNotificationEmail.php +85 -0
  122. app/plugins/CoreAdminHome/Emails/SettingsChangedEmail.php +43 -0
  123. app/plugins/CoreAdminHome/Emails/TokenAuthCreatedEmail.php +33 -0
  124. app/plugins/CoreAdminHome/Emails/TokenAuthDeletedEmail.php +43 -0
  125. app/plugins/CoreAdminHome/Emails/TwoFactorAuthDisabledEmail.php +21 -0
  126. app/plugins/CoreAdminHome/Emails/TwoFactorAuthEnabledEmail.php +21 -0
  127. app/plugins/CoreAdminHome/Emails/UserCreatedEmail.php +33 -0
  128. app/plugins/CoreAdminHome/Emails/UserDeletedEmail.php +33 -0
  129. app/plugins/CoreAdminHome/OptOutManager.php +10 -3
  130. app/plugins/CoreAdminHome/templates/_securityNotificationEmail.twig +2 -0
  131. app/plugins/CoreAdminHome/templates/generalSettings.twig +4 -1
  132. app/plugins/CoreConsole/Commands/CoreArchiver.php +6 -2
  133. app/plugins/CoreConsole/Commands/GenerateSystemCheck.php +106 -0
  134. app/plugins/CoreHome/Columns/UserId.php +1 -1
  135. app/plugins/CoreHome/Columns/VisitorId.php +11 -5
  136. app/plugins/CoreHome/DataTableRowAction/RowEvolution.php +2 -2
  137. app/plugins/CoreHome/Tracker/VisitRequestProcessor.php +2 -2
  138. app/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.html +2 -0
  139. app/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less +9 -0
  140. app/plugins/CoreHome/templates/_dataTable.twig +1 -0
  141. app/plugins/CorePluginsAdmin/API.php +50 -0
  142. app/plugins/CorePluginsAdmin/Commands/ActivatePlugin.php +5 -0
  143. app/plugins/CorePluginsAdmin/Controller.php +6 -6
  144. app/plugins/CorePluginsAdmin/angularjs/form-field/field-site.html +2 -0
  145. app/plugins/CoreVisualizations/Visualizations/Cloud.php +2 -2
  146. app/plugins/CoreVisualizations/Visualizations/Sparklines.php +10 -3
  147. app/plugins/CustomDimensions/Tracker/CustomDimensionsRequestProcessor.php +1 -1
  148. app/plugins/Dashboard/stylesheets/widget.less +3 -1
  149. app/plugins/DevicesDetection/Columns/BrowserName.php +2 -2
  150. app/plugins/DevicesDetection/Columns/Os.php +2 -2
  151. app/plugins/Diagnostics/Diagnostic/CronArchivingCheck.php +9 -1
  152. app/plugins/Diagnostics/Diagnostic/CronArchivingLastRunCheck.php +8 -2
  153. app/plugins/Diagnostics/Diagnostic/DiagnosticResult.php +10 -5
  154. app/plugins/Diagnostics/Diagnostic/PhpExtensionsCheck.php +4 -12
  155. app/plugins/Diagnostics/Diagnostic/PhpSettingsCheck.php +1 -0
  156. app/plugins/Diagnostics/Diagnostic/RequiredPrivateDirectories.php +2 -2
  157. app/plugins/GeoIp2/GeoIP2AutoUpdater.php +1 -1
  158. app/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php +1 -1
  159. app/plugins/Insights/DataTable/Filter/Insight.php +12 -1
  160. app/plugins/Installation/templates/_systemCheckSection.twig +1 -1
  161. app/plugins/Intl/Commands/GenerateIntl.php +1 -1
  162. app/plugins/Login/Controller.php +13 -0
  163. app/plugins/Login/Login.php +7 -4
  164. app/plugins/MobileMessaging/SMSProvider.php +1 -1
  165. app/plugins/Monolog/Processor/ExceptionToTextProcessor.php +16 -0
  166. app/plugins/Monolog/config/config.php +38 -0
  167. app/plugins/Morpheus/fonts/matomo.svg +1 -0
  168. app/plugins/Morpheus/fonts/matomo.ttf +0 -0
  169. app/plugins/Morpheus/fonts/matomo.woff +0 -0
  170. app/plugins/Morpheus/fonts/matomo.woff2 +0 -0
  171. app/plugins/Morpheus/stylesheets/base/icons.css +4 -1
  172. app/plugins/Morpheus/templates/demo.twig +2 -1
  173. app/plugins/Morpheus/templates/javascriptCode.twig +3 -3
  174. app/plugins/MultiSites/API.php +18 -3
  175. app/plugins/MultiSites/angularjs/site/site.directive.html +2 -2
  176. app/plugins/Overlay/client/client.js-e +0 -258
  177. app/plugins/Overlay/javascripts/Piwik_Overlay.js +6 -1
  178. app/plugins/PrivacyManager/LogDataPurger.php +7 -0
  179. app/plugins/Referrers/Columns/Base.php +13 -13
  180. app/plugins/Referrers/Columns/Campaign.php +1 -7
  181. app/plugins/Referrers/Columns/ReferrerUrl.php +2 -2
  182. app/plugins/Referrers/Columns/Website.php +1 -14
  183. app/plugins/Referrers/SearchEngine.php +3 -7
  184. app/plugins/ScheduledReports/Controller.php +2 -2
  185. app/plugins/SegmentEditor/SegmentFormatter.php +1 -1
  186. app/plugins/SegmentEditor/SegmentSelectorControl.php +1 -1
  187. app/plugins/SitesManager/Controller.php +20 -11
  188. app/plugins/SitesManager/GtmSiteTypeGuesser.php +16 -2
  189. app/plugins/SitesManager/SiteUrls.php +2 -2
  190. app/plugins/SitesManager/SitesManager.php +6 -0
  191. app/plugins/TagManager/Context/WebContext.php +2 -2
  192. app/plugins/TagManager/Template/Tag/MatomoTag.web.js +1 -1
  193. app/plugins/TwoFactorAuth/Controller.php +33 -0
  194. app/plugins/TwoFactorAuth/Dao/RecoveryCodeDao.php +1 -1
  195. app/plugins/UserCountry/API.php +6 -24
  196. app/plugins/UserCountry/LocationProvider.php +8 -7
  197. app/plugins/UsersManager/API.php +55 -16
  198. app/plugins/UsersManager/Controller.php +27 -0
  199. app/plugins/UsersManager/Model.php +9 -0
  200. app/plugins/UsersManager/UsersManager.php +1 -1
  201. app/vendor/autoload.php +1 -1
  202. app/vendor/composer/ClassLoader.php +3 -1
  203. app/vendor/composer/InstalledVersions.php +326 -721
  204. app/vendor/composer/autoload_classmap.php +53 -31
  205. app/vendor/composer/autoload_files.php +1 -0
  206. app/vendor/composer/autoload_psr4.php +2 -1
  207. app/vendor/composer/autoload_real.php +7 -7
  208. app/vendor/composer/autoload_static.php +66 -38
  209. app/vendor/composer/installed.php +450 -455
  210. app/vendor/matomo/cache/README.md +25 -2
  211. app/vendor/matomo/cache/src/Backend/BaseDecorator.php +62 -0
  212. app/vendor/matomo/cache/src/Backend/DefaultTimeoutDecorated.php +43 -0
  213. app/vendor/matomo/cache/src/Backend/Factory.php +29 -0
  214. app/vendor/matomo/cache/src/Backend/File.php +10 -0
  215. app/vendor/matomo/cache/src/Backend/KeyPrefixDecorated.php +58 -0
  216. app/vendor/matomo/device-detector/DeviceDetector.php +4 -2
  217. app/vendor/matomo/device-detector/Parser/Client/Browser.php +8 -3
  218. app/vendor/matomo/device-detector/Parser/Device/AbstractDeviceParser.php +57 -0
  219. app/vendor/matomo/device-detector/Parser/Device/HbbTv.php +1 -1
  220. app/vendor/matomo/device-detector/Parser/Device/ShellTv.php +66 -0
  221. app/vendor/matomo/device-detector/README.md +6 -5
  222. app/vendor/matomo/device-detector/regexes/bots.yml +120 -10
  223. app/vendor/matomo/device-detector/regexes/client/browsers.yml +50 -5
  224. app/vendor/matomo/device-detector/regexes/client/mobile_apps.yml +61 -2
  225. app/vendor/matomo/device-detector/regexes/client/pim.yml +35 -0
  226. app/vendor/matomo/device-detector/regexes/device/car_browsers.yml +1 -1
  227. app/vendor/matomo/device-detector/regexes/device/mobiles.yml +558 -228
app/LEGALNOTICE CHANGED
@@ -217,7 +217,7 @@ THIRD-PARTY COMPONENTS AND LIBRARIES
217
  Link: http://raphaeljs.com/
218
  License: MIT (Expat)
219
 
220
- Name: iFrame Resizer
221
  Link: https://github.com/davidjbradshaw/iframe-resizer
222
  License: MIT
223
 
@@ -279,7 +279,7 @@ THIRD-PARTY CONTENT
279
  License: GPL
280
  By: Alessandro Rei - http://www.kde-look.org/usermanager/search.php?username=mentalrey
281
 
282
- Name: Material icons ("icon-info2", "icon-outline", "icon-settings", "icon-form", "icon-play", "icon-pause", "icon-replay", "icon-skip-next", "icon-skip-forward", "icon-stop", "icon-fast-forward", "icon-fast-rewind", "icon-bug", "icon-upload", "icon-segmented-visits-log") in plugins/Morpheus/fonts, and plugins/Morpheus/images/compare.svg
283
  Link: https://design.google.com/icons/
284
  License: Apache License Version 2.0
285
 
@@ -294,6 +294,6 @@ THIRD-PARTY CONTENT
294
  Notes:
295
  - the "New BSD" license refers to either the "Modified BSD" and "Simplified BSD"
296
  licenses (2- or 3-clause), which are GPL compatible.
297
- - icons for browsers, operating systems, browser plugins, brands, search engines, social media websites
298
  and flags of countries are nominative use of third-party trademarks when
299
  referring to the corresponding product or entity
217
  Link: http://raphaeljs.com/
218
  License: MIT (Expat)
219
 
220
+ Name: iFrame Resizer
221
  Link: https://github.com/davidjbradshaw/iframe-resizer
222
  License: MIT
223
 
279
  License: GPL
280
  By: Alessandro Rei - http://www.kde-look.org/usermanager/search.php?username=mentalrey
281
 
282
+ Name: Material icons ("icon-info2", "icon-outline", "icon-settings", "icon-form", "icon-play", "icon-pause", "icon-replay", "icon-skip-next", "icon-skip-forward", "icon-stop", "icon-fast-forward", "icon-fast-rewind", "icon-bug", "icon-upload", "icon-segmented-visits-log", "icon-clock") in plugins/Morpheus/fonts, and plugins/Morpheus/images/compare.svg
283
  Link: https://design.google.com/icons/
284
  License: Apache License Version 2.0
285
 
294
  Notes:
295
  - the "New BSD" license refers to either the "Modified BSD" and "Simplified BSD"
296
  licenses (2- or 3-clause), which are GPL compatible.
297
+ - icons for browsers, operating systems, browser plugins, brands, search engines, social media websites
298
  and flags of countries are nominative use of third-party trademarks when
299
  referring to the corresponding product or entity
app/README.md CHANGED
@@ -1,7 +1,7 @@
1
  # Matomo (formerly Piwik) - matomo.org
2
 
3
- [![Latest Stable Version](https://poser.pugx.org/piwik/piwik/v/stable)](https://matomo.org/download/)
4
- [![Latest Unstable Version](https://poser.pugx.org/piwik/piwik/v/unstable)](https://packagist.org/packages/piwik/piwik)
5
  [![License](https://poser.pugx.org/piwik/piwik/license)](https://matomo.org/free-software/)
6
 
7
  ## Code Status
1
  # Matomo (formerly Piwik) - matomo.org
2
 
3
+ [![Latest Stable Version](https://poser.pugx.org/matomo/matomo/v/stable)](https://matomo.org/download/)
4
+ [![Latest Unstable Version](https://poser.pugx.org/matomo/matomo/v/unstable)](https://builds.matomo.org/)
5
  [![License](https://poser.pugx.org/piwik/piwik/license)](https://matomo.org/free-software/)
6
 
7
  ## Code Status
app/config/global.ini.php CHANGED
@@ -57,6 +57,11 @@ password =
57
  dbname =
58
  port = 3306
59
 
 
 
 
 
 
60
  [database_tests]
61
  host = localhost
62
  username = "@USERNAME@"
@@ -87,7 +92,7 @@ port =
87
  enable_logging = 0
88
 
89
  [log]
90
- ; possible values for log: screen, database, file
91
  log_writers[] = screen
92
 
93
  ; log level, everything logged w/ this level or one of greater severity
@@ -100,10 +105,16 @@ log_level = WARN
100
  ; this allows you to log more information to one backend vs another.
101
  ; log_level_screen =
102
  ; log_level_file =
 
 
103
 
104
  ; if configured to log in a file, log entries will be made to this file
105
  logger_file_path = tmp/logs/matomo.log
106
 
 
 
 
 
107
  [Cache]
108
  ; available backends are 'file', 'array', 'null', 'redis', 'chained'
109
  ; 'array' will cache data only during one request
@@ -482,6 +493,10 @@ login_allowlist_apply_to_reporting_api_requests = 1
482
  ; Uncomment the next line to set a URL to redirect the user to after they log out of Matomo.
483
  ; login_logout_url = http://...
484
 
 
 
 
 
485
  ; Set to 1 to disable the framebuster on standard Non-widgets pages (a click-jacking countermeasure).
486
  ; Default is 0 (i.e., bust frames on all non Widget pages such as Login, API, Widgets, Email reports, etc.).
487
  enable_framed_pages = 0
@@ -632,6 +647,11 @@ multi_server_environment = 0
632
  ; By enabling this flag the header HTTP_X_FORWARDED_URI will be considered for the current script name.
633
  proxy_uri_header = 0
634
 
 
 
 
 
 
635
  ; Whether to enable trusted host checking. This can be disabled if you're running Matomo
636
  ; on several URLs and do not wish to constantly edit the trusted host list.
637
  enable_trusted_host_check = 1
57
  dbname =
58
  port = 3306
59
 
60
+ ; If you are using Amazon Aurora you can enable aurora_read_only_read_committed to prevent purge lag which happens
61
+ ; when internal garbage collection is blocked by long-running archiving queries. The setting will be only applied
62
+ ; if you are using Amazon Aurora and have configured a reader database.
63
+ aurora_readonly_read_committed =
64
+
65
  [database_tests]
66
  host = localhost
67
  username = "@USERNAME@"
92
  enable_logging = 0
93
 
94
  [log]
95
+ ; possible values for log: screen, database, file, errorlog, syslog
96
  log_writers[] = screen
97
 
98
  ; log level, everything logged w/ this level or one of greater severity
105
  ; this allows you to log more information to one backend vs another.
106
  ; log_level_screen =
107
  ; log_level_file =
108
+ ; log_level_errorlog =
109
+ ; log_level_syslog =
110
 
111
  ; if configured to log in a file, log entries will be made to this file
112
  logger_file_path = tmp/logs/matomo.log
113
 
114
+ ; if configured to log to syslog, mark them with this identifier string.
115
+ ; This acts as an easy-to-find tag in the syslog.
116
+ logger_syslog_ident = 'matomo'
117
+
118
  [Cache]
119
  ; available backends are 'file', 'array', 'null', 'redis', 'chained'
120
  ; 'array' will cache data only during one request
493
  ; Uncomment the next line to set a URL to redirect the user to after they log out of Matomo.
494
  ; login_logout_url = http://...
495
 
496
+ ; By default the logme functionality to automatically log in users using url params is disabled
497
+ ; You can enable that by setting this to "1". See https://matomo.org/faq/how-to/faq_30/ for more details
498
+ login_allow_logme = 0
499
+
500
  ; Set to 1 to disable the framebuster on standard Non-widgets pages (a click-jacking countermeasure).
501
  ; Default is 0 (i.e., bust frames on all non Widget pages such as Login, API, Widgets, Email reports, etc.).
502
  enable_framed_pages = 0
647
  ; By enabling this flag the header HTTP_X_FORWARDED_URI will be considered for the current script name.
648
  proxy_uri_header = 0
649
 
650
+ ; If set to 1 we use the last IP in the list of proxy IPs when determining the client IP. Using the last IP can be more
651
+ ; secure when using proxy headers in combination with a load balancer. By default the first IP is read according to RFC7239
652
+ ; which is required when the client sends the IP through a proxy header as well as the load balancer.
653
+ proxy_ip_read_last_in_list = 0
654
+
655
  ; Whether to enable trusted host checking. This can be disabled if you're running Matomo
656
  ; on several URLs and do not wish to constantly edit the trusted host list.
657
  enable_trusted_host_check = 1
app/config/global.php CHANGED
@@ -175,6 +175,14 @@ return array(
175
  return $ipsResolved;
176
  },
177
 
 
 
 
 
 
 
 
 
178
  'Piwik\Tracker\VisitorRecognizer' => DI\autowire()
179
  ->constructorParameter('trustCookiesOnly', DI\get('ini.Tracker.trust_visitors_cookies'))
180
  ->constructorParameter('visitStandardLength', DI\get('ini.Tracker.visit_standard_length'))
175
  return $ipsResolved;
176
  },
177
 
178
+ /**
179
+ * This defines a list of hostnames Matomo's Http class will deny requests to. Wildcards (*) can be used in the
180
+ * beginning to match any subdomain level or in the end to match any tlds
181
+ */
182
+ 'http.blocklist.hosts' => [
183
+ '*.amazonaws.com',
184
+ ],
185
+
186
  'Piwik\Tracker\VisitorRecognizer' => DI\autowire()
187
  ->constructorParameter('trustCookiesOnly', DI\get('ini.Tracker.trust_visitors_cookies'))
188
  ->constructorParameter('visitStandardLength', DI\get('ini.Tracker.visit_standard_length'))
app/core/API/ApiRenderer.php CHANGED
@@ -120,7 +120,7 @@ abstract class ApiRenderer
120
  */
121
  public static function factory($format, $request)
122
  {
123
- if (Common::mb_strtolower($format) === 'json2') {
124
  $format = 'json';
125
  }
126
  $formatToCheck = '\\' . ucfirst(strtolower($format));
120
  */
121
  public static function factory($format, $request)
122
  {
123
+ if (mb_strtolower($format) === 'json2') {
124
  $format = 'json';
125
  }
126
  $formatToCheck = '\\' . ucfirst(strtolower($format));
app/core/Archive/ArchiveInvalidator.php CHANGED
@@ -9,10 +9,7 @@
9
 
10
  namespace Piwik\Archive;
11
 
12
- use Piwik\Access;
13
  use Piwik\Archive\ArchiveInvalidator\InvalidationResult;
14
- use Piwik\ArchiveProcessor\ArchivingStatus;
15
- use Piwik\ArchiveProcessor\Loader;
16
  use Piwik\ArchiveProcessor\Rules;
17
  use Piwik\Config;
18
  use Piwik\Container\StaticContainer;
@@ -73,11 +70,6 @@ class ArchiveInvalidator
73
  */
74
  private $model;
75
 
76
- /**
77
- * @var ArchivingStatus
78
- */
79
- private $archivingStatus;
80
-
81
  /**
82
  * @var SegmentArchiving
83
  */
@@ -93,10 +85,9 @@ class ArchiveInvalidator
93
  */
94
  private $allIdSitesCache;
95
 
96
- public function __construct(Model $model, ArchivingStatus $archivingStatus, LoggerInterface $logger)
97
  {
98
  $this->model = $model;
99
- $this->archivingStatus = $archivingStatus;
100
  $this->segmentArchiving = null;
101
  $this->logger = $logger;
102
  }
9
 
10
  namespace Piwik\Archive;
11
 
 
12
  use Piwik\Archive\ArchiveInvalidator\InvalidationResult;
 
 
13
  use Piwik\ArchiveProcessor\Rules;
14
  use Piwik\Config;
15
  use Piwik\Container\StaticContainer;
70
  */
71
  private $model;
72
 
 
 
 
 
 
73
  /**
74
  * @var SegmentArchiving
75
  */
85
  */
86
  private $allIdSitesCache;
87
 
88
+ public function __construct(Model $model, LoggerInterface $logger)
89
  {
90
  $this->model = $model;
 
91
  $this->segmentArchiving = null;
92
  $this->logger = $logger;
93
  }
app/core/ArchiveProcessor.php CHANGED
@@ -12,12 +12,14 @@ use Exception;
12
  use Piwik\Archive\DataTableFactory;
13
  use Piwik\ArchiveProcessor\Parameters;
14
  use Piwik\ArchiveProcessor\Rules;
 
15
  use Piwik\DataAccess\ArchiveWriter;
16
  use Piwik\DataAccess\LogAggregator;
17
  use Piwik\DataTable\Manager;
18
  use Piwik\DataTable\Map;
19
  use Piwik\DataTable\Row;
20
  use Piwik\Segment\SegmentExpression;
 
21
 
22
  /**
23
  * Used by {@link Piwik\Plugin\Archiver} instances to insert and aggregate archive data.
@@ -202,14 +204,24 @@ class ArchiveProcessor
202
  $columnsToRenameAfterAggregation = null,
203
  $countRowsRecursive = true)
204
  {
 
 
 
205
  if (!is_array($recordNames)) {
206
  $recordNames = array($recordNames);
207
  }
208
 
 
 
209
  $nameToCount = array();
210
  foreach ($recordNames as $recordName) {
211
  $latestUsedTableId = Manager::getInstance()->getMostRecentTableId();
212
 
 
 
 
 
 
213
  $table = $this->aggregateDataTableRecord($recordName, $columnsAggregationOperation, $columnsToRenameAfterAggregation);
214
 
215
  $nameToCount[$recordName]['level0'] = $table->getRowsCount();
@@ -582,7 +594,7 @@ class ArchiveProcessor
582
  if (empty($columnsToRenameAfterAggregation)) {
583
  return;
584
  }
585
-
586
  foreach ($table->getRows() as $row) {
587
  foreach ($columnsToRenameAfterAggregation as $oldName => $newName) {
588
  $row->renameColumn($oldName, $newName);
12
  use Piwik\Archive\DataTableFactory;
13
  use Piwik\ArchiveProcessor\Parameters;
14
  use Piwik\ArchiveProcessor\Rules;
15
+ use Piwik\Container\StaticContainer;
16
  use Piwik\DataAccess\ArchiveWriter;
17
  use Piwik\DataAccess\LogAggregator;
18
  use Piwik\DataTable\Manager;
19
  use Piwik\DataTable\Map;
20
  use Piwik\DataTable\Row;
21
  use Piwik\Segment\SegmentExpression;
22
+ use Psr\Log\LoggerInterface;
23
 
24
  /**
25
  * Used by {@link Piwik\Plugin\Archiver} instances to insert and aggregate archive data.
204
  $columnsToRenameAfterAggregation = null,
205
  $countRowsRecursive = true)
206
  {
207
+ /** @var LoggerInterface $logger */
208
+ $logger = StaticContainer::get(LoggerInterface::class);
209
+
210
  if (!is_array($recordNames)) {
211
  $recordNames = array($recordNames);
212
  }
213
 
214
+ $archiveDescription = $this->params . '';
215
+
216
  $nameToCount = array();
217
  foreach ($recordNames as $recordName) {
218
  $latestUsedTableId = Manager::getInstance()->getMostRecentTableId();
219
 
220
+ $logger->debug("aggregating record {record} [archive = {archive}]", [
221
+ 'record' => $recordName,
222
+ 'archive' => $archiveDescription,
223
+ ]);
224
+
225
  $table = $this->aggregateDataTableRecord($recordName, $columnsAggregationOperation, $columnsToRenameAfterAggregation);
226
 
227
  $nameToCount[$recordName]['level0'] = $table->getRowsCount();
594
  if (empty($columnsToRenameAfterAggregation)) {
595
  return;
596
  }
597
+
598
  foreach ($table->getRows() as $row) {
599
  foreach ($columnsToRenameAfterAggregation as $oldName => $newName) {
600
  $row->renameColumn($oldName, $newName);
app/core/ArchiveProcessor/Loader.php CHANGED
@@ -154,18 +154,8 @@ class Loader
154
  $this->logger->info("initiating archiving via core:archive for " . $this->params);
155
  }
156
 
157
- /** @var ArchivingStatus $archivingStatus */
158
- $archivingStatus = StaticContainer::get(ArchivingStatus::class);
159
- $locked = $archivingStatus->archiveStarted($this->params);
160
-
161
- try {
162
- list($visits, $visitsConverted) = $this->prepareCoreMetricsArchive($visits, $visitsConverted);
163
- list($idArchive, $visits) = $this->prepareAllPluginsArchive($visits, $visitsConverted);
164
- } finally {
165
- if ($locked) {
166
- $archivingStatus->archiveFinished();
167
- }
168
- }
169
 
170
  if ($this->isThereSomeVisits($visits) || PluginsArchiver::doesAnyPluginArchiveWithoutVisits()) {
171
  return [[$idArchive], $visits];
154
  $this->logger->info("initiating archiving via core:archive for " . $this->params);
155
  }
156
 
157
+ list($visits, $visitsConverted) = $this->prepareCoreMetricsArchive($visits, $visitsConverted);
158
+ list($idArchive, $visits) = $this->prepareAllPluginsArchive($visits, $visitsConverted);
 
 
 
 
 
 
 
 
 
 
159
 
160
  if ($this->isThereSomeVisits($visits) || PluginsArchiver::doesAnyPluginArchiveWithoutVisits()) {
161
  return [[$idArchive], $visits];
app/core/AssetManager/UIAssetCacheBuster.php CHANGED
@@ -33,14 +33,17 @@ class UIAssetCacheBuster extends Singleton
33
 
34
  $masterFile = PIWIK_INCLUDE_PATH . '/.git/refs/heads/master';
35
  $currentGitHash = file_exists($masterFile) ? @file_get_contents($masterFile) : null;
 
36
 
37
- $plugins = !$pluginNames ? Manager::getInstance()->getLoadedPluginsName() : $pluginNames;
38
  sort($plugins);
39
 
40
  $pluginsInfo = '';
41
  foreach ($plugins as $pluginName) {
42
- $plugin = Manager::getInstance()->getLoadedPlugin($pluginName);
43
- $pluginsInfo .= $plugin->getPluginName() . $plugin->getVersion() . ',';
 
 
44
  }
45
 
46
  $cacheBuster = md5($pluginsInfo . PHP_VERSION . Version::VERSION . trim($currentGitHash));
@@ -51,7 +54,7 @@ class UIAssetCacheBuster extends Singleton
51
 
52
  $cachedCacheBuster = $cacheBuster;
53
  }
54
-
55
  return $cachedCacheBuster;
56
  }
57
 
33
 
34
  $masterFile = PIWIK_INCLUDE_PATH . '/.git/refs/heads/master';
35
  $currentGitHash = file_exists($masterFile) ? @file_get_contents($masterFile) : null;
36
+ $manager = Manager::getInstance();
37
 
38
+ $plugins = !$pluginNames ? $manager->getActivatedPlugins() : $pluginNames;
39
  sort($plugins);
40
 
41
  $pluginsInfo = '';
42
  foreach ($plugins as $pluginName) {
43
+ if ($manager->isPluginLoaded($pluginName)) {
44
+ $plugin = $manager->getLoadedPlugin($pluginName);
45
+ $pluginsInfo .= $plugin->getPluginName() . $plugin->getVersion() . ',';
46
+ }
47
  }
48
 
49
  $cacheBuster = md5($pluginsInfo . PHP_VERSION . Version::VERSION . trim($currentGitHash));
54
 
55
  $cachedCacheBuster = $cacheBuster;
56
  }
57
+
58
  return $cachedCacheBuster;
59
  }
60
 
app/core/CliMulti/Output.php CHANGED
@@ -63,8 +63,8 @@ class Output
63
  $search = '#!/usr/bin/env php';
64
  if (!empty($content)
65
  && is_string($content)
66
- && Common::mb_substr(trim($content), 0, strlen($search)) === $search) {
67
- $content = trim(Common::mb_substr(trim($content), strlen($search)));
68
  }
69
  return $content;
70
  }
63
  $search = '#!/usr/bin/env php';
64
  if (!empty($content)
65
  && is_string($content)
66
+ && mb_substr(trim($content), 0, strlen($search)) === $search) {
67
+ $content = trim(mb_substr(trim($content), strlen($search)));
68
  }
69
  return $content;
70
  }
app/core/CliMulti/Process.php CHANGED
@@ -22,6 +22,9 @@ use Piwik\SettingsServer;
22
  */
23
  class Process
24
  {
 
 
 
25
  private $finished = null;
26
  private $pidFile = '';
27
  private $timeCreation = null;
@@ -188,42 +191,67 @@ class Process
188
 
189
  public static function isSupported()
190
  {
 
 
 
 
 
 
 
 
191
  if (defined('PIWIK_TEST_MODE')
192
  && self::isForcingAsyncProcessMode()
193
  ) {
194
- return false;
195
  }
196
 
197
  if (SettingsServer::isWindows()) {
198
- return false;
199
  }
200
 
201
  if (self::isMethodDisabled('shell_exec')) {
202
- return false;
 
203
  }
204
 
205
- if (self::isMethodDisabled('getmypid')) {
206
- return false;
 
207
  }
208
 
209
  if (self::isSystemNotSupported()) {
210
- return false;
211
  }
212
 
213
- if (!self::commandExists('ps') || !self::returnsSuccessCode('ps') || !self::commandExists('awk')) {
214
- return false;
 
 
 
 
 
215
  }
216
 
217
- $pid = @getmypid();
218
- if (empty($pid) || !in_array($pid, self::getRunningProcesses())) {
219
- return false;
220
  }
221
 
222
  if (!self::isProcFSMounted() && !SettingsServer::isMac()) {
223
- return false;
224
  }
225
 
226
- return true;
 
 
 
 
 
 
 
 
 
 
 
227
  }
228
 
229
  private static function isSystemNotSupported()
@@ -254,18 +282,11 @@ class Process
254
  private static function returnsSuccessCode($command)
255
  {
256
  $exec = $command . ' > /dev/null 2>&1; echo $?';
257
- $returnCode = shell_exec($exec);
258
  $returnCode = trim($returnCode);
259
  return 0 == (int) $returnCode;
260
  }
261
 
262
- private static function commandExists($command)
263
- {
264
- $result = @shell_exec('which ' . escapeshellarg($command) . ' 2> /dev/null');
265
-
266
- return !empty($result);
267
- }
268
-
269
  /**
270
  * ps -e requires /proc
271
  * @return bool
@@ -283,7 +304,7 @@ class Process
283
 
284
  public static function getListOfRunningProcesses()
285
  {
286
- $processes = `ps x 2>/dev/null`;
287
  if (empty($processes)) {
288
  return array();
289
  }
@@ -295,7 +316,7 @@ class Process
295
  */
296
  public static function getRunningProcesses()
297
  {
298
- $ids = explode("\n", trim(`ps x 2>/dev/null | awk '! /defunct/ {print $1}' 2>/dev/null`));
299
 
300
  $ids = array_map('intval', $ids);
301
  $ids = array_filter($ids, function ($id) {
22
  */
23
  class Process
24
  {
25
+ const PS_COMMAND = 'ps x';
26
+ const AWK_COMMAND = 'awk \'! /defunct/ {print $1}\'';
27
+
28
  private $finished = null;
29
  private $pidFile = '';
30
  private $timeCreation = null;
191
 
192
  public static function isSupported()
193
  {
194
+ $reasons = self::isSupportedWithReason();
195
+ return empty($reasons);
196
+ }
197
+
198
+ public static function isSupportedWithReason()
199
+ {
200
+ $reasons = [];
201
+
202
  if (defined('PIWIK_TEST_MODE')
203
  && self::isForcingAsyncProcessMode()
204
  ) {
205
+ $reasons[] = 'forcing multicurl use for tests';
206
  }
207
 
208
  if (SettingsServer::isWindows()) {
209
+ $reasons[] = 'not supported on windows';
210
  }
211
 
212
  if (self::isMethodDisabled('shell_exec')) {
213
+ $reasons[] = 'shell_exec is disabled';
214
+ return $reasons; // shell_exec is used for almost every other check
215
  }
216
 
217
+ $getMyPidDisabled = self::isMethodDisabled('getmypid');
218
+ if ($getMyPidDisabled) {
219
+ $reasons[] = 'getmypid is disabled';
220
  }
221
 
222
  if (self::isSystemNotSupported()) {
223
+ $reasons[] = 'system returned by `uname -a` is not supported';
224
  }
225
 
226
+ if (!self::psExistsAndRunsCorrectly()) {
227
+ $reasons[] = 'shell_exec(' . self::PS_COMMAND . '" 2> /dev/null") did not return a success code';
228
+ } else if (!$getMyPidDisabled) {
229
+ $pid = @getmypid();
230
+ if (empty($pid) || !in_array($pid, self::getRunningProcesses())) {
231
+ $reasons[] = 'could not find our pid (from getmypid()) in the output of `' . self::PS_COMMAND . '`';
232
+ }
233
  }
234
 
235
+ if (!self::awkExistsAndRunsCorrectly()) {
236
+ $reasons[] = 'awk is not available or did not run as we would expect it to';
 
237
  }
238
 
239
  if (!self::isProcFSMounted() && !SettingsServer::isMac()) {
240
+ $reasons[] = 'procfs is not mounted';
241
  }
242
 
243
+ return $reasons;
244
+ }
245
+
246
+ private static function psExistsAndRunsCorrectly()
247
+ {
248
+ return self::returnsSuccessCode(self::PS_COMMAND . ' 2>/dev/null');
249
+ }
250
+
251
+ private static function awkExistsAndRunsCorrectly()
252
+ {
253
+ $testResult = @shell_exec('echo " 537 s000 Ss 0:00.05 login -pfl theuser /bin/bash -c exec -la bash /bin/bash" | ' . self::AWK_COMMAND . ' 2>/dev/null');
254
+ return trim($testResult) == '537';
255
  }
256
 
257
  private static function isSystemNotSupported()
282
  private static function returnsSuccessCode($command)
283
  {
284
  $exec = $command . ' > /dev/null 2>&1; echo $?';
285
+ $returnCode = @shell_exec($exec);
286
  $returnCode = trim($returnCode);
287
  return 0 == (int) $returnCode;
288
  }
289
 
 
 
 
 
 
 
 
290
  /**
291
  * ps -e requires /proc
292
  * @return bool
304
 
305
  public static function getListOfRunningProcesses()
306
  {
307
+ $processes = @shell_exec(self::PS_COMMAND . ' 2>/dev/null');
308
  if (empty($processes)) {
309
  return array();
310
  }
316
  */
317
  public static function getRunningProcesses()
318
  {
319
+ $ids = explode("\n", trim(shell_exec(self::PS_COMMAND . ' 2>/dev/null | ' . self::AWK_COMMAND . ' 2>/dev/null')));
320
 
321
  $ids = array_map('intval', $ids);
322
  $ids = array_filter($ids, function ($id) {
app/core/Common.php CHANGED
@@ -184,21 +184,13 @@ class Common
184
  *
185
  * @param string $string
186
  * @param int $start
187
- * @param int ... optional length
188
  * @return string
189
- * @api
190
  */
191
- public static function mb_substr($string, $start)
192
  {
193
- $length = func_num_args() > 2
194
- ? func_get_arg(2)
195
- : self::mb_strlen($string);
196
-
197
- if (function_exists('mb_substr')) {
198
- return mb_substr($string, $start, $length, 'UTF-8');
199
- }
200
-
201
- return substr($string, $start, $length);
202
  }
203
 
204
  /**
@@ -233,15 +225,11 @@ class Common
233
  *
234
  * @param string $string
235
  * @return int
236
- * @api
237
  */
238
  public static function mb_strlen($string)
239
  {
240
- if (function_exists('mb_strlen')) {
241
- return mb_strlen($string, 'UTF-8');
242
- }
243
-
244
- return strlen($string);
245
  }
246
 
247
  /**
@@ -251,16 +239,11 @@ class Common
251
  *
252
  * @param string $string
253
  * @return string
254
- * @api
255
  */
256
  public static function mb_strtolower($string)
257
  {
258
- if (function_exists('mb_strtolower')) {
259
- return mb_strtolower($string, 'UTF-8');
260
- }
261
-
262
- // return unchanged string as using `strtolower` might cause unicode problems
263
- return $string;
264
  }
265
 
266
  /**
@@ -270,16 +253,11 @@ class Common
270
  *
271
  * @param string $string
272
  * @return string
273
- * @api
274
  */
275
  public static function mb_strtoupper($string)
276
  {
277
- if (function_exists('mb_strtoupper')) {
278
- return mb_strtoupper($string, 'UTF-8');
279
- }
280
-
281
- // return unchanged string as using `strtoupper` might cause unicode problems
282
- return $string;
283
  }
284
 
285
  /**
184
  *
185
  * @param string $string
186
  * @param int $start
187
+ * @param int|null $length optional length
188
  * @return string
189
+ * @deprecated since 4.4 - directly use mb_substr instead
190
  */
191
+ public static function mb_substr($string, $start, $length = null)
192
  {
193
+ return mb_substr($string, $start, $length, 'UTF-8');
 
 
 
 
 
 
 
 
194
  }
195
 
196
  /**
225
  *
226
  * @param string $string
227
  * @return int
228
+ * @deprecated since 4.4 - directly use mb_strlen instead
229
  */
230
  public static function mb_strlen($string)
231
  {
232
+ return mb_strlen($string, 'UTF-8');
 
 
 
 
233
  }
234
 
235
  /**
239
  *
240
  * @param string $string
241
  * @return string
242
+ * @deprecated since 4.4 - directly use mb_strtolower instead
243
  */
244
  public static function mb_strtolower($string)
245
  {
246
+ return mb_strtolower($string, 'UTF-8');
 
 
 
 
 
247
  }
248
 
249
  /**
253
  *
254
  * @param string $string
255
  * @return string
256
+ * @deprecated since 4.4 - directly use mb_strtoupper instead
257
  */
258
  public static function mb_strtoupper($string)
259
  {
260
+ return mb_strtoupper($string, 'UTF-8');
 
 
 
 
 
261
  }
262
 
263
  /**
app/core/Concurrency/Lock.php CHANGED
@@ -8,7 +8,6 @@
8
  */
9
  namespace Piwik\Concurrency;
10
 
11
- use Piwik\ArchiveProcessor\ArchivingStatus;
12
  use Piwik\Common;
13
  use Piwik\Date;
14
 
@@ -82,11 +81,11 @@ class Lock
82
  {
83
  $this->lockKey = $this->lockKeyStart . $id;
84
 
85
- if (Common::mb_strlen($this->lockKey) > self::MAX_KEY_LEN) {
86
  // Lock key might be too long for DB column, so we hash it but leave the start of the original as well
87
  // to make it more readable
88
  $md5Len = 32;
89
- $this->lockKey = Common::mb_substr($id, 0, self::MAX_KEY_LEN - $md5Len - 1) . md5($id);
90
  }
91
 
92
  $lockValue = substr(Common::generateUniqId(), 0, 12);
8
  */
9
  namespace Piwik\Concurrency;
10
 
 
11
  use Piwik\Common;
12
  use Piwik\Date;
13
 
81
  {
82
  $this->lockKey = $this->lockKeyStart . $id;
83
 
84
+ if (mb_strlen($this->lockKey) > self::MAX_KEY_LEN) {
85
  // Lock key might be too long for DB column, so we hash it but leave the start of the original as well
86
  // to make it more readable
87
  $md5Len = 32;
88
+ $this->lockKey = mb_substr($id, 0, self::MAX_KEY_LEN - $md5Len - 1) . md5($id);
89
  }
90
 
91
  $lockValue = substr(Common::generateUniqId(), 0, 12);
app/core/Config.php CHANGED
@@ -139,7 +139,7 @@ class Config
139
  if (!empty($GLOBALS['CONFIG_INI_PATH_RESOLVER']) && is_callable($GLOBALS['CONFIG_INI_PATH_RESOLVER'])) {
140
  return call_user_func($GLOBALS['CONFIG_INI_PATH_RESOLVER']);
141
  }
142
-
143
  $path = self::getByDomainConfigPath();
144
  if ($path) {
145
  return $path;
@@ -220,13 +220,14 @@ class Config
220
 
221
  /**
222
  * Returns the hostname of the current request (without port number)
 
 
223
  *
224
  * @return string
225
  */
226
- public static function getHostname()
227
  {
228
- // Check trusted requires config file which is not ready yet
229
- $host = Url::getHost($checkIfTrusted = false);
230
 
231
  // Remove any port number to get actual hostname
232
  $host = Url::getHostSanitized($host);
@@ -309,7 +310,7 @@ class Config
309
  public function deleteLocalConfig()
310
  {
311
  $configLocal = $this->getLocalPath();
312
-
313
  if(file_exists($configLocal)){
314
  @unlink($configLocal);
315
  }
@@ -345,7 +346,7 @@ class Config
345
  {
346
  return $this->settings->getIniFileChain()->getFrom($this->getCommonPath(), $name);
347
  }
348
-
349
  /**
350
  * @api
351
  */
139
  if (!empty($GLOBALS['CONFIG_INI_PATH_RESOLVER']) && is_callable($GLOBALS['CONFIG_INI_PATH_RESOLVER'])) {
140
  return call_user_func($GLOBALS['CONFIG_INI_PATH_RESOLVER']);
141
  }
142
+
143
  $path = self::getByDomainConfigPath();
144
  if ($path) {
145
  return $path;
220
 
221
  /**
222
  * Returns the hostname of the current request (without port number)
223
+ * @param bool $checkIfTrusted Check trusted requires config which is maybe not ready yet,
224
+ * make sure the config is ready when you call with true
225
  *
226
  * @return string
227
  */
228
+ public static function getHostname($checkIfTrusted = false)
229
  {
230
+ $host = Url::getHost($checkIfTrusted);
 
231
 
232
  // Remove any port number to get actual hostname
233
  $host = Url::getHostSanitized($host);
310
  public function deleteLocalConfig()
311
  {
312
  $configLocal = $this->getLocalPath();
313
+
314
  if(file_exists($configLocal)){
315
  @unlink($configLocal);
316
  }
346
  {
347
  return $this->settings->getIniFileChain()->getFrom($this->getCommonPath(), $name);
348
  }
349
+
350
  /**
351
  * @api
352
  */
app/core/CronArchive.php CHANGED
@@ -673,11 +673,11 @@ class CronArchive
673
  {
674
  if (!defined('PIWIK_ARCHIVE_NO_TRUNCATE')) {
675
  $m = str_replace(array("\n", "\t"), " ", $m);
676
- if (Common::mb_strlen($m) > self::TRUNCATE_ERROR_MESSAGE_SUMMARY) {
677
  $numCharactersKeepFromEnd = 100;
678
- $m = Common::mb_substr($m, 0, self::TRUNCATE_ERROR_MESSAGE_SUMMARY - $numCharactersKeepFromEnd)
679
  . ' ... ' .
680
- Common::mb_substr($m, -1 * $numCharactersKeepFromEnd);
681
  }
682
  }
683
  $this->errors[] = $m;
673
  {
674
  if (!defined('PIWIK_ARCHIVE_NO_TRUNCATE')) {
675
  $m = str_replace(array("\n", "\t"), " ", $m);
676
+ if (mb_strlen($m) > self::TRUNCATE_ERROR_MESSAGE_SUMMARY) {
677
  $numCharactersKeepFromEnd = 100;
678
+ $m = mb_substr($m, 0, self::TRUNCATE_ERROR_MESSAGE_SUMMARY - $numCharactersKeepFromEnd)
679
  . ' ... ' .
680
+ mb_substr($m, -1 * $numCharactersKeepFromEnd);
681
  }
682
  }
683
  $this->errors[] = $m;
app/core/DataAccess/ArchivingDbAdapter.php CHANGED
@@ -9,8 +9,6 @@
9
 
10
  namespace Piwik\DataAccess;
11
 
12
- use Piwik\ArchiveProcessor\ArchivingStatus;
13
- use Piwik\Concurrency\Lock;
14
  use Piwik\Config;
15
  use Piwik\Db\AdapterInterface;
16
  use Piwik\DbHelper;
@@ -23,11 +21,6 @@ class ArchivingDbAdapter
23
  */
24
  private $wrapped;
25
 
26
- /**
27
- * @var Lock
28
- */
29
- private $archivingLock;
30
-
31
  /**
32
  * @var LoggerInterface
33
  */
@@ -38,10 +31,9 @@ class ArchivingDbAdapter
38
  */
39
  private $maxExecutionTime;
40
 
41
- public function __construct($wrapped, Lock $archivingLock = null, LoggerInterface $logger = null)
42
  {
43
  $this->wrapped = $wrapped;
44
- $this->archivingLock = $archivingLock;
45
  $this->logger = $logger;
46
  $this->maxExecutionTime = (float) Config::getInstance()->General['archiving_query_max_execution_time'];
47
  }
@@ -53,7 +45,6 @@ class ArchivingDbAdapter
53
 
54
  public function exec($sql)
55
  {
56
- $this->reexpireLock();
57
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
58
  $this->logSql($sql);
59
 
@@ -62,7 +53,6 @@ class ArchivingDbAdapter
62
 
63
  public function query($sql)
64
  {
65
- $this->reexpireLock();
66
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
67
  $this->logSql($sql);
68
 
@@ -71,7 +61,6 @@ class ArchivingDbAdapter
71
 
72
  public function fetchAll($sql)
73
  {
74
- $this->reexpireLock();
75
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
76
  $this->logSql($sql);
77
 
@@ -80,7 +69,6 @@ class ArchivingDbAdapter
80
 
81
  public function fetchRow($sql)
82
  {
83
- $this->reexpireLock();
84
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
85
  $this->logSql($sql);
86
 
@@ -89,7 +77,6 @@ class ArchivingDbAdapter
89
 
90
  public function fetchOne($sql)
91
  {
92
- $this->reexpireLock();
93
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
94
  $this->logSql($sql);
95
 
@@ -98,7 +85,6 @@ class ArchivingDbAdapter
98
 
99
  public function fetchAssoc($sql)
100
  {
101
- $this->reexpireLock();
102
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
103
  $this->logSql($sql);
104
 
@@ -112,11 +98,4 @@ class ArchivingDbAdapter
112
  $this->logger->debug($sql);
113
  }
114
  }
115
-
116
- private function reexpireLock()
117
- {
118
- if ($this->archivingLock) {
119
- $this->archivingLock->reexpireLock();
120
- }
121
- }
122
  }
9
 
10
  namespace Piwik\DataAccess;
11
 
 
 
12
  use Piwik\Config;
13
  use Piwik\Db\AdapterInterface;
14
  use Piwik\DbHelper;
21
  */
22
  private $wrapped;
23
 
 
 
 
 
 
24
  /**
25
  * @var LoggerInterface
26
  */
31
  */
32
  private $maxExecutionTime;
33
 
34
+ public function __construct($wrapped, LoggerInterface $logger = null)
35
  {
36
  $this->wrapped = $wrapped;
 
37
  $this->logger = $logger;
38
  $this->maxExecutionTime = (float) Config::getInstance()->General['archiving_query_max_execution_time'];
39
  }
45
 
46
  public function exec($sql)
47
  {
 
48
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
49
  $this->logSql($sql);
50
 
53
 
54
  public function query($sql)
55
  {
 
56
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
57
  $this->logSql($sql);
58
 
61
 
62
  public function fetchAll($sql)
63
  {
 
64
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
65
  $this->logSql($sql);
66
 
69
 
70
  public function fetchRow($sql)
71
  {
 
72
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
73
  $this->logSql($sql);
74
 
77
 
78
  public function fetchOne($sql)
79
  {
 
80
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
81
  $this->logSql($sql);
82
 
85
 
86
  public function fetchAssoc($sql)
87
  {
 
88
  $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
89
  $this->logSql($sql);
90
 
98
  $this->logger->debug($sql);
99
  }
100
  }
 
 
 
 
 
 
 
101
  }
app/core/DataAccess/LogAggregator.php CHANGED
@@ -8,7 +8,6 @@
8
  */
9
  namespace Piwik\DataAccess;
10
 
11
- use Piwik\ArchiveProcessor\ArchivingStatus;
12
  use Piwik\ArchiveProcessor\Parameters;
13
  use Piwik\Common;
14
  use Piwik\Config;
@@ -212,10 +211,10 @@ class LogAggregator
212
  $bind = $this->getGeneralQueryBindParams();
213
  $tableName = self::LOG_TABLE_SEGMENT_TEMPORARY_PREFIX . md5(json_encode($bind) . $this->segment->getString());
214
 
215
- $lengthPrefix = Common::mb_strlen(Common::prefixTable(''));
216
  $maxLength = Db\Schema\Mysql::MAX_TABLE_NAME_LENGTH - $lengthPrefix;
217
 
218
- return Common::mb_substr($tableName, 0, $maxLength);
219
  }
220
 
221
  public function cleanup()
@@ -1240,9 +1239,6 @@ class LogAggregator
1240
 
1241
  public function getDb()
1242
  {
1243
- /** @var ArchivingStatus $archivingStatus */
1244
- $archivingStatus = StaticContainer::get(ArchivingStatus::class);
1245
- $archivingLock = $archivingStatus->getCurrentArchivingLock();
1246
- return new ArchivingDbAdapter(Db::getReader(), $archivingLock, $this->logger);
1247
  }
1248
  }
8
  */
9
  namespace Piwik\DataAccess;
10
 
 
11
  use Piwik\ArchiveProcessor\Parameters;
12
  use Piwik\Common;
13
  use Piwik\Config;
211
  $bind = $this->getGeneralQueryBindParams();
212
  $tableName = self::LOG_TABLE_SEGMENT_TEMPORARY_PREFIX . md5(json_encode($bind) . $this->segment->getString());
213
 
214
+ $lengthPrefix = mb_strlen(Common::prefixTable(''));
215
  $maxLength = Db\Schema\Mysql::MAX_TABLE_NAME_LENGTH - $lengthPrefix;
216
 
217
+ return mb_substr($tableName, 0, $maxLength);
218
  }
219
 
220
  public function cleanup()
1239
 
1240
  public function getDb()
1241
  {
1242
+ return new ArchivingDbAdapter(Db::getReader(), $this->logger);
 
 
 
1243
  }
1244
  }
app/core/DataAccess/Model.php CHANGED
@@ -10,7 +10,6 @@ namespace Piwik\DataAccess;
10
 
11
  use Exception;
12
  use Piwik\Archive\ArchiveInvalidator;
13
- use Piwik\ArchiveProcessor\ArchivingStatus;
14
  use Piwik\ArchiveProcessor\Parameters;
15
  use Piwik\ArchiveProcessor\Rules;
16
  use Piwik\Common;
@@ -35,15 +34,9 @@ class Model
35
  */
36
  private $logger;
37
 
38
- /**
39
- * @var ArchivingStatus
40
- */
41
- private $archivingStatus;
42
-
43
  public function __construct(LoggerInterface $logger = null)
44
  {
45
  $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface');
46
- $this->archivingStatus = StaticContainer::get(ArchivingStatus::class);
47
  }
48
 
49
  /**
@@ -204,17 +197,18 @@ class Model
204
  // except for archives that are DONE_IN_PROGRESS.
205
  $archivesToCreateInvalidationRowsFor = [];
206
  foreach ($archivesToInvalidate as $row) {
207
- if ($row['name'] != $doneFlag) { // only look at done flags that equal the one we are explicitly adding
208
- continue;
209
- }
210
-
211
- $archivesToCreateInvalidationRowsFor[$row['idsite']][$row['period']][$row['date1']][$row['date2']] = $row['idarchive'];
212
  }
213
 
214
  $now = Date::now()->getDatetime();
215
 
216
  $existingInvalidations = $this->getExistingInvalidations($idSites, $periodCondition, $nameCondition);
217
 
 
 
 
 
 
218
  $dummyArchives = [];
219
  foreach ($idSites as $idSite) {
220
  try {
@@ -238,23 +232,42 @@ class Model
238
  $date1 = $period->getDateStart()->toString();
239
  $date2 = $period->getDateEnd()->toString();
240
 
241
- $key = $this->makeExistingInvalidationArrayKey($idSite, $date1, $date2, $period->getId(), $doneFlag, $name);
242
- if (!empty($existingInvalidations[$key])) {
243
- continue; // avoid adding duplicates where possible
244
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
 
246
- $idArchive = $archivesToCreateInvalidationRowsFor[$idSite][$period->getId()][$date1][$date2] ?? null;
247
-
248
- $dummyArchives[] = [
249
- 'idarchive' => $idArchive,
250
- 'name' => $doneFlag,
251
- 'report' => $name,
252
- 'idsite' => $idSite,
253
- 'date1' => $period->getDateStart()->getDatetime(),
254
- 'date2' => $period->getDateEnd()->getDatetime(),
255
- 'period' => $period->getId(),
256
- 'ts_invalidated' => $now,
257
- ];
 
258
  }
259
  }
260
 
@@ -314,8 +327,8 @@ class Model
314
 
315
  /** @var Period $period */
316
  $dateConditions[] = "(date1 <= ? AND ? <= date2)";
317
- $bind[] = $period->getDateStart();
318
- $bind[] = $period->getDateEnd();
319
 
320
  $dateConditionsSql = implode(" OR ", $dateConditions);
321
  $periodConditions[] = "(period = 5 AND ($dateConditionsSql))";
@@ -676,16 +689,20 @@ class Model
676
  return true;
677
  }
678
 
679
- // if we didn't get anything, some process either got there first, OR
680
- // the archive was started previously and failed in a way that kept it's done value
681
- // set to DONE_IN_PROGRESS. try to acquire the lock and if acquired, archiving isn' in process
682
- // so we can claim it.
683
- $lock = $this->archivingStatus->acquireArchiveInProgressLock($invalidation['idsite'], $invalidation['date1'],
684
- $invalidation['date2'], $invalidation['period'], $invalidation['name']);
685
- if (!$lock->isLocked()) {
686
- return false; // we couldn't claim the lock, archive is in progress
687
  }
688
 
 
 
 
 
 
 
689
  // remove similar invalidations w/ lesser idinvalidation values
690
  $bind = [
691
  $invalidation['idsite'],
@@ -747,7 +764,7 @@ class Model
747
  public function getNextInvalidatedArchive($idSite, $archivingStartTime, $idInvalidationsToExclude = null, $useLimit = true)
748
  {
749
  $table = Common::prefixTable('archive_invalidations');
750
- $sql = "SELECT idinvalidation, idarchive, idsite, date1, date2, period, `name`, report, ts_invalidated
751
  FROM `$table`
752
  WHERE idsite = ? AND status != ? AND ts_invalidated <= ?";
753
  $bind = [
@@ -964,4 +981,10 @@ class Model
964
  $position = strpos($pair, '.');
965
  return $position === false || $position === strlen($pair) - 1;
966
  }
 
 
 
 
 
 
967
  }
10
 
11
  use Exception;
12
  use Piwik\Archive\ArchiveInvalidator;
 
13
  use Piwik\ArchiveProcessor\Parameters;
14
  use Piwik\ArchiveProcessor\Rules;
15
  use Piwik\Common;
34
  */
35
  private $logger;
36
 
 
 
 
 
 
37
  public function __construct(LoggerInterface $logger = null)
38
  {
39
  $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface');
 
40
  }
41
 
42
  /**
197
  // except for archives that are DONE_IN_PROGRESS.
198
  $archivesToCreateInvalidationRowsFor = [];
199
  foreach ($archivesToInvalidate as $row) {
200
+ $archivesToCreateInvalidationRowsFor[$row['idsite']][$row['period']][$row['date1']][$row['date2']][$row['name']] = $row['idarchive'];
 
 
 
 
201
  }
202
 
203
  $now = Date::now()->getDatetime();
204
 
205
  $existingInvalidations = $this->getExistingInvalidations($idSites, $periodCondition, $nameCondition);
206
 
207
+ $hashesOfAllSegmentsToArchiveInCoreArchive = Rules::getSegmentsToProcess($idSites);
208
+ $hashesOfAllSegmentsToArchiveInCoreArchive = array_map(function ($definition) {
209
+ return Segment::getSegmentHash($definition);
210
+ }, $hashesOfAllSegmentsToArchiveInCoreArchive);
211
+
212
  $dummyArchives = [];
213
  foreach ($idSites as $idSite) {
214
  try {
232
  $date1 = $period->getDateStart()->toString();
233
  $date2 = $period->getDateEnd()->toString();
234
 
235
+ // we insert rows for the doneFlag we want to invalidate + any others we invalidated when doing the LIKE above.
236
+ // if we invalidated something in the archive tables, we want to make sure it appears in the invalidation queue,
237
+ // so we'll eventually reprocess it.
238
+ $doneFlagsFound = $archivesToCreateInvalidationRowsFor[$idSite][$period->getId()][$date1][$date2] ?? [];
239
+ $doneFlagsFound = array_keys($doneFlagsFound);
240
+ $doneFlagsToCheck = array_merge([$doneFlag], $doneFlagsFound);
241
+ $doneFlagsToCheck = array_unique($doneFlagsToCheck);
242
+
243
+ foreach ($doneFlagsToCheck as $doneFlagToCheck) {
244
+ $key = $this->makeExistingInvalidationArrayKey($idSite, $date1, $date2, $period->getId(), $doneFlagToCheck, $name);
245
+ if (!empty($existingInvalidations[$key])) {
246
+ continue; // avoid adding duplicates where possible
247
+ }
248
+
249
+ $hash = $this->getHashFromDoneFlag($doneFlagToCheck);
250
+ if ($doneFlagToCheck != $doneFlag
251
+ && (empty($hash)
252
+ || !in_array($hash, $hashesOfAllSegmentsToArchiveInCoreArchive)
253
+ || strpos($doneFlagToCheck, '.') !== false)
254
+ ) {
255
+ continue; // the done flag is for a segment that is not auto archive or a plugin specific archive, so we don't want to process it.
256
+ }
257
 
258
+ $idArchive = $archivesToCreateInvalidationRowsFor[$idSite][$period->getId()][$date1][$date2][$doneFlagToCheck] ?? null;
259
+
260
+ $dummyArchives[] = [
261
+ 'idarchive' => $idArchive,
262
+ 'name' => $doneFlagToCheck,
263
+ 'report' => $name,
264
+ 'idsite' => $idSite,
265
+ 'date1' => $period->getDateStart()->getDatetime(),
266
+ 'date2' => $period->getDateEnd()->getDatetime(),
267
+ 'period' => $period->getId(),
268
+ 'ts_invalidated' => $now,
269
+ ];
270
+ }
271
  }
272
  }
273
 
327
 
328
  /** @var Period $period */
329
  $dateConditions[] = "(date1 <= ? AND ? <= date2)";
330
+ $bind[] = $period->getDateStart()->getDatetime();
331
+ $bind[] = $period->getDateEnd()->getDatetime();
332
 
333
  $dateConditionsSql = implode(" OR ", $dateConditions);
334
  $periodConditions[] = "(period = 5 AND ($dateConditionsSql))";
689
  return true;
690
  }
691
 
692
+ // archive was not originally started or was started within 24 hours, we assume it's ongoing and another process
693
+ // (on this machine or another) is actively archiving it.
694
+ if (empty($invalidation['ts_started'])
695
+ || $invalidation['ts_started'] > Date::now()->subDay(1)->getTimestamp()
696
+ ) {
697
+ return false;
 
 
698
  }
699
 
700
+ // archive was started over 24 hours ago, we assume it failed and take it over
701
+ Db::query("UPDATE `$table` SET `status` = ?, ts_started = NOW() WHERE idinvalidation = ?", [
702
+ ArchiveInvalidator::INVALIDATION_STATUS_IN_PROGRESS,
703
+ $invalidation['idinvalidation'],
704
+ ]);
705
+
706
  // remove similar invalidations w/ lesser idinvalidation values
707
  $bind = [
708
  $invalidation['idsite'],
764
  public function getNextInvalidatedArchive($idSite, $archivingStartTime, $idInvalidationsToExclude = null, $useLimit = true)
765
  {
766
  $table = Common::prefixTable('archive_invalidations');
767
+ $sql = "SELECT *
768
  FROM `$table`
769
  WHERE idsite = ? AND status != ? AND ts_invalidated <= ?";
770
  $bind = [
981
  $position = strpos($pair, '.');
982
  return $position === false || $position === strlen($pair) - 1;
983
  }
984
+
985
+ private function getHashFromDoneFlag($doneFlag)
986
+ {
987
+ preg_match('/^done([a-zA-Z0-9]+)/', $doneFlag, $matches);
988
+ return $matches[1] ?? '';
989
+ }
990
  }
app/core/DataTable.php CHANGED
@@ -432,6 +432,11 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
432
  return $this->totalsRow;
433
  }
434
 
 
 
 
 
 
435
  /**
436
  * Returns the name of the column this table was sorted by (if any).
437
  *
@@ -1352,7 +1357,19 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
1352
  }
1353
 
1354
  if (isset($this->summaryRow)) {
1355
- $rows[self::ID_SUMMARY_ROW] = $this->summaryRow->export();
 
 
 
 
 
 
 
 
 
 
 
 
1356
  }
1357
 
1358
  if (!empty($metadata)) {
432
  return $this->totalsRow;
433
  }
434
 
435
+ public function getSummaryRow()
436
+ {
437
+ return $this->summaryRow;
438
+ }
439
+
440
  /**
441
  * Returns the name of the column this table was sorted by (if any).
442
  *
1357
  }
1358
 
1359
  if (isset($this->summaryRow)) {
1360
+ $id = self::ID_SUMMARY_ROW;
1361
+ $row = $this->summaryRow;
1362
+
1363
+ // duplicating code above so we don't create a new array w/ getRows() above in this function which is
1364
+ // used heavily in matomo.
1365
+ if (isset($consecutiveSubtableIds[$id])) {
1366
+ $backup = $row->subtableId;
1367
+ $row->subtableId = $consecutiveSubtableIds[$id];
1368
+ $rows[$id] = $row->export();
1369
+ $row->subtableId = $backup;
1370
+ } else {
1371
+ $rows[$id] = $row->export();
1372
+ }
1373
  }
1374
 
1375
  if (!empty($metadata)) {
app/core/DataTable/Filter/PivotByDimension.php CHANGED
@@ -349,6 +349,10 @@ class PivotByDimension extends BaseFilter
349
  }
350
  }
351
 
 
 
 
 
352
  $this->thisReport = $report;
353
 
354
  $this->subtableDimension = $this->thisReport->getSubtableDimension();
349
  }
350
  }
351
 
352
+ if (empty($report)) {
353
+ throw new \Exception("This report does not support pivot.");
354
+ }
355
+
356
  $this->thisReport = $report;
357
 
358
  $this->subtableDimension = $this->thisReport->getSubtableDimension();
app/core/DataTable/Renderer/Csv.php CHANGED
@@ -151,7 +151,7 @@ class Csv extends Renderer
151
  // when in xml we would output <result date="2008-01-15" />
152
  if (!empty($returned)) {
153
  foreach ($returned as &$row) {
154
- $row = $currentLinePrefix . $this->separator . $row;
155
  }
156
  $str .= "\n" . implode("\n", $returned);
157
  }
151
  // when in xml we would output <result date="2008-01-15" />
152
  if (!empty($returned)) {
153
  foreach ($returned as &$row) {
154
+ $row = $this->formatValue($currentLinePrefix) . $this->separator . $row;
155
  }
156
  $str .= "\n" . implode("\n", $returned);
157
  }
app/core/DataTable/Row.php CHANGED
@@ -643,8 +643,10 @@ class Row extends \ArrayObject
643
  $thisColumnValue = 0;
644
  } else if (!is_numeric($thisColumnValue)) {
645
  $label = $this->getColumn('label');
 
 
646
  throw new \Exception(sprintf('Trying to sum unsupported operands for column %s in row with label = %s: %s + %s',
647
- $columnName, $label, gettype($thisColumnValue), gettype($columnToSumValue)));
648
  }
649
 
650
  return $thisColumnValue + $columnToSumValue;
@@ -779,4 +781,13 @@ class Row extends \ArrayObject
779
  StaticContainer::get(LoggerInterface::class)->warning("{exception}", ['exception' => $ex]);
780
  }
781
  }
 
 
 
 
 
 
 
 
 
782
  }
643
  $thisColumnValue = 0;
644
  } else if (!is_numeric($thisColumnValue)) {
645
  $label = $this->getColumn('label');
646
+ $thisColumnDescription = $this->getColumnValueDescriptionForError($thisColumnValue);
647
+ $columnToSumValueDescription = $this->getColumnValueDescriptionForError($columnToSumValue);
648
  throw new \Exception(sprintf('Trying to sum unsupported operands for column %s in row with label = %s: %s + %s',
649
+ $columnName, $label, $thisColumnDescription, $columnToSumValueDescription));
650
  }
651
 
652
  return $thisColumnValue + $columnToSumValue;
781
  StaticContainer::get(LoggerInterface::class)->warning("{exception}", ['exception' => $ex]);
782
  }
783
  }
784
+
785
+ private function getColumnValueDescriptionForError($value)
786
+ {
787
+ $result = gettype($value);
788
+ if (is_array($result)) {
789
+ $result .= ' ' . json_encode($value);
790
+ }
791
+ return $result;
792
+ }
793
  }
app/core/Date.php CHANGED
@@ -800,7 +800,7 @@ class Date
800
  }
801
 
802
  if ($ucfirst) {
803
- $out = Common::mb_strtoupper(Common::mb_substr($out, 0, 1)) . Common::mb_substr($out, 1);
804
  }
805
 
806
  return $out;
800
  }
801
 
802
  if ($ucfirst) {
803
+ $out = mb_strtoupper(mb_substr($out, 0, 1)) . mb_substr($out, 1);
804
  }
805
 
806
  return $out;
app/core/Db.php CHANGED
@@ -184,6 +184,10 @@ class Db
184
 
185
  $db = @Adapter::factory($dbConfig['adapter'], $dbConfig);
186
 
 
 
 
 
187
  self::$readerConnection = $db;
188
  }
189
 
@@ -805,6 +809,8 @@ class Db
805
 
806
  private static function logSql($functionName, $sql, $parameters = array())
807
  {
 
 
808
  if (self::$logQueries === false
809
  || @Config::getInstance()->Debug['log_sql_queries'] != 1
810
  ) {
@@ -815,6 +821,23 @@ class Db
815
  Log::debug("Db::%s() executing SQL: %s", $functionName, $sql);
816
  }
817
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
818
  /**
819
  * @param bool $enable
820
  */
184
 
185
  $db = @Adapter::factory($dbConfig['adapter'], $dbConfig);
186
 
187
+ if (!empty($dbConfig['aurora_readonly_read_committed'])) {
188
+ $db->exec('set session aurora_read_replica_read_committed = ON;set session transaction isolation level read committed;');
189
+ }
190
+
191
  self::$readerConnection = $db;
192
  }
193
 
809
 
810
  private static function logSql($functionName, $sql, $parameters = array())
811
  {
812
+ self::checkBoundParametersIfInDevMode($sql, $parameters);
813
+
814
  if (self::$logQueries === false
815
  || @Config::getInstance()->Debug['log_sql_queries'] != 1
816
  ) {
821
  Log::debug("Db::%s() executing SQL: %s", $functionName, $sql);
822
  }
823
 
824
+ private static function checkBoundParametersIfInDevMode($sql, $parameters)
825
+ {
826
+ if (!Development::isEnabled()) {
827
+ return;
828
+ }
829
+
830
+ if (!is_array($parameters)) {
831
+ $parameters = [$parameters];
832
+ }
833
+
834
+ foreach ($parameters as $index => $parameter) {
835
+ if ($parameter instanceof Date) {
836
+ throw new \Exception("Found bound parameter (index = $index) is Date instance which will not work correctly in following SQL: $sql");
837
+ }
838
+ }
839
+ }
840
+
841
  /**
842
  * @param bool $enable
843
  */
app/core/Db/Adapter.php CHANGED
@@ -9,6 +9,7 @@
9
  namespace Piwik\Db;
10
 
11
  use Zend_Db_Table;
 
12
 
13
  /**
14
  */
@@ -45,14 +46,24 @@ class Adapter
45
  $infos[$key] = $val;
46
  }
47
 
48
- $adapter = new $className($infos);
49
 
50
  if ($connect) {
51
- $adapter->getConnection();
52
-
53
- Zend_Db_Table::setDefaultAdapter($adapter);
54
- // we don't want the connection information to appear in the logs
55
- $adapter->resetConfig();
 
 
 
 
 
 
 
 
 
 
56
  }
57
 
58
  return $adapter;
@@ -129,4 +140,28 @@ class Adapter
129
  {
130
  return strtolower($adapterName) === 'pdo/mysql';
131
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  }
9
  namespace Piwik\Db;
10
 
11
  use Zend_Db_Table;
12
+ use Piwik\Piwik;
13
 
14
  /**
15
  */
46
  $infos[$key] = $val;
47
  }
48
 
49
+ $adapter = new $className($infos);
50
 
51
  if ($connect) {
52
+ try {
53
+ $adapter->getConnection();
54
+
55
+ Zend_Db_Table::setDefaultAdapter($adapter);
56
+ // we don't want the connection information to appear in the logs
57
+ $adapter->resetConfig();
58
+ } catch(\Exception $e) {
59
+ // we don't want certain exceptions to leak information
60
+ $msg = self::overriddenExceptionMessage($e->getMessage());
61
+ if ('' !== $msg) {
62
+ throw new \Exception($msg);
63
+ }
64
+
65
+ throw $e;
66
+ }
67
  }
68
 
69
  return $adapter;
140
  {
141
  return strtolower($adapterName) === 'pdo/mysql';
142
  }
143
+
144
+ /**
145
+ * Intercepts certain exception messages and replaces leaky ones with ones that don't reveal too much info
146
+ * @param string $message
147
+ * @return string
148
+ */
149
+ public static function overriddenExceptionMessage($message)
150
+ {
151
+ $safeMessageMap = array(
152
+ // add any exception search terms and their replacement message here
153
+ '[2006]' => Piwik::translate('General_ExceptionDatabaseUnavailable'),
154
+ 'MySQL server has gone away' => Piwik::translate('General_ExceptionDatabaseUnavailable'),
155
+ '[1698]' => Piwik::translate('General_ExceptionDatabaseAccess'),
156
+ 'Access denied' => Piwik::translate('General_ExceptionDatabaseAccess')
157
+ );
158
+
159
+ foreach ($safeMessageMap as $search_term => $safeMessage) {
160
+ if (strpos($message, $search_term) !== false) {
161
+ return $safeMessage;
162
+ }
163
+ }
164
+
165
+ return '';
166
+ }
167
  }
app/core/Db/BatchInsert.php CHANGED
@@ -31,12 +31,13 @@ class BatchInsert
31
  */
32
  public static function tableInsertBatchIterate($tableName, $fields, $values, $ignoreWhenDuplicate = true)
33
  {
 
34
  $fieldList = '(' . join(',', $fields) . ')';
35
  $ignore = $ignoreWhenDuplicate ? 'IGNORE' : '';
36
 
37
  foreach ($values as $row) {
38
  $row = array_values($row);
39
- $query = "INSERT $ignore INTO " . $tableName . "
40
  $fieldList
41
  VALUES (" . Common::getSqlStringFieldsArray($row) . ")";
42
  Db::query($query, $row);
31
  */
32
  public static function tableInsertBatchIterate($tableName, $fields, $values, $ignoreWhenDuplicate = true)
33
  {
34
+ $tableName = preg_replace('/[^a-zA-Z\d_-]/', '', $tableName);
35
  $fieldList = '(' . join(',', $fields) . ')';
36
  $ignore = $ignoreWhenDuplicate ? 'IGNORE' : '';
37
 
38
  foreach ($values as $row) {
39
  $row = array_values($row);
40
+ $query = "INSERT $ignore INTO `" . $tableName . "`
41
  $fieldList
42
  VALUES (" . Common::getSqlStringFieldsArray($row) . ")";
43
  Db::query($query, $row);
app/core/DeviceDetector/DeviceDetectorFactory.php CHANGED
@@ -39,7 +39,7 @@ class DeviceDetectorFactory
39
 
40
  public static function getNormalizedUserAgent($userAgent)
41
  {
42
- return Common::mb_substr(trim($userAgent), 0, 500);
43
  }
44
 
45
  /**
39
 
40
  public static function getNormalizedUserAgent($userAgent)
41
  {
42
+ return mb_substr(trim($userAgent), 0, 500);
43
  }
44
 
45
  /**
app/core/EventDispatcher.php CHANGED
@@ -176,11 +176,19 @@ class EventDispatcher
176
  public function postPendingEventsTo($plugin)
177
  {
178
  foreach ($this->pendingEvents as $eventInfo) {
179
- list($eventName, $eventParams) = $eventInfo;
180
  $this->postEvent($eventName, $eventParams, $pending = false, array($plugin));
181
  }
182
  }
183
 
 
 
 
 
 
 
 
 
184
  private function getCallbackFunctionAndGroupNumber($hookInfo)
185
  {
186
  if (is_array($hookInfo)
176
  public function postPendingEventsTo($plugin)
177
  {
178
  foreach ($this->pendingEvents as $eventInfo) {
179
+ [$eventName, $eventParams] = $eventInfo;
180
  $this->postEvent($eventName, $eventParams, $pending = false, array($plugin));
181
  }
182
  }
183
 
184
+ /**
185
+ * @internal For testing purpose only
186
+ */
187
+ public function clearCache()
188
+ {
189
+ $this->pluginHooks = [];
190
+ }
191
+
192
  private function getCallbackFunctionAndGroupNumber($hookInfo)
193
  {
194
  if (is_array($hookInfo)
app/core/Exception/NotYetInstalledException.php CHANGED
@@ -8,6 +8,14 @@
8
  */
9
  namespace Piwik\Exception;
10
 
 
 
 
 
11
  class NotYetInstalledException extends InvalidRequestParameterException
12
  {
 
 
 
 
13
  }
8
  */
9
  namespace Piwik\Exception;
10
 
11
+ use Piwik\Common;
12
+ use Piwik\Url;
13
+ use Throwable;
14
+
15
  class NotYetInstalledException extends InvalidRequestParameterException
16
  {
17
+ public function __construct($message = "", $code = 0, Throwable $previous = null)
18
+ {
19
+ parent::__construct($message, $code, $previous);
20
+ }
21
  }
app/core/Filesystem.php CHANGED
@@ -41,7 +41,7 @@ class Filesystem
41
  TrackerCache::deleteTrackerCache();
42
  PiwikCache::flushAll();
43
  self::clearPhpCaches();
44
-
45
  $pluginManager = Plugin\Manager::getInstance();
46
  $plugins = $pluginManager->getLoadedPlugins();
47
  foreach ($plugins as $plugin) {
@@ -152,6 +152,7 @@ class Filesystem
152
  // check if filesystem is NFS
153
  if ($returnCode == 0
154
  && count($output) > 1
 
155
  ) {
156
  return true;
157
  }
@@ -161,9 +162,11 @@ class Filesystem
161
  $output = @shell_exec($command);
162
  if ($output) {
163
  $commandFailed = (false !== strpos($output, "no file systems processed"));
164
- $output = explode("\n", trim($output));
 
165
  if (!$commandFailed
166
- && count($output) > 1) {
 
167
  // check if filesystem is NFS
168
  return true;
169
  }
@@ -184,7 +187,7 @@ class Filesystem
184
  * @return array The list of paths that match the pattern.
185
  * @api
186
  */
187
- public static function globr($sDir, $sPattern, $nFlags = null)
188
  {
189
  if (($aFiles = \_glob("$sDir/$sPattern", $nFlags)) == false) {
190
  $aFiles = array();
41
  TrackerCache::deleteTrackerCache();
42
  PiwikCache::flushAll();
43
  self::clearPhpCaches();
44
+
45
  $pluginManager = Plugin\Manager::getInstance();
46
  $plugins = $pluginManager->getLoadedPlugins();
47
  foreach ($plugins as $plugin) {
152
  // check if filesystem is NFS
153
  if ($returnCode == 0
154
  && count($output) > 1
155
+ && preg_match('/\bnfs\d?\b/', implode("\n", $output))
156
  ) {
157
  return true;
158
  }
162
  $output = @shell_exec($command);
163
  if ($output) {
164
  $commandFailed = (false !== strpos($output, "no file systems processed"));
165
+ $output = trim($output);
166
+ $outputArray = explode("\n", $output);
167
  if (!$commandFailed
168
+ && count($outputArray) > 1
169
+ && preg_match('/\bnfs\d?\b/', $output)) {
170
  // check if filesystem is NFS
171
  return true;
172
  }
187
  * @return array The list of paths that match the pattern.
188
  * @api
189
  */
190
+ public static function globr($sDir, $sPattern, $nFlags = 0)
191
  {
192
  if (($aFiles = \_glob("$sDir/$sPattern", $nFlags)) == false) {
193
  $aFiles = array();
app/core/FrontController.php CHANGED
@@ -409,7 +409,8 @@ class FrontController extends Singleton
409
  && Piwik::isUserIsAnonymous()
410
  && $authAdapter->getLogin() === 'anonymous' //double checking the login
411
  && Piwik::isUserHasSomeViewAccess()
412
- && Session::isSessionStarted()) { // only if session was started, don't do it eg for API
 
413
  // usually the session would be started when someone logs in using login controller. But in this
414
  // case we need to init session here for anoynymous users
415
  $init = StaticContainer::get(SessionInitializer::class);
409
  && Piwik::isUserIsAnonymous()
410
  && $authAdapter->getLogin() === 'anonymous' //double checking the login
411
  && Piwik::isUserHasSomeViewAccess()
412
+ && Session::isSessionStarted()
413
+ && Session::isWritable()) { // only if session was started and writable, don't do it eg for API
414
  // usually the session would be started when someone logs in using login controller. But in this
415
  // case we need to init session here for anoynymous users
416
  $init = StaticContainer::get(SessionInitializer::class);
app/core/Http.php CHANGED
@@ -10,6 +10,7 @@ namespace Piwik;
10
 
11
  use Composer\CaBundle\CaBundle;
12
  use Exception;
 
13
 
14
  /**
15
  * Contains HTTP client related helper methods that can retrieve content from remote servers
@@ -67,6 +68,8 @@ class Http
67
  * @param string $httpMethod The HTTP method to use. Defaults to `'GET'`.
68
  * @param string $httpUsername HTTP Auth username
69
  * @param string $httpPassword HTTP Auth password
 
 
70
  *
71
  * @throws Exception if the response cannot be saved to `$destinationPath`, if the HTTP response cannot be sent,
72
  * if there are more than 5 redirects or if the request times out.
@@ -92,13 +95,16 @@ class Http
92
  $getExtendedInfo = false,
93
  $httpMethod = 'GET',
94
  $httpUsername = null,
95
- $httpPassword = null)
 
96
  {
97
  // create output file
98
  $file = self::ensureDestinationDirectoryExists($destinationPath);
99
 
100
  $acceptLanguage = $acceptLanguage ? 'Accept-Language: ' . $acceptLanguage : '';
101
- return self::sendHttpRequestBy(self::getTransportMethod(), $aUrl, $timeout, $userAgent, $destinationPath, $file, $followDepth, $acceptLanguage, $acceptInvalidSslCertificate = false, $byteRange, $getExtendedInfo, $httpMethod, $httpUsername, $httpPassword);
 
 
102
  }
103
 
104
  public static function ensureDestinationDirectoryExists($destinationPath)
@@ -115,6 +121,30 @@ class Http
115
  return null;
116
  }
117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  /**
119
  * Sends an HTTP request using the specified transport method.
120
  *
@@ -135,6 +165,8 @@ class Http
135
  * @param string $httpPassword HTTP Auth password
136
  * @param array|string $requestBody If $httpMethod is 'POST' this may accept an array of variables or a string that needs to be posted
137
  * @param array $additionalHeaders List of additional headers to set for the request
 
 
138
  *
139
  * @return string|array true (or string/array) on success; false on HTTP response error code (1xx or 4xx)
140
  *@throws Exception
@@ -156,7 +188,8 @@ class Http
156
  $httpPassword = null,
157
  $requestBody = null,
158
  $additionalHeaders = array(),
159
- $forcePost = null
 
160
  ) {
161
  if ($followDepth > 5) {
162
  throw new Exception('Too many redirects (' . $followDepth . ')');
@@ -187,6 +220,26 @@ class Http
187
  ));
188
  }
189
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  $contentLength = 0;
191
  $fileLength = 0;
192
 
@@ -218,7 +271,7 @@ class Http
218
  $rangeHeader = 'Range: bytes=' . $rangeBytes . "\r\n";
219
  }
220
 
221
- list($proxyHost, $proxyPort, $proxyUser, $proxyPassword) = self::getProxyConfiguration($aUrl);
222
 
223
  // other result data
224
  $status = null;
@@ -695,7 +748,7 @@ class Http
695
  $split = explode("\r\n\r\n", $response, 2);
696
 
697
  if(count($split) == 2) {
698
- list($header, $response) = $split;
699
  } else {
700
  $response = '';
701
  $header = $split;
@@ -972,7 +1025,7 @@ class Http
972
  return;
973
  }
974
 
975
- list($name, $value) = $parts;
976
  $name = trim($name);
977
  $headers[$name] = trim($value);
978
 
10
 
11
  use Composer\CaBundle\CaBundle;
12
  use Exception;
13
+ use Piwik\Container\StaticContainer;
14
 
15
  /**
16
  * Contains HTTP client related helper methods that can retrieve content from remote servers
68
  * @param string $httpMethod The HTTP method to use. Defaults to `'GET'`.
69
  * @param string $httpUsername HTTP Auth username
70
  * @param string $httpPassword HTTP Auth password
71
+ * @param bool $checkHostIsAllowed whether we should check if the target host is allowed or not. This should only
72
+ * be set to false when using a hardcoded URL.
73
  *
74
  * @throws Exception if the response cannot be saved to `$destinationPath`, if the HTTP response cannot be sent,
75
  * if there are more than 5 redirects or if the request times out.
95
  $getExtendedInfo = false,
96
  $httpMethod = 'GET',
97
  $httpUsername = null,
98
+ $httpPassword = null,
99
+ $checkHostIsAllowed = true)
100
  {
101
  // create output file
102
  $file = self::ensureDestinationDirectoryExists($destinationPath);
103
 
104
  $acceptLanguage = $acceptLanguage ? 'Accept-Language: ' . $acceptLanguage : '';
105
+ return self::sendHttpRequestBy(self::getTransportMethod(), $aUrl, $timeout, $userAgent, $destinationPath, $file,
106
+ $followDepth, $acceptLanguage, $acceptInvalidSslCertificate = false, $byteRange, $getExtendedInfo, $httpMethod,
107
+ $httpUsername, $httpPassword, null, [], null, $checkHostIsAllowed);
108
  }
109
 
110
  public static function ensureDestinationDirectoryExists($destinationPath)
121
  return null;
122
  }
123
 
124
+ private static function convertWildcardToPattern($wildcardHost)
125
+ {
126
+ $flexibleStart = $flexibleEnd = false;
127
+ if (strpos($wildcardHost, '*.') === 0) {
128
+ $flexibleStart = true;
129
+ $wildcardHost = substr($wildcardHost, 2);
130
+ }
131
+ if (Common::stringEndsWith($wildcardHost, '.*')) {
132
+ $flexibleEnd = true;
133
+ $wildcardHost = substr($wildcardHost, 0, -2);
134
+ }
135
+ $pattern = preg_quote($wildcardHost);
136
+
137
+ if ($flexibleStart) {
138
+ $pattern = '.*\.' . $pattern;
139
+ }
140
+
141
+ if ($flexibleEnd) {
142
+ $pattern .= '\..*';
143
+ }
144
+
145
+ return '/^' . $pattern . '$/i';
146
+ }
147
+
148
  /**
149
  * Sends an HTTP request using the specified transport method.
150
  *
165
  * @param string $httpPassword HTTP Auth password
166
  * @param array|string $requestBody If $httpMethod is 'POST' this may accept an array of variables or a string that needs to be posted
167
  * @param array $additionalHeaders List of additional headers to set for the request
168
+ * @param bool $checkHostIsAllowed whether we should check if the target host is allowed or not. This should only
169
+ * be set to false when using a hardcoded URL.
170
  *
171
  * @return string|array true (or string/array) on success; false on HTTP response error code (1xx or 4xx)
172
  *@throws Exception
188
  $httpPassword = null,
189
  $requestBody = null,
190
  $additionalHeaders = array(),
191
+ $forcePost = null,
192
+ $checkHostIsAllowed = true
193
  ) {
194
  if ($followDepth > 5) {
195
  throw new Exception('Too many redirects (' . $followDepth . ')');
220
  ));
221
  }
222
 
223
+ if ($checkHostIsAllowed) {
224
+ $disallowedHosts = StaticContainer::get('http.blocklist.hosts');
225
+
226
+ $isBlocked = false;
227
+
228
+ foreach ($disallowedHosts as $host) {
229
+ if (preg_match(self::convertWildcardToPattern($host), $parsedUrl['host']) === 1) {
230
+ $isBlocked = true;
231
+ break;
232
+ }
233
+ }
234
+
235
+ if ($isBlocked) {
236
+ throw new Exception(sprintf(
237
+ 'Hostname %s is in list of disallowed hosts',
238
+ $parsedUrl['host']
239
+ ));
240
+ }
241
+ }
242
+
243
  $contentLength = 0;
244
  $fileLength = 0;
245
 
271
  $rangeHeader = 'Range: bytes=' . $rangeBytes . "\r\n";
272
  }
273
 
274
+ [$proxyHost, $proxyPort, $proxyUser, $proxyPassword] = self::getProxyConfiguration($aUrl);
275
 
276
  // other result data
277
  $status = null;
748
  $split = explode("\r\n\r\n", $response, 2);
749
 
750
  if(count($split) == 2) {
751
+ [$header, $response] = $split;
752
  } else {
753
  $response = '';
754
  $header = $split;
1025
  return;
1026
  }
1027
 
1028
+ [$name, $value] = $parts;
1029
  $name = trim($name);
1030
  $headers[$name] = trim($value);
1031
 
app/core/IP.php CHANGED
@@ -78,7 +78,11 @@ class IP
78
  $proxyIps = array();
79
  }
80
 
81
- $proxyIps[] = $default;
 
 
 
 
82
 
83
  // examine proxy headers
84
  foreach ($proxyHeaders as $proxyHeader) {
@@ -86,7 +90,11 @@ class IP
86
  // this may be buggy if someone has proxy IPs and proxy host headers configured as
87
  // `$_SERVER[$proxyHeader]` could be eg $_SERVER['HTTP_X_FORWARDED_HOST'] and
88
  // include an actual host name, not an IP
89
- $proxyIp = self::getFirstIpFromList($_SERVER[$proxyHeader], $proxyIps);
 
 
 
 
90
  if (strlen($proxyIp) && stripos($proxyIp, 'unknown') === false) {
91
  return $proxyIp;
92
  }
@@ -107,20 +115,38 @@ class IP
107
  {
108
  $p = strrpos($csv, ',');
109
  if ($p !== false) {
110
- $elements = explode(',', $csv);
111
- foreach ($elements as $ipString) {
112
- $element = trim(Common::sanitizeInputValue($ipString));
113
- if(empty($element)) {
114
- continue;
115
- }
116
- $ip = \Matomo\Network\IP::fromStringIP(IPUtils::sanitizeIp($element));
117
- if (empty($excludedIps) || (!in_array($element, $excludedIps) && !$ip->isInRanges($excludedIps))) {
118
- return $element;
119
- }
120
- }
121
 
122
- return '';
 
 
 
 
 
123
  }
124
  return trim(Common::sanitizeInputValue($csv));
125
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  }
78
  $proxyIps = array();
79
  }
80
 
81
+ $shouldReadLastProxyIp = Config::getInstance()->General['proxy_ip_read_last_in_list'] == 1;
82
+
83
+ if (!$shouldReadLastProxyIp) {
84
+ $proxyIps[] = $default;
85
+ }
86
 
87
  // examine proxy headers
88
  foreach ($proxyHeaders as $proxyHeader) {
90
  // this may be buggy if someone has proxy IPs and proxy host headers configured as
91
  // `$_SERVER[$proxyHeader]` could be eg $_SERVER['HTTP_X_FORWARDED_HOST'] and
92
  // include an actual host name, not an IP
93
+ if ($shouldReadLastProxyIp) {
94
+ $proxyIp = self::getLastIpFromList($_SERVER[$proxyHeader], $proxyIps);
95
+ } else {
96
+ $proxyIp = self::getFirstIpFromList($_SERVER[$proxyHeader], $proxyIps);
97
+ }
98
  if (strlen($proxyIp) && stripos($proxyIp, 'unknown') === false) {
99
  return $proxyIp;
100
  }
115
  {
116
  $p = strrpos($csv, ',');
117
  if ($p !== false) {
118
+ $elements = self::getIpsFromList($csv, $excludedIps);
119
+ return reset($elements) ?: '';
120
+ }
121
+ return trim(Common::sanitizeInputValue($csv));
122
+ }
 
 
 
 
 
 
123
 
124
+ public static function getLastIpFromList($csv, $excludedIps = null)
125
+ {
126
+ $p = strrpos($csv, ',');
127
+ if ($p !== false) {
128
+ $elements = self::getIpsFromList($csv, $excludedIps);
129
+ return end($elements) ?: '';
130
  }
131
  return trim(Common::sanitizeInputValue($csv));
132
  }
133
+
134
+ private static function getIpsFromList(string $csv, ?array $excludedIps)
135
+ {
136
+ $result = [];
137
+
138
+ $elements = explode(',', $csv);
139
+ foreach ($elements as $ipString) {
140
+ $element = trim(Common::sanitizeInputValue($ipString));
141
+ if(empty($element)) {
142
+ continue;
143
+ }
144
+ $ip = \Matomo\Network\IP::fromStringIP(IPUtils::sanitizeIp($element));
145
+ if (empty($excludedIps) || (!in_array($element, $excludedIps) && !$ip->isInRanges($excludedIps))) {
146
+ $result[] = $element;
147
+ }
148
+ }
149
+
150
+ return $result;
151
+ }
152
  }
app/core/Log.php CHANGED
@@ -38,8 +38,9 @@ use Psr\Log\LoggerInterface;
38
  * The following configuration options can be set:
39
  *
40
  * - `log_writers[]`: This is an array of log writer IDs. The three log writers provided
41
- * by Piwik core are **file**, **screen** and **database**. You can
42
- * get more by installing plugins. The default value is **screen**.
 
43
  * - `log_level`: The current log level. Can be **ERROR**, **WARN**, **INFO**, **DEBUG**,
44
  * or **VERBOSE**. Log entries made with a log level that is as or more
45
  * severe than the current log level will be outputted. Others will be
@@ -48,6 +49,9 @@ use Psr\Log\LoggerInterface;
48
  * to log to or a path to a directory to store logs in. If a
49
  * directory, the file name is piwik.log. Can be relative to
50
  * Piwik's root dir or an absolute path. Defaults to **tmp/logs**.
 
 
 
51
  *
52
  *
53
  * @deprecated Inject and use Psr\Log\LoggerInterface instead of this class.
38
  * The following configuration options can be set:
39
  *
40
  * - `log_writers[]`: This is an array of log writer IDs. The three log writers provided
41
+ * by Piwik core are **file**, **screen**, **database**, **errorlog**,
42
+ * and **syslog**. You can get more by installing plugins. The default
43
+ * value is **screen**.
44
  * - `log_level`: The current log level. Can be **ERROR**, **WARN**, **INFO**, **DEBUG**,
45
  * or **VERBOSE**. Log entries made with a log level that is as or more
46
  * severe than the current log level will be outputted. Others will be
49
  * to log to or a path to a directory to store logs in. If a
50
  * directory, the file name is piwik.log. Can be relative to
51
  * Piwik's root dir or an absolute path. Defaults to **tmp/logs**.
52
+ * - `logger_syslog_ident`: If configured to log to syslog, mark them with this
53
+ * identifier string. This acts as an easy-to-find tag in
54
+ * the syslog.
55
  *
56
  *
57
  * @deprecated Inject and use Psr\Log\LoggerInterface instead of this class.
app/core/LogDeleter.php CHANGED
@@ -96,7 +96,8 @@ class LogDeleter
96
  $logsDeleted = 0;
97
  $logPurger = $this;
98
  $this->rawLogDao->forAllLogs('log_visit', $fields, $conditions, $iterationStep, function ($logs) use ($logPurger, &$logsDeleted, $afterChunkDeleted) {
99
- $ids = array_map(function ($row) { return reset($row); }, $logs);
 
100
  $logsDeleted += $logPurger->deleteVisits($ids);
101
 
102
  if (!empty($afterChunkDeleted)) {
96
  $logsDeleted = 0;
97
  $logPurger = $this;
98
  $this->rawLogDao->forAllLogs('log_visit', $fields, $conditions, $iterationStep, function ($logs) use ($logPurger, &$logsDeleted, $afterChunkDeleted) {
99
+ $ids = array_map(function ($row) { return (int) (reset($row)); }, $logs);
100
+ sort($ids);
101
  $logsDeleted += $logPurger->deleteVisits($ids);
102
 
103
  if (!empty($afterChunkDeleted)) {
app/core/Mail.php CHANGED
@@ -8,10 +8,13 @@
8
  */
9
  namespace Piwik;
10
 
 
 
11
  use Piwik\Container\StaticContainer;
12
  use Piwik\Email\ContentGenerator;
13
  use Piwik\Plugins\CoreAdminHome\CustomLogo;
14
  use Piwik\Translation\Translator;
 
15
 
16
  /**
17
  * Class for sending mails
@@ -267,7 +270,7 @@ class Mail
267
  /**
268
  * Sends the mail
269
  *
270
- * @return bool
271
  * @throws \DI\NotFoundException
272
  */
273
  public function send()
@@ -289,6 +292,23 @@ class Mail
289
  return StaticContainer::get('Piwik\Mail\Transport')->send($mail);
290
  }
291
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  /**
293
  * Enables SMTP debugging
294
  *
8
  */
9
  namespace Piwik;
10
 
11
+ use DI\NotFoundException;
12
+ use DI\DependencyException;
13
  use Piwik\Container\StaticContainer;
14
  use Piwik\Email\ContentGenerator;
15
  use Piwik\Plugins\CoreAdminHome\CustomLogo;
16
  use Piwik\Translation\Translator;
17
+ use Psr\Log\LoggerInterface;
18
 
19
  /**
20
  * Class for sending mails
270
  /**
271
  * Sends the mail
272
  *
273
+ * @return bool|null returns null if sending the mail was aborted by the Mail.send event
274
  * @throws \DI\NotFoundException
275
  */
276
  public function send()
292
  return StaticContainer::get('Piwik\Mail\Transport')->send($mail);
293
  }
294
 
295
+ /**
296
+ * If the send email process throws an exception, we catch it and log it
297
+ *
298
+ * @return void
299
+ * @throws NotFoundException
300
+ * @throws DependencyException
301
+ */
302
+ public function safeSend()
303
+ {
304
+ try {
305
+ $this->send();
306
+ } catch (\Exception $e) {
307
+ // we do nothing but log if the email send was unsuccessful
308
+ StaticContainer::get(LoggerInterface::class)->warning('Could not send {class} email: {exception}', ['class' => get_class($this), 'exception' => $e]);
309
+ }
310
+ }
311
+
312
  /**
313
  * Enables SMTP debugging
314
  *
app/core/Option.php CHANGED
@@ -181,7 +181,7 @@ class Option
181
  }
182
 
183
  $value = Db::fetchOne('SELECT option_value FROM `' . Common::prefixTable('option') . '` ' .
184
- 'WHERE option_name = ?', $name);
185
 
186
  $this->all[$name] = $value;
187
  return $value;
181
  }
182
 
183
  $value = Db::fetchOne('SELECT option_value FROM `' . Common::prefixTable('option') . '` ' .
184
+ 'WHERE option_name = ?', [$name]);
185
 
186
  $this->all[$name] = $value;
187
  return $value;
app/core/Piwik.php CHANGED
@@ -176,7 +176,7 @@ class Piwik
176
  public static function getCurrentUserEmail()
177
  {
178
  $user = APIUsersManager::getInstance()->getUser(Piwik::getCurrentUserLogin());
179
- return $user['email'];
180
  }
181
 
182
  /**
176
  public static function getCurrentUserEmail()
177
  {
178
  $user = APIUsersManager::getInstance()->getUser(Piwik::getCurrentUserLogin());
179
+ return $user['email'] ?? '';
180
  }
181
 
182
  /**
app/core/Plugin/Manager.php CHANGED
@@ -1184,6 +1184,7 @@ class Manager
1184
  if (isset($this->loadedPlugins[$pluginName])) {
1185
  return $this->loadedPlugins[$pluginName];
1186
  }
 
1187
  $newPlugin = $this->makePluginClass($pluginName);
1188
 
1189
  $this->addLoadedPlugin($pluginName, $newPlugin);
1184
  if (isset($this->loadedPlugins[$pluginName])) {
1185
  return $this->loadedPlugins[$pluginName];
1186
  }
1187
+
1188
  $newPlugin = $this->makePluginClass($pluginName);
1189
 
1190
  $this->addLoadedPlugin($pluginName, $newPlugin);
app/core/Profiler.php CHANGED
@@ -100,12 +100,18 @@ class Profiler
100
 
101
  private static function maxSumMsFirst($a, $b)
102
  {
103
- return $a['sum_time_ms'] < $b['sum_time_ms'];
 
 
 
104
  }
105
 
106
  private static function sortTimeDesc($a, $b)
107
  {
108
- return $a['sumTimeMs'] < $b['sumTimeMs'];
 
 
 
109
  }
110
 
111
  /**
100
 
101
  private static function maxSumMsFirst($a, $b)
102
  {
103
+ if ($a['sum_time_ms'] == $b['sum_time_ms']) {
104
+ return 0;
105
+ }
106
+ return ($a['sum_time_ms'] < $b['sum_time_ms']) ? -1 : 1;
107
  }
108
 
109
  private static function sortTimeDesc($a, $b)
110
  {
111
+ if ($a['sumTimeMs'] == $b['sumTimeMs']) {
112
+ return 0;
113
+ }
114
+ return ($a['sumTimeMs'] < $b['sumTimeMs']) ? -1 : 1;
115
  }
116
 
117
  /**
app/core/Site.php CHANGED
@@ -422,6 +422,10 @@ class Site
422
  */
423
  public static function getIdSitesFromIdSitesString($ids, $_restrictSitesToLogin = false)
424
  {
 
 
 
 
425
  if ($ids === 'all') {
426
  return API::getInstance()->getSitesIdWithAtLeastViewAccess($_restrictSitesToLogin);
427
  }
422
  */
423
  public static function getIdSitesFromIdSitesString($ids, $_restrictSitesToLogin = false)
424
  {
425
+ if (empty($ids)) {
426
+ return [];
427
+ }
428
+
429
  if ($ids === 'all') {
430
  return API::getInstance()->getSitesIdWithAtLeastViewAccess($_restrictSitesToLogin);
431
  }
app/core/Tracker.php CHANGED
@@ -223,7 +223,9 @@ class Tracker
223
  try {
224
  self::$db = TrackerDb::connectPiwikTrackerDb();
225
  } catch (Exception $e) {
226
- throw new DbException($e->getMessage(), $e->getCode());
 
 
227
  }
228
  }
229
 
223
  try {
224
  self::$db = TrackerDb::connectPiwikTrackerDb();
225
  } catch (Exception $e) {
226
+ $code = $e->getCode();
227
+ // Note: PDOException might return a string as code, but we can't use this for DbException
228
+ throw new DbException($e->getMessage(), is_int($code) ? $code : 0);
229
  }
230
  }
231
 
app/core/Tracker/Failures.php CHANGED
@@ -101,7 +101,7 @@ class Failures
101
  if (!empty($token) && $value === $token) {
102
  $params[$key] = '__TOKEN_AUTH__'; // user accidentally posted the token in a wrong field
103
  } elseif (!empty($value) && is_string($value)
104
- && Common::mb_strlen($value) >= 29 && Common::mb_strlen($value) <= 36
105
  && ctype_xdigit($value)) {
106
  $params[$key] = '__TOKEN_AUTH__'; // user maybe posted a token in a different field... it looks like it might be a token
107
  }
101
  if (!empty($token) && $value === $token) {
102
  $params[$key] = '__TOKEN_AUTH__'; // user accidentally posted the token in a wrong field
103
  } elseif (!empty($value) && is_string($value)
104
+ && mb_strlen($value) >= 29 && mb_strlen($value) <= 36
105
  && ctype_xdigit($value)) {
106
  $params[$key] = '__TOKEN_AUTH__'; // user maybe posted a token in a different field... it looks like it might be a token
107
  }
app/core/Tracker/GoalManager.php CHANGED
@@ -731,7 +731,7 @@ class GoalManager
731
  if (empty($lastActionTime)) {
732
  $conversion['buster'] = $this->makeRandomMySqlUnsignedInt(10);
733
  } else {
734
- $conversion['buster'] = $this->makeRandomMySqlUnsignedInt(2) . Common::mb_substr($visitProperties->getProperty('visit_last_action_time'), 2);
735
  }
736
  }
737
 
731
  if (empty($lastActionTime)) {
732
  $conversion['buster'] = $this->makeRandomMySqlUnsignedInt(10);
733
  } else {
734
+ $conversion['buster'] = $this->makeRandomMySqlUnsignedInt(2) . mb_substr($visitProperties->getProperty('visit_last_action_time'), 2);
735
  }
736
  }
737
 
app/core/Tracker/PageUrl.php CHANGED
@@ -179,7 +179,7 @@ class PageUrl
179
  }
180
 
181
  if (!empty($parsedUrl['host'])) {
182
- $parsedUrl['host'] = Common::mb_strtolower($parsedUrl['host']);
183
  }
184
 
185
  if (!empty($parsedUrl['fragment'])) {
@@ -365,7 +365,7 @@ class PageUrl
365
  $hostSiteCache = false;
366
 
367
  foreach ($siteUrlCache as $siteUrl) {
368
- if (strpos(Common::mb_strtolower($siteUrl), Common::mb_strtolower('https://' . $host)) === 0) {
369
  $hostSiteCache = true;
370
  break;
371
  }
179
  }
180
 
181
  if (!empty($parsedUrl['host'])) {
182
+ $parsedUrl['host'] = mb_strtolower($parsedUrl['host']);
183
  }
184
 
185
  if (!empty($parsedUrl['fragment'])) {
365
  $hostSiteCache = false;
366
 
367
  foreach ($siteUrlCache as $siteUrl) {
368
+ if (strpos(mb_strtolower($siteUrl), mb_strtolower('https://' . $host)) === 0) {
369
  $hostSiteCache = true;
370
  break;
371
  }
app/core/Tracker/Request.php CHANGED
@@ -73,7 +73,6 @@ class Request
73
  $this->tokenAuth = $tokenAuth;
74
  $this->timestamp = time();
75
  $this->isEmptyRequest = empty($params);
76
- $this->customTimestampDoesNotRequireTokenauthWhenNewerThan = (int) TrackerConfig::getConfigValue('tracking_requests_require_authentication_when_custom_timestamp_newer_than');
77
 
78
  // When the 'url' and referrer url parameter are not given, we might be in the 'Simple Image Tracker' mode.
79
  // The URL can default to the Referrer, which will be in this case
@@ -90,6 +89,9 @@ class Request
90
 
91
  // check for 4byte utf8 characters in all tracking params and replace them with � if not support by database
92
  $this->params = $this->replaceUnsupportedUtf8Chars($this->params);
 
 
 
93
  }
94
 
95
  protected function replaceUnsupportedUtf8Chars($value, $key=false)
@@ -148,7 +150,7 @@ class Request
148
  */
149
  protected function authenticateTrackingApi($tokenAuth)
150
  {
151
- $shouldAuthenticate = TrackerConfig::getConfigValue('tracking_requests_require_authentication');
152
 
153
  if ($shouldAuthenticate) {
154
  try {
@@ -238,11 +240,10 @@ class Request
238
 
239
  public function isRequestExcluded()
240
  {
241
- $config = Config::getInstance();
242
- $tracker = $config->Tracker;
243
 
244
- if (!empty($tracker['exclude_requests'])) {
245
- $excludedRequests = explode(',', $tracker['exclude_requests']);
246
  $pattern = '/^(.+?)('.SegmentExpression::MATCH_EQUAL.'|'
247
  .SegmentExpression::MATCH_NOT_EQUAL.'|'
248
  .SegmentExpression::MATCH_CONTAINS.'|'
@@ -262,8 +263,8 @@ class Request
262
  $valueRightMember = urldecode($matches[3]);
263
  }
264
  $actual = Common::getRequestVar($leftMember, '', 'string', $this->params);
265
- $actual = Common::mb_strtolower($actual);
266
- $valueRightMember = Common::mb_strtolower($valueRightMember);
267
  switch ($operation) {
268
  case SegmentExpression::MATCH_EQUAL:
269
  if ($actual === $valueRightMember) {
@@ -587,6 +588,15 @@ class Request
587
  return $idSite;
588
  }
589
 
 
 
 
 
 
 
 
 
 
590
  public function getIdSite()
591
  {
592
  if (isset($this->idSiteCache)) {
@@ -625,7 +635,7 @@ class Request
625
 
626
  public function shouldUseThirdPartyCookie()
627
  {
628
- return (bool)Config::getInstance()->Tracker['use_third_party_id_cookie'];
629
  }
630
 
631
  public function getThirdPartyCookieVisitorId()
@@ -685,22 +695,22 @@ class Request
685
 
686
  protected function getCookieName()
687
  {
688
- return TrackerConfig::getConfigValue('cookie_name');
689
  }
690
 
691
  protected function getCookieExpire()
692
  {
693
- return $this->getCurrentTimestamp() + TrackerConfig::getConfigValue('cookie_expire');
694
  }
695
 
696
  protected function getCookiePath()
697
  {
698
- return TrackerConfig::getConfigValue('cookie_path');
699
  }
700
 
701
  protected function getCookieDomain()
702
  {
703
- return TrackerConfig::getConfigValue('cookie_domain');
704
  }
705
 
706
  /**
@@ -716,7 +726,7 @@ class Request
716
  {
717
  $found = false;
718
 
719
- if (TrackerConfig::getConfigValue('enable_userid_overwrites_visitorid')) {
720
  // If User ID is set it takes precedence
721
  $userId = $this->getForcedUserId();
722
  if ($userId) {
73
  $this->tokenAuth = $tokenAuth;
74
  $this->timestamp = time();
75
  $this->isEmptyRequest = empty($params);
 
76
 
77
  // When the 'url' and referrer url parameter are not given, we might be in the 'Simple Image Tracker' mode.
78
  // The URL can default to the Referrer, which will be in this case
89
 
90
  // check for 4byte utf8 characters in all tracking params and replace them with � if not support by database
91
  $this->params = $this->replaceUnsupportedUtf8Chars($this->params);
92
+
93
+ $this->customTimestampDoesNotRequireTokenauthWhenNewerThan = (int) TrackerConfig::getConfigValue('tracking_requests_require_authentication_when_custom_timestamp_newer_than',
94
+ $this->getIdSiteIfExists());
95
  }
96
 
97
  protected function replaceUnsupportedUtf8Chars($value, $key=false)
150
  */
151
  protected function authenticateTrackingApi($tokenAuth)
152
  {
153
+ $shouldAuthenticate = TrackerConfig::getConfigValue('tracking_requests_require_authentication', $this->getIdSiteIfExists());
154
 
155
  if ($shouldAuthenticate) {
156
  try {
240
 
241
  public function isRequestExcluded()
242
  {
243
+ $excludedRequests = TrackerConfig::getConfigValue('exclude_requests', $this->getIdSiteIfExists());
 
244
 
245
+ if (!empty($excludedRequests)) {
246
+ $excludedRequests = explode(',', $excludedRequests);
247
  $pattern = '/^(.+?)('.SegmentExpression::MATCH_EQUAL.'|'
248
  .SegmentExpression::MATCH_NOT_EQUAL.'|'
249
  .SegmentExpression::MATCH_CONTAINS.'|'
263
  $valueRightMember = urldecode($matches[3]);
264
  }
265
  $actual = Common::getRequestVar($leftMember, '', 'string', $this->params);
266
+ $actual = mb_strtolower($actual);
267
+ $valueRightMember = mb_strtolower($valueRightMember);
268
  switch ($operation) {
269
  case SegmentExpression::MATCH_EQUAL:
270
  if ($actual === $valueRightMember) {
588
  return $idSite;
589
  }
590
 
591
+ public function getIdSiteIfExists()
592
+ {
593
+ try {
594
+ return $this->getIdSite();
595
+ } catch (UnexpectedWebsiteFoundException $ex) {
596
+ return null;
597
+ }
598
+ }
599
+
600
  public function getIdSite()
601
  {
602
  if (isset($this->idSiteCache)) {
635
 
636
  public function shouldUseThirdPartyCookie()
637
  {
638
+ return TrackerConfig::getConfigValue('use_third_party_id_cookie', $this->getIdSiteIfExists());
639
  }
640
 
641
  public function getThirdPartyCookieVisitorId()
695
 
696
  protected function getCookieName()
697
  {
698
+ return TrackerConfig::getConfigValue('cookie_name', $this->getIdSiteIfExists());
699
  }
700
 
701
  protected function getCookieExpire()
702
  {
703
+ return $this->getCurrentTimestamp() + TrackerConfig::getConfigValue('cookie_expire', $this->getIdSiteIfExists());
704
  }
705
 
706
  protected function getCookiePath()
707
  {
708
+ return TrackerConfig::getConfigValue('cookie_path', $this->getIdSiteIfExists());
709
  }
710
 
711
  protected function getCookieDomain()
712
  {
713
+ return TrackerConfig::getConfigValue('cookie_domain', $this->getIdSiteIfExists());
714
  }
715
 
716
  /**
726
  {
727
  $found = false;
728
 
729
+ if (TrackerConfig::getConfigValue('enable_userid_overwrites_visitorid', $this->getIdSiteIfExists())) {
730
  // If User ID is set it takes precedence
731
  $userId = $this->getForcedUserId();
732
  if ($userId) {
app/core/Tracker/TrackerConfig.php CHANGED
@@ -25,9 +25,13 @@ class TrackerConfig
25
  Config::getInstance()->Tracker = $section;
26
  }
27
 
28
- public static function getConfigValue($name)
29
  {
30
  $config = self::getConfig();
 
 
 
 
31
  return $config[$name];
32
  }
33
 
@@ -35,4 +39,10 @@ class TrackerConfig
35
  {
36
  return Config::getInstance()->Tracker;
37
  }
 
 
 
 
 
 
38
  }
25
  Config::getInstance()->Tracker = $section;
26
  }
27
 
28
+ public static function getConfigValue($name, $idSite = null)
29
  {
30
  $config = self::getConfig();
31
+ if (!empty($idSite)) {
32
+ $siteSpecificConfig = self::getSiteSpecificConfig($idSite);
33
+ $config = array_merge($config, $siteSpecificConfig);
34
+ }
35
  return $config[$name];
36
  }
37
 
39
  {
40
  return Config::getInstance()->Tracker;
41
  }
42
+
43
+ private static function getSiteSpecificConfig($idSite)
44
+ {
45
+ $key = 'Tracker_' . $idSite;
46
+ return Config::getInstance()->$key;
47
+ }
48
  }
app/core/Tracker/Visit.php CHANGED
@@ -411,7 +411,7 @@ class Visit implements VisitInterface
411
 
412
  private static function toCanonicalHost($host)
413
  {
414
- $hostLower = Common::mb_strtolower($host);
415
  return str_replace('www.', '', $hostLower);
416
  }
417
 
@@ -586,7 +586,7 @@ class Visit implements VisitInterface
586
  $valuesToUpdate['idvisitor'] = $this->request->getVisitorId();
587
  }
588
 
589
- if (TrackerConfig::getConfigValue('enable_userid_overwrites_visitorid')) {
590
  // User ID takes precedence and overwrites idvisitor value
591
  $userId = $this->request->getForcedUserId();
592
  if ($userId) {
411
 
412
  private static function toCanonicalHost($host)
413
  {
414
+ $hostLower = mb_strtolower($host);
415
  return str_replace('www.', '', $hostLower);
416
  }
417
 
586
  $valuesToUpdate['idvisitor'] = $this->request->getVisitorId();
587
  }
588
 
589
+ if (TrackerConfig::getConfigValue('enable_userid_overwrites_visitorid', $this->request->getIdSiteIfExists())) {
590
  // User ID takes precedence and overwrites idvisitor value
591
  $userId = $this->request->getForcedUserId();
592
  if ($userId) {
app/core/Tracker/VisitorRecognizer.php CHANGED
@@ -104,7 +104,7 @@ class VisitorRecognizer
104
  $shouldMatchOneFieldOnly = $this->shouldLookupOneVisitorFieldOnly($isVisitorIdToLookup, $request);
105
  list($timeLookBack, $timeLookAhead) = $this->getWindowLookupThisVisit($request);
106
 
107
- $maxActions = TrackerConfig::getConfigValue('create_new_visit_after_x_actions');
108
 
109
  $visitRow = $this->model->findVisitor($idSite, $configId, $idVisitor, $userId, $persistedVisitAttributes, $shouldMatchOneFieldOnly, $isVisitorIdToLookup, $timeLookBack, $timeLookAhead);
110
 
104
  $shouldMatchOneFieldOnly = $this->shouldLookupOneVisitorFieldOnly($isVisitorIdToLookup, $request);
105
  list($timeLookBack, $timeLookAhead) = $this->getWindowLookupThisVisit($request);
106
 
107
+ $maxActions = TrackerConfig::getConfigValue('create_new_visit_after_x_actions', $request->getIdSiteIfExists());
108
 
109
  $visitRow = $this->model->findVisitor($idSite, $configId, $idVisitor, $userId, $persistedVisitAttributes, $shouldMatchOneFieldOnly, $isVisitorIdToLookup, $timeLookBack, $timeLookAhead);
110
 
app/core/Twig.php CHANGED
@@ -26,7 +26,7 @@ use Twig\TwigTest;
26
 
27
  function piwik_filter_truncate($string, $size)
28
  {
29
- if (Common::mb_strlen(html_entity_decode($string)) <= $size) {
30
  return $string;
31
  } else {
32
  preg_match('/^(&(?:[a-z\d]+|#\d+|#x[a-f\d]+);|.){'.$size.'}/i', $string, $shortenString);
26
 
27
  function piwik_filter_truncate($string, $size)
28
  {
29
+ if (mb_strlen(html_entity_decode($string)) <= $size) {
30
  return $string;
31
  } else {
32
  preg_match('/^(&(?:[a-z\d]+|#\d+|#x[a-f\d]+);|.){'.$size.'}/i', $string, $shortenString);
app/core/Updates/4.0.0-b1.php CHANGED
@@ -10,9 +10,11 @@
10
  namespace Piwik\Updates;
11
 
12
  use Piwik\DataAccess\TableMetadata;
13
- use Piwik\Date;
 
14
  use Piwik\DbHelper;
15
  use Piwik\Plugin\Manager;
 
16
  use Piwik\Plugins\CoreHome\Columns\Profilable;
17
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceFirst;
18
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceOrder;
@@ -28,6 +30,7 @@ use Piwik\Common;
28
  use Piwik\Config;
29
  use Piwik\Plugins\UserCountry\LocationProvider;
30
  use Piwik\Plugins\VisitorInterest\Columns\VisitorSecondsSinceLast;
 
31
  use Piwik\Updater;
32
  use Piwik\Updates as PiwikUpdates;
33
  use Piwik\Updater\Migration\Factory as MigrationFactory;
@@ -55,35 +58,12 @@ class Updates_4_0_0_b1 extends PiwikUpdates
55
 
56
  $migrations = [];
57
 
58
- /** APP SPECIFIC TOKEN START */
59
- $migrations[] = $this->migration->db->createTable('user_token_auth', array(
60
- 'idusertokenauth' => 'BIGINT UNSIGNED NOT NULL AUTO_INCREMENT',
61
- 'login' => 'VARCHAR(100) NOT NULL',
62
- 'description' => 'VARCHAR('.Model::MAX_LENGTH_TOKEN_DESCRIPTION.') NOT NULL',
63
- 'password' => 'VARCHAR(191) NOT NULL',
64
- 'system_token' => 'TINYINT(1) NOT NULL DEFAULT 0',
65
- 'hash_algo' => 'VARCHAR(30) NOT NULL',
66
- 'last_used' => 'DATETIME NULL',
67
- 'date_created' => ' DATETIME NOT NULL',
68
- 'date_expired' => ' DATETIME NULL',
69
- ), 'idusertokenauth');
70
- $migrations[] = $this->migration->db->addUniqueKey('user_token_auth', 'password', 'uniq_password');
71
-
72
- $migrations[] = $this->migration->db->dropIndex('user', 'uniq_keytoken');
73
-
74
- $userModel = new Model();
75
- foreach ($userModel->getUsers(array()) as $user) {
76
- if (!empty($user['token_auth'])) {
77
- $migrations[] = $this->migration->db->insert('user_token_auth', array(
78
- 'login' => $user['login'],
79
- 'description' => 'Created by Matomo 4 migration',
80
- 'password' => $userModel->hashTokenAuth($user['token_auth']),
81
- 'date_created' => Date::now()->getDatetime()
82
- ));
83
- }
84
- }
85
 
86
- /** APP SPECIFIC TOKEN END */
87
 
88
  // invalidations table
89
  $migrations[] = $this->migration->db->createTable('archive_invalidations', [
@@ -95,7 +75,6 @@ class Updates_4_0_0_b1 extends PiwikUpdates
95
  'date2' => 'DATE NOT NULL',
96
  'period' => 'TINYINT UNSIGNED NOT NULL',
97
  'ts_invalidated' => 'DATETIME NOT NULL',
98
- 'ts_started' => 'DATETIME NULL',
99
  'status' => 'TINYINT(1) UNSIGNED DEFAULT 0',
100
  'report' => 'VARCHAR(255) NULL',
101
  ], ['idinvalidation']);
@@ -103,13 +82,41 @@ class Updates_4_0_0_b1 extends PiwikUpdates
103
  $migrations[] = $this->migration->db->addIndex('archive_invalidations', ['idsite', 'date1', 'period'], 'index_idsite_dates_period_name');
104
 
105
  $migrations[] = $this->migration->db->dropColumn('user', 'alias');
106
- $migrations[] = $this->migration->db->dropColumn('user', 'token_auth');
107
 
108
- // keep piwik_ignore for existing installs
109
- $migrations[] = $this->migration->config->set('Tracker', 'ignore_visits_cookie_name', 'piwik_ignore');
 
 
 
 
110
 
 
 
111
  $migrations[] = $this->migration->db->changeColumn('log_link_visit_action', 'interaction_position', 'pageview_position', 'MEDIUMINT UNSIGNED DEFAULT NULL');
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  // Move the site search fields of log_visit out of custom variables into their own fields
114
  $columnsToAdd['log_link_visit_action']['search_cat'] = 'VARCHAR(200) NULL';
115
  $columnsToAdd['log_link_visit_action']['search_count'] = 'INTEGER(10) UNSIGNED NULL';
@@ -152,6 +159,19 @@ class Updates_4_0_0_b1 extends PiwikUpdates
152
  }
153
  }
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  // init seconds_to_... columns
156
  $logVisitColumns = $tableMetadata->getColumns(Common::prefixTable('log_visit'));
157
  $hasDaysColumnInVisit = in_array('visitor_days_since_first', $logVisitColumns);
@@ -172,11 +192,6 @@ class Updates_4_0_0_b1 extends PiwikUpdates
172
  visitor_seconds_since_order = visitor_days_since_order * 86400");
173
  }
174
 
175
- if (Manager::getInstance()->isPluginInstalled('CustomVariables')) {
176
- $visitActionTable = Common::prefixTable('log_link_visit_action');
177
- $migrations[] = $this->migration->db->sql("UPDATE $visitActionTable SET search_cat = if(custom_var_k4 = '_pk_scat', custom_var_v4, search_cat), search_count = if(custom_var_k5 = '_pk_scount', custom_var_v5, search_count) WHERE custom_var_k4 = '_pk_scat' or custom_var_k5 = '_pk_scount'");
178
- }
179
-
180
  // remove old days_to_... columns
181
  $migrations[] = $this->migration->db->dropColumns('log_visit', [
182
  'config_gears',
@@ -196,6 +211,9 @@ class Updates_4_0_0_b1 extends PiwikUpdates
196
  $migrations[] = $this->migration->config->set('mail', 'type', 'Cram-md5');
197
  }
198
 
 
 
 
199
  $migrations[] = $this->migration->plugin->activate('PagePerformance');
200
  if (!Manager::getInstance()->isPluginActivated('CustomDimensions')) {
201
  $migrations[] = $this->migration->plugin->activate('CustomDimensions');
@@ -211,18 +229,76 @@ class Updates_4_0_0_b1 extends PiwikUpdates
211
  $migrations[] = $this->migration->config->set('General', 'datatable_archiving_maximum_rows_subtable_custom_dimensions', $configSubTableLimit);
212
  }
213
 
214
- $migrations[] = $this->migration->db->changeColumnType('session', 'id', 'VARCHAR(191)');
215
- $migrations[] = $this->migration->db->changeColumnType('site_url', 'url', 'VARCHAR(190)');
216
- $migrations[] = $this->migration->db->changeColumnType('option', 'option_name', 'VARCHAR(191)');
217
-
218
- $migrations[] = $this->migration->db->changeColumnType('log_action', 'name', 'VARCHAR(4096)');
219
- $migrations[] = $this->migration->db->changeColumnType('log_conversion', 'url', 'VARCHAR(4096)');
220
  return $migrations;
221
  }
222
 
223
  public function doUpdate(Updater $updater)
224
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  }
227
 
228
  protected function usesGeoIpLegacyLocationProvider()
10
  namespace Piwik\Updates;
11
 
12
  use Piwik\DataAccess\TableMetadata;
13
+ use Piwik\Updater\Migration\Custom as CustomMigration;
14
+ use Piwik\Db;
15
  use Piwik\DbHelper;
16
  use Piwik\Plugin\Manager;
17
+ use Piwik\Plugins\CoreAdminHome\Commands\MigrateTokenAuths;
18
  use Piwik\Plugins\CoreHome\Columns\Profilable;
19
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceFirst;
20
  use Piwik\Plugins\CoreHome\Columns\VisitorSecondsSinceOrder;
30
  use Piwik\Config;
31
  use Piwik\Plugins\UserCountry\LocationProvider;
32
  use Piwik\Plugins\VisitorInterest\Columns\VisitorSecondsSinceLast;
33
+ use Piwik\SettingsPiwik;
34
  use Piwik\Updater;
35
  use Piwik\Updates as PiwikUpdates;
36
  use Piwik\Updater\Migration\Factory as MigrationFactory;
58
 
59
  $migrations = [];
60
 
61
+ $domain = Config::getLocalConfigPath() === Config::getDefaultLocalConfigPath() ? '' : Config::getHostname();
62
+ $domainArg = !empty($domain) ? "--matomo-domain=". escapeshellarg($domain) . " " : '';
63
+ $toString = sprintf('./console %score:matomo4-migrate-token-auths', $domainArg);
64
+ $custom = new CustomMigration(array(MigrateTokenAuths::class, 'migrate'), $toString);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
+ $migrations[] = $custom;
67
 
68
  // invalidations table
69
  $migrations[] = $this->migration->db->createTable('archive_invalidations', [
75
  'date2' => 'DATE NOT NULL',
76
  'period' => 'TINYINT UNSIGNED NOT NULL',
77
  'ts_invalidated' => 'DATETIME NOT NULL',
 
78
  'status' => 'TINYINT(1) UNSIGNED DEFAULT 0',
79
  'report' => 'VARCHAR(255) NULL',
80
  ], ['idinvalidation']);
82
  $migrations[] = $this->migration->db->addIndex('archive_invalidations', ['idsite', 'date1', 'period'], 'index_idsite_dates_period_name');
83
 
84
  $migrations[] = $this->migration->db->dropColumn('user', 'alias');
 
85
 
86
+ // prevent possible duplicates when shorting session id
87
+ $migrations[] = $this->migration->db->sql('DELETE FROM `' . Common::prefixTable('session') . '` WHERE length(id) > 190');
88
+
89
+ $migrations[] = $this->migration->db->changeColumnType('session', 'id', 'VARCHAR(191)');
90
+ $migrations[] = $this->migration->db->changeColumnType('site_url', 'url', 'VARCHAR(190)');
91
+ $migrations[] = $this->migration->db->changeColumnType('option', 'option_name', 'VARCHAR(191)');
92
 
93
+ $migrations[] = $this->migration->db->changeColumnType('log_action', 'name', 'VARCHAR(4096)');
94
+ $migrations[] = $this->migration->db->changeColumnType('log_conversion', 'url', 'VARCHAR(4096)');
95
  $migrations[] = $this->migration->db->changeColumn('log_link_visit_action', 'interaction_position', 'pageview_position', 'MEDIUMINT UNSIGNED DEFAULT NULL');
96
 
97
+ $customTrackerPluginActive = false;
98
+ if (in_array('CustomPiwikJs', Config::getInstance()->Plugins['Plugins'])) {
99
+ $customTrackerPluginActive = true;
100
+ }
101
+
102
+ $migrations[] = $this->migration->plugin->activate('BulkTracking');
103
+ $migrations[] = $this->migration->plugin->deactivate('CustomPiwikJs');
104
+ $migrations[] = $this->migration->plugin->uninstall('CustomPiwikJs');
105
+
106
+ if ($customTrackerPluginActive) {
107
+ $migrations[] = $this->migration->plugin->activate('CustomJsTracker');
108
+ }
109
+
110
+ // Prepare all installed tables for utf8mb4 conversions. e.g. make some indexed fields smaller so they don't exceed the maximum key length
111
+ $allTables = DbHelper::getTablesInstalled();
112
+
113
+ foreach ($allTables as $table) {
114
+ if (preg_match('/archive_/', $table) == 1) {
115
+ $tableNameUnprefixed = Common::unprefixTable($table);
116
+ $migrations[] = $this->migration->db->changeColumnType($tableNameUnprefixed, 'name', 'VARCHAR(190)');
117
+ }
118
+ }
119
+
120
  // Move the site search fields of log_visit out of custom variables into their own fields
121
  $columnsToAdd['log_link_visit_action']['search_cat'] = 'VARCHAR(200) NULL';
122
  $columnsToAdd['log_link_visit_action']['search_count'] = 'INTEGER(10) UNSIGNED NULL';
159
  }
160
  }
161
 
162
+ if (Manager::getInstance()->isPluginInstalled('CustomVariables')) {
163
+ $visitActionTable = Common::prefixTable('log_link_visit_action');
164
+ $migrations[] = $this->migration->db->sql("UPDATE $visitActionTable SET search_cat = if(custom_var_k4 = '_pk_scat', custom_var_v4, search_cat), search_count = if(custom_var_k5 = '_pk_scount', custom_var_v5, search_count) WHERE custom_var_k4 = '_pk_scat' or custom_var_k5 = '_pk_scount'");
165
+ }
166
+
167
+ if ($this->usesGeoIpLegacyLocationProvider()) {
168
+ // activate GeoIp2 plugin for users still using GeoIp2 Legacy (others might have it disabled on purpose)
169
+ $migrations[] = $this->migration->plugin->activate('GeoIp2');
170
+ }
171
+
172
+ // remove old options
173
+ $migrations[] = $this->migration->db->sql('DELETE FROM `' . Common::prefixTable('option') . '` WHERE option_name IN ("geoip.updater_period", "geoip.loc_db_url", "geoip.isp_db_url", "geoip.org_db_url")');
174
+
175
  // init seconds_to_... columns
176
  $logVisitColumns = $tableMetadata->getColumns(Common::prefixTable('log_visit'));
177
  $hasDaysColumnInVisit = in_array('visitor_days_since_first', $logVisitColumns);
192
  visitor_seconds_since_order = visitor_days_since_order * 86400");
193
  }
194
 
 
 
 
 
 
195
  // remove old days_to_... columns
196
  $migrations[] = $this->migration->db->dropColumns('log_visit', [
197
  'config_gears',
211
  $migrations[] = $this->migration->config->set('mail', 'type', 'Cram-md5');
212
  }
213
 
214
+ // keep piwik_ignore for existing installs
215
+ $migrations[] = $this->migration->config->set('Tracker', 'ignore_visits_cookie_name', 'piwik_ignore');
216
+
217
  $migrations[] = $this->migration->plugin->activate('PagePerformance');
218
  if (!Manager::getInstance()->isPluginActivated('CustomDimensions')) {
219
  $migrations[] = $this->migration->plugin->activate('CustomDimensions');
229
  $migrations[] = $this->migration->config->set('General', 'datatable_archiving_maximum_rows_subtable_custom_dimensions', $configSubTableLimit);
230
  }
231
 
 
 
 
 
 
 
232
  return $migrations;
233
  }
234
 
235
  public function doUpdate(Updater $updater)
236
  {
237
+ $salt = SettingsPiwik::getSalt();
238
+ $sessions = Db::fetchAll('SELECT id from ' . Common::prefixTable('session'));
239
+
240
+ foreach ($sessions as $session) {
241
+ if (!empty($session['id']) && mb_strlen($session['id']) != 128) {
242
+ $bind = [ hash('sha512', $session['id'] . $salt), $session['id'] ];
243
+ try {
244
+ Db::query(sprintf('UPDATE %s SET id = ? WHERE id = ?', Common::prefixTable('session')), $bind);
245
+ } catch (\Exception $e) {
246
+ // ignore possible duplicate key errors
247
+ }
248
+ }
249
+ }
250
+
251
  $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
252
+
253
+ if ($this->usesGeoIpLegacyLocationProvider()) {
254
+ // switch to default provider if GeoIp Legacy was still in use
255
+ LocationProvider::setCurrentProvider(LocationProvider\DefaultProvider::ID);
256
+ }
257
+
258
+ // eg the case when not updating from most recent Matomo 3.X and when not using the UI updater
259
+ // afterwards the should receive a notification that the plugins are outdated
260
+ self::ensureCorePluginsThatWereMovedToMarketplaceCanBeUpdated();
261
+ ServerFilesGenerator::createFilesForSecurity();
262
+ }
263
+
264
+ public static function ensureCorePluginsThatWereMovedToMarketplaceCanBeUpdated()
265
+ {
266
+ $plugins = ['Provider', 'CustomVariables'];
267
+ $pluginManager = Manager::getInstance();
268
+ foreach ($plugins as $plugin) {
269
+ if ($pluginManager->isPluginThirdPartyAndBogus($plugin)) {
270
+ $pluginDir = Manager::getPluginDirectory($plugin);
271
+
272
+ if (is_dir($pluginDir) &&
273
+ file_exists($pluginDir . '/' . $plugin . '.php')
274
+ && !file_exists($pluginDir . '/plugin.json')
275
+ && is_writable($pluginDir)) {
276
+ file_put_contents($pluginDir . '/plugin.json', '{
277
+ "name": "'.$plugin.'",
278
+ "description": "'.$plugin.'",
279
+ "version": "3.14.1",
280
+ "theme": false,
281
+ "require": {
282
+ "piwik": ">=3.0.0,<4.0.0-b1"
283
+ },
284
+ "authors": [
285
+ {
286
+ "name": "Matomo",
287
+ "email": "hello@matomo.org",
288
+ "homepage": "https:\/\/matomo.org"
289
+ }
290
+ ],
291
+ "homepage": "https:\/\/matomo.org",
292
+ "license": "GPL v3+",
293
+ "keywords": ["'.$plugin.'"]
294
+ }');
295
+ // otherwise cached information might be used and it won't be loaded otherwise within same request
296
+ $pluginObj = $pluginManager->loadPlugin($plugin);
297
+ $pluginObj->reloadPluginInformation();
298
+ $pluginManager->unloadPlugin($pluginObj); // prevent any events being posted to it somehow
299
+ }
300
+ }
301
+ }
302
  }
303
 
304
  protected function usesGeoIpLegacyLocationProvider()
app/core/Updates/4.0.0-b3.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Config;
13
+ use Piwik\Updater;
14
+ use Piwik\Updates as PiwikUpdates;
15
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
16
+
17
+ /**
18
+ * Update for version 4.0.0-b3.
19
+ */
20
+ class Updates_4_0_0_b3 extends PiwikUpdates
21
+ {
22
+ /**
23
+ * @var MigrationFactory
24
+ */
25
+ private $migration;
26
+
27
+ public function __construct(MigrationFactory $factory)
28
+ {
29
+ $this->migration = $factory;
30
+ }
31
+
32
+ public function getMigrations(Updater $updater)
33
+ {
34
+ $migrations = [];
35
+
36
+ $config = Config::getInstance();
37
+ $general = $config->General;
38
+ if (empty($general['login_whitelist_apply_to_reporting_api_requests'])) {
39
+ $migrations[] = $this->migration->config->set('General', 'login_allowlist_apply_to_reporting_api_requests', '0');
40
+ }
41
+
42
+ return $migrations;
43
+ }
44
+
45
+ public function doUpdate(Updater $updater)
46
+ {
47
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
48
+
49
+ $config = Config::getInstance();
50
+ $general = $config->General;
51
+ if (!empty($general['login_whitelist_ip'])) {
52
+ // the migration->config->set does not support arrays yet so we do it here.
53
+ $general['login_allowlist_ip'] = $general['login_whitelist_ip'];
54
+ $config->General = $general;
55
+ $config->forceSave();
56
+ }
57
+
58
+ }
59
+
60
+ }
app/core/Updates/4.0.0-rc3.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Config;
13
+ use Piwik\Updater;
14
+ use Piwik\Updates as PiwikUpdates;
15
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
16
+
17
+ /**
18
+ * Update for version 4.0.0-b3.
19
+ */
20
+ class Updates_4_0_0_rc3 extends PiwikUpdates
21
+ {
22
+ /**
23
+ * @var MigrationFactory
24
+ */
25
+ private $migration;
26
+
27
+ public function __construct(MigrationFactory $factory)
28
+ {
29
+ $this->migration = $factory;
30
+ }
31
+
32
+ public function getMigrations(Updater $updater)
33
+ {
34
+ $migrations = [];
35
+ $migrations[] = $this->migration->db->addColumn('archive_invalidations', 'ts_started', 'DATETIME NULL');
36
+ return $migrations;
37
+ }
38
+
39
+ public function doUpdate(Updater $updater)
40
+ {
41
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
42
+ }
43
+
44
+ }
app/core/Updates/4.0.0-rc4.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Config;
13
+ use Piwik\Container\StaticContainer;
14
+ use Piwik\DataAccess\ArchiveTableCreator;
15
+ use Piwik\Date;
16
+ use Piwik\DbHelper;
17
+ use Piwik\Plugin\ReleaseChannels;
18
+ use Piwik\Updater;
19
+ use Piwik\Updates as PiwikUpdates;
20
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
21
+
22
+ /**
23
+ * Update for version 4.0.0-rc4.
24
+ */
25
+ class Updates_4_0_0_rc4 extends PiwikUpdates
26
+ {
27
+ /**
28
+ * @var MigrationFactory
29
+ */
30
+ private $migration;
31
+
32
+ public function __construct(MigrationFactory $factory)
33
+ {
34
+ $this->migration = $factory;
35
+ }
36
+
37
+ public function getMigrations(Updater $updater)
38
+ {
39
+ $migrations = [];
40
+
41
+ $migrations[] = $this->migration->plugin->deactivate('ExampleTheme');
42
+
43
+ $channel = StaticContainer::get(ReleaseChannels::class)->getActiveReleaseChannel()->getId();
44
+ $isBeta = stripos($channel, 'beta') !== false;
45
+
46
+ if ($isBeta) {
47
+ $dates = ['2020-01-01', '2020-11-01', '2020-10-01'];
48
+ foreach ($dates as $date) {
49
+ $date = Date::factory($date);
50
+ $numericTable = ArchiveTableCreator::getBlobTable($date);
51
+ $blobTable = ArchiveTableCreator::getNumericTable($date);
52
+
53
+ if (DbHelper::tableExists($blobTable) && DbHelper::tableExists($numericTable)) {
54
+ $migrations[] = $this->migration->db->sql(
55
+ "DELETE FROM `$blobTable` WHERE idarchive NOT IN (SELECT idarchive FROM `$numericTable`)", []);
56
+ }
57
+ }
58
+ }
59
+
60
+ return $migrations;
61
+ }
62
+
63
+ public function doUpdate(Updater $updater)
64
+ {
65
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
66
+ }
67
+
68
+ }
app/core/Updates/4.0.1-b1.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Common;
13
+ use Piwik\Config;
14
+ use Piwik\Container\StaticContainer;
15
+ use Piwik\DataAccess\ArchiveTableCreator;
16
+ use Piwik\Date;
17
+ use Piwik\DbHelper;
18
+ use Piwik\Plugin\ReleaseChannels;
19
+ use Piwik\SettingsPiwik;
20
+ use Piwik\Updater;
21
+ use Piwik\Updates as PiwikUpdates;
22
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
23
+
24
+ class Updates_4_0_1_b1 extends PiwikUpdates
25
+ {
26
+ /**
27
+ * @var MigrationFactory
28
+ */
29
+ private $migration;
30
+
31
+ public function __construct(MigrationFactory $factory)
32
+ {
33
+ $this->migration = $factory;
34
+ }
35
+
36
+ public function getMigrations(Updater $updater)
37
+ {
38
+ $migrations = [];
39
+
40
+ $table = Common::prefixTable('user_token_auth');
41
+ $migrations[] = $this->migration->db->sql('UPDATE ' . $table . ' SET hash_algo = "sha512" where hash_algo is null or hash_algo = "" ');
42
+
43
+ if (SettingsPiwik::isGitDeployment()) {
44
+ return $migrations;
45
+ }
46
+
47
+ $migrations[] = $this->migration->plugin->uninstall('ExampleTheme');
48
+ return $migrations;
49
+ }
50
+
51
+ public function doUpdate(Updater $updater)
52
+ {
53
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
54
+ }
55
+
56
+ }
app/core/Updates/4.0.4-b1.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\SettingsPiwik;
13
+ use Piwik\Updater;
14
+ use Piwik\Updates as PiwikUpdates;
15
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
16
+
17
+ class Updates_4_0_4_b1 extends PiwikUpdates
18
+ {
19
+ /**
20
+ * @var MigrationFactory
21
+ */
22
+ private $migration;
23
+
24
+ public function __construct(MigrationFactory $factory)
25
+ {
26
+ $this->migration = $factory;
27
+ }
28
+
29
+ public function getMigrations(Updater $updater)
30
+ {
31
+ $migrations = [];
32
+
33
+ if (SettingsPiwik::isGitDeployment()) {
34
+ return $migrations;
35
+ }
36
+
37
+ $migrations[] = $this->migration->plugin->deactivate('ExamplePlugin');
38
+ $migrations[] = $this->migration->plugin->deactivate('ExampleLogTables');
39
+ $migrations[] = $this->migration->plugin->deactivate('ExampleUI');
40
+ $migrations[] = $this->migration->plugin->deactivate('ExampleReport');
41
+ $migrations[] = $this->migration->plugin->deactivate('ExampleAPI');
42
+ $migrations[] = $this->migration->plugin->deactivate('ExampleCommand');
43
+ $migrations[] = $this->migration->plugin->deactivate('ExampleSettingsPlugin');
44
+ $migrations[] = $this->migration->plugin->deactivate('ExampleTracker');
45
+ $migrations[] = $this->migration->plugin->deactivate('ExampleVisualization');
46
+
47
+ $migrations[] = $this->migration->plugin->uninstall('ExamplePlugin');
48
+ $migrations[] = $this->migration->plugin->uninstall('ExampleLogTables');
49
+ $migrations[] = $this->migration->plugin->uninstall('ExampleUI');
50
+ $migrations[] = $this->migration->plugin->uninstall('ExampleReport');
51
+ $migrations[] = $this->migration->plugin->uninstall('ExampleAPI');
52
+ $migrations[] = $this->migration->plugin->uninstall('ExampleCommand');
53
+ $migrations[] = $this->migration->plugin->uninstall('ExampleSettingsPlugin');
54
+ $migrations[] = $this->migration->plugin->uninstall('ExampleTracker');
55
+ $migrations[] = $this->migration->plugin->uninstall('ExampleVisualization');
56
+ return $migrations;
57
+ }
58
+
59
+ public function doUpdate(Updater $updater)
60
+ {
61
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
62
+ }
63
+
64
+ }
app/core/Updates/4.4.0-b1.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\Updater;
13
+ use Piwik\Updates as PiwikUpdates;
14
+ use Piwik\Updater\Migration\Factory as MigrationFactory;
15
+
16
+ /**
17
+ * Update for version 4.4.0-b1.
18
+ */
19
+ class Updates_4_4_0_b1 extends PiwikUpdates
20
+ {
21
+ /**
22
+ * @var MigrationFactory
23
+ */
24
+ private $migration;
25
+
26
+ public function __construct(MigrationFactory $factory)
27
+ {
28
+ $this->migration = $factory;
29
+ }
30
+
31
+ public function getMigrations(Updater $updater)
32
+ {
33
+ $migrations = [];
34
+ $migrations[] = $this->migration->config->set('General', 'login_allow_logme', '1');
35
+ return $migrations;
36
+ }
37
+
38
+ public function doUpdate(Updater $updater)
39
+ {
40
+ $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
41
+ }
42
+ }
app/core/Url.php CHANGED
@@ -240,10 +240,10 @@ class Url
240
  }
241
  $trustedHosts = str_replace("/", "\\/", $trustedHosts);
242
 
243
- $untrustedHost = Common::mb_strtolower($host);
244
  $untrustedHost = rtrim($untrustedHost, '.');
245
 
246
- $hostRegex = Common::mb_strtolower('/(^|.)' . implode('$|', $trustedHosts) . '$/');
247
 
248
  $result = preg_match($hostRegex, $untrustedHost);
249
  return 0 !== $result;
@@ -666,7 +666,7 @@ class Url
666
  return;
667
  }
668
 
669
- return Common::mb_strtolower($parsedUrl['host']);
670
  }
671
 
672
  /**
@@ -684,11 +684,11 @@ class Url
684
  return false;
685
  }
686
 
687
- $host = Common::mb_strtolower($host);
688
 
689
  if (!empty($urls)) {
690
  foreach ($urls as $url) {
691
- if (Common::mb_strtolower($url) === $host) {
692
  return true;
693
  }
694
 
@@ -723,7 +723,7 @@ class Url
723
  */
724
  public static function getLocalHostnames()
725
  {
726
- return array('localhost', '127.0.0.1', '::1', '[::1]');
727
  }
728
 
729
  /**
240
  }
241
  $trustedHosts = str_replace("/", "\\/", $trustedHosts);
242
 
243
+ $untrustedHost = mb_strtolower($host);
244
  $untrustedHost = rtrim($untrustedHost, '.');
245
 
246
+ $hostRegex = mb_strtolower('/(^|.)' . implode('$|', $trustedHosts) . '$/');
247
 
248
  $result = preg_match($hostRegex, $untrustedHost);
249
  return 0 !== $result;
666
  return;
667
  }
668
 
669
+ return mb_strtolower($parsedUrl['host']);
670
  }
671
 
672
  /**
684
  return false;
685
  }
686
 
687
+ $host = mb_strtolower($host);
688
 
689
  if (!empty($urls)) {
690
  foreach ($urls as $url) {
691
+ if (mb_strtolower($url) === $host) {
692
  return true;
693
  }
694
 
723
  */
724
  public static function getLocalHostnames()
725
  {
726
+ return array('localhost', '127.0.0.1', '::1', '[::1]', '[::]', '0000::1', '0177.0.0.1', '2130706433', '[0:0:0:0:0:ffff:127.0.0.1]');
727
  }
728
 
729
  /**
app/core/Validators/CharacterLength.php CHANGED
@@ -44,7 +44,7 @@ class CharacterLength extends BaseValidator
44
  return;
45
  }
46
 
47
- $lenValue = Common::mb_strlen($value);
48
 
49
  if (isset($this->min) && $this->min > $lenValue) {
50
  throw new Exception(Piwik::translate('General_ValidatorErrorCharacterTooShort', array($lenValue, $this->min)));
44
  return;
45
  }
46
 
47
+ $lenValue = mb_strlen($value);
48
 
49
  if (isset($this->min) && $this->min > $lenValue) {
50
  throw new Exception(Piwik::translate('General_ValidatorErrorCharacterTooShort', array($lenValue, $this->min)));
app/core/Version.php CHANGED
@@ -20,7 +20,7 @@ final class Version
20
  * The current Matomo version.
21
  * @var string
22
  */
23
- const VERSION = '4.3.1-rc1';
24
  const MAJOR_VERSION = 4;
25
 
26
  public function isStableVersion($version)
20
  * The current Matomo version.
21
  * @var string
22
  */
23
+ const VERSION = '4.4.1';
24
  const MAJOR_VERSION = 4;
25
 
26
  public function isStableVersion($version)
app/js/piwik.min.js CHANGED
@@ -28,42 +28,42 @@ ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.fin
28
  }}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(S.innerWidth&&ap>S.innerWidth){ap=S.innerWidth}var ao=ar.clientHeight;if(S.innerHeight&&ao>S.innerHeight){ao=S.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=i(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+s(ao)}if(ap){if(at){at+="&"}at+="c_n="+s(ap)}if(aq){if(at){at+="&"}at+="c_p="+s(aq)}if(ar){if(at){at+="&"}at+="c_t="+s(ar)}if(at){at+="&ca=1"}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+s(ao)+"&c_p="+s(ap);if(aq){ar+="&c_t="+s(aq)
29
  }if(ar){ar+="&ca=1"}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||S.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap
30
  }if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(ao){if(ae.hasNodeAttribute(ao,this.CONTENT_IGNOREINTERACTION_ATTR)){return true}if(ae.hasNodeCssClass(ao,this.CONTENT_IGNOREINTERACTION_CLASS)){return true}if(ae.hasNodeCssClass(ao,this.LEGACY_CONTENT_IGNOREINTERACTION_CLASS)){return true}return false}};function W(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(Q(ap,"matomo.php")){ap=f(ap,"matomo.php".length)
31
- }else{if(Q(ap,"piwik.php")){ap=f(ap,"piwik.php".length)}else{if(Q(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(Q(ap,"/js/")){ap=f(ap,"js/".length)}return ap}function N(av){var ax="Matomo_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}S.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=S.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,av,aq){var au=S.name.split("###"),at=au[1],ao=au[2],ar=au[3],aw=W(ap,av);n(aw+"plugins/Overlay/client/client.js?v=1",function(){Matomo_Overlay_Client.initialize(aw,aq,at,ao,ar)})}function u(){var aq;try{aq=S.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return S.self!==S.top
32
- }catch(ao){return true}}function P(ce,ca){var bK=this,be="mtm_consent",cE="mtm_cookie_consent",cN="mtm_consent_removed",b5=aa(G.domain,S.location.href,K()),cV=L(b5[0]),bO=o(b5[1]),bp=o(b5[2]),cT=false,ci="GET",da=ci,aI="application/x-www-form-urlencoded; charset=UTF-8",cx=aI,aE=ce||"",bJ="",c0="",b7=ca||"",bA="",bP="",a5,bk="",c7=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","rtf","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ay=[cV],bB=[],bM=[],a9=[],bL=500,cX=true,cK,a6,bS,bQ,ao,cp=["pk_campaign","mtm_campaign","piwik_campaign","matomo_campaign","utm_campaign","utm_source","utm_medium"],bI=["pk_kwd","mtm_kwd","piwik_kwd","matomo_kwd","utm_term"],bl="_pk_",av="pk_vid",a0=180,cY,br,bT=false,aJ="Lax",bn=false,cR,bf,bx,cL=33955200000,cn=1800000,c6=15768000000,a3=true,bG=false,bi=false,bR=false,aR=false,cc,bX={},cm={},bo={},bv=200,ct={},c1={},c8={},cb=[],cf=false,cC=false,ap=false,c9=false,cO=false,aO=false,bd=u(),cy=null,cZ=null,aS,bC,b8=am,bq,aM,cq=0,bw=["id","ses","cvar","ref"],cB=false,bD=null,cM=[],cs=[],ax=T++,aw=false;
33
- try{bk=G.title}catch(cz){bk=""}function de(dr,dp,dn,dq,dm,dl,dk){if(bn&&dr!==cN){return}var dj;if(dn){dj=new Date();dj.setTime(dj.getTime()+dn)}if(!dk){dk="Lax"}G.cookie=dr+"="+s(dp)+(dn?";expires="+dj.toGMTString():"")+";path="+(dq||"/")+(dm?";domain="+dm:"")+(dl?";secure":"")+";SameSite="+dk}function aD(dl){if(bn){return 0}var dj=new RegExp("(^|;)[ ]*"+dl+"=([^;]*)"),dk=dj.exec(G.cookie);return dk?R(dk[2]):0}bD=!aD(cN);function b3(dj){var dk;dj=j(dj,av);if(bQ){dk=new RegExp("#.*");return dj.replace(dk,"")}return dj}function bW(dl,dj){var dm=r(dj),dk;if(dm){return dj}if(dj.slice(0,1)==="/"){return r(dl)+"://"+d(dl)+dj}dl=b3(dl);dk=dl.indexOf("?");if(dk>=0){dl=dl.slice(0,dk)}dk=dl.lastIndexOf("/");if(dk!==dl.length-1){dl=dl.slice(0,dk+1)}return dl+dj}function cI(dl,dj){var dk;dl=String(dl).toLowerCase();dj=String(dj).toLowerCase();if(dl===dj){return true}if(dj.slice(0,1)==="."){if(dl===dj.slice(1)){return true}dk=dl.length-dj.length;if((dk>0)&&(dl.slice(dk)===dj)){return true}}return false
34
- }function cl(dj){var dk=document.createElement("a");if(dj.indexOf("//")!==0&&dj.indexOf("http")!==0){if(dj.indexOf("*")===0){dj=dj.substr(1)}if(dj.indexOf(".")===0){dj=dj.substr(1)}dj="http://"+dj}dk.href=v.toAbsoluteUrl(dj);if(dk.pathname){return dk.pathname}return""}function a4(dk,dj){if(!aj(dj,"/")){dj="/"+dj}if(!aj(dk,"/")){dk="/"+dk}var dl=(dj==="/"||dj==="/*");if(dl){return true}if(dk===dj){return true}dj=String(dj).toLowerCase();dk=String(dk).toLowerCase();if(Q(dj,"*")){dj=dj.slice(0,-1);dl=(!dj||dj==="/");if(dl){return true}if(dk===dj){return true}return dk.indexOf(dj)===0}if(!Q(dk,"/")){dk+="/"}if(!Q(dj,"/")){dj+="/"}return dk.indexOf(dj)===0}function ar(dn,dq){var dk,dj,dl,dm,dp;for(dk=0;dk<ay.length;dk++){dm=L(ay[dk]);dp=cl(ay[dk]);if(cI(dn,dm)&&a4(dq,dp)){return true}}return false}function aW(dm){var dk,dj,dl;for(dk=0;dk<ay.length;dk++){dj=L(ay[dk].toLowerCase());if(dm===dj){return true}if(dj.slice(0,1)==="."){if(dm===dj.slice(1)){return true}dl=dm.length-dj.length;if((dl>0)&&(dm.slice(dl)===dj)){return true
35
- }}}return false}function co(dj,dl){dj=dj.replace("send_image=0","send_image=1");var dk=new Image(1,1);dk.onload=function(){E=0;if(typeof dl==="function"){dl({request:dj,trackerUrl:aE,success:true})}};dk.onerror=function(){if(typeof dl==="function"){dl({request:dj,trackerUrl:aE,success:false})}};dk.src=aE+(aE.indexOf("?")<0?"?":"&")+dj}function cF(dj){if(da==="POST"){return true}return dj&&(dj.length>2000||dj.indexOf('{"requests"')===0)}function aL(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function a7(dn,dr,dq){var dl=aL();if(!dl){return false}var dm={type:"application/x-www-form-urlencoded; charset=UTF-8"};var ds=false;var dk=aE;try{var dj=new Blob([dn],dm);if(dq&&!cF(dn)){dj=new Blob([],dm);dk=dk+(dk.indexOf("?")<0?"?":"&")+dn}ds=g.sendBeacon(dk,dj)}catch(dp){return false}if(ds&&typeof dr==="function"){dr({request:dn,trackerUrl:aE,success:true,isSendBeacon:true})}return ds}function c5(dk,dl,dj){if(!J(dj)||null===dj){dj=true}if(l&&a7(dk,dl,dj)){return
36
- }setTimeout(function(){if(l&&a7(dk,dl,dj)){return}var dp;try{var dn=S.XMLHttpRequest?new S.XMLHttpRequest():S.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dn.open("POST",aE,true);dn.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dq=l&&a7(dk,dl,dj);if(!dq&&dj){co(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aE,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dl==="function")){dl({request:dk,trackerUrl:aE,success:true,xhr:this})}}};dn.setRequestHeader("Content-Type",cx);dn.withCredentials=true;dn.send(dk)}catch(dm){dp=l&&a7(dk,dl,dj);if(!dp&&dj){co(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aE,success:false})}}}},50)}function cg(dk){var dj=new Date();var dl=dj.getTime()+dk;if(!q||dl>q){q=dl}}function bb(){bd=true;cy=new Date().getTime()}function dd(){var dj=new Date().getTime();return !cy||(dj-cy)>a6}function az(){if(dd()){bS()}}function dg(){if(aO||!a6){return}aO=true;an(S,"focus",bb);
37
- an(S,"blur",az);ab++;t.addPlugin("HeartBeat"+ab,{unload:function(){if(aO&&dd()){bS()}}})}function cD(dn){var dk=new Date();var dj=dk.getTime();cZ=dj;if(cC&&dj<cC){var dl=cC-dj;setTimeout(dn,dl);cg(dl+50);cC+=50;return}if(cC===false){var dm=800;cC=dj+dm}dn()}function aP(){if(aD(cN)){bD=false}else{if(aD(be)){bD=true}}}function bH(dk,dj,dl){aP();if(!bD){cM.push(dk);return}aw=true;if(!cR&&dk){if(cB&&bD){dk+="&consent=1"}cD(function(){if(cX&&a7(dk,dl,true)){cg(100);return}if(cF(dk)){c5(dk,dl)}else{co(dk,dl)}cg(dj)})}if(!aO){dg()}}function ck(dj){if(cR){return false}return(dj&&dj.length)}function c4(dj,dn){if(!dn||dn>=dj.length){return[dj]}var dk=0;var dl=dj.length;var dm=[];for(dk;dk<dl;dk+=dn){dm.push(dj.slice(dk,dk+dn))}return dm}function df(dk,dj){if(!ck(dk)){return}if(!bD){cM.push(dk);return}aw=true;cD(function(){var dn=c4(dk,50);var dl=0,dm;for(dl;dl<dn.length;dl++){dm='{"requests":["?'+dn[dl].join('","?')+'"],"send_image":0}';if(cX&&a7(dm,null,false)){cg(100)}else{c5(dm,null,false)}}cg(dj)
38
- })}function aU(dj){return bl+dj+"."+b7+"."+bq}function bZ(dl,dk,dj){de(dl,"",-86400,dk,dj)}function b6(){if(bn){return"0"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){return g.cookieEnabled?"1":"0"}var dj=bl+"testcookie";de(dj,"1",undefined,br,cY,bT,aJ);var dk=aD(dj)==="1"?"1":"0";bZ(dj);return dk}function bj(){bq=b8((cY||cV)+(br||"/")).slice(0,4)}function cJ(){if(J(c8.res)){return c8}var dk,dm,dn={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",fla:"application/x-shockwave-flash",java:"application/x-java-vm",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(g.userAgent))){if(g.mimeTypes&&g.mimeTypes.length){for(dk in dn){if(Object.prototype.hasOwnProperty.call(dn,dk)){dm=g.mimeTypes[dn[dk]];c8[dk]=(dm&&dm.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(g.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(g.javaEnabled)&&g.javaEnabled()){c8.java="1"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){c8.cookie=g.cookieEnabled?"1":"0"
39
- }else{c8.cookie=b6()}}var dl=parseInt(X.width,10);var dj=parseInt(X.height,10);c8.res=parseInt(dl,10)+"x"+parseInt(dj,10);return c8}function bY(){var dk=aU("cvar"),dj=aD(dk);if(dj&&dj.length){dj=S.JSON.parse(dj);if(V(dj)){return dj}}return{}}function cG(){if(aR===false){aR=bY()}}function cS(){var dj=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dj)+(new Date()).getTime()+Math.random()).slice(0,16)}function aB(){var dj=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dj)).slice(0,6)}function bg(){return Math.floor((new Date()).getTime()/1000)}function aK(){var dk=bg();var dl=aB();var dj=String(dk)+dl;return dj}function c3(dl){dl=String(dl);var dp=aB();var dm=dp.length;var dn=dl.substr(-1*dm,dm);var dk=parseInt(dl.substr(0,dl.length-dm),10);if(dk&&dn&&dn===dp){var dj=bg();if(a0<=0){return true}if(dj>=dk&&dj<=(dk+a0)){return true}}return false}function dh(dj){if(!cO){return""}var dn=e(dj,av);if(!dn){return""}dn=String(dn);var dl=new RegExp("^[a-zA-Z0-9]+$");
40
- if(dn.length===32&&dl.test(dn)){var dk=dn.substr(16,32);if(c3(dk)){var dm=dn.substr(0,16);return dm}}return""}function cP(){if(!bP){bP=dh(bO)}var dl=new Date(),dj=Math.round(dl.getTime()/1000),dk=aU("id"),dp=aD(dk),dn,dm;if(dp){dn=dp.split(".");dn.unshift("0");if(bP.length){dn[1]=bP}return dn}if(bP.length){dm=bP}else{if("0"===b6()){dm=""}else{dm=cS()}}dn=["1",dm,dj];return dn}function aZ(){var dm=cP(),dk=dm[0],dl=dm[1],dj=dm[2];return{newVisitor:dk,uuid:dl,createTs:dj}}function aH(){var dm=new Date(),dk=dm.getTime(),dn=aZ().createTs;var dj=parseInt(dn,10);var dl=(dj*1000)+cL-dk;return dl}function aN(dj){if(!b7){return}var dl=new Date(),dk=Math.round(dl.getTime()/1000);if(!J(dj)){dj=aZ()}var dm=dj.uuid+"."+dj.createTs+".";de(aU("id"),dm,aH(),br,cY,bT,aJ)}function bN(){var dj=aD(aU("ref"));if(dj.length){try{dj=S.JSON.parse(dj);if(V(dj)){return dj}}catch(dk){}}return["","",0,""]}function by(dl){var dk=bl+"testcookie_domain";var dj="testvalue";de(dk,dj,10000,null,dl,bT,aJ);if(aD(dk)===dj){bZ(dk,null,dl);
41
- return true}return false}function aF(){var dk=bn;bn=false;var dj,dl;for(dj=0;dj<bw.length;dj++){dl=aU(bw[dj]);if(dl!==cN&&dl!==be&&0!==aD(dl)){bZ(dl,br,cY)}}bn=dk}function b4(dj){b7=dj}function di(dn){if(!dn||!V(dn)){return}var dm=[];var dl;for(dl in dn){if(Object.prototype.hasOwnProperty.call(dn,dl)){dm.push(dl)}}var dp={};dm.sort();var dj=dm.length;var dk;for(dk=0;dk<dj;dk++){dp[dm[dk]]=dn[dm[dk]]}return dp}function cd(){de(aU("ses"),"1",cn,br,cY,bT,aJ)}function bh(){var dm="";var dk="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dl=dk.length;var dj;for(dj=0;dj<6;dj++){dm+=dk.charAt(Math.floor(Math.random()*dl))}return dm}function aA(dk){if(!h){return dk}var dl=(typeof h.timing==="object")&&h.timing?h.timing:undefined;if(!dl){dl=(typeof h.getEntriesByType==="function")&&h.getEntriesByType("navigation")?h.getEntriesByType("navigation")[0]:undefined}if(!dl){return dk}var dj="";if(dl.connectEnd&&dl.fetchStart){if(dl.connectEnd<dl.fetchStart){return}dj+="&pf_net="+Math.round(dl.connectEnd-dl.fetchStart)
42
- }if(dl.responseStart&&dl.requestStart){if(dl.responseStart<dl.requestStart){return}dj+="&pf_srv="+Math.round(dl.responseStart-dl.requestStart)}if(dl.responseStart&&dl.responseEnd){if(dl.responseEnd<dl.responseStart){return}dj+="&pf_tfr="+Math.round(dl.responseEnd-dl.responseStart)}if(J(dl.domLoading)){if(dl.domInteractive&&dl.domLoading){if(dl.domInteractive<dl.domLoading){return}dj+="&pf_dm1="+Math.round(dl.domInteractive-dl.domLoading)}}else{if(dl.domInteractive&&dl.responseEnd){if(dl.domInteractive<dl.responseEnd){return}dj+="&pf_dm1="+Math.round(dl.domInteractive-dl.responseEnd)}}if(dl.domComplete&&dl.domInteractive){if(dl.domComplete<dl.domInteractive){return}dj+="&pf_dm2="+Math.round(dl.domComplete-dl.domInteractive)}if(dl.loadEventEnd&&dl.loadEventStart){if(dl.loadEventEnd<dl.loadEventStart){return}dj+="&pf_onl="+Math.round(dl.loadEventEnd-dl.loadEventStart)}return dk+dj}function cr(dl,dG,dH){var dF,dk=new Date(),dt=Math.round(dk.getTime()/1000),dq,dD,dm=1024,dM,du,dC=aR,dn=aU("ses"),dA=aU("ref"),dx=aU("cvar"),dy=aD(dn),dE=bN(),dI=a5||bO,dr,dj;
43
- if(bn){aF()}if(cR){return""}var dz=aZ();var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dE[0];dj=dE[1];dq=dE[2];dD=dE[3];if(!dy){if(!bx||!dr.length){for(dF in cp){if(Object.prototype.hasOwnProperty.call(cp,dF)){dr=e(dI,cp[dF]);if(dr.length){break}}}for(dF in bI){if(Object.prototype.hasOwnProperty.call(bI,dF)){dj=e(dI,bI[dF]);if(dj.length){break}}}}dM=d(bp);du=dD.length?d(dD):"";if(dM.length&&!aW(dM)&&(!bx||!du.length||aW(du))){dD=bp}if(dD.length||dr.length){dq=dt;dE=[dr,dj,dq,b3(dD.slice(0,dm))];de(dA,S.JSON.stringify(dE),c6,br,cY,bT,aJ)}}dl+="&idsite="+b7+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dk.getHours()+"&m="+dk.getMinutes()+"&s="+dk.getSeconds()+"&url="+s(b3(dI))+(bp.length?"&urlref="+s(b3(bp)):"")+(Y(bA)?"&uid="+s(bA):"")+"&_id="+dz.uuid+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+s(dr):"")+(dj.length?"&_rck="+s(dj):"")+"&_refts="+dq+(String(dD).length?"&_ref="+s(b3(dD.slice(0,dm))):"")+(dw?"&cs="+s(dw):"")+"&send_image=0";var dL=cJ();for(dF in dL){if(Object.prototype.hasOwnProperty.call(dL,dF)){dl+="&"+dF+"="+dL[dF]
44
- }}var dK=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dK.push(parseInt(dp,10));dK.push(String(dp));dl+="&"+dF+"="+s(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in ct){if(Object.prototype.hasOwnProperty.call(ct,dF)){dl+="&"+dF+"="+s(ct[dF])}}for(dF in bo){if(Object.prototype.hasOwnProperty.call(bo,dF)){var dv=(-1===M(dK,dF));if(dv){dl+="&dimension"+dF+"="+s(bo[dF])}}}if(dG){dl+="&data="+s(S.JSON.stringify(dG))}else{if(ao){dl+="&data="+s(S.JSON.stringify(ao))}}function ds(dN,dO){var dP=S.JSON.stringify(dN);if(dP.length>2){return"&"+dO+"="+s(dP)}return""}var dJ=di(bX);var dB=di(cm);dl+=ds(dJ,"cvar");dl+=ds(dB,"e_cvar");if(aR){dl+=ds(aR,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aR[dF][0]===""||aR[dF][1]===""){delete aR[dF]}}}if(bR){de(dx,S.JSON.stringify(aR),cn,br,cY,bT,aJ)}}if(a3&&bG&&!bi){dl=aA(dl);bi=true}if(aM){dl+="&pv_id="+aM}aN(dz);cd();dl+=ac(dH,{tracker:bK,request:dl});
45
- if(c0.length){dl+="&"+c0}if(A(cc)){dl=cc(dl)}return dl}bS=function a8(){var dj=new Date();dj=dj.getTime();if(!cZ){return false}if(cZ+a6<=dj){bK.ping();return true}return false};function bs(dm,dl,dr,dn,dj,du){var dq="idgoal=0",dk=new Date(),ds=[],dt,dp=String(dm).length;if(dp){dq+="&ec_id="+s(dm)}dq+="&revenue="+dl;if(String(dr).length){dq+="&ec_st="+dr}if(String(dn).length){dq+="&ec_tx="+dn}if(String(dj).length){dq+="&ec_sh="+dj}if(String(du).length){dq+="&ec_dt="+du}if(c1){for(dt in c1){if(Object.prototype.hasOwnProperty.call(c1,dt)){if(!J(c1[dt][1])){c1[dt][1]=""}if(!J(c1[dt][2])){c1[dt][2]=""}if(!J(c1[dt][3])||String(c1[dt][3]).length===0){c1[dt][3]=0}if(!J(c1[dt][4])||String(c1[dt][4]).length===0){c1[dt][4]=1}ds.push(c1[dt])}}dq+="&ec_items="+s(S.JSON.stringify(ds))}dq=cr(dq,ao,"ecommerce");bH(dq,bL);if(dp){c1={}}}function b0(dj,dn,dm,dl,dk,dp){if(String(dj).length&&J(dn)){bs(dj,dn,dm,dl,dk,dp)}}function bu(dj){if(J(dj)){bs("",dj,"","","","")}}function b1(dk,dm,dl){aM=bh();var dj=cr("action_name="+s(al(dk||bk)),dm,"log");
46
- if(a3&&!bi){dj=aA(dj)}bH(dj,bL,dl)}function a1(dl,dk){var dm,dj="(^| )(piwik[_-]"+dk+"|matomo[_-]"+dk;if(dl){for(dm=0;dm<dl.length;dm++){dj+="|"+dl[dm]}}dj+=")( |$)";return new RegExp(dj)}function aV(dj){return(aE&&dj&&0===String(dj).indexOf(aE))}function cv(dn,dj,dp,dk){if(aV(dj)){return 0}var dm=a1(bM,"download"),dl=a1(a9,"link"),dq=new RegExp("\\.("+c7.join("|")+")([?&#]|$)","i");if(dl.test(dn)){return"link"}if(dk||dm.test(dn)||dq.test(dj)){return"download"}if(dp){return 0}return"link"}function au(dk){var dj;dj=dk.parentNode;while(dj!==null&&J(dj)){if(ae.isLinkElement(dk)){break}dk=dj;dj=dk.parentNode}return dk}function dc(dp){dp=au(dp);if(!ae.hasNodeAttribute(dp,"href")){return}if(!J(dp.href)){return}var dn=ae.getAttributeValueFromNode(dp,"href");var dk=dp.pathname||cl(dp.href);var dq=dp.hostname||d(dp.href);var dr=dq.toLowerCase();var dl=dp.href.replace(dq,dr);var dm=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dm.test(dl)){var dj=cv(dp.className,dl,ar(dr,dk),ae.hasNodeAttribute(dp,"download"));
47
- if(dj){return{type:dj,href:dl}}}}function aQ(dj,dk,dl,dm){var dn=v.buildInteractionRequestParams(dj,dk,dl,dm);if(!dn){return}return cr(dn,null,"contentInteraction")}function bc(dj,dk){if(!dj||!dk){return false}var dl=v.findTargetNode(dj);if(v.shouldIgnoreInteraction(dl)){return false}dl=v.findTargetNodeNoDefault(dj);if(dl&&!U(dl,dk)){return false}return true}function cu(dl,dk,dn){if(!dl){return}var dj=v.findParentContentNode(dl);if(!dj){return}if(!bc(dj,dl)){return}var dm=v.buildContentBlock(dj);if(!dm){return}if(!dm.target&&dn){dm.target=dn}return v.buildInteractionRequestParams(dk,dm.name,dm.piece,dm.target)}function aX(dk){if(!cb||!cb.length){return false}var dj,dl;for(dj=0;dj<cb.length;dj++){dl=cb[dj];if(dl&&dl.name===dk.name&&dl.piece===dk.piece&&dl.target===dk.target){return true}}return false}function aY(dj){return function(dn){if(!dj){return}var dl=v.findParentContentNode(dj);var dk;if(dn){dk=dn.target||dn.srcElement}if(!dk){dk=dj}if(!bc(dl,dk)){return}if(!dl){return false}var dp=v.findTargetNode(dl);
48
- if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dm=dc(dp);if(c9&&dm&&dm.type){return dm.type}return bK.trackContentInteractionNode(dk,"click")}}function b2(dl){if(!dl||!dl.length){return}var dj,dk;for(dj=0;dj<dl.length;dj++){dk=v.findTargetNode(dl[dj]);if(dk&&!dk.contentInteractionTrackingSetupDone){dk.contentInteractionTrackingSetupDone=true;an(dk,"click",aY(dk))}}}function bz(dl,dm){if(!dl||!dl.length){return[]}var dj,dk;for(dj=0;dj<dl.length;dj++){if(aX(dl[dj])){dl.splice(dj,1);dj--}else{cb.push(dl[dj])}}if(!dl||!dl.length){return[]}b2(dm);var dn=[];for(dj=0;dj<dl.length;dj++){dk=cr(v.buildImpressionRequestParams(dl[dj].name,dl[dj].piece,dl[dj].target),undefined,"contentImpressions");if(dk){dn.push(dk)}}return dn}function cA(dk){var dj=v.collectContent(dk);return bz(dj,dk)}function ba(dk){if(!dk||!dk.length){return[]}var dj;for(dj=0;dj<dk.length;dj++){if(!v.isNodeVisible(dk[dj])){dk.splice(dj,1);dj--}}if(!dk||!dk.length){return[]}return cA(dk)}function aG(dl,dj,dk){var dm=v.buildImpressionRequestParams(dl,dj,dk);
49
- return cr(dm,null,"contentImpression")}function db(dm,dk){if(!dm){return}var dj=v.findParentContentNode(dm);var dl=v.buildContentBlock(dj);if(!dl){return}if(!dk){dk="Unknown"}return aQ(dk,dl.name,dl.piece,dl.target)}function cQ(dk,dm,dj,dl){return"e_c="+s(dk)+"&e_a="+s(dm)+(J(dj)?"&e_n="+s(dj):"")+(J(dl)?"&e_v="+s(dl):"")+"&ca=1"}function at(dl,dn,dj,dm,dq,dp){if(!Y(dl)||!Y(dn)){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dk=cr(cQ(dl,dn,dj,dm),dq,"event");bH(dk,bL,dp)}function b9(dj,dm,dk,dn){var dl=cr("search="+s(dj)+(dm?"&search_cat="+s(dm):"")+(J(dk)?"&search_count="+dk:""),dn,"sitesearch");bH(dl,bL)}function cU(dj,dn,dm,dl){var dk=cr("idgoal="+dj+(dn?"&revenue="+dn:""),dm,"goal");bH(dk,bL,dl)}function c2(dm,dj,dr,dq,dl){var dp=dj+"="+s(b3(dm));var dk=cu(dl,"click",dm);if(dk){dp+="&"+dk}var dn=cr(dp,dr,"link");bH(dn,bL,dq)}function bV(dk,dj){if(dk!==""){return dk+dj.charAt(0).toUpperCase()+dj.slice(1)
50
- }return dj}function ch(dp){var dn,dj,dm=["","webkit","ms","moz"],dl;if(!bf){for(dj=0;dj<dm.length;dj++){dl=dm[dj];if(Object.prototype.hasOwnProperty.call(G,bV(dl,"hidden"))){if(G[bV(dl,"visibilityState")]==="prerender"){dn=true}break}}}if(dn){an(G,dl+"visibilitychange",function dk(){G.removeEventListener(dl+"visibilitychange",dk,false);dp()});return}dp()}function bt(){var dk=bK.getVisitorId();var dj=aK();return dk+dj}function cj(dj){if(!dj){return}if(!ae.hasNodeAttribute(dj,"href")){return}var dk=ae.getAttributeValueFromNode(dj,"href");if(!dk||aV(dk)){return}if(!bK.getVisitorId()){return}dk=j(dk,av);var dl=bt();dk=F(dk,av,dl);ae.setAnyAttribute(dj,"href",dk)}function bm(dm){var dn=ae.getAttributeValueFromNode(dm,"href");if(!dn){return false}dn=String(dn);var dk=dn.indexOf("//")===0||dn.indexOf("http://")===0||dn.indexOf("https://")===0;if(!dk){return false}var dj=dm.pathname||cl(dm.href);var dl=(dm.hostname||d(dm.href)).toLowerCase();if(ar(dl,dj)){if(!cI(cV,L(dl))){return true}return false
51
- }return false}function cH(dj){var dk=dc(dj);if(dk&&dk.type){dk.href=o(dk.href);c2(dk.href,dk.type,undefined,null,dj);return}if(cO){dj=au(dj);if(bm(dj)){cj(dj)}}}function cw(){return G.all&&!G.addEventListener}function cW(dj){var dl=dj.which;var dk=(typeof dj.button);if(!dl&&dk!=="undefined"){if(cw()){if(dj.button&1){dl=1}else{if(dj.button&2){dl=3}else{if(dj.button&4){dl=2}}}}else{if(dj.button===0||dj.button==="0"){dl=1}else{if(dj.button&1){dl=2}else{if(dj.button&2){dl=3}}}}}return dl}function bU(dj){switch(cW(dj)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a2(dj){return dj.target||dj.srcElement}function aC(dj){return function(dm){dm=dm||S.event;var dl=bU(dm);var dn=a2(dm);if(dm.type==="click"){var dk=false;if(dj&&dl==="middle"){dk=true}if(dn&&!dk){cH(dn)}}else{if(dm.type==="mousedown"){if(dl==="middle"&&dn){aS=dl;bC=dn}else{aS=bC=null}}else{if(dm.type==="mouseup"){if(dl===aS&&dn===bC){cH(dn)}aS=bC=null}else{if(dm.type==="contextmenu"){cH(dn)}}}}}}function aq(dl,dk){var dj=typeof dk;
52
- if(dj==="undefined"){dk=true}an(dl,"click",aC(dk),false);if(dk){an(dl,"mouseup",aC(dk),false);an(dl,"mousedown",aC(dk),false);an(dl,"contextmenu",aC(dk),false)}}function bF(dl,dn){ap=true;var dm,dk=a1(bB,"ignore"),dp=G.links,dj=null,dq=null;if(dp){for(dm=0;dm<dp.length;dm++){dj=dp[dm];if(!dk.test(dj.className)){dq=typeof dj.matomoTrackers;if("undefined"===dq){dj.matomoTrackers=[]}if(-1===M(dj.matomoTrackers,dn)){dj.matomoTrackers.push(dn);aq(dj,dl)}}}}}function aT(dk,dn,dp){if(cf){return true}cf=true;var dq=false;var dm,dl;function dj(){dq=true}m(function(){function dr(dt){setTimeout(function(){if(!cf){return}dq=false;dp.trackVisibleContentImpressions();dr(dt)},dt)}function ds(dt){setTimeout(function(){if(!cf){return}if(dq){dq=false;dp.trackVisibleContentImpressions()}ds(dt)},dt)}if(dk){dm=["scroll","resize"];for(dl=0;dl<dm.length;dl++){if(G.addEventListener){G.addEventListener(dm[dl],dj,false)}else{S.attachEvent("on"+dm[dl],dj)}}ds(100)}if(dn&&dn>0){dn=parseInt(dn,10);dr(dn)}})}var bE={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dj=this.requests;
53
- this.requests=[];if(dj.length===1){bH(dj[0],bL)}else{df(dj,bL)}},canQueue:function(){return !l&&this.enabled},pushMultiple:function(dk){if(!this.canQueue()){df(dk,bL);return}var dj;for(dj=0;dj<dk.length;dj++){this.push(dk[dj])}},push:function(dj){if(!dj){return}if(!this.canQueue()){bH(dj,bL);return}bE.requests.push(dj);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bE.timeout=null;bE.sendRequests()},bE.interval);var dk="RequestQueue"+ax;if(!Object.prototype.hasOwnProperty.call(b,dk)){b[dk]={unload:function(){if(bE.timeout){clearTimeout(bE.timeout)}bE.sendRequests()}}}}};bj();aN();this.hasConsent=function(){return bD};this.getVisitorId=function(){return aZ().uuid};this.getVisitorInfo=function(){return cP()};this.getAttributionInfo=function(){return bN()};this.getAttributionCampaignName=function(){return bN()[0]};this.getAttributionCampaignKeyword=function(){return bN()[1]};this.getAttributionReferrerTimestamp=function(){return bN()[2]};this.getAttributionReferrerUrl=function(){return bN()[3]
54
- };this.setTrackerUrl=function(dj){aE=dj};this.getTrackerUrl=function(){return aE};this.getMatomoUrl=function(){return W(this.getTrackerUrl(),bJ)};this.getPiwikUrl=function(){return this.getMatomoUrl()};this.addTracker=function(dl,dk){if(!J(dl)||null===dl){dl=this.getTrackerUrl()}var dj=new P(dl,dk);I.push(dj);t.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b7};this.setSiteId=function(dj){b4(dj)};this.resetUserId=function(){bA=""};this.setUserId=function(dj){if(Y(dj)){bA=dj}};this.setVisitorId=function(dk){var dj=/[0-9A-Fa-f]{16}/g;if(w(dk)&&dj.test(dk)){bP=dk}else{ak("Invalid visitorId set"+dk)}};this.getUserId=function(){return bA};this.setCustomData=function(dj,dk){if(V(dj)){ao=dj}else{if(!ao){ao={}}ao[dj]=dk}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dj){cc=dj};this.appendToTrackingUrl=function(dj){c0=dj};this.getRequest=function(dj){return cr(dj)};this.addPlugin=function(dj,dk){b[dj]=dk};this.setCustomDimension=function(dj,dk){dj=parseInt(dj,10);
55
- if(dj>0){if(!J(dk)){dk=""}if(!w(dk)){dk=String(dk)}bo[dj]=dk}};this.getCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0&&Object.prototype.hasOwnProperty.call(bo,dj)){return bo[dj]}};this.deleteCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0){delete bo[dj]}};this.setCustomVariable=function(dk,dj,dn,dl){var dm;if(!J(dl)){dl="visit"}if(!J(dj)){return}if(!J(dn)){dn=""}if(dk>0){dj=!w(dj)?String(dj):dj;dn=!w(dn)?String(dn):dn;dm=[dj.slice(0,bv),dn.slice(0,bv)];if(dl==="visit"||dl===2){cG();aR[dk]=dm}else{if(dl==="page"||dl===3){bX[dk]=dm}else{if(dl==="event"){cm[dk]=dm}}}}};this.getCustomVariable=function(dk,dl){var dj;if(!J(dl)){dl="visit"}if(dl==="page"||dl===3){dj=bX[dk]}else{if(dl==="event"){dj=cm[dk]}else{if(dl==="visit"||dl===2){cG();dj=aR[dk]}}}if(!J(dj)||(dj&&dj[0]==="")){return false}return dj};this.deleteCustomVariable=function(dj,dk){if(this.getCustomVariable(dj,dk)){this.setCustomVariable(dj,"","",dk)}};this.deleteCustomVariables=function(dj){if(dj==="page"||dj===3){bX={}
56
- }else{if(dj==="event"){cm={}}else{if(dj==="visit"||dj===2){aR={}}}}};this.storeCustomVariablesInCookie=function(){bR=true};this.setLinkTrackingTimer=function(dj){bL=dj};this.getLinkTrackingTimer=function(){return bL};this.setDownloadExtensions=function(dj){if(w(dj)){dj=dj.split("|")}c7=dj};this.addDownloadExtensions=function(dk){var dj;if(w(dk)){dk=dk.split("|")}for(dj=0;dj<dk.length;dj++){c7.push(dk[dj])}};this.removeDownloadExtensions=function(dl){var dk,dj=[];if(w(dl)){dl=dl.split("|")}for(dk=0;dk<c7.length;dk++){if(M(dl,c7[dk])===-1){dj.push(c7[dk])}}c7=dj};this.setDomains=function(dj){ay=w(dj)?[dj]:dj;var dn=false,dl=0,dk;for(dl;dl<ay.length;dl++){dk=String(ay[dl]);if(cI(cV,L(dk))){dn=true;break}var dm=cl(dk);if(dm&&dm!=="/"&&dm!=="/*"){dn=true;break}}if(!dn){ay.push(cV)}};this.enableCrossDomainLinking=function(){cO=true};this.disableCrossDomainLinking=function(){cO=false};this.isCrossDomainLinkingEnabled=function(){return cO};this.setCrossDomainLinkingTimeout=function(dj){a0=dj};this.getCrossDomainLinkingUrlParameter=function(){return s(av)+"="+s(bt())
57
- };this.setIgnoreClasses=function(dj){bB=w(dj)?[dj]:dj};this.setRequestMethod=function(dj){if(dj){da=String(dj).toUpperCase()}else{da=ci}if(da==="GET"){this.disableAlwaysUseSendBeacon()}};this.setRequestContentType=function(dj){cx=dj||aI};this.setGenerationTimeMs=function(dj){ak("setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. There is currently no replacement yet.")};this.setReferrerUrl=function(dj){bp=dj};this.setCustomUrl=function(dj){a5=bW(bO,dj)};this.getCurrentUrl=function(){return a5||bO};this.setDocumentTitle=function(dj){bk=dj};this.setAPIUrl=function(dj){bJ=dj};this.setDownloadClasses=function(dj){bM=w(dj)?[dj]:dj};this.setLinkClasses=function(dj){a9=w(dj)?[dj]:dj};this.setCampaignNameKey=function(dj){cp=w(dj)?[dj]:dj};this.setCampaignKeywordKey=function(dj){bI=w(dj)?[dj]:dj};this.discardHashTag=function(dj){bQ=dj};this.setCookieNamePrefix=function(dj){bl=dj;if(aR){aR=bY()}};this.setCookieDomain=function(dj){var dk=L(dj);if(by(dk)){cY=dk;bj()
58
- }};this.getCookieDomain=function(){return cY};this.hasCookies=function(){return"1"===b6()};this.setSessionCookie=function(dl,dk,dj){if(!dl){throw new Error("Missing cookie name")}if(!J(dj)){dj=cn}bw.push(dl);de(aU(dl),dk,dj,br,cY,bT,aJ)};this.getCookie=function(dk){var dj=aD(aU(dk));if(dj===0){return null}return dj};this.setCookiePath=function(dj){br=dj;bj()};this.getCookiePath=function(dj){return br};this.setVisitorCookieTimeout=function(dj){cL=dj*1000};this.setSessionCookieTimeout=function(dj){cn=dj*1000};this.getSessionCookieTimeout=function(){return cn};this.setReferralCookieTimeout=function(dj){c6=dj*1000};this.setConversionAttributionFirstReferrer=function(dj){bx=dj};this.setSecureCookie=function(dj){if(dj&&location.protocol!=="https:"){ak("Error in setSecureCookie: You cannot use `Secure` on http.");return}bT=dj};this.setCookieSameSite=function(dj){dj=String(dj);dj=dj.charAt(0).toUpperCase()+dj.toLowerCase().slice(1);if(dj!=="None"&&dj!=="Lax"&&dj!=="Strict"){ak("Ignored value for sameSite. Please use either Lax, None, or Strict.");
59
- return}if(dj==="None"){if(location.protocol==="https:"){this.setSecureCookie(true)}else{ak("sameSite=None cannot be used on http, reverted to sameSite=Lax.");dj="Lax"}}aJ=dj};this.disableCookies=function(){bn=true;if(b7){aF()}};this.areCookiesEnabled=function(){return !bn};this.setCookieConsentGiven=function(){if(bn&&!cR){bn=false;if(b7&&aw){aN();var dj=cr("ping=1",null,"ping");bH(dj,bL)}}};this.requireCookieConsent=function(){if(this.getRememberedCookieConsent()){return false}this.disableCookies();return true};this.getRememberedCookieConsent=function(){return aD(cE)};this.forgetCookieConsentGiven=function(){bZ(cE,br,cY);this.disableCookies()};this.rememberCookieConsentGiven=function(dk){if(dk){dk=dk*60*60*1000}else{dk=30*365*24*60*60*1000}this.setCookieConsentGiven();var dj=new Date().getTime();de(cE,dj,dk,br,cY,bT,aJ)};this.deleteCookies=function(){aF()};this.setDoNotTrack=function(dk){var dj=g.doNotTrack||g.msDoNotTrack;cR=dk&&(dj==="yes"||dj==="1");if(cR){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cX=true
60
- };this.disableAlwaysUseSendBeacon=function(){cX=false};this.addListener=function(dk,dj){aq(dk,dj)};this.enableLinkTracking=function(dk){c9=true;var dj=this;ch(function(){p(function(){bF(dk,dj)});m(function(){bF(dk,dj)})})};this.enableJSErrorTracking=function(){if(cT){return}cT=true;var dj=S.onerror;S.onerror=function(dp,dm,dl,dn,dk){ch(function(){var dq="JavaScript Errors";var dr=dm+":"+dl;if(dn){dr+=":"+dn}if(M(cs,dq+dr+dp)===-1){cs.push(dq+dr+dp);at(dq,dr,dp)}});if(dj){return dj(dp,dm,dl,dn,dk)}return false}};this.disablePerformanceTracking=function(){a3=false};this.enableHeartBeatTimer=function(dj){dj=Math.max(dj||15,5);a6=dj*1000;if(cZ!==null){dg()}};this.disableHeartBeatTimer=function(){if(a6||aO){if(S.removeEventListener){S.removeEventListener("focus",bb);S.removeEventListener("blur",az)}else{if(S.detachEvent){S.detachEvent("onfocus",bb);S.detachEvent("onblur",az)}}}a6=null;aO=false};this.killFrame=function(){if(S.location!==S.top.location){S.top.location=S.location}};this.redirectFile=function(dj){if(S.location.protocol==="file:"){S.location=dj
61
- }};this.setCountPreRendered=function(dj){bf=dj};this.trackGoal=function(dj,dm,dl,dk){ch(function(){cU(dj,dm,dl,dk)})};this.trackLink=function(dk,dj,dm,dl){ch(function(){c2(dk,dj,dm,dl)})};this.getNumTrackedPageViews=function(){return cq};this.trackPageView=function(dj,dl,dk){cb=[];cM=[];cs=[];if(N(b7)){ch(function(){Z(aE,bJ,b7)})}else{ch(function(){cq++;b1(dj,dl,dk)})}};this.trackAllContentImpressions=function(){if(N(b7)){return}ch(function(){p(function(){var dj=v.findContentNodes();var dk=cA(dj);bE.pushMultiple(dk)})})};this.trackVisibleContentImpressions=function(dj,dk){if(N(b7)){return}if(!J(dj)){dj=true}if(!J(dk)){dk=750}aT(dj,dk,this);ch(function(){m(function(){var dl=v.findContentNodes();var dm=ba(dl);bE.pushMultiple(dm)})})};this.trackContentImpression=function(dl,dj,dk){if(N(b7)){return}dl=a(dl);dj=a(dj);dk=a(dk);if(!dl){return}dj=dj||"Unknown";ch(function(){var dm=aG(dl,dj,dk);bE.push(dm)})};this.trackContentImpressionsWithinNode=function(dj){if(N(b7)||!dj){return}ch(function(){if(cf){m(function(){var dk=v.findContentNodesWithinNode(dj);
62
- var dl=ba(dk);bE.pushMultiple(dl)})}else{p(function(){var dk=v.findContentNodesWithinNode(dj);var dl=cA(dk);bE.pushMultiple(dl)})}})};this.trackContentInteraction=function(dl,dm,dj,dk){if(N(b7)){return}dl=a(dl);dm=a(dm);dj=a(dj);dk=a(dk);if(!dl||!dm){return}dj=dj||"Unknown";ch(function(){var dn=aQ(dl,dm,dj,dk);if(dn){bE.push(dn)}})};this.trackContentInteractionNode=function(dl,dk){if(N(b7)||!dl){return}var dj=null;ch(function(){dj=db(dl,dk);if(dj){bE.push(dj)}});return dj};this.logAllContentBlocksOnPage=function(){var dl=v.findContentNodes();var dj=v.collectContent(dl);var dk=typeof console;if(dk!=="undefined"&&console&&console.log){console.log(dj)}};this.trackEvent=function(dk,dm,dj,dl,dp,dn){ch(function(){at(dk,dm,dj,dl,dp,dn)})};this.trackSiteSearch=function(dj,dl,dk,dm){cb=[];ch(function(){b9(dj,dl,dk,dm)})};this.setEcommerceView=function(dn,dj,dl,dk){ct={};if(Y(dl)){dl=String(dl)}if(!J(dl)||dl===null||dl===false||!dl.length){dl=""}else{if(dl instanceof Array){dl=S.JSON.stringify(dl)
63
- }}var dm="_pkc";ct[dm]=dl;if(J(dk)&&dk!==null&&dk!==false&&String(dk).length){dm="_pkp";ct[dm]=dk}if(!Y(dn)&&!Y(dj)){return}if(Y(dn)){dm="_pks";ct[dm]=dn}if(!Y(dj)){dj=""}dm="_pkn";ct[dm]=dj};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c1))};this.addEcommerceItem=function(dn,dj,dl,dk,dm){if(Y(dn)){c1[dn]=[String(dn),dj,dl,dk,dm]}};this.removeEcommerceItem=function(dj){if(Y(dj)){dj=String(dj);delete c1[dj]}};this.clearEcommerceCart=function(){c1={}};this.trackEcommerceOrder=function(dj,dn,dm,dl,dk,dp){b0(dj,dn,dm,dl,dk,dp)};this.trackEcommerceCartUpdate=function(dj){bu(dj)};this.trackRequest=function(dk,dm,dl,dj){ch(function(){var dn=cr(dk,dm,dj);bH(dn,bL,dl)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bE.enabled=false};this.setRequestQueueInterval=function(dj){if(dj<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bE.interval=dj};this.queueRequest=function(dj){ch(function(){var dk=cr(dj);
64
- bE.push(dk)})};this.isConsentRequired=function(){return cB};this.getRememberedConsent=function(){var dj=aD(be);if(aD(cN)){if(dj){bZ(be,br,cY)}return null}if(!dj||dj===0){return null}return dj};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cB=true;bD=this.hasRememberedConsent();if(!bD){bn=true}x++;b["CoreConsent"+x]={unload:function(){if(!bD){aF()}}}};this.setConsentGiven=function(dk){bD=true;bZ(cN,br,cY);var dl,dj;for(dl=0;dl<cM.length;dl++){dj=typeof cM[dl];if(dj==="string"){bH(cM[dl],bL)}else{if(dj==="object"){df(cM[dl],bL)}}}cM=[];if(!J(dk)||dk){this.setCookieConsentGiven()}};this.rememberConsentGiven=function(dl){if(dl){dl=dl*60*60*1000}else{dl=30*365*24*60*60*1000}var dj=true;this.setConsentGiven(dj);var dk=new Date().getTime();de(be,dk,dl,br,cY,bT,aJ)};this.forgetConsentGiven=function(){var dj=30*365*24*60*60*1000;bZ(be,br,cY);de(cN,new Date().getTime(),dj,br,cY,bT,aJ);this.forgetCookieConsentGiven();this.requireConsent()
65
- };this.isUserOptedOut=function(){return !bD};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=function(){this.setConsentGiven(false)};m(function(){setTimeout(function(){bG=true},0)});t.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];if(av[ap]>1&&ap!=="addTracker"&&ap!=="enableLinkTracking"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking"];
66
- function ad(aq,ap){var ao=new P(aq,ap);I.push(ao);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();t.trigger("TrackerAdded",[ao]);return ao}an(S,"beforeunload",ai,false);an(S,"online",function(){if(J(g.serviceWorker)&&J(g.serviceWorker.ready)){g.serviceWorker.ready.then(function(ao){if(ao&&ao.sync){return ao.sync.register("matomoSync")}})}},false);an(S,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getMatomoUrl());if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})
67
  }else{if(J(aq.maq_opted_in)){at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;t={initialized:false,JSON:S.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:m,onReady:p,isNodeVisible:i,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||S,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ap,ao){if(!J(ao)){ao=this.getAsyncTracker().getSiteId()}if(!J(ap)){ap=this.getAsyncTracker().getTrackerUrl()
68
  }return new P(ap,ao)},getAsyncTrackers:function(){return I},addTracker:function(aq,ap){var ao;if(!I.length){ao=ad(aq,ap)}else{ao=I[0].addTracker(aq,ap)}return ao},getAsyncTracker:function(at,ar){var aq;if(I&&I.length&&I[0]){aq=I[0]}else{return ad(at,ar)}if(!ar&&!at){return aq}if((!J(ar)||null===ar)&&aq){ar=aq.getSiteId()}if((!J(at)||null===at)&&aq){at=aq.getTrackerUrl()}var ap,ao=0;for(ao;ao<I.length;ao++){ap=I[ao];if(ap&&String(ap.getSiteId())===String(ar)&&ap.getTrackerUrl()===at){return ap}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return t});define("matomo",[],function(){return t})}return t}())}
69
  /*!!! pluginTrackerHook */
28
  }}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(S.innerWidth&&ap>S.innerWidth){ap=S.innerWidth}var ao=ar.clientHeight;if(S.innerHeight&&ao>S.innerHeight){ao=S.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=i(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+s(ao)}if(ap){if(at){at+="&"}at+="c_n="+s(ap)}if(aq){if(at){at+="&"}at+="c_p="+s(aq)}if(ar){if(at){at+="&"}at+="c_t="+s(ar)}if(at){at+="&ca=1"}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+s(ao)+"&c_p="+s(ap);if(aq){ar+="&c_t="+s(aq)
29
  }if(ar){ar+="&ca=1"}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||S.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap
30
  }if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(ao){if(ae.hasNodeAttribute(ao,this.CONTENT_IGNOREINTERACTION_ATTR)){return true}if(ae.hasNodeCssClass(ao,this.CONTENT_IGNOREINTERACTION_CLASS)){return true}if(ae.hasNodeCssClass(ao,this.LEGACY_CONTENT_IGNOREINTERACTION_CLASS)){return true}return false}};function W(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(Q(ap,"matomo.php")){ap=f(ap,"matomo.php".length)
31
+ }else{if(Q(ap,"piwik.php")){ap=f(ap,"piwik.php".length)}else{if(Q(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(Q(ap,"/js/")){ap=f(ap,"js/".length)}return ap}function N(av){var ax="Matomo_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=[^&]*)?");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}S.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=S.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,av,aq){var au=S.name.split("###"),at=au[1],ao=au[2],ar=au[3],aw=W(ap,av);n(aw+"plugins/Overlay/client/client.js?v=1",function(){Matomo_Overlay_Client.initialize(aw,aq,at,ao,ar)})}function u(){var aq;try{aq=S.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return S.self!==S.top
32
+ }catch(ao){return true}}function P(ce,ca){var bK=this,be="mtm_consent",cE="mtm_cookie_consent",cN="mtm_consent_removed",b5=aa(G.domain,S.location.href,K()),cV=L(b5[0]),bO=o(b5[1]),bp=o(b5[2]),cT=false,ci="GET",db=ci,aI="application/x-www-form-urlencoded; charset=UTF-8",cx=aI,aE=ce||"",bJ="",c1="",b7=ca||"",bA="",bP="",a5,bk="",c8=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","rtf","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ay=[cV],bB=[],bM=[],a9=[],bL=500,cY=true,cK,a6,bS,bQ,ao,cp=["pk_campaign","mtm_campaign","piwik_campaign","matomo_campaign","utm_campaign","utm_source","utm_medium"],bI=["pk_kwd","mtm_kwd","piwik_kwd","matomo_kwd","utm_term"],bl="_pk_",av="pk_vid",a0=180,cZ,br,bT=false,aJ="Lax",bn=false,cR,bf,bx,cL=33955200000,cn=1800000,c7=15768000000,a3=true,bG=false,bi=false,bR=false,aR=false,cc,bX={},cm={},bo={},bv=200,ct={},c2={},c9={},cb=[],cf=false,cC=false,ap=false,da=false,cO=false,aO=false,bd=u(),cy=null,c0=null,aS,bD,b8=am,bq,aM,bC=false,cq=0,bw=["id","ses","cvar","ref"],cB=false,bE=null,cM=[],cs=[],ax=T++,aw=false;
33
+ try{bk=G.title}catch(cz){bk=""}function aD(dm){if(bn){return 0}var dk=new RegExp("(^|;)[ ]*"+dm+"=([^;]*)"),dl=dk.exec(G.cookie);return dl?R(dl[2]):0}bE=!aD(cN);function df(dp,dq,dt,ds,dm,dn,dr){if(bn&&dp!==cN){return}var dl;if(dt){dl=new Date();dl.setTime(dl.getTime()+dt)}if(!dr){dr="Lax"}G.cookie=dp+"="+s(dq)+(dt?";expires="+dl.toGMTString():"")+";path="+(ds||"/")+(dm?";domain="+dm:"")+(dn?";secure":"")+";SameSite="+dr;if((!dt||dt>=0)&&aD(dp)!==dq){var dk="There was an error setting cookie `"+dp+"`. Please check domain and path.";ak(dk)}}function b3(dk){var dl;dk=j(dk,av);if(bQ){dl=new RegExp("#.*");return dk.replace(dl,"")}return dk}function bW(dm,dk){var dn=r(dk),dl;if(dn){return dk}if(dk.slice(0,1)==="/"){return r(dm)+"://"+d(dm)+dk}dm=b3(dm);dl=dm.indexOf("?");if(dl>=0){dm=dm.slice(0,dl)}dl=dm.lastIndexOf("/");if(dl!==dm.length-1){dm=dm.slice(0,dl+1)}return dm+dk}function cI(dm,dk){var dl;dm=String(dm).toLowerCase();dk=String(dk).toLowerCase();if(dm===dk){return true}if(dk.slice(0,1)==="."){if(dm===dk.slice(1)){return true
34
+ }dl=dm.length-dk.length;if((dl>0)&&(dm.slice(dl)===dk)){return true}}return false}function cl(dk){var dl=document.createElement("a");if(dk.indexOf("//")!==0&&dk.indexOf("http")!==0){if(dk.indexOf("*")===0){dk=dk.substr(1)}if(dk.indexOf(".")===0){dk=dk.substr(1)}dk="http://"+dk}dl.href=v.toAbsoluteUrl(dk);if(dl.pathname){return dl.pathname}return""}function a4(dl,dk){if(!aj(dk,"/")){dk="/"+dk}if(!aj(dl,"/")){dl="/"+dl}var dm=(dk==="/"||dk==="/*");if(dm){return true}if(dl===dk){return true}dk=String(dk).toLowerCase();dl=String(dl).toLowerCase();if(Q(dk,"*")){dk=dk.slice(0,-1);dm=(!dk||dk==="/");if(dm){return true}if(dl===dk){return true}return dl.indexOf(dk)===0}if(!Q(dl,"/")){dl+="/"}if(!Q(dk,"/")){dk+="/"}return dl.indexOf(dk)===0}function ar(dp,dr){var dl,dk,dm,dn,dq;for(dl=0;dl<ay.length;dl++){dn=L(ay[dl]);dq=cl(ay[dl]);if(cI(dp,dn)&&a4(dr,dq)){return true}}return false}function aW(dn){var dl,dk,dm;for(dl=0;dl<ay.length;dl++){dk=L(ay[dl].toLowerCase());if(dn===dk){return true}if(dk.slice(0,1)==="."){if(dn===dk.slice(1)){return true
35
+ }dm=dn.length-dk.length;if((dm>0)&&(dn.slice(dm)===dk)){return true}}}return false}function co(dk,dm){dk=dk.replace("send_image=0","send_image=1");var dl=new Image(1,1);dl.onload=function(){E=0;if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:true})}};dl.onerror=function(){if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:false})}};dl.src=aE+(aE.indexOf("?")<0?"?":"&")+dk}function cF(dk){if(db==="POST"){return true}return dk&&(dk.length>2000||dk.indexOf('{"requests"')===0)}function aL(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function a7(dp,ds,dr){var dm=aL();if(!dm){return false}var dn={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dt=false;var dl=aE;try{var dk=new Blob([dp],dn);if(dr&&!cF(dp)){dk=new Blob([],dn);dl=dl+(dl.indexOf("?")<0?"?":"&")+dp}dt=g.sendBeacon(dl,dk)}catch(dq){return false}if(dt&&typeof ds==="function"){ds({request:dp,trackerUrl:aE,success:true,isSendBeacon:true})}return dt}function c6(dl,dm,dk){if(!J(dk)||null===dk){dk=true
36
+ }if(l&&a7(dl,dm,dk)){return}setTimeout(function(){if(l&&a7(dl,dm,dk)){return}var dq;try{var dp=S.XMLHttpRequest?new S.XMLHttpRequest():S.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dp.open("POST",aE,true);dp.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dr=l&&a7(dl,dm,dk);if(!dr&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dm==="function")){dm({request:dl,trackerUrl:aE,success:true,xhr:this})}}};dp.setRequestHeader("Content-Type",cx);dp.withCredentials=true;dp.send(dl)}catch(dn){dq=l&&a7(dl,dm,dk);if(!dq&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false})}}}},50)}function cg(dl){var dk=new Date();var dm=dk.getTime()+dl;if(!q||dm>q){q=dm}}function bb(){bd=true;cy=new Date().getTime()}function de(){var dk=new Date().getTime();return !cy||(dk-cy)>a6}function az(){if(de()){bS()}}function dh(){if(aO||!a6){return
37
+ }aO=true;an(S,"focus",bb);an(S,"blur",az);ab++;t.addPlugin("HeartBeat"+ab,{unload:function(){if(aO&&de()){bS()}}})}function cD(dp){var dl=new Date();var dk=dl.getTime();c0=dk;if(cC&&dk<cC){var dm=cC-dk;setTimeout(dp,dm);cg(dm+50);cC+=50;return}if(cC===false){var dn=800;cC=dk+dn}dp()}function aP(){if(aD(cN)){bE=false}else{if(aD(be)){bE=true}}}function bH(dl,dk,dm){aP();if(!bE){cM.push(dl);return}aw=true;if(!cR&&dl){if(cB&&bE){dl+="&consent=1"}cD(function(){if(cY&&a7(dl,dm,true)){cg(100);return}if(cF(dl)){c6(dl,dm)}else{co(dl,dm)}cg(dk)})}if(!aO){dh()}}function ck(dk){if(cR){return false}return(dk&&dk.length)}function c5(dk,dp){if(!dp||dp>=dk.length){return[dk]}var dl=0;var dm=dk.length;var dn=[];for(dl;dl<dm;dl+=dp){dn.push(dk.slice(dl,dl+dp))}return dn}function dg(dl,dk){if(!ck(dl)){return}if(!bE){cM.push(dl);return}aw=true;cD(function(){var dp=c5(dl,50);var dm=0,dn;for(dm;dm<dp.length;dm++){dn='{"requests":["?'+dp[dm].join('","?')+'"],"send_image":0}';if(cY&&a7(dn,null,false)){cg(100)}else{c6(dn,null,false)
38
+ }}cg(dk)})}function aU(dk){return bl+dk+"."+b7+"."+bq}function bZ(dm,dl,dk){df(dm,"",-86400,dl,dk)}function b6(){if(bn){return"0"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){return g.cookieEnabled?"1":"0"}var dk=bl+"testcookie";df(dk,"1",undefined,br,cZ,bT,aJ);var dl=aD(dk)==="1"?"1":"0";bZ(dk);return dl}function bj(){bq=b8((cZ||cV)+(br||"/")).slice(0,4)}function cJ(){if(J(c9.res)){return c9}var dl,dn,dp={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",fla:"application/x-shockwave-flash",java:"application/x-java-vm",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(g.userAgent))){if(g.mimeTypes&&g.mimeTypes.length){for(dl in dp){if(Object.prototype.hasOwnProperty.call(dp,dl)){dn=g.mimeTypes[dp[dl]];c9[dl]=(dn&&dn.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(g.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(g.javaEnabled)&&g.javaEnabled()){c9.java="1"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){c9.cookie=g.cookieEnabled?"1":"0"
39
+ }else{c9.cookie=b6()}}var dm=parseInt(X.width,10);var dk=parseInt(X.height,10);c9.res=parseInt(dm,10)+"x"+parseInt(dk,10);return c9}function bY(){var dl=aU("cvar"),dk=aD(dl);if(dk&&dk.length){dk=S.JSON.parse(dk);if(V(dk)){return dk}}return{}}function cG(){if(aR===false){aR=bY()}}function cS(){var dk=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dk)+(new Date()).getTime()+Math.random()).slice(0,16)}function aB(){var dk=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dk)).slice(0,6)}function bg(){return Math.floor((new Date()).getTime()/1000)}function aK(){var dl=bg();var dm=aB();var dk=String(dl)+dm;return dk}function c4(dm){dm=String(dm);var dq=aB();var dn=dq.length;var dp=dm.substr(-1*dn,dn);var dl=parseInt(dm.substr(0,dm.length-dn),10);if(dl&&dp&&dp===dq){var dk=bg();if(a0<=0){return true}if(dk>=dl&&dk<=(dl+a0)){return true}}return false}function di(dk){if(!cO){return""}var dp=e(dk,av);if(!dp){return""}dp=String(dp);var dm=new RegExp("^[a-zA-Z0-9]+$");
40
+ if(dp.length===32&&dm.test(dp)){var dl=dp.substr(16,32);if(c4(dl)){var dn=dp.substr(0,16);return dn}}return""}function cP(){if(!bP){bP=di(bO)}var dm=new Date(),dk=Math.round(dm.getTime()/1000),dl=aU("id"),dq=aD(dl),dp,dn;if(dq){dp=dq.split(".");dp.unshift("0");if(bP.length){dp[1]=bP}return dp}if(bP.length){dn=bP}else{if("0"===b6()){dn=""}else{dn=cS()}}dp=["1",dn,dk];return dp}function aZ(){var dn=cP(),dl=dn[0],dm=dn[1],dk=dn[2];return{newVisitor:dl,uuid:dm,createTs:dk}}function aH(){var dn=new Date(),dl=dn.getTime(),dp=aZ().createTs;var dk=parseInt(dp,10);var dm=(dk*1000)+cL-dl;return dm}function aN(dk){if(!b7){return}var dm=new Date(),dl=Math.round(dm.getTime()/1000);if(!J(dk)){dk=aZ()}var dn=dk.uuid+"."+dk.createTs+".";df(aU("id"),dn,aH(),br,cZ,bT,aJ)}function bN(){var dk=aD(aU("ref"));if(dk.length){try{dk=S.JSON.parse(dk);if(V(dk)){return dk}}catch(dl){}}return["","",0,""]}function by(dm){var dl=bl+"testcookie_domain";var dk="testvalue";df(dl,dk,10000,null,dm,bT,aJ);if(aD(dl)===dk){bZ(dl,null,dm);
41
+ return true}return false}function aF(){var dl=bn;bn=false;var dk,dm;for(dk=0;dk<bw.length;dk++){dm=aU(bw[dk]);if(dm!==cN&&dm!==be&&0!==aD(dm)){bZ(dm,br,cZ)}}bn=dl}function b4(dk){b7=dk}function dj(dp){if(!dp||!V(dp)){return}var dn=[];var dm;for(dm in dp){if(Object.prototype.hasOwnProperty.call(dp,dm)){dn.push(dm)}}var dq={};dn.sort();var dk=dn.length;var dl;for(dl=0;dl<dk;dl++){dq[dn[dl]]=dp[dn[dl]]}return dq}function cd(){df(aU("ses"),"1",cn,br,cZ,bT,aJ)}function bh(){var dn="";var dl="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dm=dl.length;var dk;for(dk=0;dk<6;dk++){dn+=dl.charAt(Math.floor(Math.random()*dm))}return dn}function aA(dl){if(!h){return dl}var dm=(typeof h.timing==="object")&&h.timing?h.timing:undefined;if(!dm){dm=(typeof h.getEntriesByType==="function")&&h.getEntriesByType("navigation")?h.getEntriesByType("navigation")[0]:undefined}if(!dm){return dl}var dk="";if(dm.connectEnd&&dm.fetchStart){if(dm.connectEnd<dm.fetchStart){return}dk+="&pf_net="+Math.round(dm.connectEnd-dm.fetchStart)
42
+ }if(dm.responseStart&&dm.requestStart){if(dm.responseStart<dm.requestStart){return}dk+="&pf_srv="+Math.round(dm.responseStart-dm.requestStart)}if(dm.responseStart&&dm.responseEnd){if(dm.responseEnd<dm.responseStart){return}dk+="&pf_tfr="+Math.round(dm.responseEnd-dm.responseStart)}if(J(dm.domLoading)){if(dm.domInteractive&&dm.domLoading){if(dm.domInteractive<dm.domLoading){return}dk+="&pf_dm1="+Math.round(dm.domInteractive-dm.domLoading)}}else{if(dm.domInteractive&&dm.responseEnd){if(dm.domInteractive<dm.responseEnd){return}dk+="&pf_dm1="+Math.round(dm.domInteractive-dm.responseEnd)}}if(dm.domComplete&&dm.domInteractive){if(dm.domComplete<dm.domInteractive){return}dk+="&pf_dm2="+Math.round(dm.domComplete-dm.domInteractive)}if(dm.loadEventEnd&&dm.loadEventStart){if(dm.loadEventEnd<dm.loadEventStart){return}dk+="&pf_onl="+Math.round(dm.loadEventEnd-dm.loadEventStart)}return dl+dk}function cr(dm,dH,dI){var dG,dl=new Date(),du=Math.round(dl.getTime()/1000),dr,dE,dn=1024,dN,dv,dD=aR,dp=aU("ses"),dB=aU("ref"),dy=aU("cvar"),dz=aD(dp),dF=bN(),dJ=a5||bO,ds,dk;
43
+ if(bn){aF()}if(cR){return""}var dA=aZ();var dx=G.characterSet||G.charset;if(!dx||dx.toLowerCase()==="utf-8"){dx=null}ds=dF[0];dk=dF[1];dr=dF[2];dE=dF[3];if(!dz){if(!bx||!ds.length){for(dG in cp){if(Object.prototype.hasOwnProperty.call(cp,dG)){ds=e(dJ,cp[dG]);if(ds.length){break}}}for(dG in bI){if(Object.prototype.hasOwnProperty.call(bI,dG)){dk=e(dJ,bI[dG]);if(dk.length){break}}}}dN=d(bp);dv=dE.length?d(dE):"";if(dN.length&&!aW(dN)&&(!bx||!dv.length||aW(dv))){dE=bp}if(dE.length||ds.length){dr=du;dF=[ds,dk,dr,b3(dE.slice(0,dn))];df(dB,S.JSON.stringify(dF),c7,br,cZ,bT,aJ)}}dm+="&idsite="+b7+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dl.getHours()+"&m="+dl.getMinutes()+"&s="+dl.getSeconds()+"&url="+s(b3(dJ))+(bp.length?"&urlref="+s(b3(bp)):"")+(Y(bA)?"&uid="+s(bA):"")+"&_id="+dA.uuid+"&_idn="+dA.newVisitor+(ds.length?"&_rcn="+s(ds):"")+(dk.length?"&_rck="+s(dk):"")+"&_refts="+dr+(String(dE).length?"&_ref="+s(b3(dE.slice(0,dn))):"")+(dx?"&cs="+s(dx):"")+"&send_image=0";var dM=cJ();for(dG in dM){if(Object.prototype.hasOwnProperty.call(dM,dG)){dm+="&"+dG+"="+dM[dG]
44
+ }}var dL=[];if(dH){for(dG in dH){if(Object.prototype.hasOwnProperty.call(dH,dG)&&/^dimension\d+$/.test(dG)){var dq=dG.replace("dimension","");dL.push(parseInt(dq,10));dL.push(String(dq));dm+="&"+dG+"="+s(dH[dG]);delete dH[dG]}}}if(dH&&B(dH)){dH=null}for(dG in ct){if(Object.prototype.hasOwnProperty.call(ct,dG)){dm+="&"+dG+"="+s(ct[dG])}}for(dG in bo){if(Object.prototype.hasOwnProperty.call(bo,dG)){var dw=(-1===M(dL,dG));if(dw){dm+="&dimension"+dG+"="+s(bo[dG])}}}if(dH){dm+="&data="+s(S.JSON.stringify(dH))}else{if(ao){dm+="&data="+s(S.JSON.stringify(ao))}}function dt(dO,dP){var dQ=S.JSON.stringify(dO);if(dQ.length>2){return"&"+dP+"="+s(dQ)}return""}var dK=dj(bX);var dC=dj(cm);dm+=dt(dK,"cvar");dm+=dt(dC,"e_cvar");if(aR){dm+=dt(aR,"_cvar");for(dG in dD){if(Object.prototype.hasOwnProperty.call(dD,dG)){if(aR[dG][0]===""||aR[dG][1]===""){delete aR[dG]}}}if(bR){df(dy,S.JSON.stringify(aR),cn,br,cZ,bT,aJ)}}if(a3&&bG&&!bi){dm=aA(dm);bi=true}if(aM){dm+="&pv_id="+aM}aN(dA);cd();dm+=ac(dI,{tracker:bK,request:dm});
45
+ if(c1.length){dm+="&"+c1}if(A(cc)){dm=cc(dm)}return dm}bS=function a8(){var dk=new Date();dk=dk.getTime();if(!c0){return false}if(c0+a6<=dk){bK.ping();return true}return false};function bs(dn,dm,ds,dp,dk,dv){var dr="idgoal=0",dl=new Date(),dt=[],du,dq=String(dn).length;if(dq){dr+="&ec_id="+s(dn)}dr+="&revenue="+dm;if(String(ds).length){dr+="&ec_st="+ds}if(String(dp).length){dr+="&ec_tx="+dp}if(String(dk).length){dr+="&ec_sh="+dk}if(String(dv).length){dr+="&ec_dt="+dv}if(c2){for(du in c2){if(Object.prototype.hasOwnProperty.call(c2,du)){if(!J(c2[du][1])){c2[du][1]=""}if(!J(c2[du][2])){c2[du][2]=""}if(!J(c2[du][3])||String(c2[du][3]).length===0){c2[du][3]=0}if(!J(c2[du][4])||String(c2[du][4]).length===0){c2[du][4]=1}dt.push(c2[du])}}dr+="&ec_items="+s(S.JSON.stringify(dt))}dr=cr(dr,ao,"ecommerce");bH(dr,bL);if(dq){c2={}}}function b0(dk,dp,dn,dm,dl,dq){if(String(dk).length&&J(dp)){bs(dk,dp,dn,dm,dl,dq)}}function bu(dk){if(J(dk)){bs("",dk,"","","","")}}function b1(dl,dn,dm){if(!bC){aM=bh()}var dk=cr("action_name="+s(al(dl||bk)),dn,"log");
46
+ if(a3&&!bi){dk=aA(dk)}bH(dk,bL,dm)}function a1(dm,dl){var dn,dk="(^| )(piwik[_-]"+dl+"|matomo[_-]"+dl;if(dm){for(dn=0;dn<dm.length;dn++){dk+="|"+dm[dn]}}dk+=")( |$)";return new RegExp(dk)}function aV(dk){return(aE&&dk&&0===String(dk).indexOf(aE))}function cv(dp,dk,dq,dl){if(aV(dk)){return 0}var dn=a1(bM,"download"),dm=a1(a9,"link"),dr=new RegExp("\\.("+c8.join("|")+")([?&#]|$)","i");if(dm.test(dp)){return"link"}if(dl||dn.test(dp)||dr.test(dk)){return"download"}if(dq){return 0}return"link"}function au(dl){var dk;dk=dl.parentNode;while(dk!==null&&J(dk)){if(ae.isLinkElement(dl)){break}dl=dk;dk=dl.parentNode}return dl}function dd(dq){dq=au(dq);if(!ae.hasNodeAttribute(dq,"href")){return}if(!J(dq.href)){return}var dp=ae.getAttributeValueFromNode(dq,"href");var dl=dq.pathname||cl(dq.href);var dr=dq.hostname||d(dq.href);var ds=dr.toLowerCase();var dm=dq.href.replace(dr,ds);var dn=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dn.test(dm)){var dk=cv(dq.className,dm,ar(ds,dl),ae.hasNodeAttribute(dq,"download"));
47
+ if(dk){return{type:dk,href:dm}}}}function aQ(dk,dl,dm,dn){var dp=v.buildInteractionRequestParams(dk,dl,dm,dn);if(!dp){return}return cr(dp,null,"contentInteraction")}function bc(dk,dl){if(!dk||!dl){return false}var dm=v.findTargetNode(dk);if(v.shouldIgnoreInteraction(dm)){return false}dm=v.findTargetNodeNoDefault(dk);if(dm&&!U(dm,dl)){return false}return true}function cu(dm,dl,dp){if(!dm){return}var dk=v.findParentContentNode(dm);if(!dk){return}if(!bc(dk,dm)){return}var dn=v.buildContentBlock(dk);if(!dn){return}if(!dn.target&&dp){dn.target=dp}return v.buildInteractionRequestParams(dl,dn.name,dn.piece,dn.target)}function aX(dl){if(!cb||!cb.length){return false}var dk,dm;for(dk=0;dk<cb.length;dk++){dm=cb[dk];if(dm&&dm.name===dl.name&&dm.piece===dl.piece&&dm.target===dl.target){return true}}return false}function aY(dk){return function(dp){if(!dk){return}var dm=v.findParentContentNode(dk);var dl;if(dp){dl=dp.target||dp.srcElement}if(!dl){dl=dk}if(!bc(dm,dl)){return}if(!dm){return false}var dq=v.findTargetNode(dm);
48
+ if(!dq||v.shouldIgnoreInteraction(dq)){return false}var dn=dd(dq);if(da&&dn&&dn.type){return dn.type}return bK.trackContentInteractionNode(dl,"click")}}function b2(dm){if(!dm||!dm.length){return}var dk,dl;for(dk=0;dk<dm.length;dk++){dl=v.findTargetNode(dm[dk]);if(dl&&!dl.contentInteractionTrackingSetupDone){dl.contentInteractionTrackingSetupDone=true;an(dl,"click",aY(dl))}}}function bz(dm,dn){if(!dm||!dm.length){return[]}var dk,dl;for(dk=0;dk<dm.length;dk++){if(aX(dm[dk])){dm.splice(dk,1);dk--}else{cb.push(dm[dk])}}if(!dm||!dm.length){return[]}b2(dn);var dp=[];for(dk=0;dk<dm.length;dk++){dl=cr(v.buildImpressionRequestParams(dm[dk].name,dm[dk].piece,dm[dk].target),undefined,"contentImpressions");if(dl){dp.push(dl)}}return dp}function cA(dl){var dk=v.collectContent(dl);return bz(dk,dl)}function ba(dl){if(!dl||!dl.length){return[]}var dk;for(dk=0;dk<dl.length;dk++){if(!v.isNodeVisible(dl[dk])){dl.splice(dk,1);dk--}}if(!dl||!dl.length){return[]}return cA(dl)}function aG(dm,dk,dl){var dn=v.buildImpressionRequestParams(dm,dk,dl);
49
+ return cr(dn,null,"contentImpression")}function dc(dn,dl){if(!dn){return}var dk=v.findParentContentNode(dn);var dm=v.buildContentBlock(dk);if(!dm){return}if(!dl){dl="Unknown"}return aQ(dl,dm.name,dm.piece,dm.target)}function cQ(dl,dn,dk,dm){return"e_c="+s(dl)+"&e_a="+s(dn)+(J(dk)?"&e_n="+s(dk):"")+(J(dm)?"&e_v="+s(dm):"")+"&ca=1"}function at(dm,dp,dk,dn,dr,dq){if(!Y(dm)||!Y(dp)){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dl=cr(cQ(dm,dp,dk,dn),dr,"event");bH(dl,bL,dq)}function b9(dk,dn,dl,dp){var dm=cr("search="+s(dk)+(dn?"&search_cat="+s(dn):"")+(J(dl)?"&search_count="+dl:""),dp,"sitesearch");bH(dm,bL)}function cU(dk,dp,dn,dm){var dl=cr("idgoal="+dk+(dp?"&revenue="+dp:""),dn,"goal");bH(dl,bL,dm)}function c3(dn,dk,ds,dr,dm){var dq=dk+"="+s(b3(dn));var dl=cu(dm,"click",dn);if(dl){dq+="&"+dl}var dp=cr(dq,ds,"link");bH(dp,bL,dr)}function bV(dl,dk){if(dl!==""){return dl+dk.charAt(0).toUpperCase()+dk.slice(1)
50
+ }return dk}function ch(dq){var dp,dk,dn=["","webkit","ms","moz"],dm;if(!bf){for(dk=0;dk<dn.length;dk++){dm=dn[dk];if(Object.prototype.hasOwnProperty.call(G,bV(dm,"hidden"))){if(G[bV(dm,"visibilityState")]==="prerender"){dp=true}break}}}if(dp){an(G,dm+"visibilitychange",function dl(){G.removeEventListener(dm+"visibilitychange",dl,false);dq()});return}dq()}function bt(){var dl=bK.getVisitorId();var dk=aK();return dl+dk}function cj(dk){if(!dk){return}if(!ae.hasNodeAttribute(dk,"href")){return}var dl=ae.getAttributeValueFromNode(dk,"href");if(!dl||aV(dl)){return}if(!bK.getVisitorId()){return}dl=j(dl,av);var dm=bt();dl=F(dl,av,dm);ae.setAnyAttribute(dk,"href",dl)}function bm(dn){var dp=ae.getAttributeValueFromNode(dn,"href");if(!dp){return false}dp=String(dp);var dl=dp.indexOf("//")===0||dp.indexOf("http://")===0||dp.indexOf("https://")===0;if(!dl){return false}var dk=dn.pathname||cl(dn.href);var dm=(dn.hostname||d(dn.href)).toLowerCase();if(ar(dm,dk)){if(!cI(cV,L(dm))){return true}return false
51
+ }return false}function cH(dk){var dl=dd(dk);if(dl&&dl.type){dl.href=o(dl.href);c3(dl.href,dl.type,undefined,null,dk);return}if(cO){dk=au(dk);if(bm(dk)){cj(dk)}}}function cw(){return G.all&&!G.addEventListener}function cW(dk){var dm=dk.which;var dl=(typeof dk.button);if(!dm&&dl!=="undefined"){if(cw()){if(dk.button&1){dm=1}else{if(dk.button&2){dm=3}else{if(dk.button&4){dm=2}}}}else{if(dk.button===0||dk.button==="0"){dm=1}else{if(dk.button&1){dm=2}else{if(dk.button&2){dm=3}}}}}return dm}function bU(dk){switch(cW(dk)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a2(dk){return dk.target||dk.srcElement}function cX(dk){return dk==="A"||dk==="AREA"}function aC(dk){function dl(dn){var dp=a2(dn);var dq=dp.nodeName;var dm=a1(bB,"ignore");while(!cX(dq)&&dp&&dp.parentNode){dp=dp.parentNode;dq=dp.nodeName}if(dp&&cX(dq)&&!dm.test(dp.className)){return dp}}return function(dp){dp=dp||S.event;var dq=dl(dp);if(!dq){return}var dn=bU(dp);if(dp.type==="click"){var dm=false;if(dk&&dn==="middle"){dm=true
52
+ }if(dq&&!dm){cH(dq)}}else{if(dp.type==="mousedown"){if(dn==="middle"&&dq){aS=dn;bD=dq}else{aS=bD=null}}else{if(dp.type==="mouseup"){if(dn===aS&&dq===bD){cH(dq)}aS=bD=null}else{if(dp.type==="contextmenu"){cH(dq)}}}}}}function aq(dn,dm,dk){var dl=typeof dm;if(dl==="undefined"){dm=true}an(dn,"click",aC(dm),dk);if(dm){an(dn,"mouseup",aC(dm),dk);an(dn,"mousedown",aC(dm),dk);an(dn,"contextmenu",aC(dm),dk)}}function aT(dl,dp,dq){if(cf){return true}cf=true;var dr=false;var dn,dm;function dk(){dr=true}m(function(){function ds(du){setTimeout(function(){if(!cf){return}dr=false;dq.trackVisibleContentImpressions();ds(du)},du)}function dt(du){setTimeout(function(){if(!cf){return}if(dr){dr=false;dq.trackVisibleContentImpressions()}dt(du)},du)}if(dl){dn=["scroll","resize"];for(dm=0;dm<dn.length;dm++){if(G.addEventListener){G.addEventListener(dn[dm],dk,false)}else{S.attachEvent("on"+dn[dm],dk)}}dt(100)}if(dp&&dp>0){dp=parseInt(dp,10);ds(dp)}})}var bF={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dk=this.requests;
53
+ this.requests=[];if(dk.length===1){bH(dk[0],bL)}else{dg(dk,bL)}},canQueue:function(){return !l&&this.enabled},pushMultiple:function(dl){if(!this.canQueue()){dg(dl,bL);return}var dk;for(dk=0;dk<dl.length;dk++){this.push(dl[dk])}},push:function(dk){if(!dk){return}if(!this.canQueue()){bH(dk,bL);return}bF.requests.push(dk);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bF.timeout=null;bF.sendRequests()},bF.interval);var dl="RequestQueue"+ax;if(!Object.prototype.hasOwnProperty.call(b,dl)){b[dl]={unload:function(){if(bF.timeout){clearTimeout(bF.timeout)}bF.sendRequests()}}}}};bj();aN();this.hasConsent=function(){return bE};this.getVisitorId=function(){return aZ().uuid};this.getVisitorInfo=function(){return cP()};this.getAttributionInfo=function(){return bN()};this.getAttributionCampaignName=function(){return bN()[0]};this.getAttributionCampaignKeyword=function(){return bN()[1]};this.getAttributionReferrerTimestamp=function(){return bN()[2]};this.getAttributionReferrerUrl=function(){return bN()[3]
54
+ };this.setTrackerUrl=function(dk){aE=dk};this.getTrackerUrl=function(){return aE};this.getMatomoUrl=function(){return W(this.getTrackerUrl(),bJ)};this.getPiwikUrl=function(){return this.getMatomoUrl()};this.addTracker=function(dm,dl){if(!J(dm)||null===dm){dm=this.getTrackerUrl()}var dk=new P(dm,dl);I.push(dk);t.trigger("TrackerAdded",[this]);return dk};this.getSiteId=function(){return b7};this.setSiteId=function(dk){b4(dk)};this.resetUserId=function(){bA=""};this.setUserId=function(dk){if(Y(dk)){bA=dk}};this.setVisitorId=function(dl){var dk=/[0-9A-Fa-f]{16}/g;if(w(dl)&&dk.test(dl)){bP=dl}else{ak("Invalid visitorId set"+dl)}};this.getUserId=function(){return bA};this.setCustomData=function(dk,dl){if(V(dk)){ao=dk}else{if(!ao){ao={}}ao[dk]=dl}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dk){cc=dk};this.appendToTrackingUrl=function(dk){c1=dk};this.getRequest=function(dk){return cr(dk)};this.addPlugin=function(dk,dl){b[dk]=dl};this.setCustomDimension=function(dk,dl){dk=parseInt(dk,10);
55
+ if(dk>0){if(!J(dl)){dl=""}if(!w(dl)){dl=String(dl)}bo[dk]=dl}};this.getCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0&&Object.prototype.hasOwnProperty.call(bo,dk)){return bo[dk]}};this.deleteCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0){delete bo[dk]}};this.setCustomVariable=function(dl,dk,dp,dm){var dn;if(!J(dm)){dm="visit"}if(!J(dk)){return}if(!J(dp)){dp=""}if(dl>0){dk=!w(dk)?String(dk):dk;dp=!w(dp)?String(dp):dp;dn=[dk.slice(0,bv),dp.slice(0,bv)];if(dm==="visit"||dm===2){cG();aR[dl]=dn}else{if(dm==="page"||dm===3){bX[dl]=dn}else{if(dm==="event"){cm[dl]=dn}}}}};this.getCustomVariable=function(dl,dm){var dk;if(!J(dm)){dm="visit"}if(dm==="page"||dm===3){dk=bX[dl]}else{if(dm==="event"){dk=cm[dl]}else{if(dm==="visit"||dm===2){cG();dk=aR[dl]}}}if(!J(dk)||(dk&&dk[0]==="")){return false}return dk};this.deleteCustomVariable=function(dk,dl){if(this.getCustomVariable(dk,dl)){this.setCustomVariable(dk,"","",dl)}};this.deleteCustomVariables=function(dk){if(dk==="page"||dk===3){bX={}
56
+ }else{if(dk==="event"){cm={}}else{if(dk==="visit"||dk===2){aR={}}}}};this.storeCustomVariablesInCookie=function(){bR=true};this.setLinkTrackingTimer=function(dk){bL=dk};this.getLinkTrackingTimer=function(){return bL};this.setDownloadExtensions=function(dk){if(w(dk)){dk=dk.split("|")}c8=dk};this.addDownloadExtensions=function(dl){var dk;if(w(dl)){dl=dl.split("|")}for(dk=0;dk<dl.length;dk++){c8.push(dl[dk])}};this.removeDownloadExtensions=function(dm){var dl,dk=[];if(w(dm)){dm=dm.split("|")}for(dl=0;dl<c8.length;dl++){if(M(dm,c8[dl])===-1){dk.push(c8[dl])}}c8=dk};this.setDomains=function(dk){ay=w(dk)?[dk]:dk;var dp=false,dm=0,dl;for(dm;dm<ay.length;dm++){dl=String(ay[dm]);if(cI(cV,L(dl))){dp=true;break}var dn=cl(dl);if(dn&&dn!=="/"&&dn!=="/*"){dp=true;break}}if(!dp){ay.push(cV)}};this.enableCrossDomainLinking=function(){cO=true};this.disableCrossDomainLinking=function(){cO=false};this.isCrossDomainLinkingEnabled=function(){return cO};this.setCrossDomainLinkingTimeout=function(dk){a0=dk};this.getCrossDomainLinkingUrlParameter=function(){return s(av)+"="+s(bt())
57
+ };this.setIgnoreClasses=function(dk){bB=w(dk)?[dk]:dk};this.setRequestMethod=function(dk){if(dk){db=String(dk).toUpperCase()}else{db=ci}if(db==="GET"){this.disableAlwaysUseSendBeacon()}};this.setRequestContentType=function(dk){cx=dk||aI};this.setGenerationTimeMs=function(dk){ak("setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. There is currently no replacement yet.")};this.setReferrerUrl=function(dk){bp=dk};this.setCustomUrl=function(dk){a5=bW(bO,dk)};this.getCurrentUrl=function(){return a5||bO};this.setDocumentTitle=function(dk){bk=dk};this.setPageViewId=function(dk){aM=dk;bC=true};this.setAPIUrl=function(dk){bJ=dk};this.setDownloadClasses=function(dk){bM=w(dk)?[dk]:dk};this.setLinkClasses=function(dk){a9=w(dk)?[dk]:dk};this.setCampaignNameKey=function(dk){cp=w(dk)?[dk]:dk};this.setCampaignKeywordKey=function(dk){bI=w(dk)?[dk]:dk};this.discardHashTag=function(dk){bQ=dk};this.setCookieNamePrefix=function(dk){bl=dk;if(aR){aR=bY()}};this.setCookieDomain=function(dk){var dl=L(dk);
58
+ if(!bn&&!by(dl)){ak("Can't write cookie on domain "+dk)}else{cZ=dl;bj()}};this.getCookieDomain=function(){return cZ};this.hasCookies=function(){return"1"===b6()};this.setSessionCookie=function(dm,dl,dk){if(!dm){throw new Error("Missing cookie name")}if(!J(dk)){dk=cn}bw.push(dm);df(aU(dm),dl,dk,br,cZ,bT,aJ)};this.getCookie=function(dl){var dk=aD(aU(dl));if(dk===0){return null}return dk};this.setCookiePath=function(dk){br=dk;bj()};this.getCookiePath=function(dk){return br};this.setVisitorCookieTimeout=function(dk){cL=dk*1000};this.setSessionCookieTimeout=function(dk){cn=dk*1000};this.getSessionCookieTimeout=function(){return cn};this.setReferralCookieTimeout=function(dk){c7=dk*1000};this.setConversionAttributionFirstReferrer=function(dk){bx=dk};this.setSecureCookie=function(dk){if(dk&&location.protocol!=="https:"){ak("Error in setSecureCookie: You cannot use `Secure` on http.");return}bT=dk};this.setCookieSameSite=function(dk){dk=String(dk);dk=dk.charAt(0).toUpperCase()+dk.toLowerCase().slice(1);
59
+ if(dk!=="None"&&dk!=="Lax"&&dk!=="Strict"){ak("Ignored value for sameSite. Please use either Lax, None, or Strict.");return}if(dk==="None"){if(location.protocol==="https:"){this.setSecureCookie(true)}else{ak("sameSite=None cannot be used on http, reverted to sameSite=Lax.");dk="Lax"}}aJ=dk};this.disableCookies=function(){bn=true;if(b7){aF()}};this.areCookiesEnabled=function(){return !bn};this.setCookieConsentGiven=function(){if(bn&&!cR){bn=false;if(b7&&aw){aN();var dk=cr("ping=1",null,"ping");bH(dk,bL)}}};this.requireCookieConsent=function(){if(this.getRememberedCookieConsent()){return false}this.disableCookies();return true};this.getRememberedCookieConsent=function(){return aD(cE)};this.forgetCookieConsentGiven=function(){bZ(cE,br,cZ);this.disableCookies()};this.rememberCookieConsentGiven=function(dl){if(dl){dl=dl*60*60*1000}else{dl=30*365*24*60*60*1000}this.setCookieConsentGiven();var dk=new Date().getTime();df(cE,dk,dl,br,cZ,bT,aJ)};this.deleteCookies=function(){aF()};this.setDoNotTrack=function(dl){var dk=g.doNotTrack||g.msDoNotTrack;
60
+ cR=dl&&(dk==="yes"||dk==="1");if(cR){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cY=true};this.disableAlwaysUseSendBeacon=function(){cY=false};this.addListener=function(dl,dk){aq(dl,dk,false)};this.enableLinkTracking=function(dl){if(da){return}da=true;var dk=this;p(function(){ap=true;var dm=G.body;aq(dm,dl,true)})};this.enableJSErrorTracking=function(){if(cT){return}cT=true;var dk=S.onerror;S.onerror=function(dq,dn,dm,dp,dl){ch(function(){var dr="JavaScript Errors";var ds=dn+":"+dm;if(dp){ds+=":"+dp}if(M(cs,dr+ds+dq)===-1){cs.push(dr+ds+dq);at(dr,ds,dq)}});if(dk){return dk(dq,dn,dm,dp,dl)}return false}};this.disablePerformanceTracking=function(){a3=false};this.enableHeartBeatTimer=function(dk){dk=Math.max(dk||15,5);a6=dk*1000;if(c0!==null){dh()}};this.disableHeartBeatTimer=function(){if(a6||aO){if(S.removeEventListener){S.removeEventListener("focus",bb);S.removeEventListener("blur",az)}else{if(S.detachEvent){S.detachEvent("onfocus",bb);S.detachEvent("onblur",az)}}}a6=null;
61
+ aO=false};this.killFrame=function(){if(S.location!==S.top.location){S.top.location=S.location}};this.redirectFile=function(dk){if(S.location.protocol==="file:"){S.location=dk}};this.setCountPreRendered=function(dk){bf=dk};this.trackGoal=function(dk,dn,dm,dl){ch(function(){cU(dk,dn,dm,dl)})};this.trackLink=function(dl,dk,dn,dm){ch(function(){c3(dl,dk,dn,dm)})};this.getNumTrackedPageViews=function(){return cq};this.trackPageView=function(dk,dm,dl){cb=[];cM=[];cs=[];if(N(b7)){ch(function(){Z(aE,bJ,b7)})}else{ch(function(){cq++;b1(dk,dm,dl)})}};this.trackAllContentImpressions=function(){if(N(b7)){return}ch(function(){p(function(){var dk=v.findContentNodes();var dl=cA(dk);bF.pushMultiple(dl)})})};this.trackVisibleContentImpressions=function(dk,dl){if(N(b7)){return}if(!J(dk)){dk=true}if(!J(dl)){dl=750}aT(dk,dl,this);ch(function(){m(function(){var dm=v.findContentNodes();var dn=ba(dm);bF.pushMultiple(dn)})})};this.trackContentImpression=function(dm,dk,dl){if(N(b7)){return}dm=a(dm);dk=a(dk);dl=a(dl);
62
+ if(!dm){return}dk=dk||"Unknown";ch(function(){var dn=aG(dm,dk,dl);bF.push(dn)})};this.trackContentImpressionsWithinNode=function(dk){if(N(b7)||!dk){return}ch(function(){if(cf){m(function(){var dl=v.findContentNodesWithinNode(dk);var dm=ba(dl);bF.pushMultiple(dm)})}else{p(function(){var dl=v.findContentNodesWithinNode(dk);var dm=cA(dl);bF.pushMultiple(dm)})}})};this.trackContentInteraction=function(dm,dn,dk,dl){if(N(b7)){return}dm=a(dm);dn=a(dn);dk=a(dk);dl=a(dl);if(!dm||!dn){return}dk=dk||"Unknown";ch(function(){var dp=aQ(dm,dn,dk,dl);if(dp){bF.push(dp)}})};this.trackContentInteractionNode=function(dm,dl){if(N(b7)||!dm){return}var dk=null;ch(function(){dk=dc(dm,dl);if(dk){bF.push(dk)}});return dk};this.logAllContentBlocksOnPage=function(){var dm=v.findContentNodes();var dk=v.collectContent(dm);var dl=typeof console;if(dl!=="undefined"&&console&&console.log){console.log(dk)}};this.trackEvent=function(dl,dn,dk,dm,dq,dp){ch(function(){at(dl,dn,dk,dm,dq,dp)})};this.trackSiteSearch=function(dk,dm,dl,dn){cb=[];
63
+ ch(function(){b9(dk,dm,dl,dn)})};this.setEcommerceView=function(dp,dk,dm,dl){ct={};if(Y(dm)){dm=String(dm)}if(!J(dm)||dm===null||dm===false||!dm.length){dm=""}else{if(dm instanceof Array){dm=S.JSON.stringify(dm)}}var dn="_pkc";ct[dn]=dm;if(J(dl)&&dl!==null&&dl!==false&&String(dl).length){dn="_pkp";ct[dn]=dl}if(!Y(dp)&&!Y(dk)){return}if(Y(dp)){dn="_pks";ct[dn]=dp}if(!Y(dk)){dk=""}dn="_pkn";ct[dn]=dk};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c2))};this.addEcommerceItem=function(dp,dk,dm,dl,dn){if(Y(dp)){c2[dp]=[String(dp),dk,dm,dl,dn]}};this.removeEcommerceItem=function(dk){if(Y(dk)){dk=String(dk);delete c2[dk]}};this.clearEcommerceCart=function(){c2={}};this.trackEcommerceOrder=function(dk,dp,dn,dm,dl,dq){b0(dk,dp,dn,dm,dl,dq)};this.trackEcommerceCartUpdate=function(dk){bu(dk)};this.trackRequest=function(dl,dn,dm,dk){ch(function(){var dp=cr(dl,dn,dk);bH(dp,bL,dm)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bF.enabled=false
64
+ };this.setRequestQueueInterval=function(dk){if(dk<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bF.interval=dk};this.queueRequest=function(dk){ch(function(){var dl=cr(dk);bF.push(dl)})};this.isConsentRequired=function(){return cB};this.getRememberedConsent=function(){var dk=aD(be);if(aD(cN)){if(dk){bZ(be,br,cZ)}return null}if(!dk||dk===0){return null}return dk};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cB=true;bE=this.hasRememberedConsent();if(!bE){bn=true}x++;b["CoreConsent"+x]={unload:function(){if(!bE){aF()}}}};this.setConsentGiven=function(dl){bE=true;bZ(cN,br,cZ);var dm,dk;for(dm=0;dm<cM.length;dm++){dk=typeof cM[dm];if(dk==="string"){bH(cM[dm],bL)}else{if(dk==="object"){dg(cM[dm],bL)}}}cM=[];if(!J(dl)||dl){this.setCookieConsentGiven()}};this.rememberConsentGiven=function(dm){if(dm){dm=dm*60*60*1000}else{dm=30*365*24*60*60*1000}var dk=true;this.setConsentGiven(dk);var dl=new Date().getTime();
65
+ df(be,dl,dm,br,cZ,bT,aJ)};this.forgetConsentGiven=function(){var dk=30*365*24*60*60*1000;bZ(be,br,cZ);df(cN,new Date().getTime(),dk,br,cZ,bT,aJ);this.forgetCookieConsentGiven();this.requireConsent()};this.isUserOptedOut=function(){return !bE};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=function(){this.setConsentGiven(false)};m(function(){setTimeout(function(){bG=true},0)});t.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];if(av[ap]>1&&ap!=="addTracker"&&ap!=="enableLinkTracking"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking"];
66
+ function ad(aq,ap){var ao=new P(aq,ap);I.push(ao);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();t.trigger("TrackerAdded",[ao]);return ao}an(S,"beforeunload",ai,false);an(S,"online",function(){if(J(g.serviceWorker)){g.serviceWorker.ready.then(function(ao){if(ao&&ao.sync){return ao.sync.register("matomoSync")}},function(){})}},false);an(S,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getMatomoUrl());if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})
67
  }else{if(J(aq.maq_opted_in)){at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;t={initialized:false,JSON:S.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:m,onReady:p,isNodeVisible:i,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||S,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ap,ao){if(!J(ao)){ao=this.getAsyncTracker().getSiteId()}if(!J(ap)){ap=this.getAsyncTracker().getTrackerUrl()
68
  }return new P(ap,ao)},getAsyncTrackers:function(){return I},addTracker:function(aq,ap){var ao;if(!I.length){ao=ad(aq,ap)}else{ao=I[0].addTracker(aq,ap)}return ao},getAsyncTracker:function(at,ar){var aq;if(I&&I.length&&I[0]){aq=I[0]}else{return ad(at,ar)}if(!ar&&!at){return aq}if((!J(ar)||null===ar)&&aq){ar=aq.getSiteId()}if((!J(at)||null===at)&&aq){at=aq.getTrackerUrl()}var ap,ao=0;for(ao;ao<I.length;ao++){ap=I[ao];if(ap&&String(ap.getSiteId())===String(ar)&&ap.getTrackerUrl()===at){return ap}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return t});define("matomo",[],function(){return t})}return t}())}
69
  /*!!! pluginTrackerHook */
app/lang/ar.json CHANGED
@@ -1050,9 +1050,7 @@
1050
  "SystemCheckGzcompressHelp": "تحتاج إلى تفعيل إضافة zlib ودالة gzcompress.",
1051
  "SystemCheckGzuncompressHelp": "تحتاج إلى تفعيل إضافة zlib ودالة gzcompress.",
1052
  "SystemCheckHashHelp": "تحتاج إلى إعداد وإعادة بناء PHP مع تمكين دعم دالة hash() بأن تستثني الخيار --disable-hash .",
1053
- "SystemCheckIconvHelp": "تحتاج إلى إعداد وإعادة بناء PHP مع تفعيل دعم iconv: --with-iconv.",
1054
  "SystemCheckMailHelp": "لن يتم إرسال رسائل التغذية الراجعة وكلمات المرور المفقودة بدون mail().",
1055
- "SystemCheckMbstring": "mbstring",
1056
  "SystemCheckMemoryLimit": "حد الذاكرة",
1057
  "SystemCheckMemoryLimitHelp": "في المواقع ذات الزيارات الكبيرة، فإن عملية الأرشفة تتطلب ذاكرة أعلى مما هو مسموح به حالياً. إذا تطلب الأمر، قم بتغيير memory_limit في ملف php.ini الخاص بك.",
1058
  "SystemCheckNoErrorsOrWarnings": "لا توجد أي أخطاء أو تحذيرات",
@@ -1067,7 +1065,6 @@
1067
  "SystemCheckPdoAndMysqliHelp": "على ملقم لينوكس يمكنك ضبط PHP بالإعدادات التالية: %1$s في ملف php.ini أضف السطور التالية: %2$s",
1068
  "SystemCheckPhp": "إصدار PHP",
1069
  "SystemCheckPhpPdoAndMysqli": "لمزيد من المعلومات عن: %1$sPHP PDO%2$s و %3$sMYSQLI%4$s.",
1070
- "SystemCheckSplHelp": "ستحتاج لضبط وإعادة بناء PHP وتكون مكتبة PHP القياسية SPL فيها مفعلة (افتراضياً).",
1071
  "SystemCheckSettings": "إعدادات PHP المطلوبة (php.ini)",
1072
  "SystemCheckSummaryNoProblems": "رائع! لاتوجد أية مشاكل في وضع Matomo الحالي عندك. إتبسط ياعمّ !",
1073
  "SystemCheckSummaryThereWereErrors": "أوه ! اكتشف Matomo بعض %1$s المشاكل الهامة %2$s في بيئة Matomo لديك. %3$s يجب إصلاح هذه المشاكل حالاً.%4$s",
1050
  "SystemCheckGzcompressHelp": "تحتاج إلى تفعيل إضافة zlib ودالة gzcompress.",
1051
  "SystemCheckGzuncompressHelp": "تحتاج إلى تفعيل إضافة zlib ودالة gzcompress.",
1052
  "SystemCheckHashHelp": "تحتاج إلى إعداد وإعادة بناء PHP مع تمكين دعم دالة hash() بأن تستثني الخيار --disable-hash .",
 
1053
  "SystemCheckMailHelp": "لن يتم إرسال رسائل التغذية الراجعة وكلمات المرور المفقودة بدون mail().",
 
1054
  "SystemCheckMemoryLimit": "حد الذاكرة",
1055
  "SystemCheckMemoryLimitHelp": "في المواقع ذات الزيارات الكبيرة، فإن عملية الأرشفة تتطلب ذاكرة أعلى مما هو مسموح به حالياً. إذا تطلب الأمر، قم بتغيير memory_limit في ملف php.ini الخاص بك.",
1056
  "SystemCheckNoErrorsOrWarnings": "لا توجد أي أخطاء أو تحذيرات",
1065
  "SystemCheckPdoAndMysqliHelp": "على ملقم لينوكس يمكنك ضبط PHP بالإعدادات التالية: %1$s في ملف php.ini أضف السطور التالية: %2$s",
1066
  "SystemCheckPhp": "إصدار PHP",
1067
  "SystemCheckPhpPdoAndMysqli": "لمزيد من المعلومات عن: %1$sPHP PDO%2$s و %3$sMYSQLI%4$s.",
 
1068
  "SystemCheckSettings": "إعدادات PHP المطلوبة (php.ini)",
1069
  "SystemCheckSummaryNoProblems": "رائع! لاتوجد أية مشاكل في وضع Matomo الحالي عندك. إتبسط ياعمّ !",
1070
  "SystemCheckSummaryThereWereErrors": "أوه ! اكتشف Matomo بعض %1$s المشاكل الهامة %2$s في بيئة Matomo لديك. %3$s يجب إصلاح هذه المشاكل حالاً.%4$s",
app/lang/be.json CHANGED
@@ -543,9 +543,7 @@
543
  "SystemCheckGlobHelp": "Гэтая убудаваная функцыя адключана на вашым хосце. Matomo паспрабуе эмуляваць гэтую функцыю, але могуць паўстаць дадатковыя абмежаванні бяспекі. Функцыянальныя магчымасці могуць быць закрануты.",
544
  "SystemCheckGzcompressHelp": "Вам неабходна ўключыць пашырэнне zlib і функцыю gzcompress.",
545
  "SystemCheckGzuncompressHelp": "Вам неабходна ўключыць пашырэнне zlib і функцыю gzuncompress.",
546
- "SystemCheckIconvHelp": "Вам неабходна сканфігураваць PHP на падтрымку \"iconv\", і перакампіляваць з параметрам --with-iconv.",
547
  "SystemCheckMailHelp": "Функцыі водгукаў о Matomo і аднаўленне пароляў не будуць працаваць без mail().",
548
- "SystemCheckMbstring": "mbstring",
549
  "SystemCheckMemoryLimit": "Абмежаванне памяці",
550
  "SystemCheckMemoryLimitHelp": "На вэб-сайтах з высокім трафікам, працэс архівавання можа запатрабаваць больш памяці, чым дазволена. Пры неабходнасці, змяніце memory_limit дырэктыву ў файле php.ini.",
551
  "SystemCheckOpenURL": "адкрыць URL-адрас",
@@ -557,7 +555,6 @@
557
  "SystemCheckPdoAndMysqliHelp": "На Linux серверы вы можаце скампіляваць php з наступнымі параметрамі:%1$s у вашым php.ini, дадаць наступныя радкі: %2$s",
558
  "SystemCheckPhp": "Версія PHP",
559
  "SystemCheckPhpPdoAndMysqli": "Больш падрабязная інфармацыя па: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
560
- "SystemCheckSplHelp": "Вам неабходна сканфігураваць і перасабраць PHP з уключанай стандартнай бібліятэкай (значэнне па змаўчанні).",
561
  "SystemCheckTimeLimitHelp": "На вэб-сайтах з высокім трафікам, працэс архівавання можа спатрабаваць больш часу, чым дазволена. Калі неабходна, змяніце дырэктыву max_execution_time ў файле php.ini.",
562
  "SystemCheckTracker": "Статус адсочвання",
563
  "SystemCheckWarnDomHelp": "Вы павінны ўключыць пашырэнне \"dom\" (Напр., усталяваць пакеты \"php-dom\" і\/або \"php-xml\")",
543
  "SystemCheckGlobHelp": "Гэтая убудаваная функцыя адключана на вашым хосце. Matomo паспрабуе эмуляваць гэтую функцыю, але могуць паўстаць дадатковыя абмежаванні бяспекі. Функцыянальныя магчымасці могуць быць закрануты.",
544
  "SystemCheckGzcompressHelp": "Вам неабходна ўключыць пашырэнне zlib і функцыю gzcompress.",
545
  "SystemCheckGzuncompressHelp": "Вам неабходна ўключыць пашырэнне zlib і функцыю gzuncompress.",
 
546
  "SystemCheckMailHelp": "Функцыі водгукаў о Matomo і аднаўленне пароляў не будуць працаваць без mail().",
 
547
  "SystemCheckMemoryLimit": "Абмежаванне памяці",
548
  "SystemCheckMemoryLimitHelp": "На вэб-сайтах з высокім трафікам, працэс архівавання можа запатрабаваць больш памяці, чым дазволена. Пры неабходнасці, змяніце memory_limit дырэктыву ў файле php.ini.",
549
  "SystemCheckOpenURL": "адкрыць URL-адрас",
555
  "SystemCheckPdoAndMysqliHelp": "На Linux серверы вы можаце скампіляваць php з наступнымі параметрамі:%1$s у вашым php.ini, дадаць наступныя радкі: %2$s",
556
  "SystemCheckPhp": "Версія PHP",
557
  "SystemCheckPhpPdoAndMysqli": "Больш падрабязная інфармацыя па: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
 
558
  "SystemCheckTimeLimitHelp": "На вэб-сайтах з высокім трафікам, працэс архівавання можа спатрабаваць больш часу, чым дазволена. Калі неабходна, змяніце дырэктыву max_execution_time ў файле php.ini.",
559
  "SystemCheckTracker": "Статус адсочвання",
560
  "SystemCheckWarnDomHelp": "Вы павінны ўключыць пашырэнне \"dom\" (Напр., усталяваць пакеты \"php-dom\" і\/або \"php-xml\")",
app/lang/bg.json CHANGED
@@ -1088,9 +1088,7 @@
1088
  "SystemCheckGlobHelp": "Вградената функция е изключена от Вашият хостинг. Matomo ще се опитва да подражава на тази функция, но може да се сблъска с допълнителни ограничения за сигурност. Функционалността може да бъде засегната.",
1089
  "SystemCheckGzcompressHelp": "Трябва да активирате zlib и gzcompress разширенията.",
1090
  "SystemCheckGzuncompressHelp": "Трябва да активирате zlib и gzcompress разширенията.",
1091
- "SystemCheckIconvHelp": "Трябва да конфигурирате и възстановите PHP с \"iconv\" активна поддръжка, --with-iconc",
1092
  "SystemCheckMailHelp": "Модулите Обратна връзка и Забравена парола не биха работили без mail() функцията на PHP.",
1093
- "SystemCheckMbstring": "mbstring",
1094
  "SystemCheckMemoryLimit": "Лимит на паметта",
1095
  "SystemCheckMemoryLimitHelp": "За силно натоварените сайтове, времето за архивиране на данните отнема повече ресурси. Ако е необходимо моля редактирайте memory_limit директивата в php.ini.",
1096
  "SystemCheckOpenURL": "Отворен адрес(URL)",
@@ -1102,7 +1100,6 @@
1102
  "SystemCheckPdoAndMysqliHelp": "За Linux сървър компилирайте php със следните опции: %1$s във Вашия php.ini, добавете следните редове: %2$s",
1103
  "SystemCheckPhp": "PHP версия",
1104
  "SystemCheckPhpPdoAndMysqli": "Повече информация: %1$sPHP PDO%2$s и %3$sMYSQLI%4$s.",
1105
- "SystemCheckSplHelp": "Трябва да конфигурирате PHP - Standard PHP Library (SPL) да се поддържа (по подразбиране).",
1106
  "SystemCheckSummaryNoProblems": "Ура-а-а! Няма проблем с настройката на вашия Matomo. Успокойте се, всичко е наред.",
1107
  "SystemCheckSummaryThereWereWarnings": "Има проблеми, които засягат вашата система. Matomo ще работи, но може да срещнете някои дребни трудности при работа.",
1108
  "SystemCheckTimeLimitHelp": "За силно натоварените сайтове, времето за архивиране на данните отнема повече време. Ако е необходимо моля редактирайте max_execution_time директивата в php.ini файла.",
1088
  "SystemCheckGlobHelp": "Вградената функция е изключена от Вашият хостинг. Matomo ще се опитва да подражава на тази функция, но може да се сблъска с допълнителни ограничения за сигурност. Функционалността може да бъде засегната.",
1089
  "SystemCheckGzcompressHelp": "Трябва да активирате zlib и gzcompress разширенията.",
1090
  "SystemCheckGzuncompressHelp": "Трябва да активирате zlib и gzcompress разширенията.",
 
1091
  "SystemCheckMailHelp": "Модулите Обратна връзка и Забравена парола не биха работили без mail() функцията на PHP.",
 
1092
  "SystemCheckMemoryLimit": "Лимит на паметта",
1093
  "SystemCheckMemoryLimitHelp": "За силно натоварените сайтове, времето за архивиране на данните отнема повече ресурси. Ако е необходимо моля редактирайте memory_limit директивата в php.ini.",
1094
  "SystemCheckOpenURL": "Отворен адрес(URL)",
1100
  "SystemCheckPdoAndMysqliHelp": "За Linux сървър компилирайте php със следните опции: %1$s във Вашия php.ini, добавете следните редове: %2$s",
1101
  "SystemCheckPhp": "PHP версия",
1102
  "SystemCheckPhpPdoAndMysqli": "Повече информация: %1$sPHP PDO%2$s и %3$sMYSQLI%4$s.",
 
1103
  "SystemCheckSummaryNoProblems": "Ура-а-а! Няма проблем с настройката на вашия Matomo. Успокойте се, всичко е наред.",
1104
  "SystemCheckSummaryThereWereWarnings": "Има проблеми, които засягат вашата система. Matomo ще работи, но може да срещнете някои дребни трудности при работа.",
1105
  "SystemCheckTimeLimitHelp": "За силно натоварените сайтове, времето за архивиране на данните отнема повече време. Ако е необходимо моля редактирайте max_execution_time директивата в php.ini файла.",
app/lang/ca.json CHANGED
@@ -945,9 +945,7 @@
945
  "SystemCheckGlobHelp": "Aquesta funció s'ha deshabilitat al vostre host. El Matomo probarà d'emular aquesta funció però pot trobar-se amb altres restriccions de seguretat. Això impactarà a la funcionalitat.",
946
  "SystemCheckGzcompressHelp": "Heu d'activar l'extensió zlib i la funció gzcompress.",
947
  "SystemCheckGzuncompressHelp": "Heu d'activar l'extensió zlib i la funcció gzuncompress.",
948
- "SystemCheckIconvHelp": "Heu de configurar i tornar a contruir el PHP amb el suport per \"iconv\" activat, --with-iconv.",
949
  "SystemCheckMailHelp": "Les opinions i els missatges de pèrdua de la contrassenya no s'enviaran sense la funció mail().",
950
- "SystemCheckMbstring": "mbstring",
951
  "SystemCheckMemoryLimit": "Límit de memòria",
952
  "SystemCheckMemoryLimitHelp": "En un lloc web amb trànsit elevat, la creació de l'arxiu pot necessitar més memòria de l'acceptada actualment.<br \/>Feu una ullada al 'memory_limit' del vostre fitxer php.ini si és necessari.",
953
  "SystemCheckOpenURL": "Obre l'adreça",
@@ -959,7 +957,6 @@
959
  "SystemCheckPdoAndMysqliHelp": "En un servidor Linux podeu compilar el php amb les següents opcions: %1$s Al fitxer php.ini, afegiu les línies: %2$s",
960
  "SystemCheckPhp": "Versió del PHP",
961
  "SystemCheckPhpPdoAndMysqli": "Trobareu més informació a %1$sPHP PDO%2$s i %3$sMYSQLI%4$s.",
962
- "SystemCheckSplHelp": "Heu de configurar i recompilar el PHP amb la biblioteca Standard PHP Library (SPL) activada (per defecte).",
963
  "SystemCheckSummaryNoProblems": "Urra!! No hi ha cap problema amb la vostra configuració de Matomo.",
964
  "SystemCheckSummaryThereWereErrors": "Ohhh! El Matomo ha trobat algunes %1$s incidències crítiques %2$s amb la vostra configuració de Matomo. %3$s Aquestes incidències s'han de solucionar inmediatament. %4$s",
965
  "SystemCheckSummaryThereWereWarnings": "Hi ha alguna incidència amb el vostre sistema. El Matomo funcionarà, però podeu tenir alguns problemes menors.",
945
  "SystemCheckGlobHelp": "Aquesta funció s'ha deshabilitat al vostre host. El Matomo probarà d'emular aquesta funció però pot trobar-se amb altres restriccions de seguretat. Això impactarà a la funcionalitat.",
946
  "SystemCheckGzcompressHelp": "Heu d'activar l'extensió zlib i la funció gzcompress.",
947
  "SystemCheckGzuncompressHelp": "Heu d'activar l'extensió zlib i la funcció gzuncompress.",
 
948
  "SystemCheckMailHelp": "Les opinions i els missatges de pèrdua de la contrassenya no s'enviaran sense la funció mail().",
 
949
  "SystemCheckMemoryLimit": "Límit de memòria",
950
  "SystemCheckMemoryLimitHelp": "En un lloc web amb trànsit elevat, la creació de l'arxiu pot necessitar més memòria de l'acceptada actualment.<br \/>Feu una ullada al 'memory_limit' del vostre fitxer php.ini si és necessari.",
951
  "SystemCheckOpenURL": "Obre l'adreça",
957
  "SystemCheckPdoAndMysqliHelp": "En un servidor Linux podeu compilar el php amb les següents opcions: %1$s Al fitxer php.ini, afegiu les línies: %2$s",
958
  "SystemCheckPhp": "Versió del PHP",
959
  "SystemCheckPhpPdoAndMysqli": "Trobareu més informació a %1$sPHP PDO%2$s i %3$sMYSQLI%4$s.",
 
960
  "SystemCheckSummaryNoProblems": "Urra!! No hi ha cap problema amb la vostra configuració de Matomo.",
961
  "SystemCheckSummaryThereWereErrors": "Ohhh! El Matomo ha trobat algunes %1$s incidències crítiques %2$s amb la vostra configuració de Matomo. %3$s Aquestes incidències s'han de solucionar inmediatament. %4$s",
962
  "SystemCheckSummaryThereWereWarnings": "Hi ha alguna incidència amb el vostre sistema. El Matomo funcionarà, però podeu tenir alguns problemes menors.",
app/lang/cs.json CHANGED
@@ -639,18 +639,18 @@
639
  "ColumnActionURL": "URL akce",
640
  "ColumnClicks": "Prokliků",
641
  "ColumnClicksDocumentation": "Počet kliknutí na odkaz v závislosti na čase.",
642
- "ColumnDownloadURL": "URL stažení",
643
- "ColumnDownloadURLs": "Stažené adresy URL",
644
  "ColumnEntryPageTitle": "Titulek vstupní stránky",
645
  "ColumnEntryPageURL": "URL vstupní stránky",
646
  "ColumnEntryPageURLs": "URL vstupních stránek",
647
  "ColumnExitPageTitle": "Titulek výstupní stránky",
648
  "ColumnExitPageURL": "URL výstupní stránky",
649
- "ColumnExitPageURLs": "URL odchozích stránek",
650
  "ColumnNoResultKeyword": "Hledané klíčové slovo nebylo nalezeno",
651
  "ColumnPageName": "Jméno stránky",
652
- "ColumnPagesPerSearch": "Stránka hledaných výsledků",
653
- "ColumnPagesPerSearchDocumentation": "Návštěvník hledal na Vaší stránce a občas klikl na \"Další\" k zobrazení více výsledků. Toto je průměrné číslo stránky s výsledky vyhledávání zobrazené na toto klíčové slovo.",
654
  "ColumnPageURL": "URL stránky",
655
  "ColumnSearchCategory": "Hledání kategorie",
656
  "ColumnSearches": "Vyhledávání",
@@ -667,41 +667,41 @@
667
  "ColumnInteractionPosition": "Pozice interakce",
668
  "ColumnPageViewPosition": "Pozice zobrazení stránek",
669
  "ActionsInVisit": "Akce během návštěvy",
670
- "DownloadsReportDocumentation": "V tomto hlášení můžete vidět soubory, které byly staženy. %s Které Matomo počítá jako stažené jsou jen ty, na které bylo kliknuto. Bez ohledu na to, jestli bylo stažení dokončeno nebo přerušeno. To Matomo neumí zjistit.",
671
- "EntryPagesReportDocumentation": "Toto hlášení obsahuje informace o vstupních stránkách, které byly za dané časové období použity. Vstupní stránka je první stránka, kterou uživatel navštíví. %s URL jsou zobrazeny ve složkové struktuře.",
672
  "EntryPageTitles": "Titulky vstupních stránek",
673
  "EntryPageTitlesReportDocumentation": "Toto hlášení obsahuje informace o titulcích vstupních stránek, které byly použity v daném období.",
674
- "ExitPagesReportDocumentation": "Toto hlášení obsahujje informace o výstupních stránkách, které se za dané časové období vyskytly. Výstupní stránka je poslední stránka, kterou návštěvník během své návštěvy navštíví. %s URL jsou zobrazeny ve složkové struktuře.",
675
- "ExitPageTitles": "Titulky výstupních stránek",
676
- "ExitPageTitlesReportDocumentation": "Toto hlášení obsahuje informace o titulcích výstupních stránek za dané období.",
677
- "MainMetricsReportDocumentation": "Tento přehled poskytuje velmi základní přehled o tom, jaké akce vaši návštěvníci na vašem webu provádějí.",
678
  "OneSearch": "1 Vyhledávání",
679
- "OutlinkDocumentation": "Externí odkaz je odkaz, který vede z vašich stránek na jinou domén.",
680
- "OutlinksReportDocumentation": "Toto hlášení zobrazuje hyerarchický seznam URL externích odkazů, na které vaši návštěvníci klikli.",
681
- "PagesReportDocumentation": "Toto hlášení obsahuje informace o URL navštívených. %s Tabulka je organizována hyerarchicky jako strom složek.",
682
  "PageTitlesReportDocumentation": "Toto hlášení obsahuje informace o titulcích navštívených stránek. %1$s Titulek je HTML tag %2$s, který většina prohlížečů zobrazuje v titulku okna.",
683
  "PageUrls": "URL stránky",
684
  "PageViewsByVisitor": "Počet zobrazení této stránky návštěvníkem během všech návštěv",
685
  "PluginDescription": "Podává hlášení o zobrazení a titulcích stránek. Umožňuje měřit váš interní vyhledávač. Automaticky sleduje kliky na externí odkazy a soubory ke stažení.",
686
  "RevisitedPages": "Stránky navštívené více než jednou",
687
- "SiteSearchCategories1": "Toto hlášení shrnuje kategorie, které návštěvníci vybrali při vyhledávání na stránkách.",
688
- "SiteSearchCategories2": "Například elektronické obchody mívají filtr kategorií, aby mohli uzákazníci zvolit, ve které kategorii bude provedeno hledání.",
689
  "SiteSearchFollowingPagesDoc": "Když návštěvníci hledají na vašich stránkách, snaží se nalézt určitou stránku, obsah, produkt, nebo službu. Toto hlášení zobrazuje stránky, na které bylo klikáno nejčastěji po interním vyhledávání. Jinak řečeno, jedná se o stránky, které byly nejvíce hledány návštěvníky, kteří už byli na vašich stránkách.",
690
  "SiteSearchIntro": "Sledování vyhledávání na vašich stránkách je velmi efektivní způsob, jak se dozvědět více o tom, co vaši návštěvníci na stránkách hledají, jaký obsah by je mohl zajímat, jaké produkty by si mohli chtít koupit, a jak jim obecně zpříjemnit pobyt na vašich stránkách.",
691
  "SiteSearchCategory": "Kategorie (Vyhledávání na webu)",
692
  "SiteSearchCategories": "Kategorie (Vyhledávání na webu)",
693
- "SiteSearchKeyword": "Klíčová slova (Vyhledávání)",
694
  "SiteSearchKeywords": "Klíčová slova (vyhledávání na webu)",
695
  "SiteSearchKeywordCount": "Počet klíčových slov (Vyhledávání)",
696
  "SiteSearchKeywordCounts": "Počty klíčových slov (Vyhledávání)",
697
- "SiteSearchKeywordsDocumentation": "Toto hlášení shrnuje klíčová slova, která byla použita návštěvníky při hledání pomocí interního vyhledávače.",
698
- "SiteSearchKeywordsNoResultDocumentation": "Toto hlášení shrnuje klíčová slova, pro která nebyl vrácen žádný výsledek. Možná by bylo možné vylepšit vyhledávací algoritmus, nebo návštěvníci hledají něco, co (zatím) není na vašich stránkách?",
699
  "SubmenuPagesEntry": "Vstupní stránky",
700
  "SubmenuPagesExit": "Odchozí stránky",
701
  "SubmenuPageTitles": "Titulky stránek",
702
  "SubmenuSitesearch": "Vyhledat stránku",
703
- "WidgetEntryPageTitles": "Název titulky vstupní stránky",
704
- "WidgetExitPageTitles": "Název titulky odchozí stránky",
705
  "WidgetPagesEntry": "Vstupní stránky",
706
  "WidgetPagesExit": "Výstupní stránky",
707
  "WidgetPageTitles": "Titulky stránek",
@@ -713,8 +713,22 @@
713
  "ActionType": "Typ akce",
714
  "ActionTypes": "Typy akcí",
715
  "Behaviour": "Chování",
716
- "TimeSpentInReferringAction": "Čas strávený odkazující akci",
717
- "PagesSubcategoryHelp3": "Použijte ikonu plus a mínus vlevo od navigace."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
718
  },
719
  "Annotations": {
720
  "AddAnnotationsFor": "Přidat anotace k %s...",
@@ -1670,11 +1684,8 @@
1670
  "SystemCheckGzcompressHelp": "Musíte povolit rozšíření zlib a funkci gzcompress.",
1671
  "SystemCheckGzuncompressHelp": "Musíte povolit rozšíření zlib a funkci gzuncompress.",
1672
  "SystemCheckHashHelp": "Je nutné, aby jste znovu nakonfigurovali a sestavili PHP s povolenou podporou hash(), vynecháním volby --disable-hash.",
1673
- "SystemCheckIconvHelp": "Musíte nakonfigurovat a překompilovat PHP s podporou pro \"icont\", --with-iconv",
1674
  "SystemCheckJsonHelp": "Pro čtení a zápis dat JSON je pro Matomo nutné rozšíření php-json.",
1675
  "SystemCheckMailHelp": "Bez funkce mail(), nebudou odeslány zprávy s odezvou, nebo při zapomenutém heslu",
1676
- "SystemCheckMbstring": "mbstring",
1677
- "SystemCheckMbstringHelp": "Rozšíření mbstring je vyžadováno pro zpracování vícebajtových znaků v uživatelském rozhraní a odpovědích API. Zkontrolujte také, zda je parametr mbstring.func_overload je v php.ini nastaven na hodnotu „0“.",
1678
  "SystemCheckMemoryLimit": "Limit paměti",
1679
  "SystemCheckMemoryLimitHelp": "Na webech s vysokým provozem, může archivace vyžadovat více paměti něž je nyní povoleno.<br \/>Pokud je potřeba, podívejte se na direktivu memory_limit ve vašem souboru php.ini.",
1680
  "SystemCheckNoErrorsOrWarnings": "Nejsou zde žádné chyby nebo varování",
@@ -1690,7 +1701,6 @@
1690
  "SystemCheckPdoAndMysqliHelp": "Na GNU\/Linux systému můžete zkompilovat PHP s následujícími volbami: %1$s Přidejte následující řádky do php.ini: %2$s",
1691
  "SystemCheckPhp": "Verze PHP",
1692
  "SystemCheckPhpPdoAndMysqli": "Více informací na: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
1693
- "SystemCheckSplHelp": "Musíte překompilovat PHP s povolenou standardní PHP knihovou (ve výchozím stavu povolena).",
1694
  "SystemCheckSettings": "Požadovaná konfigurace PHP (php.ini)",
1695
  "SystemCheckSummaryNoProblems": "Hurááá! Nejsou zde žádné problémy s nastavením Matomou. Gratulujeme!",
1696
  "SystemCheckSummaryThereWereErrors": "Ajaj! Matomo zjistil %1$skritické problémy%2$s s nastavením instalace Matomou. %3$sTyto problémy musí být okamžitě vyřešeny.%4$s",
639
  "ColumnActionURL": "URL akce",
640
  "ColumnClicks": "Prokliků",
641
  "ColumnClicksDocumentation": "Počet kliknutí na odkaz v závislosti na čase.",
642
+ "ColumnDownloadURL": "Stažení URL",
643
+ "ColumnDownloadURLs": "Stáhnout adresy URL",
644
  "ColumnEntryPageTitle": "Titulek vstupní stránky",
645
  "ColumnEntryPageURL": "URL vstupní stránky",
646
  "ColumnEntryPageURLs": "URL vstupních stránek",
647
  "ColumnExitPageTitle": "Titulek výstupní stránky",
648
  "ColumnExitPageURL": "URL výstupní stránky",
649
+ "ColumnExitPageURLs": "URL výstupních stránek",
650
  "ColumnNoResultKeyword": "Hledané klíčové slovo nebylo nalezeno",
651
  "ColumnPageName": "Jméno stránky",
652
+ "ColumnPagesPerSearch": "Stránky s výsledky vyhledávání",
653
+ "ColumnPagesPerSearchDocumentation": "Návštěvníci budou hledat na vašem webu a někdy kliknutím na tlačítko „další“ zobrazíte další výsledky. Toto je průměrný počet stránek s výsledky vyhledávání zobrazených pro toto klíčové slovo.",
654
  "ColumnPageURL": "URL stránky",
655
  "ColumnSearchCategory": "Hledání kategorie",
656
  "ColumnSearches": "Vyhledávání",
667
  "ColumnInteractionPosition": "Pozice interakce",
668
  "ColumnPageViewPosition": "Pozice zobrazení stránek",
669
  "ActionsInVisit": "Akce během návštěvy",
670
+ "DownloadsReportDocumentation": "V tomto reportu můžete vidět soubory, které byly staženy. %s Matomo počítá jako stažené jen ty, na které bylo kliknuto. Bez ohledu na to, jestli bylo stažení dokončeno nebo přerušeno.",
671
+ "EntryPagesReportDocumentation": "Tento report obsahuje informace o vstupních stránkách, které byly za dané časové období použity. Vstupní stránka je první stránka, kterou uživatel navštíví. %s Vstupní URL jsou zobrazeny ve složkové struktuře.",
672
  "EntryPageTitles": "Titulky vstupních stránek",
673
  "EntryPageTitlesReportDocumentation": "Toto hlášení obsahuje informace o titulcích vstupních stránek, které byly použity v daném období.",
674
+ "ExitPagesReportDocumentation": "Toto hlášení obsahujje informace o výstupních stránkách, které se za dané časové období vyskytly. Výstupní stránka je poslední stránka, kterou návštěvník během své návštěvy navštíví. %s Výstupní URL jsou zobrazeny ve složkové struktuře.",
675
+ "ExitPageTitles": "Titulek výstupní stránky",
676
+ "ExitPageTitlesReportDocumentation": "Tento report obsahuje informace o titulcích výstupních stránek za dané období.",
677
+ "MainMetricsReportDocumentation": "Tento přehled poskytuje velmi základní přehled o tom, jaké akce návštěvníci na vašem webu provádějí.",
678
  "OneSearch": "1 Vyhledávání",
679
+ "OutlinkDocumentation": "Externí odkaz je odkaz, který vede pryč z vašich stránek (na jinou doménu).",
680
+ "OutlinksReportDocumentation": "Toto hlášení zobrazuje hyerarchický seznam externích URL, na které vaši návštěvníci klikli.",
681
+ "PagesReportDocumentation": "Tento report obsahuje informace o navštívených URL. %s Tabulka je organizována hyerarchicky jako strom složek.",
682
  "PageTitlesReportDocumentation": "Toto hlášení obsahuje informace o titulcích navštívených stránek. %1$s Titulek je HTML tag %2$s, který většina prohlížečů zobrazuje v titulku okna.",
683
  "PageUrls": "URL stránky",
684
  "PageViewsByVisitor": "Počet zobrazení této stránky návštěvníkem během všech návštěv",
685
  "PluginDescription": "Podává hlášení o zobrazení a titulcích stránek. Umožňuje měřit váš interní vyhledávač. Automaticky sleduje kliky na externí odkazy a soubory ke stažení.",
686
  "RevisitedPages": "Stránky navštívené více než jednou",
687
+ "SiteSearchCategories1": "Tento report shrnuje kategorie, které návštěvníci vybrali při vyhledávání na stránkách.",
688
+ "SiteSearchCategories2": "Například elektronické obchody mívají filtr kategorií, aby mohli zákazníci zvolit, ve které kategorii bude provedeno hledání.",
689
  "SiteSearchFollowingPagesDoc": "Když návštěvníci hledají na vašich stránkách, snaží se nalézt určitou stránku, obsah, produkt, nebo službu. Toto hlášení zobrazuje stránky, na které bylo klikáno nejčastěji po interním vyhledávání. Jinak řečeno, jedná se o stránky, které byly nejvíce hledány návštěvníky, kteří už byli na vašich stránkách.",
690
  "SiteSearchIntro": "Sledování vyhledávání na vašich stránkách je velmi efektivní způsob, jak se dozvědět více o tom, co vaši návštěvníci na stránkách hledají, jaký obsah by je mohl zajímat, jaké produkty by si mohli chtít koupit, a jak jim obecně zpříjemnit pobyt na vašich stránkách.",
691
  "SiteSearchCategory": "Kategorie (Vyhledávání na webu)",
692
  "SiteSearchCategories": "Kategorie (Vyhledávání na webu)",
693
+ "SiteSearchKeyword": "Klíčové slovo (Vyhledávání)",
694
  "SiteSearchKeywords": "Klíčová slova (vyhledávání na webu)",
695
  "SiteSearchKeywordCount": "Počet klíčových slov (Vyhledávání)",
696
  "SiteSearchKeywordCounts": "Počty klíčových slov (Vyhledávání)",
697
+ "SiteSearchKeywordsDocumentation": "Tento report shrnuje klíčová slova, která byla použita návštěvníky při hledání pomocí interního vyhledávače.",
698
+ "SiteSearchKeywordsNoResultDocumentation": "Toto hlášení shrnuje klíčová slova, pro která nebyl vrácen žádný výsledek. Možná by bylo možné vylepšit vyhledávací algoritmus, nebo návštěvníci hledají obsah, který (zatím) není na vašich stránkách?",
699
  "SubmenuPagesEntry": "Vstupní stránky",
700
  "SubmenuPagesExit": "Odchozí stránky",
701
  "SubmenuPageTitles": "Titulky stránek",
702
  "SubmenuSitesearch": "Vyhledat stránku",
703
+ "WidgetEntryPageTitles": "Titulky vstupní stránky",
704
+ "WidgetExitPageTitles": "Titulky výstupní stránky",
705
  "WidgetPagesEntry": "Vstupní stránky",
706
  "WidgetPagesExit": "Výstupní stránky",
707
  "WidgetPageTitles": "Titulky stránek",
713
  "ActionType": "Typ akce",
714
  "ActionTypes": "Typy akcí",
715
  "Behaviour": "Chování",
716
+ "TimeSpentInReferringAction": "Čas strávený v odkazující akci",
717
+ "PagesSubcategoryHelp1": "Tento report obsahuje informace o navštívených stránkách URL.",
718
+ "PagesSubcategoryHelp2": "Tabulka je uspořádána hierarchicky, adresy URL jsou zobrazeny jako struktura složek.",
719
+ "PagesSubcategoryHelp3": "Použijte ikonu plus a mínus vlevo k navigaci.",
720
+ "EntryPagesSubcategoryHelp1": "Tato sestava obsahuje informace o vstupních stránkách, které byly použity během zadaného období. Vstupní stránka je první stránka, kterou si uživatel prohlíží během své návštěvy.",
721
+ "EntryPagesSubcategoryHelp2": "Vstupní adresy URL se zobrazují jako struktura složek.",
722
+ "ExitPagesSubcategoryHelp1": "Tato sestava obsahuje informace o výstupních stránkách, které se objevily během zadaného období. Výstupní stránka je poslední stránka, kterou si uživatel prohlíží během své návštěvy.",
723
+ "ExitPagesSubcategoryHelp2": "Výstupní adresy URL se zobrazují jako struktura složek.",
724
+ "PageTitlesSubcategoryHelp1": "Tento report obsahuje informace o titulcích stránek, které byly navštíveny.",
725
+ "PageTitlesSubcategoryHelp2": "Titulek stránky je HTML &amp;lt;title&amp;gt; Štítek, který většina prohlížečů zobrazuje v názvu okna.",
726
+ "SiteSearchSubcategoryHelp1": "Sekce Vyhledávání stránek ukazuje, jaká klíčová slova návštěvníci používají při vyhledávání na vašem webu. Zobrazuje také, které stránky si uživatelé prohlížejí po provedení vyhledávání a která klíčová slova pro vyhledávání na webu nevracejí vůbec žádné výsledky.",
727
+ "SiteSearchSubcategoryHelp2": "Tyto přehledy vám mohou poskytnout představu o chybějícím obsahu na vašem webu, nahlédnout do toho, co vaši návštěvníci hledají a nemohou najít, atd.",
728
+ "SiteSearchSubcategoryHelp3": "Další informace naleznete v Site Search Guide.",
729
+ "OutlinksSubcategoryHelp1": "Tento přehled zobrazuje hierarchický seznam odchozích adres URL, na které klikli vaši návštěvníci. Externí link je odkaz, který vede návštěvníka pryč z vašeho webu (do jiné domény).",
730
+ "DownloadsSubcategoryHelp1": "V tomto přehledu uvidíte, které soubory si vaši návštěvníci stáhli.",
731
+ "DownloadsSubcategoryHelp2": "To, co Matomo počítá jako stahování, je kliknutí na odkaz ke stažení. Zda bylo stahování dokončeno nebo ne, Matomo neví."
732
  },
733
  "Annotations": {
734
  "AddAnnotationsFor": "Přidat anotace k %s...",
1684
  "SystemCheckGzcompressHelp": "Musíte povolit rozšíření zlib a funkci gzcompress.",
1685
  "SystemCheckGzuncompressHelp": "Musíte povolit rozšíření zlib a funkci gzuncompress.",
1686
  "SystemCheckHashHelp": "Je nutné, aby jste znovu nakonfigurovali a sestavili PHP s povolenou podporou hash(), vynecháním volby --disable-hash.",
 
1687
  "SystemCheckJsonHelp": "Pro čtení a zápis dat JSON je pro Matomo nutné rozšíření php-json.",
1688
  "SystemCheckMailHelp": "Bez funkce mail(), nebudou odeslány zprávy s odezvou, nebo při zapomenutém heslu",
 
 
1689
  "SystemCheckMemoryLimit": "Limit paměti",
1690
  "SystemCheckMemoryLimitHelp": "Na webech s vysokým provozem, může archivace vyžadovat více paměti něž je nyní povoleno.<br \/>Pokud je potřeba, podívejte se na direktivu memory_limit ve vašem souboru php.ini.",
1691
  "SystemCheckNoErrorsOrWarnings": "Nejsou zde žádné chyby nebo varování",
1701
  "SystemCheckPdoAndMysqliHelp": "Na GNU\/Linux systému můžete zkompilovat PHP s následujícími volbami: %1$s Přidejte následující řádky do php.ini: %2$s",
1702
  "SystemCheckPhp": "Verze PHP",
1703
  "SystemCheckPhpPdoAndMysqli": "Více informací na: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
 
1704
  "SystemCheckSettings": "Požadovaná konfigurace PHP (php.ini)",
1705
  "SystemCheckSummaryNoProblems": "Hurááá! Nejsou zde žádné problémy s nastavením Matomou. Gratulujeme!",
1706
  "SystemCheckSummaryThereWereErrors": "Ajaj! Matomo zjistil %1$skritické problémy%2$s s nastavením instalace Matomou. %3$sTyto problémy musí být okamžitě vyřešeny.%4$s",
app/lang/da.json CHANGED
@@ -1615,10 +1615,7 @@
1615
  "SystemCheckGzcompressHelp": "zlib udvidelsen og gzcompress funktionen skal aktiveres.",
1616
  "SystemCheckGzuncompressHelp": "zlib udvidelsen og gzuncompress funktionen skal aktiveres.",
1617
  "SystemCheckHashHelp": "Du mangler at konfigurere og genopbygge PHP med hash() understøttelse aktiveret ved at ekskludere valget --disable-hash.",
1618
- "SystemCheckIconvHelp": "PHP skal konfigureres og genstartes med \"iconv\" støtte aktiveret, --with-iconv.",
1619
  "SystemCheckMailHelp": "Tilbagemelding og Glemt adgangskode vil ikke blive sendt uden mail() funktion",
1620
- "SystemCheckMbstring": "mbstring",
1621
- "SystemCheckMbstringHelp": "Udvidelsen mbstring er krævet for at håndtere multibyte karakterer i brugergrænsefladen og i API responser. Tjek venligst også at mbstring.func_overload er sat til \"0\" i php.ini.",
1622
  "SystemCheckMemoryLimit": "Hukommelsesgrænse",
1623
  "SystemCheckMemoryLimitHelp": "På et stærkt trafikeret hjemmesider, kan arkiveringsprocessen kræve mere hukommelse end der er tilladt.<br \/>Se på memory_limit i php.ini filen hvis nødvendig.",
1624
  "SystemCheckNoErrorsOrWarnings": "Der er ingen fejl eller advarsler",
@@ -1634,7 +1631,6 @@
1634
  "SystemCheckPdoAndMysqliHelp": "På en linux-server kan php kompileres med følgende valg: %1$sn i php.ini, tilføj følgende linjer: %2$s",
1635
  "SystemCheckPhp": "PHP-version",
1636
  "SystemCheckPhpPdoAndMysqli": "Mere information på: %1$sPHP PDO%2$s og %3$sMYSQLI%4$s.",
1637
- "SystemCheckSplHelp": "Konfigurer og genstart PHP med standard-PHP-biblioteket (SPL) aktiveret (som standard).",
1638
  "SystemCheckSettings": "Obligatorisk PHP-konfiguration (php.ini)",
1639
  "SystemCheckSummaryNoProblems": "Sådan! Der er ingen problemer med din Matomo opsætning. Giv dig selv et klap på skulderen.",
1640
  "SystemCheckSummaryThereWereErrors": "Ups! Matomo har opdaget nogle %1$skritiske problemer%2$s med din Matomo opsætning. %3$sDisse problemer skal løses øjeblikkeligt.%4$s",
1615
  "SystemCheckGzcompressHelp": "zlib udvidelsen og gzcompress funktionen skal aktiveres.",
1616
  "SystemCheckGzuncompressHelp": "zlib udvidelsen og gzuncompress funktionen skal aktiveres.",
1617
  "SystemCheckHashHelp": "Du mangler at konfigurere og genopbygge PHP med hash() understøttelse aktiveret ved at ekskludere valget --disable-hash.",
 
1618
  "SystemCheckMailHelp": "Tilbagemelding og Glemt adgangskode vil ikke blive sendt uden mail() funktion",
 
 
1619
  "SystemCheckMemoryLimit": "Hukommelsesgrænse",
1620
  "SystemCheckMemoryLimitHelp": "På et stærkt trafikeret hjemmesider, kan arkiveringsprocessen kræve mere hukommelse end der er tilladt.<br \/>Se på memory_limit i php.ini filen hvis nødvendig.",
1621
  "SystemCheckNoErrorsOrWarnings": "Der er ingen fejl eller advarsler",
1631
  "SystemCheckPdoAndMysqliHelp": "På en linux-server kan php kompileres med følgende valg: %1$sn i php.ini, tilføj følgende linjer: %2$s",
1632
  "SystemCheckPhp": "PHP-version",
1633
  "SystemCheckPhpPdoAndMysqli": "Mere information på: %1$sPHP PDO%2$s og %3$sMYSQLI%4$s.",
 
1634
  "SystemCheckSettings": "Obligatorisk PHP-konfiguration (php.ini)",
1635
  "SystemCheckSummaryNoProblems": "Sådan! Der er ingen problemer med din Matomo opsætning. Giv dig selv et klap på skulderen.",
1636
  "SystemCheckSummaryThereWereErrors": "Ups! Matomo har opdaget nogle %1$skritiske problemer%2$s med din Matomo opsætning. %3$sDisse problemer skal løses øjeblikkeligt.%4$s",
app/lang/de.json CHANGED
@@ -16,6 +16,7 @@
16
  "Apply": "Anwenden",
17
  "ArchivingInlineHelp": "Für Websites mit mittlerem bis hohem Verkehrsaufkommen wird empfohlen, die durch den Browser ausgelöste Archivierung zu deaktivieren. Stattdessen wird empfohlen, dass Sie einen Cronjob aufsetzen, der die Berichte einmal pro Stunde abarbeitet.",
18
  "ArchivingTriggerDescription": "Für größere Matomo-Installationen sollten Sie %1$seinen Cronjob erstellen%2$s, der die Berichte automatisch abarbeitet.",
 
19
  "AuthenticationMethodSmtp": "Authentifizierungsmethode für SMTP",
20
  "AverageOrderValue": "Durchschnittlicher Bestellwert",
21
  "AveragePrice": "Durchschnittlicher Preis",
@@ -176,6 +177,8 @@
176
  "ExceptionDatabaseVersion": "Ihre %1$s-Version ist %2$s, aber Matomo benötigt mindestens %3$s",
177
  "ExceptionDatabaseVersionNewerThanCodebase": "Ihre Matomo Codebase läuft auf der alten Version %1$s und wir haben erkannt, dass Ihre Matomo Datenbank bereits auf die neuere Version %2$s aktualisiert wurde.",
178
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Möglicherweise sind die Matomo Administratoren gerade daran, den Aktualisierungsprozess abzuschließen. Bitte versuchen Sie es in ein paar Minuten noch einmal.",
 
 
179
  "ExceptionFileIntegrity": "Integritätsprüfung fehlgeschlagen: %s",
180
  "ExceptionFilesizeMismatch": "Unterschiedliche Dateigröße: %1$s (erwartete Größe: %2$s, gefunden: %3$s)",
181
  "ExceptionIncompatibleClientServerVersions": "Ihre %1$s-Client Version ist %2$s, die aber mit der Server-Version %3$s inkompatibel ist.",
@@ -211,6 +214,7 @@
211
  "ExceptionReportNotEnabled": "Der gesuchte Bericht ist nicht aktiviert. Das bedeutet normalerweise entweder, dass das Plugin, welches den Bericht definiert, deaktiviert ist oder Sie haben nicht die benötigten Berechtigungen, um diesen Bericht einzusehen.",
212
  "ExceptionWidgetNotEnabled": "Das gesuchte Widget ist nicht aktiviert. Das bedeutet normalerweise entweder, dass das Plugin, welches das Widget definiert, deaktiviert ist oder Sie haben nicht die benötigten Berechtigungen, um dieses Widget zu einzusehen.",
213
  "ExceptionNotSupportedBrowserTitle": "Ihr Browser wird nicht unterstützt",
 
214
  "ExpandDataTableFooter": "Ändern Sie die Darstellung oder konfigurieren den Bericht",
215
  "Export": "Export",
216
  "ExportAsImage": "Als Bild exportieren",
@@ -488,6 +492,7 @@
488
  "WarningFileIntegrityNoMd5file": "Durch die fehlende md5_file() Funktion konnte die Integritätsprüfung nicht durchgeführt werden.",
489
  "WarningPasswordStored": "%1$sWarnung:%2$s Dieses Passwort wird in der Konfigurationsdatei gespeichert und ist so für jeden sichtbar, der auf diese Datei Zugriff hat.",
490
  "WarningDebugOnDemandEnabled": "Der Tracker befindet sich im %1$s Modus. Aus Sicherheitsgründen sollte dieser nur für einen kurzen Zeitraum aktiv sein. Um Ihn zu deaktivieren setzen Sie %2$s auf %3$s in %4$s",
 
491
  "Website": "Website",
492
  "Weekly": "Wöchentlich",
493
  "WeeklyReport": "wöchentlich",
@@ -522,7 +527,8 @@
522
  "Custom": "Benutzerdefiniert",
523
  "PreviousPeriod": "Vorheriger Zeitraum",
524
  "PreviousYear": "vorheriges Jahr",
525
- "ViewAccessRequired": "Der verwendete token_auth hat zu viele Rechte, um für nicht-API URL Anfragen verwendet zu werden. Bitte verwenden Sie ein programmspezifisches Passwort für einen Benutzer, der ausschließlich über Ansichtszugriff verfügt."
 
526
  },
527
  "Mobile": {
528
  "AboutPiwikMobile": "Über Matomo Mobile",
@@ -718,10 +724,16 @@
718
  "PagesSubcategoryHelp1": "Dieser Bericht enthält Informationen über die Seiten URLs, welche besucht wurden.",
719
  "PagesSubcategoryHelp2": "Die Tabelle ist hierarchisch organisiert, die URLs werden als Verzeichnisstruktur angezeigt.",
720
  "PagesSubcategoryHelp3": "Benutzen Sie zur Navigation die Symbole Plus und Minus auf der linken Seite.",
 
721
  "EntryPagesSubcategoryHelp2": "Die Einstiegs-URLs werden als Verzeichnisstruktur angezeigt.",
 
722
  "ExitPagesSubcategoryHelp2": "Die Ausstiegs-URLs werden als Verzeichnisstruktur angezeigt.",
723
  "PageTitlesSubcategoryHelp1": "Dieser Bericht enthält Informationen über die Titel der Seiten, welche besucht wurden.",
 
 
 
724
  "SiteSearchSubcategoryHelp3": "Weitere Informationen finden Sie in der Anleitung zur internen Suche.",
 
725
  "DownloadsSubcategoryHelp1": "In diesem Bericht können Sie sehen, welche Dateien Ihre Besucher heruntergeladen haben.",
726
  "DownloadsSubcategoryHelp2": "Als Download zählt bei Matomo der Klick auf einen Download-Link. Ob der Download abgeschlossen wurde oder nicht, ist Matomo nicht bekannt."
727
  },
@@ -907,7 +919,24 @@
907
  "TrackingFailuresEmail1": "Dies ist nur um Sie wissen zu lassen, dass in den letzten Tagen %s verschiedene Arten von Tracking Fehlschlägen aufgetreten sind.",
908
  "TrackingFailuresEmail2": "%1$sHier klicken%2$s, um alle Tracking Fehlschläge anzuzeigen.",
909
  "ImportFromGoogleAnalytics": "Von Google Analytics importieren",
910
- "ImportFromGoogleAnalyticsDescription": "Wenn Sie über ein Google Analytics-Konto verfügen und zu Matomo wechseln, können Sie Ihre vorhandenen Daten mithilfe des %1$sGoogleAnalyticsImporter-Plugins%2$s importieren."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
911
  },
912
  "CoreHome": {
913
  "CategoryNoData": "Keine Daten in dieser Kategorie. Probieren Sie \"Gesamte Daten einbeziehen\"",
@@ -1015,6 +1044,7 @@
1015
  "CustomLimit": "Eigenes Limit",
1016
  "ExportFormat": "Exportformat",
1017
  "ExportTooltip": "Hinweis: Um die generierte Export-URL zu verwenden, müssen Sie einen Authentifizierungstoken angeben. Sie können diese Token unter Admin -> Sicherheit -> Authentifizierungstoken konfigurieren.",
 
1018
  "ExpandSubtables": "Erweitere Untertabellen",
1019
  "StandardReport": "Standard Bericht",
1020
  "FlattenReport": "Flacher Bericht",
@@ -1025,10 +1055,14 @@
1025
  "Profilable": "Profilierbar",
1026
  "SearchOnMatomo": "Suche '%1$s' auf Matomo.org",
1027
  "ReportingCategoryHelpPrefix": "Wie kann die \"%1$s > %2$s\" Berichtsseite mir helfen?",
 
1028
  "VisitorsCategoryHelp2": "Zusätzlich zu generellen Informationen über Ihre Besucher können Sie das %1$sBesucher-Log%2$sauch verwenden um zu sehen, was bei jedem individuellen Besuch passiert ist.",
1029
  "VisitorsOverviewHelp": "Die Besucherübersicht hilft Ihnen, die Popularität Ihrer Website zu verstehen. Dazu stellt sie Diagramme bereit, die zeigen, wie viele Besuche Ihre Website über einen ausgewählten Zeitraum erhält und wie hoch das durchschnittliche Engagement für wichtige Funktionen wie Suchen und Downloads ist.",
 
 
1030
  "EngagementSubcategoryHelp1": "Der Bereich \"Engagement\" bietet Berichte, die dabei helfen, zu quantifizieren, wie viele neue und wiederkehrende Besucher Sie haben. Sie können auch Berichte einsehen, die die durchschnittliche Zeit und Anzahl der Seiten pro Besuch aufschlüsseln, sowie die Anzahl der Besuche eines Besuchers auf Ihrer Website und die übliche Anzahl an Tagen zwischen den Besuchen.",
1031
- "EngagementSubcategoryHelp2": "Dies kann Ihnen helfen, neben der Maximierung Ihrer Reichweite auch die Häufigkeit und die Interaktionsrate zu optimieren."
 
1032
  },
1033
  "CorePluginsAdmin": {
1034
  "ActionUninstall": "Deinstallieren",
@@ -1214,7 +1248,9 @@
1214
  "ReceiveEmailBecauseIsSuperUser": "Sie erhalten diese E-Mail, weil Sie ein Super User folgender Matomo Installation sind: %s",
1215
  "ConvertToUtf8mb4": "Datenbank in den UTF8mb4 Zeichensatz konvertieren",
1216
  "TriggerDatabaseConversion": "Datenbankkonversion im Hintergrund ausführen",
1217
- "Utf8mb4ConversionHelp": "Ihre Datenbank verwendet aktuell nicht den utf8mb4 Zeichensatz. Dies verunmöglicht es, 4-Byte-Zeichen wie Emojis, wenig gebräuchliche Zeichen asiatischer Sprachen, diverse historische Schriftzeichen oder mathematische Symbole zu speichern. Diese werden im Moment mit %1$sersetzt. <br \/><br \/>Ihre Datenbank unterstützt den utf8mb4 Zeichensatz und es wäre möglich, sie zu konvertieren.<br \/><br \/>Wenn Sie in der Lage sind, Konsolenkommandos auszuführen, empfehlen wir Ihnen, den folgenden Befehl auszuführen: %2$s<br \/><br \/>Alternativ können Sie die Umwandlung hier aktivieren. Sie wird dann automatisch als planmäßige Aufgabe im Hintergrund durchgeführt. <br \/><br \/>Achtung: Die Datenbankkonvertierung kann einige Stunden dauern, abhängig von der Datenbankgröße. Da während dieser Zeit das Tracking möglicherweise nicht funktionieren wird, empfehlen wir für größere Installationen die Hintergrundkonvertierung nicht.<br \/><br \/>Sie finden mehr Informationen über dieses Thema in diesen %3$sFAQ%4$s."
 
 
1218
  },
1219
  "CustomDimensions": {
1220
  "CustomDimensions": "Benutzerdefinierte Dimensionen",
@@ -1415,7 +1451,13 @@
1415
  "CronArchivingRunDetails": "Bitte überprüfen Sie, ob Sie einen Crontab eingerichtet haben, der den %1$s Konsolenbefehl aufruft, und ob Sie einen %2$s konfiguriert haben, um Fehler per E-Mail zu erhalten, wenn die Archivierung fehlschlägt. Sie können auch versuchen, den Konsolenbefehl auszuführen, um Ihre Berichte manuell zu archivieren: %3$s. %4$s Mehr erfahren.%5$s",
1416
  "CronArchivingRanSuccessfullyXAgo": "Der Archivierungsprozess wurde vor %1$s erfolgreich abgeschlossen.",
1417
  "BrowserTriggeredArchivingEnabled": "Für eine optimale Leistung und ein schnelles Matomo wird dringend empfohlen, einen Crontab einzurichten, um Ihre Berichte automatisch zu archivieren und das Auslösen durch den Browser in den Matomo-Einstellungen zu deaktivieren. %1$sErfahren Sie mehr.%2$s",
1418
- "NoDataForReportArchivingNotRun": "Die Archivierung Ihrer Berichte wurde in letzter Zeit nicht durchgeführt, %1$serfahren Sie mehr darüber, wie Sie Ihre Berichte erzeugen können.%2$s"
 
 
 
 
 
 
1419
  },
1420
  "Ecommerce": {
1421
  "PluginDescription": "Mit E-Commerce haben Sie die Möglichkeit festzuhalten, dass ein Besucher Produkte in den Warenkorb legt, und wann es zu einem Verkauf kommt. Zusätzlich lassen sich auch Besuche von Produkt- sowie Kategorieseiten und verlassene Warenkörbe erfassen.",
@@ -1436,8 +1478,13 @@
1436
  "VisitorProfileLTV": "Generierter Gesamtumsatz von %1$s.",
1437
  "VisitorProfileItemsAndOrders": "%1$s Artikel in %2$s E-Commerce Bestellungen gekauft.",
1438
  "VisitorProfileAbandonedCartSummary": "%1$s verwaiste Warenkörbe mit %2$s Artikeln und einem Gesamtwert von %3$s.",
 
1439
  "EcommerceOverviewSubcategoryHelp2": "Klicken Sie auf eine einzelne Metrik innerhalb des Sparkline-Diagramms, um sie im Entwicklungsdiagramm in voller Größe zu betrachten.",
1440
- "EcommerceLogSubcategoryHelp2": "Die Daten auf dieser Seite werden in Echtzeit aktualisiert"
 
 
 
 
1441
  },
1442
  "Events": {
1443
  "PluginDescription": "Speichert Ereignisse und stellt Berichte über die Aktivität der Besucher bereit",
@@ -1479,7 +1526,7 @@
1479
  },
1480
  "Feedback": {
1481
  "DoYouHaveBugReportOrFeatureRequest": "Möchten Sie einen Fehler melden oder haben Sie eine Idee für eine neue Funktion?",
1482
- "HowToCreateTicket": "Bitte lesen Sie die Empfehlungen wie man eine gute %1$sFehlermeldung%2$s oder einen %3$sVerbesserungsvorschlag%4$s erstellt. Dann registrieren Sie sich oder loggen Sie sich bei %5$sunserem Fehlermeldesystem%6$s an und erstellen Sie einen %7$sneuen Fall%8$s.",
1483
  "IWantTo": "Ich möchte:",
1484
  "LearnWaysToParticipate": "Lernen Sie alle Möglichkeiten kennen, wie Sie %1$s uns unterstützen können%2$s",
1485
  "ManuallySendEmailTo": "Senden Sie Ihre Nachricht manuell an",
@@ -1492,6 +1539,7 @@
1492
  "RateFeatureTitle": "Gefällt Ihnen das Feature '%s'? Bitte bewerten Sie es und hinterlassen einen Kommentar!",
1493
  "SendFeedback": "Feedback absenden",
1494
  "ThankYou": "Danke für Ihre Unterstützung, Matomo zu verbessern!",
 
1495
  "TopLinkTooltip": "Teilen Sie uns Ihre Meinung mit, oder fordern professionelle Unterstützung an.",
1496
  "ViewAnswersToFAQ": "Antworten zu %1$sFrequently Asked Questions%2$s ansehen",
1497
  "FAQs": "FAQs",
@@ -1509,7 +1557,7 @@
1509
  "ContactUs": "Kontaktieren Sie uns",
1510
  "VisitTheForums": "Besuchen Sie die %1$s Foren%2$s und erhalten Sie Hilfe von der Matomo Community",
1511
  "Forums": "Forum",
1512
- "ReviewMatomoTitle": "Vertrauen Sie Matomo?",
1513
  "PleaseLeaveExternalReviewForMatomo": "Teilen Sie Ihre Überlegungen auf einer dieser Seiten und inspirieren Sie so andere, Ihrer Datenrevolution zu folgen.",
1514
  "RemindMeLater": "Erinnere mich später daran",
1515
  "NeverAskMeAgain": "Nie mehr fragen",
@@ -1520,7 +1568,13 @@
1520
  "PurgeOldData": "Ich möchte einige alte Daten entfernen",
1521
  "SearchHelpResources": "matomo.org Hilfequellen durchsuchen",
1522
  "PopularHelpTopics": "Beliebte Hilfethemen",
1523
- "ReferMatomo": "Matomo empfehlen"
 
 
 
 
 
 
1524
  },
1525
  "GeoIp2": {
1526
  "AssumingNonApache": "Die apache_get_modules Funktion wurde nicht gefunden. Es wird daher von einem Nicht-Apache Webserver ausgegangen.",
@@ -1837,6 +1891,7 @@
1837
  "SystemCheckEvalHelp": "Wird von HTML QuickForm und der Template-Engine Smarty benötigt.",
1838
  "SystemCheckExtensions": "Weitere erforderliche Anforderungen",
1839
  "SystemCheckFileIntegrity": "Dateiintegrität",
 
1840
  "SystemCheckFunctions": "Erforderliche Funktionen",
1841
  "SystemCheckFunctionHelp": "Sie müssen diese eingebaute Funktion aktivieren",
1842
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (graphics)",
@@ -1845,11 +1900,8 @@
1845
  "SystemCheckGzcompressHelp": "Sie müssen die zlib Erweiterung und die gzcompress Funktion aktivieren.",
1846
  "SystemCheckGzuncompressHelp": "Sie müssen die zlib Erweiterung und die gzuncompress Funktion aktivieren.",
1847
  "SystemCheckHashHelp": "Sie müssen PHP mit der hash() Funktionalität kompilieren, indem Sie die Option --disable-hash entfernen.",
1848
- "SystemCheckIconvHelp": "Sie müssen PHP mit \"iconv\" Unterstützung konfigurieren und neu bauen ( --with-iconv).",
1849
  "SystemCheckJsonHelp": "Die php-json Erweiterung wird von Matomo benötigt, um JSON Daten zu lesen und zu schreiben.",
1850
  "SystemCheckMailHelp": "Feedback und Nachrichten zu verlorenen Passwörtern können nicht ohne mail() versendet werden.",
1851
- "SystemCheckMbstring": "mbstring",
1852
- "SystemCheckMbstringHelp": "Die mbstring-Erweiterung wird benötigt, um multibyte-Zeichen in der Benutzeroberfläche und in den API-Antworten zu verarbeiten. Bitte überprüfen Sie ebenfalls, ob mbstring.func_overload in der php.ini auf \"0\" gesetzt ist.",
1853
  "SystemCheckMemoryLimit": "Speicherlimit",
1854
  "SystemCheckMemoryLimitHelp": "Auf einer stark frequentierten Website könnte es passieren, dass die Archivierung mehr Speicher erfordert als erlaubt. Falls erforderlich, ändern Sie den memory_limit Wert in ihrer php.ini Datei.",
1855
  "SystemCheckMemoryNoMemoryLimitSet": "Es ist kein Speicherlimit gesetzt",
@@ -1866,7 +1918,7 @@
1866
  "SystemCheckPdoAndMysqliHelp": "Auf einem Linux-Server können Sie PHP mit den folgenden Optionen kompilieren: %1$s In Ihrer php.ini fügen Sie dann die folgenden Zeilen ein: %2$s",
1867
  "SystemCheckPhp": "PHP-Version",
1868
  "SystemCheckPhpPdoAndMysqli": "Weitere Informationen unter: %1$sPHP PDO%2$s und %3$sMYSQLI%4$s.",
1869
- "SystemCheckSplHelp": "Sie müssen PHP mit standardmäßig aktivierter Standard PHP Bibliothek (SPL) konfigurieren und neu übersetzen.",
1870
  "SystemCheckSettings": "Benötigte PHP Konfiguration (php.ini)",
1871
  "SystemCheckSummaryNoProblems": "Gratulation! Es gibt keine Probleme mit Ihrer Matomo Installation. Sie können sich selbst auf die Schulter klopfen.",
1872
  "SystemCheckSummaryThereWereErrors": "Ohje! Matomo hat einige %1$skritische Fehler%2$s mit Ihrer Installation festgestellt. %3$sDiese sollten schnellstmöglich behoben werden.%4$s",
@@ -1876,7 +1928,9 @@
1876
  "SystemCheckTrackerHelp": "GET-Request zu matomo.php fehlgeschlagen. Versuchen Sie, diese URL in die Whitelist der HTTP-Authentifizierung aufzunehmen und deaktivieren Sie mod_security (ggf. müssen Sie hierzu Ihren Hoster kontaktieren). Nähere Informationen hierzu entnehmen Sie bitte dem Fehler-Log des Webservers.",
1877
  "SystemCheckWarnDomHelp": "Sie sollten die \"dom\" Erweiterung aktivieren (z.Bsp. installieren Sie das \"php-dom\" und\/oder das \"php-xml\" Paket).",
1878
  "SystemCheckWarning": "Matomo wird funktionieren, aber einige Funktionen werden fehlen",
 
1879
  "SystemCheckWarnLibXmlHelp": "Sie müssen die \"libxml\" Erweiterung aktivieren (z.B. installieren Sie das \"php-libxml\" Paket), wie es auch von anderen PHP-Erweiterungen benötigt wird.",
 
1880
  "SystemCheckWarnSimpleXMLHelp": "Sie sollten die \"SimpleXML\" Erweiterung aktivieren (z.Bsp. installieren Sie das \"php-simplexml\" und\/oder \"php-xml\" Paket).",
1881
  "SystemCheckWinPdoAndMysqliHelp": "Auf einem Windows-Server können Sie die folgenden Zeilen in Ihre php.ini einfügen: %s",
1882
  "SystemCheckWriteDirs": "Verzeichnisse mit Schreibzugriff",
@@ -3067,7 +3121,7 @@
3067
  "SimpleRealTimeWidget_Message": "%1$s und %2$s in den letzten %3$s.",
3068
  "ViewVisitorProfile": "Besucherprofil ansehen",
3069
  "DisableVisitorProfile": "Nur Besucherprofil deaktivieren",
3070
- "DisableVisitorProfileDescription": "Hier können Sie das Besucherprofil-Feature deaktivieren. Alle Besuche-Logs, welche auf dieses Feautre verweisen, werden weiterhin funktionieren.",
3071
  "VisitedPages": "Besuchte Seiten",
3072
  "RevisitedPages": "Seiten die mehrmals angesehen wurden",
3073
  "ToggleActions": "Sichtbarkeit aller Aktionen umschalten",
@@ -3097,6 +3151,8 @@
3097
  "ClickToSeeAllContents": "Klicken um sämtliche Inhaltsinteraktionen\/Impressionen zu sehen",
3098
  "VisitorLogSubcategoryHelp1": "Das Besuchsprotokoll zeigt Ihnen jeden Besuch, den Ihre Website erhält, im Detail an. Sie können sehen, welche Aktionen jeder Besucher durchgeführt hat, wie er auf Ihre Website gekommen ist, ein bisschen darüber, wer er ist, und mehr (unter Einhaltung Ihrer lokalen Datenschutzbestimmungen).",
3099
  "VisitorLogSubcategoryHelp2": "Während andere Berichte in Matomo zeigen, wie sich Ihre Besucher auf einer aggregierten Ebene verhalten, bietet das Besuchsprotokoll granulare Details. Sie können auch Segmente verwenden, um es auf bestimmte Arten von Besuchen einzugrenzen, um Ihre Besucher besser zu verstehen.",
 
 
3100
  "RealTimeHelp2": "Dieser Bericht wird alle 5 Sekunden aktualisiert und zeigt neue Besuche (oder vorhandene Besucher, die eine neue Seite aufrufen) am Anfang der Liste mit einem Einblendeffekt an."
3101
  },
3102
  "Login": {
@@ -3144,7 +3200,14 @@
3144
  "WrongPasswordEntered": "Bitte geben Sie das korrekte Passwort ein.",
3145
  "ConfirmPasswordToContinue": "Bitte bestätigen Sie Ihr Passwort um fortzufahren",
3146
  "PluginDescription": "Unterstützt Authentifizierung via Benutzername und Passwort sowie Password Reset Funktionalität. Die Authentifizierungsmethode kann durch ein anderes Login Plugin wie LoginLdap (verfügbar im Marketplace) geändert werden.",
3147
- "RememberMe": "Angemeldet bleiben"
 
 
 
 
 
 
 
3148
  },
3149
  "Marketplace": {
3150
  "ActivateLicenseKey": "Aktivieren",
@@ -3337,7 +3400,8 @@
3337
  "PluginDescription": "Sehen Sie Ihre Analysedaten als ein Overlay auf Ihrer aktuellen Website an. Lassen Sie sich anzeigen wie oft Ihre Benutzer auf welchen Link geklickt haben. Hinweis: Benötigt das Transitions-Plugin.",
3338
  "RedirectUrlError": "Sie versuchen, eine Seiten Overlay Sitzung für die URL \"%1$s\" zu starten. %2$s Keine der in den Matomo Einstellungen hinterlegten Domains passt zu diesem Link.",
3339
  "RedirectUrlErrorAdmin": "Sie können diese Domain %1$sin den Einstellungen%2$s als zusätzliche URL hinzufügen.",
3340
- "RedirectUrlErrorUser": "Bitten Sie Ihren Administrator diese Domain als zusätzliche URL hinzuzufügen."
 
3341
  },
3342
  "PagePerformance": {
3343
  "ColumnAveragePageLoadTime": "Durchschn. Seitenladezeit",
@@ -3376,7 +3440,9 @@
3376
  "HelpNote": "Einige dieser Metriken sind möglicherweise nicht immer verfügbar. Sie finden mehr Informationen darüber in unserem %1$sOnline Guide%2$s.",
3377
  "RowActionTitle": "Leistungsbericht für Seite öffnen",
3378
  "RowActionDescription": "Zeigt Seitenleistungsbericht für diese Zeile",
3379
- "PagePerformanceTitle": "Seitenleistung für Seite mit %1$s \"%2$s\""
 
 
3380
  },
3381
  "PrivacyManager": {
3382
  "AnonymizeData": "Daten anonymisieren",
@@ -3649,9 +3715,19 @@
3649
  "VisitorsFromDirectEntry": "Besucher von Direktzugriffen",
3650
  "VisitorsFromWebsites": "Besucher von Webseiten",
3651
  "VisitorsFromCampaigns": "Besucher von Kampagnen",
 
 
 
 
 
 
3652
  "WebsitesSubcategoryHelp1": "In dieser Tabelle können Sie sehen, welche Websites Besucher auf Ihre Website gelenkt haben.",
 
3653
  "SocialsSubcategoryHelp": "In dieser Tabelle können Sie sehen, welche Websites Besucher auf Ihre Website gelenkt haben.",
3654
- "EcommerceLogSubcategoryHelp2": "Die Daten auf dieser Seite werden in Echtzeit aktualisiert"
 
 
 
3655
  },
3656
  "Resolution": {
3657
  "ColumnConfiguration": "Konfiguration",
@@ -3779,7 +3855,7 @@
3779
  "UnprocessedSegmentInVisitorLog1": "%1$sEinstweilen können Sie das Visitor Log verwenden%2$s um zu testen ob Ihr Segment Ihre Benutzer korrekt erfasst, in dem Sie es dort anwenden.",
3780
  "UnprocessedSegmentInVisitorLog2": "Wenn angewandt, können Sie sofort sehen welche Besucher und Aktionen von Ihrem Segment betroffen sind.",
3781
  "UnprocessedSegmentInVisitorLog3": "Dies kann Ihnen helfen sicherzustellen, dass Ihr Segment die erwarteten Benutzer und Aktionen registriert.",
3782
- "UnprocessedSegmentApiError1": "Das Segment '%1$s' ist auf '%2$s' gesetzt, aber Matomo ist aktuell nicht konfiguriert um segmentierte Berichte in API Anfragen auszuführen.",
3783
  "UnprocessedSegmentApiError2": "Um in Zukunft Daten für diesen Bericht zu sehen, werden Sie Ihr Segment ändern müssen und die Option mit Namen '%s' anwählen.",
3784
  "UnprocessedSegmentApiError3": "Dann nach ein paar Stunden werden Ihre Segmentdaten über die API verfügbar sein. (Falls nicht, liegt ein Problem vor.)",
3785
  "CustomUnprocessedSegmentApiError1": "Das gesuchte Segment wurde noch nicht im Segment Editor erstellt und dementsprechend konnten die Berichtdaten nicht aufbereitet werden.",
@@ -3872,11 +3948,19 @@
3872
  "Sites": "Websites",
3873
  "SiteSearchUse": "Matomo kann auswerten, wonach Besucher in der internen Suche der Website suchen.",
3874
  "SiteWithoutDataTitle": "Es wurden bisher noch keine Daten gesammelt, untenstehendes Setup beachten",
 
3875
  "SiteWithoutDataSetupTracking": "Bitte fügen Sie den folgenden %1$sTracking Code%2$s auf ihrer Website ein, insofern Sie dies noch nicht getan haben.",
3876
  "SiteWithoutDataMessageDisappears": "Diese Nachricht wird verschwinden, sobald die ersten Daten für diese Website aufgezeichnet wurden.",
3877
  "SiteWithoutDataIgnoreMessage": "Diese Nachricht für eine Stunde verbergen",
 
3878
  "SiteWithoutDataOtherWays": "Andere Wege",
3879
  "SiteWithoutDataOtherIntegrations": "Andere Integrationen",
 
 
 
 
 
 
3880
  "SuperUserAccessCan": "Ein Nutzer mit Hauptadministrator-Berechtigung kann ebenfalls %1$sglobale Einstellungen%2$s für neue Websites vornehmen.",
3881
  "Timezone": "Zeitzone",
3882
  "TrackingSiteSearch": "Die interne Suche auswerten",
@@ -3888,6 +3972,8 @@
3888
  "OnlyMatchedUrlsAllowedHelp": "Wenn aktiviert zeichnet Matomo nur noch interne Aktionen auf bei denen die Seiten-URL eine der bekannten URLs der Website ist. Dies hindert andere daran Ihre Analyse mit URLs von anderen Websites zu verfälschen.",
3889
  "OnlyMatchedUrlsAllowedHelpExamples": "Domain und Pfadangabe müssen exakt übereinstimmen und jede gültige Subdomain muss separat definiert werden. Sind die bekannten URLs beispielsweise 'http:\/\/example.com\/path' und 'http:\/\/good.example.com', werden Tracking-Anfragen von 'http:\/\/example.com\/otherpath' oder 'http:\/\/bad.example.com' ignoriert.",
3890
  "WebsitesManagement": "Websiteverwaltung",
 
 
3891
  "XManagement": "%s verwalten",
3892
  "ChooseMeasurableTypeHeadline": "Was möchten Sie messen?",
3893
  "YouCurrentlyHaveAccessToNWebsites": "Sie haben derzeit Zugriff auf %s Websites.",
@@ -3900,7 +3986,8 @@
3900
  "EmailInstructionsSiteDetailsHeading": "Einzelheiten Ihrer Seite",
3901
  "EmailInstructionsSiteDetails": "Sie benötigen diese Angaben, um die API oder SDKs zum Verfolgen von Matomo-Besuchen zu verwenden.",
3902
  "EmailInstructionsYourSiteId": "Ihre Seiten-ID: %1$s",
3903
- "EmailInstructionsYourTrackingUrl": "Ihre Tracking-URL: %1$s"
 
3904
  },
3905
  "TagManager": {
3906
  "AddThisTagDescription": "Fügen Sie die AddThis Social Media Buttons und mehr zu Ihrer Website hinzu.",
@@ -4437,6 +4524,7 @@
4437
  "WeekdayVariableDescription": "Liefert den lokalen Wochentag, z. B. Montag, Dienstag, Mittwoch, ...",
4438
  "WeekdayVariableName": "Wochentag",
4439
  "WindowLeaveTriggerDescription": "Wird ausgelöst wenn der Benutzer daran ist die aktuelle Seite zu verlassen, indem die Maus ausserhalb des Fensters positioniert wird.",
 
4440
  "WindowLeaveTriggerName": "Fenster verlassen",
4441
  "WindowLoadedTriggerDescription": "Wird ausgelöst wenn die Seite mit allen Bildern usw. geladen wurde.",
4442
  "WindowLoadedTriggerHelp": "Diese Phase des Ladens ist wenn eine Seite für den Browser komplett geladen ist. In den meisten Fällen bedeutet das auch dass alle Bilder geladen sind und dass alle Style angewendet werden usw. Dieser Trigger wird immer irgendwann nach dem \"DOM Ready\" ausgelöst.",
@@ -4584,7 +4672,9 @@
4584
  "RecoveryCodesAllUsed": "Alle Recovery Codes wurden verwendet, es wird wärmstens empfohlen Ihre Recovery Codes zu regenerieren.",
4585
  "RecoveryCodesRegenerated": "Recovery Codes wurden regeneriert. Stellen Sie sicher, dass die neu generierten Codes heruntergeladen oder ausgedruckt werden.",
4586
  "GenerateNewRecoveryCodes": "Einen neuen Wiederherstellungscode generieren",
4587
- "GenerateNewRecoveryCodesInfo": "Wenn Sie neue Recovery Codes generieren, werden Ihre alten nicht mehr funktionieren. Stellen Sie sicher dass Sie die neuen Codes herunterladen oder ausdrucken."
 
 
4588
  },
4589
  "UserCountry": {
4590
  "CannotLocalizeLocalIP": "Die IP-Adresse %s ist eine lokale Adresse. Der Standort kann daher nicht ermittelt werden.",
@@ -4631,7 +4721,8 @@
4631
  "ToGeolocateOldVisits": "Für Standortdaten für vergangene Besuche verwenden Sie bitte das %1$shier beschriebene Skript%2$s.",
4632
  "WidgetLocation": "Besucherstandort",
4633
  "GeoIpDbIpAccuracyNote": "Bemerkung: Die DBIP Datenbanken sind frei und können automatisch heruntergeladen werden, aber Geolocation Resultate (insbesondere Städte-Resultate) sind nicht so akkurat wie die von MaxMind. Bei MaxMind hingegen benötigen Sie auch für die freie Geolocation Datenbank ein Benutzerkonto, Sie können den Prozess %1$shier%2$s starten",
4634
- "MaxMindLinkExplanation": "Wenn Sie die Geolocation Datenbanken von MaxMind verwenden und Sie nicht wissen wie Ihre Download URL zu generieren ist, %1$sklicken Sie hier um zu lernen wie%2$s."
 
4635
  },
4636
  "UserCountryMap": {
4637
  "PluginDescription": "Dieses Plugin stellt die Widgets \"Besucherkarte\" sowie \"Besucherkarte in Echtzeit\" bereit. Hinweis: Hierfür muss das Plugin \"UserCountry\" aktiviert sein.",
@@ -4656,7 +4747,8 @@
4656
  "WithUnknownRegion": "%s mit unbekannter Region",
4657
  "WithUnknownCity": "%s mit unbekannter Stadt",
4658
  "NoVisitsInfo": "Es werden aktuell keine Besuche angezeigt, weil für diesen Zeitraum kein Besuch mit korrekten Geolocation Informationen (Längengrad & Breitengrad) existiert.",
4659
- "NoVisitsInfo2": "Um das Problem zu lösen, stellen Sie sicher, dass Sie einen GeoIP Geolocation Provider mit einer GeoIP Stadt Datenbank verwenden. Wenn dies Ihr Problem nicht löst, dann ist es möglich (wenn auch unwahrscheinlich) dass Ihre Besuche IP Adressen haben, die nicht geolokalisiert werden können."
 
4660
  },
4661
  "UserId": {
4662
  "UserId": "Benutzer-ID",
@@ -4721,7 +4813,7 @@
4721
  "ExceptionEditAnonymous": "Der anonyme Benutzer kann nicht bearbeitet oder gelöscht werden. Er wird von Matomo benutzt, um einen Benutzer zu definieren, der sich noch nicht angemeldet hat. Zum Beispiel können Sie Ihre Statistiken öffentlich machen, indem Sie dem Benutzer 'anonymous' das Recht 'view' geben.",
4722
  "ExceptionEmailExists": "Ein Benutzer mit der E-Mail-Adresse '%s' existiert bereits.",
4723
  "ExceptionEmailExistsAsLogin": "Die E-Mail-Adresse '%s' wird bereits als Nutzername verwendet.",
4724
- "ExceptionLoginExistsAsEmail": "Der Nutername '%s' wird bereits als E-Mail-Adresse verwendet.",
4725
  "ExceptionInvalidEmail": "Die E-Mail-Adresse hat ein ungültiges Format.",
4726
  "ExceptionInvalidLoginFormat": "Der Benutzername muss zwischen %1$s und %2$s Zeichen lang sein und darf nur Buchstaben, Zahlen oder die Zeichen '_', '-', '.', '@' oder '+' enthalten.",
4727
  "ExceptionInvalidPassword": "Das Passwort muss mindestens %1$s Zeichen lang sein.",
@@ -4858,7 +4950,8 @@
4858
  "NewsletterSignupTitle": "Newsletter-Anmeldung",
4859
  "NewsletterSignupMessage": "Abonnieren Sie unseren Newsletter, um regelmäßig Informationen über Matomo zu erhalten. Deabonnieren ist jederzeit möglich. Dieser Dienst verwendet MadMimi. Erfahren Sie mehr in unserer %1$sDatenschutzerklärung%2$s.",
4860
  "NewsletterSignupFailureMessage": "Hoppla, etwas ist schief gelaufen. Wir konnten Sie nicht für unseren Newsletter registrieren.",
4861
- "NewsletterSignupSuccessMessage": "Super, Sie wurden erfolgreich registriert! Wir werden in Kürze von uns hören lassen."
 
4862
  },
4863
  "VisitFrequency": {
4864
  "ColumnActionsByNewVisits": "Aktionen bei neuen Besuchen",
16
  "Apply": "Anwenden",
17
  "ArchivingInlineHelp": "Für Websites mit mittlerem bis hohem Verkehrsaufkommen wird empfohlen, die durch den Browser ausgelöste Archivierung zu deaktivieren. Stattdessen wird empfohlen, dass Sie einen Cronjob aufsetzen, der die Berichte einmal pro Stunde abarbeitet.",
18
  "ArchivingTriggerDescription": "Für größere Matomo-Installationen sollten Sie %1$seinen Cronjob erstellen%2$s, der die Berichte automatisch abarbeitet.",
19
+ "ArchivingTriggerSegment": "Die Verwendung benutzerspezifischer Segmente wird weiterhin die Aufbereitung der Archive auslösen.",
20
  "AuthenticationMethodSmtp": "Authentifizierungsmethode für SMTP",
21
  "AverageOrderValue": "Durchschnittlicher Bestellwert",
22
  "AveragePrice": "Durchschnittlicher Preis",
177
  "ExceptionDatabaseVersion": "Ihre %1$s-Version ist %2$s, aber Matomo benötigt mindestens %3$s",
178
  "ExceptionDatabaseVersionNewerThanCodebase": "Ihre Matomo Codebase läuft auf der alten Version %1$s und wir haben erkannt, dass Ihre Matomo Datenbank bereits auf die neuere Version %2$s aktualisiert wurde.",
179
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Möglicherweise sind die Matomo Administratoren gerade daran, den Aktualisierungsprozess abzuschließen. Bitte versuchen Sie es in ein paar Minuten noch einmal.",
180
+ "ExceptionDatabaseUnavailable": "Der MySQL Server ist nicht mehr erreichbar",
181
+ "ExceptionDatabaseAccess": "Datenbankzugriff verweigert",
182
  "ExceptionFileIntegrity": "Integritätsprüfung fehlgeschlagen: %s",
183
  "ExceptionFilesizeMismatch": "Unterschiedliche Dateigröße: %1$s (erwartete Größe: %2$s, gefunden: %3$s)",
184
  "ExceptionIncompatibleClientServerVersions": "Ihre %1$s-Client Version ist %2$s, die aber mit der Server-Version %3$s inkompatibel ist.",
214
  "ExceptionReportNotEnabled": "Der gesuchte Bericht ist nicht aktiviert. Das bedeutet normalerweise entweder, dass das Plugin, welches den Bericht definiert, deaktiviert ist oder Sie haben nicht die benötigten Berechtigungen, um diesen Bericht einzusehen.",
215
  "ExceptionWidgetNotEnabled": "Das gesuchte Widget ist nicht aktiviert. Das bedeutet normalerweise entweder, dass das Plugin, welches das Widget definiert, deaktiviert ist oder Sie haben nicht die benötigten Berechtigungen, um dieses Widget zu einzusehen.",
216
  "ExceptionNotSupportedBrowserTitle": "Ihr Browser wird nicht unterstützt",
217
+ "ExceptionNotSupportedBrowserText": "Ihr Browser wird aus Sicherheitsgründen nicht unterstützt. Bitte aktualisieren Sie auf eine neuere Version.",
218
  "ExpandDataTableFooter": "Ändern Sie die Darstellung oder konfigurieren den Bericht",
219
  "Export": "Export",
220
  "ExportAsImage": "Als Bild exportieren",
492
  "WarningFileIntegrityNoMd5file": "Durch die fehlende md5_file() Funktion konnte die Integritätsprüfung nicht durchgeführt werden.",
493
  "WarningPasswordStored": "%1$sWarnung:%2$s Dieses Passwort wird in der Konfigurationsdatei gespeichert und ist so für jeden sichtbar, der auf diese Datei Zugriff hat.",
494
  "WarningDebugOnDemandEnabled": "Der Tracker befindet sich im %1$s Modus. Aus Sicherheitsgründen sollte dieser nur für einen kurzen Zeitraum aktiv sein. Um Ihn zu deaktivieren setzen Sie %2$s auf %3$s in %4$s",
495
+ "WarningDevelopmentModeOnButNotGitInstalled": "Sie verwenden Matomo aktuell im Entwicklermodus, aber es wurde nicht über git installiert. Es wird nicht empfohlen, den Entwicklermodus in produktiver Umgebung zu nutzen.",
496
  "Website": "Website",
497
  "Weekly": "Wöchentlich",
498
  "WeeklyReport": "wöchentlich",
527
  "Custom": "Benutzerdefiniert",
528
  "PreviousPeriod": "Vorheriger Zeitraum",
529
  "PreviousYear": "vorheriges Jahr",
530
+ "ViewAccessRequired": "Der verwendete token_auth hat zu viele Rechte, um für nicht-API URL Anfragen verwendet zu werden. Bitte verwenden Sie ein programmspezifisches Passwort für einen Benutzer, der ausschließlich über Ansichtszugriff verfügt.",
531
+ "Reasons": "Gründe"
532
  },
533
  "Mobile": {
534
  "AboutPiwikMobile": "Über Matomo Mobile",
724
  "PagesSubcategoryHelp1": "Dieser Bericht enthält Informationen über die Seiten URLs, welche besucht wurden.",
725
  "PagesSubcategoryHelp2": "Die Tabelle ist hierarchisch organisiert, die URLs werden als Verzeichnisstruktur angezeigt.",
726
  "PagesSubcategoryHelp3": "Benutzen Sie zur Navigation die Symbole Plus und Minus auf der linken Seite.",
727
+ "EntryPagesSubcategoryHelp1": "Dieser Bericht enthält Informationen über die Einstiegsseiten im gewählten Zeitraum. Die Einstiegsseite ist die erste Seite, die während eines Besuches aufgerufen wird.",
728
  "EntryPagesSubcategoryHelp2": "Die Einstiegs-URLs werden als Verzeichnisstruktur angezeigt.",
729
+ "ExitPagesSubcategoryHelp1": "Dieser Bericht enthält Informationen über die Ausstiegsseiten im gewählten Zeitraum. Die Ausstiegsseite ist die letzte Seite, die während eines Besuches aufgerufen wird.",
730
  "ExitPagesSubcategoryHelp2": "Die Ausstiegs-URLs werden als Verzeichnisstruktur angezeigt.",
731
  "PageTitlesSubcategoryHelp1": "Dieser Bericht enthält Informationen über die Titel der Seiten, welche besucht wurden.",
732
+ "PageTitlesSubcategoryHelp2": "Der Seitentitel ist der HTML <title> Tag, welcher von den meisten Browsern in deren Fenstertitel angezeigt wird.",
733
+ "SiteSearchSubcategoryHelp1": "Der Bereich \"Interne Suche\" zeigt, welche Suchworte Besucher verwenden, wenn sie auf Ihrer Webseite suchen. Er zeigt auch auf welche Seiten Benutzer gehen, nachdem sie gesucht haben und welche Suchbegriffe gar keine Resultate erzeugt hatten.",
734
+ "SiteSearchSubcategoryHelp2": "Dieser Bericht kann Ihnen Hinweise darauf geben, welche Inhalte auf Ihrer Seite eventuell fehlen, in dem er aufzeigt, was Ihre Besucher suchen, aber nicht so einfach finden.",
735
  "SiteSearchSubcategoryHelp3": "Weitere Informationen finden Sie in der Anleitung zur internen Suche.",
736
+ "OutlinksSubcategoryHelp1": "Dieser Bericht zeigt eine hierarchisch angeordnete Liste von ausgehenden Links, die von ihren Besuchern angeklickt wurden. Ein ausgehender Link ist ein Link, der den Besucher von Ihrer Webseite wegführt (zu einer anderen Domain).",
737
  "DownloadsSubcategoryHelp1": "In diesem Bericht können Sie sehen, welche Dateien Ihre Besucher heruntergeladen haben.",
738
  "DownloadsSubcategoryHelp2": "Als Download zählt bei Matomo der Klick auf einen Download-Link. Ob der Download abgeschlossen wurde oder nicht, ist Matomo nicht bekannt."
739
  },
919
  "TrackingFailuresEmail1": "Dies ist nur um Sie wissen zu lassen, dass in den letzten Tagen %s verschiedene Arten von Tracking Fehlschlägen aufgetreten sind.",
920
  "TrackingFailuresEmail2": "%1$sHier klicken%2$s, um alle Tracking Fehlschläge anzuzeigen.",
921
  "ImportFromGoogleAnalytics": "Von Google Analytics importieren",
922
+ "ImportFromGoogleAnalyticsDescription": "Wenn Sie über ein Google Analytics-Konto verfügen und zu Matomo wechseln, können Sie Ihre vorhandenen Daten mithilfe des %1$sGoogleAnalyticsImporter-Plugins%2$s importieren.",
923
+ "SecurityNotificationEmailSubject": "Sicherheitsbenachrichtigung",
924
+ "SecurityNotificationRecoveryCodesShowedBody": "Jemand hat sich die Wiederherstellungscodes Ihres Benutzerkontos für Zwei-Faktor-Authentifikation angeschaut.",
925
+ "SecurityNotificationRecoveryCodesRegeneratedBody": "Jemand hat neue Wiederherstellungscodes für Zwei-Faktor-Authentifikation für Ihr Benutzerkonto generiert.",
926
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Jemand hat die Zwei-Faktor-Authentifikation in Ihrem Benutzerkonto aktiviert.",
927
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Jemand hat die Zwei-Faktor-Authentifikation in Ihrem Benutzerkonto deaktiviert.",
928
+ "SecurityNotificationTokenAuthCreatedBody": "Jemand hat einen Authentifizierungs-Token (Beschreibung: %s) in Ihrem Benutzerkonto erstellt. Wenn Sie das nicht waren, löschen Sie den Token.",
929
+ "SecurityNotificationTokenAuthDeletedBody": "Jemand hat einen Authentifizierungs-Token (Beschreibung: %s) in Ihrem Benutzerkonto gelöscht.",
930
+ "SecurityNotificationAllTokenAuthDeletedBody": "Jemand hat alle Authentifizierungs-Token Ihres Benutzerkontos gelöscht.",
931
+ "SecurityNotificationSettingsChangedByUserBody": "Jemand hat die Systemeinstellungen verändert. Betroffene Einstellungen: %s.",
932
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Ein anderer Hauptadministrator (%1$s) hat die Systemeinstellungen verändert. Betroffene Einstellungen: %2$s. Wenn Sie die Aktivität nachvollziehen können, fahren Sie fort. Wenn nicht, kontaktieren Sie bitte den anderen Hauptadministrator.",
933
+ "SecurityNotificationUserCreatedBody": "Jemand hat einen neuen Benutzer (Login: %s) in Ihrem Benutzerkonto erstellt.",
934
+ "SecurityNotificationUserDeletedBody": "Jemand hat einen Benutzer (Login: %s) in Ihrem Benutzerkonto gelöscht.",
935
+ "SecurityNotificationIfItWasYou": "Wenn Sie das waren, fahren Sie fort. Wenn Sie sich über diese Aktivität nicht sicher sind, setzen Sie bitte Ihr Passwort zurück.",
936
+ "SecurityNotificationCheckTwoFactor": "Bitte prüfen Sie Ihre App oder Ihr Gerät zur Zwei-Faktor Authentifizierung.",
937
+ "BruteForce": "Brute Force",
938
+ "TwoFactorAuth": "Zwei-Faktor Authentifizierung",
939
+ "Cors": "CORS"
940
  },
941
  "CoreHome": {
942
  "CategoryNoData": "Keine Daten in dieser Kategorie. Probieren Sie \"Gesamte Daten einbeziehen\"",
1044
  "CustomLimit": "Eigenes Limit",
1045
  "ExportFormat": "Exportformat",
1046
  "ExportTooltip": "Hinweis: Um die generierte Export-URL zu verwenden, müssen Sie einen Authentifizierungstoken angeben. Sie können diese Token unter Admin -> Sicherheit -> Authentifizierungstoken konfigurieren.",
1047
+ "ExportTooltipWithLink": "Hinweis: Um die generierte Export URL zu verwenden, müssen Sie einen App Token Auth angeben. Sie können diese Token in %1$s[Admin -> Security -> Auths Tokens]%2$s konfigurieren. Ersetzen Sie %3$s in der Export URL durch Ihren Auth Token. Warnung: Niemals die URL mit dem effektiven Token jemandem weitergeben.",
1048
  "ExpandSubtables": "Erweitere Untertabellen",
1049
  "StandardReport": "Standard Bericht",
1050
  "FlattenReport": "Flacher Bericht",
1055
  "Profilable": "Profilierbar",
1056
  "SearchOnMatomo": "Suche '%1$s' auf Matomo.org",
1057
  "ReportingCategoryHelpPrefix": "Wie kann die \"%1$s > %2$s\" Berichtsseite mir helfen?",
1058
+ "VisitorsCategoryHelp1": "Die Besucherseiten sagen Ihnen Dinge darüber wer Ihre Besucher sind. Dinge wie woher Ihre Besucher kommen, welche Geräte und Browser sie verwenden und wann sie Ihre Webseite generell besuchen. Verstehen Sie, wer Ihr Publikum im Allgemeinen ist, und achten Sie auf Sonderfälle um zu sehen wie Ihr Publikum wachsen könnte.",
1059
  "VisitorsCategoryHelp2": "Zusätzlich zu generellen Informationen über Ihre Besucher können Sie das %1$sBesucher-Log%2$sauch verwenden um zu sehen, was bei jedem individuellen Besuch passiert ist.",
1060
  "VisitorsOverviewHelp": "Die Besucherübersicht hilft Ihnen, die Popularität Ihrer Website zu verstehen. Dazu stellt sie Diagramme bereit, die zeigen, wie viele Besuche Ihre Website über einen ausgewählten Zeitraum erhält und wie hoch das durchschnittliche Engagement für wichtige Funktionen wie Suchen und Downloads ist.",
1061
+ "DevicesSubcategoryHelp": "Der Gerätebereich hilft aufzuzeigen, welche Technologien Ihre Besucher verwenden, wenn Sie Ihre Seite besuchen. Sie werden Berichte der Gerätetypen und spezifische Modelle sehen, was Ihnen ermöglicht, Ihre Seite für die beliebtesten Geräte zu optimieren.",
1062
+ "SoftwareSubcategoryHelp": "Der Softwarebereich zeigt das Betriebssystem, Browser und Plugins welche Ihre Besucher verwenden, um Ihre Seite zu besuchen, sodass Sie Ihre Seite so optimieren können, dass sie mit den meisten Konfigurationen vollständig kompatibel ist.",
1063
  "EngagementSubcategoryHelp1": "Der Bereich \"Engagement\" bietet Berichte, die dabei helfen, zu quantifizieren, wie viele neue und wiederkehrende Besucher Sie haben. Sie können auch Berichte einsehen, die die durchschnittliche Zeit und Anzahl der Seiten pro Besuch aufschlüsseln, sowie die Anzahl der Besuche eines Besuchers auf Ihrer Website und die übliche Anzahl an Tagen zwischen den Besuchen.",
1064
+ "EngagementSubcategoryHelp2": "Dies kann Ihnen helfen, neben der Maximierung Ihrer Reichweite auch die Häufigkeit und die Interaktionsrate zu optimieren.",
1065
+ "PeriodHasOnlyRawData": "Anscheinend wurden für diesen Zeitbereich noch keine Berichte generiert. Möchten Sie sehen was aktuell passiert? Schauen Sie im %1$sBesucher-Log%2$s oder wählen Sie einen anderen Zeitbereich, bis die Berichte generiert sind."
1066
  },
1067
  "CorePluginsAdmin": {
1068
  "ActionUninstall": "Deinstallieren",
1248
  "ReceiveEmailBecauseIsSuperUser": "Sie erhalten diese E-Mail, weil Sie ein Super User folgender Matomo Installation sind: %s",
1249
  "ConvertToUtf8mb4": "Datenbank in den UTF8mb4 Zeichensatz konvertieren",
1250
  "TriggerDatabaseConversion": "Datenbankkonversion im Hintergrund ausführen",
1251
+ "Utf8mb4ConversionHelp": "Ihre Datenbank verwendet aktuell nicht den utf8mb4 Zeichensatz. Dies verunmöglicht es, 4-Byte-Zeichen wie Emojis, wenig gebräuchliche Zeichen asiatischer Sprachen, diverse historische Schriftzeichen oder mathematische Symbole zu speichern. Diese werden im Moment mit %1$sersetzt. <br \/><br \/>Ihre Datenbank unterstützt den utf8mb4 Zeichensatz und es wäre möglich, sie zu konvertieren.<br \/><br \/>Wenn Sie in der Lage sind, Konsolenkommandos auszuführen, empfehlen wir Ihnen, den folgenden Befehl auszuführen: %2$s<br \/><br \/>Alternativ können Sie die Umwandlung hier aktivieren. Sie wird dann automatisch als planmäßige Aufgabe im Hintergrund durchgeführt. <br \/><br \/>Achtung: Die Datenbankkonvertierung kann einige Stunden dauern, abhängig von der Datenbankgröße. Da während dieser Zeit das Tracking möglicherweise nicht funktionieren wird, empfehlen wir für größere Installationen die Hintergrundkonvertierung nicht.<br \/><br \/>Sie finden mehr Informationen über dieses Thema in diesen %3$sFAQ%4$s.",
1252
+ "SkipCacheClearDesc": "Überspringt das Leeren des Caches vor dem Aktualisieren. Das ist nur hilfreich, wenn Sie sicher sind, dass die Instanzen, welche diesen Befehl ausführen, noch gar keinen Cache erzeugt haben, und wenn das Leeren des Caches für viele Matomo Konten zu einem Ressourcen-Engpass führen kann.",
1253
+ "SkipCacheClear": "Cache leeren überspringen."
1254
  },
1255
  "CustomDimensions": {
1256
  "CustomDimensions": "Benutzerdefinierte Dimensionen",
1451
  "CronArchivingRunDetails": "Bitte überprüfen Sie, ob Sie einen Crontab eingerichtet haben, der den %1$s Konsolenbefehl aufruft, und ob Sie einen %2$s konfiguriert haben, um Fehler per E-Mail zu erhalten, wenn die Archivierung fehlschlägt. Sie können auch versuchen, den Konsolenbefehl auszuführen, um Ihre Berichte manuell zu archivieren: %3$s. %4$s Mehr erfahren.%5$s",
1452
  "CronArchivingRanSuccessfullyXAgo": "Der Archivierungsprozess wurde vor %1$s erfolgreich abgeschlossen.",
1453
  "BrowserTriggeredArchivingEnabled": "Für eine optimale Leistung und ein schnelles Matomo wird dringend empfohlen, einen Crontab einzurichten, um Ihre Berichte automatisch zu archivieren und das Auslösen durch den Browser in den Matomo-Einstellungen zu deaktivieren. %1$sErfahren Sie mehr.%2$s",
1454
+ "NoDataForReportArchivingNotRun": "Die Archivierung Ihrer Berichte wurde in letzter Zeit nicht durchgeführt, %1$serfahren Sie mehr darüber, wie Sie Ihre Berichte erzeugen können.%2$s",
1455
+ "RequiredPrivateDirectories": "Verzeichnisse, welche privat sein müssen",
1456
+ "PrivateDirectoryManualCheck": "Bitte öffnen Sie die URLs manuell in einem Browser um zu sehen, ob Sie Zugang dazu haben. Wenn Sie können, sollten Sie Ihre Serverkonfiguration so ändern, dass diese Dateien\/Verzeichnisse nicht via Browser aus dem Internet oder Intranet verfügbar sind.",
1457
+ "PrivateDirectoryInternetDisabled": "Wir konnten bei den folgenden URLs nicht prüfen, ob sie erreichbar sind, weil Internet Features aktuell auf dieser Matomo Installation deaktiviert sind.",
1458
+ "PrivateDirectoryIsAccessible": "Wir haben festgestellt, dass auf die oben aufgelisteten URLs über den Browser zugegriffen werden kann, was aber NICHT so sein sollte. Der Zugriff kann ein mögliches Sicherheitsrisiko darstellen, weil der Inhalt Informationen über Ihren Server und potenziell über Ihre Benutzer enthält. Bitte beschränken Sie den Zugriff auf diese URLs.",
1459
+ "ConfigIniAccessible": "Wir haben auch herausgefunden, dass Matomos Konfigurationsverzeichnis öffentlich zugänglich ist. Zwar können Angreifer die Konfigurationsdatei nicht lesen, jedoch sind Ihre MySQL Anmeldeinformationen und andere Informationen für jeden zugänglich, wenn Ihr Webserver aus irgend einem Grund aufhört, PHP Dateien auszuführen. Bitte prüfen Sie Ihre Webserverkonfiguration und verwehren Sie den Zugriff zu diesem Verzeichnis.",
1460
+ "AllPrivateDirectoriesAreInaccessible": "Alle privaten Verzeichnisse sind nicht aus dem Internet zugänglich."
1461
  },
1462
  "Ecommerce": {
1463
  "PluginDescription": "Mit E-Commerce haben Sie die Möglichkeit festzuhalten, dass ein Besucher Produkte in den Warenkorb legt, und wann es zu einem Verkauf kommt. Zusätzlich lassen sich auch Besuche von Produkt- sowie Kategorieseiten und verlassene Warenkörbe erfassen.",
1478
  "VisitorProfileLTV": "Generierter Gesamtumsatz von %1$s.",
1479
  "VisitorProfileItemsAndOrders": "%1$s Artikel in %2$s E-Commerce Bestellungen gekauft.",
1480
  "VisitorProfileAbandonedCartSummary": "%1$s verwaiste Warenkörbe mit %2$s Artikeln und einem Gesamtwert von %3$s.",
1481
+ "EcommerceOverviewSubcategoryHelp1": "Der E-Commerce Übersichtsbereich ist der beste Ort, um eine hochwertige Sicht über die Performance Ihres Shops zu erhalten. Auf einen Blick sehen Sie, wie viele Verkäufe Sie tätigen, wie viel Einnahmen Sie erzielen, und die Umsatzrate Ihrer Webseite.",
1482
  "EcommerceOverviewSubcategoryHelp2": "Klicken Sie auf eine einzelne Metrik innerhalb des Sparkline-Diagramms, um sie im Entwicklungsdiagramm in voller Größe zu betrachten.",
1483
+ "SalesSubcategoryHelp1": "Dieser Bereich enthält eine umfangreiche Sammlung von Berichten, um Ihnen bei der Analyse der unterschiedlichen Konditionen zu helfen, was am häufigsten zu Verkäufen führt, wie der Verkehr und Kampagnenursprung, Benutzerzeiten und Orte, sowie dafür verwendete Geräte.",
1484
+ "SalesSubcategoryHelp2": "Sie können auch lernen wie genau mit welcher Dimension Einnahmen generiert wurden, wie spezifische Verkehrstypen oder Tracking Kampagnen.",
1485
+ "EcommerceLogSubcategoryHelp1": "Das E-Commerce Log enthält detaillierte sessionbezogene Daten, sodass Sie die komplette Session jedes Benutzers nachverfolgen können, der einen Kauf getätigt oder abgebrochen hat. Dies kann helfen zu verstehen was Benutzer machen, bevor und nachdem Sie etwas kaufen, für die Verkaufsmöglichkeitenoptimierung.",
1486
+ "EcommerceLogSubcategoryHelp2": "Die Daten auf dieser Seite werden in Echtzeit aktualisiert",
1487
+ "ProductSubcategoryHelp": "Die Produkteansicht kann Ihnen dabei helfen Produkte und Kategorien zu identifizieren, die über- oder unterperformen, um Trends und Möglichkeiten im Bezug auf Ihre Produkteselektion und Verkaufsbereiche zu erkennen."
1488
  },
1489
  "Events": {
1490
  "PluginDescription": "Speichert Ereignisse und stellt Berichte über die Aktivität der Besucher bereit",
1526
  },
1527
  "Feedback": {
1528
  "DoYouHaveBugReportOrFeatureRequest": "Möchten Sie einen Fehler melden oder haben Sie eine Idee für eine neue Funktion?",
1529
+ "HowToCreateTicket": "Bitte lesen Sie die Empfehlungen wie man einen guten %1$sProblembericht%2$s oder einen %3$sVerbesserungsvorschlag%4$s erstellt. Dann registrieren Sie sich oder loggen Sie sich bei %5$sunserem Fehlermeldesystem%6$s an und erstellen Sie einen %7$sneuen Fall%8$s.",
1530
  "IWantTo": "Ich möchte:",
1531
  "LearnWaysToParticipate": "Lernen Sie alle Möglichkeiten kennen, wie Sie %1$s uns unterstützen können%2$s",
1532
  "ManuallySendEmailTo": "Senden Sie Ihre Nachricht manuell an",
1539
  "RateFeatureTitle": "Gefällt Ihnen das Feature '%s'? Bitte bewerten Sie es und hinterlassen einen Kommentar!",
1540
  "SendFeedback": "Feedback absenden",
1541
  "ThankYou": "Danke für Ihre Unterstützung, Matomo zu verbessern!",
1542
+ "ThankYouForSpreading": "Danke dafür, dass Sie uns weiterempfehlen und dazu beitragen, das Web sicherer zu machen.",
1543
  "TopLinkTooltip": "Teilen Sie uns Ihre Meinung mit, oder fordern professionelle Unterstützung an.",
1544
  "ViewAnswersToFAQ": "Antworten zu %1$sFrequently Asked Questions%2$s ansehen",
1545
  "FAQs": "FAQs",
1557
  "ContactUs": "Kontaktieren Sie uns",
1558
  "VisitTheForums": "Besuchen Sie die %1$s Foren%2$s und erhalten Sie Hilfe von der Matomo Community",
1559
  "Forums": "Forum",
1560
+ "ReviewMatomoTitle": "Mögen Sie Matomo?",
1561
  "PleaseLeaveExternalReviewForMatomo": "Teilen Sie Ihre Überlegungen auf einer dieser Seiten und inspirieren Sie so andere, Ihrer Datenrevolution zu folgen.",
1562
  "RemindMeLater": "Erinnere mich später daran",
1563
  "NeverAskMeAgain": "Nie mehr fragen",
1568
  "PurgeOldData": "Ich möchte einige alte Daten entfernen",
1569
  "SearchHelpResources": "matomo.org Hilfequellen durchsuchen",
1570
  "PopularHelpTopics": "Beliebte Hilfethemen",
1571
+ "ReferMatomo": "Matomo empfehlen",
1572
+ "ReferBannerTitle": "Konnte Matomo Sie überzeugen?",
1573
+ "ReferBannerLonger": "Bitte helfen Sie dabei, uns bekannt zu machen, damit mehr Leute Kontrolle über deren Analysedaten bekommen.",
1574
+ "ReferBannerEmailShareSubject": "Verweisen Sie sie jetzt auf Matomo Analytics, damit sie die Kontrolle zurückerhalten!",
1575
+ "ReferBannerEmailShareBody": "Ich verwende Matomo - eine ethische Alternative zu Google Analytics - welche mir 100%%Datenhoheit gibt und die Daten meiner Webseitenbesucher schützt.\nIch teile diese Nachricht in der Hoffnung das du dir die Macht von Google zurückholst und mit deinen eigenen Daten wie mit deinem anderen Eigentum umgehst.\n\nSchau dir Matomo an, auf https:\/\/matomo.org",
1576
+ "ReferBannerSocialShareText": "Wenn Sie Google Analytics verwenden, behalten Sie Kontrolle über Ihre Daten, in dem Sie jetzt auf eine ethische Alternative wie Matomo wechseln!",
1577
+ "WontShowAgain": "Wir werden diese Nachricht nicht mehr anzeigen."
1578
  },
1579
  "GeoIp2": {
1580
  "AssumingNonApache": "Die apache_get_modules Funktion wurde nicht gefunden. Es wird daher von einem Nicht-Apache Webserver ausgegangen.",
1891
  "SystemCheckEvalHelp": "Wird von HTML QuickForm und der Template-Engine Smarty benötigt.",
1892
  "SystemCheckExtensions": "Weitere erforderliche Anforderungen",
1893
  "SystemCheckFileIntegrity": "Dateiintegrität",
1894
+ "SystemCheckFilterHelp": "Sie müssen PHP mit aktiviertem \"filter\" Support (--disable-filter nicht verwenden) konfigurieren und neu starten.",
1895
  "SystemCheckFunctions": "Erforderliche Funktionen",
1896
  "SystemCheckFunctionHelp": "Sie müssen diese eingebaute Funktion aktivieren",
1897
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (graphics)",
1900
  "SystemCheckGzcompressHelp": "Sie müssen die zlib Erweiterung und die gzcompress Funktion aktivieren.",
1901
  "SystemCheckGzuncompressHelp": "Sie müssen die zlib Erweiterung und die gzuncompress Funktion aktivieren.",
1902
  "SystemCheckHashHelp": "Sie müssen PHP mit der hash() Funktionalität kompilieren, indem Sie die Option --disable-hash entfernen.",
 
1903
  "SystemCheckJsonHelp": "Die php-json Erweiterung wird von Matomo benötigt, um JSON Daten zu lesen und zu schreiben.",
1904
  "SystemCheckMailHelp": "Feedback und Nachrichten zu verlorenen Passwörtern können nicht ohne mail() versendet werden.",
 
 
1905
  "SystemCheckMemoryLimit": "Speicherlimit",
1906
  "SystemCheckMemoryLimitHelp": "Auf einer stark frequentierten Website könnte es passieren, dass die Archivierung mehr Speicher erfordert als erlaubt. Falls erforderlich, ändern Sie den memory_limit Wert in ihrer php.ini Datei.",
1907
  "SystemCheckMemoryNoMemoryLimitSet": "Es ist kein Speicherlimit gesetzt",
1918
  "SystemCheckPdoAndMysqliHelp": "Auf einem Linux-Server können Sie PHP mit den folgenden Optionen kompilieren: %1$s In Ihrer php.ini fügen Sie dann die folgenden Zeilen ein: %2$s",
1919
  "SystemCheckPhp": "PHP-Version",
1920
  "SystemCheckPhpPdoAndMysqli": "Weitere Informationen unter: %1$sPHP PDO%2$s und %3$sMYSQLI%4$s.",
1921
+ "SystemCheckSessionHelp": "Sie müssen PHP mit aktiviertem \"session\" Support (--disable-session nicht verwenden) konfigurieren und neu starten.",
1922
  "SystemCheckSettings": "Benötigte PHP Konfiguration (php.ini)",
1923
  "SystemCheckSummaryNoProblems": "Gratulation! Es gibt keine Probleme mit Ihrer Matomo Installation. Sie können sich selbst auf die Schulter klopfen.",
1924
  "SystemCheckSummaryThereWereErrors": "Ohje! Matomo hat einige %1$skritische Fehler%2$s mit Ihrer Installation festgestellt. %3$sDiese sollten schnellstmöglich behoben werden.%4$s",
1928
  "SystemCheckTrackerHelp": "GET-Request zu matomo.php fehlgeschlagen. Versuchen Sie, diese URL in die Whitelist der HTTP-Authentifizierung aufzunehmen und deaktivieren Sie mod_security (ggf. müssen Sie hierzu Ihren Hoster kontaktieren). Nähere Informationen hierzu entnehmen Sie bitte dem Fehler-Log des Webservers.",
1929
  "SystemCheckWarnDomHelp": "Sie sollten die \"dom\" Erweiterung aktivieren (z.Bsp. installieren Sie das \"php-dom\" und\/oder das \"php-xml\" Paket).",
1930
  "SystemCheckWarning": "Matomo wird funktionieren, aber einige Funktionen werden fehlen",
1931
+ "SystemCheckWarnJsonHelp": "Sie sollten die \"json\" Erweiterung aktivieren (z. B. das \"php-json\" Package installieren).",
1932
  "SystemCheckWarnLibXmlHelp": "Sie müssen die \"libxml\" Erweiterung aktivieren (z.B. installieren Sie das \"php-libxml\" Paket), wie es auch von anderen PHP-Erweiterungen benötigt wird.",
1933
+ "SystemCheckWarnOpensslHelp": "Sie sollten die \"openssl\" Erweiterung aktivieren, um sichere Updates zu ermöglichen.",
1934
  "SystemCheckWarnSimpleXMLHelp": "Sie sollten die \"SimpleXML\" Erweiterung aktivieren (z.Bsp. installieren Sie das \"php-simplexml\" und\/oder \"php-xml\" Paket).",
1935
  "SystemCheckWinPdoAndMysqliHelp": "Auf einem Windows-Server können Sie die folgenden Zeilen in Ihre php.ini einfügen: %s",
1936
  "SystemCheckWriteDirs": "Verzeichnisse mit Schreibzugriff",
3121
  "SimpleRealTimeWidget_Message": "%1$s und %2$s in den letzten %3$s.",
3122
  "ViewVisitorProfile": "Besucherprofil ansehen",
3123
  "DisableVisitorProfile": "Nur Besucherprofil deaktivieren",
3124
+ "DisableVisitorProfileDescription": "Hier können Sie das Besucherprofil-Feature deaktivieren. Alle Besuche-Logs, welche auf dieses Feature verweisen, werden weiterhin funktionieren.",
3125
  "VisitedPages": "Besuchte Seiten",
3126
  "RevisitedPages": "Seiten die mehrmals angesehen wurden",
3127
  "ToggleActions": "Sichtbarkeit aller Aktionen umschalten",
3151
  "ClickToSeeAllContents": "Klicken um sämtliche Inhaltsinteraktionen\/Impressionen zu sehen",
3152
  "VisitorLogSubcategoryHelp1": "Das Besuchsprotokoll zeigt Ihnen jeden Besuch, den Ihre Website erhält, im Detail an. Sie können sehen, welche Aktionen jeder Besucher durchgeführt hat, wie er auf Ihre Website gekommen ist, ein bisschen darüber, wer er ist, und mehr (unter Einhaltung Ihrer lokalen Datenschutzbestimmungen).",
3153
  "VisitorLogSubcategoryHelp2": "Während andere Berichte in Matomo zeigen, wie sich Ihre Besucher auf einer aggregierten Ebene verhalten, bietet das Besuchsprotokoll granulare Details. Sie können auch Segmente verwenden, um es auf bestimmte Arten von Besuchen einzugrenzen, um Ihre Besucher besser zu verstehen.",
3154
+ "VisitorLogSubcategoryHelp3": "Weitere Informationen finden Sie in der Anleitung zum Besucherlog.",
3155
+ "RealTimeHelp1": "Der Echtzeitbesuche-Bericht zeigen die Besucherströme Ihrer Webseite in Echtzeit. Er enthält einen Echtzeitzähler Ihrer Besuche und Seitenansichten in den letzten 24 Stunden und den letzten 30 Minuten.",
3156
  "RealTimeHelp2": "Dieser Bericht wird alle 5 Sekunden aktualisiert und zeigt neue Besuche (oder vorhandene Besucher, die eine neue Seite aufrufen) am Anfang der Liste mit einem Einblendeffekt an."
3157
  },
3158
  "Login": {
3200
  "WrongPasswordEntered": "Bitte geben Sie das korrekte Passwort ein.",
3201
  "ConfirmPasswordToContinue": "Bitte bestätigen Sie Ihr Passwort um fortzufahren",
3202
  "PluginDescription": "Unterstützt Authentifizierung via Benutzername und Passwort sowie Password Reset Funktionalität. Die Authentifizierungsmethode kann durch ein anderes Login Plugin wie LoginLdap (verfügbar im Marketplace) geändert werden.",
3203
+ "RememberMe": "Angemeldet bleiben",
3204
+ "SuspiciousLoginAttemptsInLastHourEmailSubject": "Wir haben verdächtige Anmeldeversuche bei Ihrem Benutzerkonto festgestellt...",
3205
+ "SuspiciousLoginAttemptsInLastHourEmail1": "Wir haben eine verdächtig hohe Anzahl von Anmeldeversuchen bei Ihrem Matomo Benutzerkonto in der letzten Stunde festgestellt, speziell %1$sAnmeldeversuche von %2$sunterschiedlichen IP-Adressen. Wir vermuten, dass jemand versucht, Ihr Benutzerkonto zu hacken.",
3206
+ "SuspiciousLoginAttemptsInLastHourEmail2": "Um Matomo abzusichern, empfehlen wir, folgende Vorsichtsmaßnahmen vorzunehmen:",
3207
+ "SuspiciousLoginAttemptsInLastHourEmail3": "Stellen Sie sicher, dass Sie ein sicheres Passwort verwenden, zufällig generiert und mit einer angemessenen Länge (zum Beispiel mindestens 30 Zeichen).",
3208
+ "SuspiciousLoginAttemptsInLastHourEmail4": "Installieren und aktivieren Sie Zwei-Faktor-Authentifizierung, sodass Angreifer mehr Informationen als nur Ihr Passwort benötigen um sich einzuloggen.",
3209
+ "SuspiciousLoginAttemptsInLastHourEmail5": "Zusätzlich dazu, wenn Ihr Matomo eine limitierte Anzahl von Benutzern oder IP Adressen verwendet durch die Zugriff nötig ist, kann es sinnvoll sein, eine Liste mit erlaubten IP Adressen zu definieren. %1$sWeitere Informationen dazu in unserer Dokumentation%2$s",
3210
+ "LoginNotAllowedBecauseUserLoginBlocked": "Die Login Funktionalität wurde temporär deaktiviert weil wir eine verdächtige hohe Anzahl fehlgeschlagener Anmeldeversuche in der letzten Stunde registriert haben."
3211
  },
3212
  "Marketplace": {
3213
  "ActivateLicenseKey": "Aktivieren",
3400
  "PluginDescription": "Sehen Sie Ihre Analysedaten als ein Overlay auf Ihrer aktuellen Website an. Lassen Sie sich anzeigen wie oft Ihre Benutzer auf welchen Link geklickt haben. Hinweis: Benötigt das Transitions-Plugin.",
3401
  "RedirectUrlError": "Sie versuchen, eine Seiten Overlay Sitzung für die URL \"%1$s\" zu starten. %2$s Keine der in den Matomo Einstellungen hinterlegten Domains passt zu diesem Link.",
3402
  "RedirectUrlErrorAdmin": "Sie können diese Domain %1$sin den Einstellungen%2$s als zusätzliche URL hinzufügen.",
3403
+ "RedirectUrlErrorUser": "Bitten Sie Ihren Administrator diese Domain als zusätzliche URL hinzuzufügen.",
3404
+ "ErrorNoSiteUrls": "WARNUNG: Diese Webseite hat in Matomo keine Seiten URLs definiert. Das kann beim Overlay und anderen Features zu unerwarteten Nebeneffekten führen oder sie unbrauchbar machen. Um das zu korrigieren, fügen Sie für diese Webseite eine URL in den Einstellungen im Matomo Administrationsbereich ein."
3405
  },
3406
  "PagePerformance": {
3407
  "ColumnAveragePageLoadTime": "Durchschn. Seitenladezeit",
3440
  "HelpNote": "Einige dieser Metriken sind möglicherweise nicht immer verfügbar. Sie finden mehr Informationen darüber in unserem %1$sOnline Guide%2$s.",
3441
  "RowActionTitle": "Leistungsbericht für Seite öffnen",
3442
  "RowActionDescription": "Zeigt Seitenleistungsbericht für diese Zeile",
3443
+ "PagePerformanceTitle": "Seitenleistung für Seite mit %1$s \"%2$s\"",
3444
+ "PerformanceSubcategoryHelp1": "Der Performance Bereich kann Ihnen helfen herauszufinden, wie schnell Ihre Webseite insgesamt ist und zeigt auf, ob spezifische Seiten signifikant vom Durchschnitt abweichen.",
3445
+ "PerformanceSubcategoryHelp2": "Sie finden auch Berichte, welche exakt zeigen, wie lang welche Seite auf Ihrer Webseite braucht, um zu laden und was zur Ladezeit wie viel beisteuert."
3446
  },
3447
  "PrivacyManager": {
3448
  "AnonymizeData": "Daten anonymisieren",
3715
  "VisitorsFromDirectEntry": "Besucher von Direktzugriffen",
3716
  "VisitorsFromWebsites": "Besucher von Webseiten",
3717
  "VisitorsFromCampaigns": "Besucher von Kampagnen",
3718
+ "ReferrersOverviewSubcategoryHelp1": "Die Aquisitionsübersicht zeigt Ihnen den Prozentsatz Ihres Datenverkehrs von allen Quellen über einen ausgewählten Zeitbereich.",
3719
+ "ReferrersOverviewSubcategoryHelp2": "Sie können auch auf einen spezifischen Kanal klicken um ihn mit dem Evolution Graph anzuzeigen. Das kann helfen zu entdecken welche Kanäle den meisten Datenverkehr auf Ihre Seite erzeugen wie auch potenzielle Muster über die Zeit hinweg aufzeigen. Zum Beispiel, dass ein bestimmter Kanal an Wochenenden besser funktioniert.",
3720
+ "AllReferrersSubcategory1": "Dieser Bereich zeigt die Anzahl der Besuche welche von verschiedenen Kanaltypen und Referrers zu Ihnen kommen. Klicken Sie auf den Plus oder Minus Button um sich die Referrer pro Typ anzeigen zu lassen.",
3721
+ "AllReferrersSubcategory2": "Sie können auch die Anzahl der ausgeführten Aktionen Ihrer Datenverkehrsquellen analysieren, in dem Sie die Tabelle mit der Ansicht der Besucherengagements aktivieren.",
3722
+ "SearchEnginesSubcategoryHelp1": "Dieser Bereich hilft Ihnen beim Analysieren Ihrer Suchmaschinenoptimierung und -performance. Sie können Ihre beliebtesten Suchworte analysieren mit Hilfe des Suchwort-Berichts oder sehen welche Suchworte auf spezifischen Suchmaschinen wie gut funktionieren, um weitere zielgerichtete Analysen und Optimierungen vorzunehmen.",
3723
+ "SearchEnginesSubcategoryHelp2": "%1$sMatomo Cloud%2$s und %3$sSearch Engine Keywords Performance%4$s Benutzer erhalten die besten Resultate mit diesem Bericht.",
3724
  "WebsitesSubcategoryHelp1": "In dieser Tabelle können Sie sehen, welche Websites Besucher auf Ihre Website gelenkt haben.",
3725
+ "WebsitesSubcategoryHelp2": "Wenn Sie auf eine Zeile in der Tabelle klicken, können Sie sehen bei welchen URLs die Links zu Ihrer Webseite aktiv sind.",
3726
  "SocialsSubcategoryHelp": "In dieser Tabelle können Sie sehen, welche Websites Besucher auf Ihre Website gelenkt haben.",
3727
+ "CampaignsSubcategoryHelp": "Der Kampagnen-Tracking Bereich erlaubt Ihnen zu analysieren, welche Besuche mit welchen unterschiedlichen Tracking Werten verknüpft sind, welche mit Ihren digitalen Kampagnen verlinkt sind. Damit kann man Dinge aufzeigen wie zum Beispiel wie viel Datenverkehr Ihre Kampagnen erzeugen, welche Werbemittel am besten funktionieren, wie engagiert Kampagnenbesucher sind, und ob die Kampagne zu Verkäufen führt oder nicht.",
3728
+ "EcommerceLogSubcategoryHelp1": "Das Ecommerce Log enthält detaillierte sessionbezogene Daten, so dass Sie die komplette Session jedes Benutzers nachverfolgen können, der einen Kauf getätigt oder abgebrochen hat. Dies kann helfen zu verstehen was Benutzer machen, bevor und nachdem Sie etwas kaufen, für die Verkaufsmöglichkeitenoptimierung.",
3729
+ "EcommerceLogSubcategoryHelp2": "Die Daten auf dieser Seite werden in Echtzeit aktualisiert",
3730
+ "ProductSubcategoryHelp": "Die Produkteansicht kann Ihnen dabei helfen Produkte und Kategorien zu identifizieren, die über- oder unterperformen, um Trends und Möglichkeiten im Bezug auf Ihre Produkteselektion und Verkaufsbereiche zu erkennen."
3731
  },
3732
  "Resolution": {
3733
  "ColumnConfiguration": "Konfiguration",
3855
  "UnprocessedSegmentInVisitorLog1": "%1$sEinstweilen können Sie das Visitor Log verwenden%2$s um zu testen ob Ihr Segment Ihre Benutzer korrekt erfasst, in dem Sie es dort anwenden.",
3856
  "UnprocessedSegmentInVisitorLog2": "Wenn angewandt, können Sie sofort sehen welche Besucher und Aktionen von Ihrem Segment betroffen sind.",
3857
  "UnprocessedSegmentInVisitorLog3": "Dies kann Ihnen helfen sicherzustellen, dass Ihr Segment die erwarteten Benutzer und Aktionen registriert.",
3858
+ "UnprocessedSegmentApiError1": "Das Segment '%1$s' ist auf '%2$s' gesetzt, aber Matomo ist aktuell nicht konfiguriert, um segmentierte Berichte in API Anfragen auszuführen.",
3859
  "UnprocessedSegmentApiError2": "Um in Zukunft Daten für diesen Bericht zu sehen, werden Sie Ihr Segment ändern müssen und die Option mit Namen '%s' anwählen.",
3860
  "UnprocessedSegmentApiError3": "Dann nach ein paar Stunden werden Ihre Segmentdaten über die API verfügbar sein. (Falls nicht, liegt ein Problem vor.)",
3861
  "CustomUnprocessedSegmentApiError1": "Das gesuchte Segment wurde noch nicht im Segment Editor erstellt und dementsprechend konnten die Berichtdaten nicht aufbereitet werden.",
3948
  "Sites": "Websites",
3949
  "SiteSearchUse": "Matomo kann auswerten, wonach Besucher in der internen Suche der Website suchen.",
3950
  "SiteWithoutDataTitle": "Es wurden bisher noch keine Daten gesammelt, untenstehendes Setup beachten",
3951
+ "SiteWithoutDataDescription": "Ein letzter Schritt um Ihren Web Traffic mit Matomo zu tracken und hilfreiche Einsichten zu gewinnen. Sie müssen zusätzlichen Code in Ihrer Webseite oder mobilen App platzieren, falls Sie das nicht bereits getan haben. Wählen Sie die untenstehende Option oder %1$ssenden Sie alle Instruktionen einem Teammitglied%2$s.",
3952
  "SiteWithoutDataSetupTracking": "Bitte fügen Sie den folgenden %1$sTracking Code%2$s auf ihrer Website ein, insofern Sie dies noch nicht getan haben.",
3953
  "SiteWithoutDataMessageDisappears": "Diese Nachricht wird verschwinden, sobald die ersten Daten für diese Website aufgezeichnet wurden.",
3954
  "SiteWithoutDataIgnoreMessage": "Diese Nachricht für eine Stunde verbergen",
3955
+ "SiteWithoutDataChoosePreferredWay": "Wählen Sie Ihre bevorzugte Art des Setups",
3956
  "SiteWithoutDataOtherWays": "Andere Wege",
3957
  "SiteWithoutDataOtherIntegrations": "Andere Integrationen",
3958
+ "SiteWithoutDataGoogleTagManager": "Google Tag Manager",
3959
+ "SiteWithoutDataMatomoTagManager": "Matomo Tag Manager",
3960
+ "SiteWithoutDataMatomoTagManagerNotActive": "Sie wissen nicht, was ein Tag Manager ist? Informieren Sie sich in unserem %1$sTag Manager Leitfaden%2$s. Wenn Sie mehrere Ressourcen aus 3rd Party Webseiten in Ihre Webseite einbinden, dann ist das Tracking Ihrer Webseite mithilfe eines Tag Managers eventuell eine bessere Lösung als das normale JavaScript tracking.",
3961
+ "SiteWithoutDataGoogleTagManagerDescription": "Sie können Matomo mit dem Google Tag Manager verwenden. Um das Matomo Tracking im Google Tag Manager einzurichten, folgen Sie den Instruktionen dieser %1$sAnleitung%2$s.",
3962
+ "SiteWithoutDataDetectedSite": "Wir haben festgestellt, dass Sie eine %1$s Seite verwenden. Folgen Sie bitte den Instruktionen dieser %2$sAnleitung%3$s.",
3963
+ "SiteWithoutDataDetectedGtm": "Wir haben außerdem entdeckt, dass Sie den Google Tag Manager verwenden. Wenn Sie vorhaben, Matomo unter Verwendung des GTM aufzusetzen, folgen Sie bitte dieser %2$sAnleitung%3$s.",
3964
  "SuperUserAccessCan": "Ein Nutzer mit Hauptadministrator-Berechtigung kann ebenfalls %1$sglobale Einstellungen%2$s für neue Websites vornehmen.",
3965
  "Timezone": "Zeitzone",
3966
  "TrackingSiteSearch": "Die interne Suche auswerten",
3972
  "OnlyMatchedUrlsAllowedHelp": "Wenn aktiviert zeichnet Matomo nur noch interne Aktionen auf bei denen die Seiten-URL eine der bekannten URLs der Website ist. Dies hindert andere daran Ihre Analyse mit URLs von anderen Websites zu verfälschen.",
3973
  "OnlyMatchedUrlsAllowedHelpExamples": "Domain und Pfadangabe müssen exakt übereinstimmen und jede gültige Subdomain muss separat definiert werden. Sind die bekannten URLs beispielsweise 'http:\/\/example.com\/path' und 'http:\/\/good.example.com', werden Tracking-Anfragen von 'http:\/\/example.com\/otherpath' oder 'http:\/\/bad.example.com' ignoriert.",
3974
  "WebsitesManagement": "Websiteverwaltung",
3975
+ "WebsiteUpdated": "Webseite aktualisiert",
3976
+ "WebsiteCreated": "Webseite erstellt",
3977
  "XManagement": "%s verwalten",
3978
  "ChooseMeasurableTypeHeadline": "Was möchten Sie messen?",
3979
  "YouCurrentlyHaveAccessToNWebsites": "Sie haben derzeit Zugriff auf %s Websites.",
3986
  "EmailInstructionsSiteDetailsHeading": "Einzelheiten Ihrer Seite",
3987
  "EmailInstructionsSiteDetails": "Sie benötigen diese Angaben, um die API oder SDKs zum Verfolgen von Matomo-Besuchen zu verwenden.",
3988
  "EmailInstructionsYourSiteId": "Ihre Seiten-ID: %1$s",
3989
+ "EmailInstructionsYourTrackingUrl": "Ihre Tracking-URL: %1$s",
3990
+ "DetectingYourSite": "Durchsuche Ihre Seite"
3991
  },
3992
  "TagManager": {
3993
  "AddThisTagDescription": "Fügen Sie die AddThis Social Media Buttons und mehr zu Ihrer Website hinzu.",
4524
  "WeekdayVariableDescription": "Liefert den lokalen Wochentag, z. B. Montag, Dienstag, Mittwoch, ...",
4525
  "WeekdayVariableName": "Wochentag",
4526
  "WindowLeaveTriggerDescription": "Wird ausgelöst wenn der Benutzer daran ist die aktuelle Seite zu verlassen, indem die Maus ausserhalb des Fensters positioniert wird.",
4527
+ "WindowLeaveTriggerHelp": "Dieser Trigger wird ausgelöst, wenn der Benutzer möglicherweise vor hat, die Website zu verlassen und den Mauszeiger ausserhalb der Website platziert, zum Beispiel zur Browser URL Adresszeile oder einem anderen Knopf. Das kann hilfreich sein um die Aufmerksamkeit Ihres Besuchers zu behalten und den Besucher nicht zu verlieren, in dem zum Beispiel ein Exit-Popup gezeigt wird. Sie sind möglicherweise auch am \"Fenster Unload\" Trigger interessiert, welcher ausgelöst wird, sobald der Benutzer die aktuelle Seite effektiv verlässt.",
4528
  "WindowLeaveTriggerName": "Fenster verlassen",
4529
  "WindowLoadedTriggerDescription": "Wird ausgelöst wenn die Seite mit allen Bildern usw. geladen wurde.",
4530
  "WindowLoadedTriggerHelp": "Diese Phase des Ladens ist wenn eine Seite für den Browser komplett geladen ist. In den meisten Fällen bedeutet das auch dass alle Bilder geladen sind und dass alle Style angewendet werden usw. Dieser Trigger wird immer irgendwann nach dem \"DOM Ready\" ausgelöst.",
4672
  "RecoveryCodesAllUsed": "Alle Recovery Codes wurden verwendet, es wird wärmstens empfohlen Ihre Recovery Codes zu regenerieren.",
4673
  "RecoveryCodesRegenerated": "Recovery Codes wurden regeneriert. Stellen Sie sicher, dass die neu generierten Codes heruntergeladen oder ausgedruckt werden.",
4674
  "GenerateNewRecoveryCodes": "Einen neuen Wiederherstellungscode generieren",
4675
+ "GenerateNewRecoveryCodesInfo": "Wenn Sie neue Recovery Codes generieren, werden Ihre alten nicht mehr funktionieren. Stellen Sie sicher dass Sie die neuen Codes herunterladen oder ausdrucken.",
4676
+ "RequireTwoFAForAll": "Zwei-Faktor Authentifizierung für alle benötigt",
4677
+ "RequireTwoFAForAllInformation": "Wenn angewählt, muss jeder Benutzer sich per Zwei-Faktor Authentifizierung anmelden. 2FA zu erzwingen hat zur Folge, dass alle Benutzer Zugang zu einem Gerät haben müssen, auf welchem eine Authentifizierungs-App installierbar ist. Sie können diese Funktion nur aktivieren wenn Sie die Zwei-Faktor-Authentifizierung bereits bei sich aktiviert haben."
4678
  },
4679
  "UserCountry": {
4680
  "CannotLocalizeLocalIP": "Die IP-Adresse %s ist eine lokale Adresse. Der Standort kann daher nicht ermittelt werden.",
4721
  "ToGeolocateOldVisits": "Für Standortdaten für vergangene Besuche verwenden Sie bitte das %1$shier beschriebene Skript%2$s.",
4722
  "WidgetLocation": "Besucherstandort",
4723
  "GeoIpDbIpAccuracyNote": "Bemerkung: Die DBIP Datenbanken sind frei und können automatisch heruntergeladen werden, aber Geolocation Resultate (insbesondere Städte-Resultate) sind nicht so akkurat wie die von MaxMind. Bei MaxMind hingegen benötigen Sie auch für die freie Geolocation Datenbank ein Benutzerkonto, Sie können den Prozess %1$shier%2$s starten",
4724
+ "MaxMindLinkExplanation": "Wenn Sie die Geolocation Datenbanken von MaxMind verwenden und Sie nicht wissen wie Ihre Download URL zu generieren ist, %1$sklicken Sie hier um zu lernen wie%2$s.",
4725
+ "LocationsSubcategoryHelp": "Der Orte Abschnitt ist der beste Weg herauszufinden wo Personen sind, wenn Sie Ihre Seite besuchen. Er zeigt Länder, Kontinente, Regionen und Städte auf, von denen Ihre Besucher kommen, in Tabellen- und Kartenform. Zusätzlich dazu können Sie sehen welche Browsersprachen eingestellt sind, was dabei hilft internationale Besucher aus alternativen Standorten zu identifizieren."
4726
  },
4727
  "UserCountryMap": {
4728
  "PluginDescription": "Dieses Plugin stellt die Widgets \"Besucherkarte\" sowie \"Besucherkarte in Echtzeit\" bereit. Hinweis: Hierfür muss das Plugin \"UserCountry\" aktiviert sein.",
4747
  "WithUnknownRegion": "%s mit unbekannter Region",
4748
  "WithUnknownCity": "%s mit unbekannter Stadt",
4749
  "NoVisitsInfo": "Es werden aktuell keine Besuche angezeigt, weil für diesen Zeitraum kein Besuch mit korrekten Geolocation Informationen (Längengrad & Breitengrad) existiert.",
4750
+ "NoVisitsInfo2": "Um das Problem zu lösen, stellen Sie sicher, dass Sie einen GeoIP Geolocation Provider mit einer GeoIP Stadt Datenbank verwenden. Wenn dies Ihr Problem nicht löst, dann ist es möglich (wenn auch unwahrscheinlich) dass Ihre Besuche IP Adressen haben, die nicht geolokalisiert werden können.",
4751
+ "RealTimeMapHelp": "Die Echtzeit-Karte zeigt den Ort der Besucher auf Ihrer Seite von den letzten 30 Minuten. Große orange Kreise repräsentieren kürzliche Besuche, während kleinere Kreise die älteren Besuche anzeigen. Diese Daten aktualisieren alle fünf Sekunden, und neue Besucher werden mit einem Flash-Effekt dargestellt."
4752
  },
4753
  "UserId": {
4754
  "UserId": "Benutzer-ID",
4813
  "ExceptionEditAnonymous": "Der anonyme Benutzer kann nicht bearbeitet oder gelöscht werden. Er wird von Matomo benutzt, um einen Benutzer zu definieren, der sich noch nicht angemeldet hat. Zum Beispiel können Sie Ihre Statistiken öffentlich machen, indem Sie dem Benutzer 'anonymous' das Recht 'view' geben.",
4814
  "ExceptionEmailExists": "Ein Benutzer mit der E-Mail-Adresse '%s' existiert bereits.",
4815
  "ExceptionEmailExistsAsLogin": "Die E-Mail-Adresse '%s' wird bereits als Nutzername verwendet.",
4816
+ "ExceptionLoginExistsAsEmail": "Der Nutzername '%s' wird bereits als E-Mail-Adresse verwendet.",
4817
  "ExceptionInvalidEmail": "Die E-Mail-Adresse hat ein ungültiges Format.",
4818
  "ExceptionInvalidLoginFormat": "Der Benutzername muss zwischen %1$s und %2$s Zeichen lang sein und darf nur Buchstaben, Zahlen oder die Zeichen '_', '-', '.', '@' oder '+' enthalten.",
4819
  "ExceptionInvalidPassword": "Das Passwort muss mindestens %1$s Zeichen lang sein.",
4950
  "NewsletterSignupTitle": "Newsletter-Anmeldung",
4951
  "NewsletterSignupMessage": "Abonnieren Sie unseren Newsletter, um regelmäßig Informationen über Matomo zu erhalten. Deabonnieren ist jederzeit möglich. Dieser Dienst verwendet MadMimi. Erfahren Sie mehr in unserer %1$sDatenschutzerklärung%2$s.",
4952
  "NewsletterSignupFailureMessage": "Hoppla, etwas ist schief gelaufen. Wir konnten Sie nicht für unseren Newsletter registrieren.",
4953
+ "NewsletterSignupSuccessMessage": "Super, Sie wurden erfolgreich registriert! Wir werden in Kürze von uns hören lassen.",
4954
+ "FirstWebsitePermission": "Berechtigung erste Webseite"
4955
  },
4956
  "VisitFrequency": {
4957
  "ColumnActionsByNewVisits": "Aktionen bei neuen Besuchen",
app/lang/el.json CHANGED
@@ -16,6 +16,7 @@
16
  "Apply": "Εφαρμογή",
17
  "ArchivingInlineHelp": "Για μεσαίας ή μεγάλης επισκεψιμότητας ιστοσελίδες, προτείνεται να απενεργοποιήσετε στο Matomo την αρχειοθέτηση που προκαλείται από τον φυλλομετρητή. Αντί για αυτό, σας προτείνουμε να εγκαταστήσετε μια εργασία cron για να δημιουργείτε αναφορές Matomo κάθε ώρα.",
18
  "ArchivingTriggerDescription": "Προτείνεται για μεγάλες εγκαταστάσεις του Matomo, πρέπει να %1$sορίσετε μια εργασία cron%2$s για να γίνεται αυτόματη επεξεργασία των αναφορών.",
 
19
  "AuthenticationMethodSmtp": "Μέθοδος πιστοποίησης SMTP",
20
  "AverageOrderValue": "Μέση τιμή παραγγελίας",
21
  "AveragePrice": "Μέση τιμή",
@@ -176,6 +177,8 @@
176
  "ExceptionDatabaseVersion": "Η έκδοσή %1$s είναι %2$s αλλά το Matomo απαιτεί τουλάχιστον %3$s.",
177
  "ExceptionDatabaseVersionNewerThanCodebase": "Ο κώδικας του Matomo εκτελεί την παλιότερη έκδοση %1$s και εντοπίστηκε ότι η βάση δεδομένων του Matomo έχει ήδη αναβαθμιστεί στην νεότερη έκδοση %2$s.",
178
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Είναι πιθανόν οι διαχειριστές του Matomo να τελειώνουν τη διαδικασία αναβάθμισης. Παρακαλούμε δοκιμάστε πάλι αργότερα σε λίγα λεπτά.",
 
 
179
  "ExceptionFileIntegrity": "Ο έλεγχος ακεραιότητας απέτυχε: %s",
180
  "ExceptionFilesizeMismatch": "Αταίριαστο μέγεθος αρχείου: %1$s (αναμενόμενο: %2$s, βρέθηκε: %3$s)",
181
  "ExceptionIncompatibleClientServerVersions": "Η έκδοση πελάτη σας %1$s είναι %2$s η οποία είναι ασύμβατη με την έκδοση διακομιστή %3$s.",
@@ -524,7 +527,8 @@
524
  "Custom": "Προσαρμογή",
525
  "PreviousPeriod": "Προηγούμενη Περίοδος",
526
  "PreviousYear": "Προηγούμενο Έτος",
527
- "ViewAccessRequired": "Το token_auth που χρησιμοποιείται έχει παραπάνω πρόσβαση από την απαραίτητη για χρήση σε αίτηση URL μη API-κλήσης. Χρησιμοποιήστε ένα συνθηματικό ειδικό για χρήση που έχει πρόσβαση μόνο για ανάγνωση."
 
528
  },
529
  "Mobile": {
530
  "AboutPiwikMobile": "Σχετικά με το Matomo για κινητά",
@@ -915,7 +919,24 @@
915
  "TrackingFailuresEmail1": "Αυτό μόνο και μόνο για να γνωρίζετε ότι %s διαφορετικά είδη αποτυχιών παρακολούθησης έχουν συμβεί τις τελευταίες ημέρες.",
916
  "TrackingFailuresEmail2": "Για να δείτε όλες τις αποτυχημένες αιτήσεις παρακολούθησης %1$sκάντε κλικ εδώ%2$s.",
917
  "ImportFromGoogleAnalytics": "Εισαγωγή από το Google Analytics",
918
- "ImportFromGoogleAnalyticsDescription": "Αν έχετε μια ιδιοκτησία του Google Analytics και αλλάζετε στο Matomo, μπορείτε να εισαγάγετε τα υπάρχοντα δεδομένα σας με χρήση του πρόσθετου %1$sGoogleAnalyticsImporter%2$s."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
919
  },
920
  "CoreHome": {
921
  "CategoryNoData": "Ανεπαρκή δεδομένα στη κατηγορία. Δοκιμάστε να συμπεριλάβετε όλο το πλήθος.",
@@ -1536,7 +1557,7 @@
1536
  "ContactUs": "Επικοινωνήστε μαζί μας",
1537
  "VisitTheForums": "Δείτε τα %1$sΦόρουμ%2$s και λάβετε βοήθεια από την κοινότητα χρηστών του Matomo",
1538
  "Forums": "Φόρουμ",
1539
- "ReviewMatomoTitle": "Πιστεύετε στο Matomo;",
1540
  "PleaseLeaveExternalReviewForMatomo": "Μοιραστείτε τις σκέψεις σας σχετικά με τις ιστοσελίδες αυτές και εμπνεύστε άλλους να συμμετέχουν στην επανάστασή μας των δεδομένων.",
1541
  "RemindMeLater": "Να μου γίνει αργότερα υπενθύμιση",
1542
  "NeverAskMeAgain": "Να μην ερωτηθώ ποτέ ξανά",
@@ -1548,11 +1569,12 @@
1548
  "SearchHelpResources": "Αναζήτηση στους πόρους βοήθειας του matomo.org",
1549
  "PopularHelpTopics": "Δημοφιλή θέματα βοήθειας",
1550
  "ReferMatomo": "Κάντε αναφορά για το Matomo",
1551
- "ReferBannerTitle": "Μην αφήνετε τα δεδομένα των φίλων σας να καταλήξουν σε λάθος χέρια!",
1552
- "ReferBannerLonger": "Κάντε λόγο τώρα σ' αυτούς για το Matomo Analytics για να πάρουν πίσω τον έλεγχο!",
1553
  "ReferBannerEmailShareSubject": "Κάντε λόγο σ' αυτούς για το Matomo Analytics τώρα για να πάρουν πίσω τον έλεγχο!",
1554
  "ReferBannerEmailShareBody": "Επιλέγω το Matomo, μια ηθική εναλλακτική λύση του Google Analytics που μου δίνει 100%% την ιδιοκτησία των δεδομένων και τα προστατεύει από τους επισκέπτες του ιστοτόπου μου.\nΜοιράζομαι το μήνυμα αυτό με την ελπίδα ότι κι εσείς θα πάρετε πίσω τη δύναμη από το Google και θα αποκτήσετε πλήρως την ιδιοκτησία των δικών σας δεδομένων.\n\nΔείτε το Matomo στο https:\/\/matomo.org",
1555
- "ReferBannerSocialShareText": "Αν χρησιμοποιείτε το Google Analytics, διατηρήστε τον έλεγχο κάνοντας αλλαγή τώρα σε μια ηθική εναλλακτική λύση όπως το Matomo!"
 
1556
  },
1557
  "GeoIp2": {
1558
  "AssumingNonApache": "Αδύνατη η εύρεση της συνάρτησης apache_get_modules, υποθέτουμε ότι ο διακομιστής δεν είναι Apache.",
@@ -1878,11 +1900,8 @@
1878
  "SystemCheckGzcompressHelp": "Πρέπει να ενεργοποιήσετε την επέκταση zlib και την συνάρτηση gzcompress.",
1879
  "SystemCheckGzuncompressHelp": "Πρέπει να ενεργοποιήσετε την επέκταση zlib και την συνάρτηση gzuncompress.",
1880
  "SystemCheckHashHelp": "Θα πρέπει να παραμετροποιήσετε και να μεταγλωττίσετε πάλι την PHP με ενεργοποιημένη την υποστήριξη hash() παραλείποντας την επιλογή --disable-hash.",
1881
- "SystemCheckIconvHelp": "Πρέπει να ρυθμίσετε και ξαναεγκαταστήσετε την PHP με ενεργοποιημένη την υποστήριξη «iconv», --with-iconv.",
1882
  "SystemCheckJsonHelp": "Η επέκταση php-json απαιτείται προκειμένου το Matomo να διαβάζει και να γράφει δεδομένα JSON.",
1883
  "SystemCheckMailHelp": "Τα μηνύματα με τις παρατηρήσεις σας και για τους Ξεχασμένους Κωδικούς δεν θα στέλνονται αν δεν είναι ενεργοποιημένη η συνάρτηση mail().",
1884
- "SystemCheckMbstring": "mbstring",
1885
- "SystemCheckMbstringHelp": "Η επέκταση mbstring απαιτείται για τον χειρισμό χαρακτήρων πολλών Bytes στην διεπαφή χρήστη και στις αποκρίσεις API. Επίσης, βεβαιωθείτε ότι η τιμή mbstring.func_overload έχει οριστεί στο \"0\" στο php.ini.",
1886
  "SystemCheckMemoryLimit": "Όριο μνήμης",
1887
  "SystemCheckMemoryLimitHelp": "Σε μια ιστοσελίδα υψηλής επισκεψιμότητας, η διαδικασία αρχειοθέτησης ίσως απαιτεί περισσότερη μνήμη από την επιτρεπόμενη.<br \/>Δείτε την οδηγία memory_limit στο αρχείο php.ini αν είναι απαραίτητο.",
1888
  "SystemCheckMemoryNoMemoryLimitSet": "Δεν έχει οριστεί όριο για τη μνήμη",
@@ -1899,7 +1918,6 @@
1899
  "SystemCheckPdoAndMysqliHelp": "Σε διακομιστή Linux μπορείτε να ρυθμίσετε την php με τις ακόλουθες επιλογές: %1$s στο αρχείο php.ini, προσθέστε τις ακόλουθες γραμμές: %2$s",
1900
  "SystemCheckPhp": "Έκδοση PHP",
1901
  "SystemCheckPhpPdoAndMysqli": "Περισσότερες πληροφορίες στο: %1$sPHP PDO%2$s και %3$sMYSQLI%4$s.",
1902
- "SystemCheckSplHelp": "Πρέπει να ρυθμίσετε και ξαναεγκαταστήσετε την PHP με τη Βασική Βιβλιοθήκη PHP (SPL) ενεργοποιήμένη (ως προεπιλογή).",
1903
  "SystemCheckSessionHelp": "Πρέπει να παραμετροποιήσετε και να επαναμεταγλωττίσετε την PHP με την υποστήριξη για \"session\" ενεργή (μην χρησιμοποιείτε το --disable-session).",
1904
  "SystemCheckSettings": "Απαιτούμενη παραμετροποίηση PHP (php.ini)",
1905
  "SystemCheckSummaryNoProblems": "Δεν υπάρχουν προβλήματα με την εγκατάσταση του Matomo. Όλα καλά!",
@@ -3954,6 +3972,8 @@
3954
  "OnlyMatchedUrlsAllowedHelp": "Όταν είναι ενεργοποιημένο, το Matomo θα παρακολουθεί εσωτερικές ενέργειες όταν η διεύθυνση URL είναι μία από τις γνωστές διευθύνσεις URL για τον ιστοτόπο σας. Αυτό αποτρέπει τρίτους από ανεπιθύμητη κίνηση στα αναλυτικά σας με διευθύνσεις URL από τρίτους ιστοτόπους.",
3955
  "OnlyMatchedUrlsAllowedHelpExamples": "Το όνομα χώρου και η διαδρομή πρέπει να ταιριάζουν ακριβώς και κάθε υποόνομα να ορίζεται ξεχωριστά. Για παράδειγμα, όταν οι γνωστές διευθύνσεις URL είναι 'http:\/\/example.com\/path' και 'http:\/\/good.example.com', οι αιτήσεις ιχνηλάτησης για το 'http:\/\/example.com\/otherpath' ή 'http:\/\/bad.example.com' αγνοούνται.",
3956
  "WebsitesManagement": "Διαχείριση ιστοσελίδων",
 
 
3957
  "XManagement": "Διαχείριση του %s",
3958
  "ChooseMeasurableTypeHeadline": "Τι θέλετε να μετρήσετε;",
3959
  "YouCurrentlyHaveAccessToNWebsites": "Έχετε πρόσβαση σε %s ιστοσελίδες.",
16
  "Apply": "Εφαρμογή",
17
  "ArchivingInlineHelp": "Για μεσαίας ή μεγάλης επισκεψιμότητας ιστοσελίδες, προτείνεται να απενεργοποιήσετε στο Matomo την αρχειοθέτηση που προκαλείται από τον φυλλομετρητή. Αντί για αυτό, σας προτείνουμε να εγκαταστήσετε μια εργασία cron για να δημιουργείτε αναφορές Matomo κάθε ώρα.",
18
  "ArchivingTriggerDescription": "Προτείνεται για μεγάλες εγκαταστάσεις του Matomo, πρέπει να %1$sορίσετε μια εργασία cron%2$s για να γίνεται αυτόματη επεξεργασία των αναφορών.",
19
+ "ArchivingTriggerSegment": "Η χρήση των Προσαρμοσμένων Τμημάτων θα προκαλέσει την επεξεργασία των αρχειοθετημένων εγγραφών.",
20
  "AuthenticationMethodSmtp": "Μέθοδος πιστοποίησης SMTP",
21
  "AverageOrderValue": "Μέση τιμή παραγγελίας",
22
  "AveragePrice": "Μέση τιμή",
177
  "ExceptionDatabaseVersion": "Η έκδοσή %1$s είναι %2$s αλλά το Matomo απαιτεί τουλάχιστον %3$s.",
178
  "ExceptionDatabaseVersionNewerThanCodebase": "Ο κώδικας του Matomo εκτελεί την παλιότερη έκδοση %1$s και εντοπίστηκε ότι η βάση δεδομένων του Matomo έχει ήδη αναβαθμιστεί στην νεότερη έκδοση %2$s.",
179
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Είναι πιθανόν οι διαχειριστές του Matomo να τελειώνουν τη διαδικασία αναβάθμισης. Παρακαλούμε δοκιμάστε πάλι αργότερα σε λίγα λεπτά.",
180
+ "ExceptionDatabaseUnavailable": "Δεν ανταποκρίνεται ο διακομιστής MySQL",
181
+ "ExceptionDatabaseAccess": "Απορρίφθηκε η πρόσβαση στη βάση δεδομένων",
182
  "ExceptionFileIntegrity": "Ο έλεγχος ακεραιότητας απέτυχε: %s",
183
  "ExceptionFilesizeMismatch": "Αταίριαστο μέγεθος αρχείου: %1$s (αναμενόμενο: %2$s, βρέθηκε: %3$s)",
184
  "ExceptionIncompatibleClientServerVersions": "Η έκδοση πελάτη σας %1$s είναι %2$s η οποία είναι ασύμβατη με την έκδοση διακομιστή %3$s.",
527
  "Custom": "Προσαρμογή",
528
  "PreviousPeriod": "Προηγούμενη Περίοδος",
529
  "PreviousYear": "Προηγούμενο Έτος",
530
+ "ViewAccessRequired": "Το token_auth που χρησιμοποιείται έχει παραπάνω πρόσβαση από την απαραίτητη για χρήση σε αίτηση URL μη API-κλήσης. Χρησιμοποιήστε ένα συνθηματικό ειδικό για χρήση που έχει πρόσβαση μόνο για ανάγνωση.",
531
+ "Reasons": "Αιτίες"
532
  },
533
  "Mobile": {
534
  "AboutPiwikMobile": "Σχετικά με το Matomo για κινητά",
919
  "TrackingFailuresEmail1": "Αυτό μόνο και μόνο για να γνωρίζετε ότι %s διαφορετικά είδη αποτυχιών παρακολούθησης έχουν συμβεί τις τελευταίες ημέρες.",
920
  "TrackingFailuresEmail2": "Για να δείτε όλες τις αποτυχημένες αιτήσεις παρακολούθησης %1$sκάντε κλικ εδώ%2$s.",
921
  "ImportFromGoogleAnalytics": "Εισαγωγή από το Google Analytics",
922
+ "ImportFromGoogleAnalyticsDescription": "Αν έχετε μια ιδιοκτησία του Google Analytics και αλλάζετε στο Matomo, μπορείτε να εισαγάγετε τα υπάρχοντα δεδομένα σας με χρήση του πρόσθετου %1$sGoogleAnalyticsImporter%2$s.",
923
+ "SecurityNotificationEmailSubject": "Ειδοποίηση Ασφάλειας",
924
+ "SecurityNotificationRecoveryCodesShowedBody": "Κάποιος είδε τους κωδικούς ανάκτησης αυθεντικοποίησης δύο παραγόντων του λογαριασμού σας.",
925
+ "SecurityNotificationRecoveryCodesRegeneratedBody": "Κάποιος δημιούργησε νέους κωδικούς ανάκτησης για την αυθεντικοποίηση δύο παραγόντων για το λογαριασμό σας.",
926
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Κάποιος ενεργοποίησε την αυθεντικοποίηση δύο παραγόντων στο λογαριασμό σας.",
927
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Κάποιος απενεργοποίησε την αυθεντικοποίηση δύο παραγόντων στο λογαριασμό σας.",
928
+ "SecurityNotificationTokenAuthCreatedBody": "Κάποιος δημιούργησε ένα τεκμήριο αυθεντικοποίησης (περιγραφή: %s) στο λογαριασμό σας. Αν δεν ήσασταν εσείς, διαγράψτε το τεκμήριο.",
929
+ "SecurityNotificationTokenAuthDeletedBody": "Κάποιος διέγραψε ένα τεκμήριο αυθεντικοποίησης (περιγραφή: %s) στο λογαριασμό σας.",
930
+ "SecurityNotificationAllTokenAuthDeletedBody": "Κάποιος διέγραψε όλα τα τεκμήρια αυθεντικοποίησης στο λογαριασμό σας.",
931
+ "SecurityNotificationSettingsChangedByUserBody": "Κάποιος τροποποίησε τις ρυθμίσεις συστήματος. Οι ρυθμίσεις που επηρεάστηκαν: %s.",
932
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Κάποιος άλλος υπερ-χρήστης (%1$s) τροποποίησε τις ρυθμίσεις συστήματος. Οι ρυθμίσεις που επηρεάστηκαν: %2$s. Αν γνωρίζετε αυτή τη δραστηριότητα, συνεχίστε. Αν δεν την γνωρίζετε, παρακαλώ επικοινωνήστε με τους άλλους υπερ-χρήστες.",
933
+ "SecurityNotificationUserCreatedBody": "Κάποιος δημιούργησε ένα νέο χρήστη (όνομα εισόδου: %s) στο λογαριασμό σας.",
934
+ "SecurityNotificationUserDeletedBody": "Κάποιος διέγραψε ένα χρήστη (όνομα εισόδου: %s) στο λογαριασμό σας.",
935
+ "SecurityNotificationIfItWasYou": "Αν αυτός ήσασταν εσείς, συνεχίστε. Αν δεν αναγνωρίζετε αυτή τη δραστηριότητα, παρακαλώ αλλάξτε το συνθηματικό σας.",
936
+ "SecurityNotificationCheckTwoFactor": "Παρακαλώ ελέγξτε την εφαρμογή ή συσκευή σας αυθεντικοποίησης δύο παραγόντων.",
937
+ "BruteForce": "Brute Force",
938
+ "TwoFactorAuth": "Αυθεντικοποίηση δύο παραγόντων",
939
+ "Cors": "Cors"
940
  },
941
  "CoreHome": {
942
  "CategoryNoData": "Ανεπαρκή δεδομένα στη κατηγορία. Δοκιμάστε να συμπεριλάβετε όλο το πλήθος.",
1557
  "ContactUs": "Επικοινωνήστε μαζί μας",
1558
  "VisitTheForums": "Δείτε τα %1$sΦόρουμ%2$s και λάβετε βοήθεια από την κοινότητα χρηστών του Matomo",
1559
  "Forums": "Φόρουμ",
1560
+ "ReviewMatomoTitle": "Σας αρέσει το Matomo;",
1561
  "PleaseLeaveExternalReviewForMatomo": "Μοιραστείτε τις σκέψεις σας σχετικά με τις ιστοσελίδες αυτές και εμπνεύστε άλλους να συμμετέχουν στην επανάστασή μας των δεδομένων.",
1562
  "RemindMeLater": "Να μου γίνει αργότερα υπενθύμιση",
1563
  "NeverAskMeAgain": "Να μην ερωτηθώ ποτέ ξανά",
1569
  "SearchHelpResources": "Αναζήτηση στους πόρους βοήθειας του matomo.org",
1570
  "PopularHelpTopics": "Δημοφιλή θέματα βοήθειας",
1571
  "ReferMatomo": "Κάντε αναφορά για το Matomo",
1572
+ "ReferBannerTitle": "Πιστεύετε στο Matomo;",
1573
+ "ReferBannerLonger": "Βοηθήστε στο να διαδώστε τα νέα για εμάς ώστε περισσότεροι άνθρωποι να αποκτήσουν τον έλεγχο των δεδομένων αναλυτικών τους.",
1574
  "ReferBannerEmailShareSubject": "Κάντε λόγο σ' αυτούς για το Matomo Analytics τώρα για να πάρουν πίσω τον έλεγχο!",
1575
  "ReferBannerEmailShareBody": "Επιλέγω το Matomo, μια ηθική εναλλακτική λύση του Google Analytics που μου δίνει 100%% την ιδιοκτησία των δεδομένων και τα προστατεύει από τους επισκέπτες του ιστοτόπου μου.\nΜοιράζομαι το μήνυμα αυτό με την ελπίδα ότι κι εσείς θα πάρετε πίσω τη δύναμη από το Google και θα αποκτήσετε πλήρως την ιδιοκτησία των δικών σας δεδομένων.\n\nΔείτε το Matomo στο https:\/\/matomo.org",
1576
+ "ReferBannerSocialShareText": "Αν χρησιμοποιείτε το Google Analytics, διατηρήστε τον έλεγχο κάνοντας αλλαγή τώρα σε μια ηθική εναλλακτική λύση όπως το Matomo!",
1577
+ "WontShowAgain": "Δε θα εμφανιστεί ξανά αυτό το μήνυμα."
1578
  },
1579
  "GeoIp2": {
1580
  "AssumingNonApache": "Αδύνατη η εύρεση της συνάρτησης apache_get_modules, υποθέτουμε ότι ο διακομιστής δεν είναι Apache.",
1900
  "SystemCheckGzcompressHelp": "Πρέπει να ενεργοποιήσετε την επέκταση zlib και την συνάρτηση gzcompress.",
1901
  "SystemCheckGzuncompressHelp": "Πρέπει να ενεργοποιήσετε την επέκταση zlib και την συνάρτηση gzuncompress.",
1902
  "SystemCheckHashHelp": "Θα πρέπει να παραμετροποιήσετε και να μεταγλωττίσετε πάλι την PHP με ενεργοποιημένη την υποστήριξη hash() παραλείποντας την επιλογή --disable-hash.",
 
1903
  "SystemCheckJsonHelp": "Η επέκταση php-json απαιτείται προκειμένου το Matomo να διαβάζει και να γράφει δεδομένα JSON.",
1904
  "SystemCheckMailHelp": "Τα μηνύματα με τις παρατηρήσεις σας και για τους Ξεχασμένους Κωδικούς δεν θα στέλνονται αν δεν είναι ενεργοποιημένη η συνάρτηση mail().",
 
 
1905
  "SystemCheckMemoryLimit": "Όριο μνήμης",
1906
  "SystemCheckMemoryLimitHelp": "Σε μια ιστοσελίδα υψηλής επισκεψιμότητας, η διαδικασία αρχειοθέτησης ίσως απαιτεί περισσότερη μνήμη από την επιτρεπόμενη.<br \/>Δείτε την οδηγία memory_limit στο αρχείο php.ini αν είναι απαραίτητο.",
1907
  "SystemCheckMemoryNoMemoryLimitSet": "Δεν έχει οριστεί όριο για τη μνήμη",
1918
  "SystemCheckPdoAndMysqliHelp": "Σε διακομιστή Linux μπορείτε να ρυθμίσετε την php με τις ακόλουθες επιλογές: %1$s στο αρχείο php.ini, προσθέστε τις ακόλουθες γραμμές: %2$s",
1919
  "SystemCheckPhp": "Έκδοση PHP",
1920
  "SystemCheckPhpPdoAndMysqli": "Περισσότερες πληροφορίες στο: %1$sPHP PDO%2$s και %3$sMYSQLI%4$s.",
 
1921
  "SystemCheckSessionHelp": "Πρέπει να παραμετροποιήσετε και να επαναμεταγλωττίσετε την PHP με την υποστήριξη για \"session\" ενεργή (μην χρησιμοποιείτε το --disable-session).",
1922
  "SystemCheckSettings": "Απαιτούμενη παραμετροποίηση PHP (php.ini)",
1923
  "SystemCheckSummaryNoProblems": "Δεν υπάρχουν προβλήματα με την εγκατάσταση του Matomo. Όλα καλά!",
3972
  "OnlyMatchedUrlsAllowedHelp": "Όταν είναι ενεργοποιημένο, το Matomo θα παρακολουθεί εσωτερικές ενέργειες όταν η διεύθυνση URL είναι μία από τις γνωστές διευθύνσεις URL για τον ιστοτόπο σας. Αυτό αποτρέπει τρίτους από ανεπιθύμητη κίνηση στα αναλυτικά σας με διευθύνσεις URL από τρίτους ιστοτόπους.",
3973
  "OnlyMatchedUrlsAllowedHelpExamples": "Το όνομα χώρου και η διαδρομή πρέπει να ταιριάζουν ακριβώς και κάθε υποόνομα να ορίζεται ξεχωριστά. Για παράδειγμα, όταν οι γνωστές διευθύνσεις URL είναι 'http:\/\/example.com\/path' και 'http:\/\/good.example.com', οι αιτήσεις ιχνηλάτησης για το 'http:\/\/example.com\/otherpath' ή 'http:\/\/bad.example.com' αγνοούνται.",
3974
  "WebsitesManagement": "Διαχείριση ιστοσελίδων",
3975
+ "WebsiteUpdated": "Ο ιστοτόπος ενημερώθηκε",
3976
+ "WebsiteCreated": "Ο ιστοτόπος δημιουργήθηκε",
3977
  "XManagement": "Διαχείριση του %s",
3978
  "ChooseMeasurableTypeHeadline": "Τι θέλετε να μετρήσετε;",
3979
  "YouCurrentlyHaveAccessToNWebsites": "Έχετε πρόσβαση σε %s ιστοσελίδες.",
app/lang/en.json CHANGED
@@ -16,6 +16,7 @@
16
  "Apply": "Apply",
17
  "ArchivingInlineHelp": "For medium to high traffic websites, it is recommended to disable Matomo archiving to trigger from the browser. Instead, we recommend that you setup a cron job to process Matomo reports every hour.",
18
  "ArchivingTriggerDescription": "Recommended for larger Matomo installs, you need to %1$ssetup a cron job%2$s to process the reports automatically.",
 
19
  "AuthenticationMethodSmtp": "Authentication method for SMTP",
20
  "AverageOrderValue": "Average Order Value",
21
  "AveragePrice": "Average Price",
@@ -176,6 +177,8 @@
176
  "ExceptionDatabaseVersion": "Your %1$s version is %2$s but Matomo requires at least %3$s.",
177
  "ExceptionDatabaseVersionNewerThanCodebase": "Your Matomo codebase is running the old version %1$s and we have detected that your Matomo Database has already been upgraded to the newer version %2$s.",
178
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Maybe your Matomo administrators are currently finishing the upgrade process. Please try again in a few minutes.",
 
 
179
  "ExceptionFileIntegrity": "Integrity check failed: %s",
180
  "ExceptionFilesizeMismatch": "File size mismatch: %1$s (expected length: %2$s, found: %3$s)",
181
  "ExceptionIncompatibleClientServerVersions": "Your %1$s client version is %2$s which is incompatible with server version %3$s.",
@@ -524,7 +527,8 @@
524
  "Custom": "Custom",
525
  "PreviousPeriod": "Previous Period",
526
  "PreviousYear": "Previous Year",
527
- "ViewAccessRequired": "The token_auth used has too much access to be used in a non-API request URL. Please use an app specific password for a user that only has view access."
 
528
  },
529
  "Mobile": {
530
  "AboutPiwikMobile": "About Matomo Mobile",
@@ -915,7 +919,24 @@
915
  "TrackingFailuresEmail1": "This is just to let you know that %s different kinds of tracking failures have occurred in the last days.",
916
  "TrackingFailuresEmail2": "To view all the failed tracking requests %1$sclick here%2$s.",
917
  "ImportFromGoogleAnalytics": "Import from Google Analytics",
918
- "ImportFromGoogleAnalyticsDescription": "If you have a Google Analytics property and are switching to Matomo, you can import your existing data using the %1$sGoogleAnalyticsImporter%2$s plugin."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
919
  },
920
  "CoreHome": {
921
  "CategoryNoData": "No data in this category. Try to \"Include all population\".",
@@ -1038,7 +1059,7 @@
1038
  "VisitorsCategoryHelp2": "In addition to general information about your visitors, you can also use the %1$sVisits Log%2$s to see what occurred in every individual visit.",
1039
  "VisitorsOverviewHelp": "The Visitors Overview helps you understand the popularity of your site. It does this by providing charts that show how many visits your site is receiving over a selected period and the average level of engagement for key features, such as searches and downloads.",
1040
  "DevicesSubcategoryHelp": "The Devices section helps you understand the technology that your visitors are using to access your site. You will see reports on the type of device and specific models to enable you to optimise your site for the most popular devices.",
1041
- "SoftwareSubcategoryHelp": "The Software section shows the operating systems, browsers and plugins that your visitors are using to access the site so that you can optimise your site to ensure it is fully compatible with the most popular configurations..",
1042
  "EngagementSubcategoryHelp1": "The Engagement section provides reports that help to quantify how many new and returning visitors you get. You can also review reports that break down the average time and number of pages per visit, as well as the number of times a visitor has been to your site and the most common number of days between visits.",
1043
  "EngagementSubcategoryHelp2": "This can help you to optimise for frequency and high-interaction visits in addition to maximising your reach.",
1044
  "PeriodHasOnlyRawData": "It looks like reports for this period have not been processed yet. Do you want to see what's happening now? Check out the %1$sVisits log%2$s or choose a different date period until the reports are generated."
@@ -1879,11 +1900,8 @@
1879
  "SystemCheckGzcompressHelp": "You need to enable the zlib extension and gzcompress function.",
1880
  "SystemCheckGzuncompressHelp": "You need to enable the zlib extension and gzuncompress function.",
1881
  "SystemCheckHashHelp": "You need to configure and rebuild PHP with hash() support enabled by excluding the option --disable-hash.",
1882
- "SystemCheckIconvHelp": "You need to configure and rebuild PHP with \"iconv\" support enabled, --with-iconv.",
1883
  "SystemCheckJsonHelp": "The php-json extension is required for Matomo to read and write JSON data.",
1884
  "SystemCheckMailHelp": "Feedback and Lost Password messages will not be sent without mail().",
1885
- "SystemCheckMbstring": "mbstring",
1886
- "SystemCheckMbstringHelp": "The mbstring extension is required to handle multibyte characters in the User interface and API responses. Also, please check that mbstring.func_overload is set to \"0\" in php.ini.",
1887
  "SystemCheckMemoryLimit": "Memory limit",
1888
  "SystemCheckMemoryLimitHelp": "On a high traffic website, the archiving process may require more memory than currently allowed. If necessary, change the memory_limit directive in your php.ini file.",
1889
  "SystemCheckMemoryNoMemoryLimitSet": "There is no memory limit set",
@@ -1900,7 +1918,6 @@
1900
  "SystemCheckPdoAndMysqliHelp": "On a GNU\/Linux server you can compile php with the following options: %1$s In your php.ini, add the following lines: %2$s",
1901
  "SystemCheckPhp": "PHP version",
1902
  "SystemCheckPhpPdoAndMysqli": "More information on: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
1903
- "SystemCheckSplHelp": "You need to configure and rebuild PHP with the Standard PHP Library (SPL) enabled (by default).",
1904
  "SystemCheckSessionHelp": "You need to configure and rebuild PHP with \"session\" support enabled (don't use --disable-session).",
1905
  "SystemCheckSettings": "Required PHP configuration (php.ini)",
1906
  "SystemCheckSummaryNoProblems": "Huzzah! There are no problems with your Matomo setup. Give yourself a pat on the back.",
@@ -3956,6 +3973,8 @@
3956
  "OnlyMatchedUrlsAllowedHelp": "When enabled, Matomo will only track internal actions when the Page URL is one of the known URLs for your website. This prevents people from spamming your analytics with URLs for other websites.",
3957
  "OnlyMatchedUrlsAllowedHelpExamples": "The domain and the path have to be an exact match and each valid subdomain has to be specified separately. For example when the known URLs are 'http:\/\/example.com\/path' and 'http:\/\/good.example.com', tracking requests for 'http:\/\/example.com\/otherpath' or 'http:\/\/bad.example.com' are ignored.",
3958
  "WebsitesManagement": "Websites Management",
 
 
3959
  "XManagement": "Manage %s",
3960
  "ChooseMeasurableTypeHeadline": "What would you like to measure?",
3961
  "YouCurrentlyHaveAccessToNWebsites": "You currently have access to %s websites.",
16
  "Apply": "Apply",
17
  "ArchivingInlineHelp": "For medium to high traffic websites, it is recommended to disable Matomo archiving to trigger from the browser. Instead, we recommend that you setup a cron job to process Matomo reports every hour.",
18
  "ArchivingTriggerDescription": "Recommended for larger Matomo installs, you need to %1$ssetup a cron job%2$s to process the reports automatically.",
19
+ "ArchivingTriggerSegment": "Using Custom Segments will still trigger processing of archives.",
20
  "AuthenticationMethodSmtp": "Authentication method for SMTP",
21
  "AverageOrderValue": "Average Order Value",
22
  "AveragePrice": "Average Price",
177
  "ExceptionDatabaseVersion": "Your %1$s version is %2$s but Matomo requires at least %3$s.",
178
  "ExceptionDatabaseVersionNewerThanCodebase": "Your Matomo codebase is running the old version %1$s and we have detected that your Matomo Database has already been upgraded to the newer version %2$s.",
179
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Maybe your Matomo administrators are currently finishing the upgrade process. Please try again in a few minutes.",
180
+ "ExceptionDatabaseUnavailable": "MySQL server has gone away",
181
+ "ExceptionDatabaseAccess": "Database access denied",
182
  "ExceptionFileIntegrity": "Integrity check failed: %s",
183
  "ExceptionFilesizeMismatch": "File size mismatch: %1$s (expected length: %2$s, found: %3$s)",
184
  "ExceptionIncompatibleClientServerVersions": "Your %1$s client version is %2$s which is incompatible with server version %3$s.",
527
  "Custom": "Custom",
528
  "PreviousPeriod": "Previous Period",
529
  "PreviousYear": "Previous Year",
530
+ "ViewAccessRequired": "The token_auth used has too much access to be used in a non-API request URL. Please use an app specific password for a user that only has view access.",
531
+ "Reasons": "Reasons"
532
  },
533
  "Mobile": {
534
  "AboutPiwikMobile": "About Matomo Mobile",
919
  "TrackingFailuresEmail1": "This is just to let you know that %s different kinds of tracking failures have occurred in the last days.",
920
  "TrackingFailuresEmail2": "To view all the failed tracking requests %1$sclick here%2$s.",
921
  "ImportFromGoogleAnalytics": "Import from Google Analytics",
922
+ "ImportFromGoogleAnalyticsDescription": "If you have a Google Analytics property and are switching to Matomo, you can import your existing data using the %1$sGoogleAnalyticsImporter%2$s plugin.",
923
+ "SecurityNotificationEmailSubject": "Security Notification",
924
+ "SecurityNotificationRecoveryCodesShowedBody": "Someone viewed the two-factor authentication recovery codes of your account.",
925
+ "SecurityNotificationRecoveryCodesRegeneratedBody": "Someone generated new two-factor authentication recovery codes for your account.",
926
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Someone enabled two-factor authentication in your account.",
927
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Someone disabled two-factor authentication in your account.",
928
+ "SecurityNotificationTokenAuthCreatedBody": "Someone created an auth token (description: %s) in your account. If it wasn't you, delete the token.",
929
+ "SecurityNotificationTokenAuthDeletedBody": "Someone deleted an auth token (description: %s) in your account.",
930
+ "SecurityNotificationAllTokenAuthDeletedBody": "Someone deleted all of the auth tokens in your account.",
931
+ "SecurityNotificationSettingsChangedByUserBody": "Someone modified the system settings. Affected settings: %s.",
932
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Another super user (%1$s) modified the system settings. Affected settings: %2$s. If you know about this activity, carry on. If you don't recognize this activity, please contact the other super users.",
933
+ "SecurityNotificationUserCreatedBody": "Someone created a new user (login: %s) in your account.",
934
+ "SecurityNotificationUserDeletedBody": "Someone deleted a user (login: %s) in your account.",
935
+ "SecurityNotificationIfItWasYou": "If it was you, carry on. If you don't recognize this activity, please reset your password.",
936
+ "SecurityNotificationCheckTwoFactor": "Please check your two-factor authentication app or device.",
937
+ "BruteForce": "Brute Force",
938
+ "TwoFactorAuth": "Two-factor auth",
939
+ "Cors": "Cors"
940
  },
941
  "CoreHome": {
942
  "CategoryNoData": "No data in this category. Try to \"Include all population\".",
1059
  "VisitorsCategoryHelp2": "In addition to general information about your visitors, you can also use the %1$sVisits Log%2$s to see what occurred in every individual visit.",
1060
  "VisitorsOverviewHelp": "The Visitors Overview helps you understand the popularity of your site. It does this by providing charts that show how many visits your site is receiving over a selected period and the average level of engagement for key features, such as searches and downloads.",
1061
  "DevicesSubcategoryHelp": "The Devices section helps you understand the technology that your visitors are using to access your site. You will see reports on the type of device and specific models to enable you to optimise your site for the most popular devices.",
1062
+ "SoftwareSubcategoryHelp": "The Software section shows the operating systems, browsers and plugins that your visitors are using to access the site so that you can optimise your site to ensure it is fully compatible with the most popular configurations.",
1063
  "EngagementSubcategoryHelp1": "The Engagement section provides reports that help to quantify how many new and returning visitors you get. You can also review reports that break down the average time and number of pages per visit, as well as the number of times a visitor has been to your site and the most common number of days between visits.",
1064
  "EngagementSubcategoryHelp2": "This can help you to optimise for frequency and high-interaction visits in addition to maximising your reach.",
1065
  "PeriodHasOnlyRawData": "It looks like reports for this period have not been processed yet. Do you want to see what's happening now? Check out the %1$sVisits log%2$s or choose a different date period until the reports are generated."
1900
  "SystemCheckGzcompressHelp": "You need to enable the zlib extension and gzcompress function.",
1901
  "SystemCheckGzuncompressHelp": "You need to enable the zlib extension and gzuncompress function.",
1902
  "SystemCheckHashHelp": "You need to configure and rebuild PHP with hash() support enabled by excluding the option --disable-hash.",
 
1903
  "SystemCheckJsonHelp": "The php-json extension is required for Matomo to read and write JSON data.",
1904
  "SystemCheckMailHelp": "Feedback and Lost Password messages will not be sent without mail().",
 
 
1905
  "SystemCheckMemoryLimit": "Memory limit",
1906
  "SystemCheckMemoryLimitHelp": "On a high traffic website, the archiving process may require more memory than currently allowed. If necessary, change the memory_limit directive in your php.ini file.",
1907
  "SystemCheckMemoryNoMemoryLimitSet": "There is no memory limit set",
1918
  "SystemCheckPdoAndMysqliHelp": "On a GNU\/Linux server you can compile php with the following options: %1$s In your php.ini, add the following lines: %2$s",
1919
  "SystemCheckPhp": "PHP version",
1920
  "SystemCheckPhpPdoAndMysqli": "More information on: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
 
1921
  "SystemCheckSessionHelp": "You need to configure and rebuild PHP with \"session\" support enabled (don't use --disable-session).",
1922
  "SystemCheckSettings": "Required PHP configuration (php.ini)",
1923
  "SystemCheckSummaryNoProblems": "Huzzah! There are no problems with your Matomo setup. Give yourself a pat on the back.",
3973
  "OnlyMatchedUrlsAllowedHelp": "When enabled, Matomo will only track internal actions when the Page URL is one of the known URLs for your website. This prevents people from spamming your analytics with URLs for other websites.",
3974
  "OnlyMatchedUrlsAllowedHelpExamples": "The domain and the path have to be an exact match and each valid subdomain has to be specified separately. For example when the known URLs are 'http:\/\/example.com\/path' and 'http:\/\/good.example.com', tracking requests for 'http:\/\/example.com\/otherpath' or 'http:\/\/bad.example.com' are ignored.",
3975
  "WebsitesManagement": "Websites Management",
3976
+ "WebsiteUpdated": "Website updated",
3977
+ "WebsiteCreated": "Website created",
3978
  "XManagement": "Manage %s",
3979
  "ChooseMeasurableTypeHeadline": "What would you like to measure?",
3980
  "YouCurrentlyHaveAccessToNWebsites": "You currently have access to %s websites.",
app/lang/es-ar.json CHANGED
@@ -16,6 +16,7 @@
16
  "Apply": "Aplicar",
17
  "ArchivingInlineHelp": "Para sitios web de tráfico medio a alto, se recomienda deshabilitar el archivado de Matomo al ingresar con el navegador. En su lugar, te recomendamos que configurés una tarea de cron para procesar los informes de Matomo cada hora.",
18
  "ArchivingTriggerDescription": "Recomendado para grandes instalaciones de Matomo. Necesitás %1$sconfigurar una tarea de cron%2$s para procesar los informes automáticamente.",
 
19
  "AuthenticationMethodSmtp": "Método de autenticación SMTP",
20
  "AverageOrderValue": "Valor promedio por pedido",
21
  "AveragePrice": "Precio promedio",
@@ -32,6 +33,7 @@
32
  "ChooseLanguage": "Elegir idioma",
33
  "ChoosePeriod": "Elegir período",
34
  "ClickHere": "Hacé clic acá para más información.",
 
35
  "DoubleClickToChangePeriod": "Hacé doble clic para aplicar este período.",
36
  "Close": "Cerrar",
37
  "ClickToSearch": "Hacé clic para buscar",
@@ -133,7 +135,10 @@
133
  "DaysHours": "%1$s días %2$s horas",
134
  "DaysSinceFirstVisit": "Días desde la primera visita",
135
  "DaysSinceLastEcommerceOrder": "Días desde el último pedido de Comercio electrónico",
 
136
  "DaysSinceLastVisit": "Días desde la última visita",
 
 
137
  "Default": "Predeterminado",
138
  "DefaultAppended": "(predeterminado)",
139
  "Delete": "Eliminar",
@@ -172,6 +177,8 @@
172
  "ExceptionDatabaseVersion": "Tu versión de %1$s es %2$s, pero Matomo necesita al menos la %3$s.",
173
  "ExceptionDatabaseVersionNewerThanCodebase": "Tu código base de Matomo está ejecutando la antigua versión %1$s y detectamos que tu base de datos de Matomo ya fue actualizada a la versión más reciente %2$s.",
174
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Puede que tu administrador de Matomo esté finalizando el proceso de actualización en este preciso momento. Por favor, volvé a intentar en unos minutos.",
 
 
175
  "ExceptionFileIntegrity": "Falló la verificación de integridad: %s",
176
  "ExceptionFilesizeMismatch": "Tamaño de archivo incorrecto: %1$s (se esperaba %2$s, se encontró: %3$s)",
177
  "ExceptionIncompatibleClientServerVersions": "La versión de tu cliente %1$s %2$s es incompatible con la versión del servidor %3$s.",
@@ -206,6 +213,8 @@
206
  "ExceptionWidgetNotFound": "El widget solicitado no existe.",
207
  "ExceptionReportNotEnabled": "El informe solicitado no está habilitado. Esto por lo general significa que, o bien el plugin que define el informe está deshabilitado, o bien no tenés suficiente permiso para acceder a este informe.",
208
  "ExceptionWidgetNotEnabled": "El widget solicitado no está habilitado. Esto normalmente significa que, o bien el plugin que define el widget está desactivado, o bien que no tenés los permisos suficientes para acceder a este widget.",
 
 
209
  "ExpandDataTableFooter": "Cambiá la visualización o configurá el informe",
210
  "Export": "Exportar",
211
  "ExportAsImage": "Exportar como imagen",
@@ -483,6 +492,7 @@
483
  "WarningFileIntegrityNoMd5file": "La verificación de integridad no pudo ser completada debido a que falta la función md5_file().",
484
  "WarningPasswordStored": "%1$sAdvertencia:%2$s esta contraseña se guardará en el archivo de configuración visible para todo aquel que pueda accederlo.",
485
  "WarningDebugOnDemandEnabled": "El modo de seguimiento de %1$s está habilitado. Por razones de seguridad, esto debería estar habilitado sólo por un corto período de tiempo. Para deshabilitarlo, establecé %2$s a %3$s en %4$s.",
 
486
  "Website": "Sitio web",
487
  "Weekly": "Semanal",
488
  "WeeklyReport": "semanal",
@@ -514,7 +524,11 @@
514
  "MaximumNumberOfSegmentsComparedIs": "El número máximo de segmentos que pueden ser comparados simultáneamente es %s.",
515
  "CompareDatesParamMustMatchComparePeriods": "La longitud del parámetro de consulta de %1$s debe coincidir la longitud de parámetro de consulta de %2$s.",
516
  "MaximumNumberOfPeriodsComparedIs": "El número máximo de períodos que pueden ser comparados simultáneamente es %s.",
517
- "Custom": "Personalizado"
 
 
 
 
518
  },
519
  "Mobile": {
520
  "AboutPiwikMobile": "Acerca de Matomo Mobile",
@@ -619,7 +633,9 @@
619
  "ReportingApiReference": "Informe de referencia de API",
620
  "TopLinkTooltip": "Accedé a tus datos de análisis web programáticamente, a través de una sencilla API en JSON, XML, etc.",
621
  "UserAuthentication": "Autenticación de usuario",
 
622
  "Glossary": "Glosario",
 
623
  "LearnAboutCommonlyUsedTerms2": "Aprendé más sobre los términos usados comúnmente para sacar el mayor provecho a los análisis de Matomo.",
624
  "EvolutionMetricName": "%s Evolution"
625
  },
@@ -656,6 +672,7 @@
656
  "ColumnUniqueOutlinks": "Enlaces de salida Únicos",
657
  "ColumnIdPageview": "ID de paginas vistas",
658
  "ColumnInteractionPosition": "Posición de interacción",
 
659
  "ActionsInVisit": "Acciones en visita",
660
  "DownloadsReportDocumentation": "En este informe, podés ver qué archivos descargaron tus visitantes. %s Lo que Matomo cuenta como descarga es el clic en un enlace de descarga. Matomo no puede saber si la descarga fue completada.",
661
  "EntryPagesReportDocumentation": "Este informe contiene información sobre las páginas de entrada que fueron usada durante el período especificado. Una página de entrada es la primera página que un usuario ve durante su visita. %s Las direcciones web de entrada se muestran como una estructura de carpeta.",
@@ -664,6 +681,7 @@
664
  "ExitPagesReportDocumentation": "Este informe contiene información sobre las páginas de salida que ocurrieron durante el período especificado. Una página de salida es la última página que un usuario ve durante su visita. %s Las direcciones web de salida se muestran como una estructura de carpeta.",
665
  "ExitPageTitles": "Títulos de páginas de salida",
666
  "ExitPageTitlesReportDocumentation": "Este reporte contiene información sobre los títulos de las páginas de salida que ocurrieron durante el período específico.",
 
667
  "OneSearch": "1 búsqueda",
668
  "OutlinkDocumentation": "Un enlace externo es un enlace que lleva a su visitante fuera de su página web (a otro dominio).",
669
  "OutlinksReportDocumentation": "Este reporte muestra una lista de los enlaces externos que han sido clicados por sus visitantes, organizada por jerarquía.",
@@ -681,6 +699,8 @@
681
  "SiteSearchCategories": "Categorías (búsqueda en el sitio)",
682
  "SiteSearchKeyword": "Palabra clave (Búsqueda en Sitio)",
683
  "SiteSearchKeywords": "Palabras claves (búsqueda en el sitio)",
 
 
684
  "SiteSearchKeywordsDocumentation": "Este reporte muestra las palabras clave que tus visitantes buscaron en tu motor de búsqueda interno.",
685
  "SiteSearchKeywordsNoResultDocumentation": "Este reporte lista las palabras clave que no produjeron resultados: ¿se podría mejorar el algoritmo de búsqueda o quizá tus visitantes están buscando algún contenido que no se encuentra (todavía) en tu sitio?",
686
  "SubmenuPagesEntry": "Páginas de entrada",
@@ -700,7 +720,22 @@
700
  "ActionType": "Tipo de Acción",
701
  "ActionTypes": "Tipos de acción",
702
  "Behaviour": "Comportamiento",
703
- "PagesSubcategoryHelp3": "Use los íconos de más y menos en la izquierda para navegar."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
704
  },
705
  "Annotations": {
706
  "AddAnnotationsFor": "Agregar anotaciones para %s…",
@@ -730,15 +765,19 @@
730
  "ContentInteractions": "Interacciones de contenido",
731
  "InteractionRate": "Tasa de interacción",
732
  "ContentName": "Nombre del contenido",
 
733
  "ContentNames": "Nombres del contenido",
734
  "ContentPiece": "Pieza del contenido",
 
735
  "ContentPieces": "Piezas del contenido",
736
  "ContentTarget": "Objetivo del contenido",
737
  "ContentTargets": "Objetivos del contenido",
738
  "Contents": "Contenidos",
739
  "InteractionsMetricDocumentation": "El número de veces con que un bloque de contenido interactuó (por ejemplo, un clic en un báner o publicidad).",
740
  "ImpressionsMetricDocumentation": "El número de veces que un bloque de contenido, como un báner o una publicidad, fue mostrado en una página.",
741
- "InteractionRateMetricDocumentation": "La tasa entre las impresiones del contenido y las interacciones."
 
 
742
  },
743
  "CoreAdminHome": {
744
  "AddNewTrustedHost": "Agregá un nuevo servidor de confianza",
@@ -880,7 +919,24 @@
880
  "TrackingFailuresEmail1": "Esto es sólo para hacerte saber que %s diferentes tipos de fallos de rastreo han ocurrido en los últimos días.",
881
  "TrackingFailuresEmail2": "Para ver todas las solicitudes de rastreo que fallaron, %1$shacé clic acá%2$s.",
882
  "ImportFromGoogleAnalytics": "Importar desde Google Analytics",
883
- "ImportFromGoogleAnalyticsDescription": "Si tenés datos existentes en Google Analytics y te estás cambiando a Matomo, podés exportar esos datos usando el plugin %1$sGoogleAnalyticsImporter%2$s."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
884
  },
885
  "CoreHome": {
886
  "CategoryNoData": "No hay datos en esta categoría. Intentá \"Incluir toda la población\".",
@@ -899,6 +955,7 @@
899
  "DataTableHowToSearch": "Presioná \"Enter\" o hacé clic en el ícono de búsqueda para buscar",
900
  "DataTableShowDimensions": "Las dimensiones están combinadas %s Mostrar dimensiones separadamente",
901
  "DataTableCombineDimensions": "Las dimensiones se muestran separadamente %s Mostrar dimensiones combinadas",
 
902
  "Default": "predeterminado",
903
  "DonateCall1": "Matomo nunca te costará nada para usarlo, pero eso no significa que no nos cueste hacerlo.",
904
  "DonateCall2": "Matomo necesita de tu contínuo apoyo para crecer y prosperar.",
@@ -906,6 +963,7 @@
906
  "EndShortcut": "Fin",
907
  "EnterZenMode": "Entrar al modo Zen (ocultar los menús)",
908
  "ExitZenMode": "Salir del modo Zen (mostrar los menús)",
 
909
  "ExcludeRowsWithLowPopulation": "Se muestran todas las filas %s Excluir baja población",
910
  "ExternalHelp": "Ayuda (se abre en una nueva pestaña)",
911
  "FlattenDataTable": "Este informe es jerárquico %s Hacelo plano",
@@ -913,6 +971,7 @@
913
  "ShowExportUrl": "Mostrar dirección web de exportación",
914
  "HideExportUrl": "Ocultar dirección web de exportación",
915
  "HomeShortcut": "Página principal",
 
916
  "IncludeRowsWithLowPopulation": "Se ocultan las filas con baja población %s Mostrar todas las filas",
917
  "InjectedHostEmailBody": "Hola, hoy intenté acceder a Matomo pero encontré la advertencia sobre nombre de dominio (\"hostname\") desconocido.",
918
  "InjectedHostEmailSubject": "Se accedió a Matomo desde un servidor desconocido: %s",
@@ -925,6 +984,8 @@
925
  "VisitTypeReturning": "Regresos",
926
  "VisitTypeReturningCustomer": "Cliente que vuelve",
927
  "MainNavigation": "Navegación principal",
 
 
928
  "Menu": "Menú",
929
  "NoPrivilegesAskPiwikAdmin": "Iniciaste sesión como \"%1$s\", pero parece que no tenés ningún permiso configurado en Matomo. %2$sConsultá al administrador de tu Matomo (hacé clic para enviarle un correo electrónico)%3$s para que te dé acceso de lectura al sitio web.",
930
  "OnlyForSuperUserAccess": "Este widget se muestra en el panel principal sólo a los usuarios que tengan acceso de súper usuario.",
@@ -961,6 +1022,8 @@
961
  "PivotBySubtable": "Este informe no fue pivotado %1$s Pivote por %2$s",
962
  "SystemSummaryWidget": "Resumen del sistema",
963
  "SystemSummaryNWebsites": "%d sitios web",
 
 
964
  "SystemSummaryNActivatedPlugins": "%d plugins activos",
965
  "SystemSummaryPiwikVersion": "Versión de Matomo",
966
  "SystemSummaryMysqlVersion": "Versión de MySQL",
@@ -980,6 +1043,8 @@
980
  "RowLimit": "Límite fe fila",
981
  "CustomLimit": "Límite personalizado",
982
  "ExportFormat": "Exportar formato",
 
 
983
  "ExpandSubtables": "Expandir subtablas",
984
  "StandardReport": "Informe estándar",
985
  "FlattenReport": "Aplanar informe",
@@ -987,7 +1052,17 @@
987
  "ReadMoreOnlineGuide": "Leé más sobre este tema en la guía en línea.",
988
  "SeeAvailableVersions": "Ver las versiones disponibles",
989
  "QuickLinks": "Enlaces rápidos",
990
- "SearchOnMatomo": "Buscá \"%1$s\" en matomo.org"
 
 
 
 
 
 
 
 
 
 
991
  },
992
  "CorePluginsAdmin": {
993
  "ActionUninstall": "Desinstalar",
@@ -1023,6 +1098,7 @@
1023
  "MissingRequirementsNotice": "Por favor, actualizá %1$s %2$s a una versión más reciente, se requiere %1$s %3$s.",
1024
  "MissingRequirementsPleaseInstallNotice": "Por favor, instalá %1$s %2$s ya que es requerido por %3$s.",
1025
  "NoZipFileSelected": "Por favor, seleccioná un archivo ZIP.",
 
1026
  "NumUpdatesAvailable": "%s actualización\/es disponible\/s",
1027
  "NoPluginSettings": "No hay configuración disponible para el plugin",
1028
  "Origin": "Origen",
@@ -1084,6 +1160,7 @@
1084
  "DisablingIncompatiblePlugins": "Deshabilitando plugins incompatibles: %s",
1085
  "DownloadingUpdateFromX": "Descargando actualización desde %s",
1086
  "DownloadX": "Descargar %s",
 
1087
  "EmptyDatabaseError": "La base de datos %s está vacía. Tenés que editar o quitar tu archivo de configuración de Matomo.",
1088
  "ErrorDIYHelp": "Si sos un usuario avanzado y encontrás un error en la actualización de la base de datos:",
1089
  "ErrorDIYHelp_1": "identificá y corregí el origen del problema (por ejemplo, memory_limit o max_execution_time)",
@@ -1168,7 +1245,12 @@
1168
  "YouMustDownloadPackageOrFixPermissions": "Matomo no puede sobreescribir tu instalación actual. Podés, o bien corregir los permisos del directorio o archivo, o bien descargar el paquete e instalar la versión %s manualmente:",
1169
  "YourDatabaseIsOutOfDate": "Tu basde de datos de Matomo está desactualizada y debe ser actualizada antes de continuar.",
1170
  "ViewVersionChangelog": "Ver el registro de cambios de esta versión:",
1171
- "ReceiveEmailBecauseIsSuperUser": "Recibís este correo electrónico porque sos un súperusuario en la instalación de Matomo en: %s"
 
 
 
 
 
1172
  },
1173
  "CustomJsTracker": {
1174
  "PluginDescription": "Permite a cualquier plugin extender el archivo de rastreo vía JavaScript de Matomo (\"matomo.js\"), y agrega nuevas capacidades de medición de funcionalidad y sitios web.",
@@ -1228,7 +1310,8 @@
1228
  "SetAsDefaultWidgetsConfirmHelp": "Esta selección de widgets y diseño de columnas del panel será usada cuando un usuario cree un nuevo panel o cuando se use la función \"%s\".",
1229
  "TopLinkTooltip": "Ver informes de análisis web para %s.",
1230
  "WidgetNotFound": "Widget no encontrado",
1231
- "WidgetPreview": "Previsualización del Widget"
 
1232
  },
1233
  "DevicePlugins": {
1234
  "BrowserWithNoPluginsEnabled": "%1$s sin plugins habilitados",
@@ -1390,7 +1473,6 @@
1390
  "ContactUs": "Contactanos",
1391
  "VisitTheForums": "Visitá los %1$sforos%2$s y obtené ayuda de la comunidad de usuarios de Matomo",
1392
  "Forums": "Foros",
1393
- "ReviewMatomoTitle": "¿Creés en Matomo?",
1394
  "PleaseLeaveExternalReviewForMatomo": "Compartí tus pensamientos en uno de estos sitios e inspirá a que otros se unan a nuestra revolución de los datos.",
1395
  "RemindMeLater": "Recordarme después",
1396
  "NeverAskMeAgain": "No volver a preguntarme",
@@ -1400,7 +1482,8 @@
1400
  "RemoveOtherLabel": "Quiero ver los datos de mis \"Otros\"",
1401
  "PurgeOldData": "Quiero quitar datos viejos",
1402
  "SearchHelpResources": "Buscá los recursos de ayuda de matomo.org",
1403
- "PopularHelpTopics": "Temas populares de ayuda"
 
1404
  },
1405
  "GeoIp2": {
1406
  "AssumingNonApache": "No se puede encontrar la función \"apache_get_modules\", asumiendo que se posee un servidor de internet no-Apache.",
@@ -1640,6 +1723,10 @@
1640
  "GoBackAndDefinePrefix": "Volvé y definí un prefijo para las tablas de Matomo",
1641
  "HappyAnalysing": "¡Que la pasés bien!",
1642
  "Installation": "Instalación",
 
 
 
 
1643
  "InstallationStatus": "Estado de la instalación",
1644
  "InsufficientPrivilegesHelp": "Podés agregar estos privilegios utilizando una herramienta como phpMyAdmin o ejecutando las solicitudes SQL correspondientes. Si no sabés cómo hacer ninguna de estas operaciones, por favor, solicitá asistencia a tu administrador de sistema para que te conceda estos privilegios.",
1645
  "InsufficientPrivilegesMain": "O bien la base de datos no existe (y pudo no ser creada), o bien el usuario especificado tiene privilegios insuficientes. El usuario de base de datos debe tener los siguientes privilegios: %s",
@@ -1700,6 +1787,7 @@
1700
  "SystemCheckEvalHelp": "Requerido por el formulario HTML QuickForm y el sistema inteligente de plantillas.",
1701
  "SystemCheckExtensions": "Otras extensiones requeridas",
1702
  "SystemCheckFileIntegrity": "Integridad de archivo",
 
1703
  "SystemCheckFunctions": "Funciones requeridas",
1704
  "SystemCheckFunctionHelp": "Necesitás habilitar esta función incorporada.",
1705
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (gráficos)",
@@ -1708,12 +1796,11 @@
1708
  "SystemCheckGzcompressHelp": "Necesitás habilitar la extensión zlib y la función gzcompress.",
1709
  "SystemCheckGzuncompressHelp": "Necesitás habilitar la extensión zlib y la función gzcompress.",
1710
  "SystemCheckHashHelp": "Necesitás configurar y reconstruir PHP con el soporte \"hash()\" habilitado excluyendo la opción --disable-hash.",
1711
- "SystemCheckIconvHelp": "Necesitás configurar y reconstruir PHP con soporte \"iconv\" habilitado, --with-iconv.",
1712
  "SystemCheckMailHelp": "Los mensajes de Feedback y Recuperar Contraseña no se enviarán sin mail().",
1713
- "SystemCheckMbstring": "mbstring",
1714
- "SystemCheckMbstringHelp": "Se requiere la extensión mbstring para manejar caracteres multibyte en la interface de usuario y en las respuestas de API. También, por favor revisá que mbstring.func_overload esté establecido a \"0\" en \"php.ini\".",
1715
  "SystemCheckMemoryLimit": "Límite de memoria",
1716
  "SystemCheckMemoryLimitHelp": "En un sitio web de alto tráfico, el proceso de archivo puede requerir más memoria de la que se permite actualmente.<br \/>De ser necesario, cambiá la directiva memory_limit en tu archivo \"php.ini\".",
 
1717
  "SystemCheckNoErrorsOrWarnings": "No hay errores o advertencias",
1718
  "SystemCheckViewFullSystemCheck": "Ver el informe completo de revisión del sistema",
1719
  "SystemCheckOpenURL": "Abrir dirección web",
@@ -1727,7 +1814,7 @@
1727
  "SystemCheckPdoAndMysqliHelp": "En un servidor GNU\/Linux podés compilar php con las siguientes opciones: %1$s En tu \"php.ini\", agregá las siguientes líneas: %2$s",
1728
  "SystemCheckPhp": "Versión PHP",
1729
  "SystemCheckPhpPdoAndMysqli": "Más información en: %1$sPHP PDO%2$s y %3$sMYSQLI%4$s.",
1730
- "SystemCheckSplHelp": "Necesitás configurar y reconstruir PHP con la Librería Estándar de PHP habilitada (predeterminadamente).",
1731
  "SystemCheckSettings": "Se requiere configuración PHP (php.ini)",
1732
  "SystemCheckSummaryNoProblems": "¡Esssa! No hay problemas con tu configuración de Matomo. Date una palmadita en la espalda.",
1733
  "SystemCheckSummaryThereWereErrors": "¡Epa! Matomo detectó algunos %1$sproblemas críticos%2$s con tu configuración Matomo. %3$sEstos problemas deberían corregirse inmediatamente.%4$s",
@@ -1737,12 +1824,16 @@
1737
  "SystemCheckTrackerHelp": "Falló la solicitud GET a \"matomo.php\". Intentá permitir esta dirección web en tu autenticación HTTP y deshabilitá \"mod_security\" (podés pedírselo a tu administrador web). Para más información sobre el error, revisá el archivo de registro de errores de tu servidor web.",
1738
  "SystemCheckWarnDomHelp": "Deberías habilitar la extensión \"dom\" (ej., instalar el paquete \"php-dom\" y\/o el paquete \"php-xml\").",
1739
  "SystemCheckWarning": "Matomo funcionará normalmente, pero algunas funciones pueden estar ausentes",
 
1740
  "SystemCheckWarnLibXmlHelp": "Deberías habilitar la extensión \"libxml\" (ej., instalar el paquete \"php-libxml\") ya que esta es requerida por otras extensiones de PHP.",
 
1741
  "SystemCheckWarnSimpleXMLHelp": "Deberías habilitar la extensión \"SimpleXML\" (ej., instalar el paquete \"php-simplexml\" y\/o el paquete \"php-xml\").",
1742
  "SystemCheckWinPdoAndMysqliHelp": "En un servidor Windows podés agregar las siguientes líneas a tu php.ini: %s",
1743
  "SystemCheckWriteDirs": "Directorios con acceso de escritura",
1744
  "SystemCheckWriteDirsHelp": "Para arreglar este error en tu sistema GNU\/Linux, intentá escribir los siguientes comandos",
1745
  "SystemCheckZlibHelp": "Necesitás configurar y reconstruir PHP con el soporte \"zlib\" habilitado, --with-zlib.",
 
 
1746
  "SystemCheckCronArchiveProcessCLI": "Administración de procesos vía CLI",
1747
  "SystemCheckPhpSetting": "Para prevenir algunos problemas críticos, debés establecer lo siguiente en tu archivo \"php.ini\": %s",
1748
  "SystemCheckUpdateHttps": "Actualización sobre HTTPS",
@@ -1763,7 +1854,10 @@
1763
  "WelcomeHelp": "<p>Matomo es software libre de análisis de web que hace fácil obtener la información que querés de tus visitantes.<\/p> <p>Este proceso está dividido hasta en %s fáciles pasos y llevará unos 5 minutos.<\/p>",
1764
  "WelcomeToCommunity": "¡Bienvenido a la comunidad Matomo!",
1765
  "CannotConnectToDb": "No se puede conectar a la base de datos",
1766
- "CannotConnectToDbResolvingExplanation": "Esto podría ser un problema tempóral, intentá %1$srecargar la página%2$s. Si el problema persiste, por favor, contactá a tu administrador de Matomo."
 
 
 
1767
  },
1768
  "Intl": {
1769
  "Continent_afr": "África",
@@ -3041,7 +3135,9 @@
3041
  "Evolution": "Evolución",
3042
  "LoadingWebsites": "Cargando sitios web",
3043
  "PluginDescription": "Mirá y compará todos tus sitios web y aplicaciones en este útil panel \"Todos los sitios web\".",
3044
- "TopLinkTooltip": "Compará estadísticas de análisis web para todos tus sitios."
 
 
3045
  },
3046
  "Overlay": {
3047
  "Clicks": "%s clics",
@@ -3730,7 +3826,7 @@
3730
  "FormElementVariableDescription": "Una instancia del elemento que fue enviado.",
3731
  "FormClassesVariableDescription": "El valor de todos los nombres de clase CSS de un formulario enviado.",
3732
  "FormClassesVariableName": "Clases de formulario",
3733
- "FormDestinationVariableDescription": "El valor dela dirección de acción de formulario de un formulario enviado.",
3734
  "FormDestinationVariableName": "Dirección web del destino del formulario",
3735
  "FormIdVariableDescription": "El valor del atributo de identificación de un formulario enviado.",
3736
  "FormIdVariableName": "Identificación de formulario",
@@ -3899,6 +3995,7 @@
3899
  "ScrollLeftPixelVariableDescription": "Cuánto se desplazó horizontalmente el usuario en píxeles, por ejemplo: \"592\".",
3900
  "ScrollLeftPixelVariableName": "Píxel de desplazamiento izquierdo",
3901
  "ScrollReachTriggerDescription": "Accionado tan pronto como el usuario se desplaza a cierta posición.",
 
3902
  "ScrollReachTriggerName": "Desplazamiento alcanzado",
3903
  "ScrollSourceVariableDescription": "Cuando la posición de desplazamiento fue originada desde un desplazamiento de usuario o un redimensionamiento del navegador web. El valor es \"scroll\" o \"resize\".",
3904
  "ScrollSourceVariableName": "Fuente de desplazamiento",
@@ -4009,6 +4106,7 @@
4009
  "WeekdayVariableDescription": "Devuelve el día local de la semana. Por ejemplo: lunes, martes, miércoles, etc.",
4010
  "WeekdayVariableName": "Día de la semana",
4011
  "WindowLeaveTriggerDescription": "Accionado cuando el usuario está a punto de dejar la página actual moviendo el cursor fuera de la ventana.",
 
4012
  "WindowLeaveTriggerName": "Abandono de ventana",
4013
  "WindowLoadedTriggerDescription": "Accionado cuando la página está completamente cargada, incluyendo todas las imágenes, etc.",
4014
  "WindowLoadedTriggerHelp": "Esta etapa de carga de página web es cuando la página está completamente cargada, según el navegador web. En la mayoría de los casos, esto significa que también se cargaron las imágenes, que se aplicaron los estilos, etc. Este accionador siempre es accionado en algún punto después de \"DOM listo\".",
16
  "Apply": "Aplicar",
17
  "ArchivingInlineHelp": "Para sitios web de tráfico medio a alto, se recomienda deshabilitar el archivado de Matomo al ingresar con el navegador. En su lugar, te recomendamos que configurés una tarea de cron para procesar los informes de Matomo cada hora.",
18
  "ArchivingTriggerDescription": "Recomendado para grandes instalaciones de Matomo. Necesitás %1$sconfigurar una tarea de cron%2$s para procesar los informes automáticamente.",
19
+ "ArchivingTriggerSegment": "Usar Segmentos personalizados accionará el procesado de archivos.",
20
  "AuthenticationMethodSmtp": "Método de autenticación SMTP",
21
  "AverageOrderValue": "Valor promedio por pedido",
22
  "AveragePrice": "Precio promedio",
33
  "ChooseLanguage": "Elegir idioma",
34
  "ChoosePeriod": "Elegir período",
35
  "ClickHere": "Hacé clic acá para más información.",
36
+ "CompareTo": "Comparar con:",
37
  "DoubleClickToChangePeriod": "Hacé doble clic para aplicar este período.",
38
  "Close": "Cerrar",
39
  "ClickToSearch": "Hacé clic para buscar",
135
  "DaysHours": "%1$s días %2$s horas",
136
  "DaysSinceFirstVisit": "Días desde la primera visita",
137
  "DaysSinceLastEcommerceOrder": "Días desde el último pedido de Comercio electrónico",
138
+ "SecondsSinceLastEcommerceOrder": "Segundos desde el último pedido Ecommerce",
139
  "DaysSinceLastVisit": "Días desde la última visita",
140
+ "SecondsSinceLastVisit": "Segundos desde la última visita",
141
+ "SecondsSinceFirstVisit": "Segundos desde la primera visita",
142
  "Default": "Predeterminado",
143
  "DefaultAppended": "(predeterminado)",
144
  "Delete": "Eliminar",
177
  "ExceptionDatabaseVersion": "Tu versión de %1$s es %2$s, pero Matomo necesita al menos la %3$s.",
178
  "ExceptionDatabaseVersionNewerThanCodebase": "Tu código base de Matomo está ejecutando la antigua versión %1$s y detectamos que tu base de datos de Matomo ya fue actualizada a la versión más reciente %2$s.",
179
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Puede que tu administrador de Matomo esté finalizando el proceso de actualización en este preciso momento. Por favor, volvé a intentar en unos minutos.",
180
+ "ExceptionDatabaseUnavailable": "El servidor MySQL desapareció",
181
+ "ExceptionDatabaseAccess": "Se denegó el acceso a la base de datos",
182
  "ExceptionFileIntegrity": "Falló la verificación de integridad: %s",
183
  "ExceptionFilesizeMismatch": "Tamaño de archivo incorrecto: %1$s (se esperaba %2$s, se encontró: %3$s)",
184
  "ExceptionIncompatibleClientServerVersions": "La versión de tu cliente %1$s %2$s es incompatible con la versión del servidor %3$s.",
213
  "ExceptionWidgetNotFound": "El widget solicitado no existe.",
214
  "ExceptionReportNotEnabled": "El informe solicitado no está habilitado. Esto por lo general significa que, o bien el plugin que define el informe está deshabilitado, o bien no tenés suficiente permiso para acceder a este informe.",
215
  "ExceptionWidgetNotEnabled": "El widget solicitado no está habilitado. Esto normalmente significa que, o bien el plugin que define el widget está desactivado, o bien que no tenés los permisos suficientes para acceder a este widget.",
216
+ "ExceptionNotSupportedBrowserTitle": "Tu navegador web no es compatible.",
217
+ "ExceptionNotSupportedBrowserText": "Debido a problemas de seguridad, tu navegador web no es compatible. Por favor, actualizá a una versión más nueva.",
218
  "ExpandDataTableFooter": "Cambiá la visualización o configurá el informe",
219
  "Export": "Exportar",
220
  "ExportAsImage": "Exportar como imagen",
492
  "WarningFileIntegrityNoMd5file": "La verificación de integridad no pudo ser completada debido a que falta la función md5_file().",
493
  "WarningPasswordStored": "%1$sAdvertencia:%2$s esta contraseña se guardará en el archivo de configuración visible para todo aquel que pueda accederlo.",
494
  "WarningDebugOnDemandEnabled": "El modo de seguimiento de %1$s está habilitado. Por razones de seguridad, esto debería estar habilitado sólo por un corto período de tiempo. Para deshabilitarlo, establecé %2$s a %3$s en %4$s.",
495
+ "WarningDevelopmentModeOnButNotGitInstalled": "Actualmente estás usando Matomo en modo de desarrollador, pero no se instaló a través de git. No se recomienda usar Matomo en modo de desarrollador en un entorno de producción.",
496
  "Website": "Sitio web",
497
  "Weekly": "Semanal",
498
  "WeeklyReport": "semanal",
524
  "MaximumNumberOfSegmentsComparedIs": "El número máximo de segmentos que pueden ser comparados simultáneamente es %s.",
525
  "CompareDatesParamMustMatchComparePeriods": "La longitud del parámetro de consulta de %1$s debe coincidir la longitud de parámetro de consulta de %2$s.",
526
  "MaximumNumberOfPeriodsComparedIs": "El número máximo de períodos que pueden ser comparados simultáneamente es %s.",
527
+ "Custom": "Personalizado",
528
+ "PreviousPeriod": "Período anterior",
529
+ "PreviousYear": "Año anterior",
530
+ "ViewAccessRequired": "El token_auth usado tiene demasiados accesos para ser usado en una dirección web de solicitud que no sea de la no API. Por favor, usá una contraseña de aplicación específica para un usuario que sólo tiene acceso de vista.",
531
+ "Reasons": "Motivos"
532
  },
533
  "Mobile": {
534
  "AboutPiwikMobile": "Acerca de Matomo Mobile",
633
  "ReportingApiReference": "Informe de referencia de API",
634
  "TopLinkTooltip": "Accedé a tus datos de análisis web programáticamente, a través de una sencilla API en JSON, XML, etc.",
635
  "UserAuthentication": "Autenticación de usuario",
636
+ "UsingTokenAuth": "Si querés %1$ssolicitar datos dentro de un script, un crontab, etc%2$s necesitás agregar el parámetro de la dirección web %3$s a las direcciones web de llamada de la API que requieren autenticación.",
637
  "Glossary": "Glosario",
638
+ "MainMetricsReportDocumentation": "Este informe te da un pantallazo de las métricas más importantes de todas las categorías y plugins.",
639
  "LearnAboutCommonlyUsedTerms2": "Aprendé más sobre los términos usados comúnmente para sacar el mayor provecho a los análisis de Matomo.",
640
  "EvolutionMetricName": "%s Evolution"
641
  },
672
  "ColumnUniqueOutlinks": "Enlaces de salida Únicos",
673
  "ColumnIdPageview": "ID de paginas vistas",
674
  "ColumnInteractionPosition": "Posición de interacción",
675
+ "ColumnPageViewPosition": "Posición de la vista de página",
676
  "ActionsInVisit": "Acciones en visita",
677
  "DownloadsReportDocumentation": "En este informe, podés ver qué archivos descargaron tus visitantes. %s Lo que Matomo cuenta como descarga es el clic en un enlace de descarga. Matomo no puede saber si la descarga fue completada.",
678
  "EntryPagesReportDocumentation": "Este informe contiene información sobre las páginas de entrada que fueron usada durante el período especificado. Una página de entrada es la primera página que un usuario ve durante su visita. %s Las direcciones web de entrada se muestran como una estructura de carpeta.",
681
  "ExitPagesReportDocumentation": "Este informe contiene información sobre las páginas de salida que ocurrieron durante el período especificado. Una página de salida es la última página que un usuario ve durante su visita. %s Las direcciones web de salida se muestran como una estructura de carpeta.",
682
  "ExitPageTitles": "Títulos de páginas de salida",
683
  "ExitPageTitlesReportDocumentation": "Este reporte contiene información sobre los títulos de las páginas de salida que ocurrieron durante el período específico.",
684
+ "MainMetricsReportDocumentation": "Este informe un pantallazo muy básico de las acciones que tus visitantes hacen en tu sitio web.",
685
  "OneSearch": "1 búsqueda",
686
  "OutlinkDocumentation": "Un enlace externo es un enlace que lleva a su visitante fuera de su página web (a otro dominio).",
687
  "OutlinksReportDocumentation": "Este reporte muestra una lista de los enlaces externos que han sido clicados por sus visitantes, organizada por jerarquía.",
699
  "SiteSearchCategories": "Categorías (búsqueda en el sitio)",
700
  "SiteSearchKeyword": "Palabra clave (Búsqueda en Sitio)",
701
  "SiteSearchKeywords": "Palabras claves (búsqueda en el sitio)",
702
+ "SiteSearchKeywordCount": "Conteo de palabras clave (búsqueda del sitio)",
703
+ "SiteSearchKeywordCounts": "Conteos de palabras clave (búsqueda del sitio)",
704
  "SiteSearchKeywordsDocumentation": "Este reporte muestra las palabras clave que tus visitantes buscaron en tu motor de búsqueda interno.",
705
  "SiteSearchKeywordsNoResultDocumentation": "Este reporte lista las palabras clave que no produjeron resultados: ¿se podría mejorar el algoritmo de búsqueda o quizá tus visitantes están buscando algún contenido que no se encuentra (todavía) en tu sitio?",
706
  "SubmenuPagesEntry": "Páginas de entrada",
720
  "ActionType": "Tipo de Acción",
721
  "ActionTypes": "Tipos de acción",
722
  "Behaviour": "Comportamiento",
723
+ "TimeSpentInReferringAction": "Tiempo transcurrido en la acción referente",
724
+ "PagesSubcategoryHelp1": "Este informe contiene información sobre las direcciones web de la página que fueron visitadas.",
725
+ "PagesSubcategoryHelp2": "La tabla es organizada por jerarquía, las direcciones web son mostradas como una estructura de carpeta.",
726
+ "PagesSubcategoryHelp3": "Usá los íconos de más y menos en la izquierda para navegar.",
727
+ "EntryPagesSubcategoryHelp1": "Este informe contiene información sobre las páginas de entradas que fueron usadas durante el período especificado. Una página de entrada es la primer página que un usuario ve durante su visita.",
728
+ "EntryPagesSubcategoryHelp2": "Las direcciones web de entrada son mostradas como una estructura de carpeta.",
729
+ "ExitPagesSubcategoryHelp1": "Este informe contiene información sobre las páginas de salida que ocurrieron durante un períoso especificado. Una página de salida es la última página que un usuario ve durante su visita.",
730
+ "ExitPagesSubcategoryHelp2": "Las direcciones web de salida son mostradas como una estructura de carpeta.",
731
+ "PageTitlesSubcategoryHelp1": "Este informe contiene información sobre los títulos de las páginas que fueron visitadas.",
732
+ "PageTitlesSubcategoryHelp2": "El título de la página es la etiqueta HTML &amp;lt;título&amp;gt; que la mayoría de los navegadores web muestra en el título de la ventana.",
733
+ "SiteSearchSubcategoryHelp1": "La sección de búsqueda de sitio muestra qué palabras claves usaron los visitantes cuando buscaron en tu sitio web. También muestra qué páginas vieron los usuarios después de hacer una búsqueda y qué palabras claves de las búsquedas en el sitio no devolvieron resultados.",
734
+ "SiteSearchSubcategoryHelp2": "Estos informes te pueden dar ideas sobre contenido faltante o ausente en tu sitio web, así como ideas sobre lo que tus visitantes estaban buscando pero no pudieron encontrar fácilmente, y mucho más.",
735
+ "SiteSearchSubcategoryHelp3": "Aprendé más en la guía de Búsqueda del sitio.",
736
+ "OutlinksSubcategoryHelp1": "Este informe muestra una lista por jerarquía de enlaces de salida que fueron cliqueadas por tus visitantes. Un enlace de salida es un enlace que lleva al visitante a otro sitio web (a otro dominio).",
737
+ "DownloadsSubcategoryHelp1": "En este informe podés ver qué archivos descargaron tus visitantes.",
738
+ "DownloadsSubcategoryHelp2": "Lo que Matomo contabiliza como una descarga es el clic en el enlace de descarga. Matomo no sabe si la carga fue completada o no."
739
  },
740
  "Annotations": {
741
  "AddAnnotationsFor": "Agregar anotaciones para %s…",
765
  "ContentInteractions": "Interacciones de contenido",
766
  "InteractionRate": "Tasa de interacción",
767
  "ContentName": "Nombre del contenido",
768
+ "ContentNameReportDocumentation": "Este informe muestra los nombres del contenido que tus visitantes vieron e interactuaron.",
769
  "ContentNames": "Nombres del contenido",
770
  "ContentPiece": "Pieza del contenido",
771
+ "ContentPieceReportDocumentation": "Este informe muestra las piezas de contenido que tus visitantes vieron e interactuaron.",
772
  "ContentPieces": "Piezas del contenido",
773
  "ContentTarget": "Objetivo del contenido",
774
  "ContentTargets": "Objetivos del contenido",
775
  "Contents": "Contenidos",
776
  "InteractionsMetricDocumentation": "El número de veces con que un bloque de contenido interactuó (por ejemplo, un clic en un báner o publicidad).",
777
  "ImpressionsMetricDocumentation": "El número de veces que un bloque de contenido, como un báner o una publicidad, fue mostrado en una página.",
778
+ "InteractionRateMetricDocumentation": "La tasa entre las impresiones del contenido y las interacciones.",
779
+ "ContentsSubcategoryHelp1": "El rastreo de contenido te ayuda a determinar la popularidad de piezas específicas de contenido en cualquier página de tu sitio web o aplicación. Esta sección informa el número de impresiones e interacciones que las piezas de contenido de tu sitio web reciben.",
780
+ "ContentsSubcategoryHelp2": "Aprendé más en la guía de Rastreo de contenido."
781
  },
782
  "CoreAdminHome": {
783
  "AddNewTrustedHost": "Agregá un nuevo servidor de confianza",
919
  "TrackingFailuresEmail1": "Esto es sólo para hacerte saber que %s diferentes tipos de fallos de rastreo han ocurrido en los últimos días.",
920
  "TrackingFailuresEmail2": "Para ver todas las solicitudes de rastreo que fallaron, %1$shacé clic acá%2$s.",
921
  "ImportFromGoogleAnalytics": "Importar desde Google Analytics",
922
+ "ImportFromGoogleAnalyticsDescription": "Si tenés datos existentes en Google Analytics y te estás cambiando a Matomo, podés exportar esos datos usando el plugin %1$sGoogleAnalyticsImporter%2$s.",
923
+ "SecurityNotificationEmailSubject": "Notificación de seguridad",
924
+ "SecurityNotificationRecoveryCodesShowedBody": "Alguien vio los códigos de recuperación de la autenticación de dos factores de tu cuenta.",
925
+ "SecurityNotificationRecoveryCodesRegeneratedBody": "Alguien generó nuevos códigos de recuperación de la autenticación de dos factores para tu cuenta.",
926
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Alguien habilitó la autenticación de dos factores en tu cuenta.",
927
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Alguien deshabilitó la autenticación de dos factores en tu cuenta.",
928
+ "SecurityNotificationTokenAuthCreatedBody": "Alguien creó un token de autenticación (descripción: %s) en tu cuenta. Si no fuiste vos, eliminá el token.",
929
+ "SecurityNotificationTokenAuthDeletedBody": "Alguien eliminó un token de autenticación (descripción: %s) en tu cuenta.",
930
+ "SecurityNotificationAllTokenAuthDeletedBody": "Alguien eliminó todos los tokens de autenticación en tu cuenta.",
931
+ "SecurityNotificationSettingsChangedByUserBody": "Alguién modificó la configuración del sistema: Configuración afectada: %s.",
932
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Otro súperusuario (%1$s) modificó la configuración del sistema. Configuración afectada: %2$s. Si estás al tanto de esta actividad, no pasa nada. Pero si no la reconocés, por favor, ponete en contacto con los demás súperusuarios.",
933
+ "SecurityNotificationUserCreatedBody": "Alguien creó un nuevo usuario (nombre de usuario: %s) en tu cuenta.",
934
+ "SecurityNotificationUserDeletedBody": "Alguien eliminó un usuario (nombre de usuario: %s) en tu cuenta.",
935
+ "SecurityNotificationIfItWasYou": "Si fuiste vos, no pasa nada. Si no reconoés esta actividad, por favor, cambiá tu contraseña.",
936
+ "SecurityNotificationCheckTwoFactor": "Por favor, revisá la aplicación o dispositivo de tu autenticación de dos factores.",
937
+ "BruteForce": "Fuerza bruta",
938
+ "TwoFactorAuth": "Autenticación de dos factores",
939
+ "Cors": "Cors"
940
  },
941
  "CoreHome": {
942
  "CategoryNoData": "No hay datos en esta categoría. Intentá \"Incluir toda la población\".",
955
  "DataTableHowToSearch": "Presioná \"Enter\" o hacé clic en el ícono de búsqueda para buscar",
956
  "DataTableShowDimensions": "Las dimensiones están combinadas %s Mostrar dimensiones separadamente",
957
  "DataTableCombineDimensions": "Las dimensiones se muestran separadamente %s Mostrar dimensiones combinadas",
958
+ "DateInvalid": "La combinación ofrecida de fecha y período no es válida. Por favor, elegí una fecha válida en el selector de fechas.",
959
  "Default": "predeterminado",
960
  "DonateCall1": "Matomo nunca te costará nada para usarlo, pero eso no significa que no nos cueste hacerlo.",
961
  "DonateCall2": "Matomo necesita de tu contínuo apoyo para crecer y prosperar.",
963
  "EndShortcut": "Fin",
964
  "EnterZenMode": "Entrar al modo Zen (ocultar los menús)",
965
  "ExitZenMode": "Salir del modo Zen (mostrar los menús)",
966
+ "ExceptionNotAllowlistedIP": "No podés usar este Matomo ya que tu dirección IP %s no está permitida.",
967
  "ExcludeRowsWithLowPopulation": "Se muestran todas las filas %s Excluir baja población",
968
  "ExternalHelp": "Ayuda (se abre en una nueva pestaña)",
969
  "FlattenDataTable": "Este informe es jerárquico %s Hacelo plano",
971
  "ShowExportUrl": "Mostrar dirección web de exportación",
972
  "HideExportUrl": "Ocultar dirección web de exportación",
973
  "HomeShortcut": "Página principal",
974
+ "SupportUsOn": "Apoyanos en",
975
  "IncludeRowsWithLowPopulation": "Se ocultan las filas con baja población %s Mostrar todas las filas",
976
  "InjectedHostEmailBody": "Hola, hoy intenté acceder a Matomo pero encontré la advertencia sobre nombre de dominio (\"hostname\") desconocido.",
977
  "InjectedHostEmailSubject": "Se accedió a Matomo desde un servidor desconocido: %s",
984
  "VisitTypeReturning": "Regresos",
985
  "VisitTypeReturningCustomer": "Cliente que vuelve",
986
  "MainNavigation": "Navegación principal",
987
+ "YourDonationWillHelp": "Tu donación ayudará directamente a crear nuevas funciones y mejoras en esta plataforma de análisis web de código abierto. Esto significa que la comunidad siempre se beneficiará de una herramienta que protege la privacidad y que te permite tener el control de tus datos.",
988
+ "ThanksFromAllOfUs": "¡Gracias de parte de todos nosotros en Matomo!",
989
  "Menu": "Menú",
990
  "NoPrivilegesAskPiwikAdmin": "Iniciaste sesión como \"%1$s\", pero parece que no tenés ningún permiso configurado en Matomo. %2$sConsultá al administrador de tu Matomo (hacé clic para enviarle un correo electrónico)%3$s para que te dé acceso de lectura al sitio web.",
991
  "OnlyForSuperUserAccess": "Este widget se muestra en el panel principal sólo a los usuarios que tengan acceso de súper usuario.",
1022
  "PivotBySubtable": "Este informe no fue pivotado %1$s Pivote por %2$s",
1023
  "SystemSummaryWidget": "Resumen del sistema",
1024
  "SystemSummaryNWebsites": "%d sitios web",
1025
+ "SystemSummaryNSegments": "%1$d segmentos",
1026
+ "SystemSummaryNSegmentsWithBreakdown": "%1$d segmentos (%2$s preprocesados, %3$s procesados en tiempo real)",
1027
  "SystemSummaryNActivatedPlugins": "%d plugins activos",
1028
  "SystemSummaryPiwikVersion": "Versión de Matomo",
1029
  "SystemSummaryMysqlVersion": "Versión de MySQL",
1043
  "RowLimit": "Límite fe fila",
1044
  "CustomLimit": "Límite personalizado",
1045
  "ExportFormat": "Exportar formato",
1046
+ "ExportTooltip": "Nota: para usar la dirección web de exportación generada, vas a necesitar especificar una aplicación de autenticación de token. Podés configurar estos tokens en \"Administración\" > \"Seguridad\" > \"Autenticaciones de tokens\".",
1047
+ "ExportTooltipWithLink": "Nota: para usar la dirección web de exportación generada, vas a necesitar una aplicación de autenticación de token. Podés configurar estos tokens en %1$s[\"Administración\" > \"Seguridad\" > \"Autenticaciones de tokens\"]%2$s. Reemplazá %3$s en la dirección web de exportación por tu token de autenticación. Advertencia: nunca compartas la dirección web con el token real con nadie.",
1048
  "ExpandSubtables": "Expandir subtablas",
1049
  "StandardReport": "Informe estándar",
1050
  "FlattenReport": "Aplanar informe",
1052
  "ReadMoreOnlineGuide": "Leé más sobre este tema en la guía en línea.",
1053
  "SeeAvailableVersions": "Ver las versiones disponibles",
1054
  "QuickLinks": "Enlaces rápidos",
1055
+ "Profilable": "Perfilable",
1056
+ "SearchOnMatomo": "Buscá \"%1$s\" en matomo.org",
1057
+ "ReportingCategoryHelpPrefix": "¿Cómo puede ayudarme la página de informe \"%1$s > %2$s\"?",
1058
+ "VisitorsCategoryHelp1": "Las páginas de visitantes te dicen cosas sobre quiénes son los visitantes. Cosas como desde dónde vienen, qué dispositivos y navegadores web están usando y cuándo generalmente visitan tu sitio web. Asimilá, en el agregado, quién es tu audiencia, y buscá valores atípicos para ver cómo podría crecer.",
1059
+ "VisitorsCategoryHelp2": "Además de la información general sobre tus visitantes, también podés usar el %1$sregistro de visitas%2$s para ver qué ocurrió con cada visita individual.",
1060
+ "VisitorsOverviewHelp": "El pantallazo de los visitantes te ayuda a entender la popularidad de tu sitio web. Lo hace ofreciendo gráficos que muestran cuántas visitas está recibiendo tu sitio sobre un período seleccionado y el nivel promedio de compromiso con las funciones claves, como las búsquedas y las descargas.",
1061
+ "DevicesSubcategoryHelp": "La sección de dispositivos te ayuda a entender la tecnología que tus visitantes están usando para acceder a tu sitio web. Vas a ver informes sobre el tipo de dispositivo y modelos específicos para habilitarte a optimizar tu sitio para los dispositivos más populares.",
1062
+ "SoftwareSubcategoryHelp": "La sección de software muestra los sistemas operativos, navehadores web y plugins que tus visitantes están usando para acceder al sitio, así podés optimizarlo para asegurarte de que es totalmente compatible con las configuraciones más populares.",
1063
+ "EngagementSubcategoryHelp1": "La sección de compromiso ofrece informes que ayudan a cuantificar cuántos visitantes nuevos y habitués tenés. También podés revisar informes que delimitan el tiempo promedio y número de páginas por visitas, así como el número de veces que un visitante estuvo en tu sitio y la cantidad más común de días entre visitas.",
1064
+ "EngagementSubcategoryHelp2": "Esto te puede ayudar a optimizar la frecuencia de visitas y su alta interacción, además de maximizar tu alcance.",
1065
+ "PeriodHasOnlyRawData": "Parece que todavía no se procesaron informes para este período. ¿Querés saber lo que está pasando ahora? Revisá el %1$sregistro de visitas%2$s o elegí un período de fechas diferentes hasta que se generen los informes."
1066
  },
1067
  "CorePluginsAdmin": {
1068
  "ActionUninstall": "Desinstalar",
1098
  "MissingRequirementsNotice": "Por favor, actualizá %1$s %2$s a una versión más reciente, se requiere %1$s %3$s.",
1099
  "MissingRequirementsPleaseInstallNotice": "Por favor, instalá %1$s %2$s ya que es requerido por %3$s.",
1100
  "NoZipFileSelected": "Por favor, seleccioná un archivo ZIP.",
1101
+ "FileExceedsUploadLimit": "El archivo seleccionado excede el límite de subida de tu servidor.",
1102
  "NumUpdatesAvailable": "%s actualización\/es disponible\/s",
1103
  "NoPluginSettings": "No hay configuración disponible para el plugin",
1104
  "Origin": "Origen",
1160
  "DisablingIncompatiblePlugins": "Deshabilitando plugins incompatibles: %s",
1161
  "DownloadingUpdateFromX": "Descargando actualización desde %s",
1162
  "DownloadX": "Descargar %s",
1163
+ "UpdateLog": "Registro de subida",
1164
  "EmptyDatabaseError": "La base de datos %s está vacía. Tenés que editar o quitar tu archivo de configuración de Matomo.",
1165
  "ErrorDIYHelp": "Si sos un usuario avanzado y encontrás un error en la actualización de la base de datos:",
1166
  "ErrorDIYHelp_1": "identificá y corregí el origen del problema (por ejemplo, memory_limit o max_execution_time)",
1245
  "YouMustDownloadPackageOrFixPermissions": "Matomo no puede sobreescribir tu instalación actual. Podés, o bien corregir los permisos del directorio o archivo, o bien descargar el paquete e instalar la versión %s manualmente:",
1246
  "YourDatabaseIsOutOfDate": "Tu basde de datos de Matomo está desactualizada y debe ser actualizada antes de continuar.",
1247
  "ViewVersionChangelog": "Ver el registro de cambios de esta versión:",
1248
+ "ReceiveEmailBecauseIsSuperUser": "Recibís este correo electrónico porque sos un súperusuario en la instalación de Matomo en: %s",
1249
+ "ConvertToUtf8mb4": "Convertir base de datos a conjunto de caracteres UTF8mb4",
1250
+ "TriggerDatabaseConversion": "Ejecutar conversión de base de datos en segundo plano",
1251
+ "Utf8mb4ConversionHelp": "Tu base de datos actualmente no está usando un conjunto de caracteres UTF8mb4. Esto hace imposible almacenar caracteres de 4 bytes, como emojis, caracteres poco comunes de idiomas asiáticos, varios jeroglíficos históricos o símbolos matemáticos. Ellos actualmente son reemplazados con %1$s. <br \/><br \/>Tu base de datos soporta el conjunto de caracteres UTF8mb4 y sería posible convertirlo.<br \/><br \/>Si podés usar los comandos de consola, te recomendamos usar este comando: %2$s<br \/><br \/>Alternativamente, podés habilitar la conversión acá. Será ejecutada automáticamente como una tarea programada en segundo plano.<br \/><br \/>Atención: convertir la base de datos puede tardar un par de horas dependiendo en el tamaño de la misma. Ya que el rastreo podría no funcionar durante este proceso, no recomendamos usar el accionador para instancias más grandes.<br \/><br \/>Podés encontrar más información sobre este tema en nuestras %3$spreguntas frecuentes%4$s.",
1252
+ "SkipCacheClearDesc": "Esquiva la limpieza de memoria caché durante una actualización. Esto sólo es útil si podés asegurarte que las instancias ejecutando este comando no crearon un archivo caché aún, y si limpiar la caché para varias cuentas de Matomo pueden generar un cuello de botella.",
1253
+ "SkipCacheClear": "Esquivar la limpieza de memoria caché"
1254
  },
1255
  "CustomJsTracker": {
1256
  "PluginDescription": "Permite a cualquier plugin extender el archivo de rastreo vía JavaScript de Matomo (\"matomo.js\"), y agrega nuevas capacidades de medición de funcionalidad y sitios web.",
1310
  "SetAsDefaultWidgetsConfirmHelp": "Esta selección de widgets y diseño de columnas del panel será usada cuando un usuario cree un nuevo panel o cuando se use la función \"%s\".",
1311
  "TopLinkTooltip": "Ver informes de análisis web para %s.",
1312
  "WidgetNotFound": "Widget no encontrado",
1313
+ "WidgetPreview": "Previsualización del Widget",
1314
+ "DashboardCategoryHelp": "Esta es una página de panel. Los paneles son una colección de widgets de Matomo que agregas vos mismo para cubrir tus necesidades específicas. Mezclá y combiná cualquiera de los widgets de Matomo para obtener los datos que %1$sVOS%2$s necesitás de un saque."
1315
  },
1316
  "DevicePlugins": {
1317
  "BrowserWithNoPluginsEnabled": "%1$s sin plugins habilitados",
1473
  "ContactUs": "Contactanos",
1474
  "VisitTheForums": "Visitá los %1$sforos%2$s y obtené ayuda de la comunidad de usuarios de Matomo",
1475
  "Forums": "Foros",
 
1476
  "PleaseLeaveExternalReviewForMatomo": "Compartí tus pensamientos en uno de estos sitios e inspirá a que otros se unan a nuestra revolución de los datos.",
1477
  "RemindMeLater": "Recordarme después",
1478
  "NeverAskMeAgain": "No volver a preguntarme",
1482
  "RemoveOtherLabel": "Quiero ver los datos de mis \"Otros\"",
1483
  "PurgeOldData": "Quiero quitar datos viejos",
1484
  "SearchHelpResources": "Buscá los recursos de ayuda de matomo.org",
1485
+ "PopularHelpTopics": "Temas populares de ayuda",
1486
+ "ReferBannerTitle": "¿Creés en Matomo?"
1487
  },
1488
  "GeoIp2": {
1489
  "AssumingNonApache": "No se puede encontrar la función \"apache_get_modules\", asumiendo que se posee un servidor de internet no-Apache.",
1723
  "GoBackAndDefinePrefix": "Volvé y definí un prefijo para las tablas de Matomo",
1724
  "HappyAnalysing": "¡Que la pasés bien!",
1725
  "Installation": "Instalación",
1726
+ "InformationalResults": "Resultados informativos",
1727
+ "CopyBelowInfoForSupport": "Copiá o descargá la información abajo en caso que nuestro equipo técnico te la solicite.",
1728
+ "CopySystemCheck": "Copiar datos del sistema",
1729
+ "DownloadSystemCheck": "Descargar datos del sistema",
1730
  "InstallationStatus": "Estado de la instalación",
1731
  "InsufficientPrivilegesHelp": "Podés agregar estos privilegios utilizando una herramienta como phpMyAdmin o ejecutando las solicitudes SQL correspondientes. Si no sabés cómo hacer ninguna de estas operaciones, por favor, solicitá asistencia a tu administrador de sistema para que te conceda estos privilegios.",
1732
  "InsufficientPrivilegesMain": "O bien la base de datos no existe (y pudo no ser creada), o bien el usuario especificado tiene privilegios insuficientes. El usuario de base de datos debe tener los siguientes privilegios: %s",
1787
  "SystemCheckEvalHelp": "Requerido por el formulario HTML QuickForm y el sistema inteligente de plantillas.",
1788
  "SystemCheckExtensions": "Otras extensiones requeridas",
1789
  "SystemCheckFileIntegrity": "Integridad de archivo",
1790
+ "SystemCheckFilterHelp": "Necesitás configurar y reconstruir PHP con soporte de filtro habilitado (no usés \"--disable-filter\").",
1791
  "SystemCheckFunctions": "Funciones requeridas",
1792
  "SystemCheckFunctionHelp": "Necesitás habilitar esta función incorporada.",
1793
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (gráficos)",
1796
  "SystemCheckGzcompressHelp": "Necesitás habilitar la extensión zlib y la función gzcompress.",
1797
  "SystemCheckGzuncompressHelp": "Necesitás habilitar la extensión zlib y la función gzcompress.",
1798
  "SystemCheckHashHelp": "Necesitás configurar y reconstruir PHP con el soporte \"hash()\" habilitado excluyendo la opción --disable-hash.",
1799
+ "SystemCheckJsonHelp": "La extensión php-json es necesaria para que Matomo lea y escriba datos JSON.",
1800
  "SystemCheckMailHelp": "Los mensajes de Feedback y Recuperar Contraseña no se enviarán sin mail().",
 
 
1801
  "SystemCheckMemoryLimit": "Límite de memoria",
1802
  "SystemCheckMemoryLimitHelp": "En un sitio web de alto tráfico, el proceso de archivo puede requerir más memoria de la que se permite actualmente.<br \/>De ser necesario, cambiá la directiva memory_limit en tu archivo \"php.ini\".",
1803
+ "SystemCheckMemoryNoMemoryLimitSet": "No se estableció un límite de memoria",
1804
  "SystemCheckNoErrorsOrWarnings": "No hay errores o advertencias",
1805
  "SystemCheckViewFullSystemCheck": "Ver el informe completo de revisión del sistema",
1806
  "SystemCheckOpenURL": "Abrir dirección web",
1814
  "SystemCheckPdoAndMysqliHelp": "En un servidor GNU\/Linux podés compilar php con las siguientes opciones: %1$s En tu \"php.ini\", agregá las siguientes líneas: %2$s",
1815
  "SystemCheckPhp": "Versión PHP",
1816
  "SystemCheckPhpPdoAndMysqli": "Más información en: %1$sPHP PDO%2$s y %3$sMYSQLI%4$s.",
1817
+ "SystemCheckSessionHelp": "Necesitás configurar y reconstruir PHP con soporte de sesión habilitado (no usés \"--disable-session\").",
1818
  "SystemCheckSettings": "Se requiere configuración PHP (php.ini)",
1819
  "SystemCheckSummaryNoProblems": "¡Esssa! No hay problemas con tu configuración de Matomo. Date una palmadita en la espalda.",
1820
  "SystemCheckSummaryThereWereErrors": "¡Epa! Matomo detectó algunos %1$sproblemas críticos%2$s con tu configuración Matomo. %3$sEstos problemas deberían corregirse inmediatamente.%4$s",
1824
  "SystemCheckTrackerHelp": "Falló la solicitud GET a \"matomo.php\". Intentá permitir esta dirección web en tu autenticación HTTP y deshabilitá \"mod_security\" (podés pedírselo a tu administrador web). Para más información sobre el error, revisá el archivo de registro de errores de tu servidor web.",
1825
  "SystemCheckWarnDomHelp": "Deberías habilitar la extensión \"dom\" (ej., instalar el paquete \"php-dom\" y\/o el paquete \"php-xml\").",
1826
  "SystemCheckWarning": "Matomo funcionará normalmente, pero algunas funciones pueden estar ausentes",
1827
+ "SystemCheckWarnJsonHelp": "Deberías habilitar la extensión \"json\" (por ejemplo, instalando el paquete \"php-json\").",
1828
  "SystemCheckWarnLibXmlHelp": "Deberías habilitar la extensión \"libxml\" (ej., instalar el paquete \"php-libxml\") ya que esta es requerida por otras extensiones de PHP.",
1829
+ "SystemCheckWarnOpensslHelp": "Deberías habilitar la extensión \"openssl\" para permitir actualizaciones seguras.",
1830
  "SystemCheckWarnSimpleXMLHelp": "Deberías habilitar la extensión \"SimpleXML\" (ej., instalar el paquete \"php-simplexml\" y\/o el paquete \"php-xml\").",
1831
  "SystemCheckWinPdoAndMysqliHelp": "En un servidor Windows podés agregar las siguientes líneas a tu php.ini: %s",
1832
  "SystemCheckWriteDirs": "Directorios con acceso de escritura",
1833
  "SystemCheckWriteDirsHelp": "Para arreglar este error en tu sistema GNU\/Linux, intentá escribir los siguientes comandos",
1834
  "SystemCheckZlibHelp": "Necesitás configurar y reconstruir PHP con el soporte \"zlib\" habilitado, --with-zlib.",
1835
+ "SystemCheckCronArchiveProcess": "Configurar Cron",
1836
+ "FasterReportLoading": "carga más rápida de informe",
1837
  "SystemCheckCronArchiveProcessCLI": "Administración de procesos vía CLI",
1838
  "SystemCheckPhpSetting": "Para prevenir algunos problemas críticos, debés establecer lo siguiente en tu archivo \"php.ini\": %s",
1839
  "SystemCheckUpdateHttps": "Actualización sobre HTTPS",
1854
  "WelcomeHelp": "<p>Matomo es software libre de análisis de web que hace fácil obtener la información que querés de tus visitantes.<\/p> <p>Este proceso está dividido hasta en %s fáciles pasos y llevará unos 5 minutos.<\/p>",
1855
  "WelcomeToCommunity": "¡Bienvenido a la comunidad Matomo!",
1856
  "CannotConnectToDb": "No se puede conectar a la base de datos",
1857
+ "CannotConnectToDbResolvingExplanation": "Esto podría ser un problema tempóral, intentá %1$srecargar la página%2$s. Si el problema persiste, por favor, contactá a tu administrador de Matomo.",
1858
+ "EmailPrivacyNotice": "Tu dirección de correo electrónico sólo será usada para enviarte el boletín informativo. Para esto, tenemos que compartir tu dirección de correo electrónico con un proveedor de terceros. Este proveedor actualmente es Mad Mini, pero podría cambiar en el futuro. No compartiremos tu correo electrónico con nadie más ni lo usaremos con otro propósito que no sea enviarte el boletín informativo. Podés desuscribirte en cualquier momento. Por favor, consultá nuestra %1$spolítica de privacidad%2$s para más información.",
1859
+ "PerformanceSettingsDesc1": "Una nota final sobre rendimiento: tu Matomo está configurado y listo para rastrear e informar el tráfico en tu sitio web, pero si encontrás que Matomo funciona lento, quizás quieras tomar el paso extra de configurar el %1$sarchivado CLI%2$s. Esto generará tus informes en segundo plano periódicamente, en lugar de hacerlo a pedido.",
1860
+ "PerformanceSettingsDesc2": "Esto requiere agregar un comando de Matomo a cron, el cual no puede ser hecho automáticamente por el instalador, pero podés leer nuestras %1$spreguntas frecuentes sobre cómo configurarlo vos mismo%2$s."
1861
  },
1862
  "Intl": {
1863
  "Continent_afr": "África",
3135
  "Evolution": "Evolución",
3136
  "LoadingWebsites": "Cargando sitios web",
3137
  "PluginDescription": "Mirá y compará todos tus sitios web y aplicaciones en este útil panel \"Todos los sitios web\".",
3138
+ "TopLinkTooltip": "Compará estadísticas de análisis web para todos tus sitios.",
3139
+ "SingleWebsitesDashboardDocumentation": "Este informe te da un pantallazo de un sitio web específico, conteniendo las mediciones más generales sobre tus visitantes.",
3140
+ "AllWebsitesDashboardDocumentation": "Este informe te da un pantallazo de tus sitios web, conteniendo las mediciones más generales sobre tus visitantes."
3141
  },
3142
  "Overlay": {
3143
  "Clicks": "%s clics",
3826
  "FormElementVariableDescription": "Una instancia del elemento que fue enviado.",
3827
  "FormClassesVariableDescription": "El valor de todos los nombres de clase CSS de un formulario enviado.",
3828
  "FormClassesVariableName": "Clases de formulario",
3829
+ "FormDestinationVariableDescription": "El valor del a dirección de acción de formulario, de un formulario enviado.",
3830
  "FormDestinationVariableName": "Dirección web del destino del formulario",
3831
  "FormIdVariableDescription": "El valor del atributo de identificación de un formulario enviado.",
3832
  "FormIdVariableName": "Identificación de formulario",
3995
  "ScrollLeftPixelVariableDescription": "Cuánto se desplazó horizontalmente el usuario en píxeles, por ejemplo: \"592\".",
3996
  "ScrollLeftPixelVariableName": "Píxel de desplazamiento izquierdo",
3997
  "ScrollReachTriggerDescription": "Accionado tan pronto como el usuario se desplaza a cierta posición.",
3998
+ "ScrollReachTriggerHelp": "Este accionador se ejecuta cuando un usuario se desplaza en, o cambia la ventana actual del navegador web. Este accionador no se ejecuta cuando el usuario se desplaza dentro de un elemento. No se ejecutará cada vez que cierta posición de desplazamiento haya sido alcanzada, sino sólo la primera vez que la posición configurada haya sido alcanzada.",
3999
  "ScrollReachTriggerName": "Desplazamiento alcanzado",
4000
  "ScrollSourceVariableDescription": "Cuando la posición de desplazamiento fue originada desde un desplazamiento de usuario o un redimensionamiento del navegador web. El valor es \"scroll\" o \"resize\".",
4001
  "ScrollSourceVariableName": "Fuente de desplazamiento",
4106
  "WeekdayVariableDescription": "Devuelve el día local de la semana. Por ejemplo: lunes, martes, miércoles, etc.",
4107
  "WeekdayVariableName": "Día de la semana",
4108
  "WindowLeaveTriggerDescription": "Accionado cuando el usuario está a punto de dejar la página actual moviendo el cursor fuera de la ventana.",
4109
+ "WindowLeaveTriggerHelp": "Este accionador se acciona cuando el usuario está probablemente a punto de abandonar el sitio web y mueve su cursor fuera de la página web actual, por ejemplo, hacia la barra de dirección o hacia otros botones. Esto puede ser útil para mantener al visitante y no perder la visita, por ejemplo, mostrando una ventana emergente de salida. También podrías estar interesado en el accionador \"Descarga de ventana\", el cual se acciona tan pronto como el usuario abandona la página actual.",
4110
  "WindowLeaveTriggerName": "Abandono de ventana",
4111
  "WindowLoadedTriggerDescription": "Accionado cuando la página está completamente cargada, incluyendo todas las imágenes, etc.",
4112
  "WindowLoadedTriggerHelp": "Esta etapa de carga de página web es cuando la página está completamente cargada, según el navegador web. En la mayoría de los casos, esto significa que también se cargaron las imágenes, que se aplicaron los estilos, etc. Este accionador siempre es accionado en algún punto después de \"DOM listo\".",
app/lang/es.json CHANGED
@@ -524,7 +524,8 @@
524
  "Custom": "Personalizado",
525
  "PreviousPeriod": "Periodo previo",
526
  "PreviousYear": "Año previo",
527
- "ViewAccessRequired": "El token_auth utilizado tiene demasiado acceso como para ser utilizado en una URL de petición que no es de la API. Utilice una contraseña específica de la aplicación para un usuario que solo tenga acceso de visualización."
 
528
  },
529
  "Mobile": {
530
  "AboutPiwikMobile": "Acerca de Matomo Mobile",
@@ -759,8 +760,10 @@
759
  "ContentInteractions": "Interacciones con el contenido",
760
  "InteractionRate": "Nivel de interacción",
761
  "ContentName": "Nombre del contenido",
 
762
  "ContentNames": "Nombres de contenidos",
763
  "ContentPiece": "Pieza de contenido",
 
764
  "ContentPieces": "Piezas de contenido",
765
  "ContentTarget": "Objetivo del contenido",
766
  "ContentTargets": "Objetivos de contenido",
@@ -909,7 +912,20 @@
909
  "TrackingFailuresEmail1": "Esto es solo para hacerle saber que %s se han producido diferentes tipos de fallas de seguimiento en los últimos días.",
910
  "TrackingFailuresEmail2": "Para ver todas las peticiones de fallas de seguimiento haga %1$s clic aquí%2$s.",
911
  "ImportFromGoogleAnalytics": "Importar de Google Analytics",
912
- "ImportFromGoogleAnalyticsDescription": "Si tiene una propiedad de Google Analytics y está migrando a Matomo, puede importar los datos existentes una el plugin %1$sGoogleAnalyticsImporter%2$s."
 
 
 
 
 
 
 
 
 
 
 
 
 
913
  },
914
  "CoreHome": {
915
  "CategoryNoData": "No hay datos en esta categoría. Intente \"Incluir toda la población\".",
@@ -1016,6 +1032,7 @@
1016
  "RowLimit": "Límite de fila",
1017
  "CustomLimit": "Límite personalizado",
1018
  "ExportFormat": "Formato de exportación",
 
1019
  "ExpandSubtables": "Expandir subtablas",
1020
  "StandardReport": "Informe estándar",
1021
  "FlattenReport": "Aplanar informe",
@@ -1026,7 +1043,9 @@
1026
  "Profilable": "Perfilable",
1027
  "SearchOnMatomo": "Busca '%1$s' en Matomo.org",
1028
  "ReportingCategoryHelpPrefix": "¿Cómo me ayuda la página de report \"%1$s > %2$s\"?",
1029
- "VisitorsCategoryHelp2": "Además de la información general respecto a los visitantes, también puede usar %1$s los registros de visitas %2$s para ver que ha ocurrido en cada visita individual."
 
 
1030
  },
1031
  "CorePluginsAdmin": {
1032
  "ActionUninstall": "Desinstalar",
@@ -1465,7 +1484,6 @@
1465
  "ContactUs": "Contáctanos",
1466
  "VisitTheForums": "Visite el %1$sForo%2$s y obtenga ayuda de la comunidad de usuarios Matomo",
1467
  "Forums": "Foros",
1468
- "ReviewMatomoTitle": "¿Crées en Matomo?",
1469
  "PleaseLeaveExternalReviewForMatomo": "Comparte sus pensamientos en uno de estos sitios e inspira a otros a unirse en nuestra revolución de datos.",
1470
  "RemindMeLater": "Recordármelo nuevamente",
1471
  "NeverAskMeAgain": "No volver a preguntármelo",
@@ -1475,7 +1493,8 @@
1475
  "RemoveOtherLabel": "Quiero ver mi información de 'Otros'",
1476
  "PurgeOldData": "Quiero remover información obsoleta",
1477
  "SearchHelpResources": "Buscar recursos de ayuda en matomo.org",
1478
- "PopularHelpTopics": "Temas de ayuda populares"
 
1479
  },
1480
  "GeoIp2": {
1481
  "AssumingNonApache": "No se puede encontrar la función apache_get_modules, asumiendo que posee un servidor de internet no-Apache.",
@@ -1764,10 +1783,7 @@
1764
  "SystemCheckGzcompressHelp": "Es necesario habilitar la extensión zlib y la función gzcompress.",
1765
  "SystemCheckGzuncompressHelp": "Es necesario habilitar la extensión zlib y la función gzcompress.",
1766
  "SystemCheckHashHelp": "Necesitas configurar y recompilar PHP con soporte habilitado para \"hash()\": quitar la opción --disable-hash.",
1767
- "SystemCheckIconvHelp": "Necesita configurar y reconstruir PHP con soporte \"iconv\" habilitado, --with-iconv.",
1768
  "SystemCheckMailHelp": "Los mensajes de Feedback y Recuperar Contraseña no se enviarán sin un correo electrónico().",
1769
- "SystemCheckMbstring": "mbstring",
1770
- "SystemCheckMbstringHelp": "Se requiere la extensión mbstring para manejar caracteres multibyte en la interface del usuario y también las respuestas de la API. Por favor controle que mbstring.func_overload esté en \"0\" en el archivo php.ini.",
1771
  "SystemCheckMemoryLimit": "Límite de memoria",
1772
  "SystemCheckMemoryLimitHelp": "En un sitio de internet de alto tráfico, el proceso de archivo puede requerir más memoria de la que se permite actualmente. Véase la Directiva memory_limit en su archivo php.ini si es necesario.",
1773
  "SystemCheckNoErrorsOrWarnings": "No hay errores ni advertencias",
@@ -1783,7 +1799,6 @@
1783
  "SystemCheckPdoAndMysqliHelp": "En un servidor Linux puede compilar php con las siguientes opciones: %1$s En su php.ini, añada las siguientes líneas: %2$s",
1784
  "SystemCheckPhp": "Versión PHP",
1785
  "SystemCheckPhpPdoAndMysqli": "Más información en: %1$sPHP PDO%2$s y %3$sMYSQLI%4$s.",
1786
- "SystemCheckSplHelp": "Necesita configurar y reconstruir PHP con la Librería Estándar de PHP habilitada (por defecto).",
1787
  "SystemCheckSettings": "Configuración PHP solicitada (php.ini)",
1788
  "SystemCheckSummaryNoProblems": "Hurra! No hay problemas con su configuración de Matomo. Dése una palmadita en la espalda.",
1789
  "SystemCheckSummaryThereWereErrors": "Oh! Matomo ha detectado algunos %1$sproblemas críticos%2$s en su configuración Matomo. %3$sEstos deben ser arreglados inmediatamente.%4$s",
524
  "Custom": "Personalizado",
525
  "PreviousPeriod": "Periodo previo",
526
  "PreviousYear": "Año previo",
527
+ "ViewAccessRequired": "El token_auth utilizado tiene demasiado acceso como para ser utilizado en una URL de petición que no es de la API. Utilice una contraseña específica de la aplicación para un usuario que solo tenga acceso de visualización.",
528
+ "Reasons": "Motivos"
529
  },
530
  "Mobile": {
531
  "AboutPiwikMobile": "Acerca de Matomo Mobile",
760
  "ContentInteractions": "Interacciones con el contenido",
761
  "InteractionRate": "Nivel de interacción",
762
  "ContentName": "Nombre del contenido",
763
+ "ContentNameReportDocumentation": "Este informe muestra los nombres del contenido que los visitantes vieron e interactuaron.",
764
  "ContentNames": "Nombres de contenidos",
765
  "ContentPiece": "Pieza de contenido",
766
+ "ContentPieceReportDocumentation": "Este informa muestra las piezas de contenido que los visitantes vieron e interactuaron.",
767
  "ContentPieces": "Piezas de contenido",
768
  "ContentTarget": "Objetivo del contenido",
769
  "ContentTargets": "Objetivos de contenido",
912
  "TrackingFailuresEmail1": "Esto es solo para hacerle saber que %s se han producido diferentes tipos de fallas de seguimiento en los últimos días.",
913
  "TrackingFailuresEmail2": "Para ver todas las peticiones de fallas de seguimiento haga %1$s clic aquí%2$s.",
914
  "ImportFromGoogleAnalytics": "Importar de Google Analytics",
915
+ "ImportFromGoogleAnalyticsDescription": "Si tiene una propiedad de Google Analytics y está migrando a Matomo, puede importar los datos existentes una el plugin %1$sGoogleAnalyticsImporter%2$s.",
916
+ "SecurityNotificationEmailSubject": "Notificación de seguridad",
917
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Alguien ha habilitado la autenticación de 2 pasos en tu cuenta.",
918
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Alguien ha deshabilitado la autenticación de 2 pasos en tu cuenta.",
919
+ "SecurityNotificationTokenAuthCreatedBody": "Alguien ha creado un token de autenticación (descripción: %s) en su cuenta. Si no fue usted elimine el token.",
920
+ "SecurityNotificationTokenAuthDeletedBody": "Alguien ha eliminado un token de autenticación (descripción: %s) de su cuenta.",
921
+ "SecurityNotificationAllTokenAuthDeletedBody": "Alguien ha eliminado todos los tokens de autenticación de su cuenta.",
922
+ "SecurityNotificationSettingsChangedByUserBody": "Alguien ha modificado la configuración del sistema. Los parámetros afectados son: %s.",
923
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Otro super-usuario (%1$s) ha modificado la configuración del sistema. Los parámetros afectados son: %2$s. Si reconoce estos cambios ignore esto, si no contacte con el resto de super-usuarios.",
924
+ "SecurityNotificationUserCreatedBody": "Alguien ha creado un nuevo usuario (login: %s) en su cuenta.",
925
+ "SecurityNotificationUserDeletedBody": "Alguien ha eliminado un usuario (login: %s) de su cuenta.",
926
+ "SecurityNotificationIfItWasYou": "Si era usted, ignore este mensaje; de lo contrario, cambie la contraseña.",
927
+ "BruteForce": "Fuerza Bruta",
928
+ "TwoFactorAuth": "Autenticación de doble factor"
929
  },
930
  "CoreHome": {
931
  "CategoryNoData": "No hay datos en esta categoría. Intente \"Incluir toda la población\".",
1032
  "RowLimit": "Límite de fila",
1033
  "CustomLimit": "Límite personalizado",
1034
  "ExportFormat": "Formato de exportación",
1035
+ "ExportTooltip": "Nota: para utilizar la URL generada necesitará especificar un token de autenticación de la aplicación. Puede configurar estos tokens yendo a Admin -> Security -> Token Auths",
1036
  "ExpandSubtables": "Expandir subtablas",
1037
  "StandardReport": "Informe estándar",
1038
  "FlattenReport": "Aplanar informe",
1043
  "Profilable": "Perfilable",
1044
  "SearchOnMatomo": "Busca '%1$s' en Matomo.org",
1045
  "ReportingCategoryHelpPrefix": "¿Cómo me ayuda la página de report \"%1$s > %2$s\"?",
1046
+ "VisitorsCategoryHelp2": "Además de la información general respecto a los visitantes, también puede usar %1$s los registros de visitas %2$s para ver que ha ocurrido en cada visita individual.",
1047
+ "EngagementSubcategoryHelp2": "Esto le puede ayudar a usted, además de a maximizar su alcance, a optimizar por frecuencia y visitas de gran interacción.",
1048
+ "PeriodHasOnlyRawData": "Parece que los informes para este periodo aún no han sido procesados. ¿Quiere ver lo que está sucediendo ahora? Consulte aquí %1$s, registro de visitas %2$s o elija un periodo distinto hasta que los informes se hayan generado."
1049
  },
1050
  "CorePluginsAdmin": {
1051
  "ActionUninstall": "Desinstalar",
1484
  "ContactUs": "Contáctanos",
1485
  "VisitTheForums": "Visite el %1$sForo%2$s y obtenga ayuda de la comunidad de usuarios Matomo",
1486
  "Forums": "Foros",
 
1487
  "PleaseLeaveExternalReviewForMatomo": "Comparte sus pensamientos en uno de estos sitios e inspira a otros a unirse en nuestra revolución de datos.",
1488
  "RemindMeLater": "Recordármelo nuevamente",
1489
  "NeverAskMeAgain": "No volver a preguntármelo",
1493
  "RemoveOtherLabel": "Quiero ver mi información de 'Otros'",
1494
  "PurgeOldData": "Quiero remover información obsoleta",
1495
  "SearchHelpResources": "Buscar recursos de ayuda en matomo.org",
1496
+ "PopularHelpTopics": "Temas de ayuda populares",
1497
+ "ReferBannerTitle": "¿Crées en Matomo?"
1498
  },
1499
  "GeoIp2": {
1500
  "AssumingNonApache": "No se puede encontrar la función apache_get_modules, asumiendo que posee un servidor de internet no-Apache.",
1783
  "SystemCheckGzcompressHelp": "Es necesario habilitar la extensión zlib y la función gzcompress.",
1784
  "SystemCheckGzuncompressHelp": "Es necesario habilitar la extensión zlib y la función gzcompress.",
1785
  "SystemCheckHashHelp": "Necesitas configurar y recompilar PHP con soporte habilitado para \"hash()\": quitar la opción --disable-hash.",
 
1786
  "SystemCheckMailHelp": "Los mensajes de Feedback y Recuperar Contraseña no se enviarán sin un correo electrónico().",
 
 
1787
  "SystemCheckMemoryLimit": "Límite de memoria",
1788
  "SystemCheckMemoryLimitHelp": "En un sitio de internet de alto tráfico, el proceso de archivo puede requerir más memoria de la que se permite actualmente. Véase la Directiva memory_limit en su archivo php.ini si es necesario.",
1789
  "SystemCheckNoErrorsOrWarnings": "No hay errores ni advertencias",
1799
  "SystemCheckPdoAndMysqliHelp": "En un servidor Linux puede compilar php con las siguientes opciones: %1$s En su php.ini, añada las siguientes líneas: %2$s",
1800
  "SystemCheckPhp": "Versión PHP",
1801
  "SystemCheckPhpPdoAndMysqli": "Más información en: %1$sPHP PDO%2$s y %3$sMYSQLI%4$s.",
 
1802
  "SystemCheckSettings": "Configuración PHP solicitada (php.ini)",
1803
  "SystemCheckSummaryNoProblems": "Hurra! No hay problemas con su configuración de Matomo. Dése una palmadita en la espalda.",
1804
  "SystemCheckSummaryThereWereErrors": "Oh! Matomo ha detectado algunos %1$sproblemas críticos%2$s en su configuración Matomo. %3$sEstos deben ser arreglados inmediatamente.%4$s",
app/lang/et.json CHANGED
@@ -931,9 +931,7 @@
931
  "SystemCheckGDHelp": "Statistika jaoks genereeritud graafikud (väiksed joongraafikud veebis, mobiilses rakenduses ja e-posti raportites) ei tööta.",
932
  "SystemCheckGzcompressHelp": "Sa pead aktiveerima zlib laienduse ja gzcompress funktsiooni.",
933
  "SystemCheckGzuncompressHelp": "Sa pead aktiveerima zlib laienduse ja gzuncompress funktsiooni.",
934
- "SystemCheckIconvHelp": "Sa pead PHP seadistama ja uuesti laadima koos \"iconv\" toega, --with-iconv.",
935
  "SystemCheckMailHelp": "Tagasiside ja kaotatud salasõna sõnumeid ei saadeta ilma mail() funktsiooni toeta.",
936
- "SystemCheckMbstring": "mbstring",
937
  "SystemCheckMemoryLimit": "Mälu limiit",
938
  "SystemCheckMemoryLimitHelp": "Suure liiklusega veebileht võib vajada arhiveerimiseks rohkem mälu, kui hetkel lubatud.<br \/>Vaata üle oma memory_limit oma php.ini failis, kui see osutub vajalikuks.",
939
  "SystemCheckOpenURL": "Ava URL",
931
  "SystemCheckGDHelp": "Statistika jaoks genereeritud graafikud (väiksed joongraafikud veebis, mobiilses rakenduses ja e-posti raportites) ei tööta.",
932
  "SystemCheckGzcompressHelp": "Sa pead aktiveerima zlib laienduse ja gzcompress funktsiooni.",
933
  "SystemCheckGzuncompressHelp": "Sa pead aktiveerima zlib laienduse ja gzuncompress funktsiooni.",
 
934
  "SystemCheckMailHelp": "Tagasiside ja kaotatud salasõna sõnumeid ei saadeta ilma mail() funktsiooni toeta.",
 
935
  "SystemCheckMemoryLimit": "Mälu limiit",
936
  "SystemCheckMemoryLimitHelp": "Suure liiklusega veebileht võib vajada arhiveerimiseks rohkem mälu, kui hetkel lubatud.<br \/>Vaata üle oma memory_limit oma php.ini failis, kui see osutub vajalikuks.",
937
  "SystemCheckOpenURL": "Ava URL",
app/lang/eu.json CHANGED
@@ -493,7 +493,6 @@
493
  "SystemCheckExtensions": "Beharrezko bestelako hedapenak",
494
  "SystemCheckFunctions": "Beharrezko funtzioak",
495
  "SystemCheckGDHelp": "Grafika txikiek ez dute funtzionatuko.",
496
- "SystemCheckIconvHelp": "\"iconv\" gaituta duela konfiguratu eta birkonpilatu behar duzu PHP, --with-iconv aukerarekin.",
497
  "SystemCheckMailHelp": "Erreakzioak eta galdutako pasahitzen mezuak ezingo dira bidali mail() gabe.",
498
  "SystemCheckMemoryLimit": "Memoriaren muga",
499
  "SystemCheckMemoryLimitHelp": "Trafiko handiko webgune batean, artxibatzeko prozesuak onartutako memoria baino gehiago har lezake. Beharrezkoa bada, aldatu memory_limit direktiba zure php.ini fitxategian.",
@@ -502,7 +501,6 @@
502
  "SystemCheckPdoAndMysqliHelp": "Linux zerbitzari batean ondorengo aukerekin konpila dezakezu php:: %1$s Gehitu ondorengo lerroak zure php.ini fitxategian: %2$s",
503
  "SystemCheckPhp": "PHP bertsioa",
504
  "SystemCheckPhpPdoAndMysqli": "Argibide gehiago: %1$sPHP PDO%2$s eta %3$sMYSQLI%4$s.",
505
- "SystemCheckSplHelp": "Standard PHP Library (SPL) lehenetsita gaituta duela konfiguratu eta birkonpilatu behar duzu PHP.",
506
  "SystemCheckTimeLimitHelp": "Trafiko handiko webgune batean, artxibatzeko prozesuak onartutako denbora baino gehiago har lezake. Beharrezkoa bada, aldatu max_execution_time direktiba zure php.ini fitxategian.",
507
  "SystemCheckWarning": "Matomo ondo ibiliko da baina zenbait ezaugarri falta litezke",
508
  "SystemCheckWinPdoAndMysqliHelp": "Windows zerbitzari batean ondorengo lerroak gehi ditzakezu zure php.ini fitxategian: %s",
493
  "SystemCheckExtensions": "Beharrezko bestelako hedapenak",
494
  "SystemCheckFunctions": "Beharrezko funtzioak",
495
  "SystemCheckGDHelp": "Grafika txikiek ez dute funtzionatuko.",
 
496
  "SystemCheckMailHelp": "Erreakzioak eta galdutako pasahitzen mezuak ezingo dira bidali mail() gabe.",
497
  "SystemCheckMemoryLimit": "Memoriaren muga",
498
  "SystemCheckMemoryLimitHelp": "Trafiko handiko webgune batean, artxibatzeko prozesuak onartutako memoria baino gehiago har lezake. Beharrezkoa bada, aldatu memory_limit direktiba zure php.ini fitxategian.",
501
  "SystemCheckPdoAndMysqliHelp": "Linux zerbitzari batean ondorengo aukerekin konpila dezakezu php:: %1$s Gehitu ondorengo lerroak zure php.ini fitxategian: %2$s",
502
  "SystemCheckPhp": "PHP bertsioa",
503
  "SystemCheckPhpPdoAndMysqli": "Argibide gehiago: %1$sPHP PDO%2$s eta %3$sMYSQLI%4$s.",
 
504
  "SystemCheckTimeLimitHelp": "Trafiko handiko webgune batean, artxibatzeko prozesuak onartutako denbora baino gehiago har lezake. Beharrezkoa bada, aldatu max_execution_time direktiba zure php.ini fitxategian.",
505
  "SystemCheckWarning": "Matomo ondo ibiliko da baina zenbait ezaugarri falta litezke",
506
  "SystemCheckWinPdoAndMysqliHelp": "Windows zerbitzari batean ondorengo lerroak gehi ditzakezu zure php.ini fitxategian: %s",
app/lang/fa.json CHANGED
@@ -1265,9 +1265,7 @@
1265
  "SystemCheckGlobHelp": "این تابع ساخته شده در میزبان خود را غیر فعال شده است. Matomo تلاش خواهد کرد این تابع برای شبیه سازی است اما ممکن است محدودیت های امنیتی بیشتر روبرو می شوند. کارکرد ممکن است تأثیر داشته است.",
1266
  "SystemCheckGzcompressHelp": "شما نیاز به فعال کردن پسوند zlib می و gzcompress تابع.",
1267
  "SystemCheckGzuncompressHelp": "شما نیاز به فعال کردن پسوند zlib می و gzuncompress تابع.",
1268
- "SystemCheckIconvHelp": "شما نیاز به تنظیم و بازسازی PHP با پشتیبانی از \"iconv\" فعال باشد، - با iconv.",
1269
  "SystemCheckMailHelp": "انتقادات و پیشنهادات و پیامهای رمز عبور را فراموش کرده اید بدون پست الکترونیکی () ارسال نخواهد شد.",
1270
- "SystemCheckMbstring": "mbstring",
1271
  "SystemCheckMemoryLimit": "محدودیت حافظه",
1272
  "SystemCheckMemoryLimitHelp": "در یک وب سایت با ترافیک بالا، فرایند آرشیو ممکن است نیاز به حافظه بیشتری از آنچه در حال حاضر اجازه. در صورت لزوم، تغییر بخشنامه memory_limit را در فایل php.ini خود را.",
1273
  "SystemCheckOpenURL": "بازکردن آدرس",
@@ -1278,7 +1276,6 @@
1278
  "SystemCheckParseIniFileHelp": "این تابع ساخته شده در میزبان خود را غیر فعال شده است. Matomo تلاش خواهد کرد این تابع برای شبیه سازی است اما ممکن است محدودیت های امنیتی بیشتر روبرو می شوند. عملکرد نرم افزار نیز نهفته است.",
1279
  "SystemCheckPhp": "نسخه php",
1280
  "SystemCheckPhpPdoAndMysqli": "اطلاعات بیشتر: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
1281
- "SystemCheckSplHelp": "شما نیاز به تنظیم و بازسازی PHP با کتابخانه استاندارد PHP (SPL) را فعال کنید (به طور پیش فرض).",
1282
  "SystemCheckSummaryNoProblems": "هورا! هیچ مشکلی با نصب پیویک شما نیست.",
1283
  "SystemCheckSummaryThereWereWarnings": "چند مشکل با سیستم شما وجود دارد. پیویک اجرا خواهد شد ولی ممکن است شما با مشکلات جزئی را تجربه کنید.",
1284
  "SystemCheckTimeLimitHelp": "در وب سایت پر ترافیک، اجرای فرایند آرشیو ممکن است زمان بیشتری از آنچه در حال حاضر اجازه داده نیاز داشته باشد. در صورت لزوم، تغییر بخشنامه max_execution_time در فایل php.ini خود را.",
1265
  "SystemCheckGlobHelp": "این تابع ساخته شده در میزبان خود را غیر فعال شده است. Matomo تلاش خواهد کرد این تابع برای شبیه سازی است اما ممکن است محدودیت های امنیتی بیشتر روبرو می شوند. کارکرد ممکن است تأثیر داشته است.",
1266
  "SystemCheckGzcompressHelp": "شما نیاز به فعال کردن پسوند zlib می و gzcompress تابع.",
1267
  "SystemCheckGzuncompressHelp": "شما نیاز به فعال کردن پسوند zlib می و gzuncompress تابع.",
 
1268
  "SystemCheckMailHelp": "انتقادات و پیشنهادات و پیامهای رمز عبور را فراموش کرده اید بدون پست الکترونیکی () ارسال نخواهد شد.",
 
1269
  "SystemCheckMemoryLimit": "محدودیت حافظه",
1270
  "SystemCheckMemoryLimitHelp": "در یک وب سایت با ترافیک بالا، فرایند آرشیو ممکن است نیاز به حافظه بیشتری از آنچه در حال حاضر اجازه. در صورت لزوم، تغییر بخشنامه memory_limit را در فایل php.ini خود را.",
1271
  "SystemCheckOpenURL": "بازکردن آدرس",
1276
  "SystemCheckParseIniFileHelp": "این تابع ساخته شده در میزبان خود را غیر فعال شده است. Matomo تلاش خواهد کرد این تابع برای شبیه سازی است اما ممکن است محدودیت های امنیتی بیشتر روبرو می شوند. عملکرد نرم افزار نیز نهفته است.",
1277
  "SystemCheckPhp": "نسخه php",
1278
  "SystemCheckPhpPdoAndMysqli": "اطلاعات بیشتر: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
 
1279
  "SystemCheckSummaryNoProblems": "هورا! هیچ مشکلی با نصب پیویک شما نیست.",
1280
  "SystemCheckSummaryThereWereWarnings": "چند مشکل با سیستم شما وجود دارد. پیویک اجرا خواهد شد ولی ممکن است شما با مشکلات جزئی را تجربه کنید.",
1281
  "SystemCheckTimeLimitHelp": "در وب سایت پر ترافیک، اجرای فرایند آرشیو ممکن است زمان بیشتری از آنچه در حال حاضر اجازه داده نیاز داشته باشد. در صورت لزوم، تغییر بخشنامه max_execution_time در فایل php.ini خود را.",
app/lang/fi.json CHANGED
@@ -1375,7 +1375,6 @@
1375
  "ContactUs": "Ota yhteyttä",
1376
  "VisitTheForums": "Käy %1$skeskustelupalstalla%2$s ja saa apua Matomo-käyttäjien yhteisöltä",
1377
  "Forums": "Foorumit",
1378
- "ReviewMatomoTitle": "Uskotko Matomoon?",
1379
  "RemindMeLater": "Muistuta myöhemmin",
1380
  "NeverAskMeAgain": "Älä kysy uudestaan",
1381
  "HowCanWeHelp": "Miten voimme auttaa?",
@@ -1383,7 +1382,8 @@
1383
  "TrackMultipleSites": "Minun pitää seurata useita sivustoja tai aliverkkotunnuksia",
1384
  "PurgeOldData": "Haluan poistaa vanhoja tietoja",
1385
  "SearchHelpResources": "Hae ohjeita matomo.orgista",
1386
- "PopularHelpTopics": "Suositut ohjeaiheet"
 
1387
  },
1388
  "GeoIp2": {
1389
  "AssumingNonApache": "apache_get_modules-toimintoa ei löydy, oletettavasti verkkopalvelin on muu kuin Apache-ohjelmisto.",
@@ -1637,9 +1637,7 @@
1637
  "SystemCheckGlobHelp": "Tämä sisäänrakennettu toiminnallisuus on poistettu käytöstä palvelimellasi. Matomo yrittää emuloida toimintoa, mutta saattaa törmätä uusiin turvallisuusrajoituksiin. Suorituskyky heikkenee.",
1638
  "SystemCheckGzcompressHelp": "zlib-laajennus ja gzcompress-funktio täytyy olla käytössä.",
1639
  "SystemCheckGzuncompressHelp": "zlib-laajennus ja gzuncompress-funktio täytyy olla käytössä.",
1640
- "SystemCheckIconvHelp": "PHP pitää olla asennettuna iconv-lisäosan kanssa, --with-iconv",
1641
  "SystemCheckMailHelp": "Palautetta ja unohtuneiden salasanojen muistutuksia ei voida lähettää ilman funktiota mail().",
1642
- "SystemCheckMbstring": "mbstring",
1643
  "SystemCheckMemoryLimit": "Muistirajoitus",
1644
  "SystemCheckMemoryLimitHelp": "Jos verkkosivuilla on paljon liikennettä, arkistointiprosessi saattaa vaatia enemmän muistia.<br \/>Muokkaa asetusta memory_limit php.ini-tiedostossa tarvittaessa.",
1645
  "SystemCheckNoErrorsOrWarnings": "Ei virheitä tai varoituksia",
@@ -1654,7 +1652,6 @@
1654
  "SystemCheckPdoAndMysqliHelp": "Linux-palvelimella voit kääntää PHP:n seuraavilla asetuksilla: %1$s Lisää php.ini-tiedostoon seuraavat rivit: %2$s",
1655
  "SystemCheckPhp": "PHP:n versio",
1656
  "SystemCheckPhpPdoAndMysqli": "Lisätietoa: %1$sPHP PDO%2$s ja %3$sMYSQLI%4$s.",
1657
- "SystemCheckSplHelp": "PHP pitää olla asennettuna \"Standard PHP Library (SPL)\"-asetuksen kanssa.",
1658
  "SystemCheckSettings": "Vaadittu PHP-asetusto (php.ini)",
1659
  "SystemCheckSummaryNoProblems": "Hurraa! Matomon asennuksessa ei ole ongelmia. Taputa itseäsi olkapäälle.",
1660
  "SystemCheckSummaryThereWereErrors": "Oi voi... Matomo on havainnut joitakin %1$skriittisiä ongelmia%2$s asennuksen yhteydessä. %3$sNämä ongelmat tulisi korjata välittömästi.%4$s",
1375
  "ContactUs": "Ota yhteyttä",
1376
  "VisitTheForums": "Käy %1$skeskustelupalstalla%2$s ja saa apua Matomo-käyttäjien yhteisöltä",
1377
  "Forums": "Foorumit",
 
1378
  "RemindMeLater": "Muistuta myöhemmin",
1379
  "NeverAskMeAgain": "Älä kysy uudestaan",
1380
  "HowCanWeHelp": "Miten voimme auttaa?",
1382
  "TrackMultipleSites": "Minun pitää seurata useita sivustoja tai aliverkkotunnuksia",
1383
  "PurgeOldData": "Haluan poistaa vanhoja tietoja",
1384
  "SearchHelpResources": "Hae ohjeita matomo.orgista",
1385
+ "PopularHelpTopics": "Suositut ohjeaiheet",
1386
+ "ReferBannerTitle": "Uskotko Matomoon?"
1387
  },
1388
  "GeoIp2": {
1389
  "AssumingNonApache": "apache_get_modules-toimintoa ei löydy, oletettavasti verkkopalvelin on muu kuin Apache-ohjelmisto.",
1637
  "SystemCheckGlobHelp": "Tämä sisäänrakennettu toiminnallisuus on poistettu käytöstä palvelimellasi. Matomo yrittää emuloida toimintoa, mutta saattaa törmätä uusiin turvallisuusrajoituksiin. Suorituskyky heikkenee.",
1638
  "SystemCheckGzcompressHelp": "zlib-laajennus ja gzcompress-funktio täytyy olla käytössä.",
1639
  "SystemCheckGzuncompressHelp": "zlib-laajennus ja gzuncompress-funktio täytyy olla käytössä.",
 
1640
  "SystemCheckMailHelp": "Palautetta ja unohtuneiden salasanojen muistutuksia ei voida lähettää ilman funktiota mail().",
 
1641
  "SystemCheckMemoryLimit": "Muistirajoitus",
1642
  "SystemCheckMemoryLimitHelp": "Jos verkkosivuilla on paljon liikennettä, arkistointiprosessi saattaa vaatia enemmän muistia.<br \/>Muokkaa asetusta memory_limit php.ini-tiedostossa tarvittaessa.",
1643
  "SystemCheckNoErrorsOrWarnings": "Ei virheitä tai varoituksia",
1652
  "SystemCheckPdoAndMysqliHelp": "Linux-palvelimella voit kääntää PHP:n seuraavilla asetuksilla: %1$s Lisää php.ini-tiedostoon seuraavat rivit: %2$s",
1653
  "SystemCheckPhp": "PHP:n versio",
1654
  "SystemCheckPhpPdoAndMysqli": "Lisätietoa: %1$sPHP PDO%2$s ja %3$sMYSQLI%4$s.",
 
1655
  "SystemCheckSettings": "Vaadittu PHP-asetusto (php.ini)",
1656
  "SystemCheckSummaryNoProblems": "Hurraa! Matomon asennuksessa ei ole ongelmia. Taputa itseäsi olkapäälle.",
1657
  "SystemCheckSummaryThereWereErrors": "Oi voi... Matomo on havainnut joitakin %1$skriittisiä ongelmia%2$s asennuksen yhteydessä. %3$sNämä ongelmat tulisi korjata välittömästi.%4$s",
app/lang/fr.json CHANGED
@@ -1484,7 +1484,6 @@
1484
  "ContactUs": "Nous contacter",
1485
  "VisitTheForums": "Visitez les %1$sForums%2$s et obtenez de l'aide de la communauté d'utilisateurs Matomo.",
1486
  "Forums": "Forums",
1487
- "ReviewMatomoTitle": "Vous croyez en Matomo ?",
1488
  "PleaseLeaveExternalReviewForMatomo": "Partagez votre avis sur un de ces sites web et encouragez les autres à se joindre à notre révolution des données.",
1489
  "RemindMeLater": "Me le rappeler plus tard",
1490
  "NeverAskMeAgain": "Ne plus me demander",
@@ -1494,7 +1493,8 @@
1494
  "RemoveOtherLabel": "Je veux voir mes 'Autres' données",
1495
  "PurgeOldData": "Je veux supprimer d'anciennes données",
1496
  "SearchHelpResources": "Rechercher dans les ressources de matomo.org",
1497
- "PopularHelpTopics": "Rubriques d'aide les plus populaires"
 
1498
  },
1499
  "GeoIp2": {
1500
  "AssumingNonApache": "Impossible de trouver la fonction apache_get_modules, nous supposons que le serveur web n'est pas Apache.",
@@ -1796,11 +1796,8 @@
1796
  "SystemCheckGzcompressHelp": "Vous devez activer l'extension zlib et la fonction gzcompress",
1797
  "SystemCheckGzuncompressHelp": "Vous devez activer l'extension zlib et la fonction gzuncompress",
1798
  "SystemCheckHashHelp": "Vous devez reconfigurer et re-compiler PHP en avec le support de hash() activé en enlevant l'option --disable-hash.",
1799
- "SystemCheckIconvHelp": "Vous devez configurer PHP et le recompiler avec le support \"iconv\" activé, --with-iconv.",
1800
  "SystemCheckJsonHelp": "L'extension php-json est nécessaire pour que Matomo puisse lire et écrire des données au format JSON.",
1801
  "SystemCheckMailHelp": "Les Feedback (commentaires) et mots de passe perdus ne pourront être envoyés sans la fonciton mail().",
1802
- "SystemCheckMbstring": "mbstring",
1803
- "SystemCheckMbstringHelp": "L'extension mbstring est nécessaire pour gérer les caractères multi-octet dans l'interface utilisateur et les réponses API. Merci également de vérifier que mbstring.func_overload est paramétré à \"0\" dans php.ini.",
1804
  "SystemCheckMemoryLimit": "Limite mémoire",
1805
  "SystemCheckMemoryLimitHelp": "Sur un site à trafic important, le processus d'archivage peut prendre plus de mémoire que la limite actuelle autorisée.<br \/>Référez-vous à la configuration memory_limit de votre php.ini si nécessaire.",
1806
  "SystemCheckMemoryNoMemoryLimitSet": "Il n'y a pas de limite de mémoire",
@@ -1817,7 +1814,6 @@
1817
  "SystemCheckPdoAndMysqliHelp": "Sur un serveur linux vous pouvez compiler PHP avec les options suivantes : %1$s Dans votre php.ini, ajoutez les lignes suivantes: %2$s",
1818
  "SystemCheckPhp": "Version PHP",
1819
  "SystemCheckPhpPdoAndMysqli": "Plus d'informations sur : %1$sPHP PDO%2$s et %3$sMYSQLI%4$s.",
1820
- "SystemCheckSplHelp": "Vous devez configurer et recompiler PHP avec la librairie standard (par défaut).",
1821
  "SystemCheckSettings": "Configuration PHP requise (php.ini)",
1822
  "SystemCheckSummaryNoProblems": "Génial ! Il n'y a aucun problème avec votre installation de Matomo. Donnez-vous une tape dans le dos.",
1823
  "SystemCheckSummaryThereWereErrors": "Oh-oh ! Matomo a détecté des %1$sproblèmes critiques%2$s avec votre installation de Matomo. %3$sCes problèmes critiques doivent être fixés immédiatement.%4$s",
1484
  "ContactUs": "Nous contacter",
1485
  "VisitTheForums": "Visitez les %1$sForums%2$s et obtenez de l'aide de la communauté d'utilisateurs Matomo.",
1486
  "Forums": "Forums",
 
1487
  "PleaseLeaveExternalReviewForMatomo": "Partagez votre avis sur un de ces sites web et encouragez les autres à se joindre à notre révolution des données.",
1488
  "RemindMeLater": "Me le rappeler plus tard",
1489
  "NeverAskMeAgain": "Ne plus me demander",
1493
  "RemoveOtherLabel": "Je veux voir mes 'Autres' données",
1494
  "PurgeOldData": "Je veux supprimer d'anciennes données",
1495
  "SearchHelpResources": "Rechercher dans les ressources de matomo.org",
1496
+ "PopularHelpTopics": "Rubriques d'aide les plus populaires",
1497
+ "ReferBannerTitle": "Vous croyez en Matomo ?"
1498
  },
1499
  "GeoIp2": {
1500
  "AssumingNonApache": "Impossible de trouver la fonction apache_get_modules, nous supposons que le serveur web n'est pas Apache.",
1796
  "SystemCheckGzcompressHelp": "Vous devez activer l'extension zlib et la fonction gzcompress",
1797
  "SystemCheckGzuncompressHelp": "Vous devez activer l'extension zlib et la fonction gzuncompress",
1798
  "SystemCheckHashHelp": "Vous devez reconfigurer et re-compiler PHP en avec le support de hash() activé en enlevant l'option --disable-hash.",
 
1799
  "SystemCheckJsonHelp": "L'extension php-json est nécessaire pour que Matomo puisse lire et écrire des données au format JSON.",
1800
  "SystemCheckMailHelp": "Les Feedback (commentaires) et mots de passe perdus ne pourront être envoyés sans la fonciton mail().",
 
 
1801
  "SystemCheckMemoryLimit": "Limite mémoire",
1802
  "SystemCheckMemoryLimitHelp": "Sur un site à trafic important, le processus d'archivage peut prendre plus de mémoire que la limite actuelle autorisée.<br \/>Référez-vous à la configuration memory_limit de votre php.ini si nécessaire.",
1803
  "SystemCheckMemoryNoMemoryLimitSet": "Il n'y a pas de limite de mémoire",
1814
  "SystemCheckPdoAndMysqliHelp": "Sur un serveur linux vous pouvez compiler PHP avec les options suivantes : %1$s Dans votre php.ini, ajoutez les lignes suivantes: %2$s",
1815
  "SystemCheckPhp": "Version PHP",
1816
  "SystemCheckPhpPdoAndMysqli": "Plus d'informations sur : %1$sPHP PDO%2$s et %3$sMYSQLI%4$s.",
 
1817
  "SystemCheckSettings": "Configuration PHP requise (php.ini)",
1818
  "SystemCheckSummaryNoProblems": "Génial ! Il n'y a aucun problème avec votre installation de Matomo. Donnez-vous une tape dans le dos.",
1819
  "SystemCheckSummaryThereWereErrors": "Oh-oh ! Matomo a détecté des %1$sproblèmes critiques%2$s avec votre installation de Matomo. %3$sCes problèmes critiques doivent être fixés immédiatement.%4$s",
app/lang/hi.json CHANGED
@@ -1040,9 +1040,7 @@
1040
  "SystemCheckGlobHelp": "यह अंतर्निर्मित फलन अपने मेजबान में अक्षम हो गया है. Matomo इस फलन का अनुकरण का प्रयास करेगा लेकिन आगे सुरक्षा प्रतिबंधों का सामना कर सकते है. कार्यक्षमता को प्रभावित किया जा सकता है.",
1041
  "SystemCheckGzcompressHelp": "आप zlib विस्तार और gzcompress फलन को सक्षम करने की आवश्यकता है.",
1042
  "SystemCheckGzuncompressHelp": "आप zlib विस्तार और gzcompress फलन को सक्षम करने की आवश्यकता है.",
1043
- "SystemCheckIconvHelp": "आप PHP कॉन्फ़िगर और पुनर्निर्माण की जरूरत \"iconv\" समर्थन सक्षम के साथ - साथ iconv.",
1044
  "SystemCheckMailHelp": "प्रतिक्रिया और लॉस्ट पासवर्ड संदेशों को बिना मेल के ()भेजा नहीं जाएगा.",
1045
- "SystemCheckMbstring": "एमबी स्ट्रिंग",
1046
  "SystemCheckMemoryLimit": "स्मृति सीमा",
1047
  "SystemCheckMemoryLimitHelp": "एक उच्च यातायात वेबसाइट पर, पुरालेखण की प्रक्रिया वर्तमान अनुमति से अधिक स्मृति की आवश्यकता हो सकती. यदि आवश्यक हो, अपने php.ini फ़ाइल में memory_limit निर्देश बदलते हैं.",
1048
  "SystemCheckOpenURL": "ओपन यूआरएल",
@@ -1055,7 +1053,6 @@
1055
  "SystemCheckPdoAndMysqliHelp": "एक लिनक्स सर्वर पर आप निम्नलिखित विकल्पों के साथ php का संकलन कर सकते हैं:%1$s अपने php.ini में निम्नलिखित लाइनें जोड़ने:%2$s",
1056
  "SystemCheckPhp": "PHP संस्करण",
1057
  "SystemCheckPhpPdoAndMysqli": "पर अधिक जानकारी: %1$s PHP पीडीओ %2$s और %3$s mysqli %4$s.",
1058
- "SystemCheckSplHelp": "आप मानक PHP पुस्तकालय (एसपीएल) सक्षम (डिफ़ॉल्ट रूप से) के साथ PHP कॉन्फ़िगर और पुनर्निर्माण की जरूरत है.",
1059
  "SystemCheckSettings": "आवश्यक PHP विन्यास (php.ini)",
1060
  "SystemCheckSummaryNoProblems": "हुज़्ज़ाह! अपने Matomo सेटअप के साथ कोई समस्या नहीं हैं. अपने आप को पीठ पर एक पॅट दे.",
1061
  "SystemCheckSummaryThereWereErrors": "ओह! Matomo अपने Matomo स्थापना के साथ कुछ %1$sगंभीर समस्याओं%2$s का पता लगाया गया है. %3$sये समस्याएँ तुरंत निर्धारित की जानी चाहिए.%4$s",
1040
  "SystemCheckGlobHelp": "यह अंतर्निर्मित फलन अपने मेजबान में अक्षम हो गया है. Matomo इस फलन का अनुकरण का प्रयास करेगा लेकिन आगे सुरक्षा प्रतिबंधों का सामना कर सकते है. कार्यक्षमता को प्रभावित किया जा सकता है.",
1041
  "SystemCheckGzcompressHelp": "आप zlib विस्तार और gzcompress फलन को सक्षम करने की आवश्यकता है.",
1042
  "SystemCheckGzuncompressHelp": "आप zlib विस्तार और gzcompress फलन को सक्षम करने की आवश्यकता है.",
 
1043
  "SystemCheckMailHelp": "प्रतिक्रिया और लॉस्ट पासवर्ड संदेशों को बिना मेल के ()भेजा नहीं जाएगा.",
 
1044
  "SystemCheckMemoryLimit": "स्मृति सीमा",
1045
  "SystemCheckMemoryLimitHelp": "एक उच्च यातायात वेबसाइट पर, पुरालेखण की प्रक्रिया वर्तमान अनुमति से अधिक स्मृति की आवश्यकता हो सकती. यदि आवश्यक हो, अपने php.ini फ़ाइल में memory_limit निर्देश बदलते हैं.",
1046
  "SystemCheckOpenURL": "ओपन यूआरएल",
1053
  "SystemCheckPdoAndMysqliHelp": "एक लिनक्स सर्वर पर आप निम्नलिखित विकल्पों के साथ php का संकलन कर सकते हैं:%1$s अपने php.ini में निम्नलिखित लाइनें जोड़ने:%2$s",
1054
  "SystemCheckPhp": "PHP संस्करण",
1055
  "SystemCheckPhpPdoAndMysqli": "पर अधिक जानकारी: %1$s PHP पीडीओ %2$s और %3$s mysqli %4$s.",
 
1056
  "SystemCheckSettings": "आवश्यक PHP विन्यास (php.ini)",
1057
  "SystemCheckSummaryNoProblems": "हुज़्ज़ाह! अपने Matomo सेटअप के साथ कोई समस्या नहीं हैं. अपने आप को पीठ पर एक पॅट दे.",
1058
  "SystemCheckSummaryThereWereErrors": "ओह! Matomo अपने Matomo स्थापना के साथ कुछ %1$sगंभीर समस्याओं%2$s का पता लगाया गया है. %3$sये समस्याएँ तुरंत निर्धारित की जानी चाहिए.%4$s",
app/lang/hu.json CHANGED
@@ -835,9 +835,7 @@
835
  "SystemCheckGlobHelp": "Ez a beépített funkció le van tiltva a szervereden. Matomo megpróbálja emulálni ezt a funkciót, de további biztonsági korlátozások akadályozhatják ezt. A Matomo működésére kihatással lehet mindez.",
836
  "SystemCheckGzcompressHelp": "Engedélyezned kell a zlib kiterjesztést és a gzcompress funkciót.",
837
  "SystemCheckGzuncompressHelp": "Engedélyezned kell a zlib kiterjesztést és a gzuncompress funkciót.",
838
- "SystemCheckIconvHelp": "Konfigurálni és rebuildelni kell a PHP-t az \"iconv\" támogatás engedélyezésével: --with-iconv",
839
  "SystemCheckMailHelp": "A Matomo fejlesztőknek szóló visszajelzés és az elveszett jelszó pótlása céljából generált e-mail üzenetek nem lesznek elküldve a mail() nélkül.",
840
- "SystemCheckMbstring": "mbstring",
841
  "SystemCheckMemoryLimit": "Memória limit",
842
  "SystemCheckMemoryLimitHelp": "Egy nagy forgalmú weboldalon az archiválási folyamathoz több memória kell, mint a jelenleg engedélyezett. Ha szükséges, változtasd meg a memory_limit direktívát a php.ini fájlodban.",
843
  "SystemCheckOpenURL": "URL megnyitása",
@@ -849,7 +847,6 @@
849
  "SystemCheckPdoAndMysqliHelp": "Linux szerveren a következő opciókkal fordíthatja a php-t: %1$s majd a php.ini fájlban a következő sorokat kell hozzáadni: %2$s",
850
  "SystemCheckPhp": "PHP verzió",
851
  "SystemCheckPhpPdoAndMysqli": "További információ a %1$sPHP PDO-ról%2$sés %3$sMYSQLI-ról%4$s.",
852
- "SystemCheckSplHelp": "Konfigurálni és rebuildelni kell a PHP-t a Standard PHP Library (SPL) engedélyezésével (alapértelmezettként).",
853
  "SystemCheckTimeLimitHelp": "Egy nagy forgalmú weboldalon az archiválási folyamat végrehajtásához több idő kell, mint a jelenleg engedélyezett. Ha szükséges, változtasd meg a max_execution_time direktívát a php.ini fájlodban.",
854
  "SystemCheckTracker": "Tracker státusz",
855
  "SystemCheckWarnDomHelp": "Engedélyezned kell a \"dom\" kiterjesztést (például a \"php-dom\" és\/vagy a \"php-xml\" csomag installálásával).",
835
  "SystemCheckGlobHelp": "Ez a beépített funkció le van tiltva a szervereden. Matomo megpróbálja emulálni ezt a funkciót, de további biztonsági korlátozások akadályozhatják ezt. A Matomo működésére kihatással lehet mindez.",
836
  "SystemCheckGzcompressHelp": "Engedélyezned kell a zlib kiterjesztést és a gzcompress funkciót.",
837
  "SystemCheckGzuncompressHelp": "Engedélyezned kell a zlib kiterjesztést és a gzuncompress funkciót.",
 
838
  "SystemCheckMailHelp": "A Matomo fejlesztőknek szóló visszajelzés és az elveszett jelszó pótlása céljából generált e-mail üzenetek nem lesznek elküldve a mail() nélkül.",
 
839
  "SystemCheckMemoryLimit": "Memória limit",
840
  "SystemCheckMemoryLimitHelp": "Egy nagy forgalmú weboldalon az archiválási folyamathoz több memória kell, mint a jelenleg engedélyezett. Ha szükséges, változtasd meg a memory_limit direktívát a php.ini fájlodban.",
841
  "SystemCheckOpenURL": "URL megnyitása",
847
  "SystemCheckPdoAndMysqliHelp": "Linux szerveren a következő opciókkal fordíthatja a php-t: %1$s majd a php.ini fájlban a következő sorokat kell hozzáadni: %2$s",
848
  "SystemCheckPhp": "PHP verzió",
849
  "SystemCheckPhpPdoAndMysqli": "További információ a %1$sPHP PDO-ról%2$sés %3$sMYSQLI-ról%4$s.",
 
850
  "SystemCheckTimeLimitHelp": "Egy nagy forgalmú weboldalon az archiválási folyamat végrehajtásához több idő kell, mint a jelenleg engedélyezett. Ha szükséges, változtasd meg a max_execution_time direktívát a php.ini fájlodban.",
851
  "SystemCheckTracker": "Tracker státusz",
852
  "SystemCheckWarnDomHelp": "Engedélyezned kell a \"dom\" kiterjesztést (például a \"php-dom\" és\/vagy a \"php-xml\" csomag installálásával).",
app/lang/id.json CHANGED
@@ -1231,9 +1231,7 @@
1231
  "SystemCheckGlobHelp": "Fungsi bawaan ini telah dimatikan dalam inang Anda. Matomo akan mencoba untuk meniru fungsi ini namun mungkin menghadapi pembatasan keamanan lebih lanjut. Fungsionalitas mungkin terkena dampak.",
1232
  "SystemCheckGzcompressHelp": "Anda dapat mengaktifkan ekstensi zlib dan fungsi gzcompress.",
1233
  "SystemCheckGzuncompressHelp": "Anda dapat mengaktifkam ekstensi zlib dan fungsi gzuncompress.",
1234
- "SystemCheckIconvHelp": "Anda dapat mengonfigurasi dan membangun ulang PHP dengan dukungan \"iconv\" diaktifkan, --with-iconv.",
1235
  "SystemCheckMailHelp": "Pesan Umpanbalik dan Pemulihan Sandi tidak terkirim tanpa fungsi mail().",
1236
- "SystemCheckMbstring": "mbstring",
1237
  "SystemCheckMemoryLimit": "Batas Memori",
1238
  "SystemCheckMemoryLimitHelp": "Dalam situs dengan kunjungan tinggi, kemungkinan pengarsipan membutuhkan memori lebih banyak daripada yang diperbolehkan saat ini. Bila dibutuhkan, ubah nilai memory_limit dalam berkas php.ini Anda.",
1239
  "SystemCheckOpenURL": "Buka URL",
@@ -1245,7 +1243,6 @@
1245
  "SystemCheckPdoAndMysqliHelp": "Dalam peladen Linux Anda dapat mengompilasi php dengan opsi berikut: %1$s Di php.ini Anda, tambah baris berikut: %2$s",
1246
  "SystemCheckPhp": "Versi PHP",
1247
  "SystemCheckPhpPdoAndMysqli": "Informasi lebih lanjut di: %1$sPHP PDO%2$s dan %3$sMYSQLI%4$s.",
1248
- "SystemCheckSplHelp": "Anda dapat mengonfigurasi dan membangun ulang PHP dengan Standard PHP Library (SPL) diaktifkan (secara asali).",
1249
  "SystemCheckSummaryNoProblems": "Hore! Tidak ada permasalahan dalam pemasangan Matomo Anda. Beri diri Anda sebuah tepukan punggung.",
1250
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo mendeteksi beberapa %1$spermsalahan kritis%2$s dalam with your Matomo setup. %3$sPermasalahan tersebut harus segera diperbaiki segera.%4$s",
1251
  "SystemCheckSummaryThereWereWarnings": "Terdapat beberapa permasalahan dalam sistem Anda. Matomo akan berjalan, tetapi Anda mungkin mengalami beberapa permasalahan kecil.",
1231
  "SystemCheckGlobHelp": "Fungsi bawaan ini telah dimatikan dalam inang Anda. Matomo akan mencoba untuk meniru fungsi ini namun mungkin menghadapi pembatasan keamanan lebih lanjut. Fungsionalitas mungkin terkena dampak.",
1232
  "SystemCheckGzcompressHelp": "Anda dapat mengaktifkan ekstensi zlib dan fungsi gzcompress.",
1233
  "SystemCheckGzuncompressHelp": "Anda dapat mengaktifkam ekstensi zlib dan fungsi gzuncompress.",
 
1234
  "SystemCheckMailHelp": "Pesan Umpanbalik dan Pemulihan Sandi tidak terkirim tanpa fungsi mail().",
 
1235
  "SystemCheckMemoryLimit": "Batas Memori",
1236
  "SystemCheckMemoryLimitHelp": "Dalam situs dengan kunjungan tinggi, kemungkinan pengarsipan membutuhkan memori lebih banyak daripada yang diperbolehkan saat ini. Bila dibutuhkan, ubah nilai memory_limit dalam berkas php.ini Anda.",
1237
  "SystemCheckOpenURL": "Buka URL",
1243
  "SystemCheckPdoAndMysqliHelp": "Dalam peladen Linux Anda dapat mengompilasi php dengan opsi berikut: %1$s Di php.ini Anda, tambah baris berikut: %2$s",
1244
  "SystemCheckPhp": "Versi PHP",
1245
  "SystemCheckPhpPdoAndMysqli": "Informasi lebih lanjut di: %1$sPHP PDO%2$s dan %3$sMYSQLI%4$s.",
 
1246
  "SystemCheckSummaryNoProblems": "Hore! Tidak ada permasalahan dalam pemasangan Matomo Anda. Beri diri Anda sebuah tepukan punggung.",
1247
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo mendeteksi beberapa %1$spermsalahan kritis%2$s dalam with your Matomo setup. %3$sPermasalahan tersebut harus segera diperbaiki segera.%4$s",
1248
  "SystemCheckSummaryThereWereWarnings": "Terdapat beberapa permasalahan dalam sistem Anda. Matomo akan berjalan, tetapi Anda mungkin mengalami beberapa permasalahan kecil.",
app/lang/it.json CHANGED
@@ -524,7 +524,8 @@
524
  "Custom": "Personalizzata",
525
  "PreviousPeriod": "Periodo Precedente",
526
  "PreviousYear": "Anno Precedente",
527
- "ViewAccessRequired": "Il token_auth utilizzato ha troppi accessi per essere usato in una richiesta URL non-API. Utilizza una password specifica per l'app per un utente che dispone solo dell'accesso in visualizzazione."
 
528
  },
529
  "Mobile": {
530
  "AboutPiwikMobile": "Informazioni su Matomo Mobile",
@@ -915,7 +916,24 @@
915
  "TrackingFailuresEmail1": "Questo è solo per farti sapere che %s diversi tipi di errori di tracking si sono verificati negli ultimi giorni.",
916
  "TrackingFailuresEmail2": "Per visualizzare tutte le richieste di tracking fallite %1$sclicca qui%2$s.",
917
  "ImportFromGoogleAnalytics": "Importazione da Google Analytics",
918
- "ImportFromGoogleAnalyticsDescription": "Se hai una proprietà Google Analytics e stai passando a Matomo, puoi importare i dati esistenti utilizzando il plugin %1$sGoogleAnalyticsImporter%2$s."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
919
  },
920
  "CoreHome": {
921
  "CategoryNoData": "Non ci sono dati in questa categoria. Prova ad includere tutte le categorie.",
@@ -1139,7 +1157,7 @@
1139
  "DisablingIncompatiblePlugins": "Disabilitazione plugins incompatibili: %s",
1140
  "DownloadingUpdateFromX": "Sto scaricando gli aggiornamenti da %s",
1141
  "DownloadX": "Scarica %s",
1142
- "UpdateLog": "Aggiorna registro",
1143
  "EmptyDatabaseError": "Il database %s è pieno. Devi modificare il tuo file di configurazione Matomo.",
1144
  "ErrorDIYHelp": "Se sei un utente avanzato e incontri un errore nell'aggiornamento del database:",
1145
  "ErrorDIYHelp_1": "identifica e correggi la causa del problema (es. memory_limit o max_execution_time)",
@@ -1494,7 +1512,7 @@
1494
  "ContactUs": "Contattaci",
1495
  "VisitTheForums": "Visita il %1$s Forum%2$s e ottieni aiuto dalla comunità degli utenti Matomo",
1496
  "Forums": "Forum",
1497
- "ReviewMatomoTitle": "Credi in Matomo?",
1498
  "PleaseLeaveExternalReviewForMatomo": "Condividi ciò che pensi su uno di questi siti e ispira altri a unirsi alla nostra rivoluzione dei dati.",
1499
  "RemindMeLater": "Ricordamelo più tardi",
1500
  "NeverAskMeAgain": "Non chiedermelo di nuovo",
@@ -1506,11 +1524,12 @@
1506
  "SearchHelpResources": "Cerca nelle risorse di matomo.org per aiuto",
1507
  "PopularHelpTopics": "Argomenti di aiuto popolari",
1508
  "ReferMatomo": "Parla di Matomo",
1509
- "ReferBannerTitle": "Non lasciare che i dati dei tuoi amici finiscano in mani sbagliate!",
1510
- "ReferBannerLonger": "Indirizzali adesso verso Matomo Analytics per riprendere il controllo!",
1511
  "ReferBannerEmailShareSubject": "Indirizzali adesso verso Matomo Analytics per riprendere il controllo!",
1512
  "ReferBannerEmailShareBody": "Scelgo Matomo, un'alternativa etica a Google Analytics che mi dà al 100%% la proprietà dei dati e protegge i dati dei visitatori del mio sito web.\nCondivido questo messaggio nella speranza che anche tu riprenderai il potere da Google e acquisirai la completa proprietà dei tuoi dati.\n\nDai un'occhiata a Matomo su https:\/\/matomo.org",
1513
- "ReferBannerSocialShareText": "Se stai utilizzando Google Analytics, mantieni il controllo passando adesso a un'alternativa etica come Matomo!"
 
1514
  },
1515
  "GeoIp2": {
1516
  "AssumingNonApache": "Impossibile trovare la funzione apache_get_modules, si suppone che sia un server non-Apache.",
@@ -1836,11 +1855,8 @@
1836
  "SystemCheckGzcompressHelp": "Devi abilitare l'estensione zlib e la funzione gzcompress.",
1837
  "SystemCheckGzuncompressHelp": "Devi abilitare l'estensione zlib e la funzione gzuncompress.",
1838
  "SystemCheckHashHelp": "Devi configurare e ricostruire PHP con il supporto hash() abilitato escludendo l'opzione 'disabilita hash'.",
1839
- "SystemCheckIconvHelp": "Hai bisogno di configurare e fare il rebuild del PHP con il supporto \"iconv\" abilitato, --with-iconv",
1840
  "SystemCheckJsonHelp": "L'estensione php-json è richiesta perché Matomo legga e scriva i dati JSON.",
1841
  "SystemCheckMailHelp": "Feedback e messaggi su Password Perdute non saranno inviati senza che sia disponibile la funzione mail().",
1842
- "SystemCheckMbstring": "mbstring",
1843
- "SystemCheckMbstringHelp": "L'estensione mbstring è necessaria per gestire i caratteri multibyte nell'interfaccia Utente e le risposte API. Inoltre, controlla che mbstring.func_overload sia impostato su \"0\" nel php.ini.",
1844
  "SystemCheckMemoryLimit": "Memoria massima",
1845
  "SystemCheckMemoryLimitHelp": "Su un sito web con grande traffico, il processo di archiviazione potrebbe richiedere più memoria di quella attualmente consentita.<br \/>Cambia la direttiva memory_limmit nel tuo file php.ini se necessario.",
1846
  "SystemCheckMemoryNoMemoryLimitSet": "Non è stato impostato il limite di memoria",
@@ -1857,7 +1873,6 @@
1857
  "SystemCheckPdoAndMysqliHelp": "Su un server GNU\/Linux puoi compilare PHP con le seguenti opzioni: %1$s. Nel tuo php.ini, aggiungi le seguenti righe: %2$s",
1858
  "SystemCheckPhp": "Versione PHP",
1859
  "SystemCheckPhpPdoAndMysqli": "Maggiori informazioni a riguardo: %1$sPHP PDO%2$s e %3$sMYSQLI%4$s.",
1860
- "SystemCheckSplHelp": "Devi configurare e ricostruire il PHP con la libreria Standard PHP (SPL)abilitata (di default).",
1861
  "SystemCheckSessionHelp": "Devi configurare e ricostruire PHP con il supporto \"sessione\" abilitato (non usare --disabilita-sessione).",
1862
  "SystemCheckSettings": "Richiesta configurazione PHP (php.ini)",
1863
  "SystemCheckSummaryNoProblems": "Evviva! Non ci sono problemi con le impostazioni di Matomo. Datti una pacca sulla spalla.",
@@ -3912,6 +3927,8 @@
3912
  "OnlyMatchedUrlsAllowedHelp": "Quando abilitato, Matomo traccerà le azioni interne solo quando l'URL Pagina è una delle URL conosciute del sito. Questo evita che la gente spammi le tue statistiche con URL di altri siti web.",
3913
  "OnlyMatchedUrlsAllowedHelpExamples": "Il dominio e il percorso devono essere una corrispondenza esatta e ogni sottodominio valido deve essere specificato separatamente. Ad esempio, quando gli URL conosciuti sono \"http:\/\/example.com\/path\" e \"http:\/\/good.example.com\", le richieste di tracciamento per \"http:\/\/example.com\/otherpath\" o \"http:\/\/bad.example.com 'sono ignorate.",
3914
  "WebsitesManagement": "Gestisci siti web",
 
 
3915
  "XManagement": "Gestione %s",
3916
  "ChooseMeasurableTypeHeadline": "Cosa intendi misurare",
3917
  "YouCurrentlyHaveAccessToNWebsites": "Al momento hai accesso a %s siti.",
@@ -4354,9 +4371,7 @@
4354
  "ScrollReachTriggerHelp": "Questo trigger viene attivato quando un utente scorre o ridimensiona la finestra del browser corrente. Il trigger non viene attivato quando l'utente scorre all'interno di un determinato elemento. Non si attiverà tutte le volte che viene raggiunta una determinata posizione di scorrimento, ma solo la prima volta che viene raggiunta la posizione configurata.",
4355
  "ScrollReachTriggerName": "Fine Scroll",
4356
  "ScrollSourceVariableDescription": "Se la posizione di scorrimento è stata originata da uno scorrimento utente o da un ridimensionamento del browser. Il valore è \"scorrimento\" o \"ridimensionamento\".",
4357
- "ScrollSourceVariableName": "Scroll Sorgente",
4358
  "ScrollTopPixelVariableDescription": "Di quanto, in pixel, l'utente ha scrollato in verticale, per esempio \"592\".",
4359
- "ScrollTopPixelVariableName": "Scroll Top Pixel",
4360
  "ScrollVerticalPercentageVariableDescription": "Di quanto l'utente ha, attualmente, fatto scorrere in verticale la pagina, per esempio \"75,59\" per \"75,59%%\".",
4361
  "ScrollVerticalPercentageVariableName": "Percentuale Scroll Verticale",
4362
  "SentryRavenTagDescription": "Sentry.io è uno strumento di tracciamento degli errori Open-Source che ti consente di rilevare gli errori che si verificano sul tuo sito web.",
524
  "Custom": "Personalizzata",
525
  "PreviousPeriod": "Periodo Precedente",
526
  "PreviousYear": "Anno Precedente",
527
+ "ViewAccessRequired": "Il token_auth utilizzato ha troppi accessi per essere usato in una richiesta URL non-API. Utilizza una password specifica per l'app per un utente che dispone solo dell'accesso in visualizzazione.",
528
+ "Reasons": "Ragioni"
529
  },
530
  "Mobile": {
531
  "AboutPiwikMobile": "Informazioni su Matomo Mobile",
916
  "TrackingFailuresEmail1": "Questo è solo per farti sapere che %s diversi tipi di errori di tracking si sono verificati negli ultimi giorni.",
917
  "TrackingFailuresEmail2": "Per visualizzare tutte le richieste di tracking fallite %1$sclicca qui%2$s.",
918
  "ImportFromGoogleAnalytics": "Importazione da Google Analytics",
919
+ "ImportFromGoogleAnalyticsDescription": "Se hai una proprietà Google Analytics e stai passando a Matomo, puoi importare i dati esistenti utilizzando il plugin %1$sGoogleAnalyticsImporter%2$s.",
920
+ "SecurityNotificationEmailSubject": "Notifica di Sicurezza",
921
+ "SecurityNotificationRecoveryCodesShowedBody": "Qualcuno ha visualizzato i codici di ripristino dell'autenticazione a due-fattori del tuo account.",
922
+ "SecurityNotificationRecoveryCodesRegeneratedBody": "Qualcuno ha generato nuovi codici di ripristino dell'autenticazione a due-fattori per il tuo account.",
923
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Qualcuno ha abilitato l'autenticazione a due-fattori nel tuo account.",
924
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Qualcuno ha disabilitato l'autenticazione a due-fattori nel tuo account.",
925
+ "SecurityNotificationTokenAuthCreatedBody": "Qualcuno ha creato un token di autorizzazione (descrizione: %s) nel tuo account. Se non sei stato tu, cancella il token.",
926
+ "SecurityNotificationTokenAuthDeletedBody": "Qualcuno ha eliminato un token di autorizzazione (descrizione: %s) nel tuo account.",
927
+ "SecurityNotificationAllTokenAuthDeletedBody": "Qualcuno ha eliminato tutti i token di autorizzazione nel tuo account.",
928
+ "SecurityNotificationSettingsChangedByUserBody": "Qualcuno ha modificato le impostazioni del sistema. Impostazioni interessate: %s.",
929
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Un altro super user (%1$s) ha modificato le impostazioni di sistema. Impostazioni interessate: %2$s. Se conosci questa attività, continua. Se non riconosci questa attività, contatta gli altri super user.",
930
+ "SecurityNotificationUserCreatedBody": "Qualcuno ha creato un nuovo utente (login: %s) nel tuo account.",
931
+ "SecurityNotificationUserDeletedBody": "Qualcuno ha eliminato un utente (login: %s) nel tuo account.",
932
+ "SecurityNotificationIfItWasYou": "Se sei stato tu, continua. Se non riconosci questa attività, reimposta la password.",
933
+ "SecurityNotificationCheckTwoFactor": "Controlla la tua app o il dispositivo di autenticazione a due-fattori.",
934
+ "BruteForce": "Forza Bruta",
935
+ "TwoFactorAuth": "Autorizzazione a due-fattori",
936
+ "Cors": "Cors"
937
  },
938
  "CoreHome": {
939
  "CategoryNoData": "Non ci sono dati in questa categoria. Prova ad includere tutte le categorie.",
1157
  "DisablingIncompatiblePlugins": "Disabilitazione plugins incompatibili: %s",
1158
  "DownloadingUpdateFromX": "Sto scaricando gli aggiornamenti da %s",
1159
  "DownloadX": "Scarica %s",
1160
+ "UpdateLog": "Registro aggiornamento",
1161
  "EmptyDatabaseError": "Il database %s è pieno. Devi modificare il tuo file di configurazione Matomo.",
1162
  "ErrorDIYHelp": "Se sei un utente avanzato e incontri un errore nell'aggiornamento del database:",
1163
  "ErrorDIYHelp_1": "identifica e correggi la causa del problema (es. memory_limit o max_execution_time)",
1512
  "ContactUs": "Contattaci",
1513
  "VisitTheForums": "Visita il %1$s Forum%2$s e ottieni aiuto dalla comunità degli utenti Matomo",
1514
  "Forums": "Forum",
1515
+ "ReviewMatomoTitle": "Ti piace Matomo?",
1516
  "PleaseLeaveExternalReviewForMatomo": "Condividi ciò che pensi su uno di questi siti e ispira altri a unirsi alla nostra rivoluzione dei dati.",
1517
  "RemindMeLater": "Ricordamelo più tardi",
1518
  "NeverAskMeAgain": "Non chiedermelo di nuovo",
1524
  "SearchHelpResources": "Cerca nelle risorse di matomo.org per aiuto",
1525
  "PopularHelpTopics": "Argomenti di aiuto popolari",
1526
  "ReferMatomo": "Parla di Matomo",
1527
+ "ReferBannerTitle": "Credi in Matomo?",
1528
+ "ReferBannerLonger": "Aiutaci a spargere la voce su di noi in modo che più persone abbiano il controllo sui propri dati analitici.",
1529
  "ReferBannerEmailShareSubject": "Indirizzali adesso verso Matomo Analytics per riprendere il controllo!",
1530
  "ReferBannerEmailShareBody": "Scelgo Matomo, un'alternativa etica a Google Analytics che mi dà al 100%% la proprietà dei dati e protegge i dati dei visitatori del mio sito web.\nCondivido questo messaggio nella speranza che anche tu riprenderai il potere da Google e acquisirai la completa proprietà dei tuoi dati.\n\nDai un'occhiata a Matomo su https:\/\/matomo.org",
1531
+ "ReferBannerSocialShareText": "Se stai utilizzando Google Analytics, mantieni il controllo passando adesso a un'alternativa etica come Matomo!",
1532
+ "WontShowAgain": "Non mostreremo più questo messaggio."
1533
  },
1534
  "GeoIp2": {
1535
  "AssumingNonApache": "Impossibile trovare la funzione apache_get_modules, si suppone che sia un server non-Apache.",
1855
  "SystemCheckGzcompressHelp": "Devi abilitare l'estensione zlib e la funzione gzcompress.",
1856
  "SystemCheckGzuncompressHelp": "Devi abilitare l'estensione zlib e la funzione gzuncompress.",
1857
  "SystemCheckHashHelp": "Devi configurare e ricostruire PHP con il supporto hash() abilitato escludendo l'opzione 'disabilita hash'.",
 
1858
  "SystemCheckJsonHelp": "L'estensione php-json è richiesta perché Matomo legga e scriva i dati JSON.",
1859
  "SystemCheckMailHelp": "Feedback e messaggi su Password Perdute non saranno inviati senza che sia disponibile la funzione mail().",
 
 
1860
  "SystemCheckMemoryLimit": "Memoria massima",
1861
  "SystemCheckMemoryLimitHelp": "Su un sito web con grande traffico, il processo di archiviazione potrebbe richiedere più memoria di quella attualmente consentita.<br \/>Cambia la direttiva memory_limmit nel tuo file php.ini se necessario.",
1862
  "SystemCheckMemoryNoMemoryLimitSet": "Non è stato impostato il limite di memoria",
1873
  "SystemCheckPdoAndMysqliHelp": "Su un server GNU\/Linux puoi compilare PHP con le seguenti opzioni: %1$s. Nel tuo php.ini, aggiungi le seguenti righe: %2$s",
1874
  "SystemCheckPhp": "Versione PHP",
1875
  "SystemCheckPhpPdoAndMysqli": "Maggiori informazioni a riguardo: %1$sPHP PDO%2$s e %3$sMYSQLI%4$s.",
 
1876
  "SystemCheckSessionHelp": "Devi configurare e ricostruire PHP con il supporto \"sessione\" abilitato (non usare --disabilita-sessione).",
1877
  "SystemCheckSettings": "Richiesta configurazione PHP (php.ini)",
1878
  "SystemCheckSummaryNoProblems": "Evviva! Non ci sono problemi con le impostazioni di Matomo. Datti una pacca sulla spalla.",
3927
  "OnlyMatchedUrlsAllowedHelp": "Quando abilitato, Matomo traccerà le azioni interne solo quando l'URL Pagina è una delle URL conosciute del sito. Questo evita che la gente spammi le tue statistiche con URL di altri siti web.",
3928
  "OnlyMatchedUrlsAllowedHelpExamples": "Il dominio e il percorso devono essere una corrispondenza esatta e ogni sottodominio valido deve essere specificato separatamente. Ad esempio, quando gli URL conosciuti sono \"http:\/\/example.com\/path\" e \"http:\/\/good.example.com\", le richieste di tracciamento per \"http:\/\/example.com\/otherpath\" o \"http:\/\/bad.example.com 'sono ignorate.",
3929
  "WebsitesManagement": "Gestisci siti web",
3930
+ "WebsiteUpdated": "Sito web aggiornato",
3931
+ "WebsiteCreated": "Sito web creato",
3932
  "XManagement": "Gestione %s",
3933
  "ChooseMeasurableTypeHeadline": "Cosa intendi misurare",
3934
  "YouCurrentlyHaveAccessToNWebsites": "Al momento hai accesso a %s siti.",
4371
  "ScrollReachTriggerHelp": "Questo trigger viene attivato quando un utente scorre o ridimensiona la finestra del browser corrente. Il trigger non viene attivato quando l'utente scorre all'interno di un determinato elemento. Non si attiverà tutte le volte che viene raggiunta una determinata posizione di scorrimento, ma solo la prima volta che viene raggiunta la posizione configurata.",
4372
  "ScrollReachTriggerName": "Fine Scroll",
4373
  "ScrollSourceVariableDescription": "Se la posizione di scorrimento è stata originata da uno scorrimento utente o da un ridimensionamento del browser. Il valore è \"scorrimento\" o \"ridimensionamento\".",
 
4374
  "ScrollTopPixelVariableDescription": "Di quanto, in pixel, l'utente ha scrollato in verticale, per esempio \"592\".",
 
4375
  "ScrollVerticalPercentageVariableDescription": "Di quanto l'utente ha, attualmente, fatto scorrere in verticale la pagina, per esempio \"75,59\" per \"75,59%%\".",
4376
  "ScrollVerticalPercentageVariableName": "Percentuale Scroll Verticale",
4377
  "SentryRavenTagDescription": "Sentry.io è uno strumento di tracciamento degli errori Open-Source che ti consente di rilevare gli errori che si verificano sul tuo sito web.",
app/lang/ja.json CHANGED
@@ -1427,7 +1427,6 @@
1427
  "ContactUs": "お問い合わせ",
1428
  "VisitTheForums": "%1$s フォーラム %2$s にアクセスし、Matomo ユーザーのコミュニティから助けを得る",
1429
  "Forums": "フォーラム",
1430
- "ReviewMatomoTitle": "Matomo を信じますか?",
1431
  "PleaseLeaveExternalReviewForMatomo": "これらのサイトの1つについてあなたの考えを分かち合い、他の人々に私たちのデータ革命に加わるよう促してください。",
1432
  "RemindMeLater": "後で通知する",
1433
  "NeverAskMeAgain": "次回から確認しない",
@@ -1437,7 +1436,8 @@
1437
  "RemoveOtherLabel": "'その他'のデータを見たい",
1438
  "PurgeOldData": "古いデータを削除したい",
1439
  "SearchHelpResources": "matomo.org ヘルプリソースを検索する",
1440
- "PopularHelpTopics": "人気のあるヘルプトピック"
 
1441
  },
1442
  "GeoIp2": {
1443
  "AssumingNonApache": "非 Apache ウェブサーバーを想定して apache_get_modules ファンクションを見つける事ができません。",
@@ -1728,10 +1728,7 @@
1728
  "SystemCheckGzcompressHelp": "zlib エクステンションと gzcompress 機能を有効にする必要があります。",
1729
  "SystemCheckGzuncompressHelp": "zlib エクステンションと gzuncompress機能を有効にする必要があります。",
1730
  "SystemCheckHashHelp": "--disable-hash オプションを除外し、hash() サポートを有効にして PHP を設定して再構築する必要があります。",
1731
- "SystemCheckIconvHelp": "\"iconv\" のサポートを有効にして、PHP の再構築と設定を行う必要があります(--with-iconv)。",
1732
  "SystemCheckMailHelp": "mail() 関数がない場合、フィードバックとパスワード紛失のメッセージを送信することができません。",
1733
- "SystemCheckMbstring": "mbstring",
1734
- "SystemCheckMbstringHelp": "mbstring 拡張子は、ユーザーインターフェイスと API レスポンスでマルチバイト文字を処理するために必要です。 また、php.ini で mbstring.func_overload が \" 0 \" に設定されていることを確認してください。",
1735
  "SystemCheckMemoryLimit": "メモリ制限",
1736
  "SystemCheckMemoryLimitHelp": "アクセス数の多いウェブサイトでは、アーカイブ処理の実行に、現在許可されている以上に多くのメモリを必要とする場合があります。必要に応じて、php.ini ファイルのディレクティブ memory_limit を変更してください。",
1737
  "SystemCheckNoErrorsOrWarnings": "エラーや警告はありません",
@@ -1747,7 +1744,6 @@
1747
  "SystemCheckPdoAndMysqliHelp": "GNU \/ Linuxサーバーでは、次のオプションを付けてphpをコンパイルできます:%1$sphp.iniに次の行を追加します:%2$s",
1748
  "SystemCheckPhp": "PHP バージョン",
1749
  "SystemCheckPhpPdoAndMysqli": "詳細ドキュメント:%1$sPHP PDO%2$s、%3$sMYSQLI%4$s",
1750
- "SystemCheckSplHelp": "Standard PHP Library (SPL) を有効にして、PHP の再構築と設定を行う必要があります(通常はデフォルト)。",
1751
  "SystemCheckSettings": "必要な PHP 設定 (php,ini)",
1752
  "SystemCheckSummaryNoProblems": "安心してください。Matomo のセットアップに問題はありません。",
1753
  "SystemCheckSummaryThereWereErrors": "Matomo セットアップで、いくつかの %1$scritical issues%2$s が検知されました。 %3$sこれらの問題はすぐに修正する必要があります。%4$s",
1427
  "ContactUs": "お問い合わせ",
1428
  "VisitTheForums": "%1$s フォーラム %2$s にアクセスし、Matomo ユーザーのコミュニティから助けを得る",
1429
  "Forums": "フォーラム",
 
1430
  "PleaseLeaveExternalReviewForMatomo": "これらのサイトの1つについてあなたの考えを分かち合い、他の人々に私たちのデータ革命に加わるよう促してください。",
1431
  "RemindMeLater": "後で通知する",
1432
  "NeverAskMeAgain": "次回から確認しない",
1436
  "RemoveOtherLabel": "'その他'のデータを見たい",
1437
  "PurgeOldData": "古いデータを削除したい",
1438
  "SearchHelpResources": "matomo.org ヘルプリソースを検索する",
1439
+ "PopularHelpTopics": "人気のあるヘルプトピック",
1440
+ "ReferBannerTitle": "Matomo を信じますか?"
1441
  },
1442
  "GeoIp2": {
1443
  "AssumingNonApache": "非 Apache ウェブサーバーを想定して apache_get_modules ファンクションを見つける事ができません。",
1728
  "SystemCheckGzcompressHelp": "zlib エクステンションと gzcompress 機能を有効にする必要があります。",
1729
  "SystemCheckGzuncompressHelp": "zlib エクステンションと gzuncompress機能を有効にする必要があります。",
1730
  "SystemCheckHashHelp": "--disable-hash オプションを除外し、hash() サポートを有効にして PHP を設定して再構築する必要があります。",
 
1731
  "SystemCheckMailHelp": "mail() 関数がない場合、フィードバックとパスワード紛失のメッセージを送信することができません。",
 
 
1732
  "SystemCheckMemoryLimit": "メモリ制限",
1733
  "SystemCheckMemoryLimitHelp": "アクセス数の多いウェブサイトでは、アーカイブ処理の実行に、現在許可されている以上に多くのメモリを必要とする場合があります。必要に応じて、php.ini ファイルのディレクティブ memory_limit を変更してください。",
1734
  "SystemCheckNoErrorsOrWarnings": "エラーや警告はありません",
1744
  "SystemCheckPdoAndMysqliHelp": "GNU \/ Linuxサーバーでは、次のオプションを付けてphpをコンパイルできます:%1$sphp.iniに次の行を追加します:%2$s",
1745
  "SystemCheckPhp": "PHP バージョン",
1746
  "SystemCheckPhpPdoAndMysqli": "詳細ドキュメント:%1$sPHP PDO%2$s、%3$sMYSQLI%4$s",
 
1747
  "SystemCheckSettings": "必要な PHP 設定 (php,ini)",
1748
  "SystemCheckSummaryNoProblems": "安心してください。Matomo のセットアップに問題はありません。",
1749
  "SystemCheckSummaryThereWereErrors": "Matomo セットアップで、いくつかの %1$scritical issues%2$s が検知されました。 %3$sこれらの問題はすぐに修正する必要があります。%4$s",
app/lang/ka.json CHANGED
@@ -395,9 +395,7 @@
395
  "SystemCheckGlobHelp": "თქვენს ჰოსტ სერვერზე სტანდარტული ფუნქცია გამორთულია. Matomo ცდის ამ ფუნქციის ემულირებას, მაგრამ შესაძლოა წარმოიშვას შემდგომი უსაფრთხოების შეზღუდვები. ამან შეიძლება გავლენა იქონიოს ფუნქციონალურობაზე.",
396
  "SystemCheckGzcompressHelp": "თქვენ უნდა ჩართოთ zlib გაფართოება და gzcompress ფუნქცია.",
397
  "SystemCheckGzuncompressHelp": "თქვენ უნდა ჩართოთ zlib გაფართოება და gzuncompress ფუნქცია.",
398
- "SystemCheckIconvHelp": "საჭირო იქნება PHP კონფიგურირება და აღდგენა \"iconv\" მხარდაჭერის ჩართვით, --with-iconv.",
399
  "SystemCheckMailHelp": "გამოხმაურებები და პაროლის აღდგენის მოთხოვნები არ გაიგზავნება mail() ფუნქციის გარეშე.",
400
- "SystemCheckMbstring": "mbstring",
401
  "SystemCheckMemoryLimit": "მეხსიერების ლიმიტი",
402
  "SystemCheckMemoryLimitHelp": "მაღალი ტრაფიკის ვებ საიტის არქივირებისას შეიძლება უფრო მეტი მეხსიერება იქნეს საჭირო, ვიდრე ახლაა გამოყოფილი. თუ ასე მოხდა, შეცვალეთ memory_limit მაჩვენებელი თქვენს php.ini ფაილში.",
403
  "SystemCheckOpenURL": "გახსენით URL",
@@ -408,7 +406,6 @@
408
  "SystemCheckPdoAndMysqliHelp": "Linux სერვერზე თქვენ შეგიძლიათ გააკეთოთ php–ს კომპილაცია შემდეგი პარამეტრებით: %1$s თქვენს php.ini ფაილში, დაამატეთ შემდეგი სტრიქონები: %2$s",
409
  "SystemCheckPhp": "PHP ვერსია",
410
  "SystemCheckPhpPdoAndMysqli": "დამატებითი ინფორმაცია საკითხებზე: %1$sPHP PDO%2$s და %3$sMYSQLI%4$s.",
411
- "SystemCheckSplHelp": "საჭირო იქნება PHP კონფიგურირება და აღდგენა სტანდარტული PHP ბიბლიოთეკის (SPL) ჩართვით (ნაგულისხმევი).",
412
  "SystemCheckTimeLimitHelp": "მაღალი ტრაფიკის ვებ საიტებზე არქივირების პროცესის განხორციელებას შეიძლება ბევრი დრო დაჭირდეს ვიდრე დაშვებულია ახლა. თუ საჭირო იქნება, შეცვალეთ max_execution_time მნიშვნელობა თქვენს php.ini ფაილში.",
413
  "SystemCheckTracker": "ტრეკერის სტატუსი",
414
  "SystemCheckWarnDomHelp": "სასურველია ჩართოთ \"dom\" გაფართოების გამოყენება (მაგ., დააინსტალირეთ \"php-dom\" და\/ან \"php-xml\" პაკეტი).",
395
  "SystemCheckGlobHelp": "თქვენს ჰოსტ სერვერზე სტანდარტული ფუნქცია გამორთულია. Matomo ცდის ამ ფუნქციის ემულირებას, მაგრამ შესაძლოა წარმოიშვას შემდგომი უსაფრთხოების შეზღუდვები. ამან შეიძლება გავლენა იქონიოს ფუნქციონალურობაზე.",
396
  "SystemCheckGzcompressHelp": "თქვენ უნდა ჩართოთ zlib გაფართოება და gzcompress ფუნქცია.",
397
  "SystemCheckGzuncompressHelp": "თქვენ უნდა ჩართოთ zlib გაფართოება და gzuncompress ფუნქცია.",
 
398
  "SystemCheckMailHelp": "გამოხმაურებები და პაროლის აღდგენის მოთხოვნები არ გაიგზავნება mail() ფუნქციის გარეშე.",
 
399
  "SystemCheckMemoryLimit": "მეხსიერების ლიმიტი",
400
  "SystemCheckMemoryLimitHelp": "მაღალი ტრაფიკის ვებ საიტის არქივირებისას შეიძლება უფრო მეტი მეხსიერება იქნეს საჭირო, ვიდრე ახლაა გამოყოფილი. თუ ასე მოხდა, შეცვალეთ memory_limit მაჩვენებელი თქვენს php.ini ფაილში.",
401
  "SystemCheckOpenURL": "გახსენით URL",
406
  "SystemCheckPdoAndMysqliHelp": "Linux სერვერზე თქვენ შეგიძლიათ გააკეთოთ php–ს კომპილაცია შემდეგი პარამეტრებით: %1$s თქვენს php.ini ფაილში, დაამატეთ შემდეგი სტრიქონები: %2$s",
407
  "SystemCheckPhp": "PHP ვერსია",
408
  "SystemCheckPhpPdoAndMysqli": "დამატებითი ინფორმაცია საკითხებზე: %1$sPHP PDO%2$s და %3$sMYSQLI%4$s.",
 
409
  "SystemCheckTimeLimitHelp": "მაღალი ტრაფიკის ვებ საიტებზე არქივირების პროცესის განხორციელებას შეიძლება ბევრი დრო დაჭირდეს ვიდრე დაშვებულია ახლა. თუ საჭირო იქნება, შეცვალეთ max_execution_time მნიშვნელობა თქვენს php.ini ფაილში.",
410
  "SystemCheckTracker": "ტრეკერის სტატუსი",
411
  "SystemCheckWarnDomHelp": "სასურველია ჩართოთ \"dom\" გაფართოების გამოყენება (მაგ., დააინსტალირეთ \"php-dom\" და\/ან \"php-xml\" პაკეტი).",
app/lang/ko.json CHANGED
@@ -1201,9 +1201,7 @@
1201
  "SystemCheckGlobHelp": "이 내장 함수는 호스트에서 비활성화되어 있습니다. Matomo이 함수의 에뮬레이션을 시도하지만, 새로운 보안 제한으로 발생하는 경우가 있습니다. 또한 기능에 영향을 미칠수 있습니다.",
1202
  "SystemCheckGzcompressHelp": "zlib 확장과 gzcompress() 함수를 활성화해야합니다.",
1203
  "SystemCheckGzuncompressHelp": "zlib 확장과 gzuncompress() 함수를 활성화해야합니다.",
1204
- "SystemCheckIconvHelp": "\"iconv\"의 지원을 활성화하고, PHP 재구축 설정을 해야합니다 --with-iconv.",
1205
  "SystemCheckMailHelp": "mail() 없이 피드백과 잊어버린 비밀번호 메세지는 보내지지 않습니다.",
1206
- "SystemCheckMbstring": "mbstring",
1207
  "SystemCheckMemoryLimit": "메모리 제한",
1208
  "SystemCheckMemoryLimitHelp": "높은 트래픽의 웹사이트에서는 압축 진행중에 현재 허용된 것보다 더 높은 메모리를 필요로 할 수 있습니다. 만약 필요하다면 php.ini 파일에서 memory_limit을 변경하세요.",
1209
  "SystemCheckNoErrorsOrWarnings": "에러나 경고가 없습니다.",
@@ -1218,7 +1216,6 @@
1218
  "SystemCheckPdoAndMysqliHelp": "Linux 서버는 다음 옵션으로 PHP를 컴파일합니다: %1$sphp.ini에 다음 줄을 추가합니다: %2$s",
1219
  "SystemCheckPhp": "PHP 버전",
1220
  "SystemCheckPhpPdoAndMysqli": "자세한 문서: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
1221
- "SystemCheckSplHelp": "스탠다드 PHP 라이브러리가 활성화된 상태로 PHP를 설정하고 리빌딩해야 합니다. (기본).",
1222
  "SystemCheckSettings": "요구되는 PHP 설정 (php.ini)",
1223
  "SystemCheckSummaryNoProblems": "만세! Matomo 설정에 아무런 문제가 없습니다. 스스로에게 칭찬하세요.",
1224
  "SystemCheckSummaryThereWereErrors": "헐! Matomo 설정에서 일부 %1$s심각한 오류%2$s를 감지했습니다. %3$s이 문제는 즉시 해결해야합니다.%4$s",
1201
  "SystemCheckGlobHelp": "이 내장 함수는 호스트에서 비활성화되어 있습니다. Matomo이 함수의 에뮬레이션을 시도하지만, 새로운 보안 제한으로 발생하는 경우가 있습니다. 또한 기능에 영향을 미칠수 있습니다.",
1202
  "SystemCheckGzcompressHelp": "zlib 확장과 gzcompress() 함수를 활성화해야합니다.",
1203
  "SystemCheckGzuncompressHelp": "zlib 확장과 gzuncompress() 함수를 활성화해야합니다.",
 
1204
  "SystemCheckMailHelp": "mail() 없이 피드백과 잊어버린 비밀번호 메세지는 보내지지 않습니다.",
 
1205
  "SystemCheckMemoryLimit": "메모리 제한",
1206
  "SystemCheckMemoryLimitHelp": "높은 트래픽의 웹사이트에서는 압축 진행중에 현재 허용된 것보다 더 높은 메모리를 필요로 할 수 있습니다. 만약 필요하다면 php.ini 파일에서 memory_limit을 변경하세요.",
1207
  "SystemCheckNoErrorsOrWarnings": "에러나 경고가 없습니다.",
1216
  "SystemCheckPdoAndMysqliHelp": "Linux 서버는 다음 옵션으로 PHP를 컴파일합니다: %1$sphp.ini에 다음 줄을 추가합니다: %2$s",
1217
  "SystemCheckPhp": "PHP 버전",
1218
  "SystemCheckPhpPdoAndMysqli": "자세한 문서: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
 
1219
  "SystemCheckSettings": "요구되는 PHP 설정 (php.ini)",
1220
  "SystemCheckSummaryNoProblems": "만세! Matomo 설정에 아무런 문제가 없습니다. 스스로에게 칭찬하세요.",
1221
  "SystemCheckSummaryThereWereErrors": "헐! Matomo 설정에서 일부 %1$s심각한 오류%2$s를 감지했습니다. %3$s이 문제는 즉시 해결해야합니다.%4$s",
app/lang/lt.json CHANGED
@@ -684,9 +684,7 @@
684
  "SystemCheckGDHelp": "Mažos diagramos neveiks.",
685
  "SystemCheckGzcompressHelp": "Jums reikia įjungti zlib plėtinį ir gzcompress funkciją.",
686
  "SystemCheckGzuncompressHelp": "Jums reikia įjungti zlib plėtinį ir gzuncompress funkciją.",
687
- "SystemCheckIconvHelp": "Jums reikia sukonfigūruoti ir perdaryti PHP su įjungtu \"iconv\" palaikymu, --with-iconv.",
688
  "SystemCheckMailHelp": "Atsiliepimų ir prarastų slpatažodžių pranešimai nebus siunčiami be mail() funkcijos.",
689
- "SystemCheckMbstring": "mbstring",
690
  "SystemCheckMemoryLimit": "Atminties limitas",
691
  "SystemCheckMemoryLimitHelp": "Didelio lankytojų srauto svetainėse archyvavimas gali reikalauti daugiau atminties nei šiuo metu yra.<br \/>Pasitikrinkite reikšmę memory_limit savo php.ini faile, jeigu būtina.",
692
  "SystemCheckNoErrorsOrWarnings": "Nėra jokių klaidų ar įspėjimų",
@@ -698,7 +696,6 @@
698
  "SystemCheckPdoAndMysqliHelp": "Linux serveryje galite sukompiliuoti php su šiais nustatymais: %1$s į Jūsų php.ini failą įterpkite šias eilutes: %2$s",
699
  "SystemCheckPhp": "PHP versija",
700
  "SystemCheckPhpPdoAndMysqli": "Daugiau informacijos: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
701
- "SystemCheckSplHelp": "Jums reikia sukonfigūruoti ir perdaryti PHP su įjungtu Standard PHP Library (SPL) (pagal nutylėjimą).",
702
  "SystemCheckSettings": "Reikalinga PHP konfigūracija (php.ini)",
703
  "SystemCheckSummaryThereWereWarnings": "Yra kažkokių problemų su jūsų sistema. Matomo veiks, tačiau gali susidurti su menkomis problemomis.",
704
  "SystemCheckTimeLimitHelp": "Didelio lankytojų srauto svetainėse archyvavimo proceso aktyvavimas gali reikalauti daugiau laiko nei šiuo metu leidžiama.<br \/>Pasitikrinkite reikšmę max_execution_time savo php.ini faile, jeigu būtina.",
684
  "SystemCheckGDHelp": "Mažos diagramos neveiks.",
685
  "SystemCheckGzcompressHelp": "Jums reikia įjungti zlib plėtinį ir gzcompress funkciją.",
686
  "SystemCheckGzuncompressHelp": "Jums reikia įjungti zlib plėtinį ir gzuncompress funkciją.",
 
687
  "SystemCheckMailHelp": "Atsiliepimų ir prarastų slpatažodžių pranešimai nebus siunčiami be mail() funkcijos.",
 
688
  "SystemCheckMemoryLimit": "Atminties limitas",
689
  "SystemCheckMemoryLimitHelp": "Didelio lankytojų srauto svetainėse archyvavimas gali reikalauti daugiau atminties nei šiuo metu yra.<br \/>Pasitikrinkite reikšmę memory_limit savo php.ini faile, jeigu būtina.",
690
  "SystemCheckNoErrorsOrWarnings": "Nėra jokių klaidų ar įspėjimų",
696
  "SystemCheckPdoAndMysqliHelp": "Linux serveryje galite sukompiliuoti php su šiais nustatymais: %1$s į Jūsų php.ini failą įterpkite šias eilutes: %2$s",
697
  "SystemCheckPhp": "PHP versija",
698
  "SystemCheckPhpPdoAndMysqli": "Daugiau informacijos: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
 
699
  "SystemCheckSettings": "Reikalinga PHP konfigūracija (php.ini)",
700
  "SystemCheckSummaryThereWereWarnings": "Yra kažkokių problemų su jūsų sistema. Matomo veiks, tačiau gali susidurti su menkomis problemomis.",
701
  "SystemCheckTimeLimitHelp": "Didelio lankytojų srauto svetainėse archyvavimo proceso aktyvavimas gali reikalauti daugiau laiko nei šiuo metu leidžiama.<br \/>Pasitikrinkite reikšmę max_execution_time savo php.ini faile, jeigu būtina.",
app/lang/lv.json CHANGED
@@ -640,8 +640,6 @@
640
  "SystemCheckExtensions": "Citi vajadzīgie paplašinājumi",
641
  "SystemCheckFileIntegrity": "Datņu integritāte",
642
  "SystemCheckFunctions": "Nepieciešamās metodes",
643
- "SystemCheckIconvHelp": "Jums jāiestata un jāpārbūvē PHP ar ieslēgtu \"iconv\" atbalstu, --with-iconv.",
644
- "SystemCheckMbstring": "mbstring",
645
  "SystemCheckMemoryLimit": "Atmiņas limits",
646
  "SystemCheckOpenURL": "Atvērt URL",
647
  "SystemCheckOtherExtensions": "Citi paplašinājumi",
@@ -649,7 +647,6 @@
649
  "SystemCheckPdoAndMysqliHelp": "Uz Linux servera Jūs varat kompilēt php ar sekojošiem parametriem: %1$s Savā php.ini datnē pievienojiet sekojošas līnijas: %2$s",
650
  "SystemCheckPhp": "PHP versija",
651
  "SystemCheckPhpPdoAndMysqli": "Vairāk informācija par %1$sPHP PDO%2$s un %3$sMYSQLI%4$s.",
652
- "SystemCheckSplHelp": "Jums jāiestata un jāpārbūvē PHP ar ieslēgtu Standard PHP Library (SPL) (pēc noklusējuma).",
653
  "SystemCheckWarnDomHelp": "Jums ir jāieslēdz \"dom\" paplašinājums (piem., instalējiet \"php-dom\" un\/vai \"php-xml\" pakotnes).",
654
  "SystemCheckWarnLibXmlHelp": "Jums ir jāieslēdz \"libxml\" paplašinājums (piem., instalējiet \"php-libxml\" pakotni), jo tā ir nepieciešama citiem PHP paplašinājumiem.",
655
  "SystemCheckWarnSimpleXMLHelp": "Jums ir jāieslēdz \"SimpleXML\" paplašinājums (piem., instalējiet \"php-simplexml\" un\/vai \"php-xml\" pakotnes).",
640
  "SystemCheckExtensions": "Citi vajadzīgie paplašinājumi",
641
  "SystemCheckFileIntegrity": "Datņu integritāte",
642
  "SystemCheckFunctions": "Nepieciešamās metodes",
 
 
643
  "SystemCheckMemoryLimit": "Atmiņas limits",
644
  "SystemCheckOpenURL": "Atvērt URL",
645
  "SystemCheckOtherExtensions": "Citi paplašinājumi",
647
  "SystemCheckPdoAndMysqliHelp": "Uz Linux servera Jūs varat kompilēt php ar sekojošiem parametriem: %1$s Savā php.ini datnē pievienojiet sekojošas līnijas: %2$s",
648
  "SystemCheckPhp": "PHP versija",
649
  "SystemCheckPhpPdoAndMysqli": "Vairāk informācija par %1$sPHP PDO%2$s un %3$sMYSQLI%4$s.",
 
650
  "SystemCheckWarnDomHelp": "Jums ir jāieslēdz \"dom\" paplašinājums (piem., instalējiet \"php-dom\" un\/vai \"php-xml\" pakotnes).",
651
  "SystemCheckWarnLibXmlHelp": "Jums ir jāieslēdz \"libxml\" paplašinājums (piem., instalējiet \"php-libxml\" pakotni), jo tā ir nepieciešama citiem PHP paplašinājumiem.",
652
  "SystemCheckWarnSimpleXMLHelp": "Jums ir jāieslēdz \"SimpleXML\" paplašinājums (piem., instalējiet \"php-simplexml\" un\/vai \"php-xml\" pakotnes).",
app/lang/nb.json CHANGED
@@ -1335,9 +1335,7 @@
1335
  "SystemCheckGlobHelp": "Denne innebygde funksjonen har blitt deaktivert på din server. Matomo vil prøve å emulere denne funksjonen, men kan støte på flere sikkerhetsrestriksjoner. Funksjonaliteten kan bli påvirket.",
1336
  "SystemCheckGzcompressHelp": "Du må aktivere zlib utvidelsen og gzcompress-funksjonen.",
1337
  "SystemCheckGzuncompressHelp": "Du må aktivere zlib utvidelsen og gzuncompress-funksjonen.",
1338
- "SystemCheckIconvHelp": "Du må konfigurere og bygge PHP på nytt med iconv-støtte aktivert, --with-iconv.",
1339
  "SystemCheckMailHelp": "Tilbakemeldinger og \"Glemt passord\"-meldinger kan ikke sendes uten mail().",
1340
- "SystemCheckMbstring": "mbstring",
1341
  "SystemCheckMemoryLimit": "Minnegrense",
1342
  "SystemCheckMemoryLimitHelp": "På et høyt trafikkert nettsted, kan arkiveringsprossessen kreve mer minne enn det som nå er tillatt.<br \/>Se på memory_limit i din php.ini fil hvis nødvendig.",
1343
  "SystemCheckNoErrorsOrWarnings": "Det er ingen feil eller advarsler",
@@ -1352,7 +1350,6 @@
1352
  "SystemCheckPdoAndMysqliHelp": "På en GNU\/Linux-server kan du kompilere php med følgende valg: %1$s I din php.ini, legg til følgende linjer: %2$s",
1353
  "SystemCheckPhp": "PHP-versjon",
1354
  "SystemCheckPhpPdoAndMysqli": "Mer informasjon om: %1$sPHP PDO%2$s og %3$sMYSQLI%4$s.",
1355
- "SystemCheckSplHelp": "Du må konfigurere og bygge PHP på nytt med Standard PHP Library (SPL) aktivert.",
1356
  "SystemCheckSettings": "Påkrevd PHP-konfigurasjon (php.ini)",
1357
  "SystemCheckSummaryNoProblems": "Hurra! Det er ingen problemer med ditt Matomo-oppsett. Gi deg selv et klapp på skulderen.",
1358
  "SystemCheckSummaryThereWereErrors": "Å nei! Matomo har oppdaget noen %1$skritiske problemer%2$s med ditt Matomo-oppsett. %3$sDisse problemene bør fikses umiddelbart.%4$s",
1335
  "SystemCheckGlobHelp": "Denne innebygde funksjonen har blitt deaktivert på din server. Matomo vil prøve å emulere denne funksjonen, men kan støte på flere sikkerhetsrestriksjoner. Funksjonaliteten kan bli påvirket.",
1336
  "SystemCheckGzcompressHelp": "Du må aktivere zlib utvidelsen og gzcompress-funksjonen.",
1337
  "SystemCheckGzuncompressHelp": "Du må aktivere zlib utvidelsen og gzuncompress-funksjonen.",
 
1338
  "SystemCheckMailHelp": "Tilbakemeldinger og \"Glemt passord\"-meldinger kan ikke sendes uten mail().",
 
1339
  "SystemCheckMemoryLimit": "Minnegrense",
1340
  "SystemCheckMemoryLimitHelp": "På et høyt trafikkert nettsted, kan arkiveringsprossessen kreve mer minne enn det som nå er tillatt.<br \/>Se på memory_limit i din php.ini fil hvis nødvendig.",
1341
  "SystemCheckNoErrorsOrWarnings": "Det er ingen feil eller advarsler",
1350
  "SystemCheckPdoAndMysqliHelp": "På en GNU\/Linux-server kan du kompilere php med følgende valg: %1$s I din php.ini, legg til følgende linjer: %2$s",
1351
  "SystemCheckPhp": "PHP-versjon",
1352
  "SystemCheckPhpPdoAndMysqli": "Mer informasjon om: %1$sPHP PDO%2$s og %3$sMYSQLI%4$s.",
 
1353
  "SystemCheckSettings": "Påkrevd PHP-konfigurasjon (php.ini)",
1354
  "SystemCheckSummaryNoProblems": "Hurra! Det er ingen problemer med ditt Matomo-oppsett. Gi deg selv et klapp på skulderen.",
1355
  "SystemCheckSummaryThereWereErrors": "Å nei! Matomo har oppdaget noen %1$skritiske problemer%2$s med ditt Matomo-oppsett. %3$sDisse problemene bør fikses umiddelbart.%4$s",
app/lang/nl.json CHANGED
@@ -1363,12 +1363,12 @@
1363
  "ContactUs": "Neem contact met ons op",
1364
  "VisitTheForums": "Bezoek het %1$s Forums%2$s en ontvang hulp van de community van Matomo users",
1365
  "Forums": "Forums",
1366
- "ReviewMatomoTitle": "Geloof je in Matomo?",
1367
  "RemindMeLater": "Herinner mij later",
1368
  "NeverAskMeAgain": "Vraag het me nooit meer",
1369
  "HowCanWeHelp": "Hoe kunnen we helpen?",
1370
  "NotTrackingVisits": "Matomo houdt geen bezoeken bij",
1371
- "PopularHelpTopics": "Populaire help onderwerpen"
 
1372
  },
1373
  "GeoIp2": {
1374
  "AssumingNonApache": "Kan de functie apache_get_modules niet vinden, uitgegaan van non-Apache webserver.",
@@ -1640,9 +1640,7 @@
1640
  "SystemCheckGzcompressHelp": "U moet de zlib-extensie en gzcompress-functie inschakelen.",
1641
  "SystemCheckGzuncompressHelp": "U moet de zlib-extensie en gzuncompress-functie inschakelen.",
1642
  "SystemCheckHashHelp": "Je dient PHP opnieuw te configureren en compileren met hash() support, door de optie --disable-hash weg te laten.",
1643
- "SystemCheckIconvHelp": "U moet PHP configureren met iconv support ingeschakeld --with-iconv.",
1644
  "SystemCheckMailHelp": "Feedback en vergeten wachtwoord berichten zullen niet worden verzonden zonder mail()",
1645
- "SystemCheckMbstring": "mbstring",
1646
  "SystemCheckMemoryLimit": "Geheugenlimiet",
1647
  "SystemCheckMemoryLimitHelp": "Het meten van een website met veel bezoekers kan meer geheugen vereisen dan momenteel is toegestaan.<br \/>Controleer de directive memory_limit in uw php.ini file indien noodzakelijk.",
1648
  "SystemCheckNoErrorsOrWarnings": "Er zijn geen fouten of waarschuwingen",
@@ -1657,7 +1655,6 @@
1657
  "SystemCheckPdoAndMysqliHelp": "Op een Linux server kunt u php compileren met de volgende opties: %1$s in uw php.ini, voeg de volgende regels toe: %2$s",
1658
  "SystemCheckPhp": "PHP-versie",
1659
  "SystemCheckPhpPdoAndMysqli": "Meer informatie op: %1$sPHP PDO%2$s en %3$sMYSQLI%4$s.",
1660
- "SystemCheckSplHelp": "U moet PHP opnieuw configureren en compileren met de standard PHP LIbrary (SPL) ingeschakeld (standaard)",
1661
  "SystemCheckSettings": "Vereiste PHP-configuratie (php.ini)",
1662
  "SystemCheckSummaryNoProblems": "Hoera! Er zijn geen problemen met je Matomo setup. Geef jezelf een schouderklopje.",
1663
  "SystemCheckSummaryThereWereErrors": "Oeps! Matomo heeft enkele %1$skritieke problemen%2$s gedetecteerd in je Matomo setup. %3$sDeze problemen zouden meteen gefixed moeten worden.%4$s",
1363
  "ContactUs": "Neem contact met ons op",
1364
  "VisitTheForums": "Bezoek het %1$s Forums%2$s en ontvang hulp van de community van Matomo users",
1365
  "Forums": "Forums",
 
1366
  "RemindMeLater": "Herinner mij later",
1367
  "NeverAskMeAgain": "Vraag het me nooit meer",
1368
  "HowCanWeHelp": "Hoe kunnen we helpen?",
1369
  "NotTrackingVisits": "Matomo houdt geen bezoeken bij",
1370
+ "PopularHelpTopics": "Populaire help onderwerpen",
1371
+ "ReferBannerTitle": "Geloof je in Matomo?"
1372
  },
1373
  "GeoIp2": {
1374
  "AssumingNonApache": "Kan de functie apache_get_modules niet vinden, uitgegaan van non-Apache webserver.",
1640
  "SystemCheckGzcompressHelp": "U moet de zlib-extensie en gzcompress-functie inschakelen.",
1641
  "SystemCheckGzuncompressHelp": "U moet de zlib-extensie en gzuncompress-functie inschakelen.",
1642
  "SystemCheckHashHelp": "Je dient PHP opnieuw te configureren en compileren met hash() support, door de optie --disable-hash weg te laten.",
 
1643
  "SystemCheckMailHelp": "Feedback en vergeten wachtwoord berichten zullen niet worden verzonden zonder mail()",
 
1644
  "SystemCheckMemoryLimit": "Geheugenlimiet",
1645
  "SystemCheckMemoryLimitHelp": "Het meten van een website met veel bezoekers kan meer geheugen vereisen dan momenteel is toegestaan.<br \/>Controleer de directive memory_limit in uw php.ini file indien noodzakelijk.",
1646
  "SystemCheckNoErrorsOrWarnings": "Er zijn geen fouten of waarschuwingen",
1655
  "SystemCheckPdoAndMysqliHelp": "Op een Linux server kunt u php compileren met de volgende opties: %1$s in uw php.ini, voeg de volgende regels toe: %2$s",
1656
  "SystemCheckPhp": "PHP-versie",
1657
  "SystemCheckPhpPdoAndMysqli": "Meer informatie op: %1$sPHP PDO%2$s en %3$sMYSQLI%4$s.",
 
1658
  "SystemCheckSettings": "Vereiste PHP-configuratie (php.ini)",
1659
  "SystemCheckSummaryNoProblems": "Hoera! Er zijn geen problemen met je Matomo setup. Geef jezelf een schouderklopje.",
1660
  "SystemCheckSummaryThereWereErrors": "Oeps! Matomo heeft enkele %1$skritieke problemen%2$s gedetecteerd in je Matomo setup. %3$sDeze problemen zouden meteen gefixed moeten worden.%4$s",
app/lang/nn.json CHANGED
@@ -580,7 +580,6 @@
580
  "SystemCheckFileIntegrity": "Filintegritet",
581
  "SystemCheckFunctions": "Påkravde funksjonar",
582
  "SystemCheckGDHelp": "Gnistlinjene (små bilete) og biletgrafane (i e-postrapportar og i mobilappen til Matomo) vil ikkje fungera.",
583
- "SystemCheckIconvHelp": "Du må konfigurera og byggja PHP med \"iconv\"-støtte påslegen, --with-iconv.",
584
  "SystemCheckMailHelp": "Attendemeldingar og 'Tapt Passord'-meldingar vil ikkje sendast uten mail().",
585
  "SystemCheckMemoryLimit": "Minnegrense",
586
  "SystemCheckMemoryLimitHelp": "På ein nettstad med høg trafikk, kan arkiveringsprosessen nytta meir minne enn den hev lov til.<br \/>Sjå innstillinga memory_limit i php.ini-fila di viss det trengst.",
@@ -591,7 +590,6 @@
591
  "SystemCheckPdoAndMysqliHelp": "På ein Linux-tenar kan du kompilera php med følgjande val: %1$s Legg til følgjande linjer i di php.ini-fil: %2$s",
592
  "SystemCheckPhp": "PHP-versjon",
593
  "SystemCheckPhpPdoAndMysqli": "Meir informasjon om: %1$sPHP PDO%2$s og %3$sMYSQLI%4$s.",
594
- "SystemCheckSplHelp": "Du må konfigurera og byggja PHP med Standard PHP Library (SPL) påslegen (standard).",
595
  "SystemCheckTimeLimitHelp": "På ein nettstad med høg trafikk, kan arkiveringsprosessen nytta meir tid enn den hev lov til.<br \/>Viss det trengs, endre innstillinga max_execution_time i php.ini-fila di.",
596
  "SystemCheckWarnDomHelp": "Du bør slå på \"dom\"-utvidinga (t.d. installer \"php-dom\"- og\/eller \"php-xml\"-pakken).",
597
  "SystemCheckWarning": "Matomo vil fungera som normalt, men det kan hende at somme funksjonar manglar",
580
  "SystemCheckFileIntegrity": "Filintegritet",
581
  "SystemCheckFunctions": "Påkravde funksjonar",
582
  "SystemCheckGDHelp": "Gnistlinjene (små bilete) og biletgrafane (i e-postrapportar og i mobilappen til Matomo) vil ikkje fungera.",
 
583
  "SystemCheckMailHelp": "Attendemeldingar og 'Tapt Passord'-meldingar vil ikkje sendast uten mail().",
584
  "SystemCheckMemoryLimit": "Minnegrense",
585
  "SystemCheckMemoryLimitHelp": "På ein nettstad med høg trafikk, kan arkiveringsprosessen nytta meir minne enn den hev lov til.<br \/>Sjå innstillinga memory_limit i php.ini-fila di viss det trengst.",
590
  "SystemCheckPdoAndMysqliHelp": "På ein Linux-tenar kan du kompilera php med følgjande val: %1$s Legg til følgjande linjer i di php.ini-fil: %2$s",
591
  "SystemCheckPhp": "PHP-versjon",
592
  "SystemCheckPhpPdoAndMysqli": "Meir informasjon om: %1$sPHP PDO%2$s og %3$sMYSQLI%4$s.",
 
593
  "SystemCheckTimeLimitHelp": "På ein nettstad med høg trafikk, kan arkiveringsprosessen nytta meir tid enn den hev lov til.<br \/>Viss det trengs, endre innstillinga max_execution_time i php.ini-fila di.",
594
  "SystemCheckWarnDomHelp": "Du bør slå på \"dom\"-utvidinga (t.d. installer \"php-dom\"- og\/eller \"php-xml\"-pakken).",
595
  "SystemCheckWarning": "Matomo vil fungera som normalt, men det kan hende at somme funksjonar manglar",
app/lang/pl.json CHANGED
@@ -1649,9 +1649,7 @@
1649
  "SystemCheckGzcompressHelp": "Musisz włączyć rozszerzenie zlib i funkcję gzcompress.",
1650
  "SystemCheckGzuncompressHelp": "Musisz włączyć rozszerzenie zlib i funkcję gzuncompress.",
1651
  "SystemCheckHashHelp": "Musisz skonfigurować i przebudować swoją instalację PHP usuwając opcję --disable-hash, aby włączyć wsparcie dla funkcji hash().",
1652
- "SystemCheckIconvHelp": "Potrzebujesz skonfigurować i przebudować środowisko PHP, z włączonym wsparciem dla \"iconv\", --with-iconv.",
1653
  "SystemCheckMailHelp": "Informacje zwrotne i wiadomości odzyskiwania hasła nie będą wysyłane bez funkcji mail().",
1654
- "SystemCheckMbstring": "mbstring",
1655
  "SystemCheckMemoryLimit": "Limit pamięci",
1656
  "SystemCheckMemoryLimitHelp": "Na stronach o wysokim ruchu, proces archiwizacji może wymagać więcej pamięci niż obecnie dostępna. Jeżeli okaże się to konieczne, zmień wielkość memory_limit w pliku php.ini.",
1657
  "SystemCheckNoErrorsOrWarnings": "Nie ma błędów ani ostrzeżeń",
@@ -1666,7 +1664,6 @@
1666
  "SystemCheckPdoAndMysqliHelp": "Na serwerach pracujących w oparciu o system Linux możesz skompilować PHP z użyciem następującej opcji: %1$s W pliku php.ini, dodaj następujące linie: %2$s",
1667
  "SystemCheckPhp": "wersja PHP",
1668
  "SystemCheckPhpPdoAndMysqli": "Więcej informacji na temat: %1$sPHP PDO%2$s i %3$sMYSQLI%4$s.",
1669
- "SystemCheckSplHelp": "Musisz skonfigurować i przebudować instalację PHP, aby włączyć (domyślnie) Standardową Biblioteką PHP (SPL).",
1670
  "SystemCheckSettings": "Wymagana konfiguracja PHP (php.ini)",
1671
  "SystemCheckSummaryNoProblems": "Hurra! Twój Matomo jest poprawnie skonfigurowany. Możesz przybić sobie piątkę.",
1672
  "SystemCheckSummaryThereWereErrors": "O nie! Matomo wykrył kilka %1$skrytycznych problemów%2$s w swojej konfiguracji. %3$s Te problemy powinny zostać jak najszybciej rozwiązane.%4$s",
1649
  "SystemCheckGzcompressHelp": "Musisz włączyć rozszerzenie zlib i funkcję gzcompress.",
1650
  "SystemCheckGzuncompressHelp": "Musisz włączyć rozszerzenie zlib i funkcję gzuncompress.",
1651
  "SystemCheckHashHelp": "Musisz skonfigurować i przebudować swoją instalację PHP usuwając opcję --disable-hash, aby włączyć wsparcie dla funkcji hash().",
 
1652
  "SystemCheckMailHelp": "Informacje zwrotne i wiadomości odzyskiwania hasła nie będą wysyłane bez funkcji mail().",
 
1653
  "SystemCheckMemoryLimit": "Limit pamięci",
1654
  "SystemCheckMemoryLimitHelp": "Na stronach o wysokim ruchu, proces archiwizacji może wymagać więcej pamięci niż obecnie dostępna. Jeżeli okaże się to konieczne, zmień wielkość memory_limit w pliku php.ini.",
1655
  "SystemCheckNoErrorsOrWarnings": "Nie ma błędów ani ostrzeżeń",
1664
  "SystemCheckPdoAndMysqliHelp": "Na serwerach pracujących w oparciu o system Linux możesz skompilować PHP z użyciem następującej opcji: %1$s W pliku php.ini, dodaj następujące linie: %2$s",
1665
  "SystemCheckPhp": "wersja PHP",
1666
  "SystemCheckPhpPdoAndMysqli": "Więcej informacji na temat: %1$sPHP PDO%2$s i %3$sMYSQLI%4$s.",
 
1667
  "SystemCheckSettings": "Wymagana konfiguracja PHP (php.ini)",
1668
  "SystemCheckSummaryNoProblems": "Hurra! Twój Matomo jest poprawnie skonfigurowany. Możesz przybić sobie piątkę.",
1669
  "SystemCheckSummaryThereWereErrors": "O nie! Matomo wykrył kilka %1$skrytycznych problemów%2$s w swojej konfiguracji. %3$s Te problemy powinny zostać jak najszybciej rozwiązane.%4$s",
app/lang/pt-br.json CHANGED
@@ -16,6 +16,7 @@
16
  "Apply": "Aplicar",
17
  "ArchivingInlineHelp": "Para sites com tráfego de médio a alto, é recomendado desabilitar a trigger que salva do navegador. Em vez disso, nós recomendamos que instale um cron job para processar os relatorios Matomo a cada hora.",
18
  "ArchivingTriggerDescription": "Recomendado para instalações maiores do Matomo, você precisa %1$sconfigurar um trabalho cron%2$s para processar os relatórios automaticamente.",
 
19
  "AuthenticationMethodSmtp": "Método de autenticação para SMTP",
20
  "AverageOrderValue": "Média de Pedidos",
21
  "AveragePrice": "Preço Médio",
@@ -32,6 +33,7 @@
32
  "ChooseLanguage": "Escolha o idioma.",
33
  "ChoosePeriod": "Escolha o período.",
34
  "ClickHere": "Clique aqui para mais informações.",
 
35
  "DoubleClickToChangePeriod": "Clique duplo para aplicar o período",
36
  "Close": "Fechar",
37
  "ClickToSearch": "Clique para pesquisar",
@@ -209,6 +211,8 @@
209
  "ExceptionWidgetNotFound": "O widget solicitado não existe.",
210
  "ExceptionReportNotEnabled": "O relatório solicitado não está habilitado. Geralmente isto significa que o plugin que define o relatório está desativado ou você não tem permissão suficiente para acessar o mesmo.",
211
  "ExceptionWidgetNotEnabled": "O widget solicitado não está habilitado. Geralmente isto significa que o plugin que define o widget está desativado ou você não tem permissão suficiente para acessar o mesmo.",
 
 
212
  "ExpandDataTableFooter": "Alterar a visualização ou configurar o relatório",
213
  "Export": "Exportar",
214
  "ExportAsImage": "Exportar como imagem",
@@ -486,6 +490,7 @@
486
  "WarningFileIntegrityNoMd5file": "O check de integridade do arquivo não pode ser completado enquanto estiver faltando a função md5_file().",
487
  "WarningPasswordStored": "%1$sWarning:%2$s Esta senha será armazenada no arquivo de configuração visível para todos que possam acessá-lo.",
488
  "WarningDebugOnDemandEnabled": "O modo Tracker %1$s está ativado. Por razões de segurança, este deve ser ativado apenas por um curto período de tempo. Para desativá-lo configure %2$s para %3$s em %4$s",
 
489
  "Website": "Website",
490
  "Weekly": "Semanalmente",
491
  "WeeklyReport": "semanal",
@@ -520,7 +525,8 @@
520
  "Custom": "Personalizado",
521
  "PreviousPeriod": "Período anterior",
522
  "PreviousYear": "Ano anterior",
523
- "ViewAccessRequired": "O token_auth usado tem muito acesso para ser usado em um pedido URL não-API. Por favor use uma senha específica do aplicativo para um usuário que só tenha acesso para visualização."
 
524
  },
525
  "Mobile": {
526
  "AboutPiwikMobile": "Sobre o Matomo Móvel",
@@ -662,6 +668,7 @@
662
  "ColumnUniqueOutlinks": "Outlinks únicos",
663
  "ColumnIdPageview": "ID da página",
664
  "ColumnInteractionPosition": "Posição de Interação",
 
665
  "ActionsInVisit": "Ações em Visita",
666
  "DownloadsReportDocumentation": "Neste relatório, você pode ver quais arquivos seus visitantes baixaram. %s Matomo registra como download um click em um link de download. Se o download foi completado ou não o Matomo não consegue determinar.",
667
  "EntryPagesReportDocumentation": "Este relatório contém informações sobre as páginas de entrada que foram usadas durante o período especificado. Uma página de entrada é a primeira página que um usuário visualiza durante a visita. 1%s As URLs de entrada são exibidos como uma estrutura de pastas.",
@@ -670,6 +677,7 @@
670
  "ExitPagesReportDocumentation": "Este relatório contém informações sobre as páginas de saída que ocorreram durante o período especificado. Uma página de saída é a última página que um usuário visualiza durante a visita. 1%s As URLs de saída são exibidos como uma estrutura de pastas.",
671
  "ExitPageTitles": "Título de páginas de saída",
672
  "ExitPageTitlesReportDocumentation": "Este relatório contém informações sobre os títulos de páginas de saída que ocorreram durante o período especificado.",
 
673
  "OneSearch": "1 pesquisa",
674
  "OutlinkDocumentation": "Um outlink é um link que leva o visitante para fora do seu site (para outro domínio)",
675
  "OutlinksReportDocumentation": "Este relatório mostra uma lista hierárquica de URLs de outlinks clicadas pelos seus visitantes.",
@@ -687,6 +695,8 @@
687
  "SiteSearchCategories": "Categorias (Pesquisa no Site)",
688
  "SiteSearchKeyword": "Palavra-Chave (Pesquisa no SIte)",
689
  "SiteSearchKeywords": "Palavras-chave (Pesquisa no site)",
 
 
690
  "SiteSearchKeywordsDocumentation": "Este relatório lista as Pesquisas de Palavras-chave que os visitantes procuraram em seu Motor de Busca interno.",
691
  "SiteSearchKeywordsNoResultDocumentation": "Este relatório lista as Palavras Chave de Pesquisa que não retornaram nenhum resultado de pesquisa: talvez o algoritmo do motor de busca possa ser melhorado, ou talvez seus visitantes estão procurando por conteúdo que não estão (ainda) em seu site?",
692
  "SubmenuPagesEntry": "Páginas de entrada",
@@ -706,7 +716,16 @@
706
  "ActionType": "Tipo de Ação",
707
  "ActionTypes": "Tipo de Ação",
708
  "Behaviour": "Comportamento",
709
- "PagesSubcategoryHelp3": "Use os ícones de mais e menos à esquerda para navegar."
 
 
 
 
 
 
 
 
 
710
  },
711
  "Annotations": {
712
  "AddAnnotationsFor": "Adicione anotações para %s...",
@@ -1234,7 +1253,8 @@
1234
  "SetAsDefaultWidgetsConfirmHelp": "Esta seleção widgets e layout de colunas do painel será usado quando qualquer usuário cria um novo painel, ou quando o recurso \"%s\" é usado.",
1235
  "TopLinkTooltip": "Ver relatórios de Análise Web para %s.",
1236
  "WidgetNotFound": "Widget não encontrado",
1237
- "WidgetPreview": "Visualização do Widget"
 
1238
  },
1239
  "DevicePlugins": {
1240
  "BrowserWithNoPluginsEnabled": "%1$s sem plugins habilitados",
@@ -1396,7 +1416,6 @@
1396
  "ContactUs": "Entre em contato",
1397
  "VisitTheForums": "Visite o %1$s Fóruns%2$s e obtenha ajuda da comunidade de usuários Matomo",
1398
  "Forums": "Fóruns",
1399
- "ReviewMatomoTitle": "Acredita no Matomo?",
1400
  "PleaseLeaveExternalReviewForMatomo": "Compartilhe seus pensamentos em um desses sites e inspire outras pessoas a participarem da nossa revolução de dados.",
1401
  "RemindMeLater": "Lembrar-me mais tarde",
1402
  "NeverAskMeAgain": "Não me perguntar novamente",
@@ -1406,7 +1425,8 @@
1406
  "RemoveOtherLabel": "Quero ver os dados de 'Outros'",
1407
  "PurgeOldData": "Quero remover alguns dados antigos",
1408
  "SearchHelpResources": "Procurar recursos de ajuda do matomo.org",
1409
- "PopularHelpTopics": "Tópicos populares de ajuda"
 
1410
  },
1411
  "GeoIp2": {
1412
  "AssumingNonApache": "Não é possível encontrar a função apache_get_modules, assumindo servidor web não-Apache.",
@@ -1647,6 +1667,10 @@
1647
  "GoBackAndDefinePrefix": "Volte e defina um prefixo para as tabelas Matomo",
1648
  "HappyAnalysing": "Boa análise!",
1649
  "Installation": "Instalação",
 
 
 
 
1650
  "InstallationStatus": "Status da Instalação",
1651
  "InsufficientPrivilegesHelp": "Você pode adicionar esses privilégios usando uma ferramenta como o phpMyAdmin ou executando as consultas SQL de permissões. Se você não sabe como fazer essas coisas, por favor, peça ao seu sysadmin para conceder esses privilégios para você.",
1652
  "InsufficientPrivilegesMain": "Ou o banco de dados não existe (e não poderia ser criado), ou o usuário especificado tem privilégios insuficientes. Usuário de banco de dados deve ter os seguintes privilégios: %s",
@@ -1707,6 +1731,7 @@
1707
  "SystemCheckEvalHelp": "Requisitado pelo HTML QuickForm e sistema Smarty de templating.",
1708
  "SystemCheckExtensions": "Outras extensões requeridas",
1709
  "SystemCheckFileIntegrity": "Integridade de arquivo.",
 
1710
  "SystemCheckFunctions": "Funções requeridas",
1711
  "SystemCheckFunctionHelp": "Você precisa ativar esta função embutida.",
1712
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (graphics)",
@@ -1715,12 +1740,11 @@
1715
  "SystemCheckGzcompressHelp": "Você precisa habilitar a extensão zlib e a função gzcompress.",
1716
  "SystemCheckGzuncompressHelp": "Você precisa habilitar a extensão zlib e a função gzuncompress.",
1717
  "SystemCheckHashHelp": "Você precisa configurar e reconstruir o PHP com suporte a hash() ativado, excluindo a opção --disable-hash.",
1718
- "SystemCheckIconvHelp": "Você precisa configurar e reconstruir PHP com suporte \"iconv\" habilitado, --with-iconv.",
1719
  "SystemCheckMailHelp": "Mensagens de Feedback e Senha Perdida não serão enviadas sem mail().",
1720
- "SystemCheckMbstring": "mbstring",
1721
- "SystemCheckMbstringHelp": "A extensão mbstring é necessária para lidar com caracteres de vários bytes na interface do usuário e respostas do API. Por favor, também verifique se mbstring.func_overload está configurada para \"0\" em php.ini.",
1722
  "SystemCheckMemoryLimit": "Limite de Memória",
1723
  "SystemCheckMemoryLimitHelp": "Em um site com alto tráfego, o processo de arquivamento pode exigir mais memória do que o atualmente permitido. Se necessário, mude a diretiva memory_limit no seu arquivo php.ini.",
 
1724
  "SystemCheckNoErrorsOrWarnings": "Não há erros ou avisos",
1725
  "SystemCheckViewFullSystemCheck": "Ver relatório completo de verificação do sistema",
1726
  "SystemCheckOpenURL": "Abre URL",
@@ -1734,7 +1758,6 @@
1734
  "SystemCheckPdoAndMysqliHelp": "Num servidor Linux você poderá compilar o php com as seguintes opções: %1$s No seu php.ini, adicione as seguintes linhas: %2$s",
1735
  "SystemCheckPhp": "Versão do PHP",
1736
  "SystemCheckPhpPdoAndMysqli": "Mais informações em: %1$sPHP PDO%2$s e %3$sMYSQLI%4$s.",
1737
- "SystemCheckSplHelp": "Você precisa configurar e remontar o PHP com a Standard PHP Library (SPL) habilitada (por padrão).",
1738
  "SystemCheckSettings": "Configuração PHP requerida (php.ini)",
1739
  "SystemCheckSummaryNoProblems": "Huzzah! Não há problemas com sua configuração Matomo. Dê a você mesmo um tapinha nas costas.",
1740
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo detectou algunas %1$squestões críticas%2$s com as suas configurações. %3$s Estas questões devem ser corrigidas imediatamente. %4$s",
@@ -3770,6 +3793,7 @@
3770
  "DriftHelp": "Esta tag permite que você adicione o formulário de contato Drift ao seu site.",
3771
  "AllDownloadsClickTriggerDescription": "Acionado quando um link para um arquivo baixável é clicado.",
3772
  "AllDownloadsClickTriggerHelp": "Acionado quando um usuário clica em um elemento \"A\" ou \"AREA\" e o link aponta para um arquivo com uma extensão de arquivo baixável.",
 
3773
  "Draft": "Rascunho",
3774
  "EditContainer": "Editar contêiner",
3775
  "EditTag": "Editar tag",
@@ -3790,16 +3814,21 @@
3790
  "EnablingPreviewPleaseWait": "Habilitando modo de pré-visualização, por favor aguarde...",
3791
  "EndDate": "Data final",
3792
  "EntityDateTypeMetaInformation": "Criado em \"%1$s\", última atualização em \"%2$s\", tipo: \"%3$s\"",
 
3793
  "Environment": "Ambiente",
3794
  "EnvironmentVariableDescription": "Retorna o ambiente atual.",
3795
  "EnvironmentVariableName": "Nome do ambiente",
3796
  "Environments": "Ambientes",
 
 
3797
  "ErrorComparisonNotSupported": "A comparação \"%s\" não é suportada.",
3798
  "ErrorContainerDoesNotExist": "O contêiner requisitado \"%s\" não existe.",
3799
  "ErrorContainerIdDuplicate": "O ID de contêiner já está em uso",
3800
  "ErrorContainerReleaseDoesNotExist": "O lançamento requisitado do contêiner não existe.",
3801
  "ErrorContainerTriggerDoesNotExist": "O gatilho de contêiner solicitado não existe.",
3802
  "ErrorContainerVersionDoesNotExist": "A versão requisitada do contêiner não existe.",
 
 
3803
  "ErrorEndDateBeforeStartDate": "A data de início precisa ser anterior à data de fim.",
3804
  "ErrorEnvironmentDoesNotExist": "O ambiente \"%s\" não existe.",
3805
  "ErrorEnvironmentInvalidLength": "O ambiente \"%1$s\" não tem um comprimento válido. Por favor use entre %2$s e %3$s caracteres.",
@@ -3824,8 +3853,15 @@
3824
  "ErrorVersionCannotBeDeletedAsPublished": "Esta versão não pode ser excluída pois está publicada em pelo menos um ambiente.",
3825
  "ErrorXNotProvided": "Por favor, forneça um valor para \"%1$s\".",
3826
  "ErrorXNotWhitelisted": "O valor para \"%1$s\" não é permitido, use um dos: %2$s.",
 
 
 
 
3827
  "ExportDraft": "Exportar rascunho",
3828
  "ExportX": "Exportar %s",
 
 
 
3829
  "Filter": "Filtro",
3830
  "FireDelay": "Atraso de disparo",
3831
  "FireDelayHelp": "Permite a você atrasar a execução desta tag. Isto pode ser útil, por exemplo, se você quiser dar tempo para um gatilho de bloqueio para impedir que a tag seja executada. O valor é esperado em milissegundos, onde 1000ms são iguais a um segundo.",
@@ -4422,6 +4458,7 @@
4422
  "PluginDescription": "Informa métricas analíticas gerais: visitas, visitantes únicos, número de ações, taxa de rejeição, etc.",
4423
  "VisitsSummary": "Resumo dos Visitantes",
4424
  "VisitsSummaryDocumentation": "Esta é uma visão geral da evolução da visita.",
 
4425
  "WidgetLastVisits": "Gráfico dos últimos visitantes",
4426
  "WidgetOverviewGraph": "Visão Geral com Gráfico",
4427
  "WidgetVisits": "Visão Geral dos Visitantes"
16
  "Apply": "Aplicar",
17
  "ArchivingInlineHelp": "Para sites com tráfego de médio a alto, é recomendado desabilitar a trigger que salva do navegador. Em vez disso, nós recomendamos que instale um cron job para processar os relatorios Matomo a cada hora.",
18
  "ArchivingTriggerDescription": "Recomendado para instalações maiores do Matomo, você precisa %1$sconfigurar um trabalho cron%2$s para processar os relatórios automaticamente.",
19
+ "ArchivingTriggerSegment": "O uso de segmentos personalizados ainda acionará o processamento de arquivos.",
20
  "AuthenticationMethodSmtp": "Método de autenticação para SMTP",
21
  "AverageOrderValue": "Média de Pedidos",
22
  "AveragePrice": "Preço Médio",
33
  "ChooseLanguage": "Escolha o idioma.",
34
  "ChoosePeriod": "Escolha o período.",
35
  "ClickHere": "Clique aqui para mais informações.",
36
+ "CompareTo": "Comparado a:",
37
  "DoubleClickToChangePeriod": "Clique duplo para aplicar o período",
38
  "Close": "Fechar",
39
  "ClickToSearch": "Clique para pesquisar",
211
  "ExceptionWidgetNotFound": "O widget solicitado não existe.",
212
  "ExceptionReportNotEnabled": "O relatório solicitado não está habilitado. Geralmente isto significa que o plugin que define o relatório está desativado ou você não tem permissão suficiente para acessar o mesmo.",
213
  "ExceptionWidgetNotEnabled": "O widget solicitado não está habilitado. Geralmente isto significa que o plugin que define o widget está desativado ou você não tem permissão suficiente para acessar o mesmo.",
214
+ "ExceptionNotSupportedBrowserTitle": "Seu navegador não é compatível.",
215
+ "ExceptionNotSupportedBrowserText": "Devido a problemas de segurança, seu navegador não é compatível. Por favor, o atualize para uma versão mais recente.",
216
  "ExpandDataTableFooter": "Alterar a visualização ou configurar o relatório",
217
  "Export": "Exportar",
218
  "ExportAsImage": "Exportar como imagem",
490
  "WarningFileIntegrityNoMd5file": "O check de integridade do arquivo não pode ser completado enquanto estiver faltando a função md5_file().",
491
  "WarningPasswordStored": "%1$sWarning:%2$s Esta senha será armazenada no arquivo de configuração visível para todos que possam acessá-lo.",
492
  "WarningDebugOnDemandEnabled": "O modo Tracker %1$s está ativado. Por razões de segurança, este deve ser ativado apenas por um curto período de tempo. Para desativá-lo configure %2$s para %3$s em %4$s",
493
+ "WarningDevelopmentModeOnButNotGitInstalled": "Você está usando Matomo no modo desenvolvedor, mas não foi instalado através do git. Não é recomendado utilizar o Matomo no modo desenvolvedor em ambiente de produção.",
494
  "Website": "Website",
495
  "Weekly": "Semanalmente",
496
  "WeeklyReport": "semanal",
525
  "Custom": "Personalizado",
526
  "PreviousPeriod": "Período anterior",
527
  "PreviousYear": "Ano anterior",
528
+ "ViewAccessRequired": "O token_auth usado tem muito acesso para ser usado em um pedido URL não-API. Por favor use uma senha específica do aplicativo para um usuário que só tenha acesso para visualização.",
529
+ "Reasons": "Razões"
530
  },
531
  "Mobile": {
532
  "AboutPiwikMobile": "Sobre o Matomo Móvel",
668
  "ColumnUniqueOutlinks": "Outlinks únicos",
669
  "ColumnIdPageview": "ID da página",
670
  "ColumnInteractionPosition": "Posição de Interação",
671
+ "ColumnPageViewPosition": "Posição de exibição de página",
672
  "ActionsInVisit": "Ações em Visita",
673
  "DownloadsReportDocumentation": "Neste relatório, você pode ver quais arquivos seus visitantes baixaram. %s Matomo registra como download um click em um link de download. Se o download foi completado ou não o Matomo não consegue determinar.",
674
  "EntryPagesReportDocumentation": "Este relatório contém informações sobre as páginas de entrada que foram usadas durante o período especificado. Uma página de entrada é a primeira página que um usuário visualiza durante a visita. 1%s As URLs de entrada são exibidos como uma estrutura de pastas.",
677
  "ExitPagesReportDocumentation": "Este relatório contém informações sobre as páginas de saída que ocorreram durante o período especificado. Uma página de saída é a última página que um usuário visualiza durante a visita. 1%s As URLs de saída são exibidos como uma estrutura de pastas.",
678
  "ExitPageTitles": "Título de páginas de saída",
679
  "ExitPageTitlesReportDocumentation": "Este relatório contém informações sobre os títulos de páginas de saída que ocorreram durante o período especificado.",
680
+ "MainMetricsReportDocumentation": "Este relatório fornece uma visão geral muito básica de quais ações seus visitantes realizam em seu site.",
681
  "OneSearch": "1 pesquisa",
682
  "OutlinkDocumentation": "Um outlink é um link que leva o visitante para fora do seu site (para outro domínio)",
683
  "OutlinksReportDocumentation": "Este relatório mostra uma lista hierárquica de URLs de outlinks clicadas pelos seus visitantes.",
695
  "SiteSearchCategories": "Categorias (Pesquisa no Site)",
696
  "SiteSearchKeyword": "Palavra-Chave (Pesquisa no SIte)",
697
  "SiteSearchKeywords": "Palavras-chave (Pesquisa no site)",
698
+ "SiteSearchKeywordCount": "Contagem de palavra-chave (Procurar Site)",
699
+ "SiteSearchKeywordCounts": "Contagem de palavras-chave (Procurar Site)",
700
  "SiteSearchKeywordsDocumentation": "Este relatório lista as Pesquisas de Palavras-chave que os visitantes procuraram em seu Motor de Busca interno.",
701
  "SiteSearchKeywordsNoResultDocumentation": "Este relatório lista as Palavras Chave de Pesquisa que não retornaram nenhum resultado de pesquisa: talvez o algoritmo do motor de busca possa ser melhorado, ou talvez seus visitantes estão procurando por conteúdo que não estão (ainda) em seu site?",
702
  "SubmenuPagesEntry": "Páginas de entrada",
716
  "ActionType": "Tipo de Ação",
717
  "ActionTypes": "Tipo de Ação",
718
  "Behaviour": "Comportamento",
719
+ "TimeSpentInReferringAction": "Tempo Gasto em Ação de Referência",
720
+ "PagesSubcategoryHelp1": "Este relatório contém informação sobre as URLs das páginas que foram visitadas.",
721
+ "PagesSubcategoryHelp2": "A tabela é hierarquicamente organizada, as URLs são exibidas como uma estrutura de pastas.",
722
+ "PagesSubcategoryHelp3": "Use os ícones de mais e menos à esquerda para navegar.",
723
+ "EntryPagesSubcategoryHelp1": "Este relatório contém informação sobre as páginas de entrada que foram usadas durante o período específico. Uma página de entrada é a primeira página que um usuário visualiza durante sua visita.",
724
+ "EntryPagesSubcategoryHelp2": "As URLs de entrada são exibidas como uma estrutura de pastas.",
725
+ "ExitPagesSubcategoryHelp1": "Este relatório contém informação sobre as páginas de saída que ocorrem durante o período específico, Uma pagina de saída é a última página que o usuário visualiza durante sua visita,",
726
+ "ExitPagesSubcategoryHelp2": "As URLs de saída são exibidas como uma estrutura de pastas.",
727
+ "PageTitlesSubcategoryHelp1": "Este relatório contém informação sobre os títulos das páginas que foram visitadas.",
728
+ "PageTitlesSubcategoryHelp2": "O título da página é a tag HTML <title> que a maioria dos navegadores mostram em seu título da janela."
729
  },
730
  "Annotations": {
731
  "AddAnnotationsFor": "Adicione anotações para %s...",
1253
  "SetAsDefaultWidgetsConfirmHelp": "Esta seleção widgets e layout de colunas do painel será usado quando qualquer usuário cria um novo painel, ou quando o recurso \"%s\" é usado.",
1254
  "TopLinkTooltip": "Ver relatórios de Análise Web para %s.",
1255
  "WidgetNotFound": "Widget não encontrado",
1256
+ "WidgetPreview": "Visualização do Widget",
1257
+ "DashboardCategoryHelp": "Essa é uma página de painel de controle. Paineis de controle são uma coleção de widgets da Matomo que você mesmo adiciona para adequar as necessidades específicas. Misture e combine quaisquer widgets da Matomo para obter os dados %1$s*você*%2$s precisa de uma olhada."
1258
  },
1259
  "DevicePlugins": {
1260
  "BrowserWithNoPluginsEnabled": "%1$s sem plugins habilitados",
1416
  "ContactUs": "Entre em contato",
1417
  "VisitTheForums": "Visite o %1$s Fóruns%2$s e obtenha ajuda da comunidade de usuários Matomo",
1418
  "Forums": "Fóruns",
 
1419
  "PleaseLeaveExternalReviewForMatomo": "Compartilhe seus pensamentos em um desses sites e inspire outras pessoas a participarem da nossa revolução de dados.",
1420
  "RemindMeLater": "Lembrar-me mais tarde",
1421
  "NeverAskMeAgain": "Não me perguntar novamente",
1425
  "RemoveOtherLabel": "Quero ver os dados de 'Outros'",
1426
  "PurgeOldData": "Quero remover alguns dados antigos",
1427
  "SearchHelpResources": "Procurar recursos de ajuda do matomo.org",
1428
+ "PopularHelpTopics": "Tópicos populares de ajuda",
1429
+ "ReferBannerTitle": "Acredita no Matomo?"
1430
  },
1431
  "GeoIp2": {
1432
  "AssumingNonApache": "Não é possível encontrar a função apache_get_modules, assumindo servidor web não-Apache.",
1667
  "GoBackAndDefinePrefix": "Volte e defina um prefixo para as tabelas Matomo",
1668
  "HappyAnalysing": "Boa análise!",
1669
  "Installation": "Instalação",
1670
+ "InformationalResults": "Resultados informativos",
1671
+ "CopyBelowInfoForSupport": "Copie ou baixe a informação abaixo caso nosso time de suporte peça a você por ela.",
1672
+ "CopySystemCheck": "Copiar verificação do sistema",
1673
+ "DownloadSystemCheck": "Baixar verificação do sistema",
1674
  "InstallationStatus": "Status da Instalação",
1675
  "InsufficientPrivilegesHelp": "Você pode adicionar esses privilégios usando uma ferramenta como o phpMyAdmin ou executando as consultas SQL de permissões. Se você não sabe como fazer essas coisas, por favor, peça ao seu sysadmin para conceder esses privilégios para você.",
1676
  "InsufficientPrivilegesMain": "Ou o banco de dados não existe (e não poderia ser criado), ou o usuário especificado tem privilégios insuficientes. Usuário de banco de dados deve ter os seguintes privilégios: %s",
1731
  "SystemCheckEvalHelp": "Requisitado pelo HTML QuickForm e sistema Smarty de templating.",
1732
  "SystemCheckExtensions": "Outras extensões requeridas",
1733
  "SystemCheckFileIntegrity": "Integridade de arquivo.",
1734
+ "SystemCheckFilterHelp": "Você precisa configurar e reconstruir o PHP com o suporte para \"filter\" habilitado (não use --disable-filter)",
1735
  "SystemCheckFunctions": "Funções requeridas",
1736
  "SystemCheckFunctionHelp": "Você precisa ativar esta função embutida.",
1737
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (graphics)",
1740
  "SystemCheckGzcompressHelp": "Você precisa habilitar a extensão zlib e a função gzcompress.",
1741
  "SystemCheckGzuncompressHelp": "Você precisa habilitar a extensão zlib e a função gzuncompress.",
1742
  "SystemCheckHashHelp": "Você precisa configurar e reconstruir o PHP com suporte a hash() ativado, excluindo a opção --disable-hash.",
1743
+ "SystemCheckJsonHelp": "A extensão php-json é necessária para o Matomo ler e escrever dados JSON.",
1744
  "SystemCheckMailHelp": "Mensagens de Feedback e Senha Perdida não serão enviadas sem mail().",
 
 
1745
  "SystemCheckMemoryLimit": "Limite de Memória",
1746
  "SystemCheckMemoryLimitHelp": "Em um site com alto tráfego, o processo de arquivamento pode exigir mais memória do que o atualmente permitido. Se necessário, mude a diretiva memory_limit no seu arquivo php.ini.",
1747
+ "SystemCheckMemoryNoMemoryLimitSet": "Não há limite de memória definido",
1748
  "SystemCheckNoErrorsOrWarnings": "Não há erros ou avisos",
1749
  "SystemCheckViewFullSystemCheck": "Ver relatório completo de verificação do sistema",
1750
  "SystemCheckOpenURL": "Abre URL",
1758
  "SystemCheckPdoAndMysqliHelp": "Num servidor Linux você poderá compilar o php com as seguintes opções: %1$s No seu php.ini, adicione as seguintes linhas: %2$s",
1759
  "SystemCheckPhp": "Versão do PHP",
1760
  "SystemCheckPhpPdoAndMysqli": "Mais informações em: %1$sPHP PDO%2$s e %3$sMYSQLI%4$s.",
 
1761
  "SystemCheckSettings": "Configuração PHP requerida (php.ini)",
1762
  "SystemCheckSummaryNoProblems": "Huzzah! Não há problemas com sua configuração Matomo. Dê a você mesmo um tapinha nas costas.",
1763
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo detectou algunas %1$squestões críticas%2$s com as suas configurações. %3$s Estas questões devem ser corrigidas imediatamente. %4$s",
3793
  "DriftHelp": "Esta tag permite que você adicione o formulário de contato Drift ao seu site.",
3794
  "AllDownloadsClickTriggerDescription": "Acionado quando um link para um arquivo baixável é clicado.",
3795
  "AllDownloadsClickTriggerHelp": "Acionado quando um usuário clica em um elemento \"A\" ou \"AREA\" e o link aponta para um arquivo com uma extensão de arquivo baixável.",
3796
+ "AllDownloadsClickTriggerName": "Clique em Todos os Downloas",
3797
  "Draft": "Rascunho",
3798
  "EditContainer": "Editar contêiner",
3799
  "EditTag": "Editar tag",
3814
  "EnablingPreviewPleaseWait": "Habilitando modo de pré-visualização, por favor aguarde...",
3815
  "EndDate": "Data final",
3816
  "EntityDateTypeMetaInformation": "Criado em \"%1$s\", última atualização em \"%2$s\", tipo: \"%3$s\"",
3817
+ "Entry": "Entrada",
3818
  "Environment": "Ambiente",
3819
  "EnvironmentVariableDescription": "Retorna o ambiente atual.",
3820
  "EnvironmentVariableName": "Nome do ambiente",
3821
  "Environments": "Ambientes",
3822
+ "ErrorArrayMissingKey": "Chave da array ausente \"%1$s\" em \"%2$s\" na posição \"%3$s\".",
3823
+ "ErrorArrayMissingValue": "Valor ausente para a chave da array\"%1$s\" em \"%2$s\" na posição \"%3$s\".",
3824
  "ErrorComparisonNotSupported": "A comparação \"%s\" não é suportada.",
3825
  "ErrorContainerDoesNotExist": "O contêiner requisitado \"%s\" não existe.",
3826
  "ErrorContainerIdDuplicate": "O ID de contêiner já está em uso",
3827
  "ErrorContainerReleaseDoesNotExist": "O lançamento requisitado do contêiner não existe.",
3828
  "ErrorContainerTriggerDoesNotExist": "O gatilho de contêiner solicitado não existe.",
3829
  "ErrorContainerVersionDoesNotExist": "A versão requisitada do contêiner não existe.",
3830
+ "ErrorContainerVersionImportIncomplete": "Não é possível importar o contêiner. A versão do contêiner especificado está incompleta. Certifique-se de incluir informações de contexto, tags, triggers e variáveis.",
3831
+ "ErrorContainerVersionImportWrongContext": "O contexto do contêiner atual é \"%1$s\" mas o conteúdo importado e do contexto \"%2$s\". Não é possível importar essa versão.",
3832
  "ErrorEndDateBeforeStartDate": "A data de início precisa ser anterior à data de fim.",
3833
  "ErrorEnvironmentDoesNotExist": "O ambiente \"%s\" não existe.",
3834
  "ErrorEnvironmentInvalidLength": "O ambiente \"%1$s\" não tem um comprimento válido. Por favor use entre %2$s e %3$s caracteres.",
3853
  "ErrorVersionCannotBeDeletedAsPublished": "Esta versão não pode ser excluída pois está publicada em pelo menos um ambiente.",
3854
  "ErrorXNotProvided": "Por favor, forneça um valor para \"%1$s\".",
3855
  "ErrorXNotWhitelisted": "O valor para \"%1$s\" não é permitido, use um dos: %2$s.",
3856
+ "ErrorXTooLong": "\"%1$s\" é muito longo, o número máximo de caracteres permitidos são %2$s.",
3857
+ "EtrackerTagName": "análise da web etracker",
3858
+ "EtrackerTagDescription": "etracker é um sistema de análise web, você pode escolher enviar uma exibição de página ou um evento.",
3859
+ "Except": "Exceto",
3860
  "ExportDraft": "Exportar rascunho",
3861
  "ExportX": "Exportar %s",
3862
+ "FacebookPixelTagDescription": "O Facebook Pixel é um serviço de análise web e propaganda oferecido pelo Facebook.",
3863
+ "FacebookPixelTagHelp": "Esta tag permite que você acompanhe as visualizações de página do site em sua conta do Facebook Ads. Para obter o Pixel ID, por favor entre com sua conta Facebook Ads,",
3864
+ "FacebookPixelTagName": "Facebook Pixel",
3865
  "Filter": "Filtro",
3866
  "FireDelay": "Atraso de disparo",
3867
  "FireDelayHelp": "Permite a você atrasar a execução desta tag. Isto pode ser útil, por exemplo, se você quiser dar tempo para um gatilho de bloqueio para impedir que a tag seja executada. O valor é esperado em milissegundos, onde 1000ms são iguais a um segundo.",
4458
  "PluginDescription": "Informa métricas analíticas gerais: visitas, visitantes únicos, número de ações, taxa de rejeição, etc.",
4459
  "VisitsSummary": "Resumo dos Visitantes",
4460
  "VisitsSummaryDocumentation": "Esta é uma visão geral da evolução da visita.",
4461
+ "VisitsSummaryReportDocumentation": "Este relatório fornece uma ampla visão geral de como seus visitantes se comportam.",
4462
  "WidgetLastVisits": "Gráfico dos últimos visitantes",
4463
  "WidgetOverviewGraph": "Visão Geral com Gráfico",
4464
  "WidgetVisits": "Visão Geral dos Visitantes"
app/lang/pt.json CHANGED
@@ -1425,7 +1425,6 @@
1425
  "ContactUs": "Contacte-nos",
1426
  "VisitTheForums": "Visite os %1$s fóruns%2$s e obtenha ajuda da comunidade de utilizadores do Matomo",
1427
  "Forums": "Fóruns",
1428
- "ReviewMatomoTitle": "Acredita no Matomo?",
1429
  "PleaseLeaveExternalReviewForMatomo": "Partilhe a sua opinião num destes sites e inspire outro a participar na nossa revolução dos dados.",
1430
  "RemindMeLater": "Lembrar mais tarde",
1431
  "NeverAskMeAgain": "Não voltar a perguntar",
@@ -1435,7 +1434,8 @@
1435
  "RemoveOtherLabel": "E quero ver os dados do meu 'Outros'",
1436
  "PurgeOldData": "Eu quero remover alguns dados antigos",
1437
  "SearchHelpResources": "Procurar por recursos de apoio em matomo.org",
1438
- "PopularHelpTopics": "Tópicos de ajuda populares"
 
1439
  },
1440
  "GeoIp2": {
1441
  "AssumingNonApache": "Não foi possível encontrar a função apache_get_modules; assumindo um servidor web não-Apache.",
@@ -1747,11 +1747,8 @@
1747
  "SystemCheckGzcompressHelp": "Precisa ativar a extensão zlib e a função gzcompress.",
1748
  "SystemCheckGzuncompressHelp": "Precisa ativar a extensão zlib e a função gzuncompress.",
1749
  "SystemCheckHashHelp": "Tem de configurar e reconstruir o PHP com o suporte para a função hash() ativado, removendo a opção --disable-hash.",
1750
- "SystemCheckIconvHelp": "Tem de configurar e reconstruir o PHP com o suporte \"iconv\" ativado, --with-iconv.",
1751
  "SystemCheckJsonHelp": "A extensão php-json é necessária para o Matomo ler e escrever dados JSON.",
1752
  "SystemCheckMailHelp": "Mensagens de feedback e de palavras-passe perdida não serão enviadas sem mail().",
1753
- "SystemCheckMbstring": "mbstring",
1754
- "SystemCheckMbstringHelp": "A extensão mbstring é necessária para trabalhar com caracteres multibyte na interface do utilizador e com respostas da API. Confirme ainda que mbstring.func_overload está definido como \"0\" no php.ini.",
1755
  "SystemCheckMemoryLimit": "Limite de memória",
1756
  "SystemCheckMemoryLimitHelp": "Num site com tráfego elevado, o processo de arquivamento pode exigir mais memória do que o permitido atualmente. Se necessário, altere a diretiva memory_limit no seu ficheiro php.ini.",
1757
  "SystemCheckNoErrorsOrWarnings": "Não existem erros ou avisos",
@@ -1767,7 +1764,6 @@
1767
  "SystemCheckPdoAndMysqliHelp": "Num servidor Linux pode compilar php com as seguintes opções: %1$s No seu ficheiro php.ini, adicione as seguintes linhas: %2$s",
1768
  "SystemCheckPhp": "Versão de PHP",
1769
  "SystemCheckPhpPdoAndMysqli": "Mais informações em: %1$sPHP PDO%2$s e %3$sMYSQLI%4$s.",
1770
- "SystemCheckSplHelp": "Tem de configurar e reconstruir o PHP com a Standard PHP Library (SPL) ativada (por predefinição).",
1771
  "SystemCheckSettings": "Configuração de PHP obrigatória (php.ini)",
1772
  "SystemCheckSummaryNoProblems": "Não existem problemas com a sua configuração do Matomo.",
1773
  "SystemCheckSummaryThereWereErrors": "Oh, não! O Matomo detetou alguns %1$sproblemas críticos%2$s com a sua configuração do Matomo. %3$sEstes problemas devem ser resolvidos imediatamente.%4$s",
1425
  "ContactUs": "Contacte-nos",
1426
  "VisitTheForums": "Visite os %1$s fóruns%2$s e obtenha ajuda da comunidade de utilizadores do Matomo",
1427
  "Forums": "Fóruns",
 
1428
  "PleaseLeaveExternalReviewForMatomo": "Partilhe a sua opinião num destes sites e inspire outro a participar na nossa revolução dos dados.",
1429
  "RemindMeLater": "Lembrar mais tarde",
1430
  "NeverAskMeAgain": "Não voltar a perguntar",
1434
  "RemoveOtherLabel": "E quero ver os dados do meu 'Outros'",
1435
  "PurgeOldData": "Eu quero remover alguns dados antigos",
1436
  "SearchHelpResources": "Procurar por recursos de apoio em matomo.org",
1437
+ "PopularHelpTopics": "Tópicos de ajuda populares",
1438
+ "ReferBannerTitle": "Acredita no Matomo?"
1439
  },
1440
  "GeoIp2": {
1441
  "AssumingNonApache": "Não foi possível encontrar a função apache_get_modules; assumindo um servidor web não-Apache.",
1747
  "SystemCheckGzcompressHelp": "Precisa ativar a extensão zlib e a função gzcompress.",
1748
  "SystemCheckGzuncompressHelp": "Precisa ativar a extensão zlib e a função gzuncompress.",
1749
  "SystemCheckHashHelp": "Tem de configurar e reconstruir o PHP com o suporte para a função hash() ativado, removendo a opção --disable-hash.",
 
1750
  "SystemCheckJsonHelp": "A extensão php-json é necessária para o Matomo ler e escrever dados JSON.",
1751
  "SystemCheckMailHelp": "Mensagens de feedback e de palavras-passe perdida não serão enviadas sem mail().",
 
 
1752
  "SystemCheckMemoryLimit": "Limite de memória",
1753
  "SystemCheckMemoryLimitHelp": "Num site com tráfego elevado, o processo de arquivamento pode exigir mais memória do que o permitido atualmente. Se necessário, altere a diretiva memory_limit no seu ficheiro php.ini.",
1754
  "SystemCheckNoErrorsOrWarnings": "Não existem erros ou avisos",
1764
  "SystemCheckPdoAndMysqliHelp": "Num servidor Linux pode compilar php com as seguintes opções: %1$s No seu ficheiro php.ini, adicione as seguintes linhas: %2$s",
1765
  "SystemCheckPhp": "Versão de PHP",
1766
  "SystemCheckPhpPdoAndMysqli": "Mais informações em: %1$sPHP PDO%2$s e %3$sMYSQLI%4$s.",
 
1767
  "SystemCheckSettings": "Configuração de PHP obrigatória (php.ini)",
1768
  "SystemCheckSummaryNoProblems": "Não existem problemas com a sua configuração do Matomo.",
1769
  "SystemCheckSummaryThereWereErrors": "Oh, não! O Matomo detetou alguns %1$sproblemas críticos%2$s com a sua configuração do Matomo. %3$sEstes problemas devem ser resolvidos imediatamente.%4$s",
app/lang/ro.json CHANGED
@@ -1223,9 +1223,7 @@
1223
  "SystemCheckGlobHelp": "Această funcție built-in a fost dezactivată de gazda dumneavoastra. Matomo va încerca să imite această funcție, dar poate întâlni alte restricții de securitate. Funcționalitatea poatr fi afectata.",
1224
  "SystemCheckGzcompressHelp": "Trebuie sa se permita extinderea zlib și funcția gzcompress.",
1225
  "SystemCheckGzuncompressHelp": "Trebuie sa permiti extinderea zlib și funcția gzuncompress.",
1226
- "SystemCheckIconvHelp": "Aveți nevoie de a configura și reconstrui PHP cu suport \"iconv\" activat, - cu-iconv.",
1227
  "SystemCheckMailHelp": "Mesajele de feedback și pierederea parolei nu va fi trimisa fara mail().",
1228
- "SystemCheckMbstring": "mbstring",
1229
  "SystemCheckMemoryLimit": "Memory limit",
1230
  "SystemCheckMemoryLimitHelp": "Pe un site cu trafic mare, procesul de arhivare poate necesita mai multă memorie decât este permis în prezent. Dacă este necesar, schimbați directiva limira_memorie în fișierul dvs. php.ini.",
1231
  "SystemCheckOpenURL": "Deschide URL",
@@ -1238,7 +1236,6 @@
1238
  "SystemCheckPdoAndMysqliHelp": "Pe un server Linux, puteți compila php cu următoarele opțiuni: %1$s în php.ini dvs., adăugați următoarele linii: %2$s",
1239
  "SystemCheckPhp": "PHP version",
1240
  "SystemCheckPhpPdoAndMysqli": "Mai multe informatii pe:%1$sPHP PDO%2$s si %3$sMYSQLI%4$s.",
1241
- "SystemCheckSplHelp": "Aveți nevoie pentru a configura și reconstrui PHP cu PHP Biblioteca Standard (SPL) activata (implicit).",
1242
  "SystemCheckSummaryNoProblems": "Huzzah! Nu există probleme cu configurarea Matomo. Dă-ți o palma pe spate.",
1243
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo a detectat unele probleme %1$s critic %2$s cu configurarea Matomo. %3$s Aceste probleme ar trebui să fie fixate imediat.%4$s",
1244
  "SystemCheckSummaryThereWereWarnings": "Există unele probleme cu sistemul dumneavoastră. Matomo va rula, dar s-ar putea confrunta cu unele probleme minore.",
1223
  "SystemCheckGlobHelp": "Această funcție built-in a fost dezactivată de gazda dumneavoastra. Matomo va încerca să imite această funcție, dar poate întâlni alte restricții de securitate. Funcționalitatea poatr fi afectata.",
1224
  "SystemCheckGzcompressHelp": "Trebuie sa se permita extinderea zlib și funcția gzcompress.",
1225
  "SystemCheckGzuncompressHelp": "Trebuie sa permiti extinderea zlib și funcția gzuncompress.",
 
1226
  "SystemCheckMailHelp": "Mesajele de feedback și pierederea parolei nu va fi trimisa fara mail().",
 
1227
  "SystemCheckMemoryLimit": "Memory limit",
1228
  "SystemCheckMemoryLimitHelp": "Pe un site cu trafic mare, procesul de arhivare poate necesita mai multă memorie decât este permis în prezent. Dacă este necesar, schimbați directiva limira_memorie în fișierul dvs. php.ini.",
1229
  "SystemCheckOpenURL": "Deschide URL",
1236
  "SystemCheckPdoAndMysqliHelp": "Pe un server Linux, puteți compila php cu următoarele opțiuni: %1$s în php.ini dvs., adăugați următoarele linii: %2$s",
1237
  "SystemCheckPhp": "PHP version",
1238
  "SystemCheckPhpPdoAndMysqli": "Mai multe informatii pe:%1$sPHP PDO%2$s si %3$sMYSQLI%4$s.",
 
1239
  "SystemCheckSummaryNoProblems": "Huzzah! Nu există probleme cu configurarea Matomo. Dă-ți o palma pe spate.",
1240
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo a detectat unele probleme %1$s critic %2$s cu configurarea Matomo. %3$s Aceste probleme ar trebui să fie fixate imediat.%4$s",
1241
  "SystemCheckSummaryThereWereWarnings": "Există unele probleme cu sistemul dumneavoastră. Matomo va rula, dar s-ar putea confrunta cu unele probleme minore.",
app/lang/ru.json CHANGED
@@ -1692,9 +1692,7 @@
1692
  "SystemCheckGzcompressHelp": "Вам необходимо включить расширение zlib и функцию gzcompress.",
1693
  "SystemCheckGzuncompressHelp": "Вам необходимо включить расширение zlib и функцию gzuncompress.",
1694
  "SystemCheckHashHelp": "Вам нужно сконфигурировать и пересобрать PHP с включенной поддержкой hash(), исключив опцию --disable-hash.",
1695
- "SystemCheckIconvHelp": "Вам необходимо сконфигурировать или перекомпилировать PHP со включенной поддержкой \"iconv\" --with-iconv.",
1696
  "SystemCheckMailHelp": "Отзывы разработчиков и письма восстановления паролей не будут отправляться без mail().",
1697
- "SystemCheckMbstring": "mbstring",
1698
  "SystemCheckMemoryLimit": "Ограничение памяти",
1699
  "SystemCheckMemoryLimitHelp": "На высоконагруженном сайте, процесс архивации может занять больше памяти, чем разрешено в данный момент. Если необходимо, измените директиву memory_limit в вашем php.ini файле.",
1700
  "SystemCheckNoErrorsOrWarnings": "Нет никаких ошибок или предупреждений",
@@ -1709,7 +1707,6 @@
1709
  "SystemCheckPdoAndMysqliHelp": "На сервере с Linux вы можете скомпилировать php со следующими опциями: %1$s В вашем php.ini добавьте следующие строки: %2$s",
1710
  "SystemCheckPhp": "Версия PHP",
1711
  "SystemCheckPhpPdoAndMysqli": "Больше информации тут: %1$sPHP PDO%2$s и %3$sMYSQLI%4$s.",
1712
- "SystemCheckSplHelp": "Вам необходимо сконфигурировать или перекомпилировать PHP со включенной стандартной библиотекой PHP (SPL), обычно включенной по умолчанию.",
1713
  "SystemCheckSettings": "Требуется настройка PHP (php.ini)",
1714
  "SystemCheckSummaryNoProblems": "Ура! Нет никаких проблем с настройками Matomo. Молодец, возьми с полки пирожок.",
1715
  "SystemCheckSummaryThereWereErrors": "Ой-ой! Matomo обнаружил некоторые %1$sкритические ошибки%2$s. %3$sЭти ошибки должны быть исправленные немедленно.%4$s",
1692
  "SystemCheckGzcompressHelp": "Вам необходимо включить расширение zlib и функцию gzcompress.",
1693
  "SystemCheckGzuncompressHelp": "Вам необходимо включить расширение zlib и функцию gzuncompress.",
1694
  "SystemCheckHashHelp": "Вам нужно сконфигурировать и пересобрать PHP с включенной поддержкой hash(), исключив опцию --disable-hash.",
 
1695
  "SystemCheckMailHelp": "Отзывы разработчиков и письма восстановления паролей не будут отправляться без mail().",
 
1696
  "SystemCheckMemoryLimit": "Ограничение памяти",
1697
  "SystemCheckMemoryLimitHelp": "На высоконагруженном сайте, процесс архивации может занять больше памяти, чем разрешено в данный момент. Если необходимо, измените директиву memory_limit в вашем php.ini файле.",
1698
  "SystemCheckNoErrorsOrWarnings": "Нет никаких ошибок или предупреждений",
1707
  "SystemCheckPdoAndMysqliHelp": "На сервере с Linux вы можете скомпилировать php со следующими опциями: %1$s В вашем php.ini добавьте следующие строки: %2$s",
1708
  "SystemCheckPhp": "Версия PHP",
1709
  "SystemCheckPhpPdoAndMysqli": "Больше информации тут: %1$sPHP PDO%2$s и %3$sMYSQLI%4$s.",
 
1710
  "SystemCheckSettings": "Требуется настройка PHP (php.ini)",
1711
  "SystemCheckSummaryNoProblems": "Ура! Нет никаких проблем с настройками Matomo. Молодец, возьми с полки пирожок.",
1712
  "SystemCheckSummaryThereWereErrors": "Ой-ой! Matomo обнаружил некоторые %1$sкритические ошибки%2$s. %3$sЭти ошибки должны быть исправленные немедленно.%4$s",
app/lang/sk.json CHANGED
@@ -991,7 +991,6 @@
991
  "SystemCheckFunctionHelp": "Je potrebné aktivovať túto zabudovanú funkciu.",
992
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (grafika)",
993
  "SystemCheckGDHelp": "„Sparklines“ (malé grafy) nebudú fungovať.",
994
- "SystemCheckMbstring": "mbstring",
995
  "SystemCheckMemoryLimit": "Pamäťový limit",
996
  "SystemCheckMemoryLimitHelp": "Na webstránkach s vysokou premávkou archivačný proces bude vyžadovať viac pamäte, než je to aktuálne povolené.<br \/> Pozrite si direktívu memory_limit vo vašom php.ini súbore, ak je to potrebné.",
997
  "SystemCheckNoErrorsOrWarnings": "Nie sú žiadne chyby alebo varovania",
991
  "SystemCheckFunctionHelp": "Je potrebné aktivovať túto zabudovanú funkciu.",
992
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (grafika)",
993
  "SystemCheckGDHelp": "„Sparklines“ (malé grafy) nebudú fungovať.",
 
994
  "SystemCheckMemoryLimit": "Pamäťový limit",
995
  "SystemCheckMemoryLimitHelp": "Na webstránkach s vysokou premávkou archivačný proces bude vyžadovať viac pamäte, než je to aktuálne povolené.<br \/> Pozrite si direktívu memory_limit vo vašom php.ini súbore, ak je to potrebné.",
996
  "SystemCheckNoErrorsOrWarnings": "Nie sú žiadne chyby alebo varovania",
app/lang/sq.json CHANGED
@@ -16,6 +16,7 @@
16
  "Apply": "Zbatoje",
17
  "ArchivingInlineHelp": "Për sajte me trafik mesatar ose të shumtë këshillohet të çaktivizohet vënia në punë e arkivimit nga Matomo prej shfletuesit. Në vend të kësaj këshillojmë të rregulloni një akt cron që të përpunoni raporte Matomo çdo orë.",
18
  "ArchivingTriggerDescription": "E këshilluar për instalime më të ngarkuara të Matomo-s, lypset të %1$s rregulloni një akt cron-i%2$s që të përpunohen raportet automatikisht.",
 
19
  "AuthenticationMethodSmtp": "Metodë mirëfilltësimi për SMTP",
20
  "AverageOrderValue": "Vlerë Mesatare Porosie",
21
  "AveragePrice": "Çmim Mesatar",
@@ -176,6 +177,8 @@
176
  "ExceptionDatabaseVersion": "Versioni juaj për %1$s është %2$s por Matomo lyp të paktën %3$s.",
177
  "ExceptionDatabaseVersionNewerThanCodebase": "Kodi bazë i Matomo-s tuaj xhiron versionin e vjetër %1$s dhe kemi gjetur se Baza juaj e të Dhënave Matomo është përmirësuar tashmë me versionin më të ri %2$s.",
178
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Ndoshta përgjegjësit e Matomo-s tuaj janë duke përfunduar procesin e përmirësimit. Ju lutemi, riprovoni pas pak minutash.",
 
 
179
  "ExceptionFileIntegrity": "Kontrolli i pacenueshmërisë dështoi: %s",
180
  "ExceptionFilesizeMismatch": "Mospërputhje madhësie kartelash: %1$s (pritej gjatësi: %2$s, u gjet: %3$s)",
181
  "ExceptionIncompatibleClientServerVersions": "Versioni i klientit tuaj për %1$s është %2$s çka është e papërputhshme me versionin e shërbyesit %3$s.",
@@ -524,7 +527,8 @@
524
  "Custom": "Vetjake",
525
  "PreviousPeriod": "Periudhën e Kaluar",
526
  "PreviousYear": "Vitin e Kaluar",
527
- "ViewAccessRequired": "token_auth i përdorur ka shumë fuqi hyrjeje për t’u përdorur në një URL kërkese jo API. Ju lutemi, përdorni një fjalëkalim specifik për aplikacionin për një përdorues që ka vetëm leje parjesh."
 
528
  },
529
  "Mobile": {
530
  "AboutPiwikMobile": "Rreth Matomo-s për Celular",
@@ -915,7 +919,23 @@
915
  "TrackingFailuresEmail1": "Kjo bëhet vetëm për t’ju bërë të ditur se ditët e fundit kanë ndodhur %s lloje të ndryshme dështimesh ndjekjeje.",
916
  "TrackingFailuresEmail2": "Që të shihni krejt kërkesat me ndjekje të dështuar %1$sklikoni këtu%2$s.",
917
  "ImportFromGoogleAnalytics": "Importim prej Google Analytics",
918
- "ImportFromGoogleAnalyticsDescription": "Nëse keni një zotërim Google Analytics dhe po kaloni në Matomo, mund të importoni të dhënat tuaja ekzistuese duke përdorur shtojcën %1$sGoogleAnalyticsImporter%2$s."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
919
  },
920
  "CoreHome": {
921
  "CategoryNoData": "Pa të dhëna për këtë kategori. Provoni të \"Përfshini tërë popullatën\".",
@@ -1514,6 +1534,7 @@
1514
  "RateFeatureTitle": "Ju pëlqen veçoria '%s'? Ju lutemi, vlerësojeni dhe lini një koment",
1515
  "SendFeedback": "Dërgoji Përshtypjet",
1516
  "ThankYou": "Faleminderit që na ndihmoni ta bëjmë më të mirë Matomo-n!",
 
1517
  "TopLinkTooltip": "Na thoni se ç’mendim keni, ose kërkoni Asistencë Profesionale.",
1518
  "ViewAnswersToFAQ": "Shihni përgjigjet te %1$sPyetje të Bëra Shpesh%2$s",
1519
  "FAQs": "PBR-ra",
@@ -1531,7 +1552,7 @@
1531
  "ContactUs": "Lidhuni me ne",
1532
  "VisitTheForums": "Vizitoni %1$s Forumet%2$s dhe merrni ndihmë prej bashkësisë së përdoruesve të Matomo-s",
1533
  "Forums": "Forume",
1534
- "ReviewMatomoTitle": "Besoni Matomo?",
1535
  "PleaseLeaveExternalReviewForMatomo": "Ndajini mendimet tuaja me të tjerët në një nga këto sajte dhe frymëzoni të tjerët të bahen pjesë e revolucionet tonë të të dhënave.",
1536
  "RemindMeLater": "Kujtomë më vonë",
1537
  "NeverAskMeAgain": "Mos më ripyet më kurrë",
@@ -1541,7 +1562,14 @@
1541
  "RemoveOtherLabel": "Dua të shoh të dhëna 'Të tjera' të miat",
1542
  "PurgeOldData": "Dua të heq ca të dhëna të vjetra",
1543
  "SearchHelpResources": "Kërkoni për burime ndihme te matomo.org",
1544
- "PopularHelpTopics": "Tema popullore ndihme"
 
 
 
 
 
 
 
1545
  },
1546
  "GeoIp2": {
1547
  "AssumingNonApache": "S’gjendet dot funksioni apache_get_modules function, po merret i mirëqenë si shërbyes non-Apache.",
@@ -1858,6 +1886,7 @@
1858
  "SystemCheckEvalHelp": "E domosdoshme për HTML QuickForm dhe sistemin Smarty të gjedheve.",
1859
  "SystemCheckExtensions": "Të tjera zgjerime të domosdoshme",
1860
  "SystemCheckFileIntegrity": "Pacenueshmëri kartele",
 
1861
  "SystemCheckFunctions": "Funksione të domosdoshëm",
1862
  "SystemCheckFunctionHelp": "Lypset ta aktivizoni këtë funksion të brendshëm.",
1863
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (grafikë)",
@@ -1866,11 +1895,8 @@
1866
  "SystemCheckGzcompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzcompress.",
1867
  "SystemCheckGzuncompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzuncompress.",
1868
  "SystemCheckHashHelp": "Lypset të formësoni dhe rikrijoni PHP-në me mbulim të hash() të aktivizuar duke përjashtuar mundësinë --disable-hash.",
1869
- "SystemCheckIconvHelp": "Lypset të formësoni dhe rindërtoni PHP-në me aktivizim të mbulimit të \"iconv\", --with-iconv.",
1870
  "SystemCheckJsonHelp": "Zgjerimi php-json është i domosdoshëm që Matomo të lexojë dhe shkruajë të dhëna JSON.",
1871
  "SystemCheckMailHelp": "Mesazhet mbi Përshtypjet dhe Fjalëkalim të Humbur nuk kanë për t’u dërguar pa mail().",
1872
- "SystemCheckMbstring": "mbstring",
1873
- "SystemCheckMbstringHelp": "Për trajtimin e shenjave shumëbajtshe te ndërfaqja e përdoruesit dhe përgjigjet API lypset zgjerimi mbstring. Shihni gjithashtu që mbstring.func_overload te php.ini i është dhënë vlera \"0\".",
1874
  "SystemCheckMemoryLimit": "Kufi kujtese",
1875
  "SystemCheckMemoryLimitHelp": "Në një sajt me shumë trafik, procesi i arkivimit mund të dojë më tepër kujtesë se sa i është dhënë tani. Në u dashtë, ndryshojeni parametrin memory_limit te kartela juaj php.ini.",
1876
  "SystemCheckMemoryNoMemoryLimitSet": "S'është caktuar kufi kujtese",
@@ -1887,7 +1913,7 @@
1887
  "SystemCheckPdoAndMysqliHelp": "Në një shërbyes Linux mund ta përpiloni php-në me mundësitë vijuese: %1$s te php.ini juaj, shtoni rreshtat vijues: %2$s",
1888
  "SystemCheckPhp": "Version PHP-je",
1889
  "SystemCheckPhpPdoAndMysqli": "Më tepër të dhëna te: %1$sPHP PDO%2$s dhe %3$sMYSQLI%4$s.",
1890
- "SystemCheckSplHelp": "Lypset të formësoni dhe krijoni PHP-në me Librarinë Standarde PHPaktivizuar (si parazgjedhje).",
1891
  "SystemCheckSettings": "Formësim PHP-je i domosdoshëm (php.ini)",
1892
  "SystemCheckSummaryNoProblems": "Urraaa! S’ka probleme me rregullimin tuaj të Matomo-s. Rrihini shpatullat vetes.",
1893
  "SystemCheckSummaryThereWereErrors": "Ah! Matomo ka zbuluar disa %1$sçështje kritike%2$s me rregullimin tuaj për të. %3$sKëto çështje duhen ndrequr menjëherë.%4$s",
@@ -1897,7 +1923,9 @@
1897
  "SystemCheckTrackerHelp": "Kërkesa GET te matomo.php dështoi. Provoni ta kaloni këtë URL si një të lejuar nga Mirëfilltësimi HTTP dhe çaktivizoni mod_security (mund t’ju duhet t’i kërkoni ndihmë strehuesit tuaj web). Për më tepër të dhëna mbi gabimin, shihni kartelën e regjistrimit të gabimeve të shërbyesit tuaj web.",
1898
  "SystemCheckWarnDomHelp": "Do të duhej të aktivizonit zgjerimin \"dom\" (p.sh., instaloni paketën \"php-dom\" dhe\/ose \"php-xml\").",
1899
  "SystemCheckWarning": "Matomo do të punojë normalisht por mund t’i mungojnë disa veçori",
 
1900
  "SystemCheckWarnLibXmlHelp": "Do të duhej të aktivizonit zgjerimin \"libxml\" (p.sh., paketën \"install the php-libxml\" ) meqë është e domosdoshme nga zgjerime të tjera bazë të PHP-së.",
 
1901
  "SystemCheckWarnSimpleXMLHelp": "Do të duhej të aktivizonit zgjerimin \"SimpleXML\" (p.sh., instaloni paketën \"php-simplexml\" dhe\/ose \"php-xml\").",
1902
  "SystemCheckWinPdoAndMysqliHelp": "Në një shërbyes Windows, mund të shtoni rreshtat vijues te php.ini juaj: %s",
1903
  "SystemCheckWriteDirs": "Drejtori me hyrje për shkrim",
@@ -3918,6 +3946,8 @@
3918
  "OnlyMatchedUrlsAllowedHelp": "Në u aktivizoftë, Matomo do të ndjekë veprime të brendshme vetëm kur URL-ja e Faqes është një nga URL-të e njohura për sajtin tuaj. Kjo pengon shfrytëzimin e padëshiruar të analizave tuaja përmes URL-sh për sajte të tjerë.",
3919
  "OnlyMatchedUrlsAllowedHelpExamples": "Përkatësia dhe shtegu duhet të përputhen saktësisht dhe çdo nënpërkatësi e vlefshme duhet të specifikohet veçmas. Për shembull, kur URL-të e ditura janë 'http:\/\/shembull.com\/shteg' dhe 'http:\/\/imirë.shembull.com', kërkesat për ndjekje të 'http:\/\/shembull.com\/shtegtjetër' ose 'http:\/\/ikeq.shembull.com' shpërfillen.",
3920
  "WebsitesManagement": "Administrim Sajtesh",
 
 
3921
  "XManagement": "Administroni %s",
3922
  "ChooseMeasurableTypeHeadline": "Ç’do të donit të matnit?",
3923
  "YouCurrentlyHaveAccessToNWebsites": "Deri tani keni hyrje te %s sajte.",
16
  "Apply": "Zbatoje",
17
  "ArchivingInlineHelp": "Për sajte me trafik mesatar ose të shumtë këshillohet të çaktivizohet vënia në punë e arkivimit nga Matomo prej shfletuesit. Në vend të kësaj këshillojmë të rregulloni një akt cron që të përpunoni raporte Matomo çdo orë.",
18
  "ArchivingTriggerDescription": "E këshilluar për instalime më të ngarkuara të Matomo-s, lypset të %1$s rregulloni një akt cron-i%2$s që të përpunohen raportet automatikisht.",
19
+ "ArchivingTriggerSegment": "Përdorimi i Segmenteve Vetjake prapë do të shkaktojë përpunimin e arkivave.",
20
  "AuthenticationMethodSmtp": "Metodë mirëfilltësimi për SMTP",
21
  "AverageOrderValue": "Vlerë Mesatare Porosie",
22
  "AveragePrice": "Çmim Mesatar",
177
  "ExceptionDatabaseVersion": "Versioni juaj për %1$s është %2$s por Matomo lyp të paktën %3$s.",
178
  "ExceptionDatabaseVersionNewerThanCodebase": "Kodi bazë i Matomo-s tuaj xhiron versionin e vjetër %1$s dhe kemi gjetur se Baza juaj e të Dhënave Matomo është përmirësuar tashmë me versionin më të ri %2$s.",
179
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Ndoshta përgjegjësit e Matomo-s tuaj janë duke përfunduar procesin e përmirësimit. Ju lutemi, riprovoni pas pak minutash.",
180
+ "ExceptionDatabaseUnavailable": "Shërbyesi MySQL s’është në punë",
181
+ "ExceptionDatabaseAccess": "U mohua hyrje në bazë të dhënash",
182
  "ExceptionFileIntegrity": "Kontrolli i pacenueshmërisë dështoi: %s",
183
  "ExceptionFilesizeMismatch": "Mospërputhje madhësie kartelash: %1$s (pritej gjatësi: %2$s, u gjet: %3$s)",
184
  "ExceptionIncompatibleClientServerVersions": "Versioni i klientit tuaj për %1$s është %2$s çka është e papërputhshme me versionin e shërbyesit %3$s.",
527
  "Custom": "Vetjake",
528
  "PreviousPeriod": "Periudhën e Kaluar",
529
  "PreviousYear": "Vitin e Kaluar",
530
+ "ViewAccessRequired": "token_auth i përdorur ka shumë fuqi hyrjeje për t’u përdorur në një URL kërkese jo API. Ju lutemi, përdorni një fjalëkalim specifik për aplikacionin për një përdorues që ka vetëm leje parjesh.",
531
+ "Reasons": "Arsye"
532
  },
533
  "Mobile": {
534
  "AboutPiwikMobile": "Rreth Matomo-s për Celular",
919
  "TrackingFailuresEmail1": "Kjo bëhet vetëm për t’ju bërë të ditur se ditët e fundit kanë ndodhur %s lloje të ndryshme dështimesh ndjekjeje.",
920
  "TrackingFailuresEmail2": "Që të shihni krejt kërkesat me ndjekje të dështuar %1$sklikoni këtu%2$s.",
921
  "ImportFromGoogleAnalytics": "Importim prej Google Analytics",
922
+ "ImportFromGoogleAnalyticsDescription": "Nëse keni një zotërim Google Analytics dhe po kaloni në Matomo, mund të importoni të dhënat tuaja ekzistuese duke përdorur shtojcën %1$sGoogleAnalyticsImporter%2$s.",
923
+ "SecurityNotificationEmailSubject": "Njoftim Sigurie",
924
+ "SecurityNotificationRecoveryCodesShowedBody": "Dikush pa kodet e rimarrjes me mirëfilltësim dyfaktorësh të llogarisë tuaj.",
925
+ "SecurityNotificationRecoveryCodesRegeneratedBody": "Dikush prodhoi kode të rinj rimarrjeje me mirëfilltësim dyfaktorësh për llogarinë tuaj.",
926
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Dikush aktivizoi mirëfilltësim dyfaktorësh në llogarinë tuaj.",
927
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Dikush çaktivizoi mirëfilltësim dyfaktorësh në llogarinë tuaj.",
928
+ "SecurityNotificationTokenAuthCreatedBody": "Dikush krijoi një token mirëfilltësimi (përshkrimi: %s) në llogarinë tuaj. Nëse s’qetë ju, fshijeni token-in.",
929
+ "SecurityNotificationTokenAuthDeletedBody": "Dikush fshiu një token mirëfilltësimi (përshkrim: %s) në llogarinë tuaj.",
930
+ "SecurityNotificationAllTokenAuthDeletedBody": "Dikush fshiu krejt token-ët e mirëfilltësimit në llogarinë tuaj.",
931
+ "SecurityNotificationSettingsChangedByUserBody": "Dikush ndryshoi rregullimet e sistemit. Rregullime të prekura: %s.",
932
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Një tjetër superpërdorues (%1$s) ndryshoi rregullimet e sistemit. Rregullime të prekura: %2$s. Nëse dini gjë rreth kësaj veprimtarie, vazhdoni. Nëse s’e njihni këtë veprimtari, ju lutemi, lidhuni me superpërdorues të tjerë.",
933
+ "SecurityNotificationUserCreatedBody": "Dikush krijoi një përdorues të ri (kredenciale hyrjeje: %s) në llogarinë tuaj.",
934
+ "SecurityNotificationUserDeletedBody": "Dikush fshiu një përdorues (kredenciale hyrjeje: %s) në llogarinë tuaj.",
935
+ "SecurityNotificationIfItWasYou": "Nëse qetë ju, vazhdoni. Nëse s’e njihni këtë veprimtari, ju lutemi, ricaktoni fjalëkalimin tuaj.",
936
+ "SecurityNotificationCheckTwoFactor": "Ju lutemi, kontrolloni aplikacionin tuaj të mirëfilltësimit dyfaktorësh ose pajisjen tuaj.",
937
+ "BruteForce": "Me Zor",
938
+ "TwoFactorAuth": "Mirëfilltësim dyfaktorësh"
939
  },
940
  "CoreHome": {
941
  "CategoryNoData": "Pa të dhëna për këtë kategori. Provoni të \"Përfshini tërë popullatën\".",
1534
  "RateFeatureTitle": "Ju pëlqen veçoria '%s'? Ju lutemi, vlerësojeni dhe lini një koment",
1535
  "SendFeedback": "Dërgoji Përshtypjet",
1536
  "ThankYou": "Faleminderit që na ndihmoni ta bëjmë më të mirë Matomo-n!",
1537
+ "ThankYouForSpreading": "Faleminderit për përhapjen e fjalës dhe për krijimin e një web-i më të parrezik",
1538
  "TopLinkTooltip": "Na thoni se ç’mendim keni, ose kërkoni Asistencë Profesionale.",
1539
  "ViewAnswersToFAQ": "Shihni përgjigjet te %1$sPyetje të Bëra Shpesh%2$s",
1540
  "FAQs": "PBR-ra",
1552
  "ContactUs": "Lidhuni me ne",
1553
  "VisitTheForums": "Vizitoni %1$s Forumet%2$s dhe merrni ndihmë prej bashkësisë së përdoruesve të Matomo-s",
1554
  "Forums": "Forume",
1555
+ "ReviewMatomoTitle": "Ju pëlqen Matomo?",
1556
  "PleaseLeaveExternalReviewForMatomo": "Ndajini mendimet tuaja me të tjerët në një nga këto sajte dhe frymëzoni të tjerët të bahen pjesë e revolucionet tonë të të dhënave.",
1557
  "RemindMeLater": "Kujtomë më vonë",
1558
  "NeverAskMeAgain": "Mos më ripyet më kurrë",
1562
  "RemoveOtherLabel": "Dua të shoh të dhëna 'Të tjera' të miat",
1563
  "PurgeOldData": "Dua të heq ca të dhëna të vjetra",
1564
  "SearchHelpResources": "Kërkoni për burime ndihme te matomo.org",
1565
+ "PopularHelpTopics": "Tema popullore ndihme",
1566
+ "ReferMatomo": "Referoni Matomo-n",
1567
+ "ReferBannerTitle": "Besoni në Matomo?",
1568
+ "ReferBannerLonger": "Ju lutemi, na ndihmoni të përhapim fjalën rreth nesh, që kështu më tepër njerëz të kenë kontrollin mbi të dhënat e tyre analitike.",
1569
+ "ReferBannerEmailShareSubject": "U tregoni për Matomo Analytics që tani, që të rifitojnë kontrollin!",
1570
+ "ReferBannerEmailShareBody": "Zgjedh Matomo-n, një alternativë etike kundrejt Google Analytics, që më jep 100%% pronësi të dhënash dhe i mbron të dhënat e vizitorëve të sajtit tim.\nPo e jap këtë mesazh me shpresën se do t’i riktheni vetes pushtetin nga Google dhe do të keni pronësi të plotë të të dhënave tuaja.\n\nShiheni Matomo-n te https:\/\/matomo.org",
1571
+ "ReferBannerSocialShareText": "Nëse përdorni Google Analytics, jini në kontroll, duke u hedhur te një alternativë etike si Matomoja që sot!",
1572
+ "WontShowAgain": "S’do ta rishfaqim këtë mesazh."
1573
  },
1574
  "GeoIp2": {
1575
  "AssumingNonApache": "S’gjendet dot funksioni apache_get_modules function, po merret i mirëqenë si shërbyes non-Apache.",
1886
  "SystemCheckEvalHelp": "E domosdoshme për HTML QuickForm dhe sistemin Smarty të gjedheve.",
1887
  "SystemCheckExtensions": "Të tjera zgjerime të domosdoshme",
1888
  "SystemCheckFileIntegrity": "Pacenueshmëri kartele",
1889
+ "SystemCheckFilterHelp": "Duhet të formësoni dhe rimontoni PHP-në me mbulim të kativizuar për \"filter\" (mos përdorni --disable-filter).",
1890
  "SystemCheckFunctions": "Funksione të domosdoshëm",
1891
  "SystemCheckFunctionHelp": "Lypset ta aktivizoni këtë funksion të brendshëm.",
1892
  "SystemCheckGDFreeType": "GD > 2.x + Freetype (grafikë)",
1895
  "SystemCheckGzcompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzcompress.",
1896
  "SystemCheckGzuncompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzuncompress.",
1897
  "SystemCheckHashHelp": "Lypset të formësoni dhe rikrijoni PHP-në me mbulim të hash() të aktivizuar duke përjashtuar mundësinë --disable-hash.",
 
1898
  "SystemCheckJsonHelp": "Zgjerimi php-json është i domosdoshëm që Matomo të lexojë dhe shkruajë të dhëna JSON.",
1899
  "SystemCheckMailHelp": "Mesazhet mbi Përshtypjet dhe Fjalëkalim të Humbur nuk kanë për t’u dërguar pa mail().",
 
 
1900
  "SystemCheckMemoryLimit": "Kufi kujtese",
1901
  "SystemCheckMemoryLimitHelp": "Në një sajt me shumë trafik, procesi i arkivimit mund të dojë më tepër kujtesë se sa i është dhënë tani. Në u dashtë, ndryshojeni parametrin memory_limit te kartela juaj php.ini.",
1902
  "SystemCheckMemoryNoMemoryLimitSet": "S'është caktuar kufi kujtese",
1913
  "SystemCheckPdoAndMysqliHelp": "Në një shërbyes Linux mund ta përpiloni php-në me mundësitë vijuese: %1$s te php.ini juaj, shtoni rreshtat vijues: %2$s",
1914
  "SystemCheckPhp": "Version PHP-je",
1915
  "SystemCheckPhpPdoAndMysqli": "Më tepër të dhëna te: %1$sPHP PDO%2$s dhe %3$sMYSQLI%4$s.",
1916
+ "SystemCheckSessionHelp": "Lypset të formësoni dhe rimontoni PHP-në me aktivizim mbulimit\"session\" (mos përdorni --disable-session).",
1917
  "SystemCheckSettings": "Formësim PHP-je i domosdoshëm (php.ini)",
1918
  "SystemCheckSummaryNoProblems": "Urraaa! S’ka probleme me rregullimin tuaj të Matomo-s. Rrihini shpatullat vetes.",
1919
  "SystemCheckSummaryThereWereErrors": "Ah! Matomo ka zbuluar disa %1$sçështje kritike%2$s me rregullimin tuaj për të. %3$sKëto çështje duhen ndrequr menjëherë.%4$s",
1923
  "SystemCheckTrackerHelp": "Kërkesa GET te matomo.php dështoi. Provoni ta kaloni këtë URL si një të lejuar nga Mirëfilltësimi HTTP dhe çaktivizoni mod_security (mund t’ju duhet t’i kërkoni ndihmë strehuesit tuaj web). Për më tepër të dhëna mbi gabimin, shihni kartelën e regjistrimit të gabimeve të shërbyesit tuaj web.",
1924
  "SystemCheckWarnDomHelp": "Do të duhej të aktivizonit zgjerimin \"dom\" (p.sh., instaloni paketën \"php-dom\" dhe\/ose \"php-xml\").",
1925
  "SystemCheckWarning": "Matomo do të punojë normalisht por mund t’i mungojnë disa veçori",
1926
+ "SystemCheckWarnJsonHelp": "Do të duhej të aktivizonit zgjerimin \"json\" (p.sh., instaloni paketën \"php-json\").",
1927
  "SystemCheckWarnLibXmlHelp": "Do të duhej të aktivizonit zgjerimin \"libxml\" (p.sh., paketën \"install the php-libxml\" ) meqë është e domosdoshme nga zgjerime të tjera bazë të PHP-së.",
1928
+ "SystemCheckWarnOpensslHelp": "Do të duhej të aktivizonit zgjerimin \"openssl\", që të lejohen përditësime të siguruara.",
1929
  "SystemCheckWarnSimpleXMLHelp": "Do të duhej të aktivizonit zgjerimin \"SimpleXML\" (p.sh., instaloni paketën \"php-simplexml\" dhe\/ose \"php-xml\").",
1930
  "SystemCheckWinPdoAndMysqliHelp": "Në një shërbyes Windows, mund të shtoni rreshtat vijues te php.ini juaj: %s",
1931
  "SystemCheckWriteDirs": "Drejtori me hyrje për shkrim",
3946
  "OnlyMatchedUrlsAllowedHelp": "Në u aktivizoftë, Matomo do të ndjekë veprime të brendshme vetëm kur URL-ja e Faqes është një nga URL-të e njohura për sajtin tuaj. Kjo pengon shfrytëzimin e padëshiruar të analizave tuaja përmes URL-sh për sajte të tjerë.",
3947
  "OnlyMatchedUrlsAllowedHelpExamples": "Përkatësia dhe shtegu duhet të përputhen saktësisht dhe çdo nënpërkatësi e vlefshme duhet të specifikohet veçmas. Për shembull, kur URL-të e ditura janë 'http:\/\/shembull.com\/shteg' dhe 'http:\/\/imirë.shembull.com', kërkesat për ndjekje të 'http:\/\/shembull.com\/shtegtjetër' ose 'http:\/\/ikeq.shembull.com' shpërfillen.",
3948
  "WebsitesManagement": "Administrim Sajtesh",
3949
+ "WebsiteUpdated": "Sajti u përditësua",
3950
+ "WebsiteCreated": "Sajti u krijua",
3951
  "XManagement": "Administroni %s",
3952
  "ChooseMeasurableTypeHeadline": "Ç’do të donit të matnit?",
3953
  "YouCurrentlyHaveAccessToNWebsites": "Deri tani keni hyrje te %s sajte.",
app/lang/sr.json CHANGED
@@ -988,9 +988,10 @@
988
  "ColumnAvgTimeOnDimension": "Prosečno vreme na dimenziji"
989
  },
990
  "CustomJsTracker": {
991
- "PluginDescription": "Omogućuje bilo kom Matomo dodatku da proširi Matomo JavaScript datoteku za praćenje (piwik.js) i doda nove funkcionalnosti i mogućnosti za praćenje sajtova.",
992
- "DiagnosticPiwikJsWritable": "JavaScript treker u koji je moguće pisati (\"\/piwik.js\")",
993
- "DiagnosticPiwikJsMakeWritable": "Predlažemo da omogućite pisanje u piwik.js sledećom komandom: %s"
 
994
  },
995
  "DBStats": {
996
  "DatabaseUsage": "Iskorišćenost baze",
@@ -1411,9 +1412,7 @@
1411
  "SystemCheckGzcompressHelp": "Potrebno je da uključite zlib proširenje i funkciju gzcompress",
1412
  "SystemCheckGzuncompressHelp": "Potrebno je da uključite zlib proširenje i funkciju gzcompress",
1413
  "SystemCheckHashHelp": "Potrebno je da kompajlirate PHP sa podrškom za hash() tako što ćete isključiti opciju --disable-hash.",
1414
- "SystemCheckIconvHelp": "Potrebno je da kompajlirate PHP sa \"iconv\" podrškom, --with-iconv.",
1415
  "SystemCheckMailHelp": "Vaši komentari i poruke za izgubljene lozinke neće biti poslate bez mail() funkcije.",
1416
- "SystemCheckMbstring": "mbstring",
1417
  "SystemCheckMemoryLimit": "Memorijsko ograničenje",
1418
  "SystemCheckMemoryLimitHelp": "Na sajtovima sa visokim saobraćajem proces arhiviranja podataka može zahtevati više memorije nego što je to trenutno dozvoljeno.<br \/>Promenite vrednost parametra memory_limit u php.ini datoteci ukoliko je to neophodno.",
1419
  "SystemCheckNoErrorsOrWarnings": "Nema grešaka i upozorenja",
@@ -1428,7 +1427,6 @@
1428
  "SystemCheckPdoAndMysqliHelp": "Na Linux serveru možete kompajlirati PHP sa sledećim opcijama: %1$s U datoteku php.ini dodajte sledeće linije: %2$s",
1429
  "SystemCheckPhp": "Verzija PHP-a",
1430
  "SystemCheckPhpPdoAndMysqli": "Više informacija na: %1$sPHP PDO%2$s i %3$sMYSQLI%4$s.",
1431
- "SystemCheckSplHelp": "Potrebno je da kompajlirate PHP sa standardnom PHP bibiotekom (SPL).",
1432
  "SystemCheckSettings": "Potrebna PHP podešavanja (php.ini)",
1433
  "SystemCheckSummaryNoProblems": "Bravo! Nema problema sa vašom instalacijom Matomo-a. Možete biti zadovoljni.",
1434
  "SystemCheckSummaryThereWereErrors": "Matomo je otkrio %1$skritične probleme%2$s sa vašom instalacijom. %3$sPotrebno je da ih odmah rešite.%4$s",
988
  "ColumnAvgTimeOnDimension": "Prosečno vreme na dimenziji"
989
  },
990
  "CustomJsTracker": {
991
+ "PluginDescription": "Omogućuje bilo kom Piwik dodatku da proširi Matomo JavaScript datoteku za praćenje (matomo.js) i doda nove funkcionalnosti i mogućnosti za praćenje sajtova.",
992
+ "DiagnosticPiwikJsWritable": "JavaScript treker u koji je moguće pisati (%s)",
993
+ "DiagnosticPiwikJsNotWritable": "U Matomo JavaScript treker datoteku %s nije moguće pisati što znači da ostali dodaci ne mogu da prošire JavaScript treker. U budućnosti možda čak ni neke bazične funkcije neće raditi kako se očekuje.",
994
+ "DiagnosticPiwikJsMakeWritable": "Predlažemo da omogućite pisanje u %1$s sledećom komandom: %2$s"
995
  },
996
  "DBStats": {
997
  "DatabaseUsage": "Iskorišćenost baze",
1412
  "SystemCheckGzcompressHelp": "Potrebno je da uključite zlib proširenje i funkciju gzcompress",
1413
  "SystemCheckGzuncompressHelp": "Potrebno je da uključite zlib proširenje i funkciju gzcompress",
1414
  "SystemCheckHashHelp": "Potrebno je da kompajlirate PHP sa podrškom za hash() tako što ćete isključiti opciju --disable-hash.",
 
1415
  "SystemCheckMailHelp": "Vaši komentari i poruke za izgubljene lozinke neće biti poslate bez mail() funkcije.",
 
1416
  "SystemCheckMemoryLimit": "Memorijsko ograničenje",
1417
  "SystemCheckMemoryLimitHelp": "Na sajtovima sa visokim saobraćajem proces arhiviranja podataka može zahtevati više memorije nego što je to trenutno dozvoljeno.<br \/>Promenite vrednost parametra memory_limit u php.ini datoteci ukoliko je to neophodno.",
1418
  "SystemCheckNoErrorsOrWarnings": "Nema grešaka i upozorenja",
1427
  "SystemCheckPdoAndMysqliHelp": "Na Linux serveru možete kompajlirati PHP sa sledećim opcijama: %1$s U datoteku php.ini dodajte sledeće linije: %2$s",
1428
  "SystemCheckPhp": "Verzija PHP-a",
1429
  "SystemCheckPhpPdoAndMysqli": "Više informacija na: %1$sPHP PDO%2$s i %3$sMYSQLI%4$s.",
 
1430
  "SystemCheckSettings": "Potrebna PHP podešavanja (php.ini)",
1431
  "SystemCheckSummaryNoProblems": "Bravo! Nema problema sa vašom instalacijom Matomo-a. Možete biti zadovoljni.",
1432
  "SystemCheckSummaryThereWereErrors": "Matomo je otkrio %1$skritične probleme%2$s sa vašom instalacijom. %3$sPotrebno je da ih odmah rešite.%4$s",
app/lang/sv.json CHANGED
@@ -1523,7 +1523,6 @@
1523
  "ContactUs": "Kontakta oss",
1524
  "VisitTheForums": "Besök %1$s forumet%2$s och få hjälp av Matomo-användare",
1525
  "Forums": "Forum",
1526
- "ReviewMatomoTitle": "Tror du på Matomo?",
1527
  "PleaseLeaveExternalReviewForMatomo": "Dela dina tankar på någon av dessa webbplatser och inspirera andra att vara med i vår datarevolution.",
1528
  "RemindMeLater": "Påminn mig senare",
1529
  "NeverAskMeAgain": "Fråga mig inte igen",
@@ -1533,7 +1532,8 @@
1533
  "RemoveOtherLabel": "Jag vill se min \"Övriga\" data",
1534
  "PurgeOldData": "Jag vill ta bort viss gammal data",
1535
  "SearchHelpResources": "Sök efter matomo.org hjälpresurser",
1536
- "PopularHelpTopics": "Populära hjälpämnen"
 
1537
  },
1538
  "GeoIp2": {
1539
  "AssumingNonApache": "Kan inte hitta funktionen apache_get_modules, förutsätter att Apache inte används som webbserver.",
@@ -1858,11 +1858,8 @@
1858
  "SystemCheckGzcompressHelp": "Du behöver aktivera tillägget zlib och gzcompress funktionen.",
1859
  "SystemCheckGzuncompressHelp": "Du behöver aktivera tillägget zlib och funktionen gzuncompress.",
1860
  "SystemCheckHashHelp": "Du behöver konfigurera och bygga om PHP med stöd för hash() genom att ta bort alternativet --disable-hash.",
1861
- "SystemCheckIconvHelp": "Du måste konfigurera och installera PHP på nytt med \"iconv\" stöd aktiverat, --with-iconv.",
1862
  "SystemCheckJsonHelp": "Php-json extension krävs för att Matomo ska kunna läsa och skriva JSON-data.",
1863
  "SystemCheckMailHelp": "Feedback och bortglömda lösenord kommer inte att skickas utan mail().",
1864
- "SystemCheckMbstring": "mbstring",
1865
- "SystemCheckMbstringHelp": "Tillägget mbstring krävs för att hantera tecken på mer än en byte i användargränssnittet och API-svaren. Kontrollera även att mbstring.func_overload är satt till noll i php.ini.",
1866
  "SystemCheckMemoryLimit": "Minnesbegränsning",
1867
  "SystemCheckMemoryLimitHelp": "På en högtrafikswebbplats, kan arkiveringsprocessen kräva mer minne än vad som för tillfället är tillåtet. Om det är nödvändigt ändra memory_limit direktivet i din php.ini fil.",
1868
  "SystemCheckMemoryNoMemoryLimitSet": "Det finns ingen minnesgräns inställd",
@@ -1879,7 +1876,6 @@
1879
  "SystemCheckPdoAndMysqliHelp": "På en Linux server kan du kompilera php med följande alternativ: %1$s I din php.ini, lägg till följande rader: %2$s",
1880
  "SystemCheckPhp": "PHP version",
1881
  "SystemCheckPhpPdoAndMysqli": "Mer information finner du på: %1$sPHP PDO%2$s och %3$sYSQLI%4$s.",
1882
- "SystemCheckSplHelp": "Du måste konfigurera och installera PHP på nytt med Standard PHP Bibliotek (SPL) aktiverat (som standard).",
1883
  "SystemCheckSettings": "Nödvändig PHP-konfiguration (php.ini)",
1884
  "SystemCheckSummaryNoProblems": "Jippiii! Det finns inga problem med installationen av Matomo. Ge dig själv en klapp på axeln.",
1885
  "SystemCheckSummaryThereWereErrors": "Oj då.. Matomo har upptäckt några %1$skritiska problem%2$s med installationen. %3$sDessa problem bör åtgärdas omgående.%4$s",
1523
  "ContactUs": "Kontakta oss",
1524
  "VisitTheForums": "Besök %1$s forumet%2$s och få hjälp av Matomo-användare",
1525
  "Forums": "Forum",
 
1526
  "PleaseLeaveExternalReviewForMatomo": "Dela dina tankar på någon av dessa webbplatser och inspirera andra att vara med i vår datarevolution.",
1527
  "RemindMeLater": "Påminn mig senare",
1528
  "NeverAskMeAgain": "Fråga mig inte igen",
1532
  "RemoveOtherLabel": "Jag vill se min \"Övriga\" data",
1533
  "PurgeOldData": "Jag vill ta bort viss gammal data",
1534
  "SearchHelpResources": "Sök efter matomo.org hjälpresurser",
1535
+ "PopularHelpTopics": "Populära hjälpämnen",
1536
+ "ReferBannerTitle": "Tror du på Matomo?"
1537
  },
1538
  "GeoIp2": {
1539
  "AssumingNonApache": "Kan inte hitta funktionen apache_get_modules, förutsätter att Apache inte används som webbserver.",
1858
  "SystemCheckGzcompressHelp": "Du behöver aktivera tillägget zlib och gzcompress funktionen.",
1859
  "SystemCheckGzuncompressHelp": "Du behöver aktivera tillägget zlib och funktionen gzuncompress.",
1860
  "SystemCheckHashHelp": "Du behöver konfigurera och bygga om PHP med stöd för hash() genom att ta bort alternativet --disable-hash.",
 
1861
  "SystemCheckJsonHelp": "Php-json extension krävs för att Matomo ska kunna läsa och skriva JSON-data.",
1862
  "SystemCheckMailHelp": "Feedback och bortglömda lösenord kommer inte att skickas utan mail().",
 
 
1863
  "SystemCheckMemoryLimit": "Minnesbegränsning",
1864
  "SystemCheckMemoryLimitHelp": "På en högtrafikswebbplats, kan arkiveringsprocessen kräva mer minne än vad som för tillfället är tillåtet. Om det är nödvändigt ändra memory_limit direktivet i din php.ini fil.",
1865
  "SystemCheckMemoryNoMemoryLimitSet": "Det finns ingen minnesgräns inställd",
1876
  "SystemCheckPdoAndMysqliHelp": "På en Linux server kan du kompilera php med följande alternativ: %1$s I din php.ini, lägg till följande rader: %2$s",
1877
  "SystemCheckPhp": "PHP version",
1878
  "SystemCheckPhpPdoAndMysqli": "Mer information finner du på: %1$sPHP PDO%2$s och %3$sYSQLI%4$s.",
 
1879
  "SystemCheckSettings": "Nödvändig PHP-konfiguration (php.ini)",
1880
  "SystemCheckSummaryNoProblems": "Jippiii! Det finns inga problem med installationen av Matomo. Ge dig själv en klapp på axeln.",
1881
  "SystemCheckSummaryThereWereErrors": "Oj då.. Matomo har upptäckt några %1$skritiska problem%2$s med installationen. %3$sDessa problem bör åtgärdas omgående.%4$s",
app/lang/th.json CHANGED
@@ -638,9 +638,7 @@
638
  "SystemCheckGlobHelp": "ฟังก์ชันที่มีอยู่ภายในนี้ได้ถูกปิดการใช้งานบนโฮสต์ของคุณ Matomo จะพยายามทำการจำลองฟังก์ชันนี้ แต่อาจพบเพิ่มเติมข้อบังคับด้านความปลอดภัย ฟังก์ชันการทำงานอาจจะโดนผลกระทบ",
639
  "SystemCheckGzcompressHelp": "คุณต้องเปิดใช้ส่วนขยาย zlib และฟังก์ชั่น gzcompress",
640
  "SystemCheckGzuncompressHelp": "คุณต้องเปิดใช้ส่วนขยาย zlib และฟังก์ชั่น gzuncompress",
641
- "SystemCheckIconvHelp": "คุณจำเป็นต้องตั้งค่าคอนฟิก และสร้างใหม่ PHP ด้วย \"iconv\" เปิดใช้งานการสนับสนุน --with-iconv.",
642
  "SystemCheckMailHelp": "ความคิดเห็นและลืมรหัสผ่านจะไม่สามารถส่งข้อความโดยไม่ต้องรวมกับ mail()",
643
- "SystemCheckMbstring": "mbstring",
644
  "SystemCheckMemoryLimit": "ขีดจำกัดของหน่วยความจำ",
645
  "SystemCheckMemoryLimitHelp": "บนเว็บไซต์การรับส่งข้อมูลสูง กระบวนการเก็บถาวรอาจต้องใช้หน่วยความจำเพิ่มเติมมากกว่าที่ได้รับอนุญาตในขณะนี้ ถ้าจำเป็น เปลี่ยนคำสั่ง memory_limit ในไฟล์ php.ini ของคุณ",
646
  "SystemCheckOpenURL": "เปิด URL",
@@ -652,7 +650,6 @@
652
  "SystemCheckPdoAndMysqliHelp": "บน Linux server คุณสามารถคอมไพล์ php ด้วยตัวเลือกต่อไปนี้: %1$s ใน php.ini ของคุณเพิ่มบรรทัดต่อไปนี้: %2$s",
653
  "SystemCheckPhp": "เวอร์ชั่น PHP",
654
  "SystemCheckPhpPdoAndMysqli": "ข้อมูลเพิ่มเติมเกี่ยวกับ: %1$sPHP PDO%2$s และ %3$sMYSQLI%4$s",
655
- "SystemCheckSplHelp": "คุณจำเป็นต้องตั้งค่าคอนฟิก และสร้างใหม่ PHP ด้วยการมาตรฐาน PHP Library (SPL) เปิดใช้งาน (โดยค่าเริ่มต้น)",
656
  "SystemCheckTimeLimitHelp": "บนเว็บไซต์การรับส่งข้อมูลสูง การดำเนินกระบวนการเก็บถาวรอาจต้องใช้เวลามากขึ้นกว่าในปัจจุบันได้รับอนุญาต ถ้าจำเป็น เปลี่ยนคำสั่ง max_execution_time ในแฟ้ม php.ini ของคุณ",
657
  "SystemCheckTracker": "สถานะ Tracker",
658
  "SystemCheckWarnDomHelp": "คุณควรเปิดใช้ส่วนขยาย \"dom\" (เช่นการติดตั้ง \"php-dom\" และ\/หรือแพคเกจ \"php-xml\")",
638
  "SystemCheckGlobHelp": "ฟังก์ชันที่มีอยู่ภายในนี้ได้ถูกปิดการใช้งานบนโฮสต์ของคุณ Matomo จะพยายามทำการจำลองฟังก์ชันนี้ แต่อาจพบเพิ่มเติมข้อบังคับด้านความปลอดภัย ฟังก์ชันการทำงานอาจจะโดนผลกระทบ",
639
  "SystemCheckGzcompressHelp": "คุณต้องเปิดใช้ส่วนขยาย zlib และฟังก์ชั่น gzcompress",
640
  "SystemCheckGzuncompressHelp": "คุณต้องเปิดใช้ส่วนขยาย zlib และฟังก์ชั่น gzuncompress",
 
641
  "SystemCheckMailHelp": "ความคิดเห็นและลืมรหัสผ่านจะไม่สามารถส่งข้อความโดยไม่ต้องรวมกับ mail()",
 
642
  "SystemCheckMemoryLimit": "ขีดจำกัดของหน่วยความจำ",
643
  "SystemCheckMemoryLimitHelp": "บนเว็บไซต์การรับส่งข้อมูลสูง กระบวนการเก็บถาวรอาจต้องใช้หน่วยความจำเพิ่มเติมมากกว่าที่ได้รับอนุญาตในขณะนี้ ถ้าจำเป็น เปลี่ยนคำสั่ง memory_limit ในไฟล์ php.ini ของคุณ",
644
  "SystemCheckOpenURL": "เปิด URL",
650
  "SystemCheckPdoAndMysqliHelp": "บน Linux server คุณสามารถคอมไพล์ php ด้วยตัวเลือกต่อไปนี้: %1$s ใน php.ini ของคุณเพิ่มบรรทัดต่อไปนี้: %2$s",
651
  "SystemCheckPhp": "เวอร์ชั่น PHP",
652
  "SystemCheckPhpPdoAndMysqli": "ข้อมูลเพิ่มเติมเกี่ยวกับ: %1$sPHP PDO%2$s และ %3$sMYSQLI%4$s",
 
653
  "SystemCheckTimeLimitHelp": "บนเว็บไซต์การรับส่งข้อมูลสูง การดำเนินกระบวนการเก็บถาวรอาจต้องใช้เวลามากขึ้นกว่าในปัจจุบันได้รับอนุญาต ถ้าจำเป็น เปลี่ยนคำสั่ง max_execution_time ในแฟ้ม php.ini ของคุณ",
654
  "SystemCheckTracker": "สถานะ Tracker",
655
  "SystemCheckWarnDomHelp": "คุณควรเปิดใช้ส่วนขยาย \"dom\" (เช่นการติดตั้ง \"php-dom\" และ\/หรือแพคเกจ \"php-xml\")",
app/lang/tl.json CHANGED
@@ -932,9 +932,7 @@
932
  "SystemCheckGlobHelp": "Ang mga gawa ng function na ito ay hindi gumagana sa iyong host. Ang Matomo ay susubukan na ito ay gayahin ngunit maaring magkaroon ng karagdagang paghihipit sa seguridad. Ang functionality nito ay lubos na maapektuhan.",
933
  "SystemCheckGzcompressHelp": "Kailangan mong i-enable ang zlib extension at gzcompress function.",
934
  "SystemCheckGzuncompressHelp": "Kailangan mong i-enable ang zlib extension at gzuncompress function.",
935
- "SystemCheckIconvHelp": "kailangan mong i-configure at e-build ang PHP na may \"iconv\" ng may gumaganang support --with-iconv.",
936
  "SystemCheckMailHelp": "Ang Feedback at mga mensahe ng Nawalang Password ay hindi ipapadala nang walang mail ().",
937
- "SystemCheckMbstring": "mbstring",
938
  "SystemCheckMemoryLimit": "Limitasyon ng memorya",
939
  "SystemCheckMemoryLimitHelp": "Sa may mataas na traffic na website ang proseso ng pag-archive ay mangailangan ng higit pang memory kaysa sa kasalukuyan. Kung kinakailangan palitan ang memory_limit directive sa iyong php.ini file",
940
  "SystemCheckOpenURL": "Bukas na URL",
@@ -946,7 +944,6 @@
946
  "SystemCheckPdoAndMysqliHelp": "Sa GNU\/Linux server ay maari mong e-compile ang iyong php kasama ang mag option na ito: %1$s In your php.ini idag-dag ang mga sumusunod na mga linya: %2$s",
947
  "SystemCheckPhp": "Bersyon ng PHP",
948
  "SystemCheckPhpPdoAndMysqli": "Marami pang impormasyon sa: : %1$sPHP PDO%2$s at %3$sMYSQLI%4$s.",
949
- "SystemCheckSplHelp": "kailangan mong i-configure at muling e-build ang PHP na may Standard PHP Library (SPL) na syang gumagana(default).",
950
  "SystemCheckSummaryNoProblems": "Huzzah! Walang mga problema sa pag-setup mo ng Matomo. Bigyan ang iyong sarili ng isang magandang pahinga.",
951
  "SystemCheckSummaryThereWereErrors": "Naku! Ang Matomo ay may nakitang i-ilang %1$s critical isyo sa %2$s sa iyong Matomo setup. %3$s Ang mga isyung ito ay dapat na maayos ka-agad. %4$s",
952
  "SystemCheckSummaryThereWereWarnings": "May ilang mga isyu sa iyong system. Ang Matomo ay gagana ngunit maaari kang makaranas ng ilang mga menor na problema.",
932
  "SystemCheckGlobHelp": "Ang mga gawa ng function na ito ay hindi gumagana sa iyong host. Ang Matomo ay susubukan na ito ay gayahin ngunit maaring magkaroon ng karagdagang paghihipit sa seguridad. Ang functionality nito ay lubos na maapektuhan.",
933
  "SystemCheckGzcompressHelp": "Kailangan mong i-enable ang zlib extension at gzcompress function.",
934
  "SystemCheckGzuncompressHelp": "Kailangan mong i-enable ang zlib extension at gzuncompress function.",
 
935
  "SystemCheckMailHelp": "Ang Feedback at mga mensahe ng Nawalang Password ay hindi ipapadala nang walang mail ().",
 
936
  "SystemCheckMemoryLimit": "Limitasyon ng memorya",
937
  "SystemCheckMemoryLimitHelp": "Sa may mataas na traffic na website ang proseso ng pag-archive ay mangailangan ng higit pang memory kaysa sa kasalukuyan. Kung kinakailangan palitan ang memory_limit directive sa iyong php.ini file",
938
  "SystemCheckOpenURL": "Bukas na URL",
944
  "SystemCheckPdoAndMysqliHelp": "Sa GNU\/Linux server ay maari mong e-compile ang iyong php kasama ang mag option na ito: %1$s In your php.ini idag-dag ang mga sumusunod na mga linya: %2$s",
945
  "SystemCheckPhp": "Bersyon ng PHP",
946
  "SystemCheckPhpPdoAndMysqli": "Marami pang impormasyon sa: : %1$sPHP PDO%2$s at %3$sMYSQLI%4$s.",
 
947
  "SystemCheckSummaryNoProblems": "Huzzah! Walang mga problema sa pag-setup mo ng Matomo. Bigyan ang iyong sarili ng isang magandang pahinga.",
948
  "SystemCheckSummaryThereWereErrors": "Naku! Ang Matomo ay may nakitang i-ilang %1$s critical isyo sa %2$s sa iyong Matomo setup. %3$s Ang mga isyung ito ay dapat na maayos ka-agad. %4$s",
949
  "SystemCheckSummaryThereWereWarnings": "May ilang mga isyu sa iyong system. Ang Matomo ay gagana ngunit maaari kang makaranas ng ilang mga menor na problema.",
app/lang/tr.json CHANGED
@@ -16,6 +16,7 @@
16
  "Apply": "Uygula",
17
  "ArchivingInlineHelp": "Orta ve yüksek yoğunluklu web siteleri için Matomo arşivlemesinin web tarayıcı üzerinden tetiklenme seçeneğinin kapatılması öneriilir. Bunun yerine saatlik olarak Matomo raporlarını oluşturacak zamanlanmış bir görevin tanımlanması önerilir.",
18
  "ArchivingTriggerDescription": "Daha büyük Matomo kurulumları için raporları otomatik olarak işleyen bir %1$szamanlanmış görev%2$s oluşturulması önerilir.",
 
19
  "AuthenticationMethodSmtp": "SMTP kimlik doğrulama yöntemi",
20
  "AverageOrderValue": "Ortalama Sipariş Değeri",
21
  "AveragePrice": "Ortalama Fiyat",
@@ -176,6 +177,8 @@
176
  "ExceptionDatabaseVersion": "%1$s sürümünüz %2$s ancak Matomo için en az %3$s sürümü gerekli.",
177
  "ExceptionDatabaseVersionNewerThanCodebase": "Matomo uygulamanız eski %1$s sürümü üzerinde çalışıyor ancak Matomo veritabanının daha yeni %2$s sürümüne güncellenmiş.",
178
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Matomo yöneticileriniz şu anda güncelleme işlemini tamamlıyor olabilir. Lütfen bir kaç dakika sonra yeniden deneyin.",
 
 
179
  "ExceptionFileIntegrity": "Bütünlük sağlanamadı: %s",
180
  "ExceptionFilesizeMismatch": "Dosya boyutu uyumsuz: %1$s (Beklenen Boyut: %2$s, Bulunan: %3$s)",
181
  "ExceptionIncompatibleClientServerVersions": "%1$s istemci sürümünüz %2$s. Ancak bu sürüm %3$s sunucu sürümü ile uyumsuz.",
@@ -524,7 +527,8 @@
524
  "Custom": "Özel",
525
  "PreviousPeriod": "Önceki Dönem",
526
  "PreviousYear": "Önceki Yıl",
527
- "ViewAccessRequired": "Kullanılan kimlik doğrulama kodunun (token_auth) erişim izinleri, API dışı bir istek adresinde kullanılmak için çok fazla. Lütfen yalnız görüntüleme erişimi olan bir kullanıcı için uygulamaya özel bir parola kullanın."
 
528
  },
529
  "Mobile": {
530
  "AboutPiwikMobile": "Matomo Mobil Hakkında",
@@ -915,7 +919,24 @@
915
  "TrackingFailuresEmail1": "Bu ileti, son günlerde %s farklı izleme sorunu oluştuğunu bildirir.",
916
  "TrackingFailuresEmail2": "Tüm izleme sorunlarını görüntülemek için %1$sburaya tıklayın%2$s.",
917
  "ImportFromGoogleAnalytics": "Google Analytics Üzerinden İçe Aktar",
918
- "ImportFromGoogleAnalyticsDescription": "Bir Google Analytics mülkünüz varsa ve Matomo uygulamasına geçiyorsanız, %1$sGoogleAnalyticsImporter%2$s uygulama ekini kullanarak var olan verilerinizi içe aktarabilirsiniz."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
919
  },
920
  "CoreHome": {
921
  "CategoryNoData": "Bu kategoride henüz bir veri yok. \"Tüm dağılımlar katılsın\" seçeneğini deneyin.",
@@ -1536,7 +1557,7 @@
1536
  "ContactUs": "Bizimle görüşün",
1537
  "VisitTheForums": "%1$sForumları%2$s ziyaret ederek Matomo kullanıcı topluluğundan destek alabilirsiniz",
1538
  "Forums": "Forum",
1539
- "ReviewMatomoTitle": "Matomo uygulamasına güveniyor musunuz?",
1540
  "PleaseLeaveExternalReviewForMatomo": "Düşüncelerinizi bu sitelerden birinde paylaşın ve başkalarına da veri devrimimize katılmaları için ilham verin.",
1541
  "RemindMeLater": "Daha sonra anımsat",
1542
  "NeverAskMeAgain": "Bir daha sorma",
@@ -1548,11 +1569,12 @@
1548
  "SearchHelpResources": "Matomo.org yardım kaynaklarında arayın",
1549
  "PopularHelpTopics": "Sık başvurulan yardım konuları",
1550
  "ReferMatomo": "Matomo uygulamasını önerin",
1551
- "ReferBannerTitle": "Arkadaşlarınızın verilerinin yanlış ellere geçmesine izin vermeyin!",
1552
- "ReferBannerLonger": "Verilerinin denetimini yeniden ele almaları için onlara Matomo kullanmalarını önerin!",
1553
  "ReferBannerEmailShareSubject": "Verilerinin denetimini yeniden ele almaları için onlara Matomo kullanmalarını önerin!",
1554
  "ReferBannerEmailShareBody": "Google Analytics uygulamasına etik bir alternatif olarak, verilerim üzerinde %%100 sahiplik sağlayan ve web sitesi ziyaretçilerimin verilerini koruyan Matomo uygulamasını kullanıyorum.\nSizin de Google üzerinden gücünüzü geri alarak kendi verilerinize ship olmanız umuduyla bu iletiyi paylaşıyorum.\n\nMatomo uygulamasını https:\/\/matomo.org adresinde bulabilirsiniz",
1555
- "ReferBannerSocialShareText": "Google Analytics kullanıyorsanız, Matomo gibi etik bir alternatife geçerek denetimi elinize alın!"
 
1556
  },
1557
  "GeoIp2": {
1558
  "AssumingNonApache": "apache_get_modules işlevi bulunamadığı için web sunucusunun Apache olmadığı varsayılıyor.",
@@ -1878,11 +1900,8 @@
1878
  "SystemCheckGzcompressHelp": "zlib eklentisini ve gzcompress işlevini etkinleştirmelisiniz.",
1879
  "SystemCheckGzuncompressHelp": "zlib eklentisini ve gzuncompress işlevini etkinleştirmelisiniz.",
1880
  "SystemCheckHashHelp": "-disable hash seçeneğini kaldırarak PHP yazılımını hash() desteği ile yeniden yapılandırmalısınız.",
1881
- "SystemCheckIconvHelp": "--with-iconv seçeneğini kullanarak PHP yazılımını \"Iconv\" desteği ile yeniden yapılandırmalısınız.",
1882
  "SystemCheckJsonHelp": "JSON verilerinin Matomo tarafından okunup yazılabilmesi için php-json eklentisi gereklidir.",
1883
  "SystemCheckMailHelp": "Bildirim ve Parola Unutma iletileri mail() işlevi ile gönderilmeyecek.",
1884
- "SystemCheckMbstring": "mbstring",
1885
- "SystemCheckMbstringHelp": "Kullanıcı arayüzü ve API yanıtlarındaki multibayt karakterlerinin işlenebilmesi için mbstring eklentisi gereklidir. Ayrıca php.ini yapılandırma dosyası içindeki mbstring.func_overload seçeneğini \"0\" olarak ayarlayın.",
1886
  "SystemCheckMemoryLimit": "Bellek sınırı",
1887
  "SystemCheckMemoryLimitHelp": "Trafiği yüksek olan bir web sitesinde arşivleme işlemi normal olarak izin verilen değerden daha fazla bellek kullanımına gerek duyabilir. Gerekiyorsa php.ini yapılandırma dosyasındaki memory_limit seçeneğinin değerini değiştirin.",
1888
  "SystemCheckMemoryNoMemoryLimitSet": "Herhangi bir bellek sınırı ayarlanmamış",
@@ -1899,7 +1918,6 @@
1899
  "SystemCheckPdoAndMysqliHelp": "Bir GNU\/Linux sunucusu üzerinde php yazılımını şu seçenekler ile derleyebilirsiniz: %1$s php.ini yapılandırma dosyanıza şu satırları ekleyin: %2$s",
1900
  "SystemCheckPhp": "PHP sürümü",
1901
  "SystemCheckPhpPdoAndMysqli": "Ayrıntılı bilgi aşmak için: %1$sPHP PDO%2$s ve %3$sMYSQLI%4$s.",
1902
- "SystemCheckSplHelp": "PHP yazılımını Standart PHP Kitaplığı (SPL) etkinleştirilmiş olarak (varsayılan) yeniden yapılandırmalısınız.",
1903
  "SystemCheckSessionHelp": "PHP yazılımını \"session\" desteği ile yeniden yapılandırmalısınız (--disable-session kullanmayın).",
1904
  "SystemCheckSettings": "Gerekli PHP yapılandırması (php.ini)",
1905
  "SystemCheckSummaryNoProblems": "Harika! Matomo kurulumunda hiçbir sorun yok. Kendinizi tebrik edin.",
@@ -3954,6 +3972,8 @@
3954
  "OnlyMatchedUrlsAllowedHelp": "Bu seçenek etkinleştirildiğinde, Matomo iç işlemleri yalnız sayfa adresi web sitesi için belirtilmiş adreslerden biri ise izler. Böylece kötü niyetli kişilerin istatistik verilerinizi başka web sitesi adresleri ile karıştırması engellenmiş olur.",
3955
  "OnlyMatchedUrlsAllowedHelpExamples": "Etki alanı ve yol tam eşleşmeli ve her bir etki geçerli alt etki alanı ayrı ayrı belirtilmelidir. Örneğin bilinen adresler 'http:\/\/ornek.com\/yol' ve 'http:\/\/iyi.ornek.com' şeklinde ise, 'http:\/\/ornek.com\/baskayol' ya da 'http:\/\/kotu.ornek.com' izleme istekleri yok sayılır.",
3956
  "WebsitesManagement": "Web Sitesi Yönetimi",
 
 
3957
  "XManagement": "%s Yönetimi",
3958
  "ChooseMeasurableTypeHeadline": "Neyi ölçmek istiyorsunuz?",
3959
  "YouCurrentlyHaveAccessToNWebsites": "%s web sitesine erişme izniniz var.",
16
  "Apply": "Uygula",
17
  "ArchivingInlineHelp": "Orta ve yüksek yoğunluklu web siteleri için Matomo arşivlemesinin web tarayıcı üzerinden tetiklenme seçeneğinin kapatılması öneriilir. Bunun yerine saatlik olarak Matomo raporlarını oluşturacak zamanlanmış bir görevin tanımlanması önerilir.",
18
  "ArchivingTriggerDescription": "Daha büyük Matomo kurulumları için raporları otomatik olarak işleyen bir %1$szamanlanmış görev%2$s oluşturulması önerilir.",
19
+ "ArchivingTriggerSegment": "Özel dilimlerin kullanılması arşivlerin işlenmesini tetikler.",
20
  "AuthenticationMethodSmtp": "SMTP kimlik doğrulama yöntemi",
21
  "AverageOrderValue": "Ortalama Sipariş Değeri",
22
  "AveragePrice": "Ortalama Fiyat",
177
  "ExceptionDatabaseVersion": "%1$s sürümünüz %2$s ancak Matomo için en az %3$s sürümü gerekli.",
178
  "ExceptionDatabaseVersionNewerThanCodebase": "Matomo uygulamanız eski %1$s sürümü üzerinde çalışıyor ancak Matomo veritabanının daha yeni %2$s sürümüne güncellenmiş.",
179
  "ExceptionDatabaseVersionNewerThanCodebaseWait": "Matomo yöneticileriniz şu anda güncelleme işlemini tamamlıyor olabilir. Lütfen bir kaç dakika sonra yeniden deneyin.",
180
+ "ExceptionDatabaseUnavailable": "MySQL sunucusu erişilemez oldu",
181
+ "ExceptionDatabaseAccess": "Vertiabanı erişimi reddedildi",
182
  "ExceptionFileIntegrity": "Bütünlük sağlanamadı: %s",
183
  "ExceptionFilesizeMismatch": "Dosya boyutu uyumsuz: %1$s (Beklenen Boyut: %2$s, Bulunan: %3$s)",
184
  "ExceptionIncompatibleClientServerVersions": "%1$s istemci sürümünüz %2$s. Ancak bu sürüm %3$s sunucu sürümü ile uyumsuz.",
527
  "Custom": "Özel",
528
  "PreviousPeriod": "Önceki Dönem",
529
  "PreviousYear": "Önceki Yıl",
530
+ "ViewAccessRequired": "Kullanılan kimlik doğrulama kodunun (token_auth) erişim izinleri, API dışı bir istek adresinde kullanılmak için çok fazla. Lütfen yalnız görüntüleme erişimi olan bir kullanıcı için uygulamaya özel bir parola kullanın.",
531
+ "Reasons": "Nedenler"
532
  },
533
  "Mobile": {
534
  "AboutPiwikMobile": "Matomo Mobil Hakkında",
919
  "TrackingFailuresEmail1": "Bu ileti, son günlerde %s farklı izleme sorunu oluştuğunu bildirir.",
920
  "TrackingFailuresEmail2": "Tüm izleme sorunlarını görüntülemek için %1$sburaya tıklayın%2$s.",
921
  "ImportFromGoogleAnalytics": "Google Analytics Üzerinden İçe Aktar",
922
+ "ImportFromGoogleAnalyticsDescription": "Bir Google Analytics mülkünüz varsa ve Matomo uygulamasına geçiyorsanız, %1$sGoogleAnalyticsImporter%2$s uygulama ekini kullanarak var olan verilerinizi içe aktarabilirsiniz.",
923
+ "SecurityNotificationEmailSubject": "Güvenlik Bildirimi",
924
+ "SecurityNotificationRecoveryCodesShowedBody": "Birisi hesabınızın iki aşamalı kimlik doğrulama kurtarma kodlarına baktı.",
925
+ "SecurityNotificationRecoveryCodesRegeneratedBody": "Birisi hesabınız için yeni iki aşamalı kimlik doğrulama kurtarma kodları oluşturdu.",
926
+ "SecurityNotificationTwoFactorAuthEnabledBody": "Birisi hesabınız için iki aşamalı kimlik doğrulamasını etkinleştirdi.",
927
+ "SecurityNotificationTwoFactorAuthDisabledBody": "Birisi hesabınız için iki aşamalı kimlik doğrulamasını devre dışı bıraktı.",
928
+ "SecurityNotificationTokenAuthCreatedBody": "Birisi hesabınız için bir kimlik doğrulama kodu oluşturdu (açıklama: %s). Bu işlemi siz yapmadıysanız bu kodu silin.",
929
+ "SecurityNotificationTokenAuthDeletedBody": "Birisi hesabınızın bir kimlik doğrulama kodunu sildi (açıklama: %s).",
930
+ "SecurityNotificationAllTokenAuthDeletedBody": "Birisi hesabınızın tüm kimlik doğrulama kodlarını sildi",
931
+ "SecurityNotificationSettingsChangedByUserBody": "Birisi sistem ayarlarını değiştirdi. Etkilenen ayarlar: %s.",
932
+ "SecurityNotificationSettingsChangedByOtherSuperUserBody": "Başka bir süper kullanıcı (%1$s) sistem ayarlarını değiştirdi. Etkilenen ayarlar: %2$s. Bu işlem hakkında bilginiz varsa bu uyarıyı yok sayabilirsiniz. Bilginiz yoksa, diğer süper kullanıcılar ile görüşün.",
933
+ "SecurityNotificationUserCreatedBody": "Birisi hesabınız için yeni bir kullanıcı oluşturdu (kullanıcı adı: %s)",
934
+ "SecurityNotificationUserDeletedBody": "Birisi hesabınızdan bir kullanıcı sildi (kullanıcı adı: %s).",
935
+ "SecurityNotificationIfItWasYou": "Bu işlem hakkında bilginiz varsa bu uyarıyı yok sayabilirsiniz. Bilginiz yoksa, lütfen parolanızı sıfırlayın.",
936
+ "SecurityNotificationCheckTwoFactor": "Lütfen iki aşamalı kimlik doğrulama uygulamanızı ya da aygıtınızı denetleyin.",
937
+ "BruteForce": "Kaba Kuvvet",
938
+ "TwoFactorAuth": "İki aşamalı kimlik doğrulaması",
939
+ "Cors": "Cors"
940
  },
941
  "CoreHome": {
942
  "CategoryNoData": "Bu kategoride henüz bir veri yok. \"Tüm dağılımlar katılsın\" seçeneğini deneyin.",
1557
  "ContactUs": "Bizimle görüşün",
1558
  "VisitTheForums": "%1$sForumları%2$s ziyaret ederek Matomo kullanıcı topluluğundan destek alabilirsiniz",
1559
  "Forums": "Forum",
1560
+ "ReviewMatomoTitle": "Matomo hoşunuza gitti mi?",
1561
  "PleaseLeaveExternalReviewForMatomo": "Düşüncelerinizi bu sitelerden birinde paylaşın ve başkalarına da veri devrimimize katılmaları için ilham verin.",
1562
  "RemindMeLater": "Daha sonra anımsat",
1563
  "NeverAskMeAgain": "Bir daha sorma",
1569
  "SearchHelpResources": "Matomo.org yardım kaynaklarında arayın",
1570
  "PopularHelpTopics": "Sık başvurulan yardım konuları",
1571
  "ReferMatomo": "Matomo uygulamasını önerin",
1572
+ "ReferBannerTitle": "Matomo uygulamasına güveniyor musunuz?",
1573
+ "ReferBannerLonger": "Lütfen daha fazla insanın kendi istatistiklerini kontrol edebilmesi için bizi anlatan bilgileri yaymamıza yardımcı olun.",
1574
  "ReferBannerEmailShareSubject": "Verilerinin denetimini yeniden ele almaları için onlara Matomo kullanmalarını önerin!",
1575
  "ReferBannerEmailShareBody": "Google Analytics uygulamasına etik bir alternatif olarak, verilerim üzerinde %%100 sahiplik sağlayan ve web sitesi ziyaretçilerimin verilerini koruyan Matomo uygulamasını kullanıyorum.\nSizin de Google üzerinden gücünüzü geri alarak kendi verilerinize ship olmanız umuduyla bu iletiyi paylaşıyorum.\n\nMatomo uygulamasını https:\/\/matomo.org adresinde bulabilirsiniz",
1576
+ "ReferBannerSocialShareText": "Google Analytics kullanıyorsanız, Matomo gibi etik bir alternatife geçerek denetimi elinize alın!",
1577
+ "WontShowAgain": "Bu iletiyi bir daha göstermeyeceğiz."
1578
  },
1579
  "GeoIp2": {
1580
  "AssumingNonApache": "apache_get_modules işlevi bulunamadığı için web sunucusunun Apache olmadığı varsayılıyor.",
1900
  "SystemCheckGzcompressHelp": "zlib eklentisini ve gzcompress işlevini etkinleştirmelisiniz.",
1901
  "SystemCheckGzuncompressHelp": "zlib eklentisini ve gzuncompress işlevini etkinleştirmelisiniz.",
1902
  "SystemCheckHashHelp": "-disable hash seçeneğini kaldırarak PHP yazılımını hash() desteği ile yeniden yapılandırmalısınız.",
 
1903
  "SystemCheckJsonHelp": "JSON verilerinin Matomo tarafından okunup yazılabilmesi için php-json eklentisi gereklidir.",
1904
  "SystemCheckMailHelp": "Bildirim ve Parola Unutma iletileri mail() işlevi ile gönderilmeyecek.",
 
 
1905
  "SystemCheckMemoryLimit": "Bellek sınırı",
1906
  "SystemCheckMemoryLimitHelp": "Trafiği yüksek olan bir web sitesinde arşivleme işlemi normal olarak izin verilen değerden daha fazla bellek kullanımına gerek duyabilir. Gerekiyorsa php.ini yapılandırma dosyasındaki memory_limit seçeneğinin değerini değiştirin.",
1907
  "SystemCheckMemoryNoMemoryLimitSet": "Herhangi bir bellek sınırı ayarlanmamış",
1918
  "SystemCheckPdoAndMysqliHelp": "Bir GNU\/Linux sunucusu üzerinde php yazılımını şu seçenekler ile derleyebilirsiniz: %1$s php.ini yapılandırma dosyanıza şu satırları ekleyin: %2$s",
1919
  "SystemCheckPhp": "PHP sürümü",
1920
  "SystemCheckPhpPdoAndMysqli": "Ayrıntılı bilgi aşmak için: %1$sPHP PDO%2$s ve %3$sMYSQLI%4$s.",
 
1921
  "SystemCheckSessionHelp": "PHP yazılımını \"session\" desteği ile yeniden yapılandırmalısınız (--disable-session kullanmayın).",
1922
  "SystemCheckSettings": "Gerekli PHP yapılandırması (php.ini)",
1923
  "SystemCheckSummaryNoProblems": "Harika! Matomo kurulumunda hiçbir sorun yok. Kendinizi tebrik edin.",
3972
  "OnlyMatchedUrlsAllowedHelp": "Bu seçenek etkinleştirildiğinde, Matomo iç işlemleri yalnız sayfa adresi web sitesi için belirtilmiş adreslerden biri ise izler. Böylece kötü niyetli kişilerin istatistik verilerinizi başka web sitesi adresleri ile karıştırması engellenmiş olur.",
3973
  "OnlyMatchedUrlsAllowedHelpExamples": "Etki alanı ve yol tam eşleşmeli ve her bir etki geçerli alt etki alanı ayrı ayrı belirtilmelidir. Örneğin bilinen adresler 'http:\/\/ornek.com\/yol' ve 'http:\/\/iyi.ornek.com' şeklinde ise, 'http:\/\/ornek.com\/baskayol' ya da 'http:\/\/kotu.ornek.com' izleme istekleri yok sayılır.",
3974
  "WebsitesManagement": "Web Sitesi Yönetimi",
3975
+ "WebsiteUpdated": "Web sitesi güncellendi",
3976
+ "WebsiteCreated": "Web sitesi oluşturuldu",
3977
  "XManagement": "%s Yönetimi",
3978
  "ChooseMeasurableTypeHeadline": "Neyi ölçmek istiyorsunuz?",
3979
  "YouCurrentlyHaveAccessToNWebsites": "%s web sitesine erişme izniniz var.",
app/lang/uk.json CHANGED
@@ -1530,9 +1530,7 @@
1530
  "SystemCheckGlobHelp": "Ця вбудована функція було заблокована на вашому хостингу. Matomo спробує емулювати цю функцію але може зістикнутися з подальшими обмеженнями по безпеці. Функціональність може бути обмежена.",
1531
  "SystemCheckGzcompressHelp": "Необхідно увімкнути розширення zlib та функцію gzcompress.",
1532
  "SystemCheckGzuncompressHelp": "Необхідно увімкнути розширення zlib та функцію gzuncompress.",
1533
- "SystemCheckIconvHelp": "Необхідно переконфігурувати та перезібрати PHP з підтримкою \"iconv\", --with-iconv.",
1534
  "SystemCheckMailHelp": "Е-майл повідомлення форми відгуку та відновлення паролю не будуть надсилатися без функції mail().",
1535
- "SystemCheckMbstring": "mbstring",
1536
  "SystemCheckMemoryLimit": "Граничний розмір пам'яті",
1537
  "SystemCheckMemoryLimitHelp": "На сайті з високим трафіком процес стистення даних може потребувати більше пам'яті ніж дозволено зараз.<br\/>Дивіться детальніше про директиву memory_limit у файлі php.ini.",
1538
  "SystemCheckNoErrorsOrWarnings": "Немає ніяких помилок або попереджень",
@@ -1547,7 +1545,6 @@
1547
  "SystemCheckPdoAndMysqliHelp": "На Linux-сервері ви можете cкомпілювати PHP з наступними опціями: %1$s В php.ini, додати наступні рядки: %2$s",
1548
  "SystemCheckPhp": "Версія PHP",
1549
  "SystemCheckPhpPdoAndMysqli": "Детальніша інформація: %1$sPHP PDO%2$s та %3$sMYSQLI%4$s.",
1550
- "SystemCheckSplHelp": "Необхідно переконфігурувати та перезібрати PHP з Standard PHP Library (SPL) топово увімкненою (by default).",
1551
  "SystemCheckSettings": "Вимоги до системи PHP (php.ini)",
1552
  "SystemCheckSummaryNoProblems": "Ура! Немає ніяких проблем з установкою Matomo. Дайте собі поплескати по плечу.",
1553
  "SystemCheckSummaryThereWereErrors": "Ой-ой! Matomo виявив деякі %1$sважливі проблеми%2$s з вашим встановленням Matomo. %3$sЦі проблеми повинні бути виправлені негайно.%4$s",
1530
  "SystemCheckGlobHelp": "Ця вбудована функція було заблокована на вашому хостингу. Matomo спробує емулювати цю функцію але може зістикнутися з подальшими обмеженнями по безпеці. Функціональність може бути обмежена.",
1531
  "SystemCheckGzcompressHelp": "Необхідно увімкнути розширення zlib та функцію gzcompress.",
1532
  "SystemCheckGzuncompressHelp": "Необхідно увімкнути розширення zlib та функцію gzuncompress.",
 
1533
  "SystemCheckMailHelp": "Е-майл повідомлення форми відгуку та відновлення паролю не будуть надсилатися без функції mail().",
 
1534
  "SystemCheckMemoryLimit": "Граничний розмір пам'яті",
1535
  "SystemCheckMemoryLimitHelp": "На сайті з високим трафіком процес стистення даних може потребувати більше пам'яті ніж дозволено зараз.<br\/>Дивіться детальніше про директиву memory_limit у файлі php.ini.",
1536
  "SystemCheckNoErrorsOrWarnings": "Немає ніяких помилок або попереджень",
1545
  "SystemCheckPdoAndMysqliHelp": "На Linux-сервері ви можете cкомпілювати PHP з наступними опціями: %1$s В php.ini, додати наступні рядки: %2$s",
1546
  "SystemCheckPhp": "Версія PHP",
1547
  "SystemCheckPhpPdoAndMysqli": "Детальніша інформація: %1$sPHP PDO%2$s та %3$sMYSQLI%4$s.",
 
1548
  "SystemCheckSettings": "Вимоги до системи PHP (php.ini)",
1549
  "SystemCheckSummaryNoProblems": "Ура! Немає ніяких проблем з установкою Matomo. Дайте собі поплескати по плечу.",
1550
  "SystemCheckSummaryThereWereErrors": "Ой-ой! Matomo виявив деякі %1$sважливі проблеми%2$s з вашим встановленням Matomo. %3$sЦі проблеми повинні бути виправлені негайно.%4$s",
app/lang/vi.json CHANGED
@@ -1089,9 +1089,7 @@
1089
  "SystemCheckGlobHelp": "Các hàm nội tại đã bị vô hiệu hóa trên máy chủ của bạn. Matomo sẽ cố gắng để giả lập hàm này nhưng có thể gặp phải những hạn chế bảo mật cao hơn. Chức năng có thể bị ảnh hưởng.",
1090
  "SystemCheckGzcompressHelp": "Bạn cần bật zlib extension and gzcompress function.",
1091
  "SystemCheckGzuncompressHelp": "Bạn cần bật zlib extension and gzuncompress function.",
1092
- "SystemCheckIconvHelp": "Bạn cần cấu hình và xây dựng lại PHP với sự hỗ trợ \"iconv\" được kích hoạt,--với-iconv.",
1093
  "SystemCheckMailHelp": "Feedback và thông báo mất mật khẩu sẽ không được gửi nếu thiếu mail().",
1094
- "SystemCheckMbstring": "mbstring",
1095
  "SystemCheckMemoryLimit": "Giới hạn bộ nhớ",
1096
  "SystemCheckMemoryLimitHelp": "Trên một trang web lưu lượng truy cập cao, quá trình lưu trữ có thể đòi hỏi nhiều bộ nhớ hơn so với sự cho phép hiện nay. Nếu cần thiết, thay đổi các chỉ thị memory_limit trong tập tin php.ini.",
1097
  "SystemCheckOpenURL": "Mở URL",
@@ -1103,7 +1101,6 @@
1103
  "SystemCheckPdoAndMysqliHelp": "Trên máy chủ Linux bạn có thể biên dịch php với các tùy chọn sau đây: %1$s Trong php.ini của bạn, thêm các dòng sau đây: %2$s",
1104
  "SystemCheckPhp": "Phiên bản PHP",
1105
  "SystemCheckPhpPdoAndMysqli": "Thêm thông tin về: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
1106
- "SystemCheckSplHelp": "Bạn cần cấu hình và xây dựng lại PHP với các tiêu chuẩn thư viện PHP (SPL) đã được kích hoạt (mặc định).",
1107
  "SystemCheckSummaryNoProblems": "Huzzah! Không có vấn đề xảy ra trong quá trình cài đặt Matomo của bạn.",
1108
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo đã phát hiện một số %1$s vấn đề quan trọng %2$s với cài đặt Matomo của bạn. %3$s Những vấn đề này được sửa chữa ngay lập tức.%4$s",
1109
  "SystemCheckSummaryThereWereWarnings": "Có một số vấn đề với hệ thống của bạn. Matomo sẽ chạy, nhưng bạn có thể gặp một số vấn đề nhỏ.",
1089
  "SystemCheckGlobHelp": "Các hàm nội tại đã bị vô hiệu hóa trên máy chủ của bạn. Matomo sẽ cố gắng để giả lập hàm này nhưng có thể gặp phải những hạn chế bảo mật cao hơn. Chức năng có thể bị ảnh hưởng.",
1090
  "SystemCheckGzcompressHelp": "Bạn cần bật zlib extension and gzcompress function.",
1091
  "SystemCheckGzuncompressHelp": "Bạn cần bật zlib extension and gzuncompress function.",
 
1092
  "SystemCheckMailHelp": "Feedback và thông báo mất mật khẩu sẽ không được gửi nếu thiếu mail().",
 
1093
  "SystemCheckMemoryLimit": "Giới hạn bộ nhớ",
1094
  "SystemCheckMemoryLimitHelp": "Trên một trang web lưu lượng truy cập cao, quá trình lưu trữ có thể đòi hỏi nhiều bộ nhớ hơn so với sự cho phép hiện nay. Nếu cần thiết, thay đổi các chỉ thị memory_limit trong tập tin php.ini.",
1095
  "SystemCheckOpenURL": "Mở URL",
1101
  "SystemCheckPdoAndMysqliHelp": "Trên máy chủ Linux bạn có thể biên dịch php với các tùy chọn sau đây: %1$s Trong php.ini của bạn, thêm các dòng sau đây: %2$s",
1102
  "SystemCheckPhp": "Phiên bản PHP",
1103
  "SystemCheckPhpPdoAndMysqli": "Thêm thông tin về: %1$sPHP PDO%2$s and %3$sMYSQLI%4$s.",
 
1104
  "SystemCheckSummaryNoProblems": "Huzzah! Không có vấn đề xảy ra trong quá trình cài đặt Matomo của bạn.",
1105
  "SystemCheckSummaryThereWereErrors": "Uh-oh! Matomo đã phát hiện một số %1$s vấn đề quan trọng %2$s với cài đặt Matomo của bạn. %3$s Những vấn đề này được sửa chữa ngay lập tức.%4$s",
1106
  "SystemCheckSummaryThereWereWarnings": "Có một số vấn đề với hệ thống của bạn. Matomo sẽ chạy, nhưng bạn có thể gặp một số vấn đề nhỏ.",
app/lang/zh-cn.json CHANGED
@@ -1481,7 +1481,6 @@
1481
  "ContactUs": "联系我们",
1482
  "VisitTheForums": "访问%1$s论坛%2$s并从Matomo用户社区获得帮助",
1483
  "Forums": "论坛",
1484
- "ReviewMatomoTitle": "相信Matomo?",
1485
  "PleaseLeaveExternalReviewForMatomo": "在其中一个站点上分享您的想法,并激发其他人加入我们的数据革命。",
1486
  "RemindMeLater": "稍后提醒我",
1487
  "NeverAskMeAgain": "再也不问我",
@@ -1491,7 +1490,8 @@
1491
  "RemoveOtherLabel": "我想查看我的“其他”数据",
1492
  "PurgeOldData": "我想删除一些旧数据",
1493
  "SearchHelpResources": "搜索matomo.org帮助资源",
1494
- "PopularHelpTopics": "热门帮助主题"
 
1495
  },
1496
  "GeoIp2": {
1497
  "AssumingNonApache": "没有找到apache_get_modules函数,可能没有apache网络服务器。",
@@ -1806,11 +1806,8 @@
1806
  "SystemCheckGzcompressHelp": "需要启用 zlib 扩展和 gzcompress 功能。",
1807
  "SystemCheckGzuncompressHelp": "需要启用 zlib 扩展和 gzuncompress 功能。",
1808
  "SystemCheckHashHelp": "您需要配置禁用 --disable-hash 参数并重新编译 PHP,以启用 hash() 支持。",
1809
- "SystemCheckIconvHelp": "您需要配置使用 --with-iconv 参数并重新编译 PHP,来启用“iconv”支持。",
1810
  "SystemCheckJsonHelp": "Matomo需要php-json扩展名才能读取和写入JSON数据。",
1811
  "SystemCheckMailHelp": "若沒有 mail(),意见反馈及忘记密码的信息将无法寄出。",
1812
- "SystemCheckMbstring": "mbstring",
1813
- "SystemCheckMbstringHelp": "需要mbstring扩展来处理用户界面和API响应中的多字节字符。 另外,请检查php.ini中的mbstring.func_overload是否设置为“0”。",
1814
  "SystemCheckMemoryLimit": "内存限制",
1815
  "SystemCheckMemoryLimitHelp": "在一个高流量的网站,归档过程中使用的内存可能超过当前系统的允许值。如果有需要,可以调整 php.ini 文件中的 memory_limit 值。",
1816
  "SystemCheckNoErrorsOrWarnings": "没有错误或者警告",
@@ -1826,7 +1823,6 @@
1826
  "SystemCheckPdoAndMysqliHelp": "在 GNU\/Linux 服务器上,您可以使用以下选项编译 PHP: %1$s在您的 php.ini 中 , 加入以下几行: %2$s",
1827
  "SystemCheckPhp": "PHP 版本",
1828
  "SystemCheckPhpPdoAndMysqli": "更多信息:%1$sPHP PDO%2$s 和 %3$sMYSQLI%4$s。",
1829
- "SystemCheckSplHelp": "您需要配置启用标准 PHP 库(SPL)(默认启用)并重建 PHP,以便启用 SPL。",
1830
  "SystemCheckSettings": "必要的 PHP 配置(php.ini)",
1831
  "SystemCheckSummaryNoProblems": "太好了!您的 Matomo 设置没有任何问题。为自己鼓掌!",
1832
  "SystemCheckSummaryThereWereErrors": "糟糕!Matomo 检查到您设置中的一些 %1$s严重问题%2$s,%3$s这些问题需要立即修复。%4$s",
1481
  "ContactUs": "联系我们",
1482
  "VisitTheForums": "访问%1$s论坛%2$s并从Matomo用户社区获得帮助",
1483
  "Forums": "论坛",
 
1484
  "PleaseLeaveExternalReviewForMatomo": "在其中一个站点上分享您的想法,并激发其他人加入我们的数据革命。",
1485
  "RemindMeLater": "稍后提醒我",
1486
  "NeverAskMeAgain": "再也不问我",
1490
  "RemoveOtherLabel": "我想查看我的“其他”数据",
1491
  "PurgeOldData": "我想删除一些旧数据",
1492
  "SearchHelpResources": "搜索matomo.org帮助资源",
1493
+ "PopularHelpTopics": "热门帮助主题",
1494
+ "ReferBannerTitle": "相信Matomo?"
1495
  },
1496
  "GeoIp2": {
1497
  "AssumingNonApache": "没有找到apache_get_modules函数,可能没有apache网络服务器。",
1806
  "SystemCheckGzcompressHelp": "需要启用 zlib 扩展和 gzcompress 功能。",
1807
  "SystemCheckGzuncompressHelp": "需要启用 zlib 扩展和 gzuncompress 功能。",
1808
  "SystemCheckHashHelp": "您需要配置禁用 --disable-hash 参数并重新编译 PHP,以启用 hash() 支持。",
 
1809
  "SystemCheckJsonHelp": "Matomo需要php-json扩展名才能读取和写入JSON数据。",
1810
  "SystemCheckMailHelp": "若沒有 mail(),意见反馈及忘记密码的信息将无法寄出。",
 
 
1811
  "SystemCheckMemoryLimit": "内存限制",
1812
  "SystemCheckMemoryLimitHelp": "在一个高流量的网站,归档过程中使用的内存可能超过当前系统的允许值。如果有需要,可以调整 php.ini 文件中的 memory_limit 值。",
1813
  "SystemCheckNoErrorsOrWarnings": "没有错误或者警告",
1823
  "SystemCheckPdoAndMysqliHelp": "在 GNU\/Linux 服务器上,您可以使用以下选项编译 PHP: %1$s在您的 php.ini 中 , 加入以下几行: %2$s",
1824
  "SystemCheckPhp": "PHP 版本",
1825
  "SystemCheckPhpPdoAndMysqli": "更多信息:%1$sPHP PDO%2$s 和 %3$sMYSQLI%4$s。",
 
1826
  "SystemCheckSettings": "必要的 PHP 配置(php.ini)",
1827
  "SystemCheckSummaryNoProblems": "太好了!您的 Matomo 设置没有任何问题。为自己鼓掌!",
1828
  "SystemCheckSummaryThereWereErrors": "糟糕!Matomo 检查到您设置中的一些 %1$s严重问题%2$s,%3$s这些问题需要立即修复。%4$s",
app/lang/zh-tw.json CHANGED
@@ -210,6 +210,8 @@
210
  "ExceptionWidgetNotFound": "請求的小工具不存在。",
211
  "ExceptionReportNotEnabled": "請求的報表未啟用。這代表定義報表的外掛已停用或是你沒有足夠的權限來存取這個報表。",
212
  "ExceptionWidgetNotEnabled": "請求的小工具未啟用。這代表定義小工具的外掛已停用或是你沒有足夠的權限來存取這個小工具。",
 
 
213
  "ExpandDataTableFooter": "變更報表的顯示方式或設定",
214
  "Export": "匯出",
215
  "ExportAsImage": "匯出為圖片",
@@ -673,6 +675,7 @@
673
  "ExitPagesReportDocumentation": "這份報表包含指定期間內之離開網頁的相關資訊。所謂的離開網頁,是訪客離開網頁前最後瀏覽的頁面。%s 離開網頁的網址以資料夾結構顯示。",
674
  "ExitPageTitles": "離站網頁標題",
675
  "ExitPageTitlesReportDocumentation": "此報表包含關於指定期間內離站網頁之標題等資訊",
 
676
  "OneSearch": "1 搜尋數",
677
  "OutlinkDocumentation": "離開連結是將訪客帶出網站的連結(到其他域名)。",
678
  "OutlinksReportDocumentation": "這份報表以分層列表顯示訪客所點擊的離開連結網址。",
@@ -749,7 +752,8 @@
749
  "Contents": "內容",
750
  "InteractionsMetricDocumentation": "內容區塊的互動次數(例如「點擊」橫幅或廣告)。",
751
  "ImpressionsMetricDocumentation": "內容區塊(例如橫幅或廣告)的展示次數。",
752
- "InteractionRateMetricDocumentation": "內容曝光及互動的比率。"
 
753
  },
754
  "CoreAdminHome": {
755
  "AddNewTrustedHost": "增加新的信任域名",
@@ -762,7 +766,7 @@
762
  "ClickHereToOptOut": "點擊這裡退出。",
763
  "CorsDomains": "跨來源資源共用(CORS)域名",
764
  "CorsDomainsHelp": "你可以定義像是 http:\/\/example.com 或是 http:\/\/stats.example.com 的域名或子域名。或是直接增加 * 來允許所有域名的跨來源請求。",
765
- "CustomLogoFeedbackInfo": "如果你自訂 Matomo 標誌,你應該也對隱藏上方選單中的「%1$s」連結有興趣。要那麼做的話可以在%2$s外掛管理%3$s中停用回饋外掛(Feedback)。",
766
  "CustomLogoHelpText": "你可以自訂要顯示於使用者介面或報表信件中的 Matomo 標誌。",
767
  "DevelopmentProcess": "雖然我們的開發過程包含了上千種自動化測試,但 Beta 測試員在實現 Matomo「無 Bug 政策」中扮演了關鍵角色。",
768
  "EmailServerSettings": "設定信件伺服器",
@@ -1474,7 +1478,6 @@
1474
  "ContactUs": "聯絡我們",
1475
  "VisitTheForums": "訪問%1$s論壇%2$s從社區中的 Matomo 使用者中取得協助。",
1476
  "Forums": "論壇",
1477
- "ReviewMatomoTitle": "信任 Matomo 嗎?",
1478
  "PleaseLeaveExternalReviewForMatomo": "在這些網站上分享你的評價,讓更多人加入我們的資料革命。",
1479
  "RemindMeLater": "稍後提醒我",
1480
  "NeverAskMeAgain": "別再詢問我",
@@ -1484,7 +1487,8 @@
1484
  "RemoveOtherLabel": "我想要看我的「其它」資料",
1485
  "PurgeOldData": "我想要移除一些舊資料",
1486
  "SearchHelpResources": "搜尋 matomo.org 上的幫助文件",
1487
- "PopularHelpTopics": "熱門幫助文章"
 
1488
  },
1489
  "GeoIp2": {
1490
  "AssumingNonApache": "找不到 apache_get_modules 功能,推測是非 Apache 伺服器。",
@@ -1772,11 +1776,8 @@
1772
  "SystemCheckGzcompressHelp": "你必須啟用 zlib 擴充功能和 gzcompress 功能。",
1773
  "SystemCheckGzuncompressHelp": "你必須啟用 zlib 擴充功能和 gzuncompress 功能。",
1774
  "SystemCheckHashHelp": "你必須配置並重建 PHP 經由執行 --disable-hash 選項來啟用 hash() 支援。",
1775
- "SystemCheckIconvHelp": "你需要設定及重建 PHP,然後啟用 iconv 支援,--with-iconv。",
1776
  "SystemCheckJsonHelp": "Matomo 必須使用 php-json 擴充功能來讀寫 JSON 資料。",
1777
  "SystemCheckMailHelp": "意見回饋及忘記密碼的訊息若沒有 mail() 將無法寄送。",
1778
- "SystemCheckMbstring": "mbstring",
1779
- "SystemCheckMbstringHelp": "處理多字節的使用者介面或 API 回應資料必須使用 mbstring 擴充功能。並請檢查 php.ini 中的 mbstring.func_overload 已將值設定為「0」。",
1780
  "SystemCheckMemoryLimit": "記憶體限制",
1781
  "SystemCheckMemoryLimitHelp": "在一個高流量的網站,資料彙整處理過程可能超過目前所允許使用的記憶體量。<br \/>如果必要,試著變更在你 php.ini 檔案裡的 memory_limit。",
1782
  "SystemCheckMemoryNoMemoryLimitSet": "尚未設定記憶體限制。",
@@ -1793,7 +1794,7 @@
1793
  "SystemCheckPdoAndMysqliHelp": "在 GNU\/Linux 伺服器上你可以使用以下選項編譯 PHP:在你的 php.ini 中 %1$s,加入以下幾行內容:%2$s",
1794
  "SystemCheckPhp": "PHP 版本",
1795
  "SystemCheckPhpPdoAndMysqli": "更多資訊:%1$sPHP PDO%2$s 和 %3$sMYSQLI%4$s。",
1796
- "SystemCheckSplHelp": "你需要設定及重建 PHP,然後啟用 Standard PHP Library (SPL)(預設啟用)。",
1797
  "SystemCheckSettings": "必要的 PHP 設定(php.ini)",
1798
  "SystemCheckSummaryNoProblems": "好極了!Matomo 安裝過程中沒有問題!給自己掌聲鼓勵吧。",
1799
  "SystemCheckSummaryThereWereErrors": "啊噢!Matomo 在安裝過程中偵測到一些%1$s嚴重問題%2$s。%3$s這些問題必須立即被修正。%4$s",
@@ -3783,8 +3784,12 @@
3783
  },
3784
  "TwoFactorAuth": {
3785
  "TwoFactorAuthentication": "兩步驟驗證",
 
3786
  "TwoFactorAuthenticationIsEnabled": "已啟用兩步驟驗證。",
3787
- "TwoFactorAuthenticationIsDisabled": "已停用兩步驟驗證。"
 
 
 
3788
  },
3789
  "UserCountry": {
3790
  "CannotLocalizeLocalIP": "IP 位址 %s 是本機位址因此無法顯示地理位置。",
@@ -3865,6 +3870,7 @@
3865
  "getLanguageCodeDocumentation": "這份報表顯示你的訪客使用的瀏覽器語言代號設定 (例如「德文 - 奧地利 (de-at)」)。"
3866
  },
3867
  "UsersManager": {
 
3868
  "UsesTwoFactorAuthentication": "使用兩步驟驗證",
3869
  "TwoFactorAuthentication": "兩步驟驗證",
3870
  "ResetTwoFactorAuthentication": "重置兩步驟驗證",
210
  "ExceptionWidgetNotFound": "請求的小工具不存在。",
211
  "ExceptionReportNotEnabled": "請求的報表未啟用。這代表定義報表的外掛已停用或是你沒有足夠的權限來存取這個報表。",
212
  "ExceptionWidgetNotEnabled": "請求的小工具未啟用。這代表定義小工具的外掛已停用或是你沒有足夠的權限來存取這個小工具。",
213
+ "ExceptionNotSupportedBrowserTitle": "你的瀏覽器已不受支援。",
214
+ "ExceptionNotSupportedBrowserText": "因為安全性問題,你的瀏覽器已不受支援。請升級至更新的版本。",
215
  "ExpandDataTableFooter": "變更報表的顯示方式或設定",
216
  "Export": "匯出",
217
  "ExportAsImage": "匯出為圖片",
675
  "ExitPagesReportDocumentation": "這份報表包含指定期間內之離開網頁的相關資訊。所謂的離開網頁,是訪客離開網頁前最後瀏覽的頁面。%s 離開網頁的網址以資料夾結構顯示。",
676
  "ExitPageTitles": "離站網頁標題",
677
  "ExitPageTitlesReportDocumentation": "此報表包含關於指定期間內離站網頁之標題等資訊",
678
+ "MainMetricsReportDocumentation": "這份報表提供了訪客在你的網站上的基本活動概觀。",
679
  "OneSearch": "1 搜尋數",
680
  "OutlinkDocumentation": "離開連結是將訪客帶出網站的連結(到其他域名)。",
681
  "OutlinksReportDocumentation": "這份報表以分層列表顯示訪客所點擊的離開連結網址。",
752
  "Contents": "內容",
753
  "InteractionsMetricDocumentation": "內容區塊的互動次數(例如「點擊」橫幅或廣告)。",
754
  "ImpressionsMetricDocumentation": "內容區塊(例如橫幅或廣告)的展示次數。",
755
+ "InteractionRateMetricDocumentation": "內容曝光及互動的比率。",
756
+ "ContentsSubcategoryHelp2": "前往內容追蹤說明內了解更多"
757
  },
758
  "CoreAdminHome": {
759
  "AddNewTrustedHost": "增加新的信任域名",
766
  "ClickHereToOptOut": "點擊這裡退出。",
767
  "CorsDomains": "跨來源資源共用(CORS)域名",
768
  "CorsDomainsHelp": "你可以定義像是 http:\/\/example.com 或是 http:\/\/stats.example.com 的域名或子域名。或是直接增加 * 來允許所有域名的跨來源請求。",
769
+ "CustomLogoFeedbackInfo": "如果你自訂 Matomo 標誌,你應該也對隱藏上方選單中的 %1$s 連結有興趣。要那麼做的話可以在%2$s外掛管理%3$s中停用回饋外掛(Feedback)。",
770
  "CustomLogoHelpText": "你可以自訂要顯示於使用者介面或報表信件中的 Matomo 標誌。",
771
  "DevelopmentProcess": "雖然我們的開發過程包含了上千種自動化測試,但 Beta 測試員在實現 Matomo「無 Bug 政策」中扮演了關鍵角色。",
772
  "EmailServerSettings": "設定信件伺服器",
1478
  "ContactUs": "聯絡我們",
1479
  "VisitTheForums": "訪問%1$s論壇%2$s從社區中的 Matomo 使用者中取得協助。",
1480
  "Forums": "論壇",
 
1481
  "PleaseLeaveExternalReviewForMatomo": "在這些網站上分享你的評價,讓更多人加入我們的資料革命。",
1482
  "RemindMeLater": "稍後提醒我",
1483
  "NeverAskMeAgain": "別再詢問我",
1487
  "RemoveOtherLabel": "我想要看我的「其它」資料",
1488
  "PurgeOldData": "我想要移除一些舊資料",
1489
  "SearchHelpResources": "搜尋 matomo.org 上的幫助文件",
1490
+ "PopularHelpTopics": "熱門幫助文章",
1491
+ "ReferBannerTitle": "信任 Matomo 嗎?"
1492
  },
1493
  "GeoIp2": {
1494
  "AssumingNonApache": "找不到 apache_get_modules 功能,推測是非 Apache 伺服器。",
1776
  "SystemCheckGzcompressHelp": "你必須啟用 zlib 擴充功能和 gzcompress 功能。",
1777
  "SystemCheckGzuncompressHelp": "你必須啟用 zlib 擴充功能和 gzuncompress 功能。",
1778
  "SystemCheckHashHelp": "你必須配置並重建 PHP 經由執行 --disable-hash 選項來啟用 hash() 支援。",
 
1779
  "SystemCheckJsonHelp": "Matomo 必須使用 php-json 擴充功能來讀寫 JSON 資料。",
1780
  "SystemCheckMailHelp": "意見回饋及忘記密碼的訊息若沒有 mail() 將無法寄送。",
 
 
1781
  "SystemCheckMemoryLimit": "記憶體限制",
1782
  "SystemCheckMemoryLimitHelp": "在一個高流量的網站,資料彙整處理過程可能超過目前所允許使用的記憶體量。<br \/>如果必要,試著變更在你 php.ini 檔案裡的 memory_limit。",
1783
  "SystemCheckMemoryNoMemoryLimitSet": "尚未設定記憶體限制。",
1794
  "SystemCheckPdoAndMysqliHelp": "在 GNU\/Linux 伺服器上你可以使用以下選項編譯 PHP:在你的 php.ini 中 %1$s,加入以下幾行內容:%2$s",
1795
  "SystemCheckPhp": "PHP 版本",
1796
  "SystemCheckPhpPdoAndMysqli": "更多資訊:%1$sPHP PDO%2$s 和 %3$sMYSQLI%4$s。",
1797
+ "SystemCheckSessionHelp": "你必須開啟「session」功能並設定及重新建置 PHP (不要使用 --disable-session)",
1798
  "SystemCheckSettings": "必要的 PHP 設定(php.ini)",
1799
  "SystemCheckSummaryNoProblems": "好極了!Matomo 安裝過程中沒有問題!給自己掌聲鼓勵吧。",
1800
  "SystemCheckSummaryThereWereErrors": "啊噢!Matomo 在安裝過程中偵測到一些%1$s嚴重問題%2$s。%3$s這些問題必須立即被修正。%4$s",
3784
  },
3785
  "TwoFactorAuth": {
3786
  "TwoFactorAuthentication": "兩步驟驗證",
3787
+ "TwoFAShort": "2FA",
3788
  "TwoFactorAuthenticationIsEnabled": "已啟用兩步驟驗證。",
3789
+ "TwoFactorAuthenticationIsDisabled": "已停用兩步驟驗證。",
3790
+ "TwoFactorAuthenticationRequired": "所有人都需要開啟兩步驟驗證,你不能關閉。",
3791
+ "ConfigureDifferentDevice": "設定另一台裝置",
3792
+ "SetUpTwoFactorAuthentication": "開始設定兩步驟驗證 (2FA)"
3793
  },
3794
  "UserCountry": {
3795
  "CannotLocalizeLocalIP": "IP 位址 %s 是本機位址因此無法顯示地理位置。",
3870
  "getLanguageCodeDocumentation": "這份報表顯示你的訪客使用的瀏覽器語言代號設定 (例如「德文 - 奧地利 (de-at)」)。"
3871
  },
3872
  "UsersManager": {
3873
+ "2FA": "2FA",
3874
  "UsesTwoFactorAuthentication": "使用兩步驟驗證",
3875
  "TwoFactorAuthentication": "兩步驟驗證",
3876
  "ResetTwoFactorAuthentication": "重置兩步驟驗證",
app/libs/Zend/Db/Adapter/Mysqli.php CHANGED
@@ -313,6 +313,7 @@ class Zend_Db_Adapter_Mysqli extends Zend_Db_Adapter_Abstract
313
  if(array_key_exists($option, $ssl_options)) {
314
  $ssl_options[$option] = $value;
315
  $enable_ssl = true;
 
316
  } elseif(is_string($option)) {
317
  // Suppress warnings here
318
  // Ignore it if it's not a valid constant
313
  if(array_key_exists($option, $ssl_options)) {
314
  $ssl_options[$option] = $value;
315
  $enable_ssl = true;
316
+ continue; // these options are set below in mysqli_ssl_set
317
  } elseif(is_string($option)) {
318
  // Suppress warnings here
319
  // Ignore it if it's not a valid constant
app/libs/upgradephp/upgrade.php CHANGED
@@ -673,32 +673,6 @@ if (!function_exists('utf8_decode')) {
673
  }
674
  }
675
 
676
- /**
677
- * Use strtolower if mb_strtolower doesn't exist (i.e., php not compiled with --enable-mbstring)
678
- * This is not a functional replacement for mb_strtolower.
679
- *
680
- * @param string $input
681
- * @param string $charset
682
- */
683
- if(!function_exists('mb_strtolower')) {
684
- function mb_strtolower($input, $charset = '') {
685
- return strtolower($input);
686
- }
687
- }
688
-
689
- /**
690
- * Use strlen if mb_strlen doesn't exist (i.e., php not compiled with --enable-mbstring)
691
- * This is not a functional replacement for mb_strlen.
692
- *
693
- * @param string $input
694
- * @param string $charset
695
- */
696
- if(!function_exists('mb_strlen')) {
697
- function mb_strlen($input, $charset = '') {
698
- return strlen($input);
699
- }
700
- }
701
-
702
  /**
703
  * On ubuntu in some cases, there is a bug that gzopen does not exist and one must use gzopen64 instead
704
  */
673
  }
674
  }
675
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
676
  /**
677
  * On ubuntu in some cases, there is a bug that gzopen does not exist and one must use gzopen64 instead
678
  */
app/matomo.js CHANGED
@@ -28,42 +28,42 @@ ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.fin
28
  }}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(S.innerWidth&&ap>S.innerWidth){ap=S.innerWidth}var ao=ar.clientHeight;if(S.innerHeight&&ao>S.innerHeight){ao=S.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=i(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+s(ao)}if(ap){if(at){at+="&"}at+="c_n="+s(ap)}if(aq){if(at){at+="&"}at+="c_p="+s(aq)}if(ar){if(at){at+="&"}at+="c_t="+s(ar)}if(at){at+="&ca=1"}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+s(ao)+"&c_p="+s(ap);if(aq){ar+="&c_t="+s(aq)
29
  }if(ar){ar+="&ca=1"}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||S.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap
30
  }if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(ao){if(ae.hasNodeAttribute(ao,this.CONTENT_IGNOREINTERACTION_ATTR)){return true}if(ae.hasNodeCssClass(ao,this.CONTENT_IGNOREINTERACTION_CLASS)){return true}if(ae.hasNodeCssClass(ao,this.LEGACY_CONTENT_IGNOREINTERACTION_CLASS)){return true}return false}};function W(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(Q(ap,"matomo.php")){ap=f(ap,"matomo.php".length)
31
- }else{if(Q(ap,"piwik.php")){ap=f(ap,"piwik.php".length)}else{if(Q(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(Q(ap,"/js/")){ap=f(ap,"js/".length)}return ap}function N(av){var ax="Matomo_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}S.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=S.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,av,aq){var au=S.name.split("###"),at=au[1],ao=au[2],ar=au[3],aw=W(ap,av);n(aw+"plugins/Overlay/client/client.js?v=1",function(){Matomo_Overlay_Client.initialize(aw,aq,at,ao,ar)})}function u(){var aq;try{aq=S.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return S.self!==S.top
32
- }catch(ao){return true}}function P(ce,ca){var bK=this,be="mtm_consent",cE="mtm_cookie_consent",cN="mtm_consent_removed",b5=aa(G.domain,S.location.href,K()),cV=L(b5[0]),bO=o(b5[1]),bp=o(b5[2]),cT=false,ci="GET",da=ci,aI="application/x-www-form-urlencoded; charset=UTF-8",cx=aI,aE=ce||"",bJ="",c0="",b7=ca||"",bA="",bP="",a5,bk="",c7=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","rtf","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ay=[cV],bB=[],bM=[],a9=[],bL=500,cX=true,cK,a6,bS,bQ,ao,cp=["pk_campaign","mtm_campaign","piwik_campaign","matomo_campaign","utm_campaign","utm_source","utm_medium"],bI=["pk_kwd","mtm_kwd","piwik_kwd","matomo_kwd","utm_term"],bl="_pk_",av="pk_vid",a0=180,cY,br,bT=false,aJ="Lax",bn=false,cR,bf,bx,cL=33955200000,cn=1800000,c6=15768000000,a3=true,bG=false,bi=false,bR=false,aR=false,cc,bX={},cm={},bo={},bv=200,ct={},c1={},c8={},cb=[],cf=false,cC=false,ap=false,c9=false,cO=false,aO=false,bd=u(),cy=null,cZ=null,aS,bC,b8=am,bq,aM,cq=0,bw=["id","ses","cvar","ref"],cB=false,bD=null,cM=[],cs=[],ax=T++,aw=false;
33
- try{bk=G.title}catch(cz){bk=""}function de(dr,dp,dn,dq,dm,dl,dk){if(bn&&dr!==cN){return}var dj;if(dn){dj=new Date();dj.setTime(dj.getTime()+dn)}if(!dk){dk="Lax"}G.cookie=dr+"="+s(dp)+(dn?";expires="+dj.toGMTString():"")+";path="+(dq||"/")+(dm?";domain="+dm:"")+(dl?";secure":"")+";SameSite="+dk}function aD(dl){if(bn){return 0}var dj=new RegExp("(^|;)[ ]*"+dl+"=([^;]*)"),dk=dj.exec(G.cookie);return dk?R(dk[2]):0}bD=!aD(cN);function b3(dj){var dk;dj=j(dj,av);if(bQ){dk=new RegExp("#.*");return dj.replace(dk,"")}return dj}function bW(dl,dj){var dm=r(dj),dk;if(dm){return dj}if(dj.slice(0,1)==="/"){return r(dl)+"://"+d(dl)+dj}dl=b3(dl);dk=dl.indexOf("?");if(dk>=0){dl=dl.slice(0,dk)}dk=dl.lastIndexOf("/");if(dk!==dl.length-1){dl=dl.slice(0,dk+1)}return dl+dj}function cI(dl,dj){var dk;dl=String(dl).toLowerCase();dj=String(dj).toLowerCase();if(dl===dj){return true}if(dj.slice(0,1)==="."){if(dl===dj.slice(1)){return true}dk=dl.length-dj.length;if((dk>0)&&(dl.slice(dk)===dj)){return true}}return false
34
- }function cl(dj){var dk=document.createElement("a");if(dj.indexOf("//")!==0&&dj.indexOf("http")!==0){if(dj.indexOf("*")===0){dj=dj.substr(1)}if(dj.indexOf(".")===0){dj=dj.substr(1)}dj="http://"+dj}dk.href=v.toAbsoluteUrl(dj);if(dk.pathname){return dk.pathname}return""}function a4(dk,dj){if(!aj(dj,"/")){dj="/"+dj}if(!aj(dk,"/")){dk="/"+dk}var dl=(dj==="/"||dj==="/*");if(dl){return true}if(dk===dj){return true}dj=String(dj).toLowerCase();dk=String(dk).toLowerCase();if(Q(dj,"*")){dj=dj.slice(0,-1);dl=(!dj||dj==="/");if(dl){return true}if(dk===dj){return true}return dk.indexOf(dj)===0}if(!Q(dk,"/")){dk+="/"}if(!Q(dj,"/")){dj+="/"}return dk.indexOf(dj)===0}function ar(dn,dq){var dk,dj,dl,dm,dp;for(dk=0;dk<ay.length;dk++){dm=L(ay[dk]);dp=cl(ay[dk]);if(cI(dn,dm)&&a4(dq,dp)){return true}}return false}function aW(dm){var dk,dj,dl;for(dk=0;dk<ay.length;dk++){dj=L(ay[dk].toLowerCase());if(dm===dj){return true}if(dj.slice(0,1)==="."){if(dm===dj.slice(1)){return true}dl=dm.length-dj.length;if((dl>0)&&(dm.slice(dl)===dj)){return true
35
- }}}return false}function co(dj,dl){dj=dj.replace("send_image=0","send_image=1");var dk=new Image(1,1);dk.onload=function(){E=0;if(typeof dl==="function"){dl({request:dj,trackerUrl:aE,success:true})}};dk.onerror=function(){if(typeof dl==="function"){dl({request:dj,trackerUrl:aE,success:false})}};dk.src=aE+(aE.indexOf("?")<0?"?":"&")+dj}function cF(dj){if(da==="POST"){return true}return dj&&(dj.length>2000||dj.indexOf('{"requests"')===0)}function aL(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function a7(dn,dr,dq){var dl=aL();if(!dl){return false}var dm={type:"application/x-www-form-urlencoded; charset=UTF-8"};var ds=false;var dk=aE;try{var dj=new Blob([dn],dm);if(dq&&!cF(dn)){dj=new Blob([],dm);dk=dk+(dk.indexOf("?")<0?"?":"&")+dn}ds=g.sendBeacon(dk,dj)}catch(dp){return false}if(ds&&typeof dr==="function"){dr({request:dn,trackerUrl:aE,success:true,isSendBeacon:true})}return ds}function c5(dk,dl,dj){if(!J(dj)||null===dj){dj=true}if(l&&a7(dk,dl,dj)){return
36
- }setTimeout(function(){if(l&&a7(dk,dl,dj)){return}var dp;try{var dn=S.XMLHttpRequest?new S.XMLHttpRequest():S.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dn.open("POST",aE,true);dn.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dq=l&&a7(dk,dl,dj);if(!dq&&dj){co(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aE,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dl==="function")){dl({request:dk,trackerUrl:aE,success:true,xhr:this})}}};dn.setRequestHeader("Content-Type",cx);dn.withCredentials=true;dn.send(dk)}catch(dm){dp=l&&a7(dk,dl,dj);if(!dp&&dj){co(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aE,success:false})}}}},50)}function cg(dk){var dj=new Date();var dl=dj.getTime()+dk;if(!q||dl>q){q=dl}}function bb(){bd=true;cy=new Date().getTime()}function dd(){var dj=new Date().getTime();return !cy||(dj-cy)>a6}function az(){if(dd()){bS()}}function dg(){if(aO||!a6){return}aO=true;an(S,"focus",bb);
37
- an(S,"blur",az);ab++;t.addPlugin("HeartBeat"+ab,{unload:function(){if(aO&&dd()){bS()}}})}function cD(dn){var dk=new Date();var dj=dk.getTime();cZ=dj;if(cC&&dj<cC){var dl=cC-dj;setTimeout(dn,dl);cg(dl+50);cC+=50;return}if(cC===false){var dm=800;cC=dj+dm}dn()}function aP(){if(aD(cN)){bD=false}else{if(aD(be)){bD=true}}}function bH(dk,dj,dl){aP();if(!bD){cM.push(dk);return}aw=true;if(!cR&&dk){if(cB&&bD){dk+="&consent=1"}cD(function(){if(cX&&a7(dk,dl,true)){cg(100);return}if(cF(dk)){c5(dk,dl)}else{co(dk,dl)}cg(dj)})}if(!aO){dg()}}function ck(dj){if(cR){return false}return(dj&&dj.length)}function c4(dj,dn){if(!dn||dn>=dj.length){return[dj]}var dk=0;var dl=dj.length;var dm=[];for(dk;dk<dl;dk+=dn){dm.push(dj.slice(dk,dk+dn))}return dm}function df(dk,dj){if(!ck(dk)){return}if(!bD){cM.push(dk);return}aw=true;cD(function(){var dn=c4(dk,50);var dl=0,dm;for(dl;dl<dn.length;dl++){dm='{"requests":["?'+dn[dl].join('","?')+'"],"send_image":0}';if(cX&&a7(dm,null,false)){cg(100)}else{c5(dm,null,false)}}cg(dj)
38
- })}function aU(dj){return bl+dj+"."+b7+"."+bq}function bZ(dl,dk,dj){de(dl,"",-86400,dk,dj)}function b6(){if(bn){return"0"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){return g.cookieEnabled?"1":"0"}var dj=bl+"testcookie";de(dj,"1",undefined,br,cY,bT,aJ);var dk=aD(dj)==="1"?"1":"0";bZ(dj);return dk}function bj(){bq=b8((cY||cV)+(br||"/")).slice(0,4)}function cJ(){if(J(c8.res)){return c8}var dk,dm,dn={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",fla:"application/x-shockwave-flash",java:"application/x-java-vm",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(g.userAgent))){if(g.mimeTypes&&g.mimeTypes.length){for(dk in dn){if(Object.prototype.hasOwnProperty.call(dn,dk)){dm=g.mimeTypes[dn[dk]];c8[dk]=(dm&&dm.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(g.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(g.javaEnabled)&&g.javaEnabled()){c8.java="1"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){c8.cookie=g.cookieEnabled?"1":"0"
39
- }else{c8.cookie=b6()}}var dl=parseInt(X.width,10);var dj=parseInt(X.height,10);c8.res=parseInt(dl,10)+"x"+parseInt(dj,10);return c8}function bY(){var dk=aU("cvar"),dj=aD(dk);if(dj&&dj.length){dj=S.JSON.parse(dj);if(V(dj)){return dj}}return{}}function cG(){if(aR===false){aR=bY()}}function cS(){var dj=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dj)+(new Date()).getTime()+Math.random()).slice(0,16)}function aB(){var dj=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dj)).slice(0,6)}function bg(){return Math.floor((new Date()).getTime()/1000)}function aK(){var dk=bg();var dl=aB();var dj=String(dk)+dl;return dj}function c3(dl){dl=String(dl);var dp=aB();var dm=dp.length;var dn=dl.substr(-1*dm,dm);var dk=parseInt(dl.substr(0,dl.length-dm),10);if(dk&&dn&&dn===dp){var dj=bg();if(a0<=0){return true}if(dj>=dk&&dj<=(dk+a0)){return true}}return false}function dh(dj){if(!cO){return""}var dn=e(dj,av);if(!dn){return""}dn=String(dn);var dl=new RegExp("^[a-zA-Z0-9]+$");
40
- if(dn.length===32&&dl.test(dn)){var dk=dn.substr(16,32);if(c3(dk)){var dm=dn.substr(0,16);return dm}}return""}function cP(){if(!bP){bP=dh(bO)}var dl=new Date(),dj=Math.round(dl.getTime()/1000),dk=aU("id"),dp=aD(dk),dn,dm;if(dp){dn=dp.split(".");dn.unshift("0");if(bP.length){dn[1]=bP}return dn}if(bP.length){dm=bP}else{if("0"===b6()){dm=""}else{dm=cS()}}dn=["1",dm,dj];return dn}function aZ(){var dm=cP(),dk=dm[0],dl=dm[1],dj=dm[2];return{newVisitor:dk,uuid:dl,createTs:dj}}function aH(){var dm=new Date(),dk=dm.getTime(),dn=aZ().createTs;var dj=parseInt(dn,10);var dl=(dj*1000)+cL-dk;return dl}function aN(dj){if(!b7){return}var dl=new Date(),dk=Math.round(dl.getTime()/1000);if(!J(dj)){dj=aZ()}var dm=dj.uuid+"."+dj.createTs+".";de(aU("id"),dm,aH(),br,cY,bT,aJ)}function bN(){var dj=aD(aU("ref"));if(dj.length){try{dj=S.JSON.parse(dj);if(V(dj)){return dj}}catch(dk){}}return["","",0,""]}function by(dl){var dk=bl+"testcookie_domain";var dj="testvalue";de(dk,dj,10000,null,dl,bT,aJ);if(aD(dk)===dj){bZ(dk,null,dl);
41
- return true}return false}function aF(){var dk=bn;bn=false;var dj,dl;for(dj=0;dj<bw.length;dj++){dl=aU(bw[dj]);if(dl!==cN&&dl!==be&&0!==aD(dl)){bZ(dl,br,cY)}}bn=dk}function b4(dj){b7=dj}function di(dn){if(!dn||!V(dn)){return}var dm=[];var dl;for(dl in dn){if(Object.prototype.hasOwnProperty.call(dn,dl)){dm.push(dl)}}var dp={};dm.sort();var dj=dm.length;var dk;for(dk=0;dk<dj;dk++){dp[dm[dk]]=dn[dm[dk]]}return dp}function cd(){de(aU("ses"),"1",cn,br,cY,bT,aJ)}function bh(){var dm="";var dk="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dl=dk.length;var dj;for(dj=0;dj<6;dj++){dm+=dk.charAt(Math.floor(Math.random()*dl))}return dm}function aA(dk){if(!h){return dk}var dl=(typeof h.timing==="object")&&h.timing?h.timing:undefined;if(!dl){dl=(typeof h.getEntriesByType==="function")&&h.getEntriesByType("navigation")?h.getEntriesByType("navigation")[0]:undefined}if(!dl){return dk}var dj="";if(dl.connectEnd&&dl.fetchStart){if(dl.connectEnd<dl.fetchStart){return}dj+="&pf_net="+Math.round(dl.connectEnd-dl.fetchStart)
42
- }if(dl.responseStart&&dl.requestStart){if(dl.responseStart<dl.requestStart){return}dj+="&pf_srv="+Math.round(dl.responseStart-dl.requestStart)}if(dl.responseStart&&dl.responseEnd){if(dl.responseEnd<dl.responseStart){return}dj+="&pf_tfr="+Math.round(dl.responseEnd-dl.responseStart)}if(J(dl.domLoading)){if(dl.domInteractive&&dl.domLoading){if(dl.domInteractive<dl.domLoading){return}dj+="&pf_dm1="+Math.round(dl.domInteractive-dl.domLoading)}}else{if(dl.domInteractive&&dl.responseEnd){if(dl.domInteractive<dl.responseEnd){return}dj+="&pf_dm1="+Math.round(dl.domInteractive-dl.responseEnd)}}if(dl.domComplete&&dl.domInteractive){if(dl.domComplete<dl.domInteractive){return}dj+="&pf_dm2="+Math.round(dl.domComplete-dl.domInteractive)}if(dl.loadEventEnd&&dl.loadEventStart){if(dl.loadEventEnd<dl.loadEventStart){return}dj+="&pf_onl="+Math.round(dl.loadEventEnd-dl.loadEventStart)}return dk+dj}function cr(dl,dG,dH){var dF,dk=new Date(),dt=Math.round(dk.getTime()/1000),dq,dD,dm=1024,dM,du,dC=aR,dn=aU("ses"),dA=aU("ref"),dx=aU("cvar"),dy=aD(dn),dE=bN(),dI=a5||bO,dr,dj;
43
- if(bn){aF()}if(cR){return""}var dz=aZ();var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dE[0];dj=dE[1];dq=dE[2];dD=dE[3];if(!dy){if(!bx||!dr.length){for(dF in cp){if(Object.prototype.hasOwnProperty.call(cp,dF)){dr=e(dI,cp[dF]);if(dr.length){break}}}for(dF in bI){if(Object.prototype.hasOwnProperty.call(bI,dF)){dj=e(dI,bI[dF]);if(dj.length){break}}}}dM=d(bp);du=dD.length?d(dD):"";if(dM.length&&!aW(dM)&&(!bx||!du.length||aW(du))){dD=bp}if(dD.length||dr.length){dq=dt;dE=[dr,dj,dq,b3(dD.slice(0,dm))];de(dA,S.JSON.stringify(dE),c6,br,cY,bT,aJ)}}dl+="&idsite="+b7+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dk.getHours()+"&m="+dk.getMinutes()+"&s="+dk.getSeconds()+"&url="+s(b3(dI))+(bp.length?"&urlref="+s(b3(bp)):"")+(Y(bA)?"&uid="+s(bA):"")+"&_id="+dz.uuid+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+s(dr):"")+(dj.length?"&_rck="+s(dj):"")+"&_refts="+dq+(String(dD).length?"&_ref="+s(b3(dD.slice(0,dm))):"")+(dw?"&cs="+s(dw):"")+"&send_image=0";var dL=cJ();for(dF in dL){if(Object.prototype.hasOwnProperty.call(dL,dF)){dl+="&"+dF+"="+dL[dF]
44
- }}var dK=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dK.push(parseInt(dp,10));dK.push(String(dp));dl+="&"+dF+"="+s(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in ct){if(Object.prototype.hasOwnProperty.call(ct,dF)){dl+="&"+dF+"="+s(ct[dF])}}for(dF in bo){if(Object.prototype.hasOwnProperty.call(bo,dF)){var dv=(-1===M(dK,dF));if(dv){dl+="&dimension"+dF+"="+s(bo[dF])}}}if(dG){dl+="&data="+s(S.JSON.stringify(dG))}else{if(ao){dl+="&data="+s(S.JSON.stringify(ao))}}function ds(dN,dO){var dP=S.JSON.stringify(dN);if(dP.length>2){return"&"+dO+"="+s(dP)}return""}var dJ=di(bX);var dB=di(cm);dl+=ds(dJ,"cvar");dl+=ds(dB,"e_cvar");if(aR){dl+=ds(aR,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aR[dF][0]===""||aR[dF][1]===""){delete aR[dF]}}}if(bR){de(dx,S.JSON.stringify(aR),cn,br,cY,bT,aJ)}}if(a3&&bG&&!bi){dl=aA(dl);bi=true}if(aM){dl+="&pv_id="+aM}aN(dz);cd();dl+=ac(dH,{tracker:bK,request:dl});
45
- if(c0.length){dl+="&"+c0}if(A(cc)){dl=cc(dl)}return dl}bS=function a8(){var dj=new Date();dj=dj.getTime();if(!cZ){return false}if(cZ+a6<=dj){bK.ping();return true}return false};function bs(dm,dl,dr,dn,dj,du){var dq="idgoal=0",dk=new Date(),ds=[],dt,dp=String(dm).length;if(dp){dq+="&ec_id="+s(dm)}dq+="&revenue="+dl;if(String(dr).length){dq+="&ec_st="+dr}if(String(dn).length){dq+="&ec_tx="+dn}if(String(dj).length){dq+="&ec_sh="+dj}if(String(du).length){dq+="&ec_dt="+du}if(c1){for(dt in c1){if(Object.prototype.hasOwnProperty.call(c1,dt)){if(!J(c1[dt][1])){c1[dt][1]=""}if(!J(c1[dt][2])){c1[dt][2]=""}if(!J(c1[dt][3])||String(c1[dt][3]).length===0){c1[dt][3]=0}if(!J(c1[dt][4])||String(c1[dt][4]).length===0){c1[dt][4]=1}ds.push(c1[dt])}}dq+="&ec_items="+s(S.JSON.stringify(ds))}dq=cr(dq,ao,"ecommerce");bH(dq,bL);if(dp){c1={}}}function b0(dj,dn,dm,dl,dk,dp){if(String(dj).length&&J(dn)){bs(dj,dn,dm,dl,dk,dp)}}function bu(dj){if(J(dj)){bs("",dj,"","","","")}}function b1(dk,dm,dl){aM=bh();var dj=cr("action_name="+s(al(dk||bk)),dm,"log");
46
- if(a3&&!bi){dj=aA(dj)}bH(dj,bL,dl)}function a1(dl,dk){var dm,dj="(^| )(piwik[_-]"+dk+"|matomo[_-]"+dk;if(dl){for(dm=0;dm<dl.length;dm++){dj+="|"+dl[dm]}}dj+=")( |$)";return new RegExp(dj)}function aV(dj){return(aE&&dj&&0===String(dj).indexOf(aE))}function cv(dn,dj,dp,dk){if(aV(dj)){return 0}var dm=a1(bM,"download"),dl=a1(a9,"link"),dq=new RegExp("\\.("+c7.join("|")+")([?&#]|$)","i");if(dl.test(dn)){return"link"}if(dk||dm.test(dn)||dq.test(dj)){return"download"}if(dp){return 0}return"link"}function au(dk){var dj;dj=dk.parentNode;while(dj!==null&&J(dj)){if(ae.isLinkElement(dk)){break}dk=dj;dj=dk.parentNode}return dk}function dc(dp){dp=au(dp);if(!ae.hasNodeAttribute(dp,"href")){return}if(!J(dp.href)){return}var dn=ae.getAttributeValueFromNode(dp,"href");var dk=dp.pathname||cl(dp.href);var dq=dp.hostname||d(dp.href);var dr=dq.toLowerCase();var dl=dp.href.replace(dq,dr);var dm=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dm.test(dl)){var dj=cv(dp.className,dl,ar(dr,dk),ae.hasNodeAttribute(dp,"download"));
47
- if(dj){return{type:dj,href:dl}}}}function aQ(dj,dk,dl,dm){var dn=v.buildInteractionRequestParams(dj,dk,dl,dm);if(!dn){return}return cr(dn,null,"contentInteraction")}function bc(dj,dk){if(!dj||!dk){return false}var dl=v.findTargetNode(dj);if(v.shouldIgnoreInteraction(dl)){return false}dl=v.findTargetNodeNoDefault(dj);if(dl&&!U(dl,dk)){return false}return true}function cu(dl,dk,dn){if(!dl){return}var dj=v.findParentContentNode(dl);if(!dj){return}if(!bc(dj,dl)){return}var dm=v.buildContentBlock(dj);if(!dm){return}if(!dm.target&&dn){dm.target=dn}return v.buildInteractionRequestParams(dk,dm.name,dm.piece,dm.target)}function aX(dk){if(!cb||!cb.length){return false}var dj,dl;for(dj=0;dj<cb.length;dj++){dl=cb[dj];if(dl&&dl.name===dk.name&&dl.piece===dk.piece&&dl.target===dk.target){return true}}return false}function aY(dj){return function(dn){if(!dj){return}var dl=v.findParentContentNode(dj);var dk;if(dn){dk=dn.target||dn.srcElement}if(!dk){dk=dj}if(!bc(dl,dk)){return}if(!dl){return false}var dp=v.findTargetNode(dl);
48
- if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dm=dc(dp);if(c9&&dm&&dm.type){return dm.type}return bK.trackContentInteractionNode(dk,"click")}}function b2(dl){if(!dl||!dl.length){return}var dj,dk;for(dj=0;dj<dl.length;dj++){dk=v.findTargetNode(dl[dj]);if(dk&&!dk.contentInteractionTrackingSetupDone){dk.contentInteractionTrackingSetupDone=true;an(dk,"click",aY(dk))}}}function bz(dl,dm){if(!dl||!dl.length){return[]}var dj,dk;for(dj=0;dj<dl.length;dj++){if(aX(dl[dj])){dl.splice(dj,1);dj--}else{cb.push(dl[dj])}}if(!dl||!dl.length){return[]}b2(dm);var dn=[];for(dj=0;dj<dl.length;dj++){dk=cr(v.buildImpressionRequestParams(dl[dj].name,dl[dj].piece,dl[dj].target),undefined,"contentImpressions");if(dk){dn.push(dk)}}return dn}function cA(dk){var dj=v.collectContent(dk);return bz(dj,dk)}function ba(dk){if(!dk||!dk.length){return[]}var dj;for(dj=0;dj<dk.length;dj++){if(!v.isNodeVisible(dk[dj])){dk.splice(dj,1);dj--}}if(!dk||!dk.length){return[]}return cA(dk)}function aG(dl,dj,dk){var dm=v.buildImpressionRequestParams(dl,dj,dk);
49
- return cr(dm,null,"contentImpression")}function db(dm,dk){if(!dm){return}var dj=v.findParentContentNode(dm);var dl=v.buildContentBlock(dj);if(!dl){return}if(!dk){dk="Unknown"}return aQ(dk,dl.name,dl.piece,dl.target)}function cQ(dk,dm,dj,dl){return"e_c="+s(dk)+"&e_a="+s(dm)+(J(dj)?"&e_n="+s(dj):"")+(J(dl)?"&e_v="+s(dl):"")+"&ca=1"}function at(dl,dn,dj,dm,dq,dp){if(!Y(dl)||!Y(dn)){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dk=cr(cQ(dl,dn,dj,dm),dq,"event");bH(dk,bL,dp)}function b9(dj,dm,dk,dn){var dl=cr("search="+s(dj)+(dm?"&search_cat="+s(dm):"")+(J(dk)?"&search_count="+dk:""),dn,"sitesearch");bH(dl,bL)}function cU(dj,dn,dm,dl){var dk=cr("idgoal="+dj+(dn?"&revenue="+dn:""),dm,"goal");bH(dk,bL,dl)}function c2(dm,dj,dr,dq,dl){var dp=dj+"="+s(b3(dm));var dk=cu(dl,"click",dm);if(dk){dp+="&"+dk}var dn=cr(dp,dr,"link");bH(dn,bL,dq)}function bV(dk,dj){if(dk!==""){return dk+dj.charAt(0).toUpperCase()+dj.slice(1)
50
- }return dj}function ch(dp){var dn,dj,dm=["","webkit","ms","moz"],dl;if(!bf){for(dj=0;dj<dm.length;dj++){dl=dm[dj];if(Object.prototype.hasOwnProperty.call(G,bV(dl,"hidden"))){if(G[bV(dl,"visibilityState")]==="prerender"){dn=true}break}}}if(dn){an(G,dl+"visibilitychange",function dk(){G.removeEventListener(dl+"visibilitychange",dk,false);dp()});return}dp()}function bt(){var dk=bK.getVisitorId();var dj=aK();return dk+dj}function cj(dj){if(!dj){return}if(!ae.hasNodeAttribute(dj,"href")){return}var dk=ae.getAttributeValueFromNode(dj,"href");if(!dk||aV(dk)){return}if(!bK.getVisitorId()){return}dk=j(dk,av);var dl=bt();dk=F(dk,av,dl);ae.setAnyAttribute(dj,"href",dk)}function bm(dm){var dn=ae.getAttributeValueFromNode(dm,"href");if(!dn){return false}dn=String(dn);var dk=dn.indexOf("//")===0||dn.indexOf("http://")===0||dn.indexOf("https://")===0;if(!dk){return false}var dj=dm.pathname||cl(dm.href);var dl=(dm.hostname||d(dm.href)).toLowerCase();if(ar(dl,dj)){if(!cI(cV,L(dl))){return true}return false
51
- }return false}function cH(dj){var dk=dc(dj);if(dk&&dk.type){dk.href=o(dk.href);c2(dk.href,dk.type,undefined,null,dj);return}if(cO){dj=au(dj);if(bm(dj)){cj(dj)}}}function cw(){return G.all&&!G.addEventListener}function cW(dj){var dl=dj.which;var dk=(typeof dj.button);if(!dl&&dk!=="undefined"){if(cw()){if(dj.button&1){dl=1}else{if(dj.button&2){dl=3}else{if(dj.button&4){dl=2}}}}else{if(dj.button===0||dj.button==="0"){dl=1}else{if(dj.button&1){dl=2}else{if(dj.button&2){dl=3}}}}}return dl}function bU(dj){switch(cW(dj)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a2(dj){return dj.target||dj.srcElement}function aC(dj){return function(dm){dm=dm||S.event;var dl=bU(dm);var dn=a2(dm);if(dm.type==="click"){var dk=false;if(dj&&dl==="middle"){dk=true}if(dn&&!dk){cH(dn)}}else{if(dm.type==="mousedown"){if(dl==="middle"&&dn){aS=dl;bC=dn}else{aS=bC=null}}else{if(dm.type==="mouseup"){if(dl===aS&&dn===bC){cH(dn)}aS=bC=null}else{if(dm.type==="contextmenu"){cH(dn)}}}}}}function aq(dl,dk){var dj=typeof dk;
52
- if(dj==="undefined"){dk=true}an(dl,"click",aC(dk),false);if(dk){an(dl,"mouseup",aC(dk),false);an(dl,"mousedown",aC(dk),false);an(dl,"contextmenu",aC(dk),false)}}function bF(dl,dn){ap=true;var dm,dk=a1(bB,"ignore"),dp=G.links,dj=null,dq=null;if(dp){for(dm=0;dm<dp.length;dm++){dj=dp[dm];if(!dk.test(dj.className)){dq=typeof dj.matomoTrackers;if("undefined"===dq){dj.matomoTrackers=[]}if(-1===M(dj.matomoTrackers,dn)){dj.matomoTrackers.push(dn);aq(dj,dl)}}}}}function aT(dk,dn,dp){if(cf){return true}cf=true;var dq=false;var dm,dl;function dj(){dq=true}m(function(){function dr(dt){setTimeout(function(){if(!cf){return}dq=false;dp.trackVisibleContentImpressions();dr(dt)},dt)}function ds(dt){setTimeout(function(){if(!cf){return}if(dq){dq=false;dp.trackVisibleContentImpressions()}ds(dt)},dt)}if(dk){dm=["scroll","resize"];for(dl=0;dl<dm.length;dl++){if(G.addEventListener){G.addEventListener(dm[dl],dj,false)}else{S.attachEvent("on"+dm[dl],dj)}}ds(100)}if(dn&&dn>0){dn=parseInt(dn,10);dr(dn)}})}var bE={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dj=this.requests;
53
- this.requests=[];if(dj.length===1){bH(dj[0],bL)}else{df(dj,bL)}},canQueue:function(){return !l&&this.enabled},pushMultiple:function(dk){if(!this.canQueue()){df(dk,bL);return}var dj;for(dj=0;dj<dk.length;dj++){this.push(dk[dj])}},push:function(dj){if(!dj){return}if(!this.canQueue()){bH(dj,bL);return}bE.requests.push(dj);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bE.timeout=null;bE.sendRequests()},bE.interval);var dk="RequestQueue"+ax;if(!Object.prototype.hasOwnProperty.call(b,dk)){b[dk]={unload:function(){if(bE.timeout){clearTimeout(bE.timeout)}bE.sendRequests()}}}}};bj();aN();this.hasConsent=function(){return bD};this.getVisitorId=function(){return aZ().uuid};this.getVisitorInfo=function(){return cP()};this.getAttributionInfo=function(){return bN()};this.getAttributionCampaignName=function(){return bN()[0]};this.getAttributionCampaignKeyword=function(){return bN()[1]};this.getAttributionReferrerTimestamp=function(){return bN()[2]};this.getAttributionReferrerUrl=function(){return bN()[3]
54
- };this.setTrackerUrl=function(dj){aE=dj};this.getTrackerUrl=function(){return aE};this.getMatomoUrl=function(){return W(this.getTrackerUrl(),bJ)};this.getPiwikUrl=function(){return this.getMatomoUrl()};this.addTracker=function(dl,dk){if(!J(dl)||null===dl){dl=this.getTrackerUrl()}var dj=new P(dl,dk);I.push(dj);t.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b7};this.setSiteId=function(dj){b4(dj)};this.resetUserId=function(){bA=""};this.setUserId=function(dj){if(Y(dj)){bA=dj}};this.setVisitorId=function(dk){var dj=/[0-9A-Fa-f]{16}/g;if(w(dk)&&dj.test(dk)){bP=dk}else{ak("Invalid visitorId set"+dk)}};this.getUserId=function(){return bA};this.setCustomData=function(dj,dk){if(V(dj)){ao=dj}else{if(!ao){ao={}}ao[dj]=dk}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dj){cc=dj};this.appendToTrackingUrl=function(dj){c0=dj};this.getRequest=function(dj){return cr(dj)};this.addPlugin=function(dj,dk){b[dj]=dk};this.setCustomDimension=function(dj,dk){dj=parseInt(dj,10);
55
- if(dj>0){if(!J(dk)){dk=""}if(!w(dk)){dk=String(dk)}bo[dj]=dk}};this.getCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0&&Object.prototype.hasOwnProperty.call(bo,dj)){return bo[dj]}};this.deleteCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0){delete bo[dj]}};this.setCustomVariable=function(dk,dj,dn,dl){var dm;if(!J(dl)){dl="visit"}if(!J(dj)){return}if(!J(dn)){dn=""}if(dk>0){dj=!w(dj)?String(dj):dj;dn=!w(dn)?String(dn):dn;dm=[dj.slice(0,bv),dn.slice(0,bv)];if(dl==="visit"||dl===2){cG();aR[dk]=dm}else{if(dl==="page"||dl===3){bX[dk]=dm}else{if(dl==="event"){cm[dk]=dm}}}}};this.getCustomVariable=function(dk,dl){var dj;if(!J(dl)){dl="visit"}if(dl==="page"||dl===3){dj=bX[dk]}else{if(dl==="event"){dj=cm[dk]}else{if(dl==="visit"||dl===2){cG();dj=aR[dk]}}}if(!J(dj)||(dj&&dj[0]==="")){return false}return dj};this.deleteCustomVariable=function(dj,dk){if(this.getCustomVariable(dj,dk)){this.setCustomVariable(dj,"","",dk)}};this.deleteCustomVariables=function(dj){if(dj==="page"||dj===3){bX={}
56
- }else{if(dj==="event"){cm={}}else{if(dj==="visit"||dj===2){aR={}}}}};this.storeCustomVariablesInCookie=function(){bR=true};this.setLinkTrackingTimer=function(dj){bL=dj};this.getLinkTrackingTimer=function(){return bL};this.setDownloadExtensions=function(dj){if(w(dj)){dj=dj.split("|")}c7=dj};this.addDownloadExtensions=function(dk){var dj;if(w(dk)){dk=dk.split("|")}for(dj=0;dj<dk.length;dj++){c7.push(dk[dj])}};this.removeDownloadExtensions=function(dl){var dk,dj=[];if(w(dl)){dl=dl.split("|")}for(dk=0;dk<c7.length;dk++){if(M(dl,c7[dk])===-1){dj.push(c7[dk])}}c7=dj};this.setDomains=function(dj){ay=w(dj)?[dj]:dj;var dn=false,dl=0,dk;for(dl;dl<ay.length;dl++){dk=String(ay[dl]);if(cI(cV,L(dk))){dn=true;break}var dm=cl(dk);if(dm&&dm!=="/"&&dm!=="/*"){dn=true;break}}if(!dn){ay.push(cV)}};this.enableCrossDomainLinking=function(){cO=true};this.disableCrossDomainLinking=function(){cO=false};this.isCrossDomainLinkingEnabled=function(){return cO};this.setCrossDomainLinkingTimeout=function(dj){a0=dj};this.getCrossDomainLinkingUrlParameter=function(){return s(av)+"="+s(bt())
57
- };this.setIgnoreClasses=function(dj){bB=w(dj)?[dj]:dj};this.setRequestMethod=function(dj){if(dj){da=String(dj).toUpperCase()}else{da=ci}if(da==="GET"){this.disableAlwaysUseSendBeacon()}};this.setRequestContentType=function(dj){cx=dj||aI};this.setGenerationTimeMs=function(dj){ak("setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. There is currently no replacement yet.")};this.setReferrerUrl=function(dj){bp=dj};this.setCustomUrl=function(dj){a5=bW(bO,dj)};this.getCurrentUrl=function(){return a5||bO};this.setDocumentTitle=function(dj){bk=dj};this.setAPIUrl=function(dj){bJ=dj};this.setDownloadClasses=function(dj){bM=w(dj)?[dj]:dj};this.setLinkClasses=function(dj){a9=w(dj)?[dj]:dj};this.setCampaignNameKey=function(dj){cp=w(dj)?[dj]:dj};this.setCampaignKeywordKey=function(dj){bI=w(dj)?[dj]:dj};this.discardHashTag=function(dj){bQ=dj};this.setCookieNamePrefix=function(dj){bl=dj;if(aR){aR=bY()}};this.setCookieDomain=function(dj){var dk=L(dj);if(by(dk)){cY=dk;bj()
58
- }};this.getCookieDomain=function(){return cY};this.hasCookies=function(){return"1"===b6()};this.setSessionCookie=function(dl,dk,dj){if(!dl){throw new Error("Missing cookie name")}if(!J(dj)){dj=cn}bw.push(dl);de(aU(dl),dk,dj,br,cY,bT,aJ)};this.getCookie=function(dk){var dj=aD(aU(dk));if(dj===0){return null}return dj};this.setCookiePath=function(dj){br=dj;bj()};this.getCookiePath=function(dj){return br};this.setVisitorCookieTimeout=function(dj){cL=dj*1000};this.setSessionCookieTimeout=function(dj){cn=dj*1000};this.getSessionCookieTimeout=function(){return cn};this.setReferralCookieTimeout=function(dj){c6=dj*1000};this.setConversionAttributionFirstReferrer=function(dj){bx=dj};this.setSecureCookie=function(dj){if(dj&&location.protocol!=="https:"){ak("Error in setSecureCookie: You cannot use `Secure` on http.");return}bT=dj};this.setCookieSameSite=function(dj){dj=String(dj);dj=dj.charAt(0).toUpperCase()+dj.toLowerCase().slice(1);if(dj!=="None"&&dj!=="Lax"&&dj!=="Strict"){ak("Ignored value for sameSite. Please use either Lax, None, or Strict.");
59
- return}if(dj==="None"){if(location.protocol==="https:"){this.setSecureCookie(true)}else{ak("sameSite=None cannot be used on http, reverted to sameSite=Lax.");dj="Lax"}}aJ=dj};this.disableCookies=function(){bn=true;if(b7){aF()}};this.areCookiesEnabled=function(){return !bn};this.setCookieConsentGiven=function(){if(bn&&!cR){bn=false;if(b7&&aw){aN();var dj=cr("ping=1",null,"ping");bH(dj,bL)}}};this.requireCookieConsent=function(){if(this.getRememberedCookieConsent()){return false}this.disableCookies();return true};this.getRememberedCookieConsent=function(){return aD(cE)};this.forgetCookieConsentGiven=function(){bZ(cE,br,cY);this.disableCookies()};this.rememberCookieConsentGiven=function(dk){if(dk){dk=dk*60*60*1000}else{dk=30*365*24*60*60*1000}this.setCookieConsentGiven();var dj=new Date().getTime();de(cE,dj,dk,br,cY,bT,aJ)};this.deleteCookies=function(){aF()};this.setDoNotTrack=function(dk){var dj=g.doNotTrack||g.msDoNotTrack;cR=dk&&(dj==="yes"||dj==="1");if(cR){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cX=true
60
- };this.disableAlwaysUseSendBeacon=function(){cX=false};this.addListener=function(dk,dj){aq(dk,dj)};this.enableLinkTracking=function(dk){c9=true;var dj=this;ch(function(){p(function(){bF(dk,dj)});m(function(){bF(dk,dj)})})};this.enableJSErrorTracking=function(){if(cT){return}cT=true;var dj=S.onerror;S.onerror=function(dp,dm,dl,dn,dk){ch(function(){var dq="JavaScript Errors";var dr=dm+":"+dl;if(dn){dr+=":"+dn}if(M(cs,dq+dr+dp)===-1){cs.push(dq+dr+dp);at(dq,dr,dp)}});if(dj){return dj(dp,dm,dl,dn,dk)}return false}};this.disablePerformanceTracking=function(){a3=false};this.enableHeartBeatTimer=function(dj){dj=Math.max(dj||15,5);a6=dj*1000;if(cZ!==null){dg()}};this.disableHeartBeatTimer=function(){if(a6||aO){if(S.removeEventListener){S.removeEventListener("focus",bb);S.removeEventListener("blur",az)}else{if(S.detachEvent){S.detachEvent("onfocus",bb);S.detachEvent("onblur",az)}}}a6=null;aO=false};this.killFrame=function(){if(S.location!==S.top.location){S.top.location=S.location}};this.redirectFile=function(dj){if(S.location.protocol==="file:"){S.location=dj
61
- }};this.setCountPreRendered=function(dj){bf=dj};this.trackGoal=function(dj,dm,dl,dk){ch(function(){cU(dj,dm,dl,dk)})};this.trackLink=function(dk,dj,dm,dl){ch(function(){c2(dk,dj,dm,dl)})};this.getNumTrackedPageViews=function(){return cq};this.trackPageView=function(dj,dl,dk){cb=[];cM=[];cs=[];if(N(b7)){ch(function(){Z(aE,bJ,b7)})}else{ch(function(){cq++;b1(dj,dl,dk)})}};this.trackAllContentImpressions=function(){if(N(b7)){return}ch(function(){p(function(){var dj=v.findContentNodes();var dk=cA(dj);bE.pushMultiple(dk)})})};this.trackVisibleContentImpressions=function(dj,dk){if(N(b7)){return}if(!J(dj)){dj=true}if(!J(dk)){dk=750}aT(dj,dk,this);ch(function(){m(function(){var dl=v.findContentNodes();var dm=ba(dl);bE.pushMultiple(dm)})})};this.trackContentImpression=function(dl,dj,dk){if(N(b7)){return}dl=a(dl);dj=a(dj);dk=a(dk);if(!dl){return}dj=dj||"Unknown";ch(function(){var dm=aG(dl,dj,dk);bE.push(dm)})};this.trackContentImpressionsWithinNode=function(dj){if(N(b7)||!dj){return}ch(function(){if(cf){m(function(){var dk=v.findContentNodesWithinNode(dj);
62
- var dl=ba(dk);bE.pushMultiple(dl)})}else{p(function(){var dk=v.findContentNodesWithinNode(dj);var dl=cA(dk);bE.pushMultiple(dl)})}})};this.trackContentInteraction=function(dl,dm,dj,dk){if(N(b7)){return}dl=a(dl);dm=a(dm);dj=a(dj);dk=a(dk);if(!dl||!dm){return}dj=dj||"Unknown";ch(function(){var dn=aQ(dl,dm,dj,dk);if(dn){bE.push(dn)}})};this.trackContentInteractionNode=function(dl,dk){if(N(b7)||!dl){return}var dj=null;ch(function(){dj=db(dl,dk);if(dj){bE.push(dj)}});return dj};this.logAllContentBlocksOnPage=function(){var dl=v.findContentNodes();var dj=v.collectContent(dl);var dk=typeof console;if(dk!=="undefined"&&console&&console.log){console.log(dj)}};this.trackEvent=function(dk,dm,dj,dl,dp,dn){ch(function(){at(dk,dm,dj,dl,dp,dn)})};this.trackSiteSearch=function(dj,dl,dk,dm){cb=[];ch(function(){b9(dj,dl,dk,dm)})};this.setEcommerceView=function(dn,dj,dl,dk){ct={};if(Y(dl)){dl=String(dl)}if(!J(dl)||dl===null||dl===false||!dl.length){dl=""}else{if(dl instanceof Array){dl=S.JSON.stringify(dl)
63
- }}var dm="_pkc";ct[dm]=dl;if(J(dk)&&dk!==null&&dk!==false&&String(dk).length){dm="_pkp";ct[dm]=dk}if(!Y(dn)&&!Y(dj)){return}if(Y(dn)){dm="_pks";ct[dm]=dn}if(!Y(dj)){dj=""}dm="_pkn";ct[dm]=dj};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c1))};this.addEcommerceItem=function(dn,dj,dl,dk,dm){if(Y(dn)){c1[dn]=[String(dn),dj,dl,dk,dm]}};this.removeEcommerceItem=function(dj){if(Y(dj)){dj=String(dj);delete c1[dj]}};this.clearEcommerceCart=function(){c1={}};this.trackEcommerceOrder=function(dj,dn,dm,dl,dk,dp){b0(dj,dn,dm,dl,dk,dp)};this.trackEcommerceCartUpdate=function(dj){bu(dj)};this.trackRequest=function(dk,dm,dl,dj){ch(function(){var dn=cr(dk,dm,dj);bH(dn,bL,dl)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bE.enabled=false};this.setRequestQueueInterval=function(dj){if(dj<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bE.interval=dj};this.queueRequest=function(dj){ch(function(){var dk=cr(dj);
64
- bE.push(dk)})};this.isConsentRequired=function(){return cB};this.getRememberedConsent=function(){var dj=aD(be);if(aD(cN)){if(dj){bZ(be,br,cY)}return null}if(!dj||dj===0){return null}return dj};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cB=true;bD=this.hasRememberedConsent();if(!bD){bn=true}x++;b["CoreConsent"+x]={unload:function(){if(!bD){aF()}}}};this.setConsentGiven=function(dk){bD=true;bZ(cN,br,cY);var dl,dj;for(dl=0;dl<cM.length;dl++){dj=typeof cM[dl];if(dj==="string"){bH(cM[dl],bL)}else{if(dj==="object"){df(cM[dl],bL)}}}cM=[];if(!J(dk)||dk){this.setCookieConsentGiven()}};this.rememberConsentGiven=function(dl){if(dl){dl=dl*60*60*1000}else{dl=30*365*24*60*60*1000}var dj=true;this.setConsentGiven(dj);var dk=new Date().getTime();de(be,dk,dl,br,cY,bT,aJ)};this.forgetConsentGiven=function(){var dj=30*365*24*60*60*1000;bZ(be,br,cY);de(cN,new Date().getTime(),dj,br,cY,bT,aJ);this.forgetCookieConsentGiven();this.requireConsent()
65
- };this.isUserOptedOut=function(){return !bD};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=function(){this.setConsentGiven(false)};m(function(){setTimeout(function(){bG=true},0)});t.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];if(av[ap]>1&&ap!=="addTracker"&&ap!=="enableLinkTracking"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking"];
66
- function ad(aq,ap){var ao=new P(aq,ap);I.push(ao);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();t.trigger("TrackerAdded",[ao]);return ao}an(S,"beforeunload",ai,false);an(S,"online",function(){if(J(g.serviceWorker)&&J(g.serviceWorker.ready)){g.serviceWorker.ready.then(function(ao){if(ao&&ao.sync){return ao.sync.register("matomoSync")}})}},false);an(S,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getMatomoUrl());if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})
67
  }else{if(J(aq.maq_opted_in)){at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;t={initialized:false,JSON:S.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:m,onReady:p,isNodeVisible:i,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||S,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ap,ao){if(!J(ao)){ao=this.getAsyncTracker().getSiteId()}if(!J(ap)){ap=this.getAsyncTracker().getTrackerUrl()
68
  }return new P(ap,ao)},getAsyncTrackers:function(){return I},addTracker:function(aq,ap){var ao;if(!I.length){ao=ad(aq,ap)}else{ao=I[0].addTracker(aq,ap)}return ao},getAsyncTracker:function(at,ar){var aq;if(I&&I.length&&I[0]){aq=I[0]}else{return ad(at,ar)}if(!ar&&!at){return aq}if((!J(ar)||null===ar)&&aq){ar=aq.getSiteId()}if((!J(at)||null===at)&&aq){at=aq.getTrackerUrl()}var ap,ao=0;for(ao;ao<I.length;ao++){ap=I[ao];if(ap&&String(ap.getSiteId())===String(ar)&&ap.getTrackerUrl()===at){return ap}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return t});define("matomo",[],function(){return t})}return t}())}
69
  /*!!! pluginTrackerHook */
28
  }}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(S.innerWidth&&ap>S.innerWidth){ap=S.innerWidth}var ao=ar.clientHeight;if(S.innerHeight&&ao>S.innerHeight){ao=S.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=i(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+s(ao)}if(ap){if(at){at+="&"}at+="c_n="+s(ap)}if(aq){if(at){at+="&"}at+="c_p="+s(aq)}if(ar){if(at){at+="&"}at+="c_t="+s(ar)}if(at){at+="&ca=1"}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+s(ao)+"&c_p="+s(ap);if(aq){ar+="&c_t="+s(aq)
29
  }if(ar){ar+="&ca=1"}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||S.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap
30
  }if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(ao){if(ae.hasNodeAttribute(ao,this.CONTENT_IGNOREINTERACTION_ATTR)){return true}if(ae.hasNodeCssClass(ao,this.CONTENT_IGNOREINTERACTION_CLASS)){return true}if(ae.hasNodeCssClass(ao,this.LEGACY_CONTENT_IGNOREINTERACTION_CLASS)){return true}return false}};function W(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(Q(ap,"matomo.php")){ap=f(ap,"matomo.php".length)
31
+ }else{if(Q(ap,"piwik.php")){ap=f(ap,"piwik.php".length)}else{if(Q(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(Q(ap,"/js/")){ap=f(ap,"js/".length)}return ap}function N(av){var ax="Matomo_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=[^&]*)?");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}S.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=S.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,av,aq){var au=S.name.split("###"),at=au[1],ao=au[2],ar=au[3],aw=W(ap,av);n(aw+"plugins/Overlay/client/client.js?v=1",function(){Matomo_Overlay_Client.initialize(aw,aq,at,ao,ar)})}function u(){var aq;try{aq=S.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return S.self!==S.top
32
+ }catch(ao){return true}}function P(ce,ca){var bK=this,be="mtm_consent",cE="mtm_cookie_consent",cN="mtm_consent_removed",b5=aa(G.domain,S.location.href,K()),cV=L(b5[0]),bO=o(b5[1]),bp=o(b5[2]),cT=false,ci="GET",db=ci,aI="application/x-www-form-urlencoded; charset=UTF-8",cx=aI,aE=ce||"",bJ="",c1="",b7=ca||"",bA="",bP="",a5,bk="",c8=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","rtf","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ay=[cV],bB=[],bM=[],a9=[],bL=500,cY=true,cK,a6,bS,bQ,ao,cp=["pk_campaign","mtm_campaign","piwik_campaign","matomo_campaign","utm_campaign","utm_source","utm_medium"],bI=["pk_kwd","mtm_kwd","piwik_kwd","matomo_kwd","utm_term"],bl="_pk_",av="pk_vid",a0=180,cZ,br,bT=false,aJ="Lax",bn=false,cR,bf,bx,cL=33955200000,cn=1800000,c7=15768000000,a3=true,bG=false,bi=false,bR=false,aR=false,cc,bX={},cm={},bo={},bv=200,ct={},c2={},c9={},cb=[],cf=false,cC=false,ap=false,da=false,cO=false,aO=false,bd=u(),cy=null,c0=null,aS,bD,b8=am,bq,aM,bC=false,cq=0,bw=["id","ses","cvar","ref"],cB=false,bE=null,cM=[],cs=[],ax=T++,aw=false;
33
+ try{bk=G.title}catch(cz){bk=""}function aD(dm){if(bn){return 0}var dk=new RegExp("(^|;)[ ]*"+dm+"=([^;]*)"),dl=dk.exec(G.cookie);return dl?R(dl[2]):0}bE=!aD(cN);function df(dp,dq,dt,ds,dm,dn,dr){if(bn&&dp!==cN){return}var dl;if(dt){dl=new Date();dl.setTime(dl.getTime()+dt)}if(!dr){dr="Lax"}G.cookie=dp+"="+s(dq)+(dt?";expires="+dl.toGMTString():"")+";path="+(ds||"/")+(dm?";domain="+dm:"")+(dn?";secure":"")+";SameSite="+dr;if((!dt||dt>=0)&&aD(dp)!==dq){var dk="There was an error setting cookie `"+dp+"`. Please check domain and path.";ak(dk)}}function b3(dk){var dl;dk=j(dk,av);if(bQ){dl=new RegExp("#.*");return dk.replace(dl,"")}return dk}function bW(dm,dk){var dn=r(dk),dl;if(dn){return dk}if(dk.slice(0,1)==="/"){return r(dm)+"://"+d(dm)+dk}dm=b3(dm);dl=dm.indexOf("?");if(dl>=0){dm=dm.slice(0,dl)}dl=dm.lastIndexOf("/");if(dl!==dm.length-1){dm=dm.slice(0,dl+1)}return dm+dk}function cI(dm,dk){var dl;dm=String(dm).toLowerCase();dk=String(dk).toLowerCase();if(dm===dk){return true}if(dk.slice(0,1)==="."){if(dm===dk.slice(1)){return true
34
+ }dl=dm.length-dk.length;if((dl>0)&&(dm.slice(dl)===dk)){return true}}return false}function cl(dk){var dl=document.createElement("a");if(dk.indexOf("//")!==0&&dk.indexOf("http")!==0){if(dk.indexOf("*")===0){dk=dk.substr(1)}if(dk.indexOf(".")===0){dk=dk.substr(1)}dk="http://"+dk}dl.href=v.toAbsoluteUrl(dk);if(dl.pathname){return dl.pathname}return""}function a4(dl,dk){if(!aj(dk,"/")){dk="/"+dk}if(!aj(dl,"/")){dl="/"+dl}var dm=(dk==="/"||dk==="/*");if(dm){return true}if(dl===dk){return true}dk=String(dk).toLowerCase();dl=String(dl).toLowerCase();if(Q(dk,"*")){dk=dk.slice(0,-1);dm=(!dk||dk==="/");if(dm){return true}if(dl===dk){return true}return dl.indexOf(dk)===0}if(!Q(dl,"/")){dl+="/"}if(!Q(dk,"/")){dk+="/"}return dl.indexOf(dk)===0}function ar(dp,dr){var dl,dk,dm,dn,dq;for(dl=0;dl<ay.length;dl++){dn=L(ay[dl]);dq=cl(ay[dl]);if(cI(dp,dn)&&a4(dr,dq)){return true}}return false}function aW(dn){var dl,dk,dm;for(dl=0;dl<ay.length;dl++){dk=L(ay[dl].toLowerCase());if(dn===dk){return true}if(dk.slice(0,1)==="."){if(dn===dk.slice(1)){return true
35
+ }dm=dn.length-dk.length;if((dm>0)&&(dn.slice(dm)===dk)){return true}}}return false}function co(dk,dm){dk=dk.replace("send_image=0","send_image=1");var dl=new Image(1,1);dl.onload=function(){E=0;if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:true})}};dl.onerror=function(){if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:false})}};dl.src=aE+(aE.indexOf("?")<0?"?":"&")+dk}function cF(dk){if(db==="POST"){return true}return dk&&(dk.length>2000||dk.indexOf('{"requests"')===0)}function aL(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function a7(dp,ds,dr){var dm=aL();if(!dm){return false}var dn={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dt=false;var dl=aE;try{var dk=new Blob([dp],dn);if(dr&&!cF(dp)){dk=new Blob([],dn);dl=dl+(dl.indexOf("?")<0?"?":"&")+dp}dt=g.sendBeacon(dl,dk)}catch(dq){return false}if(dt&&typeof ds==="function"){ds({request:dp,trackerUrl:aE,success:true,isSendBeacon:true})}return dt}function c6(dl,dm,dk){if(!J(dk)||null===dk){dk=true
36
+ }if(l&&a7(dl,dm,dk)){return}setTimeout(function(){if(l&&a7(dl,dm,dk)){return}var dq;try{var dp=S.XMLHttpRequest?new S.XMLHttpRequest():S.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dp.open("POST",aE,true);dp.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dr=l&&a7(dl,dm,dk);if(!dr&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dm==="function")){dm({request:dl,trackerUrl:aE,success:true,xhr:this})}}};dp.setRequestHeader("Content-Type",cx);dp.withCredentials=true;dp.send(dl)}catch(dn){dq=l&&a7(dl,dm,dk);if(!dq&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false})}}}},50)}function cg(dl){var dk=new Date();var dm=dk.getTime()+dl;if(!q||dm>q){q=dm}}function bb(){bd=true;cy=new Date().getTime()}function de(){var dk=new Date().getTime();return !cy||(dk-cy)>a6}function az(){if(de()){bS()}}function dh(){if(aO||!a6){return
37
+ }aO=true;an(S,"focus",bb);an(S,"blur",az);ab++;t.addPlugin("HeartBeat"+ab,{unload:function(){if(aO&&de()){bS()}}})}function cD(dp){var dl=new Date();var dk=dl.getTime();c0=dk;if(cC&&dk<cC){var dm=cC-dk;setTimeout(dp,dm);cg(dm+50);cC+=50;return}if(cC===false){var dn=800;cC=dk+dn}dp()}function aP(){if(aD(cN)){bE=false}else{if(aD(be)){bE=true}}}function bH(dl,dk,dm){aP();if(!bE){cM.push(dl);return}aw=true;if(!cR&&dl){if(cB&&bE){dl+="&consent=1"}cD(function(){if(cY&&a7(dl,dm,true)){cg(100);return}if(cF(dl)){c6(dl,dm)}else{co(dl,dm)}cg(dk)})}if(!aO){dh()}}function ck(dk){if(cR){return false}return(dk&&dk.length)}function c5(dk,dp){if(!dp||dp>=dk.length){return[dk]}var dl=0;var dm=dk.length;var dn=[];for(dl;dl<dm;dl+=dp){dn.push(dk.slice(dl,dl+dp))}return dn}function dg(dl,dk){if(!ck(dl)){return}if(!bE){cM.push(dl);return}aw=true;cD(function(){var dp=c5(dl,50);var dm=0,dn;for(dm;dm<dp.length;dm++){dn='{"requests":["?'+dp[dm].join('","?')+'"],"send_image":0}';if(cY&&a7(dn,null,false)){cg(100)}else{c6(dn,null,false)
38
+ }}cg(dk)})}function aU(dk){return bl+dk+"."+b7+"."+bq}function bZ(dm,dl,dk){df(dm,"",-86400,dl,dk)}function b6(){if(bn){return"0"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){return g.cookieEnabled?"1":"0"}var dk=bl+"testcookie";df(dk,"1",undefined,br,cZ,bT,aJ);var dl=aD(dk)==="1"?"1":"0";bZ(dk);return dl}function bj(){bq=b8((cZ||cV)+(br||"/")).slice(0,4)}function cJ(){if(J(c9.res)){return c9}var dl,dn,dp={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",fla:"application/x-shockwave-flash",java:"application/x-java-vm",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(g.userAgent))){if(g.mimeTypes&&g.mimeTypes.length){for(dl in dp){if(Object.prototype.hasOwnProperty.call(dp,dl)){dn=g.mimeTypes[dp[dl]];c9[dl]=(dn&&dn.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(g.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(g.javaEnabled)&&g.javaEnabled()){c9.java="1"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){c9.cookie=g.cookieEnabled?"1":"0"
39
+ }else{c9.cookie=b6()}}var dm=parseInt(X.width,10);var dk=parseInt(X.height,10);c9.res=parseInt(dm,10)+"x"+parseInt(dk,10);return c9}function bY(){var dl=aU("cvar"),dk=aD(dl);if(dk&&dk.length){dk=S.JSON.parse(dk);if(V(dk)){return dk}}return{}}function cG(){if(aR===false){aR=bY()}}function cS(){var dk=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dk)+(new Date()).getTime()+Math.random()).slice(0,16)}function aB(){var dk=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dk)).slice(0,6)}function bg(){return Math.floor((new Date()).getTime()/1000)}function aK(){var dl=bg();var dm=aB();var dk=String(dl)+dm;return dk}function c4(dm){dm=String(dm);var dq=aB();var dn=dq.length;var dp=dm.substr(-1*dn,dn);var dl=parseInt(dm.substr(0,dm.length-dn),10);if(dl&&dp&&dp===dq){var dk=bg();if(a0<=0){return true}if(dk>=dl&&dk<=(dl+a0)){return true}}return false}function di(dk){if(!cO){return""}var dp=e(dk,av);if(!dp){return""}dp=String(dp);var dm=new RegExp("^[a-zA-Z0-9]+$");
40
+ if(dp.length===32&&dm.test(dp)){var dl=dp.substr(16,32);if(c4(dl)){var dn=dp.substr(0,16);return dn}}return""}function cP(){if(!bP){bP=di(bO)}var dm=new Date(),dk=Math.round(dm.getTime()/1000),dl=aU("id"),dq=aD(dl),dp,dn;if(dq){dp=dq.split(".");dp.unshift("0");if(bP.length){dp[1]=bP}return dp}if(bP.length){dn=bP}else{if("0"===b6()){dn=""}else{dn=cS()}}dp=["1",dn,dk];return dp}function aZ(){var dn=cP(),dl=dn[0],dm=dn[1],dk=dn[2];return{newVisitor:dl,uuid:dm,createTs:dk}}function aH(){var dn=new Date(),dl=dn.getTime(),dp=aZ().createTs;var dk=parseInt(dp,10);var dm=(dk*1000)+cL-dl;return dm}function aN(dk){if(!b7){return}var dm=new Date(),dl=Math.round(dm.getTime()/1000);if(!J(dk)){dk=aZ()}var dn=dk.uuid+"."+dk.createTs+".";df(aU("id"),dn,aH(),br,cZ,bT,aJ)}function bN(){var dk=aD(aU("ref"));if(dk.length){try{dk=S.JSON.parse(dk);if(V(dk)){return dk}}catch(dl){}}return["","",0,""]}function by(dm){var dl=bl+"testcookie_domain";var dk="testvalue";df(dl,dk,10000,null,dm,bT,aJ);if(aD(dl)===dk){bZ(dl,null,dm);
41
+ return true}return false}function aF(){var dl=bn;bn=false;var dk,dm;for(dk=0;dk<bw.length;dk++){dm=aU(bw[dk]);if(dm!==cN&&dm!==be&&0!==aD(dm)){bZ(dm,br,cZ)}}bn=dl}function b4(dk){b7=dk}function dj(dp){if(!dp||!V(dp)){return}var dn=[];var dm;for(dm in dp){if(Object.prototype.hasOwnProperty.call(dp,dm)){dn.push(dm)}}var dq={};dn.sort();var dk=dn.length;var dl;for(dl=0;dl<dk;dl++){dq[dn[dl]]=dp[dn[dl]]}return dq}function cd(){df(aU("ses"),"1",cn,br,cZ,bT,aJ)}function bh(){var dn="";var dl="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dm=dl.length;var dk;for(dk=0;dk<6;dk++){dn+=dl.charAt(Math.floor(Math.random()*dm))}return dn}function aA(dl){if(!h){return dl}var dm=(typeof h.timing==="object")&&h.timing?h.timing:undefined;if(!dm){dm=(typeof h.getEntriesByType==="function")&&h.getEntriesByType("navigation")?h.getEntriesByType("navigation")[0]:undefined}if(!dm){return dl}var dk="";if(dm.connectEnd&&dm.fetchStart){if(dm.connectEnd<dm.fetchStart){return}dk+="&pf_net="+Math.round(dm.connectEnd-dm.fetchStart)
42
+ }if(dm.responseStart&&dm.requestStart){if(dm.responseStart<dm.requestStart){return}dk+="&pf_srv="+Math.round(dm.responseStart-dm.requestStart)}if(dm.responseStart&&dm.responseEnd){if(dm.responseEnd<dm.responseStart){return}dk+="&pf_tfr="+Math.round(dm.responseEnd-dm.responseStart)}if(J(dm.domLoading)){if(dm.domInteractive&&dm.domLoading){if(dm.domInteractive<dm.domLoading){return}dk+="&pf_dm1="+Math.round(dm.domInteractive-dm.domLoading)}}else{if(dm.domInteractive&&dm.responseEnd){if(dm.domInteractive<dm.responseEnd){return}dk+="&pf_dm1="+Math.round(dm.domInteractive-dm.responseEnd)}}if(dm.domComplete&&dm.domInteractive){if(dm.domComplete<dm.domInteractive){return}dk+="&pf_dm2="+Math.round(dm.domComplete-dm.domInteractive)}if(dm.loadEventEnd&&dm.loadEventStart){if(dm.loadEventEnd<dm.loadEventStart){return}dk+="&pf_onl="+Math.round(dm.loadEventEnd-dm.loadEventStart)}return dl+dk}function cr(dm,dH,dI){var dG,dl=new Date(),du=Math.round(dl.getTime()/1000),dr,dE,dn=1024,dN,dv,dD=aR,dp=aU("ses"),dB=aU("ref"),dy=aU("cvar"),dz=aD(dp),dF=bN(),dJ=a5||bO,ds,dk;
43
+ if(bn){aF()}if(cR){return""}var dA=aZ();var dx=G.characterSet||G.charset;if(!dx||dx.toLowerCase()==="utf-8"){dx=null}ds=dF[0];dk=dF[1];dr=dF[2];dE=dF[3];if(!dz){if(!bx||!ds.length){for(dG in cp){if(Object.prototype.hasOwnProperty.call(cp,dG)){ds=e(dJ,cp[dG]);if(ds.length){break}}}for(dG in bI){if(Object.prototype.hasOwnProperty.call(bI,dG)){dk=e(dJ,bI[dG]);if(dk.length){break}}}}dN=d(bp);dv=dE.length?d(dE):"";if(dN.length&&!aW(dN)&&(!bx||!dv.length||aW(dv))){dE=bp}if(dE.length||ds.length){dr=du;dF=[ds,dk,dr,b3(dE.slice(0,dn))];df(dB,S.JSON.stringify(dF),c7,br,cZ,bT,aJ)}}dm+="&idsite="+b7+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dl.getHours()+"&m="+dl.getMinutes()+"&s="+dl.getSeconds()+"&url="+s(b3(dJ))+(bp.length?"&urlref="+s(b3(bp)):"")+(Y(bA)?"&uid="+s(bA):"")+"&_id="+dA.uuid+"&_idn="+dA.newVisitor+(ds.length?"&_rcn="+s(ds):"")+(dk.length?"&_rck="+s(dk):"")+"&_refts="+dr+(String(dE).length?"&_ref="+s(b3(dE.slice(0,dn))):"")+(dx?"&cs="+s(dx):"")+"&send_image=0";var dM=cJ();for(dG in dM){if(Object.prototype.hasOwnProperty.call(dM,dG)){dm+="&"+dG+"="+dM[dG]
44
+ }}var dL=[];if(dH){for(dG in dH){if(Object.prototype.hasOwnProperty.call(dH,dG)&&/^dimension\d+$/.test(dG)){var dq=dG.replace("dimension","");dL.push(parseInt(dq,10));dL.push(String(dq));dm+="&"+dG+"="+s(dH[dG]);delete dH[dG]}}}if(dH&&B(dH)){dH=null}for(dG in ct){if(Object.prototype.hasOwnProperty.call(ct,dG)){dm+="&"+dG+"="+s(ct[dG])}}for(dG in bo){if(Object.prototype.hasOwnProperty.call(bo,dG)){var dw=(-1===M(dL,dG));if(dw){dm+="&dimension"+dG+"="+s(bo[dG])}}}if(dH){dm+="&data="+s(S.JSON.stringify(dH))}else{if(ao){dm+="&data="+s(S.JSON.stringify(ao))}}function dt(dO,dP){var dQ=S.JSON.stringify(dO);if(dQ.length>2){return"&"+dP+"="+s(dQ)}return""}var dK=dj(bX);var dC=dj(cm);dm+=dt(dK,"cvar");dm+=dt(dC,"e_cvar");if(aR){dm+=dt(aR,"_cvar");for(dG in dD){if(Object.prototype.hasOwnProperty.call(dD,dG)){if(aR[dG][0]===""||aR[dG][1]===""){delete aR[dG]}}}if(bR){df(dy,S.JSON.stringify(aR),cn,br,cZ,bT,aJ)}}if(a3&&bG&&!bi){dm=aA(dm);bi=true}if(aM){dm+="&pv_id="+aM}aN(dA);cd();dm+=ac(dI,{tracker:bK,request:dm});
45
+ if(c1.length){dm+="&"+c1}if(A(cc)){dm=cc(dm)}return dm}bS=function a8(){var dk=new Date();dk=dk.getTime();if(!c0){return false}if(c0+a6<=dk){bK.ping();return true}return false};function bs(dn,dm,ds,dp,dk,dv){var dr="idgoal=0",dl=new Date(),dt=[],du,dq=String(dn).length;if(dq){dr+="&ec_id="+s(dn)}dr+="&revenue="+dm;if(String(ds).length){dr+="&ec_st="+ds}if(String(dp).length){dr+="&ec_tx="+dp}if(String(dk).length){dr+="&ec_sh="+dk}if(String(dv).length){dr+="&ec_dt="+dv}if(c2){for(du in c2){if(Object.prototype.hasOwnProperty.call(c2,du)){if(!J(c2[du][1])){c2[du][1]=""}if(!J(c2[du][2])){c2[du][2]=""}if(!J(c2[du][3])||String(c2[du][3]).length===0){c2[du][3]=0}if(!J(c2[du][4])||String(c2[du][4]).length===0){c2[du][4]=1}dt.push(c2[du])}}dr+="&ec_items="+s(S.JSON.stringify(dt))}dr=cr(dr,ao,"ecommerce");bH(dr,bL);if(dq){c2={}}}function b0(dk,dp,dn,dm,dl,dq){if(String(dk).length&&J(dp)){bs(dk,dp,dn,dm,dl,dq)}}function bu(dk){if(J(dk)){bs("",dk,"","","","")}}function b1(dl,dn,dm){if(!bC){aM=bh()}var dk=cr("action_name="+s(al(dl||bk)),dn,"log");
46
+ if(a3&&!bi){dk=aA(dk)}bH(dk,bL,dm)}function a1(dm,dl){var dn,dk="(^| )(piwik[_-]"+dl+"|matomo[_-]"+dl;if(dm){for(dn=0;dn<dm.length;dn++){dk+="|"+dm[dn]}}dk+=")( |$)";return new RegExp(dk)}function aV(dk){return(aE&&dk&&0===String(dk).indexOf(aE))}function cv(dp,dk,dq,dl){if(aV(dk)){return 0}var dn=a1(bM,"download"),dm=a1(a9,"link"),dr=new RegExp("\\.("+c8.join("|")+")([?&#]|$)","i");if(dm.test(dp)){return"link"}if(dl||dn.test(dp)||dr.test(dk)){return"download"}if(dq){return 0}return"link"}function au(dl){var dk;dk=dl.parentNode;while(dk!==null&&J(dk)){if(ae.isLinkElement(dl)){break}dl=dk;dk=dl.parentNode}return dl}function dd(dq){dq=au(dq);if(!ae.hasNodeAttribute(dq,"href")){return}if(!J(dq.href)){return}var dp=ae.getAttributeValueFromNode(dq,"href");var dl=dq.pathname||cl(dq.href);var dr=dq.hostname||d(dq.href);var ds=dr.toLowerCase();var dm=dq.href.replace(dr,ds);var dn=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dn.test(dm)){var dk=cv(dq.className,dm,ar(ds,dl),ae.hasNodeAttribute(dq,"download"));
47
+ if(dk){return{type:dk,href:dm}}}}function aQ(dk,dl,dm,dn){var dp=v.buildInteractionRequestParams(dk,dl,dm,dn);if(!dp){return}return cr(dp,null,"contentInteraction")}function bc(dk,dl){if(!dk||!dl){return false}var dm=v.findTargetNode(dk);if(v.shouldIgnoreInteraction(dm)){return false}dm=v.findTargetNodeNoDefault(dk);if(dm&&!U(dm,dl)){return false}return true}function cu(dm,dl,dp){if(!dm){return}var dk=v.findParentContentNode(dm);if(!dk){return}if(!bc(dk,dm)){return}var dn=v.buildContentBlock(dk);if(!dn){return}if(!dn.target&&dp){dn.target=dp}return v.buildInteractionRequestParams(dl,dn.name,dn.piece,dn.target)}function aX(dl){if(!cb||!cb.length){return false}var dk,dm;for(dk=0;dk<cb.length;dk++){dm=cb[dk];if(dm&&dm.name===dl.name&&dm.piece===dl.piece&&dm.target===dl.target){return true}}return false}function aY(dk){return function(dp){if(!dk){return}var dm=v.findParentContentNode(dk);var dl;if(dp){dl=dp.target||dp.srcElement}if(!dl){dl=dk}if(!bc(dm,dl)){return}if(!dm){return false}var dq=v.findTargetNode(dm);
48
+ if(!dq||v.shouldIgnoreInteraction(dq)){return false}var dn=dd(dq);if(da&&dn&&dn.type){return dn.type}return bK.trackContentInteractionNode(dl,"click")}}function b2(dm){if(!dm||!dm.length){return}var dk,dl;for(dk=0;dk<dm.length;dk++){dl=v.findTargetNode(dm[dk]);if(dl&&!dl.contentInteractionTrackingSetupDone){dl.contentInteractionTrackingSetupDone=true;an(dl,"click",aY(dl))}}}function bz(dm,dn){if(!dm||!dm.length){return[]}var dk,dl;for(dk=0;dk<dm.length;dk++){if(aX(dm[dk])){dm.splice(dk,1);dk--}else{cb.push(dm[dk])}}if(!dm||!dm.length){return[]}b2(dn);var dp=[];for(dk=0;dk<dm.length;dk++){dl=cr(v.buildImpressionRequestParams(dm[dk].name,dm[dk].piece,dm[dk].target),undefined,"contentImpressions");if(dl){dp.push(dl)}}return dp}function cA(dl){var dk=v.collectContent(dl);return bz(dk,dl)}function ba(dl){if(!dl||!dl.length){return[]}var dk;for(dk=0;dk<dl.length;dk++){if(!v.isNodeVisible(dl[dk])){dl.splice(dk,1);dk--}}if(!dl||!dl.length){return[]}return cA(dl)}function aG(dm,dk,dl){var dn=v.buildImpressionRequestParams(dm,dk,dl);
49
+ return cr(dn,null,"contentImpression")}function dc(dn,dl){if(!dn){return}var dk=v.findParentContentNode(dn);var dm=v.buildContentBlock(dk);if(!dm){return}if(!dl){dl="Unknown"}return aQ(dl,dm.name,dm.piece,dm.target)}function cQ(dl,dn,dk,dm){return"e_c="+s(dl)+"&e_a="+s(dn)+(J(dk)?"&e_n="+s(dk):"")+(J(dm)?"&e_v="+s(dm):"")+"&ca=1"}function at(dm,dp,dk,dn,dr,dq){if(!Y(dm)||!Y(dp)){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dl=cr(cQ(dm,dp,dk,dn),dr,"event");bH(dl,bL,dq)}function b9(dk,dn,dl,dp){var dm=cr("search="+s(dk)+(dn?"&search_cat="+s(dn):"")+(J(dl)?"&search_count="+dl:""),dp,"sitesearch");bH(dm,bL)}function cU(dk,dp,dn,dm){var dl=cr("idgoal="+dk+(dp?"&revenue="+dp:""),dn,"goal");bH(dl,bL,dm)}function c3(dn,dk,ds,dr,dm){var dq=dk+"="+s(b3(dn));var dl=cu(dm,"click",dn);if(dl){dq+="&"+dl}var dp=cr(dq,ds,"link");bH(dp,bL,dr)}function bV(dl,dk){if(dl!==""){return dl+dk.charAt(0).toUpperCase()+dk.slice(1)
50
+ }return dk}function ch(dq){var dp,dk,dn=["","webkit","ms","moz"],dm;if(!bf){for(dk=0;dk<dn.length;dk++){dm=dn[dk];if(Object.prototype.hasOwnProperty.call(G,bV(dm,"hidden"))){if(G[bV(dm,"visibilityState")]==="prerender"){dp=true}break}}}if(dp){an(G,dm+"visibilitychange",function dl(){G.removeEventListener(dm+"visibilitychange",dl,false);dq()});return}dq()}function bt(){var dl=bK.getVisitorId();var dk=aK();return dl+dk}function cj(dk){if(!dk){return}if(!ae.hasNodeAttribute(dk,"href")){return}var dl=ae.getAttributeValueFromNode(dk,"href");if(!dl||aV(dl)){return}if(!bK.getVisitorId()){return}dl=j(dl,av);var dm=bt();dl=F(dl,av,dm);ae.setAnyAttribute(dk,"href",dl)}function bm(dn){var dp=ae.getAttributeValueFromNode(dn,"href");if(!dp){return false}dp=String(dp);var dl=dp.indexOf("//")===0||dp.indexOf("http://")===0||dp.indexOf("https://")===0;if(!dl){return false}var dk=dn.pathname||cl(dn.href);var dm=(dn.hostname||d(dn.href)).toLowerCase();if(ar(dm,dk)){if(!cI(cV,L(dm))){return true}return false
51
+ }return false}function cH(dk){var dl=dd(dk);if(dl&&dl.type){dl.href=o(dl.href);c3(dl.href,dl.type,undefined,null,dk);return}if(cO){dk=au(dk);if(bm(dk)){cj(dk)}}}function cw(){return G.all&&!G.addEventListener}function cW(dk){var dm=dk.which;var dl=(typeof dk.button);if(!dm&&dl!=="undefined"){if(cw()){if(dk.button&1){dm=1}else{if(dk.button&2){dm=3}else{if(dk.button&4){dm=2}}}}else{if(dk.button===0||dk.button==="0"){dm=1}else{if(dk.button&1){dm=2}else{if(dk.button&2){dm=3}}}}}return dm}function bU(dk){switch(cW(dk)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a2(dk){return dk.target||dk.srcElement}function cX(dk){return dk==="A"||dk==="AREA"}function aC(dk){function dl(dn){var dp=a2(dn);var dq=dp.nodeName;var dm=a1(bB,"ignore");while(!cX(dq)&&dp&&dp.parentNode){dp=dp.parentNode;dq=dp.nodeName}if(dp&&cX(dq)&&!dm.test(dp.className)){return dp}}return function(dp){dp=dp||S.event;var dq=dl(dp);if(!dq){return}var dn=bU(dp);if(dp.type==="click"){var dm=false;if(dk&&dn==="middle"){dm=true
52
+ }if(dq&&!dm){cH(dq)}}else{if(dp.type==="mousedown"){if(dn==="middle"&&dq){aS=dn;bD=dq}else{aS=bD=null}}else{if(dp.type==="mouseup"){if(dn===aS&&dq===bD){cH(dq)}aS=bD=null}else{if(dp.type==="contextmenu"){cH(dq)}}}}}}function aq(dn,dm,dk){var dl=typeof dm;if(dl==="undefined"){dm=true}an(dn,"click",aC(dm),dk);if(dm){an(dn,"mouseup",aC(dm),dk);an(dn,"mousedown",aC(dm),dk);an(dn,"contextmenu",aC(dm),dk)}}function aT(dl,dp,dq){if(cf){return true}cf=true;var dr=false;var dn,dm;function dk(){dr=true}m(function(){function ds(du){setTimeout(function(){if(!cf){return}dr=false;dq.trackVisibleContentImpressions();ds(du)},du)}function dt(du){setTimeout(function(){if(!cf){return}if(dr){dr=false;dq.trackVisibleContentImpressions()}dt(du)},du)}if(dl){dn=["scroll","resize"];for(dm=0;dm<dn.length;dm++){if(G.addEventListener){G.addEventListener(dn[dm],dk,false)}else{S.attachEvent("on"+dn[dm],dk)}}dt(100)}if(dp&&dp>0){dp=parseInt(dp,10);ds(dp)}})}var bF={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dk=this.requests;
53
+ this.requests=[];if(dk.length===1){bH(dk[0],bL)}else{dg(dk,bL)}},canQueue:function(){return !l&&this.enabled},pushMultiple:function(dl){if(!this.canQueue()){dg(dl,bL);return}var dk;for(dk=0;dk<dl.length;dk++){this.push(dl[dk])}},push:function(dk){if(!dk){return}if(!this.canQueue()){bH(dk,bL);return}bF.requests.push(dk);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bF.timeout=null;bF.sendRequests()},bF.interval);var dl="RequestQueue"+ax;if(!Object.prototype.hasOwnProperty.call(b,dl)){b[dl]={unload:function(){if(bF.timeout){clearTimeout(bF.timeout)}bF.sendRequests()}}}}};bj();aN();this.hasConsent=function(){return bE};this.getVisitorId=function(){return aZ().uuid};this.getVisitorInfo=function(){return cP()};this.getAttributionInfo=function(){return bN()};this.getAttributionCampaignName=function(){return bN()[0]};this.getAttributionCampaignKeyword=function(){return bN()[1]};this.getAttributionReferrerTimestamp=function(){return bN()[2]};this.getAttributionReferrerUrl=function(){return bN()[3]
54
+ };this.setTrackerUrl=function(dk){aE=dk};this.getTrackerUrl=function(){return aE};this.getMatomoUrl=function(){return W(this.getTrackerUrl(),bJ)};this.getPiwikUrl=function(){return this.getMatomoUrl()};this.addTracker=function(dm,dl){if(!J(dm)||null===dm){dm=this.getTrackerUrl()}var dk=new P(dm,dl);I.push(dk);t.trigger("TrackerAdded",[this]);return dk};this.getSiteId=function(){return b7};this.setSiteId=function(dk){b4(dk)};this.resetUserId=function(){bA=""};this.setUserId=function(dk){if(Y(dk)){bA=dk}};this.setVisitorId=function(dl){var dk=/[0-9A-Fa-f]{16}/g;if(w(dl)&&dk.test(dl)){bP=dl}else{ak("Invalid visitorId set"+dl)}};this.getUserId=function(){return bA};this.setCustomData=function(dk,dl){if(V(dk)){ao=dk}else{if(!ao){ao={}}ao[dk]=dl}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dk){cc=dk};this.appendToTrackingUrl=function(dk){c1=dk};this.getRequest=function(dk){return cr(dk)};this.addPlugin=function(dk,dl){b[dk]=dl};this.setCustomDimension=function(dk,dl){dk=parseInt(dk,10);
55
+ if(dk>0){if(!J(dl)){dl=""}if(!w(dl)){dl=String(dl)}bo[dk]=dl}};this.getCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0&&Object.prototype.hasOwnProperty.call(bo,dk)){return bo[dk]}};this.deleteCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0){delete bo[dk]}};this.setCustomVariable=function(dl,dk,dp,dm){var dn;if(!J(dm)){dm="visit"}if(!J(dk)){return}if(!J(dp)){dp=""}if(dl>0){dk=!w(dk)?String(dk):dk;dp=!w(dp)?String(dp):dp;dn=[dk.slice(0,bv),dp.slice(0,bv)];if(dm==="visit"||dm===2){cG();aR[dl]=dn}else{if(dm==="page"||dm===3){bX[dl]=dn}else{if(dm==="event"){cm[dl]=dn}}}}};this.getCustomVariable=function(dl,dm){var dk;if(!J(dm)){dm="visit"}if(dm==="page"||dm===3){dk=bX[dl]}else{if(dm==="event"){dk=cm[dl]}else{if(dm==="visit"||dm===2){cG();dk=aR[dl]}}}if(!J(dk)||(dk&&dk[0]==="")){return false}return dk};this.deleteCustomVariable=function(dk,dl){if(this.getCustomVariable(dk,dl)){this.setCustomVariable(dk,"","",dl)}};this.deleteCustomVariables=function(dk){if(dk==="page"||dk===3){bX={}
56
+ }else{if(dk==="event"){cm={}}else{if(dk==="visit"||dk===2){aR={}}}}};this.storeCustomVariablesInCookie=function(){bR=true};this.setLinkTrackingTimer=function(dk){bL=dk};this.getLinkTrackingTimer=function(){return bL};this.setDownloadExtensions=function(dk){if(w(dk)){dk=dk.split("|")}c8=dk};this.addDownloadExtensions=function(dl){var dk;if(w(dl)){dl=dl.split("|")}for(dk=0;dk<dl.length;dk++){c8.push(dl[dk])}};this.removeDownloadExtensions=function(dm){var dl,dk=[];if(w(dm)){dm=dm.split("|")}for(dl=0;dl<c8.length;dl++){if(M(dm,c8[dl])===-1){dk.push(c8[dl])}}c8=dk};this.setDomains=function(dk){ay=w(dk)?[dk]:dk;var dp=false,dm=0,dl;for(dm;dm<ay.length;dm++){dl=String(ay[dm]);if(cI(cV,L(dl))){dp=true;break}var dn=cl(dl);if(dn&&dn!=="/"&&dn!=="/*"){dp=true;break}}if(!dp){ay.push(cV)}};this.enableCrossDomainLinking=function(){cO=true};this.disableCrossDomainLinking=function(){cO=false};this.isCrossDomainLinkingEnabled=function(){return cO};this.setCrossDomainLinkingTimeout=function(dk){a0=dk};this.getCrossDomainLinkingUrlParameter=function(){return s(av)+"="+s(bt())
57
+ };this.setIgnoreClasses=function(dk){bB=w(dk)?[dk]:dk};this.setRequestMethod=function(dk){if(dk){db=String(dk).toUpperCase()}else{db=ci}if(db==="GET"){this.disableAlwaysUseSendBeacon()}};this.setRequestContentType=function(dk){cx=dk||aI};this.setGenerationTimeMs=function(dk){ak("setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. There is currently no replacement yet.")};this.setReferrerUrl=function(dk){bp=dk};this.setCustomUrl=function(dk){a5=bW(bO,dk)};this.getCurrentUrl=function(){return a5||bO};this.setDocumentTitle=function(dk){bk=dk};this.setPageViewId=function(dk){aM=dk;bC=true};this.setAPIUrl=function(dk){bJ=dk};this.setDownloadClasses=function(dk){bM=w(dk)?[dk]:dk};this.setLinkClasses=function(dk){a9=w(dk)?[dk]:dk};this.setCampaignNameKey=function(dk){cp=w(dk)?[dk]:dk};this.setCampaignKeywordKey=function(dk){bI=w(dk)?[dk]:dk};this.discardHashTag=function(dk){bQ=dk};this.setCookieNamePrefix=function(dk){bl=dk;if(aR){aR=bY()}};this.setCookieDomain=function(dk){var dl=L(dk);
58
+ if(!bn&&!by(dl)){ak("Can't write cookie on domain "+dk)}else{cZ=dl;bj()}};this.getCookieDomain=function(){return cZ};this.hasCookies=function(){return"1"===b6()};this.setSessionCookie=function(dm,dl,dk){if(!dm){throw new Error("Missing cookie name")}if(!J(dk)){dk=cn}bw.push(dm);df(aU(dm),dl,dk,br,cZ,bT,aJ)};this.getCookie=function(dl){var dk=aD(aU(dl));if(dk===0){return null}return dk};this.setCookiePath=function(dk){br=dk;bj()};this.getCookiePath=function(dk){return br};this.setVisitorCookieTimeout=function(dk){cL=dk*1000};this.setSessionCookieTimeout=function(dk){cn=dk*1000};this.getSessionCookieTimeout=function(){return cn};this.setReferralCookieTimeout=function(dk){c7=dk*1000};this.setConversionAttributionFirstReferrer=function(dk){bx=dk};this.setSecureCookie=function(dk){if(dk&&location.protocol!=="https:"){ak("Error in setSecureCookie: You cannot use `Secure` on http.");return}bT=dk};this.setCookieSameSite=function(dk){dk=String(dk);dk=dk.charAt(0).toUpperCase()+dk.toLowerCase().slice(1);
59
+ if(dk!=="None"&&dk!=="Lax"&&dk!=="Strict"){ak("Ignored value for sameSite. Please use either Lax, None, or Strict.");return}if(dk==="None"){if(location.protocol==="https:"){this.setSecureCookie(true)}else{ak("sameSite=None cannot be used on http, reverted to sameSite=Lax.");dk="Lax"}}aJ=dk};this.disableCookies=function(){bn=true;if(b7){aF()}};this.areCookiesEnabled=function(){return !bn};this.setCookieConsentGiven=function(){if(bn&&!cR){bn=false;if(b7&&aw){aN();var dk=cr("ping=1",null,"ping");bH(dk,bL)}}};this.requireCookieConsent=function(){if(this.getRememberedCookieConsent()){return false}this.disableCookies();return true};this.getRememberedCookieConsent=function(){return aD(cE)};this.forgetCookieConsentGiven=function(){bZ(cE,br,cZ);this.disableCookies()};this.rememberCookieConsentGiven=function(dl){if(dl){dl=dl*60*60*1000}else{dl=30*365*24*60*60*1000}this.setCookieConsentGiven();var dk=new Date().getTime();df(cE,dk,dl,br,cZ,bT,aJ)};this.deleteCookies=function(){aF()};this.setDoNotTrack=function(dl){var dk=g.doNotTrack||g.msDoNotTrack;
60
+ cR=dl&&(dk==="yes"||dk==="1");if(cR){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cY=true};this.disableAlwaysUseSendBeacon=function(){cY=false};this.addListener=function(dl,dk){aq(dl,dk,false)};this.enableLinkTracking=function(dl){if(da){return}da=true;var dk=this;p(function(){ap=true;var dm=G.body;aq(dm,dl,true)})};this.enableJSErrorTracking=function(){if(cT){return}cT=true;var dk=S.onerror;S.onerror=function(dq,dn,dm,dp,dl){ch(function(){var dr="JavaScript Errors";var ds=dn+":"+dm;if(dp){ds+=":"+dp}if(M(cs,dr+ds+dq)===-1){cs.push(dr+ds+dq);at(dr,ds,dq)}});if(dk){return dk(dq,dn,dm,dp,dl)}return false}};this.disablePerformanceTracking=function(){a3=false};this.enableHeartBeatTimer=function(dk){dk=Math.max(dk||15,5);a6=dk*1000;if(c0!==null){dh()}};this.disableHeartBeatTimer=function(){if(a6||aO){if(S.removeEventListener){S.removeEventListener("focus",bb);S.removeEventListener("blur",az)}else{if(S.detachEvent){S.detachEvent("onfocus",bb);S.detachEvent("onblur",az)}}}a6=null;
61
+ aO=false};this.killFrame=function(){if(S.location!==S.top.location){S.top.location=S.location}};this.redirectFile=function(dk){if(S.location.protocol==="file:"){S.location=dk}};this.setCountPreRendered=function(dk){bf=dk};this.trackGoal=function(dk,dn,dm,dl){ch(function(){cU(dk,dn,dm,dl)})};this.trackLink=function(dl,dk,dn,dm){ch(function(){c3(dl,dk,dn,dm)})};this.getNumTrackedPageViews=function(){return cq};this.trackPageView=function(dk,dm,dl){cb=[];cM=[];cs=[];if(N(b7)){ch(function(){Z(aE,bJ,b7)})}else{ch(function(){cq++;b1(dk,dm,dl)})}};this.trackAllContentImpressions=function(){if(N(b7)){return}ch(function(){p(function(){var dk=v.findContentNodes();var dl=cA(dk);bF.pushMultiple(dl)})})};this.trackVisibleContentImpressions=function(dk,dl){if(N(b7)){return}if(!J(dk)){dk=true}if(!J(dl)){dl=750}aT(dk,dl,this);ch(function(){m(function(){var dm=v.findContentNodes();var dn=ba(dm);bF.pushMultiple(dn)})})};this.trackContentImpression=function(dm,dk,dl){if(N(b7)){return}dm=a(dm);dk=a(dk);dl=a(dl);
62
+ if(!dm){return}dk=dk||"Unknown";ch(function(){var dn=aG(dm,dk,dl);bF.push(dn)})};this.trackContentImpressionsWithinNode=function(dk){if(N(b7)||!dk){return}ch(function(){if(cf){m(function(){var dl=v.findContentNodesWithinNode(dk);var dm=ba(dl);bF.pushMultiple(dm)})}else{p(function(){var dl=v.findContentNodesWithinNode(dk);var dm=cA(dl);bF.pushMultiple(dm)})}})};this.trackContentInteraction=function(dm,dn,dk,dl){if(N(b7)){return}dm=a(dm);dn=a(dn);dk=a(dk);dl=a(dl);if(!dm||!dn){return}dk=dk||"Unknown";ch(function(){var dp=aQ(dm,dn,dk,dl);if(dp){bF.push(dp)}})};this.trackContentInteractionNode=function(dm,dl){if(N(b7)||!dm){return}var dk=null;ch(function(){dk=dc(dm,dl);if(dk){bF.push(dk)}});return dk};this.logAllContentBlocksOnPage=function(){var dm=v.findContentNodes();var dk=v.collectContent(dm);var dl=typeof console;if(dl!=="undefined"&&console&&console.log){console.log(dk)}};this.trackEvent=function(dl,dn,dk,dm,dq,dp){ch(function(){at(dl,dn,dk,dm,dq,dp)})};this.trackSiteSearch=function(dk,dm,dl,dn){cb=[];
63
+ ch(function(){b9(dk,dm,dl,dn)})};this.setEcommerceView=function(dp,dk,dm,dl){ct={};if(Y(dm)){dm=String(dm)}if(!J(dm)||dm===null||dm===false||!dm.length){dm=""}else{if(dm instanceof Array){dm=S.JSON.stringify(dm)}}var dn="_pkc";ct[dn]=dm;if(J(dl)&&dl!==null&&dl!==false&&String(dl).length){dn="_pkp";ct[dn]=dl}if(!Y(dp)&&!Y(dk)){return}if(Y(dp)){dn="_pks";ct[dn]=dp}if(!Y(dk)){dk=""}dn="_pkn";ct[dn]=dk};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c2))};this.addEcommerceItem=function(dp,dk,dm,dl,dn){if(Y(dp)){c2[dp]=[String(dp),dk,dm,dl,dn]}};this.removeEcommerceItem=function(dk){if(Y(dk)){dk=String(dk);delete c2[dk]}};this.clearEcommerceCart=function(){c2={}};this.trackEcommerceOrder=function(dk,dp,dn,dm,dl,dq){b0(dk,dp,dn,dm,dl,dq)};this.trackEcommerceCartUpdate=function(dk){bu(dk)};this.trackRequest=function(dl,dn,dm,dk){ch(function(){var dp=cr(dl,dn,dk);bH(dp,bL,dm)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bF.enabled=false
64
+ };this.setRequestQueueInterval=function(dk){if(dk<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bF.interval=dk};this.queueRequest=function(dk){ch(function(){var dl=cr(dk);bF.push(dl)})};this.isConsentRequired=function(){return cB};this.getRememberedConsent=function(){var dk=aD(be);if(aD(cN)){if(dk){bZ(be,br,cZ)}return null}if(!dk||dk===0){return null}return dk};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cB=true;bE=this.hasRememberedConsent();if(!bE){bn=true}x++;b["CoreConsent"+x]={unload:function(){if(!bE){aF()}}}};this.setConsentGiven=function(dl){bE=true;bZ(cN,br,cZ);var dm,dk;for(dm=0;dm<cM.length;dm++){dk=typeof cM[dm];if(dk==="string"){bH(cM[dm],bL)}else{if(dk==="object"){dg(cM[dm],bL)}}}cM=[];if(!J(dl)||dl){this.setCookieConsentGiven()}};this.rememberConsentGiven=function(dm){if(dm){dm=dm*60*60*1000}else{dm=30*365*24*60*60*1000}var dk=true;this.setConsentGiven(dk);var dl=new Date().getTime();
65
+ df(be,dl,dm,br,cZ,bT,aJ)};this.forgetConsentGiven=function(){var dk=30*365*24*60*60*1000;bZ(be,br,cZ);df(cN,new Date().getTime(),dk,br,cZ,bT,aJ);this.forgetCookieConsentGiven();this.requireConsent()};this.isUserOptedOut=function(){return !bE};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=function(){this.setConsentGiven(false)};m(function(){setTimeout(function(){bG=true},0)});t.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];if(av[ap]>1&&ap!=="addTracker"&&ap!=="enableLinkTracking"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking"];
66
+ function ad(aq,ap){var ao=new P(aq,ap);I.push(ao);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();t.trigger("TrackerAdded",[ao]);return ao}an(S,"beforeunload",ai,false);an(S,"online",function(){if(J(g.serviceWorker)){g.serviceWorker.ready.then(function(ao){if(ao&&ao.sync){return ao.sync.register("matomoSync")}},function(){})}},false);an(S,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getMatomoUrl());if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})
67
  }else{if(J(aq.maq_opted_in)){at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;t={initialized:false,JSON:S.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:m,onReady:p,isNodeVisible:i,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||S,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ap,ao){if(!J(ao)){ao=this.getAsyncTracker().getSiteId()}if(!J(ap)){ap=this.getAsyncTracker().getTrackerUrl()
68
  }return new P(ap,ao)},getAsyncTrackers:function(){return I},addTracker:function(aq,ap){var ao;if(!I.length){ao=ad(aq,ap)}else{ao=I[0].addTracker(aq,ap)}return ao},getAsyncTracker:function(at,ar){var aq;if(I&&I.length&&I[0]){aq=I[0]}else{return ad(at,ar)}if(!ar&&!at){return aq}if((!J(ar)||null===ar)&&aq){ar=aq.getSiteId()}if((!J(at)||null===at)&&aq){at=aq.getTrackerUrl()}var ap,ao=0;for(ao;ao<I.length;ao++){ap=I[ao];if(ap&&String(ap.getSiteId())===String(ar)&&ap.getTrackerUrl()===at){return ap}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return t});define("matomo",[],function(){return t})}return t}())}
69
  /*!!! pluginTrackerHook */
app/piwik.js CHANGED
@@ -28,42 +28,42 @@ ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.fin
28
  }}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(S.innerWidth&&ap>S.innerWidth){ap=S.innerWidth}var ao=ar.clientHeight;if(S.innerHeight&&ao>S.innerHeight){ao=S.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=i(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+s(ao)}if(ap){if(at){at+="&"}at+="c_n="+s(ap)}if(aq){if(at){at+="&"}at+="c_p="+s(aq)}if(ar){if(at){at+="&"}at+="c_t="+s(ar)}if(at){at+="&ca=1"}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+s(ao)+"&c_p="+s(ap);if(aq){ar+="&c_t="+s(aq)
29
  }if(ar){ar+="&ca=1"}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||S.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap
30
  }if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(ao){if(ae.hasNodeAttribute(ao,this.CONTENT_IGNOREINTERACTION_ATTR)){return true}if(ae.hasNodeCssClass(ao,this.CONTENT_IGNOREINTERACTION_CLASS)){return true}if(ae.hasNodeCssClass(ao,this.LEGACY_CONTENT_IGNOREINTERACTION_CLASS)){return true}return false}};function W(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(Q(ap,"matomo.php")){ap=f(ap,"matomo.php".length)
31
- }else{if(Q(ap,"piwik.php")){ap=f(ap,"piwik.php".length)}else{if(Q(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(Q(ap,"/js/")){ap=f(ap,"js/".length)}return ap}function N(av){var ax="Matomo_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}S.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=S.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,av,aq){var au=S.name.split("###"),at=au[1],ao=au[2],ar=au[3],aw=W(ap,av);n(aw+"plugins/Overlay/client/client.js?v=1",function(){Matomo_Overlay_Client.initialize(aw,aq,at,ao,ar)})}function u(){var aq;try{aq=S.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return S.self!==S.top
32
- }catch(ao){return true}}function P(ce,ca){var bK=this,be="mtm_consent",cE="mtm_cookie_consent",cN="mtm_consent_removed",b5=aa(G.domain,S.location.href,K()),cV=L(b5[0]),bO=o(b5[1]),bp=o(b5[2]),cT=false,ci="GET",da=ci,aI="application/x-www-form-urlencoded; charset=UTF-8",cx=aI,aE=ce||"",bJ="",c0="",b7=ca||"",bA="",bP="",a5,bk="",c7=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","rtf","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ay=[cV],bB=[],bM=[],a9=[],bL=500,cX=true,cK,a6,bS,bQ,ao,cp=["pk_campaign","mtm_campaign","piwik_campaign","matomo_campaign","utm_campaign","utm_source","utm_medium"],bI=["pk_kwd","mtm_kwd","piwik_kwd","matomo_kwd","utm_term"],bl="_pk_",av="pk_vid",a0=180,cY,br,bT=false,aJ="Lax",bn=false,cR,bf,bx,cL=33955200000,cn=1800000,c6=15768000000,a3=true,bG=false,bi=false,bR=false,aR=false,cc,bX={},cm={},bo={},bv=200,ct={},c1={},c8={},cb=[],cf=false,cC=false,ap=false,c9=false,cO=false,aO=false,bd=u(),cy=null,cZ=null,aS,bC,b8=am,bq,aM,cq=0,bw=["id","ses","cvar","ref"],cB=false,bD=null,cM=[],cs=[],ax=T++,aw=false;
33
- try{bk=G.title}catch(cz){bk=""}function de(dr,dp,dn,dq,dm,dl,dk){if(bn&&dr!==cN){return}var dj;if(dn){dj=new Date();dj.setTime(dj.getTime()+dn)}if(!dk){dk="Lax"}G.cookie=dr+"="+s(dp)+(dn?";expires="+dj.toGMTString():"")+";path="+(dq||"/")+(dm?";domain="+dm:"")+(dl?";secure":"")+";SameSite="+dk}function aD(dl){if(bn){return 0}var dj=new RegExp("(^|;)[ ]*"+dl+"=([^;]*)"),dk=dj.exec(G.cookie);return dk?R(dk[2]):0}bD=!aD(cN);function b3(dj){var dk;dj=j(dj,av);if(bQ){dk=new RegExp("#.*");return dj.replace(dk,"")}return dj}function bW(dl,dj){var dm=r(dj),dk;if(dm){return dj}if(dj.slice(0,1)==="/"){return r(dl)+"://"+d(dl)+dj}dl=b3(dl);dk=dl.indexOf("?");if(dk>=0){dl=dl.slice(0,dk)}dk=dl.lastIndexOf("/");if(dk!==dl.length-1){dl=dl.slice(0,dk+1)}return dl+dj}function cI(dl,dj){var dk;dl=String(dl).toLowerCase();dj=String(dj).toLowerCase();if(dl===dj){return true}if(dj.slice(0,1)==="."){if(dl===dj.slice(1)){return true}dk=dl.length-dj.length;if((dk>0)&&(dl.slice(dk)===dj)){return true}}return false
34
- }function cl(dj){var dk=document.createElement("a");if(dj.indexOf("//")!==0&&dj.indexOf("http")!==0){if(dj.indexOf("*")===0){dj=dj.substr(1)}if(dj.indexOf(".")===0){dj=dj.substr(1)}dj="http://"+dj}dk.href=v.toAbsoluteUrl(dj);if(dk.pathname){return dk.pathname}return""}function a4(dk,dj){if(!aj(dj,"/")){dj="/"+dj}if(!aj(dk,"/")){dk="/"+dk}var dl=(dj==="/"||dj==="/*");if(dl){return true}if(dk===dj){return true}dj=String(dj).toLowerCase();dk=String(dk).toLowerCase();if(Q(dj,"*")){dj=dj.slice(0,-1);dl=(!dj||dj==="/");if(dl){return true}if(dk===dj){return true}return dk.indexOf(dj)===0}if(!Q(dk,"/")){dk+="/"}if(!Q(dj,"/")){dj+="/"}return dk.indexOf(dj)===0}function ar(dn,dq){var dk,dj,dl,dm,dp;for(dk=0;dk<ay.length;dk++){dm=L(ay[dk]);dp=cl(ay[dk]);if(cI(dn,dm)&&a4(dq,dp)){return true}}return false}function aW(dm){var dk,dj,dl;for(dk=0;dk<ay.length;dk++){dj=L(ay[dk].toLowerCase());if(dm===dj){return true}if(dj.slice(0,1)==="."){if(dm===dj.slice(1)){return true}dl=dm.length-dj.length;if((dl>0)&&(dm.slice(dl)===dj)){return true
35
- }}}return false}function co(dj,dl){dj=dj.replace("send_image=0","send_image=1");var dk=new Image(1,1);dk.onload=function(){E=0;if(typeof dl==="function"){dl({request:dj,trackerUrl:aE,success:true})}};dk.onerror=function(){if(typeof dl==="function"){dl({request:dj,trackerUrl:aE,success:false})}};dk.src=aE+(aE.indexOf("?")<0?"?":"&")+dj}function cF(dj){if(da==="POST"){return true}return dj&&(dj.length>2000||dj.indexOf('{"requests"')===0)}function aL(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function a7(dn,dr,dq){var dl=aL();if(!dl){return false}var dm={type:"application/x-www-form-urlencoded; charset=UTF-8"};var ds=false;var dk=aE;try{var dj=new Blob([dn],dm);if(dq&&!cF(dn)){dj=new Blob([],dm);dk=dk+(dk.indexOf("?")<0?"?":"&")+dn}ds=g.sendBeacon(dk,dj)}catch(dp){return false}if(ds&&typeof dr==="function"){dr({request:dn,trackerUrl:aE,success:true,isSendBeacon:true})}return ds}function c5(dk,dl,dj){if(!J(dj)||null===dj){dj=true}if(l&&a7(dk,dl,dj)){return
36
- }setTimeout(function(){if(l&&a7(dk,dl,dj)){return}var dp;try{var dn=S.XMLHttpRequest?new S.XMLHttpRequest():S.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dn.open("POST",aE,true);dn.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dq=l&&a7(dk,dl,dj);if(!dq&&dj){co(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aE,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dl==="function")){dl({request:dk,trackerUrl:aE,success:true,xhr:this})}}};dn.setRequestHeader("Content-Type",cx);dn.withCredentials=true;dn.send(dk)}catch(dm){dp=l&&a7(dk,dl,dj);if(!dp&&dj){co(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aE,success:false})}}}},50)}function cg(dk){var dj=new Date();var dl=dj.getTime()+dk;if(!q||dl>q){q=dl}}function bb(){bd=true;cy=new Date().getTime()}function dd(){var dj=new Date().getTime();return !cy||(dj-cy)>a6}function az(){if(dd()){bS()}}function dg(){if(aO||!a6){return}aO=true;an(S,"focus",bb);
37
- an(S,"blur",az);ab++;t.addPlugin("HeartBeat"+ab,{unload:function(){if(aO&&dd()){bS()}}})}function cD(dn){var dk=new Date();var dj=dk.getTime();cZ=dj;if(cC&&dj<cC){var dl=cC-dj;setTimeout(dn,dl);cg(dl+50);cC+=50;return}if(cC===false){var dm=800;cC=dj+dm}dn()}function aP(){if(aD(cN)){bD=false}else{if(aD(be)){bD=true}}}function bH(dk,dj,dl){aP();if(!bD){cM.push(dk);return}aw=true;if(!cR&&dk){if(cB&&bD){dk+="&consent=1"}cD(function(){if(cX&&a7(dk,dl,true)){cg(100);return}if(cF(dk)){c5(dk,dl)}else{co(dk,dl)}cg(dj)})}if(!aO){dg()}}function ck(dj){if(cR){return false}return(dj&&dj.length)}function c4(dj,dn){if(!dn||dn>=dj.length){return[dj]}var dk=0;var dl=dj.length;var dm=[];for(dk;dk<dl;dk+=dn){dm.push(dj.slice(dk,dk+dn))}return dm}function df(dk,dj){if(!ck(dk)){return}if(!bD){cM.push(dk);return}aw=true;cD(function(){var dn=c4(dk,50);var dl=0,dm;for(dl;dl<dn.length;dl++){dm='{"requests":["?'+dn[dl].join('","?')+'"],"send_image":0}';if(cX&&a7(dm,null,false)){cg(100)}else{c5(dm,null,false)}}cg(dj)
38
- })}function aU(dj){return bl+dj+"."+b7+"."+bq}function bZ(dl,dk,dj){de(dl,"",-86400,dk,dj)}function b6(){if(bn){return"0"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){return g.cookieEnabled?"1":"0"}var dj=bl+"testcookie";de(dj,"1",undefined,br,cY,bT,aJ);var dk=aD(dj)==="1"?"1":"0";bZ(dj);return dk}function bj(){bq=b8((cY||cV)+(br||"/")).slice(0,4)}function cJ(){if(J(c8.res)){return c8}var dk,dm,dn={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",fla:"application/x-shockwave-flash",java:"application/x-java-vm",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(g.userAgent))){if(g.mimeTypes&&g.mimeTypes.length){for(dk in dn){if(Object.prototype.hasOwnProperty.call(dn,dk)){dm=g.mimeTypes[dn[dk]];c8[dk]=(dm&&dm.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(g.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(g.javaEnabled)&&g.javaEnabled()){c8.java="1"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){c8.cookie=g.cookieEnabled?"1":"0"
39
- }else{c8.cookie=b6()}}var dl=parseInt(X.width,10);var dj=parseInt(X.height,10);c8.res=parseInt(dl,10)+"x"+parseInt(dj,10);return c8}function bY(){var dk=aU("cvar"),dj=aD(dk);if(dj&&dj.length){dj=S.JSON.parse(dj);if(V(dj)){return dj}}return{}}function cG(){if(aR===false){aR=bY()}}function cS(){var dj=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dj)+(new Date()).getTime()+Math.random()).slice(0,16)}function aB(){var dj=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dj)).slice(0,6)}function bg(){return Math.floor((new Date()).getTime()/1000)}function aK(){var dk=bg();var dl=aB();var dj=String(dk)+dl;return dj}function c3(dl){dl=String(dl);var dp=aB();var dm=dp.length;var dn=dl.substr(-1*dm,dm);var dk=parseInt(dl.substr(0,dl.length-dm),10);if(dk&&dn&&dn===dp){var dj=bg();if(a0<=0){return true}if(dj>=dk&&dj<=(dk+a0)){return true}}return false}function dh(dj){if(!cO){return""}var dn=e(dj,av);if(!dn){return""}dn=String(dn);var dl=new RegExp("^[a-zA-Z0-9]+$");
40
- if(dn.length===32&&dl.test(dn)){var dk=dn.substr(16,32);if(c3(dk)){var dm=dn.substr(0,16);return dm}}return""}function cP(){if(!bP){bP=dh(bO)}var dl=new Date(),dj=Math.round(dl.getTime()/1000),dk=aU("id"),dp=aD(dk),dn,dm;if(dp){dn=dp.split(".");dn.unshift("0");if(bP.length){dn[1]=bP}return dn}if(bP.length){dm=bP}else{if("0"===b6()){dm=""}else{dm=cS()}}dn=["1",dm,dj];return dn}function aZ(){var dm=cP(),dk=dm[0],dl=dm[1],dj=dm[2];return{newVisitor:dk,uuid:dl,createTs:dj}}function aH(){var dm=new Date(),dk=dm.getTime(),dn=aZ().createTs;var dj=parseInt(dn,10);var dl=(dj*1000)+cL-dk;return dl}function aN(dj){if(!b7){return}var dl=new Date(),dk=Math.round(dl.getTime()/1000);if(!J(dj)){dj=aZ()}var dm=dj.uuid+"."+dj.createTs+".";de(aU("id"),dm,aH(),br,cY,bT,aJ)}function bN(){var dj=aD(aU("ref"));if(dj.length){try{dj=S.JSON.parse(dj);if(V(dj)){return dj}}catch(dk){}}return["","",0,""]}function by(dl){var dk=bl+"testcookie_domain";var dj="testvalue";de(dk,dj,10000,null,dl,bT,aJ);if(aD(dk)===dj){bZ(dk,null,dl);
41
- return true}return false}function aF(){var dk=bn;bn=false;var dj,dl;for(dj=0;dj<bw.length;dj++){dl=aU(bw[dj]);if(dl!==cN&&dl!==be&&0!==aD(dl)){bZ(dl,br,cY)}}bn=dk}function b4(dj){b7=dj}function di(dn){if(!dn||!V(dn)){return}var dm=[];var dl;for(dl in dn){if(Object.prototype.hasOwnProperty.call(dn,dl)){dm.push(dl)}}var dp={};dm.sort();var dj=dm.length;var dk;for(dk=0;dk<dj;dk++){dp[dm[dk]]=dn[dm[dk]]}return dp}function cd(){de(aU("ses"),"1",cn,br,cY,bT,aJ)}function bh(){var dm="";var dk="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dl=dk.length;var dj;for(dj=0;dj<6;dj++){dm+=dk.charAt(Math.floor(Math.random()*dl))}return dm}function aA(dk){if(!h){return dk}var dl=(typeof h.timing==="object")&&h.timing?h.timing:undefined;if(!dl){dl=(typeof h.getEntriesByType==="function")&&h.getEntriesByType("navigation")?h.getEntriesByType("navigation")[0]:undefined}if(!dl){return dk}var dj="";if(dl.connectEnd&&dl.fetchStart){if(dl.connectEnd<dl.fetchStart){return}dj+="&pf_net="+Math.round(dl.connectEnd-dl.fetchStart)
42
- }if(dl.responseStart&&dl.requestStart){if(dl.responseStart<dl.requestStart){return}dj+="&pf_srv="+Math.round(dl.responseStart-dl.requestStart)}if(dl.responseStart&&dl.responseEnd){if(dl.responseEnd<dl.responseStart){return}dj+="&pf_tfr="+Math.round(dl.responseEnd-dl.responseStart)}if(J(dl.domLoading)){if(dl.domInteractive&&dl.domLoading){if(dl.domInteractive<dl.domLoading){return}dj+="&pf_dm1="+Math.round(dl.domInteractive-dl.domLoading)}}else{if(dl.domInteractive&&dl.responseEnd){if(dl.domInteractive<dl.responseEnd){return}dj+="&pf_dm1="+Math.round(dl.domInteractive-dl.responseEnd)}}if(dl.domComplete&&dl.domInteractive){if(dl.domComplete<dl.domInteractive){return}dj+="&pf_dm2="+Math.round(dl.domComplete-dl.domInteractive)}if(dl.loadEventEnd&&dl.loadEventStart){if(dl.loadEventEnd<dl.loadEventStart){return}dj+="&pf_onl="+Math.round(dl.loadEventEnd-dl.loadEventStart)}return dk+dj}function cr(dl,dG,dH){var dF,dk=new Date(),dt=Math.round(dk.getTime()/1000),dq,dD,dm=1024,dM,du,dC=aR,dn=aU("ses"),dA=aU("ref"),dx=aU("cvar"),dy=aD(dn),dE=bN(),dI=a5||bO,dr,dj;
43
- if(bn){aF()}if(cR){return""}var dz=aZ();var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dE[0];dj=dE[1];dq=dE[2];dD=dE[3];if(!dy){if(!bx||!dr.length){for(dF in cp){if(Object.prototype.hasOwnProperty.call(cp,dF)){dr=e(dI,cp[dF]);if(dr.length){break}}}for(dF in bI){if(Object.prototype.hasOwnProperty.call(bI,dF)){dj=e(dI,bI[dF]);if(dj.length){break}}}}dM=d(bp);du=dD.length?d(dD):"";if(dM.length&&!aW(dM)&&(!bx||!du.length||aW(du))){dD=bp}if(dD.length||dr.length){dq=dt;dE=[dr,dj,dq,b3(dD.slice(0,dm))];de(dA,S.JSON.stringify(dE),c6,br,cY,bT,aJ)}}dl+="&idsite="+b7+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dk.getHours()+"&m="+dk.getMinutes()+"&s="+dk.getSeconds()+"&url="+s(b3(dI))+(bp.length?"&urlref="+s(b3(bp)):"")+(Y(bA)?"&uid="+s(bA):"")+"&_id="+dz.uuid+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+s(dr):"")+(dj.length?"&_rck="+s(dj):"")+"&_refts="+dq+(String(dD).length?"&_ref="+s(b3(dD.slice(0,dm))):"")+(dw?"&cs="+s(dw):"")+"&send_image=0";var dL=cJ();for(dF in dL){if(Object.prototype.hasOwnProperty.call(dL,dF)){dl+="&"+dF+"="+dL[dF]
44
- }}var dK=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dK.push(parseInt(dp,10));dK.push(String(dp));dl+="&"+dF+"="+s(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in ct){if(Object.prototype.hasOwnProperty.call(ct,dF)){dl+="&"+dF+"="+s(ct[dF])}}for(dF in bo){if(Object.prototype.hasOwnProperty.call(bo,dF)){var dv=(-1===M(dK,dF));if(dv){dl+="&dimension"+dF+"="+s(bo[dF])}}}if(dG){dl+="&data="+s(S.JSON.stringify(dG))}else{if(ao){dl+="&data="+s(S.JSON.stringify(ao))}}function ds(dN,dO){var dP=S.JSON.stringify(dN);if(dP.length>2){return"&"+dO+"="+s(dP)}return""}var dJ=di(bX);var dB=di(cm);dl+=ds(dJ,"cvar");dl+=ds(dB,"e_cvar");if(aR){dl+=ds(aR,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aR[dF][0]===""||aR[dF][1]===""){delete aR[dF]}}}if(bR){de(dx,S.JSON.stringify(aR),cn,br,cY,bT,aJ)}}if(a3&&bG&&!bi){dl=aA(dl);bi=true}if(aM){dl+="&pv_id="+aM}aN(dz);cd();dl+=ac(dH,{tracker:bK,request:dl});
45
- if(c0.length){dl+="&"+c0}if(A(cc)){dl=cc(dl)}return dl}bS=function a8(){var dj=new Date();dj=dj.getTime();if(!cZ){return false}if(cZ+a6<=dj){bK.ping();return true}return false};function bs(dm,dl,dr,dn,dj,du){var dq="idgoal=0",dk=new Date(),ds=[],dt,dp=String(dm).length;if(dp){dq+="&ec_id="+s(dm)}dq+="&revenue="+dl;if(String(dr).length){dq+="&ec_st="+dr}if(String(dn).length){dq+="&ec_tx="+dn}if(String(dj).length){dq+="&ec_sh="+dj}if(String(du).length){dq+="&ec_dt="+du}if(c1){for(dt in c1){if(Object.prototype.hasOwnProperty.call(c1,dt)){if(!J(c1[dt][1])){c1[dt][1]=""}if(!J(c1[dt][2])){c1[dt][2]=""}if(!J(c1[dt][3])||String(c1[dt][3]).length===0){c1[dt][3]=0}if(!J(c1[dt][4])||String(c1[dt][4]).length===0){c1[dt][4]=1}ds.push(c1[dt])}}dq+="&ec_items="+s(S.JSON.stringify(ds))}dq=cr(dq,ao,"ecommerce");bH(dq,bL);if(dp){c1={}}}function b0(dj,dn,dm,dl,dk,dp){if(String(dj).length&&J(dn)){bs(dj,dn,dm,dl,dk,dp)}}function bu(dj){if(J(dj)){bs("",dj,"","","","")}}function b1(dk,dm,dl){aM=bh();var dj=cr("action_name="+s(al(dk||bk)),dm,"log");
46
- if(a3&&!bi){dj=aA(dj)}bH(dj,bL,dl)}function a1(dl,dk){var dm,dj="(^| )(piwik[_-]"+dk+"|matomo[_-]"+dk;if(dl){for(dm=0;dm<dl.length;dm++){dj+="|"+dl[dm]}}dj+=")( |$)";return new RegExp(dj)}function aV(dj){return(aE&&dj&&0===String(dj).indexOf(aE))}function cv(dn,dj,dp,dk){if(aV(dj)){return 0}var dm=a1(bM,"download"),dl=a1(a9,"link"),dq=new RegExp("\\.("+c7.join("|")+")([?&#]|$)","i");if(dl.test(dn)){return"link"}if(dk||dm.test(dn)||dq.test(dj)){return"download"}if(dp){return 0}return"link"}function au(dk){var dj;dj=dk.parentNode;while(dj!==null&&J(dj)){if(ae.isLinkElement(dk)){break}dk=dj;dj=dk.parentNode}return dk}function dc(dp){dp=au(dp);if(!ae.hasNodeAttribute(dp,"href")){return}if(!J(dp.href)){return}var dn=ae.getAttributeValueFromNode(dp,"href");var dk=dp.pathname||cl(dp.href);var dq=dp.hostname||d(dp.href);var dr=dq.toLowerCase();var dl=dp.href.replace(dq,dr);var dm=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dm.test(dl)){var dj=cv(dp.className,dl,ar(dr,dk),ae.hasNodeAttribute(dp,"download"));
47
- if(dj){return{type:dj,href:dl}}}}function aQ(dj,dk,dl,dm){var dn=v.buildInteractionRequestParams(dj,dk,dl,dm);if(!dn){return}return cr(dn,null,"contentInteraction")}function bc(dj,dk){if(!dj||!dk){return false}var dl=v.findTargetNode(dj);if(v.shouldIgnoreInteraction(dl)){return false}dl=v.findTargetNodeNoDefault(dj);if(dl&&!U(dl,dk)){return false}return true}function cu(dl,dk,dn){if(!dl){return}var dj=v.findParentContentNode(dl);if(!dj){return}if(!bc(dj,dl)){return}var dm=v.buildContentBlock(dj);if(!dm){return}if(!dm.target&&dn){dm.target=dn}return v.buildInteractionRequestParams(dk,dm.name,dm.piece,dm.target)}function aX(dk){if(!cb||!cb.length){return false}var dj,dl;for(dj=0;dj<cb.length;dj++){dl=cb[dj];if(dl&&dl.name===dk.name&&dl.piece===dk.piece&&dl.target===dk.target){return true}}return false}function aY(dj){return function(dn){if(!dj){return}var dl=v.findParentContentNode(dj);var dk;if(dn){dk=dn.target||dn.srcElement}if(!dk){dk=dj}if(!bc(dl,dk)){return}if(!dl){return false}var dp=v.findTargetNode(dl);
48
- if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dm=dc(dp);if(c9&&dm&&dm.type){return dm.type}return bK.trackContentInteractionNode(dk,"click")}}function b2(dl){if(!dl||!dl.length){return}var dj,dk;for(dj=0;dj<dl.length;dj++){dk=v.findTargetNode(dl[dj]);if(dk&&!dk.contentInteractionTrackingSetupDone){dk.contentInteractionTrackingSetupDone=true;an(dk,"click",aY(dk))}}}function bz(dl,dm){if(!dl||!dl.length){return[]}var dj,dk;for(dj=0;dj<dl.length;dj++){if(aX(dl[dj])){dl.splice(dj,1);dj--}else{cb.push(dl[dj])}}if(!dl||!dl.length){return[]}b2(dm);var dn=[];for(dj=0;dj<dl.length;dj++){dk=cr(v.buildImpressionRequestParams(dl[dj].name,dl[dj].piece,dl[dj].target),undefined,"contentImpressions");if(dk){dn.push(dk)}}return dn}function cA(dk){var dj=v.collectContent(dk);return bz(dj,dk)}function ba(dk){if(!dk||!dk.length){return[]}var dj;for(dj=0;dj<dk.length;dj++){if(!v.isNodeVisible(dk[dj])){dk.splice(dj,1);dj--}}if(!dk||!dk.length){return[]}return cA(dk)}function aG(dl,dj,dk){var dm=v.buildImpressionRequestParams(dl,dj,dk);
49
- return cr(dm,null,"contentImpression")}function db(dm,dk){if(!dm){return}var dj=v.findParentContentNode(dm);var dl=v.buildContentBlock(dj);if(!dl){return}if(!dk){dk="Unknown"}return aQ(dk,dl.name,dl.piece,dl.target)}function cQ(dk,dm,dj,dl){return"e_c="+s(dk)+"&e_a="+s(dm)+(J(dj)?"&e_n="+s(dj):"")+(J(dl)?"&e_v="+s(dl):"")+"&ca=1"}function at(dl,dn,dj,dm,dq,dp){if(!Y(dl)||!Y(dn)){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dk=cr(cQ(dl,dn,dj,dm),dq,"event");bH(dk,bL,dp)}function b9(dj,dm,dk,dn){var dl=cr("search="+s(dj)+(dm?"&search_cat="+s(dm):"")+(J(dk)?"&search_count="+dk:""),dn,"sitesearch");bH(dl,bL)}function cU(dj,dn,dm,dl){var dk=cr("idgoal="+dj+(dn?"&revenue="+dn:""),dm,"goal");bH(dk,bL,dl)}function c2(dm,dj,dr,dq,dl){var dp=dj+"="+s(b3(dm));var dk=cu(dl,"click",dm);if(dk){dp+="&"+dk}var dn=cr(dp,dr,"link");bH(dn,bL,dq)}function bV(dk,dj){if(dk!==""){return dk+dj.charAt(0).toUpperCase()+dj.slice(1)
50
- }return dj}function ch(dp){var dn,dj,dm=["","webkit","ms","moz"],dl;if(!bf){for(dj=0;dj<dm.length;dj++){dl=dm[dj];if(Object.prototype.hasOwnProperty.call(G,bV(dl,"hidden"))){if(G[bV(dl,"visibilityState")]==="prerender"){dn=true}break}}}if(dn){an(G,dl+"visibilitychange",function dk(){G.removeEventListener(dl+"visibilitychange",dk,false);dp()});return}dp()}function bt(){var dk=bK.getVisitorId();var dj=aK();return dk+dj}function cj(dj){if(!dj){return}if(!ae.hasNodeAttribute(dj,"href")){return}var dk=ae.getAttributeValueFromNode(dj,"href");if(!dk||aV(dk)){return}if(!bK.getVisitorId()){return}dk=j(dk,av);var dl=bt();dk=F(dk,av,dl);ae.setAnyAttribute(dj,"href",dk)}function bm(dm){var dn=ae.getAttributeValueFromNode(dm,"href");if(!dn){return false}dn=String(dn);var dk=dn.indexOf("//")===0||dn.indexOf("http://")===0||dn.indexOf("https://")===0;if(!dk){return false}var dj=dm.pathname||cl(dm.href);var dl=(dm.hostname||d(dm.href)).toLowerCase();if(ar(dl,dj)){if(!cI(cV,L(dl))){return true}return false
51
- }return false}function cH(dj){var dk=dc(dj);if(dk&&dk.type){dk.href=o(dk.href);c2(dk.href,dk.type,undefined,null,dj);return}if(cO){dj=au(dj);if(bm(dj)){cj(dj)}}}function cw(){return G.all&&!G.addEventListener}function cW(dj){var dl=dj.which;var dk=(typeof dj.button);if(!dl&&dk!=="undefined"){if(cw()){if(dj.button&1){dl=1}else{if(dj.button&2){dl=3}else{if(dj.button&4){dl=2}}}}else{if(dj.button===0||dj.button==="0"){dl=1}else{if(dj.button&1){dl=2}else{if(dj.button&2){dl=3}}}}}return dl}function bU(dj){switch(cW(dj)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a2(dj){return dj.target||dj.srcElement}function aC(dj){return function(dm){dm=dm||S.event;var dl=bU(dm);var dn=a2(dm);if(dm.type==="click"){var dk=false;if(dj&&dl==="middle"){dk=true}if(dn&&!dk){cH(dn)}}else{if(dm.type==="mousedown"){if(dl==="middle"&&dn){aS=dl;bC=dn}else{aS=bC=null}}else{if(dm.type==="mouseup"){if(dl===aS&&dn===bC){cH(dn)}aS=bC=null}else{if(dm.type==="contextmenu"){cH(dn)}}}}}}function aq(dl,dk){var dj=typeof dk;
52
- if(dj==="undefined"){dk=true}an(dl,"click",aC(dk),false);if(dk){an(dl,"mouseup",aC(dk),false);an(dl,"mousedown",aC(dk),false);an(dl,"contextmenu",aC(dk),false)}}function bF(dl,dn){ap=true;var dm,dk=a1(bB,"ignore"),dp=G.links,dj=null,dq=null;if(dp){for(dm=0;dm<dp.length;dm++){dj=dp[dm];if(!dk.test(dj.className)){dq=typeof dj.matomoTrackers;if("undefined"===dq){dj.matomoTrackers=[]}if(-1===M(dj.matomoTrackers,dn)){dj.matomoTrackers.push(dn);aq(dj,dl)}}}}}function aT(dk,dn,dp){if(cf){return true}cf=true;var dq=false;var dm,dl;function dj(){dq=true}m(function(){function dr(dt){setTimeout(function(){if(!cf){return}dq=false;dp.trackVisibleContentImpressions();dr(dt)},dt)}function ds(dt){setTimeout(function(){if(!cf){return}if(dq){dq=false;dp.trackVisibleContentImpressions()}ds(dt)},dt)}if(dk){dm=["scroll","resize"];for(dl=0;dl<dm.length;dl++){if(G.addEventListener){G.addEventListener(dm[dl],dj,false)}else{S.attachEvent("on"+dm[dl],dj)}}ds(100)}if(dn&&dn>0){dn=parseInt(dn,10);dr(dn)}})}var bE={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dj=this.requests;
53
- this.requests=[];if(dj.length===1){bH(dj[0],bL)}else{df(dj,bL)}},canQueue:function(){return !l&&this.enabled},pushMultiple:function(dk){if(!this.canQueue()){df(dk,bL);return}var dj;for(dj=0;dj<dk.length;dj++){this.push(dk[dj])}},push:function(dj){if(!dj){return}if(!this.canQueue()){bH(dj,bL);return}bE.requests.push(dj);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bE.timeout=null;bE.sendRequests()},bE.interval);var dk="RequestQueue"+ax;if(!Object.prototype.hasOwnProperty.call(b,dk)){b[dk]={unload:function(){if(bE.timeout){clearTimeout(bE.timeout)}bE.sendRequests()}}}}};bj();aN();this.hasConsent=function(){return bD};this.getVisitorId=function(){return aZ().uuid};this.getVisitorInfo=function(){return cP()};this.getAttributionInfo=function(){return bN()};this.getAttributionCampaignName=function(){return bN()[0]};this.getAttributionCampaignKeyword=function(){return bN()[1]};this.getAttributionReferrerTimestamp=function(){return bN()[2]};this.getAttributionReferrerUrl=function(){return bN()[3]
54
- };this.setTrackerUrl=function(dj){aE=dj};this.getTrackerUrl=function(){return aE};this.getMatomoUrl=function(){return W(this.getTrackerUrl(),bJ)};this.getPiwikUrl=function(){return this.getMatomoUrl()};this.addTracker=function(dl,dk){if(!J(dl)||null===dl){dl=this.getTrackerUrl()}var dj=new P(dl,dk);I.push(dj);t.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b7};this.setSiteId=function(dj){b4(dj)};this.resetUserId=function(){bA=""};this.setUserId=function(dj){if(Y(dj)){bA=dj}};this.setVisitorId=function(dk){var dj=/[0-9A-Fa-f]{16}/g;if(w(dk)&&dj.test(dk)){bP=dk}else{ak("Invalid visitorId set"+dk)}};this.getUserId=function(){return bA};this.setCustomData=function(dj,dk){if(V(dj)){ao=dj}else{if(!ao){ao={}}ao[dj]=dk}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dj){cc=dj};this.appendToTrackingUrl=function(dj){c0=dj};this.getRequest=function(dj){return cr(dj)};this.addPlugin=function(dj,dk){b[dj]=dk};this.setCustomDimension=function(dj,dk){dj=parseInt(dj,10);
55
- if(dj>0){if(!J(dk)){dk=""}if(!w(dk)){dk=String(dk)}bo[dj]=dk}};this.getCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0&&Object.prototype.hasOwnProperty.call(bo,dj)){return bo[dj]}};this.deleteCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0){delete bo[dj]}};this.setCustomVariable=function(dk,dj,dn,dl){var dm;if(!J(dl)){dl="visit"}if(!J(dj)){return}if(!J(dn)){dn=""}if(dk>0){dj=!w(dj)?String(dj):dj;dn=!w(dn)?String(dn):dn;dm=[dj.slice(0,bv),dn.slice(0,bv)];if(dl==="visit"||dl===2){cG();aR[dk]=dm}else{if(dl==="page"||dl===3){bX[dk]=dm}else{if(dl==="event"){cm[dk]=dm}}}}};this.getCustomVariable=function(dk,dl){var dj;if(!J(dl)){dl="visit"}if(dl==="page"||dl===3){dj=bX[dk]}else{if(dl==="event"){dj=cm[dk]}else{if(dl==="visit"||dl===2){cG();dj=aR[dk]}}}if(!J(dj)||(dj&&dj[0]==="")){return false}return dj};this.deleteCustomVariable=function(dj,dk){if(this.getCustomVariable(dj,dk)){this.setCustomVariable(dj,"","",dk)}};this.deleteCustomVariables=function(dj){if(dj==="page"||dj===3){bX={}
56
- }else{if(dj==="event"){cm={}}else{if(dj==="visit"||dj===2){aR={}}}}};this.storeCustomVariablesInCookie=function(){bR=true};this.setLinkTrackingTimer=function(dj){bL=dj};this.getLinkTrackingTimer=function(){return bL};this.setDownloadExtensions=function(dj){if(w(dj)){dj=dj.split("|")}c7=dj};this.addDownloadExtensions=function(dk){var dj;if(w(dk)){dk=dk.split("|")}for(dj=0;dj<dk.length;dj++){c7.push(dk[dj])}};this.removeDownloadExtensions=function(dl){var dk,dj=[];if(w(dl)){dl=dl.split("|")}for(dk=0;dk<c7.length;dk++){if(M(dl,c7[dk])===-1){dj.push(c7[dk])}}c7=dj};this.setDomains=function(dj){ay=w(dj)?[dj]:dj;var dn=false,dl=0,dk;for(dl;dl<ay.length;dl++){dk=String(ay[dl]);if(cI(cV,L(dk))){dn=true;break}var dm=cl(dk);if(dm&&dm!=="/"&&dm!=="/*"){dn=true;break}}if(!dn){ay.push(cV)}};this.enableCrossDomainLinking=function(){cO=true};this.disableCrossDomainLinking=function(){cO=false};this.isCrossDomainLinkingEnabled=function(){return cO};this.setCrossDomainLinkingTimeout=function(dj){a0=dj};this.getCrossDomainLinkingUrlParameter=function(){return s(av)+"="+s(bt())
57
- };this.setIgnoreClasses=function(dj){bB=w(dj)?[dj]:dj};this.setRequestMethod=function(dj){if(dj){da=String(dj).toUpperCase()}else{da=ci}if(da==="GET"){this.disableAlwaysUseSendBeacon()}};this.setRequestContentType=function(dj){cx=dj||aI};this.setGenerationTimeMs=function(dj){ak("setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. There is currently no replacement yet.")};this.setReferrerUrl=function(dj){bp=dj};this.setCustomUrl=function(dj){a5=bW(bO,dj)};this.getCurrentUrl=function(){return a5||bO};this.setDocumentTitle=function(dj){bk=dj};this.setAPIUrl=function(dj){bJ=dj};this.setDownloadClasses=function(dj){bM=w(dj)?[dj]:dj};this.setLinkClasses=function(dj){a9=w(dj)?[dj]:dj};this.setCampaignNameKey=function(dj){cp=w(dj)?[dj]:dj};this.setCampaignKeywordKey=function(dj){bI=w(dj)?[dj]:dj};this.discardHashTag=function(dj){bQ=dj};this.setCookieNamePrefix=function(dj){bl=dj;if(aR){aR=bY()}};this.setCookieDomain=function(dj){var dk=L(dj);if(by(dk)){cY=dk;bj()
58
- }};this.getCookieDomain=function(){return cY};this.hasCookies=function(){return"1"===b6()};this.setSessionCookie=function(dl,dk,dj){if(!dl){throw new Error("Missing cookie name")}if(!J(dj)){dj=cn}bw.push(dl);de(aU(dl),dk,dj,br,cY,bT,aJ)};this.getCookie=function(dk){var dj=aD(aU(dk));if(dj===0){return null}return dj};this.setCookiePath=function(dj){br=dj;bj()};this.getCookiePath=function(dj){return br};this.setVisitorCookieTimeout=function(dj){cL=dj*1000};this.setSessionCookieTimeout=function(dj){cn=dj*1000};this.getSessionCookieTimeout=function(){return cn};this.setReferralCookieTimeout=function(dj){c6=dj*1000};this.setConversionAttributionFirstReferrer=function(dj){bx=dj};this.setSecureCookie=function(dj){if(dj&&location.protocol!=="https:"){ak("Error in setSecureCookie: You cannot use `Secure` on http.");return}bT=dj};this.setCookieSameSite=function(dj){dj=String(dj);dj=dj.charAt(0).toUpperCase()+dj.toLowerCase().slice(1);if(dj!=="None"&&dj!=="Lax"&&dj!=="Strict"){ak("Ignored value for sameSite. Please use either Lax, None, or Strict.");
59
- return}if(dj==="None"){if(location.protocol==="https:"){this.setSecureCookie(true)}else{ak("sameSite=None cannot be used on http, reverted to sameSite=Lax.");dj="Lax"}}aJ=dj};this.disableCookies=function(){bn=true;if(b7){aF()}};this.areCookiesEnabled=function(){return !bn};this.setCookieConsentGiven=function(){if(bn&&!cR){bn=false;if(b7&&aw){aN();var dj=cr("ping=1",null,"ping");bH(dj,bL)}}};this.requireCookieConsent=function(){if(this.getRememberedCookieConsent()){return false}this.disableCookies();return true};this.getRememberedCookieConsent=function(){return aD(cE)};this.forgetCookieConsentGiven=function(){bZ(cE,br,cY);this.disableCookies()};this.rememberCookieConsentGiven=function(dk){if(dk){dk=dk*60*60*1000}else{dk=30*365*24*60*60*1000}this.setCookieConsentGiven();var dj=new Date().getTime();de(cE,dj,dk,br,cY,bT,aJ)};this.deleteCookies=function(){aF()};this.setDoNotTrack=function(dk){var dj=g.doNotTrack||g.msDoNotTrack;cR=dk&&(dj==="yes"||dj==="1");if(cR){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cX=true
60
- };this.disableAlwaysUseSendBeacon=function(){cX=false};this.addListener=function(dk,dj){aq(dk,dj)};this.enableLinkTracking=function(dk){c9=true;var dj=this;ch(function(){p(function(){bF(dk,dj)});m(function(){bF(dk,dj)})})};this.enableJSErrorTracking=function(){if(cT){return}cT=true;var dj=S.onerror;S.onerror=function(dp,dm,dl,dn,dk){ch(function(){var dq="JavaScript Errors";var dr=dm+":"+dl;if(dn){dr+=":"+dn}if(M(cs,dq+dr+dp)===-1){cs.push(dq+dr+dp);at(dq,dr,dp)}});if(dj){return dj(dp,dm,dl,dn,dk)}return false}};this.disablePerformanceTracking=function(){a3=false};this.enableHeartBeatTimer=function(dj){dj=Math.max(dj||15,5);a6=dj*1000;if(cZ!==null){dg()}};this.disableHeartBeatTimer=function(){if(a6||aO){if(S.removeEventListener){S.removeEventListener("focus",bb);S.removeEventListener("blur",az)}else{if(S.detachEvent){S.detachEvent("onfocus",bb);S.detachEvent("onblur",az)}}}a6=null;aO=false};this.killFrame=function(){if(S.location!==S.top.location){S.top.location=S.location}};this.redirectFile=function(dj){if(S.location.protocol==="file:"){S.location=dj
61
- }};this.setCountPreRendered=function(dj){bf=dj};this.trackGoal=function(dj,dm,dl,dk){ch(function(){cU(dj,dm,dl,dk)})};this.trackLink=function(dk,dj,dm,dl){ch(function(){c2(dk,dj,dm,dl)})};this.getNumTrackedPageViews=function(){return cq};this.trackPageView=function(dj,dl,dk){cb=[];cM=[];cs=[];if(N(b7)){ch(function(){Z(aE,bJ,b7)})}else{ch(function(){cq++;b1(dj,dl,dk)})}};this.trackAllContentImpressions=function(){if(N(b7)){return}ch(function(){p(function(){var dj=v.findContentNodes();var dk=cA(dj);bE.pushMultiple(dk)})})};this.trackVisibleContentImpressions=function(dj,dk){if(N(b7)){return}if(!J(dj)){dj=true}if(!J(dk)){dk=750}aT(dj,dk,this);ch(function(){m(function(){var dl=v.findContentNodes();var dm=ba(dl);bE.pushMultiple(dm)})})};this.trackContentImpression=function(dl,dj,dk){if(N(b7)){return}dl=a(dl);dj=a(dj);dk=a(dk);if(!dl){return}dj=dj||"Unknown";ch(function(){var dm=aG(dl,dj,dk);bE.push(dm)})};this.trackContentImpressionsWithinNode=function(dj){if(N(b7)||!dj){return}ch(function(){if(cf){m(function(){var dk=v.findContentNodesWithinNode(dj);
62
- var dl=ba(dk);bE.pushMultiple(dl)})}else{p(function(){var dk=v.findContentNodesWithinNode(dj);var dl=cA(dk);bE.pushMultiple(dl)})}})};this.trackContentInteraction=function(dl,dm,dj,dk){if(N(b7)){return}dl=a(dl);dm=a(dm);dj=a(dj);dk=a(dk);if(!dl||!dm){return}dj=dj||"Unknown";ch(function(){var dn=aQ(dl,dm,dj,dk);if(dn){bE.push(dn)}})};this.trackContentInteractionNode=function(dl,dk){if(N(b7)||!dl){return}var dj=null;ch(function(){dj=db(dl,dk);if(dj){bE.push(dj)}});return dj};this.logAllContentBlocksOnPage=function(){var dl=v.findContentNodes();var dj=v.collectContent(dl);var dk=typeof console;if(dk!=="undefined"&&console&&console.log){console.log(dj)}};this.trackEvent=function(dk,dm,dj,dl,dp,dn){ch(function(){at(dk,dm,dj,dl,dp,dn)})};this.trackSiteSearch=function(dj,dl,dk,dm){cb=[];ch(function(){b9(dj,dl,dk,dm)})};this.setEcommerceView=function(dn,dj,dl,dk){ct={};if(Y(dl)){dl=String(dl)}if(!J(dl)||dl===null||dl===false||!dl.length){dl=""}else{if(dl instanceof Array){dl=S.JSON.stringify(dl)
63
- }}var dm="_pkc";ct[dm]=dl;if(J(dk)&&dk!==null&&dk!==false&&String(dk).length){dm="_pkp";ct[dm]=dk}if(!Y(dn)&&!Y(dj)){return}if(Y(dn)){dm="_pks";ct[dm]=dn}if(!Y(dj)){dj=""}dm="_pkn";ct[dm]=dj};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c1))};this.addEcommerceItem=function(dn,dj,dl,dk,dm){if(Y(dn)){c1[dn]=[String(dn),dj,dl,dk,dm]}};this.removeEcommerceItem=function(dj){if(Y(dj)){dj=String(dj);delete c1[dj]}};this.clearEcommerceCart=function(){c1={}};this.trackEcommerceOrder=function(dj,dn,dm,dl,dk,dp){b0(dj,dn,dm,dl,dk,dp)};this.trackEcommerceCartUpdate=function(dj){bu(dj)};this.trackRequest=function(dk,dm,dl,dj){ch(function(){var dn=cr(dk,dm,dj);bH(dn,bL,dl)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bE.enabled=false};this.setRequestQueueInterval=function(dj){if(dj<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bE.interval=dj};this.queueRequest=function(dj){ch(function(){var dk=cr(dj);
64
- bE.push(dk)})};this.isConsentRequired=function(){return cB};this.getRememberedConsent=function(){var dj=aD(be);if(aD(cN)){if(dj){bZ(be,br,cY)}return null}if(!dj||dj===0){return null}return dj};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cB=true;bD=this.hasRememberedConsent();if(!bD){bn=true}x++;b["CoreConsent"+x]={unload:function(){if(!bD){aF()}}}};this.setConsentGiven=function(dk){bD=true;bZ(cN,br,cY);var dl,dj;for(dl=0;dl<cM.length;dl++){dj=typeof cM[dl];if(dj==="string"){bH(cM[dl],bL)}else{if(dj==="object"){df(cM[dl],bL)}}}cM=[];if(!J(dk)||dk){this.setCookieConsentGiven()}};this.rememberConsentGiven=function(dl){if(dl){dl=dl*60*60*1000}else{dl=30*365*24*60*60*1000}var dj=true;this.setConsentGiven(dj);var dk=new Date().getTime();de(be,dk,dl,br,cY,bT,aJ)};this.forgetConsentGiven=function(){var dj=30*365*24*60*60*1000;bZ(be,br,cY);de(cN,new Date().getTime(),dj,br,cY,bT,aJ);this.forgetCookieConsentGiven();this.requireConsent()
65
- };this.isUserOptedOut=function(){return !bD};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=function(){this.setConsentGiven(false)};m(function(){setTimeout(function(){bG=true},0)});t.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];if(av[ap]>1&&ap!=="addTracker"&&ap!=="enableLinkTracking"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking"];
66
- function ad(aq,ap){var ao=new P(aq,ap);I.push(ao);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();t.trigger("TrackerAdded",[ao]);return ao}an(S,"beforeunload",ai,false);an(S,"online",function(){if(J(g.serviceWorker)&&J(g.serviceWorker.ready)){g.serviceWorker.ready.then(function(ao){if(ao&&ao.sync){return ao.sync.register("matomoSync")}})}},false);an(S,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getMatomoUrl());if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})
67
  }else{if(J(aq.maq_opted_in)){at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;t={initialized:false,JSON:S.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:m,onReady:p,isNodeVisible:i,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||S,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ap,ao){if(!J(ao)){ao=this.getAsyncTracker().getSiteId()}if(!J(ap)){ap=this.getAsyncTracker().getTrackerUrl()
68
  }return new P(ap,ao)},getAsyncTrackers:function(){return I},addTracker:function(aq,ap){var ao;if(!I.length){ao=ad(aq,ap)}else{ao=I[0].addTracker(aq,ap)}return ao},getAsyncTracker:function(at,ar){var aq;if(I&&I.length&&I[0]){aq=I[0]}else{return ad(at,ar)}if(!ar&&!at){return aq}if((!J(ar)||null===ar)&&aq){ar=aq.getSiteId()}if((!J(at)||null===at)&&aq){at=aq.getTrackerUrl()}var ap,ao=0;for(ao;ao<I.length;ao++){ap=I[ao];if(ap&&String(ap.getSiteId())===String(ar)&&ap.getTrackerUrl()===at){return ap}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return t});define("matomo",[],function(){return t})}return t}())}
69
  /*!!! pluginTrackerHook */
28
  }}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(S.innerWidth&&ap>S.innerWidth){ap=S.innerWidth}var ao=ar.clientHeight;if(S.innerHeight&&ao>S.innerHeight){ao=S.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=i(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+s(ao)}if(ap){if(at){at+="&"}at+="c_n="+s(ap)}if(aq){if(at){at+="&"}at+="c_p="+s(aq)}if(ar){if(at){at+="&"}at+="c_t="+s(ar)}if(at){at+="&ca=1"}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+s(ao)+"&c_p="+s(ap);if(aq){ar+="&c_t="+s(aq)
29
  }if(ar){ar+="&ca=1"}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||S.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap
30
  }if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(ao){if(ae.hasNodeAttribute(ao,this.CONTENT_IGNOREINTERACTION_ATTR)){return true}if(ae.hasNodeCssClass(ao,this.CONTENT_IGNOREINTERACTION_CLASS)){return true}if(ae.hasNodeCssClass(ao,this.LEGACY_CONTENT_IGNOREINTERACTION_CLASS)){return true}return false}};function W(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(Q(ap,"matomo.php")){ap=f(ap,"matomo.php".length)
31
+ }else{if(Q(ap,"piwik.php")){ap=f(ap,"piwik.php".length)}else{if(Q(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(Q(ap,"/js/")){ap=f(ap,"js/".length)}return ap}function N(av){var ax="Matomo_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=[^&]*)?");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}S.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=S.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,av,aq){var au=S.name.split("###"),at=au[1],ao=au[2],ar=au[3],aw=W(ap,av);n(aw+"plugins/Overlay/client/client.js?v=1",function(){Matomo_Overlay_Client.initialize(aw,aq,at,ao,ar)})}function u(){var aq;try{aq=S.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return S.self!==S.top
32
+ }catch(ao){return true}}function P(ce,ca){var bK=this,be="mtm_consent",cE="mtm_cookie_consent",cN="mtm_consent_removed",b5=aa(G.domain,S.location.href,K()),cV=L(b5[0]),bO=o(b5[1]),bp=o(b5[2]),cT=false,ci="GET",db=ci,aI="application/x-www-form-urlencoded; charset=UTF-8",cx=aI,aE=ce||"",bJ="",c1="",b7=ca||"",bA="",bP="",a5,bk="",c8=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","rtf","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ay=[cV],bB=[],bM=[],a9=[],bL=500,cY=true,cK,a6,bS,bQ,ao,cp=["pk_campaign","mtm_campaign","piwik_campaign","matomo_campaign","utm_campaign","utm_source","utm_medium"],bI=["pk_kwd","mtm_kwd","piwik_kwd","matomo_kwd","utm_term"],bl="_pk_",av="pk_vid",a0=180,cZ,br,bT=false,aJ="Lax",bn=false,cR,bf,bx,cL=33955200000,cn=1800000,c7=15768000000,a3=true,bG=false,bi=false,bR=false,aR=false,cc,bX={},cm={},bo={},bv=200,ct={},c2={},c9={},cb=[],cf=false,cC=false,ap=false,da=false,cO=false,aO=false,bd=u(),cy=null,c0=null,aS,bD,b8=am,bq,aM,bC=false,cq=0,bw=["id","ses","cvar","ref"],cB=false,bE=null,cM=[],cs=[],ax=T++,aw=false;
33
+ try{bk=G.title}catch(cz){bk=""}function aD(dm){if(bn){return 0}var dk=new RegExp("(^|;)[ ]*"+dm+"=([^;]*)"),dl=dk.exec(G.cookie);return dl?R(dl[2]):0}bE=!aD(cN);function df(dp,dq,dt,ds,dm,dn,dr){if(bn&&dp!==cN){return}var dl;if(dt){dl=new Date();dl.setTime(dl.getTime()+dt)}if(!dr){dr="Lax"}G.cookie=dp+"="+s(dq)+(dt?";expires="+dl.toGMTString():"")+";path="+(ds||"/")+(dm?";domain="+dm:"")+(dn?";secure":"")+";SameSite="+dr;if((!dt||dt>=0)&&aD(dp)!==dq){var dk="There was an error setting cookie `"+dp+"`. Please check domain and path.";ak(dk)}}function b3(dk){var dl;dk=j(dk,av);if(bQ){dl=new RegExp("#.*");return dk.replace(dl,"")}return dk}function bW(dm,dk){var dn=r(dk),dl;if(dn){return dk}if(dk.slice(0,1)==="/"){return r(dm)+"://"+d(dm)+dk}dm=b3(dm);dl=dm.indexOf("?");if(dl>=0){dm=dm.slice(0,dl)}dl=dm.lastIndexOf("/");if(dl!==dm.length-1){dm=dm.slice(0,dl+1)}return dm+dk}function cI(dm,dk){var dl;dm=String(dm).toLowerCase();dk=String(dk).toLowerCase();if(dm===dk){return true}if(dk.slice(0,1)==="."){if(dm===dk.slice(1)){return true
34
+ }dl=dm.length-dk.length;if((dl>0)&&(dm.slice(dl)===dk)){return true}}return false}function cl(dk){var dl=document.createElement("a");if(dk.indexOf("//")!==0&&dk.indexOf("http")!==0){if(dk.indexOf("*")===0){dk=dk.substr(1)}if(dk.indexOf(".")===0){dk=dk.substr(1)}dk="http://"+dk}dl.href=v.toAbsoluteUrl(dk);if(dl.pathname){return dl.pathname}return""}function a4(dl,dk){if(!aj(dk,"/")){dk="/"+dk}if(!aj(dl,"/")){dl="/"+dl}var dm=(dk==="/"||dk==="/*");if(dm){return true}if(dl===dk){return true}dk=String(dk).toLowerCase();dl=String(dl).toLowerCase();if(Q(dk,"*")){dk=dk.slice(0,-1);dm=(!dk||dk==="/");if(dm){return true}if(dl===dk){return true}return dl.indexOf(dk)===0}if(!Q(dl,"/")){dl+="/"}if(!Q(dk,"/")){dk+="/"}return dl.indexOf(dk)===0}function ar(dp,dr){var dl,dk,dm,dn,dq;for(dl=0;dl<ay.length;dl++){dn=L(ay[dl]);dq=cl(ay[dl]);if(cI(dp,dn)&&a4(dr,dq)){return true}}return false}function aW(dn){var dl,dk,dm;for(dl=0;dl<ay.length;dl++){dk=L(ay[dl].toLowerCase());if(dn===dk){return true}if(dk.slice(0,1)==="."){if(dn===dk.slice(1)){return true
35
+ }dm=dn.length-dk.length;if((dm>0)&&(dn.slice(dm)===dk)){return true}}}return false}function co(dk,dm){dk=dk.replace("send_image=0","send_image=1");var dl=new Image(1,1);dl.onload=function(){E=0;if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:true})}};dl.onerror=function(){if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:false})}};dl.src=aE+(aE.indexOf("?")<0?"?":"&")+dk}function cF(dk){if(db==="POST"){return true}return dk&&(dk.length>2000||dk.indexOf('{"requests"')===0)}function aL(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function a7(dp,ds,dr){var dm=aL();if(!dm){return false}var dn={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dt=false;var dl=aE;try{var dk=new Blob([dp],dn);if(dr&&!cF(dp)){dk=new Blob([],dn);dl=dl+(dl.indexOf("?")<0?"?":"&")+dp}dt=g.sendBeacon(dl,dk)}catch(dq){return false}if(dt&&typeof ds==="function"){ds({request:dp,trackerUrl:aE,success:true,isSendBeacon:true})}return dt}function c6(dl,dm,dk){if(!J(dk)||null===dk){dk=true
36
+ }if(l&&a7(dl,dm,dk)){return}setTimeout(function(){if(l&&a7(dl,dm,dk)){return}var dq;try{var dp=S.XMLHttpRequest?new S.XMLHttpRequest():S.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dp.open("POST",aE,true);dp.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dr=l&&a7(dl,dm,dk);if(!dr&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dm==="function")){dm({request:dl,trackerUrl:aE,success:true,xhr:this})}}};dp.setRequestHeader("Content-Type",cx);dp.withCredentials=true;dp.send(dl)}catch(dn){dq=l&&a7(dl,dm,dk);if(!dq&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false})}}}},50)}function cg(dl){var dk=new Date();var dm=dk.getTime()+dl;if(!q||dm>q){q=dm}}function bb(){bd=true;cy=new Date().getTime()}function de(){var dk=new Date().getTime();return !cy||(dk-cy)>a6}function az(){if(de()){bS()}}function dh(){if(aO||!a6){return
37
+ }aO=true;an(S,"focus",bb);an(S,"blur",az);ab++;t.addPlugin("HeartBeat"+ab,{unload:function(){if(aO&&de()){bS()}}})}function cD(dp){var dl=new Date();var dk=dl.getTime();c0=dk;if(cC&&dk<cC){var dm=cC-dk;setTimeout(dp,dm);cg(dm+50);cC+=50;return}if(cC===false){var dn=800;cC=dk+dn}dp()}function aP(){if(aD(cN)){bE=false}else{if(aD(be)){bE=true}}}function bH(dl,dk,dm){aP();if(!bE){cM.push(dl);return}aw=true;if(!cR&&dl){if(cB&&bE){dl+="&consent=1"}cD(function(){if(cY&&a7(dl,dm,true)){cg(100);return}if(cF(dl)){c6(dl,dm)}else{co(dl,dm)}cg(dk)})}if(!aO){dh()}}function ck(dk){if(cR){return false}return(dk&&dk.length)}function c5(dk,dp){if(!dp||dp>=dk.length){return[dk]}var dl=0;var dm=dk.length;var dn=[];for(dl;dl<dm;dl+=dp){dn.push(dk.slice(dl,dl+dp))}return dn}function dg(dl,dk){if(!ck(dl)){return}if(!bE){cM.push(dl);return}aw=true;cD(function(){var dp=c5(dl,50);var dm=0,dn;for(dm;dm<dp.length;dm++){dn='{"requests":["?'+dp[dm].join('","?')+'"],"send_image":0}';if(cY&&a7(dn,null,false)){cg(100)}else{c6(dn,null,false)
38
+ }}cg(dk)})}function aU(dk){return bl+dk+"."+b7+"."+bq}function bZ(dm,dl,dk){df(dm,"",-86400,dl,dk)}function b6(){if(bn){return"0"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){return g.cookieEnabled?"1":"0"}var dk=bl+"testcookie";df(dk,"1",undefined,br,cZ,bT,aJ);var dl=aD(dk)==="1"?"1":"0";bZ(dk);return dl}function bj(){bq=b8((cZ||cV)+(br||"/")).slice(0,4)}function cJ(){if(J(c9.res)){return c9}var dl,dn,dp={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",fla:"application/x-shockwave-flash",java:"application/x-java-vm",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(g.userAgent))){if(g.mimeTypes&&g.mimeTypes.length){for(dl in dp){if(Object.prototype.hasOwnProperty.call(dp,dl)){dn=g.mimeTypes[dp[dl]];c9[dl]=(dn&&dn.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(g.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(g.javaEnabled)&&g.javaEnabled()){c9.java="1"}if(!J(S.showModalDialog)&&J(g.cookieEnabled)){c9.cookie=g.cookieEnabled?"1":"0"
39
+ }else{c9.cookie=b6()}}var dm=parseInt(X.width,10);var dk=parseInt(X.height,10);c9.res=parseInt(dm,10)+"x"+parseInt(dk,10);return c9}function bY(){var dl=aU("cvar"),dk=aD(dl);if(dk&&dk.length){dk=S.JSON.parse(dk);if(V(dk)){return dk}}return{}}function cG(){if(aR===false){aR=bY()}}function cS(){var dk=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dk)+(new Date()).getTime()+Math.random()).slice(0,16)}function aB(){var dk=cJ();return b8((g.userAgent||"")+(g.platform||"")+S.JSON.stringify(dk)).slice(0,6)}function bg(){return Math.floor((new Date()).getTime()/1000)}function aK(){var dl=bg();var dm=aB();var dk=String(dl)+dm;return dk}function c4(dm){dm=String(dm);var dq=aB();var dn=dq.length;var dp=dm.substr(-1*dn,dn);var dl=parseInt(dm.substr(0,dm.length-dn),10);if(dl&&dp&&dp===dq){var dk=bg();if(a0<=0){return true}if(dk>=dl&&dk<=(dl+a0)){return true}}return false}function di(dk){if(!cO){return""}var dp=e(dk,av);if(!dp){return""}dp=String(dp);var dm=new RegExp("^[a-zA-Z0-9]+$");
40
+ if(dp.length===32&&dm.test(dp)){var dl=dp.substr(16,32);if(c4(dl)){var dn=dp.substr(0,16);return dn}}return""}function cP(){if(!bP){bP=di(bO)}var dm=new Date(),dk=Math.round(dm.getTime()/1000),dl=aU("id"),dq=aD(dl),dp,dn;if(dq){dp=dq.split(".");dp.unshift("0");if(bP.length){dp[1]=bP}return dp}if(bP.length){dn=bP}else{if("0"===b6()){dn=""}else{dn=cS()}}dp=["1",dn,dk];return dp}function aZ(){var dn=cP(),dl=dn[0],dm=dn[1],dk=dn[2];return{newVisitor:dl,uuid:dm,createTs:dk}}function aH(){var dn=new Date(),dl=dn.getTime(),dp=aZ().createTs;var dk=parseInt(dp,10);var dm=(dk*1000)+cL-dl;return dm}function aN(dk){if(!b7){return}var dm=new Date(),dl=Math.round(dm.getTime()/1000);if(!J(dk)){dk=aZ()}var dn=dk.uuid+"."+dk.createTs+".";df(aU("id"),dn,aH(),br,cZ,bT,aJ)}function bN(){var dk=aD(aU("ref"));if(dk.length){try{dk=S.JSON.parse(dk);if(V(dk)){return dk}}catch(dl){}}return["","",0,""]}function by(dm){var dl=bl+"testcookie_domain";var dk="testvalue";df(dl,dk,10000,null,dm,bT,aJ);if(aD(dl)===dk){bZ(dl,null,dm);
41
+ return true}return false}function aF(){var dl=bn;bn=false;var dk,dm;for(dk=0;dk<bw.length;dk++){dm=aU(bw[dk]);if(dm!==cN&&dm!==be&&0!==aD(dm)){bZ(dm,br,cZ)}}bn=dl}function b4(dk){b7=dk}function dj(dp){if(!dp||!V(dp)){return}var dn=[];var dm;for(dm in dp){if(Object.prototype.hasOwnProperty.call(dp,dm)){dn.push(dm)}}var dq={};dn.sort();var dk=dn.length;var dl;for(dl=0;dl<dk;dl++){dq[dn[dl]]=dp[dn[dl]]}return dq}function cd(){df(aU("ses"),"1",cn,br,cZ,bT,aJ)}function bh(){var dn="";var dl="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dm=dl.length;var dk;for(dk=0;dk<6;dk++){dn+=dl.charAt(Math.floor(Math.random()*dm))}return dn}function aA(dl){if(!h){return dl}var dm=(typeof h.timing==="object")&&h.timing?h.timing:undefined;if(!dm){dm=(typeof h.getEntriesByType==="function")&&h.getEntriesByType("navigation")?h.getEntriesByType("navigation")[0]:undefined}if(!dm){return dl}var dk="";if(dm.connectEnd&&dm.fetchStart){if(dm.connectEnd<dm.fetchStart){return}dk+="&pf_net="+Math.round(dm.connectEnd-dm.fetchStart)
42
+ }if(dm.responseStart&&dm.requestStart){if(dm.responseStart<dm.requestStart){return}dk+="&pf_srv="+Math.round(dm.responseStart-dm.requestStart)}if(dm.responseStart&&dm.responseEnd){if(dm.responseEnd<dm.responseStart){return}dk+="&pf_tfr="+Math.round(dm.responseEnd-dm.responseStart)}if(J(dm.domLoading)){if(dm.domInteractive&&dm.domLoading){if(dm.domInteractive<dm.domLoading){return}dk+="&pf_dm1="+Math.round(dm.domInteractive-dm.domLoading)}}else{if(dm.domInteractive&&dm.responseEnd){if(dm.domInteractive<dm.responseEnd){return}dk+="&pf_dm1="+Math.round(dm.domInteractive-dm.responseEnd)}}if(dm.domComplete&&dm.domInteractive){if(dm.domComplete<dm.domInteractive){return}dk+="&pf_dm2="+Math.round(dm.domComplete-dm.domInteractive)}if(dm.loadEventEnd&&dm.loadEventStart){if(dm.loadEventEnd<dm.loadEventStart){return}dk+="&pf_onl="+Math.round(dm.loadEventEnd-dm.loadEventStart)}return dl+dk}function cr(dm,dH,dI){var dG,dl=new Date(),du=Math.round(dl.getTime()/1000),dr,dE,dn=1024,dN,dv,dD=aR,dp=aU("ses"),dB=aU("ref"),dy=aU("cvar"),dz=aD(dp),dF=bN(),dJ=a5||bO,ds,dk;
43
+ if(bn){aF()}if(cR){return""}var dA=aZ();var dx=G.characterSet||G.charset;if(!dx||dx.toLowerCase()==="utf-8"){dx=null}ds=dF[0];dk=dF[1];dr=dF[2];dE=dF[3];if(!dz){if(!bx||!ds.length){for(dG in cp){if(Object.prototype.hasOwnProperty.call(cp,dG)){ds=e(dJ,cp[dG]);if(ds.length){break}}}for(dG in bI){if(Object.prototype.hasOwnProperty.call(bI,dG)){dk=e(dJ,bI[dG]);if(dk.length){break}}}}dN=d(bp);dv=dE.length?d(dE):"";if(dN.length&&!aW(dN)&&(!bx||!dv.length||aW(dv))){dE=bp}if(dE.length||ds.length){dr=du;dF=[ds,dk,dr,b3(dE.slice(0,dn))];df(dB,S.JSON.stringify(dF),c7,br,cZ,bT,aJ)}}dm+="&idsite="+b7+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dl.getHours()+"&m="+dl.getMinutes()+"&s="+dl.getSeconds()+"&url="+s(b3(dJ))+(bp.length?"&urlref="+s(b3(bp)):"")+(Y(bA)?"&uid="+s(bA):"")+"&_id="+dA.uuid+"&_idn="+dA.newVisitor+(ds.length?"&_rcn="+s(ds):"")+(dk.length?"&_rck="+s(dk):"")+"&_refts="+dr+(String(dE).length?"&_ref="+s(b3(dE.slice(0,dn))):"")+(dx?"&cs="+s(dx):"")+"&send_image=0";var dM=cJ();for(dG in dM){if(Object.prototype.hasOwnProperty.call(dM,dG)){dm+="&"+dG+"="+dM[dG]
44
+ }}var dL=[];if(dH){for(dG in dH){if(Object.prototype.hasOwnProperty.call(dH,dG)&&/^dimension\d+$/.test(dG)){var dq=dG.replace("dimension","");dL.push(parseInt(dq,10));dL.push(String(dq));dm+="&"+dG+"="+s(dH[dG]);delete dH[dG]}}}if(dH&&B(dH)){dH=null}for(dG in ct){if(Object.prototype.hasOwnProperty.call(ct,dG)){dm+="&"+dG+"="+s(ct[dG])}}for(dG in bo){if(Object.prototype.hasOwnProperty.call(bo,dG)){var dw=(-1===M(dL,dG));if(dw){dm+="&dimension"+dG+"="+s(bo[dG])}}}if(dH){dm+="&data="+s(S.JSON.stringify(dH))}else{if(ao){dm+="&data="+s(S.JSON.stringify(ao))}}function dt(dO,dP){var dQ=S.JSON.stringify(dO);if(dQ.length>2){return"&"+dP+"="+s(dQ)}return""}var dK=dj(bX);var dC=dj(cm);dm+=dt(dK,"cvar");dm+=dt(dC,"e_cvar");if(aR){dm+=dt(aR,"_cvar");for(dG in dD){if(Object.prototype.hasOwnProperty.call(dD,dG)){if(aR[dG][0]===""||aR[dG][1]===""){delete aR[dG]}}}if(bR){df(dy,S.JSON.stringify(aR),cn,br,cZ,bT,aJ)}}if(a3&&bG&&!bi){dm=aA(dm);bi=true}if(aM){dm+="&pv_id="+aM}aN(dA);cd();dm+=ac(dI,{tracker:bK,request:dm});
45
+ if(c1.length){dm+="&"+c1}if(A(cc)){dm=cc(dm)}return dm}bS=function a8(){var dk=new Date();dk=dk.getTime();if(!c0){return false}if(c0+a6<=dk){bK.ping();return true}return false};function bs(dn,dm,ds,dp,dk,dv){var dr="idgoal=0",dl=new Date(),dt=[],du,dq=String(dn).length;if(dq){dr+="&ec_id="+s(dn)}dr+="&revenue="+dm;if(String(ds).length){dr+="&ec_st="+ds}if(String(dp).length){dr+="&ec_tx="+dp}if(String(dk).length){dr+="&ec_sh="+dk}if(String(dv).length){dr+="&ec_dt="+dv}if(c2){for(du in c2){if(Object.prototype.hasOwnProperty.call(c2,du)){if(!J(c2[du][1])){c2[du][1]=""}if(!J(c2[du][2])){c2[du][2]=""}if(!J(c2[du][3])||String(c2[du][3]).length===0){c2[du][3]=0}if(!J(c2[du][4])||String(c2[du][4]).length===0){c2[du][4]=1}dt.push(c2[du])}}dr+="&ec_items="+s(S.JSON.stringify(dt))}dr=cr(dr,ao,"ecommerce");bH(dr,bL);if(dq){c2={}}}function b0(dk,dp,dn,dm,dl,dq){if(String(dk).length&&J(dp)){bs(dk,dp,dn,dm,dl,dq)}}function bu(dk){if(J(dk)){bs("",dk,"","","","")}}function b1(dl,dn,dm){if(!bC){aM=bh()}var dk=cr("action_name="+s(al(dl||bk)),dn,"log");
46
+ if(a3&&!bi){dk=aA(dk)}bH(dk,bL,dm)}function a1(dm,dl){var dn,dk="(^| )(piwik[_-]"+dl+"|matomo[_-]"+dl;if(dm){for(dn=0;dn<dm.length;dn++){dk+="|"+dm[dn]}}dk+=")( |$)";return new RegExp(dk)}function aV(dk){return(aE&&dk&&0===String(dk).indexOf(aE))}function cv(dp,dk,dq,dl){if(aV(dk)){return 0}var dn=a1(bM,"download"),dm=a1(a9,"link"),dr=new RegExp("\\.("+c8.join("|")+")([?&#]|$)","i");if(dm.test(dp)){return"link"}if(dl||dn.test(dp)||dr.test(dk)){return"download"}if(dq){return 0}return"link"}function au(dl){var dk;dk=dl.parentNode;while(dk!==null&&J(dk)){if(ae.isLinkElement(dl)){break}dl=dk;dk=dl.parentNode}return dl}function dd(dq){dq=au(dq);if(!ae.hasNodeAttribute(dq,"href")){return}if(!J(dq.href)){return}var dp=ae.getAttributeValueFromNode(dq,"href");var dl=dq.pathname||cl(dq.href);var dr=dq.hostname||d(dq.href);var ds=dr.toLowerCase();var dm=dq.href.replace(dr,ds);var dn=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dn.test(dm)){var dk=cv(dq.className,dm,ar(ds,dl),ae.hasNodeAttribute(dq,"download"));
47
+ if(dk){return{type:dk,href:dm}}}}function aQ(dk,dl,dm,dn){var dp=v.buildInteractionRequestParams(dk,dl,dm,dn);if(!dp){return}return cr(dp,null,"contentInteraction")}function bc(dk,dl){if(!dk||!dl){return false}var dm=v.findTargetNode(dk);if(v.shouldIgnoreInteraction(dm)){return false}dm=v.findTargetNodeNoDefault(dk);if(dm&&!U(dm,dl)){return false}return true}function cu(dm,dl,dp){if(!dm){return}var dk=v.findParentContentNode(dm);if(!dk){return}if(!bc(dk,dm)){return}var dn=v.buildContentBlock(dk);if(!dn){return}if(!dn.target&&dp){dn.target=dp}return v.buildInteractionRequestParams(dl,dn.name,dn.piece,dn.target)}function aX(dl){if(!cb||!cb.length){return false}var dk,dm;for(dk=0;dk<cb.length;dk++){dm=cb[dk];if(dm&&dm.name===dl.name&&dm.piece===dl.piece&&dm.target===dl.target){return true}}return false}function aY(dk){return function(dp){if(!dk){return}var dm=v.findParentContentNode(dk);var dl;if(dp){dl=dp.target||dp.srcElement}if(!dl){dl=dk}if(!bc(dm,dl)){return}if(!dm){return false}var dq=v.findTargetNode(dm);
48
+ if(!dq||v.shouldIgnoreInteraction(dq)){return false}var dn=dd(dq);if(da&&dn&&dn.type){return dn.type}return bK.trackContentInteractionNode(dl,"click")}}function b2(dm){if(!dm||!dm.length){return}var dk,dl;for(dk=0;dk<dm.length;dk++){dl=v.findTargetNode(dm[dk]);if(dl&&!dl.contentInteractionTrackingSetupDone){dl.contentInteractionTrackingSetupDone=true;an(dl,"click",aY(dl))}}}function bz(dm,dn){if(!dm||!dm.length){return[]}var dk,dl;for(dk=0;dk<dm.length;dk++){if(aX(dm[dk])){dm.splice(dk,1);dk--}else{cb.push(dm[dk])}}if(!dm||!dm.length){return[]}b2(dn);var dp=[];for(dk=0;dk<dm.length;dk++){dl=cr(v.buildImpressionRequestParams(dm[dk].name,dm[dk].piece,dm[dk].target),undefined,"contentImpressions");if(dl){dp.push(dl)}}return dp}function cA(dl){var dk=v.collectContent(dl);return bz(dk,dl)}function ba(dl){if(!dl||!dl.length){return[]}var dk;for(dk=0;dk<dl.length;dk++){if(!v.isNodeVisible(dl[dk])){dl.splice(dk,1);dk--}}if(!dl||!dl.length){return[]}return cA(dl)}function aG(dm,dk,dl){var dn=v.buildImpressionRequestParams(dm,dk,dl);
49
+ return cr(dn,null,"contentImpression")}function dc(dn,dl){if(!dn){return}var dk=v.findParentContentNode(dn);var dm=v.buildContentBlock(dk);if(!dm){return}if(!dl){dl="Unknown"}return aQ(dl,dm.name,dm.piece,dm.target)}function cQ(dl,dn,dk,dm){return"e_c="+s(dl)+"&e_a="+s(dn)+(J(dk)?"&e_n="+s(dk):"")+(J(dm)?"&e_v="+s(dm):"")+"&ca=1"}function at(dm,dp,dk,dn,dr,dq){if(!Y(dm)||!Y(dp)){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dl=cr(cQ(dm,dp,dk,dn),dr,"event");bH(dl,bL,dq)}function b9(dk,dn,dl,dp){var dm=cr("search="+s(dk)+(dn?"&search_cat="+s(dn):"")+(J(dl)?"&search_count="+dl:""),dp,"sitesearch");bH(dm,bL)}function cU(dk,dp,dn,dm){var dl=cr("idgoal="+dk+(dp?"&revenue="+dp:""),dn,"goal");bH(dl,bL,dm)}function c3(dn,dk,ds,dr,dm){var dq=dk+"="+s(b3(dn));var dl=cu(dm,"click",dn);if(dl){dq+="&"+dl}var dp=cr(dq,ds,"link");bH(dp,bL,dr)}function bV(dl,dk){if(dl!==""){return dl+dk.charAt(0).toUpperCase()+dk.slice(1)
50
+ }return dk}function ch(dq){var dp,dk,dn=["","webkit","ms","moz"],dm;if(!bf){for(dk=0;dk<dn.length;dk++){dm=dn[dk];if(Object.prototype.hasOwnProperty.call(G,bV(dm,"hidden"))){if(G[bV(dm,"visibilityState")]==="prerender"){dp=true}break}}}if(dp){an(G,dm+"visibilitychange",function dl(){G.removeEventListener(dm+"visibilitychange",dl,false);dq()});return}dq()}function bt(){var dl=bK.getVisitorId();var dk=aK();return dl+dk}function cj(dk){if(!dk){return}if(!ae.hasNodeAttribute(dk,"href")){return}var dl=ae.getAttributeValueFromNode(dk,"href");if(!dl||aV(dl)){return}if(!bK.getVisitorId()){return}dl=j(dl,av);var dm=bt();dl=F(dl,av,dm);ae.setAnyAttribute(dk,"href",dl)}function bm(dn){var dp=ae.getAttributeValueFromNode(dn,"href");if(!dp){return false}dp=String(dp);var dl=dp.indexOf("//")===0||dp.indexOf("http://")===0||dp.indexOf("https://")===0;if(!dl){return false}var dk=dn.pathname||cl(dn.href);var dm=(dn.hostname||d(dn.href)).toLowerCase();if(ar(dm,dk)){if(!cI(cV,L(dm))){return true}return false
51
+ }return false}function cH(dk){var dl=dd(dk);if(dl&&dl.type){dl.href=o(dl.href);c3(dl.href,dl.type,undefined,null,dk);return}if(cO){dk=au(dk);if(bm(dk)){cj(dk)}}}function cw(){return G.all&&!G.addEventListener}function cW(dk){var dm=dk.which;var dl=(typeof dk.button);if(!dm&&dl!=="undefined"){if(cw()){if(dk.button&1){dm=1}else{if(dk.button&2){dm=3}else{if(dk.button&4){dm=2}}}}else{if(dk.button===0||dk.button==="0"){dm=1}else{if(dk.button&1){dm=2}else{if(dk.button&2){dm=3}}}}}return dm}function bU(dk){switch(cW(dk)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a2(dk){return dk.target||dk.srcElement}function cX(dk){return dk==="A"||dk==="AREA"}function aC(dk){function dl(dn){var dp=a2(dn);var dq=dp.nodeName;var dm=a1(bB,"ignore");while(!cX(dq)&&dp&&dp.parentNode){dp=dp.parentNode;dq=dp.nodeName}if(dp&&cX(dq)&&!dm.test(dp.className)){return dp}}return function(dp){dp=dp||S.event;var dq=dl(dp);if(!dq){return}var dn=bU(dp);if(dp.type==="click"){var dm=false;if(dk&&dn==="middle"){dm=true
52
+ }if(dq&&!dm){cH(dq)}}else{if(dp.type==="mousedown"){if(dn==="middle"&&dq){aS=dn;bD=dq}else{aS=bD=null}}else{if(dp.type==="mouseup"){if(dn===aS&&dq===bD){cH(dq)}aS=bD=null}else{if(dp.type==="contextmenu"){cH(dq)}}}}}}function aq(dn,dm,dk){var dl=typeof dm;if(dl==="undefined"){dm=true}an(dn,"click",aC(dm),dk);if(dm){an(dn,"mouseup",aC(dm),dk);an(dn,"mousedown",aC(dm),dk);an(dn,"contextmenu",aC(dm),dk)}}function aT(dl,dp,dq){if(cf){return true}cf=true;var dr=false;var dn,dm;function dk(){dr=true}m(function(){function ds(du){setTimeout(function(){if(!cf){return}dr=false;dq.trackVisibleContentImpressions();ds(du)},du)}function dt(du){setTimeout(function(){if(!cf){return}if(dr){dr=false;dq.trackVisibleContentImpressions()}dt(du)},du)}if(dl){dn=["scroll","resize"];for(dm=0;dm<dn.length;dm++){if(G.addEventListener){G.addEventListener(dn[dm],dk,false)}else{S.attachEvent("on"+dn[dm],dk)}}dt(100)}if(dp&&dp>0){dp=parseInt(dp,10);ds(dp)}})}var bF={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dk=this.requests;
53
+ this.requests=[];if(dk.length===1){bH(dk[0],bL)}else{dg(dk,bL)}},canQueue:function(){return !l&&this.enabled},pushMultiple:function(dl){if(!this.canQueue()){dg(dl,bL);return}var dk;for(dk=0;dk<dl.length;dk++){this.push(dl[dk])}},push:function(dk){if(!dk){return}if(!this.canQueue()){bH(dk,bL);return}bF.requests.push(dk);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bF.timeout=null;bF.sendRequests()},bF.interval);var dl="RequestQueue"+ax;if(!Object.prototype.hasOwnProperty.call(b,dl)){b[dl]={unload:function(){if(bF.timeout){clearTimeout(bF.timeout)}bF.sendRequests()}}}}};bj();aN();this.hasConsent=function(){return bE};this.getVisitorId=function(){return aZ().uuid};this.getVisitorInfo=function(){return cP()};this.getAttributionInfo=function(){return bN()};this.getAttributionCampaignName=function(){return bN()[0]};this.getAttributionCampaignKeyword=function(){return bN()[1]};this.getAttributionReferrerTimestamp=function(){return bN()[2]};this.getAttributionReferrerUrl=function(){return bN()[3]
54
+ };this.setTrackerUrl=function(dk){aE=dk};this.getTrackerUrl=function(){return aE};this.getMatomoUrl=function(){return W(this.getTrackerUrl(),bJ)};this.getPiwikUrl=function(){return this.getMatomoUrl()};this.addTracker=function(dm,dl){if(!J(dm)||null===dm){dm=this.getTrackerUrl()}var dk=new P(dm,dl);I.push(dk);t.trigger("TrackerAdded",[this]);return dk};this.getSiteId=function(){return b7};this.setSiteId=function(dk){b4(dk)};this.resetUserId=function(){bA=""};this.setUserId=function(dk){if(Y(dk)){bA=dk}};this.setVisitorId=function(dl){var dk=/[0-9A-Fa-f]{16}/g;if(w(dl)&&dk.test(dl)){bP=dl}else{ak("Invalid visitorId set"+dl)}};this.getUserId=function(){return bA};this.setCustomData=function(dk,dl){if(V(dk)){ao=dk}else{if(!ao){ao={}}ao[dk]=dl}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dk){cc=dk};this.appendToTrackingUrl=function(dk){c1=dk};this.getRequest=function(dk){return cr(dk)};this.addPlugin=function(dk,dl){b[dk]=dl};this.setCustomDimension=function(dk,dl){dk=parseInt(dk,10);
55
+ if(dk>0){if(!J(dl)){dl=""}if(!w(dl)){dl=String(dl)}bo[dk]=dl}};this.getCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0&&Object.prototype.hasOwnProperty.call(bo,dk)){return bo[dk]}};this.deleteCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0){delete bo[dk]}};this.setCustomVariable=function(dl,dk,dp,dm){var dn;if(!J(dm)){dm="visit"}if(!J(dk)){return}if(!J(dp)){dp=""}if(dl>0){dk=!w(dk)?String(dk):dk;dp=!w(dp)?String(dp):dp;dn=[dk.slice(0,bv),dp.slice(0,bv)];if(dm==="visit"||dm===2){cG();aR[dl]=dn}else{if(dm==="page"||dm===3){bX[dl]=dn}else{if(dm==="event"){cm[dl]=dn}}}}};this.getCustomVariable=function(dl,dm){var dk;if(!J(dm)){dm="visit"}if(dm==="page"||dm===3){dk=bX[dl]}else{if(dm==="event"){dk=cm[dl]}else{if(dm==="visit"||dm===2){cG();dk=aR[dl]}}}if(!J(dk)||(dk&&dk[0]==="")){return false}return dk};this.deleteCustomVariable=function(dk,dl){if(this.getCustomVariable(dk,dl)){this.setCustomVariable(dk,"","",dl)}};this.deleteCustomVariables=function(dk){if(dk==="page"||dk===3){bX={}
56
+ }else{if(dk==="event"){cm={}}else{if(dk==="visit"||dk===2){aR={}}}}};this.storeCustomVariablesInCookie=function(){bR=true};this.setLinkTrackingTimer=function(dk){bL=dk};this.getLinkTrackingTimer=function(){return bL};this.setDownloadExtensions=function(dk){if(w(dk)){dk=dk.split("|")}c8=dk};this.addDownloadExtensions=function(dl){var dk;if(w(dl)){dl=dl.split("|")}for(dk=0;dk<dl.length;dk++){c8.push(dl[dk])}};this.removeDownloadExtensions=function(dm){var dl,dk=[];if(w(dm)){dm=dm.split("|")}for(dl=0;dl<c8.length;dl++){if(M(dm,c8[dl])===-1){dk.push(c8[dl])}}c8=dk};this.setDomains=function(dk){ay=w(dk)?[dk]:dk;var dp=false,dm=0,dl;for(dm;dm<ay.length;dm++){dl=String(ay[dm]);if(cI(cV,L(dl))){dp=true;break}var dn=cl(dl);if(dn&&dn!=="/"&&dn!=="/*"){dp=true;break}}if(!dp){ay.push(cV)}};this.enableCrossDomainLinking=function(){cO=true};this.disableCrossDomainLinking=function(){cO=false};this.isCrossDomainLinkingEnabled=function(){return cO};this.setCrossDomainLinkingTimeout=function(dk){a0=dk};this.getCrossDomainLinkingUrlParameter=function(){return s(av)+"="+s(bt())
57
+ };this.setIgnoreClasses=function(dk){bB=w(dk)?[dk]:dk};this.setRequestMethod=function(dk){if(dk){db=String(dk).toUpperCase()}else{db=ci}if(db==="GET"){this.disableAlwaysUseSendBeacon()}};this.setRequestContentType=function(dk){cx=dk||aI};this.setGenerationTimeMs=function(dk){ak("setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. There is currently no replacement yet.")};this.setReferrerUrl=function(dk){bp=dk};this.setCustomUrl=function(dk){a5=bW(bO,dk)};this.getCurrentUrl=function(){return a5||bO};this.setDocumentTitle=function(dk){bk=dk};this.setPageViewId=function(dk){aM=dk;bC=true};this.setAPIUrl=function(dk){bJ=dk};this.setDownloadClasses=function(dk){bM=w(dk)?[dk]:dk};this.setLinkClasses=function(dk){a9=w(dk)?[dk]:dk};this.setCampaignNameKey=function(dk){cp=w(dk)?[dk]:dk};this.setCampaignKeywordKey=function(dk){bI=w(dk)?[dk]:dk};this.discardHashTag=function(dk){bQ=dk};this.setCookieNamePrefix=function(dk){bl=dk;if(aR){aR=bY()}};this.setCookieDomain=function(dk){var dl=L(dk);
58
+ if(!bn&&!by(dl)){ak("Can't write cookie on domain "+dk)}else{cZ=dl;bj()}};this.getCookieDomain=function(){return cZ};this.hasCookies=function(){return"1"===b6()};this.setSessionCookie=function(dm,dl,dk){if(!dm){throw new Error("Missing cookie name")}if(!J(dk)){dk=cn}bw.push(dm);df(aU(dm),dl,dk,br,cZ,bT,aJ)};this.getCookie=function(dl){var dk=aD(aU(dl));if(dk===0){return null}return dk};this.setCookiePath=function(dk){br=dk;bj()};this.getCookiePath=function(dk){return br};this.setVisitorCookieTimeout=function(dk){cL=dk*1000};this.setSessionCookieTimeout=function(dk){cn=dk*1000};this.getSessionCookieTimeout=function(){return cn};this.setReferralCookieTimeout=function(dk){c7=dk*1000};this.setConversionAttributionFirstReferrer=function(dk){bx=dk};this.setSecureCookie=function(dk){if(dk&&location.protocol!=="https:"){ak("Error in setSecureCookie: You cannot use `Secure` on http.");return}bT=dk};this.setCookieSameSite=function(dk){dk=String(dk);dk=dk.charAt(0).toUpperCase()+dk.toLowerCase().slice(1);
59
+ if(dk!=="None"&&dk!=="Lax"&&dk!=="Strict"){ak("Ignored value for sameSite. Please use either Lax, None, or Strict.");return}if(dk==="None"){if(location.protocol==="https:"){this.setSecureCookie(true)}else{ak("sameSite=None cannot be used on http, reverted to sameSite=Lax.");dk="Lax"}}aJ=dk};this.disableCookies=function(){bn=true;if(b7){aF()}};this.areCookiesEnabled=function(){return !bn};this.setCookieConsentGiven=function(){if(bn&&!cR){bn=false;if(b7&&aw){aN();var dk=cr("ping=1",null,"ping");bH(dk,bL)}}};this.requireCookieConsent=function(){if(this.getRememberedCookieConsent()){return false}this.disableCookies();return true};this.getRememberedCookieConsent=function(){return aD(cE)};this.forgetCookieConsentGiven=function(){bZ(cE,br,cZ);this.disableCookies()};this.rememberCookieConsentGiven=function(dl){if(dl){dl=dl*60*60*1000}else{dl=30*365*24*60*60*1000}this.setCookieConsentGiven();var dk=new Date().getTime();df(cE,dk,dl,br,cZ,bT,aJ)};this.deleteCookies=function(){aF()};this.setDoNotTrack=function(dl){var dk=g.doNotTrack||g.msDoNotTrack;
60
+ cR=dl&&(dk==="yes"||dk==="1");if(cR){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cY=true};this.disableAlwaysUseSendBeacon=function(){cY=false};this.addListener=function(dl,dk){aq(dl,dk,false)};this.enableLinkTracking=function(dl){if(da){return}da=true;var dk=this;p(function(){ap=true;var dm=G.body;aq(dm,dl,true)})};this.enableJSErrorTracking=function(){if(cT){return}cT=true;var dk=S.onerror;S.onerror=function(dq,dn,dm,dp,dl){ch(function(){var dr="JavaScript Errors";var ds=dn+":"+dm;if(dp){ds+=":"+dp}if(M(cs,dr+ds+dq)===-1){cs.push(dr+ds+dq);at(dr,ds,dq)}});if(dk){return dk(dq,dn,dm,dp,dl)}return false}};this.disablePerformanceTracking=function(){a3=false};this.enableHeartBeatTimer=function(dk){dk=Math.max(dk||15,5);a6=dk*1000;if(c0!==null){dh()}};this.disableHeartBeatTimer=function(){if(a6||aO){if(S.removeEventListener){S.removeEventListener("focus",bb);S.removeEventListener("blur",az)}else{if(S.detachEvent){S.detachEvent("onfocus",bb);S.detachEvent("onblur",az)}}}a6=null;
61
+ aO=false};this.killFrame=function(){if(S.location!==S.top.location){S.top.location=S.location}};this.redirectFile=function(dk){if(S.location.protocol==="file:"){S.location=dk}};this.setCountPreRendered=function(dk){bf=dk};this.trackGoal=function(dk,dn,dm,dl){ch(function(){cU(dk,dn,dm,dl)})};this.trackLink=function(dl,dk,dn,dm){ch(function(){c3(dl,dk,dn,dm)})};this.getNumTrackedPageViews=function(){return cq};this.trackPageView=function(dk,dm,dl){cb=[];cM=[];cs=[];if(N(b7)){ch(function(){Z(aE,bJ,b7)})}else{ch(function(){cq++;b1(dk,dm,dl)})}};this.trackAllContentImpressions=function(){if(N(b7)){return}ch(function(){p(function(){var dk=v.findContentNodes();var dl=cA(dk);bF.pushMultiple(dl)})})};this.trackVisibleContentImpressions=function(dk,dl){if(N(b7)){return}if(!J(dk)){dk=true}if(!J(dl)){dl=750}aT(dk,dl,this);ch(function(){m(function(){var dm=v.findContentNodes();var dn=ba(dm);bF.pushMultiple(dn)})})};this.trackContentImpression=function(dm,dk,dl){if(N(b7)){return}dm=a(dm);dk=a(dk);dl=a(dl);
62
+ if(!dm){return}dk=dk||"Unknown";ch(function(){var dn=aG(dm,dk,dl);bF.push(dn)})};this.trackContentImpressionsWithinNode=function(dk){if(N(b7)||!dk){return}ch(function(){if(cf){m(function(){var dl=v.findContentNodesWithinNode(dk);var dm=ba(dl);bF.pushMultiple(dm)})}else{p(function(){var dl=v.findContentNodesWithinNode(dk);var dm=cA(dl);bF.pushMultiple(dm)})}})};this.trackContentInteraction=function(dm,dn,dk,dl){if(N(b7)){return}dm=a(dm);dn=a(dn);dk=a(dk);dl=a(dl);if(!dm||!dn){return}dk=dk||"Unknown";ch(function(){var dp=aQ(dm,dn,dk,dl);if(dp){bF.push(dp)}})};this.trackContentInteractionNode=function(dm,dl){if(N(b7)||!dm){return}var dk=null;ch(function(){dk=dc(dm,dl);if(dk){bF.push(dk)}});return dk};this.logAllContentBlocksOnPage=function(){var dm=v.findContentNodes();var dk=v.collectContent(dm);var dl=typeof console;if(dl!=="undefined"&&console&&console.log){console.log(dk)}};this.trackEvent=function(dl,dn,dk,dm,dq,dp){ch(function(){at(dl,dn,dk,dm,dq,dp)})};this.trackSiteSearch=function(dk,dm,dl,dn){cb=[];
63
+ ch(function(){b9(dk,dm,dl,dn)})};this.setEcommerceView=function(dp,dk,dm,dl){ct={};if(Y(dm)){dm=String(dm)}if(!J(dm)||dm===null||dm===false||!dm.length){dm=""}else{if(dm instanceof Array){dm=S.JSON.stringify(dm)}}var dn="_pkc";ct[dn]=dm;if(J(dl)&&dl!==null&&dl!==false&&String(dl).length){dn="_pkp";ct[dn]=dl}if(!Y(dp)&&!Y(dk)){return}if(Y(dp)){dn="_pks";ct[dn]=dp}if(!Y(dk)){dk=""}dn="_pkn";ct[dn]=dk};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c2))};this.addEcommerceItem=function(dp,dk,dm,dl,dn){if(Y(dp)){c2[dp]=[String(dp),dk,dm,dl,dn]}};this.removeEcommerceItem=function(dk){if(Y(dk)){dk=String(dk);delete c2[dk]}};this.clearEcommerceCart=function(){c2={}};this.trackEcommerceOrder=function(dk,dp,dn,dm,dl,dq){b0(dk,dp,dn,dm,dl,dq)};this.trackEcommerceCartUpdate=function(dk){bu(dk)};this.trackRequest=function(dl,dn,dm,dk){ch(function(){var dp=cr(dl,dn,dk);bH(dp,bL,dm)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bF.enabled=false
64
+ };this.setRequestQueueInterval=function(dk){if(dk<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bF.interval=dk};this.queueRequest=function(dk){ch(function(){var dl=cr(dk);bF.push(dl)})};this.isConsentRequired=function(){return cB};this.getRememberedConsent=function(){var dk=aD(be);if(aD(cN)){if(dk){bZ(be,br,cZ)}return null}if(!dk||dk===0){return null}return dk};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cB=true;bE=this.hasRememberedConsent();if(!bE){bn=true}x++;b["CoreConsent"+x]={unload:function(){if(!bE){aF()}}}};this.setConsentGiven=function(dl){bE=true;bZ(cN,br,cZ);var dm,dk;for(dm=0;dm<cM.length;dm++){dk=typeof cM[dm];if(dk==="string"){bH(cM[dm],bL)}else{if(dk==="object"){dg(cM[dm],bL)}}}cM=[];if(!J(dl)||dl){this.setCookieConsentGiven()}};this.rememberConsentGiven=function(dm){if(dm){dm=dm*60*60*1000}else{dm=30*365*24*60*60*1000}var dk=true;this.setConsentGiven(dk);var dl=new Date().getTime();
65
+ df(be,dl,dm,br,cZ,bT,aJ)};this.forgetConsentGiven=function(){var dk=30*365*24*60*60*1000;bZ(be,br,cZ);df(cN,new Date().getTime(),dk,br,cZ,bT,aJ);this.forgetCookieConsentGiven();this.requireConsent()};this.isUserOptedOut=function(){return !bE};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=function(){this.setConsentGiven(false)};m(function(){setTimeout(function(){bG=true},0)});t.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];if(av[ap]>1&&ap!=="addTracker"&&ap!=="enableLinkTracking"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking"];
66
+ function ad(aq,ap){var ao=new P(aq,ap);I.push(ao);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();t.trigger("TrackerAdded",[ao]);return ao}an(S,"beforeunload",ai,false);an(S,"online",function(){if(J(g.serviceWorker)){g.serviceWorker.ready.then(function(ao){if(ao&&ao.sync){return ao.sync.register("matomoSync")}},function(){})}},false);an(S,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getMatomoUrl());if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})
67
  }else{if(J(aq.maq_opted_in)){at=t.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getMatomoUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;t={initialized:false,JSON:S.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:m,onReady:p,isNodeVisible:i,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||S,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ap,ao){if(!J(ao)){ao=this.getAsyncTracker().getSiteId()}if(!J(ap)){ap=this.getAsyncTracker().getTrackerUrl()
68
  }return new P(ap,ao)},getAsyncTrackers:function(){return I},addTracker:function(aq,ap){var ao;if(!I.length){ao=ad(aq,ap)}else{ao=I[0].addTracker(aq,ap)}return ao},getAsyncTracker:function(at,ar){var aq;if(I&&I.length&&I[0]){aq=I[0]}else{return ad(at,ar)}if(!ar&&!at){return aq}if((!J(ar)||null===ar)&&aq){ar=aq.getSiteId()}if((!J(at)||null===at)&&aq){at=aq.getTrackerUrl()}var ap,ao=0;for(ao;ao<I.length;ao++){ap=I[ao];if(ap&&String(ap.getSiteId())===String(ar)&&ap.getTrackerUrl()===at){return ap}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return t});define("matomo",[],function(){return t})}return t}())}
69
  /*!!! pluginTrackerHook */
app/plugins/API/Controller.php CHANGED
@@ -195,7 +195,7 @@ class Controller extends \Piwik\Plugin\Controller
195
  $item['letters'] = array();
196
  foreach ($item['entries'] as &$entry) {
197
  $cleanEntryName = preg_replace('/["\']/', '', $entry['name']);
198
- $entry['letter'] = Common::mb_strtoupper(substr($cleanEntryName, 0, 1));
199
  $item['letters'][] = $entry['letter'];
200
  }
201
 
195
  $item['letters'] = array();
196
  foreach ($item['entries'] as &$entry) {
197
  $cleanEntryName = preg_replace('/["\']/', '', $entry['name']);
198
+ $entry['letter'] = mb_strtoupper(substr($cleanEntryName, 0, 1));
199
  $item['letters'][] = $entry['letter'];
200
  }
201
 
app/plugins/API/Filter/DataComparisonFilter.php CHANGED
@@ -221,7 +221,7 @@ class DataComparisonFilter
221
  $comparisonSeries[] = $compareMetadata['compareSeriesPretty'];
222
 
223
  $compareTable = $this->requestReport($method, $modifiedParams);
224
- $this->comparisonRowGenerator->compareTables($compareMetadata, $table, $compareTable);
225
  }
226
 
227
  // calculate changes (including processed metric changes)
221
  $comparisonSeries[] = $compareMetadata['compareSeriesPretty'];
222
 
223
  $compareTable = $this->requestReport($method, $modifiedParams);
224
+ $this->comparisonRowGenerator->compareTables($compareMetadata, $table, empty($compareTable) ? null : $compareTable);
225
  }
226
 
227
  // calculate changes (including processed metric changes)
app/plugins/API/Filter/DataComparisonFilter/ComparisonRowGenerator.php CHANGED
@@ -51,7 +51,7 @@ class ComparisonRowGenerator
51
  $isDatePeriod = $tables->getKeyName() == 'date';
52
 
53
  foreach ($childTablesArray as $index => $childTable) {
54
- $compareChildTable = isset($compareTablesArray[$index]) ? $compareTablesArray[$index] : null;
55
  $this->compareTables($compareMetadata, $childTable, $compareChildTable);
56
  }
57
 
@@ -82,7 +82,7 @@ class ComparisonRowGenerator
82
  $tables->addTable($newTable, $periodLabel);
83
 
84
  // compare with the empty table
85
- $compareTable = $compareTablesArray[$i];
86
  $this->compareTables($compareMetadata, $newTable, $compareTable);
87
  }
88
  }
51
  $isDatePeriod = $tables->getKeyName() == 'date';
52
 
53
  foreach ($childTablesArray as $index => $childTable) {
54
+ $compareChildTable = !empty($compareTablesArray[$index]) ? $compareTablesArray[$index] : null;
55
  $this->compareTables($compareMetadata, $childTable, $compareChildTable);
56
  }
57
 
82
  $tables->addTable($newTable, $periodLabel);
83
 
84
  // compare with the empty table
85
+ $compareTable = !empty($compareTablesArray[$i]) ? $compareTablesArray[$i] : null;
86
  $this->compareTables($compareMetadata, $newTable, $compareTable);
87
  }
88
  }
app/plugins/Actions/Actions/ActionSiteSearch.php CHANGED
@@ -137,14 +137,14 @@ class ActionSiteSearch extends Action
137
  // strtolower the parameter names for smooth site search detection
138
  $parameters = array();
139
  foreach ($parametersRaw as $k => $v) {
140
- $parameters[Common::mb_strtolower($k)] = $v;
141
  }
142
  // decode values if they were sent from a client using another charset
143
  PageUrl::reencodeParameters($parameters, $pageEncoding);
144
 
145
  // Detect Site Search keyword
146
  foreach ($keywordParameters as $keywordParameterRaw) {
147
- $keywordParameter = Common::mb_strtolower($keywordParameterRaw);
148
  if (!empty($parameters[$keywordParameter])) {
149
  $actionName = $parameters[$keywordParameter];
150
  break;
@@ -160,7 +160,7 @@ class ActionSiteSearch extends Action
160
  : array();
161
 
162
  foreach ($categoryParameters as $categoryParameterRaw) {
163
- $categoryParameter = Common::mb_strtolower($categoryParameterRaw);
164
  if (!empty($parameters[$categoryParameter])) {
165
  $categoryName = $parameters[$categoryParameter];
166
  break;
137
  // strtolower the parameter names for smooth site search detection
138
  $parameters = array();
139
  foreach ($parametersRaw as $k => $v) {
140
+ $parameters[mb_strtolower($k)] = $v;
141
  }
142
  // decode values if they were sent from a client using another charset
143
  PageUrl::reencodeParameters($parameters, $pageEncoding);
144
 
145
  // Detect Site Search keyword
146
  foreach ($keywordParameters as $keywordParameterRaw) {
147
+ $keywordParameter = mb_strtolower($keywordParameterRaw);
148
  if (!empty($parameters[$keywordParameter])) {
149
  $actionName = $parameters[$keywordParameter];
150
  break;
160
  : array();
161
 
162
  foreach ($categoryParameters as $categoryParameterRaw) {
163
+ $categoryParameter = mb_strtolower($categoryParameterRaw);
164
  if (!empty($parameters[$categoryParameter])) {
165
  $categoryName = $parameters[$categoryParameter];
166
  break;
app/plugins/Actions/DataTable/Filter/Actions.php CHANGED
@@ -72,7 +72,7 @@ class Actions extends BaseFilter
72
  $host = parse_url($url, PHP_URL_HOST);
73
 
74
  if ($host && PageUrl::shouldUseHttpsHost($site->getId(), $host)) {
75
- $row->setMetadata('url', 'https://' . Common::mb_substr($url, 7 /* = strlen('http://') */));
76
  }
77
  }
78
  } else if ($folderUrlStart) {
72
  $host = parse_url($url, PHP_URL_HOST);
73
 
74
  if ($host && PageUrl::shouldUseHttpsHost($site->getId(), $host)) {
75
+ $row->setMetadata('url', 'https://' . mb_substr($url, 7 /* = strlen('http://') */));
76
  }
77
  }
78
  } else if ($folderUrlStart) {
app/plugins/Actions/VisitorDetails.php CHANGED
@@ -166,7 +166,7 @@ class VisitorDetails extends VisitorDetailsAbstract
166
  $host = parse_url($action['url'], PHP_URL_HOST);
167
 
168
  if ($host && PageUrl::shouldUseHttpsHost($visitorDetails['idSite'], $host)) {
169
- $action['url'] = 'https://' . Common::mb_substr($action['url'], 7 /* = strlen('http://') */);
170
  }
171
  }
172
 
166
  $host = parse_url($action['url'], PHP_URL_HOST);
167
 
168
  if ($host && PageUrl::shouldUseHttpsHost($visitorDetails['idSite'], $host)) {
169
+ $action['url'] = 'https://' . mb_substr($action['url'], 7 /* = strlen('http://') */);
170
  }
171
  }
172
 
app/plugins/CoreAdminHome/Commands/InvalidateReportData.php CHANGED
@@ -85,6 +85,8 @@ class InvalidateReportData extends ConsoleCommand
85
  $dateRanges = $this->getDateRangesToInvalidateFor($input);
86
  $segments = $this->getSegmentsToInvalidateFor($input, $sites, $output);
87
 
 
 
88
  foreach ($periodTypes as $periodType) {
89
  if ($periodType === 'range') {
90
  continue; // special handling for range below
@@ -93,7 +95,7 @@ class InvalidateReportData extends ConsoleCommand
93
  foreach ($segments as $segment) {
94
  $segmentStr = $segment ? $segment->getString() : '';
95
 
96
- $output->writeln("Invalidating $periodType periods in $dateRange [segment = $segmentStr]...");
97
 
98
  $dates = $this->getPeriodDates($periodType, $dateRange);
99
 
@@ -104,13 +106,13 @@ class InvalidateReportData extends ConsoleCommand
104
  if (!empty($plugin)) {
105
  $message .= ", plugin = [ $plugin ]";
106
  }
107
- $output->writeln($message);
108
  } else {
109
  $invalidationResult = $invalidator->markArchivesAsInvalidated($sites, $dates, $periodType, $segment, $cascade,
110
  false, $plugin, $ignoreLogDeletionLimit);
111
 
112
  if ($output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL) {
113
- $output->writeln($invalidationResult->makeOutputLogs());
114
  }
115
  }
116
  }
@@ -134,7 +136,7 @@ class InvalidateReportData extends ConsoleCommand
134
  $segmentStr = $segment ? $segment->getString() : '';
135
  if ($dryRun) {
136
  $dateRangeStr = implode(';', $dateRanges);
137
- $output->writeln("Invalidating range periods overlapping $dateRangeStr [segment = $segmentStr]...");
138
  } else {
139
  $invalidator->markArchivesOverlappingRangeAsInvalidated($sites, $rangeDates, $segment);
140
  }
85
  $dateRanges = $this->getDateRangesToInvalidateFor($input);
86
  $segments = $this->getSegmentsToInvalidateFor($input, $sites, $output);
87
 
88
+ $logger = StaticContainer::get(LoggerInterface::class);
89
+
90
  foreach ($periodTypes as $periodType) {
91
  if ($periodType === 'range') {
92
  continue; // special handling for range below
95
  foreach ($segments as $segment) {
96
  $segmentStr = $segment ? $segment->getString() : '';
97
 
98
+ $logger->info("Invalidating $periodType periods in $dateRange [segment = $segmentStr]...");
99
 
100
  $dates = $this->getPeriodDates($periodType, $dateRange);
101
 
106
  if (!empty($plugin)) {
107
  $message .= ", plugin = [ $plugin ]";
108
  }
109
+ $logger->info($message);
110
  } else {
111
  $invalidationResult = $invalidator->markArchivesAsInvalidated($sites, $dates, $periodType, $segment, $cascade,
112
  false, $plugin, $ignoreLogDeletionLimit);
113
 
114
  if ($output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL) {
115
+ $logger->info($invalidationResult->makeOutputLogs());
116
  }
117
  }
118
  }
136
  $segmentStr = $segment ? $segment->getString() : '';
137
  if ($dryRun) {
138
  $dateRangeStr = implode(';', $dateRanges);
139
+ $logger->info("Invalidating range periods overlapping $dateRangeStr [segment = $segmentStr]...");
140
  } else {
141
  $invalidator->markArchivesOverlappingRangeAsInvalidated($sites, $rangeDates, $segment);
142
  }
app/plugins/CoreAdminHome/Commands/VersionInfo.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ */
8
+
9
+ namespace Piwik\Plugins\CoreAdminHome\Commands;
10
+
11
+ use Piwik\Plugin\ConsoleCommand;
12
+ use Piwik\Version;
13
+ use Symfony\Component\Console\Input\InputInterface;
14
+ use Symfony\Component\Console\Output\OutputInterface;
15
+
16
+
17
+ class VersionInfo extends ConsoleCommand
18
+ {
19
+ protected function configure()
20
+ {
21
+ $this->setName('core:version');
22
+ $this->setDescription('Returns the current version information of this Matomo instance.');
23
+ $this->setHelp("This command can be used to set get the version information of the current Matomo instance.");
24
+ }
25
+
26
+ protected function execute(InputInterface $input, OutputInterface $output)
27
+ {
28
+ $output->writeln(Version::VERSION);
29
+ }
30
+ }
app/plugins/CoreAdminHome/Controller.php CHANGED
@@ -299,6 +299,7 @@ class Controller extends ControllerAdmin
299
  $view->todayArchiveTimeToLive = $todayArchiveTimeToLive;
300
  $view->todayArchiveTimeToLiveDefault = Rules::getTodayArchiveTimeToLiveDefault();
301
  $view->enableBrowserTriggerArchiving = $enableBrowserTriggerArchiving;
 
302
 
303
  $mail = Config::getInstance()->mail;
304
  $mail['noreply_email_address'] = Config::getInstance()->General['noreply_email_address'];
299
  $view->todayArchiveTimeToLive = $todayArchiveTimeToLive;
300
  $view->todayArchiveTimeToLiveDefault = Rules::getTodayArchiveTimeToLiveDefault();
301
  $view->enableBrowserTriggerArchiving = $enableBrowserTriggerArchiving;
302
+ $view->showSegmentArchiveTriggerInfo = Rules::isBrowserArchivingAvailableForSegments();
303
 
304
  $mail = Config::getInstance()->mail;
305
  $mail['noreply_email_address'] = Config::getInstance()->General['noreply_email_address'];
app/plugins/CoreAdminHome/Emails/RecoveryCodesRegeneratedEmail.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class RecoveryCodesRegeneratedEmail extends SecurityNotificationEmail
16
+ {
17
+ protected function getBody()
18
+ {
19
+ return Piwik::translate('CoreAdminHome_SecurityNotificationRecoveryCodesRegeneratedBody') . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
20
+ }
21
+ }
app/plugins/CoreAdminHome/Emails/RecoveryCodesShowedEmail.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class RecoveryCodesShowedEmail extends SecurityNotificationEmail
16
+ {
17
+ protected function getBody()
18
+ {
19
+ return Piwik::translate('CoreAdminHome_SecurityNotificationRecoveryCodesShowedBody') . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
20
+ }
21
+ }
app/plugins/CoreAdminHome/Emails/SecurityNotificationEmail.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Mail;
13
+ use Piwik\View;
14
+ use Piwik\Piwik;
15
+
16
+ abstract class SecurityNotificationEmail extends Mail
17
+ {
18
+ public static $notifyPluginList = [
19
+ 'Login' => 'CoreAdminHome_BruteForce',
20
+ 'TwoFactorAuth' => 'CoreAdminHome_TwoFactorAuth',
21
+ 'CoreAdminHome' => 'CoreAdminHome_Cors'
22
+ ];
23
+
24
+ /**
25
+ * @var string
26
+ */
27
+ private $login;
28
+
29
+ /**
30
+ * @var string
31
+ */
32
+ private $emailAddress;
33
+
34
+ public function __construct($login, $emailAddress)
35
+ {
36
+ parent::__construct();
37
+
38
+ $this->login = $login;
39
+ $this->emailAddress = $emailAddress;
40
+
41
+ $this->setUpEmail();
42
+ }
43
+
44
+ /**
45
+ * @return string
46
+ */
47
+ public function getLogin()
48
+ {
49
+ return $this->login;
50
+ }
51
+
52
+ /**
53
+ * @return string
54
+ */
55
+ public function getEmailAddress()
56
+ {
57
+ return $this->emailAddress;
58
+ }
59
+
60
+
61
+ private function setUpEmail()
62
+ {
63
+ $this->setDefaultFromPiwik();
64
+ $this->addTo($this->emailAddress);
65
+ $this->setSubject($this->getDefaultSubject());
66
+ $this->addReplyTo($this->getFrom(), $this->getFromName());
67
+ $this->setWrappedHtmlBody($this->getDefaultBodyView());
68
+ }
69
+
70
+ protected function getDefaultSubject()
71
+ {
72
+ return Piwik::translate('CoreAdminHome_SecurityNotificationEmailSubject');
73
+ }
74
+
75
+ protected function getDefaultBodyView()
76
+ {
77
+ $view = new View('@CoreAdminHome/_securityNotificationEmail.twig');
78
+ $view->login = $this->login;
79
+ $view->body = $this->getBody();
80
+
81
+ return $view;
82
+ }
83
+
84
+ abstract protected function getBody();
85
+ }
app/plugins/CoreAdminHome/Emails/SettingsChangedEmail.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class SettingsChangedEmail extends SecurityNotificationEmail
16
+ {
17
+ /**
18
+ * @var string
19
+ */
20
+ private $superuser;
21
+
22
+ /**
23
+ * @var string
24
+ */
25
+ private $pluginNames;
26
+
27
+ public function __construct($login, $emailAddress, $pluginNames, $superuser = null)
28
+ {
29
+ $this->pluginNames = $pluginNames;
30
+ $this->superuser = $superuser;
31
+
32
+ parent::__construct($login, $emailAddress);
33
+ }
34
+
35
+ protected function getBody()
36
+ {
37
+ if ($this->superuser) {
38
+ return Piwik::translate('CoreAdminHome_SecurityNotificationSettingsChangedByOtherSuperUserBody', [$this->superuser, $this->pluginNames]);
39
+ }
40
+
41
+ return Piwik::translate('CoreAdminHome_SecurityNotificationSettingsChangedByUserBody', [$this->pluginNames]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
42
+ }
43
+ }
app/plugins/CoreAdminHome/Emails/TokenAuthCreatedEmail.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class TokenAuthCreatedEmail extends SecurityNotificationEmail
16
+ {
17
+ /**
18
+ * @var string
19
+ */
20
+ private $tokenDescription;
21
+
22
+ public function __construct($login, $emailAddress, $tokenDescription)
23
+ {
24
+ $this->tokenDescription = $tokenDescription;
25
+
26
+ parent::__construct($login, $emailAddress);
27
+ }
28
+
29
+ protected function getBody()
30
+ {
31
+ return Piwik::translate('CoreAdminHome_SecurityNotificationTokenAuthCreatedBody', [$this->tokenDescription]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
32
+ }
33
+ }
app/plugins/CoreAdminHome/Emails/TokenAuthDeletedEmail.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class TokenAuthDeletedEmail extends SecurityNotificationEmail
16
+ {
17
+ /**
18
+ * @var string
19
+ */
20
+ private $tokenDescription;
21
+
22
+ /**
23
+ * @var bool
24
+ */
25
+ private $all;
26
+
27
+ public function __construct($login, $emailAddress, $tokenDescription, $all = false)
28
+ {
29
+ $this->tokenDescription = $tokenDescription;
30
+ $this->all = $all;
31
+
32
+ parent::__construct($login, $emailAddress);
33
+ }
34
+
35
+ protected function getBody()
36
+ {
37
+ if ($this->all) {
38
+ return Piwik::translate('CoreAdminHome_SecurityNotificationAllTokenAuthDeletedBody') . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
39
+ }
40
+
41
+ return Piwik::translate('CoreAdminHome_SecurityNotificationTokenAuthDeletedBody', [$this->tokenDescription]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
42
+ }
43
+ }
app/plugins/CoreAdminHome/Emails/TwoFactorAuthDisabledEmail.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class TwoFactorAuthDisabledEmail extends SecurityNotificationEmail
16
+ {
17
+ protected function getBody()
18
+ {
19
+ return Piwik::translate('CoreAdminHome_SecurityNotificationTwoFactorAuthDisabledBody') . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
20
+ }
21
+ }
app/plugins/CoreAdminHome/Emails/TwoFactorAuthEnabledEmail.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class TwoFactorAuthEnabledEmail extends SecurityNotificationEmail
16
+ {
17
+ protected function getBody()
18
+ {
19
+ return Piwik::translate('CoreAdminHome_SecurityNotificationTwoFactorAuthEnabledBody') . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
20
+ }
21
+ }
app/plugins/CoreAdminHome/Emails/UserCreatedEmail.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class UserCreatedEmail extends SecurityNotificationEmail
16
+ {
17
+ /**
18
+ * @var string
19
+ */
20
+ private $userLogin;
21
+
22
+ public function __construct($login, $emailAddress, $userLogin)
23
+ {
24
+ $this->userLogin = $userLogin;
25
+
26
+ parent::__construct($login, $emailAddress);
27
+ }
28
+
29
+ protected function getBody()
30
+ {
31
+ return Piwik::translate('CoreAdminHome_SecurityNotificationUserCreatedBody', [$this->userLogin]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
32
+ }
33
+ }
app/plugins/CoreAdminHome/Emails/UserDeletedEmail.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreAdminHome\Emails;
11
+
12
+ use Piwik\Piwik;
13
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
14
+
15
+ class UserDeletedEmail extends SecurityNotificationEmail
16
+ {
17
+ /**
18
+ * @var string
19
+ */
20
+ private $userLogin;
21
+
22
+ public function __construct($login, $emailAddress, $userLogin)
23
+ {
24
+ $this->userLogin = $userLogin;
25
+
26
+ parent::__construct($login, $emailAddress);
27
+ }
28
+
29
+ protected function getBody()
30
+ {
31
+ return Piwik::translate('CoreAdminHome_SecurityNotificationUserDeletedBody', [$this->userLogin]) . ' ' . Piwik::translate('UsersManager_IfThisWasYouPasswordChange');
32
+ }
33
+ }
app/plugins/CoreAdminHome/OptOutManager.php CHANGED
@@ -172,10 +172,17 @@ class OptOutManager
172
 
173
  $setCookieInNewWindow = Common::getRequestVar('setCookieInNewWindow', false, 'int');
174
  if ($setCookieInNewWindow) {
 
 
 
 
 
 
 
175
  $reloadUrl = Url::getCurrentQueryStringWithParametersModified(array(
176
  'showConfirmOnly' => 1,
177
  'setCookieInNewWindow' => 0,
178
- 'nonce' => Common::getRequestVar('nonce')
179
  ));
180
  } else {
181
  $reloadUrl = false;
@@ -232,7 +239,7 @@ class OptOutManager
232
  $cssbody = 'body { ';
233
 
234
  $hexstrings = array(
235
- 'fontColor' => $cssfontcolour,
236
  'backgroundColor' => $cssbackgroundcolor
237
  );
238
  foreach ($hexstrings as $key => $testcase) {
@@ -242,7 +249,7 @@ class OptOutManager
242
  }
243
 
244
  if ($cssfontsize && (preg_match("/^[0-9]+[\.]?[0-9]*(px|pt|em|rem|%)$/", $cssfontsize))) {
245
- $cssbody .= 'font-size: ' . $cssfontsize . '; ';
246
  } else if ($cssfontsize) {
247
  throw new \Exception("The URL parameter fontSize value of '$cssfontsize' is not valid. Expected value is for example '15pt', '1.2em' or '13px'.\n");
248
  }
172
 
173
  $setCookieInNewWindow = Common::getRequestVar('setCookieInNewWindow', false, 'int');
174
  if ($setCookieInNewWindow) {
175
+ $nonce = Common::getRequestVar('nonce', false);
176
+
177
+ if ($nonce !== false && !Nonce::verifyNonce('Piwik_OptOut', $nonce)) {
178
+ Nonce::discardNonce('Piwik_OptOut');
179
+ $nonce = '';
180
+ }
181
+
182
  $reloadUrl = Url::getCurrentQueryStringWithParametersModified(array(
183
  'showConfirmOnly' => 1,
184
  'setCookieInNewWindow' => 0,
185
+ 'nonce' => $nonce ? $nonce : ''
186
  ));
187
  } else {
188
  $reloadUrl = false;
239
  $cssbody = 'body { ';
240
 
241
  $hexstrings = array(
242
+ 'fontColor' => $cssfontcolour,
243
  'backgroundColor' => $cssbackgroundcolor
244
  );
245
  foreach ($hexstrings as $key => $testcase) {
249
  }
250
 
251
  if ($cssfontsize && (preg_match("/^[0-9]+[\.]?[0-9]*(px|pt|em|rem|%)$/", $cssfontsize))) {
252
+ $cssbody .= 'font-size: ' . $cssfontsize . '; ';
253
  } else if ($cssfontsize) {
254
  throw new \Exception("The URL parameter fontSize value of '$cssfontsize' is not valid. Expected value is for example '15pt', '1.2em' or '13px'.\n");
255
  }
app/plugins/CoreAdminHome/templates/_securityNotificationEmail.twig ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <p>{{ 'General_HelloUser'|translate(login) }}</p>
2
+ <p>{{ body }}</p>
app/plugins/CoreAdminHome/templates/generalSettings.twig CHANGED
@@ -33,7 +33,10 @@
33
  name="enableBrowserTriggerArchiving"
34
  {% if enableBrowserTriggerArchiving==0 %} checked="checked"{% endif %} />
35
  <span>{{ 'General_No'|translate }}</span>
36
- <span class="form-description">{{ 'General_ArchivingTriggerDescription'|translate("<a target='_blank' rel='noreferrer noopener' href='https://matomo.org/docs/setup-auto-archiving/'>","</a>")|raw }}</span>
 
 
 
37
  </label>
38
  </p>
39
  </div><div class="col s12 m6">
33
  name="enableBrowserTriggerArchiving"
34
  {% if enableBrowserTriggerArchiving==0 %} checked="checked"{% endif %} />
35
  <span>{{ 'General_No'|translate }}</span>
36
+ <span class="form-description">
37
+ {{ 'General_ArchivingTriggerDescription'|translate("<a target='_blank' rel='noreferrer noopener' href='https://matomo.org/docs/setup-auto-archiving/'>","</a>")|raw }}
38
+ {% if showSegmentArchiveTriggerInfo %}{{ 'General_ArchivingTriggerSegment'|translate }}{% endif %}
39
+ </span>
40
  </label>
41
  </p>
42
  </div><div class="col s12 m6">
app/plugins/CoreConsole/Commands/CoreArchiver.php CHANGED
@@ -56,8 +56,12 @@ class CoreArchiver extends ConsoleCommand
56
  $archiveFilter->setForceReport($input->getOption('force-report'));
57
 
58
  $segmentIds = $input->getOption('force-idsegments');
59
- $segmentIds = explode(',', $segmentIds);
60
- $segmentIds = array_map('trim', $segmentIds);
 
 
 
 
61
  $archiveFilter->setSegmentsToForceFromSegmentIds($segmentIds);
62
 
63
  $archiver->setArchiveFilter($archiveFilter);
56
  $archiveFilter->setForceReport($input->getOption('force-report'));
57
 
58
  $segmentIds = $input->getOption('force-idsegments');
59
+ if (!empty($segmentIds)) {
60
+ $segmentIds = explode(',', $segmentIds);
61
+ $segmentIds = array_map('trim', $segmentIds);
62
+ } else {
63
+ $segmentIds = [];
64
+ }
65
  $archiveFilter->setSegmentsToForceFromSegmentIds($segmentIds);
66
 
67
  $archiver->setArchiveFilter($archiveFilter);
app/plugins/CoreConsole/Commands/GenerateSystemCheck.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Plugins\CoreConsole\Commands;
11
+
12
+ use Piwik\Common;
13
+ use Piwik\Plugin\Manager;
14
+ use Symfony\Component\Console\Input\InputInterface;
15
+ use Symfony\Component\Console\Input\InputOption;
16
+ use Symfony\Component\Console\Output\OutputInterface;
17
+
18
+ class GenerateSystemCheck extends GeneratePluginBase
19
+ {
20
+ protected function configure()
21
+ {
22
+ $this->setName('generate:system-check')
23
+ ->setDescription('Adds a new system check to an existing plugin')
24
+ ->addOption('pluginname', null, InputOption::VALUE_REQUIRED, 'The name of an existing plugin which does not have a menu defined yet')
25
+ ->addOption('checkname', null, InputOption::VALUE_REQUIRED, 'The name of the system check you want to create');
26
+ }
27
+
28
+ protected function execute(InputInterface $input, OutputInterface $output)
29
+ {
30
+ $pluginName = $this->getPluginName($input, $output);
31
+ $this->checkAndUpdateRequiredPiwikVersion($pluginName, $output);
32
+
33
+ $checkName = $this->getSystemCheckName($input, $output);
34
+ $className = ucfirst(str_replace(' ' , '', $checkName));
35
+ if (!Common::stringEndsWith($className, 'check') && !Common::stringEndsWith($className, 'Check')) {
36
+ $className .= 'Check';
37
+ }
38
+
39
+ $exampleFolder = Manager::getPluginDirectory('ExamplePlugin');
40
+ $replace = array('ExampleCheck' => $className,
41
+ 'Example Check' => $checkName,
42
+ 'ExamplePlugin' => $pluginName,
43
+ );
44
+
45
+ $whitelistFiles = array('/Diagnostic', '/Diagnostic/ExampleCheck.php');
46
+
47
+ $this->copyTemplateToPlugin($exampleFolder, $pluginName, $replace, $whitelistFiles);
48
+
49
+ $this->writeSuccessMessage($output, array(
50
+ sprintf('plugins/%s/Diagnostic/%s.php for %s generated.', $pluginName, $className, $pluginName),
51
+ sprintf('You should now implement the method called <comment>execute</comment> in %s.php', $className),
52
+ 'You also need to make the diagnostic check known to Matomo in your "plugins/'.$pluginName.'/config/config.php".',
53
+ 'Read more about this here: https://developer.matomo.org/guides/system-check',
54
+ 'Enjoy!'
55
+ ));
56
+ }
57
+
58
+ /**
59
+ * @param InputInterface $input
60
+ * @param OutputInterface $output
61
+ * @return string
62
+ * @throws \RuntimeException
63
+ */
64
+ protected function getSystemCheckName(InputInterface $input, OutputInterface $output)
65
+ {
66
+ $validate = function ($checkName) {
67
+ if (empty($checkName)) {
68
+ throw new \InvalidArgumentException('Please enter the name of your system check');
69
+ }
70
+
71
+ if (preg_match("/[^A-Za-z0-9 ]/", $checkName)) {
72
+ throw new \InvalidArgumentException('Only alpha numerical characters and whitespaces are allowed');
73
+ }
74
+
75
+ return $checkName;
76
+ };
77
+
78
+ $checkName = $input->getOption('checkname');
79
+
80
+ if (empty($checkName)) {
81
+ $dialog = $this->getHelperSet()->get('dialog');
82
+ $checkName = $dialog->askAndValidate($output, 'Enter the name of your system check, for example "PDF PHP Extension Check": ', $validate);
83
+ } else {
84
+ $validate($checkName);
85
+ }
86
+
87
+ $checkName = ucfirst($checkName);
88
+
89
+ return $checkName;
90
+ }
91
+
92
+ /**
93
+ * @param InputInterface $input
94
+ * @param OutputInterface $output
95
+ * @return string
96
+ * @throws \RuntimeException
97
+ */
98
+ protected function getPluginName(InputInterface $input, OutputInterface $output)
99
+ {
100
+ $pluginNames = $this->getPluginNames();
101
+ $invalidName = 'You have to enter a name of an existing plugin.';
102
+
103
+ return $this->askPluginNameAndValidate($input, $output, $pluginNames, $invalidName);
104
+ }
105
+
106
+ }
app/plugins/CoreHome/Columns/UserId.php CHANGED
@@ -57,7 +57,7 @@ class UserId extends VisitDimension
57
  {
58
  $value = $request->getForcedUserId();
59
  if (!empty($value)) {
60
- return Common::mb_substr($value, 0, self::MAXLENGTH);
61
  }
62
  return $value;
63
  }
57
  {
58
  $value = $request->getForcedUserId();
59
  if (!empty($value)) {
60
+ return mb_substr($value, 0, self::MAXLENGTH);
61
  }
62
  return $value;
63
  }
app/plugins/CoreHome/Columns/VisitorId.php CHANGED
@@ -44,12 +44,18 @@ class VisitorId extends VisitDimension
44
 
45
  public function configureSegments(SegmentsList $segmentsList, DimensionSegmentFactory $dimensionSegmentFactory)
46
  {
47
- $systemSettings = new SystemSettings();
48
- $a = $systemSettings->disableVisitorProfile->getValue();
49
- $b = $systemSettings->disableVisitorLog->getValue();
 
 
 
 
 
 
 
 
50
 
51
- $visitorProfileEnabled = $systemSettings->disableVisitorProfile->getValue() === false
52
- && $systemSettings->disableVisitorLog->getValue() === false;
53
  if ($visitorProfileEnabled) {
54
  parent::configureSegments($segmentsList, $dimensionSegmentFactory);
55
  }
44
 
45
  public function configureSegments(SegmentsList $segmentsList, DimensionSegmentFactory $dimensionSegmentFactory)
46
  {
47
+ try {
48
+ $systemSettings = new SystemSettings();
49
+ $visitorProfileEnabled = $systemSettings->disableVisitorProfile->getValue() === false
50
+ && $systemSettings->disableVisitorLog->getValue() === false;
51
+ } catch (\Zend_Db_Exception $e) {
52
+ // when running tests the db might not yet be set up when fetching available segments
53
+ if (!defined('PIWIK_TEST_MODE') || !PIWIK_TEST_MODE) {
54
+ throw $e;
55
+ }
56
+ $visitorProfileEnabled = true;
57
+ }
58
 
 
 
59
  if ($visitorProfileEnabled) {
60
  parent::configureSegments($segmentsList, $dimensionSegmentFactory);
61
  }
app/plugins/CoreHome/DataTableRowAction/RowEvolution.php CHANGED
@@ -139,7 +139,8 @@ class RowEvolution
139
  $popoverTitle = '';
140
  if ($this->rowLabel) {
141
  $icon = $this->rowIcon ? '<img height="16px" src="' . $this->rowIcon . '" alt="">' : '';
142
- $metricsText = sprintf(Piwik::translate('RowEvolution_MetricsFor'), $this->dimension . ': ' . $icon . ' ' . $this->rowLabel);
 
143
  $popoverTitle = $icon . ' ' . $this->rowLabel;
144
  }
145
 
@@ -401,7 +402,6 @@ class RowEvolution
401
  {
402
  // By default, use the specified label
403
  $rowLabel = Common::sanitizeInputValue($report['label']);
404
- $rowLabel = str_replace('/', '<wbr>/', str_replace('&', '<wbr>&', $rowLabel ));
405
 
406
  // If the dataTable specifies a label_html, use this instead
407
  /** @var $dataTableMap \Piwik\DataTable\Map */
139
  $popoverTitle = '';
140
  if ($this->rowLabel) {
141
  $icon = $this->rowIcon ? '<img height="16px" src="' . $this->rowIcon . '" alt="">' : '';
142
+ $rowLabel = str_replace('/', '<wbr>/', str_replace('&', '<wbr>&', $this->rowLabel ));
143
+ $metricsText = sprintf(Piwik::translate('RowEvolution_MetricsFor'), $this->dimension . ': ' . $icon . ' ' . $rowLabel);
144
  $popoverTitle = $icon . ' ' . $this->rowLabel;
145
  }
146
 
402
  {
403
  // By default, use the specified label
404
  $rowLabel = Common::sanitizeInputValue($report['label']);
 
405
 
406
  // If the dataTable specifies a label_html, use this instead
407
  /** @var $dataTableMap \Piwik\DataTable\Map */
app/plugins/CoreHome/Tracker/VisitRequestProcessor.php CHANGED
@@ -184,7 +184,7 @@ class VisitRequestProcessor extends RequestProcessor
184
  }
185
 
186
  $wasLastActionYesterday = $this->wasLastActionNotToday($visitProperties, $request, $lastKnownVisit);
187
- $forceNewVisitAtMidnight = (bool) Config::getInstance()->Tracker['create_new_visit_after_midnight'];
188
 
189
  if ($wasLastActionYesterday && $forceNewVisitAtMidnight) {
190
  Common::printDebug("Visitor detected, but last action was yesterday...");
@@ -192,7 +192,7 @@ class VisitRequestProcessor extends RequestProcessor
192
  return true;
193
  }
194
 
195
- if (!TrackerConfig::getConfigValue('enable_userid_overwrites_visitorid')
196
  && !$this->lastUserIdWasSetAndDoesMatch($visitProperties, $request)) {
197
  Common::printDebug("Visitor detected, but last user_id does not match...");
198
  return true;
184
  }
185
 
186
  $wasLastActionYesterday = $this->wasLastActionNotToday($visitProperties, $request, $lastKnownVisit);
187
+ $forceNewVisitAtMidnight = (bool) TrackerConfig::getConfigValue('create_new_visit_after_midnight', $request->getIdSiteIfExists());
188
 
189
  if ($wasLastActionYesterday && $forceNewVisitAtMidnight) {
190
  Common::printDebug("Visitor detected, but last action was yesterday...");
192
  return true;
193
  }
194
 
195
+ if (!TrackerConfig::getConfigValue('enable_userid_overwrites_visitorid', $request->getIdSiteIfExists())
196
  && !$this->lastUserIdWasSetAndDoesMatch($visitProperties, $request)) {
197
  Common::printDebug("Visitor detected, but last user_id does not match...");
198
  return true;
app/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.html CHANGED
@@ -23,6 +23,8 @@
23
  title="{{ featureName }}"></div>
24
  </span>
25
 
 
 
26
  <div class="inlineHelp" ng-show="view.showInlineHelp">
27
  <div ng-bind-html="inlineHelp"></div>
28
  <a ng-if="helpUrl"
23
  title="{{ featureName }}"></div>
24
  </span>
25
 
26
+ <div ng-show="showReportGenerated" class="icon-clock report-generated"></div>
27
+
28
  <div class="inlineHelp" ng-show="view.showInlineHelp">
29
  <div ng-bind-html="inlineHelp"></div>
30
  <a ng-if="helpUrl"
app/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less CHANGED
@@ -62,4 +62,13 @@
62
  text-decoration: none;
63
  }
64
  }
 
 
 
 
 
 
 
 
 
65
  }
62
  text-decoration: none;
63
  }
64
  }
65
+
66
+ .report-generated {
67
+ float: right;
68
+ cursor: pointer;
69
+ font-size: 14px;
70
+ color:#888;
71
+ opacity: 0.3;
72
+ line-height: 32px;
73
+ }
74
  }
app/plugins/CoreHome/templates/_dataTable.twig CHANGED
@@ -13,6 +13,7 @@
13
  {% if properties.title %}
14
  <h2 class="card-title"
15
  {% if properties.title_edit_entity_url %}edit-url="{{ properties.title_edit_entity_url }}"{% endif %}
 
16
  piwik-enriched-headline
17
  >{{ properties.title }}</h2>
18
  {% endif %}
13
  {% if properties.title %}
14
  <h2 class="card-title"
15
  {% if properties.title_edit_entity_url %}edit-url="{{ properties.title_edit_entity_url }}"{% endif %}
16
+ {% if reportLastUpdatedMessage is defined and reportLastUpdatedMessage %}report-generated="{{ reportLastUpdatedMessage|raw }}"{% endif %}
17
  piwik-enriched-headline
18
  >{{ properties.title }}</h2>
19
  {% endif %}
app/plugins/CorePluginsAdmin/API.php CHANGED
@@ -13,6 +13,9 @@ use Piwik\Plugin\SettingsProvider;
13
  use Exception;
14
  use Piwik\Plugins\Login\PasswordVerifier;
15
  use Piwik\Version;
 
 
 
16
 
17
  /**
18
  * API for plugin CorePluginsAdmin
@@ -61,15 +64,26 @@ class API extends \Piwik\Plugin\API
61
 
62
  $this->settingsMetadata->setPluginSettings($pluginsSettings, $settingValues);
63
 
 
 
64
  try {
65
  foreach ($pluginsSettings as $pluginSetting) {
66
  if (!empty($settingValues[$pluginSetting->getPluginName()])) {
67
  $pluginSetting->save();
 
 
 
 
 
68
  }
69
  }
70
  } catch (Exception $e) {
71
  throw new Exception(Piwik::translate('CoreAdminHome_PluginSettingsSaveFailed'));
72
  }
 
 
 
 
73
  }
74
 
75
  /**
@@ -137,4 +151,40 @@ class API extends \Piwik\Plugin\API
137
  throw new Exception(Piwik::translate('UsersManager_CurrentPasswordNotCorrect'));
138
  }
139
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  }
13
  use Exception;
14
  use Piwik\Plugins\Login\PasswordVerifier;
15
  use Piwik\Version;
16
+ use Piwik\Container\StaticContainer;
17
+ use Piwik\Plugins\CoreAdminHome\Emails\SettingsChangedEmail;
18
+ use Piwik\Plugins\CoreAdminHome\Emails\SecurityNotificationEmail;
19
 
20
  /**
21
  * API for plugin CorePluginsAdmin
64
 
65
  $this->settingsMetadata->setPluginSettings($pluginsSettings, $settingValues);
66
 
67
+ $sendSettingsChangedNotificationEmailPlugins = [];
68
+
69
  try {
70
  foreach ($pluginsSettings as $pluginSetting) {
71
  if (!empty($settingValues[$pluginSetting->getPluginName()])) {
72
  $pluginSetting->save();
73
+
74
+ $pluginName = $pluginSetting->getPluginName();
75
+ if (in_array($pluginName, array_keys(SecurityNotificationEmail::$notifyPluginList))) {
76
+ $sendSettingsChangedNotificationEmailPlugins[] = $pluginName;
77
+ }
78
  }
79
  }
80
  } catch (Exception $e) {
81
  throw new Exception(Piwik::translate('CoreAdminHome_PluginSettingsSaveFailed'));
82
  }
83
+
84
+ if (count($sendSettingsChangedNotificationEmailPlugins) > 0) {
85
+ $this->sendNotificationEmails($sendSettingsChangedNotificationEmailPlugins);
86
+ }
87
  }
88
 
89
  /**
151
  throw new Exception(Piwik::translate('UsersManager_CurrentPasswordNotCorrect'));
152
  }
153
  }
154
+
155
+ private function sendNotificationEmails($sendSettingsChangedNotificationEmailPlugins)
156
+ {
157
+ $pluginNames = [];
158
+ foreach ($sendSettingsChangedNotificationEmailPlugins as $plugin) {
159
+ $pluginNames[] = Piwik::translate(SettingsChangedEmail::$notifyPluginList[$plugin]);
160
+ }
161
+ $pluginNames = implode(', ', $pluginNames);
162
+
163
+ $container = StaticContainer::getContainer();
164
+
165
+ $email = $container->make(SettingsChangedEmail::class, array(
166
+ 'login' => Piwik::getCurrentUserLogin(),
167
+ 'emailAddress' => Piwik::getCurrentUserEmail(),
168
+ 'pluginNames' => $pluginNames
169
+ ));
170
+ $email->safeSend();
171
+
172
+ $superuserEmailAddresses = Piwik::getAllSuperUserAccessEmailAddresses();
173
+ unset($superuserEmailAddresses[Piwik::getCurrentUserLogin()]);
174
+ $superUserEmail = false;
175
+
176
+ foreach ($superuserEmailAddresses as $address) {
177
+ $superUserEmail = $superUserEmail ?: $container->make(SettingsChangedEmail::class, array(
178
+ 'login' => Piwik::translate('Installation_SuperUser'),
179
+ 'emailAddress' => $address,
180
+ 'pluginNames' => $pluginNames,
181
+ 'superuser' => Piwik::getCurrentUserLogin()
182
+ ));
183
+ $superUserEmail->addTo($address);
184
+ }
185
+
186
+ if ($superUserEmail) {
187
+ $superUserEmail->safeSend();
188
+ }
189
+ }
190
  }
app/plugins/CorePluginsAdmin/Commands/ActivatePlugin.php CHANGED
@@ -38,6 +38,11 @@ class ActivatePlugin extends ConsoleCommand
38
  continue;
39
  }
40
 
 
 
 
 
 
41
  if ($dependencies = $pluginManager->loadPlugin($plugin)->getMissingDependenciesAsString()) {
42
  $output->writeln("<error>$dependencies</error>");
43
  continue;
38
  continue;
39
  }
40
 
41
+ if (!$pluginManager->isPluginInFilesystem($plugin)) {
42
+ $output->writeln("<error>Cannot find plugin files for $plugin.</error>");
43
+ continue;
44
+ }
45
+
46
  if ($dependencies = $pluginManager->loadPlugin($plugin)->getMissingDependenciesAsString()) {
47
  $output->writeln("<error>$dependencies</error>");
48
  continue;
app/plugins/CorePluginsAdmin/Controller.php CHANGED
@@ -77,8 +77,8 @@ class Controller extends Plugin\ControllerAdmin
77
  * @param Plugins $marketplacePlugins
78
  * @param PasswordVerifier $passwordVerify
79
  */
80
- public function __construct(Translator $translator,
81
- Plugin\SettingsProvider $settingsProvider,
82
  PluginInstaller $pluginInstaller,
83
  PasswordVerifier $passwordVerify,
84
  $marketplacePlugins = null
@@ -350,7 +350,7 @@ class Controller extends Plugin\ControllerAdmin
350
  if (ob_get_length()) {
351
  ob_clean();
352
  }
353
-
354
  $this->tryToRepairPiwik();
355
 
356
  if (empty($lastError) && defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE) {
@@ -432,7 +432,7 @@ class Controller extends Plugin\ControllerAdmin
432
  'action' => 'activate',
433
  'pluginName' => Common::getRequestVar('pluginName'),
434
  'nonce' => Common::getRequestVar('nonce'),
435
- 'redirectTo' => Common::getRequestVar('redirectTo'),
436
  'referrer' => urlencode(Url::getReferrer()),
437
  ];
438
 
@@ -446,7 +446,7 @@ class Controller extends Plugin\ControllerAdmin
446
 
447
  if ($redirectAfter) {
448
  $message = $this->translator->translate('CorePluginsAdmin_SuccessfullyActicated', array($pluginName));
449
-
450
  if ($this->settingsProvider->getSystemSettings($pluginName)) {
451
  $target = sprintf('<a href="index.php%s#%s">',
452
  Url::getCurrentQueryStringWithParametersModified(array('module' => 'CoreAdminHome', 'action' => 'generalSettings')),
@@ -545,7 +545,7 @@ class Controller extends Plugin\ControllerAdmin
545
  public function showLicense()
546
  {
547
  Piwik::checkUserHasSomeViewAccess();
548
-
549
  $pluginName = Common::getRequestVar('pluginName', null, 'string');
550
 
551
  if (!Plugin\Manager::getInstance()->isPluginInFilesystem($pluginName)) {
77
  * @param Plugins $marketplacePlugins
78
  * @param PasswordVerifier $passwordVerify
79
  */
80
+ public function __construct(Translator $translator,
81
+ Plugin\SettingsProvider $settingsProvider,
82
  PluginInstaller $pluginInstaller,
83
  PasswordVerifier $passwordVerify,
84
  $marketplacePlugins = null
350
  if (ob_get_length()) {
351
  ob_clean();
352
  }
353
+
354
  $this->tryToRepairPiwik();
355
 
356
  if (empty($lastError) && defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE) {
432
  'action' => 'activate',
433
  'pluginName' => Common::getRequestVar('pluginName'),
434
  'nonce' => Common::getRequestVar('nonce'),
435
+ 'redirectTo' => Common::getRequestVar('redirectTo', '', 'string'),
436
  'referrer' => urlencode(Url::getReferrer()),
437
  ];
438
 
446
 
447
  if ($redirectAfter) {
448
  $message = $this->translator->translate('CorePluginsAdmin_SuccessfullyActicated', array($pluginName));
449
+
450
  if ($this->settingsProvider->getSystemSettings($pluginName)) {
451
  $target = sprintf('<a href="index.php%s#%s">',
452
  Url::getCurrentQueryStringWithParametersModified(array('module' => 'CoreAdminHome', 'action' => 'generalSettings')),
545
  public function showLicense()
546
  {
547
  Piwik::checkUserHasSomeViewAccess();
548
+
549
  $pluginName = Common::getRequestVar('pluginName', null, 'string');
550
 
551
  if (!Plugin\Manager::getInstance()->isPluginInFilesystem($pluginName)) {
app/plugins/CorePluginsAdmin/angularjs/form-field/field-site.html CHANGED
@@ -3,6 +3,8 @@
3
  <div piwik-siteselector
4
  class="sites_autocomplete"
5
  ng-model="formField.value"
 
 
6
  id="{{ formField.name }}"
7
  show-all-sites-item="formField.uiControlAttributes.showAllSitesItem || false"
8
  switch-site-on-select="false"
3
  <div piwik-siteselector
4
  class="sites_autocomplete"
5
  ng-model="formField.value"
6
+ siteid="{{ formField.value.id }}"
7
+ sitename="{{ formField.value.name }}"
8
  id="{{ formField.name }}"
9
  show-all-sites-item="formField.uiControlAttributes.showAllSitesItem || false"
10
  switch-site-on-select="false"
app/plugins/CoreVisualizations/Visualizations/Cloud.php CHANGED
@@ -182,8 +182,8 @@ class Cloud extends Visualization
182
  {
183
  $word = Common::unsanitizeInputValue($word);
184
 
185
- if (Common::mb_strlen($word) > $this->truncatingLimit) {
186
- return Common::mb_substr($word, 0, $this->truncatingLimit - 3) . '...';
187
  }
188
 
189
  return $word;
182
  {
183
  $word = Common::unsanitizeInputValue($word);
184
 
185
+ if (mb_strlen($word) > $this->truncatingLimit) {
186
+ return mb_substr($word, 0, $this->truncatingLimit - 3) . '...';
187
  }
188
 
189
  return $word;
app/plugins/CoreVisualizations/Visualizations/Sparklines.php CHANGED
@@ -122,7 +122,11 @@ class Sparklines extends ViewDataTable
122
  }
123
 
124
  $firstRow = $data->getFirstRow();
125
- $comparisons = $firstRow->getComparisons();
 
 
 
 
126
 
127
  $originalDate = Common::getRequestVar('date');
128
  $originalPeriod = Common::getRequestVar('period');
@@ -257,7 +261,7 @@ class Sparklines extends ViewDataTable
257
  $table->applyQueuedFilters();
258
  }
259
 
260
- private function getValuesAndDescriptions(DataTable\Row $firstRow, $columns, $evolutionColumnNameSuffix = null)
261
  {
262
  if (!is_array($columns)) {
263
  $columns = array($columns);
@@ -270,7 +274,10 @@ class Sparklines extends ViewDataTable
270
  $evolutions = [];
271
 
272
  foreach ($columns as $col) {
273
- $value = $firstRow->getColumn($col);
 
 
 
274
 
275
  if ($value === false) {
276
  $value = 0;
122
  }
123
 
124
  $firstRow = $data->getFirstRow();
125
+ if ($firstRow) {
126
+ $comparisons = $firstRow->getComparisons();
127
+ } else {
128
+ $comparisons = null;
129
+ }
130
 
131
  $originalDate = Common::getRequestVar('date');
132
  $originalPeriod = Common::getRequestVar('period');
261
  $table->applyQueuedFilters();
262
  }
263
 
264
+ private function getValuesAndDescriptions($firstRow, $columns, $evolutionColumnNameSuffix = null)
265
  {
266
  if (!is_array($columns)) {
267
  $columns = array($columns);
274
  $evolutions = [];
275
 
276
  foreach ($columns as $col) {
277
+ $value = 0;
278
+ if ($firstRow) {
279
+ $value = $firstRow->getColumn($col);
280
+ }
281
 
282
  if ($value === false) {
283
  $value = 0;
app/plugins/CustomDimensions/Tracker/CustomDimensionsRequestProcessor.php CHANGED
@@ -173,7 +173,7 @@ class CustomDimensionsRequestProcessor extends RequestProcessor
173
 
174
  private static function prepareValue($value)
175
  {
176
- return Common::mb_substr(trim($value), 0, 250);
177
  }
178
 
179
  public static function buildCustomDimensionTrackingApiName($idDimensionOrDimension)
173
 
174
  private static function prepareValue($value)
175
  {
176
+ return mb_substr(trim($value), 0, 250);
177
  }
178
 
179
  public static function buildCustomDimensionTrackingApiName($idDimensionOrDimension)
app/plugins/Dashboard/stylesheets/widget.less CHANGED
@@ -164,5 +164,7 @@
164
 
165
 
166
  .ui-dialog .widget .widgetTop .buttons {
167
- right: 25px;
 
 
168
  }
164
 
165
 
166
  .ui-dialog .widget .widgetTop .buttons {
167
+ right: 30px;
168
+ top: 2px;
169
+ display: block;
170
  }
app/plugins/DevicesDetection/Columns/BrowserName.php CHANGED
@@ -41,9 +41,9 @@ class BrowserName extends Base
41
  $segment->setSqlFilterValue(function ($val) {
42
  $browsers = Browser::getAvailableBrowsers();
43
  $browsers = array_map(function($val) {
44
- return Common::mb_strtolower($val);
45
  }, $browsers);
46
- $result = array_search(Common::mb_strtolower($val), $browsers);
47
 
48
  if ($result === false) {
49
  $result = 'UNK';
41
  $segment->setSqlFilterValue(function ($val) {
42
  $browsers = Browser::getAvailableBrowsers();
43
  $browsers = array_map(function($val) {
44
+ return mb_strtolower($val);
45
  }, $browsers);
46
+ $result = array_search(mb_strtolower($val), $browsers);
47
 
48
  if ($result === false) {
49
  $result = 'UNK';
app/plugins/DevicesDetection/Columns/Os.php CHANGED
@@ -43,9 +43,9 @@ class Os extends Base
43
  $segment->setSqlFilterValue(function ($val) {
44
  $oss = OperatingSystem::getAvailableOperatingSystems();
45
  $oss = array_map(function($val) {
46
- return Common::mb_strtolower($val);
47
  }, $oss);
48
- $result = array_search(Common::mb_strtolower($val), $oss);
49
 
50
  if ($result === false) {
51
  $result = 'UNK';
43
  $segment->setSqlFilterValue(function ($val) {
44
  $oss = OperatingSystem::getAvailableOperatingSystems();
45
  $oss = array_map(function($val) {
46
+ return mb_strtolower($val);
47
  }, $oss);
48
+ $result = array_search(mb_strtolower($val), $oss);
49
 
50
  if ($result === false) {
51
  $result = 'UNK';
app/plugins/Diagnostics/Diagnostic/CronArchivingCheck.php CHANGED
@@ -69,8 +69,16 @@ class CronArchivingCheck implements Diagnostic
69
  $comment .= $this->translator->translate('General_Ok');
70
  $status = DiagnosticResult::STATUS_OK;
71
  } else {
 
 
 
 
 
 
72
  $comment .= $this->translator->translate('Installation_NotSupported')
73
- . ' ' . $this->translator->translate('Goals_Optional');
 
 
74
  $status = DiagnosticResult::STATUS_INFORMATIONAL;
75
  }
76
 
69
  $comment .= $this->translator->translate('General_Ok');
70
  $status = DiagnosticResult::STATUS_OK;
71
  } else {
72
+ $reasons = CliMulti\Process::isSupportedWithReason();
73
+ if (empty($reasons)) {
74
+ $reasonText = $this->translator->translate('General_Unknown');
75
+ } else {
76
+ $reasonText = implode(', ', $reasons);
77
+ }
78
  $comment .= $this->translator->translate('Installation_NotSupported')
79
+ . ' ' . $this->translator->translate('Goals_Optional')
80
+ . ' (' . $this->translator->translate('General_Reasons') . ': ' . $reasonText . ')'
81
+ . $this->translator->translate('General_LearnMore', [' <a target="_blank" href="https://matomo.org/faq/troubleshooting/how-to-make-the-diagnostic-managing-processes-via-cli-to-display-ok/">', '</a>']);
82
  $status = DiagnosticResult::STATUS_INFORMATIONAL;
83
  }
84
 
app/plugins/Diagnostics/Diagnostic/CronArchivingLastRunCheck.php CHANGED
@@ -17,6 +17,7 @@ use Piwik\Option;
17
  use Piwik\Plugins\Intl\DateTimeFormatProvider;
18
  use Piwik\SettingsPiwik;
19
  use Piwik\Translation\Translator;
 
20
 
21
  /**
22
  * Check if cron archiving has run in the last 24-48 hrs.
@@ -90,8 +91,13 @@ class CronArchivingLastRunCheck implements Diagnostic
90
 
91
  private function getArchivingCommand()
92
  {
93
- $domain = Config::getHostname();
94
- return PIWIK_INCLUDE_PATH . '/console --matomo-domain=' . $domain . ' core:archive';
 
 
 
 
 
95
  }
96
 
97
  public static function getTimeSinceLastSuccessfulRun($lastRunTime = null)
17
  use Piwik\Plugins\Intl\DateTimeFormatProvider;
18
  use Piwik\SettingsPiwik;
19
  use Piwik\Translation\Translator;
20
+ use Piwik\Url;
21
 
22
  /**
23
  * Check if cron archiving has run in the last 24-48 hrs.
91
 
92
  private function getArchivingCommand()
93
  {
94
+ if (Url::isValidHost()) {
95
+ $domain = Config::getHostname($checkIfTrusted = true);
96
+
97
+ return PIWIK_INCLUDE_PATH . '/console --matomo-domain=' . $domain . ' core:archive';
98
+ }
99
+
100
+ return PIWIK_INCLUDE_PATH . '/console core:archive';
101
  }
102
 
103
  public static function getTimeSinceLastSuccessfulRun($lastRunTime = null)
app/plugins/Diagnostics/Diagnostic/DiagnosticResult.php CHANGED
@@ -8,6 +8,8 @@
8
 
9
  namespace Piwik\Plugins\Diagnostics\Diagnostic;
10
 
 
 
11
  /**
12
  * The result of a diagnostic.
13
  *
@@ -55,20 +57,23 @@ class DiagnosticResult
55
 
56
  /**
57
  * @param string $label
58
- * @param string $status
59
  * @param string $comment
 
60
  * @return DiagnosticResult
61
  */
62
- public static function informationalResult($label, $comment = '')
63
  {
64
  if ($comment === true) {
65
  $comment = '1';
66
  } elseif ($comment === false) {
67
  $comment = '0';
68
  }
69
- $result = new self($label);
70
- $result->addItem(new DiagnosticResultItem(self::STATUS_INFORMATIONAL, $comment));
71
- return $result;
 
 
 
72
  }
73
 
74
  /**
8
 
9
  namespace Piwik\Plugins\Diagnostics\Diagnostic;
10
 
11
+ use Piwik\Common;
12
+
13
  /**
14
  * The result of a diagnostic.
15
  *
57
 
58
  /**
59
  * @param string $label
 
60
  * @param string $comment
61
+ * @param bool $escapeComment
62
  * @return DiagnosticResult
63
  */
64
+ public static function informationalResult($label, $comment = '', $escapeComment = true)
65
  {
66
  if ($comment === true) {
67
  $comment = '1';
68
  } elseif ($comment === false) {
69
  $comment = '0';
70
  }
71
+
72
+ if ($escapeComment) {
73
+ $comment = Common::sanitizeInputValue($comment);
74
+ }
75
+
76
+ return self::singleResult($label, self::STATUS_INFORMATIONAL, $comment);
77
  }
78
 
79
  /**
app/plugins/Diagnostics/Diagnostic/PhpExtensionsCheck.php CHANGED
@@ -59,11 +59,7 @@ class PhpExtensionsCheck implements Diagnostic
59
  {
60
  $requiredExtensions = array(
61
  'zlib',
62
- 'SPL',
63
- 'iconv',
64
  'json',
65
- 'mbstring',
66
- 'Reflection',
67
  'filter',
68
  'hash',
69
  'session',
@@ -75,14 +71,10 @@ class PhpExtensionsCheck implements Diagnostic
75
  private function getHelpMessage($missingExtension)
76
  {
77
  $messages = array(
78
- 'zlib' => 'Installation_SystemCheckZlibHelp',
79
- 'SPL' => 'Installation_SystemCheckSplHelp',
80
- 'iconv' => 'Installation_SystemCheckIconvHelp',
81
- 'json' => 'Installation_SystemCheckWarnJsonHelp',
82
- 'mbstring' => 'Installation_SystemCheckMbstringHelp',
83
- 'Reflection' => 'Required extension that is built in PHP, see http://www.php.net/manual/en/book.reflection.php',
84
- 'filter' => 'Installation_SystemCheckFilterHelp',
85
- 'hash' => 'Installation_SystemCheckHashHelp',
86
  'session' => 'Installation_SystemCheckSessionHelp'
87
  );
88
 
59
  {
60
  $requiredExtensions = array(
61
  'zlib',
 
 
62
  'json',
 
 
63
  'filter',
64
  'hash',
65
  'session',
71
  private function getHelpMessage($missingExtension)
72
  {
73
  $messages = array(
74
+ 'zlib' => 'Installation_SystemCheckZlibHelp',
75
+ 'json' => 'Installation_SystemCheckWarnJsonHelp',
76
+ 'filter' => 'Installation_SystemCheckFilterHelp',
77
+ 'hash' => 'Installation_SystemCheckHashHelp',
 
 
 
 
78
  'session' => 'Installation_SystemCheckSessionHelp'
79
  );
80
 
app/plugins/Diagnostics/Diagnostic/PhpSettingsCheck.php CHANGED
@@ -58,6 +58,7 @@ class PhpSettingsCheck implements Diagnostic
58
  $requiredSettings[] = new RequiredPhpSetting('session.auto_start', 0);
59
 
60
  $maxExecutionTime = new RequiredPhpSetting('max_execution_time', 0);
 
61
  $maxExecutionTime->addRequiredValue(30, '>=');
62
  $maxExecutionTime->setErrorResult(DiagnosticResult::STATUS_WARNING);
63
  $requiredSettings[] = $maxExecutionTime;
58
  $requiredSettings[] = new RequiredPhpSetting('session.auto_start', 0);
59
 
60
  $maxExecutionTime = new RequiredPhpSetting('max_execution_time', 0);
61
+ $maxExecutionTime->addRequiredValue(-1, '=');
62
  $maxExecutionTime->addRequiredValue(30, '>=');
63
  $maxExecutionTime->setErrorResult(DiagnosticResult::STATUS_WARNING);
64
  $requiredSettings[] = $maxExecutionTime;
app/plugins/Diagnostics/Diagnostic/RequiredPrivateDirectories.php CHANGED
@@ -135,11 +135,11 @@ class RequiredPrivateDirectories implements Diagnostic
135
  return true;
136
  }
137
 
138
- if (trim($response) === $publicIfResponseEquals) {
139
  // we assume it is publicly accessible because either the exact expected content is returned or because we don't check for content match
140
  $result->addItem(new DiagnosticResultItem(DiagnosticResult::STATUS_ERROR, $testUrl));
141
  return true;
142
- } elseif (strpos($response, $publicIfResponseContains) !== false) {
143
  // we assume it is publicly accessible because a unique content is included in the response or because we don't check for content contains
144
  $result->addItem(new DiagnosticResultItem(DiagnosticResult::STATUS_ERROR, $testUrl));
145
  return true;
135
  return true;
136
  }
137
 
138
+ if (trim($response['data']) === $publicIfResponseEquals) {
139
  // we assume it is publicly accessible because either the exact expected content is returned or because we don't check for content match
140
  $result->addItem(new DiagnosticResultItem(DiagnosticResult::STATUS_ERROR, $testUrl));
141
  return true;
142
+ } elseif (strpos($response['data'], $publicIfResponseContains) !== false) {
143
  // we assume it is publicly accessible because a unique content is included in the response or because we don't check for content contains
144
  $result->addItem(new DiagnosticResultItem(DiagnosticResult::STATUS_ERROR, $testUrl));
145
  return true;
app/plugins/GeoIp2/GeoIP2AutoUpdater.php CHANGED
@@ -463,7 +463,7 @@ class GeoIP2AutoUpdater extends Task
463
  $schema = $parsedUrl['scheme'] ?? '';
464
  $host = $parsedUrl['host'] ?? '';
465
 
466
- if (empty($schema) || empty($host) || !in_array(Common::mb_strtolower($schema), ['http', 'https'])) {
467
  throw new Exception(Piwik::translate('GeoIp2_MalFormedUpdateUrl', '<i>'.Common::sanitizeInputValue($url).'</i>'));
468
  }
469
 
463
  $schema = $parsedUrl['scheme'] ?? '';
464
  $host = $parsedUrl['host'] ?? '';
465
 
466
+ if (empty($schema) || empty($host) || !in_array(mb_strtolower($schema), ['http', 'https'])) {
467
  throw new Exception(Piwik::translate('GeoIp2_MalFormedUpdateUrl', '<i>'.Common::sanitizeInputValue($url).'</i>'));
468
  }
469
 
app/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php CHANGED
@@ -274,7 +274,7 @@ class Php extends GeoIp2
274
  }
275
 
276
  foreach ($regionNames[$countryCode] as $isoCode => $name) {
277
- if (Common::mb_strtolower($name) === Common::mb_strtolower($regionName)) {
278
  return $isoCode;
279
  }
280
  }
274
  }
275
 
276
  foreach ($regionNames[$countryCode] as $isoCode => $name) {
277
+ if (mb_strtolower($name) === mb_strtolower($regionName)) {
278
  return $isoCode;
279
  }
280
  }
app/plugins/Insights/DataTable/Filter/Insight.php CHANGED
@@ -95,8 +95,19 @@ class Insight extends DataTable\Filter\CalculateEvolutionFilter
95
  $this->addRow($table, $row, $growthPercentage, $newValue, $oldValue, $difference, $isDisappeared, $isNew, $isMover);
96
  }
97
 
 
 
 
 
 
 
 
 
98
  private function getRowFromTable(DataTable $table, DataTable\Row $row)
99
  {
 
 
 
100
  return $table->getRowFromLabel($row->getColumn('label'));
101
  }
102
 
@@ -116,4 +127,4 @@ class Insight extends DataTable\Filter\CalculateEvolutionFilter
116
 
117
  $table->addRowFromArray(array(DataTable\Row::COLUMNS => $columns));
118
  }
119
- }
95
  $this->addRow($table, $row, $growthPercentage, $newValue, $oldValue, $difference, $isDisappeared, $isNew, $isMover);
96
  }
97
 
98
+ protected function getPastRowFromCurrent($row)
99
+ {
100
+ if ($row->isSummaryRow()) {
101
+ return $this->pastDataTable->getSummaryRow();
102
+ }
103
+ return $this->pastDataTable->getRowFromLabel($row->getColumn('label'));
104
+ }
105
+
106
  private function getRowFromTable(DataTable $table, DataTable\Row $row)
107
  {
108
+ if ($row->isSummaryRow()) {
109
+ return $table->getSummaryRow();
110
+ }
111
  return $table->getRowFromLabel($row->getColumn('label'));
112
  }
113
 
127
 
128
  $table->addRowFromArray(array(DataTable\Row::COLUMNS => $columns));
129
  }
130
+ }
app/plugins/Installation/templates/_systemCheckSection.twig CHANGED
@@ -79,7 +79,7 @@
79
  {% elseif item.status == warning %}
80
  {{ warningIcon }} {{ item.comment|raw }}
81
  {% elseif item.status == informational %}
82
- {{ infoIcon }} {{ item.comment }}
83
  {% else %}
84
  {{ okIcon }} {{ item.comment|raw }}
85
  {% endif %}
79
  {% elseif item.status == warning %}
80
  {{ warningIcon }} {{ item.comment|raw }}
81
  {% elseif item.status == informational %}
82
+ {{ infoIcon }} {{ item.comment|raw }}
83
  {% else %}
84
  {{ okIcon }} {{ item.comment|raw }}
85
  {% endif %}
app/plugins/Intl/Commands/GenerateIntl.php CHANGED
@@ -58,7 +58,7 @@ class GenerateIntl extends ConsoleCommand
58
  }
59
 
60
  preg_match_all("~^(.)(.*)$~u", $str, $arr);
61
- return Common::mb_strtoupper($arr[1][0]).$arr[2][0];
62
  }
63
 
64
  protected function execute(InputInterface $input, OutputInterface $output)
58
  }
59
 
60
  preg_match_all("~^(.)(.*)$~u", $str, $arr);
61
+ return mb_strtoupper($arr[1][0]).$arr[2][0];
62
  }
63
 
64
  protected function execute(InputInterface $input, OutputInterface $output)
app/plugins/Login/Controller.php CHANGED
@@ -237,6 +237,10 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
237
  */
238
  function logme()
239
  {
 
 
 
 
240
  $password = Common::getRequestVar('password', null, 'string');
241
 
242
  $login = Common::getRequestVar('login', null, 'string');
@@ -311,6 +315,15 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
311
  // remove password reset entry if it exists
312
  $this->passwordResetter->removePasswordResetInfo($login);
313
 
 
 
 
 
 
 
 
 
 
314
  if (empty($urlToRedirect)) {
315
  $redirect = Common::unsanitizeInputValue(Common::getRequestVar('form_redirect', false));
316
  $redirectParams = UrlHelper::getArrayFromQueryString(UrlHelper::getQueryFromUrl($redirect));
237
  */
238
  function logme()
239
  {
240
+ if (Config::getInstance()->General['login_allow_logme'] == 0) {
241
+ throw new Exception('This functionality has been disabled in config');
242
+ }
243
+
244
  $password = Common::getRequestVar('password', null, 'string');
245
 
246
  $login = Common::getRequestVar('login', null, 'string');
315
  // remove password reset entry if it exists
316
  $this->passwordResetter->removePasswordResetInfo($login);
317
 
318
+ $parsedUrl = parse_url($urlToRedirect);
319
+
320
+ // only use redirect url if host is trusted
321
+ if (!empty($parsedUrl['host']) && !Url::isValidHost($parsedUrl['host'])) {
322
+ $e = new \Piwik\Exception\Exception('The redirect URL host is not valid, it is not a trusted host. If this URL is trusted, you can allow this in your config.ini.php file by adding the line <i>trusted_hosts[] = "'.Common::sanitizeInputValue($parsedUrl['host']).'"</i> under <i>[General]</i>');
323
+ $e->setIsHtmlMessage();
324
+ throw $e;
325
+ }
326
+
327
  if (empty($urlToRedirect)) {
328
  $redirect = Common::unsanitizeInputValue(Common::getRequestVar('form_redirect', false));
329
  $redirectParams = UrlHelper::getArrayFromQueryString(UrlHelper::getQueryFromUrl($redirect));
app/plugins/Login/Login.php CHANGED
@@ -66,7 +66,7 @@ class Login extends \Piwik\Plugin
66
  $loginPlugin = Piwik::getLoginPluginName();
67
 
68
  if ($loginPlugin && $loginPlugin !== 'Login') {
69
- $hooks['Controller.'.$loginPlugin.'.logme'] = 'beforeLoginCheckBruteForce';
70
  $hooks['Controller.'.$loginPlugin. '.'] = 'beforeLoginCheckBruteForceForUserPwdLogin';
71
  $hooks['Controller.'.$loginPlugin.'.index'] = 'beforeLoginCheckBruteForceForUserPwdLogin';
72
  $hooks['Controller.'.$loginPlugin.'.confirmResetPassword'] = 'beforeLoginCheckBruteForceForUserPwdLogin';
@@ -219,11 +219,14 @@ class Login extends \Piwik\Plugin
219
  private function getUsernameUsedInPasswordLogin()
220
  {
221
  $login = StaticContainer::get(\Piwik\Auth::class)->getLogin();
222
- if (empty($login)
223
- || $login == 'anonymous'
224
- ) {
225
  $login = Common::getRequestVar('form_login', false);
 
 
 
 
226
  }
 
227
  return $login;
228
  }
229
 
66
  $loginPlugin = Piwik::getLoginPluginName();
67
 
68
  if ($loginPlugin && $loginPlugin !== 'Login') {
69
+ $hooks['Controller.'.$loginPlugin.'.logme'] = 'beforeLoginCheckBruteForceForUserPwdLogin';
70
  $hooks['Controller.'.$loginPlugin. '.'] = 'beforeLoginCheckBruteForceForUserPwdLogin';
71
  $hooks['Controller.'.$loginPlugin.'.index'] = 'beforeLoginCheckBruteForceForUserPwdLogin';
72
  $hooks['Controller.'.$loginPlugin.'.confirmResetPassword'] = 'beforeLoginCheckBruteForceForUserPwdLogin';
219
  private function getUsernameUsedInPasswordLogin()
220
  {
221
  $login = StaticContainer::get(\Piwik\Auth::class)->getLogin();
222
+ if (empty($login) || $login == 'anonymous') {
 
 
223
  $login = Common::getRequestVar('form_login', false);
224
+ $action = Common::getRequestVar('action', false);
225
+ if ($action == 'logme') {
226
+ $login = Common::getRequestVar('login', $login);
227
+ }
228
  }
229
+
230
  return $login;
231
  }
232
 
app/plugins/MobileMessaging/SMSProvider.php CHANGED
@@ -217,7 +217,7 @@ abstract class SMSProvider
217
  private static function sizeOfSMSContent($smsContent, $containsUCS2Chars)
218
  {
219
  if ($containsUCS2Chars) {
220
- return Common::mb_strlen($smsContent);
221
  }
222
 
223
  $sizeOfSMSContent = 0;
217
  private static function sizeOfSMSContent($smsContent, $containsUCS2Chars)
218
  {
219
  if ($containsUCS2Chars) {
220
+ return mb_strlen($smsContent);
221
  }
222
 
223
  $sizeOfSMSContent = 0;
app/plugins/Monolog/Processor/ExceptionToTextProcessor.php CHANGED
@@ -8,12 +8,14 @@
8
 
9
  namespace Piwik\Plugins\Monolog\Processor;
10
 
 
11
  use Piwik\Db;
12
  use Piwik\ErrorHandler;
13
  use Piwik\Exception\InvalidRequestParameterException;
14
  use Piwik\Log;
15
  use Piwik\Piwik;
16
  use Piwik\SettingsPiwik;
 
17
 
18
  /**
19
  * Process a log record containing an exception to generate a textual message.
@@ -55,6 +57,8 @@ class ExceptionToTextProcessor
55
  $record['message'] = str_replace('{exception}', $exceptionStr, $record['message']);
56
  }
57
 
 
 
58
  return $record;
59
  }
60
 
@@ -144,4 +148,16 @@ class ExceptionToTextProcessor
144
 
145
  return str_replace(array_keys($valuesToReplace), array_values($valuesToReplace), $trace);
146
  }
 
 
 
 
 
 
 
 
 
 
 
 
147
  }
8
 
9
  namespace Piwik\Plugins\Monolog\Processor;
10
 
11
+ use Piwik\Common;
12
  use Piwik\Db;
13
  use Piwik\ErrorHandler;
14
  use Piwik\Exception\InvalidRequestParameterException;
15
  use Piwik\Log;
16
  use Piwik\Piwik;
17
  use Piwik\SettingsPiwik;
18
+ use Piwik\Url;
19
 
20
  /**
21
  * Process a log record containing an exception to generate a textual message.
57
  $record['message'] = str_replace('{exception}', $exceptionStr, $record['message']);
58
  }
59
 
60
+ $record['message'] .= ' [' . $this->getErrorContext() . ']';
61
+
62
  return $record;
63
  }
64
 
148
 
149
  return str_replace(array_keys($valuesToReplace), array_values($valuesToReplace), $trace);
150
  }
151
+
152
+ private function getErrorContext()
153
+ {
154
+ try {
155
+ $context = 'Query: ' . Url::getCurrentQueryString();
156
+ $context .= ', CLI mode: ' . (int)Common::isPhpCliMode();
157
+ return $context;
158
+ } catch (\Exception $ex) {
159
+ $context = "cannot get url or cli mode: " . $ex->getMessage();
160
+ return $context;
161
+ }
162
+ }
163
  }
app/plugins/Monolog/config/config.php CHANGED
@@ -17,6 +17,8 @@ return array(
17
  'file' => 'Piwik\Plugins\Monolog\Handler\FileHandler',
18
  'screen' => 'Piwik\Plugins\Monolog\Handler\WebNotificationHandler',
19
  'database' => 'Piwik\Plugins\Monolog\Handler\DatabaseHandler',
 
 
20
  ),
21
  'log.handlers' => DI\factory(function (\DI\Container $c) {
22
  if ($c->has('ini.log.log_writers')) {
@@ -97,6 +99,14 @@ return array(
97
  'Piwik\Plugins\Monolog\Handler\FileHandler' => DI\create()
98
  ->constructor(DI\get('log.file.filename'), DI\get('log.level.file'))
99
  ->method('setFormatter', DI\get('log.lineMessageFormatter.file')),
 
 
 
 
 
 
 
 
100
 
101
  'Piwik\Plugins\Monolog\Handler\DatabaseHandler' => DI\create()
102
  ->constructor(DI\get('log.level.database'))
@@ -147,6 +157,26 @@ return array(
147
  return $c->get('log.level');
148
  }),
149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  'log.file.filename' => DI\factory(function (ContainerInterface $c) {
151
  $logPath = $c->get('ini.log.logger_file_path');
152
 
@@ -172,6 +202,14 @@ return array(
172
 
173
  return $logPath;
174
  }),
 
 
 
 
 
 
 
 
175
 
176
  'Piwik\Plugins\Monolog\Formatter\LineMessageFormatter' => DI\create('Piwik\Plugins\Monolog\Formatter\LineMessageFormatter')
177
  ->constructor(DI\get('log.short.format')),
17
  'file' => 'Piwik\Plugins\Monolog\Handler\FileHandler',
18
  'screen' => 'Piwik\Plugins\Monolog\Handler\WebNotificationHandler',
19
  'database' => 'Piwik\Plugins\Monolog\Handler\DatabaseHandler',
20
+ 'errorlog' => '\Monolog\Handler\ErrorLogHandler',
21
+ 'syslog' => '\Monolog\Handler\SyslogHandler',
22
  ),
23
  'log.handlers' => DI\factory(function (\DI\Container $c) {
24
  if ($c->has('ini.log.log_writers')) {
99
  'Piwik\Plugins\Monolog\Handler\FileHandler' => DI\create()
100
  ->constructor(DI\get('log.file.filename'), DI\get('log.level.file'))
101
  ->method('setFormatter', DI\get('log.lineMessageFormatter.file')),
102
+
103
+ '\Monolog\Handler\ErrorLogHandler' => DI\autowire()
104
+ ->constructorParameter('level', DI\get('log.level.errorlog'))
105
+ ->method('setFormatter', DI\get('log.lineMessageFormatter.file')),
106
+
107
+ '\Monolog\Handler\SyslogHandler' => DI\create()
108
+ ->constructor(DI\get('log.syslog.ident'), 'syslog', DI\get('log.level.syslog'))
109
+ ->method('setFormatter', DI\get('log.lineMessageFormatter.file')),
110
 
111
  'Piwik\Plugins\Monolog\Handler\DatabaseHandler' => DI\create()
112
  ->constructor(DI\get('log.level.database'))
157
  return $c->get('log.level');
158
  }),
159
 
160
+ 'log.level.syslog' => DI\factory(function (ContainerInterface $c) {
161
+ if ($c->has('ini.log.log_level_syslog')) {
162
+ $level = Log::getMonologLevelIfValid($c->get('ini.log.log_level_syslog'));
163
+ if ($level !== null) {
164
+ return $level;
165
+ }
166
+ }
167
+ return $c->get('log.level');
168
+ }),
169
+
170
+ 'log.level.errorlog' => DI\factory(function (ContainerInterface $c) {
171
+ if ($c->has('ini.log.log_level_errorlog')) {
172
+ $level = Log::getMonologLevelIfValid($c->get('ini.log.log_level_errorlog'));
173
+ if ($level !== null) {
174
+ return $level;
175
+ }
176
+ }
177
+ return $c->get('log.level');
178
+ }),
179
+
180
  'log.file.filename' => DI\factory(function (ContainerInterface $c) {
181
  $logPath = $c->get('ini.log.logger_file_path');
182
 
202
 
203
  return $logPath;
204
  }),
205
+
206
+ 'log.syslog.ident' => DI\factory(function (ContainerInterface $c) {
207
+ $ident = $c->get('ini.log.logger_syslog_ident');
208
+ if (empty($ident)) {
209
+ $ident = 'matomo';
210
+ }
211
+ return $ident;
212
+ }),
213
 
214
  'Piwik\Plugins\Monolog\Formatter\LineMessageFormatter' => DI\create('Piwik\Plugins\Monolog\Formatter\LineMessageFormatter')
215
  ->constructor(DI\get('log.short.format')),
app/plugins/Morpheus/fonts/matomo.svg CHANGED
@@ -130,6 +130,7 @@
130
  <glyph unicode="&#xe88f;" glyph-name="info_outline" data-tags="info_outline" d="M461.521 580.507v103.361h100.958v-103.361h-100.958zM512 15.625c225.953 0 411.042 185.089 411.042 411.042s-185.089 411.042-411.042 411.042-411.042-185.089-411.042-411.042 185.089-411.042 411.042-411.042zM512 938.667c283.643 0 512-228.357 512-512s-228.357-512-512-512-512 228.357-512 512 228.357 512 512 512zM461.521 169.465v307.681h100.958v-307.681h-100.958z" />
131
  <glyph unicode="&#xe8b8;" glyph-name="settings" data-tags="settings" d="M512 246.385c98.554 0 180.282 81.728 180.282 180.282s-81.728 180.282-180.282 180.282-180.282-81.728-180.282-180.282 81.728-180.282 180.282-180.282zM894.197 376.188l108.169-84.131c9.615-7.211 12.019-21.634 4.808-33.653l-103.361-177.878c-7.211-12.019-19.23-14.423-31.249-9.615l-127.399 50.479c-26.441-19.23-55.286-38.46-86.535-50.479l-19.23-134.61c-2.404-12.019-12.019-21.634-24.038-21.634h-206.723c-12.019 0-21.634 9.615-24.038 21.634l-19.23 134.61c-31.249 12.019-60.094 28.845-86.535 50.479l-127.399-50.479c-12.019-4.808-24.038-2.404-31.249 9.615l-103.361 177.878c-7.211 12.019-4.808 26.441 4.808 33.653l108.169 84.131c-2.404 16.826-2.404 33.653-2.404 50.479s0 33.653 2.404 50.479l-108.169 84.131c-9.615 7.211-12.019 21.634-4.808 33.653l103.361 177.878c7.211 12.019 19.23 14.423 31.249 9.615l127.399-50.479c26.441 19.23 55.286 38.46 86.535 50.479l19.23 134.61c2.404 12.019 12.019 21.634 24.038 21.634h206.723c12.019 0 21.634-9.615 24.038-21.634l19.23-134.61c31.249-12.019 60.094-28.845 86.535-50.479l127.399 50.479c12.019 4.808 24.038 2.404 31.249-9.615l103.361-177.878c7.211-12.019 4.808-26.441-4.808-33.653l-108.169-84.131c2.404-16.826 2.404-33.653 2.404-50.479s0-33.653-2.404-50.479z" />
132
  <glyph unicode="&#xe900;" glyph-name="segmented-visits-log" data-tags="contacts" d="M726 212.667v64c0 72-142 108-214 108s-214-36-214-108v-64h428zM512 650.667c-52 0-96-44-96-96s44-96 96-96 96 44 96 96-44 96-96 96zM854 768.667c46 0 84-40 84-86v-512c0-46-38-86-84-86h-684c-46 0-84 40-84 86v512c0 46 38 86 84 86h684zM170-85.333v86h684v-86h-684zM854 938.667v-86h-684v86h684z" />
 
133
  <glyph unicode="&#xe922;" glyph-name="evolution" data-tags="timeline" d="M982 596.667c0-46-40-84-86-84-8 0-16 0-22 2l-152-152c2-6 4-14 4-22 0-46-40-84-86-84s-86 38-86 84c0 8 2 16 4 22l-110 110c-6-2-14-4-22-4s-16 2-22 4l-194-194c2-6 4-14 4-22 0-46-40-86-86-86s-86 40-86 86 40 84 86 84c8 0 16 0 22-2l194 194c-2 6-2 14-2 22 0 46 38 86 84 86s86-40 86-86c0-8 0-16-2-22l108-108c6 2 14 2 22 2s16 0 22-2l152 150c-2 6-4 14-4 22 0 46 40 86 86 86s86-40 86-86z" />
134
  <glyph unicode="&#xe95e;" glyph-name="archive" data-tags="box-add, box, download, storage, inbox, archive" d="M832 896h-640l-192-192v-672c0-17.674 14.326-32 32-32h960c17.672 0 32 14.326 32 32v672l-192 192zM512 128l-320 256h192v192h256v-192h192l-320-256zM154.51 768l64 64h586.978l64-64h-714.978z" />
135
  <glyph unicode="&#xe9a5;" glyph-name="rocket" data-tags="rocket, jet, speed, spaceship, fast" d="M704 896l-320-320h-192l-192-256c0 0 203.416 56.652 322.066 30.084l-322.066-414.084 421.902 328.144c58.838-134.654-37.902-328.144-37.902-328.144l256 192v192l320 320 64 320-320-64z" />
130
  <glyph unicode="&#xe88f;" glyph-name="info_outline" data-tags="info_outline" d="M461.521 580.507v103.361h100.958v-103.361h-100.958zM512 15.625c225.953 0 411.042 185.089 411.042 411.042s-185.089 411.042-411.042 411.042-411.042-185.089-411.042-411.042 185.089-411.042 411.042-411.042zM512 938.667c283.643 0 512-228.357 512-512s-228.357-512-512-512-512 228.357-512 512 228.357 512 512 512zM461.521 169.465v307.681h100.958v-307.681h-100.958z" />
131
  <glyph unicode="&#xe8b8;" glyph-name="settings" data-tags="settings" d="M512 246.385c98.554 0 180.282 81.728 180.282 180.282s-81.728 180.282-180.282 180.282-180.282-81.728-180.282-180.282 81.728-180.282 180.282-180.282zM894.197 376.188l108.169-84.131c9.615-7.211 12.019-21.634 4.808-33.653l-103.361-177.878c-7.211-12.019-19.23-14.423-31.249-9.615l-127.399 50.479c-26.441-19.23-55.286-38.46-86.535-50.479l-19.23-134.61c-2.404-12.019-12.019-21.634-24.038-21.634h-206.723c-12.019 0-21.634 9.615-24.038 21.634l-19.23 134.61c-31.249 12.019-60.094 28.845-86.535 50.479l-127.399-50.479c-12.019-4.808-24.038-2.404-31.249 9.615l-103.361 177.878c-7.211 12.019-4.808 26.441 4.808 33.653l108.169 84.131c-2.404 16.826-2.404 33.653-2.404 50.479s0 33.653 2.404 50.479l-108.169 84.131c-9.615 7.211-12.019 21.634-4.808 33.653l103.361 177.878c7.211 12.019 19.23 14.423 31.249 9.615l127.399-50.479c26.441 19.23 55.286 38.46 86.535 50.479l19.23 134.61c2.404 12.019 12.019 21.634 24.038 21.634h206.723c12.019 0 21.634-9.615 24.038-21.634l19.23-134.61c31.249-12.019 60.094-28.845 86.535-50.479l127.399 50.479c12.019 4.808 24.038 2.404 31.249-9.615l103.361-177.878c7.211-12.019 4.808-26.441-4.808-33.653l-108.169-84.131c2.404-16.826 2.404-33.653 2.404-50.479s0-33.653-2.404-50.479z" />
132
  <glyph unicode="&#xe900;" glyph-name="segmented-visits-log" data-tags="contacts" d="M726 212.667v64c0 72-142 108-214 108s-214-36-214-108v-64h428zM512 650.667c-52 0-96-44-96-96s44-96 96-96 96 44 96 96-44 96-96 96zM854 768.667c46 0 84-40 84-86v-512c0-46-38-86-84-86h-684c-46 0-84 40-84 86v512c0 46 38 86 84 86h684zM170-85.333v86h684v-86h-684zM854 938.667v-86h-684v86h684z" />
133
+ <glyph unicode="&#xe901;" glyph-name="watch_later" data-tags="watch_later" d="M692 246.667l34 56-192 116v222h-64v-256zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
134
  <glyph unicode="&#xe922;" glyph-name="evolution" data-tags="timeline" d="M982 596.667c0-46-40-84-86-84-8 0-16 0-22 2l-152-152c2-6 4-14 4-22 0-46-40-84-86-84s-86 38-86 84c0 8 2 16 4 22l-110 110c-6-2-14-4-22-4s-16 2-22 4l-194-194c2-6 4-14 4-22 0-46-40-86-86-86s-86 40-86 86 40 84 86 84c8 0 16 0 22-2l194 194c-2 6-2 14-2 22 0 46 38 86 84 86s86-40 86-86c0-8 0-16-2-22l108-108c6 2 14 2 22 2s16 0 22-2l152 150c-2 6-4 14-4 22 0 46 40 86 86 86s86-40 86-86z" />
135
  <glyph unicode="&#xe95e;" glyph-name="archive" data-tags="box-add, box, download, storage, inbox, archive" d="M832 896h-640l-192-192v-672c0-17.674 14.326-32 32-32h960c17.672 0 32 14.326 32 32v672l-192 192zM512 128l-320 256h192v192h256v-192h192l-320-256zM154.51 768l64 64h586.978l64-64h-714.978z" />
136
  <glyph unicode="&#xe9a5;" glyph-name="rocket" data-tags="rocket, jet, speed, spaceship, fast" d="M704 896l-320-320h-192l-192-256c0 0 203.416 56.652 322.066 30.084l-322.066-414.084 421.902 328.144c58.838-134.654-37.902-328.144-37.902-328.144l256 192v192l320 320 64 320-320-64z" />
app/plugins/Morpheus/fonts/matomo.ttf CHANGED
Binary file
app/plugins/Morpheus/fonts/matomo.woff CHANGED
Binary file
app/plugins/Morpheus/fonts/matomo.woff2 CHANGED
Binary file
app/plugins/Morpheus/stylesheets/base/icons.css CHANGED
@@ -387,4 +387,7 @@
387
  }
388
  .icon-page-performance:before {
389
  content: "\e9a6";
390
- }
 
 
 
387
  }
388
  .icon-page-performance:before {
389
  content: "\e9a6";
390
+ }
391
+ .icon-clock:before {
392
+ content: "\e901";
393
+ }
app/plugins/Morpheus/templates/demo.twig CHANGED
@@ -667,7 +667,8 @@
667
  'form',
668
  'transition',
669
  'overlay',
670
- 'lab'
 
671
  ],
672
  'Users': [
673
  'user',
667
  'form',
668
  'transition',
669
  'overlay',
670
+ 'lab',
671
+ 'clock'
672
  ],
673
  'Users': [
674
  'user',
app/plugins/Morpheus/templates/javascriptCode.twig CHANGED
@@ -1,5 +1,5 @@
1
  <!-- Matomo -->
2
- <script type="text/javascript">
3
  var _paq = window._paq = window._paq || [];
4
  /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
5
  {$options} _paq.push(['trackPageView']);
@@ -9,11 +9,11 @@
9
  {$optionsBeforeTrackerUrl}_paq.push(['setTrackerUrl', u+'{$matomoPhpFilename}']);
10
  _paq.push(['setSiteId', '{$idSite}']);
11
  {% if loadAsync %}var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
12
- g.type='text/javascript'; g.async=true; g.src=u+'{$matomoJsFilename}'; s.parentNode.insertBefore(g,s);{% endif %}
13
 
14
  })();
15
  </script>
16
- {% if not loadAsync %}<script type='text/javascript' src="{$protocol}{$piwikUrl}/{$matomoJsFilename}"></script>
17
  {% endif %}
18
  {% if trackNoScript %}<noscript><p><img src="{$protocol}{$piwikUrl}/{$matomoPhpFilename}?idsite={$idSite}&amp;rec=1" style="border:0;" alt="" /></p></noscript>
19
  {% endif %}
1
  <!-- Matomo -->
2
+ <script>
3
  var _paq = window._paq = window._paq || [];
4
  /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
5
  {$options} _paq.push(['trackPageView']);
9
  {$optionsBeforeTrackerUrl}_paq.push(['setTrackerUrl', u+'{$matomoPhpFilename}']);
10
  _paq.push(['setSiteId', '{$idSite}']);
11
  {% if loadAsync %}var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
12
+ g.async=true; g.src=u+'{$matomoJsFilename}'; s.parentNode.insertBefore(g,s);{% endif %}
13
 
14
  })();
15
  </script>
16
+ {% if not loadAsync %}<script src="{$protocol}{$piwikUrl}/{$matomoJsFilename}"></script>
17
  {% endif %}
18
  {% if trackNoScript %}<noscript><p><img src="{$protocol}{$piwikUrl}/{$matomoPhpFilename}?idsite={$idSite}&amp;rec=1" style="border:0;" alt="" /></p></noscript>
19
  {% endif %}
app/plugins/MultiSites/API.php CHANGED
@@ -267,12 +267,27 @@ class API extends \Piwik\Plugin\API
267
  }
268
 
269
  // move the site id to a metadata column
270
- $dataTable->queueFilter('MetadataCallbackAddMetadata', array('idsite', 'group', array('\Piwik\Site', 'getGroupFor'), array()));
271
- $dataTable->queueFilter('MetadataCallbackAddMetadata', array('idsite', 'main_url', array('\Piwik\Site', 'getMainUrlFor'), array()));
 
 
 
 
 
 
 
 
 
 
272
 
273
  // set the label of each row to the site name
274
  if ($multipleWebsitesRequested) {
275
- $dataTable->queueFilter('ColumnCallbackReplace', array('label', '\Piwik\Site::getNameFor'));
 
 
 
 
 
276
  } else {
277
  $dataTable->queueFilter('ColumnDelete', array('label'));
278
  }
267
  }
268
 
269
  // move the site id to a metadata column
270
+ $dataTable->queueFilter('MetadataCallbackAddMetadata', array('idsite', 'group', function($idSite) {
271
+ if ($idSite == '-1') { // Others row might occur when `filter_truncate` API parameter is used
272
+ return '';
273
+ }
274
+ return Site::getGroupFor($idSite);
275
+ }, array()));
276
+ $dataTable->queueFilter('MetadataCallbackAddMetadata', array('idsite', 'main_url', function($idSite) {
277
+ if ($idSite == '-1') { // Others row might occur when `filter_truncate` API parameter is used
278
+ return '';
279
+ }
280
+ return Site::getMainUrlFor($idSite);
281
+ }, array()));
282
 
283
  // set the label of each row to the site name
284
  if ($multipleWebsitesRequested) {
285
+ $dataTable->queueFilter('ColumnCallbackReplace', array('label', function($idSite) {
286
+ if ($idSite == '-1') { // Others row might occur when `filter_truncate` API parameter is used
287
+ return Piwik::translate('General_Others');
288
+ }
289
+ return Site::getNameFor($idSite);
290
+ }));
291
  } else {
292
  $dataTable->queueFilter('ColumnDelete', array('label'));
293
  }
app/plugins/MultiSites/angularjs/site/site.directive.html CHANGED
@@ -1,6 +1,6 @@
1
  <tr ng-class="{'groupedWebsite': website.group, 'website': !website.group, 'group': website.isGroup}">
2
  <td ng-if="!website.isGroup" class="multisites-label label">
3
- <a title="View reports" ng-href="index.php?module=CoreHome&action=index&date={{ date }}&period={{ period }}&idSite={{ website.idsite }}" class="value truncated-text-line">{{ website.label }}</a>
4
 
5
  <span>
6
  <a rel="noreferrer noopener" target="_blank" title="{{ 'General_GoTo'|translate:website.main_url }}" ng-href="{{ website.main_url }}">
@@ -30,7 +30,7 @@
30
 
31
  <td ng-if="showSparklines" style="width:180px;">
32
  <div ng-if="!website.isGroup" class="sparkline" style="width: 100px; margin: auto;">
33
- <a rel="noreferrer noopener" target="_blank" ng-href="index.php?module=CoreHome&action=index&date={{ date }}&period={{ period }}&idSite={{ website.idsite }}"
34
  title="{{ 'General_GoTo'|translate:('Dashboard_DashboardOf'|translate:website.label) }}">
35
  <img alt="" ng-src="{{ sparklineImage(website) }}" width="100" height="25" />
36
  </a>
1
  <tr ng-class="{'groupedWebsite': website.group, 'website': !website.group, 'group': website.isGroup}">
2
  <td ng-if="!website.isGroup" class="multisites-label label">
3
+ <a title="View reports" ng-href="{{ dashboardUrl(website) }}" class="value truncated-text-line">{{ website.label }}</a>
4
 
5
  <span>
6
  <a rel="noreferrer noopener" target="_blank" title="{{ 'General_GoTo'|translate:website.main_url }}" ng-href="{{ website.main_url }}">
30
 
31
  <td ng-if="showSparklines" style="width:180px;">
32
  <div ng-if="!website.isGroup" class="sparkline" style="width: 100px; margin: auto;">
33
+ <a rel="noreferrer noopener" target="_blank" ng-href="{{ dashboardUrl(website) }}"
34
  title="{{ 'General_GoTo'|translate:('Dashboard_DashboardOf'|translate:website.label) }}">
35
  <img alt="" ng-src="{{ sparklineImage(website) }}" width="100" height="25" />
36
  </a>
app/plugins/Overlay/client/client.js-e DELETED
@@ -1,258 +0,0 @@
1
- var Matomo_Overlay_Client = (function () {
2
-
3
- var DOMAIN_PARSE_REGEX = /^http(s)?:\/\/(www\.)?([^\/]*)/i;
4
-
5
- /** jQuery */
6
- var $;
7
-
8
- /** Url of the Piwik root */
9
- var piwikRoot;
10
-
11
- /** protocol and domain of Piwik root */
12
- var piwikOrigin;
13
-
14
- /** Piwik idsite */
15
- var idSite;
16
-
17
- /** The current period and date */
18
- var period, date, segment;
19
-
20
- /** Reference to the status bar DOM element */
21
- var statusBar;
22
-
23
- /** Counter for request IDs for postMessage based API requests. */
24
- var lastRequestId = 0;
25
-
26
- /** Map of callbacks for postMessage based API requests. */
27
- var requestCallbacks = {};
28
-
29
- /** Load the client CSS */
30
- function loadCss() {
31
- var css = c('link').attr({
32
- rel: 'stylesheet',
33
- type: 'text/css',
34
- href: piwikRoot + '/plugins/Overlay/client/client.css'
35
- });
36
- $('head').append(css);
37
- }
38
-
39
- /**
40
- * This method loads jQuery, if it is not there yet.
41
- * The callback is triggered after jQuery is loaded.
42
- */
43
- function loadJQuery(callback) {
44
- if (typeof jQuery != 'undefined') {
45
- $ = jQuery;
46
- callback();
47
- }
48
- else {
49
- Matomo_Overlay_Client.loadScript('node_modules/jquery/dist/jquery.min.js', function () {
50
- $ = jQuery;
51
- jQuery.noConflict();
52
- callback();
53
- });
54
- }
55
- }
56
-
57
- /**
58
- * Notify Piwik of the current iframe location.
59
- * This way, we can display additional metrics on the side of the iframe.
60
- */
61
- function notifyPiwikOfLocation() {
62
- // check whether the session has been opened in a new tab (instead of an iframe)
63
- if (window != window.top) {
64
- var iframe = c('iframe', false, {
65
- src: piwikRoot + '/index.php?module=Overlay&action=notifyParentIframe#' + window.location.href
66
- }).css({width: 0, height: 0, border: 0});
67
-
68
- $('body').append(iframe);
69
- }
70
- }
71
-
72
- /** Create a jqueryfied DOM element */
73
- function c(tagName, className, attributes) {
74
- var el = $(document.createElement(tagName));
75
-
76
- if (className) {
77
- if (className.substring(0, 1) == '#') {
78
- var id = className.substring(1, className.length);
79
- id = 'PIS_' + id;
80
- el.attr('id', id);
81
- }
82
- else {
83
- className = 'PIS_' + className;
84
- el.addClass(className);
85
- }
86
- }
87
-
88
- if (attributes) {
89
- el.attr(attributes);
90
- }
91
-
92
- return el;
93
- }
94
-
95
- function nextRequestId() {
96
- var nextId = lastRequestId + 1;
97
- lastRequestId = nextId;
98
- return nextId;
99
- }
100
-
101
- function handlePostMessages() {
102
- window.addEventListener("message", function (event) {
103
- if (event.origin !== piwikOrigin) {
104
- return;
105
- }
106
-
107
- var strData = event.data.split(':', 3);
108
- if (strData[0] !== 'overlay.response') {
109
- return;
110
- }
111
-
112
- var requestId = strData[1];
113
- if (!requestCallbacks[requestId]) {
114
- return;
115
- }
116
-
117
- var callback = requestCallbacks[requestId];
118
- delete requestCallbacks[requestId];
119
-
120
- var data = JSON.parse(decodeURIComponent(strData[2]));
121
- if (typeof data.result !== 'undefined'
122
- && data.result === 'error'
123
- ) {
124
- alert('Error: ' + data.message);
125
- } else {
126
- callback(data);
127
- }
128
- }, false);
129
- }
130
-
131
- return {
132
-
133
- /** Initialize in-site analytics */
134
- initialize: function (pPiwikRoot, pIdSite, pPeriod, pDate, pSegment) {
135
- piwikRoot = pPiwikRoot;
136
- piwikOrigin = piwikRoot.match(DOMAIN_PARSE_REGEX)[0];
137
- idSite = pIdSite;
138
- period = pPeriod;
139
- date = pDate;
140
- segment = pSegment;
141
-
142
- var load = this.loadScript;
143
- var loading = this.loadingNotification;
144
-
145
- loadJQuery(function () {
146
- handlePostMessages();
147
- notifyPiwikOfLocation();
148
- loadCss();
149
-
150
- // translations
151
- load('plugins/Overlay/client/translations.js', function () {
152
- Piwik_Overlay_Translations.initialize(function () {
153
- // following pages
154
- var finishPages = loading('Loading following pages');
155
- load('plugins/Overlay/client/followingpages.js', function () {
156
- Piwik_Overlay_FollowingPages.initialize(finishPages);
157
- });
158
-
159
- });
160
- });
161
- });
162
- },
163
-
164
- /** Create a jqueryfied DOM element */
165
- createElement: function (tagName, className, attributes) {
166
- return c(tagName, className, attributes);
167
- },
168
-
169
- /** Load a script and wait for it to be loaded */
170
- loadScript: function (relativePath, callback) {
171
- var loaded = false;
172
- var onLoad = function () {
173
- if (!loaded) {
174
- loaded = true;
175
- callback();
176
- }
177
- };
178
-
179
- var head = document.getElementsByTagName('head')[0];
180
- var script = document.createElement('script');
181
- script.type = 'text/javascript';
182
-
183
- script.onreadystatechange = function () {
184
- if (this.readyState == 'loaded' || this.readyState == 'complete') {
185
- onLoad();
186
- }
187
- };
188
- script.onload = onLoad;
189
-
190
- script.src = piwikRoot + '/' + relativePath + '?v=1';
191
- head.appendChild(script);
192
- },
193
-
194
- /** Piwik Overlay API Request */
195
- api: function (method, callback, additionalParams) {
196
- var url = piwikRoot + '/index.php?module=API&method=Overlay.' + method
197
- + '&idSite=' + idSite + '&period=' + period + '&date=' + date + '&format=JSON&filter_limit=-1';
198
-
199
- if (segment) {
200
- url += '&segment=' + segment;
201
- }
202
-
203
- if (additionalParams) {
204
- url += '&' + additionalParams;
205
- }
206
-
207
- var requestId = nextRequestId();
208
- requestCallbacks[requestId] = callback;
209
-
210
- var matomoFrame = window.parent;
211
- matomoFrame.postMessage('overlay.call:' + requestId + ':' + encodeURIComponent(url), piwikOrigin);
212
- },
213
-
214
- /**
215
- * Initialize a notification
216
- * To hide the notification use the returned callback
217
- */
218
- notification: function (message, addClass) {
219
- if (!statusBar) {
220
- statusBar = c('div', '#StatusBar').css('opacity', .8);
221
- $('body').prepend(statusBar);
222
- }
223
-
224
- var item = c('div', 'Item').html(message);
225
-
226
- if (addClass) {
227
- item.addClass('PIS_' + addClass);
228
- }
229
-
230
- statusBar.show().append(item);
231
-
232
- return function () {
233
- item.remove();
234
- if (!statusBar.children().length) {
235
- statusBar.hide();
236
- }
237
- };
238
- },
239
-
240
- /** Hide all notifications with a certain class */
241
- hideNotifications: function (className) {
242
- statusBar.find('.PIS_' + className).remove();
243
- if (!statusBar.children().length) {
244
- statusBar.hide();
245
- }
246
- },
247
-
248
- /**
249
- * Initialize a loading notification
250
- * To hide the notification use the returned callback
251
- */
252
- loadingNotification: function (message) {
253
- return Matomo_Overlay_Client.notification(message, 'Loading');
254
- }
255
-
256
- };
257
-
258
- })();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/plugins/Overlay/javascripts/Piwik_Overlay.js CHANGED
@@ -228,6 +228,10 @@ var Piwik_Overlay = (function () {
228
  params.module = 'API';
229
  params.action = 'index';
230
 
 
 
 
 
231
  if (ALLOWED_API_REQUEST_WHITELIST.indexOf(params.method) === -1) {
232
  sendResponse({
233
  result: 'error',
@@ -237,13 +241,14 @@ var Piwik_Overlay = (function () {
237
  }
238
 
239
  angular.element(document).injector().invoke(['piwikApi', function (piwikApi) {
 
240
  piwikApi.fetch(params)
241
  .then(function (response) {
242
  sendResponse(response);
243
  }).catch(function (err) {
244
  sendResponse({
245
  result: 'error',
246
- message: err.message,
247
  });
248
  });
249
  }]);
228
  params.module = 'API';
229
  params.action = 'index';
230
 
231
+ // these should be sent as post parameters
232
+ delete params.token_auth;
233
+ delete params.force_api_session;
234
+
235
  if (ALLOWED_API_REQUEST_WHITELIST.indexOf(params.method) === -1) {
236
  sendResponse({
237
  result: 'error',
241
  }
242
 
243
  angular.element(document).injector().invoke(['piwikApi', function (piwikApi) {
244
+ piwikApi.withTokenInUrl();
245
  piwikApi.fetch(params)
246
  .then(function (response) {
247
  sendResponse(response);
248
  }).catch(function (err) {
249
  sendResponse({
250
  result: 'error',
251
+ message: err.message || err || 'unknown error',
252
  });
253
  });
254
  }]);
app/plugins/PrivacyManager/LogDataPurger.php CHANGED
@@ -13,6 +13,7 @@ use Piwik\Container\StaticContainer;
13
  use Piwik\DataAccess\RawLogDao;
14
  use Piwik\Date;
15
  use Piwik\Db;
 
16
  use Piwik\Log;
17
  use Piwik\LogDeleter;
18
  use Piwik\Piwik;
@@ -66,8 +67,14 @@ class LogDataPurger
66
  public function purgeData($deleteLogsOlderThan, $deleteUnusedLogActions)
67
  {
68
  $dateUpperLimit = Date::factory("today")->subDay($deleteLogsOlderThan);
 
 
 
 
69
  $this->logDeleter->deleteVisitsFor($start = null, $dateUpperLimit->getDatetime());
70
 
 
 
71
  $logTables = self::getDeleteTableLogTables();
72
 
73
  // delete unused actions from the log_action table (but only if we can lock tables)
13
  use Piwik\DataAccess\RawLogDao;
14
  use Piwik\Date;
15
  use Piwik\Db;
16
+ use Piwik\Db\TransactionLevel;
17
  use Piwik\Log;
18
  use Piwik\LogDeleter;
19
  use Piwik\Piwik;
67
  public function purgeData($deleteLogsOlderThan, $deleteUnusedLogActions)
68
  {
69
  $dateUpperLimit = Date::factory("today")->subDay($deleteLogsOlderThan);
70
+
71
+ $transactionLevel = new TransactionLevel(Db::get());
72
+ $transactionLevel->setUncommitted();
73
+
74
  $this->logDeleter->deleteVisitsFor($start = null, $dateUpperLimit->getDatetime());
75
 
76
+ $transactionLevel->restorePreviousStatus();
77
+
78
  $logTables = self::getDeleteTableLogTables();
79
 
80
  // delete unused actions from the log_action table (but only if we can lock tables)
app/plugins/Referrers/Columns/Base.php CHANGED
@@ -106,7 +106,7 @@ abstract class Base extends VisitDimension
106
 
107
  if (!$referrerDetected && !empty($this->referrerHost)) {
108
  $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_WEBSITE;
109
- $this->nameReferrerAnalyzed = Common::mb_strtolower($this->referrerHost);
110
 
111
  $urlsByHost = $this->getCachedUrlsByHostAndIdSite();
112
 
@@ -421,8 +421,8 @@ abstract class Base extends VisitDimension
421
  // fallback logic if the referrer domain is not known to any site to not break BC
422
  if (!$excludeUnknowns && isset($this->currentUrlParse['host'])) {
423
  // this might be actually buggy if first thing tracked is eg an outlink and referrer is from that site
424
- $currentHost = Common::mb_strtolower($this->currentUrlParse['host']);
425
- if ($currentHost == Common::mb_strtolower($this->referrerHost)) {
426
  $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
427
  return true;
428
  }
@@ -493,10 +493,10 @@ abstract class Base extends VisitDimension
493
 
494
  $this->detectCampaignKeywordFromReferrerUrl();
495
 
496
- $referrerNameAnalayzed = Common::mb_strtolower($this->nameReferrerAnalyzed);
497
  $referrerNameAnalayzed = $this->truncateReferrerName($referrerNameAnalayzed);
498
 
499
- $isCurrentVisitACampaignWithSameName = Common::mb_strtolower($visitor->getVisitorColumn('referer_name')) == $referrerNameAnalayzed;
500
  $isCurrentVisitACampaignWithSameName = $isCurrentVisitACampaignWithSameName && $visitor->getVisitorColumn('referer_type') == Common::REFERRER_TYPE_CAMPAIGN;
501
 
502
  // if we detected a campaign but there is still no keyword set, we set the keyword to the Referrer host
@@ -522,8 +522,8 @@ abstract class Base extends VisitDimension
522
  return false;
523
  }
524
 
525
- $this->keywordReferrerAnalyzed = Common::mb_strtolower($this->keywordReferrerAnalyzed);
526
- $this->nameReferrerAnalyzed = Common::mb_strtolower($this->nameReferrerAnalyzed);
527
  return true;
528
  }
529
 
@@ -612,10 +612,10 @@ abstract class Base extends VisitDimension
612
  {
613
  if ($type === Common::REFERRER_TYPE_CAMPAIGN) {
614
  if (!empty($name)) {
615
- $name = Common::mb_strtolower($name);
616
  }
617
  if (!empty($keyword)) {
618
- $keyword = Common::mb_strtolower($keyword);
619
  }
620
  }
621
  }
@@ -632,8 +632,8 @@ abstract class Base extends VisitDimension
632
 
633
  protected function hasReferrerColumnChanged(Visitor $visitor, $information, $infoName)
634
  {
635
- $existing = Common::mb_strtolower($visitor->getVisitorColumn($infoName));
636
- $new = Common::mb_strtolower($information[$infoName]);
637
 
638
  $result = $existing != $new;
639
  if ($result) {
@@ -655,12 +655,12 @@ abstract class Base extends VisitDimension
655
 
656
  private function truncateReferrerName($name)
657
  {
658
- return Common::mb_substr($name, 0, 255);
659
  }
660
 
661
  private function truncateReferrerKeyword($refererKeyword)
662
  {
663
- return Common::mb_substr($refererKeyword, 0, 255);
664
  }
665
 
666
  protected function isCurrentReferrerDirectEntry(Visitor $visitor)
106
 
107
  if (!$referrerDetected && !empty($this->referrerHost)) {
108
  $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_WEBSITE;
109
+ $this->nameReferrerAnalyzed = mb_strtolower($this->referrerHost);
110
 
111
  $urlsByHost = $this->getCachedUrlsByHostAndIdSite();
112
 
421
  // fallback logic if the referrer domain is not known to any site to not break BC
422
  if (!$excludeUnknowns && isset($this->currentUrlParse['host'])) {
423
  // this might be actually buggy if first thing tracked is eg an outlink and referrer is from that site
424
+ $currentHost = mb_strtolower($this->currentUrlParse['host']);
425
+ if ($currentHost == mb_strtolower($this->referrerHost)) {
426
  $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
427
  return true;
428
  }
493
 
494
  $this->detectCampaignKeywordFromReferrerUrl();
495
 
496
+ $referrerNameAnalayzed = mb_strtolower($this->nameReferrerAnalyzed);
497
  $referrerNameAnalayzed = $this->truncateReferrerName($referrerNameAnalayzed);
498
 
499
+ $isCurrentVisitACampaignWithSameName = mb_strtolower($visitor->getVisitorColumn('referer_name')) == $referrerNameAnalayzed;
500
  $isCurrentVisitACampaignWithSameName = $isCurrentVisitACampaignWithSameName && $visitor->getVisitorColumn('referer_type') == Common::REFERRER_TYPE_CAMPAIGN;
501
 
502
  // if we detected a campaign but there is still no keyword set, we set the keyword to the Referrer host
522
  return false;
523
  }
524
 
525
+ $this->keywordReferrerAnalyzed = mb_strtolower($this->keywordReferrerAnalyzed);
526
+ $this->nameReferrerAnalyzed = mb_strtolower($this->nameReferrerAnalyzed);
527
  return true;
528
  }
529
 
612
  {
613
  if ($type === Common::REFERRER_TYPE_CAMPAIGN) {
614
  if (!empty($name)) {
615
+ $name = mb_strtolower($name);
616
  }
617
  if (!empty($keyword)) {
618
+ $keyword = mb_strtolower($keyword);
619
  }
620
  }
621
  }
632
 
633
  protected function hasReferrerColumnChanged(Visitor $visitor, $information, $infoName)
634
  {
635
+ $existing = mb_strtolower($visitor->getVisitorColumn($infoName));
636
+ $new = mb_strtolower($information[$infoName]);
637
 
638
  $result = $existing != $new;
639
  if ($result) {
655
 
656
  private function truncateReferrerName($name)
657
  {
658
+ return mb_substr($name, 0, 255);
659
  }
660
 
661
  private function truncateReferrerKeyword($refererKeyword)
662
  {
663
+ return mb_substr($refererKeyword, 0, 255);
664
  }
665
 
666
  protected function isCurrentReferrerDirectEntry(Visitor $visitor)
app/plugins/Referrers/Columns/Campaign.php CHANGED
@@ -23,14 +23,8 @@ class Campaign extends Base
23
  *
24
  * @var bool
25
  */
26
- protected $createNewVisitWhenCampaignChanges;
27
  protected $nameSingular = 'Referrers_ColumnCampaign';
28
 
29
- public function __construct()
30
- {
31
- $this->createNewVisitWhenCampaignChanges = TrackerConfig::getConfigValue('create_new_visit_when_campaign_changes') == 1;
32
- }
33
-
34
  /**
35
  * If we should create a new visit when the campaign changes, check if the campaign info changed and if so
36
  * force the tracker to create a new visit.i
@@ -42,7 +36,7 @@ class Campaign extends Base
42
  */
43
  public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
44
  {
45
- if (!$this->createNewVisitWhenCampaignChanges) {
46
  return false;
47
  }
48
 
23
  *
24
  * @var bool
25
  */
 
26
  protected $nameSingular = 'Referrers_ColumnCampaign';
27
 
 
 
 
 
 
28
  /**
29
  * If we should create a new visit when the campaign changes, check if the campaign info changed and if so
30
  * force the tracker to create a new visit.i
36
  */
37
  public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
38
  {
39
+ if (TrackerConfig::getConfigValue('create_new_visit_when_campaign_changes', $request->getIdSiteIfExists()) != 1) {
40
  return false;
41
  }
42
 
app/plugins/Referrers/Columns/ReferrerUrl.php CHANGED
@@ -44,8 +44,8 @@ class ReferrerUrl extends Base
44
 
45
  private function trimUrl($url)
46
  {
47
- if (!empty($url) && is_string($url) && Common::mb_strlen($url) > self::MAX_LEN) {
48
- return Common::mb_substr($url, 0, self::MAX_LEN);
49
  }
50
  return $url;
51
  }
44
 
45
  private function trimUrl($url)
46
  {
47
+ if (!empty($url) && is_string($url) && mb_strlen($url) > self::MAX_LEN) {
48
+ return mb_substr($url, 0, self::MAX_LEN);
49
  }
50
  return $url;
51
  }
app/plugins/Referrers/Columns/Website.php CHANGED
@@ -20,22 +20,9 @@ class Website extends Base
20
  protected $type = self::TYPE_TEXT;
21
  protected $nameSingular = 'General_Website';
22
 
23
- /**
24
- * Set using the `[Tracker] create_new_visit_when_website_referrer_changes` INI config option.
25
- * If true, will force new visits if the referrer website changes.
26
- *
27
- * @var bool
28
- */
29
- protected $createNewVisitWhenWebsiteReferrerChanges;
30
-
31
- public function __construct()
32
- {
33
- $this->createNewVisitWhenWebsiteReferrerChanges = TrackerConfig::getConfigValue('create_new_visit_when_website_referrer_changes') == 1;
34
- }
35
-
36
  public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
37
  {
38
- if (!$this->createNewVisitWhenWebsiteReferrerChanges) {
39
  return false;
40
  }
41
 
20
  protected $type = self::TYPE_TEXT;
21
  protected $nameSingular = 'General_Website';
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
24
  {
25
+ if (TrackerConfig::getConfigValue('create_new_visit_when_website_referrer_changes', $request->getIdSiteIfExists()) != 1) {
26
  return false;
27
  }
28
 
app/plugins/Referrers/SearchEngine.php CHANGED
@@ -320,7 +320,7 @@ class SearchEngine extends Singleton
320
  if (!empty($definitions['charsets'])) {
321
  $key = $this->convertCharset($key, $definitions['charsets']);
322
  }
323
- $key = Common::mb_strtolower($key);
324
  }
325
 
326
  return array(
@@ -379,13 +379,9 @@ class SearchEngine extends Singleton
379
  */
380
  protected function convertCharset($string, $charsets)
381
  {
382
- if (function_exists('iconv')
383
- && !empty($charsets)
384
- ) {
385
  $charset = $charsets[0];
386
- if (count($charsets) > 1
387
- && function_exists('mb_detect_encoding')
388
- ) {
389
  $charset = mb_detect_encoding($string, $charsets);
390
  if ($charset === false) {
391
  $charset = $charsets[0];
320
  if (!empty($definitions['charsets'])) {
321
  $key = $this->convertCharset($key, $definitions['charsets']);
322
  }
323
+ $key = mb_strtolower($key);
324
  }
325
 
326
  return array(
379
  */
380
  protected function convertCharset($string, $charsets)
381
  {
382
+ if (!empty($charsets)) {
 
 
383
  $charset = $charsets[0];
384
+ if (count($charsets) > 1) {
 
 
385
  $charset = mb_detect_encoding($string, $charsets);
386
  if ($charset === false) {
387
  $charset = $charsets[0];
app/plugins/ScheduledReports/Controller.php CHANGED
@@ -40,7 +40,7 @@ class Controller extends \Piwik\Plugin\Controller
40
  $reportTypes = API::getReportTypes();
41
  $reportTypeOptions = array();
42
  foreach ($reportTypes as $reportType => $icon) {
43
- $reportTypeOptions[$reportType] = Common::mb_strtoupper($reportType);
44
  }
45
  $view->reportTypes = $reportTypes;
46
  $view->reportTypeOptions = $reportTypeOptions;
@@ -67,7 +67,7 @@ class Controller extends \Piwik\Plugin\Controller
67
  $reportFormatsByReportType[$reportType] = API::getReportFormats($reportType);
68
  $reportFormatsByReportTypeOptions[$reportType] = $reportFormatsByReportType[$reportType];
69
  foreach ($reportFormatsByReportTypeOptions[$reportType] as $type => $icon) {
70
- $reportFormatsByReportTypeOptions[$reportType][$type] = Common::mb_strtoupper($type);
71
  }
72
  $allowMultipleReportsByReportType[$reportType] = API::allowMultipleReports($reportType);
73
 
40
  $reportTypes = API::getReportTypes();
41
  $reportTypeOptions = array();
42
  foreach ($reportTypes as $reportType => $icon) {
43
+ $reportTypeOptions[$reportType] = mb_strtoupper($reportType);
44
  }
45
  $view->reportTypes = $reportTypes;
46
  $view->reportTypeOptions = $reportTypeOptions;
67
  $reportFormatsByReportType[$reportType] = API::getReportFormats($reportType);
68
  $reportFormatsByReportTypeOptions[$reportType] = $reportFormatsByReportType[$reportType];
69
  foreach ($reportFormatsByReportTypeOptions[$reportType] as $type => $icon) {
70
+ $reportFormatsByReportTypeOptions[$reportType][$type] = mb_strtoupper($type);
71
  }
72
  $allowMultipleReportsByReportType[$reportType] = API::allowMultipleReports($reportType);
73
 
app/plugins/SegmentEditor/SegmentFormatter.php CHANGED
@@ -110,7 +110,7 @@ class SegmentFormatter
110
  $translation = Piwik::translate($this->matchesMetric[$operator]);
111
  }
112
 
113
- return Common::mb_strtolower($translation);
114
  }
115
 
116
  private function getFormattedValue($operand)
110
  $translation = Piwik::translate($this->matchesMetric[$operator]);
111
  }
112
 
113
+ return mb_strtolower($translation);
114
  }
115
 
116
  private function getFormattedValue($operand)
app/plugins/SegmentEditor/SegmentSelectorControl.php CHANGED
@@ -56,7 +56,7 @@ class SegmentSelectorControl extends UIControl
56
  if ($segment['category'] == $visitTitle
57
  && ($segment['type'] == 'metric' && $segment['segment'] != 'visitIp')
58
  ) {
59
- $metricsLabel = Common::mb_strtolower(Piwik::translate('General_Metrics'));
60
  $segment['category'] .= ' (' . $metricsLabel . ')';
61
  }
62
  $segmentsByCategory[$segment['category']][] = $segment;
56
  if ($segment['category'] == $visitTitle
57
  && ($segment['type'] == 'metric' && $segment['segment'] != 'visitIp')
58
  ) {
59
+ $metricsLabel = mb_strtolower(Piwik::translate('General_Metrics'));
60
  $segment['category'] .= ' (' . $metricsLabel . ')';
61
  }
62
  $segmentsByCategory[$segment['category']][] = $segment;
app/plugins/SitesManager/Controller.php CHANGED
@@ -12,6 +12,7 @@ use Exception;
12
  use Piwik\API\Request;
13
  use Piwik\API\ResponseBuilder;
14
  use Piwik\Common;
 
15
  use Piwik\Exception\UnexpectedWebsiteFoundException;
16
  use Piwik\Piwik;
17
  use Piwik\Plugin\Manager;
@@ -25,6 +26,7 @@ use Piwik\View;
25
  use Piwik\Http;
26
  use Piwik\Plugins\SitesManager\GtmSiteTypeGuesser;
27
  use Matomo\Cache\Lazy;
 
28
 
29
  /**
30
  *
@@ -126,17 +128,12 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
126
 
127
  public function siteWithoutData()
128
  {
 
 
129
  $javascriptGenerator = new TrackerCodeGenerator();
130
  $javascriptGenerator->forceMatomoEndpoint();
131
  $piwikUrl = Url::getCurrentUrlWithoutFileName();
132
 
133
- if (!$this->site && Piwik::hasUserSuperUserAccess()) {
134
- throw new UnexpectedWebsiteFoundException('Invalid site ' . $this->idSite);
135
- } elseif (!$this->site) {
136
- // redirect to login form
137
- Piwik::checkUserHasViewAccess($this->idSite);
138
- }
139
-
140
  $jsTag = Request::processRequest('SitesManager.getJavascriptTag', array('idSite' => $this->idSite, 'piwikUrl' => $piwikUrl));
141
 
142
  // Strip off open and close <script> tag and comments so that JS will be displayed in ALL mail clients
@@ -167,17 +164,29 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
167
  }
168
 
169
  public function siteWithoutDataTabs() {
170
- $typeCacheId = 'guessedtype_' . md5($this->site->getMainUrl());
171
- $gtmCacheId = 'guessedgtm_' . md5($this->site->getMainUrl());
 
 
 
172
 
173
  $siteType = $this->cache->fetch($typeCacheId);
174
  $gtmUsed = $this->cache->fetch($gtmCacheId);
175
 
176
  if (!$siteType) {
177
  try {
178
- $response = Http::sendHttpRequest($this->site->getMainUrl(), 5, null, null, 0, false, false, true);
179
- } catch (Exception $e) {
180
  $response = false;
 
 
 
 
 
 
 
 
 
 
 
181
  }
182
 
183
  $guesser = new GtmSiteTypeGuesser();
12
  use Piwik\API\Request;
13
  use Piwik\API\ResponseBuilder;
14
  use Piwik\Common;
15
+ use Piwik\Container\StaticContainer;
16
  use Piwik\Exception\UnexpectedWebsiteFoundException;
17
  use Piwik\Piwik;
18
  use Piwik\Plugin\Manager;
26
  use Piwik\Http;
27
  use Piwik\Plugins\SitesManager\GtmSiteTypeGuesser;
28
  use Matomo\Cache\Lazy;
29
+ use Psr\Log\LoggerInterface;
30
 
31
  /**
32
  *
128
 
129
  public function siteWithoutData()
130
  {
131
+ $this->checkSitePermission();
132
+
133
  $javascriptGenerator = new TrackerCodeGenerator();
134
  $javascriptGenerator->forceMatomoEndpoint();
135
  $piwikUrl = Url::getCurrentUrlWithoutFileName();
136
 
 
 
 
 
 
 
 
137
  $jsTag = Request::processRequest('SitesManager.getJavascriptTag', array('idSite' => $this->idSite, 'piwikUrl' => $piwikUrl));
138
 
139
  // Strip off open and close <script> tag and comments so that JS will be displayed in ALL mail clients
164
  }
165
 
166
  public function siteWithoutDataTabs() {
167
+ $this->checkSitePermission();
168
+
169
+ $mainUrl = $this->site->getMainUrl();
170
+ $typeCacheId = 'guessedtype_' . md5($mainUrl);
171
+ $gtmCacheId = 'guessedgtm_' . md5($mainUrl);
172
 
173
  $siteType = $this->cache->fetch($typeCacheId);
174
  $gtmUsed = $this->cache->fetch($gtmCacheId);
175
 
176
  if (!$siteType) {
177
  try {
 
 
178
  $response = false;
179
+ $parsedUrl = parse_url($mainUrl);
180
+
181
+ // do not try to determine the site type for localhost or any IP
182
+ if (!empty($parsedUrl['host']) && !Url::isLocalHost($parsedUrl['host']) && !filter_var($parsedUrl['host'], FILTER_VALIDATE_IP)) {
183
+ $response = Http::sendHttpRequest($mainUrl, 5, null, null, 0, false, false, true);
184
+ }
185
+ } catch (Exception $e) {
186
+ StaticContainer::get(LoggerInterface::class)->info('Unable to fetch site type for host "{host}": {exception}', [
187
+ 'host' => $parsedUrl['host'] ?? 'unknown',
188
+ 'exception' => $e,
189
+ ]);
190
  }
191
 
192
  $guesser = new GtmSiteTypeGuesser();
app/plugins/SitesManager/GtmSiteTypeGuesser.php CHANGED
@@ -8,8 +8,6 @@
8
  */
9
  namespace Piwik\Plugins\SitesManager;
10
 
11
- use Piwik\Plugins\SitesManager\SitesManager;
12
-
13
  class GtmSiteTypeGuesser
14
  {
15
  public function guessSiteTypeFromResponse($response)
@@ -49,6 +47,22 @@ class GtmSiteTypeGuesser
49
  return SitesManager::SITE_TYPE_SHAREPOINT;
50
  }
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  return SitesManager::SITE_TYPE_UNKNOWN;
53
  }
54
 
8
  */
9
  namespace Piwik\Plugins\SitesManager;
10
 
 
 
11
  class GtmSiteTypeGuesser
12
  {
13
  public function guessSiteTypeFromResponse($response)
47
  return SitesManager::SITE_TYPE_SHAREPOINT;
48
  }
49
 
50
+ $needle = '<meta name="Generator" content="Drupal';
51
+ if (strpos($response['data'], $needle) !== false) {
52
+ return SitesManager::SITE_TYPE_DRUPAL;
53
+ }
54
+
55
+ // https://github.com/drupal/drupal/blob/9.2.x/core/includes/install.core.inc#L1054
56
+ // Birthday of Dries Buytaert, the founder of Drupal is on 19 November 1978 - https://en.wikipedia.org/wiki/Drupal
57
+ if (isset($response['headers']['expires']) && $response['headers']['expires'] === 'Sun, 19 Nov 1978 05:00:00 GMT') {
58
+ return SitesManager::SITE_TYPE_DRUPAL;
59
+ }
60
+
61
+ $pattern = '/data-wf-(?:domain|page)=/i';
62
+ if (preg_match($pattern, $response['data']) === 1) {
63
+ return SitesManager::SITE_TYPE_WEBFLOW;
64
+ }
65
+
66
  return SitesManager::SITE_TYPE_UNKNOWN;
67
  }
68
 
app/plugins/SitesManager/SiteUrls.php CHANGED
@@ -211,7 +211,7 @@ class SiteUrls
211
 
212
  private function toCanonicalHost($host)
213
  {
214
- $host = Common::mb_strtolower($host);
215
  if (strpos($host, 'www.') === 0) {
216
  $host = substr($host, 4);
217
  }
@@ -224,7 +224,7 @@ class SiteUrls
224
  $path = '/';
225
 
226
  if (isset($urlParsed['path'])) {
227
- $path = Common::mb_strtolower($urlParsed['path']);
228
  if (!Common::stringEndsWith($path, '/')) {
229
  $path .= '/';
230
  }
211
 
212
  private function toCanonicalHost($host)
213
  {
214
+ $host = mb_strtolower($host);
215
  if (strpos($host, 'www.') === 0) {
216
  $host = substr($host, 4);
217
  }
224
  $path = '/';
225
 
226
  if (isset($urlParsed['path'])) {
227
+ $path = mb_strtolower($urlParsed['path']);
228
  if (!Common::stringEndsWith($path, '/')) {
229
  $path .= '/';
230
  }
app/plugins/SitesManager/SitesManager.php CHANGED
@@ -39,6 +39,8 @@ class SitesManager extends \Piwik\Plugin
39
  const SITE_TYPE_SHAREPOINT = 'sharepoint';
40
  const SITE_TYPE_JOOMLA = 'joomla';
41
  const SITE_TYPE_SHOPIFY = 'shopify';
 
 
42
 
43
  /**
44
  * @see \Piwik\Plugin::registerEvents
@@ -367,6 +369,8 @@ class SitesManager extends \Piwik\Plugin
367
  self::SITE_TYPE_SQUARESPACE => 'https://matomo.org/faq/new-to-piwik/how-do-i-integrate-matomo-with-squarespace-website',
368
  self::SITE_TYPE_WIX => 'https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-analytics-tracking-code-on-wix',
369
  self::SITE_TYPE_WORDPRESS => 'https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-tracking-code-on-wordpress',
 
 
370
  ];
371
 
372
  return $map[$siteType] ? $map[$siteType] : false;
@@ -408,6 +412,8 @@ class SitesManager extends \Piwik\Plugin
408
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp2";
409
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp3";
410
  $translationKeys[] = "SitesManager_WebsitesManagement";
 
 
411
  $translationKeys[] = "SitesManager_MainDescription";
412
  $translationKeys[] = "SitesManager_YouCurrentlyHaveAccessToNWebsites";
413
  $translationKeys[] = "SitesManager_SuperUserAccessCan";
39
  const SITE_TYPE_SHAREPOINT = 'sharepoint';
40
  const SITE_TYPE_JOOMLA = 'joomla';
41
  const SITE_TYPE_SHOPIFY = 'shopify';
42
+ const SITE_TYPE_WEBFLOW = 'webflow';
43
+ const SITE_TYPE_DRUPAL = 'drupal';
44
 
45
  /**
46
  * @see \Piwik\Plugin::registerEvents
369
  self::SITE_TYPE_SQUARESPACE => 'https://matomo.org/faq/new-to-piwik/how-do-i-integrate-matomo-with-squarespace-website',
370
  self::SITE_TYPE_WIX => 'https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-analytics-tracking-code-on-wix',
371
  self::SITE_TYPE_WORDPRESS => 'https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-tracking-code-on-wordpress',
372
+ self::SITE_TYPE_DRUPAL => 'https://matomo.org/faq/new-to-piwik/how-to-integrate-with-drupal/',
373
+ self::SITE_TYPE_WEBFLOW => 'https://matomo.org/faq/new-to-piwik/how-do-i-install-the-matomo-tracking-code-on-webflow',
374
  ];
375
 
376
  return $map[$siteType] ? $map[$siteType] : false;
412
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp2";
413
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp3";
414
  $translationKeys[] = "SitesManager_WebsitesManagement";
415
+ $translationKeys[] = "SitesManager_WebsiteUpdated";
416
+ $translationKeys[] = "SitesManager_WebsiteCreated";
417
  $translationKeys[] = "SitesManager_MainDescription";
418
  $translationKeys[] = "SitesManager_YouCurrentlyHaveAccessToNWebsites";
419
  $translationKeys[] = "SitesManager_SuperUserAccessCan";
app/plugins/TagManager/Context/WebContext.php CHANGED
@@ -243,11 +243,11 @@ class WebContext extends BaseContext
243
 
244
  $embedCode = <<<INST
245
  <!-- Matomo Tag Manager -->
246
- <script type="text/javascript">
247
  var _mtm = window._mtm = window._mtm || [];
248
  _mtm.push({'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'});
249
  var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
250
- g.type='text/javascript'; g.async=true; g.src='$path'; s.parentNode.insertBefore(g,s);
251
  </script>
252
  <!-- End Matomo Tag Manager -->
253
  INST;
243
 
244
  $embedCode = <<<INST
245
  <!-- Matomo Tag Manager -->
246
+ <script>
247
  var _mtm = window._mtm = window._mtm || [];
248
  _mtm.push({'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'});
249
  var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
250
+ g.async=true; g.src='$path'; s.parentNode.insertBefore(g,s);
251
  </script>
252
  <!-- End Matomo Tag Manager -->
253
  INST;
app/plugins/TagManager/Template/Tag/MatomoTag.web.js CHANGED
@@ -65,7 +65,7 @@
65
  // installed which another doesn't have.
66
  libLoaded = true;
67
  var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
68
- g.type='text/javascript'; g.async=true; g.src=url+jsEndpoint; s.parentNode.insertBefore(g,s);
69
  }
70
  }
71
 
65
  // installed which another doesn't have.
66
  libLoaded = true;
67
  var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
68
+ g.async=true; g.src=url+jsEndpoint; s.parentNode.insertBefore(g,s);
69
  }
70
  }
71
 
app/plugins/TwoFactorAuth/Controller.php CHANGED
@@ -21,6 +21,10 @@ use Piwik\Session\SessionNamespace;
21
  use Piwik\Url;
22
  use Piwik\View;
23
  use Exception;
 
 
 
 
24
 
25
  class Controller extends \Piwik\Plugin\Controller
26
  {
@@ -148,6 +152,13 @@ class Controller extends \Piwik\Plugin\Controller
148
  $this->twoFa->disable2FAforUser(Piwik::getCurrentUserLogin());
149
  $this->passwordVerify->forgetVerifiedPassword();
150
 
 
 
 
 
 
 
 
151
  $this->redirectToIndex('UsersManager', 'userSecurity', null, null, null, array(
152
  'disableNonce' => false
153
  ));
@@ -218,6 +229,13 @@ class Controller extends \Piwik\Plugin\Controller
218
 
219
  Piwik::postEvent('TwoFactorAuth.enabled', array($login));
220
 
 
 
 
 
 
 
 
221
  if ($standalone) {
222
  $this->redirectToIndex('CoreHome', 'index');
223
  return;
@@ -274,11 +292,18 @@ class Controller extends \Piwik\Plugin\Controller
274
 
275
  $regenerateSuccess = false;
276
  $regenerateError = false;
 
277
 
278
  if ($postedValidNonce && $this->passwordVerify->hasBeenVerified()) {
279
  $this->passwordVerify->forgetVerifiedPassword();
280
  $this->recoveryCodeDao->createRecoveryCodesForLogin(Piwik::getCurrentUserLogin());
281
  $regenerateSuccess = true;
 
 
 
 
 
 
282
  // no need to redirect as password was verified nonce
283
  // if user has posted a valid nonce, we do not need to require password again as nonce must have been generated recent
284
  // avoids use case where eg password verify is only valid for one more minute when opening the page but user regenerates 2min later
@@ -293,6 +318,14 @@ class Controller extends \Piwik\Plugin\Controller
293
 
294
  $recoveryCodes = $this->recoveryCodeDao->getAllRecoveryCodesForLogin(Piwik::getCurrentUserLogin());
295
 
 
 
 
 
 
 
 
 
296
  return $this->renderTemplate('showRecoveryCodes', array(
297
  'codes' => $recoveryCodes,
298
  'regenerateNonce' => Nonce::getNonce(self::REGENERATE_CODES_2FA_NONCE),
21
  use Piwik\Url;
22
  use Piwik\View;
23
  use Exception;
24
+ use Piwik\Plugins\CoreAdminHome\Emails\RecoveryCodesShowedEmail;
25
+ use Piwik\Plugins\CoreAdminHome\Emails\TwoFactorAuthEnabledEmail;
26
+ use Piwik\Plugins\CoreAdminHome\Emails\TwoFactorAuthDisabledEmail;
27
+ use Piwik\Plugins\CoreAdminHome\Emails\RecoveryCodesRegeneratedEmail;
28
 
29
  class Controller extends \Piwik\Plugin\Controller
30
  {
152
  $this->twoFa->disable2FAforUser(Piwik::getCurrentUserLogin());
153
  $this->passwordVerify->forgetVerifiedPassword();
154
 
155
+ $container = StaticContainer::getContainer();
156
+ $email = $container->make(TwoFactorAuthDisabledEmail::class, array(
157
+ 'login' => Piwik::getCurrentUserLogin(),
158
+ 'emailAddress' => Piwik::getCurrentUserEmail()
159
+ ));
160
+ $email->safeSend();
161
+
162
  $this->redirectToIndex('UsersManager', 'userSecurity', null, null, null, array(
163
  'disableNonce' => false
164
  ));
229
 
230
  Piwik::postEvent('TwoFactorAuth.enabled', array($login));
231
 
232
+ $container = StaticContainer::getContainer();
233
+ $email = $container->make(TwoFactorAuthEnabledEmail::class, array(
234
+ 'login' => Piwik::getCurrentUserLogin(),
235
+ 'emailAddress' => Piwik::getCurrentUserEmail()
236
+ ));
237
+ $email->safeSend();
238
+
239
  if ($standalone) {
240
  $this->redirectToIndex('CoreHome', 'index');
241
  return;
292
 
293
  $regenerateSuccess = false;
294
  $regenerateError = false;
295
+ $container = StaticContainer::getContainer();
296
 
297
  if ($postedValidNonce && $this->passwordVerify->hasBeenVerified()) {
298
  $this->passwordVerify->forgetVerifiedPassword();
299
  $this->recoveryCodeDao->createRecoveryCodesForLogin(Piwik::getCurrentUserLogin());
300
  $regenerateSuccess = true;
301
+
302
+ $email = $container->make(RecoveryCodesRegeneratedEmail::class, array(
303
+ 'login' => Piwik::getCurrentUserLogin(),
304
+ 'emailAddress' => Piwik::getCurrentUserEmail()
305
+ ));
306
+ $email->safeSend();
307
  // no need to redirect as password was verified nonce
308
  // if user has posted a valid nonce, we do not need to require password again as nonce must have been generated recent
309
  // avoids use case where eg password verify is only valid for one more minute when opening the page but user regenerates 2min later
318
 
319
  $recoveryCodes = $this->recoveryCodeDao->getAllRecoveryCodesForLogin(Piwik::getCurrentUserLogin());
320
 
321
+ if (!$regenerateSuccess && !$regenerateError) {
322
+ $email = $container->make(RecoveryCodesShowedEmail::class, array(
323
+ 'login' => Piwik::getCurrentUserLogin(),
324
+ 'emailAddress' => Piwik::getCurrentUserEmail()
325
+ ));
326
+ $email->safeSend();
327
+ }
328
+
329
  return $this->renderTemplate('showRecoveryCodes', array(
330
  'codes' => $recoveryCodes,
331
  'regenerateNonce' => Nonce::getNonce(self::REGENERATE_CODES_2FA_NONCE),
app/plugins/TwoFactorAuth/Dao/RecoveryCodeDao.php CHANGED
@@ -38,7 +38,7 @@ class RecoveryCodeDao
38
 
39
  for ($i = 0; $i < 10; $i++) {
40
  $code = $this->generator->generateCode();
41
- $code = Common::mb_strtoupper($code);
42
  $this->insertRecoveryCode($login, $code);
43
  $codes[] = $code;
44
  }
38
 
39
  for ($i = 0; $i < 10; $i++) {
40
  $code = $this->generator->generateCode();
41
+ $code = mb_strtoupper($code);
42
  $this->insertRecoveryCode($login, $code);
43
  $codes[] = $code;
44
  }
app/plugins/UserCountry/API.php CHANGED
@@ -36,13 +36,7 @@ class API extends \Piwik\Plugin\API
36
  {
37
  $dataTable = $this->getDataTable(Archiver::COUNTRY_RECORD_NAME, $idSite, $period, $date, $segment);
38
 
39
- $dataTables = [$dataTable];
40
-
41
- if ($dataTable instanceof DataTable\Map) {
42
- $dataTables = $dataTable->getDataTables();
43
- }
44
-
45
- foreach ($dataTables as $dt) {
46
  if ($dt->getRowFromLabel('ti')) {
47
  $dt->filter('GroupBy', array(
48
  'label',
@@ -54,7 +48,7 @@ class API extends \Piwik\Plugin\API
54
  }
55
  ));
56
  }
57
- }
58
 
59
  // apply filter on the whole datatable in order the inline search to work (searches are done on "beautiful" label)
60
  $dataTable->filter('AddSegmentValue');
@@ -96,13 +90,7 @@ class API extends \Piwik\Plugin\API
96
  $separator = Archiver::LOCATION_SEPARATOR;
97
  $unk = Visit::UNKNOWN_CODE;
98
 
99
- $dataTables = [$dataTable];
100
-
101
- if ($dataTable instanceof DataTable\Map) {
102
- $dataTables = $dataTable->getDataTables();
103
- }
104
-
105
- foreach ($dataTables as $dt) {
106
  $archiveDate = $dt->getMetadata(DataTable::ARCHIVED_DATE_METADATA_NAME);
107
 
108
  // convert fips region codes to iso if required
@@ -140,7 +128,7 @@ class API extends \Piwik\Plugin\API
140
  }
141
  ));
142
  }
143
- }
144
 
145
  $segments = array('regionCode', 'countryCode');
146
  $dataTable->filter('AddSegmentByLabel', array($segments, Archiver::LOCATION_SEPARATOR));
@@ -187,13 +175,7 @@ class API extends \Piwik\Plugin\API
187
  $separator = Archiver::LOCATION_SEPARATOR;
188
  $unk = Visit::UNKNOWN_CODE;
189
 
190
- $dataTables = [$dataTable];
191
-
192
- if ($dataTable instanceof DataTable\Map) {
193
- $dataTables = $dataTable->getDataTables();
194
- }
195
-
196
- foreach ($dataTables as $dt) {
197
  $archiveDate = $dt->getMetadata(DataTable::ARCHIVED_DATE_METADATA_NAME);
198
 
199
  // convert fips region codes to iso if required
@@ -231,7 +213,7 @@ class API extends \Piwik\Plugin\API
231
  }
232
  ));
233
  }
234
- }
235
 
236
  $segments = array('city', 'regionCode', 'countryCode');
237
  $dataTable->filter('AddSegmentByLabel', array($segments, Archiver::LOCATION_SEPARATOR));
36
  {
37
  $dataTable = $this->getDataTable(Archiver::COUNTRY_RECORD_NAME, $idSite, $period, $date, $segment);
38
 
39
+ $dataTable->filter(function(DataTable $dt) {
 
 
 
 
 
 
40
  if ($dt->getRowFromLabel('ti')) {
41
  $dt->filter('GroupBy', array(
42
  'label',
48
  }
49
  ));
50
  }
51
+ });
52
 
53
  // apply filter on the whole datatable in order the inline search to work (searches are done on "beautiful" label)
54
  $dataTable->filter('AddSegmentValue');
90
  $separator = Archiver::LOCATION_SEPARATOR;
91
  $unk = Visit::UNKNOWN_CODE;
92
 
93
+ $dataTable->filter(function(DataTable $dt) use ($period, $date, $separator, $unk) {
 
 
 
 
 
 
94
  $archiveDate = $dt->getMetadata(DataTable::ARCHIVED_DATE_METADATA_NAME);
95
 
96
  // convert fips region codes to iso if required
128
  }
129
  ));
130
  }
131
+ });
132
 
133
  $segments = array('regionCode', 'countryCode');
134
  $dataTable->filter('AddSegmentByLabel', array($segments, Archiver::LOCATION_SEPARATOR));
175
  $separator = Archiver::LOCATION_SEPARATOR;
176
  $unk = Visit::UNKNOWN_CODE;
177
 
178
+ $dataTable->filter(function(DataTable $dt) use ($period, $date, $separator, $unk) {
 
 
 
 
 
 
179
  $archiveDate = $dt->getMetadata(DataTable::ARCHIVED_DATE_METADATA_NAME);
180
 
181
  // convert fips region codes to iso if required
213
  }
214
  ));
215
  }
216
+ });
217
 
218
  $segments = array('city', 'regionCode', 'countryCode');
219
  $dataTable->filter('AddSegmentByLabel', array($segments, Archiver::LOCATION_SEPARATOR));
app/plugins/UserCountry/LocationProvider.php CHANGED
@@ -311,16 +311,17 @@ abstract class LocationProvider
311
  $info['isVisible'] = $provider->isVisible();
312
  $info['usageWarning'] = $provider->getUsageWarning();
313
 
314
- $allInfo[$info['order']] = $info;
315
  }
316
 
317
- ksort($allInfo);
 
 
 
 
 
318
 
319
- $result = array();
320
- foreach ($allInfo as $info) {
321
- $result[$info['id']] = $info;
322
- }
323
- return $result;
324
  }
325
 
326
  /**
311
  $info['isVisible'] = $provider->isVisible();
312
  $info['usageWarning'] = $provider->getUsageWarning();
313
 
314
+ $allInfo[$info['id']] = $info;
315
  }
316
 
317
+ uasort($allInfo, function($a, $b) {
318
+ if ($a['order'] == $b['order']) {
319
+ return strcmp($a['id'], $b['id']);
320
+ }
321
+ return $a['order'] - $b['order'];
322
+ });
323
 
324
+ return $allInfo;
 
 
 
 
325
  }
326
 
327
  /**
app/plugins/UsersManager/API.php CHANGED
@@ -25,11 +25,13 @@ use Piwik\NoAccessException;
25
  use Piwik\Option;
26
  use Piwik\Piwik;
27
  use Piwik\Plugin;
 
28
  use Piwik\Plugins\Login\PasswordVerifier;
29
  use Piwik\SettingsPiwik;
30
  use Piwik\Site;
31
  use Piwik\Tracker\Cache;
32
  use Piwik\View;
 
33
 
34
  /**
35
  * The UsersManager API lets you Manage Users and their permissions to access specific websites.
@@ -364,7 +366,7 @@ class API extends \Piwik\Plugin\API
364
  return [];
365
 
366
  } else {
367
- list($users, $totalResults) = $this->model->getUsersWithRole($idSite, $limit, $offset, $filter_search, $filter_access, $loginsToLimit);
368
 
369
  foreach ($users as &$user) {
370
  $user['superuser_access'] = $user['superuser_access'] == 1;
@@ -372,7 +374,7 @@ class API extends \Piwik\Plugin\API
372
  $user['role'] = 'superuser';
373
  $user['capabilities'] = [];
374
  } else {
375
- list($user['role'], $user['capabilities']) = $this->getRoleAndCapabilitiesFromAccess($user['access']);
376
  $user['role'] = empty($user['role']) ? 'noaccess' : reset($user['role']);
377
  }
378
 
@@ -460,21 +462,41 @@ class API extends \Piwik\Plugin\API
460
  return $userSites;
461
  }
462
 
 
 
 
 
 
 
463
  private function checkAccessType($access)
464
  {
465
  $access = (array) $access;
466
 
467
- $roles = $this->roleProvider->getAllRoleIds();
468
- $capabilities = $this->capabilityProvider->getAllCapabilityIds();
469
- $list = array_merge($roles, $capabilities);
470
-
471
  foreach ($access as $entry) {
472
- if (!in_array($entry, $list, true)) {
473
- throw new Exception(Piwik::translate("UsersManager_ExceptionAccessValues", implode(", ", $list), $entry));
474
  }
475
  }
476
  }
477
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
  /**
479
  * For each user, returns their access level for the given $idSite.
480
  * If a user doesn't have any access to the $idSite ('noaccess'),
@@ -590,9 +612,9 @@ class API extends \Piwik\Plugin\API
590
  }
591
  }
592
 
593
- list($sites, $totalResults) = $this->model->getSitesAccessFromUserWithFilters($userLogin, $limit, $offset, $filter_search, $filter_access, $idSites);
594
  foreach ($sites as &$siteAccess) {
595
- list($siteAccess['role'], $siteAccess['capabilities']) = $this->getRoleAndCapabilitiesFromAccess($siteAccess['access']);
596
  $siteAccess['role'] = empty($siteAccess['role']) ? 'noaccess' : reset($siteAccess['role']);
597
  unset($siteAccess['access']);
598
  }
@@ -665,7 +687,7 @@ class API extends \Piwik\Plugin\API
665
  throw new Exception(Piwik::translate('UsersManager_ExceptionEmailExists', $email));
666
  }
667
 
668
- if ($userLogin && Common::mb_strtolower($userLogin) !== Common::mb_strtolower($email) && $this->userExists($email)) {
669
  throw new Exception(Piwik::translate('UsersManager_ExceptionEmailExistsAsLogin', $email));
670
  }
671
 
@@ -722,6 +744,14 @@ class API extends \Piwik\Plugin\API
722
 
723
  $this->model->addUser($userLogin, $passwordTransformed, $email, Date::now()->getDatetime());
724
 
 
 
 
 
 
 
 
 
725
  // we reload the access list which doesn't yet take in consideration this new user
726
  Access::getInstance()->reloadAccess();
727
  Cache::deleteTrackerCache();
@@ -927,7 +957,7 @@ class API extends \Piwik\Plugin\API
927
  $email = $userInfo['email'];
928
  }
929
 
930
- $hasEmailChanged = Common::mb_strtolower($email) !== Common::mb_strtolower($userInfo['email']);
931
 
932
  if ($hasEmailChanged) {
933
  $this->checkEmail($email, $userLogin);
@@ -988,6 +1018,14 @@ class API extends \Piwik\Plugin\API
988
  $this->model->deleteUserOptions($userLogin);
989
  $this->model->deleteUserAccess($userLogin);
990
 
 
 
 
 
 
 
 
 
991
  Cache::deleteTrackerCache();
992
  }
993
 
@@ -1084,7 +1122,7 @@ class API extends \Piwik\Plugin\API
1084
 
1085
  if (is_array($access)) {
1086
  // we require one role, and optionally multiple capabilities
1087
- list($roles, $capabilities) = $this->getRoleAndCapabilitiesFromAccess($access);
1088
 
1089
  if (count($roles) < 1) {
1090
  $ids = implode(', ', $this->roleProvider->getAllRoleIds());
@@ -1157,7 +1195,7 @@ class API extends \Piwik\Plugin\API
1157
  $this->capabilityProvider->checkValidCapability($entry);
1158
  }
1159
 
1160
- list($sitesIdWithRole, $sitesIdWithCapability) = $this->getRolesAndCapabilitiesForLogin($userLogin);
1161
 
1162
  foreach ($capabilities as $entry) {
1163
  $cap = $this->capabilityProvider->getCapability($entry);
@@ -1430,8 +1468,9 @@ class API extends \Piwik\Plugin\API
1430
  if ($this->roleProvider->isValidRole($entry)) {
1431
  $roles[] = $entry;
1432
  } else {
1433
- $this->checkAccessType($entry);
1434
- $capabilities[] = $entry;
 
1435
  }
1436
  }
1437
  return [$roles, $capabilities];
25
  use Piwik\Option;
26
  use Piwik\Piwik;
27
  use Piwik\Plugin;
28
+ use Piwik\Plugins\CoreAdminHome\Emails\UserCreatedEmail;
29
  use Piwik\Plugins\Login\PasswordVerifier;
30
  use Piwik\SettingsPiwik;
31
  use Piwik\Site;
32
  use Piwik\Tracker\Cache;
33
  use Piwik\View;
34
+ use Piwik\Plugins\CoreAdminHome\Emails\UserDeletedEmail;
35
 
36
  /**
37
  * The UsersManager API lets you Manage Users and their permissions to access specific websites.
366
  return [];
367
 
368
  } else {
369
+ [$users, $totalResults] = $this->model->getUsersWithRole($idSite, $limit, $offset, $filter_search, $filter_access, $loginsToLimit);
370
 
371
  foreach ($users as &$user) {
372
  $user['superuser_access'] = $user['superuser_access'] == 1;
374
  $user['role'] = 'superuser';
375
  $user['capabilities'] = [];
376
  } else {
377
+ [$user['role'], $user['capabilities']] = $this->getRoleAndCapabilitiesFromAccess($user['access']);
378
  $user['role'] = empty($user['role']) ? 'noaccess' : reset($user['role']);
379
  }
380
 
462
  return $userSites;
463
  }
464
 
465
+ /**
466
+ * Throws an exception if one of the given access types does not exists.
467
+ *
468
+ * @param string|array $access
469
+ * @throws Exception
470
+ */
471
  private function checkAccessType($access)
472
  {
473
  $access = (array) $access;
474
 
 
 
 
 
475
  foreach ($access as $entry) {
476
+ if (!$this->isValidAccessType($entry)) {
477
+ throw new Exception(Piwik::translate("UsersManager_ExceptionAccessValues", [implode(", ", $this->getAllRolesAndCapabilities()), $entry]));
478
  }
479
  }
480
  }
481
 
482
+ /**
483
+ * returns if the given access type exists
484
+ *
485
+ * @param string $access
486
+ * @return bool
487
+ */
488
+ private function isValidAccessType($access)
489
+ {
490
+ return in_array($access, $this->getAllRolesAndCapabilities(), true);
491
+ }
492
+
493
+ private function getAllRolesAndCapabilities()
494
+ {
495
+ $roles = $this->roleProvider->getAllRoleIds();
496
+ $capabilities = $this->capabilityProvider->getAllCapabilityIds();
497
+ return array_merge($roles, $capabilities);
498
+ }
499
+
500
  /**
501
  * For each user, returns their access level for the given $idSite.
502
  * If a user doesn't have any access to the $idSite ('noaccess'),
612
  }
613
  }
614
 
615
+ [$sites, $totalResults] = $this->model->getSitesAccessFromUserWithFilters($userLogin, $limit, $offset, $filter_search, $filter_access, $idSites);
616
  foreach ($sites as &$siteAccess) {
617
+ [$siteAccess['role'], $siteAccess['capabilities']] = $this->getRoleAndCapabilitiesFromAccess($siteAccess['access']);
618
  $siteAccess['role'] = empty($siteAccess['role']) ? 'noaccess' : reset($siteAccess['role']);
619
  unset($siteAccess['access']);
620
  }
687
  throw new Exception(Piwik::translate('UsersManager_ExceptionEmailExists', $email));
688
  }
689
 
690
+ if ($userLogin && mb_strtolower($userLogin) !== mb_strtolower($email) && $this->userExists($email)) {
691
  throw new Exception(Piwik::translate('UsersManager_ExceptionEmailExistsAsLogin', $email));
692
  }
693
 
744
 
745
  $this->model->addUser($userLogin, $passwordTransformed, $email, Date::now()->getDatetime());
746
 
747
+ $container = StaticContainer::getContainer();
748
+ $mail = $container->make(UserCreatedEmail::class, array(
749
+ 'login' => Piwik::getCurrentUserLogin(),
750
+ 'emailAddress' => Piwik::getCurrentUserEmail(),
751
+ 'userLogin' => $userLogin
752
+ ));
753
+ $mail->safeSend();
754
+
755
  // we reload the access list which doesn't yet take in consideration this new user
756
  Access::getInstance()->reloadAccess();
757
  Cache::deleteTrackerCache();
957
  $email = $userInfo['email'];
958
  }
959
 
960
+ $hasEmailChanged = mb_strtolower($email) !== mb_strtolower($userInfo['email']);
961
 
962
  if ($hasEmailChanged) {
963
  $this->checkEmail($email, $userLogin);
1018
  $this->model->deleteUserOptions($userLogin);
1019
  $this->model->deleteUserAccess($userLogin);
1020
 
1021
+ $container = StaticContainer::getContainer();
1022
+ $email = $container->make(UserDeletedEmail::class, array(
1023
+ 'login' => Piwik::getCurrentUserLogin(),
1024
+ 'emailAddress' => Piwik::getCurrentUserEmail(),
1025
+ 'userLogin' => $userLogin
1026
+ ));
1027
+ $email->safeSend();
1028
+
1029
  Cache::deleteTrackerCache();
1030
  }
1031
 
1122
 
1123
  if (is_array($access)) {
1124
  // we require one role, and optionally multiple capabilities
1125
+ [$roles, $capabilities] = $this->getRoleAndCapabilitiesFromAccess($access);
1126
 
1127
  if (count($roles) < 1) {
1128
  $ids = implode(', ', $this->roleProvider->getAllRoleIds());
1195
  $this->capabilityProvider->checkValidCapability($entry);
1196
  }
1197
 
1198
+ [$sitesIdWithRole, $sitesIdWithCapability] = $this->getRolesAndCapabilitiesForLogin($userLogin);
1199
 
1200
  foreach ($capabilities as $entry) {
1201
  $cap = $this->capabilityProvider->getCapability($entry);
1468
  if ($this->roleProvider->isValidRole($entry)) {
1469
  $roles[] = $entry;
1470
  } else {
1471
+ if ($this->isValidAccessType($entry)) {
1472
+ $capabilities[] = $entry;
1473
+ }
1474
  }
1475
  }
1476
  return [$roles, $capabilities];
app/plugins/UsersManager/Controller.php CHANGED
@@ -35,6 +35,8 @@ use Piwik\Validators\CharacterLength;
35
  use Piwik\Validators\NotEmpty;
36
  use Piwik\View;
37
  use Piwik\Session\SessionInitializer;
 
 
38
 
39
  class Controller extends ControllerAdmin
40
  {
@@ -330,12 +332,29 @@ class Controller extends ControllerAdmin
330
  $notification->context = Notification::CONTEXT_SUCCESS;
331
  Notification\Manager::notify('successdeletetokens', $notification);
332
 
 
 
 
 
 
 
 
 
333
  } elseif (is_numeric($idTokenAuth)) {
 
334
  $this->userModel->deleteToken($idTokenAuth, Piwik::getCurrentUserLogin());
335
 
336
  $notification = new Notification(Piwik::translate('UsersManager_TokenSuccessfullyDeleted'));
337
  $notification->context = Notification::CONTEXT_SUCCESS;
338
  Notification\Manager::notify('successdeletetoken', $notification);
 
 
 
 
 
 
 
 
339
  }
340
  }
341
 
@@ -367,6 +386,14 @@ class Controller extends ControllerAdmin
367
 
368
  $this->userModel->addTokenAuth($login, $generatedToken, $description, Date::now()->getDatetime());
369
 
 
 
 
 
 
 
 
 
370
  return $this->renderTemplate('addNewTokenSuccess', array('generatedToken' => $generatedToken));
371
  } elseif (isset($_POST['description'])) {
372
  $noDescription = true;
35
  use Piwik\Validators\NotEmpty;
36
  use Piwik\View;
37
  use Piwik\Session\SessionInitializer;
38
+ use Piwik\Plugins\CoreAdminHome\Emails\TokenAuthCreatedEmail;
39
+ use Piwik\Plugins\CoreAdminHome\Emails\TokenAuthDeletedEmail;
40
 
41
  class Controller extends ControllerAdmin
42
  {
332
  $notification->context = Notification::CONTEXT_SUCCESS;
333
  Notification\Manager::notify('successdeletetokens', $notification);
334
 
335
+ $container = StaticContainer::getContainer();
336
+ $email = $container->make(TokenAuthDeletedEmail::class, array(
337
+ 'login' => Piwik::getCurrentUserLogin(),
338
+ 'emailAddress' => Piwik::getCurrentUserEmail(),
339
+ 'tokenDescription' => '',
340
+ 'all' => true
341
+ ));
342
+ $email->safeSend();
343
  } elseif (is_numeric($idTokenAuth)) {
344
+ $description = $this->userModel->getUserTokenDescriptionByIdTokenAuth($idTokenAuth, Piwik::getCurrentUserLogin());
345
  $this->userModel->deleteToken($idTokenAuth, Piwik::getCurrentUserLogin());
346
 
347
  $notification = new Notification(Piwik::translate('UsersManager_TokenSuccessfullyDeleted'));
348
  $notification->context = Notification::CONTEXT_SUCCESS;
349
  Notification\Manager::notify('successdeletetoken', $notification);
350
+
351
+ $container = StaticContainer::getContainer();
352
+ $email = $container->make(TokenAuthDeletedEmail::class, array(
353
+ 'login' => Piwik::getCurrentUserLogin(),
354
+ 'emailAddress' => Piwik::getCurrentUserEmail(),
355
+ 'tokenDescription' => $description
356
+ ));
357
+ $email->safeSend();
358
  }
359
  }
360
 
386
 
387
  $this->userModel->addTokenAuth($login, $generatedToken, $description, Date::now()->getDatetime());
388
 
389
+ $container = StaticContainer::getContainer();
390
+ $email = $container->make(TokenAuthCreatedEmail::class, array(
391
+ 'login' => Piwik::getCurrentUserLogin(),
392
+ 'emailAddress' => Piwik::getCurrentUserEmail(),
393
+ 'tokenDescription' => $description
394
+ ));
395
+ $email->safeSend();
396
+
397
  return $this->renderTemplate('addNewTokenSuccess', array('generatedToken' => $generatedToken));
398
  } elseif (isset($_POST['description'])) {
399
  $noDescription = true;
app/plugins/UsersManager/Model.php CHANGED
@@ -316,6 +316,15 @@ class Model
316
  return $db->fetchRow("SELECT * FROM " . $this->tokenTable . " WHERE `password` = ?", $tokenAuth);
317
  }
318
 
 
 
 
 
 
 
 
 
 
319
  private function getQueryNotExpiredToken()
320
  {
321
  return array(
316
  return $db->fetchRow("SELECT * FROM " . $this->tokenTable . " WHERE `password` = ?", $tokenAuth);
317
  }
318
 
319
+ public function getUserTokenDescriptionByIdTokenAuth($idTokenAuth, $login)
320
+ {
321
+ $db = $this->getDb();
322
+
323
+ $token = $db->fetchRow("SELECT description FROM " . $this->tokenTable . " WHERE `idusertokenauth` = ? and login = ? LIMIT 1", array($idTokenAuth, $login));
324
+
325
+ return $token ? $token['description'] : '';
326
+ }
327
+
328
  private function getQueryNotExpiredToken()
329
  {
330
  return array(
app/plugins/UsersManager/UsersManager.php CHANGED
@@ -194,7 +194,7 @@ class UsersManager extends \Piwik\Plugin
194
  if (!self::isValidPasswordString($password)) {
195
  throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPassword', array(self::PASSWORD_MIN_LENGTH)));
196
  }
197
- if (Common::mb_strlen($password) > self::PASSWORD_MAX_LENGTH) {
198
  throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPasswordTooLong', array(self::PASSWORD_MAX_LENGTH)));
199
  }
200
  }
194
  if (!self::isValidPasswordString($password)) {
195
  throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPassword', array(self::PASSWORD_MIN_LENGTH)));
196
  }
197
+ if (mb_strlen($password) > self::PASSWORD_MAX_LENGTH) {
198
  throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPasswordTooLong', array(self::PASSWORD_MAX_LENGTH)));
199
  }
200
  }
app/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInite0aec6a19cacb137658cbe05ff4a49c8::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit9209fd533b4c3cc6523ff4b3463ad39c::getLoader();
app/vendor/composer/ClassLoader.php CHANGED
@@ -338,7 +338,7 @@ class ClassLoader
338
  * Loads the given class or interface.
339
  *
340
  * @param string $class The name of the class
341
- * @return bool|null True if loaded, null otherwise
342
  */
343
  public function loadClass($class)
344
  {
@@ -347,6 +347,8 @@ class ClassLoader
347
 
348
  return true;
349
  }
 
 
350
  }
351
 
352
  /**
338
  * Loads the given class or interface.
339
  *
340
  * @param string $class The name of the class
341
+ * @return true|null True if loaded, null otherwise
342
  */
343
  public function loadClass($class)
344
  {
347
 
348
  return true;
349
  }
350
+
351
+ return null;
352
  }
353
 
354
  /**
app/vendor/composer/InstalledVersions.php CHANGED
@@ -1,732 +1,337 @@
1
  <?php
2
 
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
 
13
  namespace Composer;
14
 
15
  use Composer\Autoload\ClassLoader;
16
  use Composer\Semver\VersionParser;
17
 
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
  class InstalledVersions
26
  {
27
- private static $installed = array (
28
- 'root' =>
29
- array (
30
- 'pretty_version' => '4.3.1-rc1',
31
- 'version' => '4.3.1.0-RC1',
32
- 'aliases' =>
33
- array (
34
- ),
35
- 'reference' => '440965f7c0d48e5a5081a33ce30c6f38822e64f1',
36
- 'name' => 'matomo/matomo',
37
- ),
38
- 'versions' =>
39
- array (
40
- 'composer/ca-bundle' =>
41
- array (
42
- 'pretty_version' => '1.2.8',
43
- 'version' => '1.2.8.0',
44
- 'aliases' =>
45
- array (
46
- ),
47
- 'reference' => '8a7ecad675253e4654ea05505233285377405215',
48
- ),
49
- 'composer/semver' =>
50
- array (
51
- 'pretty_version' => '1.3.0',
52
- 'version' => '1.3.0.0',
53
- 'aliases' =>
54
- array (
55
- ),
56
- 'reference' => 'df4463baa9f44fe6cf0a6da4fde2934d4c0a2747',
57
- ),
58
- 'davaxi/sparkline' =>
59
- array (
60
- 'pretty_version' => '1.2.2',
61
- 'version' => '1.2.2.0',
62
- 'aliases' =>
63
- array (
64
- ),
65
- 'reference' => '380d447fcfc6468f7d8e5c041e8c01b8ec969959',
66
- ),
67
- 'doctrine/cache' =>
68
- array (
69
- 'pretty_version' => '1.10.2',
70
- 'version' => '1.10.2.0',
71
- 'aliases' =>
72
- array (
73
- ),
74
- 'reference' => '13e3381b25847283a91948d04640543941309727',
75
- ),
76
- 'geoip2/geoip2' =>
77
- array (
78
- 'pretty_version' => 'v2.11.0',
79
- 'version' => '2.11.0.0',
80
- 'aliases' =>
81
- array (
82
- ),
83
- 'reference' => 'd01be5894a5c1a3381c58c9b1795cd07f96c30f7',
84
- ),
85
- 'matomo/cache' =>
86
- array (
87
- 'pretty_version' => '2.0.2',
88
- 'version' => '2.0.2.0',
89
- 'aliases' =>
90
- array (
91
- ),
92
- 'reference' => '01e82b9dc0f2f8b0ee070212b0e9e91045f60926',
93
- ),
94
- 'matomo/decompress' =>
95
- array (
96
- 'pretty_version' => '2.1.0',
97
- 'version' => '2.1.0.0',
98
- 'aliases' =>
99
- array (
100
- ),
101
- 'reference' => '44dcf77dcd633a9c336f90d80658ad3d25225e05',
102
- ),
103
- 'matomo/device-detector' =>
104
- array (
105
- 'pretty_version' => '4.2.3',
106
- 'version' => '4.2.3.0',
107
- 'aliases' =>
108
- array (
109
- ),
110
- 'reference' => 'd879f07496d6e6ee89cef5bcd925383d9b0c2cc0',
111
- ),
112
- 'matomo/ini' =>
113
- array (
114
- 'pretty_version' => '2.0.2',
115
- 'version' => '2.0.2.0',
116
- 'aliases' =>
117
- array (
118
- ),
119
- 'reference' => 'f7b0d6ce594b34ead16864fbc5062c771328ac31',
120
- ),
121
- 'matomo/matomo' =>
122
- array (
123
- 'pretty_version' => '4.3.1-rc1',
124
- 'version' => '4.3.1.0-RC1',
125
- 'aliases' =>
126
- array (
127
- ),
128
- 'reference' => '440965f7c0d48e5a5081a33ce30c6f38822e64f1',
129
- ),
130
- 'matomo/matomo-php-tracker' =>
131
- array (
132
- 'pretty_version' => '3.0.0',
133
- 'version' => '3.0.0.0',
134
- 'aliases' =>
135
- array (
136
- ),
137
- 'reference' => '31e2b0bdf479c6fc00758228d2c6d7c85c1863a0',
138
- ),
139
- 'matomo/network' =>
140
- array (
141
- 'pretty_version' => '2.0.1',
142
- 'version' => '2.0.1.0',
143
- 'aliases' =>
144
- array (
145
- ),
146
- 'reference' => 'ff654b8fc7778b80279815d06a368f7b41249501',
147
- ),
148
- 'matomo/referrer-spam-blacklist' =>
149
- array (
150
- 'replaced' =>
151
- array (
152
- 0 => '*',
153
- ),
154
- ),
155
- 'matomo/referrer-spam-list' =>
156
- array (
157
- 'pretty_version' => '4.0.0',
158
- 'version' => '4.0.0.0',
159
- 'aliases' =>
160
- array (
161
- ),
162
- 'reference' => 'afe4c1ea107ee7a8915a0d5eb0031cf0366608a8',
163
- ),
164
- 'matomo/searchengine-and-social-list' =>
165
- array (
166
- 'pretty_version' => '3.11.0',
167
- 'version' => '3.11.0.0',
168
- 'aliases' =>
169
- array (
170
- ),
171
- 'reference' => '80ab98ed17ea5b72730f4f4d96acc03847440103',
172
- ),
173
- 'maxmind-db/reader' =>
174
- array (
175
- 'pretty_version' => 'v1.8.0',
176
- 'version' => '1.8.0.0',
177
- 'aliases' =>
178
- array (
179
- ),
180
- 'reference' => 'b566d429ac9aec10594b0935be8ff38302f8d5c8',
181
- ),
182
- 'maxmind/web-service-common' =>
183
- array (
184
- 'pretty_version' => 'v0.8.1',
185
- 'version' => '0.8.1.0',
186
- 'aliases' =>
187
- array (
188
- ),
189
- 'reference' => '32f274051c543fc865e5a84d3a2c703913641ea8',
190
- ),
191
- 'monolog/monolog' =>
192
- array (
193
- 'pretty_version' => '1.25.5',
194
- 'version' => '1.25.5.0',
195
- 'aliases' =>
196
- array (
197
- ),
198
- 'reference' => '1817faadd1846cd08be9a49e905dc68823bc38c0',
199
- ),
200
- 'mustangostang/spyc' =>
201
- array (
202
- 'pretty_version' => '0.6.3',
203
- 'version' => '0.6.3.0',
204
- 'aliases' =>
205
- array (
206
- ),
207
- 'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
208
- ),
209
- 'opis/closure' =>
210
- array (
211
- 'pretty_version' => '3.6.1',
212
- 'version' => '3.6.1.0',
213
- 'aliases' =>
214
- array (
215
- ),
216
- 'reference' => '943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5',
217
- ),
218
- 'pear/archive_tar' =>
219
- array (
220
- 'pretty_version' => '1.4.13',
221
- 'version' => '1.4.13.0',
222
- 'aliases' =>
223
- array (
224
- ),
225
- 'reference' => '2b87b41178cc6d4ad3cba678a46a1cae49786011',
226
- ),
227
- 'pear/console_getopt' =>
228
- array (
229
- 'pretty_version' => 'v1.4.3',
230
- 'version' => '1.4.3.0',
231
- 'aliases' =>
232
- array (
233
- ),
234
- 'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0',
235
- ),
236
- 'pear/pear-core-minimal' =>
237
- array (
238
- 'pretty_version' => 'v1.10.10',
239
- 'version' => '1.10.10.0',
240
- 'aliases' =>
241
- array (
242
- ),
243
- 'reference' => '625a3c429d9b2c1546438679074cac1b089116a7',
244
- ),
245
- 'pear/pear_exception' =>
246
- array (
247
- 'pretty_version' => 'v1.0.1',
248
- 'version' => '1.0.1.0',
249
- 'aliases' =>
250
- array (
251
- ),
252
- 'reference' => 'dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7',
253
- ),
254
- 'php-di/invoker' =>
255
- array (
256
- 'pretty_version' => '2.0.0',
257
- 'version' => '2.0.0.0',
258
- 'aliases' =>
259
- array (
260
- ),
261
- 'reference' => '540c27c86f663e20fe39a24cd72fa76cdb21d41a',
262
- ),
263
- 'php-di/php-di' =>
264
- array (
265
- 'pretty_version' => '6.3.0',
266
- 'version' => '6.3.0.0',
267
- 'aliases' =>
268
- array (
269
- ),
270
- 'reference' => '955cacea6b0beaba07e8c11b8367f5b3d5abe89f',
271
- ),
272
- 'php-di/phpdoc-reader' =>
273
- array (
274
- 'pretty_version' => '2.2.1',
275
- 'version' => '2.2.1.0',
276
- 'aliases' =>
277
- array (
278
- ),
279
- 'reference' => '66daff34cbd2627740ffec9469ffbac9f8c8185c',
280
- ),
281
- 'phpmailer/phpmailer' =>
282
- array (
283
- 'pretty_version' => 'v6.4.1',
284
- 'version' => '6.4.1.0',
285
- 'aliases' =>
286
- array (
287
- ),
288
- 'reference' => '9256f12d8fb0cd0500f93b19e18c356906cbed3d',
289
- ),
290
- 'piwik/device-detector' =>
291
- array (
292
- 'replaced' =>
293
- array (
294
- 0 => '4.2.3',
295
- ),
296
- ),
297
- 'piwik/referrer-spam-blacklist' =>
298
- array (
299
- 'replaced' =>
300
- array (
301
- 0 => '*',
302
- ),
303
- ),
304
- 'piwik/searchengine-and-social-list' =>
305
- array (
306
- 'replaced' =>
307
- array (
308
- 0 => '*',
309
- ),
310
- ),
311
- 'psr/container' =>
312
- array (
313
- 'pretty_version' => '1.0.0',
314
- 'version' => '1.0.0.0',
315
- 'aliases' =>
316
- array (
317
- ),
318
- 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f',
319
- ),
320
- 'psr/container-implementation' =>
321
- array (
322
- 'provided' =>
323
- array (
324
- 0 => '^1.0',
325
- ),
326
- ),
327
- 'psr/log' =>
328
- array (
329
- 'pretty_version' => '1.1.3',
330
- 'version' => '1.1.3.0',
331
- 'aliases' =>
332
- array (
333
- ),
334
- 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc',
335
- ),
336
- 'psr/log-implementation' =>
337
- array (
338
- 'provided' =>
339
- array (
340
- 0 => '1.0.0',
341
- ),
342
- ),
343
- 'rsky/pear-core-min' =>
344
- array (
345
- 'replaced' =>
346
- array (
347
- 0 => 'v1.10.10',
348
- ),
349
- ),
350
- 'symfony/console' =>
351
- array (
352
- 'pretty_version' => 'v2.6.13',
353
- 'version' => '2.6.13.0',
354
- 'aliases' =>
355
- array (
356
- ),
357
- 'reference' => '0e5e18ae09d3f5c06367759be940e9ed3f568359',
358
- ),
359
- 'symfony/event-dispatcher' =>
360
- array (
361
- 'pretty_version' => 'v2.6.13',
362
- 'version' => '2.6.13.0',
363
- 'aliases' =>
364
- array (
365
- ),
366
- 'reference' => '672593bc4b0043a0acf91903bb75a1c82d8f2e02',
367
- ),
368
- 'symfony/monolog-bridge' =>
369
- array (
370
- 'pretty_version' => 'v2.6.13',
371
- 'version' => '2.6.13.0',
372
- 'aliases' =>
373
- array (
374
- ),
375
- 'reference' => 'ba66eeabaa004e3ab70764cab59b056b182aa535',
376
- ),
377
- 'symfony/polyfill-ctype' =>
378
- array (
379
- 'pretty_version' => 'v1.20.0',
380
- 'version' => '1.20.0.0',
381
- 'aliases' =>
382
- array (
383
- ),
384
- 'reference' => 'f4ba089a5b6366e453971d3aad5fe8e897b37f41',
385
- ),
386
- 'symfony/polyfill-mbstring' =>
387
- array (
388
- 'pretty_version' => 'v1.20.0',
389
- 'version' => '1.20.0.0',
390
- 'aliases' =>
391
- array (
392
- ),
393
- 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531',
394
- ),
395
- 'symfony/polyfill-php54' =>
396
- array (
397
- 'replaced' =>
398
- array (
399
- 0 => '*',
400
- ),
401
- ),
402
- 'symfony/polyfill-php55' =>
403
- array (
404
- 'replaced' =>
405
- array (
406
- 0 => '*',
407
- ),
408
- ),
409
- 'symfony/polyfill-php56' =>
410
- array (
411
- 'replaced' =>
412
- array (
413
- 0 => '*',
414
- ),
415
- ),
416
- 'symfony/polyfill-php70' =>
417
- array (
418
- 'replaced' =>
419
- array (
420
- 0 => '*',
421
- ),
422
- ),
423
- 'symfony/polyfill-php71' =>
424
- array (
425
- 'replaced' =>
426
- array (
427
- 0 => '*',
428
- ),
429
- ),
430
- 'symfony/polyfill-php72' =>
431
- array (
432
- 'replaced' =>
433
- array (
434
- 0 => '*',
435
- ),
436
- ),
437
- 'szymach/c-pchart' =>
438
- array (
439
- 'pretty_version' => 'v2.0.12',
440
- 'version' => '2.0.12.0',
441
- 'aliases' =>
442
- array (
443
- ),
444
- 'reference' => 'f5fad68b303f65225db1a3d3f4bb58aea7a418b4',
445
- ),
446
- 'tecnickcom/tcpdf' =>
447
- array (
448
- 'pretty_version' => '6.4.1',
449
- 'version' => '6.4.1.0',
450
- 'aliases' =>
451
- array (
452
- ),
453
- 'reference' => '5ba838befdb37ef06a16d9f716f35eb03cb1b329',
454
- ),
455
- 'tedivm/jshrink' =>
456
- array (
457
- 'pretty_version' => 'v1.4.0',
458
- 'version' => '1.4.0.0',
459
- 'aliases' =>
460
- array (
461
- ),
462
- 'reference' => '0513ba1407b1f235518a939455855e6952a48bbc',
463
- ),
464
- 'twig/twig' =>
465
- array (
466
- 'pretty_version' => 'v3.1.1',
467
- 'version' => '3.1.1.0',
468
- 'aliases' =>
469
- array (
470
- ),
471
- 'reference' => 'b02fa41f3783a2616eccef7b92fbc2343ffed737',
472
- ),
473
- 'wikimedia/less.php' =>
474
- array (
475
- 'pretty_version' => 'v3.1.0',
476
- 'version' => '3.1.0.0',
477
- 'aliases' =>
478
- array (
479
- ),
480
- 'reference' => 'a486d78b9bd16b72f237fc6093aa56d69ce8bd13',
481
- ),
482
- ),
483
- );
484
- private static $canGetVendors;
485
- private static $installedByVendor = array();
486
-
487
-
488
-
489
-
490
-
491
-
492
-
493
- public static function getInstalledPackages()
494
- {
495
- $packages = array();
496
- foreach (self::getInstalled() as $installed) {
497
- $packages[] = array_keys($installed['versions']);
498
- }
499
-
500
- if (1 === \count($packages)) {
501
- return $packages[0];
502
- }
503
-
504
- return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
505
- }
506
-
507
-
508
-
509
-
510
-
511
-
512
-
513
-
514
-
515
- public static function isInstalled($packageName)
516
- {
517
- foreach (self::getInstalled() as $installed) {
518
- if (isset($installed['versions'][$packageName])) {
519
- return true;
520
- }
521
- }
522
-
523
- return false;
524
- }
525
-
526
-
527
-
528
-
529
-
530
-
531
-
532
-
533
-
534
-
535
-
536
-
537
-
538
-
539
- public static function satisfies(VersionParser $parser, $packageName, $constraint)
540
- {
541
- $constraint = $parser->parseConstraints($constraint);
542
- $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
543
-
544
- return $provided->matches($constraint);
545
- }
546
-
547
-
548
-
549
-
550
-
551
-
552
-
553
-
554
-
555
-
556
- public static function getVersionRanges($packageName)
557
- {
558
- foreach (self::getInstalled() as $installed) {
559
- if (!isset($installed['versions'][$packageName])) {
560
- continue;
561
- }
562
-
563
- $ranges = array();
564
- if (isset($installed['versions'][$packageName]['pretty_version'])) {
565
- $ranges[] = $installed['versions'][$packageName]['pretty_version'];
566
- }
567
- if (array_key_exists('aliases', $installed['versions'][$packageName])) {
568
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
569
- }
570
- if (array_key_exists('replaced', $installed['versions'][$packageName])) {
571
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
572
- }
573
- if (array_key_exists('provided', $installed['versions'][$packageName])) {
574
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
575
- }
576
-
577
- return implode(' || ', $ranges);
578
- }
579
-
580
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
581
- }
582
-
583
-
584
-
585
-
586
-
587
- public static function getVersion($packageName)
588
- {
589
- foreach (self::getInstalled() as $installed) {
590
- if (!isset($installed['versions'][$packageName])) {
591
- continue;
592
- }
593
-
594
- if (!isset($installed['versions'][$packageName]['version'])) {
595
- return null;
596
- }
597
-
598
- return $installed['versions'][$packageName]['version'];
599
- }
600
-
601
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
602
- }
603
-
604
-
605
-
606
-
607
-
608
- public static function getPrettyVersion($packageName)
609
- {
610
- foreach (self::getInstalled() as $installed) {
611
- if (!isset($installed['versions'][$packageName])) {
612
- continue;
613
- }
614
-
615
- if (!isset($installed['versions'][$packageName]['pretty_version'])) {
616
- return null;
617
- }
618
-
619
- return $installed['versions'][$packageName]['pretty_version'];
620
- }
621
-
622
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
623
- }
624
-
625
-
626
-
627
-
628
-
629
- public static function getReference($packageName)
630
- {
631
- foreach (self::getInstalled() as $installed) {
632
- if (!isset($installed['versions'][$packageName])) {
633
- continue;
634
- }
635
-
636
- if (!isset($installed['versions'][$packageName]['reference'])) {
637
- return null;
638
- }
639
-
640
- return $installed['versions'][$packageName]['reference'];
641
- }
642
-
643
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
644
- }
645
-
646
-
647
-
648
-
649
-
650
- public static function getRootPackage()
651
- {
652
- $installed = self::getInstalled();
653
-
654
- return $installed[0]['root'];
655
- }
656
-
657
-
658
-
659
-
660
-
661
-
662
-
663
-
664
- public static function getRawData()
665
- {
666
- @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
667
-
668
- return self::$installed;
669
- }
670
-
671
-
672
-
673
-
674
-
675
-
676
-
677
- public static function getAllRawData()
678
- {
679
- return self::getInstalled();
680
- }
681
-
682
-
683
-
684
-
685
-
686
-
687
-
688
-
689
-
690
-
691
-
692
-
693
-
694
-
695
-
696
-
697
-
698
-
699
-
700
- public static function reload($data)
701
- {
702
- self::$installed = $data;
703
- self::$installedByVendor = array();
704
- }
705
-
706
-
707
-
708
-
709
-
710
- private static function getInstalled()
711
- {
712
- if (null === self::$canGetVendors) {
713
- self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
714
- }
715
-
716
- $installed = array();
717
-
718
- if (self::$canGetVendors) {
719
- foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
720
- if (isset(self::$installedByVendor[$vendorDir])) {
721
- $installed[] = self::$installedByVendor[$vendorDir];
722
- } elseif (is_file($vendorDir.'/composer/installed.php')) {
723
- $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
724
- }
725
- }
726
- }
727
-
728
- $installed[] = self::$installed;
729
-
730
- return $installed;
731
- }
732
  }
1
  <?php
2
 
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
 
13
  namespace Composer;
14
 
15
  use Composer\Autoload\ClassLoader;
16
  use Composer\Semver\VersionParser;
17
 
18
+ /**
19
+ * This class is copied in every Composer installed project and available to all
20
+ *
21
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
22
+ *
23
+ * To require it's presence, you can require `composer-runtime-api ^2.0`
24
+ */
25
  class InstalledVersions
26
  {
27
+ private static $installed;
28
+ private static $canGetVendors;
29
+ private static $installedByVendor = array();
30
+
31
+ /**
32
+ * Returns a list of all package names which are present, either by being installed, replaced or provided
33
+ *
34
+ * @return string[]
35
+ * @psalm-return list<string>
36
+ */
37
+ public static function getInstalledPackages()
38
+ {
39
+ $packages = array();
40
+ foreach (self::getInstalled() as $installed) {
41
+ $packages[] = array_keys($installed['versions']);
42
+ }
43
+
44
+ if (1 === \count($packages)) {
45
+ return $packages[0];
46
+ }
47
+
48
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
49
+ }
50
+
51
+ /**
52
+ * Returns a list of all package names with a specific type e.g. 'library'
53
+ *
54
+ * @param string $type
55
+ * @return string[]
56
+ * @psalm-return list<string>
57
+ */
58
+ public static function getInstalledPackagesByType($type)
59
+ {
60
+ $packagesByType = array();
61
+
62
+ foreach (self::getInstalled() as $installed) {
63
+ foreach ($installed['versions'] as $name => $package) {
64
+ if (isset($package['type']) && $package['type'] === $type) {
65
+ $packagesByType[] = $name;
66
+ }
67
+ }
68
+ }
69
+
70
+ return $packagesByType;
71
+ }
72
+
73
+ /**
74
+ * Checks whether the given package is installed
75
+ *
76
+ * This also returns true if the package name is provided or replaced by another package
77
+ *
78
+ * @param string $packageName
79
+ * @param bool $includeDevRequirements
80
+ * @return bool
81
+ */
82
+ public static function isInstalled($packageName, $includeDevRequirements = true)
83
+ {
84
+ foreach (self::getInstalled() as $installed) {
85
+ if (isset($installed['versions'][$packageName])) {
86
+ return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
87
+ }
88
+ }
89
+
90
+ return false;
91
+ }
92
+
93
+ /**
94
+ * Checks whether the given package satisfies a version constraint
95
+ *
96
+ * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
97
+ *
98
+ * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
99
+ *
100
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
101
+ * @param string $packageName
102
+ * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
103
+ * @return bool
104
+ */
105
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
106
+ {
107
+ $constraint = $parser->parseConstraints($constraint);
108
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
109
+
110
+ return $provided->matches($constraint);
111
+ }
112
+
113
+ /**
114
+ * Returns a version constraint representing all the range(s) which are installed for a given package
115
+ *
116
+ * It is easier to use this via isInstalled() with the $constraint argument if you need to check
117
+ * whether a given version of a package is installed, and not just whether it exists
118
+ *
119
+ * @param string $packageName
120
+ * @return string Version constraint usable with composer/semver
121
+ */
122
+ public static function getVersionRanges($packageName)
123
+ {
124
+ foreach (self::getInstalled() as $installed) {
125
+ if (!isset($installed['versions'][$packageName])) {
126
+ continue;
127
+ }
128
+
129
+ $ranges = array();
130
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
131
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
132
+ }
133
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
134
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
135
+ }
136
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
137
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
138
+ }
139
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
140
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
141
+ }
142
+
143
+ return implode(' || ', $ranges);
144
+ }
145
+
146
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
147
+ }
148
+
149
+ /**
150
+ * @param string $packageName
151
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
152
+ */
153
+ public static function getVersion($packageName)
154
+ {
155
+ foreach (self::getInstalled() as $installed) {
156
+ if (!isset($installed['versions'][$packageName])) {
157
+ continue;
158
+ }
159
+
160
+ if (!isset($installed['versions'][$packageName]['version'])) {
161
+ return null;
162
+ }
163
+
164
+ return $installed['versions'][$packageName]['version'];
165
+ }
166
+
167
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
168
+ }
169
+
170
+ /**
171
+ * @param string $packageName
172
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
173
+ */
174
+ public static function getPrettyVersion($packageName)
175
+ {
176
+ foreach (self::getInstalled() as $installed) {
177
+ if (!isset($installed['versions'][$packageName])) {
178
+ continue;
179
+ }
180
+
181
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
182
+ return null;
183
+ }
184
+
185
+ return $installed['versions'][$packageName]['pretty_version'];
186
+ }
187
+
188
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
189
+ }
190
+
191
+ /**
192
+ * @param string $packageName
193
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
194
+ */
195
+ public static function getReference($packageName)
196
+ {
197
+ foreach (self::getInstalled() as $installed) {
198
+ if (!isset($installed['versions'][$packageName])) {
199
+ continue;
200
+ }
201
+
202
+ if (!isset($installed['versions'][$packageName]['reference'])) {
203
+ return null;
204
+ }
205
+
206
+ return $installed['versions'][$packageName]['reference'];
207
+ }
208
+
209
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
210
+ }
211
+
212
+ /**
213
+ * @param string $packageName
214
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
215
+ */
216
+ public static function getInstallPath($packageName)
217
+ {
218
+ foreach (self::getInstalled() as $installed) {
219
+ if (!isset($installed['versions'][$packageName])) {
220
+ continue;
221
+ }
222
+
223
+ return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
224
+ }
225
+
226
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
227
+ }
228
+
229
+ /**
230
+ * @return array
231
+ * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}
232
+ */
233
+ public static function getRootPackage()
234
+ {
235
+ $installed = self::getInstalled();
236
+
237
+ return $installed[0]['root'];
238
+ }
239
+
240
+ /**
241
+ * Returns the raw installed.php data for custom implementations
242
+ *
243
+ * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
244
+ * @return array[]
245
+ * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}
246
+ */
247
+ public static function getRawData()
248
+ {
249
+ @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
250
+
251
+ if (null === self::$installed) {
252
+ // only require the installed.php file if this file is loaded from its dumped location,
253
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
254
+ if (substr(__DIR__, -8, 1) !== 'C') {
255
+ self::$installed = include __DIR__ . '/installed.php';
256
+ } else {
257
+ self::$installed = array();
258
+ }
259
+ }
260
+
261
+ return self::$installed;
262
+ }
263
+
264
+ /**
265
+ * Returns the raw data of all installed.php which are currently loaded for custom implementations
266
+ *
267
+ * @return array[]
268
+ * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
269
+ */
270
+ public static function getAllRawData()
271
+ {
272
+ return self::getInstalled();
273
+ }
274
+
275
+ /**
276
+ * Lets you reload the static array from another file
277
+ *
278
+ * This is only useful for complex integrations in which a project needs to use
279
+ * this class but then also needs to execute another project's autoloader in process,
280
+ * and wants to ensure both projects have access to their version of installed.php.
281
+ *
282
+ * A typical case would be PHPUnit, where it would need to make sure it reads all
283
+ * the data it needs from this class, then call reload() with
284
+ * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
285
+ * the project in which it runs can then also use this class safely, without
286
+ * interference between PHPUnit's dependencies and the project's dependencies.
287
+ *
288
+ * @param array[] $data A vendor/composer/installed.php data set
289
+ * @return void
290
+ *
291
+ * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>} $data
292
+ */
293
+ public static function reload($data)
294
+ {
295
+ self::$installed = $data;
296
+ self::$installedByVendor = array();
297
+ }
298
+
299
+ /**
300
+ * @return array[]
301
+ * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
302
+ */
303
+ private static function getInstalled()
304
+ {
305
+ if (null === self::$canGetVendors) {
306
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
307
+ }
308
+
309
+ $installed = array();
310
+
311
+ if (self::$canGetVendors) {
312
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
313
+ if (isset(self::$installedByVendor[$vendorDir])) {
314
+ $installed[] = self::$installedByVendor[$vendorDir];
315
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
316
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
317
+ if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
318
+ self::$installed = $installed[count($installed) - 1];
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ if (null === self::$installed) {
325
+ // only require the installed.php file if this file is loaded from its dumped location,
326
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
327
+ if (substr(__DIR__, -8, 1) !== 'C') {
328
+ self::$installed = require __DIR__ . '/installed.php';
329
+ } else {
330
+ self::$installed = array();
331
+ }
332
+ }
333
+ $installed[] = self::$installed;
334
+
335
+ return $installed;
336
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
337
  }
app/vendor/composer/autoload_classmap.php CHANGED
@@ -130,43 +130,44 @@ return array(
130
  'DeviceDetector\\Parser\\Device\\Mobile' => $vendorDir . '/matomo/device-detector/Parser/Device/Mobile.php',
131
  'DeviceDetector\\Parser\\Device\\Notebook' => $vendorDir . '/matomo/device-detector/Parser/Device/Notebook.php',
132
  'DeviceDetector\\Parser\\Device\\PortableMediaPlayer' => $vendorDir . '/matomo/device-detector/Parser/Device/PortableMediaPlayer.php',
 
133
  'DeviceDetector\\Parser\\OperatingSystem' => $vendorDir . '/matomo/device-detector/Parser/OperatingSystem.php',
134
  'DeviceDetector\\Parser\\VendorFragment' => $vendorDir . '/matomo/device-detector/Parser/VendorFragment.php',
135
  'DeviceDetector\\Yaml\\ParserInterface' => $vendorDir . '/matomo/device-detector/Yaml/ParserInterface.php',
136
  'DeviceDetector\\Yaml\\Pecl' => $vendorDir . '/matomo/device-detector/Yaml/Pecl.php',
137
  'DeviceDetector\\Yaml\\Spyc' => $vendorDir . '/matomo/device-detector/Yaml/Spyc.php',
138
  'DeviceDetector\\Yaml\\Symfony' => $vendorDir . '/matomo/device-detector/Yaml/Symfony.php',
139
- 'Doctrine\\Common\\Cache\\ApcCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php',
140
- 'Doctrine\\Common\\Cache\\ApcuCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php',
141
- 'Doctrine\\Common\\Cache\\ArrayCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php',
142
- 'Doctrine\\Common\\Cache\\Cache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php',
143
- 'Doctrine\\Common\\Cache\\CacheProvider' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php',
144
- 'Doctrine\\Common\\Cache\\ChainCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php',
145
- 'Doctrine\\Common\\Cache\\ClearableCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php',
146
- 'Doctrine\\Common\\Cache\\CouchbaseBucketCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseBucketCache.php',
147
- 'Doctrine\\Common\\Cache\\CouchbaseCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php',
148
- 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php',
149
- 'Doctrine\\Common\\Cache\\FileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php',
150
- 'Doctrine\\Common\\Cache\\FilesystemCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php',
151
- 'Doctrine\\Common\\Cache\\FlushableCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php',
152
- 'Doctrine\\Common\\Cache\\InvalidCacheId' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/InvalidCacheId.php',
153
- 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php',
154
- 'Doctrine\\Common\\Cache\\MemcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php',
155
- 'Doctrine\\Common\\Cache\\MemcachedCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php',
156
- 'Doctrine\\Common\\Cache\\MongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php',
157
- 'Doctrine\\Common\\Cache\\MultiDeleteCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php',
158
- 'Doctrine\\Common\\Cache\\MultiGetCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php',
159
- 'Doctrine\\Common\\Cache\\MultiOperationCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php',
160
- 'Doctrine\\Common\\Cache\\MultiPutCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php',
161
- 'Doctrine\\Common\\Cache\\PhpFileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php',
162
- 'Doctrine\\Common\\Cache\\PredisCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php',
163
- 'Doctrine\\Common\\Cache\\RedisCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php',
164
- 'Doctrine\\Common\\Cache\\SQLite3Cache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php',
165
- 'Doctrine\\Common\\Cache\\Version' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Version.php',
166
- 'Doctrine\\Common\\Cache\\VoidCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php',
167
- 'Doctrine\\Common\\Cache\\WinCacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php',
168
- 'Doctrine\\Common\\Cache\\XcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php',
169
- 'Doctrine\\Common\\Cache\\ZendDataCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php',
170
  'GeoIp2\\Database\\Reader' => $vendorDir . '/geoip2/geoip2/src/Database/Reader.php',
171
  'GeoIp2\\Exception\\AddressNotFoundException' => $vendorDir . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
172
  'GeoIp2\\Exception\\AuthenticationException' => $vendorDir . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
@@ -339,10 +340,13 @@ return array(
339
  'MatomoTracker' => $vendorDir . '/matomo/matomo-php-tracker/MatomoTracker.php',
340
  'Matomo\\Cache\\Backend' => $vendorDir . '/matomo/cache/src/Backend.php',
341
  'Matomo\\Cache\\Backend\\ArrayCache' => $vendorDir . '/matomo/cache/src/Backend/ArrayCache.php',
 
342
  'Matomo\\Cache\\Backend\\Chained' => $vendorDir . '/matomo/cache/src/Backend/Chained.php',
 
343
  'Matomo\\Cache\\Backend\\Factory' => $vendorDir . '/matomo/cache/src/Backend/Factory.php',
344
  'Matomo\\Cache\\Backend\\Factory\\BackendNotFoundException' => $vendorDir . '/matomo/cache/src/Backend/Factory/BackendNotFoundException.php',
345
  'Matomo\\Cache\\Backend\\File' => $vendorDir . '/matomo/cache/src/Backend/File.php',
 
346
  'Matomo\\Cache\\Backend\\NullCache' => $vendorDir . '/matomo/cache/src/Backend/NullCache.php',
347
  'Matomo\\Cache\\Backend\\Redis' => $vendorDir . '/matomo/cache/src/Backend/Redis.php',
348
  'Matomo\\Cache\\Cache' => $vendorDir . '/matomo/cache/src/Cache.php',
@@ -953,11 +957,22 @@ return array(
953
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\RunScheduledTasks' => $baseDir . '/plugins/CoreAdminHome/Commands/RunScheduledTasks.php',
954
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig' => $baseDir . '/plugins/CoreAdminHome/Commands/SetConfig.php',
955
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig\\ConfigSettingManipulation' => $baseDir . '/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php',
 
956
  'Piwik\\Plugins\\CoreAdminHome\\Controller' => $baseDir . '/plugins/CoreAdminHome/Controller.php',
957
  'Piwik\\Plugins\\CoreAdminHome\\CoreAdminHome' => $baseDir . '/plugins/CoreAdminHome/CoreAdminHome.php',
958
  'Piwik\\Plugins\\CoreAdminHome\\CustomLogo' => $baseDir . '/plugins/CoreAdminHome/CustomLogo.php',
959
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\JsTrackingCodeMissingEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/JsTrackingCodeMissingEmail.php',
 
 
 
 
 
 
960
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\TrackingFailuresEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/TrackingFailuresEmail.php',
 
 
 
 
961
  'Piwik\\Plugins\\CoreAdminHome\\Menu' => $baseDir . '/plugins/CoreAdminHome/Menu.php',
962
  'Piwik\\Plugins\\CoreAdminHome\\Model\\DuplicateActionRemover' => $baseDir . '/plugins/CoreAdminHome/Model/DuplicateActionRemover.php',
963
  'Piwik\\Plugins\\CoreAdminHome\\OptOutManager' => $baseDir . '/plugins/CoreAdminHome/OptOutManager.php',
@@ -998,6 +1013,7 @@ return array(
998
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateReport' => $baseDir . '/plugins/CoreConsole/Commands/GenerateReport.php',
999
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateScheduledTask' => $baseDir . '/plugins/CoreConsole/Commands/GenerateScheduledTask.php',
1000
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateSettings' => $baseDir . '/plugins/CoreConsole/Commands/GenerateSettings.php',
 
1001
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateTest' => $baseDir . '/plugins/CoreConsole/Commands/GenerateTest.php',
1002
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateUpdate' => $baseDir . '/plugins/CoreConsole/Commands/GenerateUpdate.php',
1003
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateVisualizationPlugin' => $baseDir . '/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php',
@@ -1431,6 +1447,7 @@ return array(
1431
  'Piwik\\Plugins\\ExamplePlugin\\API' => $baseDir . '/plugins/ExamplePlugin/API.php',
1432
  'Piwik\\Plugins\\ExamplePlugin\\Archiver' => $baseDir . '/plugins/ExamplePlugin/Archiver.php',
1433
  'Piwik\\Plugins\\ExamplePlugin\\Controller' => $baseDir . '/plugins/ExamplePlugin/Controller.php',
 
1434
  'Piwik\\Plugins\\ExamplePlugin\\ExamplePlugin' => $baseDir . '/plugins/ExamplePlugin/ExamplePlugin.php',
1435
  'Piwik\\Plugins\\ExamplePlugin\\Menu' => $baseDir . '/plugins/ExamplePlugin/Menu.php',
1436
  'Piwik\\Plugins\\ExamplePlugin\\Tasks' => $baseDir . '/plugins/ExamplePlugin/Tasks.php',
@@ -1954,6 +1971,7 @@ return array(
1954
  'Piwik\\Plugins\\ScheduledReports\\SubscriptionModel' => $baseDir . '/plugins/ScheduledReports/SubscriptionModel.php',
1955
  'Piwik\\Plugins\\ScheduledReports\\Tasks' => $baseDir . '/plugins/ScheduledReports/Tasks.php',
1956
  'Piwik\\Plugins\\ScheduledReports\\tests\\Fixtures\\ReportSubscription' => $baseDir . '/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php',
 
1957
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGeneratorTest' => $baseDir . '/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php',
1958
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\AttachedFileReportEmailGeneratorTest' => $baseDir . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php',
1959
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\HtmlReportEmailGeneratorTest' => $baseDir . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php',
@@ -2344,7 +2362,10 @@ return array(
2344
  'Piwik\\Plugins\\UserCountry\\UserCountry' => $baseDir . '/plugins/UserCountry/UserCountry.php',
2345
  'Piwik\\Plugins\\UserCountry\\VisitorDetails' => $baseDir . '/plugins/UserCountry/VisitorDetails.php',
2346
  'Piwik\\Plugins\\UserCountry\\VisitorGeolocator' => $baseDir . '/plugins/UserCountry/VisitorGeolocator.php',
 
 
2347
  'Piwik\\Plugins\\UserCountry\\tests\\Integration\\VisitorGeolocatorTest' => $baseDir . '/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php',
 
2348
  'Piwik\\Plugins\\UserCountry\\tests\\System\\AttributeHistoricalDataWithLocationsTest' => $baseDir . '/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php',
2349
  'Piwik\\Plugins\\UserCountry\\tests\\Unit\\UserCountryTest' => $baseDir . '/plugins/UserCountry/tests/Unit/UserCountryTest.php',
2350
  'Piwik\\Plugins\\UserId\\API' => $baseDir . '/plugins/UserId/API.php',
@@ -2763,6 +2784,7 @@ return array(
2763
  'Symfony\\Component\\EventDispatcher\\Tests\\GenericEventTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php',
2764
  'Symfony\\Component\\EventDispatcher\\Tests\\ImmutableEventDispatcherTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php',
2765
  'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
 
2766
  'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
2767
  'System' => $vendorDir . '/pear/pear-core-minimal/src/System.php',
2768
  'TCPDF' => $vendorDir . '/tecnickcom/tcpdf/tcpdf.php',
130
  'DeviceDetector\\Parser\\Device\\Mobile' => $vendorDir . '/matomo/device-detector/Parser/Device/Mobile.php',
131
  'DeviceDetector\\Parser\\Device\\Notebook' => $vendorDir . '/matomo/device-detector/Parser/Device/Notebook.php',
132
  'DeviceDetector\\Parser\\Device\\PortableMediaPlayer' => $vendorDir . '/matomo/device-detector/Parser/Device/PortableMediaPlayer.php',
133
+ 'DeviceDetector\\Parser\\Device\\ShellTv' => $vendorDir . '/matomo/device-detector/Parser/Device/ShellTv.php',
134
  'DeviceDetector\\Parser\\OperatingSystem' => $vendorDir . '/matomo/device-detector/Parser/OperatingSystem.php',
135
  'DeviceDetector\\Parser\\VendorFragment' => $vendorDir . '/matomo/device-detector/Parser/VendorFragment.php',
136
  'DeviceDetector\\Yaml\\ParserInterface' => $vendorDir . '/matomo/device-detector/Yaml/ParserInterface.php',
137
  'DeviceDetector\\Yaml\\Pecl' => $vendorDir . '/matomo/device-detector/Yaml/Pecl.php',
138
  'DeviceDetector\\Yaml\\Spyc' => $vendorDir . '/matomo/device-detector/Yaml/Spyc.php',
139
  'DeviceDetector\\Yaml\\Symfony' => $vendorDir . '/matomo/device-detector/Yaml/Symfony.php',
140
+ 'Doctrine\\Common\\Cache\\ApcCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ApcCache.php',
141
+ 'Doctrine\\Common\\Cache\\ApcuCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ApcuCache.php',
142
+ 'Doctrine\\Common\\Cache\\ArrayCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ArrayCache.php',
143
+ 'Doctrine\\Common\\Cache\\Cache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/Cache.php',
144
+ 'Doctrine\\Common\\Cache\\CacheProvider' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/CacheProvider.php',
145
+ 'Doctrine\\Common\\Cache\\ChainCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ChainCache.php',
146
+ 'Doctrine\\Common\\Cache\\ClearableCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ClearableCache.php',
147
+ 'Doctrine\\Common\\Cache\\CouchbaseBucketCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/CouchbaseBucketCache.php',
148
+ 'Doctrine\\Common\\Cache\\CouchbaseCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/CouchbaseCache.php',
149
+ 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ExtMongoDBCache.php',
150
+ 'Doctrine\\Common\\Cache\\FileCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/FileCache.php',
151
+ 'Doctrine\\Common\\Cache\\FilesystemCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/FilesystemCache.php',
152
+ 'Doctrine\\Common\\Cache\\FlushableCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/FlushableCache.php',
153
+ 'Doctrine\\Common\\Cache\\InvalidCacheId' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/InvalidCacheId.php',
154
+ 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php',
155
+ 'Doctrine\\Common\\Cache\\MemcacheCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MemcacheCache.php',
156
+ 'Doctrine\\Common\\Cache\\MemcachedCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MemcachedCache.php',
157
+ 'Doctrine\\Common\\Cache\\MongoDBCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MongoDBCache.php',
158
+ 'Doctrine\\Common\\Cache\\MultiDeleteCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiDeleteCache.php',
159
+ 'Doctrine\\Common\\Cache\\MultiGetCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiGetCache.php',
160
+ 'Doctrine\\Common\\Cache\\MultiOperationCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiOperationCache.php',
161
+ 'Doctrine\\Common\\Cache\\MultiPutCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiPutCache.php',
162
+ 'Doctrine\\Common\\Cache\\PhpFileCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/PhpFileCache.php',
163
+ 'Doctrine\\Common\\Cache\\PredisCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/PredisCache.php',
164
+ 'Doctrine\\Common\\Cache\\RedisCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/RedisCache.php',
165
+ 'Doctrine\\Common\\Cache\\SQLite3Cache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/SQLite3Cache.php',
166
+ 'Doctrine\\Common\\Cache\\Version' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/Version.php',
167
+ 'Doctrine\\Common\\Cache\\VoidCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/VoidCache.php',
168
+ 'Doctrine\\Common\\Cache\\WinCacheCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/WinCacheCache.php',
169
+ 'Doctrine\\Common\\Cache\\XcacheCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/XcacheCache.php',
170
+ 'Doctrine\\Common\\Cache\\ZendDataCache' => $vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ZendDataCache.php',
171
  'GeoIp2\\Database\\Reader' => $vendorDir . '/geoip2/geoip2/src/Database/Reader.php',
172
  'GeoIp2\\Exception\\AddressNotFoundException' => $vendorDir . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
173
  'GeoIp2\\Exception\\AuthenticationException' => $vendorDir . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
340
  'MatomoTracker' => $vendorDir . '/matomo/matomo-php-tracker/MatomoTracker.php',
341
  'Matomo\\Cache\\Backend' => $vendorDir . '/matomo/cache/src/Backend.php',
342
  'Matomo\\Cache\\Backend\\ArrayCache' => $vendorDir . '/matomo/cache/src/Backend/ArrayCache.php',
343
+ 'Matomo\\Cache\\Backend\\BaseDecorator' => $vendorDir . '/matomo/cache/src/Backend/BaseDecorator.php',
344
  'Matomo\\Cache\\Backend\\Chained' => $vendorDir . '/matomo/cache/src/Backend/Chained.php',
345
+ 'Matomo\\Cache\\Backend\\DefaultTimeoutDecorated' => $vendorDir . '/matomo/cache/src/Backend/DefaultTimeoutDecorated.php',
346
  'Matomo\\Cache\\Backend\\Factory' => $vendorDir . '/matomo/cache/src/Backend/Factory.php',
347
  'Matomo\\Cache\\Backend\\Factory\\BackendNotFoundException' => $vendorDir . '/matomo/cache/src/Backend/Factory/BackendNotFoundException.php',
348
  'Matomo\\Cache\\Backend\\File' => $vendorDir . '/matomo/cache/src/Backend/File.php',
349
+ 'Matomo\\Cache\\Backend\\KeyPrefixDecorated' => $vendorDir . '/matomo/cache/src/Backend/KeyPrefixDecorated.php',
350
  'Matomo\\Cache\\Backend\\NullCache' => $vendorDir . '/matomo/cache/src/Backend/NullCache.php',
351
  'Matomo\\Cache\\Backend\\Redis' => $vendorDir . '/matomo/cache/src/Backend/Redis.php',
352
  'Matomo\\Cache\\Cache' => $vendorDir . '/matomo/cache/src/Cache.php',
957
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\RunScheduledTasks' => $baseDir . '/plugins/CoreAdminHome/Commands/RunScheduledTasks.php',
958
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig' => $baseDir . '/plugins/CoreAdminHome/Commands/SetConfig.php',
959
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig\\ConfigSettingManipulation' => $baseDir . '/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php',
960
+ 'Piwik\\Plugins\\CoreAdminHome\\Commands\\VersionInfo' => $baseDir . '/plugins/CoreAdminHome/Commands/VersionInfo.php',
961
  'Piwik\\Plugins\\CoreAdminHome\\Controller' => $baseDir . '/plugins/CoreAdminHome/Controller.php',
962
  'Piwik\\Plugins\\CoreAdminHome\\CoreAdminHome' => $baseDir . '/plugins/CoreAdminHome/CoreAdminHome.php',
963
  'Piwik\\Plugins\\CoreAdminHome\\CustomLogo' => $baseDir . '/plugins/CoreAdminHome/CustomLogo.php',
964
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\JsTrackingCodeMissingEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/JsTrackingCodeMissingEmail.php',
965
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\RecoveryCodesRegeneratedEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/RecoveryCodesRegeneratedEmail.php',
966
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\RecoveryCodesShowedEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/RecoveryCodesShowedEmail.php',
967
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\SecurityNotificationEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/SecurityNotificationEmail.php',
968
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\SettingsChangedEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/SettingsChangedEmail.php',
969
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TokenAuthCreatedEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/TokenAuthCreatedEmail.php',
970
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TokenAuthDeletedEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/TokenAuthDeletedEmail.php',
971
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\TrackingFailuresEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/TrackingFailuresEmail.php',
972
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TwoFactorAuthDisabledEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/TwoFactorAuthDisabledEmail.php',
973
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TwoFactorAuthEnabledEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/TwoFactorAuthEnabledEmail.php',
974
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\UserCreatedEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/UserCreatedEmail.php',
975
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\UserDeletedEmail' => $baseDir . '/plugins/CoreAdminHome/Emails/UserDeletedEmail.php',
976
  'Piwik\\Plugins\\CoreAdminHome\\Menu' => $baseDir . '/plugins/CoreAdminHome/Menu.php',
977
  'Piwik\\Plugins\\CoreAdminHome\\Model\\DuplicateActionRemover' => $baseDir . '/plugins/CoreAdminHome/Model/DuplicateActionRemover.php',
978
  'Piwik\\Plugins\\CoreAdminHome\\OptOutManager' => $baseDir . '/plugins/CoreAdminHome/OptOutManager.php',
1013
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateReport' => $baseDir . '/plugins/CoreConsole/Commands/GenerateReport.php',
1014
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateScheduledTask' => $baseDir . '/plugins/CoreConsole/Commands/GenerateScheduledTask.php',
1015
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateSettings' => $baseDir . '/plugins/CoreConsole/Commands/GenerateSettings.php',
1016
+ 'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateSystemCheck' => $baseDir . '/plugins/CoreConsole/Commands/GenerateSystemCheck.php',
1017
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateTest' => $baseDir . '/plugins/CoreConsole/Commands/GenerateTest.php',
1018
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateUpdate' => $baseDir . '/plugins/CoreConsole/Commands/GenerateUpdate.php',
1019
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateVisualizationPlugin' => $baseDir . '/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php',
1447
  'Piwik\\Plugins\\ExamplePlugin\\API' => $baseDir . '/plugins/ExamplePlugin/API.php',
1448
  'Piwik\\Plugins\\ExamplePlugin\\Archiver' => $baseDir . '/plugins/ExamplePlugin/Archiver.php',
1449
  'Piwik\\Plugins\\ExamplePlugin\\Controller' => $baseDir . '/plugins/ExamplePlugin/Controller.php',
1450
+ 'Piwik\\Plugins\\ExamplePlugin\\Diagnostic\\ExampleCheck' => $baseDir . '/plugins/ExamplePlugin/Diagnostic/ExampleCheck.php',
1451
  'Piwik\\Plugins\\ExamplePlugin\\ExamplePlugin' => $baseDir . '/plugins/ExamplePlugin/ExamplePlugin.php',
1452
  'Piwik\\Plugins\\ExamplePlugin\\Menu' => $baseDir . '/plugins/ExamplePlugin/Menu.php',
1453
  'Piwik\\Plugins\\ExamplePlugin\\Tasks' => $baseDir . '/plugins/ExamplePlugin/Tasks.php',
1971
  'Piwik\\Plugins\\ScheduledReports\\SubscriptionModel' => $baseDir . '/plugins/ScheduledReports/SubscriptionModel.php',
1972
  'Piwik\\Plugins\\ScheduledReports\\Tasks' => $baseDir . '/plugins/ScheduledReports/Tasks.php',
1973
  'Piwik\\Plugins\\ScheduledReports\\tests\\Fixtures\\ReportSubscription' => $baseDir . '/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php',
1974
+ 'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ApiTest' => $baseDir . '/plugins/ScheduledReports/tests/Integration/ApiTest.php',
1975
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGeneratorTest' => $baseDir . '/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php',
1976
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\AttachedFileReportEmailGeneratorTest' => $baseDir . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php',
1977
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\HtmlReportEmailGeneratorTest' => $baseDir . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php',
2362
  'Piwik\\Plugins\\UserCountry\\UserCountry' => $baseDir . '/plugins/UserCountry/UserCountry.php',
2363
  'Piwik\\Plugins\\UserCountry\\VisitorDetails' => $baseDir . '/plugins/UserCountry/VisitorDetails.php',
2364
  'Piwik\\Plugins\\UserCountry\\VisitorGeolocator' => $baseDir . '/plugins/UserCountry/VisitorGeolocator.php',
2365
+ 'Piwik\\Plugins\\UserCountry\\tests\\Fixtures\\ManySitesManyVisitsWithGeoIp' => $baseDir . '/plugins/UserCountry/tests/Fixtures/ManySitesManyVisitsWithGeoIp.php',
2366
+ 'Piwik\\Plugins\\UserCountry\\tests\\Integration\\LocationProviderTest' => $baseDir . '/plugins/UserCountry/tests/Integration/LocationProviderTest.php',
2367
  'Piwik\\Plugins\\UserCountry\\tests\\Integration\\VisitorGeolocatorTest' => $baseDir . '/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php',
2368
+ 'Piwik\\Plugins\\UserCountry\\tests\\System\\ApiTest' => $baseDir . '/plugins/UserCountry/tests/System/ApiTest.php',
2369
  'Piwik\\Plugins\\UserCountry\\tests\\System\\AttributeHistoricalDataWithLocationsTest' => $baseDir . '/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php',
2370
  'Piwik\\Plugins\\UserCountry\\tests\\Unit\\UserCountryTest' => $baseDir . '/plugins/UserCountry/tests/Unit/UserCountryTest.php',
2371
  'Piwik\\Plugins\\UserId\\API' => $baseDir . '/plugins/UserId/API.php',
2784
  'Symfony\\Component\\EventDispatcher\\Tests\\GenericEventTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php',
2785
  'Symfony\\Component\\EventDispatcher\\Tests\\ImmutableEventDispatcherTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php',
2786
  'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
2787
+ 'Symfony\\Polyfill\\Iconv\\Iconv' => $vendorDir . '/symfony/polyfill-iconv/Iconv.php',
2788
  'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
2789
  'System' => $vendorDir . '/pear/pear-core-minimal/src/System.php',
2790
  'TCPDF' => $vendorDir . '/tecnickcom/tcpdf/tcpdf.php',
app/vendor/composer/autoload_files.php CHANGED
@@ -11,6 +11,7 @@ return array(
11
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
12
  '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
13
  'b33e3d135e5d9e47d845c576147bda89' => $vendorDir . '/php-di/php-di/src/functions.php',
 
14
  '6dcc7fc6910472564e7b11f0b5d852b5' => $vendorDir . '/szymach/c-pchart/src/Resources/data/constants.php',
15
  'c03755bd507301ecda84f959218be302' => $baseDir . '/LegacyAutoloader.php',
16
  );
11
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
12
  '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
13
  'b33e3d135e5d9e47d845c576147bda89' => $vendorDir . '/php-di/php-di/src/functions.php',
14
+ 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
15
  '6dcc7fc6910472564e7b11f0b5d852b5' => $vendorDir . '/szymach/c-pchart/src/Resources/data/constants.php',
16
  'c03755bd507301ecda84f959218be302' => $baseDir . '/LegacyAutoloader.php',
17
  );
app/vendor/composer/autoload_psr4.php CHANGED
@@ -8,6 +8,7 @@ $baseDir = dirname($vendorDir);
8
  return array(
9
  'Twig\\' => array($vendorDir . '/twig/twig/src'),
10
  'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
 
11
  'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
12
  'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
13
  'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
@@ -26,7 +27,7 @@ return array(
26
  'Matomo\\Cache\\' => array($vendorDir . '/matomo/cache/src'),
27
  'Invoker\\' => array($vendorDir . '/php-di/invoker/src'),
28
  'GeoIp2\\' => array($vendorDir . '/geoip2/geoip2/src'),
29
- 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache'),
30
  'DeviceDetector\\' => array($vendorDir . '/matomo/device-detector'),
31
  'Davaxi\\' => array($vendorDir . '/davaxi/sparkline/src'),
32
  'DI\\' => array($vendorDir . '/php-di/php-di/src'),
8
  return array(
9
  'Twig\\' => array($vendorDir . '/twig/twig/src'),
10
  'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
11
+ 'Symfony\\Polyfill\\Iconv\\' => array($vendorDir . '/symfony/polyfill-iconv'),
12
  'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
13
  'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
14
  'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
27
  'Matomo\\Cache\\' => array($vendorDir . '/matomo/cache/src'),
28
  'Invoker\\' => array($vendorDir . '/php-di/invoker/src'),
29
  'GeoIp2\\' => array($vendorDir . '/geoip2/geoip2/src'),
30
+ 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache'),
31
  'DeviceDetector\\' => array($vendorDir . '/matomo/device-detector'),
32
  'Davaxi\\' => array($vendorDir . '/davaxi/sparkline/src'),
33
  'DI\\' => array($vendorDir . '/php-di/php-di/src'),
app/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInite0aec6a19cacb137658cbe05ff4a49c8
6
  {
7
  private static $loader;
8
 
@@ -22,9 +22,9 @@ class ComposerAutoloaderInite0aec6a19cacb137658cbe05ff4a49c8
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInite0aec6a19cacb137658cbe05ff4a49c8', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
27
- spl_autoload_unregister(array('ComposerAutoloaderInite0aec6a19cacb137658cbe05ff4a49c8', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
@@ -34,7 +34,7 @@ class ComposerAutoloaderInite0aec6a19cacb137658cbe05ff4a49c8
34
  if ($useStaticLoader) {
35
  require __DIR__ . '/autoload_static.php';
36
 
37
- call_user_func(\Composer\Autoload\ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
@@ -55,19 +55,19 @@ class ComposerAutoloaderInite0aec6a19cacb137658cbe05ff4a49c8
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
- $includeFiles = Composer\Autoload\ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
- composerRequiree0aec6a19cacb137658cbe05ff4a49c8($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
- function composerRequiree0aec6a19cacb137658cbe05ff4a49c8($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit9209fd533b4c3cc6523ff4b3463ad39c
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ spl_autoload_register(array('ComposerAutoloaderInit9209fd533b4c3cc6523ff4b3463ad39c', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
27
+ spl_autoload_unregister(array('ComposerAutoloaderInit9209fd533b4c3cc6523ff4b3463ad39c', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
34
  if ($useStaticLoader) {
35
  require __DIR__ . '/autoload_static.php';
36
 
37
+ call_user_func(\Composer\Autoload\ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
+ $includeFiles = Composer\Autoload\ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
+ composerRequire9209fd533b4c3cc6523ff4b3463ad39c($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
+ function composerRequire9209fd533b4c3cc6523ff4b3463ad39c($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
app/vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
@@ -12,6 +12,7 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
12
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
13
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
14
  'b33e3d135e5d9e47d845c576147bda89' => __DIR__ . '/..' . '/php-di/php-di/src/functions.php',
 
15
  '6dcc7fc6910472564e7b11f0b5d852b5' => __DIR__ . '/..' . '/szymach/c-pchart/src/Resources/data/constants.php',
16
  'c03755bd507301ecda84f959218be302' => __DIR__ . '/../..' . '/LegacyAutoloader.php',
17
  );
@@ -24,6 +25,7 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
24
  'S' =>
25
  array (
26
  'Symfony\\Polyfill\\Mbstring\\' => 26,
 
27
  'Symfony\\Polyfill\\Ctype\\' => 23,
28
  ),
29
  'P' =>
@@ -82,6 +84,10 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
82
  array (
83
  0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
84
  ),
 
 
 
 
85
  'Symfony\\Polyfill\\Ctype\\' =>
86
  array (
87
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
@@ -156,7 +162,7 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
156
  ),
157
  'Doctrine\\Common\\Cache\\' =>
158
  array (
159
- 0 => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache',
160
  ),
161
  'DeviceDetector\\' =>
162
  array (
@@ -384,43 +390,44 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
384
  'DeviceDetector\\Parser\\Device\\Mobile' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Mobile.php',
385
  'DeviceDetector\\Parser\\Device\\Notebook' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Notebook.php',
386
  'DeviceDetector\\Parser\\Device\\PortableMediaPlayer' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/PortableMediaPlayer.php',
 
387
  'DeviceDetector\\Parser\\OperatingSystem' => __DIR__ . '/..' . '/matomo/device-detector/Parser/OperatingSystem.php',
388
  'DeviceDetector\\Parser\\VendorFragment' => __DIR__ . '/..' . '/matomo/device-detector/Parser/VendorFragment.php',
389
  'DeviceDetector\\Yaml\\ParserInterface' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/ParserInterface.php',
390
  'DeviceDetector\\Yaml\\Pecl' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Pecl.php',
391
  'DeviceDetector\\Yaml\\Spyc' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Spyc.php',
392
  'DeviceDetector\\Yaml\\Symfony' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Symfony.php',
393
- 'Doctrine\\Common\\Cache\\ApcCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php',
394
- 'Doctrine\\Common\\Cache\\ApcuCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php',
395
- 'Doctrine\\Common\\Cache\\ArrayCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php',
396
- 'Doctrine\\Common\\Cache\\Cache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php',
397
- 'Doctrine\\Common\\Cache\\CacheProvider' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php',
398
- 'Doctrine\\Common\\Cache\\ChainCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php',
399
- 'Doctrine\\Common\\Cache\\ClearableCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php',
400
- 'Doctrine\\Common\\Cache\\CouchbaseBucketCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseBucketCache.php',
401
- 'Doctrine\\Common\\Cache\\CouchbaseCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php',
402
- 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php',
403
- 'Doctrine\\Common\\Cache\\FileCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php',
404
- 'Doctrine\\Common\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php',
405
- 'Doctrine\\Common\\Cache\\FlushableCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php',
406
- 'Doctrine\\Common\\Cache\\InvalidCacheId' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/InvalidCacheId.php',
407
- 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php',
408
- 'Doctrine\\Common\\Cache\\MemcacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php',
409
- 'Doctrine\\Common\\Cache\\MemcachedCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php',
410
- 'Doctrine\\Common\\Cache\\MongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php',
411
- 'Doctrine\\Common\\Cache\\MultiDeleteCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php',
412
- 'Doctrine\\Common\\Cache\\MultiGetCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php',
413
- 'Doctrine\\Common\\Cache\\MultiOperationCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php',
414
- 'Doctrine\\Common\\Cache\\MultiPutCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php',
415
- 'Doctrine\\Common\\Cache\\PhpFileCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php',
416
- 'Doctrine\\Common\\Cache\\PredisCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php',
417
- 'Doctrine\\Common\\Cache\\RedisCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php',
418
- 'Doctrine\\Common\\Cache\\SQLite3Cache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php',
419
- 'Doctrine\\Common\\Cache\\Version' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/Version.php',
420
- 'Doctrine\\Common\\Cache\\VoidCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php',
421
- 'Doctrine\\Common\\Cache\\WinCacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php',
422
- 'Doctrine\\Common\\Cache\\XcacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php',
423
- 'Doctrine\\Common\\Cache\\ZendDataCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php',
424
  'GeoIp2\\Database\\Reader' => __DIR__ . '/..' . '/geoip2/geoip2/src/Database/Reader.php',
425
  'GeoIp2\\Exception\\AddressNotFoundException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
426
  'GeoIp2\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
@@ -593,10 +600,13 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
593
  'MatomoTracker' => __DIR__ . '/..' . '/matomo/matomo-php-tracker/MatomoTracker.php',
594
  'Matomo\\Cache\\Backend' => __DIR__ . '/..' . '/matomo/cache/src/Backend.php',
595
  'Matomo\\Cache\\Backend\\ArrayCache' => __DIR__ . '/..' . '/matomo/cache/src/Backend/ArrayCache.php',
 
596
  'Matomo\\Cache\\Backend\\Chained' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Chained.php',
 
597
  'Matomo\\Cache\\Backend\\Factory' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Factory.php',
598
  'Matomo\\Cache\\Backend\\Factory\\BackendNotFoundException' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Factory/BackendNotFoundException.php',
599
  'Matomo\\Cache\\Backend\\File' => __DIR__ . '/..' . '/matomo/cache/src/Backend/File.php',
 
600
  'Matomo\\Cache\\Backend\\NullCache' => __DIR__ . '/..' . '/matomo/cache/src/Backend/NullCache.php',
601
  'Matomo\\Cache\\Backend\\Redis' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Redis.php',
602
  'Matomo\\Cache\\Cache' => __DIR__ . '/..' . '/matomo/cache/src/Cache.php',
@@ -1207,11 +1217,22 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
1207
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\RunScheduledTasks' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Commands/RunScheduledTasks.php',
1208
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Commands/SetConfig.php',
1209
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig\\ConfigSettingManipulation' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php',
 
1210
  'Piwik\\Plugins\\CoreAdminHome\\Controller' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Controller.php',
1211
  'Piwik\\Plugins\\CoreAdminHome\\CoreAdminHome' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/CoreAdminHome.php',
1212
  'Piwik\\Plugins\\CoreAdminHome\\CustomLogo' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/CustomLogo.php',
1213
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\JsTrackingCodeMissingEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/JsTrackingCodeMissingEmail.php',
 
 
 
 
 
 
1214
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\TrackingFailuresEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/TrackingFailuresEmail.php',
 
 
 
 
1215
  'Piwik\\Plugins\\CoreAdminHome\\Menu' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Menu.php',
1216
  'Piwik\\Plugins\\CoreAdminHome\\Model\\DuplicateActionRemover' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Model/DuplicateActionRemover.php',
1217
  'Piwik\\Plugins\\CoreAdminHome\\OptOutManager' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/OptOutManager.php',
@@ -1252,6 +1273,7 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
1252
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateReport' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateReport.php',
1253
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateScheduledTask' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateScheduledTask.php',
1254
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateSettings' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateSettings.php',
 
1255
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateTest' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateTest.php',
1256
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateUpdate' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateUpdate.php',
1257
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateVisualizationPlugin' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php',
@@ -1685,6 +1707,7 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
1685
  'Piwik\\Plugins\\ExamplePlugin\\API' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/API.php',
1686
  'Piwik\\Plugins\\ExamplePlugin\\Archiver' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Archiver.php',
1687
  'Piwik\\Plugins\\ExamplePlugin\\Controller' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Controller.php',
 
1688
  'Piwik\\Plugins\\ExamplePlugin\\ExamplePlugin' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/ExamplePlugin.php',
1689
  'Piwik\\Plugins\\ExamplePlugin\\Menu' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Menu.php',
1690
  'Piwik\\Plugins\\ExamplePlugin\\Tasks' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Tasks.php',
@@ -2208,6 +2231,7 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
2208
  'Piwik\\Plugins\\ScheduledReports\\SubscriptionModel' => __DIR__ . '/../..' . '/plugins/ScheduledReports/SubscriptionModel.php',
2209
  'Piwik\\Plugins\\ScheduledReports\\Tasks' => __DIR__ . '/../..' . '/plugins/ScheduledReports/Tasks.php',
2210
  'Piwik\\Plugins\\ScheduledReports\\tests\\Fixtures\\ReportSubscription' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php',
 
2211
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGeneratorTest' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php',
2212
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\AttachedFileReportEmailGeneratorTest' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php',
2213
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\HtmlReportEmailGeneratorTest' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php',
@@ -2598,7 +2622,10 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
2598
  'Piwik\\Plugins\\UserCountry\\UserCountry' => __DIR__ . '/../..' . '/plugins/UserCountry/UserCountry.php',
2599
  'Piwik\\Plugins\\UserCountry\\VisitorDetails' => __DIR__ . '/../..' . '/plugins/UserCountry/VisitorDetails.php',
2600
  'Piwik\\Plugins\\UserCountry\\VisitorGeolocator' => __DIR__ . '/../..' . '/plugins/UserCountry/VisitorGeolocator.php',
 
 
2601
  'Piwik\\Plugins\\UserCountry\\tests\\Integration\\VisitorGeolocatorTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php',
 
2602
  'Piwik\\Plugins\\UserCountry\\tests\\System\\AttributeHistoricalDataWithLocationsTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php',
2603
  'Piwik\\Plugins\\UserCountry\\tests\\Unit\\UserCountryTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/Unit/UserCountryTest.php',
2604
  'Piwik\\Plugins\\UserId\\API' => __DIR__ . '/../..' . '/plugins/UserId/API.php',
@@ -3017,6 +3044,7 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
3017
  'Symfony\\Component\\EventDispatcher\\Tests\\GenericEventTest' => __DIR__ . '/..' . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php',
3018
  'Symfony\\Component\\EventDispatcher\\Tests\\ImmutableEventDispatcherTest' => __DIR__ . '/..' . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php',
3019
  'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
 
3020
  'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
3021
  'System' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/System.php',
3022
  'TCPDF' => __DIR__ . '/..' . '/tecnickcom/tcpdf/tcpdf.php',
@@ -3279,11 +3307,11 @@ class ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8
3279
  public static function getInitializer(ClassLoader $loader)
3280
  {
3281
  return \Closure::bind(function () use ($loader) {
3282
- $loader->prefixLengthsPsr4 = ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8::$prefixLengthsPsr4;
3283
- $loader->prefixDirsPsr4 = ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8::$prefixDirsPsr4;
3284
- $loader->prefixesPsr0 = ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8::$prefixesPsr0;
3285
- $loader->fallbackDirsPsr0 = ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8::$fallbackDirsPsr0;
3286
- $loader->classMap = ComposerStaticInite0aec6a19cacb137658cbe05ff4a49c8::$classMap;
3287
 
3288
  }, null, ClassLoader::class);
3289
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
12
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
13
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
14
  'b33e3d135e5d9e47d845c576147bda89' => __DIR__ . '/..' . '/php-di/php-di/src/functions.php',
15
+ 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
16
  '6dcc7fc6910472564e7b11f0b5d852b5' => __DIR__ . '/..' . '/szymach/c-pchart/src/Resources/data/constants.php',
17
  'c03755bd507301ecda84f959218be302' => __DIR__ . '/../..' . '/LegacyAutoloader.php',
18
  );
25
  'S' =>
26
  array (
27
  'Symfony\\Polyfill\\Mbstring\\' => 26,
28
+ 'Symfony\\Polyfill\\Iconv\\' => 23,
29
  'Symfony\\Polyfill\\Ctype\\' => 23,
30
  ),
31
  'P' =>
84
  array (
85
  0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
86
  ),
87
+ 'Symfony\\Polyfill\\Iconv\\' =>
88
+ array (
89
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-iconv',
90
+ ),
91
  'Symfony\\Polyfill\\Ctype\\' =>
92
  array (
93
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
162
  ),
163
  'Doctrine\\Common\\Cache\\' =>
164
  array (
165
+ 0 => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache',
166
  ),
167
  'DeviceDetector\\' =>
168
  array (
390
  'DeviceDetector\\Parser\\Device\\Mobile' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Mobile.php',
391
  'DeviceDetector\\Parser\\Device\\Notebook' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/Notebook.php',
392
  'DeviceDetector\\Parser\\Device\\PortableMediaPlayer' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/PortableMediaPlayer.php',
393
+ 'DeviceDetector\\Parser\\Device\\ShellTv' => __DIR__ . '/..' . '/matomo/device-detector/Parser/Device/ShellTv.php',
394
  'DeviceDetector\\Parser\\OperatingSystem' => __DIR__ . '/..' . '/matomo/device-detector/Parser/OperatingSystem.php',
395
  'DeviceDetector\\Parser\\VendorFragment' => __DIR__ . '/..' . '/matomo/device-detector/Parser/VendorFragment.php',
396
  'DeviceDetector\\Yaml\\ParserInterface' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/ParserInterface.php',
397
  'DeviceDetector\\Yaml\\Pecl' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Pecl.php',
398
  'DeviceDetector\\Yaml\\Spyc' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Spyc.php',
399
  'DeviceDetector\\Yaml\\Symfony' => __DIR__ . '/..' . '/matomo/device-detector/Yaml/Symfony.php',
400
+ 'Doctrine\\Common\\Cache\\ApcCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ApcCache.php',
401
+ 'Doctrine\\Common\\Cache\\ApcuCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ApcuCache.php',
402
+ 'Doctrine\\Common\\Cache\\ArrayCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ArrayCache.php',
403
+ 'Doctrine\\Common\\Cache\\Cache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/Cache.php',
404
+ 'Doctrine\\Common\\Cache\\CacheProvider' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/CacheProvider.php',
405
+ 'Doctrine\\Common\\Cache\\ChainCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ChainCache.php',
406
+ 'Doctrine\\Common\\Cache\\ClearableCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ClearableCache.php',
407
+ 'Doctrine\\Common\\Cache\\CouchbaseBucketCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/CouchbaseBucketCache.php',
408
+ 'Doctrine\\Common\\Cache\\CouchbaseCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/CouchbaseCache.php',
409
+ 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ExtMongoDBCache.php',
410
+ 'Doctrine\\Common\\Cache\\FileCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/FileCache.php',
411
+ 'Doctrine\\Common\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/FilesystemCache.php',
412
+ 'Doctrine\\Common\\Cache\\FlushableCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/FlushableCache.php',
413
+ 'Doctrine\\Common\\Cache\\InvalidCacheId' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/InvalidCacheId.php',
414
+ 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php',
415
+ 'Doctrine\\Common\\Cache\\MemcacheCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MemcacheCache.php',
416
+ 'Doctrine\\Common\\Cache\\MemcachedCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MemcachedCache.php',
417
+ 'Doctrine\\Common\\Cache\\MongoDBCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MongoDBCache.php',
418
+ 'Doctrine\\Common\\Cache\\MultiDeleteCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiDeleteCache.php',
419
+ 'Doctrine\\Common\\Cache\\MultiGetCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiGetCache.php',
420
+ 'Doctrine\\Common\\Cache\\MultiOperationCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiOperationCache.php',
421
+ 'Doctrine\\Common\\Cache\\MultiPutCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/MultiPutCache.php',
422
+ 'Doctrine\\Common\\Cache\\PhpFileCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/PhpFileCache.php',
423
+ 'Doctrine\\Common\\Cache\\PredisCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/PredisCache.php',
424
+ 'Doctrine\\Common\\Cache\\RedisCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/RedisCache.php',
425
+ 'Doctrine\\Common\\Cache\\SQLite3Cache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/SQLite3Cache.php',
426
+ 'Doctrine\\Common\\Cache\\Version' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/Version.php',
427
+ 'Doctrine\\Common\\Cache\\VoidCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/VoidCache.php',
428
+ 'Doctrine\\Common\\Cache\\WinCacheCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/WinCacheCache.php',
429
+ 'Doctrine\\Common\\Cache\\XcacheCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/XcacheCache.php',
430
+ 'Doctrine\\Common\\Cache\\ZendDataCache' => __DIR__ . '/..' . '/matomo/doctrine-cache-fork/lib/Doctrine/Common/Cache/ZendDataCache.php',
431
  'GeoIp2\\Database\\Reader' => __DIR__ . '/..' . '/geoip2/geoip2/src/Database/Reader.php',
432
  'GeoIp2\\Exception\\AddressNotFoundException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
433
  'GeoIp2\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
600
  'MatomoTracker' => __DIR__ . '/..' . '/matomo/matomo-php-tracker/MatomoTracker.php',
601
  'Matomo\\Cache\\Backend' => __DIR__ . '/..' . '/matomo/cache/src/Backend.php',
602
  'Matomo\\Cache\\Backend\\ArrayCache' => __DIR__ . '/..' . '/matomo/cache/src/Backend/ArrayCache.php',
603
+ 'Matomo\\Cache\\Backend\\BaseDecorator' => __DIR__ . '/..' . '/matomo/cache/src/Backend/BaseDecorator.php',
604
  'Matomo\\Cache\\Backend\\Chained' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Chained.php',
605
+ 'Matomo\\Cache\\Backend\\DefaultTimeoutDecorated' => __DIR__ . '/..' . '/matomo/cache/src/Backend/DefaultTimeoutDecorated.php',
606
  'Matomo\\Cache\\Backend\\Factory' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Factory.php',
607
  'Matomo\\Cache\\Backend\\Factory\\BackendNotFoundException' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Factory/BackendNotFoundException.php',
608
  'Matomo\\Cache\\Backend\\File' => __DIR__ . '/..' . '/matomo/cache/src/Backend/File.php',
609
+ 'Matomo\\Cache\\Backend\\KeyPrefixDecorated' => __DIR__ . '/..' . '/matomo/cache/src/Backend/KeyPrefixDecorated.php',
610
  'Matomo\\Cache\\Backend\\NullCache' => __DIR__ . '/..' . '/matomo/cache/src/Backend/NullCache.php',
611
  'Matomo\\Cache\\Backend\\Redis' => __DIR__ . '/..' . '/matomo/cache/src/Backend/Redis.php',
612
  'Matomo\\Cache\\Cache' => __DIR__ . '/..' . '/matomo/cache/src/Cache.php',
1217
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\RunScheduledTasks' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Commands/RunScheduledTasks.php',
1218
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Commands/SetConfig.php',
1219
  'Piwik\\Plugins\\CoreAdminHome\\Commands\\SetConfig\\ConfigSettingManipulation' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php',
1220
+ 'Piwik\\Plugins\\CoreAdminHome\\Commands\\VersionInfo' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Commands/VersionInfo.php',
1221
  'Piwik\\Plugins\\CoreAdminHome\\Controller' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Controller.php',
1222
  'Piwik\\Plugins\\CoreAdminHome\\CoreAdminHome' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/CoreAdminHome.php',
1223
  'Piwik\\Plugins\\CoreAdminHome\\CustomLogo' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/CustomLogo.php',
1224
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\JsTrackingCodeMissingEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/JsTrackingCodeMissingEmail.php',
1225
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\RecoveryCodesRegeneratedEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/RecoveryCodesRegeneratedEmail.php',
1226
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\RecoveryCodesShowedEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/RecoveryCodesShowedEmail.php',
1227
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\SecurityNotificationEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/SecurityNotificationEmail.php',
1228
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\SettingsChangedEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/SettingsChangedEmail.php',
1229
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TokenAuthCreatedEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/TokenAuthCreatedEmail.php',
1230
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TokenAuthDeletedEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/TokenAuthDeletedEmail.php',
1231
  'Piwik\\Plugins\\CoreAdminHome\\Emails\\TrackingFailuresEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/TrackingFailuresEmail.php',
1232
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TwoFactorAuthDisabledEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/TwoFactorAuthDisabledEmail.php',
1233
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\TwoFactorAuthEnabledEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/TwoFactorAuthEnabledEmail.php',
1234
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\UserCreatedEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/UserCreatedEmail.php',
1235
+ 'Piwik\\Plugins\\CoreAdminHome\\Emails\\UserDeletedEmail' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Emails/UserDeletedEmail.php',
1236
  'Piwik\\Plugins\\CoreAdminHome\\Menu' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Menu.php',
1237
  'Piwik\\Plugins\\CoreAdminHome\\Model\\DuplicateActionRemover' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/Model/DuplicateActionRemover.php',
1238
  'Piwik\\Plugins\\CoreAdminHome\\OptOutManager' => __DIR__ . '/../..' . '/plugins/CoreAdminHome/OptOutManager.php',
1273
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateReport' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateReport.php',
1274
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateScheduledTask' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateScheduledTask.php',
1275
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateSettings' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateSettings.php',
1276
+ 'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateSystemCheck' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateSystemCheck.php',
1277
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateTest' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateTest.php',
1278
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateUpdate' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateUpdate.php',
1279
  'Piwik\\Plugins\\CoreConsole\\Commands\\GenerateVisualizationPlugin' => __DIR__ . '/../..' . '/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php',
1707
  'Piwik\\Plugins\\ExamplePlugin\\API' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/API.php',
1708
  'Piwik\\Plugins\\ExamplePlugin\\Archiver' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Archiver.php',
1709
  'Piwik\\Plugins\\ExamplePlugin\\Controller' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Controller.php',
1710
+ 'Piwik\\Plugins\\ExamplePlugin\\Diagnostic\\ExampleCheck' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Diagnostic/ExampleCheck.php',
1711
  'Piwik\\Plugins\\ExamplePlugin\\ExamplePlugin' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/ExamplePlugin.php',
1712
  'Piwik\\Plugins\\ExamplePlugin\\Menu' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Menu.php',
1713
  'Piwik\\Plugins\\ExamplePlugin\\Tasks' => __DIR__ . '/../..' . '/plugins/ExamplePlugin/Tasks.php',
2231
  'Piwik\\Plugins\\ScheduledReports\\SubscriptionModel' => __DIR__ . '/../..' . '/plugins/ScheduledReports/SubscriptionModel.php',
2232
  'Piwik\\Plugins\\ScheduledReports\\Tasks' => __DIR__ . '/../..' . '/plugins/ScheduledReports/Tasks.php',
2233
  'Piwik\\Plugins\\ScheduledReports\\tests\\Fixtures\\ReportSubscription' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php',
2234
+ 'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ApiTest' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Integration/ApiTest.php',
2235
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGeneratorTest' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php',
2236
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\AttachedFileReportEmailGeneratorTest' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php',
2237
  'Piwik\\Plugins\\ScheduledReports\\tests\\Integration\\ReportEmailGenerator\\HtmlReportEmailGeneratorTest' => __DIR__ . '/../..' . '/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php',
2622
  'Piwik\\Plugins\\UserCountry\\UserCountry' => __DIR__ . '/../..' . '/plugins/UserCountry/UserCountry.php',
2623
  'Piwik\\Plugins\\UserCountry\\VisitorDetails' => __DIR__ . '/../..' . '/plugins/UserCountry/VisitorDetails.php',
2624
  'Piwik\\Plugins\\UserCountry\\VisitorGeolocator' => __DIR__ . '/../..' . '/plugins/UserCountry/VisitorGeolocator.php',
2625
+ 'Piwik\\Plugins\\UserCountry\\tests\\Fixtures\\ManySitesManyVisitsWithGeoIp' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/Fixtures/ManySitesManyVisitsWithGeoIp.php',
2626
+ 'Piwik\\Plugins\\UserCountry\\tests\\Integration\\LocationProviderTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/Integration/LocationProviderTest.php',
2627
  'Piwik\\Plugins\\UserCountry\\tests\\Integration\\VisitorGeolocatorTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php',
2628
+ 'Piwik\\Plugins\\UserCountry\\tests\\System\\ApiTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/System/ApiTest.php',
2629
  'Piwik\\Plugins\\UserCountry\\tests\\System\\AttributeHistoricalDataWithLocationsTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php',
2630
  'Piwik\\Plugins\\UserCountry\\tests\\Unit\\UserCountryTest' => __DIR__ . '/../..' . '/plugins/UserCountry/tests/Unit/UserCountryTest.php',
2631
  'Piwik\\Plugins\\UserId\\API' => __DIR__ . '/../..' . '/plugins/UserId/API.php',
3044
  'Symfony\\Component\\EventDispatcher\\Tests\\GenericEventTest' => __DIR__ . '/..' . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php',
3045
  'Symfony\\Component\\EventDispatcher\\Tests\\ImmutableEventDispatcherTest' => __DIR__ . '/..' . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php',
3046
  'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
3047
+ 'Symfony\\Polyfill\\Iconv\\Iconv' => __DIR__ . '/..' . '/symfony/polyfill-iconv/Iconv.php',
3048
  'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
3049
  'System' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/System.php',
3050
  'TCPDF' => __DIR__ . '/..' . '/tecnickcom/tcpdf/tcpdf.php',
3307
  public static function getInitializer(ClassLoader $loader)
3308
  {
3309
  return \Closure::bind(function () use ($loader) {
3310
+ $loader->prefixLengthsPsr4 = ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c::$prefixLengthsPsr4;
3311
+ $loader->prefixDirsPsr4 = ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c::$prefixDirsPsr4;
3312
+ $loader->prefixesPsr0 = ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c::$prefixesPsr0;
3313
+ $loader->fallbackDirsPsr0 = ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c::$fallbackDirsPsr0;
3314
+ $loader->classMap = ComposerStaticInit9209fd533b4c3cc6523ff4b3463ad39c::$classMap;
3315
 
3316
  }, null, ClassLoader::class);
3317
  }
app/vendor/composer/installed.php CHANGED
@@ -1,457 +1,452 @@
1
- <?php return array (
2
- 'root' =>
3
- array (
4
- 'pretty_version' => '4.3.1-rc1',
5
- 'version' => '4.3.1.0-RC1',
6
- 'aliases' =>
7
- array (
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  ),
9
- 'reference' => '440965f7c0d48e5a5081a33ce30c6f38822e64f1',
10
- 'name' => 'matomo/matomo',
11
- ),
12
- 'versions' =>
13
- array (
14
- 'composer/ca-bundle' =>
15
- array (
16
- 'pretty_version' => '1.2.8',
17
- 'version' => '1.2.8.0',
18
- 'aliases' =>
19
- array (
20
- ),
21
- 'reference' => '8a7ecad675253e4654ea05505233285377405215',
22
- ),
23
- 'composer/semver' =>
24
- array (
25
- 'pretty_version' => '1.3.0',
26
- 'version' => '1.3.0.0',
27
- 'aliases' =>
28
- array (
29
- ),
30
- 'reference' => 'df4463baa9f44fe6cf0a6da4fde2934d4c0a2747',
31
- ),
32
- 'davaxi/sparkline' =>
33
- array (
34
- 'pretty_version' => '1.2.2',
35
- 'version' => '1.2.2.0',
36
- 'aliases' =>
37
- array (
38
- ),
39
- 'reference' => '380d447fcfc6468f7d8e5c041e8c01b8ec969959',
40
- ),
41
- 'doctrine/cache' =>
42
- array (
43
- 'pretty_version' => '1.10.2',
44
- 'version' => '1.10.2.0',
45
- 'aliases' =>
46
- array (
47
- ),
48
- 'reference' => '13e3381b25847283a91948d04640543941309727',
49
- ),
50
- 'geoip2/geoip2' =>
51
- array (
52
- 'pretty_version' => 'v2.11.0',
53
- 'version' => '2.11.0.0',
54
- 'aliases' =>
55
- array (
56
- ),
57
- 'reference' => 'd01be5894a5c1a3381c58c9b1795cd07f96c30f7',
58
- ),
59
- 'matomo/cache' =>
60
- array (
61
- 'pretty_version' => '2.0.2',
62
- 'version' => '2.0.2.0',
63
- 'aliases' =>
64
- array (
65
- ),
66
- 'reference' => '01e82b9dc0f2f8b0ee070212b0e9e91045f60926',
67
- ),
68
- 'matomo/decompress' =>
69
- array (
70
- 'pretty_version' => '2.1.0',
71
- 'version' => '2.1.0.0',
72
- 'aliases' =>
73
- array (
74
- ),
75
- 'reference' => '44dcf77dcd633a9c336f90d80658ad3d25225e05',
76
- ),
77
- 'matomo/device-detector' =>
78
- array (
79
- 'pretty_version' => '4.2.3',
80
- 'version' => '4.2.3.0',
81
- 'aliases' =>
82
- array (
83
- ),
84
- 'reference' => 'd879f07496d6e6ee89cef5bcd925383d9b0c2cc0',
85
- ),
86
- 'matomo/ini' =>
87
- array (
88
- 'pretty_version' => '2.0.2',
89
- 'version' => '2.0.2.0',
90
- 'aliases' =>
91
- array (
92
- ),
93
- 'reference' => 'f7b0d6ce594b34ead16864fbc5062c771328ac31',
94
- ),
95
- 'matomo/matomo' =>
96
- array (
97
- 'pretty_version' => '4.3.1-rc1',
98
- 'version' => '4.3.1.0-RC1',
99
- 'aliases' =>
100
- array (
101
- ),
102
- 'reference' => '440965f7c0d48e5a5081a33ce30c6f38822e64f1',
103
- ),
104
- 'matomo/matomo-php-tracker' =>
105
- array (
106
- 'pretty_version' => '3.0.0',
107
- 'version' => '3.0.0.0',
108
- 'aliases' =>
109
- array (
110
- ),
111
- 'reference' => '31e2b0bdf479c6fc00758228d2c6d7c85c1863a0',
112
- ),
113
- 'matomo/network' =>
114
- array (
115
- 'pretty_version' => '2.0.1',
116
- 'version' => '2.0.1.0',
117
- 'aliases' =>
118
- array (
119
- ),
120
- 'reference' => 'ff654b8fc7778b80279815d06a368f7b41249501',
121
- ),
122
- 'matomo/referrer-spam-blacklist' =>
123
- array (
124
- 'replaced' =>
125
- array (
126
- 0 => '*',
127
- ),
128
- ),
129
- 'matomo/referrer-spam-list' =>
130
- array (
131
- 'pretty_version' => '4.0.0',
132
- 'version' => '4.0.0.0',
133
- 'aliases' =>
134
- array (
135
- ),
136
- 'reference' => 'afe4c1ea107ee7a8915a0d5eb0031cf0366608a8',
137
- ),
138
- 'matomo/searchengine-and-social-list' =>
139
- array (
140
- 'pretty_version' => '3.11.0',
141
- 'version' => '3.11.0.0',
142
- 'aliases' =>
143
- array (
144
- ),
145
- 'reference' => '80ab98ed17ea5b72730f4f4d96acc03847440103',
146
- ),
147
- 'maxmind-db/reader' =>
148
- array (
149
- 'pretty_version' => 'v1.8.0',
150
- 'version' => '1.8.0.0',
151
- 'aliases' =>
152
- array (
153
- ),
154
- 'reference' => 'b566d429ac9aec10594b0935be8ff38302f8d5c8',
155
- ),
156
- 'maxmind/web-service-common' =>
157
- array (
158
- 'pretty_version' => 'v0.8.1',
159
- 'version' => '0.8.1.0',
160
- 'aliases' =>
161
- array (
162
- ),
163
- 'reference' => '32f274051c543fc865e5a84d3a2c703913641ea8',
164
- ),
165
- 'monolog/monolog' =>
166
- array (
167
- 'pretty_version' => '1.25.5',
168
- 'version' => '1.25.5.0',
169
- 'aliases' =>
170
- array (
171
- ),
172
- 'reference' => '1817faadd1846cd08be9a49e905dc68823bc38c0',
173
- ),
174
- 'mustangostang/spyc' =>
175
- array (
176
- 'pretty_version' => '0.6.3',
177
- 'version' => '0.6.3.0',
178
- 'aliases' =>
179
- array (
180
- ),
181
- 'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
182
- ),
183
- 'opis/closure' =>
184
- array (
185
- 'pretty_version' => '3.6.1',
186
- 'version' => '3.6.1.0',
187
- 'aliases' =>
188
- array (
189
- ),
190
- 'reference' => '943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5',
191
- ),
192
- 'pear/archive_tar' =>
193
- array (
194
- 'pretty_version' => '1.4.13',
195
- 'version' => '1.4.13.0',
196
- 'aliases' =>
197
- array (
198
- ),
199
- 'reference' => '2b87b41178cc6d4ad3cba678a46a1cae49786011',
200
- ),
201
- 'pear/console_getopt' =>
202
- array (
203
- 'pretty_version' => 'v1.4.3',
204
- 'version' => '1.4.3.0',
205
- 'aliases' =>
206
- array (
207
- ),
208
- 'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0',
209
- ),
210
- 'pear/pear-core-minimal' =>
211
- array (
212
- 'pretty_version' => 'v1.10.10',
213
- 'version' => '1.10.10.0',
214
- 'aliases' =>
215
- array (
216
- ),
217
- 'reference' => '625a3c429d9b2c1546438679074cac1b089116a7',
218
- ),
219
- 'pear/pear_exception' =>
220
- array (
221
- 'pretty_version' => 'v1.0.1',
222
- 'version' => '1.0.1.0',
223
- 'aliases' =>
224
- array (
225
- ),
226
- 'reference' => 'dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7',
227
- ),
228
- 'php-di/invoker' =>
229
- array (
230
- 'pretty_version' => '2.0.0',
231
- 'version' => '2.0.0.0',
232
- 'aliases' =>
233
- array (
234
- ),
235
- 'reference' => '540c27c86f663e20fe39a24cd72fa76cdb21d41a',
236
- ),
237
- 'php-di/php-di' =>
238
- array (
239
- 'pretty_version' => '6.3.0',
240
- 'version' => '6.3.0.0',
241
- 'aliases' =>
242
- array (
243
- ),
244
- 'reference' => '955cacea6b0beaba07e8c11b8367f5b3d5abe89f',
245
- ),
246
- 'php-di/phpdoc-reader' =>
247
- array (
248
- 'pretty_version' => '2.2.1',
249
- 'version' => '2.2.1.0',
250
- 'aliases' =>
251
- array (
252
- ),
253
- 'reference' => '66daff34cbd2627740ffec9469ffbac9f8c8185c',
254
- ),
255
- 'phpmailer/phpmailer' =>
256
- array (
257
- 'pretty_version' => 'v6.4.1',
258
- 'version' => '6.4.1.0',
259
- 'aliases' =>
260
- array (
261
- ),
262
- 'reference' => '9256f12d8fb0cd0500f93b19e18c356906cbed3d',
263
- ),
264
- 'piwik/device-detector' =>
265
- array (
266
- 'replaced' =>
267
- array (
268
- 0 => '4.2.3',
269
- ),
270
- ),
271
- 'piwik/referrer-spam-blacklist' =>
272
- array (
273
- 'replaced' =>
274
- array (
275
- 0 => '*',
276
- ),
277
- ),
278
- 'piwik/searchengine-and-social-list' =>
279
- array (
280
- 'replaced' =>
281
- array (
282
- 0 => '*',
283
- ),
284
- ),
285
- 'psr/container' =>
286
- array (
287
- 'pretty_version' => '1.0.0',
288
- 'version' => '1.0.0.0',
289
- 'aliases' =>
290
- array (
291
- ),
292
- 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f',
293
- ),
294
- 'psr/container-implementation' =>
295
- array (
296
- 'provided' =>
297
- array (
298
- 0 => '^1.0',
299
- ),
300
- ),
301
- 'psr/log' =>
302
- array (
303
- 'pretty_version' => '1.1.3',
304
- 'version' => '1.1.3.0',
305
- 'aliases' =>
306
- array (
307
- ),
308
- 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc',
309
- ),
310
- 'psr/log-implementation' =>
311
- array (
312
- 'provided' =>
313
- array (
314
- 0 => '1.0.0',
315
- ),
316
- ),
317
- 'rsky/pear-core-min' =>
318
- array (
319
- 'replaced' =>
320
- array (
321
- 0 => 'v1.10.10',
322
- ),
323
- ),
324
- 'symfony/console' =>
325
- array (
326
- 'pretty_version' => 'v2.6.13',
327
- 'version' => '2.6.13.0',
328
- 'aliases' =>
329
- array (
330
- ),
331
- 'reference' => '0e5e18ae09d3f5c06367759be940e9ed3f568359',
332
- ),
333
- 'symfony/event-dispatcher' =>
334
- array (
335
- 'pretty_version' => 'v2.6.13',
336
- 'version' => '2.6.13.0',
337
- 'aliases' =>
338
- array (
339
- ),
340
- 'reference' => '672593bc4b0043a0acf91903bb75a1c82d8f2e02',
341
- ),
342
- 'symfony/monolog-bridge' =>
343
- array (
344
- 'pretty_version' => 'v2.6.13',
345
- 'version' => '2.6.13.0',
346
- 'aliases' =>
347
- array (
348
- ),
349
- 'reference' => 'ba66eeabaa004e3ab70764cab59b056b182aa535',
350
- ),
351
- 'symfony/polyfill-ctype' =>
352
- array (
353
- 'pretty_version' => 'v1.20.0',
354
- 'version' => '1.20.0.0',
355
- 'aliases' =>
356
- array (
357
- ),
358
- 'reference' => 'f4ba089a5b6366e453971d3aad5fe8e897b37f41',
359
- ),
360
- 'symfony/polyfill-mbstring' =>
361
- array (
362
- 'pretty_version' => 'v1.20.0',
363
- 'version' => '1.20.0.0',
364
- 'aliases' =>
365
- array (
366
- ),
367
- 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531',
368
- ),
369
- 'symfony/polyfill-php54' =>
370
- array (
371
- 'replaced' =>
372
- array (
373
- 0 => '*',
374
- ),
375
- ),
376
- 'symfony/polyfill-php55' =>
377
- array (
378
- 'replaced' =>
379
- array (
380
- 0 => '*',
381
- ),
382
- ),
383
- 'symfony/polyfill-php56' =>
384
- array (
385
- 'replaced' =>
386
- array (
387
- 0 => '*',
388
- ),
389
- ),
390
- 'symfony/polyfill-php70' =>
391
- array (
392
- 'replaced' =>
393
- array (
394
- 0 => '*',
395
- ),
396
- ),
397
- 'symfony/polyfill-php71' =>
398
- array (
399
- 'replaced' =>
400
- array (
401
- 0 => '*',
402
- ),
403
- ),
404
- 'symfony/polyfill-php72' =>
405
- array (
406
- 'replaced' =>
407
- array (
408
- 0 => '*',
409
- ),
410
- ),
411
- 'szymach/c-pchart' =>
412
- array (
413
- 'pretty_version' => 'v2.0.12',
414
- 'version' => '2.0.12.0',
415
- 'aliases' =>
416
- array (
417
- ),
418
- 'reference' => 'f5fad68b303f65225db1a3d3f4bb58aea7a418b4',
419
- ),
420
- 'tecnickcom/tcpdf' =>
421
- array (
422
- 'pretty_version' => '6.4.1',
423
- 'version' => '6.4.1.0',
424
- 'aliases' =>
425
- array (
426
- ),
427
- 'reference' => '5ba838befdb37ef06a16d9f716f35eb03cb1b329',
428
- ),
429
- 'tedivm/jshrink' =>
430
- array (
431
- 'pretty_version' => 'v1.4.0',
432
- 'version' => '1.4.0.0',
433
- 'aliases' =>
434
- array (
435
- ),
436
- 'reference' => '0513ba1407b1f235518a939455855e6952a48bbc',
437
- ),
438
- 'twig/twig' =>
439
- array (
440
- 'pretty_version' => 'v3.1.1',
441
- 'version' => '3.1.1.0',
442
- 'aliases' =>
443
- array (
444
- ),
445
- 'reference' => 'b02fa41f3783a2616eccef7b92fbc2343ffed737',
446
- ),
447
- 'wikimedia/less.php' =>
448
- array (
449
- 'pretty_version' => 'v3.1.0',
450
- 'version' => '3.1.0.0',
451
- 'aliases' =>
452
- array (
453
- ),
454
- 'reference' => 'a486d78b9bd16b72f237fc6093aa56d69ce8bd13',
455
- ),
456
- ),
457
  );
1
+ <?php return array(
2
+ 'root' => array(
3
+ 'pretty_version' => '4.4.1',
4
+ 'version' => '4.4.1.0',
5
+ 'type' => 'application',
6
+ 'install_path' => __DIR__ . '/../../',
7
+ 'aliases' => array(),
8
+ 'reference' => 'f57a5313f7923c60e55c2b101351bccaae287330',
9
+ 'name' => 'matomo/matomo',
10
+ 'dev' => false,
11
+ ),
12
+ 'versions' => array(
13
+ 'composer/ca-bundle' => array(
14
+ 'pretty_version' => '1.2.8',
15
+ 'version' => '1.2.8.0',
16
+ 'type' => 'library',
17
+ 'install_path' => __DIR__ . '/./ca-bundle',
18
+ 'aliases' => array(),
19
+ 'reference' => '8a7ecad675253e4654ea05505233285377405215',
20
+ 'dev_requirement' => false,
21
+ ),
22
+ 'composer/semver' => array(
23
+ 'pretty_version' => '1.3.0',
24
+ 'version' => '1.3.0.0',
25
+ 'type' => 'library',
26
+ 'install_path' => __DIR__ . '/./semver',
27
+ 'aliases' => array(),
28
+ 'reference' => 'df4463baa9f44fe6cf0a6da4fde2934d4c0a2747',
29
+ 'dev_requirement' => false,
30
+ ),
31
+ 'davaxi/sparkline' => array(
32
+ 'pretty_version' => '1.2.2',
33
+ 'version' => '1.2.2.0',
34
+ 'type' => 'library',
35
+ 'install_path' => __DIR__ . '/../davaxi/sparkline',
36
+ 'aliases' => array(),
37
+ 'reference' => '380d447fcfc6468f7d8e5c041e8c01b8ec969959',
38
+ 'dev_requirement' => false,
39
+ ),
40
+ 'geoip2/geoip2' => array(
41
+ 'pretty_version' => 'v2.11.0',
42
+ 'version' => '2.11.0.0',
43
+ 'type' => 'library',
44
+ 'install_path' => __DIR__ . '/../geoip2/geoip2',
45
+ 'aliases' => array(),
46
+ 'reference' => 'd01be5894a5c1a3381c58c9b1795cd07f96c30f7',
47
+ 'dev_requirement' => false,
48
+ ),
49
+ 'matomo/cache' => array(
50
+ 'pretty_version' => '2.0.3',
51
+ 'version' => '2.0.3.0',
52
+ 'type' => 'library',
53
+ 'install_path' => __DIR__ . '/../matomo/cache',
54
+ 'aliases' => array(),
55
+ 'reference' => 'f058d5340fa427cac2b674e1ad41f1a8620c580b',
56
+ 'dev_requirement' => false,
57
+ ),
58
+ 'matomo/decompress' => array(
59
+ 'pretty_version' => '2.1.0',
60
+ 'version' => '2.1.0.0',
61
+ 'type' => 'library',
62
+ 'install_path' => __DIR__ . '/../matomo/decompress',
63
+ 'aliases' => array(),
64
+ 'reference' => '44dcf77dcd633a9c336f90d80658ad3d25225e05',
65
+ 'dev_requirement' => false,
66
+ ),
67
+ 'matomo/device-detector' => array(
68
+ 'pretty_version' => '4.3.0',
69
+ 'version' => '4.3.0.0',
70
+ 'type' => 'library',
71
+ 'install_path' => __DIR__ . '/../matomo/device-detector',
72
+ 'aliases' => array(),
73
+ 'reference' => '3fcceafc601444412ce65297ba4ce878ee77e450',
74
+ 'dev_requirement' => false,
75
+ ),
76
+ 'matomo/doctrine-cache-fork' => array(
77
+ 'pretty_version' => '1.10.2',
78
+ 'version' => '1.10.2.0',
79
+ 'type' => 'library',
80
+ 'install_path' => __DIR__ . '/../matomo/doctrine-cache-fork',
81
+ 'aliases' => array(),
82
+ 'reference' => '021cfa412520c110b096bd49d93ccb482f7b6eef',
83
+ 'dev_requirement' => false,
84
+ ),
85
+ 'matomo/ini' => array(
86
+ 'pretty_version' => '2.0.2',
87
+ 'version' => '2.0.2.0',
88
+ 'type' => 'library',
89
+ 'install_path' => __DIR__ . '/../matomo/ini',
90
+ 'aliases' => array(),
91
+ 'reference' => 'f7b0d6ce594b34ead16864fbc5062c771328ac31',
92
+ 'dev_requirement' => false,
93
+ ),
94
+ 'matomo/matomo' => array(
95
+ 'pretty_version' => '4.4.1',
96
+ 'version' => '4.4.1.0',
97
+ 'type' => 'application',
98
+ 'install_path' => __DIR__ . '/../../',
99
+ 'aliases' => array(),
100
+ 'reference' => 'f57a5313f7923c60e55c2b101351bccaae287330',
101
+ 'dev_requirement' => false,
102
+ ),
103
+ 'matomo/matomo-php-tracker' => array(
104
+ 'pretty_version' => '3.0.0',
105
+ 'version' => '3.0.0.0',
106
+ 'type' => 'library',
107
+ 'install_path' => __DIR__ . '/../matomo/matomo-php-tracker',
108
+ 'aliases' => array(),
109
+ 'reference' => '31e2b0bdf479c6fc00758228d2c6d7c85c1863a0',
110
+ 'dev_requirement' => false,
111
+ ),
112
+ 'matomo/network' => array(
113
+ 'pretty_version' => '2.0.1',
114
+ 'version' => '2.0.1.0',
115
+ 'type' => 'library',
116
+ 'install_path' => __DIR__ . '/../matomo/network',
117
+ 'aliases' => array(),
118
+ 'reference' => 'ff654b8fc7778b80279815d06a368f7b41249501',
119
+ 'dev_requirement' => false,
120
+ ),
121
+ 'matomo/referrer-spam-blacklist' => array(
122
+ 'dev_requirement' => false,
123
+ 'replaced' => array(
124
+ 0 => '*',
125
+ ),
126
+ ),
127
+ 'matomo/referrer-spam-list' => array(
128
+ 'pretty_version' => '4.0.0',
129
+ 'version' => '4.0.0.0',
130
+ 'type' => 'library',
131
+ 'install_path' => __DIR__ . '/../matomo/referrer-spam-list',
132
+ 'aliases' => array(),
133
+ 'reference' => 'afe4c1ea107ee7a8915a0d5eb0031cf0366608a8',
134
+ 'dev_requirement' => false,
135
+ ),
136
+ 'matomo/searchengine-and-social-list' => array(
137
+ 'pretty_version' => '3.11.0',
138
+ 'version' => '3.11.0.0',
139
+ 'type' => 'library',
140
+ 'install_path' => __DIR__ . '/../matomo/searchengine-and-social-list',
141
+ 'aliases' => array(),
142
+ 'reference' => '80ab98ed17ea5b72730f4f4d96acc03847440103',
143
+ 'dev_requirement' => false,
144
+ ),
145
+ 'maxmind-db/reader' => array(
146
+ 'pretty_version' => 'v1.8.0',
147
+ 'version' => '1.8.0.0',
148
+ 'type' => 'library',
149
+ 'install_path' => __DIR__ . '/../maxmind-db/reader',
150
+ 'aliases' => array(),
151
+ 'reference' => 'b566d429ac9aec10594b0935be8ff38302f8d5c8',
152
+ 'dev_requirement' => false,
153
+ ),
154
+ 'maxmind/web-service-common' => array(
155
+ 'pretty_version' => 'v0.8.1',
156
+ 'version' => '0.8.1.0',
157
+ 'type' => 'library',
158
+ 'install_path' => __DIR__ . '/../maxmind/web-service-common',
159
+ 'aliases' => array(),
160
+ 'reference' => '32f274051c543fc865e5a84d3a2c703913641ea8',
161
+ 'dev_requirement' => false,
162
+ ),
163
+ 'monolog/monolog' => array(
164
+ 'pretty_version' => '1.25.5',
165
+ 'version' => '1.25.5.0',
166
+ 'type' => 'library',
167
+ 'install_path' => __DIR__ . '/../monolog/monolog',
168
+ 'aliases' => array(),
169
+ 'reference' => '1817faadd1846cd08be9a49e905dc68823bc38c0',
170
+ 'dev_requirement' => false,
171
+ ),
172
+ 'mustangostang/spyc' => array(
173
+ 'pretty_version' => '0.6.3',
174
+ 'version' => '0.6.3.0',
175
+ 'type' => 'library',
176
+ 'install_path' => __DIR__ . '/../mustangostang/spyc',
177
+ 'aliases' => array(),
178
+ 'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
179
+ 'dev_requirement' => false,
180
+ ),
181
+ 'opis/closure' => array(
182
+ 'pretty_version' => '3.6.1',
183
+ 'version' => '3.6.1.0',
184
+ 'type' => 'library',
185
+ 'install_path' => __DIR__ . '/../opis/closure',
186
+ 'aliases' => array(),
187
+ 'reference' => '943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5',
188
+ 'dev_requirement' => false,
189
+ ),
190
+ 'pear/archive_tar' => array(
191
+ 'pretty_version' => '1.4.13',
192
+ 'version' => '1.4.13.0',
193
+ 'type' => 'library',
194
+ 'install_path' => __DIR__ . '/../pear/archive_tar',
195
+ 'aliases' => array(),
196
+ 'reference' => '2b87b41178cc6d4ad3cba678a46a1cae49786011',
197
+ 'dev_requirement' => false,
198
+ ),
199
+ 'pear/console_getopt' => array(
200
+ 'pretty_version' => 'v1.4.3',
201
+ 'version' => '1.4.3.0',
202
+ 'type' => 'library',
203
+ 'install_path' => __DIR__ . '/../pear/console_getopt',
204
+ 'aliases' => array(),
205
+ 'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0',
206
+ 'dev_requirement' => false,
207
+ ),
208
+ 'pear/pear-core-minimal' => array(
209
+ 'pretty_version' => 'v1.10.10',
210
+ 'version' => '1.10.10.0',
211
+ 'type' => 'library',
212
+ 'install_path' => __DIR__ . '/../pear/pear-core-minimal',
213
+ 'aliases' => array(),
214
+ 'reference' => '625a3c429d9b2c1546438679074cac1b089116a7',
215
+ 'dev_requirement' => false,
216
+ ),
217
+ 'pear/pear_exception' => array(
218
+ 'pretty_version' => 'v1.0.1',
219
+ 'version' => '1.0.1.0',
220
+ 'type' => 'class',
221
+ 'install_path' => __DIR__ . '/../pear/pear_exception',
222
+ 'aliases' => array(),
223
+ 'reference' => 'dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7',
224
+ 'dev_requirement' => false,
225
+ ),
226
+ 'php-di/invoker' => array(
227
+ 'pretty_version' => '2.0.0',
228
+ 'version' => '2.0.0.0',
229
+ 'type' => 'library',
230
+ 'install_path' => __DIR__ . '/../php-di/invoker',
231
+ 'aliases' => array(),
232
+ 'reference' => '540c27c86f663e20fe39a24cd72fa76cdb21d41a',
233
+ 'dev_requirement' => false,
234
+ ),
235
+ 'php-di/php-di' => array(
236
+ 'pretty_version' => '6.3.0',
237
+ 'version' => '6.3.0.0',
238
+ 'type' => 'library',
239
+ 'install_path' => __DIR__ . '/../php-di/php-di',
240
+ 'aliases' => array(),
241
+ 'reference' => '955cacea6b0beaba07e8c11b8367f5b3d5abe89f',
242
+ 'dev_requirement' => false,
243
+ ),
244
+ 'php-di/phpdoc-reader' => array(
245
+ 'pretty_version' => '2.2.1',
246
+ 'version' => '2.2.1.0',
247
+ 'type' => 'library',
248
+ 'install_path' => __DIR__ . '/../php-di/phpdoc-reader',
249
+ 'aliases' => array(),
250
+ 'reference' => '66daff34cbd2627740ffec9469ffbac9f8c8185c',
251
+ 'dev_requirement' => false,
252
+ ),
253
+ 'phpmailer/phpmailer' => array(
254
+ 'pretty_version' => 'v6.5.0',
255
+ 'version' => '6.5.0.0',
256
+ 'type' => 'library',
257
+ 'install_path' => __DIR__ . '/../phpmailer/phpmailer',
258
+ 'aliases' => array(),
259
+ 'reference' => 'a5b5c43e50b7fba655f793ad27303cd74c57363c',
260
+ 'dev_requirement' => false,
261
+ ),
262
+ 'piwik/device-detector' => array(
263
+ 'dev_requirement' => false,
264
+ 'replaced' => array(
265
+ 0 => '4.3.0',
266
+ ),
267
+ ),
268
+ 'piwik/referrer-spam-blacklist' => array(
269
+ 'dev_requirement' => false,
270
+ 'replaced' => array(
271
+ 0 => '*',
272
+ ),
273
+ ),
274
+ 'piwik/searchengine-and-social-list' => array(
275
+ 'dev_requirement' => false,
276
+ 'replaced' => array(
277
+ 0 => '*',
278
+ ),
279
+ ),
280
+ 'psr/container' => array(
281
+ 'pretty_version' => '1.0.0',
282
+ 'version' => '1.0.0.0',
283
+ 'type' => 'library',
284
+ 'install_path' => __DIR__ . '/../psr/container',
285
+ 'aliases' => array(),
286
+ 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f',
287
+ 'dev_requirement' => false,
288
+ ),
289
+ 'psr/container-implementation' => array(
290
+ 'dev_requirement' => false,
291
+ 'provided' => array(
292
+ 0 => '^1.0',
293
+ ),
294
+ ),
295
+ 'psr/log' => array(
296
+ 'pretty_version' => '1.1.3',
297
+ 'version' => '1.1.3.0',
298
+ 'type' => 'library',
299
+ 'install_path' => __DIR__ . '/../psr/log',
300
+ 'aliases' => array(),
301
+ 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc',
302
+ 'dev_requirement' => false,
303
+ ),
304
+ 'psr/log-implementation' => array(
305
+ 'dev_requirement' => false,
306
+ 'provided' => array(
307
+ 0 => '1.0.0',
308
+ ),
309
+ ),
310
+ 'rsky/pear-core-min' => array(
311
+ 'dev_requirement' => false,
312
+ 'replaced' => array(
313
+ 0 => 'v1.10.10',
314
+ ),
315
+ ),
316
+ 'symfony/console' => array(
317
+ 'pretty_version' => 'v2.6.13',
318
+ 'version' => '2.6.13.0',
319
+ 'type' => 'library',
320
+ 'install_path' => __DIR__ . '/../symfony/console/Symfony/Component/Console',
321
+ 'aliases' => array(),
322
+ 'reference' => '0e5e18ae09d3f5c06367759be940e9ed3f568359',
323
+ 'dev_requirement' => false,
324
+ ),
325
+ 'symfony/event-dispatcher' => array(
326
+ 'pretty_version' => 'v2.6.13',
327
+ 'version' => '2.6.13.0',
328
+ 'type' => 'library',
329
+ 'install_path' => __DIR__ . '/../symfony/event-dispatcher/Symfony/Component/EventDispatcher',
330
+ 'aliases' => array(),
331
+ 'reference' => '672593bc4b0043a0acf91903bb75a1c82d8f2e02',
332
+ 'dev_requirement' => false,
333
+ ),
334
+ 'symfony/monolog-bridge' => array(
335
+ 'pretty_version' => 'v2.6.13',
336
+ 'version' => '2.6.13.0',
337
+ 'type' => 'symfony-bridge',
338
+ 'install_path' => __DIR__ . '/../symfony/monolog-bridge/Symfony/Bridge/Monolog',
339
+ 'aliases' => array(),
340
+ 'reference' => 'ba66eeabaa004e3ab70764cab59b056b182aa535',
341
+ 'dev_requirement' => false,
342
+ ),
343
+ 'symfony/polyfill-ctype' => array(
344
+ 'pretty_version' => 'v1.20.0',
345
+ 'version' => '1.20.0.0',
346
+ 'type' => 'library',
347
+ 'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
348
+ 'aliases' => array(),
349
+ 'reference' => 'f4ba089a5b6366e453971d3aad5fe8e897b37f41',
350
+ 'dev_requirement' => false,
351
+ ),
352
+ 'symfony/polyfill-iconv' => array(
353
+ 'pretty_version' => 'v1.20.0',
354
+ 'version' => '1.20.0.0',
355
+ 'type' => 'library',
356
+ 'install_path' => __DIR__ . '/../symfony/polyfill-iconv',
357
+ 'aliases' => array(),
358
+ 'reference' => 'c536646fdb4f29104dd26effc2fdcb9a5b085024',
359
+ 'dev_requirement' => false,
360
+ ),
361
+ 'symfony/polyfill-mbstring' => array(
362
+ 'pretty_version' => 'v1.20.0',
363
+ 'version' => '1.20.0.0',
364
+ 'type' => 'library',
365
+ 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
366
+ 'aliases' => array(),
367
+ 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531',
368
+ 'dev_requirement' => false,
369
+ ),
370
+ 'symfony/polyfill-php54' => array(
371
+ 'dev_requirement' => false,
372
+ 'replaced' => array(
373
+ 0 => '*',
374
+ ),
375
+ ),
376
+ 'symfony/polyfill-php55' => array(
377
+ 'dev_requirement' => false,
378
+ 'replaced' => array(
379
+ 0 => '*',
380
+ ),
381
+ ),
382
+ 'symfony/polyfill-php56' => array(
383
+ 'dev_requirement' => false,
384
+ 'replaced' => array(
385
+ 0 => '*',
386
+ ),
387
+ ),
388
+ 'symfony/polyfill-php70' => array(
389
+ 'dev_requirement' => false,
390
+ 'replaced' => array(
391
+ 0 => '*',
392
+ ),
393
+ ),
394
+ 'symfony/polyfill-php71' => array(
395
+ 'dev_requirement' => false,
396
+ 'replaced' => array(
397
+ 0 => '*',
398
+ ),
399
+ ),
400
+ 'symfony/polyfill-php72' => array(
401
+ 'dev_requirement' => false,
402
+ 'replaced' => array(
403
+ 0 => '*',
404
+ ),
405
+ ),
406
+ 'szymach/c-pchart' => array(
407
+ 'pretty_version' => 'v2.0.12',
408
+ 'version' => '2.0.12.0',
409
+ 'type' => 'project',
410
+ 'install_path' => __DIR__ . '/../szymach/c-pchart',
411
+ 'aliases' => array(),
412
+ 'reference' => 'f5fad68b303f65225db1a3d3f4bb58aea7a418b4',
413
+ 'dev_requirement' => false,
414
+ ),
415
+ 'tecnickcom/tcpdf' => array(
416
+ 'pretty_version' => '6.4.1',
417
+ 'version' => '6.4.1.0',
418
+ 'type' => 'library',
419
+ 'install_path' => __DIR__ . '/../tecnickcom/tcpdf',
420
+ 'aliases' => array(),
421
+ 'reference' => '5ba838befdb37ef06a16d9f716f35eb03cb1b329',
422
+ 'dev_requirement' => false,
423
+ ),
424
+ 'tedivm/jshrink' => array(
425
+ 'pretty_version' => 'v1.4.0',
426
+ 'version' => '1.4.0.0',
427
+ 'type' => 'library',
428
+ 'install_path' => __DIR__ . '/../tedivm/jshrink',
429
+ 'aliases' => array(),
430
+ 'reference' => '0513ba1407b1f235518a939455855e6952a48bbc',
431
+ 'dev_requirement' => false,
432
+ ),
433
+ 'twig/twig' => array(
434
+ 'pretty_version' => 'v3.1.1',
435
+ 'version' => '3.1.1.0',
436
+ 'type' => 'library',
437
+ 'install_path' => __DIR__ . '/../twig/twig',
438
+ 'aliases' => array(),
439
+ 'reference' => 'b02fa41f3783a2616eccef7b92fbc2343ffed737',
440
+ 'dev_requirement' => false,
441
+ ),
442
+ 'wikimedia/less.php' => array(
443
+ 'pretty_version' => 'v3.1.0',
444
+ 'version' => '3.1.0.0',
445
+ 'type' => 'library',
446
+ 'install_path' => __DIR__ . '/../wikimedia/less.php',
447
+ 'aliases' => array(),
448
+ 'reference' => 'a486d78b9bd16b72f237fc6093aa56d69ce8bd13',
449
+ 'dev_requirement' => false,
450
+ ),
451
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
452
  );
app/vendor/matomo/cache/README.md CHANGED
@@ -4,8 +4,7 @@ This is a PHP caching library based on [Doctrine cache](https://github.com/doctr
4
  At [Matomo](https://matomo.org) we developed this library with the focus on speed as we make heavy use of caching and
5
  sometimes fetch hundreds of entries from the cache in one request.
6
 
7
- [![Build Status](https://travis-ci.org/matomo-org/component-cache.svg?branch=master)](https://travis-ci.org/matomo-org/component-cache)
8
- [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/matomo-org/component-cache/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/matomo-org/component-cache/?branch=master)
9
 
10
  ## Installation
11
 
@@ -25,6 +24,7 @@ With Composer:
25
  * File (stores the cache entry on the file system)
26
  * Redis (stores the cache entry on a Redis server, requires [phpredis](https://github.com/nicolasff/phpredis))
27
  * Chained (allows to chain multiple backends to make sure it will read from a fast cache if possible)
 
28
 
29
  Doctrine cache provides support for many more backends and adding one of those is easy. For example:
30
  * APC
@@ -112,6 +112,29 @@ the cache entry from the file system. If the cache entry exists on the file syst
112
  using the array cache so the next read within this request will be fast and won't cause a stat call again. If you delete
113
  a cache entry it will be removed from all configured backends. You can chain any backends. It is recommended to list
114
  faster backends first.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
 
116
  ### Creating a lazy cache
117
 
4
  At [Matomo](https://matomo.org) we developed this library with the focus on speed as we make heavy use of caching and
5
  sometimes fetch hundreds of entries from the cache in one request.
6
 
7
+ [![Build Status](https://travis-ci.com/matomo-org/component-cache.svg?branch=master)](https://travis-ci.com/matomo-org/component-cache)
 
8
 
9
  ## Installation
10
 
24
  * File (stores the cache entry on the file system)
25
  * Redis (stores the cache entry on a Redis server, requires [phpredis](https://github.com/nicolasff/phpredis))
26
  * Chained (allows to chain multiple backends to make sure it will read from a fast cache if possible)
27
+ * DefaultTimeout and KeyPrefix can be used to wrap other backend with default parameters.
28
 
29
  Doctrine cache provides support for many more backends and adding one of those is easy. For example:
30
  * APC
112
  using the array cache so the next read within this request will be fast and won't cause a stat call again. If you delete
113
  a cache entry it will be removed from all configured backends. You can chain any backends. It is recommended to list
114
  faster backends first.
115
+
116
+ ### Creating a decorated backend with `DefaultTimeout` or `KeyPrefix`
117
+
118
+ ```php
119
+ $options = array(
120
+ 'backend' => 'array',
121
+ 'array' => array(),
122
+ 'keyPrefix' => 'someKeyPrefixStr'
123
+ );
124
+ $factory = new \Matomo\Cache\Backend\Factory();
125
+ $backend = $factory->buildBackend('keyPrefix', $options);
126
+ ```
127
+
128
+ Sometimes its useful to set default a default parameter for the timeout to force prevent infinite lifetimes, or to
129
+ specify a key prefix to prevent different versions of the app from reading and writing the same cache entry.
130
+ `DefaultTimeout` and `KeyPrefix` are "decorators" that wrap another backend. Currently each takes a single configuration
131
+ argument with the same name as the backend.
132
+
133
+ |backend | argument | description |
134
+ | --- | --- | --- |
135
+ |DefaultTimeout|`defaultTimeout`| Uses the `integer` value as the default timeout for defining cache entry lifetime. Only comes to effect when no lifetime is specified; Prevents infinite lifetimes.|
136
+ |KeyPrefix|`keyPrefix`| Prefixes the given value to the keys for any operation. For example `'Key123'` would become `'SomePrefixKey123'` |
137
+
138
 
139
  ### Creating a lazy cache
140
 
app/vendor/matomo/cache/src/Backend/BaseDecorator.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/lgpl-3.0.html LGPL v3 or later
7
+ *
8
+ */
9
+ namespace Matomo\Cache\Backend;
10
+
11
+ use Matomo\Cache\Backend;
12
+
13
+ class BaseDecorator implements Backend
14
+ {
15
+ /**
16
+ * @var Backend
17
+ */
18
+ protected $decorated;
19
+
20
+ /**
21
+ * Constructor.
22
+ *
23
+ * @param Backend $decorated Wrapped backend to apply TTL to.
24
+ * @param array $options includes default TTL to be used.
25
+ *
26
+ * @throws \InvalidArgumentException
27
+ */
28
+ public function __construct($decorated)
29
+ {
30
+ $this->decorated = $decorated;
31
+ }
32
+
33
+ public function doFetch($id)
34
+ {
35
+ return $this->decorated->doFetch($id);
36
+ }
37
+
38
+ public function doContains($id)
39
+ {
40
+ return $this->decorated->doContains($id);
41
+ }
42
+
43
+ public function doSave($id, $data, $lifeTime = 0)
44
+ {
45
+ return $this->decorated->doSave( $id, $data, $lifeTime);
46
+ }
47
+
48
+ public function doDelete($id)
49
+ {
50
+ return $this->decorated->doDelete($id);
51
+ }
52
+
53
+ public function doFlush()
54
+ {
55
+ return $this->decorated->doFlush();
56
+ }
57
+
58
+ public function getBackend()
59
+ {
60
+ return $this->decorated;
61
+ }
62
+ }
app/vendor/matomo/cache/src/Backend/DefaultTimeoutDecorated.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/lgpl-3.0.html LGPL v3 or later
7
+ *
8
+ */
9
+ namespace Matomo\Cache\Backend;
10
+
11
+ use Matomo\Cache\Backend;
12
+
13
+ class DefaultTimeoutDecorated extends BaseDecorator
14
+ {
15
+ /**
16
+ * @var integer
17
+ */
18
+ private $defaultTTL;
19
+
20
+
21
+ /**
22
+ * Constructor.
23
+ *
24
+ * @param Backend $decorated Wrapped backend to apply TTL to.
25
+ * @param array $options includes default TTL to be used.
26
+ *
27
+ * @throws \InvalidArgumentException
28
+ */
29
+ public function __construct($decorated, $options)
30
+ {
31
+ if (!isset($options['defaultTimeout']) || !is_int($options['defaultTimeout'])) {
32
+ throw new \InvalidArgumentException("The defaultTimeout option is required and must be an integer");
33
+ }
34
+
35
+ $this->defaultTTL = $options['defaultTimeout'];
36
+ parent::__construct($decorated);
37
+ }
38
+
39
+ public function doSave($id, $data, $lifeTime = 0)
40
+ {
41
+ return $this->decorated->doSave( $id, $data, $lifeTime ?: $this->defaultTTL);
42
+ }
43
+ }
app/vendor/matomo/cache/src/Backend/Factory.php CHANGED
@@ -76,6 +76,27 @@ class Factory
76
  return $redisCache;
77
  }
78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  /**
80
  * Build a specific backend instance.
81
  *
@@ -107,6 +128,14 @@ class Factory
107
 
108
  return $this->buildRedisCache($options);
109
 
 
 
 
 
 
 
 
 
110
  default:
111
 
112
  throw new Factory\BackendNotFoundException("Cache backend $type not valid");
76
  return $redisCache;
77
  }
78
 
79
+ /**
80
+ * @param string $class
81
+ * @param array $options
82
+ *
83
+ * @return Backend
84
+ *
85
+ * @throws Factory\BackendNotFoundException
86
+ */
87
+ public function buildDecorated( $class, $options )
88
+ {
89
+ $backendToBuild = $options["backend"];
90
+ $backendOptions = array();
91
+ if (array_key_exists($backendToBuild, $options)) {
92
+ $backendOptions = $options[$backendToBuild];
93
+ }
94
+
95
+ $backend = $this->buildBackend($backendToBuild, $backendOptions);
96
+
97
+ return new $class($backend, $options);
98
+ }
99
+
100
  /**
101
  * Build a specific backend instance.
102
  *
128
 
129
  return $this->buildRedisCache($options);
130
 
131
+ case 'defaultTimeout':
132
+
133
+ return $this->buildDecorated(DefaultTimeoutDecorated::class, $options);
134
+
135
+ case 'keyPrefix':
136
+
137
+ return $this->buildDecorated(KeyPrefixDecorated::class, $options);
138
+
139
  default:
140
 
141
  throw new Factory\BackendNotFoundException("Cache backend $type not valid");
app/vendor/matomo/cache/src/Backend/File.php CHANGED
@@ -23,6 +23,7 @@ class File extends PhpFileCache implements Backend
23
  // opcache in FPM, so we have to invalidate before reading)
24
  public static $invalidateOpCacheBeforeRead = false;
25
 
 
26
  /**
27
  * Constructor.
28
  *
@@ -36,6 +37,7 @@ class File extends PhpFileCache implements Backend
36
  if (!is_dir($directory)) {
37
  $this->createDirectory($directory);
38
  }
 
39
 
40
  parent::__construct($directory, $extension);
41
  }
@@ -46,6 +48,14 @@ class File extends PhpFileCache implements Backend
46
  $this->invalidateCacheFile($id);
47
  }
48
 
 
 
 
 
 
 
 
 
49
  return parent::doFetch($id);
50
  }
51
 
23
  // opcache in FPM, so we have to invalidate before reading)
24
  public static $invalidateOpCacheBeforeRead = false;
25
 
26
+ private $supportsParseError = false;
27
  /**
28
  * Constructor.
29
  *
37
  if (!is_dir($directory)) {
38
  $this->createDirectory($directory);
39
  }
40
+ $this->supportsParseError = defined('PHP_MAJOR_VERSION') && PHP_MAJOR_VERSION >= 7 && class_exists('\ParseError');
41
 
42
  parent::__construct($directory, $extension);
43
  }
48
  $this->invalidateCacheFile($id);
49
  }
50
 
51
+ if ($this->supportsParseError) {
52
+ try {
53
+ return parent::doFetch($id);
54
+ } catch (\ParseError $e) {
55
+ return false;
56
+ }
57
+ }
58
+
59
  return parent::doFetch($id);
60
  }
61
 
app/vendor/matomo/cache/src/Backend/KeyPrefixDecorated.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Matomo - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/lgpl-3.0.html LGPL v3 or later
7
+ *
8
+ */
9
+ namespace Matomo\Cache\Backend;
10
+
11
+ use Matomo\Cache\Backend;
12
+
13
+ class KeyPrefixDecorated extends BaseDecorator
14
+ {
15
+ /**
16
+ * @var string
17
+ */
18
+ private $keyPrefix;
19
+
20
+ /**
21
+ * Constructor.
22
+ *
23
+ * @param Backend $decorated Wrapped backend to apply TTL to.
24
+ * @param array $options includes the string to prefix the key with
25
+ *
26
+ * @throws \InvalidArgumentException
27
+ */
28
+ public function __construct($decorated, $options)
29
+ {
30
+ if (!isset($options['keyPrefix']) || !is_string($options['keyPrefix'])) {
31
+ throw new \InvalidArgumentException("The keyPrefix option is required and must be a string");
32
+ }
33
+
34
+ $this->keyPrefix = $options['keyPrefix'];
35
+ parent::__construct($decorated);
36
+ }
37
+
38
+ public function doFetch($id)
39
+ {
40
+ return $this->decorated->doFetch($this->keyPrefix . $id);
41
+ }
42
+
43
+ public function doContains($id)
44
+ {
45
+ return $this->decorated->doContains($this->keyPrefix . $id);
46
+ }
47
+
48
+ public function doSave($id, $data, $lifeTime = 0)
49
+ {
50
+ return $this->decorated->doSave($this->keyPrefix . $id, $data, $lifeTime);
51
+ }
52
+
53
+ public function doDelete($id)
54
+ {
55
+ return $this->decorated->doDelete($this->keyPrefix . $id);
56
+ }
57
+
58
+ }
app/vendor/matomo/device-detector/DeviceDetector.php CHANGED
@@ -31,6 +31,7 @@ use DeviceDetector\Parser\Device\HbbTv;
31
  use DeviceDetector\Parser\Device\Mobile;
32
  use DeviceDetector\Parser\Device\Notebook;
33
  use DeviceDetector\Parser\Device\PortableMediaPlayer;
 
34
  use DeviceDetector\Parser\OperatingSystem;
35
  use DeviceDetector\Parser\VendorFragment;
36
  use DeviceDetector\Yaml\ParserInterface as YamlParser;
@@ -67,7 +68,7 @@ class DeviceDetector
67
  /**
68
  * Current version number of DeviceDetector
69
  */
70
- public const VERSION = '4.2.3';
71
 
72
  /**
73
  * Constant used as value for unknown browser / os
@@ -91,7 +92,7 @@ class DeviceDetector
91
  * Holds the useragent that should be parsed
92
  * @var string
93
  */
94
- protected $userAgent;
95
 
96
  /**
97
  * Holds the operating system data after parsing the UA
@@ -198,6 +199,7 @@ class DeviceDetector
198
  $this->addClientParser(new Library());
199
 
200
  $this->addDeviceParser(new HbbTv());
 
201
  $this->addDeviceParser(new Notebook());
202
  $this->addDeviceParser(new Console());
203
  $this->addDeviceParser(new CarBrowser());
31
  use DeviceDetector\Parser\Device\Mobile;
32
  use DeviceDetector\Parser\Device\Notebook;
33
  use DeviceDetector\Parser\Device\PortableMediaPlayer;
34
+ use DeviceDetector\Parser\Device\ShellTv;
35
  use DeviceDetector\Parser\OperatingSystem;
36
  use DeviceDetector\Parser\VendorFragment;
37
  use DeviceDetector\Yaml\ParserInterface as YamlParser;
68
  /**
69
  * Current version number of DeviceDetector
70
  */
71
+ public const VERSION = '4.3.0';
72
 
73
  /**
74
  * Constant used as value for unknown browser / os
92
  * Holds the useragent that should be parsed
93
  * @var string
94
  */
95
+ protected $userAgent = '';
96
 
97
  /**
98
  * Holds the operating system data after parsing the UA
199
  $this->addClientParser(new Library());
200
 
201
  $this->addDeviceParser(new HbbTv());
202
+ $this->addDeviceParser(new ShellTv());
203
  $this->addDeviceParser(new Notebook());
204
  $this->addDeviceParser(new Console());
205
  $this->addDeviceParser(new CarBrowser());
app/vendor/matomo/device-detector/Parser/Client/Browser.php CHANGED
@@ -57,6 +57,7 @@ class Browser extends AbstractClientParser
57
  'AX' => 'Arctic Fox',
58
  'AV' => 'Amiga Voyager',
59
  'AW' => 'Amiga Aweb',
 
60
  'A0' => 'Atom',
61
  'AT' => 'Atomic Web Browser',
62
  'AS' => 'Avast Secure Browser',
@@ -126,6 +127,7 @@ class Browser extends AbstractClientParser
126
  'DI' => 'Dillo',
127
  'DD' => 'DuckDuckGo Privacy Browser',
128
  'EC' => 'Ecosia',
 
129
  'EI' => 'Epic',
130
  'EL' => 'Elinks',
131
  'EB' => 'Element Browser',
@@ -203,6 +205,7 @@ class Browser extends AbstractClientParser
203
  'LS' => 'Lunascape',
204
  'LN' => 'Lunascape Lite',
205
  'LX' => 'Lynx',
 
206
  'M1' => 'mCent',
207
  'MB' => 'MicroB',
208
  'MC' => 'NCSA Mosaic',
@@ -216,6 +219,7 @@ class Browser extends AbstractClientParser
216
  'MN' => 'Minimo',
217
  'MT' => 'Mint Browser',
218
  'MX' => 'Maxthon',
 
219
  'NM' => 'MxNitro',
220
  'MY' => 'Mypal',
221
  'MR' => 'Monument Browser',
@@ -255,6 +259,7 @@ class Browser extends AbstractClientParser
255
  'O0' => 'Origin In-Game Overlay',
256
  'OY' => 'Origyn Web Browser',
257
  'OV' => 'Openwave Mobile Browser',
 
258
  'OW' => 'OmniWeb',
259
  'OT' => 'Otter Browser',
260
  'PL' => 'Palm Blazer',
@@ -387,8 +392,8 @@ class Browser extends AbstractClientParser
387
  'YJ', 'LL', 'TU', 'XV', 'C2', 'QU', 'YN', 'JB', 'MR',
388
  'S6', '7S', 'NM', 'PB', 'UR', 'NR', 'SG', 'S8', 'C3',
389
  'SS', 'O2', 'SV', 'TR', 'CW', 'GI', 'VE', 'AC', 'FS',
390
- 'CG', 'DR', 'C4', 'HS', 'DA', 'C5', 'C6', 'DG', 'CG',
391
- 'HE', 'H2',
392
  ],
393
  'Firefox' => [
394
  'FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF',
@@ -418,7 +423,7 @@ class Browser extends AbstractClientParser
418
  'WP', 'HA', 'NX', 'HU', 'VV', 'RE', 'CB', 'MZ', 'UM',
419
  'FK', 'FX', 'WI', 'MN', 'M1', 'AH', 'SU', 'EU', 'EZ',
420
  'UT', 'DT', 'S0', 'QU', 'YN', 'JB', 'GH', 'PI', 'SG',
421
- 'KD', 'PE', 'UH', 'S7', 'CW', 'OZ', 'GI', 'VE',
422
  ];
423
 
424
  /**
57
  'AX' => 'Arctic Fox',
58
  'AV' => 'Amiga Voyager',
59
  'AW' => 'Amiga Aweb',
60
+ 'AI' => 'Arvin',
61
  'A0' => 'Atom',
62
  'AT' => 'Atomic Web Browser',
63
  'AS' => 'Avast Secure Browser',
127
  'DI' => 'Dillo',
128
  'DD' => 'DuckDuckGo Privacy Browser',
129
  'EC' => 'Ecosia',
130
+ 'EW' => 'Edge WebView',
131
  'EI' => 'Epic',
132
  'EL' => 'Elinks',
133
  'EB' => 'Element Browser',
205
  'LS' => 'Lunascape',
206
  'LN' => 'Lunascape Lite',
207
  'LX' => 'Lynx',
208
+ 'MD' => 'Mandarin',
209
  'M1' => 'mCent',
210
  'MB' => 'MicroB',
211
  'MC' => 'NCSA Mosaic',
219
  'MN' => 'Minimo',
220
  'MT' => 'Mint Browser',
221
  'MX' => 'Maxthon',
222
+ 'MA' => 'Maelstrom',
223
  'NM' => 'MxNitro',
224
  'MY' => 'Mypal',
225
  'MR' => 'Monument Browser',
259
  'O0' => 'Origin In-Game Overlay',
260
  'OY' => 'Origyn Web Browser',
261
  'OV' => 'Openwave Mobile Browser',
262
+ 'O3' => 'OpenFin',
263
  'OW' => 'OmniWeb',
264
  'OT' => 'Otter Browser',
265
  'PL' => 'Palm Blazer',
392
  'YJ', 'LL', 'TU', 'XV', 'C2', 'QU', 'YN', 'JB', 'MR',
393
  'S6', '7S', 'NM', 'PB', 'UR', 'NR', 'SG', 'S8', 'C3',
394
  'SS', 'O2', 'SV', 'TR', 'CW', 'GI', 'VE', 'AC', 'FS',
395
+ 'CG', 'DR', 'C4', 'HS', 'DA', 'C5', 'C6', 'DG', 'HE',
396
+ 'H2', 'MA', 'MD', 'O3', 'EW', 'AI',
397
  ],
398
  'Firefox' => [
399
  'FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF',
423
  'WP', 'HA', 'NX', 'HU', 'VV', 'RE', 'CB', 'MZ', 'UM',
424
  'FK', 'FX', 'WI', 'MN', 'M1', 'AH', 'SU', 'EU', 'EZ',
425
  'UT', 'DT', 'S0', 'QU', 'YN', 'JB', 'GH', 'PI', 'SG',
426
+ 'KD', 'PE', 'UH', 'S7', 'CW', 'OZ', 'GI', 'VE', 'AI',
427
  ];
428
 
429
  /**
app/vendor/matomo/device-detector/Parser/Device/AbstractDeviceParser.php CHANGED
@@ -98,6 +98,7 @@ abstract class AbstractDeviceParser extends AbstractParser
98
  'AD' => 'Advance',
99
  'AF' => 'AfriOne',
100
  'A3' => 'AGM',
 
101
  'AZ' => 'Ainol',
102
  'AI' => 'Airness',
103
  'AT' => 'Airties',
@@ -105,6 +106,7 @@ abstract class AbstractDeviceParser extends AbstractParser
105
  'AW' => 'Aiwa',
106
  '85' => 'Aiuto',
107
  'AK' => 'Akai',
 
108
  '1A' => 'Alba',
109
  'AL' => 'Alcatel',
110
  '20' => 'Alcor',
@@ -123,11 +125,14 @@ abstract class AbstractDeviceParser extends AbstractParser
123
  'AG' => 'AMGOO',
124
  '9A' => 'Amigoo',
125
  'AO' => 'Amoi',
 
126
  '60' => 'Andowl',
127
  '7A' => 'Anry',
128
  'A0' => 'ANS',
129
  '3N' => 'Aoson',
130
  'O8' => 'AOC',
 
 
131
  'AP' => 'Apple',
132
  'AR' => 'Archos',
133
  'AB' => 'Arian Space',
@@ -140,6 +145,7 @@ abstract class AbstractDeviceParser extends AbstractParser
140
  '21' => 'Artizlee',
141
  '8A' => 'Asano',
142
  '90' => 'Asanzo',
 
143
  'A4' => 'Ask',
144
  'A8' => 'Assistant',
145
  'AU' => 'Asus',
@@ -152,6 +158,7 @@ abstract class AbstractDeviceParser extends AbstractParser
152
  'AH' => 'AVH',
153
  'AV' => 'Avvio',
154
  'AY' => 'Axxion',
 
155
  'AM' => 'Azumi Mobile',
156
  'BO' => 'BangOlufsen',
157
  'BN' => 'Barnes & Noble',
@@ -164,6 +171,7 @@ abstract class AbstractDeviceParser extends AbstractParser
164
  'BL' => 'Beetel',
165
  'BQ' => 'BenQ',
166
  'BS' => 'BenQ-Siemens',
 
167
  'BZ' => 'Bezkam',
168
  '9B' => 'Bellphone',
169
  '63' => 'Beyond',
@@ -187,6 +195,8 @@ abstract class AbstractDeviceParser extends AbstractParser
187
  'BD' => 'Bluegood',
188
  'LB' => 'Bluewave',
189
  '7B' => 'Blloc',
 
 
190
  'BM' => 'Bmobile',
191
  'B9' => 'Bobarry',
192
  'B4' => 'bogo',
@@ -225,6 +235,7 @@ abstract class AbstractDeviceParser extends AbstractParser
225
  'C0' => 'Clout',
226
  'CN' => 'CnM',
227
  'CY' => 'Coby Kyros',
 
228
  'C6' => 'Comio',
229
  'CL' => 'Compal',
230
  'CQ' => 'Compaq',
@@ -275,6 +286,7 @@ abstract class AbstractDeviceParser extends AbstractParser
275
  'D2' => 'Digma',
276
  '1D' => 'Diva',
277
  'D6' => 'Divisat',
 
278
  'DM' => 'DMM',
279
  'DN' => 'DNS',
280
  'DC' => 'DoCoMo',
@@ -286,6 +298,7 @@ abstract class AbstractDeviceParser extends AbstractParser
286
  'DP' => 'Dopod',
287
  'DR' => 'Doro',
288
  'D8' => 'Droxio',
 
289
  'DU' => 'Dune HD',
290
  'EB' => 'E-Boda',
291
  'EJ' => 'Engel',
@@ -296,6 +309,7 @@ abstract class AbstractDeviceParser extends AbstractParser
296
  'EA' => 'EBEST',
297
  'E4' => 'Echo Mobiles',
298
  'ES' => 'ECS',
 
299
  'E6' => 'EE',
300
  'EK' => 'EKO',
301
  'EY' => 'Einstein',
@@ -307,6 +321,7 @@ abstract class AbstractDeviceParser extends AbstractParser
307
  'L0' => 'Element',
308
  'EG' => 'Elenberg',
309
  'EL' => 'Elephone',
 
310
  '4E' => 'Eltex',
311
  'ED' => 'Energizer',
312
  'E1' => 'Energy Sistem',
@@ -314,6 +329,7 @@ abstract class AbstractDeviceParser extends AbstractParser
314
  '8E' => 'Epik One',
315
  'E7' => 'Ergo',
316
  'EC' => 'Ericsson',
 
317
  'ER' => 'Ericy',
318
  'EE' => 'Essential',
319
  'E2' => 'Essentielb',
@@ -348,10 +364,12 @@ abstract class AbstractDeviceParser extends AbstractParser
348
  'F1' => 'FinePower',
349
  'FX' => 'Finlux',
350
  'F3' => 'FireFly Mobile',
 
351
  'FL' => 'Fly',
352
  'FN' => 'FNB',
353
  'FD' => 'Fondi',
354
  '0F' => 'Fourel',
 
355
  'F0' => 'Fonos',
356
  'F2' => 'FORME',
357
  'F5' => 'Formuler',
@@ -360,8 +378,10 @@ abstract class AbstractDeviceParser extends AbstractParser
360
  'FO' => 'Foxconn',
361
  'FT' => 'Freetel',
362
  'F4' => 'F&U',
 
363
  'FG' => 'Fuego',
364
  'FU' => 'Fujitsu',
 
365
  'GT' => 'G-TiDE',
366
  'G9' => 'G-Touch',
367
  '0G' => 'GFive',
@@ -389,6 +409,7 @@ abstract class AbstractDeviceParser extends AbstractParser
389
  'G1' => 'GoMobile',
390
  'GO' => 'Google',
391
  'G0' => 'Goophone',
 
392
  'GR' => 'Gradiente',
393
  'GP' => 'Grape',
394
  'G6' => 'Gree',
@@ -403,6 +424,7 @@ abstract class AbstractDeviceParser extends AbstractParser
403
  'H6' => 'Helio',
404
  'ZH' => 'Hezire',
405
  'HL' => 'Hi-Level',
 
406
  'H2' => 'Highscreen',
407
  'Q1' => 'High Q',
408
  '1H' => 'Hipstreet',
@@ -447,9 +469,11 @@ abstract class AbstractDeviceParser extends AbstractParser
447
  'I7' => 'iLA',
448
  '2I' => 'iLife',
449
  '1I' => 'iMars',
 
450
  'IL' => 'IMO Mobile',
451
  'I3' => 'Impression',
452
  'FC' => 'INCAR',
 
453
  '6I' => 'Inco',
454
  'IW' => 'iNew',
455
  'IF' => 'Infinix',
@@ -482,9 +506,11 @@ abstract class AbstractDeviceParser extends AbstractParser
482
  'I8' => 'iVA',
483
  'IE' => 'iView',
484
  '0J' => 'iVooMi',
 
485
  'I9' => 'iZotron',
486
  'JA' => 'JAY-Tech',
487
  'KJ' => 'Jiake',
 
488
  'JF' => 'JFone',
489
  'JI' => 'Jiayu',
490
  'JG' => 'Jinga',
@@ -511,6 +537,7 @@ abstract class AbstractDeviceParser extends AbstractParser
511
  'KI' => 'Kingsun',
512
  'KF' => 'KINGZONE',
513
  'KV' => 'Kivi',
 
514
  '0K' => 'Klipad',
515
  'KC' => 'Kocaso',
516
  'KK' => 'Kodak',
@@ -525,11 +552,13 @@ abstract class AbstractDeviceParser extends AbstractParser
525
  'KR' => 'Koridy',
526
  'K2' => 'KRONO',
527
  'KE' => 'Krüger&Matz',
 
528
  'KH' => 'KT-Tech',
529
  'Z6' => 'KUBO',
530
  'K8' => 'Kuliao',
531
  '8K' => 'Kult',
532
  'KU' => 'Kumai',
 
533
  'KY' => 'Kyocera',
534
  'KQ' => 'Kyowon',
535
  '1K' => 'Kzen',
@@ -542,6 +571,7 @@ abstract class AbstractDeviceParser extends AbstractParser
542
  'LV' => 'Lava',
543
  'LC' => 'LCT',
544
  'L5' => 'Leagoo',
 
545
  'LD' => 'Ledstar',
546
  'L1' => 'LeEco',
547
  '4B' => 'Leff',
@@ -556,10 +586,12 @@ abstract class AbstractDeviceParser extends AbstractParser
556
  'LX' => 'Lexibook',
557
  'LG' => 'LG',
558
  'LF' => 'Lifemaxx',
 
559
  'LI' => 'Lingwin',
560
  '5L' => 'Linsar',
561
  'LW' => 'Linnex',
562
  'LO' => 'Loewe',
 
563
  '1L' => 'Logic',
564
  'LM' => 'Logicom',
565
  '0L' => 'Lumigon',
@@ -598,6 +630,7 @@ abstract class AbstractDeviceParser extends AbstractParser
598
  'MD' => 'Medion',
599
  'M2' => 'MEEG',
600
  'MP' => 'MegaFon',
 
601
  '3M' => 'Meitu',
602
  'M1' => 'Meizu',
603
  '0E' => 'Melrose',
@@ -659,6 +692,7 @@ abstract class AbstractDeviceParser extends AbstractParser
659
  '0N' => 'Newman',
660
  'NS' => 'NewsMy',
661
  'ND' => 'Newsday',
 
662
  'XB' => 'NEXBOX',
663
  'NX' => 'Nexian',
664
  'N8' => 'NEXON',
@@ -681,6 +715,7 @@ abstract class AbstractDeviceParser extends AbstractParser
681
  '7N' => 'NorthTech',
682
  '5N' => 'Nos',
683
  'NO' => 'Nous',
 
684
  'NJ' => 'NuAns',
685
  'NL' => 'NUU Mobile',
686
  'N0' => 'Nuvo',
@@ -738,6 +773,7 @@ abstract class AbstractDeviceParser extends AbstractParser
738
  '8P' => 'Pixelphone',
739
  '9O' => 'Pixela',
740
  'PX' => 'Pixus',
 
741
  '9P' => 'Planet Computers',
742
  'PY' => 'Ployer',
743
  'P4' => 'Plum',
@@ -773,6 +809,7 @@ abstract class AbstractDeviceParser extends AbstractParser
773
  'QO' => 'Qumo',
774
  'R2' => 'R-TV',
775
  'RA' => 'Ramos',
 
776
  'R9' => 'Ravoz',
777
  'RZ' => 'Razer',
778
  'RC' => 'RCA Tablets',
@@ -782,12 +819,14 @@ abstract class AbstractDeviceParser extends AbstractParser
782
  'R8' => 'RED',
783
  'RD' => 'Reeder',
784
  'Z9' => 'REGAL',
 
785
  'RI' => 'Rikomagic',
786
  'RM' => 'RIM',
787
  'RN' => 'Rinno',
788
  'RX' => 'Ritmix',
789
  'R7' => 'Ritzviva',
790
  'RV' => 'Riviera',
 
791
  'RR' => 'Roadrover',
792
  'R1' => 'Rokit',
793
  'RK' => 'Roku',
@@ -795,6 +834,7 @@ abstract class AbstractDeviceParser extends AbstractParser
795
  'R5' => 'Ross&Moor',
796
  'RO' => 'Rover',
797
  'R6' => 'RoverPad',
 
798
  'RT' => 'RT Project',
799
  'RG' => 'RugGear',
800
  'RU' => 'Runbo',
@@ -851,6 +891,7 @@ abstract class AbstractDeviceParser extends AbstractParser
851
  '80' => 'SMARTEC',
852
  'SC' => 'Smartfren',
853
  'S7' => 'Smartisan',
 
854
  'SF' => 'Softbank',
855
  '9L' => 'SOLE',
856
  'JL' => 'SOLO',
@@ -864,14 +905,17 @@ abstract class AbstractDeviceParser extends AbstractParser
864
  'PK' => 'Spark',
865
  'FS' => 'SPC',
866
  '6S' => 'Spectrum',
 
867
  'SP' => 'Spice',
868
  'QS' => 'SQOOL',
869
  'S4' => 'Star',
870
  'OL' => 'Starlight',
871
  '18' => 'Starmobile',
872
  '2S' => 'Starway',
 
873
  'SB' => 'STF Mobile',
874
  'S8' => 'STK',
 
875
  'S2' => 'Stonex',
876
  'ST' => 'Storex',
877
  '71' => 'StrawBerry',
@@ -894,6 +938,7 @@ abstract class AbstractDeviceParser extends AbstractParser
894
  '4S' => 'Syrox',
895
  'TM' => 'T-Mobile',
896
  'TK' => 'Takara',
 
897
  '9N' => 'Tanix',
898
  'T5' => 'TB Touch',
899
  'TC' => 'TCL',
@@ -948,6 +993,7 @@ abstract class AbstractDeviceParser extends AbstractParser
948
  'TU' => 'Tunisie Telecom',
949
  '1T' => 'Turbo',
950
  'TR' => 'Turbo-X',
 
951
  '5T' => 'TurboKids',
952
  'TV' => 'TVC',
953
  'TW' => 'TWM',
@@ -962,6 +1008,7 @@ abstract class AbstractDeviceParser extends AbstractParser
962
  'UA' => 'Umax',
963
  'UM' => 'UMIDIGI',
964
  'UZ' => 'Unihertz',
 
965
  'UX' => 'Unimax',
966
  'US' => 'Uniscope',
967
  'U2' => 'UNIWA',
@@ -971,10 +1018,14 @@ abstract class AbstractDeviceParser extends AbstractParser
971
  'UK' => 'UTOK',
972
  '3U' => 'IUNI',
973
  'UT' => 'UTStarcom',
 
974
  '5V' => 'VAIO',
 
975
  'VA' => 'Vastking',
 
976
  'VB' => 'VC',
977
  'VN' => 'Venso',
 
978
  '4V' => 'Verico',
979
  'V4' => 'Verizon',
980
  'VR' => 'Vernee',
@@ -1032,6 +1083,7 @@ abstract class AbstractDeviceParser extends AbstractParser
1032
  'WU' => 'Wintouch',
1033
  'W0' => 'Wiseasy',
1034
  '2W' => 'Wizz',
 
1035
  'WL' => 'Wolder',
1036
  'WG' => 'Wolfgang',
1037
  'WO' => 'Wonu',
@@ -1043,6 +1095,7 @@ abstract class AbstractDeviceParser extends AbstractParser
1043
  'XV' => 'X-View',
1044
  'X4' => 'X.Vision',
1045
  'XG' => 'Xgody',
 
1046
  'XL' => 'Xiaolajiao',
1047
  'XI' => 'Xiaomi',
1048
  'XN' => 'Xion',
@@ -1050,6 +1103,7 @@ abstract class AbstractDeviceParser extends AbstractParser
1050
  'XR' => 'Xoro',
1051
  'XS' => 'Xshitou',
1052
  '4X' => 'Xtouch',
 
1053
  'YD' => 'Yandex',
1054
  'YA' => 'Yarvik',
1055
  'Y2' => 'Yes',
@@ -1059,10 +1113,13 @@ abstract class AbstractDeviceParser extends AbstractParser
1059
  'YT' => 'Ytone',
1060
  'Y1' => 'Yu',
1061
  'Y0' => 'YUHO',
 
1062
  'YU' => 'Yuandao',
1063
  'YS' => 'Yusun',
 
1064
  'YX' => 'Yxtel',
1065
  '0Z' => 'Zatec',
 
1066
  'PZ' => 'Zebra',
1067
  'ZE' => 'Zeemi',
1068
  'ZN' => 'Zen',
98
  'AD' => 'Advance',
99
  'AF' => 'AfriOne',
100
  'A3' => 'AGM',
101
+ 'J0' => 'AG Mobile',
102
  'AZ' => 'Ainol',
103
  'AI' => 'Airness',
104
  'AT' => 'Airties',
106
  'AW' => 'Aiwa',
107
  '85' => 'Aiuto',
108
  'AK' => 'Akai',
109
+ 'Q3' => 'AKIRA',
110
  '1A' => 'Alba',
111
  'AL' => 'Alcatel',
112
  '20' => 'Alcor',
125
  'AG' => 'AMGOO',
126
  '9A' => 'Amigoo',
127
  'AO' => 'Amoi',
128
+ '54' => 'AMCV',
129
  '60' => 'Andowl',
130
  '7A' => 'Anry',
131
  'A0' => 'ANS',
132
  '3N' => 'Aoson',
133
  'O8' => 'AOC',
134
+ 'J2' => 'AOYODKG',
135
+ '55' => 'AOpen',
136
  'AP' => 'Apple',
137
  'AR' => 'Archos',
138
  'AB' => 'Arian Space',
145
  '21' => 'Artizlee',
146
  '8A' => 'Asano',
147
  '90' => 'Asanzo',
148
+ '1U' => 'Astro',
149
  'A4' => 'Ask',
150
  'A8' => 'Assistant',
151
  'AU' => 'Asus',
158
  'AH' => 'AVH',
159
  'AV' => 'Avvio',
160
  'AY' => 'Axxion',
161
+ 'XA' => 'Axioo',
162
  'AM' => 'Azumi Mobile',
163
  'BO' => 'BangOlufsen',
164
  'BN' => 'Barnes & Noble',
171
  'BL' => 'Beetel',
172
  'BQ' => 'BenQ',
173
  'BS' => 'BenQ-Siemens',
174
+ 'BY' => 'BS Mobile',
175
  'BZ' => 'Bezkam',
176
  '9B' => 'Bellphone',
177
  '63' => 'Beyond',
195
  'BD' => 'Bluegood',
196
  'LB' => 'Bluewave',
197
  '7B' => 'Blloc',
198
+ 'UB' => 'Bleck',
199
+ 'Q2' => 'Blow',
200
  'BM' => 'Bmobile',
201
  'B9' => 'Bobarry',
202
  'B4' => 'bogo',
235
  'C0' => 'Clout',
236
  'CN' => 'CnM',
237
  'CY' => 'Coby Kyros',
238
+ 'XC' => 'Cobalt',
239
  'C6' => 'Comio',
240
  'CL' => 'Compal',
241
  'CQ' => 'Compaq',
286
  'D2' => 'Digma',
287
  '1D' => 'Diva',
288
  'D6' => 'Divisat',
289
+ 'X6' => 'DIXON',
290
  'DM' => 'DMM',
291
  'DN' => 'DNS',
292
  'DC' => 'DoCoMo',
298
  'DP' => 'Dopod',
299
  'DR' => 'Doro',
300
  'D8' => 'Droxio',
301
+ 'DJ' => 'Dragon Touch',
302
  'DU' => 'Dune HD',
303
  'EB' => 'E-Boda',
304
  'EJ' => 'Engel',
309
  'EA' => 'EBEST',
310
  'E4' => 'Echo Mobiles',
311
  'ES' => 'ECS',
312
+ '35' => 'ECON',
313
  'E6' => 'EE',
314
  'EK' => 'EKO',
315
  'EY' => 'Einstein',
321
  'L0' => 'Element',
322
  'EG' => 'Elenberg',
323
  'EL' => 'Elephone',
324
+ 'JE' => 'Elekta',
325
  '4E' => 'Eltex',
326
  'ED' => 'Energizer',
327
  'E1' => 'Energy Sistem',
329
  '8E' => 'Epik One',
330
  'E7' => 'Ergo',
331
  'EC' => 'Ericsson',
332
+ '05' => 'Erisson',
333
  'ER' => 'Ericy',
334
  'EE' => 'Essential',
335
  'E2' => 'Essentielb',
364
  'F1' => 'FinePower',
365
  'FX' => 'Finlux',
366
  'F3' => 'FireFly Mobile',
367
+ 'F8' => 'FISE',
368
  'FL' => 'Fly',
369
  'FN' => 'FNB',
370
  'FD' => 'Fondi',
371
  '0F' => 'Fourel',
372
+ '44' => 'Four Mobile',
373
  'F0' => 'Fonos',
374
  'F2' => 'FORME',
375
  'F5' => 'Formuler',
378
  'FO' => 'Foxconn',
379
  'FT' => 'Freetel',
380
  'F4' => 'F&U',
381
+ '1F' => 'FMT',
382
  'FG' => 'Fuego',
383
  'FU' => 'Fujitsu',
384
+ 'FW' => 'FNF',
385
  'GT' => 'G-TiDE',
386
  'G9' => 'G-Touch',
387
  '0G' => 'GFive',
409
  'G1' => 'GoMobile',
410
  'GO' => 'Google',
411
  'G0' => 'Goophone',
412
+ '6G' => 'Gooweel',
413
  'GR' => 'Gradiente',
414
  'GP' => 'Grape',
415
  'G6' => 'Gree',
424
  'H6' => 'Helio',
425
  'ZH' => 'Hezire',
426
  'HL' => 'Hi-Level',
427
+ '3H' => 'Hi',
428
  'H2' => 'Highscreen',
429
  'Q1' => 'High Q',
430
  '1H' => 'Hipstreet',
469
  'I7' => 'iLA',
470
  '2I' => 'iLife',
471
  '1I' => 'iMars',
472
+ 'U4' => 'iMan',
473
  'IL' => 'IMO Mobile',
474
  'I3' => 'Impression',
475
  'FC' => 'INCAR',
476
+ '2H' => 'Inch',
477
  '6I' => 'Inco',
478
  'IW' => 'iNew',
479
  'IF' => 'Infinix',
506
  'I8' => 'iVA',
507
  'IE' => 'iView',
508
  '0J' => 'iVooMi',
509
+ 'UI' => 'ivvi',
510
  'I9' => 'iZotron',
511
  'JA' => 'JAY-Tech',
512
  'KJ' => 'Jiake',
513
+ 'J6' => 'Jeka',
514
  'JF' => 'JFone',
515
  'JI' => 'Jiayu',
516
  'JG' => 'Jinga',
537
  'KI' => 'Kingsun',
538
  'KF' => 'KINGZONE',
539
  'KV' => 'Kivi',
540
+ '64' => 'Kvant',
541
  '0K' => 'Klipad',
542
  'KC' => 'Kocaso',
543
  'KK' => 'Kodak',
552
  'KR' => 'Koridy',
553
  'K2' => 'KRONO',
554
  'KE' => 'Krüger&Matz',
555
+ '5K' => 'KREZ',
556
  'KH' => 'KT-Tech',
557
  'Z6' => 'KUBO',
558
  'K8' => 'Kuliao',
559
  '8K' => 'Kult',
560
  'KU' => 'Kumai',
561
+ '6K' => 'Kurio',
562
  'KY' => 'Kyocera',
563
  'KQ' => 'Kyowon',
564
  '1K' => 'Kzen',
571
  'LV' => 'Lava',
572
  'LC' => 'LCT',
573
  'L5' => 'Leagoo',
574
+ 'U3' => 'Leben',
575
  'LD' => 'Ledstar',
576
  'L1' => 'LeEco',
577
  '4B' => 'Leff',
586
  'LX' => 'Lexibook',
587
  'LG' => 'LG',
588
  'LF' => 'Lifemaxx',
589
+ 'LJ' => 'L-Max',
590
  'LI' => 'Lingwin',
591
  '5L' => 'Linsar',
592
  'LW' => 'Linnex',
593
  'LO' => 'Loewe',
594
+ 'YL' => 'Loview',
595
  '1L' => 'Logic',
596
  'LM' => 'Logicom',
597
  '0L' => 'Lumigon',
630
  'MD' => 'Medion',
631
  'M2' => 'MEEG',
632
  'MP' => 'MegaFon',
633
+ 'X0' => 'mPhone',
634
  '3M' => 'Meitu',
635
  'M1' => 'Meizu',
636
  '0E' => 'Melrose',
692
  '0N' => 'Newman',
693
  'NS' => 'NewsMy',
694
  'ND' => 'Newsday',
695
+ 'HB' => 'New Balance',
696
  'XB' => 'NEXBOX',
697
  'NX' => 'Nexian',
698
  'N8' => 'NEXON',
715
  '7N' => 'NorthTech',
716
  '5N' => 'Nos',
717
  'NO' => 'Nous',
718
+ 'NQ' => 'Novex',
719
  'NJ' => 'NuAns',
720
  'NL' => 'NUU Mobile',
721
  'N0' => 'Nuvo',
773
  '8P' => 'Pixelphone',
774
  '9O' => 'Pixela',
775
  'PX' => 'Pixus',
776
+ 'QP' => 'Pico',
777
  '9P' => 'Planet Computers',
778
  'PY' => 'Ployer',
779
  'P4' => 'Plum',
809
  'QO' => 'Qumo',
810
  'R2' => 'R-TV',
811
  'RA' => 'Ramos',
812
+ '0R' => 'Raspberry',
813
  'R9' => 'Ravoz',
814
  'RZ' => 'Razer',
815
  'RC' => 'RCA Tablets',
819
  'R8' => 'RED',
820
  'RD' => 'Reeder',
821
  'Z9' => 'REGAL',
822
+ 'RP' => 'Revo',
823
  'RI' => 'Rikomagic',
824
  'RM' => 'RIM',
825
  'RN' => 'Rinno',
826
  'RX' => 'Ritmix',
827
  'R7' => 'Ritzviva',
828
  'RV' => 'Riviera',
829
+ '6R' => 'Rivo',
830
  'RR' => 'Roadrover',
831
  'R1' => 'Rokit',
832
  'RK' => 'Roku',
834
  'R5' => 'Ross&Moor',
835
  'RO' => 'Rover',
836
  'R6' => 'RoverPad',
837
+ 'RQ' => 'RoyQueen',
838
  'RT' => 'RT Project',
839
  'RG' => 'RugGear',
840
  'RU' => 'Runbo',
891
  '80' => 'SMARTEC',
892
  'SC' => 'Smartfren',
893
  'S7' => 'Smartisan',
894
+ '1Q' => 'Smotreshka',
895
  'SF' => 'Softbank',
896
  '9L' => 'SOLE',
897
  'JL' => 'SOLO',
905
  'PK' => 'Spark',
906
  'FS' => 'SPC',
907
  '6S' => 'Spectrum',
908
+ '43' => 'Spectralink',
909
  'SP' => 'Spice',
910
  'QS' => 'SQOOL',
911
  'S4' => 'Star',
912
  'OL' => 'Starlight',
913
  '18' => 'Starmobile',
914
  '2S' => 'Starway',
915
+ '45' => 'Starwind',
916
  'SB' => 'STF Mobile',
917
  'S8' => 'STK',
918
+ 'GQ' => 'STG Telecom',
919
  'S2' => 'Stonex',
920
  'ST' => 'Storex',
921
  '71' => 'StrawBerry',
938
  '4S' => 'Syrox',
939
  'TM' => 'T-Mobile',
940
  'TK' => 'Takara',
941
+ '73' => 'Tambo',
942
  '9N' => 'Tanix',
943
  'T5' => 'TB Touch',
944
  'TC' => 'TCL',
993
  'TU' => 'Tunisie Telecom',
994
  '1T' => 'Turbo',
995
  'TR' => 'Turbo-X',
996
+ '5X' => 'TurboPad',
997
  '5T' => 'TurboKids',
998
  'TV' => 'TVC',
999
  'TW' => 'TWM',
1008
  'UA' => 'Umax',
1009
  'UM' => 'UMIDIGI',
1010
  'UZ' => 'Unihertz',
1011
+ '3Z' => 'UZ Mobile',
1012
  'UX' => 'Unimax',
1013
  'US' => 'Uniscope',
1014
  'U2' => 'UNIWA',
1018
  'UK' => 'UTOK',
1019
  '3U' => 'IUNI',
1020
  'UT' => 'UTStarcom',
1021
+ '6U' => 'UTime',
1022
  '5V' => 'VAIO',
1023
+ 'WV' => 'VAVA',
1024
  'VA' => 'Vastking',
1025
+ 'VP' => 'Vargo',
1026
  'VB' => 'VC',
1027
  'VN' => 'Venso',
1028
+ 'VQ' => 'Vega',
1029
  '4V' => 'Verico',
1030
  'V4' => 'Verizon',
1031
  'VR' => 'Vernee',
1083
  'WU' => 'Wintouch',
1084
  'W0' => 'Wiseasy',
1085
  '2W' => 'Wizz',
1086
+ 'W4' => 'WIWA',
1087
  'WL' => 'Wolder',
1088
  'WG' => 'Wolfgang',
1089
  'WO' => 'Wonu',
1095
  'XV' => 'X-View',
1096
  'X4' => 'X.Vision',
1097
  'XG' => 'Xgody',
1098
+ 'QX' => 'XGIMI',
1099
  'XL' => 'Xiaolajiao',
1100
  'XI' => 'Xiaomi',
1101
  'XN' => 'Xion',
1103
  'XR' => 'Xoro',
1104
  'XS' => 'Xshitou',
1105
  '4X' => 'Xtouch',
1106
+ 'X8' => 'Xtratech',
1107
  'YD' => 'Yandex',
1108
  'YA' => 'Yarvik',
1109
  'Y2' => 'Yes',
1113
  'YT' => 'Ytone',
1114
  'Y1' => 'Yu',
1115
  'Y0' => 'YUHO',
1116
+ 'YN' => 'Yuno',
1117
  'YU' => 'Yuandao',
1118
  'YS' => 'Yusun',
1119
+ 'YJ' => 'YASIN',
1120
  'YX' => 'Yxtel',
1121
  '0Z' => 'Zatec',
1122
+ '2Z' => 'Zaith',
1123
  'PZ' => 'Zebra',
1124
  'ZE' => 'Zeemi',
1125
  'ZN' => 'Zen',
app/vendor/matomo/device-detector/Parser/Device/HbbTv.php CHANGED
@@ -38,7 +38,7 @@ class HbbTv extends AbstractDeviceParser
38
  */
39
  public function parse(): ?array
40
  {
41
- // only parse user agents containing hbbtv fragment
42
  if (null === $this->isHbbTv()) {
43
  return null;
44
  }
38
  */
39
  public function parse(): ?array
40
  {
41
+ // only parse user agents containing fragments: hbbtv
42
  if (null === $this->isHbbTv()) {
43
  return null;
44
  }
app/vendor/matomo/device-detector/Parser/Device/ShellTv.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ declare(strict_types=1);
4
+
5
+ /**
6
+ * Device Detector - The Universal Device Detection library for parsing User Agents
7
+ *
8
+ * @link https://matomo.org
9
+ *
10
+ * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
11
+ */
12
+
13
+ namespace DeviceDetector\Parser\Device;
14
+
15
+ /**
16
+ * Class ShellTv
17
+ */
18
+ class ShellTv extends AbstractDeviceParser
19
+ {
20
+ /**
21
+ * @var string
22
+ */
23
+ protected $fixtureFile = 'regexes/device/shell_tv.yml';
24
+
25
+ /**
26
+ * @var string
27
+ */
28
+ protected $parserName = 'shelltv';
29
+
30
+ /**
31
+ * Returns if the parsed UA was identified as ShellTv device
32
+ *
33
+ * @return bool
34
+ *
35
+ * @throws \Exception
36
+ */
37
+ public function isShellTv(): bool
38
+ {
39
+ $regex = '[a-z]+[ _]Shell[ _]\w{6}';
40
+ $match = $this->matchUserAgent($regex);
41
+
42
+ return null !== $match;
43
+ }
44
+
45
+ /**
46
+ * Parses the current UA and checks whether it contains ShellTv information
47
+ *
48
+ * @see shell_tv.yml for list of detected televisions
49
+ *
50
+ * @return array|null
51
+ */
52
+ public function parse(): ?array
53
+ {
54
+ // only parse user agents containing fragments: {brand} shell
55
+ if (false === $this->isShellTv()) {
56
+ return null;
57
+ }
58
+
59
+ parent::parse();
60
+
61
+ // always set device type to tv, even if no model/brand could be found
62
+ $this->deviceType = self::DEVICE_TYPE_TV;
63
+
64
+ return $this->getResult();
65
+ }
66
+ }
app/vendor/matomo/device-detector/README.md CHANGED
@@ -233,6 +233,7 @@ There are already a few ports of this tool to other languages:
233
  - **.NET** https://github.com/totpero/DeviceDetector.NET
234
  - **Ruby** https://github.com/podigee/device_detector
235
  - **JavaScript/TypeScript/NodeJS** https://github.com/etienne-martin/device-detector-js
 
236
  - **Python 3** https://github.com/thinkwelltwd/device_detector
237
  - **Crystal** https://github.com/creadone/device_detector
238
  - **Elixir** https://github.com/elixir-inspector/ua_inspector
@@ -243,7 +244,7 @@ There are already a few ports of this tool to other languages:
243
 
244
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
245
 
246
- *Last update: 2021/05/12*
247
 
248
  ### List of detected operating systems:
249
 
@@ -251,7 +252,7 @@ AIX, Android, AmigaOS, Apple TV, Arch Linux, BackTrack, Bada, BeOS, BlackBerry O
251
 
252
  ### List of detected browsers:
253
 
254
- 115 Browser, 2345 Browser, 360 Phone Browser, 360 Browser, 7654 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Desktop, AOL Shield, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, Atom, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Avira Scout, AwoX, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Blue Browser, Borealis Navigator, Brave, BriskBard, BrowseX, Browzar, Biyubi, Byffox, Camino, CCleaner, Chedot, Centaury, Coc Coc, CoolBrowser, Colibri, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, Cornowser, Chim Lac, ChromePlus, Chromium, Chromium GOST, Cyberfox, Cheshire, Crusta, Craving Explorer, Crazy Browser, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, deg-degan, Deledao, Delta Browser, DeskBrowse, Dolphin, Dorado, Dot Browser, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, Elements Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Flow, Firefox Mobile, Fireweb, Fireweb Navigator, Flast, FreeU, Galeon, Ghostery Privacy Browser, GinxDroid Browser, Glass Browser, Google Earth, GOG Galaxy, HasBrowser, Hawk Turbo Browser, Helio, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Japan Browser, Jasmine, JavaFX, Jig Browser, Jig Browser Plus, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kode Browser, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Light, Links, Lolifox, Lovense Browser, LuaKit, Lulumi, Lunascape, Lunascape Lite, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, MxNitro, Mypal, Monument Browser, MAUI WAP Browser, Navigateur Web, NFS Browser, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odin, OceanHero, Odyssey Web Browser, Off By One, OhHai Browser, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Orca, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Polypane, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Perfect Browser, Phantom Browser, Phoenix, Phoenix Browser, PlayFree Browser, Polaris, Polarity, PolyBrowser, PrivacyWall, Microsoft Edge, Qazweb, QQ Browser Lite, QQ Browser Mini, QQ Browser, Qutebrowser, Quark, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, Seewo Browser, SEMC-Browser, Sogou Explorer, Safari, Safe Exam Browser, SalamWeb, SFive, Shiira, SimpleBrowser, Sizzy, Skyfire, Seraphic Sraf, Sleipnir, Slimjet, SP Browser, 7Star, Smart Lenovo Browser, Smooz, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, surf, Stargon, START Internet Browser, Steam In-Game Overlay, Streamy, Swiftfox, Seznam Browser, T-Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, Tungsten, ToGate, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser HD, UC Browser Mini, UC Browser Turbo, UR Browser, Uzbl, Venus Browser, Vivaldi, vivo Browser, Vision Mobile Browser, VMware AirWatch, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Lite, Yaani Browser, Yolo Browser, xStand, Xiino, Xvast, Zetakey, Zvu
255
 
256
  ### List of detected browser engines:
257
 
@@ -267,7 +268,7 @@ Audacious, Banshee, Boxee, Clementine, Deezer, FlyCast, Foobar2000, Google Podca
267
 
268
  ### List of detected mobile apps:
269
 
270
- 1Password, 2tch, Alexa Media Player, AndroidDownloadManager, AntennaPod, Apple News, Baidu Box App, BB2C, BetBull, BeyondPod, BingWebApp, Bitsboard, bPod, CastBox, Castro, Castro 2, CGN, ChMate, Ciisaa, Clovia, Copied, Covenant Eyes, CrosswalkApp, DeviantArt, DingTalk, Discord, DoggCatcher, douban App, Evolve Podcast, Facebook, Facebook Messenger, Facebook Messenger Lite, FeedR, Flipboard App, Google Go, Google Play Newsstand, Google Plus, Google Search App, HeyTapBrowser, HP Smart, iCatcher, Instacast, Instagram App, Instapaper, JaneStyle, KakaoTalk, Keeper Password Manager, Kik, Line, LinkedIn, Microsoft Office $1, Microsoft Office Mobile, Microsoft OneDrive, Microsoft Outlook, Naver, NewsArticle App, NPR One, Opal Travel, Overcast, Pandora, Papers, Pic Collage, Pinterest, Player FM, Pocket Casts, Podbean, Podcast & Radio Addict, Podcaster, Podcast Republic, Podcasts, Podcat, Podcatcher Deluxe, Podimo, Podkicker, Procast, RadioPublic, Roblox, RoboForm, Rocket Chat, RSSRadio, Shopee, ShowMe, Sina Weibo, Siri, Skyeng Teachers, Skype for Business, Slack, Snapchat, SogouSearch App, SPORT1, Swoot, The Wall Street Journal, Thunder, tieba, TikTok, TopBuzz, TuneIn Radio, TuneIn Radio Pro, TVirl, twinkle, Twitter, U-Cursos, UnityPlayer, Viber, Wattpad, WeChat, WeChat Share Extension, WhatsApp, Whisper, WH Questions, Wirtschafts Woche, Yahoo! Japan, Yandex, Yelp Mobile, YouTube, Zalo, Zoho Chat and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking)*
271
 
272
  ### List of detected PIMs (personal information manager):
273
 
@@ -279,8 +280,8 @@ Akregator, Apple PubSub, BashPodder, Breaker, Downcast, FeedDemon, Feeddler RSS
279
 
280
  ### List of brands with detected devices:
281
 
282
- 2E, 2F Mobile, 3GNET, 3Q, 4Good, 4ife, 360, 8848, A1, Accent, Ace, Acer, Acteck, Advan, Advance, AfriOne, AGM, Ainol, Airness, Airties, AIS, Aiuto, Aiwa, Akai, Alba, Alcatel, Alcor, ALDI NORD, ALDI SÜD, Alfawise, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, Altice, altron, Amazon, AMGOO, Amigoo, Amoi, Andowl, Anry, ANS, AOC, Aoson, Apple, Archos, Arian Space, Ark, ArmPhone, Arnova, ARRIS, Artel, Artizlee, Asano, Asanzo, Ask, Aspera, Assistant, Asus, AT&T, Atom, Atvio, Audiovox, AURIS, Avenzo, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BB Mobile, BDF, Becker, Beeline, Beelink, Beetel, Bellphone, BenQ, BenQ-Siemens, Beyond, Bezkam, BGH, Bigben, BIHEE, BilimLand, Billion, BioRugged, Bird, Bitel, Bitmore, Bkav, Black Bear, Black Fox, Blackview, Blaupunkt, Blloc, Blu, Bluboo, Bluedot, Bluegood, Bluewave, Bmobile, Bobarry, bogo, Boway, bq, Brandt, Bravis, BrightSign, Brondi, Bush, CAGI, Camfone, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Cavion, Celcus, Celkon, Cell-C, CellAllure, Centric, CG Mobile, Changhong, Cherry Mobile, CHIA, Chico Mobile, China Mobile, Chuwi, Claresta, Clarmin, Clementoni, Cloudfone, Cloudpad, Clout, CnM, Coby Kyros, Colors, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Connectce, Connex, Conquest, Contixo, Coolpad, CORN, Cosmote, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crony, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datalogic, Datamini, Datang, Datawind, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digihome, Digiland, Digma, Ditecma, Diva, Divisat, DMM, DNS, DoCoMo, Doffler, Dolamee, Doogee, Doopro, Doov, Dopod, Doro, Droxio, Dune HD, E-Boda, E-Ceros, E-tel, Eagle, Easypix, EBEST, Echo Mobiles, ECS, EE, Einstein, EKO, Eks Mobility, EKT, ELARI, Electroneum, ELECTRONIA, Element, Elenberg, Elephone, Eltex, Energizer, Energy Sistem, Engel, Enot, Epik One, Ergo, Ericsson, Ericy, Essential, Essentielb, eSTAR, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, EWIS, EXCEED, ExMobile, EXO, Explay, Extrem, Ezio, Ezze, F&U, F150, Facebook, Fairphone, Famoco, Fantec, FaRao Pro, FarEasTone, Fengxiang, Fero, FiGO, FinePower, Finlux, FireFly Mobile, Fly, FNB, Fondi, Fonos, FORME, Formuler, Forstar, Fortis, Fourel, Foxconn, Freetel, Fuego, Fujitsu, G-TiDE, G-Touch, Garmin-Asus, Gateway, Gemini, General Mobile, Genesis, GEOFOX, Geotel, GFive, Ghia, Ghong, Gigabyte, Gigaset, Gini, Ginzzu, Gionee, Globex, GLX, GOCLEVER, GoGEN, Gol Mobile, Goly, Gome, GoMobile, Google, Goophone, Gradiente, Grape, Gree, Greentel, Gresso, Grundig, Hafury, Haier, HannSpree, Hardkernel, Hasee, Helio, Hezire, Hi-Level, High Q, Highscreen, Hipstreet, Hisense, Hitachi, Hitech, Hoffmann, Hometech, Homtom, Honeywell, Hoozo, Horizon, Hosin, Hotel, Hotwav, How, HP, HTC, Huadoo, Huawei, Humax, Hurricane, Huskee, Hyrican, Hyundai, Hyve, i-Cherry, i-Joy, i-mate, i-mobile, iBall, iBerry, iBrit, IconBIT, iDroid, iGet, iHunt, Ikea, IKI Mobile, iKoMo, IKU Mobile, iLA, iLife, iMars, IMO Mobile, Impression, INCAR, Inco, iNew, Infinix, InFocus, InfoKit, Inkti, InnJoo, Innos, Innostream, Inoi, INQ, Insignia, Intek, Intex, Invens, Inverto, Invin, iOcean, iPro, iQ&T, IQM, Irbis, Iris, iRola, iRulu, iSWAG, IT, iTel, iTruck, IUNI, iVA, iView, iVooMi, iZotron, JAY-Tech, Jesy, JFone, Jiake, Jiayu, Jinga, Jivi, JKL, Jolla, Just5, JVC, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, Kata, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kenxinda, Kiano, Kingsun, KINGZONE, Kivi, Klipad, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, Koolnee, Kooper, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, KUBO, Kuliao, Kult, Kumai, Kyocera, Kyowon, Kzen, LAIQ, Land Rover, Landvo, Lanix, Lark, Laurus, Lava, LCT, Leader Phone, Leagoo, Ledstar, LeEco, Leff, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lesia, Lexand, Lexibook, LG, Lifemaxx, Lingwin, Linnex, Linsar, Loewe, Logic, Logicom, LT Mobile, Lumigon, Lumus, Luna, Luxor, LYF, M-Tech, M.T.T., M4tel, MAC AUDIO, Macoox, Magnus, Majestic, Malata, Manhattan, Mann, Manta Multimedia, Mantra, Masstel, Matrix, Maxcom, Maximus, Maxtron, MAXVI, Maxwest, Maze, Maze Speed, MDC Store, meanIT, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Melrose, Memup, Metz, MEU, MicroMax, Microsoft, Minix, Mintt, Mio, Miray, Mito, Mitsubishi, MIVO, MIXC, MiXzo, MLLED, MLS, Mobicel, Mobiistar, Mobiola, Mobistel, MobiWire, Mobo, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MStar, MTC, MTN, Multilaser, MYFON, MyPhone, Myria, Myros, Mystery, MyTab, MyWigo, Nabi, Naomi Phone, National, Navcity, Navitech, Navitel, Navon, NEC, Necnot, Neffos, Neomi, Netgear, NeuImage, Newgen, Newland, Newman, Newsday, NewsMy, NEXBOX, Nexian, NEXON, Nextbit, NextBook, NextTab, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, NOBUX, Nokia, Nomi, Nomu, Nordmende, NorthTech, Nos, Nous, NuAns, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Oale, OASYS, Obi, Odys, OINOM, Ok, Okapia, OKWU, Onda, OnePlus, Onix, ONN, ONYX BOOX, OpelMobile, Openbox, OPPO, Opsson, Orange, Orbic, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Ovvi, Owwo, Oysters, Oyyu, OzoneHD, P-UP, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pendoo, Pentagram, Phicomm, Philco, Philips, Phonemax, phoneOne, Pioneer, PiPO, Pixela, Pixelphone, Pixus, Planet Computers, Ployer, Plum, Pluzz, PocketBook, POCO, Point of View, Polaroid, PolyPad, Polytron, Pomp, Poppox, Positivo, Positivo BGH, PPTV, Premio, Prestigio, Primepad, Primux, Prixton, PROFiLO, Proline, ProScan, Protruly, PULID, Q-Touch, Q.Bell, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, Ravoz, Razer, RCA Tablets, Reach, Readboy, Realme, RED, Reeder, REGAL, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, RugGear, Ruio, Runbo, Ryte, S-TELL, Saba, Safaricom, Sagem, Salora, Samsung, Sanei, Sansui, Santin, Sanyo, Savio, SCBC, Schneider, Seatel, Seeken, SEG, Sega, Selenga, Selevision, Selfix, SEMP TCL, Sencor, Sendo, Senkatel, Senseit, Senwa, Seuic, SFR, Sharp, Shift Phones, Shtrikh-M, Shuttle, Sico, Siemens, Sigma, Silelis, Silent Circle, Simbans, Simply, Singtech, Siragon, SKG, Sky, Skyworth, Smadl, Smailo, Smart, Smartab, SMARTEC, Smartfren, Smartisan, Softbank, SOLE, SOLO, Solone, Sonim, SONOS, Sony, Sony Ericsson, Soundmax, Soyes, Spark, SPC, Spectrum, Spice, SQOOL, Star, Starlight, Starmobile, Starway, STF Mobile, STK, Stonex, Storex, StrawBerry, Subor, Sugar, Sumvision, Sunny, Sunstech, SunVan, Sunvell, SuperSonic, SuperTab, Supra, Suzuki, Swipe, SWISSMOBILITY, Swisstone, SWTV, Symphony, Syrox, T-Mobile, Takara, Tanix, TB Touch, TCL, TD Systems, Technicolor, Technika, TechniSat, TechnoTrend, TechPad, Techwood, Teclast, Tecno Mobile, TEENO, Teknosa, Tele2, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, Tetratab, teXet, ThL, Thomson, Thuraya, TIANYU, Time2, Timovi, Tinai, Tinmo, TiPhone, TOKYO, Tolino, Tone, Tooky, Top House, Toplux, Topway, Torex, Toshiba, Touchmate, Transpeed, TrekStor, Trevi, Trifone, Trio, Tronsmart, True, True Slim, TTEC, Tunisie Telecom, Turbo, Turbo-X, TurboKids, TVC, TWM, Twoe, TWZ, Tymes, U.S. Cellular, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, UNIWA, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, v-mobile, VAIO, Vastking, VC, Venso, Verico, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vipro, Vision Touch, Vitelcom, Viumee, Vivax, Vivo, Vizio, VK Mobile, VKworld, Vodacom, Vodafone, Vonino, Vontar, Vorago, Vorke, Voto, VOX, Voxtel, Voyo, Vsmart, Vsun, Vulcan, VVETIME, Walton, WE, Web TV, Weimei, WellcoM, WELLINGTON, Western Digital, Westpoint, Wexler, Wieppo, Wigor, Wiko, Wileyfox, Winds, Wink, Winmax, Winnovo, Wintouch, Wiseasy, Wizz, Wolder, Wolfgang, Wonu, Woo, Wortmann, Woxter, X-BO, X-TIGI, X-View, X.Vision, Xgody, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Xshitou, Xtouch, Yandex, Yarvik, Yes, Yezz, Yoka TV, Yota, Ytone, Yu, Yuandao, YUHO, Yusun, Yxtel, Zatec, Zebra, Zeemi, Zen, Zenek, Zentality, Zfiner, ZH&K, Zidoo, Ziox, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
283
 
284
  ### List of detected bots:
285
 
286
- 360Spider, Aboundexbot, Acoon, Adbeat, AddThis.com, ADMantX, ADmantX Service Fetcher, aHrefs Bot, Alexa Crawler, Alexa Site Audit, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, ApacheBench, Applebot, AppSignalBot, Arachni, archive.org bot, ArchiveBox, Ask Jeeves, AspiegelBot, Awario, Awario, Backlink-Check.de, BacklinkCrawler, Baidu Spider, Barkrowler, BazQux Reader, BDCbot, BingBot, BitlyBot, Blekkobot, BLEXBot Crawler, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Bountii Bot, BrandVerity, Browsershots, BUbiNG, Buck, BuiltWith, Butterfly Robot, Bytespider, CareerBot, Castro 2, Catchpoint, CATExplorador, ccBot crawler, Charlotte, Choosito, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Cloudflare Diagnostics, Cocolyzebot, Collectd, CommaFeed, Comscore, ContentKing, CSS Certificate Spider, Cốc Cốc Bot, Datadog Agent, datagnionbot, Datanyze, Dataprovider, DataXu, Daum, Dazoobot, Discobot, Domain Re-Animator Bot, Domains Project, DotBot, DuckDuckGo Bot, Easou Spider, eCairn-Grabber, EMail Exractor, EmailWolf, Embedly, evc-batch, ExaBot, ExactSeek Crawler, Expanse, Ezooms, eZ Publish Link Validator, Facebook External Hit, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Fever, Findxbot, Flipboard, FreshRSS, Generic Bot, Generic Bot, Genieo Web filter, Gigablast, Gigabot, Gluten Free Crawler, Gmail Image Proxy, Goo, Googlebot, Google Cloud Scheduler, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Stackdriver Monitoring, Google Structured Data Testing Tool, Gowikibot, Grammarly, Grapeshot, GTmetrix, Hatena Favicon, Heart Rails Capture, Heritrix, Heureka Feed, HTTPMon, httpx, HuaweiWebCatBot, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, IIS Site Analysis, Inktomi Slurp, inoreader, IP-Guide Crawler, IPS Agent, Kaspersky, Kouio, Larbin web crawler, LCC, Let's Encrypt Validation, Lighthouse, Linkdex Bot, LinkedIn Bot, LinkpadBot, LTX71, LumtelBot, Lycos, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, masscan, Mastodon Bot, Meanpath Bot, Mediatoolkit Bot, MetaInspector, MetaJobBot, MicroAdBot, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, Munin, MuscatFerret, Nagios check_http, NalezenCzBot, nbertaupete95, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, NetResearchServer, Netvibes, NewsBlur, NewsGator, Nimbostratus Bot, NLCrawler, Nmap, Notify Ninja, Nutch-based Bot, Nuzzel, oBot, Octopus, Odnoklassniki Bot, Omgili bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, Outbrain, PagePeeker, PageThing, PaperLiBot, parse.ly, Petal Bot, Phantomas, PHP Server Monitor, Picsearch bot, PingAdmin.Ru, Pingdom Bot, Pinterest, PiplBot, Plukkie, PocketParser, Pompos, PritTorrent, Project Resonance, PRTG Network Monitor, QuerySeekerSpider, Quora Bot, Quora Link Preview, Qwantify, Rainmeter, RamblerMail Image Proxy, Reddit Bot, Riddler, Robozilla, Rogerbot, ROI Hunter, RSSRadio Bot, Ryowl, SabsimBot, SafeDNSBot, Scooter, ScoutJet, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Semantic Scholar Bot, Semrush Bot, Sensika Bot, Sentry Bot, Seobility, SEOENGBot, SEOkicks, SEOkicks-Robot, Seoscanners.net, Serendeputy Bot, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Website Monitoring, Siteimprove, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Proxy, Sogou Spider, Soso Spider, Sparkler, Speedy, Spinn3r, Spotify, Sprinklr, Sputnik Bot, Sputnik Favicon Bot, Sputnik Image Bot, sqlmap, SSL Labs, Startpagina Linkchecker, StatusCake, Superfeedr Bot, SurdotlyBot, Survey Bot, Tarmot Gezgin, TelegramBot, The Knowledge AI, theoldreader, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, UkrNet Mail Proxy, UniversalFeedParser, Uptimebot, Uptime Robot, URLAppendBot, Vagabondo, Velen Public Web Crawler, Vercel Bot, VeryHip, Visual Site Mapper Crawler, VK Share Button, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C Unified Validator, Wappalyzer, WebbCrawler, WebDataStats, Weborama, WebPageTest, WebSitePulse, WebThumbnail, WeSEE:Search, WeViKaBot, WhatCMS, WikiDo, Willow Internet Crawler, WooRank, WooRank, WordPress, Wotbox, XenForo, YaCy, Yahoo! Cache System, Yahoo! Japan BRW, Yahoo! Link Preview, Yahoo! Mail Proxy, Yahoo! Slurp, Yahoo Gemini, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, Youdao Bot, Yourls, Yunyun Bot, Zao, Ze List, zgrab, Zookabot, ZoominfoBot, ZumBot
233
  - **.NET** https://github.com/totpero/DeviceDetector.NET
234
  - **Ruby** https://github.com/podigee/device_detector
235
  - **JavaScript/TypeScript/NodeJS** https://github.com/etienne-martin/device-detector-js
236
+ - **NodeJS** https://github.com/sanchezzzhak/node-device-detector
237
  - **Python 3** https://github.com/thinkwelltwd/device_detector
238
  - **Crystal** https://github.com/creadone/device_detector
239
  - **Elixir** https://github.com/elixir-inspector/ua_inspector
244
 
245
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
246
 
247
+ *Last update: 2021/07/11*
248
 
249
  ### List of detected operating systems:
250
 
252
 
253
  ### List of detected browsers:
254
 
255
+ 115 Browser, 2345 Browser, 360 Phone Browser, 360 Browser, 7654 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Desktop, AOL Shield, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, Atom, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Avira Scout, AwoX, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Blue Browser, Borealis Navigator, Brave, BriskBard, BrowseX, Browzar, Biyubi, Byffox, Camino, CCleaner, Chedot, Centaury, Coc Coc, CoolBrowser, Colibri, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, Cornowser, Chim Lac, ChromePlus, Chromium, Chromium GOST, Cyberfox, Cheshire, Crusta, Craving Explorer, Crazy Browser, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, deg-degan, Deledao, Delta Browser, DeskBrowse, Dolphin, Dorado, Dot Browser, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, Elements Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Flow, Firefox Mobile, Fireweb, Fireweb Navigator, Flast, FreeU, Galeon, Ghostery Privacy Browser, GinxDroid Browser, Glass Browser, Google Earth, GOG Galaxy, HasBrowser, Hawk Turbo Browser, Helio, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Japan Browser, Jasmine, JavaFX, Jig Browser, Jig Browser Plus, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kode Browser, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Light, Links, Lolifox, Lovense Browser, LuaKit, Lulumi, Lunascape, Lunascape Lite, Lynx, Mandarin, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, Maelstrom, MxNitro, Mypal, Monument Browser, MAUI WAP Browser, Navigateur Web, NFS Browser, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odin, OceanHero, Odyssey Web Browser, Off By One, OhHai Browser, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Orca, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Polypane, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Perfect Browser, Phantom Browser, Phoenix, Phoenix Browser, PlayFree Browser, Polaris, Polarity, PolyBrowser, PrivacyWall, Microsoft Edge, Qazweb, QQ Browser Lite, QQ Browser Mini, QQ Browser, Qutebrowser, Quark, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, Seewo Browser, SEMC-Browser, Sogou Explorer, Safari, Safe Exam Browser, SalamWeb, SFive, Shiira, SimpleBrowser, Sizzy, Skyfire, Seraphic Sraf, Sleipnir, Slimjet, SP Browser, 7Star, Smart Lenovo Browser, Smooz, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, surf, Stargon, START Internet Browser, Steam In-Game Overlay, Streamy, Swiftfox, Seznam Browser, T-Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, Tungsten, ToGate, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser HD, UC Browser Mini, UC Browser Turbo, UR Browser, Uzbl, Venus Browser, Vivaldi, vivo Browser, Vision Mobile Browser, VMware AirWatch, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Lite, Yaani Browser, Yolo Browser, xStand, Xiino, Xvast, Zetakey, Zvu
256
 
257
  ### List of detected browser engines:
258
 
268
 
269
  ### List of detected mobile apps:
270
 
271
+ 1Password, 2tch, Alexa Media Player, AndroidDownloadManager, AntennaPod, Apple News, Baidu Box App, BB2C, BetBull, BeyondPod, Binance, BingWebApp, Bitsboard, bPod, CastBox, Castro, Castro 2, CGN, ChMate, Ciisaa, Clovia, Copied, Covenant Eyes, CrosswalkApp, DeviantArt, DingTalk, Discord, DoggCatcher, douban App, Evolve Podcast, Facebook, Facebook Messenger, Facebook Messenger Lite, FeedR, Flipboard App, Google Go, Google Play Newsstand, Google Plus, Google Search App, HeyTapBrowser, HP Smart, iCatcher, Instacast, Instagram App, Instapaper, JaneStyle, KakaoTalk, Keeper Password Manager, Kik, Line, LinkedIn, Microsoft Office $1, Microsoft Office Mobile, Microsoft OneDrive, Microsoft Outlook, My World, Naver, Netflix, NewsArticle App, NPR One, Odnoklassniki, Opal Travel, Overcast, Pandora, Papers, Pic Collage, Pinterest, Player FM, Pocket Casts, Podbean, Podcast & Radio Addict, Podcaster, Podcast Republic, Podcasts, Podcat, Podcatcher Deluxe, Podimo, Podkicker, Procast, RadioPublic, Roblox, RoboForm, Rocket Chat, RSSRadio, Shopee, ShowMe, Sina Weibo, Siri, Skyeng Teachers, Skype for Business, Slack, Snapchat, SogouSearch App, SPORT1, Swoot, The Wall Street Journal, Thunder, tieba, TikTok, TopBuzz, TuneIn Radio, TuneIn Radio Pro, TVirl, twinkle, Twitter, U-Cursos, UnityPlayer, Viber, Wattpad, WeChat, WeChat Share Extension, WhatsApp, Whisper, WH Questions, Wirtschafts Woche, Yahoo! Japan, Yandex, Yelp Mobile, YouTube, Zalo, Zoho Chat and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking)*
272
 
273
  ### List of detected PIMs (personal information manager):
274
 
280
 
281
  ### List of brands with detected devices:
282
 
283
+ 2E, 2F Mobile, 3GNET, 3Q, 4Good, 4ife, 360, 8848, A1, Accent, Ace, Acer, Acteck, Advan, Advance, AfriOne, AGM, Ainol, Airness, Airties, AIS, Aiuto, Aiwa, Akai, AKIRA, Alba, Alcatel, Alcor, ALDI NORD, ALDI SÜD, Alfawise, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, Altice, altron, Amazon, AMCV, AMGOO, Amigoo, Amoi, Andowl, Anry, ANS, AOC, Aoson, AOYODKG, Apple, Archos, Arian Space, Ark, ArmPhone, Arnova, ARRIS, Artel, Artizlee, Asano, Asanzo, Ask, Aspera, Assistant, Astro, Asus, AT&T, Atom, Atvio, Audiovox, AURIS, Avenzo, AVH, Avvio, Axioo, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BB Mobile, BDF, Becker, Beeline, Beelink, Beetel, Bellphone, BenQ, BenQ-Siemens, Beyond, Bezkam, BGH, Bigben, BIHEE, BilimLand, Billion, BioRugged, Bird, Bitel, Bitmore, Bkav, Black Bear, Black Fox, Blackview, Blaupunkt, Bleck, Blloc, Blu, Bluboo, Bluedot, Bluegood, Bluewave, Bmobile, Bobarry, bogo, Boway, bq, Brandt, Bravis, BrightSign, Brondi, BS Mobile, Bush, CAGI, Camfone, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Cavion, Celcus, Celkon, Cell-C, CellAllure, Centric, CG Mobile, Changhong, Cherry Mobile, CHIA, Chico Mobile, China Mobile, Chuwi, Claresta, Clarmin, Clementoni, Cloudfone, Cloudpad, Clout, CnM, Cobalt, Coby Kyros, Colors, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Connectce, Connex, Conquest, Contixo, Coolpad, CORN, Cosmote, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crony, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datalogic, Datamini, Datang, Datawind, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digihome, Digiland, Digma, Ditecma, Diva, Divisat, DIXON, DMM, DNS, DoCoMo, Doffler, Dolamee, Doogee, Doopro, Doov, Dopod, Doro, Droxio, Dune HD, E-Boda, E-Ceros, E-tel, Eagle, Easypix, EBEST, Echo Mobiles, ECON, ECS, EE, Einstein, EKO, Eks Mobility, EKT, ELARI, Electroneum, ELECTRONIA, Elekta, Element, Elenberg, Elephone, Eltex, Energizer, Energy Sistem, Engel, Enot, Epik One, Ergo, Ericsson, Ericy, Erisson, Essential, Essentielb, eSTAR, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, EWIS, EXCEED, ExMobile, EXO, Explay, Extrem, Ezio, Ezze, F&U, F150, Facebook, Fairphone, Famoco, Fantec, FaRao Pro, FarEasTone, Fengxiang, Fero, FiGO, FinePower, Finlux, FireFly Mobile, FISE, Fly, FMT, FNB, Fondi, Fonos, FORME, Formuler, Forstar, Fortis, Fourel, Four Mobile, Foxconn, Freetel, Fuego, Fujitsu, G-TiDE, G-Touch, Garmin-Asus, Gateway, Gemini, General Mobile, Genesis, GEOFOX, Geotel, GFive, Ghia, Ghong, Gigabyte, Gigaset, Gini, Ginzzu, Gionee, Globex, GLX, GOCLEVER, GoGEN, Gol Mobile, Goly, Gome, GoMobile, Google, Goophone, Gooweel, Gradiente, Grape, Gree, Greentel, Gresso, Grundig, Hafury, Haier, HannSpree, Hardkernel, Hasee, Helio, Hezire, Hi, Hi-Level, High Q, Highscreen, Hipstreet, Hisense, Hitachi, Hitech, Hoffmann, Hometech, Homtom, Honeywell, Hoozo, Horizon, Hosin, Hotel, Hotwav, How, HP, HTC, Huadoo, Huawei, Humax, Hurricane, Huskee, Hyrican, Hyundai, Hyve, i-Cherry, i-Joy, i-mate, i-mobile, iBall, iBerry, iBrit, IconBIT, iDroid, iGet, iHunt, Ikea, IKI Mobile, iKoMo, IKU Mobile, iLA, iLife, iMars, IMO Mobile, Impression, INCAR, Inch, Inco, iNew, Infinix, InFocus, InfoKit, Inkti, InnJoo, Innos, Innostream, Inoi, INQ, Insignia, Intek, Intex, Invens, Inverto, Invin, iOcean, iPro, iQ&T, IQM, Irbis, Iris, iRola, iRulu, iSWAG, IT, iTel, iTruck, IUNI, iVA, iView, iVooMi, iZotron, JAY-Tech, Jeka, Jesy, JFone, Jiake, Jiayu, Jinga, Jivi, JKL, Jolla, Just5, JVC, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, Kata, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kenxinda, Kiano, Kingsun, KINGZONE, Kivi, Klipad, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, Koolnee, Kooper, KOPO, Koridy, KREZ, KRONO, Krüger&Matz, KT-Tech, KUBO, Kuliao, Kult, Kumai, Kurio, Kvant, Kyocera, Kyowon, Kzen, L-Max, LAIQ, Land Rover, Landvo, Lanix, Lark, Laurus, Lava, LCT, Leader Phone, Leagoo, Leben, Ledstar, LeEco, Leff, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lesia, Lexand, Lexibook, LG, Lifemaxx, Lingwin, Linnex, Linsar, Loewe, Logic, Logicom, Loview, LT Mobile, Lumigon, Lumus, Luna, Luxor, LYF, M-Tech, M.T.T., M4tel, MAC AUDIO, Macoox, Magnus, Majestic, Malata, Manhattan, Mann, Manta Multimedia, Mantra, Masstel, Matrix, Maxcom, Maximus, Maxtron, MAXVI, Maxwest, Maze, Maze Speed, MDC Store, meanIT, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Melrose, Memup, Metz, MEU, MicroMax, Microsoft, Minix, Mintt, Mio, Miray, Mito, Mitsubishi, MIVO, MIXC, MiXzo, MLLED, MLS, Mobicel, Mobiistar, Mobiola, Mobistel, MobiWire, Mobo, Modecom, Mofut, Motorola, Movic, mPhone, Mpman, MSI, MStar, MTC, MTN, Multilaser, MYFON, MyPhone, Myria, Myros, Mystery, MyTab, MyWigo, Nabi, Naomi Phone, National, Navcity, Navitech, Navitel, Navon, NEC, Necnot, Neffos, Neomi, Netgear, NeuImage, New Balance, Newgen, Newland, Newman, Newsday, NewsMy, NEXBOX, Nexian, NEXON, Nextbit, NextBook, NextTab, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, NOBUX, Nokia, Nomi, Nomu, Nordmende, NorthTech, Nos, Nous, Novex, NuAns, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Oale, OASYS, Obi, Odys, OINOM, Ok, Okapia, OKWU, Onda, OnePlus, Onix, ONN, ONYX BOOX, OpelMobile, Openbox, OPPO, Opsson, Orange, Orbic, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Ovvi, Owwo, Oysters, Oyyu, OzoneHD, P-UP, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pendoo, Pentagram, Phicomm, Philco, Philips, Phonemax, phoneOne, Pico, Pioneer, PiPO, Pixela, Pixelphone, Pixus, Planet Computers, Ployer, Plum, Pluzz, PocketBook, POCO, Point of View, Polaroid, PolyPad, Polytron, Pomp, Poppox, Positivo, Positivo BGH, PPTV, Premio, Prestigio, Primepad, Primux, Prixton, PROFiLO, Proline, ProScan, Protruly, PULID, Q-Touch, Q.Bell, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, Raspberry, Ravoz, Razer, RCA Tablets, Reach, Readboy, Realme, RED, Reeder, REGAL, Revo, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Rivo, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RoyQueen, RT Project, RugGear, Ruio, Runbo, Ryte, S-TELL, Saba, Safaricom, Sagem, Salora, Samsung, Sanei, Sansui, Santin, Sanyo, Savio, SCBC, Schneider, Seatel, Seeken, SEG, Sega, Selenga, Selevision, Selfix, SEMP TCL, Sencor, Sendo, Senkatel, Senseit, Senwa, Seuic, SFR, Sharp, Shift Phones, Shtrikh-M, Shuttle, Sico, Siemens, Sigma, Silelis, Silent Circle, Simbans, Simply, Singtech, Siragon, SKG, Sky, Skyworth, Smadl, Smailo, Smart, Smartab, SMARTEC, Smartfren, Smartisan, Smotreshka, Softbank, SOLE, SOLO, Solone, Sonim, SONOS, Sony, Sony Ericsson, Soundmax, Soyes, Spark, SPC, Spectralink, Spectrum, Spice, SQOOL, Star, Starlight, Starmobile, Starway, Starwind, STF Mobile, STG Telecom, STK, Stonex, Storex, StrawBerry, Subor, Sugar, Sumvision, Sunny, Sunstech, SunVan, Sunvell, SuperSonic, SuperTab, Supra, Suzuki, Swipe, SWISSMOBILITY, Swisstone, SWTV, Symphony, Syrox, T-Mobile, Takara, Tambo, Tanix, TB Touch, TCL, TD Systems, Technicolor, Technika, TechniSat, TechnoTrend, TechPad, Techwood, Teclast, Tecno Mobile, TEENO, Teknosa, Tele2, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, Tetratab, teXet, ThL, Thomson, Thuraya, TIANYU, Time2, Timovi, Tinai, Tinmo, TiPhone, TOKYO, Tolino, Tone, Tooky, Top House, Toplux, Topway, Torex, Toshiba, Touchmate, Transpeed, TrekStor, Trevi, Trifone, Trio, Tronsmart, True, True Slim, TTEC, Tunisie Telecom, Turbo, Turbo-X, TurboKids, TurboPad, TVC, TWM, Twoe, TWZ, Tymes, U.S. Cellular, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, UNIWA, Unknown, Unnecto, Unonu, Unowhy, UTime, UTOK, UTStarcom, UZ Mobile, v-mobile, VAIO, Vargo, Vastking, VC, Vega, Venso, Verico, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vipro, Vision Touch, Vitelcom, Viumee, Vivax, Vivo, Vizio, VK Mobile, VKworld, Vodacom, Vodafone, Vonino, Vontar, Vorago, Vorke, Voto, VOX, Voxtel, Voyo, Vsmart, Vsun, Vulcan, VVETIME, Walton, WE, Web TV, Weimei, WellcoM, WELLINGTON, Western Digital, Westpoint, Wexler, Wieppo, Wigor, Wiko, Wileyfox, Winds, Wink, Winmax, Winnovo, Wintouch, Wiseasy, WIWA, Wizz, Wolder, Wolfgang, Wonu, Woo, Wortmann, Woxter, X-BO, X-TIGI, X-View, X.Vision, XGIMI, Xgody, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Xshitou, Xtouch, Xtratech, Yandex, Yarvik, YASIN, Yes, Yezz, Yoka TV, Yota, Ytone, Yu, Yuandao, YUHO, Yuno, Yusun, Yxtel, Zaith, Zatec, Zebra, Zeemi, Zen, Zenek, Zentality, Zfiner, ZH&K, Zidoo, Ziox, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
284
 
285
  ### List of detected bots:
286
 
287
+ 360Spider, Aboundexbot, Acoon, Adbeat, AddThis.com, ADMantX, ADmantX Service Fetcher, Adsbot, aHrefs Bot, Alexa Crawler, Alexa Site Audit, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, ApacheBench, Applebot, AppSignalBot, Arachni, archive.org bot, ArchiveBox, Ask Jeeves, AspiegelBot, Awario, Awario, Backlink-Check.de, BacklinkCrawler, Baidu Spider, Barkrowler, BazQux Reader, BDCbot, BingBot, BitlyBot, Blekkobot, BLEXBot Crawler, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Bountii Bot, BrandVerity, Browsershots, BUbiNG, Buck, BuiltWith, Butterfly Robot, Bytespider, CareerBot, Castro 2, Catchpoint, CATExplorador, ccBot crawler, CensysInspect, Charlotte, Choosito, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Cloudflare Diagnostics, Cocolyzebot, Collectd, colly, CommaFeed, Comscore, ContentKing, Cookiebot, CSS Certificate Spider, Cốc Cốc Bot, Datadog Agent, datagnionbot, Datanyze, Dataprovider, DataXu, Daum, Dazoobot, Discobot, Domain Re-Animator Bot, Domains Project, DotBot, DuckDuckGo Bot, Easou Spider, eCairn-Grabber, EMail Exractor, EmailWolf, Embedly, evc-batch, ExaBot, ExactSeek Crawler, Expanse, Ezooms, eZ Publish Link Validator, Facebook External Hit, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Fever, Findxbot, Flipboard, FreshRSS, GDNP, Generic Bot, Generic Bot, Genieo Web filter, Gigablast, Gigabot, Gluten Free Crawler, Gmail Image Proxy, Goo, Googlebot, Google Cloud Scheduler, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Stackdriver Monitoring, Google Structured Data Testing Tool, Gowikibot, Grammarly, Grapeshot, GTmetrix, Hatena Favicon, Heart Rails Capture, Heritrix, Heureka Feed, HTTPMon, httpx, HuaweiWebCatBot, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, IIS Site Analysis, Inktomi Slurp, inoreader, IP-Guide Crawler, IPS Agent, Kaspersky, KomodiaBot, Kouio, l9tcpid, Larbin web crawler, LCC, Let's Encrypt Validation, Lighthouse, Linkdex Bot, LinkedIn Bot, LinkpadBot, LTX71, LumtelBot, Lycos, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, masscan, Mastodon Bot, Meanpath Bot, Mediatoolkit Bot, MegaIndex, MetaInspector, MetaJobBot, MicroAdBot, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, MTRobot, Munin, MuscatFerret, Nagios check_http, NalezenCzBot, nbertaupete95, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, NetResearchServer, NetSystemsResearch, Netvibes, NewsBlur, NewsGator, Nimbostratus Bot, NLCrawler, Nmap, Notify Ninja, Nutch-based Bot, Nuzzel, oBot, Octopus, Odnoklassniki Bot, Omgili bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, Outbrain, PagePeeker, PageThing, PaperLiBot, parse.ly, Petal Bot, Phantomas, PHP Server Monitor, Picsearch bot, PingAdmin.Ru, Pingdom Bot, Pinterest, PiplBot, Plukkie, PocketParser, Pompos, PritTorrent, Project Resonance, PRTG Network Monitor, QuerySeekerSpider, Quora Bot, Quora Link Preview, Qwantify, Rainmeter, RamblerMail Image Proxy, Reddit Bot, Riddler, Robozilla, Rogerbot, ROI Hunter, RSSRadio Bot, Ryowl, SabsimBot, SafeDNSBot, Scooter, ScoutJet, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Seekport, Semantic Scholar Bot, Semrush Bot, Sensika Bot, Sentry Bot, Seobility, SEOENGBot, SEOkicks, SEOkicks-Robot, seolyt, Seoscanners.net, Serendeputy Bot, serpstatbot, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Website Monitoring, Siteimprove, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Proxy, Sogou Spider, Soso Spider, Sparkler, Speedy, Spinn3r, Spotify, Sprinklr, Sputnik Bot, Sputnik Favicon Bot, Sputnik Image Bot, sqlmap, SSL Labs, Startpagina Linkchecker, StatusCake, Superfeedr Bot, SurdotlyBot, Survey Bot, Tarmot Gezgin, TelegramBot, The Knowledge AI, theoldreader, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, UkrNet Mail Proxy, UniversalFeedParser, Uptimebot, Uptime Robot, URLAppendBot, Vagabondo, Velen Public Web Crawler, Vercel Bot, VeryHip, Visual Site Mapper Crawler, VK Share Button, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C Unified Validator, Wappalyzer, WebbCrawler, WebDataStats, Weborama, WebPageTest, WebSitePulse, WebThumbnail, WellKnownBot, WeSEE:Search, WeViKaBot, WhatCMS, WikiDo, Willow Internet Crawler, WooRank, WooRank, WordPress, Wotbox, XenForo, YaCy, Yahoo! Cache System, Yahoo! Japan BRW, Yahoo! Link Preview, Yahoo! Mail Proxy, Yahoo! Slurp, Yahoo Gemini, YaK, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, Youdao Bot, Yourls, Yunyun Bot, Zao, Ze List, zgrab, Zookabot, ZoominfoBot, ZumBot
app/vendor/matomo/device-detector/regexes/bots.yml CHANGED
@@ -180,6 +180,14 @@
180
  name: ''
181
  url: ''
182
 
 
 
 
 
 
 
 
 
183
  - regex: 'MSNBot|msrbot|bingbot|BingPreview|msnbot-(UDiscovery|NewsBlogs)|adidxbot'
184
  name: 'BingBot'
185
  category: 'Search bot'
@@ -1771,18 +1779,18 @@
1771
  - regex: 'HubPages.*crawlingpolicy'
1772
  name: 'HubPages'
1773
  category: 'Crawler'
1774
- url: 'http://hubpages.com/help/crawlingpolicy'
1775
  producer:
1776
- name: 'HubPages'
1777
- url: 'http://hubpages.com/'
1778
 
1779
  - regex: 'Pinterest(bot)?/\d\.\d.*www\.pinterest\.com.*'
1780
  name: 'Pinterest'
1781
- url: 'http://www.pinterest.com/bot.html'
1782
  category: 'Crawler'
1783
  producer:
1784
  name: 'Pinterest'
1785
- url: 'http://www.pinterest.com/'
1786
 
1787
  - regex: 'Site24x7'
1788
  name: 'Site24x7 Website Monitoring'
@@ -1827,10 +1835,10 @@
1827
  - regex: 'Catchpoint( bot)?'
1828
  name: 'Catchpoint'
1829
  category: 'Site Monitor'
1830
- url: ''
1831
  producer:
1832
  name: 'Catchpoint Systems'
1833
- url: 'http://www.catchpoint.com/'
1834
 
1835
  - regex: 'bitlybot'
1836
  name: 'BitlyBot'
@@ -1898,7 +1906,7 @@
1898
  - regex: 'RSSRadio \(Push Notification Scanner;support@dorada\.co\.uk\)'
1899
  name: 'RSSRadio Bot'
1900
 
1901
- - regex: '(A6-Indexer|nuhk|TsolCrawler|Yammybot|Openbot|Gulper Web Bot|grub-client|Download Demon|SearchExpress|Microsoft URL Control|borg|altavista|dataminr.com|tweetedtimes.com|TrendsmapResolver|teoma|blitzbot|oegp|furlbot|http%20client|polybot|htdig|mogimogi|larbin|scrubby|searchsight|seekbot|semanticdiscovery|snappy|vortex(?! Build)|zeal|fast-webcrawler|converacrawler|dataparksearch|findlinks|BrowserMob|HttpMonitor|ThumbShotsBot|URL2PNG|ZooShot|GomezA|Google SketchUp|Read%20Later|RackspaceBot|robots|SeopultContentAnalyzer|7Siters|centuryb.o.t9|InterNaetBoten|EasyBib AutoCite|Bidtellect|tomnomnom/meg)'
1902
  name: 'Generic Bot'
1903
 
1904
  - regex: '^sentry'
@@ -2310,8 +2318,8 @@
2310
  url: 'https://whatcms.org/'
2311
  category: 'Crawler'
2312
  producer:
2313
- name: ''
2314
- url: ''
2315
 
2316
  - regex: 'httpx'
2317
  name: 'httpx'
@@ -2415,6 +2423,108 @@
2415
  category: 'Crawler'
2416
  url: 'https://www.woorank.com/bot'
2417
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2418
  # Generic detections
2419
 
2420
  - regex: '[a-z0-9\-_]*((?<!cu|power[ _]|m[ _])bot(?![ _]TAB|[ _]?5[0-9])|crawler|crawl|checker|archiver|transcoder|spider)([^a-z]|$)'
180
  name: ''
181
  url: ''
182
 
183
+ - regex: 'Better Uptime Bot'
184
+ name: 'Better Uptime Bot'
185
+ category: 'Site Monitor'
186
+ url: 'https://betteruptime.com/faq'
187
+ producer:
188
+ name: 'Better Uptime'
189
+ url: 'https://betteruptime.com/'
190
+
191
  - regex: 'MSNBot|msrbot|bingbot|BingPreview|msnbot-(UDiscovery|NewsBlogs)|adidxbot'
192
  name: 'BingBot'
193
  category: 'Search bot'
1779
  - regex: 'HubPages.*crawlingpolicy'
1780
  name: 'HubPages'
1781
  category: 'Crawler'
1782
+ url: 'https://hubpages.com/help/crawlingpolicy'
1783
  producer:
1784
+ name: 'HubPages, Inc.'
1785
+ url: 'https://discover.hubpages.com/'
1786
 
1787
  - regex: 'Pinterest(bot)?/\d\.\d.*www\.pinterest\.com.*'
1788
  name: 'Pinterest'
1789
+ url: 'https://help.pinterest.com/en/business/article/pinterest-crawler'
1790
  category: 'Crawler'
1791
  producer:
1792
  name: 'Pinterest'
1793
+ url: 'https://www.pinterest.com/'
1794
 
1795
  - regex: 'Site24x7'
1796
  name: 'Site24x7 Website Monitoring'
1835
  - regex: 'Catchpoint( bot)?'
1836
  name: 'Catchpoint'
1837
  category: 'Site Monitor'
1838
+ url: 'https://www.catchpoint.com/'
1839
  producer:
1840
  name: 'Catchpoint Systems'
1841
+ url: 'https://www.catchpoint.com/'
1842
 
1843
  - regex: 'bitlybot'
1844
  name: 'BitlyBot'
1906
  - regex: 'RSSRadio \(Push Notification Scanner;support@dorada\.co\.uk\)'
1907
  name: 'RSSRadio Bot'
1908
 
1909
+ - regex: '(A6-Indexer|nuhk|TsolCrawler|Yammybot|Openbot|Gulper Web Bot|grub-client|Download Demon|SearchExpress|Microsoft URL Control|borg|altavista|dataminr.com|tweetedtimes.com|TrendsmapResolver|teoma|blitzbot|oegp|furlbot|http%20client|polybot|htdig|mogimogi|larbin|scrubby|searchsight|seekbot|semanticdiscovery|snappy|vortex(?! Build)|zeal|fast-webcrawler|converacrawler|dataparksearch|findlinks|BrowserMob|HttpMonitor|ThumbShotsBot|URL2PNG|ZooShot|GomezA|Google SketchUp|Read%20Later|RackspaceBot|robots|SeopultContentAnalyzer|7Siters|centuryb.o.t9|InterNaetBoten|EasyBib AutoCite|Bidtellect|tomnomnom/meg|My User Agent)'
1910
  name: 'Generic Bot'
1911
 
1912
  - regex: '^sentry'
2318
  url: 'https://whatcms.org/'
2319
  category: 'Crawler'
2320
  producer:
2321
+ name: 'Nineteen Ten LLC'
2322
+ url: 'https://whatcms.org/'
2323
 
2324
  - regex: 'httpx'
2325
  name: 'httpx'
2423
  category: 'Crawler'
2424
  url: 'https://www.woorank.com/bot'
2425
 
2426
+ - regex: 'Cookiebot/([\d+\.])'
2427
+ name: 'Cookiebot'
2428
+ category: 'Crawler'
2429
+ url: 'https://support.cookiebot.com/hc/en-us/articles/360014264140-Scanner-User-Agent'
2430
+ producer:
2431
+ name: 'Cybot A/S'
2432
+ url: 'https://www.cybot.com/'
2433
+
2434
+ - regex: 'NetSystemsResearch'
2435
+ name: 'NetSystemsResearch'
2436
+ category: 'Security Checker'
2437
+ url: 'https://www.netsystemsresearch.com/'
2438
+ producer:
2439
+ name: 'NET SYSTEMS RESEARCH LLC'
2440
+ url: 'https://www.netsystemsresearch.com/'
2441
+
2442
+ - regex: 'CensysInspect/([\d+\.])'
2443
+ name: 'CensysInspect'
2444
+ category: 'Security Checker'
2445
+ url: 'https://about.censys.io/'
2446
+ producer:
2447
+ name: 'Censys, Inc.'
2448
+ url: 'https://censys.io/'
2449
+
2450
+ - regex: 'gdnplus.com'
2451
+ name: 'GDNP'
2452
+ category: 'Crawler'
2453
+ url: 'https://gdnplus.com/'
2454
+ producer:
2455
+ name: 'Global Digital Network Plus, LLC'
2456
+ url: 'https://gdnplus.com/'
2457
+
2458
+ - regex: 'WellKnownBot/([\d+\.])'
2459
+ name: 'WellKnownBot'
2460
+ category: 'Crawler'
2461
+ url: 'https://well-known.dev'
2462
+
2463
+ - regex: 'Adsbot/([\d+\.])'
2464
+ name: 'Adsbot'
2465
+ category: 'Crawler'
2466
+ url: 'https://seostar.co/robot/'
2467
+
2468
+ - regex: 'MTRobot/([\d+\.])'
2469
+ name: 'MTRobot'
2470
+ category: 'Crawler'
2471
+ url: 'https://metrics-tools.de/robot.html'
2472
+ producer:
2473
+ name: 'Metrics Tools'
2474
+ url: 'https://metrics-tools.de/'
2475
+
2476
+ - regex: 'serpstatbot/([\d+\.])'
2477
+ name: 'serpstatbot'
2478
+ category: 'Crawler'
2479
+ url: 'http://serpstatbot.com/'
2480
+ producer:
2481
+ name: 'Netpeak Ltd'
2482
+ url: 'https://netpeak.net/'
2483
+
2484
+ - regex: 'colly'
2485
+ name: 'colly'
2486
+ category: 'Crawler'
2487
+ url: 'https://github.com/gocolly/colly/'
2488
+
2489
+ - regex: 'l9tcpid/v([\d+\.])'
2490
+ name: 'l9tcpid'
2491
+ category: 'Security Checker'
2492
+ url: 'https://github.com/LeakIX/l9tcpid'
2493
+
2494
+ - regex: 'MegaIndex.ru/([\d+\.])'
2495
+ name: 'MegaIndex'
2496
+ category: 'Crawler'
2497
+ url: 'https://megaindex.com/crawler'
2498
+
2499
+ - regex: 'Seekport'
2500
+ name: 'Seekport'
2501
+ category: 'Crawler'
2502
+ url: 'http://www.seekport.com/'
2503
+ producer:
2504
+ name: 'SISTRIX GmbH'
2505
+ url: 'https://www.sistrix.de/'
2506
+
2507
+ - regex: 'seolyt/([\d+\.])'
2508
+ name: 'seolyt'
2509
+ category: 'Crawler'
2510
+ url: 'https://seolyt.com/'
2511
+
2512
+ - regex: 'YaK/([\d+\.])'
2513
+ name: 'YaK'
2514
+ category: 'Crawler'
2515
+ url: 'https://www.linkfluence.com/'
2516
+ producer:
2517
+ name: 'Linkfluence SAS'
2518
+ url: 'https://www.linkfluence.com/'
2519
+
2520
+ - regex: 'KomodiaBot/([\d+\.])'
2521
+ name: 'KomodiaBot'
2522
+ category: 'Crawler'
2523
+ url: 'http://www.komodia.com/newwiki/index.php/URL_server_crawler'
2524
+ producer:
2525
+ name: 'Komodia Inc.'
2526
+ url: 'https://www.komodia.com/'
2527
+
2528
  # Generic detections
2529
 
2530
  - regex: '[a-z0-9\-_]*((?<!cu|power[ _]|m[ _])bot(?![ _]TAB|[ _]?5[0-9])|crawler|crawl|checker|archiver|transcoder|spider)([^a-z]|$)'
app/vendor/matomo/device-detector/regexes/client/browsers.yml CHANGED
@@ -5,6 +5,34 @@
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  # Helio (https://developer.magicleap.com/en-us/learn/guides/lumin-os-release-notes-summary)
9
  - regex: 'Helio/(\d+[\.\d]+)'
10
  name: 'Helio'
@@ -1687,6 +1715,21 @@
1687
  engine:
1688
  default: 'WebKit'
1689
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1690
  # Chrome Webview
1691
  - regex: 'Version/.* Chrome(?:/(\d+[\.\d]+))?'
1692
  name: 'Chrome Webview'
@@ -1745,6 +1788,13 @@
1745
  - regex: '(?:Tizen|SLP) Browser(?:/(\d+[\.\d]+))?'
1746
  name: 'Tizen Browser'
1747
  version: '$1'
 
 
 
 
 
 
 
1748
 
1749
  #Palm Blazer
1750
  - regex: 'Blazer(?:/(\d+[\.\d]+))?'
@@ -2095,11 +2145,6 @@
2095
  name: 'Sunrise'
2096
  version: '$1'
2097
 
2098
- #SuperBird
2099
- - regex: 'SuperBird(?:/(\d+[\.\d]+))?'
2100
- name: 'SuperBird'
2101
- version: '$1'
2102
-
2103
  #Vision Mobile Browser
2104
  - regex: 'Vision-Browser(?:/(\d+[\.\d]+))'
2105
  name: 'Vision Mobile Browser'
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
8
+ # Arvin (https://play.google.com/store/apps/details?id=com.browser.arvin.anti.blokir&hl=sv&gl=US)
9
+ - regex: 'Arvin/(\d+[\.\d]+)'
10
+ name: 'Arvin'
11
+ version: '$1'
12
+ engine:
13
+ default: 'Blink'
14
+
15
+ # Edge Webview (https://docs.microsoft.com/en-us/microsoft-edge/webview2/)
16
+ - regex: 'Version/.+Chrome/.+EdgW/(\d+[\.\d]+)'
17
+ name: 'Edge WebView'
18
+ version: '$1'
19
+ engine:
20
+ default: 'WebKit'
21
+
22
+ # Mandarin (https://mandarin-browser.com/)
23
+ - regex: 'Mandarin Browser/(\d+[\.\d]+)'
24
+ name: 'Mandarin'
25
+ version: '$1'
26
+ engine:
27
+ default: 'Blink'
28
+
29
+ # Maelstrom (https://www.bittorrent.com/)
30
+ - regex: 'Torrent/(\d+[\.\d]+)'
31
+ name: 'Maelstrom'
32
+ version: '$1'
33
+ engine:
34
+ default: 'Blink'
35
+
36
  # Helio (https://developer.magicleap.com/en-us/learn/guides/lumin-os-release-notes-summary)
37
  - regex: 'Helio/(\d+[\.\d]+)'
38
  name: 'Helio'
1715
  engine:
1716
  default: 'WebKit'
1717
 
1718
+ - regex: 'OpenFin/(?:(\d+[\.\d]+))'
1719
+ name: 'OpenFin'
1720
+ version: '$1'
1721
+ engine:
1722
+ default: 'Blink'
1723
+
1724
+ # SuperBird
1725
+ - regex: 'SuperBird(?:/(\d+[\.\d]+))?'
1726
+ name: 'SuperBird'
1727
+ version: '$1'
1728
+ engine:
1729
+ default: 'WebKit'
1730
+ versions:
1731
+ 28: 'Blink'
1732
+
1733
  # Chrome Webview
1734
  - regex: 'Version/.* Chrome(?:/(\d+[\.\d]+))?'
1735
  name: 'Chrome Webview'
1788
  - regex: '(?:Tizen|SLP) Browser(?:/(\d+[\.\d]+))?'
1789
  name: 'Tizen Browser'
1790
  version: '$1'
1791
+ - regex: 'Tizen (?:\d+[\.\d]+).+ Version/(\d+[\.\d]+) (?:TV|Mobile)'
1792
+ name: 'Tizen Browser'
1793
+ version: '$1'
1794
+ engine:
1795
+ default: 'WebKit'
1796
+ versions:
1797
+ '4': 'Blink'
1798
 
1799
  #Palm Blazer
1800
  - regex: 'Blazer(?:/(\d+[\.\d]+))?'
2145
  name: 'Sunrise'
2146
  version: '$1'
2147
 
 
 
 
 
 
2148
  #Vision Mobile Browser
2149
  - regex: 'Vision-Browser(?:/(\d+[\.\d]+))'
2150
  name: 'Vision Mobile Browser'
app/vendor/matomo/device-detector/regexes/client/mobile_apps.yml CHANGED
@@ -90,6 +90,11 @@
90
  name: 'YouTube'
91
  version: '$1'
92
 
 
 
 
 
 
93
  # AFNetworking generic
94
  - regex: '([^/]+)/(\d+(?:\.\d+)+) \((?:iPhone|iPad); iOS [0-9\.]+; Scale/[0-9\.]+\)'
95
  name: '$1'
@@ -217,6 +222,11 @@
217
  name: 'Snapchat'
218
  version: '$1'
219
 
 
 
 
 
 
220
  # UnityPlayer
221
  - regex: 'UnityPlayer/([\d\.]+)'
222
  name: 'UnityPlayer'
@@ -245,7 +255,7 @@
245
  name: 'Siri'
246
  version: '1.0'
247
 
248
- - regex: 'LinkedIn/([\d\.]+)'
249
  name: 'LinkedIn'
250
  version: '$1'
251
 
@@ -451,7 +461,7 @@
451
  - regex: 'TuneIn Radio Pro(?:[^/]+)?/(\d+[\.\d]+)'
452
  name: 'TuneIn Radio Pro'
453
  version: '$1'
454
- - regex: 'TuneIn Radio(?:[^/]+)?/(\d+[\.\d]+)'
455
  name: 'TuneIn Radio'
456
  version: '$1'
457
 
@@ -537,3 +547,52 @@
537
  - regex: 'JaneStyle_iOS/(\d+[\.\d]+)'
538
  name: 'JaneStyle'
539
  version: '$1'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  name: 'YouTube'
91
  version: '$1'
92
 
93
+ # Netflix (https://play.google.com/store/apps/details?id=com.netflix.mediaclient)
94
+ - regex: 'com.netflix.mediaclient(?:/(\d+\.[\d\.]+))?'
95
+ name: 'Netflix'
96
+ version: '$1'
97
+
98
  # AFNetworking generic
99
  - regex: '([^/]+)/(\d+(?:\.\d+)+) \((?:iPhone|iPad); iOS [0-9\.]+; Scale/[0-9\.]+\)'
100
  name: '$1'
222
  name: 'Snapchat'
223
  version: '$1'
224
 
225
+ # Strimio (https://www.strimio.com/)
226
+ - regex: 'strimio(?:-desktop)/(\d+\.(?:[\.\d]+))?'
227
+ name: 'Strimio'
228
+ version: '$1'
229
+
230
  # UnityPlayer
231
  - regex: 'UnityPlayer/([\d\.]+)'
232
  name: 'UnityPlayer'
255
  name: 'Siri'
256
  version: '1.0'
257
 
258
+ - regex: 'LinkedIn(?:App)?(?:/([\d\.]+))?'
259
  name: 'LinkedIn'
260
  version: '$1'
261
 
461
  - regex: 'TuneIn Radio Pro(?:[^/]+)?/(\d+[\.\d]+)'
462
  name: 'TuneIn Radio Pro'
463
  version: '$1'
464
+ - regex: 'TuneIn(?: Radio(?:[^/]+)?)?/(\d+[\.\d]+)'
465
  name: 'TuneIn Radio'
466
  version: '$1'
467
 
547
  - regex: 'JaneStyle_iOS/(\d+[\.\d]+)'
548
  name: 'JaneStyle'
549
  version: '$1'
550
+
551
+ # Binance https://play.google.com/store/apps/details?id=com.binance.dev
552
+ - regex: 'BNC/.+\(Android (\d+[\.\d]+)\)'
553
+ name: 'Binance'
554
+ version: '$1'
555
+
556
+ # My World https://apps.apple.com/app/id598556821
557
+ - regex: 'ru\.mail\.my/(\d+[\.\d]+)'
558
+ name: 'My World'
559
+ version: '$1'
560
+
561
+ # Odnoklassniki https://play.google.com/store/apps/details?id=ru.ok.android https://apps.apple.com/app/id398465290
562
+ - regex: 'OK(?:Android|iOS)/([\d\.]+)'
563
+ name: 'Odnoklassniki'
564
+ version: '$1'
565
+
566
+ # YakYak https://github.com/yakyak/yakyak
567
+ - regex: 'yakyak/(\d+[\.\d]+)'
568
+ name: 'YakYak'
569
+ version: '$1'
570
+
571
+ # Microsoft Teams (https://www.microsoft.com/en/microsoft-teams/group-chat-software)
572
+ - regex: 'Teams/(\d+[\.\d]+)'
573
+ name: 'Teams'
574
+ version: '$1'
575
+
576
+ # Streamlabs OBS (https://streamlabs.com/)
577
+ - regex: 'StreamlabsOBS/(\d+[\.\d]+)'
578
+ name: 'Streamlabs OBS'
579
+ version: '$1'
580
+
581
+ # Blitz (https://blitz.gg/)
582
+ - regex: 'Blitz/([\d\.]+)'
583
+ name: 'Blitz'
584
+ version: '$1'
585
+
586
+ # OfferUp (https://play.google.com/store/apps/details?id=com.offerup)
587
+ - regex: 'OfferUp/([\d\.]+)'
588
+ name: 'OfferUp'
589
+ version: '$1'
590
+
591
+ # Vuhuv (https://play.google.com/store/apps/details?id=com.vuhuv)
592
+ - regex: 'Vuhuv/([\d\.]+)'
593
+ name: 'Vuhuv'
594
+ version: '$1'
595
+
596
+ - regex: '.+/(?:gfibertv|gftv200)-([\d]+)-'
597
+ name: 'Google Fiber TV'
598
+ version: '$1'
app/vendor/matomo/device-detector/regexes/client/pim.yml CHANGED
@@ -62,3 +62,38 @@
62
  - regex: 'BathyScaphe/'
63
  name: 'BathyScaphe'
64
  version: ''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  - regex: 'BathyScaphe/'
63
  name: 'BathyScaphe'
64
  version: ''
65
+
66
+ # Raindrop.io (https://raindrop.io/)
67
+ - regex: 'Raindrop.io/(\d+[\.\d]+)'
68
+ name: 'Raindrop.io'
69
+ version: '$1'
70
+
71
+ # Franz (https://meetfranz.com/)
72
+ - regex: 'Franz/(\d+[\.\d]+)'
73
+ name: 'Franz'
74
+ version: '$1'
75
+
76
+ # Mailspring (https://www.electronjs.org/apps/mailspring)
77
+ - regex: 'Mailspring/(\d+[\.\d]+)'
78
+ name: 'Mailspring'
79
+ version: '$1'
80
+
81
+ # Notion (https://www.notion.so/)
82
+ - regex: 'Notion/(\d+[\.\d]+)'
83
+ name: 'Notion'
84
+ version: '$1'
85
+
86
+ # Basecamp (https://basecamp.com/)
87
+ - regex: 'Basecamp[0-9]/?(\d+[\.\d]+)'
88
+ name: 'Basecamp'
89
+ version: '$1'
90
+
91
+ # Evernote (https://evernote.com/)
92
+ - regex: 'Evernote/?(\d+[\.\d]+)'
93
+ name: 'Evernote'
94
+ version: '$1'
95
+
96
+ # Rambox Pro (https://rambox.app/)
97
+ - regex: 'ramboxpro/(\d+\.[\.\d]+)?'
98
+ name: 'Rambox Pro'
99
+ version: '$1'
app/vendor/matomo/device-detector/regexes/device/car_browsers.yml CHANGED
@@ -23,10 +23,10 @@ MAC AUDIO:
23
  - regex: 'Spro'
24
  model: 'S Pro'
25
 
 
26
  Topway:
27
  regex: 'sp9853i_1h10_vmm'
28
  device: 'car browser'
29
  models:
30
  - regex: 'sp9853i_1h10_vmm'
31
  model: 'TS9'
32
-
23
  - regex: 'Spro'
24
  model: 'S Pro'
25
 
26
+ # Topway
27
  Topway:
28
  regex: 'sp9853i_1h10_vmm'
29
  device: 'car browser'
30
  models:
31
  - regex: 'sp9853i_1h10_vmm'
32
  model: 'TS9'
 
app/vendor/matomo/device-detector/regexes/device/mobiles.yml CHANGED
@@ -70,6 +70,8 @@ SFR:
70
  model: 'StarText' # ZTE
71
  - regex: 'StarNaute II(?:[);/ ]|$)'
72
  model: 'StarNaute 2' # ZTE
 
 
73
  - regex: 'StarNaute(?:[);/ ]|$)'
74
  model: 'StarNaute' # ZTE Amigo
75
  - regex: 'StarTab'
@@ -81,12 +83,16 @@ SFR:
81
 
82
  # HTC (htc.com)
83
  HTC:
84
- regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G(?:[);/ ]|$)|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|(?<!BLU LIFE )One ?[XELSV\+]+)(?:[);/ ]|$)|SPV E6[05]0|(One M8|One Mini 2|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PS64|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV3[12]|2PQ93|X2-HT|EXODUS 1|ISW13HT)(?:[);/ ]|$)'
85
  device: 'smartphone'
86
  models:
87
  # explicit smartphone models
88
  - regex: '2PZC5(?:[);/ ]|$)'
89
  model: 'U11'
 
 
 
 
90
  - regex: 'XV6975(?:[);/ ]|$)'
91
  model: 'Imagio'
92
  - regex: 'PG86100(?:[);/ ]|$)'
@@ -99,7 +105,7 @@ HTC:
99
  model: 'One'
100
  - regex: 'PJ83100(?:[);/ ]|$)'
101
  model: 'One X'
102
- - regex: 'One Mini 2(?:[);/ ]|$)'
103
  model: 'One Mini 2'
104
  - regex: 'X2-HT(?:[);/ ]|$)'
105
  model: 'One X2'
@@ -109,14 +115,26 @@ HTC:
109
  model: 'J One'
110
  - regex: 'HTL23(?:[);/ ]|$)'
111
  model: 'J Butterfly'
 
 
112
  - regex: '(?:0PJA2|0PJA10)(?:[);/ ]|$)'
113
  model: 'One M9'
 
 
 
 
 
 
 
 
114
  - regex: 'X525a(?:[);/ ]|$)'
115
  model: 'One X+'
116
  - regex: '2PQ93(?:[);/ ]|$)'
117
  model: 'One A9'
118
  - regex: 'ADR6300'
119
  model: 'Droid Incredible'
 
 
120
  - regex: 'ADR6400L'
121
  model: 'ThunderBolt'
122
  - regex: 'ADR6410LRA'
@@ -133,10 +151,26 @@ HTC:
133
  model: 'Desire 626S'
134
  - regex: '0PCV1(?:[);/ ]|$)'
135
  model: 'Desire 510'
 
 
136
  - regex: '608t(?:[);/ ]|$)'
137
  model: 'Desire 608t'
 
 
 
 
 
 
 
 
 
 
 
 
138
  - regex: 'EXODUS 1(?:[);/ ]|$)'
139
  model: 'Exodus 1'
 
 
140
 
141
  - regex: 'NexusHD2' # custom rom for hd2
142
  model: 'HD2'
@@ -149,9 +183,9 @@ HTC:
149
  - regex: 'HTC[ _\-]Flyer[ _\-]([\w]{1,5})'
150
  device: 'tablet'
151
  model: 'Flyer $1'
152
- - regex: 'HTC[ _\-]One[ _\-]max(?:[);/ ]|$)'
153
  device: 'phablet'
154
- model: 'One max'
155
  - regex: 'HTC[ _]([^/;]+) [0-9]+(?:\.[0-9]+)+ Build'
156
  model: '$1'
157
  - regex: 'HTC[ _]([^/;]+) Build'
@@ -177,10 +211,6 @@ HTC:
177
  model: '$1'
178
  - regex: '(ADR[a-z0-9]+)'
179
  model: '$1'
180
- - regex: '(One M8)'
181
- model: '$1'
182
- - regex: '0PAJ5(?:[);/ ]|$)'
183
- model: 'One E8'
184
  - regex: 'HTV32(?:[);/ ]|$)'
185
  model: '10'
186
  - regex: 'HTV31(?:[);/ ]|$)'
@@ -482,9 +512,9 @@ RIM:
482
  - regex: 'BlackBerry'
483
  model: 'BlackBerry'
484
 
485
- # CHIA
486
  CHIA:
487
- regex: '(SVEGLIO[ _][QH]1|TREO_TAB8G|GTA7WF)(?:[);/ ]|$)'
488
  device: 'smartphone'
489
  models:
490
  - regex: 'SVEGLIO[ _]([QH]1)'
@@ -494,7 +524,13 @@ CHIA:
494
  model: 'TREO TAB8G'
495
  - regex: 'GTA7WF'
496
  device: 'tablet'
497
- model: 'GTA7WF'
 
 
 
 
 
 
498
 
499
  # PALM
500
  Palm:
@@ -514,7 +550,7 @@ Palm:
514
 
515
  # HP or Hewlett-Packard
516
  HP:
517
- regex: 'Hewlett-Packard|HP/HP|HP EliteBook 820|TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP (?:Pro )?Slate|HP [78]|HP 10 Plus|Compaq [7|8]|HP; [^;/)]+'
518
  device: 'smartphone'
519
  models:
520
  - regex: 'HP Slate 6 Voice Tab'
@@ -554,6 +590,9 @@ HP:
554
  - regex: 'HP ProBook (6560b)'
555
  device: 'desktop'
556
  model: 'ProBook $1'
 
 
 
557
  - regex: 'HP EliteBook 820 G2'
558
  device: 'desktop'
559
  model: 'EliteBook 820 G2'
@@ -943,16 +982,16 @@ Apple:
943
  - regex: '(?:Apple-|.+_)?iPad6[C,_](?:11|12)'
944
  model: 'iPad 5 9.7'
945
  device: 'tablet'
946
- - regex: '(?:Apple-|.+_)?iPad7[C,_][12]'
947
  model: 'iPad Pro 2 12.9'
948
  device: 'tablet'
949
- - regex: '(?:Apple-|.+_)?iPad7[C,_][34]'
950
  model: 'iPad Pro 10.5'
951
  device: 'tablet'
952
- - regex: '(?:Apple-|.+_)?iPad7[C,_][56]'
953
  model: 'iPad 6 9.7'
954
  device: 'tablet'
955
- - regex: '(?:Apple-|.+_)?iPad7[C,_](?:11|12)'
956
  model: 'iPad 7 10.2'
957
  device: 'tablet'
958
  - regex: '(?:Apple-|.+_)?iPad8[C,_](?:9|10)'
@@ -1046,6 +1085,14 @@ MicroMax:
1046
  model: 'Infinity N11'
1047
  - regex: 'N8301'
1048
  model: 'Infinity N12'
 
 
 
 
 
 
 
 
1049
 
1050
  - regex: 'MicroMax(?:[ \-\_])?(X291|X246|X252|X458|X312)'
1051
  model: '$1'
@@ -1107,7 +1154,7 @@ Acteck:
1107
 
1108
  # Alba
1109
  Alba:
1110
- regex: 'Alba ?(?:57|4|10 TABLET|(?:7|10)(?:Nou|Pie))(?:[);/ ]|$)'
1111
  device: 'smartphone'
1112
  models:
1113
  - regex: 'Alba 57'
@@ -1117,7 +1164,7 @@ Alba:
1117
  - regex: '10 TABLET'
1118
  device: 'tablet'
1119
  model: '10 Tablet'
1120
- - regex: 'Alba((?:7|10)(?:Nou|Pie))'
1121
  device: 'tablet'
1122
  model: '$1'
1123
 
@@ -1420,11 +1467,15 @@ Advance:
1420
  - regex: 'Hollogram ([^;/)]+)(?: Build|[;)])'
1421
  model: 'Hollogram $1'
1422
 
1423
- # AGM
1424
  AGM:
1425
  regex: 'AGM ([^/;)]+)(?: Build|[;)])'
1426
  device: 'smartphone'
1427
- model: '$1'
 
 
 
 
1428
 
1429
  # Airness
1430
  Airness:
@@ -1491,7 +1542,7 @@ Arian Space:
1491
 
1492
  # Alcatel (alcatelmobile.com)
1493
  Alcatel:
1494
- regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|TIMXL|(?:(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034[ADEFGXTL]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|4087U|5001[ADJTU]|5002[ADFH]|5003[ADGU]|5006D|5007[AU]|5008[ADUYT]|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJF]|5025[DEG]|5026[ADJ]|5027B|5028[AYD]|5029[EYD]|5030[DE]|5032W|5033[AEFXDJGMOTXYQS]|5034D|5036D|5038[ADEX]|5039[DY]|5041[CD]|5042[ADEFGWXT]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYUI]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY]|5053[ADKY]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADJXYZIST]|5060[ADJ]|5061[KU]|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI]|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6042D|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060[SX]|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|7071[ADX]|8030Y|8050[DEGX]|8063|8088[XQM]|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9009G|9010X|9020A|9022X|9027[FTWX]|9029Z|9203A|A(?:464BG|570BL|50[13]DL|57[17]VL|574BL)|I213|I216X|(?<!\.)80(?:82|6[78])|A576CC)(?:_(?:EEA|RU))?|P360X)(?:[);/ ]|$)'
1495
  device: 'smartphone'
1496
  models:
1497
  - regex: '4087U'
@@ -1562,7 +1613,7 @@ Alcatel:
1562
  model: 'One Touch Astro'
1563
  - regex: '5027B'
1564
  model: 'One Touch Dawn'
1565
- - regex: '5024[ADF]|5028Y'
1566
  model: '1S'
1567
  - regex: '7071[ADX]'
1568
  model: 'A7 XL'
@@ -1699,7 +1750,7 @@ Alcatel:
1699
  - regex: '9203A'
1700
  model: 'A3 7" 3G'
1701
  device: 'tablet'
1702
- - regex: '9027[FTWX]'
1703
  model: '3T 8.0"'
1704
  device: 'tablet'
1705
  - regex: '9026X'
@@ -1740,7 +1791,7 @@ Alcatel:
1740
  - regex: '9024O'
1741
  model: 'One Touch Pixi 5'
1742
  device: 'tablet'
1743
- - regex: 'I216X'
1744
  model: 'One Touch Pixi 7'
1745
  device: 'tablet'
1746
  - regex: 'I213'
@@ -1868,6 +1919,9 @@ Alcatel:
1868
  - regex: '9029Z'
1869
  model: 'Joy Tab'
1870
  device: 'tablet'
 
 
 
1871
  - regex: 'Alcatel UP'
1872
  model: ''
1873
  - regex: '(?:ALCATEL_)?A383G'
@@ -2054,7 +2108,7 @@ Allview:
2054
 
2055
  # Allwinner
2056
  Allwinner:
2057
- regex: '(?:QUAD-CORE (?:A64 p3|A33 y3|T3 K2001M)|ZY-07B|UltraOcta-T8|OCTA-CORE T8)(?:[);/ ]|$)'
2058
  device: 'tablet'
2059
  models:
2060
  - regex: 'QUAD-CORE A64 p3'
@@ -2072,6 +2126,12 @@ Allwinner:
2072
  - regex: 'OCTA-CORE T8'
2073
  device: 'car browser'
2074
  model: 'OCTA-CORE T8'
 
 
 
 
 
 
2075
 
2076
  # altron
2077
  altron:
@@ -2200,9 +2260,7 @@ Archos:
2200
  - regex: 'Archos ((?:[789]|10)[0-9]?[a-z]* ?(?:G9|G10|Helium|Titanium|Cobalt|Platinum|Xenon|Carbon|Neon|XS|IT)[^/;]*) Build'
2201
  device: 'tablet'
2202
  model: '$1'
2203
- - regex: '(?:YL-)?Archos ([a-z0-9 ]+) Build'
2204
- model: '$1'
2205
- - regex: '(?:YL-)?Archos ([a-z0-9]+)'
2206
  model: '$1'
2207
 
2208
  # Axxion
@@ -2373,7 +2431,7 @@ Assistant:
2373
 
2374
  # Ark (Ark Electronic Technology)
2375
  Ark:
2376
- regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_[12](?:[);/ ]|$)'
2377
  device: 'smartphone'
2378
  models:
2379
  - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))'
@@ -2390,6 +2448,8 @@ Ark:
2390
  model: 'Wizard $1'
2391
  - regex: 'Elf_S8(?:[);/ ]|$)'
2392
  model: 'Elf S8'
 
 
2393
 
2394
  # Garmin-Asus
2395
  Garmin-Asus:
@@ -2405,7 +2465,7 @@ Garmin-Asus:
2405
 
2406
  # Asus
2407
  Asus:
2408
- regex: 'Asus|Transformer|ZenFone Max|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(5[02]0|620|55[2345])KL|ZD55[23]KL|ZS6(?:61|7[01])KS|ZS(6[0236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00[SV]D'
2409
  device: 'smartphone'
2410
  models:
2411
  # explicit tablet models
@@ -2421,7 +2481,7 @@ Asus:
2421
  - regex: 'ME302C(?:[);/ ]|$)'
2422
  model: 'MeMO Pad FHD 10'
2423
  device: 'tablet'
2424
- - regex: '(ME302KL|MeMo Pad FHD 10 LTE)(?:[);/ ]|$)'
2425
  model: 'MeMO Pad FHD 10 LTE'
2426
  device: 'tablet'
2427
  - regex: 'ME301T(?:[);/ ]|$)'
@@ -2433,7 +2493,7 @@ Asus:
2433
  - regex: 'X Pad 10 LTE(?:[);/ ]|$)'
2434
  model: 'X Pad 10 LTE'
2435
  device: 'tablet'
2436
- - regex: '(?:K01[3A]|K007|K00R)(?:[);/ ]|$)|MeMO Pad 7'
2437
  model: 'MeMO Pad 7'
2438
  device: 'tablet'
2439
  - regex: 'K01E(?:[);/ ]|$)'
@@ -2442,7 +2502,7 @@ Asus:
2442
  - regex: 'K00U|ME173X(?:[);/ ]|$)'
2443
  model: 'MeMO Pad HD 7'
2444
  device: 'tablet'
2445
- - regex: '(?:K011|K00L)(?:[);/ ]|$)'
2446
  model: 'MeMO Pad 8'
2447
  device: 'tablet'
2448
  - regex: 'K014(?:[);/ ]|$)'
@@ -2472,7 +2532,7 @@ Asus:
2472
  - regex: 'Slider SL101'
2473
  model: 'Eee Pad Slider SL101'
2474
  device: 'tablet'
2475
- - regex: 'P01[YZ]'
2476
  model: 'ZenPad C 7.0'
2477
  device: 'tablet'
2478
  - regex: 'P008 Build'
@@ -2490,9 +2550,12 @@ Asus:
2490
  - regex: '(?:P024|P00A)(?:[);/ ]|$)'
2491
  model: 'ZenPad 8.0'
2492
  device: 'tablet'
2493
- - regex: 'P01MA(?: Build|\))|P01M(?: Build|\))'
2494
  model: 'ZenPad S 8.0'
2495
  device: 'tablet'
 
 
 
2496
  - regex: 'P027'
2497
  model: 'ZenPad 3S 10'
2498
  device: 'tablet'
@@ -2516,7 +2579,7 @@ Asus:
2516
  - regex: 'K00G(?:[);/ ]|$)'
2517
  model: 'Fonepad Note 6'
2518
  device: 'phablet'
2519
- - regex: '(?:K012|K00E)(?:[);/ ]|$)'
2520
  model: 'Fonepad 7'
2521
  device: 'phablet'
2522
  - regex: 'K00Z(?:[);/ ]|$)'
@@ -2609,7 +2672,7 @@ Asus:
2609
  model: 'ZenFone 3 Max'
2610
  - regex: '(?:ASUS_)?(X008)'
2611
  model: 'ZenFone 3 Pegasus'
2612
- - regex: '(?:ASUS_)?(ZE553KL|Z01HD)'
2613
  model: 'ZenFone 3 Zoom'
2614
  - regex: '(?:ASUS_)?ZS550KL'
2615
  model: 'ZenFone 3 Deluxe'
@@ -2617,7 +2680,7 @@ Asus:
2617
  model: 'ZenFone Selfie'
2618
  - regex: '(?:ASUS_)?(Z016[DS]|Z01FD)'
2619
  model: 'ZenFone 3 Deluxe'
2620
- - regex: '(?:ASUS_)?(Z017DA|ZE520KL|ZE552KL|Z017D|Z012(D|S))'
2621
  model: 'ZenFone 3'
2622
  - regex: '(?:ASUS_)?Z01B[DS]|ZC551KL'
2623
  model: 'ZenFone 3 Laser'
@@ -2689,8 +2752,8 @@ AVH:
2689
  regex: 'Excer[ _]'
2690
  device: 'tablet'
2691
  models:
2692
- - regex: 'Excer[ _]G5.3'
2693
- model: 'Excer G5.3'
2694
  - regex: 'Excer[ _]G5'
2695
  model: 'Excer G5'
2696
  - regex: 'Excer[ _]10[ _]PRO'
@@ -2772,12 +2835,12 @@ Bitel:
2772
 
2773
  # Blu
2774
  Blu:
2775
- regex: 'BLU[ _]|(?:blu|Dash)[ _]([^/;)]+)(?: Build|[;)])|(?:Studio[ _](5.0K|5.5|View XL|Mega|C 8\+8|[CGM][ _]HD|[CGX]|SELFIE|Selfie LTE|Touch|M5 Plus|J[1258]|X8 HD)|Advance (4.0 ?[LM]|5.[02](?: HD)?|A4|L[45])|ENERGY (DIAMOND|XL)|Energy X 2|LIFE XL|B110DL|Dash (?:X[2L]|L3)|PURE (?:X[LR]|MINI)|Life One X2|G90(?: PRO)?|Grand M3|GRAND (?:5.5 HD|XL LTE)|R1 (?:HD|PLUS)|Tank Xtreme [45].0|Tank Xtreme Pro|Touchbook M7 Pro|DASH X PLUS|C[456] 2019|BOLD N1|B130DL|Vivo 5 Mini)(?:[);/ ]|$)'
2776
  device: 'smartphone'
2777
  models:
2778
  - regex: 'Advance (4.0 ?[LM]|4.0|5.[02](?: HD)?|A4|L[54])'
2779
  model: 'Advance $1'
2780
- - regex: '(?:BLU[_ ])?Studio[ _](5.0 C|5.5|View XL|Mega|C 8\+8|[CG][ _]HD|C|G|Touch|M HD|M5 Plus|J[1258]|X8 HD|X5|XL|X)(?:[);/ ]|$)'
2781
  model: 'Studio $1'
2782
  - regex: '(?:BLU[_ ])?Studio[ _]5.0 ?K(?:[);/ ]|$)'
2783
  model: 'Studio 5.0 K'
@@ -2859,6 +2922,8 @@ Blu:
2859
  model: 'Vivo Air LTE'
2860
  - regex: 'Touchbook G7'
2861
  model: 'Touchbook G7'
 
 
2862
  - regex: '(?:BLU[_ ])?VIVO[ _]SELFIE'
2863
  model: 'Vivo Selfie'
2864
  - regex: '(?:BLU[_ ])?Vivo 5 Mini'
@@ -2890,7 +2955,7 @@ Bluegood:
2890
 
2891
  # Blackview
2892
  Blackview:
2893
- regex: 'Blackview|(BV([24-9]000|[46]900|(5[1589]|9[15689])00|6[138]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))|A[86]0Plus|BL6000Pro'
2894
  device: 'smartphone'
2895
  models:
2896
  - regex: 'A60Pro\)'
@@ -2899,22 +2964,20 @@ Blackview:
2899
  model: 'A60'
2900
  - regex: 'A80Pro(?:[);/ ]|$)'
2901
  model: 'A80 Pro'
2902
- - regex: 'A([86]0)Plus(?:[);/ ]|$)'
2903
- model: 'A$1 Plus'
2904
  - regex: '(BV6000S)'
2905
  model: '$1'
2906
- - regex: '(BV9700|BL6000)Pro'
2907
  model: '$1 Pro'
2908
  - regex: 'Blackview (A[78]|E7S)'
2909
  model: '$1'
2910
  - regex: 'BV9000Pro-F'
2911
  model: 'BV9000 Pro F'
2912
- - regex: '(BV([48]000|9[56]00|6[83]00))Pro'
2913
- model: '$1 Pro'
2914
  - regex: '(BV6[13]00)(?:[);/ ]|$)'
2915
  model: '$1'
2916
  device: 'phablet'
2917
- - regex: '(BV([24-9]000|6900|4900|(5[1589]|9[15689])00)(?:[ _](?:PRO))?)'
2918
  model: '$1'
2919
  - regex: '(P10000(?:[ _](?:PRO))?)'
2920
  model: '$1'
@@ -2923,16 +2986,16 @@ Blackview:
2923
  - regex: '(Alife[ _][PS]1|DM550|Heatwave)'
2924
  model: '$1'
2925
 
2926
- # Bluboo
2927
  Bluboo:
2928
- regex: 'Bluboo|Xfire|Picasso 4G|Maya Build'
2929
  device: 'smartphone'
2930
  models:
2931
  - regex: 'Maya Build'
2932
  model: 'Maya'
2933
  - regex: 'Xfire2'
2934
  model: 'Xfire 2'
2935
- - regex: 'Picasso 4G'
2936
  model: 'Picasso 4G'
2937
  - regex: 'Xfire'
2938
  model: 'Xfire'
@@ -3038,17 +3101,17 @@ Brondi:
3038
 
3039
  # VGO TEL (vgotel.com)
3040
  VGO TEL:
3041
- regex: '(?:Venture V(?:[278]|12)|Ocean[_ ][689]|Ocean9L)(?:[);/ ]|$)'
3042
  device: 'smartphone'
3043
  models:
3044
- - regex: 'Venture V([278]|12)(?:[);/ ]|$)'
3045
  model: 'Venture V$1'
3046
  - regex: 'Ocean[_ ]?([689]|9L)(?:[);/ ]|$)'
3047
  model: 'Ocean $1'
3048
 
3049
  # Vivo (vivo.com.cn, vivo.com)
3050
  Vivo:
3051
- regex: '((?:VIV-|BBG-)?(?<!FBCR/)vivo(?!(?:Browser)))|(?:V1730(D[AT]|GA)|V18(18CA|01A0|13B[AT]|18T|09[AT]|1[346][AT]|[13]8[AT]|14A|24[B]?A|2[19][AT]|3[12][AT]|36[AT])|V1731CA|V1732[AT]|V1818CT|V19[01]1[AT]|V1932[AT]|V191[3469][AT]|V192[1348]A|V193[04]A|V194[15]A|V1938CT|V1955A|V1938T|V1730EA|V19[26]2A|V196[35]A|V198[16]A|V1936A[L]?|V19[59]0A|V200[125]A|1819|V201[12]A|V202[0345]C?A|V202[235-9]|V2054A|V203[026]|V204[03]|V2049A|X50 Pro\+|I1927)(?:[);/ ]|$)'
3052
  device: 'smartphone'
3053
  models:
3054
  - regex: 'V1824[B]?A(?:[);/ ]|$)'
@@ -3069,14 +3132,22 @@ Vivo:
3069
  model: 'iQOO Neo 3'
3070
  - regex: 'V1936A[L]?(?:[);/ ]|$)'
3071
  model: 'iQOO Neo 855'
 
 
3072
  - regex: 'V1986A(?:[);/ ]|$)'
3073
  model: 'iQOO Z1'
3074
  - regex: 'V2012A(?:[);/ ]|$)'
3075
  model: 'iQOO Z1x'
 
 
3076
  - regex: 'V1919A(?:[);/ ]|$)'
3077
  model: 'iQOO Z5x'
3078
  - regex: 'V2023A(?:[);/ ]|$)'
3079
  model: 'iQOO U1'
 
 
 
 
3080
  - regex: 'V2024A(?:[);/ ]|$)'
3081
  model: 'iQOO 5'
3082
  - regex: 'V2025A(?:[);/ ]|$)'
@@ -3085,6 +3156,8 @@ Vivo:
3085
  model: 'V20'
3086
  - regex: 'V2040(?:[);/ ]|$)'
3087
  model: 'V20 (2021)'
 
 
3088
  - regex: 'vivo 1805(?:[);/ ]|$)'
3089
  model: 'Nex'
3090
  - regex: 'V1923A(?:[);/ ]|$)'
@@ -3107,6 +3180,14 @@ Vivo:
3107
  model: 'S6 5G'
3108
  - regex: 'V2020C?A(?:[);/ ]|$)'
3109
  model: 'S7'
 
 
 
 
 
 
 
 
3110
  - regex: 'V1941A(?:[);/ ]|$)'
3111
  model: 'U3'
3112
  - regex: 'V1928A(?:[);/ ]|$)'
@@ -3119,8 +3200,12 @@ Vivo:
3119
  model: 'V15'
3120
  - regex: 'vivo 1818(?:[);/ ]|$)'
3121
  model: 'V15 Pro'
3122
- - regex: 'vivo 1909(?:[);/ ]|$)'
3123
  model: 'V17 Pro'
 
 
 
 
3124
  - regex: 'V2022(?:[);/ ]|$)'
3125
  model: 'V20 SE'
3126
  - regex: '(?:VIV-|BBG-)?vivo[ _]1601(?:[);/ ]|$)'
@@ -3139,12 +3224,18 @@ Vivo:
3139
  model: 'V9'
3140
  - regex: 'vivo 1727(?:[);/ ]|$)'
3141
  model: 'V9 Youth'
 
 
 
 
3142
  - regex: 'vivo 1721(?:[);/ ]|$)'
3143
  model: 'X20'
3144
  - regex: 'X20Plus(?:[);/ ]|$)'
3145
  model: 'X20 Plus'
3146
  - regex: 'vivo 1725(?:[);/ ]|$)'
3147
  model: 'X21'
 
 
3148
  - regex: 'V1814[AT](?:[);/ ]|$)'
3149
  model: 'X21S'
3150
  - regex: 'V1809[AT](?:[);/ ]|$)'
@@ -3165,18 +3256,30 @@ Vivo:
3165
  model: 'X50 Pro'
3166
  - regex: '(?:V2011A|X50 Pro\+)(?:[);/ ]|$)'
3167
  model: 'X50 Pro Plus'
 
 
 
 
 
 
3168
  - regex: 'X9Plus(?:[);/ ]|$)'
3169
  model: 'X9 Plus'
3170
  - regex: 'vivo 1902(?:[);/ ]|$)'
3171
  model: 'Y17'
 
 
3172
  - regex: 'vivo 1915(?:[);/ ]|$)'
3173
  model: 'Y19'
3174
  - regex: 'V202[79](?:[);/ ]|$)'
3175
  model: 'Y20'
3176
  - regex: 'V2028(?:[);/ ]|$)'
3177
  model: 'Y11s'
 
 
3178
  - regex: 'V2043(?:[);/ ]|$)'
3179
  model: 'Y20 (2021)'
 
 
3180
  - regex: 'V2032(?:[);/ ]|$)'
3181
  model: 'Y20i'
3182
  - regex: 'V2023(?:[);/ ]|$)'
@@ -3185,8 +3288,16 @@ Vivo:
3185
  model: 'Y3'
3186
  - regex: 'V1930A(?:[);/ ]|$)'
3187
  model: 'Y3 Standard'
 
 
 
 
 
 
3188
  - regex: 'V2036(?:[);/ ]|$)'
3189
  model: 'Y31'
 
 
3190
  - regex: 'V1934A(?:[);/ ]|$)'
3191
  model: 'Y5s'
3192
  - regex: 'V1965A(?:[);/ ]|$)'
@@ -3195,6 +3306,8 @@ Vivo:
3195
  model: 'Y51'
3196
  - regex: 'V2054A(?:[);/ ]|$)'
3197
  model: 'Y31s'
 
 
3198
  - regex: 'vivo 1606(?:[);/ ]|$)'
3199
  model: 'Y53i'
3200
  - regex: 'vivo 1603(?:[);/ ]|$)'
@@ -3207,12 +3320,16 @@ Vivo:
3207
  model: 'Y69'
3208
  - regex: 'V2002A(?:[);/ ]|$)'
3209
  model: 'Y70s'
 
 
3210
  - regex: 'vivo 1724(?:[);/ ]|$)'
3211
  model: 'Y71'
3212
  - regex: 'vivo 1801(?:[);/ ]|$)'
3213
  model: 'Y71i'
3214
  - regex: 'V1731CA(?:[);/ ]|$)'
3215
  model: 'Y73'
 
 
3216
  - regex: 'V1913[AT](?:[);/ ]|$)'
3217
  model: 'Y7s'
3218
  - regex: 'vivo 180([38]|8i)(?:[);/ ]|$)'
@@ -3225,6 +3342,8 @@ Vivo:
3225
  model: 'Y83 Pro'
3226
  - regex: 'V1730EA(?:[);/ ]|$)'
3227
  model: 'Y89'
 
 
3228
  - regex: 'vivo 181[17](?:[);/ ]|$)'
3229
  model: 'Y91'
3230
  - regex: 'V1945A(?:[);/ ]|$)'
@@ -3303,11 +3422,9 @@ Beeline:
3303
  - regex: 'Tab'
3304
  model: 'Tab'
3305
  device: 'tablet'
3306
- - regex: 'E700'
3307
- model: 'E700'
3308
- - regex: 'Smart2'
3309
- model: 'Smart 2'
3310
- - regex: 'Smart ([0-9])'
3311
  model: 'Smart $1'
3312
  - regex: 'Smart Dual'
3313
  model: 'Smart Dual'
@@ -3330,11 +3447,11 @@ BenQ-Siemens:
3330
 
3331
  # BenQ
3332
  BenQ:
3333
- regex: 'BENQ(?:[ \-])?([a-z0-9]+)|F52_09(?:[);/ ]|$)'
3334
  device: 'feature phone'
3335
  models:
3336
- - regex: 'F52_09(?:[);/ ]|$)'
3337
- model: 'F52'
3338
  - regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
3339
  model: '$1'
3340
 
@@ -3868,12 +3985,12 @@ Casio:
3868
 
3869
  # Casper
3870
  Casper:
3871
- regex: 'CASPER[_ ]|VIA[- _](T7D|A[34]|E3|F[123]|G4|M4|[LS]8|S7|P2|V8C|A1_Plus(?:_64)?|A1(?:_1)?|S[13]0|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G|S1[78])(?:[);/ ]|$)'
3872
  device: 'smartphone'
3873
  models:
3874
  - regex: '(?:CASPER[_ ])?VIA_A1_Plus(?:_64)?'
3875
  model: 'VIA A1 Plus'
3876
- - regex: '(?:CASPER[_ ])?VIA[_ ](G1_Plus|G1|E1|[AE]2|M[123]|V[35689]|V10|G3|V6X|A[34]|E3|F[123]|G4|M4|P2|S|V8C|A1(?:_1)?)(?:[);/ ]|$)'
3877
  model: 'VIA $1'
3878
  - regex: 'CASPER_VIA_E1c'
3879
  model: 'VIA E1C'
@@ -3924,14 +4041,27 @@ Carrefour:
3924
 
3925
  # Celkon
3926
  Celkon:
3927
- regex: 'Celkon|Millennia Hero'
3928
  device: 'smartphone'
3929
  models:
3930
  - regex: 'Celkon[ _*](C[78]20)'
3931
  model: '$1'
3932
  device: 'tablet'
 
 
 
3933
  - regex: 'Millennia Hero'
3934
  model: 'Millennia Hero'
 
 
 
 
 
 
 
 
 
 
3935
  - regex: 'Celkon[ _*](CT[^;/]+) Build'
3936
  model: '$1'
3937
  device: 'tablet'
@@ -3957,7 +4087,7 @@ Changhong:
3957
 
3958
  # Cherry Mobile (cherrymobile.com)
3959
  'Cherry Mobile':
3960
- regex: 'Cherry|Superion S1 DTV|Flare([ _])?(2X|4|A[123]|J[123568]|P[13]|S[4-8]|X2|Y[367]|S Play|HD|LITE|XL|X_V2|Y3s|Tab)(?:[ _](?:Pro|Plus|Max|LTE))?|Fusion Bolt|Omega[_ ](?:Icon 2|Icon Lite 2|lite[_ ][43][Cs]?|HD [45]|HD_Duo)|Spin Max 2|Selfie_Two'
3961
  device: 'smartphone'
3962
  models:
3963
  - regex: '(Flare2X)'
@@ -3986,8 +4116,10 @@ Changhong:
3986
  model: 'Flare X V2'
3987
  - regex: 'Flare[ _](A2|J3|P1|S[467])[ _]Lite'
3988
  model: 'Flare $1 Lite'
3989
- - regex: 'Flare[ _](J[12]|S[57]|Y3|J6)[ _]mini'
3990
  model: 'Flare $1 Mini'
 
 
3991
  - regex: 'Flare_J2_2018'
3992
  model: 'Flare J2 (2018)'
3993
  - regex: 'Flare S4 Max LTE'
@@ -3996,11 +4128,13 @@ Changhong:
3996
  model: 'Flare $1 Max'
3997
  - regex: 'FlareS5LiteDTV'
3998
  model: 'Flare S5 Lite DTV'
3999
- - regex: 'Flare[_ ](S[567]|J6)[_ ]Plus'
4000
- model: 'Flare $1 Plus'
 
 
4001
  - regex: 'FLARE S6 POWER'
4002
  model: 'Flare S6 Power'
4003
- - regex: 'Flare(?:[ _])?(4|A[123]|J8 LTE|J[13568]|P[13]|S[4-8]|X2|Y3s|Y7_LTE|Y[673])'
4004
  model: 'Flare $1'
4005
  - regex: 'OMEGA HD ([45])'
4006
  model: 'Omega HD $1'
@@ -4078,7 +4212,7 @@ Artel:
4078
 
4079
  # ComTrade Tesla
4080
  ComTrade Tesla:
4081
- regex: 'Tesla|Impulse 7.85 3G|Impulse 10.1 OCTA|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
4082
  device: 'smartphone'
4083
  models:
4084
  - regex: 'TeslaEvo5.0'
@@ -4271,7 +4405,7 @@ Condor:
4271
 
4272
  # Coolpad
4273
  Coolpad:
4274
- regex: '(?:YL-)?Coolpad|(?:Cool_9S|1824-S0|8190Q|1831-A0|8676-[AM]01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C105-E0|C106-[79]| C106|MTS-T0|cp3705A[S]?|ORL-C0|DLS-E0|8298-M02|5560S)(?:[);/ ]|$)|(8295|5860S) Build'
4275
  device: 'smartphone'
4276
  models:
4277
  - regex: 'VCR-[AI]0'
@@ -4297,6 +4431,8 @@ Coolpad:
4297
  model: 'Cool 1'
4298
  - regex: 'C105-E0(?:[);/ ]|$)'
4299
  model: 'Cool S1'
 
 
4300
  - regex: 'ORL-C0(?:[);/ ]|$)'
4301
  model: 'Cool 9'
4302
  - regex: 'Cool_9S(?:[);/ ]|$)'
@@ -4311,7 +4447,7 @@ Coolpad:
4311
  model: 'Note 3 Plus'
4312
  - regex: 'CP8298_I00(?:[);/ ]|$)'
4313
  model: 'Note 3 Lite'
4314
- - regex: '(8676-[AM]01|8298-M02)(?:[);/ ]|$)'
4315
  model: '$1'
4316
  - regex: '(?:YL-)?Coolpad[ _\-]?([^/;]+) Build'
4317
  model: '$1'
@@ -4345,11 +4481,15 @@ Cosmote:
4345
 
4346
  # Cricket
4347
  Cricket:
4348
- regex: 'Cricket-([a-z0-9]+)|U705AC(?:[);/ ]|$)'
4349
  device: 'smartphone'
4350
  models:
 
 
4351
  - regex: 'U705AC'
4352
  model: 'Ovation'
 
 
4353
  - regex: 'Cricket-([a-z0-9]+)'
4354
  device: 'feature phone'
4355
  model: '$1'
@@ -4380,7 +4520,7 @@ Crosscall:
4380
 
4381
  # AllDocube (alldocube.com)
4382
  AllDocube:
4383
- regex: '(?:T1001XS?|T1006S?|iPlay_[24]0|U1006H?)(?:[);/ ]|$)'
4384
  device: 'tablet'
4385
  models:
4386
  - regex: 'T1001XS(?:[);/ ]|$)'
@@ -4393,7 +4533,7 @@ AllDocube:
4393
  model: 'M5X'
4394
  - regex: 'U1006H?(?:[);/ ]|$)'
4395
  model: 'iPlay 10 Pro 10.1"'
4396
- - regex: 'iPlay_([24]0)(?:[);/ ]|$)'
4397
  model: 'iPlay $1'
4398
 
4399
  # Cube (short name Alldocube)
@@ -4427,7 +4567,7 @@ Cube:
4427
 
4428
  # CUBOT
4429
  CUBOT:
4430
- regex: 'CUBOT|RAINBOW 2|KING_KONG_3|ZORRO 001|KINGKONG[_ ]MINI2?|KING KONG CS|(?<!QUMO )QUEST(?!(?:[0-9]|\s[0-9]))(?: LITE)?|NOTE 20 PRO'
4431
  device: 'smartphone'
4432
  models:
4433
  - regex: 'CHEETAH 2'
@@ -4444,6 +4584,8 @@ CUBOT:
4444
  model: 'King Kong Mini'
4445
  - regex: 'KING_KONG_3'
4446
  model: 'King Kong 3'
 
 
4447
  - regex: 'KING KONG CS'
4448
  model: 'King Kong CS'
4449
  - regex: 'KING KONG'
@@ -4466,6 +4608,8 @@ CUBOT:
4466
  model: 'Note Plus'
4467
  - regex: 'NOTE 20 PRO'
4468
  model: 'Note 20 Pro'
 
 
4469
  - regex: 'CUBOT[_ ]NOTE[_ ]S'
4470
  model: 'Note S'
4471
  - regex: 'CUBOT_NOVA'
@@ -4561,7 +4705,7 @@ Datsun:
4561
 
4562
  # Danew
4563
  Danew:
4564
- regex: 'Dslide ?([^;/]+) Build|Konnect_?(?:402|50[246]|60[127])|GEODROID_A5'
4565
  device: 'smartphone'
4566
  models:
4567
  - regex: 'Konnect_?(402|50[246]|60[127])'
@@ -4572,6 +4716,9 @@ Danew:
4572
  - regex: 'GEODROID_A5'
4573
  device: 'tablet'
4574
  model: 'Geodroid A5'
 
 
 
4575
 
4576
  # Denver Electronics (denver-electronics.com)
4577
  Denver:
@@ -4593,10 +4740,10 @@ Dell:
4593
  models:
4594
  - regex: 'XCD35'
4595
  model: 'XCD35'
4596
- - regex: 'Venue (8 7840|10 7040|8 3830)'
4597
  model: 'Venue $1'
4598
  device: 'tablet'
4599
- - regex: '(?:Dell )?Venue Build'
4600
  model: 'Venue'
4601
  - regex: 'Dell; Venue Pro'
4602
  model: 'Venue Pro'
@@ -4631,12 +4778,12 @@ Desay:
4631
 
4632
  # DEXP
4633
  DEXP:
4634
- regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|Larus_TV1|Ixion(?:ML4.7|ES250)|M150Storm|(?:SENIOR|F4[38]D8000K|VA[12]10|VA170|ML450|MS[56]50|BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|AL[23]50|AS155|AS260|GS15[035]| (?:N280i|P380i|R110|BL160|B450|B340|A1[45]0|A340|AS160|GL[23]55|ES750))(?:[);/ ]|$)'
4635
  device: 'smartphone'
4636
  models:
4637
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
4638
  model: 'Ixion $1'
4639
- - regex: '(ML450|MS[56]50|ES750)(?:[);/ ]|$)'
4640
  model: 'Ixion $1'
4641
  - regex: 'IxionES250(?:[);/ ]|$)'
4642
  model: 'Ixion ES250 Rage'
@@ -4654,14 +4801,14 @@ DEXP:
4654
  model: '5.85" AS260'
4655
  device: 'phablet'
4656
 
4657
- - regex: 'Ursus ([^;/)]+)(?: Build|\))'
4658
  model: 'Ursus $1'
4659
  device: 'tablet'
4660
- - regex: '(VA[21]10|VA170|R110|N280i|P380i)(?:[);/ ]|$)'
4661
  model: 'Ursus $1'
4662
  device: 'tablet'
4663
 
4664
- - regex: ' (B450|B340|BL160|A340)(?:[);/ ]|$)'
4665
  model: '$1'
4666
  - regex: 'SENIOR(?:[);/ ]|$)'
4667
  model: 'Senior'
@@ -4673,7 +4820,7 @@ DEXP:
4673
  - regex: 'H135[ _]Build'
4674
  model: 'Atlas'
4675
  device: 'desktop'
4676
- - regex: '(BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|A1[45]0|GS15[035]|AS160|GL[23]55)(?:[);/ ]|$)'
4677
  model: '$1'
4678
  - regex: 'DEXP[ _]([^;/]+) Build'
4679
  model: '$1'
@@ -4730,7 +4877,7 @@ Digiland:
4730
 
4731
  # Digma
4732
  Digma:
4733
- regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI (?:7 E401 4G|8 E400 4G|ATL 4G|Kids|Octa [178]0|1902 3G|10 E402|Z530 3G)|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _][TC][ST](606[32]ML|111[46]ML|11[459]4MG|1117PG|1207MG|1210MG|1195MG|1196ML|3001ML|4024PG|5009PL|5021ML|5026PL|500[67]PG|7052PG|706[56]MG|709[68]PL|7097MG|720[48]MG|7140ML|7141MG|7113PL|7193MG|820[69]MG|7153MG|8139ML|8143MG|8152ML|1050PL|8205PG|7203MG|106[24]ML|1115MG)|HIT 4G|HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|(iDxD8 3G|iDxD10 3G|iDrQ10 3G|iDxD[45]|iDxQ5|iD[nx]D7(?:[_ ]3G)?)|PS604M|PT452E|LINX B510 3G LT5037MG|LINX A452 3G LT4030PG|LINX A453 3G LT4038PG|LINX A420 3G LS4019PG|LINX A450 3G LT4028PG|Linx A400 3G LT4001PG|Linx C500 3G LT5001PG|Linx PS474S|LS504[01]PL|LT40(47|54)MG|PS1043MG|LS405[01]MG|LS5053ML|LT5048MG|HT7071MG|LT5052ML|HT5035PG|HT4039PG|LT4049PG|NS6902QL|NS9797MG|TS7854M|TS1012E 3G|TT1004PG|TT702[045]MG|TT1002MG|TT7026MW|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
4734
  device: 'smartphone'
4735
  models:
4736
  - regex: 'HIT(?: 3G)? HT707[10]MG'
@@ -4846,6 +4993,10 @@ Digma:
4846
  - regex: 'Digma[_ ]([^;/]+) Build'
4847
  model: '$1'
4848
  device: 'tablet'
 
 
 
 
4849
 
4850
  # DoCoMo
4851
  DoCoMo:
@@ -4863,15 +5014,19 @@ DoCoMo:
4863
 
4864
  # Doogee
4865
  Doogee:
4866
- regex: 'DOOGEE[ _-]|Valencia2_Y100_?(?:pro|plus)|Y100_Plus|X5max(?:[_ ]PRO)?|Shoot_[12]|x5_doogee|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)|(?:BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Hitman_DG850|S(?:[568]8|9[056]|59|40)Pro|X95Pro|S40Lite|BL[579]000|N20Pro|(?<!Lenovo )S90C|Ibiza_F2)(?:[);/ ]|$)'
4867
  device: 'smartphone'
4868
  models:
4869
  - regex: '(?:Valencia2_)?Y100_Plus(?:[);/ ]|$)'
4870
  model: 'Valencia2 Y100 Plus'
4871
  - regex: 'Valencia2_Y100pro'
4872
  model: 'Valencia2 Y100 Pro'
 
 
4873
  - regex: 'LEO_(DG280)'
4874
  model: 'Leo $1'
 
 
4875
  - regex: '(BL[579]000|S90C)(?:[);/ ]|$)'
4876
  model: '$1'
4877
  - regex: 'X95Pro(?:[);/ ]|$)'
@@ -4962,14 +5117,17 @@ DNS:
4962
  - regex: 'DNS[ _\-]([^;/]+)(?: Build|[);])'
4963
  model: '$1'
4964
 
4965
- # E-Boda
4966
  E-Boda:
4967
- regex: 'E-Boda|Eclipse_(?:G400M|G500)'
4968
  device: 'smartphone'
4969
  models:
4970
  - regex: 'E-Boda ((?:Revo|Izzycomm|Essential|Intelligence|Supreme)[^/;]+) Build'
4971
  device: 'tablet'
4972
  model: '$1'
 
 
 
4973
  - regex: 'Eclipse_(G400M|G500)'
4974
  model: 'Eclipse $1'
4975
  - regex: 'E-Boda ([^/;]+) Build'
@@ -5028,11 +5186,13 @@ ECS:
5028
 
5029
  # EE
5030
  EE:
5031
- regex: 'Hawk_from_EE'
5032
  device: 'smartphone'
5033
  models:
5034
  - regex: 'Hawk_from_EE'
5035
  model: 'Hawk'
 
 
5036
 
5037
  # EKT
5038
  EKT:
@@ -5057,11 +5217,15 @@ Eks Mobility:
5057
 
5058
  # Elephone
5059
  Elephone:
5060
- regex: 'Elephone|P6000( ?Pro| ?Plus|\+| ?02| 5.0 01)?'
5061
  device: 'smartphone'
5062
  models:
5063
  - regex: 'Elephone Trunk(?:[);/ ]|$)'
5064
  model: 'Trunk'
 
 
 
 
5065
  - regex: 'P6000(\+| ?Plus)(?:[);/ ]|$)'
5066
  model: 'P6000 Plus'
5067
  - regex: 'P6000 02(?:[);/ ]|$)'
@@ -5191,7 +5355,7 @@ Senseit:
5191
 
5192
  # Sony & Sony Ericsson (combined as they are mixed up)
5193
  Sony:
5194
- regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[2346]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J3173|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|G2299|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|SO-[45]1A|SO-52A|XQ-A[DT]51|XQ-A[TU]42|XQ-AS[67]2|XQ-A[TSU]52|SOL25|SOG02|A002SO|NW-(A100|Z1000)Series|J3273'
5195
  device: 'smartphone'
5196
  models:
5197
  # SONY ERICSSON: explicit smartphone models
@@ -5333,6 +5497,8 @@ Sony:
5333
  model: 'Xperia Ace'
5334
  - regex: '(?:A001SO|XQ-A[TU]52|XQ-AU42|SO-41A|SOV43)(?:[);/ ]|$)'
5335
  model: 'Xperia 10 II'
 
 
5336
  - regex: '(?:Sony(?:Ericsson)?)?I(?:42[19]3|3223)'
5337
  model: 'Xperia 10 Plus'
5338
  - regex: '(?:Sony(?:Ericsson)?)?I4193'
@@ -5549,7 +5715,7 @@ Sony:
5549
  model: 'Xperia XA2 Ultra'
5550
  - regex: '(?:Sony(?:Ericsson)?)?G823[12]|SOV35|602SO|SO-03J'
5551
  model: 'Xperia XZs'
5552
- - regex: '(?:Sony(?:Ericsson)?)?G814[12]|SO-04[JK]'
5553
  model: 'Xperia XZ Premium'
5554
  - regex: '(?:Sony(?:Ericsson)?)?(?:H83[12]4|H82[17]6|SOV37|SO-03K|H8296|702SO)'
5555
  model: 'Xperia XZ2'
@@ -5583,7 +5749,7 @@ Sony:
5583
  model: 'Xperia X Performance Dual'
5584
 
5585
  # SONY: explicit tablet models
5586
- - regex: 'SGP(?:311|312|321)(?:[);/ ]|$)|SO-03E'
5587
  model: 'Xperia Tablet Z'
5588
  device: 'tablet'
5589
  - regex: 'SGP712(?:[);/ ]|$)'
@@ -5599,10 +5765,13 @@ Sony:
5599
  model: 'Xperia Tablet S'
5600
  device: 'tablet'
5601
 
5602
- # SONY: Bravia
5603
  - regex: '(?:BRAVIA )(2K GB ATV3|4K UR2|4K GB ATV3|4K GB|4K 2015|2015)(?:[);/ ]|$)'
5604
  model: 'Bravia $1'
5605
  device: 'tv'
 
 
 
5606
 
5607
  - regex: 'NW-A100Series'
5608
  model: 'Walkman A100'
@@ -5838,56 +6007,27 @@ Evolveo:
5838
  - regex: 'EVOLVEO[ _]([^;/]*) Build'
5839
  model: '$1'
5840
 
5841
- # Explay
5842
- Explay:
5843
- regex: 'Explay|[\w]+-EXPLAY-FIN|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-3]|RioPlay|Leader|Pulsar|Infinityll|Imperium[78]|Indigo|Lagoon'
5844
- device: 'tablet'
5845
  models:
5846
- - regex: 'ActiveD[ _]7.4[ _]3G'
5847
- model: 'ActiveD 7.4 3G'
5848
- - regex: 'Imperium([78])(?:[);/ ]|$)'
5849
- model: 'Imperium $1 3G'
5850
- - regex: 'ActiveD[ _]8.2[ _]3G'
5851
- model: 'ActiveD 8.2 3G'
5852
- - regex: 'CinemaTV[ _]3G'
5853
- model: 'CinemaTV 3G'
5854
- - regex: 'Infinityll'
5855
- model: 'Infinity II'
5856
- - regex: 'Informer[ _]([0-9]+(?:[ _]3G)?)'
5857
- model: 'Informer $1'
5858
- - regex: 'Surfer[ _]([0-9\.]+(?:[ _]3G)?)'
5859
- model: 'Surfer $1'
5860
- - regex: 'sQuad[ _]([0-9\.]+(?:[ _]3G)?)'
5861
- model: 'sQuad $1'
5862
- - regex: 'Onliner([1-3])'
5863
- model: 'Onliner $1'
5864
- - regex: 'Atlant(?:[);/ ]|$)'
5865
- device: 'smartphone'
5866
- model: 'Atlant'
5867
- - regex: 'Indigo(?:[);/ ]|$)'
5868
- device: 'smartphone'
5869
- model: 'Indigo'
5870
- - regex: 'Pulsar(?:[);/ ]|$)'
5871
- device: 'smartphone'
5872
- model: 'Pulsar'
5873
-
5874
- - regex: '[\w]+-EXPLAY-FIN'
5875
- device: 'feature phone'
5876
- model: 'Fin'
5877
-
5878
- - regex: 'Lagoon(?:[);/ ]|$)'
5879
- model: 'Lagoon'
5880
- - regex: 'Explay[ _-]([^;/]+)(?: Build|[;)])'
5881
- model: '$1'
5882
- - regex: 'RioPlay(?:[);/ ]|$)'
5883
- device: 'smartphone'
5884
- model: 'Rio Play'
5885
- - regex: 'Leader'
5886
- model: 'Leader'
5887
 
5888
  # EvroMedia
5889
  EvroMedia:
5890
- regex: 'EVROMEDIA|Playpad[ _]|PLAY_PAD_PRO_XL'
5891
  device: 'tablet'
5892
  models:
5893
  - regex: 'Playpad 3G GOO'
@@ -5900,6 +6040,8 @@ EvroMedia:
5900
  model: 'Play Pad Pro XL'
5901
  - regex: 'PlayPad 3GTab XL'
5902
  model: 'Play Pad 3G Tab XL'
 
 
5903
  # EKO
5904
  EKO:
5905
  regex: 'EKO'
@@ -6233,7 +6375,7 @@ Gigaset:
6233
 
6234
  # Ginzzu
6235
  Ginzzu:
6236
- regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S5002|(?<!Wave Pro )S5021|S5230|S50[45]0|S5120|RS(6[12]|9[45])D|S40[23]0|RS850[12]|RS9602)(?:[);/ ]|$)'
6237
  device: 'smartphone'
6238
  models:
6239
  - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST60[14]0|ST6120)'
@@ -6243,7 +6385,7 @@ Ginzzu:
6243
  device: 'tablet'
6244
  - regex: '(RS6[12]D) ULTIMATE'
6245
  model: '$1 Ultimate'
6246
- - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5002|S5021|S5230|S5120|S40[23]0|RS850[12]|RS9602|RS94D)(?:[);/ ]|$)'
6247
  model: '$1'
6248
 
6249
  # Gionee
@@ -6284,16 +6426,16 @@ Grape:
6284
  device: 'smartphone'
6285
  model: 'GTM-5$1'
6286
 
6287
- # Vizio
6288
  Vizio:
6289
- regex: 'Vizio|VAP430|VTAB1008'
6290
  device: 'tv'
6291
  models:
6292
  - regex: 'VAP430'
6293
  model: 'VAP430'
6294
- - regex: 'VTAB1008'
6295
  device: 'tablet'
6296
- model: 'VTAB1008'
6297
 
6298
  # GOCLEVER
6299
  GOCLEVER:
@@ -6312,8 +6454,16 @@ GOCLEVER:
6312
  - regex: 'TQ700N'
6313
  model: 'QUANTUM 700N'
6314
  device: 'tablet'
 
 
 
 
 
 
6315
  - regex: 'Quantum2 500'
6316
  model: 'Quantum 2 500'
 
 
6317
  - regex: '((?:QUANTUM|ARIES|INSIGNIA|ORION|ELIPSO)[ _-]?[^;/]+)(?: Build|\))'
6318
  model: '$1'
6319
  - regex: 'GOCLEVER[ _-]TAB[ _-]?([^;/]+) Build'
@@ -6345,6 +6495,58 @@ GoMobile:
6345
  - regex: 'GO([0-9]{3,4})'
6346
  model: 'Go$1'
6347
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6348
  # Gol Mobile (gol-mobile.com)
6349
  Gol Mobile:
6350
  regex: 'F10_PRIME'
@@ -6365,7 +6567,7 @@ Goly:
6365
 
6366
  # Google
6367
  Google:
6368
- regex: 'Nexus|GoogleTV|Glass(?<!Browser)|CrKey[^a-z0-9]|Pixel(?: Build|\))|Pixel (?:XL|C|[2-5]|[2-4] XL)|Google 2XL|G011A'
6369
  device: 'smartphone'
6370
  models:
6371
  - regex: 'Glass'
@@ -6380,12 +6582,17 @@ Google:
6380
  - regex: '(Nexus (?:7|9|10))'
6381
  device: 'tablet'
6382
  model: '$1'
 
 
 
 
6383
  - regex: 'CrKey[^a-z0-9]'
6384
  model: 'Chromecast'
6385
  device: 'tv'
6386
  - regex: 'GoogleTV'
6387
  device: 'tv'
6388
  model: 'GoogleTV'
 
6389
  - regex: 'Pixel(?: Build|\))'
6390
  model: 'Pixel'
6391
  - regex: 'Pixel XL'
@@ -6596,9 +6803,13 @@ Hisense:
6596
  device: 'tv'
6597
  model: '$1'
6598
 
6599
- - regex: '(?:HS-)?Hisense ([^;/]+) Build'
 
 
 
 
6600
  model: '$1'
6601
- - regex: 'Hisense ([^);/]+)'
6602
  model: '$1'
6603
 
6604
  # Hi-Level
@@ -6620,7 +6831,7 @@ Hoffmann:
6620
 
6621
  # Homtom
6622
  Homtom:
6623
- regex: 'Homtom|(?:HT[0-9]{1,2})(?: ?Pro)?(?:[);/ ]|$)'
6624
  device: 'smartphone'
6625
  models:
6626
  - regex: '(?:Homtom[_ ])?HT ?([0-9]{1,2}(?: ?Pro)?)(?:[);/ ]|$)'
@@ -6675,7 +6886,7 @@ Minix:
6675
 
6676
  # Huawei
6677
  Huawei:
6678
- regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANA|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|FRL|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JEF|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PPA|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-(?:[AT]N00|AN90|NX9A)|GLK-(?:[AT]L00|LX1U)|JER-[AT]N10|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL[02]0|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?|L28)|MED-(?:[AT]L00|LX9N?)|EBG-(?:AN[01]0|TN00)|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-AN00|JKM-AL00[ab]|TAH-(?:N29|AN00)m|C8817D|T1-821W|d-01[JK]|d-02[HK]|KRJ-W09|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|NOH-(?:NX9|AN00)|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-[LW]09|AGS3-[WL]09|DNN-LX9|NEY-NX9|LON-AL00|HLK-L41|503HW|AGR-[LW]09|PPA-LX[12]|ANG-AN00|NOP-AN00'
6679
  device: 'smartphone'
6680
  models:
6681
  - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
@@ -6740,7 +6951,7 @@ Huawei:
6740
  model: 'Enjoy 8e'
6741
  - regex: 'MRD-[TA]L00(?:[);/ ]|$)'
6742
  model: 'Enjoy 9e'
6743
- - regex: 'DVC-TN20(?:[);/ ]|$)'
6744
  model: 'Enjoy 20 Pro'
6745
  - regex: 'U8665(?:[);/ ]|$)'
6746
  model: 'Fusion 2'
@@ -6780,7 +6991,7 @@ Huawei:
6780
  model: 'Honor 20 Pro'
6781
  - regex: '(MAR-LX1H|YAL-AL50)(?:[);/ ]|$)'
6782
  model: 'Honor 20S'
6783
- - regex: '(?:BMH-AN[12]0|MXW-AN00)(?:[);/ ]|$)'
6784
  model: 'Honor 30'
6785
  - regex: 'EBG-[AT]N00(?:[);/ ]|$)'
6786
  model: 'Honor 30 Pro'
@@ -6790,6 +7001,8 @@ Huawei:
6790
  model: 'Honor 30S'
6791
  - regex: 'LRA-LX1(?:[);/ ]|$)'
6792
  model: 'Honor 30I'
 
 
6793
  - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?(?:[);/ ]|$)'
6794
  model: 'Honor 3C'
6795
  - regex: 'Hol-U19(?:[);/ ]|$)'
@@ -6900,7 +7113,7 @@ Huawei:
6900
  model: 'Honor P40'
6901
  - regex: 'COR-(?:AL[01]0|L29|TL10)(?:[);/ ]|$)'
6902
  model: 'Honor Play'
6903
- - regex: 'ASK-AL00x(?:[);/ ]|$)'
6904
  model: 'Honor Play 3'
6905
  - regex: 'KSA-AL10(?:[);/ ]|$)'
6906
  model: 'Honor Play 3E'
@@ -6920,6 +7133,8 @@ Huawei:
6920
  model: 'Honor V10'
6921
  - regex: 'PCT-[TA]L10(?:[);/ ]|$)'
6922
  model: 'Honor V20'
 
 
6923
  - regex: 'KNT-(?:AL[12]0|[TU]L10)(?:[);/ ]|$)'
6924
  model: 'Honor V8'
6925
  - regex: 'DUK-AL20(?:[);/ ]|$)'
@@ -6934,7 +7149,7 @@ Huawei:
6934
  model: 'Honor View 30'
6935
  - regex: 'OXF-AN10(?:[);/ ]|$)'
6936
  model: 'Honor View 30 Pro'
6937
- - regex: '(?:Honor_|HW-)?SCL-L(01|32)(?:_TD)?(?:[);/ ]|$)'
6938
  model: 'Honor Y6'
6939
  - regex: '(?:Honor_|HW-)?LYO-L21(?:[);/ ]|$)'
6940
  model: 'Honor Y6 II Compact'
@@ -6944,6 +7159,8 @@ Huawei:
6944
  model: 'Honor X10 Max'
6945
  - regex: 'DNN-LX9(?:[);/ ]|$)'
6946
  model: 'Honor X10 Lite'
 
 
6947
  - regex: 'U8500(?:[);/ ]|$)'
6948
  model: 'Ideos X2'
6949
  - regex: 'U8510(?:[);/ ]|$)'
@@ -7006,6 +7223,8 @@ Huawei:
7006
  model: 'Nova'
7007
  - regex: '608HW(?:[);/ ]|$)'
7008
  model: 'Nova Lite'
 
 
7009
  - regex: '(?:PIC-(?:[AT]L00|LX9)|HWV31)(?:[);/ ]|$)'
7010
  model: 'Nova 2'
7011
  - regex: '704HW(?:[);/ ]|$)'
@@ -7044,9 +7263,9 @@ Huawei:
7044
  model: 'Nova 6 SE'
7045
  - regex: 'JEF-(?:[AT]N00|AN20|NX9)(?:[);/ ]|$)'
7046
  model: 'Nova 7 5G'
7047
- - regex: 'JER-[AT]N10(?:[);/ ]|$)'
7048
  model: 'Nova 7 Pro 5G'
7049
- - regex: 'CDY-(?:[AT]N00|NX9B)(?:[);/ ]|$)'
7050
  model: 'Nova 7 SE 5G'
7051
  - regex: 'JNY-LX2(?:[);/ ]|$)'
7052
  model: 'Nova 7i'
@@ -7082,10 +7301,8 @@ Huawei:
7082
  model: 'P20 Pro'
7083
  - regex: '(ELE-L(?:04|09|29)|ELE-[AT]L00)(?:[);/ ]|$)'
7084
  model: 'P30'
7085
- - regex: '(?:MAR-(?:LX(?:1[BM]|2J?|3BM)|TL00)|NIC-LX1A|HWV33)(?:[);/ ]|$)'
7086
  model: 'P30 Lite'
7087
- - regex: 'MAR-LX[13]Am?(?:[);/ ]|$)'
7088
- model: 'P30 Lite Dual SIM'
7089
  - regex: '(?:VOG-(?:L(?:04|09|29)|TL00|AL10)|HW-02L)(?:[);/ ]|$)'
7090
  model: 'P30 Pro'
7091
  - regex: 'ANA-LX4(?:[);/ ]|$)'
@@ -7102,7 +7319,7 @@ Huawei:
7102
  model: 'P40 Pro Plus'
7103
  - regex: 'GRA-(?:L09|UL00)(?:[);/ ]|$)'
7104
  model: 'P8'
7105
- - regex: '(?:ALE-L(?:02|21|23)|ALE-UL00|ALE-TL00|503HW)(?:[);/ ]|$)'
7106
  model: 'P8 Lite (2015)'
7107
  - regex: '(?:PRA-L(?:A1|X2|X1|X3)|hi6210sft)(?:[);/ ]|$)'
7108
  model: 'P8 Lite (2017)'
@@ -7202,6 +7419,8 @@ Huawei:
7202
  model: 'Y9 Prime (2019)'
7203
  - regex: 'FRL-L2[23](?:[);/ ]|$)'
7204
  model: 'Y9a'
 
 
7205
 
7206
  - regex: 'HWT31(?:[);/ ]|$)'
7207
  model: 'Qua Tab 02 10.1"'
@@ -7278,7 +7497,7 @@ Huawei:
7278
  - regex: '(AGS2-AL00|JDN2-W09)HN(?:[);/ ]|$)'
7279
  device: 'tablet'
7280
  model: 'Honor Tab 5'
7281
- - regex: 'AGS2-(?:[LW]09|W19|L03)(?:[);/ ]|$)'
7282
  device: 'tablet'
7283
  model: 'MediaPad T5 10'
7284
  - regex: 'KOB2-[LW]09(?:[);/ ]|$)'
@@ -7484,7 +7703,7 @@ iRulu:
7484
 
7485
  # Irbis
7486
  Irbis:
7487
- regex: 'IRBIS|TZ(1(?:0[04]|42|5[01]|84|65|7[01345-89]|8[356]|9[12578])|49|55|72|22|7(?:1[124679]|2[021567]|37|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[147])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ85|TZ13|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
7488
  device: 'tablet'
7489
  models:
7490
  - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
@@ -7541,7 +7760,7 @@ iHunt:
7541
 
7542
  # IconBIT
7543
  IconBIT:
7544
- regex: 'IconBIT|NT-(3506M|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)|XDS[789]4K|Omnicast UHD|Movie Smart 4K|Movie IPTV Quad'
7545
  device: 'tablet'
7546
  models:
7547
  - regex: 'NT-3506M'
@@ -7579,7 +7798,15 @@ IconBIT:
7579
  model: 'NetTAB Matrix 3G duo'
7580
  - regex: 'NT-3703M'
7581
  model: 'NetTAB Matrix 3GT'
 
 
7582
 
 
 
 
 
 
 
7583
  - regex: '(?:iconBIT )?(Movie Smart 4K|Movie IPTV Quad|Movie Ultra HD 4K|XDS[789]4K|Omnicast UHD)'
7584
  model: '$1'
7585
  device: 'tv'
@@ -7659,7 +7886,7 @@ LYF:
7659
 
7660
  # Lumus
7661
  Lumus:
7662
- regex: 'LUMUS Shell|(?:NEO(SR620|SC600)|INNOSR545|Lumus[_ ]Ion)(?:[);/ ]|$)'
7663
  device: 'smartphone'
7664
  models:
7665
  # explicit smartphone models
@@ -7669,11 +7896,8 @@ Lumus:
7669
  model: 'INNO $1'
7670
  - regex: 'Lumus[_ ]Ion(?:[);/ ]|$)'
7671
  model: 'Ion'
7672
- # shell m-board
7673
- - regex: 'LUMUS Shell [0-9A-Z]+'
7674
- device: 'tv'
7675
- model: ''
7676
-
7677
  # M4tel
7678
  M4tel:
7679
  regex: 'M4 SS[0-9]{4}(?:-R)?|M4_B[23]'
@@ -7797,7 +8021,7 @@ iNew:
7797
 
7798
  # iPro
7799
  iPro:
7800
- regex: '(?:Kylin[ _]5.[05]S?|KYLIN40|Jade[78]s|Amber[67]S?|Amber5S_Pro|Phonenix50S|Zafiro)(?:[);/ ]|$)'
7801
  device: 'smartphone'
7802
  models:
7803
  - regex: 'Kylin_5.0S'
@@ -7818,6 +8042,8 @@ iPro:
7818
  model: 'Phonenix 50S'
7819
  - regex: 'Zafiro'
7820
  model: 'Zafiro'
 
 
7821
 
7822
  # Infinix
7823
  Infinix:
@@ -8074,6 +8300,20 @@ Intex:
8074
  models:
8075
  - regex: 'IM0318ND'
8076
  model: 'Aqua Lions 3'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8077
  - regex: 'Intex[ _]([^/;]*)[ _]Build'
8078
  model: '$1'
8079
  - regex: '(Cloud (?:Fame|Glory) 4G)'
@@ -8319,7 +8559,7 @@ Kaan:
8319
 
8320
  # Kazam
8321
  Kazam:
8322
- regex: 'Kazam|Trooper_X[0-9][0-9](?:[);/ ]|$)|Tornado 348|TROOPER 4\.0'
8323
  device: 'smartphone'
8324
  models:
8325
  - regex: 'Tornado 348'
@@ -8452,12 +8692,12 @@ Kogan:
8452
 
8453
  # Komu
8454
  Komu:
8455
- regex: 'Komu[ -]'
8456
  device: 'smartphone'
8457
  models:
8458
- - regex: 'Komu[ -]([^;/]+) Build'
8459
  model: '$1'
8460
- - regex: 'Komu[ -]([a-z0-9_-]+)'
8461
  model: '$1'
8462
 
8463
  # Koobee
@@ -8494,14 +8734,16 @@ KDDI:
8494
 
8495
  # Kodak
8496
  Kodak:
8497
- regex: 'KODAK|(?:IM5|Ektra|Smartway_T1)(?:[);/ ]|$)'
8498
  device: 'smartphone'
8499
  models:
8500
  - regex: 'IM5'
8501
  model: 'IM5'
 
 
8502
  - regex: 'Ektra(?:[);/ ]|$)'
8503
  model: 'Ektra'
8504
- - regex: '(?:KODAK[_ ])?SMARTWAY[_ ]([MTX]1)'
8505
  model: 'Smartway $1'
8506
  - regex: 'Tablet (7|10)'
8507
  device: 'tablet'
@@ -8551,7 +8793,7 @@ Diva:
8551
 
8552
  # kyocera (kyocera.co.jp, kyocera.com)
8553
  Kyocera:
8554
- regex: 'Kyocera|KWC-|QC-[0-9]{4}|(?:QC6035|NP501KC|302KC|503KC|602KC|705KC|901KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYT3[123]|KYF3[123579]|KYF40|KYX31|KYG01|KYY2[1-4]|S2151|KC-S701|S[468]-KC|KYV40U?|KYV4[1-8]|KYV4[47]|KC-S301AE|X3-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|[47]04KC|A001KC|WX10K|URBANO PROGRESSO|E7110)(?:[-_]u2?)?(?:[);/ ]|$)'
8555
  device: 'smartphone'
8556
  models:
8557
  # explicit smartphone models
@@ -8607,7 +8849,7 @@ Kyocera:
8607
  model: 'DuraForce'
8608
  - regex: 'E6810'
8609
  model: 'DuraForce Pro'
8610
- - regex: 'E6910'
8611
  model: 'DuraForce Pro 2'
8612
  - regex: 'E7110'
8613
  model: 'DuraForce Ultra 5G'
@@ -8639,6 +8881,8 @@ Kyocera:
8639
  model: 'Torque G03'
8640
  - regex: 'KYV46(?:[);/ ]|$)'
8641
  model: 'Torque G04'
 
 
8642
  - regex: 'KYV47(?:-u)?(?:[);/ ]|$)'
8643
  model: 'Basio 4'
8644
  - regex: 'KYV43(?:[);/ ]|$)'
@@ -8684,7 +8928,7 @@ Kyocera:
8684
  model: 'Brigadier'
8685
  - regex: 'E6782L(?:[);/ ]|$)'
8686
  model: 'DuraScout'
8687
- - regex: '(KC-S301AE)(?:[);/ ]|$)'
8688
  model: '$1'
8689
  - regex: 'A001KC(?:[);/ ]|$)'
8690
  model: 'Katan Sumaho 2'
@@ -8712,7 +8956,7 @@ Krüger&Matz:
8712
  model: 'MOVE 8 Mini'
8713
  - regex: 'MOVE_6_mini'
8714
  model: 'MOVE 6 Mini'
8715
- - regex: 'MOVE[_ ]([78]|6S)'
8716
  model: 'MOVE $1'
8717
  - regex: 'DRIVE 4 mini LTE'
8718
  model: 'DRIVE 4 mini LTE'
@@ -8773,7 +9017,7 @@ AIS:
8773
 
8774
  # Lava (Lavamobiles.com)
8775
  Lava:
8776
- regex: 'Lava[ _]|LAVAA1|(?:DISCOVER136|KKT QUADRA)|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Pixel V2|Z61_2GB|A97 IPS|A97 2GB PLUS|L[EH]9920(?:[_ ]P)?|L[NEH]9910|LH9810|Ivory(?:S1|S4G)?|A76Plus)(?:[);/ ]|$)'
8777
  device: 'smartphone'
8778
  models:
8779
  # explicit smartphone models
@@ -8785,6 +9029,8 @@ Lava:
8785
  model: 'A97 2GB Plus'
8786
  - regex: 'A76Plus(?:[);/ ]|$)'
8787
  model: 'A76 Plus'
 
 
8788
  - regex: 'Pixel ?V([12])(?:[);/ ]|$)'
8789
  model: 'Pixel V$1'
8790
  - regex: 'X1 Selfie(?:[);/ ]|$)'
@@ -8797,6 +9043,8 @@ Lava:
8797
  model: 'R1'
8798
  - regex: 'Z61_2GB(?:[);/ ]|$)'
8799
  model: 'Z61'
 
 
8800
  - regex: 'LE9920[ _]P(?:[);/ ]|$)'
8801
  model: 'V7'
8802
  - regex: 'LE9920(?:[);/ ]|$)'
@@ -8826,9 +9074,12 @@ Lava:
8826
  device: 'tablet'
8827
  model: 'Ivory $1'
8828
  # explicit general
8829
- - regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
8830
  model: 'Iris $1'
8831
- - regex: 'Lava[ _]?([^/;]+)(?:/| Build)'
 
 
 
8832
  model: '$1'
8833
 
8834
  # SKG (skgmobile.net | skgmobile.com)
@@ -8849,11 +9100,13 @@ Landvo:
8849
 
8850
  # Land Rover
8851
  Land Rover:
8852
- regex: 'Land[ ]?Rover[d]?[ _-](?:X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)|Polar3'
8853
  device: 'smartphone'
8854
  models:
8855
  - regex: 'Land[ ]?Rover[d]?[ _-](X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)'
8856
  model: '$1'
 
 
8857
  - regex: 'Polar3'
8858
  model: 'Ioutdoor Polar 3'
8859
 
@@ -8938,12 +9191,12 @@ LCT:
8938
 
8939
  # Leagoo
8940
  Leagoo:
8941
- regex: '(?:MY)?LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _](?:X|7s)|Elite [15]|Venture 1|Z10-E)(?:[);/ ]|$)'
8942
  device: 'smartphone'
8943
  models:
8944
  - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
8945
  model: 'M8 Pro'
8946
- - regex: 'LEAGOO[- _](Z[156]|M[58]|T1)(?:[);/ ]|$)'
8947
  model: '$1'
8948
  - regex: 'M5 EDGE'
8949
  model: 'M5 Edge'
@@ -8955,6 +9208,8 @@ Leagoo:
8955
  model: 'KICCAA Mix'
8956
  - regex: 'Elite ([15])(?:[);/ ]|$)'
8957
  model: 'Elite $1'
 
 
8958
  - regex: 'Venture 1(?:[);/ ]|$)'
8959
  model: 'Venture 1'
8960
  - regex: '(?:LEAGOO[- _])?(Z10-E|M6)(?:[);/ ]|$)'
@@ -8991,8 +9246,12 @@ LeEco:
8991
  model: '$1'
8992
  - regex: 'X900 Build'
8993
  model: 'Le X900'
 
 
8994
  - regex: '(?:Le ?X526|Le2[_ ]x527|Le 2|X52[67])(?:[);/ ]|$)'
8995
  model: 'Le 2'
 
 
8996
  - regex: 'Le ?X([^;/]+) Build'
8997
  model: 'Le X$1'
8998
  - regex: 'Le ?X([^) ;/]+)'
@@ -9006,21 +9265,6 @@ LeEco:
9006
  - regex: 'LeEco ([^;/]+) Build'
9007
  model: '$1'
9008
 
9009
- # Leotec
9010
- Leotec:
9011
- regex: 'LESPH501[14]|LESPH5003B|SUPERNOVA (Qi16|Qi32|i3G96[X]?)'
9012
- device: 'smartphone'
9013
- models:
9014
- - regex: 'LESPH5011'
9015
- model: 'Argon e250'
9016
- - regex: 'LESPH5003B'
9017
- model: 'Argon A250B'
9018
- - regex: 'LESPH5014'
9019
- model: 'Krypton K150'
9020
- - regex: 'SUPERNOVA (Qi16|Qi32|i3G96[X]?)'
9021
- device: 'tablet'
9022
- model: 'Supernova $1'
9023
-
9024
  # Lephone
9025
  Lephone:
9026
  regex: 'lephone[ _]|lephoneP1'
@@ -9040,6 +9284,14 @@ Lenco:
9040
  device: 'tablet'
9041
  model: '$1'
9042
 
 
 
 
 
 
 
 
 
9043
  # lenovo (lenovo.com)
9044
  Lenovo:
9045
  regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:X103F|8504F|X304F|X704V|X704A)|A5500-H|A2107A-H|A3500-HV|A2109A|S6000|Z2 Plus|Vibe[ _](?:P1|S6i Plus|S[23567]i|C|[ZX]2|K5(?: Plus)?|V7)|P2A42|L38011|L18011|[5-8]01LV|[67]02LV|Z2131|K350t|K31-t3|TAB 2 A8-50LC|S90-A|P70-A|VR-1541F)(?:[);/ ]|$)'
@@ -9147,6 +9399,9 @@ Lenovo:
9147
  - regex: 'TB-X606[FXV](?:[);/ ]|$)'
9148
  model: 'Tab M10 FHD Plus'
9149
  device: 'tablet'
 
 
 
9150
  - regex: 'Lenovo ?B8000(-[FH])?'
9151
  model: 'Yoga Tablet 10'
9152
  device: 'tablet'
@@ -9174,6 +9429,9 @@ Lenovo:
9174
  - regex: 'YT-X703L'
9175
  model: 'Yoga Tab 3 Plus'
9176
  device: 'tablet'
 
 
 
9177
 
9178
  - regex: 'S6000(?:[);/ ]|$)'
9179
  model: 'IdeaTab S6000'
@@ -9217,6 +9475,12 @@ Lenovo:
9217
  - regex: 'IdeaTab[ \-_]?([a-z0-9]+)'
9218
  model: 'IdeaTab $1'
9219
  device: 'tablet'
 
 
 
 
 
 
9220
  - regex: 'Yoga Tablet([^;/]+) Build'
9221
  model: 'Yoga Tablet$1'
9222
  device: 'tablet'
@@ -9246,7 +9510,7 @@ Lenovo:
9246
  model: 'ZUK $1'
9247
  - regex: 'K10a40(?:[);/ ]|$)'
9248
  model: 'C2'
9249
- - regex: 'k50a40(?:[);/ ]|$)'
9250
  model: 'K3 Note'
9251
  - regex: 'A7010a48(?:[);/ ]|$)'
9252
  model: 'K4 Note'
@@ -9254,7 +9518,7 @@ Lenovo:
9254
  model: 'K5'
9255
  - regex: 'L38011(?:[);/ ]|$)'
9256
  model: 'K5 Play'
9257
- - regex: 'A7020a4[08](?:[);/ ]|$)'
9258
  model: 'K5 Note'
9259
  - regex: 'K31-t3(?:[);/ ]|$)'
9260
  model: 'K31'
@@ -9298,11 +9562,15 @@ Lenovo:
9298
  model: 'Vibe S1'
9299
  - regex: 'L78071(?:[);/ ]|$)'
9300
  model: 'Z5s'
 
 
 
 
9301
  - regex: 'L58041(?:[);/ ]|$)'
9302
  model: 'S5 Pro'
9303
  - regex: 'L18021(?:[);/ ]|$)'
9304
  model: 'A3'
9305
- - regex: 'PB2-670M(?:[);/ ]|$)'
9306
  model: 'Phab 2'
9307
  - regex: '(S90-A|P70-A)(?:[);/ ]|$)'
9308
  model: '$1'
@@ -9425,15 +9693,25 @@ Lexibook:
9425
 
9426
  # LG
9427
  LG:
9428
- regex: 'LG|Web0S; Linux/SmartTV|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|VS820|VS870 4G|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05[DE]|L-03K|L-01[LJK]|L-52A|L-[45]1A|901LG|A001LG|80[12]LG|402LG|LGT32|L-02K|L-01F|LM-V40|DM-01K|LMX130IM'
9429
  device: 'smartphone'
9430
  models:
9431
- - regex: 'DM-01K'
9432
- model: 'Disney Mobile DM-01K'
9433
- - regex: 'LG-D325'
9434
  model: 'L70'
 
 
 
 
 
 
9435
  - regex: 'LG-D340F8'
9436
  model: 'L70 Tri'
 
 
 
 
9437
  - regex: 'LM-X210APM'
9438
  model: 'Phoenix 4'
9439
  - regex: 'LG-P505R'
@@ -9442,15 +9720,21 @@ LG:
9442
  model: 'Zone 4'
9443
  - regex: 'LM-X220PM'
9444
  model: 'Tribute Empire'
9445
- - regex: 'VS980|L-01F'
 
 
9446
  model: 'G2'
9447
  - regex: 'LG-D6(?:18|20)'
9448
  model: 'G2 Mini'
9449
- - regex: 'LG-D85[01258]|VS985'
9450
  model: 'G3'
9451
- - regex: 'LG-D72[2458]'
9452
  model: 'G3 Beat'
9453
- - regex: 'LG-H81[158]'
 
 
 
 
9454
  model: 'G4'
9455
  - regex: 'LG-H525n?'
9456
  model: 'G4c'
@@ -9460,16 +9744,20 @@ LG:
9460
  model: 'G4s'
9461
  - regex: 'LG-H735'
9462
  model: 'G4 Beat'
9463
- - regex: 'LG-H8(?:20|3[01]|5[08]|6[08])|VS987|RS988'
9464
  model: 'G5'
9465
  - regex: 'LG-H84[05]'
9466
  model: 'G5 SE'
9467
- - regex: 'VS988|LG-H87(?:0DS|3)'
9468
  model: 'G6'
9469
  - regex: 'LM-Q850'
9470
  model: 'G7 Fit'
9471
  - regex: 'LM-Q910'
9472
  model: 'G7 One'
 
 
 
 
9473
  - regex: 'LM-G820(N|QM[0127]|UMB)?'
9474
  model: 'G8'
9475
  - regex: 'LM-G850'
@@ -9478,16 +9766,26 @@ LG:
9478
  model: 'G8S ThinQ'
9479
  - regex: '901LG(?:[);/ ]|$)'
9480
  model: 'G8X ThinQ'
 
 
9481
  - regex: 'VS501|LM-X120'
9482
  model: 'K20'
9483
- - regex: '(?:LG-)?H502'
9484
  model: 'Magna'
 
 
 
 
 
 
9485
  - regex: '(?:LG-)?H343'
9486
  model: 'Risio'
9487
  - regex: '(?:LG-)?H650'
9488
  model: 'Zero'
9489
  - regex: '(?:LG-)?M154'
9490
  model: 'Risio 2'
 
 
9491
  - regex: '(?:LG-)?P500H'
9492
  model: 'Optimus One'
9493
  - regex: '(L-05[DE])(?:[);/ ]|$)'
@@ -9502,21 +9800,25 @@ LG:
9502
  model: 'PRADA phone L-02D'
9503
  - regex: 'L-07C'
9504
  model: 'Optimus Bright L-07C'
9505
- - regex: '(?:LG-)?F800(?:S|K|L)?'
9506
  model: 'V20'
9507
  - regex: 'LM-Q710(?:\(FGN\)|[\.]?FGN)'
9508
  model: 'Q Stylus Plus'
9509
  - regex: '801LG'
9510
  model: 'Q Stylus'
 
 
 
 
9511
  - regex: 'LM-Q[67]10\.FG(?:[);/ ]|$)'
9512
  model: 'Q7'
9513
  - regex: 'LM-(Q725[KL]|Q610.FGN)(?:[);/ ]|$)'
9514
  model: 'Q7+'
9515
  - regex: 'LM-Q815[SL](?:[);/ ]|$)'
9516
  model: 'Q8+'
9517
- - regex: 'LM-Q925L(?:[);/ ]|$)'
9518
  model: 'Q9'
9519
- - regex: 'LM-Q730N(?:[);/ ]|$)'
9520
  model: 'Q70'
9521
  - regex: 'LGV33(?:[);/ ]|$)'
9522
  model: 'Qua Phone PX'
@@ -9526,28 +9828,48 @@ LG:
9526
  model: 'Style 2'
9527
  - regex: 'VS835(?:[);/ ]|$)'
9528
  model: 'Stylo 2 V'
 
 
9529
  - regex: 'L-41A(?:[);/ ]|$)'
9530
  model: 'Style 3'
9531
- - regex: 'LM-Q710|LML713DL'
 
 
 
 
 
 
9532
  model: 'Stylo 4'
9533
  - regex: '(?:LM-Q720|LGL722DL)(?:[);/ ]|$)'
9534
  model: 'Stylo 5'
9535
  - regex: 'LM-Q730(?:[);/ ]|$)'
9536
  model: 'Stylo 6'
9537
- - regex: 'LM-G710(N|VM)?'
9538
  model: 'G7 ThinQ'
9539
  - regex: 'LM-X210CM'
9540
  model: 'Fortune 2'
9541
- - regex: 'LM-X410\.F(?:[);/ ]|$)'
9542
  model: 'Premier Pro'
 
 
9543
  - regex: 'LML41[34]DL(?:[);/ ]|$)'
9544
  model: 'Premier Pro LTE'
9545
  - regex: 'LM-X525'
9546
  model: 'Q60'
 
 
9547
  - regex: 'LM-X210K'
9548
  model: 'X2'
9549
  - regex: 'LG-K580'
9550
  model: 'X Cam'
 
 
 
 
 
 
 
 
9551
  - regex: 'LM-X510WM'
9552
  model: 'X Power 3'
9553
  - regex: 'LM-X(?:41[05]K|410S)'
@@ -9556,20 +9878,34 @@ LG:
9556
  model: 'X4+'
9557
  - regex: 'LM-X410(?:\.FN|\(FG\))'
9558
  model: 'K11'
9559
- - regex: 'LM-X(?:320|410[UP]M)'
9560
  model: 'K30'
9561
  - regex: 'LMX130IM'
9562
  model: 'W10'
 
 
 
 
 
 
9563
  - regex: 'LM-X410'
9564
  model: 'LM-X410'
 
 
9565
  - regex: 'LM-X420N'
9566
  model: 'X4 (2019)'
9567
- - regex: 'LG-X230'
70
  model: 'StarText' # ZTE
71
  - regex: 'StarNaute II(?:[);/ ]|$)'
72
  model: 'StarNaute 2' # ZTE
73
+ - regex: 'STARNAUTE ?4(?:[);/ ]|$)'
74
+ model: 'StarNaute 4'
75
  - regex: 'StarNaute(?:[);/ ]|$)'
76
  model: 'StarNaute' # ZTE Amigo
77
  - regex: 'StarTab'
83
 
84
  # HTC (htc.com)
85
  HTC:
86
+ regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G(?:[);/ ]|$)|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|(?<!BLU LIFE |ZOPO )One ?[XELSV\+]+)(?:[);/ ]|$)|SPV E6[05]0|(One M8|One Mini 2|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PS64|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV3[12]|2PQ93|X2-HT|EXODUS 1|ISW13HT)(?:[);/ ]|$)'
87
  device: 'smartphone'
88
  models:
89
  # explicit smartphone models
90
  - regex: '2PZC5(?:[);/ ]|$)'
91
  model: 'U11'
92
+ - regex: 'U11 plus(?:[);/ ]|$)'
93
+ model: 'U11 Plus'
94
+ - regex: 'U11 life(?:[);/ ]|$)'
95
+ model: 'U11 Life'
96
  - regex: 'XV6975(?:[);/ ]|$)'
97
  model: 'Imagio'
98
  - regex: 'PG86100(?:[);/ ]|$)'
105
  model: 'One'
106
  - regex: 'PJ83100(?:[);/ ]|$)'
107
  model: 'One X'
108
+ - regex: '(?:HTC)?One ?Mini ?2(?:[);/ ]|$)'
109
  model: 'One Mini 2'
110
  - regex: 'X2-HT(?:[);/ ]|$)'
111
  model: 'One X2'
115
  model: 'J One'
116
  - regex: 'HTL23(?:[);/ ]|$)'
117
  model: 'J Butterfly'
118
+ - regex: 'HTCButterflys901s(?:[);/ ]|$)'
119
+ model: 'Butterfly S'
120
  - regex: '(?:0PJA2|0PJA10)(?:[);/ ]|$)'
121
  model: 'One M9'
122
+ - regex: 'HTC(?:6500LVW|PN071)(?:[);/ ]|$)'
123
+ model: 'One M7'
124
+ - regex: '(?:One M8|HTC6525LVW)(?:[);/ ]|$)'
125
+ model: 'One M8'
126
+ - regex: '0PAJ5(?:[);/ ]|$)'
127
+ model: 'One E8'
128
+ - regex: 'HTC6515LVW(?:[);/ ]|$)'
129
+ model: 'One Remix'
130
  - regex: 'X525a(?:[);/ ]|$)'
131
  model: 'One X+'
132
  - regex: '2PQ93(?:[);/ ]|$)'
133
  model: 'One A9'
134
  - regex: 'ADR6300'
135
  model: 'Droid Incredible'
136
+ - regex: 'HTC6435LVW'
137
+ model: 'Droid DNA'
138
  - regex: 'ADR6400L'
139
  model: 'ThunderBolt'
140
  - regex: 'ADR6410LRA'
151
  model: 'Desire 626S'
152
  - regex: '0PCV1(?:[);/ ]|$)'
153
  model: 'Desire 510'
154
+ - regex: 'HTC[_ ]D310n(?:[);/ ]|$)'
155
+ model: 'Desire 310'
156
  - regex: '608t(?:[);/ ]|$)'
157
  model: 'Desire 608t'
158
+ - regex: 'HTC_(?:0P9O2|D610x)(?:[);/ ]|$)'
159
+ model: 'Desire 610'
160
+ - regex: 'HTC[_ ]?(0P4E[12])(?:[);/ ]|$)'
161
+ model: 'Desire 601'
162
+ - regex: 'HTC_?D620h(?:[);/ ]|$)'
163
+ model: 'Desire 620'
164
+ - regex: 'HTC_D626ph(?:[);/ ]|$)'
165
+ model: 'Desire 626'
166
+ - regex: 'HTC_?(?:0P9C2|D816[xd]?)(?:[);/ ]|$)'
167
+ model: 'Desire 816'
168
+ - regex: 'HTC_?D526h(?:[);/ ]|$)'
169
+ model: 'Desire 526'
170
  - regex: 'EXODUS 1(?:[);/ ]|$)'
171
  model: 'Exodus 1'
172
+ - regex: 'HTC 2Q7A100(?:[);/ ]|$)'
173
+ model: 'U19e'
174
 
175
  - regex: 'NexusHD2' # custom rom for hd2
176
  model: 'HD2'
183
  - regex: 'HTC[ _\-]Flyer[ _\-]([\w]{1,5})'
184
  device: 'tablet'
185
  model: 'Flyer $1'
186
+ - regex: 'HTC(?:[ _\-])?(?:One[ _\-]max|6600LVW)(?:[);/ ]|$)'
187
  device: 'phablet'
188
+ model: 'One Max'
189
  - regex: 'HTC[ _]([^/;]+) [0-9]+(?:\.[0-9]+)+ Build'
190
  model: '$1'
191
  - regex: 'HTC[ _]([^/;]+) Build'
211
  model: '$1'
212
  - regex: '(ADR[a-z0-9]+)'
213
  model: '$1'
 
 
 
 
214
  - regex: 'HTV32(?:[);/ ]|$)'
215
  model: '10'
216
  - regex: 'HTV31(?:[);/ ]|$)'
512
  - regex: 'BlackBerry'
513
  model: 'BlackBerry'
514
 
515
+ # CHIA (www.ghia.com.mx)
516
  CHIA:
517
+ regex: '(SVEGLIO[ _][QH]1|TREO_TAB8G|GTA7WF|GTKIDS7[BVR]|VENUS7)(?:[);/ ]|$)'
518
  device: 'smartphone'
519
  models:
520
  - regex: 'SVEGLIO[ _]([QH]1)'
524
  model: 'TREO TAB8G'
525
  - regex: 'GTA7WF'
526
  device: 'tablet'
527
+ model: 'A7 ROJA'
528
+ - regex: 'GTKIDS7[BVR]'
529
+ device: 'tablet'
530
+ model: 'GT KIDS 7'
531
+ - regex: 'VENUS7'
532
+ device: 'tablet'
533
+ model: 'VENUS 7'
534
 
535
  # PALM
536
  Palm:
550
 
551
  # HP or Hewlett-Packard
552
  HP:
553
+ regex: 'Hewlett-Packard|HP/HP|HP Chromebook|HP EliteBook 820|TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP (?:Pro )?Slate|HP [78]|HP 10 Plus|Compaq [7|8]|HP; [^;/)]+'
554
  device: 'smartphone'
555
  models:
556
  - regex: 'HP Slate 6 Voice Tab'
590
  - regex: 'HP ProBook (6560b)'
591
  device: 'desktop'
592
  model: 'ProBook $1'
593
+ - regex: 'Chromebook (11 G5|x360 11 G1 EE|13 G1)'
594
+ device: 'desktop'
595
+ model: 'Chromebook $1'
596
  - regex: 'HP EliteBook 820 G2'
597
  device: 'desktop'
598
  model: 'EliteBook 820 G2'
982
  - regex: '(?:Apple-|.+_)?iPad6[C,_](?:11|12)'
983
  model: 'iPad 5 9.7'
984
  device: 'tablet'
985
+ - regex: '(?:Apple-|.+_)?iPad7[C,_][12](?:[);/ ]|$)'
986
  model: 'iPad Pro 2 12.9'
987
  device: 'tablet'
988
+ - regex: '(?:Apple-|.+_)?iPad7[C,_][34](?:[);/ ]|$)'
989
  model: 'iPad Pro 10.5'
990
  device: 'tablet'
991
+ - regex: '(?:Apple-|.+_)?iPad7[C,_][56](?:[);/ ]|$)'
992
  model: 'iPad 6 9.7'
993
  device: 'tablet'
994
+ - regex: '(?:Apple-|.+_)?iPad7[C,_](?:11|12)(?:[);/ ]|$)'
995
  model: 'iPad 7 10.2'
996
  device: 'tablet'
997
  - regex: '(?:Apple-|.+_)?iPad8[C,_](?:9|10)'
1085
  model: 'Infinity N11'
1086
  - regex: 'N8301'
1087
  model: 'Infinity N12'
1088
+ - regex: 'Q440Plus(?:[);/ ]|$)'
1089
+ model: 'Q440 Plus'
1090
+ - regex: 'Micromax[_ ]Q353P(?:[);/ ]|$)'
1091
+ model: 'Q353 Plus'
1092
+ - regex: 'Q452(?:[);/ ]|$)'
1093
+ model: 'Spark 4G Prime'
1094
+ - regex: 'Q4601(?:[);/ ]|$)'
1095
+ model: 'Selfie 2 Note'
1096
 
1097
  - regex: 'MicroMax(?:[ \-\_])?(X291|X246|X252|X458|X312)'
1098
  model: '$1'
1154
 
1155
  # Alba
1156
  Alba:
1157
+ regex: 'Alba ?(?:57|4|10 TABLET|(?:[78]|10)(?:Nou|Pie))(?:[);/ ]|$)'
1158
  device: 'smartphone'
1159
  models:
1160
  - regex: 'Alba 57'
1164
  - regex: '10 TABLET'
1165
  device: 'tablet'
1166
  model: '10 Tablet'
1167
+ - regex: 'Alba((?:[78]|10)(?:Nou|Pie))'
1168
  device: 'tablet'
1169
  model: '$1'
1170
 
1467
  - regex: 'Hollogram ([^;/)]+)(?: Build|[;)])'
1468
  model: 'Hollogram $1'
1469
 
1470
+ # AGM (agm.tel)
1471
  AGM:
1472
  regex: 'AGM ([^/;)]+)(?: Build|[;)])'
1473
  device: 'smartphone'
1474
+ models:
1475
+ - regex: 'AGM A9(?:[);/ ]|$)'
1476
+ model: 'A9'
1477
+ - regex: 'AGM ([^/;)]+)(?: Build|[;)])'
1478
+ model: '$1'
1479
 
1480
  # Airness
1481
  Airness:
1542
 
1543
  # Alcatel (alcatelmobile.com)
1544
  Alcatel:
1545
+ regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|TIMXL|(?:(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034[ADEFGXTL]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|4087U|5001[ADJTU]|5002[ADFH]|5003[ADGU]|5006D|5007[AU]|5008[ADUYT]|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJF]|5025[DEG]|5026[ADJ]|5027B|5028[AYD]|5029[EYD]|5030[DE]|5032W|5033[AEFXDJGMOTXYQS]|5034D|5036D|5038[ADEX]|5039[DY]|5041[CD]|5042[ADEFGWXT]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYUI]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY]|5053[ADKY]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADJXYZIST]|5060[ADJ]|5061[KU]|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI]|5116J|5145A|6016[ADEX]|6025H|6036[AXY]|6037[BKY]|6039[AHJKY]|6042D|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060[SX]|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|7071[ADX]|8030Y|8050[DEGX]|8063|8088[XQM]|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9009G|9010X|9020A|9022X|9027[QFTWX]|9029Z|9203A|A(?:464BG|570BL|50[13]DL|57[17]VL|574BL)|I213|I216[AX]|(?<!\.)80(?:82|6[78])|A576CC)(?:_(?:EEA|RU))?|P360X)(?:[);/ ]|$)'
1546
  device: 'smartphone'
1547
  models:
1548
  - regex: '4087U'
1613
  model: 'One Touch Astro'
1614
  - regex: '5027B'
1615
  model: 'One Touch Dawn'
1616
+ - regex: '5024[ADF]|5028Y|6025H'
1617
  model: '1S'
1618
  - regex: '7071[ADX]'
1619
  model: 'A7 XL'
1750
  - regex: '9203A'
1751
  model: 'A3 7" 3G'
1752
  device: 'tablet'
1753
+ - regex: '9027[QFTWX]'
1754
  model: '3T 8.0"'
1755
  device: 'tablet'
1756
  - regex: '9026X'
1791
  - regex: '9024O'
1792
  model: 'One Touch Pixi 5'
1793
  device: 'tablet'
1794
+ - regex: 'I216[AX]'
1795
  model: 'One Touch Pixi 7'
1796
  device: 'tablet'
1797
  - regex: 'I213'
1919
  - regex: '9029Z'
1920
  model: 'Joy Tab'
1921
  device: 'tablet'
1922
+ - regex: '9029Z'
1923
+ model: 'Joy Tab'
1924
+ device: 'tablet'
1925
  - regex: 'Alcatel UP'
1926
  model: ''
1927
  - regex: '(?:ALCATEL_)?A383G'
2108
 
2109
  # Allwinner
2110
  Allwinner:
2111
+ regex: '(?:QUAD-CORE (?:A64 p3|A33 y3|T3 K2001M)|ZY-07B|UltraOcta-T8|OCTA-CORE T8|OCTOPUS-CORE T8|QuadCore-R16)(?:[);/ ]|$)'
2112
  device: 'tablet'
2113
  models:
2114
  - regex: 'QUAD-CORE A64 p3'
2126
  - regex: 'OCTA-CORE T8'
2127
  device: 'car browser'
2128
  model: 'OCTA-CORE T8'
2129
+ - regex: 'OCTOPUS-CORE T8'
2130
+ device: 'car browser'
2131
+ model: 'OCTOPUS-CORE T8'
2132
+ - regex: 'QuadCore-R16'
2133
+ device: 'car browser'
2134
+ model: 'QUAD-CORE R16'
2135
 
2136
  # altron
2137
  altron:
2260
  - regex: 'Archos ((?:[789]|10)[0-9]?[a-z]* ?(?:G9|G10|Helium|Titanium|Cobalt|Platinum|Xenon|Carbon|Neon|XS|IT)[^/;]*) Build'
2261
  device: 'tablet'
2262
  model: '$1'
2263
+ - regex: '(?:YL-)?Archos ([^/);]+)(?: Build|[;)])'
 
 
2264
  model: '$1'
2265
 
2266
  # Axxion
2431
 
2432
  # Ark (Ark Electronic Technology)
2433
  Ark:
2434
+ regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|Impulse[ _]P[12]|(?:EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Wizard_[12]|UKOZI U5)(?:[);/ ]|$)'
2435
  device: 'smartphone'
2436
  models:
2437
  - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))'
2448
  model: 'Wizard $1'
2449
  - regex: 'Elf_S8(?:[);/ ]|$)'
2450
  model: 'Elf S8'
2451
+ - regex: 'UKOZI U5(?:[);/ ]|$)'
2452
+ model: 'Ukozi U5'
2453
 
2454
  # Garmin-Asus
2455
  Garmin-Asus:
2465
 
2466
  # Asus
2467
  Asus:
2468
+ regex: 'Asus|Transformer|ZenFone Max|MeMOPad 10|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|(?:P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)|K01[579N])(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(5[02]0|620|55[2345])KL|ZD55[23]KL|ZS6(?:61|7[01])KS|ZS(6[0236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00[SV]D|P01Y_S'
2469
  device: 'smartphone'
2470
  models:
2471
  # explicit tablet models
2481
  - regex: 'ME302C(?:[);/ ]|$)'
2482
  model: 'MeMO Pad FHD 10'
2483
  device: 'tablet'
2484
+ - regex: '(ME302KL|MeMOPad 10FHD LTE|MeMo Pad FHD 10 LTE)(?:[);/ ]|$)'
2485
  model: 'MeMO Pad FHD 10 LTE'
2486
  device: 'tablet'
2487
  - regex: 'ME301T(?:[);/ ]|$)'
2493
  - regex: 'X Pad 10 LTE(?:[);/ ]|$)'
2494
  model: 'X Pad 10 LTE'
2495
  device: 'tablet'
2496
+ - regex: '(?:K01[3A7]|K007|K00R)(?:[);/ ]|$)|MeMO Pad 7'
2497
  model: 'MeMO Pad 7'
2498
  device: 'tablet'
2499
  - regex: 'K01E(?:[);/ ]|$)'
2502
  - regex: 'K00U|ME173X(?:[);/ ]|$)'
2503
  model: 'MeMO Pad HD 7'
2504
  device: 'tablet'
2505
+ - regex: '(?:K01[15]|K00L)(?:[);/ ]|$)'
2506
  model: 'MeMO Pad 8'
2507
  device: 'tablet'
2508
  - regex: 'K014(?:[);/ ]|$)'
2532
  - regex: 'Slider SL101'
2533
  model: 'Eee Pad Slider SL101'
2534
  device: 'tablet'
2535
+ - regex: 'P01[YZ](?:_S)?'
2536
  model: 'ZenPad C 7.0'
2537
  device: 'tablet'
2538
  - regex: 'P008 Build'
2550
  - regex: '(?:P024|P00A)(?:[);/ ]|$)'
2551
  model: 'ZenPad 8.0'
2552
  device: 'tablet'
2553
+ - regex: 'P01MA?(?:[);/ ]|$)'
2554
  model: 'ZenPad S 8.0'
2555
  device: 'tablet'
2556
+ - regex: 'ASUS_(w706)(?:[);/ ]|$)'
2557
+ model: '$1'
2558
+ device: 'tablet'
2559
  - regex: 'P027'
2560
  model: 'ZenPad 3S 10'
2561
  device: 'tablet'
2579
  - regex: 'K00G(?:[);/ ]|$)'
2580
  model: 'Fonepad Note 6'
2581
  device: 'phablet'
2582
+ - regex: '(?:K01[2N9]|K00E)(?:[);/ ]|$)'
2583
  model: 'Fonepad 7'
2584
  device: 'phablet'
2585
  - regex: 'K00Z(?:[);/ ]|$)'
2672
  model: 'ZenFone 3 Max'
2673
  - regex: '(?:ASUS_)?(X008)'
2674
  model: 'ZenFone 3 Pegasus'
2675
+ - regex: '(?:ASUS_)?(ZE553KL|Z01HDA?)'
2676
  model: 'ZenFone 3 Zoom'
2677
  - regex: '(?:ASUS_)?ZS550KL'
2678
  model: 'ZenFone 3 Deluxe'
2680
  model: 'ZenFone Selfie'
2681
  - regex: '(?:ASUS_)?(Z016[DS]|Z01FD)'
2682
  model: 'ZenFone 3 Deluxe'
2683
+ - regex: '(?:ASUS_)?Z(?:017DA|E520KL|E552KL|017D|012(?:DC?|S))'
2684
  model: 'ZenFone 3'
2685
  - regex: '(?:ASUS_)?Z01B[DS]|ZC551KL'
2686
  model: 'ZenFone 3 Laser'
2752
  regex: 'Excer[ _]'
2753
  device: 'tablet'
2754
  models:
2755
+ - regex: 'Excer[ _]G5.([36])'
2756
+ model: 'Excer G5.$1'
2757
  - regex: 'Excer[ _]G5'
2758
  model: 'Excer G5'
2759
  - regex: 'Excer[ _]10[ _]PRO'
2835
 
2836
  # Blu
2837
  Blu:
2838
+ regex: 'BLU[ _]|(?:blu|Dash)[ _]([^/;)]+)(?: Build|[;)])|(?:Studio[ _](5.0K|5.5|View XL|Mega|C 8\+8|[CGM][ _]HD|[CGX]|SELFIE|Selfie LTE|Touch|M5 Plus|J[1258]|X8 HD)|Advance (4.0 ?[LM]|5.[02](?: HD)?|A4|L[45])|ENERGY (DIAMOND|XL)|Energy X 2|LIFE XL|B110DL|Dash (?:X[2L]|L3)|PURE (?:X[LR]|MINI)|Life One X2|G90(?: PRO)?|Grand M3|GRAND (?:5.5 HD|XL LTE)|R1 (?:HD|PLUS)|Tank Xtreme [45].0|Tank Xtreme Pro|Touchbook M7 Pro|DASH X PLUS|C[456] 2019|BOLD N1|B130DL|Vivo 5 Mini|C5L 2020)(?:[);/ ]|$)'
2839
  device: 'smartphone'
2840
  models:
2841
  - regex: 'Advance (4.0 ?[LM]|4.0|5.[02](?: HD)?|A4|L[54])'
2842
  model: 'Advance $1'
2843
+ - regex: '(?:BLU[_ ])?Studio[ _](5.0 C|5.5|C 5\+5 LTE|View XL|Mega|C 8\+8|[CG][ _]HD|C|G|Touch|M HD|M5 Plus|J[1258]|X8 HD|X5|XL|X)(?:[);/ ]|$)'
2844
  model: 'Studio $1'
2845
  - regex: '(?:BLU[_ ])?Studio[ _]5.0 ?K(?:[);/ ]|$)'
2846
  model: 'Studio 5.0 K'
2922
  model: 'Vivo Air LTE'
2923
  - regex: 'Touchbook G7'
2924
  model: 'Touchbook G7'
2925
+ - regex: 'C5L 2020'
2926
+ model: 'C5L (2020)'
2927
  - regex: '(?:BLU[_ ])?VIVO[ _]SELFIE'
2928
  model: 'Vivo Selfie'
2929
  - regex: '(?:BLU[_ ])?Vivo 5 Mini'
2955
 
2956
  # Blackview
2957
  Blackview:
2958
+ regex: 'Blackview|(BV([24-9]000|[46]900|(5[1589]|9[15689])00|6[1368]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))|A[86]0Plus|BL6000Pro'
2959
  device: 'smartphone'
2960
  models:
2961
  - regex: 'A60Pro\)'
2964
  model: 'A60'
2965
  - regex: 'A80Pro(?:[);/ ]|$)'
2966
  model: 'A80 Pro'
2967
+ - regex: '(A[86]0|BV5500)Plus(?:[);/ ]|$)'
2968
+ model: '$1 Plus'
2969
  - regex: '(BV6000S)'
2970
  model: '$1'
2971
+ - regex: '(BL6000|BV(?:[48]000|5500|9[5678]00|6[38]00))Pro'
2972
  model: '$1 Pro'
2973
  - regex: 'Blackview (A[78]|E7S)'
2974
  model: '$1'
2975
  - regex: 'BV9000Pro-F'
2976
  model: 'BV9000 Pro F'
 
 
2977
  - regex: '(BV6[13]00)(?:[);/ ]|$)'
2978
  model: '$1'
2979
  device: 'phablet'
2980
+ - regex: '(BV([24-9]000|6[69]00|4900|(5[1589]|9[15689])00)(?:[ _](?:PRO))?)'
2981
  model: '$1'
2982
  - regex: '(P10000(?:[ _](?:PRO))?)'
2983
  model: '$1'
2986
  - regex: '(Alife[ _][PS]1|DM550|Heatwave)'
2987
  model: '$1'
2988
 
2989
+ # Bluboo (bluboo.tel)
2990
  Bluboo:
2991
+ regex: 'Bluboo|Maya Build|(?:(?<!IQM )Picasso(?: 4G)?|Xfire2?)(?:[);/ ]|$)'
2992
  device: 'smartphone'
2993
  models:
2994
  - regex: 'Maya Build'
2995
  model: 'Maya'
2996
  - regex: 'Xfire2'
2997
  model: 'Xfire 2'
2998
+ - regex: 'Picasso(?: 4G)?'
2999
  model: 'Picasso 4G'
3000
  - regex: 'Xfire'
3001
  model: 'Xfire'
3101
 
3102
  # VGO TEL (vgotel.com)
3103
  VGO TEL:
3104
+ regex: 'VGOTEL|(?:Venture V(?:[278]|12)|VentureV10|Ocean[_ ][689]|Ocean9L)(?:[);/ ]|$)'
3105
  device: 'smartphone'
3106
  models:
3107
+ - regex: 'Venture ?V([278]|1[02])(?:[);/ ]|$)'
3108
  model: 'Venture V$1'
3109
  - regex: 'Ocean[_ ]?([689]|9L)(?:[);/ ]|$)'
3110
  model: 'Ocean $1'
3111
 
3112
  # Vivo (vivo.com.cn, vivo.com)
3113
  Vivo:
3114
+ regex: '((?:VIV-|BBG-)?(?<!FBCR/)vivo(?!(?:Browser)))|(?:V1730(D[AT]|GA)|V18(18CA|01A0|13B[AT]|18T|09[AT]|1[346][AT]|[13]8[AT]|14A|24[B]?A|2[19][AT]|3[12][AT]|36[AT])|V1731CA|V1732[AT]|V1818CT|V19[01]1[AT]|V1932[AT]|V191[3469][AT]|V192[1348]A|V193[04]A|V194[15]A|V1938CT|V1955A|V1938T|V1730EA|V19[26]2A|V196[35]A|V198[16]A|V1936A[L]?|V19[59]0A|V200[125]A|V2006|1819|V201[12]A|V202[0345]C?A|V202[235-9]|V205[47]A|V203[0268]|V2031[E]?A|V203[46]A|V204[013]|V204[6789]A|V20(6[158]|99|5[56]|66[B]?|7[23]|80)A|V2046|X50 Pro\+|I1927)(?:[);/ ]|$)'
3115
  device: 'smartphone'
3116
  models:
3117
  - regex: 'V1824[B]?A(?:[);/ ]|$)'
3132
  model: 'iQOO Neo 3'
3133
  - regex: 'V1936A[L]?(?:[);/ ]|$)'
3134
  model: 'iQOO Neo 855'
3135
+ - regex: 'V2055A(?:[);/ ]|$)'
3136
+ model: 'iQOO Neo 5'
3137
  - regex: 'V1986A(?:[);/ ]|$)'
3138
  model: 'iQOO Z1'
3139
  - regex: 'V2012A(?:[);/ ]|$)'
3140
  model: 'iQOO Z1x'
3141
+ - regex: 'V2073A(?:[);/ ]|$)'
3142
+ model: 'iQOO Z3'
3143
  - regex: 'V1919A(?:[);/ ]|$)'
3144
  model: 'iQOO Z5x'
3145
  - regex: 'V2023A(?:[);/ ]|$)'
3146
  model: 'iQOO U1'
3147
+ - regex: 'V2065A(?:[);/ ]|$)'
3148
+ model: 'iQOO U1x'
3149
+ - regex: 'V2061A(?:[);/ ]|$)'
3150
+ model: 'iQOO U3'
3151
  - regex: 'V2024A(?:[);/ ]|$)'
3152
  model: 'iQOO 5'
3153
  - regex: 'V2025A(?:[);/ ]|$)'
3156
  model: 'V20'
3157
  - regex: 'V2040(?:[);/ ]|$)'
3158
  model: 'V20 (2021)'
3159
+ - regex: 'Vivo 1921(?:[);/ ]|$)'
3160
+ model: 'U20'
3161
  - regex: 'vivo 1805(?:[);/ ]|$)'
3162
  model: 'Nex'
3163
  - regex: 'V1923A(?:[);/ ]|$)'
3180
  model: 'S6 5G'
3181
  - regex: 'V2020C?A(?:[);/ ]|$)'
3182
  model: 'S7'
3183
+ - regex: 'V2031EA(?:[);/ ]|$)'
3184
+ model: 'S7e'
3185
+ - regex: 'V2080A(?:[);/ ]|$)'
3186
+ model: 'S7t'
3187
+ - regex: 'V2072A(?:[);/ ]|$)'
3188
+ model: 'S9 (2021)'
3189
+ - regex: 'V2048A(?:[);/ ]|$)'
3190
+ model: 'S9e'
3191
  - regex: 'V1941A(?:[);/ ]|$)'
3192
  model: 'U3'
3193
  - regex: 'V1928A(?:[);/ ]|$)'
3200
  model: 'V15'
3201
  - regex: 'vivo 1818(?:[);/ ]|$)'
3202
  model: 'V15 Pro'
3203
+ - regex: 'vivo 19(?:10|09)(?:[);/ ]|$)'
3204
  model: 'V17 Pro'
3205
+ - regex: 'vivo 1907(?:_19)?(?:[);/ ]|$)'
3206
+ model: 'V17 Neo'
3207
+ - regex: 'vivo 1920(?:[);/ ]|$)'
3208
+ model: 'V17'
3209
  - regex: 'V2022(?:[);/ ]|$)'
3210
  model: 'V20 SE'
3211
  - regex: '(?:VIV-|BBG-)?vivo[ _]1601(?:[);/ ]|$)'
3224
  model: 'V9'
3225
  - regex: 'vivo 1727(?:[);/ ]|$)'
3226
  model: 'V9 Youth'
3227
+ - regex: 'vivo 1851(?:[);/ ]|$)'
3228
+ model: 'V9 Pro'
3229
+ - regex: 'vivo X5Pro(?:[);/ ]|$)'
3230
+ model: 'X5 Pro'
3231
  - regex: 'vivo 1721(?:[);/ ]|$)'
3232
  model: 'X20'
3233
  - regex: 'X20Plus(?:[);/ ]|$)'
3234
  model: 'X20 Plus'
3235
  - regex: 'vivo 1725(?:[);/ ]|$)'
3236
  model: 'X21'
3237
+ - regex: 'vivo X21i(?: A)?(?:[);/ ]|$)'
3238
+ model: 'X21i'
3239
  - regex: 'V1814[AT](?:[);/ ]|$)'
3240
  model: 'X21S'
3241
  - regex: 'V1809[AT](?:[);/ ]|$)'
3256
  model: 'X50 Pro'
3257
  - regex: '(?:V2011A|X50 Pro\+)(?:[);/ ]|$)'
3258
  model: 'X50 Pro Plus'
3259
+ - regex: 'V2046A(?:[);/ ]|$)'
3260
+ model: 'X60'
3261
+ - regex: '(?:V2047A|V2046)(?:[);/ ]|$)'
3262
+ model: 'X60 Pro'
3263
+ - regex: 'V2056A(?:[);/ ]|$)'
3264
+ model: 'X60 Pro Plus'
3265
  - regex: 'X9Plus(?:[);/ ]|$)'
3266
  model: 'X9 Plus'
3267
  - regex: 'vivo 1902(?:[);/ ]|$)'
3268
  model: 'Y17'
3269
+ - regex: 'vivo 1906(?:[);/ ]|$)'
3270
+ model: 'Y11'
3271
  - regex: 'vivo 1915(?:[);/ ]|$)'
3272
  model: 'Y19'
3273
  - regex: 'V202[79](?:[);/ ]|$)'
3274
  model: 'Y20'
3275
  - regex: 'V2028(?:[);/ ]|$)'
3276
  model: 'Y11s'
3277
+ - regex: 'V2038(?:[);/ ]|$)'
3278
+ model: 'Y20s'
3279
  - regex: 'V2043(?:[);/ ]|$)'
3280
  model: 'Y20 (2021)'
3281
+ - regex: 'V2041(?:[);/ ]|$)'
3282
+ model: 'Y72 5G'
3283
  - regex: 'V2032(?:[);/ ]|$)'
3284
  model: 'Y20i'
3285
  - regex: 'V2023(?:[);/ ]|$)'
3288
  model: 'Y3'
3289
  - regex: 'V1930A(?:[);/ ]|$)'
3290
  model: 'Y3 Standard'
3291
+ - regex: '(?:vivo 1938|V203[46]A)(?:[);/ ]|$)'
3292
+ model: 'Y30'
3293
+ - regex: 'V2099A(?:[);/ ]|$)'
3294
+ model: 'Y30 (2021)'
3295
+ - regex: 'V2066[B]?A(?:[);/ ]|$)'
3296
+ model: 'Y30g'
3297
  - regex: 'V2036(?:[);/ ]|$)'
3298
  model: 'Y31'
3299
+ - regex: 'V2068A(?:[);/ ]|$)'
3300
+ model: 'Y31s'
3301
  - regex: 'V1934A(?:[);/ ]|$)'
3302
  model: 'Y5s'
3303
  - regex: 'V1965A(?:[);/ ]|$)'
3306
  model: 'Y51'
3307
  - regex: 'V2054A(?:[);/ ]|$)'
3308
  model: 'Y31s'
3309
+ - regex: 'V2057A(?:[);/ ]|$)'
3310
+ model: 'Y52s'
3311
  - regex: 'vivo 1606(?:[);/ ]|$)'
3312
  model: 'Y53i'
3313
  - regex: 'vivo 1603(?:[);/ ]|$)'
3320
  model: 'Y69'
3321
  - regex: 'V2002A(?:[);/ ]|$)'
3322
  model: 'Y70s'
3323
+ - regex: 'V2006(?:[);/ ]|$)'
3324
+ model: 'Y60s'
3325
  - regex: 'vivo 1724(?:[);/ ]|$)'
3326
  model: 'Y71'
3327
  - regex: 'vivo 1801(?:[);/ ]|$)'
3328
  model: 'Y71i'
3329
  - regex: 'V1731CA(?:[);/ ]|$)'
3330
  model: 'Y73'
3331
+ - regex: 'V2031A(?:[);/ ]|$)'
3332
+ model: 'Y73s'
3333
  - regex: 'V1913[AT](?:[);/ ]|$)'
3334
  model: 'Y7s'
3335
  - regex: 'vivo 180([38]|8i)(?:[);/ ]|$)'
3342
  model: 'Y83 Pro'
3343
  - regex: 'V1730EA(?:[);/ ]|$)'
3344
  model: 'Y89'
3345
+ - regex: 'vivo 1823(?:[);/ ]|$)'
3346
+ model: 'Y90'
3347
  - regex: 'vivo 181[17](?:[);/ ]|$)'
3348
  model: 'Y91'
3349
  - regex: 'V1945A(?:[);/ ]|$)'
3422
  - regex: 'Tab'
3423
  model: 'Tab'
3424
  device: 'tablet'
3425
+ - regex: 'E([67]00)'
3426
+ model: 'E$1'
3427
+ - regex: '(?:Beeline[_ ])?Smart[ _]?([0-9])'
 
 
3428
  model: 'Smart $1'
3429
  - regex: 'Smart Dual'
3430
  model: 'Smart Dual'
3447
 
3448
  # BenQ
3449
  BenQ:
3450
+ regex: 'BENQ(?:[ \-])?([a-z0-9]+)|(?:F52_09|F5_15)(?:[);/ ]|$)'
3451
  device: 'feature phone'
3452
  models:
3453
+ - regex: 'F(52|5)_(?:15|09)(?:[);/ ]|$)'
3454
+ model: 'F$1'
3455
  - regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
3456
  model: '$1'
3457
 
3985
 
3986
  # Casper
3987
  Casper:
3988
+ regex: 'CASPER[_ ]|VIA[- _](T7D|A[34]|E3|F[123]|G[34]|M4|[LS]8|S7|P2|V8C|A[13]_Plus(?:_64)?|A1(?:_1)?|S[13]0|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G|S1[78])(?:[);/ ]|$)'
3989
  device: 'smartphone'
3990
  models:
3991
  - regex: '(?:CASPER[_ ])?VIA_A1_Plus(?:_64)?'
3992
  model: 'VIA A1 Plus'
3993
+ - regex: '(?:CASPER[_ ])?VIA[_ ](G1_Plus|A3_Plus|G[13]|E1|[AE]2|M[123]|V[35689]|V10|G3|V6X|A[34]|E3|F[123]|G4|M4|P2|S|V8C|A1(?:_1)?)(?:[);/ ]|$)'
3994
  model: 'VIA $1'
3995
  - regex: 'CASPER_VIA_E1c'
3996
  model: 'VIA E1C'
4041
 
4042
  # Celkon
4043
  Celkon:
4044
+ regex: 'Celkon|Android 7.+ UNIQ(?: Build|[);])|(?:Millennia Hero|2GBStar|2GBXpress|CliQ2|Campus Prime)(?:[);/ ]|$)'
4045
  device: 'smartphone'
4046
  models:
4047
  - regex: 'Celkon[ _*](C[78]20)'
4048
  model: '$1'
4049
  device: 'tablet'
4050
+ - regex: 'Celkon[_ ]4G_TAB-8'
4051
+ model: '4G Tab 8'
4052
+ device: 'tablet'
4053
  - regex: 'Millennia Hero'
4054
  model: 'Millennia Hero'
4055
+ - regex: '2GBStar'
4056
+ model: '2GB Star'
4057
+ - regex: '2GBXpress'
4058
+ model: '2GB Xpress'
4059
+ - regex: 'CliQ2(?:[);/ ]|$)'
4060
+ model: 'CliQ 2'
4061
+ - regex: 'Android 7.+ UniQ(?: Build|[);])'
4062
+ model: 'UniQ'
4063
+ - regex: '(Campus Prime)(?:[);/ ]|$)'
4064
+ model: '$1'
4065
  - regex: 'Celkon[ _*](CT[^;/]+) Build'
4066
  model: '$1'
4067
  device: 'tablet'
4087
 
4088
  # Cherry Mobile (cherrymobile.com)
4089
  'Cherry Mobile':
4090
+ regex: 'Cherry|Superion S1 DTV|Flare([ _])?(2X|4|A[123]|J[123568]|P[13]|S[4-8]|X2|Y[367]|S Play|HD|LITE|XL|X_V2|Y3s|Tab)(?:[ _](?:Pro|Plus|Max|LTE))?|Fusion Bolt|Omega[_ ](?:Icon 2|Icon Lite 2|lite[_ ][43][Cs]?|HD [45]|HD_Duo)|Spin Max 2|Selfie_Two|Flare_5'
4091
  device: 'smartphone'
4092
  models:
4093
  - regex: '(Flare2X)'
4116
  model: 'Flare X V2'
4117
  - regex: 'Flare[ _](A2|J3|P1|S[467])[ _]Lite'
4118
  model: 'Flare $1 Lite'
4119
+ - regex: 'Flare[ _](J[12]|S[57]|Y3|J6|P1)[ _]mini'
4120
  model: 'Flare $1 Mini'
4121
+ - regex: 'Flare[_ ]?(S[567]|J[63])[_ ]?Plus'
4122
+ model: 'Flare $1 Plus'
4123
  - regex: 'Flare_J2_2018'
4124
  model: 'Flare J2 (2018)'
4125
  - regex: 'Flare S4 Max LTE'
4128
  model: 'Flare $1 Max'
4129
  - regex: 'FlareS5LiteDTV'
4130
  model: 'Flare S5 Lite DTV'
4131
+ - regex: 'Flare[_ ]J2[_ ]DTV'
4132
+ model: 'Flare S2 DTV'
4133
+ - regex: 'Flare[_ ]Lite[_ ]3S'
4134
+ model: 'Flare Lite S3'
4135
  - regex: 'FLARE S6 POWER'
4136
  model: 'Flare S6 Power'
4137
+ - regex: 'Flare(?:[ _])?(A[123]|J8 LTE|J[13568]|P[13]|S[4-8]|X2|Y3s|Y7_LTE|Y[673]|[45])'
4138
  model: 'Flare $1'
4139
  - regex: 'OMEGA HD ([45])'
4140
  model: 'Omega HD $1'
4212
 
4213
  # ComTrade Tesla
4214
  ComTrade Tesla:
4215
+ regex: 'Tesla(?!Group/LUMUS)|Impulse 7.85 3G|Impulse 10.1 OCTA|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
4216
  device: 'smartphone'
4217
  models:
4218
  - regex: 'TeslaEvo5.0'
4405
 
4406
  # Coolpad
4407
  Coolpad:
4408
+ regex: '(?:YL-)?Coolpad|(?:Cool_9S|1824-S0|8190Q|1831-A0|8676-[AM]01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C105-E0|C106-[79]| C106|MTS-T0|cp3705A[S]?|ORL-C0|DLS-E0|1826-I01|8298-(?:M02|A01)|5560S)(?:[);/ ]|$)|(8295|5860S) Build'
4409
  device: 'smartphone'
4410
  models:
4411
  - regex: 'VCR-[AI]0'
4431
  model: 'Cool 1'
4432
  - regex: 'C105-E0(?:[);/ ]|$)'
4433
  model: 'Cool S1'
4434
+ - regex: '1826-I01(?:[);/ ]|$)'
4435
+ model: 'Cool 5'
4436
  - regex: 'ORL-C0(?:[);/ ]|$)'
4437
  model: 'Cool 9'
4438
  - regex: 'Cool_9S(?:[);/ ]|$)'
4447
  model: 'Note 3 Plus'
4448
  - regex: 'CP8298_I00(?:[);/ ]|$)'
4449
  model: 'Note 3 Lite'
4450
+ - regex: '(8676-[AM]01|8298-(?:M02|A01))(?:[);/ ]|$)'
4451
  model: '$1'
4452
  - regex: '(?:YL-)?Coolpad[ _\-]?([^/;]+) Build'
4453
  model: '$1'
4481
 
4482
  # Cricket
4483
  Cricket:
4484
+ regex: 'Cricket-([a-z0-9]+)|(?:U325AC|U705AC|V350C)(?:[);/ ]|$)'
4485
  device: 'smartphone'
4486
  models:
4487
+ - regex: 'U325AC'
4488
+ model: 'Icon 2'
4489
  - regex: 'U705AC'
4490
  model: 'Ovation'
4491
+ - regex: 'V350C'
4492
+ model: 'Influence'
4493
  - regex: 'Cricket-([a-z0-9]+)'
4494
  device: 'feature phone'
4495
  model: '$1'
4520
 
4521
  # AllDocube (alldocube.com)
4522
  AllDocube:
4523
+ regex: '(?:T1001XS?|T1006S?|iPlay_[234]0|U1006H?)(?:[);/ ]|$)'
4524
  device: 'tablet'
4525
  models:
4526
  - regex: 'T1001XS(?:[);/ ]|$)'
4533
  model: 'M5X'
4534
  - regex: 'U1006H?(?:[);/ ]|$)'
4535
  model: 'iPlay 10 Pro 10.1"'
4536
+ - regex: 'iPlay_([234]0)(?:[);/ ]|$)'
4537
  model: 'iPlay $1'
4538
 
4539
  # Cube (short name Alldocube)
4567
 
4568
  # CUBOT
4569
  CUBOT:
4570
+ regex: 'CUBOT|(?<!QUMO )QUEST(?!(?:[0-9]|\s[0-9]))(?: LITE)?|(?:NOTE 20 PRO|RAINBOW 2|KING_KONG_3|KINGKONG 5 Pro|ZORRO 001|KINGKONG[_ ]MINI2?|KING KONG CS|R15_PRO|S550 Pro)(?:[);/ ]|$)'
4571
  device: 'smartphone'
4572
  models:
4573
  - regex: 'CHEETAH 2'
4584
  model: 'King Kong Mini'
4585
  - regex: 'KING_KONG_3'
4586
  model: 'King Kong 3'
4587
+ - regex: 'KINGKONG 5 Pro'
4588
+ model: 'King Kong 5 Pro'
4589
  - regex: 'KING KONG CS'
4590
  model: 'King Kong CS'
4591
  - regex: 'KING KONG'
4608
  model: 'Note Plus'
4609
  - regex: 'NOTE 20 PRO'
4610
  model: 'Note 20 Pro'
4611
+ - regex: '(R15|S550)[_ ]PRO'
4612
+ model: '$1 Pro'
4613
  - regex: 'CUBOT[_ ]NOTE[_ ]S'
4614
  model: 'Note S'
4615
  - regex: 'CUBOT_NOVA'
4705
 
4706
  # Danew
4707
  Danew:
4708
+ regex: 'Dslide ?([^;/]+) Build|Konnect_?(?:402|50[246]|60[127])|GEODROID_A5|Dslide ?(?:714|101[45]|1013QC)'
4709
  device: 'smartphone'
4710
  models:
4711
  - regex: 'Konnect_?(402|50[246]|60[127])'
4716
  - regex: 'GEODROID_A5'
4717
  device: 'tablet'
4718
  model: 'Geodroid A5'
4719
+ - regex: 'Dslide ?(714|1013QC|101[45])'
4720
+ device: 'tablet'
4721
+ model: 'Dslide $1'
4722
 
4723
  # Denver Electronics (denver-electronics.com)
4724
  Denver:
4740
  models:
4741
  - regex: 'XCD35'
4742
  model: 'XCD35'
4743
+ - regex: 'Venue ((?:10|[78]) [0-9]{4}|[78] HSPA\+)'
4744
  model: 'Venue $1'
4745
  device: 'tablet'
4746
+ - regex: '(?:Dell )?Venue(?: Build|[);])'
4747
  model: 'Venue'
4748
  - regex: 'Dell; Venue Pro'
4749
  model: 'Venue Pro'
4778
 
4779
  # DEXP
4780
  DEXP:
4781
+ regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|Larus_TV1|Ixion(?:ML4.7|ES250)|M150Storm|(?:SENIOR|F4[38]D8000K|VA[12]10|VA170|ML450|MS[56]50|BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|AL[23]50|AS155|AS260|GS15[035]| (?:N280i|P380i|R110|E210|BL155|BL160|A160|B450|B340|B35[05]|T155|A1[45]0|A340|AS160|GL[23]55|G250|G15[05]|ES750|XL150|S280|Z[34]55|H170|P510|L2[17]0))(?:[);/ ]|$)'
4782
  device: 'smartphone'
4783
  models:
4784
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
4785
  model: 'Ixion $1'
4786
+ - regex: '(ML450|MS[56]50|ES750|XL150)(?:[);/ ]|$)'
4787
  model: 'Ixion $1'
4788
  - regex: 'IxionES250(?:[);/ ]|$)'
4789
  model: 'Ixion ES250 Rage'
4801
  model: '5.85" AS260'
4802
  device: 'phablet'
4803
 
4804
+ - regex: 'Ursus[ _]([^;/)]+)(?: Build|[);])'
4805
  model: 'Ursus $1'
4806
  device: 'tablet'
4807
+ - regex: '(VA[21]10|VA170|E210|R110|N280i|P380i|P510|S280|H170|L2[17]0)(?:[);/ ]|$)'
4808
  model: 'Ursus $1'
4809
  device: 'tablet'
4810
 
4811
+ - regex: ' (B450|B340|B35[05]|BL155|BL160|A160|A340|T155|Z[34]55|G250)(?:[);/ ]|$)'
4812
  model: '$1'
4813
  - regex: 'SENIOR(?:[);/ ]|$)'
4814
  model: 'Senior'
4820
  - regex: 'H135[ _]Build'
4821
  model: 'Atlas'
4822
  device: 'desktop'
4823
+ - regex: '(BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|A1[45]0|GS15[035]|AS160|GL[23]55|G15[05])(?:[);/ ]|$)'
4824
  model: '$1'
4825
  - regex: 'DEXP[ _]([^;/]+) Build'
4826
  model: '$1'
4877
 
4878
  # Digma
4879
  Digma:
4880
+ regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI (?:7 E401 4G|8 E400 4G|ATL 4G|Kids|Octa [178]0|1902 3G|10 E402|Z530 3G)|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _][TC][ST](606[32]ML|111[46]ML|11[459]4MG|1117PG|1207MG|1210MG|1195MG|1196ML|3001ML|4024PG|5009PL|5021ML|5026PL|500[67]PG|7052PG|706[56]MG|709[68]PL|7097MG|720[48]MG|7140ML|7141MG|7113PL|7193MG|820[69]MG|7153MG|8139ML|8143MG|8152ML|1050PL|8205PG|7203MG|106[24]ML|1115MG)|HIT 4G|HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|(iDxD8 3G|iDxD10 3G|iDrQ10 3G|iDxD[45]|iDxQ5|iD[nx]D7(?:[_ ]3G)?)|PS604M|PT452E|LINX B510 3G LT5037MG|LINX A452 3G LT4030PG|LINX A453 3G LT4038PG|LINX A420 3G LS4019PG|LINX A450 3G LT4028PG|Linx A400 3G LT4001PG|Linx C500 3G LT5001PG|Linx PS474S|LS504[01]PL|LT40(47|54)MG|PS1043MG|LS405[01]MG|LS5053ML|LT5048MG|HT7071MG|LT5052ML|HT5035PG|HT4039PG|LT4049PG|NS6902QL|NS9797MG|TS7854M|TS1012E 3G|TT1004PG|TT702[045]MG|TT1002MG|TT7026MW|VRL42|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
4881
  device: 'smartphone'
4882
  models:
4883
  - regex: 'HIT(?: 3G)? HT707[10]MG'
4993
  - regex: 'Digma[_ ]([^;/]+) Build'
4994
  model: '$1'
4995
  device: 'tablet'
4996
+ # VR headset
4997
+ - regex: 'VRL42(?:[);/ ]|$)'
4998
+ device: 'wearable'
4999
+ model: 'VR L42'
5000
 
5001
  # DoCoMo
5002
  DoCoMo:
5014
 
5015
  # Doogee
5016
  Doogee:
5017
+ regex: 'DOOGEE[/ _-]|Valencia2_Y100(?:_?(?:pro|plus))?|Y100_Plus|X5max(?:[_ ]PRO)?|Shoot_[12]|x5_doogee|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)|(?:BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Hitman_DG850|S(?:[568]8|9[056]|59|40)Pro|X95Pro|S40Lite|BL[579]000|N20Pro|(?<!Lenovo )S90C|Ibiza_F2|Iron-bone DG750)(?:[);/ ]|$)'
5018
  device: 'smartphone'
5019
  models:
5020
  - regex: '(?:Valencia2_)?Y100_Plus(?:[);/ ]|$)'
5021
  model: 'Valencia2 Y100 Plus'
5022
  - regex: 'Valencia2_Y100pro'
5023
  model: 'Valencia2 Y100 Pro'
5024
+ - regex: 'Valencia2_Y100(?:[);/ ]|$)'
5025
+ model: 'Valencia2 Y100'
5026
  - regex: 'LEO_(DG280)'
5027
  model: 'Leo $1'
5028
+ - regex: 'Iron-bone (DG750)'
5029
+ model: 'Iron Bone $1'
5030
  - regex: '(BL[579]000|S90C)(?:[);/ ]|$)'
5031
  model: '$1'
5032
  - regex: 'X95Pro(?:[);/ ]|$)'
5117
  - regex: 'DNS[ _\-]([^;/]+)(?: Build|[);])'
5118
  model: '$1'
5119
 
5120
+ # E-Boda (e-boda.ro)
5121
  E-Boda:
5122
+ regex: 'E-Boda|Eclipse_(?:G400M|G500)|Revo R77 GPS'
5123
  device: 'smartphone'
5124
  models:
5125
  - regex: 'E-Boda ((?:Revo|Izzycomm|Essential|Intelligence|Supreme)[^/;]+) Build'
5126
  device: 'tablet'
5127
  model: '$1'
5128
+ - regex: 'Revo R77 GPS'
5129
+ device: 'tablet'
5130
+ model: 'Revo R77 GPS'
5131
  - regex: 'Eclipse_(G400M|G500)'
5132
  model: 'Eclipse $1'
5133
  - regex: 'E-Boda ([^/;]+) Build'
5186
 
5187
  # EE
5188
  EE:
5189
+ regex: 'Hawk_from_EE|Rook from EE'
5190
  device: 'smartphone'
5191
  models:
5192
  - regex: 'Hawk_from_EE'
5193
  model: 'Hawk'
5194
+ - regex: 'Rook from EE'
5195
+ model: 'Rock'
5196
 
5197
  # EKT
5198
  EKT:
5217
 
5218
  # Elephone
5219
  Elephone:
5220
+ regex: 'Elephone|Vowney(?: Lite)?|P6000( ?Pro| ?Plus|\+| ?02| 5.0 01)?'
5221
  device: 'smartphone'
5222
  models:
5223
  - regex: 'Elephone Trunk(?:[);/ ]|$)'
5224
  model: 'Trunk'
5225
+ - regex: 'Vowney Lite(?:[);/ ]|$)'
5226
+ model: 'Vowney Lite'
5227
+ - regex: 'Vowney(?:[);/ ]|$)'
5228
+ model: 'Vowney'
5229
  - regex: 'P6000(\+| ?Plus)(?:[);/ ]|$)'
5230
  model: 'P6000 Plus'
5231
  - regex: 'P6000 02(?:[);/ ]|$)'
5355
 
5356
  # Sony & Sony Ericsson (combined as they are mixed up)
5357
  Sony:
5358
+ regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|G8188|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[2346]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J3173|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|G2299|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A[01]01SO|I4193|E6508|SOT31|SO-[45]1A|SO-52A|XQ-A[DT]51|XQ-A[TU]42|XQ-AS[67]2|XQ-A[TSU]52|SOL25|SOG02|A002SO|NW-(A100|Z1000)Series|J3273|NSZ-GS7'
5359
  device: 'smartphone'
5360
  models:
5361
  # SONY ERICSSON: explicit smartphone models
5497
  model: 'Xperia Ace'
5498
  - regex: '(?:A001SO|XQ-A[TU]52|XQ-AU42|SO-41A|SOV43)(?:[);/ ]|$)'
5499
  model: 'Xperia 10 II'
5500
+ - regex: 'A101SO(?:[);/ ]|$)'
5501
+ model: 'Xperia 10 III'
5502
  - regex: '(?:Sony(?:Ericsson)?)?I(?:42[19]3|3223)'
5503
  model: 'Xperia 10 Plus'
5504
  - regex: '(?:Sony(?:Ericsson)?)?I4193'
5715
  model: 'Xperia XA2 Ultra'
5716
  - regex: '(?:Sony(?:Ericsson)?)?G823[12]|SOV35|602SO|SO-03J'
5717
  model: 'Xperia XZs'
5718
+ - regex: '(?:Sony(?:Ericsson)?)?(?:G814[12]|G8188|SO-04[JK])'
5719
  model: 'Xperia XZ Premium'
5720
  - regex: '(?:Sony(?:Ericsson)?)?(?:H83[12]4|H82[17]6|SOV37|SO-03K|H8296|702SO)'
5721
  model: 'Xperia XZ2'
5749
  model: 'Xperia X Performance Dual'
5750
 
5751
  # SONY: explicit tablet models
5752
+ - regex: '(?:SGP(?:311|312|321)|(Sony)?SO-03E)(?:[);/ ]|$)'
5753
  model: 'Xperia Tablet Z'
5754
  device: 'tablet'
5755
  - regex: 'SGP712(?:[);/ ]|$)'
5765
  model: 'Xperia Tablet S'
5766
  device: 'tablet'
5767
 
5768
+ # SONY: Bravia or TV Box
5769
  - regex: '(?:BRAVIA )(2K GB ATV3|4K UR2|4K GB ATV3|4K GB|4K 2015|2015)(?:[);/ ]|$)'
5770
  model: 'Bravia $1'
5771
  device: 'tv'
5772
+ - regex: '(NSZ-GS7)(?:[);/ ]|$)'
5773
+ model: '$1'
5774
+ device: 'tv'
5775
 
5776
  - regex: 'NW-A100Series'
5777
  model: 'Walkman A100'
6007
  - regex: 'EVOLVEO[ _]([^;/]*) Build'
6008
  model: '$1'
6009
 
6010
+ # Leotec
6011
+ Leotec:
6012
+ regex: '(LESPH501[14]|LESPH5003B|SUPERNOVA (?:Qi16|Qi32|i3G96[X]?)|PULSAR QI3G)(?:[);/ ]|$)'
6013
+ device: 'smartphone'
6014
  models:
6015
+ - regex: 'LESPH5011'
6016
+ model: 'Argon e250'
6017
+ - regex: 'LESPH5003B'
6018
+ model: 'Argon A250B'
6019
+ - regex: 'LESPH5014'
6020
+ model: 'Krypton K150'
6021
+ - regex: 'SUPERNOVA (Qi16|Qi32|i3G96[X]?)'
6022
+ device: 'tablet'
6023
+ model: 'Supernova $1'
6024
+ - regex: 'PULSAR (QI3G)'
6025
+ device: 'tablet'
6026
+ model: 'Pulsar $1'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6027
 
6028
  # EvroMedia
6029
  EvroMedia:
6030
+ regex: 'EVROMEDIA|Playpad[ _]|PLAY_PAD_PRO_XL|3G NOTE XL'
6031
  device: 'tablet'
6032
  models:
6033
  - regex: 'Playpad 3G GOO'
6040
  model: 'Play Pad Pro XL'
6041
  - regex: 'PlayPad 3GTab XL'
6042
  model: 'Play Pad 3G Tab XL'
6043
+ - regex: '3G NOTE XL'
6044
+ model: 'Play Pad 3G Note XL'
6045
  # EKO
6046
  EKO:
6047
  regex: 'EKO'
6375
 
6376
  # Ginzzu
6377
  Ginzzu:
6378
+ regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S5002|(?<!Wave Pro )S5021|S5230|S50[45]0|S51[24]0|RS(6[12]|9[45])D|S40[23]0|RS850[12]|RS9602)(?:[);/ ]|$)'
6379
  device: 'smartphone'
6380
  models:
6381
  - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST60[14]0|ST6120)'
6385
  device: 'tablet'
6386
  - regex: '(RS6[12]D) ULTIMATE'
6387
  model: '$1 Ultimate'
6388
+ - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5002|S5021|S5230|S51[24]0|S40[23]0|RS850[12]|RS9602|RS94D)(?:[);/ ]|$)'
6389
  model: '$1'
6390
 
6391
  # Gionee
6426
  device: 'smartphone'
6427
  model: 'GTM-5$1'
6428
 
6429
+ # Vizio (vizio.com)
6430
  Vizio:
6431
+ regex: 'Vizio|(?:VAP430|VTAB1008|XR6[PM]10)(?:[);/ ]|$)'
6432
  device: 'tv'
6433
  models:
6434
  - regex: 'VAP430'
6435
  model: 'VAP430'
6436
+ - regex: '(VTAB1008|XR6[PM]10)'
6437
  device: 'tablet'
6438
+ model: '$1'
6439
 
6440
  # GOCLEVER
6441
  GOCLEVER:
6454
  - regex: 'TQ700N'
6455
  model: 'QUANTUM 700N'
6456
  device: 'tablet'
6457
+ - regex: 'QUANTUM_1010_Lite'
6458
+ model: 'Quantum 1010 Lite'
6459
+ device: 'tablet'
6460
+ - regex: 'QUANTUM_1010_Lite'
6461
+ model: 'Quantum 1010 Lite'
6462
+ device: 'tablet'
6463
  - regex: 'Quantum2 500'
6464
  model: 'Quantum 2 500'
6465
+ - regex: 'QUANTUM[_ ]([45]00)[_ ]LITE'
6466
+ model: 'Quantum $1 Lite'
6467
  - regex: '((?:QUANTUM|ARIES|INSIGNIA|ORION|ELIPSO)[ _-]?[^;/]+)(?: Build|\))'
6468
  model: '$1'
6469
  - regex: 'GOCLEVER[ _-]TAB[ _-]?([^;/]+) Build'
6495
  - regex: 'GO([0-9]{3,4})'
6496
  model: 'Go$1'
6497
 
6498
+ # Explay
6499
+ Explay:
6500
+ regex: 'Explay|[\w]+-EXPLAY-FIN|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-4]|RioPlay|Leader|Pulsar|Infinityll|Imperium[78]|Indigo|Lagoon|Tornado(?! 348)(?:3G)?|Onyx(?!_[A-Z]{1,2})'
6501
+ device: 'tablet'
6502
+ models:
6503
+ - regex: 'ActiveD[ _]7.4[ _]3G'
6504
+ model: 'ActiveD 7.4 3G'
6505
+ - regex: 'Imperium([78])(?:[);/ ]|$)'
6506
+ model: 'Imperium $1 3G'
6507
+ - regex: 'ActiveD[ _]8.2[ _]3G'
6508
+ model: 'ActiveD 8.2 3G'
6509
+ - regex: 'CinemaTV[ _]3G'
6510
+ model: 'CinemaTV 3G'
6511
+ - regex: 'Infinityll'
6512
+ model: 'Infinity II'
6513
+ - regex: 'Informer[ _]([0-9]+(?:[ _]3G)?)'
6514
+ model: 'Informer $1'
6515
+ - regex: 'Surfer[ _]([0-9\.]+(?:[ _]3G)?)'
6516
+ model: 'Surfer $1'
6517
+ - regex: 'sQuad[ _]([0-9\.]+(?:[ _]3G)?)'
6518
+ model: 'sQuad $1'
6519
+ - regex: 'Onliner([1-4])'
6520
+ model: 'Onliner $1'
6521
+ - regex: 'Atlant(?:[);/ ]|$)'
6522
+ device: 'smartphone'
6523
+ model: 'Atlant'
6524
+ - regex: 'Indigo(?:[);/ ]|$)'
6525
+ device: 'smartphone'
6526
+ model: 'Indigo'
6527
+ - regex: 'Pulsar(?:[);/ ]|$)'
6528
+ device: 'smartphone'
6529
+ model: 'Pulsar'
6530
+ - regex: 'Tornado(?:3G)?(?:[);/ ]|$)'
6531
+ device: 'smartphone'
6532
+ model: 'Tornado 3G'
6533
+ - regex: 'Onyx(?:[);/ ]|$)'
6534
+ device: 'smartphone'
6535
+ model: 'Onyx'
6536
+ - regex: '[\w]+-EXPLAY-FIN'
6537
+ device: 'feature phone'
6538
+ model: 'Fin'
6539
+
6540
+ - regex: 'Lagoon(?:[);/ ]|$)'
6541
+ model: 'Lagoon'
6542
+ - regex: 'Explay[ _-]([^;/]+)(?: Build|[;)])'
6543
+ model: '$1'
6544
+ - regex: 'RioPlay(?:[);/ ]|$)'
6545
+ device: 'smartphone'
6546
+ model: 'Rio Play'
6547
+ - regex: 'Leader'
6548
+ model: 'Leader'
6549
+
6550
  # Gol Mobile (gol-mobile.com)
6551
  Gol Mobile:
6552
  regex: 'F10_PRIME'
6567
 
6568
  # Google
6569
  Google:
6570
+ regex: 'Nexus|GoogleTV|Google Fiber|Glass(?<!Browser)|CrKey[^a-z0-9]|Pixel(?: Build|\))|Pixel (?:XL|C|[2-5]|[2-4] XL)|Google 2XL|G011A'
6571
  device: 'smartphone'
6572
  models:
6573
  - regex: 'Glass'
6582
  - regex: '(Nexus (?:7|9|10))'
6583
  device: 'tablet'
6584
  model: '$1'
6585
+ # explicit tv models
6586
+ - regex: '(GFHD[12]00)'
6587
+ device: 'tv'
6588
+ model: 'Fiber $1'
6589
  - regex: 'CrKey[^a-z0-9]'
6590
  model: 'Chromecast'
6591
  device: 'tv'
6592
  - regex: 'GoogleTV'
6593
  device: 'tv'
6594
  model: 'GoogleTV'
6595
+ # explicit smartphone models
6596
  - regex: 'Pixel(?: Build|\))'
6597
  model: 'Pixel'
6598
  - regex: 'Pixel XL'
6803
  device: 'tv'
6804
  model: '$1'
6805
 
6806
+ - regex: '(?:HS-)?Hisense ([^;/)]+) Pro(?: Build|[);])'
6807
+ model: '$1 Pro'
6808
+ - regex: '(?:HS-)?Hisense ([^;/)]+) Plus(?: Build|[);])'
6809
+ model: '$1 Plus'
6810
+ - regex: '(?:HS-)?Hisense ([^;/)]+)(?: Build|[);])'
6811
  model: '$1'
6812
+ - regex: '(?:HS-)?Hisense ([^/]+)/'
6813
  model: '$1'
6814
 
6815
  # Hi-Level
6831
 
6832
  # Homtom
6833
  Homtom:
6834
+ regex: 'Homtom|(?:HT[0-9]{1,2}(?: ?Pro)?)(?:[);/ ]|$)'
6835
  device: 'smartphone'
6836
  models:
6837
  - regex: '(?:Homtom[_ ])?HT ?([0-9]{1,2}(?: ?Pro)?)(?:[);/ ]|$)'
6886
 
6887
  # Huawei
6888
  Huawei:
6889
+ regex: '(HW-)?(?:Huawei(?!Browser)|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANA|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|FRL|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JEF|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PPA|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|YOK-AN00|NIC-LX1A|MRX-(AL09|W09)|CDY-(?:[AT]N00|AN[29]0|NX9[AB])|GLK-(?:[AT]L00|LX1U)|JER-(?:AN20|[AT]N10)|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL[02]0|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?|L28)|MED-(?:[AT]L00|LX9N?)|EBG-(?:AN[01]0|TN00)|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-[AT]N00|JKM-AL00[ab]|TAH-(?:N29|AN00)m|C8817D|T1-821W|d-01[JK]|d-02[HK]|KRJ-W09|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|NOH-(?:NX9|AN00)|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-[LW]09|AGS3-[WL]09|DNN-LX9|NEY-NX9|LON-AL00|HLK-L41|503HW|AGR-[LW]09|PPA-LX[12]|ANG-AN00|NOP-AN00|ALA-AN70|DVC-[AT]N20|302HW'
6890
  device: 'smartphone'
6891
  models:
6892
  - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
6951
  model: 'Enjoy 8e'
6952
  - regex: 'MRD-[TA]L00(?:[);/ ]|$)'
6953
  model: 'Enjoy 9e'
6954
+ - regex: 'DVC-[AT]N20(?:[);/ ]|$)'
6955
  model: 'Enjoy 20 Pro'
6956
  - regex: 'U8665(?:[);/ ]|$)'
6957
  model: 'Fusion 2'
6991
  model: 'Honor 20 Pro'
6992
  - regex: '(MAR-LX1H|YAL-AL50)(?:[);/ ]|$)'
6993
  model: 'Honor 20S'
6994
+ - regex: '(?:BMH-AN[12]0)(?:[);/ ]|$)'
6995
  model: 'Honor 30'
6996
  - regex: 'EBG-[AT]N00(?:[);/ ]|$)'
6997
  model: 'Honor 30 Pro'
7001
  model: 'Honor 30S'
7002
  - regex: 'LRA-LX1(?:[);/ ]|$)'
7003
  model: 'Honor 30I'
7004
+ - regex: 'MXW-[AT]N00(?:[);/ ]|$)'
7005
+ model: 'Honor 30 Lite'
7006
  - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?(?:[);/ ]|$)'
7007
  model: 'Honor 3C'
7008
  - regex: 'Hol-U19(?:[);/ ]|$)'
7113
  model: 'Honor P40'
7114
  - regex: 'COR-(?:AL[01]0|L29|TL10)(?:[);/ ]|$)'
7115
  model: 'Honor Play'
7116
+ - regex: 'ASK-AL(00x|20)(?:[);/ ]|$)'
7117
  model: 'Honor Play 3'
7118
  - regex: 'KSA-AL10(?:[);/ ]|$)'
7119
  model: 'Honor Play 3E'
7133
  model: 'Honor V10'
7134
  - regex: 'PCT-[TA]L10(?:[);/ ]|$)'
7135
  model: 'Honor V20'
7136
+ - regex: 'YOK-AN10(?:[);/ ]|$)'
7137
+ model: 'Honor V40'
7138
  - regex: 'KNT-(?:AL[12]0|[TU]L10)(?:[);/ ]|$)'
7139
  model: 'Honor V8'
7140
  - regex: 'DUK-AL20(?:[);/ ]|$)'
7149
  model: 'Honor View 30'
7150
  - regex: 'OXF-AN10(?:[);/ ]|$)'
7151
  model: 'Honor View 30 Pro'
7152
+ - regex: '(?:Honor_|HW-)?SCL-L(0[1-4]|21|32)(?:_TD)?(?:[);/ ]|$)'
7153
  model: 'Honor Y6'
7154
  - regex: '(?:Honor_|HW-)?LYO-L21(?:[);/ ]|$)'
7155
  model: 'Honor Y6 II Compact'
7159
  model: 'Honor X10 Max'
7160
  - regex: 'DNN-LX9(?:[);/ ]|$)'
7161
  model: 'Honor X10 Lite'
7162
+ - regex: 'ALA-AN70(?:[);/ ]|$)'
7163
+ model: 'Honor V40 Lite'
7164
  - regex: 'U8500(?:[);/ ]|$)'
7165
  model: 'Ideos X2'
7166
  - regex: 'U8510(?:[);/ ]|$)'
7223
  model: 'Nova'
7224
  - regex: '608HW(?:[);/ ]|$)'
7225
  model: 'Nova Lite'
7226
+ - regex: 'MLA-L11(?:[);/ ]|$)'
7227
+ model: 'Nova Plus'
7228
  - regex: '(?:PIC-(?:[AT]L00|LX9)|HWV31)(?:[);/ ]|$)'
7229
  model: 'Nova 2'
7230
  - regex: '704HW(?:[);/ ]|$)'
7263
  model: 'Nova 6 SE'
7264
  - regex: 'JEF-(?:[AT]N00|AN20|NX9)(?:[);/ ]|$)'
7265
  model: 'Nova 7 5G'
7266
+ - regex: 'JER-(?:[AT]N10|AN20)(?:[);/ ]|$)'
7267
  model: 'Nova 7 Pro 5G'
7268
+ - regex: 'CDY-(?:[AT]N00|NX9B|AN20)(?:[);/ ]|$)'
7269
  model: 'Nova 7 SE 5G'
7270
  - regex: 'JNY-LX2(?:[);/ ]|$)'
7271
  model: 'Nova 7i'
7301
  model: 'P20 Pro'
7302
  - regex: '(ELE-L(?:04|09|29)|ELE-[AT]L00)(?:[);/ ]|$)'
7303
  model: 'P30'
7304
+ - regex: '(?:MAR-(?:LX(?:1[BM]|2B|[13]Am?|2J?|3BM)|TL00)|NIC-LX1A|HWV33)(?:[);/ ]|$)'
7305
  model: 'P30 Lite'
 
 
7306
  - regex: '(?:VOG-(?:L(?:04|09|29)|TL00|AL10)|HW-02L)(?:[);/ ]|$)'
7307
  model: 'P30 Pro'
7308
  - regex: 'ANA-LX4(?:[);/ ]|$)'
7319
  model: 'P40 Pro Plus'
7320
  - regex: 'GRA-(?:L09|UL00)(?:[);/ ]|$)'
7321
  model: 'P8'
7322
+ - regex: '(?:ALE-L(?:02|21|23)|ALE-[TUC]L00|503HW)(?:[);/ ]|$)'
7323
  model: 'P8 Lite (2015)'
7324
  - regex: '(?:PRA-L(?:A1|X2|X1|X3)|hi6210sft)(?:[);/ ]|$)'
7325
  model: 'P8 Lite (2017)'
7419
  model: 'Y9 Prime (2019)'
7420
  - regex: 'FRL-L2[23](?:[);/ ]|$)'
7421
  model: 'Y9a'
7422
+ - regex: '302HW(?:[);/ ]|$)'
7423
+ model: 'Stream S'
7424
 
7425
  - regex: 'HWT31(?:[);/ ]|$)'
7426
  model: 'Qua Tab 02 10.1"'
7497
  - regex: '(AGS2-AL00|JDN2-W09)HN(?:[);/ ]|$)'
7498
  device: 'tablet'
7499
  model: 'Honor Tab 5'
7500
+ - regex: 'AGS2-(?:[LW]09|W09HN|W19|L03)(?:[);/ ]|$)'
7501
  device: 'tablet'
7502
  model: 'MediaPad T5 10'
7503
  - regex: 'KOB2-[LW]09(?:[);/ ]|$)'
7703
 
7704
  # Irbis
7705
  Irbis:
7706
+ regex: 'IRBIS|TZ(1(?:0[04]|42|5[01]|84|65|7[01345-89]|8[356]|9[12578])|49|55|72|22|7(?:0[127]|1[1-4679]|2[021567]|3[025-8]|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[147])|8(?:[34]1|5[3-8]|6[2-5]|7[12478]|8[1-5]|9[0127])|96[0-9])|TZ85|TZ13|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
7707
  device: 'tablet'
7708
  models:
7709
  - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
7760
 
7761
  # IconBIT
7762
  IconBIT:
7763
+ regex: 'IconBIT|NT-(3506M|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)|XDS[789]4K|Omnicast UHD|Movie Smart 4K|Movie IPTV Quad|TOUCAN (?:NANO|Stick) 4K'
7764
  device: 'tablet'
7765
  models:
7766
  - regex: 'NT-3506M'
7798
  model: 'NetTAB Matrix 3G duo'
7799
  - regex: 'NT-3703M'
7800
  model: 'NetTAB Matrix 3GT'
7801
+ - regex: 'MATRIX ULTRA'
7802
+ model: 'NetTAB Matrix Ultra'
7803
 
7804
+ - regex: 'TOUCAN NANO 4K'
7805
+ model: 'Toucan Nano 4K'
7806
+ device: 'tv'
7807
+ - regex: 'TOUCAN Stick 4K'
7808
+ model: 'Toucan Stick 4K'
7809
+ device: 'tv'
7810
  - regex: '(?:iconBIT )?(Movie Smart 4K|Movie IPTV Quad|Movie Ultra HD 4K|XDS[789]4K|Omnicast UHD)'
7811
  model: '$1'
7812
  device: 'tv'
7886
 
7887
  # Lumus
7888
  Lumus:
7889
+ regex: '(?:NEO(SR620|SC600)|INNOSR545|Lumus[_ ]Ion|AEONSR570)(?:[);/ ]|$)'
7890
  device: 'smartphone'
7891
  models:
7892
  # explicit smartphone models
7896
  model: 'INNO $1'
7897
  - regex: 'Lumus[_ ]Ion(?:[);/ ]|$)'
7898
  model: 'Ion'
7899
+ - regex: 'AEON(SR570)(?:[);/ ]|$)'
7900
+ model: 'AEON $1'
 
 
 
7901
  # M4tel
7902
  M4tel:
7903
  regex: 'M4 SS[0-9]{4}(?:-R)?|M4_B[23]'
8021
 
8022
  # iPro
8023
  iPro:
8024
+ regex: '(?:Kylin[ _]5.[05]S?|KYLIN40|Jade[78]s|Amber[67]S?|Amber5S_Pro|Phonenix50S|Zafiro|I9355A)(?:[);/ ]|$)'
8025
  device: 'smartphone'
8026
  models:
8027
  - regex: 'Kylin_5.0S'
8042
  model: 'Phonenix 50S'
8043
  - regex: 'Zafiro'
8044
  model: 'Zafiro'
8045
+ - regex: '(I9355A)'
8046
+ model: '$1'
8047
 
8048
  # Infinix
8049
  Infinix:
8300
  models:
8301
  - regex: 'IM0318ND'
8302
  model: 'Aqua Lions 3'
8303
+ - regex: 'AQUA[ _]LIONS[ _]T1[ _]LITE(?:[);/ ]|$)'
8304
+ model: 'Aqua Lions T1 Lite'
8305
+ - regex: 'AQUA[ _]LIONS[ _]([NT]1|[23]|E3)(?:[);/ ]|$)'
8306
+ model: 'Aqua Lions $1'
8307
+ - regex: 'AQUA (A4) PLUS(?:[);/ ]|$)'
8308
+ model: 'Aqua $1 Plus'
8309
+ - regex: 'AQUA[ _](A4|S[13])(?:[);/ ]|$)'
8310
+ model: 'Aqua $1'
8311
+ - regex: 'AQUA CRYSTAL\+(?:[);/ ]|$)'
8312
+ model: 'Aqua Crystal Plus'
8313
+ - regex: 'AQUA FulVU e5(?:[);/ ]|$)'
8314
+ model: 'Aqua Fulvu E5'
8315
+ - regex: 'AQUA JEWEL 2(?:[);/ ]|$)'
8316
+ model: 'Aqua Jewel 2'
8317
  - regex: 'Intex[ _]([^/;]*)[ _]Build'
8318
  model: '$1'
8319
  - regex: '(Cloud (?:Fame|Glory) 4G)'
8559
 
8560
  # Kazam
8561
  Kazam:
8562
+ regex: 'Kazam|(?:Trooper_X[0-9][0-9]|Tornado 348|TROOPER 4\.0)(?:[);/ ]|$)'
8563
  device: 'smartphone'
8564
  models:
8565
  - regex: 'Tornado 348'
8692
 
8693
  # Komu
8694
  Komu:
8695
+ regex: 'Komu[_ -]'
8696
  device: 'smartphone'
8697
  models:
8698
+ - regex: 'Komu[_ -]([^;/]+) Build'
8699
  model: '$1'
8700
+ - regex: 'Komu[_ -]([a-z0-9_-]+)'
8701
  model: '$1'
8702
 
8703
  # Koobee
8734
 
8735
  # Kodak
8736
  Kodak:
8737
+ regex: 'KODAK|(?:IM5|KD50|Ektra|Smartway_T1)(?:[);/ ]|$)'
8738
  device: 'smartphone'
8739
  models:
8740
  - regex: 'IM5'
8741
  model: 'IM5'
8742
+ - regex: 'KD50'
8743
+ model: 'Seren KD50'
8744
  - regex: 'Ektra(?:[);/ ]|$)'
8745
  model: 'Ektra'
8746
+ - regex: '(?:KODAK[_ ])?SMARTWAY[_ ]([MTX]1|T3)'
8747
  model: 'Smartway $1'
8748
  - regex: 'Tablet (7|10)'
8749
  device: 'tablet'
8793
 
8794
  # kyocera (kyocera.co.jp, kyocera.com)
8795
  Kyocera:
8796
+ regex: 'Kyocera|KWC-|QC-[0-9]{4}|(?:QC6035|NP501KC|302KC|503KC|602KC|705KC|901KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[1-9]|KYT3[123]|KYF3[123579]|KYF40|KYX31|KYG01|KYY2[1-4]|S2151|KC-S701|S[468]-KC|KYV40U?|KYV4[1-8]|KYV4[47]|KC-S301AE|X3-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|SZJ-JS201|[47]04KC|A001KC|WX10K|URBANO PROGRESSO|E7110)(?:[-_]u2?)?(?:[);/ ]|$)'
8797
  device: 'smartphone'
8798
  models:
8799
  # explicit smartphone models
8849
  model: 'DuraForce'
8850
  - regex: 'E6810'
8851
  model: 'DuraForce Pro'
8852
+ - regex: '(?:KYOCERA-)?E69[12]0'
8853
  model: 'DuraForce Pro 2'
8854
  - regex: 'E7110'
8855
  model: 'DuraForce Ultra 5G'
8881
  model: 'Torque G03'
8882
  - regex: 'KYV46(?:[);/ ]|$)'
8883
  model: 'Torque G04'
8884
+ - regex: 'KYV32?(?:[);/ ]|$)'
8885
+ model: 'Basio'
8886
  - regex: 'KYV47(?:-u)?(?:[);/ ]|$)'
8887
  model: 'Basio 4'
8888
  - regex: 'KYV43(?:[);/ ]|$)'
8928
  model: 'Brigadier'
8929
  - regex: 'E6782L(?:[);/ ]|$)'
8930
  model: 'DuraScout'
8931
+ - regex: '(KC-S301AE|SZJ-JS201)(?:[);/ ]|$)'
8932
  model: '$1'
8933
  - regex: 'A001KC(?:[);/ ]|$)'
8934
  model: 'Katan Sumaho 2'
8956
  model: 'MOVE 8 Mini'
8957
  - regex: 'MOVE_6_mini'
8958
  model: 'MOVE 6 Mini'
8959
+ - regex: 'MOVE[_ ]([78]|6S?)'
8960
  model: 'MOVE $1'
8961
  - regex: 'DRIVE 4 mini LTE'
8962
  model: 'DRIVE 4 mini LTE'
9017
 
9018
  # Lava (Lavamobiles.com)
9019
  Lava:
9020
+ regex: 'Lava[ _]|LAVAA1|(?:DISCOVER136|KKT QUADRA)|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Pixel V2\+?|Z60s|Z61_2GB|A97 IPS|A97 2GB PLUS|L[EH]9920(?:[_ ]P)?|L[NEH]9910|LH9810|Ivory(?:S1|S4G)?|A76Plus)(?:[);/ ]|$)'
9021
  device: 'smartphone'
9022
  models:
9023
  # explicit smartphone models
9029
  model: 'A97 2GB Plus'
9030
  - regex: 'A76Plus(?:[);/ ]|$)'
9031
  model: 'A76 Plus'
9032
+ - regex: 'Pixel V2\+(?:[);/ ]|$)'
9033
+ model: 'Pixel V2 Plus'
9034
  - regex: 'Pixel ?V([12])(?:[);/ ]|$)'
9035
  model: 'Pixel V$1'
9036
  - regex: 'X1 Selfie(?:[);/ ]|$)'
9043
  model: 'R1'
9044
  - regex: 'Z61_2GB(?:[);/ ]|$)'
9045
  model: 'Z61'
9046
+ - regex: 'Z60s(?:[);/ ]|$)'
9047
+ model: 'Z60s'
9048
  - regex: 'LE9920[ _]P(?:[);/ ]|$)'
9049
  model: 'V7'
9050
  - regex: 'LE9920(?:[);/ ]|$)'
9074
  device: 'tablet'
9075
  model: 'Ivory $1'
9076
  # explicit general
9077
+ - regex: 'iris[ _]?([^/;)]+)(?: Build|[);])'
9078
  model: 'Iris $1'
9079
+ - regex: 'Lava[ _]?([^/;)]+)(?: Build|[);])'
9080
+ model: '$1'
9081
+ - regex: 'LAVA[ _]([^/;)]+)/MIDP'
9082
+ device: 'feature phone'
9083
  model: '$1'
9084
 
9085
  # SKG (skgmobile.net | skgmobile.com)
9100
 
9101
  # Land Rover
9102
  Land Rover:
9103
+ regex: 'Land[ ]?Rover[d]?[ _-](?:X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)|Polar3|Vphone[- ]X3'
9104
  device: 'smartphone'
9105
  models:
9106
  - regex: 'Land[ ]?Rover[d]?[ _-](X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)'
9107
  model: '$1'
9108
+ - regex: 'Vphone[- ]X3'
9109
+ model: 'Vphone X3'
9110
  - regex: 'Polar3'
9111
  model: 'Ioutdoor Polar 3'
9112
 
9191
 
9192
  # Leagoo
9193
  Leagoo:
9194
+ regex: '(?:MY)?LEAGOO[ _-]?|(?:Shark 5000|M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _](?:X|7s)|Elite [15]|Venture 1|Z10-E)(?:[);/ ]|$)'
9195
  device: 'smartphone'
9196
  models:
9197
  - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
9198
  model: 'M8 Pro'
9199
+ - regex: 'LEAGOO[- _](Z[156]|Z5c|M[58]|T1)(?:[);/ ]|$)'
9200
  model: '$1'
9201
  - regex: 'M5 EDGE'
9202
  model: 'M5 Edge'
9208
  model: 'KICCAA Mix'
9209
  - regex: 'Elite ([15])(?:[);/ ]|$)'
9210
  model: 'Elite $1'
9211
+ - regex: 'Shark 5000(?:[);/ ]|$)'
9212
+ model: 'Shark 5000'
9213
  - regex: 'Venture 1(?:[);/ ]|$)'
9214
  model: 'Venture 1'
9215
  - regex: '(?:LEAGOO[- _])?(Z10-E|M6)(?:[);/ ]|$)'
9246
  model: '$1'
9247
  - regex: 'X900 Build'
9248
  model: 'Le X900'
9249
+ - regex: 'LEX72[07](?:[);/ ]|$)'
9250
+ model: 'Le Pro 3'
9251
  - regex: '(?:Le ?X526|Le2[_ ]x527|Le 2|X52[67])(?:[);/ ]|$)'
9252
  model: 'Le 2'
9253
+ - regex: 'LEX820'
9254
+ model: 'Le Max 2'
9255
  - regex: 'Le ?X([^;/]+) Build'
9256
  model: 'Le X$1'
9257
  - regex: 'Le ?X([^) ;/]+)'
9265
  - regex: 'LeEco ([^;/]+) Build'
9266
  model: '$1'
9267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9268
  # Lephone
9269
  Lephone:
9270
  regex: 'lephone[ _]|lephoneP1'
9284
  device: 'tablet'
9285
  model: '$1'
9286
 
9287
+ # Aligator
9288
+ Aligator:
9289
+ regex: 'ALIGATOR[_ ]'
9290
+ device: 'smartphone'
9291
+ models:
9292
+ - regex: 'ALIGATOR[ _](S4080|S50(?:6[56]|[678]0)|S5540|RX510|S6[05]00|RX710|RX800|S5520)(?:[);/ ]|$)'
9293
+ model: '$1'
9294
+
9295
  # lenovo (lenovo.com)
9296
  Lenovo:
9297
  regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:X103F|8504F|X304F|X704V|X704A)|A5500-H|A2107A-H|A3500-HV|A2109A|S6000|Z2 Plus|Vibe[ _](?:P1|S6i Plus|S[23567]i|C|[ZX]2|K5(?: Plus)?|V7)|P2A42|L38011|L18011|[5-8]01LV|[67]02LV|Z2131|K350t|K31-t3|TAB 2 A8-50LC|S90-A|P70-A|VR-1541F)(?:[);/ ]|$)'
9399
  - regex: 'TB-X606[FXV](?:[);/ ]|$)'
9400
  model: 'Tab M10 FHD Plus'
9401
  device: 'tablet'
9402
+ - regex: 'TB-7305I(?:[);/ ]|$)'
9403
+ model: 'Tab M7'
9404
+ device: 'tablet'
9405
  - regex: 'Lenovo ?B8000(-[FH])?'
9406
  model: 'Yoga Tablet 10'
9407
  device: 'tablet'
9429
  - regex: 'YT-X703L'
9430
  model: 'Yoga Tab 3 Plus'
9431
  device: 'tablet'
9432
+ - regex: 'YT-X705[FL]'
9433
+ model: 'Yoga Smart Tab'
9434
+ device: 'tablet'
9435
 
9436
  - regex: 'S6000(?:[);/ ]|$)'
9437
  model: 'IdeaTab S6000'
9475
  - regex: 'IdeaTab[ \-_]?([a-z0-9]+)'
9476
  model: 'IdeaTab $1'
9477
  device: 'tablet'
9478
+ - regex: 'YB-Q501F' # tablet/pc
9479
+ model: 'Yoga A12'
9480
+ device: 'tablet'
9481
+ - regex: 'YT-X705X'
9482
+ model: 'Yoga Smart Tab'
9483
+ device: 'tablet'
9484
  - regex: 'Yoga Tablet([^;/]+) Build'
9485
  model: 'Yoga Tablet$1'
9486
  device: 'tablet'
9510
  model: 'ZUK $1'
9511
  - regex: 'K10a40(?:[);/ ]|$)'
9512
  model: 'C2'
9513
+ - regex: '(?:k50a40|K50-t5)(?:[);/ ]|$)'
9514
  model: 'K3 Note'
9515
  - regex: 'A7010a48(?:[);/ ]|$)'
9516
  model: 'K4 Note'
9518
  model: 'K5'
9519
  - regex: 'L38011(?:[);/ ]|$)'
9520
  model: 'K5 Play'
9521
+ - regex: '(?:A7020a4[08]|L38012)(?:[);/ ]|$)'
9522
  model: 'K5 Note'
9523
  - regex: 'K31-t3(?:[);/ ]|$)'
9524
  model: 'K31'
9562
  model: 'Vibe S1'
9563
  - regex: 'L78071(?:[);/ ]|$)'
9564
  model: 'Z5s'
9565
+ - regex: 'L78011(?:[);/ ]|$)'
9566
+ model: 'Z5'
9567
+ - regex: 'L78031(?:[);/ ]|$)'
9568
+ model: 'Z5 Pro'
9569
  - regex: 'L58041(?:[);/ ]|$)'
9570
  model: 'S5 Pro'
9571
  - regex: 'L18021(?:[);/ ]|$)'
9572
  model: 'A3'
9573
+ - regex: 'PB2-6(?:70M|50Y)(?:[);/ ]|$)'
9574
  model: 'Phab 2'
9575
  - regex: '(S90-A|P70-A)(?:[);/ ]|$)'
9576
  model: '$1'
9693
 
9694
  # LG
9695
  LG:
9696
+ regex: 'LG|Web0S; Linux/SmartTV|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|VS820|VS870 4G|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05[DE]|L-03K|L-01[LJK]|L-52A|L-[45]1A|901LG|A001LG|80[12]LG|402LG|LGT32|L-02K|L-01F|LM-V40|DM-01K|DM-02H|LMX130IM|VS810PP|VS425'
9697
  device: 'smartphone'
9698
  models:
9699
+ - regex: 'DM-(01K|02H)'
9700
+ model: 'Disney Mobile DM-$1'
9701
+ - regex: 'LG-D32[05]'
9702
  model: 'L70'
9703
+ - regex: 'LG-D315'
9704
+ model: 'F70'
9705
+ - regex: 'LG-D4(?:[01]5|10)'
9706
+ model: 'L90'
9707
+ - regex: 'LG-D373'
9708
+ model: 'L80'
9709
  - regex: 'LG-D340F8'
9710
  model: 'L70 Tri'
9711
+ - regex: 'LG-X145'
9712
+ model: 'L60'
9713
+ - regex: 'LG-D285'
9714
+ model: 'L65'
9715
  - regex: 'LM-X210APM'
9716
  model: 'Phoenix 4'
9717
  - regex: 'LG-P505R'
9720
  model: 'Zone 4'
9721
  - regex: 'LM-X220PM'
9722
  model: 'Tribute Empire'
9723
+ - regex: 'LGLS675'
9724
+ model: 'Tribute 5'
9725
+ - regex: 'VS980|L-01F|LG-F320L'
9726
  model: 'G2'
9727
  - regex: 'LG-D6(?:18|20)'
9728
  model: 'G2 Mini'
9729
+ - regex: 'LG-D85[01258]|VS985|LGLS990'
9730
  model: 'G3'
9731
+ - regex: 'LG-D72[23568]'
9732
  model: 'G3 Beat'
9733
+ - regex: 'LG-F460'
9734
+ model: 'G3 Cat. 6'
9735
+ - regex: 'LG-D724'
9736
+ model: 'G3s'
9737
+ - regex: 'LG-H81[012589]|LG-?[LU]S991|LGV32|LG-F500[LSK]'
9738
  model: 'G4'
9739
  - regex: 'LG-H525n?'
9740
  model: 'G4c'
9744
  model: 'G4s'
9745
  - regex: 'LG-H735'
9746
  model: 'G4 Beat'
9747
+ - regex: 'LG-H8(?:20|3[01]|5[08]|6[08])|VS987|RS988|LG-F700[SKL]|LG-?LS992'
9748
  model: 'G5'
9749
  - regex: 'LG-H84[05]'
9750
  model: 'G5 SE'
9751
+ - regex: 'VS988|LG-H87(?:[01](?:DS|[SI]|AR)?|[23])|LG-?US997|LGM-G600[SL]|LG-AS993'
9752
  model: 'G6'
9753
  - regex: 'LM-Q850'
9754
  model: 'G7 Fit'
9755
  - regex: 'LM-Q910'
9756
  model: 'G7 One'
9757
+ - regex: 'LGL23(?:[);/ ]|$)'
9758
+ model: 'G Flex'
9759
+ - regex: 'LG-D680'
9760
+ model: 'G Pro Lite'
9761
  - regex: 'LM-G820(N|QM[0127]|UMB)?'
9762
  model: 'G8'
9763
  - regex: 'LM-G850'
9766
  model: 'G8S ThinQ'
9767
  - regex: '901LG(?:[);/ ]|$)'
9768
  model: 'G8X ThinQ'
9769
+ - regex: 'LG-H410(?:[);/ ]|$)'
9770
+ model: 'Wine Smart H410'
9771
  - regex: 'VS501|LM-X120'
9772
  model: 'K20'
9773
+ - regex: '(?:LG-)?H50[02]'
9774
  model: 'Magna'
9775
+ - regex: 'LG-(?:X15[05]|X165g)'
9776
+ model: 'Bello 2'
9777
+ - regex: 'LG-D335'
9778
+ model: 'L Bello'
9779
+ - regex: 'LG-D29[05]'
9780
+ model: 'L Fino'
9781
  - regex: '(?:LG-)?H343'
9782
  model: 'Risio'
9783
  - regex: '(?:LG-)?H650'
9784
  model: 'Zero'
9785
  - regex: '(?:LG-)?M154'
9786
  model: 'Risio 2'
9787
+ - regex: 'LGM-K120[LSK]'
9788
+ model: 'X300'
9789
  - regex: '(?:LG-)?P500H'
9790
  model: 'Optimus One'
9791
  - regex: '(L-05[DE])(?:[);/ ]|$)'
9800
  model: 'PRADA phone L-02D'
9801
  - regex: 'L-07C'
9802
  model: 'Optimus Bright L-07C'
9803
+ - regex: '(?:LG-)?(?:F800[SKL]?|H990|US996)'
9804
  model: 'V20'
9805
  - regex: 'LM-Q710(?:\(FGN\)|[\.]?FGN)'
9806
  model: 'Q Stylus Plus'
9807
  - regex: '801LG'
9808
  model: 'Q Stylus'
9809
+ - regex: 'LG-M400'
9810
+ model: 'Stylus 3'
9811
+ - regex: 'LG-K520'
9812
+ model: 'Stylus 2'
9813
  - regex: 'LM-Q[67]10\.FG(?:[);/ ]|$)'
9814
  model: 'Q7'
9815
  - regex: 'LM-(Q725[KL]|Q610.FGN)(?:[);/ ]|$)'
9816
  model: 'Q7+'
9817
  - regex: 'LM-Q815[SL](?:[);/ ]|$)'
9818
  model: 'Q8+'
9819
+ - regex: 'LM-Q925[LKS](?:[);/ ]|$)'
9820
  model: 'Q9'
9821
+ - regex: 'LM-(?:Q730N|Q620)(?:[);/ ]|$)'
9822
  model: 'Q70'
9823
  - regex: 'LGV33(?:[);/ ]|$)'
9824
  model: 'Qua Phone PX'
9828
  model: 'Style 2'
9829
  - regex: 'VS835(?:[);/ ]|$)'
9830
  model: 'Stylo 2 V'
9831
+ - regex: 'LGMS550'
9832
+ model: 'Stylo 2 Plus'
9833
  - regex: 'L-41A(?:[);/ ]|$)'
9834
  model: 'Style 3'
9835
+ - regex: 'LG-?(?:MS631)(?:[);/ ]|$)'
9836
+ model: 'G Stylo'
9837
+ - regex: 'LG-?(?:LS777|L84VL|M430)(?:[);/ ]|$)'
9838
+ model: 'Stylo 3'
9839
+ - regex: 'LG-?(TP450)(?:[);/ ]|$)'
9840
+ model: 'Stylo 3 Plus'
9841
+ - regex: 'LM-Q710|LML713DL|LG-Q710[AP]L'
9842
  model: 'Stylo 4'
9843
  - regex: '(?:LM-Q720|LGL722DL)(?:[);/ ]|$)'
9844
  model: 'Stylo 5'
9845
  - regex: 'LM-Q730(?:[);/ ]|$)'
9846
  model: 'Stylo 6'
9847
+ - regex: 'LM-G710(N|VM)?|LG-G710'
9848
  model: 'G7 ThinQ'
9849
  - regex: 'LM-X210CM'
9850
  model: 'Fortune 2'
9851
+ - regex: 'LM-X410\.FG?(?:[);/ ]|$)'
9852
  model: 'Premier Pro'
9853
+ - regex: 'LGL455DL(?:[);/ ]|$)'
9854
+ model: 'Premier Pro Plus'
9855
  - regex: 'LML41[34]DL(?:[);/ ]|$)'
9856
  model: 'Premier Pro LTE'
9857
  - regex: 'LM-X525'
9858
  model: 'Q60'
9859
+ - regex: 'LGL423DL'
9860
+ model: 'Solo LTE'
9861
  - regex: 'LM-X210K'
9862
  model: 'X2'
9863
  - regex: 'LG-K580'
9864
  model: 'X Cam'
9865
+ - regex: 'LG-(?:SP320|M327)'
9866
+ model: 'X Charge'
9867
+ - regex: 'LG-K200|LGLS676'
9868
+ model: 'X Style'
9869
+ - regex: 'LG-K500'
9870
+ model: 'X Screen'
9871
+ - regex: 'LG-M710'
9872
+ model: 'X Venture'
9873
  - regex: 'LM-X510WM'
9874
  model: 'X Power 3'
9875
  - regex: 'LM-X(?:41[05]K|410S)'
9878
  model: 'X4+'
9879
  - regex: 'LM-X410(?:\.FN|\(FG\))'
9880
  model: 'K11'
9881
+ - regex: 'LM-X(?:320|410[UP]M)|LGL322DL'
9882
  model: 'K30'
9883
  - regex: 'LMX130IM'
9884
  model: 'W10'
9885
+ - regex: 'LG-H522'
9886
+ model: 'Prime Plus 4G'
9887
+ - regex: 'LGL58VL'
9888
+ model: 'Rabel 2'
9889
+ - regex: 'LG-X190'
9890
+ model: 'Ray'
9891
  - regex: 'LM-X410'
9892
  model: 'LM-X410'
9893
+ - regex: 'LGM-K121S'
9894
+ model: 'X400'
9895
  - regex: 'LM-X420N'
9896
  model: 'X4 (2019)'
9897
+