Slimstat Analytics - Version 4.8.8

Version Description

  • [New] Implemented new FingerPrintJs2 library in the tracker. Your visitors are now associated with a unique identifier that does not rely on cookies, IP address or other unreliable information. This will allow Slimstat to produce more accurate results in terms of session lenghts, user patterns and much more.
  • [New] Added event handler for 'beforeunload', which will allow the tracker to better meausure the time spent by your visitors on each page. This will make our upcoming new charts even more accurate.
  • [Update] Improved algorithm that scans referrer URLs for search terms, and introduced a new list of search engines. Please help us improve this list by submitting your missing search engine entries.
  • [Update] Added title field to Slimstat widgets (thank you, jaroslawistok).
  • [Update] Reverted a change to the Top Web Pages report that was now combining URLs with a trailing slash and ones without one into one result. As James pointed out, this is a less accurate measure and hides the fact that people might be accessing the website in different ways.
  • [Update] The event tracker now annotates each event with information about the mouse button that was clicked and other useful data.
  • [Fix] The Country shortcode was not working as expected because of a change in how we handle localization files.
  • [Fix] Renamed slim_i18n class to avoid conflict with external libraries.
Download this release

Release Info

Developer coolmann
Plugin Icon 128x128 Slimstat Analytics
Version 4.8.8
Comparing to
See all releases

Code changes from version 4.8.7.3 to 4.8.8

CHANGELOG.md CHANGED
@@ -1,4 +1,14 @@
1
  ## Changelog ##
 
 
 
 
 
 
 
 
 
 
2
  ### 4.8.7.3 ###
3
  * [New] Implemented a simple query cache to minimize the number of requests needed to crunch and display the data in the reports.
4
  * [Update] Extended tracker to also record the 'fragment' portion of the URL, if available (this feature is only available in Client Mode).
1
  ## Changelog ##
2
+ ### 4.8.8 ###
3
+ * [New] Implemented new [FingerPrintJs2](https://github.com/Valve/fingerprintjs2) library in the tracker. Your visitors are now associated with a unique identifier that does not rely on cookies, IP address or other unreliable information. This will allow Slimstat to produce more accurate results in terms of session lenghts, user patterns and much more.
4
+ * [New] Added event handler for 'beforeunload', which will allow the tracker to better meausure the time spent by your visitors on each page. This will make our upcoming new charts even more accurate.
5
+ * [Update] Improved algorithm that scans referrer URLs for search terms, and introduced a new list of search engines. Please help us improve this list by submitting your missing search engine entries.
6
+ * [Update] Added title field to Slimstat widgets (thank you, [jaroslawistok](https://wordpress.org/support/topic/broken-layout-from-3rd-widget-in-footer/)).
7
+ * [Update] Reverted a change to the Top Web Pages report that was now combining URLs with a trailing slash and ones without one into one result. As James pointed out, this is a less accurate measure and hides the fact that people might be accessing the website in different ways.
8
+ * [Update] The event tracker now annotates each event with information about the mouse button that was clicked and other useful data.
9
+ * [Fix] The Country shortcode was not working as expected because of a change in how we handle localization files.
10
+ * [Fix] Renamed slim_i18n class to avoid conflict with external libraries.
11
+
12
  ### 4.8.7.3 ###
13
  * [New] Implemented a simple query cache to minimize the number of requests needed to crunch and display the data in the reports.
14
  * [Update] Extended tracker to also record the 'fragment' portion of the URL, if available (this feature is only available in Client Mode).
admin/assets/css/admin.css CHANGED
@@ -239,7 +239,7 @@
239
  float: right;
240
  }
241
  [id^=slim_] p span.pageview-screenres{
242
- margin-right: 10px;
243
  }
244
  [id^=slim_] a:hover{
245
  text-shadow: 0 0 2px #bbb;
239
  float: right;
240
  }
241
  [id^=slim_] p span.pageview-screenres{
242
+ margin-left: 10px;
243
  }
244
  [id^=slim_] a:hover{
245
  text-shadow: 0 0 2px #bbb;
admin/config/index.php CHANGED
@@ -513,7 +513,7 @@ var SlimStatParams = { ajaxurl: "' . admin_url( 'admin-ajax.php' ) . '" };
513
  'last_tracker_error' => array(
514
  'title' => __( 'Tracker Error', 'wp-slimstat' ),
515
  'type'=> 'plain-text',
516
- 'after_input_field' => !empty( $last_tracker_error ) ? '<strong>[' . date_i18n( get_option( 'date_format' ), $last_tracker_error[ 1 ], true ) . ' ' . date_i18n( get_option( 'time_format' ), $last_tracker_error[ 1 ], true ) . '] ' . $last_tracker_error[ 0 ] . ' ' . slim_i18n::get_string( 'e-' . $last_tracker_error[ 0 ] ) . '</strong><a class="slimstat-font-cancel" title="' . htmlentities( __( 'Reset this error', 'wp-slimstat' ), ENT_QUOTES, 'UTF-8' ) . '" href="' . wp_slimstat_admin::$config_url . $current_tab . '&amp;action=reset-tracker-error&amp;slimstat_update_settings=' . wp_create_nonce( 'slimstat_update_settings' ) . '"></a>' : __( 'So far so good.', 'wp-slimstat' ),
517
  'description'=> __( 'The information here above is useful to troubleshoot issues with the tracker. <strong>Errors</strong> are returned when the tracker could not record a page view for some reason, and are indicative of some kind of malfunction. Please include the message here above when sending a <a href="https://support.wp-slimstat.com" target="_blank">support request</a>.', 'wp-slimstat' )
518
  ),
519
  'show_sql_debug' => array(
@@ -577,6 +577,9 @@ if ( version_compare( PHP_VERSION, '7.1', '>=' ) ) {
577
  // Allow third-party tools to add their own settings
578
  $settings = apply_filters( 'slimstat_options_on_page', $settings );
579
 
 
 
 
580
  // Save options
581
  $save_messages = array();
582
  if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) && wp_verify_nonce( $_REQUEST[ 'slimstat_update_settings' ], 'slimstat_update_settings' ) ) {
@@ -613,6 +616,7 @@ if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) &&
613
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_resource_idx( resource( 20 ) )" );
614
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_browser_idx( browser( 10 ) )" );
615
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_searchterms_idx( searchterms( 15 ) )" );
 
616
  $save_messages[] = __( 'Congratulations! Slimstat Analytics is now optimized for <a href="https://www.youtube.com/watch?v=ygE01sOhzz0" target="_blank">ludicrous speed</a>.', 'wp-slimstat' );
617
  wp_slimstat::$settings[ 'db_indexes' ] = 'on';
618
  }
@@ -621,6 +625,7 @@ if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) &&
621
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats DROP INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_resource_idx" );
622
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats DROP INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_browser_idx");
623
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats DROP INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_searchterms_idx");
 
624
  $save_messages[] = __( 'Table indexes have been disabled. Enjoy the extra database space!', 'wp-slimstat' );
625
  wp_slimstat::$settings[ 'db_indexes' ] = 'no';
626
  }
@@ -629,7 +634,8 @@ if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) &&
629
  // MaxMind Data File
630
  if ( !empty( $_POST[ 'options' ][ 'enable_maxmind' ] ) ) {
631
  if ( $_POST[ 'options' ][ 'enable_maxmind' ] == 'on' && wp_slimstat::$settings[ 'enable_maxmind' ] == 'no' ) {
632
- $error = wp_slimstat::download_maxmind_database();
 
633
 
634
  if ( empty( $error ) ) {
635
  $save_messages[] = __( 'The geolocation database has been installed on your server.', 'wp-slimstat' );
@@ -640,7 +646,7 @@ if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) &&
640
  }
641
  }
642
  else if ( $_POST[ 'options' ][ 'enable_maxmind' ] == 'no' && wp_slimstat::$settings[ 'enable_maxmind' ] == 'on' ) {
643
- $is_deleted = @unlink( wp_slimstat::$maxmind_path );
644
 
645
  if ( $is_deleted ) {
646
  $save_messages[] = __( 'The geolocation database has been uninstalled from your server.', 'wp-slimstat' );
@@ -648,7 +654,7 @@ if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) &&
648
  }
649
  else {
650
  // Some users have reported that a directory is created, instead of a file
651
- $is_deleted = @rmdir( wp_slimstat::$maxmind_path );
652
 
653
  if ( $is_deleted ) {
654
  $save_messages[] = __( 'The geolocation database has been uninstalled from your server.', 'wp-slimstat' );
@@ -728,7 +734,7 @@ if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) &&
728
  }
729
 
730
  $maxmind_last_modified = '';
731
- if ( file_exists( wp_slimstat::$maxmind_path ) && false !== ( $file_stat = @stat( wp_slimstat::$maxmind_path ) ) ) {
732
  $maxmind_last_modified = date_i18n( get_option( 'date_format' ), $file_stat[ 'mtime' ] );
733
  }
734
 
513
  'last_tracker_error' => array(
514
  'title' => __( 'Tracker Error', 'wp-slimstat' ),
515
  'type'=> 'plain-text',
516
+ 'after_input_field' => !empty( $last_tracker_error ) ? '<strong>[' . date_i18n( get_option( 'date_format' ), $last_tracker_error[ 1 ], true ) . ' ' . date_i18n( get_option( 'time_format' ), $last_tracker_error[ 1 ], true ) . '] ' . $last_tracker_error[ 0 ] . ' ' . wp_slimstat_i18n::get_string( 'e-' . $last_tracker_error[ 0 ] ) . '</strong><a class="slimstat-font-cancel" title="' . htmlentities( __( 'Reset this error', 'wp-slimstat' ), ENT_QUOTES, 'UTF-8' ) . '" href="' . wp_slimstat_admin::$config_url . $current_tab . '&amp;action=reset-tracker-error&amp;slimstat_update_settings=' . wp_create_nonce( 'slimstat_update_settings' ) . '"></a>' : __( 'So far so good.', 'wp-slimstat' ),
517
  'description'=> __( 'The information here above is useful to troubleshoot issues with the tracker. <strong>Errors</strong> are returned when the tracker could not record a page view for some reason, and are indicative of some kind of malfunction. Please include the message here above when sending a <a href="https://support.wp-slimstat.com" target="_blank">support request</a>.', 'wp-slimstat' )
518
  ),
519
  'show_sql_debug' => array(
577
  // Allow third-party tools to add their own settings
578
  $settings = apply_filters( 'slimstat_options_on_page', $settings );
579
 
580
+ // Maxmind Data File
581
+ $maxmind_path = wp_slimstat::$upload_dir . '/maxmind.mmdb';
582
+
583
  // Save options
584
  $save_messages = array();
585
  if ( !empty( $settings ) && !empty( $_REQUEST[ 'slimstat_update_settings' ] ) && wp_verify_nonce( $_REQUEST[ 'slimstat_update_settings' ], 'slimstat_update_settings' ) ) {
616
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_resource_idx( resource( 20 ) )" );
617
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_browser_idx( browser( 10 ) )" );
618
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_searchterms_idx( searchterms( 15 ) )" );
619
+ wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_fingerprint_idx( fingerprint( 20 ) )" );
620
  $save_messages[] = __( 'Congratulations! Slimstat Analytics is now optimized for <a href="https://www.youtube.com/watch?v=ygE01sOhzz0" target="_blank">ludicrous speed</a>.', 'wp-slimstat' );
621
  wp_slimstat::$settings[ 'db_indexes' ] = 'on';
622
  }
625
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats DROP INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_resource_idx" );
626
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats DROP INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_browser_idx");
627
  wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats DROP INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_searchterms_idx");
628
+ wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats DROP INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_fingerprint_idx");
629
  $save_messages[] = __( 'Table indexes have been disabled. Enjoy the extra database space!', 'wp-slimstat' );
630
  wp_slimstat::$settings[ 'db_indexes' ] = 'no';
631
  }
634
  // MaxMind Data File
635
  if ( !empty( $_POST[ 'options' ][ 'enable_maxmind' ] ) ) {
636
  if ( $_POST[ 'options' ][ 'enable_maxmind' ] == 'on' && wp_slimstat::$settings[ 'enable_maxmind' ] == 'no' ) {
637
+ include_once( plugin_dir_path( dirname( dirname( __FILE__ ) ) ) . 'vendor/maxmind.php' );
638
+ $error = maxmind_geolite2_connector::download_maxmind_database();
639
 
640
  if ( empty( $error ) ) {
641
  $save_messages[] = __( 'The geolocation database has been installed on your server.', 'wp-slimstat' );
646
  }
647
  }
648
  else if ( $_POST[ 'options' ][ 'enable_maxmind' ] == 'no' && wp_slimstat::$settings[ 'enable_maxmind' ] == 'on' ) {
649
+ $is_deleted = @unlink( $maxmind_path );
650
 
651
  if ( $is_deleted ) {
652
  $save_messages[] = __( 'The geolocation database has been uninstalled from your server.', 'wp-slimstat' );
654
  }
655
  else {
656
  // Some users have reported that a directory is created, instead of a file
657
+ $is_deleted = @rmdir( $maxmind_path );
658
 
659
  if ( $is_deleted ) {
660
  $save_messages[] = __( 'The geolocation database has been uninstalled from your server.', 'wp-slimstat' );
734
  }
735
 
736
  $maxmind_last_modified = '';
737
+ if ( file_exists( $maxmind_path ) && false !== ( $file_stat = @stat( $maxmind_path ) ) ) {
738
  $maxmind_last_modified = date_i18n( get_option( 'date_format' ), $file_stat[ 'mtime' ] );
739
  }
740
 
admin/index.php CHANGED
@@ -18,9 +18,8 @@ class wp_slimstat_admin {
18
  * Init -- Sets things up.
19
  */
20
  public static function init() {
21
- self::$admin_notice = "We recently introduced a new simplified tracker that gets rid of a few layers of convoluted functions and algorithms accumulated over the years. Even though we have tested our new code using a variety of scenarios, you can understand how it would be impossible to cover all the environments available out there. <strong>Make sure to clear your caches</strong> (local, Cloudflare, WP plugins, etc), to allow Slimstat to append the new tracking script to your pages. Also, if you are using Slimstat to track <strong>external</strong> pages (outside of your WP install), please make sure to update the code you're using on those pages with the new one you can find in Slimstat > Settings > Tracker > External Pages. As always, do not hesitate to contact <a href='https://support.wp-slimstat.com/' target='_blank'>our support team</a> if you notice any issues.";
22
  // self::$admin_notice = "Just a quick reminder that, in our quest for improved performance, we are deprecating the two columns <em>type</em> and <em>event_description</em> in the events table, and consolidating that information in the <em>notes</em> field. Code will be added to Slimstat in a few released to actually drop these columns from the database. If you are using those two columns in your custom code, please feel free to contact our support team to discuss your options and how to update your code using the information collected by the new tracker.";
23
- // self::$admin_notice = "In this day and age where every single social media platform knows our individual whereabouts on the Interwebs, we have been doing some research on what <em>the techies</em> out there call <a href='https://amiunique.org/fp' target='_blank'>browser fingerprinting</a>. With this technique, it is not necessary to install any cookies to identify a specific user. This means that the act of fingerprinting a specific browser is stateless and transparent, and thus much more accurate. We are already wearing our lab coats and are hard at work to leverage <a href='https://github.com/Valve/fingerprintjs2' target='_blank'>tools like Fingerprint2</a> in Slimstat. This library, among other things, will allow our tracker to record your users' timezone: wouldn't it be nice to know what time it was for the user who was visiting your website? Of course, if you have Privacy Mode enabled, this feature will not be used, in compliance with GDPR and other international privacy laws. Stay tuned!";
24
 
25
  // Load language files
26
  load_plugin_textdomain( 'wp-slimstat', false, '/wp-slimstat/languages' );
@@ -348,7 +347,8 @@ class wp_slimstat_admin {
348
  INDEX {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_dt_idx (dt),
349
  INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_resource_idx( resource( 20 ) ),
350
  INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_browser_idx( browser( 10 ) ),
351
- INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_searchterms_idx( searchterms( 15 ) )
 
352
  ) COLLATE utf8_general_ci $use_innodb";
353
 
354
  // This table will track outbound links (clicks on links to external sites)
@@ -404,23 +404,6 @@ class wp_slimstat_admin {
404
  public static function update_tables_and_options() {
405
  $my_wpdb = apply_filters( 'slimstat_custom_wpdb', $GLOBALS[ 'wpdb' ] );
406
 
407
- // --- Updates for version 4.7.8.2 ---
408
- if ( version_compare( wp_slimstat::$settings[ 'version' ], '4.7.8.2', '<' ) ) {
409
- wp_slimstat::$settings[ 'opt_out_message' ] = '<p style="display:block;position:fixed;left:0;bottom:0;margin:0;padding:1em 2em;background-color:#eee;width:100%;z-index:99999;">This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.<br><br><a href="#" onclick="javascript:SlimStat.optout(event, false);">Accept</a> or <a href="#" onclick="javascript:SlimStat.optout(event, true);">Deny</a></p>';
410
- }
411
- // --- END: Updates for version 4.7.8.2 ---
412
-
413
- // --- Updates for version 4.7.9 ---
414
- if ( version_compare( wp_slimstat::$settings[ 'version' ], '4.7.9', '<' ) ) {
415
- // Delete the old Browscap Library and install the new one
416
- if ( file_exists( wp_slimstat::$upload_dir . '/browscap-db/autoload.php' ) ) {
417
- WP_Filesystem();
418
- $GLOBALS[ 'wp_filesystem' ]->rmdir( wp_slimstat::$upload_dir . '/browscap-db/', true );
419
- slim_browser::update_browscap_database( true );
420
- }
421
- }
422
- // --- END: Updates for version 4.7.9 ---
423
-
424
  // --- Updates for version 4.8.2 ---
425
  if ( version_compare( wp_slimstat::$settings[ 'version' ], '4.8.2', '<' ) ) {
426
  // Add new email column to database
@@ -470,9 +453,20 @@ class wp_slimstat_admin {
470
  }
471
  // --- END: Updates for version 4.8.4.1 ---
472
 
 
 
 
 
 
 
 
 
 
 
473
  // Now we can update the version stored in the database
474
  wp_slimstat::$settings[ 'version' ] = wp_slimstat::$version;
475
  wp_slimstat::$settings[ 'notice_latest_news' ] = 'on';
 
476
 
477
  return true;
478
  }
@@ -1051,613 +1045,4 @@ class wp_slimstat_admin {
1051
  }
1052
  // END: _create_table
1053
  }
1054
- // END: class declaration
1055
-
1056
- class slim_i18n {
1057
- public static $dynamic_strings = array();
1058
-
1059
- public static function init_dynamic_strings() {
1060
- if ( false === ( self::$dynamic_strings = get_transient( 'slimstat_dynamic_strings' ) ) ) {
1061
- self::$dynamic_strings = array(
1062
- 'xx' => __( 'Unknown', 'wp-slimstat' ),
1063
-
1064
- // Countries
1065
- 'c-' => __( 'Unknown', 'wp-slimstat' ),
1066
- 'c-xx' => __( 'Unknown', 'wp-slimstat' ),
1067
- 'c-xy' => __( 'Local IP Address', 'wp-slimstat' ),
1068
-
1069
- 'c-af' => __( 'Afghanistan', 'wp-slimstat' ),
1070
- 'c-ax' => __( 'Aland Islands', 'wp-slimstat' ),
1071
- 'c-al' => __( 'Albania', 'wp-slimstat' ),
1072
- 'c-dz' => __( 'Algeria', 'wp-slimstat' ),
1073
- 'c-ad' => __( 'Andorra', 'wp-slimstat' ),
1074
- 'c-ao' => __( 'Angola', 'wp-slimstat' ),
1075
- 'c-ai' => __( 'Anguilla', 'wp-slimstat' ),
1076
- 'c-ag' => __( 'Antigua and Barbuda', 'wp-slimstat' ),
1077
- 'c-ar' => __( 'Argentina', 'wp-slimstat' ),
1078
- 'c-am' => __( 'Armenia', 'wp-slimstat' ),
1079
- 'c-aw' => __( 'Aruba', 'wp-slimstat' ),
1080
- 'c-au' => __( 'Australia', 'wp-slimstat' ),
1081
- 'c-at' => __( 'Austria', 'wp-slimstat' ),
1082
- 'c-az' => __( 'Azerbaijan', 'wp-slimstat' ),
1083
- 'c-bs' => __( 'Bahamas', 'wp-slimstat' ),
1084
- 'c-bh' => __( 'Bahrain', 'wp-slimstat' ),
1085
- 'c-bd' => __( 'Bangladesh', 'wp-slimstat' ),
1086
- 'c-bb' => __( 'Barbados', 'wp-slimstat' ),
1087
- 'c-by' => __( 'Belarus', 'wp-slimstat' ),
1088
- 'c-be' => __( 'Belgium', 'wp-slimstat' ),
1089
- 'c-bz' => __( 'Belize', 'wp-slimstat' ),
1090
- 'c-bj' => __( 'Benin', 'wp-slimstat' ),
1091
- 'c-bm' => __( 'Bermuda', 'wp-slimstat' ),
1092
- 'c-bt' => __( 'Bhutan', 'wp-slimstat' ),
1093
- 'c-bo' => __( 'Bolivia', 'wp-slimstat' ),
1094
- 'c-ba' => __( 'Bosnia and Herzegovina', 'wp-slimstat' ),
1095
- 'c-bw' => __( 'Botswana', 'wp-slimstat' ),
1096
- 'c-br' => __( 'Brazil', 'wp-slimstat' ),
1097
- 'c-bn' => __( 'Brunei Darussalam', 'wp-slimstat' ),
1098
- 'c-bg' => __( 'Bulgaria', 'wp-slimstat' ),
1099
- 'c-bf' => __( 'Burkina Faso', 'wp-slimstat' ),
1100
- 'c-bi' => __( 'Burundi', 'wp-slimstat' ),
1101
- 'c-kh' => __( 'Cambodia', 'wp-slimstat' ),
1102
- 'c-cm' => __( 'Cameroon', 'wp-slimstat' ),
1103
- 'c-ca' => __( 'Canada', 'wp-slimstat' ),
1104
- 'c-cv' => __( 'Cape Verde', 'wp-slimstat' ),
1105
- 'c-ky' => __( 'Cayman Islands', 'wp-slimstat' ),
1106
- 'c-cf' => __( 'Central African Republic', 'wp-slimstat' ),
1107
- 'c-td' => __( 'Chad', 'wp-slimstat' ),
1108
- 'c-cl' => __( 'Chile', 'wp-slimstat' ),
1109
- 'c-cn' => __( 'China', 'wp-slimstat' ),
1110
- 'c-co' => __( 'Colombia', 'wp-slimstat' ),
1111
- 'c-km' => __( 'Comoros', 'wp-slimstat' ),
1112
- 'c-cg' => __( 'Congo', 'wp-slimstat' ),
1113
- 'c-cd' => __( 'The Democratic Republic of the Congo', 'wp-slimstat' ),
1114
- 'c-cr' => __( 'Costa Rica', 'wp-slimstat' ),
1115
- 'c-ci' => __( 'Côte d\'Ivoire', 'wp-slimstat' ),
1116
- 'c-hr' => __( 'Croatia', 'wp-slimstat' ),
1117
- 'c-cu' => __( 'Cuba', 'wp-slimstat' ),
1118
- 'c-cy' => __( 'Cyprus', 'wp-slimstat' ),
1119
- 'c-cz' => __( 'Czech Republic', 'wp-slimstat' ),
1120
- 'c-dk' => __( 'Denmark', 'wp-slimstat' ),
1121
- 'c-dj' => __( 'Djibouti', 'wp-slimstat' ),
1122
- 'c-dm' => __( 'Dominica', 'wp-slimstat' ),
1123
- 'c-do' => __( 'Dominican Republic', 'wp-slimstat' ),
1124
- 'c-ec' => __( 'Ecuador', 'wp-slimstat' ),
1125
- 'c-eg' => __( 'Egypt', 'wp-slimstat' ),
1126
- 'c-sv' => __( 'El Salvador', 'wp-slimstat' ),
1127
- 'c-gq' => __( 'Equatorial Guinea', 'wp-slimstat' ),
1128
- 'c-er' => __( 'Eritrea', 'wp-slimstat' ),
1129
- 'c-ee' => __( 'Estonia', 'wp-slimstat' ),
1130
- 'c-et' => __( 'Ethiopia', 'wp-slimstat' ),
1131
- 'c-fo' => __( 'Faroe Islands', 'wp-slimstat' ),
1132
- 'c-fk' => __( 'Falkland Islands (Malvinas)', 'wp-slimstat' ),
1133
- 'c-fj' => __( 'Fiji', 'wp-slimstat' ),
1134
- 'c-fi' => __( 'Finland', 'wp-slimstat' ),
1135
- 'c-fr' => __( 'France', 'wp-slimstat' ),
1136
- 'c-gf' => __( 'French Guiana', 'wp-slimstat' ),
1137
- 'c-ga' => __( 'Gabon', 'wp-slimstat' ),
1138
- 'c-gm' => __( 'Gambia', 'wp-slimstat' ),
1139
- 'c-ge' => __( 'Georgia', 'wp-slimstat' ),
1140
- 'c-de' => __( 'Germany', 'wp-slimstat' ),
1141
- 'c-gh' => __( 'Ghana', 'wp-slimstat' ),
1142
- 'c-gr' => __( 'Greece', 'wp-slimstat' ),
1143
- 'c-gl' => __( 'Greenland', 'wp-slimstat' ),
1144
- 'c-gd' => __( 'Grenada', 'wp-slimstat' ),
1145
- 'c-gp' => __( 'Guadeloupe', 'wp-slimstat' ),
1146
- 'c-gt' => __( 'Guatemala', 'wp-slimstat' ),
1147
- 'c-gn' => __( 'Guinea', 'wp-slimstat' ),
1148
- 'c-gw' => __( 'Guinea-Bissau', 'wp-slimstat' ),
1149
- 'c-gy' => __( 'Guyana', 'wp-slimstat' ),
1150
- 'c-ht' => __( 'Haiti', 'wp-slimstat' ),
1151
- 'c-hn' => __( 'Honduras', 'wp-slimstat' ),
1152
- 'c-hk' => __( 'Hong Kong', 'wp-slimstat' ),
1153
- 'c-hu' => __( 'Hungary', 'wp-slimstat' ),
1154
- 'c-is' => __( 'Iceland', 'wp-slimstat' ),
1155
- 'c-in' => __( 'India', 'wp-slimstat' ),
1156
- 'c-id' => __( 'Indonesia', 'wp-slimstat' ),
1157
- 'c-ir' => __( 'Islamic Republic of Iran', 'wp-slimstat' ),
1158
- 'c-iq' => __( 'Iraq', 'wp-slimstat' ),
1159
- 'c-ie' => __( 'Ireland', 'wp-slimstat' ),
1160
- 'c-il' => __( 'Israel', 'wp-slimstat' ),
1161
- 'c-it' => __( 'Italy', 'wp-slimstat' ),
1162
- 'c-jm' => __( 'Jamaica', 'wp-slimstat' ),
1163
- 'c-jp' => __( 'Japan', 'wp-slimstat' ),
1164
- 'c-jo' => __( 'Jordan', 'wp-slimstat' ),
1165
- 'c-kz' => __( 'Kazakhstan', 'wp-slimstat' ),
1166
- 'c-ke' => __( 'Kenya', 'wp-slimstat' ),
1167
- 'c-nr' => __( 'Nauru', 'wp-slimstat' ),
1168
- 'c-kp' => __( 'Democratic People\'s Republic of Korea', 'wp-slimstat' ),
1169
- 'c-kr' => __( 'Republic of Korea', 'wp-slimstat' ),
1170
- 'c-kv' => __( 'Kosovo', 'wp-slimstat' ),
1171
- 'c-kw' => __( 'Kuwait', 'wp-slimstat' ),
1172
- 'c-kg' => __( 'Kyrgyzstan', 'wp-slimstat' ),
1173
- 'c-la' => __( 'Lao People\'s Democratic Republic', 'wp-slimstat' ),
1174
- 'c-lv' => __( 'Latvia', 'wp-slimstat' ),
1175
- 'c-lb' => __( 'Lebanon', 'wp-slimstat' ),
1176
- 'c-ls' => __( 'Lesotho', 'wp-slimstat' ),
1177
- 'c-lr' => __( 'Liberia', 'wp-slimstat' ),
1178
- 'c-ly' => __( 'Libyan Arab Jamahiriya', 'wp-slimstat' ),
1179
- 'c-li' => __( 'Liechtenstein', 'wp-slimstat' ),
1180
- 'c-lt' => __( 'Lithuania', 'wp-slimstat' ),
1181
- 'c-lu' => __( 'Luxembourg', 'wp-slimstat' ),
1182
- 'c-mk' => __( 'The Former Yugoslav Republic of Macedonia', 'wp-slimstat' ),
1183
- 'c-mg' => __( 'Madagascar', 'wp-slimstat' ),
1184
- 'c-mw' => __( 'Malawi', 'wp-slimstat' ),
1185
- 'c-my' => __( 'Malaysia', 'wp-slimstat' ),
1186
- 'c-ml' => __( 'Mali', 'wp-slimstat' ),
1187
- 'c-mt' => __( 'Malta', 'wp-slimstat' ),
1188
- 'c-mq' => __( 'Martinique', 'wp-slimstat' ),
1189
- 'c-mr' => __( 'Mauritania', 'wp-slimstat' ),
1190
- 'c-mu' => __( 'Mauritius', 'wp-slimstat' ),
1191
- 'c-mx' => __( 'Mexico', 'wp-slimstat' ),
1192
- 'c-md' => __( 'Moldova', 'wp-slimstat' ),
1193
- 'c-mn' => __( 'Mongolia', 'wp-slimstat' ),
1194
- 'c-me' => __( 'Montenegro', 'wp-slimstat' ),
1195
- 'c-ms' => __( 'Montserrat', 'wp-slimstat' ),
1196
- 'c-ma' => __( 'Morocco', 'wp-slimstat' ),
1197
- 'c-mz' => __( 'Mozambique', 'wp-slimstat' ),
1198
- 'c-mm' => __( 'Myanmar', 'wp-slimstat' ),
1199
- 'c-na' => __( 'Namibia', 'wp-slimstat' ),
1200
- 'c-np' => __( 'Nepal', 'wp-slimstat' ),
1201
- 'c-nl' => __( 'Netherlands', 'wp-slimstat' ),
1202
- 'c-nc' => __( 'New Caledonia', 'wp-slimstat' ),
1203
- 'c-nz' => __( 'New Zealand', 'wp-slimstat' ),
1204
- 'c-ni' => __( 'Nicaragua', 'wp-slimstat' ),
1205
- 'c-ne' => __( 'Niger', 'wp-slimstat' ),
1206
- 'c-ng' => __( 'Nigeria', 'wp-slimstat' ),
1207
- 'c-no' => __( 'Norway', 'wp-slimstat' ),
1208
- 'c-om' => __( 'Oman', 'wp-slimstat' ),
1209
- 'c-pk' => __( 'Pakistan', 'wp-slimstat' ),
1210
- 'c-pw' => __( 'Palau', 'wp-slimstat' ),
1211
- 'c-ps' => __( 'Occupied Palestinian Territory', 'wp-slimstat' ),
1212
- 'c-pa' => __( 'Panama', 'wp-slimstat' ),
1213
- 'c-pg' => __( 'Papua New Guinea', 'wp-slimstat' ),
1214
- 'c-py' => __( 'Paraguay', 'wp-slimstat' ),
1215
- 'c-pe' => __( 'Peru', 'wp-slimstat' ),
1216
- 'c-ph' => __( 'Philippines', 'wp-slimstat' ),
1217
- 'c-pl' => __( 'Poland', 'wp-slimstat' ),
1218
- 'c-pt' => __( 'Portugal', 'wp-slimstat' ),
1219
- 'c-pr' => __( 'Puerto Rico', 'wp-slimstat' ),
1220
- 'c-qa' => __( 'Qatar', 'wp-slimstat' ),
1221
- 'c-re' => __( 'Réunion', 'wp-slimstat' ),
1222
- 'c-ro' => __( 'Romania', 'wp-slimstat' ),
1223
- 'c-ru' => __( 'Russian Federation', 'wp-slimstat' ),
1224
- 'c-rw' => __( 'Rwanda', 'wp-slimstat' ),
1225
- 'c-kn' => __( 'Saint Kitts and Nevis', 'wp-slimstat' ),
1226
- 'c-lc' => __( 'Saint Lucia', 'wp-slimstat' ),
1227
- 'c-mf' => __( 'Saint Martin', 'wp-slimstat' ),
1228
- 'c-vc' => __( 'Saint Vincent and the Grenadines', 'wp-slimstat' ),
1229
- 'c-ws' => __( 'Samoa', 'wp-slimstat' ),
1230
- 'c-st' => __( 'Sao Tome and Principe', 'wp-slimstat' ),
1231
- 'c-sa' => __( 'Saudi Arabia', 'wp-slimstat' ),
1232
- 'c-sn' => __( 'Senegal', 'wp-slimstat' ),
1233
- 'c-rs' => __( 'Serbia', 'wp-slimstat' ),
1234
- 'c-sl' => __( 'Sierra Leone', 'wp-slimstat' ),
1235
- 'c-sg' => __( 'Singapore', 'wp-slimstat' ),
1236
- 'c-sk' => __( 'Slovakia', 'wp-slimstat' ),
1237
- 'c-si' => __( 'Slovenia', 'wp-slimstat' ),
1238
- 'c-sb' => __( 'Solomon Islands', 'wp-slimstat' ),
1239
- 'c-so' => __( 'Somalia', 'wp-slimstat' ),
1240
- 'c-za' => __( 'South Africa', 'wp-slimstat' ),
1241
- 'c-gs' => __( 'South Georgia and the South Sandwich Islands', 'wp-slimstat' ),
1242
- 'c-es' => __( 'Spain', 'wp-slimstat' ),
1243
- 'c-lk' => __( 'Sri Lanka', 'wp-slimstat' ),
1244
- 'c-sc' => __( 'Seychelles', 'wp-slimstat' ),
1245
- 'c-sd' => __( 'Sudan', 'wp-slimstat' ),
1246
- 'c-ss' => __( 'South Sudan', 'wp-slimstat' ),
1247
- 'c-sr' => __( 'Suriname', 'wp-slimstat' ),
1248
- 'c-sj' => __( 'Svalbard and Jan Mayen', 'wp-slimstat' ),
1249
- 'c-sz' => __( 'Swaziland', 'wp-slimstat' ),
1250
- 'c-se' => __( 'Sweden', 'wp-slimstat' ),
1251
- 'c-ch' => __( 'Switzerland', 'wp-slimstat' ),
1252
- 'c-sy' => __( 'Syrian Arab Republic', 'wp-slimstat' ),
1253
- 'c-tw' => __( 'Taiwan', 'wp-slimstat' ),
1254
- 'c-tj' => __( 'Tajikistan', 'wp-slimstat' ),
1255
- 'c-tz' => __( 'United Republic of Tanzania', 'wp-slimstat' ),
1256
- 'c-th' => __( 'Thailand', 'wp-slimstat' ),
1257
- 'c-tl' => __( 'Timor-Leste', 'wp-slimstat' ),
1258
- 'c-tg' => __( 'Togo', 'wp-slimstat' ),
1259
- 'c-to' => __( 'Tonga', 'wp-slimstat' ),
1260
- 'c-tt' => __( 'Trinidad and Tobago', 'wp-slimstat' ),
1261
- 'c-tn' => __( 'Tunisia', 'wp-slimstat' ),
1262
- 'c-tr' => __( 'Turkey', 'wp-slimstat' ),
1263
- 'c-tm' => __( 'Turkmenistan', 'wp-slimstat' ),
1264
- 'c-tc' => __( 'Turks and Caicos Islands', 'wp-slimstat' ),
1265
- 'c-ug' => __( 'Uganda', 'wp-slimstat' ),
1266
- 'c-ua' => __( 'Ukraine', 'wp-slimstat' ),
1267
- 'c-ae' => __( 'United Arab Emirates', 'wp-slimstat' ),
1268
- 'c-gb' => __( 'United Kingdom', 'wp-slimstat' ),
1269
- 'c-us' => __( 'United States', 'wp-slimstat' ),
1270
- 'c-uy' => __( 'Uruguay', 'wp-slimstat' ),
1271
- 'c-uz' => __( 'Uzbekistan', 'wp-slimstat' ),
1272
- 'c-vu' => __( 'Vanuatu', 'wp-slimstat' ),
1273
- 'c-ve' => __( 'Venezuela', 'wp-slimstat' ),
1274
- 'c-vn' => __( 'Viet Nam', 'wp-slimstat' ),
1275
- 'c-vg' => __( 'British Virgin Islands', 'wp-slimstat' ),
1276
- 'c-vi' => __( 'U.S. Virgin Islands', 'wp-slimstat' ),
1277
- 'c-eh' => __( 'Western Sahara', 'wp-slimstat' ),
1278
- 'c-ye' => __( 'Yemen', 'wp-slimstat' ),
1279
- 'c-zm' => __( 'Zambia', 'wp-slimstat' ),
1280
- 'c-zw' => __( 'Zimbabwe', 'wp-slimstat' ),
1281
- 'c-gg' => __( 'Guernsey', 'wp-slimstat' ),
1282
- 'c-je' => __( 'Jersey', 'wp-slimstat' ),
1283
- 'c-im' => __( 'Isle of Man', 'wp-slimstat' ),
1284
- 'c-mv' => __( 'Maldives', 'wp-slimstat' ),
1285
- 'c-eu' => __( 'Europe', 'wp-slimstat' ),
1286
-
1287
- // Languages
1288
- 'l-' => __( 'Unknown', 'wp-slimstat' ),
1289
- 'l-empty' => __( 'Unknown', 'wp-slimstat' ),
1290
- 'l-xx' => __( 'Unknown', 'wp-slimstat' ),
1291
-
1292
- 'l-af' => __( 'Afrikaans', 'wp-slimstat' ),
1293
- 'l-af-za' => __( 'Afrikaans (South Africa)', 'wp-slimstat' ),
1294
- 'l-ar' => __( 'Arabic', 'wp-slimstat' ),
1295
- 'l-ar-ae' => __( 'Arabic (U.A.E.)', 'wp-slimstat' ),
1296
- 'l-ar-bh' => __( 'Arabic (Bahrain)', 'wp-slimstat' ),
1297
- 'l-ar-dz' => __( 'Arabic (Algeria)', 'wp-slimstat' ),
1298
- 'l-ar-eg' => __( 'Arabic (Egypt)', 'wp-slimstat' ),
1299
- 'l-ar-iq' => __( 'Arabic (Iraq)', 'wp-slimstat' ),
1300
- 'l-ar-jo' => __( 'Arabic (Jordan)', 'wp-slimstat' ),
1301
- 'l-ar-kw' => __( 'Arabic (Kuwait)', 'wp-slimstat' ),
1302
- 'l-ar-lb' => __( 'Arabic (Lebanon)', 'wp-slimstat' ),
1303
- 'l-ar-ly' => __( 'Arabic (Libya)', 'wp-slimstat' ),
1304
- 'l-ar-ma' => __( 'Arabic (Morocco)', 'wp-slimstat' ),
1305
- 'l-ar-om' => __( 'Arabic (Oman)', 'wp-slimstat' ),
1306
- 'l-ar-qa' => __( 'Arabic (Qatar)', 'wp-slimstat' ),
1307
- 'l-ar-sa' => __( 'Arabic (Saudi Arabia)', 'wp-slimstat' ),
1308
- 'l-ar-sy' => __( 'Arabic (Syria)', 'wp-slimstat' ),
1309
- 'l-ar-tn' => __( 'Arabic (Tunisia)', 'wp-slimstat' ),
1310
- 'l-ar-ye' => __( 'Arabic (Yemen)', 'wp-slimstat' ),
1311
- 'l-az' => __( 'Azeri (Latin)', 'wp-slimstat' ),
1312
- 'l-az-az' => __( 'Azeri (Latin) (Azerbaijan)', 'wp-slimstat' ),
1313
- 'l-be' => __( 'Belarusian', 'wp-slimstat' ),
1314
- 'l-be-by' => __( 'Belarusian (Belarus)', 'wp-slimstat' ),
1315
- 'l-bg' => __( 'Bulgarian', 'wp-slimstat' ),
1316
- 'l-bg-bg' => __( 'Bulgarian (Bulgaria)', 'wp-slimstat' ),
1317
- 'l-bs-ba' => __( 'Bosnian (Bosnia and Herzegovina)', 'wp-slimstat' ),
1318
- 'l-ca' => __( 'Catalan', 'wp-slimstat' ),
1319
- 'l-ca-es' => __( 'Catalan (Spain)', 'wp-slimstat' ),
1320
- 'l-cs' => __( 'Czech', 'wp-slimstat' ),
1321
- 'l-cs-cz' => __( 'Czech (Czech Republic)', 'wp-slimstat' ),
1322
- 'l-cy' => __( 'Welsh', 'wp-slimstat' ),
1323
- 'l-cy-gb' => __( 'Welsh (United Kingdom)', 'wp-slimstat' ),
1324
- 'l-da' => __( 'Danish', 'wp-slimstat' ),
1325
- 'l-da-dk' => __( 'Danish (Denmark)', 'wp-slimstat' ),
1326
- 'l-de' => __( 'German', 'wp-slimstat' ),
1327
- 'l-de-at' => __( 'German (Austria)', 'wp-slimstat' ),
1328
- 'l-de-ch' => __( 'German (Switzerland)', 'wp-slimstat' ),
1329
- 'l-de-de' => __( 'German (Germany)', 'wp-slimstat' ),
1330
- 'l-de-li' => __( 'German (Liechtenstein)', 'wp-slimstat' ),
1331
- 'l-de-lu' => __( 'German (Luxembourg)', 'wp-slimstat' ),
1332
- 'l-dv' => __( 'Divehi', 'wp-slimstat' ),
1333
- 'l-dv-mv' => __( 'Divehi (Maldives)', 'wp-slimstat' ),
1334
- 'l-el' => __( 'Greek', 'wp-slimstat' ),
1335
- 'l-el-gr' => __( 'Greek (Greece)', 'wp-slimstat' ),
1336
- 'l-en' => __( 'English', 'wp-slimstat' ),
1337
- 'l-en-au' => __( 'English (Australia)', 'wp-slimstat' ),
1338
- 'l-en-bz' => __( 'English (Belize)', 'wp-slimstat' ),
1339
- 'l-en-ca' => __( 'English (Canada)', 'wp-slimstat' ),
1340
- 'l-en-cb' => __( 'English (Caribbean)', 'wp-slimstat' ),
1341
- 'l-en-gb' => __( 'English (United Kingdom)', 'wp-slimstat' ),
1342
- 'l-en-ie' => __( 'English (Ireland)', 'wp-slimstat' ),
1343
- 'l-en-jm' => __( 'English (Jamaica)', 'wp-slimstat' ),
1344
- 'l-en-nz' => __( 'English (New Zealand)', 'wp-slimstat' ),
1345
- 'l-en-ph' => __( 'English (Republic of the Philippines)', 'wp-slimstat' ),
1346
- 'l-en-tt' => __( 'English (Trinidad and Tobago)', 'wp-slimstat' ),
1347
- 'l-en-us' => __( 'English (United States)', 'wp-slimstat' ),
1348
- 'l-en-za' => __( 'English (South Africa)', 'wp-slimstat' ),
1349
- 'l-en-zw' => __( 'English (Zimbabwe)', 'wp-slimstat' ),
1350
- 'l-eo' => __( 'Esperanto', 'wp-slimstat' ),
1351
- 'l-es' => __( 'Spanish', 'wp-slimstat' ),
1352
- 'l-es-ar' => __( 'Spanish (Argentina)', 'wp-slimstat' ),
1353
- 'l-es-bo' => __( 'Spanish (Bolivia)', 'wp-slimstat' ),
1354
- 'l-es-cl' => __( 'Spanish (Chile)', 'wp-slimstat' ),
1355
- 'l-es-co' => __( 'Spanish (Colombia)', 'wp-slimstat' ),
1356
- 'l-es-cr' => __( 'Spanish (Costa Rica)', 'wp-slimstat' ),
1357
- 'l-es-do' => __( 'Spanish (Dominican Republic)', 'wp-slimstat' ),
1358
- 'l-es-ec' => __( 'Spanish (Ecuador)', 'wp-slimstat' ),
1359
- 'l-es-es' => __( 'Spanish (Spain)', 'wp-slimstat' ),
1360
- 'l-es-gt' => __( 'Spanish (Guatemala)', 'wp-slimstat' ),
1361
- 'l-es-hn' => __( 'Spanish (Honduras)', 'wp-slimstat' ),
1362
- 'l-es-mx' => __( 'Spanish (Mexico)', 'wp-slimstat' ),
1363
- 'l-es-ni' => __( 'Spanish (Nicaragua)', 'wp-slimstat' ),
1364
- 'l-es-pa' => __( 'Spanish (Panama)', 'wp-slimstat' ),
1365
- 'l-es-pe' => __( 'Spanish (Peru)', 'wp-slimstat' ),
1366
- 'l-es-pr' => __( 'Spanish (Puerto Rico)', 'wp-slimstat' ),
1367
- 'l-es-py' => __( 'Spanish (Paraguay)', 'wp-slimstat' ),
1368
- 'l-es-sv' => __( 'Spanish (El Salvador)', 'wp-slimstat' ),
1369
- 'l-es-uy' => __( 'Spanish (Uruguay)', 'wp-slimstat' ),
1370
- 'l-es-ve' => __( 'Spanish (Venezuela)', 'wp-slimstat' ),
1371
- 'l-et' => __( 'Estonian', 'wp-slimstat' ),
1372
- 'l-et-ee' => __( 'Estonian (Estonia)', 'wp-slimstat' ),
1373
- 'l-eu' => __( 'Basque', 'wp-slimstat' ),
1374
- 'l-eu-es' => __( 'Basque (Spain)', 'wp-slimstat' ),
1375
- 'l-fa' => __( 'Farsi', 'wp-slimstat' ),
1376
- 'l-fa-ir' => __( 'Farsi (Iran)', 'wp-slimstat' ),
1377
- 'l-fi' => __( 'Finnish', 'wp-slimstat' ),
1378
- 'l-fi-fi' => __( 'Finnish (Finland)', 'wp-slimstat' ),
1379
- 'l-fo' => __( 'Faroese', 'wp-slimstat' ),
1380
- 'l-fo-fo' => __( 'Faroese (Faroe Islands)', 'wp-slimstat' ),
1381
- 'l-fr' => __( 'French', 'wp-slimstat' ),
1382
- 'l-fr-be' => __( 'French (Belgium)', 'wp-slimstat' ),
1383
- 'l-fr-ca' => __( 'French (Canada)', 'wp-slimstat' ),
1384
- 'l-fr-ch' => __( 'French (Switzerland)', 'wp-slimstat' ),
1385
- 'l-fr-fr' => __( 'French (France)', 'wp-slimstat' ),
1386
- 'l-fr-lu' => __( 'French (Luxembourg)', 'wp-slimstat' ),
1387
- 'l-fr-mc' => __( 'French (Principality of Monaco)', 'wp-slimstat' ),
1388
- 'l-gl' => __( 'Galician', 'wp-slimstat' ),
1389
- 'l-gl-es' => __( 'Galician (Spain)', 'wp-slimstat' ),
1390
- 'l-gu' => __( 'Gujarati', 'wp-slimstat' ),
1391
- 'l-gu-in' => __( 'Gujarati (India)', 'wp-slimstat' ),
1392
- 'l-he' => __( 'Hebrew', 'wp-slimstat' ),
1393
- 'l-he-il' => __( 'Hebrew (Israel)', 'wp-slimstat' ),
1394
- 'l-hi' => __( 'Hindi', 'wp-slimstat' ),
1395
- 'l-hi-in' => __( 'Hindi (India)', 'wp-slimstat' ),
1396
- 'l-hr' => __( 'Croatian', 'wp-slimstat' ),
1397
- 'l-hr-ba' => __( 'Croatian (Bosnia and Herzegovina)', 'wp-slimstat' ),
1398
- 'l-hr-hr' => __( 'Croatian (Croatia)', 'wp-slimstat' ),
1399
- 'l-hu' => __( 'Hungarian', 'wp-slimstat' ),
1400
- 'l-hu-hu' => __( 'Hungarian (Hungary)', 'wp-slimstat' ),
1401
- 'l-hy' => __( 'Armenian', 'wp-slimstat' ),
1402
- 'l-hy-am' => __( 'Armenian (Armenia)', 'wp-slimstat' ),
1403
- 'l-id' => __( 'Indonesian', 'wp-slimstat' ),
1404
- 'l-id-id' => __( 'Indonesian (Indonesia)', 'wp-slimstat' ),
1405
- 'l-is' => __( 'Icelandic', 'wp-slimstat' ),
1406
- 'l-is-is' => __( 'Icelandic (Iceland)', 'wp-slimstat' ),
1407
- 'l-it' => __( 'Italian', 'wp-slimstat' ),
1408
- 'l-it-ch' => __( 'Italian (Switzerland)', 'wp-slimstat' ),
1409
- 'l-it-it' => __( 'Italian (Italy)', 'wp-slimstat' ),
1410
- 'l-ja' => __( 'Japanese', 'wp-slimstat' ),
1411
- 'l-ja-jp' => __( 'Japanese (Japan)', 'wp-slimstat' ),
1412
- 'l-ka' => __( 'Georgian', 'wp-slimstat' ),
1413
- 'l-ka-ge' => __( 'Georgian (Georgia)', 'wp-slimstat' ),
1414
- 'l-kk' => __( 'Kazakh', 'wp-slimstat' ),
1415
- 'l-kk-kz' => __( 'Kazakh (Kazakhstan)', 'wp-slimstat' ),
1416
- 'l-kn' => __( 'Kannada', 'wp-slimstat' ),
1417
- 'l-kn-in' => __( 'Kannada (India)', 'wp-slimstat' ),
1418
- 'l-ko' => __( 'Korean', 'wp-slimstat' ),
1419
- 'l-ko-kr' => __( 'Korean (Korea)', 'wp-slimstat' ),
1420
- 'l-kok' => __( 'Konkani', 'wp-slimstat' ),
1421
- 'l-kok-in' => __( 'Konkani (India)', 'wp-slimstat' ),
1422
- 'l-ky' => __( 'Kyrgyz', 'wp-slimstat' ),
1423
- 'l-ky-kg' => __( 'Kyrgyz (Kyrgyzstan)', 'wp-slimstat' ),
1424
- 'l-lt' => __( 'Lithuanian', 'wp-slimstat' ),
1425
- 'l-lt-lt' => __( 'Lithuanian (Lithuania)', 'wp-slimstat' ),
1426
- 'l-lv' => __( 'Latvian', 'wp-slimstat' ),
1427
- 'l-lv-lv' => __( 'Latvian (Latvia)', 'wp-slimstat' ),
1428
- 'l-mi' => __( 'Maori', 'wp-slimstat' ),
1429
- 'l-mi-nz' => __( 'Maori (New Zealand)', 'wp-slimstat' ),
1430
- 'l-mk' => __( 'FYRO Macedonian', 'wp-slimstat' ),
1431
- 'l-mk-ml' => __( 'FYRO Macedonian (Former Yugoslav Republic of Macedonia)', 'wp-slimstat' ),
1432
- 'l-mn' => __( 'Mongolian', 'wp-slimstat' ),
1433
- 'l-mn-mn' => __( 'Mongolian (Mongolia)', 'wp-slimstat' ),
1434
- 'l-mr' => __( 'Marathi', 'wp-slimstat' ),
1435
- 'l-mr-in' => __( 'Marathi (India)', 'wp-slimstat' ),
1436
- 'l-ms' => __( 'Malay', 'wp-slimstat' ),
1437
- 'l-ms-bn' => __( 'Malay (Brunei Darussalam)', 'wp-slimstat' ),
1438
- 'l-ms-my' => __( 'Malay (Malaysia)', 'wp-slimstat' ),
1439
- 'l-mt' => __( 'Maltese', 'wp-slimstat' ),
1440
- 'l-mt-mt' => __( 'Maltese (Malta)', 'wp-slimstat' ),
1441
- 'l-nb' => __( 'Norwegian (Bokmål)', 'wp-slimstat' ),
1442
- 'l-nb-no' => __( 'Norwegian (Bokmål) (Norway)', 'wp-slimstat' ),
1443
- 'l-nl' => __( 'Dutch', 'wp-slimstat' ),
1444
- 'l-nl-be' => __( 'Dutch (Belgium)', 'wp-slimstat' ),
1445
- 'l-nl-nl' => __( 'Dutch (Netherlands)', 'wp-slimstat' ),
1446
- 'l-nn-no' => __( 'Norwegian (Nynorsk) (Norway)', 'wp-slimstat' ),
1447
- 'l-ns' => __( 'Northern Sotho', 'wp-slimstat' ),
1448
- 'l-ns-za' => __( 'Northern Sotho (South Africa)', 'wp-slimstat' ),
1449
- 'l-pa' => __( 'Punjabi', 'wp-slimstat' ),
1450
- 'l-pa-in' => __( 'Punjabi (India)', 'wp-slimstat' ),
1451
- 'l-pl' => __( 'Polish', 'wp-slimstat' ),
1452
- 'l-pl-pl' => __( 'Polish (Poland)', 'wp-slimstat' ),
1453
- 'l-ps' => __( 'Pashto', 'wp-slimstat' ),
1454
- 'l-ps-ar' => __( 'Pashto (Afghanistan)', 'wp-slimstat' ),
1455
- 'l-pt' => __( 'Portuguese', 'wp-slimstat' ),
1456
- 'l-pt-br' => __( 'Portuguese (Brazil)', 'wp-slimstat' ),
1457
- 'l-pt-pt' => __( 'Portuguese (Portugal)', 'wp-slimstat' ),
1458
- 'l-qu' => __( 'Quechua', 'wp-slimstat' ),
1459
- 'l-qu-bo' => __( 'Quechua (Bolivia)', 'wp-slimstat' ),
1460
- 'l-qu-ec' => __( 'Quechua (Ecuador)', 'wp-slimstat' ),
1461
- 'l-qu-pe' => __( 'Quechua (Peru)', 'wp-slimstat' ),
1462
- 'l-ro' => __( 'Romanian', 'wp-slimstat' ),
1463
- 'l-ro-ro' => __( 'Romanian (Romania)', 'wp-slimstat' ),
1464
- 'l-ru' => __( 'Russian', 'wp-slimstat' ),
1465
- 'l-ru-ru' => __( 'Russian (Russia)', 'wp-slimstat' ),
1466
- 'l-sa' => __( 'Sanskrit', 'wp-slimstat' ),
1467
- 'l-sa-in' => __( 'Sanskrit (India)', 'wp-slimstat' ),
1468
- 'l-se' => __( 'Sami (Northern)', 'wp-slimstat' ),
1469
- 'l-se-fi' => __( 'Sami (Northern) (Finland)', 'wp-slimstat' ),
1470
- 'l-se-no' => __( 'Sami (Northern) (Norway)', 'wp-slimstat' ),
1471
- 'l-se-se' => __( 'Sami (Northern) (Sweden)', 'wp-slimstat' ),
1472
- 'l-sk' => __( 'Slovak', 'wp-slimstat' ),
1473
- 'l-sk-sk' => __( 'Slovak (Slovakia)', 'wp-slimstat' ),
1474
- 'l-sl' => __( 'Slovenian', 'wp-slimstat' ),
1475
- 'l-sl-si' => __( 'Slovenian (Slovenia)', 'wp-slimstat' ),
1476
- 'l-sq' => __( 'Albanian', 'wp-slimstat' ),
1477
- 'l-sq-al' => __( 'Albanian (Albania)', 'wp-slimstat' ),
1478
- 'l-sr-ba' => __( 'Serbian (Latin) (Bosnia and Herzegovina)', 'wp-slimstat' ),
1479
- 'l-sr-rs' => __( 'Serbian (Serbia and Montenegro)', 'wp-slimstat' ),
1480
- 'l-sr-sp' => __( 'Serbian (Latin) (Serbia and Montenegro)', 'wp-slimstat' ),
1481
- 'l-sv' => __( 'Swedish', 'wp-slimstat' ),
1482
- 'l-sv-fi' => __( 'Swedish (Finland)', 'wp-slimstat' ),
1483
- 'l-sv-se' => __( 'Swedish (Sweden)', 'wp-slimstat' ),
1484
- 'l-sw' => __( 'Swahili', 'wp-slimstat' ),
1485
- 'l-sw-ke' => __( 'Swahili (Kenya)', 'wp-slimstat' ),
1486
- 'l-ta' => __( 'Tamil', 'wp-slimstat' ),
1487
- 'l-ta-in' => __( 'Tamil (India)', 'wp-slimstat' ),
1488
- 'l-te' => __( 'Telugu', 'wp-slimstat' ),
1489
- 'l-te-in' => __( 'Telugu (India)', 'wp-slimstat' ),
1490
- 'l-th' => __( 'Thai', 'wp-slimstat' ),
1491
- 'l-th-th' => __( 'Thai (Thailand)', 'wp-slimstat' ),
1492
- 'l-tl' => __( 'Tagalog', 'wp-slimstat' ),
1493
- 'l-tl-ph' => __( 'Tagalog (Philippines)', 'wp-slimstat' ),
1494
- 'l-tn' => __( 'Tswana', 'wp-slimstat' ),
1495
- 'l-tn-za' => __( 'Tswana (South Africa)', 'wp-slimstat' ),
1496
- 'l-tr' => __( 'Turkish', 'wp-slimstat' ),
1497
- 'l-tr-tr' => __( 'Turkish (Turkey)', 'wp-slimstat' ),
1498
- 'l-tt' => __( 'Tatar', 'wp-slimstat' ),
1499
- 'l-tt-ru' => __( 'Tatar (Russia)', 'wp-slimstat' ),
1500
- 'l-ts' => __( 'Tsonga', 'wp-slimstat' ),
1501
- 'l-uk' => __( 'Ukrainian', 'wp-slimstat' ),
1502
- 'l-uk-ua' => __( 'Ukrainian (Ukraine)', 'wp-slimstat' ),
1503
- 'l-ur' => __( 'Urdu', 'wp-slimstat' ),
1504
- 'l-ur-pk' => __( 'Urdu (Islamic Republic of Pakistan)', 'wp-slimstat' ),
1505
- 'l-uz' => __( 'Uzbek (Latin)', 'wp-slimstat' ),
1506
- 'l-uz-uz' => __( 'Uzbek (Cyrillic) (Uzbekistan)', 'wp-slimstat' ),
1507
- 'l-vi' => __( 'Vietnamese', 'wp-slimstat' ),
1508
- 'l-vi-vn' => __( 'Vietnamese (Viet Nam)', 'wp-slimstat' ),
1509
- 'l-xh' => __( 'Xhosa', 'wp-slimstat' ),
1510
- 'l-xh-za' => __( 'Xhosa (South Africa)', 'wp-slimstat' ),
1511
- 'l-zh' => __( 'Chinese', 'wp-slimstat' ),
1512
- 'l-zh-cn' => __( 'Chinese (S)', 'wp-slimstat' ),
1513
- 'l-zh-hk' => __( 'Chinese (Hong Kong)', 'wp-slimstat' ),
1514
- 'l-zh-mo' => __( 'Chinese (Macau)', 'wp-slimstat' ),
1515
- 'l-zh-sg' => __( 'Chinese (Singapore)', 'wp-slimstat' ),
1516
- 'l-zh-tw' => __( 'Chinese (T)', 'wp-slimstat' ),
1517
- 'l-zu' => __( 'Zulu', 'wp-slimstat' ),
1518
- 'l-zu-za' => __( 'Zulu (South Africa)', 'wp-slimstat' ),
1519
-
1520
- // Operating Systems
1521
- 'aix' => __( 'IBM AIX', 'wp-slimstat' ),
1522
- 'amiga' => __( 'Amiga', 'wp-slimstat' ),
1523
- 'android' => __( 'Android', 'wp-slimstat' ),
1524
- 'beos' => __( 'BeOS', 'wp-slimstat' ),
1525
- 'blackberry os' => __( 'BlackBerry OS', 'wp-slimstat' ),
1526
- 'centos' => __( 'CentOS', 'wp-slimstat' ),
1527
- 'chromeos' => __( 'ChromeOS', 'wp-slimstat' ),
1528
- 'commodore64' => __( 'Commodore 64', 'wp-slimstat' ),
1529
- 'cygwin' => __( 'Cygwin', 'wp-slimstat' ),
1530
- 'debian' => __( 'Debian', 'wp-slimstat' ),
1531
- 'digital unix' => __( 'Digital Unix', 'wp-slimstat' ),
1532
- 'fedora' => __( 'Fedora', 'wp-slimstat' ),
1533
- 'firefoxos' => __( 'Firefox OS', 'wp-slimstat' ),
1534
- 'freebsd' => __( 'FreeBSD', 'wp-slimstat' ),
1535
- 'gentoo' => __( 'Gentoo', 'wp-slimstat' ),
1536
- 'hp-ux' => __( 'HP-UX', 'wp-slimstat' ),
1537
- 'ios' => __( 'iPhone OS', 'wp-slimstat' ),
1538
- 'iphone os' => __( 'iPhone OS', 'wp-slimstat' ),
1539
- 'iphone osx' => __( 'iPhone OS X', 'wp-slimstat' ),
1540
- 'irix' => __( 'SGI / IRIX', 'wp-slimstat' ),
1541
- 'java' => __( 'Java', 'wp-slimstat' ),
1542
- 'kanotix' => __( 'Kanotix Linux', 'wp-slimstat' ),
1543
- 'knoppix' => __( 'Knoppix Linux', 'wp-slimstat' ),
1544
- 'linux' => __( 'Linux Generic', 'wp-slimstat' ),
1545
- 'mac' => __( 'Mac', 'wp-slimstat' ),
1546
- 'mac68k' => __( 'Mac 68k', 'wp-slimstat' ),
1547
- 'macos' => __( 'Mac OS X', 'wp-slimstat' ),
1548
- 'macosx' => __( 'Mac OS X', 'wp-slimstat' ),
1549
- 'macppc' => __( 'Mac PowerPC', 'wp-slimstat' ),
1550
- 'mandrake' => __( 'Mandrake Linux', 'wp-slimstat' ),
1551
- 'mandriva' => __( 'MS-DOS', 'wp-slimstat' ),
1552
- 'mepis' => __( 'MEPIS Linux', 'wp-slimstat' ),
1553
- 'ms-dos' => __( 'MS-DOS', 'wp-slimstat' ),
1554
- 'netbsd' => __( 'NetBSD', 'wp-slimstat' ),
1555
- 'nintendo' => __( 'Nintendo', 'wp-slimstat' ),
1556
- 'openbsd' => __( 'OpenBSD', 'wp-slimstat' ),
1557
- 'openvms' => __( 'OpenVMS', 'wp-slimstat' ),
1558
- 'os/2' => __( 'IBM OS/2', 'wp-slimstat' ),
1559
- 'palm' => __( 'Palm OS', 'wp-slimstat' ),
1560
- 'palmos' => __( 'Palm OS', 'wp-slimstat' ),
1561
- 'pclinuxos' => __( 'PCLinux OS', 'wp-slimstat' ),
1562
- 'playstation' => __( 'Playstation', 'wp-slimstat' ),
1563
- 'powertv' => __( 'PowerTV', 'wp-slimstat' ),
1564
- 'redhat' => __( 'RedHat Linux', 'wp-slimstat' ),
1565
- 'rim os' => __( 'Blackberry', 'wp-slimstat' ),
1566
- 'risc os' => __( 'Risc OS', 'wp-slimstat' ),
1567
- 'slackware' => __( 'Slackware Linux', 'wp-slimstat' ),
1568
- 'solaris' => __( 'Solaris', 'wp-slimstat' ),
1569
- 'sunos' => __( 'Sun OS', 'wp-slimstat' ),
1570
- 'suse' => __( 'SuSE Linux', 'wp-slimstat' ),
1571
- 'symbianos' => __( 'Symbian OS', 'wp-slimstat' ),
1572
- 'ubuntu' => __( 'Ubuntu', 'wp-slimstat' ),
1573
- 'unix' => __( 'Unix', 'wp-slimstat' ),
1574
- 'unknown' => __( 'Unknown', 'wp-slimstat' ),
1575
- 'xandros' => __( 'Xandros Linux', 'wp-slimstat' ),
1576
- 'wap' => __( 'WAP', 'wp-slimstat' ),
1577
- 'webos' => __( 'WebOS', 'wp-slimstat' ),
1578
- 'win10' => __( 'Windows 10', 'wp-slimstat' ),
1579
- 'win16' => __( 'Windows 16-bit', 'wp-slimstat' ),
1580
- 'win2000' => __( 'Windows 2000', 'wp-slimstat' ),
1581
- 'win2003' => __( 'Windows 2003', 'wp-slimstat' ),
1582
- 'win31' => __( 'Windows 3.1', 'wp-slimstat' ),
1583
- 'win32' => __( 'Windows 32-bit', 'wp-slimstat' ),
1584
- 'win7' => __( 'Windows 7', 'wp-slimstat' ),
1585
- 'win7' => __( 'Windows 7', 'wp-slimstat' ),
1586
- 'win8' => __( 'Windows 8', 'wp-slimstat' ),
1587
- 'win8.1' => __( 'Windows 8.1', 'wp-slimstat' ),
1588
- 'win95' => __( 'Windows 95', 'wp-slimstat' ),
1589
- 'win98' => __( 'Windows 98', 'wp-slimstat' ),
1590
- 'wince' => __( 'Windows CE', 'wp-slimstat' ),
1591
- 'winme' => __( 'Windows ME', 'wp-slimstat' ),
1592
- 'winnt' => __( 'Windows NT', 'wp-slimstat' ),
1593
- 'winphone7' => __( 'Windows Phone', 'wp-slimstat' ),
1594
- 'winphone7.5' => __( 'Windows Phone', 'wp-slimstat' ),
1595
- 'winphone8' => __( 'Windows Phone', 'wp-slimstat' ),
1596
- 'winphone8.1' => __( 'Windows RT / Runtime', 'wp-slimstat' ),
1597
- 'winrt' => __( 'Windows Phone', 'wp-slimstat' ),
1598
- 'winvista' => __( 'Windows Vista', 'wp-slimstat' ),
1599
- 'winxp' => __( 'Windows XP', 'wp-slimstat' ),
1600
- 'wyderos' => __( 'WyderOS', 'wp-slimstat' ),
1601
- 'zaurus' => __( 'Zaurus WAP', 'wp-slimstat' ),
1602
-
1603
- // Operating System Families
1604
- 'p-unk' => __( 'Unknown', 'wp-slimstat' ),
1605
- 'p-' => __( 'Unknown', 'wp-slimstat' ),
1606
-
1607
- 'p-and' => __( 'Android', 'wp-slimstat' ),
1608
- 'p-bla' => __( 'BlackBerry', 'wp-slimstat' ),
1609
- 'p-chr' => __( 'Chrome OS', 'wp-slimstat' ),
1610
- 'p-fir' => __( 'Fire OS', 'wp-slimstat' ),
1611
- 'p-fre' => __( 'Linux FreeBSD', 'wp-slimstat' ),
1612
- 'p-ios' => __( 'Apple iOS', 'wp-slimstat' ),
1613
- 'p-jav' => __( 'Java-based OS', 'wp-slimstat' ),
1614
- 'p-lin' => __( 'Linux', 'wp-slimstat' ),
1615
- 'p-mac' => __( 'Apple', 'wp-slimstat' ),
1616
- 'p-rim' => __( 'Blackberry', 'wp-slimstat' ),
1617
- 'p-sym' => __( 'Symbian OS', 'wp-slimstat' ),
1618
- 'p-ubu' => __( 'Linux', 'wp-slimstat' ),
1619
- 'p-win' => __( 'Microsoft', 'wp-slimstat' ),
1620
-
1621
- // Tracker Errors
1622
- 'e-101' => __( 'Invalid data signature. Try clearing your WordPress cache.', 'wp-slimstat' ),
1623
- 'e-102' => __( 'Invalid content type signature. Try clearing your WordPress cache.', 'wp-slimstat' ),
1624
- 'e-103' => __( 'Invalid content type format. Try clearing your WordPress cache.', 'wp-slimstat' ),
1625
- 'e-200' => __( 'Unspecified error while attempting to add a new record to the table', 'wp-slimstat' ),
1626
- 'e-201' => __( 'Malformed referrer URL', 'wp-slimstat' ),
1627
- 'e-202' => __( 'Pageview not tracked because the IP address format was invalid.', 'wp-slimstat' ),
1628
- 'e-203' => __( 'Malformed resource URL', 'wp-slimstat' ),
1629
- 'e-204' => __( 'Tracking is turned off, but it looks like the client-side code is still attached to your pages. Do you have a caching tool enabled?', 'wp-slimstat' ),
1630
- 'e-205' => __( 'Invalid MaxMind data file. Please <a target="_blank" href="https://slimstat.freshdesk.com/support/solutions/articles/12000039798-how-to-manually-install-the-maxmind-geolocation-data-file-">follow these steps</a> to download it manually.', 'wp-slimstat' ),
1631
- );
1632
-
1633
- // set_transient( 'slimstat_dynamic_strings', self::$dynamic_strings, 86400 );
1634
- }
1635
- }
1636
-
1637
- public static function get_country_codes() {
1638
- if ( empty( self::$dynamic_strings ) ) {
1639
- self::init_dynamic_strings();
1640
- }
1641
-
1642
- $country_codes = array();
1643
- foreach ( array_keys( self::$dynamic_strings ) as $a_code ) {
1644
- if ( strpos( $a_code, 'c-', 0 ) !== false && strlen( $a_code ) > 2 && $a_code != 'c-xx' && $a_code != 'c-xy' ) {
1645
- $country_codes[ strtolower( str_replace( 'c-', '', $a_code ) ) ] = self::$dynamic_strings[ $a_code ];
1646
- }
1647
- }
1648
-
1649
- return $country_codes;
1650
- }
1651
-
1652
- public static function get_string( $_code = '' ) {
1653
- if ( empty( self::$dynamic_strings ) ) {
1654
- self::init_dynamic_strings();
1655
- }
1656
-
1657
- if ( !isset( self::$dynamic_strings[ $_code ] ) ) {
1658
- return $_code;
1659
- }
1660
-
1661
- return self::$dynamic_strings[ $_code ];
1662
- }
1663
- }
18
  * Init -- Sets things up.
19
  */
20
  public static function init() {
 
21
  // self::$admin_notice = "Just a quick reminder that, in our quest for improved performance, we are deprecating the two columns <em>type</em> and <em>event_description</em> in the events table, and consolidating that information in the <em>notes</em> field. Code will be added to Slimstat in a few released to actually drop these columns from the database. If you are using those two columns in your custom code, please feel free to contact our support team to discuss your options and how to update your code using the information collected by the new tracker.";
22
+ self::$admin_notice = "In this day and age where every single social media platform knows our individual whereabouts on the Interwebs, we have been doing some research on what <em>the techies</em> out there call <a href='https://amiunique.org/fp' target='_blank'>browser fingerprinting</a>. With this technique, it is not necessary to rely on cookies to identify a specific user. This version of Slimstat implements <a href='https://github.com/Valve/fingerprintjs2' target='_blank'>FingerprintJS2</a>, a library that enables our tracker to record your users' unique fingerprint and local timezone (isn't it nice to know what time it was for the user when s/he was visiting your website?) Of course, if you have Privacy Mode enabled, this feature will not be used, in compliance with GDPR and other international privacy laws. Your visitors' fingerprints are now available in the Access Log and in the Filter dropdown. In the next few months, we plan to introduce new reports and to leverage this new information to increase the plugin's overall accuracy.";
23
 
24
  // Load language files
25
  load_plugin_textdomain( 'wp-slimstat', false, '/wp-slimstat/languages' );
347
  INDEX {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_dt_idx (dt),
348
  INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_resource_idx( resource( 20 ) ),
349
  INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_browser_idx( browser( 10 ) ),
350
+ INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_searchterms_idx( searchterms( 15 ) ),
351
+ INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_fingerprint_idx( fingerprint( 20 ) )
352
  ) COLLATE utf8_general_ci $use_innodb";
353
 
354
  // This table will track outbound links (clicks on links to external sites)
404
  public static function update_tables_and_options() {
405
  $my_wpdb = apply_filters( 'slimstat_custom_wpdb', $GLOBALS[ 'wpdb' ] );
406
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
407
  // --- Updates for version 4.8.2 ---
408
  if ( version_compare( wp_slimstat::$settings[ 'version' ], '4.8.2', '<' ) ) {
409
  // Add new email column to database
453
  }
454
  // --- END: Updates for version 4.8.4.1 ---
455
 
456
+ // --- Updates for version 4.8.8 ---
457
+ if ( version_compare( wp_slimstat::$settings[ 'version' ], '4.8.8', '<' ) ) {
458
+ // Adding new index on the 'fingerprint' column for improved performance
459
+ if ( wp_slimstat::$settings[ 'db_indexes' ] == 'on' ) {
460
+ $my_wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD INDEX {$GLOBALS[ 'wpdb' ]->prefix}stats_fingerprint_idx( fingerprint( 20 ) )" );
461
+ }
462
+
463
+ $my_wpdb->query( "UPDATE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats SET notes = CONCAT( '[', REPLACE( notes, ';', '][' ), ']' ) WHERE notes NOT LIKE '[%'" );
464
+ }
465
+
466
  // Now we can update the version stored in the database
467
  wp_slimstat::$settings[ 'version' ] = wp_slimstat::$version;
468
  wp_slimstat::$settings[ 'notice_latest_news' ] = 'on';
469
+ wp_slimstat::update_option( 'slimstat_options', wp_slimstat::$settings );
470
 
471
  return true;
472
  }
1045
  }
1046
  // END: _create_table
1047
  }
1048
+ // END: class declaration
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/view/index.php CHANGED
@@ -124,7 +124,7 @@
124
  </form>
125
 
126
  <?php
127
- if ( !file_exists( wp_slimstat::$maxmind_path ) && wp_slimstat::$settings[ 'notice_geolite' ] == 'on' ) {
128
  wp_slimstat_admin::show_message( sprintf( __( "<a href='%s' class='noslimstat'>Install MaxMind's GeoLite DB</a> to identify your visitors' country of origin.", 'wp-slimstat' ), self::$config_url . '6#wp-slimstat-third-party-libraries' ), 'warning', 'geolite' );
129
  }
130
 
124
  </form>
125
 
126
  <?php
127
+ if ( !file_exists( wp_slimstat::$upload_dir . '/maxmind.mmdb' ) && wp_slimstat::$settings[ 'notice_geolite' ] == 'on' ) {
128
  wp_slimstat_admin::show_message( sprintf( __( "<a href='%s' class='noslimstat'>Install MaxMind's GeoLite DB</a> to identify your visitors' country of origin.", 'wp-slimstat' ), self::$config_url . '6#wp-slimstat-third-party-libraries' ), 'warning', 'geolite' );
129
  }
130
 
admin/view/right-now.php CHANGED
@@ -6,6 +6,17 @@ if ( !function_exists( 'add_action' ) ) {
6
 
7
  $is_dashboard = empty( $_REQUEST[ 'page' ] ) || $_REQUEST[ 'page' ] != 'slimview1';
8
 
 
 
 
 
 
 
 
 
 
 
 
9
  // Available icons
10
  $supported_browser_icons = array( 'Android', 'Anonymouse', 'Baiduspider', 'BlackBerry', 'BingBot', 'CFNetwork', 'Chrome', 'Chromium', 'Default Browser', 'Edge', 'Exabot/BiggerBetter', 'FacebookExternalHit', 'FeedBurner', 'Feedfetcher-Google', 'Firefox', 'Internet Archive', 'Googlebot', 'Google Bot', 'Google Feedfetcher', 'Google Web Preview', 'IE', 'IEMobile', 'iPad', 'iPhone', 'iPod Touch', 'Maxthon', 'Mediapartners-Google', 'Microsoft-WebDAV', 'msnbot', 'Mozilla', 'NewsGatorOnline', 'Netscape', 'Nokia', 'Opera', 'Opera Mini', 'Opera Mobi', 'Pingdom', 'Python', 'PycURL', 'Safari', 'W3C_Validator', 'WordPress', 'Yahoo! Slurp', 'YandexBot' );
11
  $supported_os_icons = array( 'android',' blackberry os', 'cellos', 'chromeos', 'ios', 'iphone osx', 'java', 'linux', 'macos', 'macosx', 'rim os', 'symbianos', 'ubuntu', 'win7', 'win8', 'win8.1', 'win10', 'winphone7', 'winphone7.5', 'winphone8', 'winphone8.1', 'winvista', 'winxp' );
@@ -111,14 +122,15 @@ for ( $i=0; $i < $count_page_results; $i++ ) {
111
  if ( $i == 0 || $results[ $i - 1 ][ 'visit_id' ] != $results[ $i ][ 'visit_id' ] || $results[ $i - 1 ][ 'ip' ] != $results[ $i ][ 'ip' ] || $results[ $i - 1 ][ 'browser' ] != $results[ $i ][ 'browser' ] || $results[ $i - 1 ][ 'platform' ] != $results[ $i ][ 'platform' ] || $results[ $i - 1 ][ 'username' ] != $results[ $i ][ 'username' ] ) {
112
 
113
  // Color-coded headers
114
- $highlight_row = !empty( $results[ $i ][ 'searchterms' ] ) ? ' is-search-engine' : ( ( $results[ $i ][ 'browser_type' ] != 1 ) ? ' is-direct' : '' );
 
115
 
116
  // Country
117
  if ( !empty( $results[ $i ][ 'country' ] ) && $results[ $i ][ 'country' ] != 'xx' ) {
118
- $country_filter = "<a class='slimstat-filter-link inline-icon' href='" . wp_slimstat_reports::fs_url( 'country equals ' . $results[ $i ][ 'country' ] ) . "'><img class='slimstat-tooltip-trigger' src='$plugin_url/assets/images/flags/{$results[ $i ][ 'country' ]}.png' width='16' height='16' title='" . slim_i18n::get_string( 'c-' . $results[ $i ][ 'country' ] ) . "'></a>";
119
  }
120
  else {
121
- $country_filter = "<a class='slimstat-filter-link inline-icon' href='" . wp_slimstat_reports::fs_url( 'country is_empty #' ) . "'><img class='slimstat-tooltip-trigger' src='$plugin_url/assets/images/flags/xx.png' width='16' height='16' title='" . slim_i18n::get_string( 'c-' ) . "'></a>";
122
  }
123
 
124
  // City, if tracked
@@ -143,12 +155,12 @@ for ( $i=0; $i < $count_page_results; $i++ ) {
143
  if ( !empty( $results[ $i ][ 'platform' ] ) && in_array( $results[ $i ][ 'platform' ], $supported_os_icons ) ) {
144
  $platform_filter = esc_attr( $results[ $i ][ 'platform' ] );
145
  }
146
- $platform_filter = "<a class='slimstat-filter-link inline-icon' href='" . wp_slimstat_reports::fs_url( 'platform equals ' . $results[ $i ][ 'platform' ] ) . "'><img class='slimstat-tooltip-trigger' src='$plugin_url/assets/images/platforms/{$platform_filter}.png' width='16' height='16' title='" . slim_i18n::get_string( $results[ $i ][ 'platform' ] ) . "'></a>";
147
 
148
  // Language
149
  $language_filter = '';
150
  // if ( !empty( $results[ $i ][ 'language' ] ) && $results[ $i ][ 'language' ] != 'xx' ) {
151
- // $language_filter = '<span class="pageview-language"><a class="slimstat-filter-link" href="' . wp_slimstat_reports::fs_url( 'language equals ' . $results[ $i ][ 'language' ] ) . '">' . slim_i18n::get_string( 'l-' . $results[ $i ][ 'language' ] ) . '</a>';
152
  // }
153
 
154
  // Browser Type
@@ -191,7 +203,13 @@ for ( $i=0; $i < $count_page_results; $i++ ) {
191
  $screen_resolution = "<span class='pageview-screenres'>{$results[ $i ][ 'screen_width' ]}x{$results[ $i ][ 'screen_height' ]}</span>";
192
  }
193
 
194
- $row_output = "<p class='header$highlight_row'>$browser_filter $platform_filter $browser_type_filter $country_filter $whois_pin $city_filter $ip_address $other_ip_address $screen_resolution $language_filter</p>";
 
 
 
 
 
 
195
 
196
  // Strip all the filter links, if this information is shown on the frontend
197
  if ( !is_admin() ) {
@@ -215,7 +233,8 @@ for ( $i=0; $i < $count_page_results; $i++ ) {
215
  }
216
  else {
217
  if ( !empty( $results[$i][ 'notes' ] ) ) {
218
- $exploded_notes = explode( ';', $results[$i][ 'notes' ] );
 
219
  foreach ( $exploded_notes as $a_note ) {
220
  if ( strpos( $a_note, 'results:') !== false ) {
221
  $search_terms_info = $results[ $i ][ 'searchterms' ] . ' (' . $a_note . ')';
@@ -257,7 +276,7 @@ for ( $i=0; $i < $count_page_results; $i++ ) {
257
  // Pageview Notes
258
  $notes = '';
259
  if ( is_admin() && !empty( $results[ $i ][ 'notes' ] ) ) {
260
- $notes = str_replace(array(';', ':'), array('<br/>', ': '), $results[$i]['notes']);
261
  $notes = "<i class='slimstat-font-edit slimstat-tooltip-trigger'><b class='slimstat-tooltip-content'>{$notes}</b></i>";
262
  }
263
 
@@ -273,10 +292,11 @@ for ( $i=0; $i < $count_page_results; $i++ ) {
273
 
274
  // The Outbound Links field might contain more than one link
275
  if ( !empty( $results[ $i ][ 'outbound_resource' ] ) ) {
276
- $exploded_outbound_resources = explode( ';;;', $results[ $i ][ 'outbound_resource' ] );
277
- $results[$i][ 'outbound_resource' ] = '';
278
- foreach ( $exploded_outbound_resources as $a_resource ) {
279
- $results[ $i ][ 'outbound_resource' ] .= "<a class='inline-icon spaced slimstat-font-logout slimstat-tooltip-trigger' target='_blank' title='".htmlentities( __( 'Open this outbound link in a new window', 'wp-slimstat' ), ENT_QUOTES, 'UTF-8' ) . "' href='{$a_resource}'></a> {$a_resource}";
 
280
  }
281
  }
282
  else {
6
 
7
  $is_dashboard = empty( $_REQUEST[ 'page' ] ) || $_REQUEST[ 'page' ] != 'slimview1';
8
 
9
+ // Load the search engines list to mark pageviews accordingly
10
+ // Each entry contains the following attributes
11
+ // - params: which query string params is associated to the search keyword
12
+ // - backlink: format of the URL point to the search engine result page
13
+ // - charsets: list of charset used to encode the keywords
14
+ //
15
+ $search_engines = file_get_contents( plugin_dir_path( dirname( dirname( __FILE__ ) ) ) . 'vendor/matomo-searchengine.json' );
16
+ $search_engines = json_decode( $search_engines, TRUE );
17
+ // COMPLETE THIS FEATURE!!
18
+
19
+
20
  // Available icons
21
  $supported_browser_icons = array( 'Android', 'Anonymouse', 'Baiduspider', 'BlackBerry', 'BingBot', 'CFNetwork', 'Chrome', 'Chromium', 'Default Browser', 'Edge', 'Exabot/BiggerBetter', 'FacebookExternalHit', 'FeedBurner', 'Feedfetcher-Google', 'Firefox', 'Internet Archive', 'Googlebot', 'Google Bot', 'Google Feedfetcher', 'Google Web Preview', 'IE', 'IEMobile', 'iPad', 'iPhone', 'iPod Touch', 'Maxthon', 'Mediapartners-Google', 'Microsoft-WebDAV', 'msnbot', 'Mozilla', 'NewsGatorOnline', 'Netscape', 'Nokia', 'Opera', 'Opera Mini', 'Opera Mobi', 'Pingdom', 'Python', 'PycURL', 'Safari', 'W3C_Validator', 'WordPress', 'Yahoo! Slurp', 'YandexBot' );
22
  $supported_os_icons = array( 'android',' blackberry os', 'cellos', 'chromeos', 'ios', 'iphone osx', 'java', 'linux', 'macos', 'macosx', 'rim os', 'symbianos', 'ubuntu', 'win7', 'win8', 'win8.1', 'win10', 'winphone7', 'winphone7.5', 'winphone8', 'winphone8.1', 'winvista', 'winxp' );
122
  if ( $i == 0 || $results[ $i - 1 ][ 'visit_id' ] != $results[ $i ][ 'visit_id' ] || $results[ $i - 1 ][ 'ip' ] != $results[ $i ][ 'ip' ] || $results[ $i - 1 ][ 'browser' ] != $results[ $i ][ 'browser' ] || $results[ $i - 1 ][ 'platform' ] != $results[ $i ][ 'platform' ] || $results[ $i - 1 ][ 'username' ] != $results[ $i ][ 'username' ] ) {
123
 
124
  // Color-coded headers
125
+ $sek = wp_slimstat::get_lossy_url( parse_url( $results[ $i ][ 'referer' ], PHP_URL_HOST ) );
126
+ $highlight_row = !empty( $search_engines[ $sek ] ) ? ' is-search-engine' : ( ( $results[ $i ][ 'browser_type' ] != 1 ) ? ' is-direct' : '' );
127
 
128
  // Country
129
  if ( !empty( $results[ $i ][ 'country' ] ) && $results[ $i ][ 'country' ] != 'xx' ) {
130
+ $country_filter = "<a class='slimstat-filter-link inline-icon' href='" . wp_slimstat_reports::fs_url( 'country equals ' . $results[ $i ][ 'country' ] ) . "'><img class='slimstat-tooltip-trigger' src='$plugin_url/assets/images/flags/{$results[ $i ][ 'country' ]}.png' width='16' height='16' title='" . wp_slimstat_i18n::get_string( 'c-' . $results[ $i ][ 'country' ] ) . "'></a>";
131
  }
132
  else {
133
+ $country_filter = "<a class='slimstat-filter-link inline-icon' href='" . wp_slimstat_reports::fs_url( 'country is_empty #' ) . "'><img class='slimstat-tooltip-trigger' src='$plugin_url/assets/images/flags/xx.png' width='16' height='16' title='" . wp_slimstat_i18n::get_string( 'c-' ) . "'></a>";
134
  }
135
 
136
  // City, if tracked
155
  if ( !empty( $results[ $i ][ 'platform' ] ) && in_array( $results[ $i ][ 'platform' ], $supported_os_icons ) ) {
156
  $platform_filter = esc_attr( $results[ $i ][ 'platform' ] );
157
  }
158
+ $platform_filter = "<a class='slimstat-filter-link inline-icon' href='" . wp_slimstat_reports::fs_url( 'platform equals ' . $results[ $i ][ 'platform' ] ) . "'><img class='slimstat-tooltip-trigger' src='$plugin_url/assets/images/platforms/{$platform_filter}.png' width='16' height='16' title='" . wp_slimstat_i18n::get_string( $results[ $i ][ 'platform' ] ) . "'></a>";
159
 
160
  // Language
161
  $language_filter = '';
162
  // if ( !empty( $results[ $i ][ 'language' ] ) && $results[ $i ][ 'language' ] != 'xx' ) {
163
+ // $language_filter = '<span class="pageview-language"><a class="slimstat-filter-link" href="' . wp_slimstat_reports::fs_url( 'language equals ' . $results[ $i ][ 'language' ] ) . '">' . wp_slimstat_i18n::get_string( 'l-' . $results[ $i ][ 'language' ] ) . '</a>';
164
  // }
165
 
166
  // Browser Type
203
  $screen_resolution = "<span class='pageview-screenres'>{$results[ $i ][ 'screen_width' ]}x{$results[ $i ][ 'screen_height' ]}</span>";
204
  }
205
 
206
+ // Fingerprint
207
+ $fingerprint = '';
208
+ if ( !empty( $results[ $i ][ 'fingerprint' ] ) ) {
209
+ $fingerprint = "<span class='pageview-screenres'><code><a class='slimstat-filter-link slimstat-tooltip-trigger' href='" . wp_slimstat_reports::fs_url( 'fingerprint equals ' . $results[ $i ][ 'fingerprint' ] ) . "' title='" . $results[ $i ][ 'fingerprint' ] . "'>" . substr( $results[ $i ][ 'fingerprint' ], 0, 8 ) . "</a></code></span>";
210
+ }
211
+
212
+ $row_output = "<p class='header$highlight_row'>$browser_filter $platform_filter $browser_type_filter $country_filter $whois_pin $city_filter $ip_address $other_ip_address $fingerprint $screen_resolution $language_filter</p>";
213
 
214
  // Strip all the filter links, if this information is shown on the frontend
215
  if ( !is_admin() ) {
233
  }
234
  else {
235
  if ( !empty( $results[$i][ 'notes' ] ) ) {
236
+ $exploded_notes = explode( '][', substr( $results[ $i ][ 'notes' ], 1, -1 ) );
237
+
238
  foreach ( $exploded_notes as $a_note ) {
239
  if ( strpos( $a_note, 'results:') !== false ) {
240
  $search_terms_info = $results[ $i ][ 'searchterms' ] . ' (' . $a_note . ')';
276
  // Pageview Notes
277
  $notes = '';
278
  if ( is_admin() && !empty( $results[ $i ][ 'notes' ] ) ) {
279
+ $notes = str_replace( array( '][', ':', '[', ']' ), array( '<br/>', ': ', '', '' ), $results[ $i ][ 'notes' ] );
280
  $notes = "<i class='slimstat-font-edit slimstat-tooltip-trigger'><b class='slimstat-tooltip-content'>{$notes}</b></i>";
281
  }
282
 
292
 
293
  // The Outbound Links field might contain more than one link
294
  if ( !empty( $results[ $i ][ 'outbound_resource' ] ) ) {
295
+ if ( substr( $results[ $i ][ 'outbound_resource' ], 0, 1 ) != '#' ) {
296
+ $results[ $i ][ 'outbound_resource' ] = "<a class='inline-icon spaced slimstat-font-logout slimstat-tooltip-trigger' target='_blank' title='" . htmlentities( __( 'Open this outbound link in a new window', 'wp-slimstat' ), ENT_QUOTES, 'UTF-8' ) . "' href='{$results[ $i ][ 'outbound_resource' ]}'></a> {$results[ $i ][ 'outbound_resource' ]}";
297
+ }
298
+ else {
299
+ $results[ $i ][ 'outbound_resource' ] = "<i class='inline-icon spaced slimstat-font-logout'></i> {$results[ $i ][ 'outbound_resource' ]}";
300
  }
301
  }
302
  else {
admin/view/wp-slimstat-db.php CHANGED
@@ -37,6 +37,7 @@ class wp_slimstat_db {
37
  'email' => array( __( 'Visitor\'s Email', 'wp-slimstat' ), 'varchar' ),
38
  'outbound_resource' => array( __( 'Outbound Link', 'wp-slimstat' ), 'varchar' ),
39
  'tz_offset' => array( __( 'Timezone Offset', 'wp-slimstat' ), 'int' ),
 
40
  'page_performance' => array( __( 'Page Speed', 'wp-slimstat' ), 'int' ),
41
  'no_filter_selected_2' => array( '', 'none' ),
42
  'no_filter_selected_3' => array( __( '-- Advanced filters --', 'wp-slimstat' ), 'none' ),
@@ -916,7 +917,7 @@ class wp_slimstat_db {
916
  return self::get_results( "
917
  SELECT te.*, t1.resource
918
  FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_events te INNER JOIN {$GLOBALS[ 'wpdb' ]->prefix}slim_stats t1 ON te.id = t1.id
919
- WHERE " . wp_slimstat_db::get_combined_where( 'te.notes NOT LIKE "type:click%"', 'te.notes', true, 't1' ) . "
920
  ORDER BY te.dt DESC",
921
  'te.*, t1.resource',
922
  'dt DESC'
@@ -1016,7 +1017,7 @@ class wp_slimstat_db {
1016
  }
1017
  else {
1018
  $from = "{$GLOBALS['wpdb']->prefix}slim_events te INNER JOIN {$GLOBALS['wpdb']->prefix}slim_stats t1 ON te.id = t1.id";
1019
- $where = wp_slimstat_db::get_combined_where( 'notes NOT LIKE "type:click%"', 'notes', true, 't1' );
1020
  }
1021
 
1022
  return self::get_results( "
37
  'email' => array( __( 'Visitor\'s Email', 'wp-slimstat' ), 'varchar' ),
38
  'outbound_resource' => array( __( 'Outbound Link', 'wp-slimstat' ), 'varchar' ),
39
  'tz_offset' => array( __( 'Timezone Offset', 'wp-slimstat' ), 'int' ),
40
+ 'fingerprint' => array( __( 'Fingerprint', 'wp-slimstat' ), 'varchar' ),
41
  'page_performance' => array( __( 'Page Speed', 'wp-slimstat' ), 'int' ),
42
  'no_filter_selected_2' => array( '', 'none' ),
43
  'no_filter_selected_3' => array( __( '-- Advanced filters --', 'wp-slimstat' ), 'none' ),
917
  return self::get_results( "
918
  SELECT te.*, t1.resource
919
  FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_events te INNER JOIN {$GLOBALS[ 'wpdb' ]->prefix}slim_stats t1 ON te.id = t1.id
920
+ WHERE " . wp_slimstat_db::get_combined_where( 'te.notes NOT LIKE "_ype:click%"', 'te.notes', true, 't1' ) . "
921
  ORDER BY te.dt DESC",
922
  'te.*, t1.resource',
923
  'dt DESC'
1017
  }
1018
  else {
1019
  $from = "{$GLOBALS['wpdb']->prefix}slim_events te INNER JOIN {$GLOBALS['wpdb']->prefix}slim_stats t1 ON te.id = t1.id";
1020
+ $where = wp_slimstat_db::get_combined_where( 'notes NOT LIKE "_ype:click%"', 'notes', true, 't1' );
1021
  }
1022
 
1023
  return self::get_results( "
admin/view/wp-slimstat-reports.php CHANGED
@@ -26,6 +26,9 @@ class wp_slimstat_reports {
26
  include_once( 'wp-slimstat-db.php' );
27
  wp_slimstat_db::init();
28
 
 
 
 
29
  // Define all the reports
30
  //
31
  // Parameters
@@ -111,9 +114,7 @@ class wp_slimstat_reports {
111
  'callback' => array( __CLASS__, 'raw_results_to_html' ),
112
  'callback_args' => array(
113
  'type' => 'top',
114
- 'columns' => 'TRIM( TRAILING "/" FROM SUBSTRING_INDEX( resource, "' . ( !get_option( 'permalink_structure' ) ? '&' : '?' ) . '", 1 ) )',
115
- 'as_column' => 'resource',
116
- 'filter_op' => 'contains',
117
  'raw' => array( 'wp_slimstat_db', 'get_top' )
118
  ),
119
  'classes' => array( 'normal' ),
@@ -636,7 +637,7 @@ class wp_slimstat_reports {
636
  'tooltip' => __( 'You can configure Slimstat to track specific file extensions as downloads.', 'wp-slimstat' )
637
  ),
638
  'slim_p4_10' => array(
639
- 'title' => __( 'Recent Events', 'wp-slimstat' ),
640
  'callback' => array( __CLASS__, 'show_events' ),
641
  'callback_args' => array(
642
  'type' => 'recent',
@@ -660,7 +661,7 @@ class wp_slimstat_reports {
660
  'locations' => array( 'slimview4' )
661
  ),
662
  'slim_p4_12' => array(
663
- 'title' => __( 'Top Events', 'wp-slimstat' ),
664
  'callback' => array( __CLASS__, 'show_events' ),
665
  'callback_args' => array(
666
  'type' => 'top',
@@ -904,6 +905,7 @@ class wp_slimstat_reports {
904
  $header_classes = !empty( self::$reports[ $_report_id ][ 'classes' ] ) ? implode( ' ', self::$reports[ $_report_id ][ 'classes' ] ) : '';
905
  $header_buttons = '';
906
  $header_tooltip = '';
 
907
 
908
  // Don't show the header buttons on the frontend
909
  if ( is_admin() ) {
@@ -916,9 +918,10 @@ class wp_slimstat_reports {
916
  $header_buttons = apply_filters( 'slimstat_report_header_buttons', $header_buttons, $_report_id );
917
  $header_buttons = '<div class="slimstat-header-buttons">' . $header_buttons . '</div>';
918
  $header_tooltip = !empty( self::$reports[ $_report_id ][ 'tooltip' ] ) ? '<i class="slimstat-tooltip-trigger corner"><span class="slimstat-tooltip-content">' . self::$reports[ $_report_id ][ 'tooltip' ] . '</span></i>' : '';
 
919
  }
920
 
921
- echo "<div class='postbox $header_classes' id='$_report_id'>{$header_buttons} <h3 data-report-id='{$_report_id}'>" . self::$reports[ $_report_id ][ 'title' ] . " {$header_tooltip}</h3><div class='inside'>";
922
  }
923
 
924
  public static function report_footer(){
@@ -1062,7 +1065,7 @@ class wp_slimstat_reports {
1062
 
1063
  case 'country':
1064
  $row_details .= __( 'Code', 'wp-slimstat' ) . ": {$results[ $i ][ 'country' ]}";
1065
- $element_value = slim_i18n::get_string( 'c-' . $results[ $i ][ 'country' ] );
1066
  break;
1067
 
1068
  case 'id':
@@ -1077,17 +1080,18 @@ class wp_slimstat_reports {
1077
 
1078
  case 'language':
1079
  $row_details = __( 'Code', 'wp-slimstat' ) . ": {$results[ $i ][ $_args[ 'columns' ] ]}";
1080
- $element_value = slim_i18n::get_string( 'l-' . $results[ $i ][ $_args[ 'columns' ] ] );
1081
  break;
1082
 
1083
  case 'platform':
1084
  $row_details = __( 'Code', 'wp-slimstat' ).": {$results[ $i ][ $_args[ 'columns' ] ]}";
1085
- $element_value = slim_i18n::get_string( $results[ $i ][ $_args[ 'columns' ] ] );
1086
  $results[ $i ][ $_args[ 'columns' ] ] = str_replace( 'p-', '', $results[ $i ][ $_args[ 'columns' ] ] );
1087
  break;
1088
 
1089
  case 'referer':
1090
  $element_value = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), urldecode( $results[ $i ][ $_args[ 'columns' ] ] ) );
 
1091
  break;
1092
 
1093
  case 'resource':
@@ -1163,7 +1167,7 @@ class wp_slimstat_reports {
1163
  }
1164
 
1165
  // Some columns require a special post-treatment
1166
- if ( $_args[ 'columns' ] == 'resource' && strpos( $_args['where'], '404' ) === false ) {
1167
  $base_url = '';
1168
  if (isset($results[$i]['blog_id'])){
1169
  $base_url = parse_url(get_site_url($results[$i]['blog_id']));
@@ -1556,7 +1560,7 @@ class wp_slimstat_reports {
1556
 
1557
  $data_areas = array();
1558
 
1559
- foreach ( slim_i18n::get_country_codes() as $a_code => $a_string ) {
1560
  $data_areas[ $a_code ] = '{id:"' . $a_code . '",balloonText:"' . $a_string . ': 0",value:0,color:"#ededed"}';
1561
  }
1562
 
@@ -1570,7 +1574,7 @@ class wp_slimstat_reports {
1570
 
1571
  $percentage = ( wp_slimstat_db::$pageviews > 0 ) ? sprintf( "%01.2f", ( 100 * $a_country[ 'counthits' ] / wp_slimstat_db::$pageviews ) ) : 0;
1572
  $percentage_format = number_format_i18n( $percentage, 2 );
1573
- $balloon_text = slim_i18n::get_string( 'c-' . $a_country[ 'country' ], 'wp-slimstat' ) . ': ' . $percentage_format . '% (' . number_format_i18n( $a_country[ 'counthits' ] ) . ')';
1574
  $data_areas[ $current_country_code ] = '{id:"' . strtoupper( $a_country[ 'country' ] ) . '",balloonText:"' . $balloon_text . '",value:' . $percentage . '}';
1575
 
1576
  if ( $percentage > $max ) {
26
  include_once( 'wp-slimstat-db.php' );
27
  wp_slimstat_db::init();
28
 
29
+ // Include the localization library
30
+ include_once( plugin_dir_path( dirname( dirname( __FILE__ ) ) ) . 'languages/index.php' );
31
+
32
  // Define all the reports
33
  //
34
  // Parameters
114
  'callback' => array( __CLASS__, 'raw_results_to_html' ),
115
  'callback_args' => array(
116
  'type' => 'top',
117
+ 'columns' => 'resource',
 
 
118
  'raw' => array( 'wp_slimstat_db', 'get_top' )
119
  ),
120
  'classes' => array( 'normal' ),
637
  'tooltip' => __( 'You can configure Slimstat to track specific file extensions as downloads.', 'wp-slimstat' )
638
  ),
639
  'slim_p4_10' => array(
640
+ 'title' => __( 'Recent Custom Events', 'wp-slimstat' ),
641
  'callback' => array( __CLASS__, 'show_events' ),
642
  'callback_args' => array(
643
  'type' => 'recent',
661
  'locations' => array( 'slimview4' )
662
  ),
663
  'slim_p4_12' => array(
664
+ 'title' => __( 'Top Custom Events', 'wp-slimstat' ),
665
  'callback' => array( __CLASS__, 'show_events' ),
666
  'callback_args' => array(
667
  'type' => 'top',
905
  $header_classes = !empty( self::$reports[ $_report_id ][ 'classes' ] ) ? implode( ' ', self::$reports[ $_report_id ][ 'classes' ] ) : '';
906
  $header_buttons = '';
907
  $header_tooltip = '';
908
+ $widget_title = '';
909
 
910
  // Don't show the header buttons on the frontend
911
  if ( is_admin() ) {
918
  $header_buttons = apply_filters( 'slimstat_report_header_buttons', $header_buttons, $_report_id );
919
  $header_buttons = '<div class="slimstat-header-buttons">' . $header_buttons . '</div>';
920
  $header_tooltip = !empty( self::$reports[ $_report_id ][ 'tooltip' ] ) ? '<i class="slimstat-tooltip-trigger corner"><span class="slimstat-tooltip-content">' . self::$reports[ $_report_id ][ 'tooltip' ] . '</span></i>' : '';
921
+ $widget_title = "<h3 data-report-id='{$_report_id}'>" . self::$reports[ $_report_id ][ 'title' ] . "{$header_tooltip}</h3>";
922
  }
923
 
924
+ echo "<div class='postbox $header_classes' id='$_report_id'>{$header_buttons} $widget_title <div class='inside'>";
925
  }
926
 
927
  public static function report_footer(){
1065
 
1066
  case 'country':
1067
  $row_details .= __( 'Code', 'wp-slimstat' ) . ": {$results[ $i ][ 'country' ]}";
1068
+ $element_value = wp_slimstat_i18n::get_string( 'c-' . $results[ $i ][ 'country' ] );
1069
  break;
1070
 
1071
  case 'id':
1080
 
1081
  case 'language':
1082
  $row_details = __( 'Code', 'wp-slimstat' ) . ": {$results[ $i ][ $_args[ 'columns' ] ]}";
1083
+ $element_value = wp_slimstat_i18n::get_string( 'l-' . $results[ $i ][ $_args[ 'columns' ] ] );
1084
  break;
1085
 
1086
  case 'platform':
1087
  $row_details = __( 'Code', 'wp-slimstat' ).": {$results[ $i ][ $_args[ 'columns' ] ]}";
1088
+ $element_value = wp_slimstat_i18n::get_string( $results[ $i ][ $_args[ 'columns' ] ] );
1089
  $results[ $i ][ $_args[ 'columns' ] ] = str_replace( 'p-', '', $results[ $i ][ $_args[ 'columns' ] ] );
1090
  break;
1091
 
1092
  case 'referer':
1093
  $element_value = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), urldecode( $results[ $i ][ $_args[ 'columns' ] ] ) );
1094
+ $results[ $i ][ $_args[ 'columns' ] ] = 'https://' . $results[ $i ][ $_args[ 'columns' ] ];
1095
  break;
1096
 
1097
  case 'resource':
1167
  }
1168
 
1169
  // Some columns require a special post-treatment
1170
+ if ( $_args[ 'columns' ] == 'resource' && !empty( $_args[ 'where' ] ) && strpos( $_args[ 'where' ], '404' ) === false ) {
1171
  $base_url = '';
1172
  if (isset($results[$i]['blog_id'])){
1173
  $base_url = parse_url(get_site_url($results[$i]['blog_id']));
1560
 
1561
  $data_areas = array();
1562
 
1563
+ foreach ( wp_slimstat_i18n::get_country_codes() as $a_code => $a_string ) {
1564
  $data_areas[ $a_code ] = '{id:"' . $a_code . '",balloonText:"' . $a_string . ': 0",value:0,color:"#ededed"}';
1565
  }
1566
 
1574
 
1575
  $percentage = ( wp_slimstat_db::$pageviews > 0 ) ? sprintf( "%01.2f", ( 100 * $a_country[ 'counthits' ] / wp_slimstat_db::$pageviews ) ) : 0;
1576
  $percentage_format = number_format_i18n( $percentage, 2 );
1577
+ $balloon_text = wp_slimstat_i18n::get_string( 'c-' . $a_country[ 'country' ], 'wp-slimstat' ) . ': ' . $percentage_format . '% (' . number_format_i18n( $a_country[ 'counthits' ] ) . ')';
1578
  $data_areas[ $current_country_code ] = '{id:"' . strtoupper( $a_country[ 'country' ] ) . '",balloonText:"' . $balloon_text . '",value:' . $percentage . '}';
1579
 
1580
  if ( $percentage > $max ) {
languages/index.php CHANGED
@@ -1,2 +1,609 @@
1
  <?php
2
- // Silence is gold.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
+ class wp_slimstat_i18n {
3
+ public static $dynamic_strings = array();
4
+
5
+ public static function init_dynamic_strings() {
6
+ if ( false === ( self::$dynamic_strings = get_transient( 'slimstat_dynamic_strings' ) ) ) {
7
+ self::$dynamic_strings = array(
8
+ 'xx' => __( 'Unknown', 'wp-slimstat' ),
9
+
10
+ // Countries
11
+ 'c-' => __( 'Unknown', 'wp-slimstat' ),
12
+ 'c-xx' => __( 'Unknown', 'wp-slimstat' ),
13
+ 'c-xy' => __( 'Local IP Address', 'wp-slimstat' ),
14
+
15
+ 'c-af' => __( 'Afghanistan', 'wp-slimstat' ),
16
+ 'c-ax' => __( 'Aland Islands', 'wp-slimstat' ),
17
+ 'c-al' => __( 'Albania', 'wp-slimstat' ),
18
+ 'c-dz' => __( 'Algeria', 'wp-slimstat' ),
19
+ 'c-ad' => __( 'Andorra', 'wp-slimstat' ),
20
+ 'c-ao' => __( 'Angola', 'wp-slimstat' ),
21
+ 'c-ai' => __( 'Anguilla', 'wp-slimstat' ),
22
+ 'c-ag' => __( 'Antigua and Barbuda', 'wp-slimstat' ),
23
+ 'c-ar' => __( 'Argentina', 'wp-slimstat' ),
24
+ 'c-am' => __( 'Armenia', 'wp-slimstat' ),
25
+ 'c-aw' => __( 'Aruba', 'wp-slimstat' ),
26
+ 'c-au' => __( 'Australia', 'wp-slimstat' ),
27
+ 'c-at' => __( 'Austria', 'wp-slimstat' ),
28
+ 'c-az' => __( 'Azerbaijan', 'wp-slimstat' ),
29
+ 'c-bs' => __( 'Bahamas', 'wp-slimstat' ),
30
+ 'c-bh' => __( 'Bahrain', 'wp-slimstat' ),
31
+ 'c-bd' => __( 'Bangladesh', 'wp-slimstat' ),
32
+ 'c-bb' => __( 'Barbados', 'wp-slimstat' ),
33
+ 'c-by' => __( 'Belarus', 'wp-slimstat' ),
34
+ 'c-be' => __( 'Belgium', 'wp-slimstat' ),
35
+ 'c-bz' => __( 'Belize', 'wp-slimstat' ),
36
+ 'c-bj' => __( 'Benin', 'wp-slimstat' ),
37
+ 'c-bm' => __( 'Bermuda', 'wp-slimstat' ),
38
+ 'c-bt' => __( 'Bhutan', 'wp-slimstat' ),
39
+ 'c-bo' => __( 'Bolivia', 'wp-slimstat' ),
40
+ 'c-ba' => __( 'Bosnia and Herzegovina', 'wp-slimstat' ),
41
+ 'c-bw' => __( 'Botswana', 'wp-slimstat' ),
42
+ 'c-br' => __( 'Brazil', 'wp-slimstat' ),
43
+ 'c-bn' => __( 'Brunei Darussalam', 'wp-slimstat' ),
44
+ 'c-bg' => __( 'Bulgaria', 'wp-slimstat' ),
45
+ 'c-bf' => __( 'Burkina Faso', 'wp-slimstat' ),
46
+ 'c-bi' => __( 'Burundi', 'wp-slimstat' ),
47
+ 'c-kh' => __( 'Cambodia', 'wp-slimstat' ),
48
+ 'c-cm' => __( 'Cameroon', 'wp-slimstat' ),
49
+ 'c-ca' => __( 'Canada', 'wp-slimstat' ),
50
+ 'c-cv' => __( 'Cape Verde', 'wp-slimstat' ),
51
+ 'c-ky' => __( 'Cayman Islands', 'wp-slimstat' ),
52
+ 'c-cf' => __( 'Central African Republic', 'wp-slimstat' ),
53
+ 'c-td' => __( 'Chad', 'wp-slimstat' ),
54
+ 'c-cl' => __( 'Chile', 'wp-slimstat' ),
55
+ 'c-cn' => __( 'China', 'wp-slimstat' ),
56
+ 'c-co' => __( 'Colombia', 'wp-slimstat' ),
57
+ 'c-km' => __( 'Comoros', 'wp-slimstat' ),
58
+ 'c-cg' => __( 'Congo', 'wp-slimstat' ),
59
+ 'c-cd' => __( 'The Democratic Republic of the Congo', 'wp-slimstat' ),
60
+ 'c-cr' => __( 'Costa Rica', 'wp-slimstat' ),
61
+ 'c-ci' => __( 'Côte d\'Ivoire', 'wp-slimstat' ),
62
+ 'c-hr' => __( 'Croatia', 'wp-slimstat' ),
63
+ 'c-cu' => __( 'Cuba', 'wp-slimstat' ),
64
+ 'c-cy' => __( 'Cyprus', 'wp-slimstat' ),
65
+ 'c-cz' => __( 'Czech Republic', 'wp-slimstat' ),
66
+ 'c-dk' => __( 'Denmark', 'wp-slimstat' ),
67
+ 'c-dj' => __( 'Djibouti', 'wp-slimstat' ),
68
+ 'c-dm' => __( 'Dominica', 'wp-slimstat' ),
69
+ 'c-do' => __( 'Dominican Republic', 'wp-slimstat' ),
70
+ 'c-ec' => __( 'Ecuador', 'wp-slimstat' ),
71
+ 'c-eg' => __( 'Egypt', 'wp-slimstat' ),
72
+ 'c-sv' => __( 'El Salvador', 'wp-slimstat' ),
73
+ 'c-gq' => __( 'Equatorial Guinea', 'wp-slimstat' ),
74
+ 'c-er' => __( 'Eritrea', 'wp-slimstat' ),
75
+ 'c-ee' => __( 'Estonia', 'wp-slimstat' ),
76
+ 'c-et' => __( 'Ethiopia', 'wp-slimstat' ),
77
+ 'c-fo' => __( 'Faroe Islands', 'wp-slimstat' ),
78
+ 'c-fk' => __( 'Falkland Islands (Malvinas)', 'wp-slimstat' ),
79
+ 'c-fj' => __( 'Fiji', 'wp-slimstat' ),
80
+ 'c-fi' => __( 'Finland', 'wp-slimstat' ),
81
+ 'c-fr' => __( 'France', 'wp-slimstat' ),
82
+ 'c-gf' => __( 'French Guiana', 'wp-slimstat' ),
83
+ 'c-ga' => __( 'Gabon', 'wp-slimstat' ),
84
+ 'c-gm' => __( 'Gambia', 'wp-slimstat' ),
85
+ 'c-ge' => __( 'Georgia', 'wp-slimstat' ),
86
+ 'c-de' => __( 'Germany', 'wp-slimstat' ),
87
+ 'c-gh' => __( 'Ghana', 'wp-slimstat' ),
88
+ 'c-gr' => __( 'Greece', 'wp-slimstat' ),
89
+ 'c-gl' => __( 'Greenland', 'wp-slimstat' ),
90
+ 'c-gd' => __( 'Grenada', 'wp-slimstat' ),
91
+ 'c-gp' => __( 'Guadeloupe', 'wp-slimstat' ),
92
+ 'c-gt' => __( 'Guatemala', 'wp-slimstat' ),
93
+ 'c-gn' => __( 'Guinea', 'wp-slimstat' ),
94
+ 'c-gw' => __( 'Guinea-Bissau', 'wp-slimstat' ),
95
+ 'c-gy' => __( 'Guyana', 'wp-slimstat' ),
96
+ 'c-ht' => __( 'Haiti', 'wp-slimstat' ),
97
+ 'c-hn' => __( 'Honduras', 'wp-slimstat' ),
98
+ 'c-hk' => __( 'Hong Kong', 'wp-slimstat' ),
99
+ 'c-hu' => __( 'Hungary', 'wp-slimstat' ),
100
+ 'c-is' => __( 'Iceland', 'wp-slimstat' ),
101
+ 'c-in' => __( 'India', 'wp-slimstat' ),
102
+ 'c-id' => __( 'Indonesia', 'wp-slimstat' ),
103
+ 'c-ir' => __( 'Islamic Republic of Iran', 'wp-slimstat' ),
104
+ 'c-iq' => __( 'Iraq', 'wp-slimstat' ),
105
+ 'c-ie' => __( 'Ireland', 'wp-slimstat' ),
106
+ 'c-il' => __( 'Israel', 'wp-slimstat' ),
107
+ 'c-it' => __( 'Italy', 'wp-slimstat' ),
108
+ 'c-jm' => __( 'Jamaica', 'wp-slimstat' ),
109
+ 'c-jp' => __( 'Japan', 'wp-slimstat' ),
110
+ 'c-jo' => __( 'Jordan', 'wp-slimstat' ),
111
+ 'c-kz' => __( 'Kazakhstan', 'wp-slimstat' ),
112
+ 'c-ke' => __( 'Kenya', 'wp-slimstat' ),
113
+ 'c-nr' => __( 'Nauru', 'wp-slimstat' ),
114
+ 'c-kp' => __( 'Democratic People\'s Republic of Korea', 'wp-slimstat' ),
115
+ 'c-kr' => __( 'Republic of Korea', 'wp-slimstat' ),
116
+ 'c-kv' => __( 'Kosovo', 'wp-slimstat' ),
117
+ 'c-kw' => __( 'Kuwait', 'wp-slimstat' ),
118
+ 'c-kg' => __( 'Kyrgyzstan', 'wp-slimstat' ),
119
+ 'c-la' => __( 'Lao People\'s Democratic Republic', 'wp-slimstat' ),
120
+ 'c-lv' => __( 'Latvia', 'wp-slimstat' ),
121
+ 'c-lb' => __( 'Lebanon', 'wp-slimstat' ),
122
+ 'c-ls' => __( 'Lesotho', 'wp-slimstat' ),
123
+ 'c-lr' => __( 'Liberia', 'wp-slimstat' ),
124
+ 'c-ly' => __( 'Libyan Arab Jamahiriya', 'wp-slimstat' ),
125
+ 'c-li' => __( 'Liechtenstein', 'wp-slimstat' ),
126
+ 'c-lt' => __( 'Lithuania', 'wp-slimstat' ),
127
+ 'c-lu' => __( 'Luxembourg', 'wp-slimstat' ),
128
+ 'c-mk' => __( 'The Former Yugoslav Republic of Macedonia', 'wp-slimstat' ),
129
+ 'c-mg' => __( 'Madagascar', 'wp-slimstat' ),
130
+ 'c-mw' => __( 'Malawi', 'wp-slimstat' ),
131
+ 'c-my' => __( 'Malaysia', 'wp-slimstat' ),
132
+ 'c-ml' => __( 'Mali', 'wp-slimstat' ),
133
+ 'c-mt' => __( 'Malta', 'wp-slimstat' ),
134
+ 'c-mq' => __( 'Martinique', 'wp-slimstat' ),
135
+ 'c-mr' => __( 'Mauritania', 'wp-slimstat' ),
136
+ 'c-mu' => __( 'Mauritius', 'wp-slimstat' ),
137
+ 'c-mx' => __( 'Mexico', 'wp-slimstat' ),
138
+ 'c-md' => __( 'Moldova', 'wp-slimstat' ),
139
+ 'c-mn' => __( 'Mongolia', 'wp-slimstat' ),
140
+ 'c-me' => __( 'Montenegro', 'wp-slimstat' ),
141
+ 'c-ms' => __( 'Montserrat', 'wp-slimstat' ),
142
+ 'c-ma' => __( 'Morocco', 'wp-slimstat' ),
143
+ 'c-mz' => __( 'Mozambique', 'wp-slimstat' ),
144
+ 'c-mm' => __( 'Myanmar', 'wp-slimstat' ),
145
+ 'c-na' => __( 'Namibia', 'wp-slimstat' ),
146
+ 'c-np' => __( 'Nepal', 'wp-slimstat' ),
147
+ 'c-nl' => __( 'Netherlands', 'wp-slimstat' ),
148
+ 'c-nc' => __( 'New Caledonia', 'wp-slimstat' ),
149
+ 'c-nz' => __( 'New Zealand', 'wp-slimstat' ),
150
+ 'c-ni' => __( 'Nicaragua', 'wp-slimstat' ),
151
+ 'c-ne' => __( 'Niger', 'wp-slimstat' ),
152
+ 'c-ng' => __( 'Nigeria', 'wp-slimstat' ),
153
+ 'c-no' => __( 'Norway', 'wp-slimstat' ),
154
+ 'c-om' => __( 'Oman', 'wp-slimstat' ),
155
+ 'c-pk' => __( 'Pakistan', 'wp-slimstat' ),
156
+ 'c-pw' => __( 'Palau', 'wp-slimstat' ),
157
+ 'c-ps' => __( 'Occupied Palestinian Territory', 'wp-slimstat' ),
158
+ 'c-pa' => __( 'Panama', 'wp-slimstat' ),
159
+ 'c-pg' => __( 'Papua New Guinea', 'wp-slimstat' ),
160
+ 'c-py' => __( 'Paraguay', 'wp-slimstat' ),
161
+ 'c-pe' => __( 'Peru', 'wp-slimstat' ),
162
+ 'c-ph' => __( 'Philippines', 'wp-slimstat' ),
163
+ 'c-pl' => __( 'Poland', 'wp-slimstat' ),
164
+ 'c-pt' => __( 'Portugal', 'wp-slimstat' ),
165
+ 'c-pr' => __( 'Puerto Rico', 'wp-slimstat' ),
166
+ 'c-qa' => __( 'Qatar', 'wp-slimstat' ),
167
+ 'c-re' => __( 'Réunion', 'wp-slimstat' ),
168
+ 'c-ro' => __( 'Romania', 'wp-slimstat' ),
169
+ 'c-ru' => __( 'Russian Federation', 'wp-slimstat' ),
170
+ 'c-rw' => __( 'Rwanda', 'wp-slimstat' ),
171
+ 'c-kn' => __( 'Saint Kitts and Nevis', 'wp-slimstat' ),
172
+ 'c-lc' => __( 'Saint Lucia', 'wp-slimstat' ),
173
+ 'c-mf' => __( 'Saint Martin', 'wp-slimstat' ),
174
+ 'c-vc' => __( 'Saint Vincent and the Grenadines', 'wp-slimstat' ),
175
+ 'c-ws' => __( 'Samoa', 'wp-slimstat' ),
176
+ 'c-st' => __( 'Sao Tome and Principe', 'wp-slimstat' ),
177
+ 'c-sa' => __( 'Saudi Arabia', 'wp-slimstat' ),
178
+ 'c-sn' => __( 'Senegal', 'wp-slimstat' ),
179
+ 'c-rs' => __( 'Serbia', 'wp-slimstat' ),
180
+ 'c-sl' => __( 'Sierra Leone', 'wp-slimstat' ),
181
+ 'c-sg' => __( 'Singapore', 'wp-slimstat' ),
182
+ 'c-sk' => __( 'Slovakia', 'wp-slimstat' ),
183
+ 'c-si' => __( 'Slovenia', 'wp-slimstat' ),
184
+ 'c-sb' => __( 'Solomon Islands', 'wp-slimstat' ),
185
+ 'c-so' => __( 'Somalia', 'wp-slimstat' ),
186
+ 'c-za' => __( 'South Africa', 'wp-slimstat' ),
187
+ 'c-gs' => __( 'South Georgia and the South Sandwich Islands', 'wp-slimstat' ),
188
+ 'c-es' => __( 'Spain', 'wp-slimstat' ),
189
+ 'c-lk' => __( 'Sri Lanka', 'wp-slimstat' ),
190
+ 'c-sc' => __( 'Seychelles', 'wp-slimstat' ),
191
+ 'c-sd' => __( 'Sudan', 'wp-slimstat' ),
192
+ 'c-ss' => __( 'South Sudan', 'wp-slimstat' ),
193
+ 'c-sr' => __( 'Suriname', 'wp-slimstat' ),
194
+ 'c-sj' => __( 'Svalbard and Jan Mayen', 'wp-slimstat' ),
195
+ 'c-sz' => __( 'Swaziland', 'wp-slimstat' ),
196
+ 'c-se' => __( 'Sweden', 'wp-slimstat' ),
197
+ 'c-ch' => __( 'Switzerland', 'wp-slimstat' ),
198
+ 'c-sy' => __( 'Syrian Arab Republic', 'wp-slimstat' ),
199
+ 'c-tw' => __( 'Taiwan', 'wp-slimstat' ),
200
+ 'c-tj' => __( 'Tajikistan', 'wp-slimstat' ),
201
+ 'c-tz' => __( 'United Republic of Tanzania', 'wp-slimstat' ),
202
+ 'c-th' => __( 'Thailand', 'wp-slimstat' ),
203
+ 'c-tl' => __( 'Timor-Leste', 'wp-slimstat' ),
204
+ 'c-tg' => __( 'Togo', 'wp-slimstat' ),
205
+ 'c-to' => __( 'Tonga', 'wp-slimstat' ),
206
+ 'c-tt' => __( 'Trinidad and Tobago', 'wp-slimstat' ),
207
+ 'c-tn' => __( 'Tunisia', 'wp-slimstat' ),
208
+ 'c-tr' => __( 'Turkey', 'wp-slimstat' ),
209
+ 'c-tm' => __( 'Turkmenistan', 'wp-slimstat' ),
210
+ 'c-tc' => __( 'Turks and Caicos Islands', 'wp-slimstat' ),
211
+ 'c-ug' => __( 'Uganda', 'wp-slimstat' ),
212
+ 'c-ua' => __( 'Ukraine', 'wp-slimstat' ),
213
+ 'c-ae' => __( 'United Arab Emirates', 'wp-slimstat' ),
214
+ 'c-gb' => __( 'United Kingdom', 'wp-slimstat' ),
215
+ 'c-us' => __( 'United States', 'wp-slimstat' ),
216
+ 'c-uy' => __( 'Uruguay', 'wp-slimstat' ),
217
+ 'c-uz' => __( 'Uzbekistan', 'wp-slimstat' ),
218
+ 'c-vu' => __( 'Vanuatu', 'wp-slimstat' ),
219
+ 'c-ve' => __( 'Venezuela', 'wp-slimstat' ),
220
+ 'c-vn' => __( 'Viet Nam', 'wp-slimstat' ),
221
+ 'c-vg' => __( 'British Virgin Islands', 'wp-slimstat' ),
222
+ 'c-vi' => __( 'U.S. Virgin Islands', 'wp-slimstat' ),
223
+ 'c-eh' => __( 'Western Sahara', 'wp-slimstat' ),
224
+ 'c-ye' => __( 'Yemen', 'wp-slimstat' ),
225
+ 'c-zm' => __( 'Zambia', 'wp-slimstat' ),
226
+ 'c-zw' => __( 'Zimbabwe', 'wp-slimstat' ),
227
+ 'c-gg' => __( 'Guernsey', 'wp-slimstat' ),
228
+ 'c-je' => __( 'Jersey', 'wp-slimstat' ),
229
+ 'c-im' => __( 'Isle of Man', 'wp-slimstat' ),
230
+ 'c-mv' => __( 'Maldives', 'wp-slimstat' ),
231
+ 'c-eu' => __( 'Europe', 'wp-slimstat' ),
232
+
233
+ // Languages
234
+ 'l-' => __( 'Unknown', 'wp-slimstat' ),
235
+ 'l-empty' => __( 'Unknown', 'wp-slimstat' ),
236
+ 'l-xx' => __( 'Unknown', 'wp-slimstat' ),
237
+
238
+ 'l-af' => __( 'Afrikaans', 'wp-slimstat' ),
239
+ 'l-af-za' => __( 'Afrikaans (South Africa)', 'wp-slimstat' ),
240
+ 'l-ar' => __( 'Arabic', 'wp-slimstat' ),
241
+ 'l-ar-ae' => __( 'Arabic (U.A.E.)', 'wp-slimstat' ),
242
+ 'l-ar-bh' => __( 'Arabic (Bahrain)', 'wp-slimstat' ),
243
+ 'l-ar-dz' => __( 'Arabic (Algeria)', 'wp-slimstat' ),
244
+ 'l-ar-eg' => __( 'Arabic (Egypt)', 'wp-slimstat' ),
245
+ 'l-ar-iq' => __( 'Arabic (Iraq)', 'wp-slimstat' ),
246
+ 'l-ar-jo' => __( 'Arabic (Jordan)', 'wp-slimstat' ),
247
+ 'l-ar-kw' => __( 'Arabic (Kuwait)', 'wp-slimstat' ),
248
+ 'l-ar-lb' => __( 'Arabic (Lebanon)', 'wp-slimstat' ),
249
+ 'l-ar-ly' => __( 'Arabic (Libya)', 'wp-slimstat' ),
250
+ 'l-ar-ma' => __( 'Arabic (Morocco)', 'wp-slimstat' ),
251
+ 'l-ar-om' => __( 'Arabic (Oman)', 'wp-slimstat' ),
252
+ 'l-ar-qa' => __( 'Arabic (Qatar)', 'wp-slimstat' ),
253
+ 'l-ar-sa' => __( 'Arabic (Saudi Arabia)', 'wp-slimstat' ),
254
+ 'l-ar-sy' => __( 'Arabic (Syria)', 'wp-slimstat' ),
255
+ 'l-ar-tn' => __( 'Arabic (Tunisia)', 'wp-slimstat' ),
256
+ 'l-ar-ye' => __( 'Arabic (Yemen)', 'wp-slimstat' ),
257
+ 'l-az' => __( 'Azeri (Latin)', 'wp-slimstat' ),
258
+ 'l-az-az' => __( 'Azeri (Latin) (Azerbaijan)', 'wp-slimstat' ),
259
+ 'l-be' => __( 'Belarusian', 'wp-slimstat' ),
260
+ 'l-be-by' => __( 'Belarusian (Belarus)', 'wp-slimstat' ),
261
+ 'l-bg' => __( 'Bulgarian', 'wp-slimstat' ),
262
+ 'l-bg-bg' => __( 'Bulgarian (Bulgaria)', 'wp-slimstat' ),
263
+ 'l-bs-ba' => __( 'Bosnian (Bosnia and Herzegovina)', 'wp-slimstat' ),
264
+ 'l-ca' => __( 'Catalan', 'wp-slimstat' ),
265
+ 'l-ca-es' => __( 'Catalan (Spain)', 'wp-slimstat' ),
266
+ 'l-cs' => __( 'Czech', 'wp-slimstat' ),
267
+ 'l-cs-cz' => __( 'Czech (Czech Republic)', 'wp-slimstat' ),
268
+ 'l-cy' => __( 'Welsh', 'wp-slimstat' ),
269
+ 'l-cy-gb' => __( 'Welsh (United Kingdom)', 'wp-slimstat' ),
270
+ 'l-da' => __( 'Danish', 'wp-slimstat' ),
271
+ 'l-da-dk' => __( 'Danish (Denmark)', 'wp-slimstat' ),
272
+ 'l-de' => __( 'German', 'wp-slimstat' ),
273
+ 'l-de-at' => __( 'German (Austria)', 'wp-slimstat' ),
274
+ 'l-de-ch' => __( 'German (Switzerland)', 'wp-slimstat' ),
275
+ 'l-de-de' => __( 'German (Germany)', 'wp-slimstat' ),
276
+ 'l-de-li' => __( 'German (Liechtenstein)', 'wp-slimstat' ),
277
+ 'l-de-lu' => __( 'German (Luxembourg)', 'wp-slimstat' ),
278
+ 'l-dv' => __( 'Divehi', 'wp-slimstat' ),
279
+ 'l-dv-mv' => __( 'Divehi (Maldives)', 'wp-slimstat' ),
280
+ 'l-el' => __( 'Greek', 'wp-slimstat' ),
281
+ 'l-el-gr' => __( 'Greek (Greece)', 'wp-slimstat' ),
282
+ 'l-en' => __( 'English', 'wp-slimstat' ),
283
+ 'l-en-au' => __( 'English (Australia)', 'wp-slimstat' ),
284
+ 'l-en-bz' => __( 'English (Belize)', 'wp-slimstat' ),
285
+ 'l-en-ca' => __( 'English (Canada)', 'wp-slimstat' ),
286
+ 'l-en-cb' => __( 'English (Caribbean)', 'wp-slimstat' ),
287
+ 'l-en-gb' => __( 'English (United Kingdom)', 'wp-slimstat' ),
288
+ 'l-en-ie' => __( 'English (Ireland)', 'wp-slimstat' ),
289
+ 'l-en-jm' => __( 'English (Jamaica)', 'wp-slimstat' ),
290
+ 'l-en-nz' => __( 'English (New Zealand)', 'wp-slimstat' ),
291
+ 'l-en-ph' => __( 'English (Republic of the Philippines)', 'wp-slimstat' ),
292
+ 'l-en-tt' => __( 'English (Trinidad and Tobago)', 'wp-slimstat' ),
293
+ 'l-en-us' => __( 'English (United States)', 'wp-slimstat' ),
294
+ 'l-en-za' => __( 'English (South Africa)', 'wp-slimstat' ),
295
+ 'l-en-zw' => __( 'English (Zimbabwe)', 'wp-slimstat' ),
296
+ 'l-eo' => __( 'Esperanto', 'wp-slimstat' ),
297
+ 'l-es' => __( 'Spanish', 'wp-slimstat' ),
298
+ 'l-es-ar' => __( 'Spanish (Argentina)', 'wp-slimstat' ),
299
+ 'l-es-bo' => __( 'Spanish (Bolivia)', 'wp-slimstat' ),
300
+ 'l-es-cl' => __( 'Spanish (Chile)', 'wp-slimstat' ),
301
+ 'l-es-co' => __( 'Spanish (Colombia)', 'wp-slimstat' ),
302
+ 'l-es-cr' => __( 'Spanish (Costa Rica)', 'wp-slimstat' ),
303
+ 'l-es-do' => __( 'Spanish (Dominican Republic)', 'wp-slimstat' ),
304
+ 'l-es-ec' => __( 'Spanish (Ecuador)', 'wp-slimstat' ),
305
+ 'l-es-es' => __( 'Spanish (Spain)', 'wp-slimstat' ),
306
+ 'l-es-gt' => __( 'Spanish (Guatemala)', 'wp-slimstat' ),
307
+ 'l-es-hn' => __( 'Spanish (Honduras)', 'wp-slimstat' ),
308
+ 'l-es-mx' => __( 'Spanish (Mexico)', 'wp-slimstat' ),
309
+ 'l-es-ni' => __( 'Spanish (Nicaragua)', 'wp-slimstat' ),
310
+ 'l-es-pa' => __( 'Spanish (Panama)', 'wp-slimstat' ),
311
+ 'l-es-pe' => __( 'Spanish (Peru)', 'wp-slimstat' ),
312
+ 'l-es-pr' => __( 'Spanish (Puerto Rico)', 'wp-slimstat' ),
313
+ 'l-es-py' => __( 'Spanish (Paraguay)', 'wp-slimstat' ),
314
+ 'l-es-sv' => __( 'Spanish (El Salvador)', 'wp-slimstat' ),
315
+ 'l-es-uy' => __( 'Spanish (Uruguay)', 'wp-slimstat' ),
316
+ 'l-es-ve' => __( 'Spanish (Venezuela)', 'wp-slimstat' ),
317
+ 'l-et' => __( 'Estonian', 'wp-slimstat' ),
318
+ 'l-et-ee' => __( 'Estonian (Estonia)', 'wp-slimstat' ),
319
+ 'l-eu' => __( 'Basque', 'wp-slimstat' ),
320
+ 'l-eu-es' => __( 'Basque (Spain)', 'wp-slimstat' ),
321
+ 'l-fa' => __( 'Farsi', 'wp-slimstat' ),
322
+ 'l-fa-ir' => __( 'Farsi (Iran)', 'wp-slimstat' ),
323
+ 'l-fi' => __( 'Finnish', 'wp-slimstat' ),
324
+ 'l-fi-fi' => __( 'Finnish (Finland)', 'wp-slimstat' ),
325
+ 'l-fo' => __( 'Faroese', 'wp-slimstat' ),
326
+ 'l-fo-fo' => __( 'Faroese (Faroe Islands)', 'wp-slimstat' ),
327
+ 'l-fr' => __( 'French', 'wp-slimstat' ),
328
+ 'l-fr-be' => __( 'French (Belgium)', 'wp-slimstat' ),
329
+ 'l-fr-ca' => __( 'French (Canada)', 'wp-slimstat' ),
330
+ 'l-fr-ch' => __( 'French (Switzerland)', 'wp-slimstat' ),
331
+ 'l-fr-fr' => __( 'French (France)', 'wp-slimstat' ),
332
+ 'l-fr-lu' => __( 'French (Luxembourg)', 'wp-slimstat' ),
333
+ 'l-fr-mc' => __( 'French (Principality of Monaco)', 'wp-slimstat' ),
334
+ 'l-gl' => __( 'Galician', 'wp-slimstat' ),
335
+ 'l-gl-es' => __( 'Galician (Spain)', 'wp-slimstat' ),
336
+ 'l-gu' => __( 'Gujarati', 'wp-slimstat' ),
337
+ 'l-gu-in' => __( 'Gujarati (India)', 'wp-slimstat' ),
338
+ 'l-he' => __( 'Hebrew', 'wp-slimstat' ),
339
+ 'l-he-il' => __( 'Hebrew (Israel)', 'wp-slimstat' ),
340
+ 'l-hi' => __( 'Hindi', 'wp-slimstat' ),
341
+ 'l-hi-in' => __( 'Hindi (India)', 'wp-slimstat' ),
342
+ 'l-hr' => __( 'Croatian', 'wp-slimstat' ),
343
+ 'l-hr-ba' => __( 'Croatian (Bosnia and Herzegovina)', 'wp-slimstat' ),
344
+ 'l-hr-hr' => __( 'Croatian (Croatia)', 'wp-slimstat' ),
345
+ 'l-hu' => __( 'Hungarian', 'wp-slimstat' ),
346
+ 'l-hu-hu' => __( 'Hungarian (Hungary)', 'wp-slimstat' ),
347
+ 'l-hy' => __( 'Armenian', 'wp-slimstat' ),
348
+ 'l-hy-am' => __( 'Armenian (Armenia)', 'wp-slimstat' ),
349
+ 'l-id' => __( 'Indonesian', 'wp-slimstat' ),
350
+ 'l-id-id' => __( 'Indonesian (Indonesia)', 'wp-slimstat' ),
351
+ 'l-is' => __( 'Icelandic', 'wp-slimstat' ),
352
+ 'l-is-is' => __( 'Icelandic (Iceland)', 'wp-slimstat' ),
353
+ 'l-it' => __( 'Italian', 'wp-slimstat' ),
354
+ 'l-it-ch' => __( 'Italian (Switzerland)', 'wp-slimstat' ),
355
+ 'l-it-it' => __( 'Italian (Italy)', 'wp-slimstat' ),
356
+ 'l-ja' => __( 'Japanese', 'wp-slimstat' ),
357
+ 'l-ja-jp' => __( 'Japanese (Japan)', 'wp-slimstat' ),
358
+ 'l-ka' => __( 'Georgian', 'wp-slimstat' ),
359
+ 'l-ka-ge' => __( 'Georgian (Georgia)', 'wp-slimstat' ),
360
+ 'l-kk' => __( 'Kazakh', 'wp-slimstat' ),
361
+ 'l-kk-kz' => __( 'Kazakh (Kazakhstan)', 'wp-slimstat' ),
362
+ 'l-kn' => __( 'Kannada', 'wp-slimstat' ),
363
+ 'l-kn-in' => __( 'Kannada (India)', 'wp-slimstat' ),
364
+ 'l-ko' => __( 'Korean', 'wp-slimstat' ),
365
+ 'l-ko-kr' => __( 'Korean (Korea)', 'wp-slimstat' ),
366
+ 'l-kok' => __( 'Konkani', 'wp-slimstat' ),
367
+ 'l-kok-in' => __( 'Konkani (India)', 'wp-slimstat' ),
368
+ 'l-ky' => __( 'Kyrgyz', 'wp-slimstat' ),
369
+ 'l-ky-kg' => __( 'Kyrgyz (Kyrgyzstan)', 'wp-slimstat' ),
370
+ 'l-lt' => __( 'Lithuanian', 'wp-slimstat' ),
371
+ 'l-lt-lt' => __( 'Lithuanian (Lithuania)', 'wp-slimstat' ),
372
+ 'l-lv' => __( 'Latvian', 'wp-slimstat' ),
373
+ 'l-lv-lv' => __( 'Latvian (Latvia)', 'wp-slimstat' ),
374
+ 'l-mi' => __( 'Maori', 'wp-slimstat' ),
375
+ 'l-mi-nz' => __( 'Maori (New Zealand)', 'wp-slimstat' ),
376
+ 'l-mk' => __( 'FYRO Macedonian', 'wp-slimstat' ),
377
+ 'l-mk-ml' => __( 'FYRO Macedonian (Former Yugoslav Republic of Macedonia)', 'wp-slimstat' ),
378
+ 'l-mn' => __( 'Mongolian', 'wp-slimstat' ),
379
+ 'l-mn-mn' => __( 'Mongolian (Mongolia)', 'wp-slimstat' ),
380
+ 'l-mr' => __( 'Marathi', 'wp-slimstat' ),
381
+ 'l-mr-in' => __( 'Marathi (India)', 'wp-slimstat' ),
382
+ 'l-ms' => __( 'Malay', 'wp-slimstat' ),
383
+ 'l-ms-bn' => __( 'Malay (Brunei Darussalam)', 'wp-slimstat' ),
384
+ 'l-ms-my' => __( 'Malay (Malaysia)', 'wp-slimstat' ),
385
+ 'l-mt' => __( 'Maltese', 'wp-slimstat' ),
386
+ 'l-mt-mt' => __( 'Maltese (Malta)', 'wp-slimstat' ),
387
+ 'l-nb' => __( 'Norwegian (Bokmål)', 'wp-slimstat' ),
388
+ 'l-nb-no' => __( 'Norwegian (Bokmål) (Norway)', 'wp-slimstat' ),
389
+ 'l-nl' => __( 'Dutch', 'wp-slimstat' ),
390
+ 'l-nl-be' => __( 'Dutch (Belgium)', 'wp-slimstat' ),
391
+ 'l-nl-nl' => __( 'Dutch (Netherlands)', 'wp-slimstat' ),
392
+ 'l-nn-no' => __( 'Norwegian (Nynorsk) (Norway)', 'wp-slimstat' ),
393
+ 'l-ns' => __( 'Northern Sotho', 'wp-slimstat' ),
394
+ 'l-ns-za' => __( 'Northern Sotho (South Africa)', 'wp-slimstat' ),
395
+ 'l-pa' => __( 'Punjabi', 'wp-slimstat' ),
396
+ 'l-pa-in' => __( 'Punjabi (India)', 'wp-slimstat' ),
397
+ 'l-pl' => __( 'Polish', 'wp-slimstat' ),
398
+ 'l-pl-pl' => __( 'Polish (Poland)', 'wp-slimstat' ),
399
+ 'l-ps' => __( 'Pashto', 'wp-slimstat' ),
400
+ 'l-ps-ar' => __( 'Pashto (Afghanistan)', 'wp-slimstat' ),
401
+ 'l-pt' => __( 'Portuguese', 'wp-slimstat' ),
402
+ 'l-pt-br' => __( 'Portuguese (Brazil)', 'wp-slimstat' ),
403
+ 'l-pt-pt' => __( 'Portuguese (Portugal)', 'wp-slimstat' ),
404
+ 'l-qu' => __( 'Quechua', 'wp-slimstat' ),
405
+ 'l-qu-bo' => __( 'Quechua (Bolivia)', 'wp-slimstat' ),
406
+ 'l-qu-ec' => __( 'Quechua (Ecuador)', 'wp-slimstat' ),
407
+ 'l-qu-pe' => __( 'Quechua (Peru)', 'wp-slimstat' ),
408
+ 'l-ro' => __( 'Romanian', 'wp-slimstat' ),
409
+ 'l-ro-ro' => __( 'Romanian (Romania)', 'wp-slimstat' ),
410
+ 'l-ru' => __( 'Russian', 'wp-slimstat' ),
411
+ 'l-ru-ru' => __( 'Russian (Russia)', 'wp-slimstat' ),
412
+ 'l-sa' => __( 'Sanskrit', 'wp-slimstat' ),
413
+ 'l-sa-in' => __( 'Sanskrit (India)', 'wp-slimstat' ),
414
+ 'l-se' => __( 'Sami (Northern)', 'wp-slimstat' ),
415
+ 'l-se-fi' => __( 'Sami (Northern) (Finland)', 'wp-slimstat' ),
416
+ 'l-se-no' => __( 'Sami (Northern) (Norway)', 'wp-slimstat' ),
417
+ 'l-se-se' => __( 'Sami (Northern) (Sweden)', 'wp-slimstat' ),
418
+ 'l-sk' => __( 'Slovak', 'wp-slimstat' ),
419
+ 'l-sk-sk' => __( 'Slovak (Slovakia)', 'wp-slimstat' ),
420
+ 'l-sl' => __( 'Slovenian', 'wp-slimstat' ),
421
+ 'l-sl-si' => __( 'Slovenian (Slovenia)', 'wp-slimstat' ),
422
+ 'l-sq' => __( 'Albanian', 'wp-slimstat' ),
423
+ 'l-sq-al' => __( 'Albanian (Albania)', 'wp-slimstat' ),
424
+ 'l-sr-ba' => __( 'Serbian (Latin) (Bosnia and Herzegovina)', 'wp-slimstat' ),
425
+ 'l-sr-rs' => __( 'Serbian (Serbia and Montenegro)', 'wp-slimstat' ),
426
+ 'l-sr-sp' => __( 'Serbian (Latin) (Serbia and Montenegro)', 'wp-slimstat' ),
427
+ 'l-sv' => __( 'Swedish', 'wp-slimstat' ),
428
+ 'l-sv-fi' => __( 'Swedish (Finland)', 'wp-slimstat' ),
429
+ 'l-sv-se' => __( 'Swedish (Sweden)', 'wp-slimstat' ),
430
+ 'l-sw' => __( 'Swahili', 'wp-slimstat' ),
431
+ 'l-sw-ke' => __( 'Swahili (Kenya)', 'wp-slimstat' ),
432
+ 'l-ta' => __( 'Tamil', 'wp-slimstat' ),
433
+ 'l-ta-in' => __( 'Tamil (India)', 'wp-slimstat' ),
434
+ 'l-te' => __( 'Telugu', 'wp-slimstat' ),
435
+ 'l-te-in' => __( 'Telugu (India)', 'wp-slimstat' ),
436
+ 'l-th' => __( 'Thai', 'wp-slimstat' ),
437
+ 'l-th-th' => __( 'Thai (Thailand)', 'wp-slimstat' ),
438
+ 'l-tl' => __( 'Tagalog', 'wp-slimstat' ),
439
+ 'l-tl-ph' => __( 'Tagalog (Philippines)', 'wp-slimstat' ),
440
+ 'l-tn' => __( 'Tswana', 'wp-slimstat' ),
441
+ 'l-tn-za' => __( 'Tswana (South Africa)', 'wp-slimstat' ),
442
+ 'l-tr' => __( 'Turkish', 'wp-slimstat' ),
443
+ 'l-tr-tr' => __( 'Turkish (Turkey)', 'wp-slimstat' ),
444
+ 'l-tt' => __( 'Tatar', 'wp-slimstat' ),
445
+ 'l-tt-ru' => __( 'Tatar (Russia)', 'wp-slimstat' ),
446
+ 'l-ts' => __( 'Tsonga', 'wp-slimstat' ),
447
+ 'l-uk' => __( 'Ukrainian', 'wp-slimstat' ),
448
+ 'l-uk-ua' => __( 'Ukrainian (Ukraine)', 'wp-slimstat' ),
449
+ 'l-ur' => __( 'Urdu', 'wp-slimstat' ),
450
+ 'l-ur-pk' => __( 'Urdu (Islamic Republic of Pakistan)', 'wp-slimstat' ),
451
+ 'l-uz' => __( 'Uzbek (Latin)', 'wp-slimstat' ),
452
+ 'l-uz-uz' => __( 'Uzbek (Cyrillic) (Uzbekistan)', 'wp-slimstat' ),
453
+ 'l-vi' => __( 'Vietnamese', 'wp-slimstat' ),
454
+ 'l-vi-vn' => __( 'Vietnamese (Viet Nam)', 'wp-slimstat' ),
455
+ 'l-xh' => __( 'Xhosa', 'wp-slimstat' ),
456
+ 'l-xh-za' => __( 'Xhosa (South Africa)', 'wp-slimstat' ),
457
+ 'l-zh' => __( 'Chinese', 'wp-slimstat' ),
458
+ 'l-zh-cn' => __( 'Chinese (S)', 'wp-slimstat' ),
459
+ 'l-zh-hk' => __( 'Chinese (Hong Kong)', 'wp-slimstat' ),
460
+ 'l-zh-mo' => __( 'Chinese (Macau)', 'wp-slimstat' ),
461
+ 'l-zh-sg' => __( 'Chinese (Singapore)', 'wp-slimstat' ),
462
+ 'l-zh-tw' => __( 'Chinese (T)', 'wp-slimstat' ),
463
+ 'l-zu' => __( 'Zulu', 'wp-slimstat' ),
464
+ 'l-zu-za' => __( 'Zulu (South Africa)', 'wp-slimstat' ),
465
+
466
+ // Operating Systems
467
+ 'aix' => __( 'IBM AIX', 'wp-slimstat' ),
468
+ 'amiga' => __( 'Amiga', 'wp-slimstat' ),
469
+ 'android' => __( 'Android', 'wp-slimstat' ),
470
+ 'beos' => __( 'BeOS', 'wp-slimstat' ),
471
+ 'blackberry os' => __( 'BlackBerry OS', 'wp-slimstat' ),
472
+ 'centos' => __( 'CentOS', 'wp-slimstat' ),
473
+ 'chromeos' => __( 'ChromeOS', 'wp-slimstat' ),
474
+ 'commodore64' => __( 'Commodore 64', 'wp-slimstat' ),
475
+ 'cygwin' => __( 'Cygwin', 'wp-slimstat' ),
476
+ 'debian' => __( 'Debian', 'wp-slimstat' ),
477
+ 'digital unix' => __( 'Digital Unix', 'wp-slimstat' ),
478
+ 'fedora' => __( 'Fedora', 'wp-slimstat' ),
479
+ 'firefoxos' => __( 'Firefox OS', 'wp-slimstat' ),
480
+ 'freebsd' => __( 'FreeBSD', 'wp-slimstat' ),
481
+ 'gentoo' => __( 'Gentoo', 'wp-slimstat' ),
482
+ 'hp-ux' => __( 'HP-UX', 'wp-slimstat' ),
483
+ 'ios' => __( 'iPhone OS', 'wp-slimstat' ),
484
+ 'iphone os' => __( 'iPhone OS', 'wp-slimstat' ),
485
+ 'iphone osx' => __( 'iPhone OS X', 'wp-slimstat' ),
486
+ 'irix' => __( 'SGI / IRIX', 'wp-slimstat' ),
487
+ 'java' => __( 'Java', 'wp-slimstat' ),
488
+ 'kanotix' => __( 'Kanotix Linux', 'wp-slimstat' ),
489
+ 'knoppix' => __( 'Knoppix Linux', 'wp-slimstat' ),
490
+ 'linux' => __( 'Linux Generic', 'wp-slimstat' ),
491
+ 'mac' => __( 'Mac', 'wp-slimstat' ),
492
+ 'mac68k' => __( 'Mac 68k', 'wp-slimstat' ),
493
+ 'macos' => __( 'Mac OS X', 'wp-slimstat' ),
494
+ 'macosx' => __( 'Mac OS X', 'wp-slimstat' ),
495
+ 'macppc' => __( 'Mac PowerPC', 'wp-slimstat' ),
496
+ 'mandrake' => __( 'Mandrake Linux', 'wp-slimstat' ),
497
+ 'mandriva' => __( 'MS-DOS', 'wp-slimstat' ),
498
+ 'mepis' => __( 'MEPIS Linux', 'wp-slimstat' ),
499
+ 'ms-dos' => __( 'MS-DOS', 'wp-slimstat' ),
500
+ 'netbsd' => __( 'NetBSD', 'wp-slimstat' ),
501
+ 'nintendo' => __( 'Nintendo', 'wp-slimstat' ),
502
+ 'openbsd' => __( 'OpenBSD', 'wp-slimstat' ),
503
+ 'openvms' => __( 'OpenVMS', 'wp-slimstat' ),
504
+ 'os/2' => __( 'IBM OS/2', 'wp-slimstat' ),
505
+ 'palm' => __( 'Palm OS', 'wp-slimstat' ),
506
+ 'palmos' => __( 'Palm OS', 'wp-slimstat' ),
507
+ 'pclinuxos' => __( 'PCLinux OS', 'wp-slimstat' ),
508
+ 'playstation' => __( 'Playstation', 'wp-slimstat' ),
509
+ 'powertv' => __( 'PowerTV', 'wp-slimstat' ),
510
+ 'redhat' => __( 'RedHat Linux', 'wp-slimstat' ),
511
+ 'rim os' => __( 'Blackberry', 'wp-slimstat' ),
512
+ 'risc os' => __( 'Risc OS', 'wp-slimstat' ),
513
+ 'slackware' => __( 'Slackware Linux', 'wp-slimstat' ),
514
+ 'solaris' => __( 'Solaris', 'wp-slimstat' ),
515
+ 'sunos' => __( 'Sun OS', 'wp-slimstat' ),
516
+ 'suse' => __( 'SuSE Linux', 'wp-slimstat' ),
517
+ 'symbianos' => __( 'Symbian OS', 'wp-slimstat' ),
518
+ 'ubuntu' => __( 'Ubuntu', 'wp-slimstat' ),
519
+ 'unix' => __( 'Unix', 'wp-slimstat' ),
520
+ 'unknown' => __( 'Unknown', 'wp-slimstat' ),
521
+ 'xandros' => __( 'Xandros Linux', 'wp-slimstat' ),
522
+ 'wap' => __( 'WAP', 'wp-slimstat' ),
523
+ 'webos' => __( 'WebOS', 'wp-slimstat' ),
524
+ 'win10' => __( 'Windows 10', 'wp-slimstat' ),
525
+ 'win16' => __( 'Windows 16-bit', 'wp-slimstat' ),
526
+ 'win2000' => __( 'Windows 2000', 'wp-slimstat' ),
527
+ 'win2003' => __( 'Windows 2003', 'wp-slimstat' ),
528
+ 'win31' => __( 'Windows 3.1', 'wp-slimstat' ),
529
+ 'win32' => __( 'Windows 32-bit', 'wp-slimstat' ),
530
+ 'win7' => __( 'Windows 7', 'wp-slimstat' ),
531
+ 'win7' => __( 'Windows 7', 'wp-slimstat' ),
532
+ 'win8' => __( 'Windows 8', 'wp-slimstat' ),
533
+ 'win8.1' => __( 'Windows 8.1', 'wp-slimstat' ),
534
+ 'win95' => __( 'Windows 95', 'wp-slimstat' ),
535
+ 'win98' => __( 'Windows 98', 'wp-slimstat' ),
536
+ 'wince' => __( 'Windows CE', 'wp-slimstat' ),
537
+ 'winme' => __( 'Windows ME', 'wp-slimstat' ),
538
+ 'winnt' => __( 'Windows NT', 'wp-slimstat' ),
539
+ 'winphone7' => __( 'Windows Phone', 'wp-slimstat' ),
540
+ 'winphone7.5' => __( 'Windows Phone', 'wp-slimstat' ),
541
+ 'winphone8' => __( 'Windows Phone', 'wp-slimstat' ),
542
+ 'winphone8.1' => __( 'Windows RT / Runtime', 'wp-slimstat' ),
543
+ 'winrt' => __( 'Windows Phone', 'wp-slimstat' ),
544
+ 'winvista' => __( 'Windows Vista', 'wp-slimstat' ),
545
+ 'winxp' => __( 'Windows XP', 'wp-slimstat' ),
546
+ 'wyderos' => __( 'WyderOS', 'wp-slimstat' ),
547
+ 'zaurus' => __( 'Zaurus WAP', 'wp-slimstat' ),
548
+
549
+ // Operating System Families
550
+ 'p-unk' => __( 'Unknown', 'wp-slimstat' ),
551
+ 'p-' => __( 'Unknown', 'wp-slimstat' ),
552
+
553
+ 'p-and' => __( 'Android', 'wp-slimstat' ),
554
+ 'p-bla' => __( 'BlackBerry', 'wp-slimstat' ),
555
+ 'p-chr' => __( 'Chrome OS', 'wp-slimstat' ),
556
+ 'p-fir' => __( 'Fire OS', 'wp-slimstat' ),
557
+ 'p-fre' => __( 'Linux FreeBSD', 'wp-slimstat' ),
558
+ 'p-ios' => __( 'Apple iOS', 'wp-slimstat' ),
559
+ 'p-jav' => __( 'Java-based OS', 'wp-slimstat' ),
560
+ 'p-lin' => __( 'Linux', 'wp-slimstat' ),
561
+ 'p-mac' => __( 'Apple', 'wp-slimstat' ),
562
+ 'p-rim' => __( 'Blackberry', 'wp-slimstat' ),
563
+ 'p-sym' => __( 'Symbian OS', 'wp-slimstat' ),
564
+ 'p-ubu' => __( 'Linux', 'wp-slimstat' ),
565
+ 'p-win' => __( 'Microsoft', 'wp-slimstat' ),
566
+
567
+ // Tracker Errors
568
+ 'e-101' => __( 'Invalid data signature. Try clearing your WordPress cache.', 'wp-slimstat' ),
569
+ 'e-102' => __( 'Invalid content type signature. Try clearing your WordPress cache.', 'wp-slimstat' ),
570
+ 'e-103' => __( 'Invalid content type format. Try clearing your WordPress cache.', 'wp-slimstat' ),
571
+ 'e-200' => __( 'Unspecified error while attempting to add a new record to the table', 'wp-slimstat' ),
572
+ 'e-201' => __( 'Malformed referrer URL', 'wp-slimstat' ),
573
+ 'e-202' => __( 'Pageview not tracked because the IP address format was invalid.', 'wp-slimstat' ),
574
+ 'e-203' => __( 'Malformed resource URL', 'wp-slimstat' ),
575
+ 'e-204' => __( 'Tracking is turned off, but it looks like the client-side code is still attached to your pages. Do you have a caching tool enabled?', 'wp-slimstat' ),
576
+ 'e-205' => __( 'Invalid MaxMind data file. Please <a target="_blank" href="https://slimstat.freshdesk.com/support/solutions/articles/12000039798-how-to-manually-install-the-maxmind-geolocation-data-file-">follow these steps</a> to download it manually.', 'wp-slimstat' ),
577
+ );
578
+
579
+ // set_transient( 'slimstat_dynamic_strings', self::$dynamic_strings, 86400 );
580
+ }
581
+ }
582
+
583
+ public static function get_country_codes() {
584
+ if ( empty( self::$dynamic_strings ) ) {
585
+ self::init_dynamic_strings();
586
+ }
587
+
588
+ $country_codes = array();
589
+ foreach ( array_keys( self::$dynamic_strings ) as $a_code ) {
590
+ if ( strpos( $a_code, 'c-', 0 ) !== false && strlen( $a_code ) > 2 && $a_code != 'c-xx' && $a_code != 'c-xy' ) {
591
+ $country_codes[ strtolower( str_replace( 'c-', '', $a_code ) ) ] = self::$dynamic_strings[ $a_code ];
592
+ }
593
+ }
594
+
595
+ return $country_codes;
596
+ }
597
+
598
+ public static function get_string( $_code = '' ) {
599
+ if ( empty( self::$dynamic_strings ) ) {
600
+ self::init_dynamic_strings();
601
+ }
602
+
603
+ if ( !isset( self::$dynamic_strings[ $_code ] ) ) {
604
+ return $_code;
605
+ }
606
+
607
+ return self::$dynamic_strings[ $_code ];
608
+ }
609
+ }
readme.txt CHANGED
@@ -5,8 +5,8 @@ Tags: analytics, statistics, counter, tracking, reports, wassup, geolocation, on
5
  Text Domain: wp-slimstat
6
  Requires at least: 4.9
7
  Requires PHP: 5.2
8
- Tested up to: 5.2
9
- Stable tag: 4.8.7.3
10
 
11
  == Description ==
12
  The leading web analytics plugin for WordPress. Track returning customers and registered users, monitor Javascript events, detect intrusions, analyze email campaigns. Thousands of WordPress sites are already using it.
@@ -60,6 +60,16 @@ Our knowledge base is available on our [support center](https://docs.wp-slimstat
60
  5. **Responsive layout** - Keep an eye on your reports on the go
61
 
62
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
63
  = 4.8.7.3 =
64
  * [New] Implemented a simple query cache to minimize the number of requests needed to crunch and display the data in the reports.
65
  * [Update] Extended tracker to also record the 'fragment' portion of the URL, if available (this feature is only available in Client Mode).
5
  Text Domain: wp-slimstat
6
  Requires at least: 4.9
7
  Requires PHP: 5.2
8
+ Tested up to: 5.3
9
+ Stable tag: 4.8.8
10
 
11
  == Description ==
12
  The leading web analytics plugin for WordPress. Track returning customers and registered users, monitor Javascript events, detect intrusions, analyze email campaigns. Thousands of WordPress sites are already using it.
60
  5. **Responsive layout** - Keep an eye on your reports on the go
61
 
62
  == Changelog ==
63
+ = 4.8.8 =
64
+ * [New] Implemented new [FingerPrintJs2](https://github.com/Valve/fingerprintjs2) library in the tracker. Your visitors are now associated with a unique identifier that does not rely on cookies, IP address or other unreliable information. This will allow Slimstat to produce more accurate results in terms of session lenghts, user patterns and much more.
65
+ * [New] Added event handler for 'beforeunload', which will allow the tracker to better meausure the time spent by your visitors on each page. This will make our upcoming new charts even more accurate.
66
+ * [Update] Improved algorithm that scans referrer URLs for search terms, and introduced a new list of search engines. Please help us improve this list by submitting your missing search engine entries.
67
+ * [Update] Added title field to Slimstat widgets (thank you, [jaroslawistok](https://wordpress.org/support/topic/broken-layout-from-3rd-widget-in-footer/)).
68
+ * [Update] Reverted a change to the Top Web Pages report that was now combining URLs with a trailing slash and ones without one into one result. As James pointed out, this is a less accurate measure and hides the fact that people might be accessing the website in different ways.
69
+ * [Update] The event tracker now annotates each event with information about the mouse button that was clicked and other useful data.
70
+ * [Fix] The Country shortcode was not working as expected because of a change in how we handle localization files.
71
+ * [Fix] Renamed slim_i18n class to avoid conflict with external libraries.
72
+
73
  = 4.8.7.3 =
74
  * [New] Implemented a simple query cache to minimize the number of requests needed to crunch and display the data in the reports.
75
  * [Update] Extended tracker to also record the 'fragment' portion of the URL, if available (this feature is only available in Client Mode).
vendor/matomo-searchengine.json ADDED
@@ -0,0 +1 @@
 
1
+ {"1.cz":{"backlink":"s\/{k}","charsets":["iso-8859-2"]},"www.118700.se":{"backlink":"sok.aspx?q={k}"},"foretag.118700.se":{"backlink":"sok.aspx?q={k}"},"webben.118700.se":{"backlink":"sok.aspx?q={k}"},"www.123people.com":{"params":{"1":"search_term"},"backlink":"s\/{k}"},"123people.{}":{"params":{"1":"search_term"},"backlink":"s\/{k}"},"so.360.cn":{"backlink":"s?q={k}","charsets":["UTF-8","gb2312"]},"www.so.com":{"backlink":"s?q={k}","charsets":["UTF-8","gb2312"]},"m.so.com":{"backlink":"s?q={k}","charsets":["UTF-8","gb2312"]},"www.abacho.de":{"backlink":"suche?q={k}"},"www.abacho.com":{"backlink":"suche?q={k}"},"www.abacho.co.uk":{"backlink":"suche?q={k}"},"www.se.abacho.com":{"backlink":"suche?q={k}"},"www.tr.abacho.com":{"backlink":"suche?q={k}"},"www.abacho.at":{"backlink":"suche?q={k}"},"www.abacho.fr":{"backlink":"suche?q={k}"},"www.abacho.es":{"backlink":"suche?q={k}"},"www.abacho.ch":{"backlink":"suche?q={k}"},"www.abacho.it":{"backlink":"suche?q={k}"},"abcsok.no":{"backlink":"?q={k}"},"verden.abcsok.no":{"backlink":"?q={k}"},"www.acoon.de":{"params":["begriff"],"backlink":"cgi-bin\/search.exe?begriff={k}"},"chercherfr.aguea.com":{"backlink":"s.py?q={k}"},"www.allaverksamheter.se":{"params":["What"],"backlink":"SearchResult.aspx?What={k}"},"alexa.com":{"backlink":"search?q={k}"},"search.toolbars.alexa.com":{"backlink":"search?q={k}"},"rechercher.aliceadsl.fr":{"params":["qs"],"backlink":"google.pl?qs={k}"},"all.by":{"params":["query"],"backlink":"cgi-bin\/search.cgi?mode=by&query={k}"},"www.allesklar.de":{"params":["words"],"backlink":"?words={k}"},"www.allesklar.at":{"params":["words"],"backlink":"?words={k}"},"www.allesklar.ch":{"params":["words"],"backlink":"?words={k}"},"www.alltheweb.com":{"backlink":"search?q={k}"},"www.altavista.com":{"backlink":"web\/results?q={k}"},"search.altavista.com":{"backlink":"web\/results?q={k}"},"listings.altavista.com":{"backlink":"web\/results?q={k}"},"altavista.de":{"backlink":"web\/results?q={k}"},"altavista.fr":{"backlink":"web\/results?q={k}"},"{}.altavista.com":{"backlink":"web\/results?q={k}"},"be-nl.altavista.com":{"backlink":"web\/results?q={k}"},"be-fr.altavista.com":{"backlink":"web\/results?q={k}"},"aol.com":{"params":["query"],"backlink":"aol\/search?q={k}"},"search.aol.it":{"params":["query"],"backlink":"aol\/search?q={k}"},"aolsearch.aol.com":{"params":["query"],"backlink":"aol\/search?q={k}"},"www.aolrecherche.aol.fr":{"params":["query"],"backlink":"aol\/search?q={k}"},"www.aolrecherches.aol.fr":{"params":["query"],"backlink":"aol\/search?q={k}"},"www.aolimages.aol.fr":{"params":["query"],"backlink":"aol\/search?q={k}"},"aim.search.aol.com":{"params":["query"],"backlink":"aol\/search?q={k}"},"www.recherche.aol.fr":{"params":["query"],"backlink":"aol\/search?q={k}"},"recherche.aol.fr":{"params":["query"],"backlink":"aol\/search?q={k}"},"find.web.aol.com":{"params":["query"],"backlink":"aol\/search?q={k}"},"recherche.aol.ca":{"params":["query"],"backlink":"aol\/search?q={k}"},"aolsearch.aol.co.uk":{"params":["query"],"backlink":"aol\/search?q={k}"},"search.aol.co.uk":{"params":["query"],"backlink":"aol\/search?q={k}"},"aolrecherche.aol.fr":{"params":["query"],"backlink":"aol\/search?q={k}"},"sucheaol.aol.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"suche.aol.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"o2suche.aol.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"suche.aolsvc.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"aolbusqueda.aol.com.mx":{"params":["query"],"backlink":"aol\/search?q={k}"},"alicesuche.aol.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"alicesuchet.aol.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"suchet2.aol.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"search.hp.my.aol.com.au":{"params":["query"],"backlink":"aol\/search?q={k}"},"search.hp.my.aol.de":{"params":["query"],"backlink":"aol\/search?q={k}"},"search.hp.my.aol.it":{"params":["query"],"backlink":"aol\/search?q={k}"},"search-intl.netscape.com":{"params":["query"],"backlink":"aol\/search?q={k}"},"de.aolsearch.com":{"backlink":"search?q={k}"},"apollo.lv\/portal\/search\/":{"backlink":"?cof=FORID%3A11&q={k}&search_where=www"},"apollo7.de":{"params":["query"],"backlink":"a7db\/index.php?query={k}&de_sharelook=true&de_bing=true&de_witch=true&de_google=true&de_yahoo=true&de_lycos=true"},"sm.aport.ru":{"params":["r"],"backlink":"search?r={k}"},"arama.com":{"backlink":"search.php3?q={k}"},"www.arcor.de":{"params":["Keywords"],"backlink":"content\/searchresult.jsp?Keywords={k}"},"arianna.libero.it":{"params":["query"],"backlink":"search\/abin\/integrata.cgi?query={k}"},"www.arianna.com":{"params":["query"],"backlink":"search\/abin\/integrata.cgi?query={k}"},"ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"web.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"int.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"mws.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"images.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"images.{}.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"ask.reference.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"www.askkids.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"iwon.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"www.ask.co.uk":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"{}.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"www.qbyrd.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"{}.qbyrd.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"www.search-results.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"www1.search-results.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"int.search-results.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"{}.search-results.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"search.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"{}.search.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"avira-int.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"searchqu.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"search.tb.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"nortonsafe.search.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"avira.search.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"int.search.tb.ask.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"web?q={k}"},"search.avira.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"#\/web\/result?q={k}"},"search.avira.net":{"params":{"0":"ask","2":"searchfor"},"backlink":"#\/web\/result?q={k}"},"safesearch.avira.com":{"params":{"0":"ask","2":"searchfor"},"backlink":"#\/web\/result?q={k}"},"searchatlas.centrum.cz":{"backlink":"?q={k}"},"search.auone.jp":{"backlink":"?q={k}","charsets":["utf-8","euc-jp","ms932"]},"sp-search.auone.jp":{"backlink":"?q={k}","charsets":["utf-8","euc-jp","ms932"]},"sp-image.search.auone.jp":{"backlink":"?q={k}","charsets":["utf-8","euc-jp","ms932"]},"search.babylon.com":{"backlink":"?q={k}"},"searchassist.babylon.com":{"backlink":"?q={k}"},"www.baidu.com":{"params":["wd","word","kw"],"backlink":"s?wd={k}","charsets":["UTF-8","gb2312"]},"www1.baidu.com":{"params":["wd","word","kw"],"backlink":"s?wd={k}","charsets":["UTF-8","gb2312"]},"m.baidu.com":{"params":["wd","word","kw"],"backlink":"s?wd={k}","charsets":["UTF-8","gb2312"]},"www.baidu.co.th":{"params":["wd","word","kw"],"backlink":"s?wd={k}","charsets":["UTF-8","gb2312"]},"zhidao.baidu.com":{"params":["wd","word","kw"],"backlink":"s?wd={k}","charsets":["UTF-8","gb2312"]},"tieba.baidu.com":{"params":["wd","word","kw"],"backlink":"s?wd={k}","charsets":["UTF-8","gb2312"]},"news.baidu.com":{"params":["wd","word","kw"],"backlink":"s?wd={k}","charsets":["UTF-8","gb2312"]},"web.gougou.com":{"params":["search"],"backlink":"search?search={k}"},"cgi.search.biglobe.ne.jp":{"backlink":"cgi-bin\/search-st?q={k}","charsets":["utf-8","euc-jp","ms932"]},"images.search.biglobe.ne.jp":{"backlink":"cgi-bin\/search-st?q={k}"},"bing.com":{"params":{"1":"Q"},"backlink":"search?q={k}"},"{}.bing.com":{"params":{"1":"Q"},"backlink":"search?q={k}"},"global.bing.com":{"params":{"1":"Q"},"backlink":"search?q={k}"},"msnbc.msn.com":{"params":{"1":"Q"},"backlink":"search?q={k}"},"dizionario.it.msn.com":{"params":{"1":"Q"},"backlink":"search?q={k}"},"enciclopedia.it.msn.com":{"params":{"1":"Q"},"backlink":"search?q={k}"},"cc.bingj.com":{"params":{"1":"Q"},"backlink":"search?q={k}"},"bing.com\/images\/search":{"params":{"1":"Q"},"backlink":"?q={k}"},"{}.bing.com\/images\/search":{"params":{"1":"Q"},"backlink":"?q={k}"},"blekko.com":{"backlink":"ws\/{k}"},"www.blogpulse.com":{"params":["query"],"backlink":"search?query={k}"},"search.bluewin.ch":{"params":["searchTerm"],"backlink":"v2\/index.php?q={k}"},"web.canoe.ca":{"backlink":"search?q={k}"},"search.centrum.cz":{"backlink":"?q={k}"},"morfeo.centrum.cz":{"backlink":"?q={k}"},"www.charter.net":{"backlink":"search\/index.php?q={k}"},"claro-search.com":{"backlink":"?q={k}"},"pesquisa.clix.pt":{"params":["question"],"backlink":"resultado.html?in=Mundial&question={k}"},"coccoc.com":{"params":["query"],"backlink":"search#query={k}"},"search.comcast.net":{"backlink":"?q={k}"},"websearch.cs.com":{"params":["query"],"backlink":"cs\/search?query={k}"},"search.conduit.com":{"backlink":"Results.aspx?q={k}"},"images.search.conduit.com":{"backlink":"Results.aspx?q={k}"},"www.crawler.com":{"backlink":"search\/results1.aspx?q={k}"},"www.cuil.com":{"backlink":"search?q={k}"},"daemon-search.com":{"backlink":"explore\/web?q={k}"},"my.daemon-search.com":{"backlink":"explore\/web?q={k}"},"www.dasoertliche.de":{"params":["kw"]},"www2.dasoertliche.de":{"params":["ph","kw"]},"www1.dastelefonbuch.de":{"params":["kw"]},"search.daum.net":{"backlink":"search?q={k}"},"otsing.delfi.ee":{"backlink":"find?q={k}"},"smart.delfi.lv":{"backlink":"find?q={k}"},"digg.com":{"params":["s"],"backlink":"search?s={k}"},"fr.dir.com":{"params":["req"]},"dmoz.org":{"params":["search"]},"editors.dmoz.org":{"params":["search"]},"duckduckgo.com":{"backlink":"?q={k}"},"r.duckduckgo.com":{"backlink":"?q={k}"},"search.earthlink.net":{"backlink":"search?q={k}"},"ecosia.org":{"backlink":"search?q={k}"},"www.ecosia.org":{"backlink":"search?q={k}"},"www.eniro.se":{"params":{"1":"search_word"},"backlink":"query?q={k}"},"eo.st":{"params":["x_query"],"backlink":"cgi-bin\/eolost.cgi?x_query={k}"},"www.eurip.com":{"backlink":"search\/?q={k}"},"www.euroseek.com":{"params":["string"],"backlink":"system\/search.cgi?string={k}"},"www.everyclick.com":{"params":["keyword"]},"www.exalead.fr":{"backlink":"search\/results?q={k}"},"www.exalead.com":{"backlink":"search\/results?q={k}"},"search.excite.it":{"backlink":"web\/?q={k}"},"search.excite.fr":{"backlink":"web\/?q={k}"},"search.excite.de":{"backlink":"web\/?q={k}"},"search.excite.co.uk":{"backlink":"web\/?q={k}"},"search.excite.es":{"backlink":"web\/?q={k}"},"search.excite.nl":{"backlink":"web\/?q={k}"},"www.excite.co.jp":{"params":["search"],"backlink":"search.gw?search={k}","charsets":["SHIFT_JIS"]},"www.facebook.com":{"backlink":"search\/?q={k}"},"www.fastbrowsersearch.com":{"backlink":"results\/results.aspx?q={k}"},"www.findhurtig.dk":{"backlink":"web?q={k}"},"www.fireball.de":{"backlink":"ajax.asp?q={k}"},"www.firstsfind.com":{"params":["qry"]},"www.flix.de":{"params":["keyword"]},"search.fooooo.com":{"backlink":"web\/?q={k}"},"forestle.org":{"backlink":"search.php?q={k}"},"{}.forestle.org":{"backlink":"search.php?q={k}"},"recherche.francite.com":{"params":["name"]},"search.free.fr":{"params":{"1":"qs"}},"search1-2.free.fr":{"params":{"1":"qs"}},"search1-1.free.fr":{"params":{"1":"qs"}},"search.freecause.com":{"params":["p"],"backlink":"?p={k}"},"suche.freenet.de":{"params":["query","Keywords"],"backlink":"suche\/?query={k}"},"friendfeed.com":{"backlink":"search?q={k}"},"gais.cs.ccu.edu.tw":{"backlink":"search.php?q={k}"},"search.genieo.com":{"backlink":"&q={k}"},"geona.net":{"backlink":"search?q={k}"},"www.gigablast.com":{"backlink":"search?q={k}"},"www.gnadenmeer.de":{"params":["keyword"]},"www.gomeo.com":{"params":["Keywords"],"backlink":"\/search\/{k}"},"search.goo.ne.jp":{"params":["MT"],"backlink":"web.jsp?MT={k}"},"ocnsearch.goo.ne.jp":{"params":["MT"],"backlink":"web.jsp?MT={k}"},"google.com":{"backlink":"search?q={k}"},"google.{}":{"backlink":"search?q={k}"},"encrypted.google.com":{"backlink":"search?q={k}"},"www2.google.com":{"backlink":"search?q={k}"},"ipv6.google.com":{"backlink":"search?q={k}"},"go.google.com":{"backlink":"search?q={k}"},"wwwgoogle.com":{"backlink":"search?q={k}"},"wwwgoogle.{}":{"backlink":"search?q={k}"},"gogole.com":{"backlink":"search?q={k}"},"gogole.{}":{"backlink":"search?q={k}"},"gppgle.com":{"backlink":"search?q={k}"},"gppgle.{}":{"backlink":"search?q={k}"},"googel.com":{"backlink":"search?q={k}"},"googel.{}":{"backlink":"search?q={k}"},"search.avg.com":{"backlink":"search?q={k}"},"isearch.avg.com":{"backlink":"search?q={k}"},"search.chedot.com":{"params":["text"]},"www.cnn.com":{"params":["query"]},"darkoogle.com":{"params":["query"]},"search.darkoogle.com":{"params":["query"]},"search.foxtab.com":{"params":["query"]},"www.gooofullsearch.com":{"params":["Keywords"]},"search.hiyo.com":{"params":["Keywords"]},"search.incredimail.com":{"params":["Keywords"]},"search1.incredimail.com":{"params":["Keywords"]},"search2.incredimail.com":{"params":["Keywords"]},"search3.incredimail.com":{"params":["Keywords"]},"search4.incredimail.com":{"params":["Keywords"]},"search.sweetim.com":{"params":["Keywords"]},"www.fastweb.it":{"params":["Keywords"]},"search.juno.com":{"params":["query"]},"search.zum.com":{"params":["query"]},"find.tdc.dk":{"params":["query"]},"it.luna.tv":{"params":["query"]},"searchresults.verizon.com":{"params":["query"]},"search.walla.co.il":{"params":["query"]},"search.alot.com":{"params":["query"]},"suche.gmx.net":{"backlink":"web?q={k}"},"search.incredibar.com":{"backlink":"search.php?q={k}"},"search.1und1.de":{"backlink":"web?q={k}"},"suche.1und1.de":{"backlink":"web?q={k}"},"search.zonealarm.com":{"backlink":"web?q={k}"},"start.lenovo.com":{"backlink":"search\/index.php?q={k}"},"wow.com":{"backlink":"search\/index.php?q={k}"},"{}.wow.com":{"backlink":"search\/index.php?q={k}"},"search.leonardo.it":{"backlink":"search\/index.php?q={k}"},"www.optuszoo.com.au":{"backlink":"search\/index.php?q={k}"},"search.dolphin-browser.jp":{"backlink":"search\/index.php?q={k}"},"netlavis.azione.jp":{"backlink":"search\/index.php?q={k}"},"search.nan.so":{"backlink":"search\/index.php?q={k}"},"cgi2.nintendo.co.jp":{"params":["gsc.q"]},"search.smt.docomo.ne.jp":{"params":["MT"]},"image.search.smt.docomo.ne.jp":{"params":["MT"]},"searches.f-secure.com":{"params":["query"],"backlink":"search?query={k}"},"search.f-secure.com":{"params":["query"],"backlink":"search?query={k}"},"webcache.googleusercontent.com":{"backlink":"search?q={k}"},"search.bt.com":{"params":["p"],"backlink":"result?p={k}"},"startab.me":{"backlink":"search\/?q={k}"},"blogsearch.google.com":{"backlink":"blogsearch?q={k}"},"blogsearch.google.{}":{"backlink":"blogsearch?q={k}"},"google.com\/cse":{"params":{"1":"query"}},"google.{}\/cse":{"params":{"1":"query"}},"cse.google.com":{"params":{"1":"query"}},"cse.google.{}":{"params":{"1":"query"}},"google.com\/custom":{"params":{"1":"query"}},"google.{}\/custom":{"params":{"1":"query"}},"images.google.com":{"backlink":"images?q={k}"},"images.google.{}":{"backlink":"images?q={k}"},"google.com\/imgres":{"backlink":"images?q={k}"},"google.{}\/imgres":{"backlink":"images?q={k}"},"maps.google.com":{"backlink":"maps?q={k}"},"maps.google.{}":{"backlink":"maps?q={k}"},"scholar.google.com":{"backlink":"scholar?q={k}"},"scholar.google.{}":{"backlink":"scholar?q={k}"},"google.com\/products":{"backlink":"?q={k}&tbm=shop"},"google.{}\/products":{"backlink":"?q={k}&tbm=shop"},"video.google.com":{"backlink":"search?q={k}&tbm=vid"},"www.goyellow.de":{"params":["MDN"]},"www.haosou.com":{"backlink":"s?q={k}"},"www.highbeam.com":{"backlink":"Search.aspx?q={k}"},"req.hit-parade.com":{"params":["p7"],"backlink":"general\/recherche.asp?p7={k}"},"class.hit-parade.com":{"params":["p7"],"backlink":"general\/recherche.asp?p7={k}"},"www.hit-parade.com":{"params":["p7"],"backlink":"general\/recherche.asp?p7={k}"},"holmes.ge":{"backlink":"search.htm?q={k}"},"www.hooseek.com":{"params":["recherche"],"backlink":"web?recherche={k}"},"www.hotbot.com":{"params":["query"]},"start.iplay.com":{"backlink":"searchresults.aspx?q={k}"},"blogs.icerocket.com":{"backlink":"search?q={k}"},"www.icq.com":{"backlink":"search\/results.php?q={k}"},"search.icq.com":{"backlink":"search\/results.php?q={k}"},"www.ilse.nl":{"params":["search_for"],"backlink":"?search_for={k}"},"search.imesh.com":{"params":{"1":"si"},"backlink":"web?q={k}"},"www2.inbox.com":{"backlink":"search\/results1.aspx?q={k}"},"infospace.com":{"backlink":"\/search\/web?q={k}"},"dogpile.com":{"backlink":"\/search\/web?q={k}"},"tattoodle.com":{"backlink":"\/search\/web?q={k}"},"metacrawler.com":{"backlink":"\/search\/web?q={k}"},"webfetch.com":{"backlink":"\/search\/web?q={k}"},"webcrawler.com":{"backlink":"\/search\/web?q={k}"},"search.kiwee.com":{"backlink":"\/search\/web?q={k}"},"searches.vi-view.com":{"backlink":"\/search\/web?q={k}"},"search.webssearches.com":{"backlink":"\/search\/web?q={k}"},"search.fbdownloader.com":{"backlink":"\/search\/web?q={k}"},"searches3.globososo.com":{"backlink":"\/search\/web?q={k}"},"wsdsold.infospace.com":{"backlink":"pemonitorhosted\/ws\/results\/Web\/{k}\/1\/417\/TopNavigation\/Source\/"},"start.facemoods.com":{"params":["s"]},"www.google.interia.pl":{"backlink":"szukaj?q={k}"},"www.isodelen.se":{"params":["Keywords"],"backlink":"sokresultat?Keywords={k}"},"ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"www.eu.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"ixquick.de":{"params":["query"],"backlink":"do\/asearch?query={k}"},"www.ixquick.de":{"params":["query"],"backlink":"do\/asearch?query={k}"},"us.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s1.us.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s2.us.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s3.us.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s4.us.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s5.us.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"eu.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s8-eu.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s1-eu.ixquick.de":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s2-eu4.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s5-eu4.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"junglekey.com":{"params":["query"],"backlink":"search.php?query={k}&type=web&lang=en"},"junglekey.fr":{"params":["query"],"backlink":"search.php?query={k}&type=web&lang=en"},"jyxo.1188.cz":{"backlink":"s?q={k}"},"k9safesearch.com":{"backlink":"search.jsp?q={k}"},"www.kensaq.com":{"backlink":"web?q={k}"},"kvasir.no":{"params":{"1":"search_word"},"backlink":"alle?q={k}"},"www.kvasir.no":{"params":{"1":"search_word"},"backlink":"alle?q={k}"},"www.toile.com":{"backlink":"search?q={k}"},"web.toile.com":{"backlink":"search?q={k}"},"laban.vn":{"backlink":"search.html?q={k}"},"www.latne.lv":{"backlink":"siets.php?q={k}"},"search.lilo.org":{"backlink":"results.php?q={k}"},"lo.st":{"params":["x_query"],"backlink":"cgi-bin\/eolost.cgi?x_query={k}"},"search.lookseek.com":{"backlink":"search2.php?q={k}"},"www.looksmart.com":{"params":["key"]},"search.lycos.com":{"params":["query"],"backlink":"?query={k}"},"lycos.{}":{"params":["query"],"backlink":"?query={k}"},"www.maailm.com":{"params":["tekst"]},"go.mail.ru":{"backlink":"search?rch=e&q={k}","charsets":["UTF-8","windows-1251"]},"www.mamma.com":{"params":["query"],"backlink":"result.php?q={k}"},"mamma75.mamma.com":{"params":["query"],"backlink":"result.php?q={k}"},"www.meinestadt.de":{"params":["words"]},"meta.ua":{"backlink":"search.asp?q={k}"},"s1.metacrawler.de":{"params":["qry"],"backlink":"?qry={k}"},"s2.metacrawler.de":{"params":["qry"],"backlink":"?qry={k}"},"s3.metacrawler.de":{"params":["qry"],"backlink":"?qry={k}"},"meta.rrzn.uni-hannover.de":{"params":["eingabe"],"backlink":"meta\/cgi-bin\/meta.ger1?eingabe={k}"},"www.metager.de":{"params":["eingabe"],"backlink":"meta\/cgi-bin\/meta.ger1?eingabe={k}"},"metager.de":{"params":["eingabe"],"backlink":"meta\/cgi-bin\/meta.ger1?eingabe={k}"},"metager2.de":{"backlink":"search\/index.php?q={k}"},"www.mister-wong.com":{"params":["keywords"],"backlink":"search\/?keywords={k}"},"www.mister-wong.de":{"params":["keywords"],"backlink":"search\/?keywords={k}"},"www.monstercrawler.com":{"params":["qry"]},"www.mozbot.fr":{"backlink":"results.php?q={k}"},"www.mozbot.co.uk":{"backlink":"results.php?q={k}"},"www.mozbot.com":{"backlink":"results.php?q={k}"},"searchservice.myspace.com":{"params":["qry"],"backlink":"index.cfm?fuseaction=sitesearch.results&type=Web&qry={k}"},"www.mysearch.com":{"params":["searchfor","searchFor"],"backlink":"search\/Ajmain.jhtml?searchfor={k}"},"ms114.mysearch.com":{"params":["searchfor","searchFor"],"backlink":"search\/Ajmain.jhtml?searchfor={k}"},"ms146.mysearch.com":{"params":["searchfor","searchFor"],"backlink":"search\/Ajmain.jhtml?searchfor={k}"},"kf.mysearch.myway.com":{"params":["searchfor","searchFor"],"backlink":"search\/Ajmain.jhtml?searchfor={k}"},"ki.mysearch.myway.com":{"params":["searchfor","searchFor"],"backlink":"search\/Ajmain.jhtml?searchfor={k}"},"search.myway.com":{"params":["searchfor","searchFor"],"backlink":"search\/Ajmain.jhtml?searchfor={k}"},"search.mywebsearch.com":{"params":["searchfor","searchFor"],"backlink":"search\/Ajmain.jhtml?searchfor={k}"},"www.najdi.si":{"backlink":"search.jsp?q={k}"},"search.nate.com":{"backlink":"search\/all.html?q={k}","charsets":["EUC-KR"]},"search.naver.com":{"params":["query"],"backlink":"search.naver?query={k}"},"ko.search.need2find.com":{"params":["searchfor"],"backlink":"search\/AJmain.jhtml?searchfor={k}"},"www.neti.ee":{"params":["query"],"backlink":"cgi-bin\/otsing?query={k}","charsets":["iso-8859-1"]},"search.nifty.com":{"params":{"1":"Text"},"backlink":"websearch\/search?q={k}"},"search.azby.fmworld.net":{"params":{"1":"Text"},"backlink":"websearch\/search?q={k}"},"videosearch.nifty.com":{"params":["kw"],"backlink":"search?kw={k}"},"nigma.ru":{"params":["s"],"backlink":"index.php?s={k}"},"szukaj.onet.pl":{"params":["qt"],"backlink":"query.html?qt={k}"},"online.no":{"backlink":"google\/index.jsp?q={k}"},"www.only-search.com":{"backlink":"?q={k}"},"www.1881.no":{"params":["Query"],"backlink":"Multi\/?Query={k}"},"busca.orange.es":{"backlink":"search?q={k}"},"lemoteur.ke.voila.fr":{"params":["kw"],"backlink":"?kw={k}"},"lemoteur.orange.fr":{"params":["kw"],"backlink":"?kw={k}"},"www.paperball.de":{"backlink":"suche\/s\/?q={k}"},"extern.peoplecheck.de":{"backlink":"link.php?q={k}"},"search.peoplepc.com":{"backlink":"search?q={k}"},"www.picsearch.com":{"backlink":"index.cgi?q={k}"},"plusnetwork.com":{"backlink":"?q={k}"},"poisk.ru":{"params":["text"],"backlink":"cgi-bin\/poisk?text={k}","charsets":["windows-1251"]},"search.qip.ru":{"params":["query"],"backlink":"search?query={k}"},"websearch.rakuten.co.jp":{"params":["qt"],"backlink":"WebIS?qt={k}"},"nova.rambler.ru":{"params":["query","words"],"backlink":"search?query={k}"},"www.riksdelen.se":{"params":["What"],"backlink":"SearchResult.aspx?What={k}"},"search.rr.com":{"backlink":"?q={k}"},"rpmfind.net":{"params":["query"],"backlink":"linux\/rpm2html\/search.php?query={k}"},"fr2.rpmfind.net":{"params":["query"],"backlink":"linux\/rpm2html\/search.php?query={k}"},"pesquisa.sapo.pt":{"backlink":"?q={k}"},"scour.com":{"backlink":"search\/web\/{k}"},"www.search.ch":{"backlink":"?q={k}"},"www.search.com":{"backlink":"search?q={k}"},"searchalot.com":{"backlink":"?q={k}"},"www.searchcanvas.com":{"backlink":"web?q={k}"},"www.searchy.co.uk":{"backlink":"index.html?q={k}"},"search.seesaa.jp":{"backlink":"{k}\/index.html"},"bg.setooz.com":{"params":["query"],"backlink":"search?query={k}"},"da.setooz.com":{"params":["query"],"backlink":"search?query={k}"},"el.setooz.com":{"params":["query"],"backlink":"search?query={k}"},"fa.setooz.com":{"params":["query"],"backlink":"search?query={k}"},"ur.setooz.com":{"params":["query"],"backlink":"search?query={k}"},"{}.setooz.com":{"params":["query"],"backlink":"search?query={k}"},"search.seznam.cz":{"backlink":"?q={k}"},"videa.seznam.cz":{"backlink":"?q={k}"},"www.sharelook.fr":{"params":["keyword"]},"www.skynet.be":{"backlink":"services\/recherche\/google?q={k}"},"m.sm.cn":{"backlink":"s?q={k}"},"so.m.sm.cn":{"backlink":"s?q={k}"},"m.sp.sm.cn":{"backlink":"s?q={k}"},"www.sm.de":{"backlink":"?q={k}"},"search.smartaddressbar.com":{"params":["s"],"backlink":"?s={k}"},"search.smartshopping.com":{"params":["kwd","keywords"],"backlink":"?kwd={k}"},"search.snap.do":{"backlink":"?q={k}"},"www.so-net.ne.jp":{"params":["query"],"backlink":"search\/web\/?query={k}"},"video.so-net.ne.jp":{"params":["kw"],"backlink":"search\/?kw={k}"},"search.softonic.com":{"backlink":"default\/default?q={k}"},"www.sogou.com":{"params":["query"],"backlink":"web?query={k}","charsets":["gb2312"]},"m.sogou.com":{"params":["keyword"]},"wap.sogou.com":{"params":["keyword"]},"www.soso.com":{"params":["w"],"backlink":"q?w={k}","charsets":["gb2312"]},"www.sputnik.ru":{"backlink":"search?q={k}"},"startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"classic.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"www.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"eu.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s6-eu5.ixquick.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s2-eu4.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s6-eu4.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s7-eu4.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s1-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s2-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s4-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s5-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s6-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s7-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s8-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s10-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s11-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s12-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s13-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"s14-eu5.startpage.com":{"params":["query"],"backlink":"do\/asearch?query={k}"},"startgoogle.startpagina.nl":{"params":{"1":"query"},"backlink":"?q={k}"},"www.startsiden.no":{"backlink":"sok\/index.html?q={k}"},"suche.info":{"params":["Keywords"],"backlink":"suche.php?Keywords={k}"},"www.suchmaschine.com":{"params":["suchstr"],"backlink":"cgi-bin\/wo.cgi?suchstr={k}"},"suche.t-online.de":{"backlink":"fast-cgi\/tsc?mandant=toi&context=internet-tab&q={k}"},"brisbane.t-online.de":{"backlink":"fast-cgi\/tsc?mandant=toi&context=internet-tab&q={k}"},"navigationshilfe.t-online.de":{"backlink":"dtag\/dns\/results?mode=search_top&q={k}"},"www.talimba.com":{"params":["search"],"backlink":"index.php?page=search\/web&search={k}"},"www.talktalk.co.uk":{"params":["query"],"backlink":"search\/results.html?query={k}"},"tarmot.com":{"backlink":"ara\/?q={k}"},"technorati.com":{"backlink":"search?return=sites&authority=all&q={k}"},"www.teoma.com":{"backlink":"web?q={k}"},"buscador.terra.es":{"params":["query"],"backlink":"Default.aspx?source=Search&query={k}"},"buscador.terra.cl":{"params":["query"],"backlink":"Default.aspx?source=Search&query={k}"},"buscador.terra.com.br":{"params":["query"],"backlink":"Default.aspx?source=Search&query={k}"},"search.tiscali.it":{"params":{"1":"key"},"backlink":"?q={k}"},"search-dyn.tiscali.it":{"params":{"1":"key"},"backlink":"?q={k}"},"hledani.tiscali.cz":{"params":["query"]},"www.tixuma.de":{"params":["sc"],"backlink":"index.php?mp=search&stp=&sc={k}&tg=0"},"www.toolbarhome.com":{"backlink":"search.aspx?q={k}"},"vshare.toolbarhome.com":{"backlink":"search.aspx?q={k}"},"www.toppreise.ch":{"params":["search"],"backlink":"index.php?search={k}","charsets":["ISO-8859-1"]},"toppreise.ch":{"params":["search"],"backlink":"index.php?search={k}","charsets":["ISO-8859-1"]},"fr.toppreise.ch":{"params":["search"],"backlink":"index.php?search={k}","charsets":["ISO-8859-1"]},"de.toppreise.ch":{"params":["search"],"backlink":"index.php?search={k}","charsets":["ISO-8859-1"]},"en.toppreise.ch":{"params":["search"],"backlink":"index.php?search={k}","charsets":["ISO-8859-1"]},"www.trouvez.com":{"params":["query"]},"www.trovarapido.com":{"backlink":"result.php?q={k}"},"www.twingly.com":{"backlink":"search?q={k}"},"busca.uol.com.br":{"backlink":"\/web\/?q={k}"},"www.url.org":{"backlink":"?l=de&q={k}"},"www.vinden.nl":{"backlink":"?q={k}"},"www.vindex.nl":{"params":["search_for"],"backlink":"\/web?search_for={k}"},"search.vindex.nl":{"params":["search_for"],"backlink":"\/web?search_for={k}"},"ricerca.virgilio.it":{"params":["qs"],"backlink":"ricerca?qs={k}"},"ricercaimmagini.virgilio.it":{"params":["qs"],"backlink":"ricerca?qs={k}"},"ricercavideo.virgilio.it":{"params":["qs"],"backlink":"ricerca?qs={k}"},"ricercanews.virgilio.it":{"params":["qs"],"backlink":"ricerca?qs={k}"},"mobile.virgilio.it":{"params":["qrs"]},"search.ke.voila.fr":{"params":["rdata"],"backlink":"S\/voila?rdata={k}"},"www.lemoteur.fr":{"params":["rdata"],"backlink":"S\/voila?rdata={k}"},"web.volny.cz":{"params":["search"],"backlink":"fulltext\/?search={k}","charsets":["windows-1250"]},"www.walhello.info":{"params":["key"],"backlink":"search?key={k}"},"www.walhello.com":{"params":["key"],"backlink":"search?key={k}"},"www.walhello.de":{"params":["key"],"backlink":"search?key={k}"},"www.walhello.nl":{"params":["key"],"backlink":"search?key={k}"},"suche.web.de":{"params":["su"],"backlink":"search\/web\/?su={k}"},"m.suche.web.de":{"params":["su"],"backlink":"search\/web\/?su={k}"},"www.web.nl":{"params":["zoekwoord"]},"www.weborama.fr":{"params":["QUERY"]},"www.websearch.com":{"params":["qkw","q"],"backlink":"search\/results2.aspx?q={k}"},"fr.wedoo.com":{"params":["keyword"]},"en.wedoo.com":{"params":["keyword"]},"es.wedoo.com":{"params":["keyword"]},"search.winamp.com":{"backlink":"search\/search?q={k}"},"szukaj.wp.pl":{"params":["szukaj"],"backlink":"http:\/\/szukaj.wp.pl\/szukaj.html?szukaj={k}"},"www.witch.de":{"params":["search"],"backlink":"search-result.php?cn=0&search={k}"},"www.woopie.jp":{"params":["kw"],"backlink":"search?kw={k}"},"search.www.ee":{"params":["query"]},"www.x-recherche.com":{"params":["MOTS"],"backlink":"cgi-bin\/websearch?MOTS={k}"},"search.yahoo.com":{"params":["p"],"backlink":"search?p={k}"},"malaysia.search.yahoo.com":{"params":["p"],"backlink":"search?p={k}"},"{}.search.yahoo.com":{"params":["p"],"backlink":"search?p={k}"},"yahoo.com":{"params":["p"],"backlink":"search?p={k}"},"espanol.search.yahoo.com":{"params":["p"],"backlink":"search?p={k}"},"qc.search.yahoo.com":{"params":["p"],"backlink":"search?p={k}"},"one.cn.yahoo.com":{"params":["p"],"backlink":"search?p={k}"},"search.yahoo.com\/search\/dir":{"params":["p"],"backlink":"?p={k}"},"images.search.yahoo.com":{"params":["p","va"],"backlink":"search\/images?p={k}"},"{}.images.yahoo.com":{"params":["p","va"],"backlink":"search\/images?p={k}"},"cade.images.yahoo.com":{"params":["p","va"],"backlink":"search\/images?p={k}"},"espanol.images.yahoo.com":{"params":["p","va"],"backlink":"search\/images?p={k}"},"qc.images.yahoo.com":{"params":["p","va"],"backlink":"search\/images?p={k}"},"search.yahoo.co.jp":{"params":["p","vp"],"backlink":"search?p={k}","charsets":["utf-8","euc-jp","ms932"]},"jp.hao123.com":{"params":["query"]},"home.kingsoft.jp":{"params":["keyword"]},"image.search.yahoo.co.jp":{"params":["p"],"backlink":"search?p={k}","charsets":["utf-8","euc-jp","ms932"]},"video.search.yahoo.co.jp":{"params":["p"],"backlink":"search?p={k}","charsets":["utf-8","euc-jp","ms932"]},"search.yam.com":{"params":["k"],"backlink":"Search\/Web\/?SearchType=web&k={k}"},"yandex.ru":{"params":["text"],"backlink":"yandsearch?text={k}"},"yandex.com":{"params":["text"],"backlink":"yandsearch?text={k}"},"yandex.{}":{"params":["text"],"backlink":"yandsearch?text={k}"},"www.yandex.{}":{"params":["text"],"backlink":"yandsearch?text={k}"},"clck.yandex.{}":{"params":["text"],"backlink":"yandsearch?text={k}"},"m.yandex.{}":{"params":["text"],"backlink":"yandsearch?text={k}"},"images.yandex.ru":{"params":["text"],"backlink":"yandsearch?text={k}"},"images.yandex.com":{"params":["text"],"backlink":"yandsearch?text={k}"},"images.yandex.{}":{"params":["text"],"backlink":"yandsearch?text={k}"},"www.yasni.de":{"params":["query"]},"www.yasni.com":{"params":["query"]},"www.yasni.co.uk":{"params":["query"]},"www.yasni.ch":{"params":["query"]},"www.yasni.at":{"params":["query"]},"www.yatedo.com":{"backlink":"search\/profil?q={k}"},"www.yatedo.fr":{"backlink":"search\/profil?q={k}"},"yellowmap.de":{"params":[" "]},"yippy.com":{"params":["query"],"backlink":"search?query={k}"},"www.yougoo.fr":{"backlink":"?cx=search&q={k}"},"www.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"zapmeta.{}":{"params":{"1":"query"},"backlink":"?q={k}"},"uk.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"ar.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"au.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"ca.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"fi.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"no.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"tr.zapmeta.com":{"params":{"1":"query"},"backlink":"?q={k}"},"p.zhongsou.com":{"params":["w"],"backlink":"p?w={k}"},"www.zoeken.nl":{"backlink":"?q={k}"},"zoohoo.cz":{"backlink":"?q={k}","charsets":["windows-1250"]},"www.zoznam.sk":{"params":["s"],"backlink":"hladaj.fcgi?s={k}&co=svet"},"www.zxuso.com":{"params":["wd"],"backlink":"ri\/?wd={k}"},"kwzf.net":{"params":["search"],"backlink":"#search={k}"}}
vendor/maxmind.php CHANGED
@@ -2,34 +2,144 @@
2
 
3
  class maxmind_geolite2_connector {
4
  public static function get_geolocation_info( $_ip_address = '' ) {
 
5
  $geo_output = array( 'country' => array( 'iso_code' => '' ) );
6
 
7
  // Is this a RFC1918 (local) IP?
8
  if ( wp_slimstat::is_local_ip_address( $_ip_address ) ) {
9
  $geo_output[ 'country' ][ 'iso_code' ] = 'xy';
10
  }
11
- else if ( file_exists( wp_slimstat::$maxmind_path ) && is_file( wp_slimstat::$maxmind_path ) ) {
12
  // Do we need to update our data file?
13
- if ( false !== ( $file_stat = stat( wp_slimstat::$maxmind_path ) ) ) {
14
  // Is the database more than 30 days old?
15
  if ( !empty( $file_stat ) && ( date( 'U' ) - $file_stat[ 'mtime' ] > 2629740 ) ) {
16
- add_action( 'shutdown', array( 'wp_slimstat', 'download_maxmind_database' ) );
17
  }
18
  }
19
 
20
- $reader = new MaxMindReader( wp_slimstat::$maxmind_path );
21
  $geo_maxmind = $reader->get( $_ip_address );
22
 
23
  if ( !empty( $geo_maxmind ) ) {
24
  $geo_output = $geo_maxmind;
25
  }
26
  }
27
- else if ( !is_file( wp_slimstat::$maxmind_path ) ) {
28
  return $geo_output;
29
  }
30
 
31
  return apply_filters( 'slimstat_get_country', $geo_output, $_ip_address );
32
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  }
34
 
35
  /**
2
 
3
  class maxmind_geolite2_connector {
4
  public static function get_geolocation_info( $_ip_address = '' ) {
5
+ $maxmind_path = wp_slimstat::$upload_dir . '/maxmind.mmdb';
6
  $geo_output = array( 'country' => array( 'iso_code' => '' ) );
7
 
8
  // Is this a RFC1918 (local) IP?
9
  if ( wp_slimstat::is_local_ip_address( $_ip_address ) ) {
10
  $geo_output[ 'country' ][ 'iso_code' ] = 'xy';
11
  }
12
+ else if ( file_exists( $maxmind_path ) && is_file( $maxmind_path ) ) {
13
  // Do we need to update our data file?
14
+ if ( false !== ( $file_stat = stat( $maxmind_path ) ) ) {
15
  // Is the database more than 30 days old?
16
  if ( !empty( $file_stat ) && ( date( 'U' ) - $file_stat[ 'mtime' ] > 2629740 ) ) {
17
+ add_action( 'shutdown', array( __CLASS__, 'download_maxmind_database' ) );
18
  }
19
  }
20
 
21
+ $reader = new MaxMindReader( $maxmind_path );
22
  $geo_maxmind = $reader->get( $_ip_address );
23
 
24
  if ( !empty( $geo_maxmind ) ) {
25
  $geo_output = $geo_maxmind;
26
  }
27
  }
28
+ else if ( !is_file( $maxmind_path ) ) {
29
  return $geo_output;
30
  }
31
 
32
  return apply_filters( 'slimstat_get_country', $geo_output, $_ip_address );
33
  }
34
+
35
+ /**
36
+ * Downloads the MaxMind geolocation database from their repository
37
+ */
38
+ public static function download_maxmind_database() {
39
+ $maxmind_path = wp_slimstat::$upload_dir . '/maxmind.mmdb';
40
+
41
+ // Create the folder, if it doesn't exist
42
+ if ( !file_exists( dirname( $maxmind_path ) ) ) {
43
+ mkdir( dirname( $maxmind_path ) );
44
+ }
45
+
46
+ if ( file_exists( $maxmind_path ) ) {
47
+ if ( is_file( $maxmind_path ) ) {
48
+ $is_deleted = @unlink( $maxmind_path );
49
+ }
50
+ else {
51
+ // This should not happen, but hey...
52
+ $is_deleted = @rmdir( $maxmind_path );
53
+ }
54
+
55
+ if ( !$is_deleted ) {
56
+ return __( "The geolocation database cannot be updated. Please check your server's file permissions and try again.", 'wp-slimstat' );
57
+ }
58
+ }
59
+
60
+ // Download the most recent database directly from MaxMind's repository
61
+ if ( wp_slimstat::$settings[ 'geolocation_country' ] == 'on' ) {
62
+ $maxmind_tmp = self::download_url( 'https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz' );
63
+ }
64
+ else {
65
+ $maxmind_tmp = self::download_url( 'https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz' );
66
+ }
67
+
68
+ if ( is_wp_error( $maxmind_tmp ) ) {
69
+ return __( 'There was an error downloading the MaxMind Geolite DB:', 'wp-slimstat' ) . ' ' . $maxmind_tmp->get_error_message();
70
+ }
71
+
72
+ $zh = false;
73
+
74
+ if ( !function_exists( 'gzopen' ) ) {
75
+ if ( function_exists( 'gzopen64' ) ) {
76
+ if ( false === ( $zh = gzopen64( $maxmind_tmp, 'rb' ) ) ) {
77
+ return __( "There was an error opening the zipped MaxMind Geolite DB. Please check your server's file permissions and try again.", 'wp-slimstat' );
78
+ }
79
+ }
80
+ else {
81
+ return __( 'Function <code>gzopen</code> is not defined in your environment. Please ask your server administrator to install the corresponding library.', 'wp-slimstat' );
82
+ }
83
+ }
84
+ else{
85
+ if ( false === ( $zh = gzopen( $maxmind_tmp, 'rb' ) ) ) {
86
+ return __( "There was an error opening the zipped MaxMind Geolite DB. Please check your server's file permissions and try again.", 'wp-slimstat' );
87
+ }
88
+ }
89
+
90
+ if ( false === ( $fh = fopen( $maxmind_path, 'wb' ) ) ) {
91
+ return __( "There was an error opening the MaxMind Geolite DB. Please check your server's file permissions and try again.", 'wp-slimstat' );
92
+ }
93
+
94
+ while ( ( $data = gzread( $zh, 4096 ) ) != false ) {
95
+ fwrite( $fh, $data );
96
+ }
97
+
98
+ @gzclose( $zh );
99
+ @fclose( $fh );
100
+
101
+ if ( !is_file( $maxmind_path ) ) {
102
+ // Something went wrong, maybe a folder was created instead of a regular file
103
+ @rmdir( $maxmind_path );
104
+ return __( 'There was an error creating the MaxMind Geolite DB.', 'wp-slimstat' );
105
+ }
106
+
107
+ @unlink( $maxmind_tmp );
108
+
109
+ return '';
110
+ }
111
+
112
+ public static function download_url( $url ) {
113
+ // Include the FILE API, if it's not defined
114
+ if ( !function_exists( 'download_url' ) ) {
115
+ require_once( ABSPATH . 'wp-admin/includes/file.php' );
116
+ }
117
+
118
+ if ( !$url ) {
119
+ return new WP_Error( 'http_no_url', __( 'The provided URL is invalid.', 'wp-slimstat' ) );
120
+ }
121
+
122
+ $url_filename = basename( parse_url( $url, PHP_URL_PATH ) );
123
+
124
+ $tmpfname = wp_tempnam( $url_filename );
125
+ if ( ! $tmpfname ) {
126
+ return new WP_Error( 'http_no_file', __( "A temporary file could not be created. Please check your server's file permissions and try again.", 'wp-slimstat' ) );
127
+ }
128
+
129
+ $response = wp_safe_remote_get( $url, array( 'timeout' => 300, 'stream' => true, 'filename' => $tmpfname, 'user-agent' => 'Slimstat Analytics/' . wp_slimstat::$version . '; ' . home_url() ) );
130
+
131
+ if ( is_wp_error( $response ) ) {
132
+ unlink( $tmpfname );
133
+ return $response;
134
+ }
135
+
136
+ if ( 200 != wp_remote_retrieve_response_code( $response ) ){
137
+ unlink( $tmpfname );
138
+ return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ) );
139
+ }
140
+
141
+ return $tmpfname;
142
+ }
143
  }
144
 
145
  /**
wp-slimstat.js CHANGED
@@ -1,8 +1,9 @@
1
  var SlimStat = {
2
- _base64_key_str : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-",
 
3
 
4
  // Encodes a string using the UTF-8 encoding. This function is needed by the Base64 Encoder here below
5
- _utf8_encode : function( string ) {
6
  var n, c, utftext = "";
7
 
8
  string = string.replace(/\r\n/g, "\n");
@@ -27,10 +28,10 @@ var SlimStat = {
27
  },
28
 
29
  // Base64 Encode - http://www.webtoolkit.info/
30
- _base64_encode : function( input ) {
31
  var chr1, chr2, chr3, enc1, enc2, enc3, enc4, output = "", i = 0;
32
 
33
- input = SlimStat._utf8_encode( input );
34
 
35
  while ( i < input.length ) {
36
  chr1 = input.charCodeAt( i++ );
@@ -49,7 +50,7 @@ var SlimStat = {
49
  enc4 = 64;
50
  }
51
 
52
- output = output + SlimStat._base64_key_str.charAt( enc1 ) + SlimStat._base64_key_str.charAt( enc2 ) + SlimStat._base64_key_str.charAt( enc3 ) + SlimStat._base64_key_str.charAt( enc4 );
53
  }
54
  return output;
55
  },
@@ -121,6 +122,7 @@ var SlimStat = {
121
 
122
  xhr.onreadystatechange = function() {
123
  if ( 4 == xhr.readyState ) {
 
124
  document.body.insertAdjacentHTML( 'beforeend', xhr.responseText );
125
  }
126
  }
@@ -194,10 +196,8 @@ var SlimStat = {
194
  use_beacon = true;
195
  }
196
 
197
- slimstat_data_with_client_info = data + "&sw=" + screen.width + "&sh=" + screen.height + "&bw=" + window.innerWidth + "&bh=" + window.innerHeight + "&sl=" + SlimStat.get_server_latency() + "&pp=" + SlimStat.get_page_performance();
198
-
199
  if ( use_beacon && navigator.sendBeacon ) {
200
- navigator.sendBeacon( SlimStatParams.ajaxurl, slimstat_data_with_client_info );
201
  }
202
  else {
203
  try {
@@ -211,7 +211,7 @@ var SlimStat = {
211
  xhr.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
212
  xhr.setRequestHeader( "X-Requested-With", "XMLHttpRequest" );
213
  xhr.withCredentials = true;
214
- xhr.send( slimstat_data_with_client_info );
215
 
216
  xhr.onreadystatechange = function() {
217
  if ( 4 == xhr.readyState ) {
@@ -261,66 +261,99 @@ var SlimStat = {
261
  return false;
262
  }
263
 
264
- resource_url = "";
 
265
 
266
- // Do not track events on elements with given class names or rel attributes
267
- do_not_track = !SlimStat.empty( SlimStatParams.dnt ) ? SlimStatParams.dnt.split( ',' ) : [];
 
 
268
 
269
- // Different elements have different properties to record...
270
- if ( !SlimStat.empty( target_node.nodeName ) ) {
271
- switch ( target_node.nodeName ) {
272
- case "INPUT":
273
- case "BUTTON":
274
- // Let's look for a FORM element
275
- while ( !SlimStat.empty( target_node ) && !SlimStat.empty( target_node.nodeName ) && target_node.nodeName.toLowerCase() != "form" ) {
276
- target_node = target_node.parentNode;
277
- }
278
 
279
- if ( !SlimStat.empty( target_node ) && !SlimStat.empty( target_node.nodeName ) && !SlimStat.empty( target_node.action ) ) {
280
- resource_url = target_node.action;
281
- }
282
- break;
 
 
 
 
283
 
284
- default:
285
- // Is this a link?
286
- while ( !SlimStat.empty( target_node ) && !SlimStat.empty( target_node.nodeName ) && target_node.nodeName.toLowerCase() != "a" ) {
287
- target_node = target_node.parentNode;
 
 
 
 
 
 
 
288
  }
289
 
290
- if ( !SlimStat.empty( target_node ) ) {
291
- // Anchor in the same page
292
- if ( !SlimStat.empty( target_node.hash ) && target_node.hostname == location.hostname ) {
293
- resource_url = target_node.hash;
294
  }
295
- // Regular link to another page
296
- else if ( !SlimStat.empty( target_node.href ) && target_node.href.indexOf( 'javascript:' ) == -1 ) {
297
-
298
- // Do not track links containing one of the strings defined in the settings as HREF
299
- if ( SlimStat.in_array( target_node.href, do_not_track ) ) {
300
- return false;
301
- }
302
-
303
- resource_url = target_node.href;
304
  }
305
 
306
  // If this element has a title, we can record that as well
307
- if ( "function" == typeof target_node.getAttribute ) {
308
- if ( !SlimStat.empty( target_node.getAttribute( "title" ) ) ) {
309
- note_array.push( "Title:" + target_node.getAttribute( "title" ) );
310
  }
311
- if ( !SlimStat.empty( target_node.getAttribute( "id" ) ) ) {
312
- note_array.push( "ID:" + target_node.getAttribute( "id" ) );
313
  }
314
  }
315
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  }
317
 
318
- if ( !SlimStat.empty( do_not_track.length ) && !SlimStat.empty( target_node ) ) {
319
- target_classes = !SlimStat.empty( target_node.className ) ? target_node.className.split( " " ) : [];
 
320
 
321
- if ( target_classes.filter( function( value ) { return do_not_track.indexOf( value ) !== -1; } ).length != 0 || ( !SlimStat.empty( target_node.attributes ) && !SlimStat.empty( target_node.attributes.rel ) && !SlimStat.empty( target_node.attributes.rel.value ) && SlimStat.in_array( target_node.attributes.rel.value, do_not_track ) ) ) {
322
- return false;
323
- }
 
 
324
  }
325
  }
326
 
@@ -334,20 +367,36 @@ var SlimStat = {
334
  position = window.event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft + "," + window.event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
335
  }
336
 
337
- // Event description and button pressed
338
- if ( !SlimStat.empty( window.event.type ) ) {
339
- note_array.push( 'type:' + window.event.type );
340
- if ( "keypress" == window.event.type ) {
341
- note_array.push( 'keypress:' + String.fromCharCode( parseInt( window.event.which ) ) );
342
- }
343
- else if ( "click" == window.event.type ) {
344
- note_array.push( 'which:' + window.event.which );
 
 
 
 
 
 
 
345
  }
346
  }
347
 
348
- SlimStat.send_to_server( "action=slimtrack&id=" + SlimStatParams.id + "&ref=" + SlimStat._base64_encode( document.referrer ) + "&res=" + SlimStat._base64_encode( resource_url ) + "&pos=" + position + "&no=" + SlimStat._base64_encode( note_array.join( ", " ) ), use_beacon );
 
349
 
350
- return true;
 
 
 
 
 
 
 
 
351
  }
352
  }
353
 
@@ -364,15 +413,12 @@ SlimStat.add_event( window, 'load', function() {
364
  use_beacon = true;
365
 
366
  // Server-side mode: update an existing pageview
367
- if ( !SlimStat.empty( SlimStatParams.id ) ) {
368
-
369
- if ( parseInt( SlimStatParams.id ) > 0 ) {
370
- slimstat_data = "action=slimtrack&id=" + SlimStatParams.id;
371
- }
372
  }
373
  // Client-side mode: record a new pageview
374
  else {
375
- slimstat_data = "action=slimtrack&ref=" + SlimStat._base64_encode( document.referrer ) + "&res=" + SlimStat._base64_encode( window.location.href );
376
 
377
  // The "ci" param is not defined for external pages (the server-side tracker knows how to handle that situation)
378
  if ( !SlimStat.empty( SlimStatParams.ci ) ) {
@@ -384,19 +430,44 @@ SlimStat.add_event( window, 'load', function() {
384
  }
385
 
386
  if ( slimstat_data.length > 0 ) {
387
- setTimeout( function(){
388
- SlimStat.send_to_server( slimstat_data, use_beacon );
389
- }, 50 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
  }
391
 
392
- // Attach an event handler to all the links on the page that satisfy the criteria set by the admin
393
- all_links = document.getElementsByTagName( "a" );
394
- for ( var i = 0; i < all_links.length; i++ ) {
395
- SlimStat.add_event( all_links[ i ], "click", function( e ) {
396
  SlimStat.ss_track();
397
  } );
398
  }
 
 
 
 
 
 
399
 
400
- // GDPR: display the Opt-Out box, if needed
401
- SlimStat.show_optout_message();
402
- } );
1
  var SlimStat = {
2
+ base64_key_str : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-",
3
+ fingerprint_hash : "",
4
 
5
  // Encodes a string using the UTF-8 encoding. This function is needed by the Base64 Encoder here below
6
+ utf8_encode : function( string ) {
7
  var n, c, utftext = "";
8
 
9
  string = string.replace(/\r\n/g, "\n");
28
  },
29
 
30
  // Base64 Encode - http://www.webtoolkit.info/
31
+ base64_encode : function( input ) {
32
  var chr1, chr2, chr3, enc1, enc2, enc3, enc4, output = "", i = 0;
33
 
34
+ input = SlimStat.utf8_encode( input );
35
 
36
  while ( i < input.length ) {
37
  chr1 = input.charCodeAt( i++ );
50
  enc4 = 64;
51
  }
52
 
53
+ output = output + SlimStat.base64_key_str.charAt( enc1 ) + SlimStat.base64_key_str.charAt( enc2 ) + SlimStat.base64_key_str.charAt( enc3 ) + SlimStat.base64_key_str.charAt( enc4 );
54
  }
55
  return output;
56
  },
122
 
123
  xhr.onreadystatechange = function() {
124
  if ( 4 == xhr.readyState ) {
125
+
126
  document.body.insertAdjacentHTML( 'beforeend', xhr.responseText );
127
  }
128
  }
196
  use_beacon = true;
197
  }
198
 
 
 
199
  if ( use_beacon && navigator.sendBeacon ) {
200
+ navigator.sendBeacon( SlimStatParams.ajaxurl, data );
201
  }
202
  else {
203
  try {
211
  xhr.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
212
  xhr.setRequestHeader( "X-Requested-With", "XMLHttpRequest" );
213
  xhr.withCredentials = true;
214
+ xhr.send( data );
215
 
216
  xhr.onreadystatechange = function() {
217
  if ( 4 == xhr.readyState ) {
261
  return false;
262
  }
263
 
264
+ var resource_url = "";
265
+ var fingerprint_hash = "";
266
 
267
+ // This function doesn't track focus events, which are usually triggered along with click events
268
+ if ( SlimStat.empty( window.event.type ) || window.event.type == "focus" ) {
269
+ return false;
270
+ }
271
 
272
+ // Event description and button pressed
273
+ note_array.push( 'Type:' + window.event.type );
274
+ if ( "keypress" == window.event.type ) {
275
+ note_array.push( 'Keypress:' + String.fromCharCode( parseInt( window.event.which ) ) );
276
+ }
277
+ else if ( "click" == window.event.type ) {
278
+ note_array.push( 'Button:' + ( window.event.which == 1 ? 'left' : ( window.event.which == 2 ) ? 'middle' : 'right' ) );
279
+ }
 
280
 
281
+ // Different elements have different properties to record...
282
+ switch ( target_node.nodeName.toLowerCase() ) {
283
+ case "input":
284
+ case "button":
285
+ // Look for a parent FORM element to get the target action
286
+ while ( !SlimStat.empty( target_node ) && !SlimStat.empty( target_node.nodeName ) && target_node.nodeName.toLowerCase() != "form" ) {
287
+ target_node = target_node.parentNode;
288
+ }
289
 
290
+ if ( !SlimStat.empty( target_node ) && !SlimStat.empty( target_node.action ) ) {
291
+ resource_url = target_node.action;
292
+ }
293
+ break;
294
+
295
+ default:
296
+ // Look for a parent with a HREF attribute, if this node doesn't have one (i.e., a SPAN within an A element)
297
+ if ( SlimStat.empty( target_node.href ) || "string" != typeof target_node.href ) {
298
+ parent_node = target_node.parentNode;
299
+ while ( !SlimStat.empty( parent_node ) && !SlimStat.empty( parent_node.nodeName ) && SlimStat.empty( parent_node.href ) ) {
300
+ parent_node = parent_node.parentNode;
301
  }
302
 
303
+ if ( !SlimStat.empty( parent_node ) ) {
304
+ if ( !SlimStat.empty( parent_node.hash ) && parent_node.hostname == location.hostname ) {
305
+ resource_url = parent_node.hash;
 
306
  }
307
+ else if ( !SlimStat.empty( parent_node.href ) ) {
308
+ resource_url = parent_node.href;
 
 
 
 
 
 
 
309
  }
310
 
311
  // If this element has a title, we can record that as well
312
+ if ( "function" == typeof parent_node.getAttribute ) {
313
+ if ( !SlimStat.empty( parent_node.getAttribute( "title" ) ) ) {
314
+ note_array.push( "Parent Title:" + parent_node.getAttribute( "title" ) );
315
  }
316
+ if ( !SlimStat.empty( parent_node.getAttribute( "id" ) ) ) {
317
+ note_array.push( "Parent ID:" + parent_node.getAttribute( "id" ) );
318
  }
319
  }
320
  }
321
+ }
322
+ else if ( !SlimStat.empty( target_node.hash ) ) {
323
+ resource_url = target_node.hash;
324
+ }
325
+ else {
326
+ resource_url = target_node.href;
327
+ }
328
+
329
+ // If this element has a title, we can record that as well
330
+ if ( "function" == typeof target_node.getAttribute ) {
331
+ if ( !SlimStat.empty( target_node.getAttribute( "title" ) ) ) {
332
+ note_array.push( "Title:" + target_node.getAttribute( "title" ) );
333
+ }
334
+ if ( !SlimStat.empty( target_node.getAttribute( "id" ) ) ) {
335
+ note_array.push( "ID:" + target_node.getAttribute( "id" ) );
336
+ }
337
+ }
338
+ }
339
+
340
+ do_not_track = !SlimStat.empty( SlimStatParams.dnt ) ? SlimStatParams.dnt.split( ',' ) : [];
341
+
342
+ if ( !SlimStat.empty( resource_url ) ) {
343
+ // Do not track links containing one of the strings defined in the settings as HREF
344
+ if ( !SlimStat.empty( do_not_track ) && SlimStat.in_array( resource_url, do_not_track ) ) {
345
+ return false;
346
  }
347
 
348
+ // Send the fingerprint hash, in case this is considered a 'download'
349
+ fingerprint_hash = "&fh=" + SlimStat.fingerprint_hash;
350
+ }
351
 
352
+ // See if any of the classes associated to this element are listed as "do not track"
353
+ target_classes = ( !SlimStat.empty( target_node.className ) && "string" == typeof target_node.className ) ? target_node.className.split( " " ) : [];
354
+ if ( !SlimStat.empty( do_not_track ) && !SlimStat.empty( target_classes ) ) {
355
+ if ( target_classes.filter( function( value ) { return do_not_track.indexOf( value ) !== -1; } ).length != 0 || ( !SlimStat.empty( target_node.attributes ) && !SlimStat.empty( target_node.attributes.rel ) && !SlimStat.empty( target_node.attributes.rel.value ) && SlimStat.in_array( target_node.attributes.rel.value, do_not_track ) ) ) {
356
+ return false;
357
  }
358
  }
359
 
367
  position = window.event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft + "," + window.event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
368
  }
369
 
370
+ SlimStat.send_to_server( "action=slimtrack&id=" + SlimStatParams.id + "&res=" + SlimStat.base64_encode( resource_url ) + "&pos=" + position + "&no=" + SlimStat.base64_encode( note_array.join( "," ) ) + fingerprint_hash, use_beacon );
371
+
372
+ return true;
373
+ },
374
+
375
+ get_slimstat_data : function( fingerprint_components ) {
376
+ screenres = SlimStat.get_component_value( fingerprint_components, "screenResolution", [0, 0] );
377
+
378
+ return "&sw=" + screenres[ 0 ] + "&sh=" + screenres[ 1 ] + "&bw=" + window.innerWidth + "&bh=" + window.innerHeight + "&sl=" + SlimStat.get_server_latency() + "&pp=" + SlimStat.get_page_performance() + "&fh=" + SlimStat.fingerprint_hash + "&tz=" + SlimStat.get_component_value( fingerprint_components, "timezoneOffset", 0 );
379
+ },
380
+
381
+ get_component_value : function( fingerprint_components, key, default_value ) {
382
+ for ( x = 0; x < fingerprint_components.length; x++ ) {
383
+ if ( fingerprint_components[ x ].key === key ) {
384
+ return fingerprint_components[ x ].value;
385
  }
386
  }
387
 
388
+ return default_value;
389
+ },
390
 
391
+ init_fingerprint_hash : function ( fingerprint_components ) {
392
+ values = fingerprint_components.map(
393
+ function ( component ) {
394
+ return component.value;
395
+ }
396
+ );
397
+
398
+ // Generate the unique fingerprint hash
399
+ SlimStat.fingerprint_hash = Fingerprint2.x64hash128( values.join( '' ), 31 );
400
  }
401
  }
402
 
413
  use_beacon = true;
414
 
415
  // Server-side mode: update an existing pageview
416
+ if ( !SlimStat.empty( SlimStatParams.id ) && parseInt( SlimStatParams.id ) > 0 ) {
417
+ slimstat_data = "action=slimtrack&id=" + SlimStatParams.id;
 
 
 
418
  }
419
  // Client-side mode: record a new pageview
420
  else {
421
+ slimstat_data = "action=slimtrack&ref=" + SlimStat.base64_encode( document.referrer ) + "&res=" + SlimStat.base64_encode( window.location.href );
422
 
423
  // The "ci" param is not defined for external pages (the server-side tracker knows how to handle that situation)
424
  if ( !SlimStat.empty( SlimStatParams.ci ) ) {
430
  }
431
 
432
  if ( slimstat_data.length > 0 ) {
433
+ var options = { excludes: { adBlock: true, addBehavior: true, userAgent: true, canvas: true, webgl: true } };
434
+
435
+ if ( window.requestIdleCallback ) {
436
+ requestIdleCallback( function () {
437
+ Fingerprint2.get( function ( components ) {
438
+ SlimStat.init_fingerprint_hash( components );
439
+ SlimStat.send_to_server( slimstat_data + SlimStat.get_slimstat_data( components ), use_beacon );
440
+
441
+ // GDPR: display the Opt-Out box, if needed
442
+ SlimStat.show_optout_message();
443
+ } );
444
+ } );
445
+ } else {
446
+ setTimeout( function () {
447
+ Fingerprint2.get( function ( components ) {
448
+ SlimStat.init_fingerprint_hash( components );
449
+ SlimStat.send_to_server( slimstat_data + SlimStat.get_slimstat_data( components ), use_beacon );
450
+
451
+ // GDPR: display the Opt-Out box, if needed
452
+ SlimStat.show_optout_message();
453
+ } );
454
+ }, 250 );
455
+ }
456
  }
457
 
458
+ // Attach an event handler to all the clickable elements on the page
459
+ all_clickable = document.querySelectorAll( "a,button,input,area" );
460
+ for ( var i = 0; i < all_clickable.length; i++ ) {
461
+ SlimStat.add_event( all_clickable[ i ], "click", function( e ) {
462
  SlimStat.ss_track();
463
  } );
464
  }
465
+ } );
466
+ SlimStat.add_event( window, 'beforeunload', function() {
467
+ if ( !SlimStat.empty( document.activeElement ) && !SlimStat.empty( document.activeElement.nodeName ) && document.activeElement.nodeName.toLowerCase() == "body" && !SlimStat.empty( SlimStatParams.id ) && parseInt( SlimStatParams.id ) > 0 ) {
468
+ SlimStat.send_to_server( "action=slimtrack&id=" + SlimStatParams.id, true );
469
+ }
470
+ } );
471
 
472
+ // fingerprintjs2 - https://github.com/Valve/fingerprintjs2
473
+ !function(e,t,a){"use strict";"undefined"!=typeof window&&"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&module.exports?module.exports=a():t.exports?t.exports=a():t.Fingerprint2=a()}(0,this,function(){"use strict";var d=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var a=[0,0,0,0];return a[3]+=e[3]+t[3],a[2]+=a[3]>>>16,a[3]&=65535,a[2]+=e[2]+t[2],a[1]+=a[2]>>>16,a[2]&=65535,a[1]+=e[1]+t[1],a[0]+=a[1]>>>16,a[1]&=65535,a[0]+=e[0]+t[0],a[0]&=65535,[a[0]<<16|a[1],a[2]<<16|a[3]]},g=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var a=[0,0,0,0];return a[3]+=e[3]*t[3],a[2]+=a[3]>>>16,a[3]&=65535,a[2]+=e[2]*t[3],a[1]+=a[2]>>>16,a[2]&=65535,a[2]+=e[3]*t[2],a[1]+=a[2]>>>16,a[2]&=65535,a[1]+=e[1]*t[3],a[0]+=a[1]>>>16,a[1]&=65535,a[1]+=e[2]*t[2],a[0]+=a[1]>>>16,a[1]&=65535,a[1]+=e[3]*t[1],a[0]+=a[1]>>>16,a[1]&=65535,a[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],a[0]&=65535,[a[0]<<16|a[1],a[2]<<16|a[3]]},f=function(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])},h=function(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]},m=function(e,t){return[e[0]^t[0],e[1]^t[1]]},T=function(e){return e=m(e,[0,e[0]>>>1]),e=g(e,[4283543511,3981806797]),e=m(e,[0,e[0]>>>1]),e=g(e,[3301882366,444984403]),e=m(e,[0,e[0]>>>1])},l=function(e,t){t=t||0;for(var a=(e=e||"").length%16,n=e.length-a,r=[0,t],i=[0,t],o=[0,0],l=[0,0],s=[2277735313,289559509],c=[1291169091,658871167],u=0;u<n;u+=16)o=[255&e.charCodeAt(u+4)|(255&e.charCodeAt(u+5))<<8|(255&e.charCodeAt(u+6))<<16|(255&e.charCodeAt(u+7))<<24,255&e.charCodeAt(u)|(255&e.charCodeAt(u+1))<<8|(255&e.charCodeAt(u+2))<<16|(255&e.charCodeAt(u+3))<<24],l=[255&e.charCodeAt(u+12)|(255&e.charCodeAt(u+13))<<8|(255&e.charCodeAt(u+14))<<16|(255&e.charCodeAt(u+15))<<24,255&e.charCodeAt(u+8)|(255&e.charCodeAt(u+9))<<8|(255&e.charCodeAt(u+10))<<16|(255&e.charCodeAt(u+11))<<24],o=g(o,s),o=f(o,31),o=g(o,c),r=m(r,o),r=f(r,27),r=d(r,i),r=d(g(r,[0,5]),[0,1390208809]),l=g(l,c),l=f(l,33),l=g(l,s),i=m(i,l),i=f(i,31),i=d(i,r),i=d(g(i,[0,5]),[0,944331445]);switch(o=[0,0],l=[0,0],a){case 15:l=m(l,h([0,e.charCodeAt(u+14)],48));case 14:l=m(l,h([0,e.charCodeAt(u+13)],40));case 13:l=m(l,h([0,e.charCodeAt(u+12)],32));case 12:l=m(l,h([0,e.charCodeAt(u+11)],24));case 11:l=m(l,h([0,e.charCodeAt(u+10)],16));case 10:l=m(l,h([0,e.charCodeAt(u+9)],8));case 9:l=m(l,[0,e.charCodeAt(u+8)]),l=g(l,c),l=f(l,33),l=g(l,s),i=m(i,l);case 8:o=m(o,h([0,e.charCodeAt(u+7)],56));case 7:o=m(o,h([0,e.charCodeAt(u+6)],48));case 6:o=m(o,h([0,e.charCodeAt(u+5)],40));case 5:o=m(o,h([0,e.charCodeAt(u+4)],32));case 4:o=m(o,h([0,e.charCodeAt(u+3)],24));case 3:o=m(o,h([0,e.charCodeAt(u+2)],16));case 2:o=m(o,h([0,e.charCodeAt(u+1)],8));case 1:o=m(o,[0,e.charCodeAt(u)]),o=g(o,s),o=f(o,31),o=g(o,c),r=m(r,o)}return r=m(r,[0,e.length]),i=m(i,[0,e.length]),r=d(r,i),i=d(i,r),r=T(r),i=T(i),r=d(r,i),i=d(i,r),("00000000"+(r[0]>>>0).toString(16)).slice(-8)+("00000000"+(r[1]>>>0).toString(16)).slice(-8)+("00000000"+(i[0]>>>0).toString(16)).slice(-8)+("00000000"+(i[1]>>>0).toString(16)).slice(-8)},e={preprocessor:null,audio:{timeout:1e3,excludeIOS11:!0},fonts:{swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf",userDefinedFonts:[],extendedJsFonts:!1},screen:{detectScreenOrientation:!0},plugins:{sortPluginsFor:[/palemoon/i],excludeIE:!1},extraComponents:[],excludes:{enumerateDevices:!0,pixelRatio:!0,doNotTrack:!0,fontsFlash:!0},NOT_AVAILABLE:"not available",ERROR:"error",EXCLUDED:"excluded"},c=function(e,t){if(Array.prototype.forEach&&e.forEach===Array.prototype.forEach)e.forEach(t);else if(e.length===+e.length)for(var a=0,n=e.length;a<n;a++)t(e[a],a,e);else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r,e)},s=function(e,n){var r=[];return null==e?r:Array.prototype.map&&e.map===Array.prototype.map?e.map(n):(c(e,function(e,t,a){r.push(n(e,t,a))}),r)},a=function(){return navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices},n=function(e){var t=[window.screen.width,window.screen.height];return e.screen.detectScreenOrientation&&t.sort().reverse(),t},r=function(e){if(window.screen.availWidth&&window.screen.availHeight){var t=[window.screen.availHeight,window.screen.availWidth];return e.screen.detectScreenOrientation&&t.sort().reverse(),t}return e.NOT_AVAILABLE},i=function(e){if(null==navigator.plugins)return e.NOT_AVAILABLE;for(var t=[],a=0,n=navigator.plugins.length;a<n;a++)navigator.plugins[a]&&t.push(navigator.plugins[a]);return u(e)&&(t=t.sort(function(e,t){return e.name>t.name?1:e.name<t.name?-1:0})),s(t,function(e){var t=s(e,function(e){return[e.type,e.suffixes]});return[e.name,e.description,t]})},o=function(t){var e=[];if(Object.getOwnPropertyDescriptor&&Object.getOwnPropertyDescriptor(window,"ActiveXObject")||"ActiveXObject"in window){e=s(["AcroPDF.PDF","Adodb.Stream","AgControl.AgControl","DevalVRXCtrl.DevalVRXCtrl.1","MacromediaFlashPaper.MacromediaFlashPaper","Msxml2.DOMDocument","Msxml2.XMLHTTP","PDF.PdfCtrl","QuickTime.QuickTime","QuickTimeCheckObject.QuickTimeCheck.1","RealPlayer","RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)","RealVideo.RealVideo(tm) ActiveX Control (32-bit)","Scripting.Dictionary","SWCtl.SWCtl","Shell.UIHelper","ShockwaveFlash.ShockwaveFlash","Skype.Detection","TDCCtl.TDCCtl","WMPlayer.OCX","rmocx.RealPlayer G2 Control","rmocx.RealPlayer G2 Control.1"],function(e){try{return new window.ActiveXObject(e),e}catch(e){return t.ERROR}})}else e.push(t.NOT_AVAILABLE);return navigator.plugins&&(e=e.concat(i(t))),e},u=function(e){for(var t=!1,a=0,n=e.plugins.sortPluginsFor.length;a<n;a++){var r=e.plugins.sortPluginsFor[a];if(navigator.userAgent.match(r)){t=!0;break}}return t},p=function(t){try{return!!window.sessionStorage}catch(e){return t.ERROR}},v=function(t){try{return!!window.localStorage}catch(e){return t.ERROR}},A=function(t){try{return!!window.indexedDB}catch(e){return t.ERROR}},S=function(e){return navigator.hardwareConcurrency?navigator.hardwareConcurrency:e.NOT_AVAILABLE},C=function(e){return navigator.cpuClass||e.NOT_AVAILABLE},B=function(e){return navigator.platform?navigator.platform:e.NOT_AVAILABLE},w=function(e){return navigator.doNotTrack?navigator.doNotTrack:navigator.msDoNotTrack?navigator.msDoNotTrack:window.doNotTrack?window.doNotTrack:e.NOT_AVAILABLE},t=function(){var t,e=0;void 0!==navigator.maxTouchPoints?e=navigator.maxTouchPoints:void 0!==navigator.msMaxTouchPoints&&(e=navigator.msMaxTouchPoints);try{document.createEvent("TouchEvent"),t=!0}catch(e){t=!1}return[e,t,"ontouchstart"in window]},y=function(e){var t=[],a=document.createElement("canvas");a.width=2e3,a.height=200,a.style.display="inline";var n=a.getContext("2d");return n.rect(0,0,10,10),n.rect(2,2,6,6),t.push("canvas winding:"+(!1===n.isPointInPath(5,5,"evenodd")?"yes":"no")),n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(125,1,62,20),n.fillStyle="#069",e.dontUseFakeFontInCanvas?n.font="11pt Arial":n.font="11pt no-real-font-123",n.fillText("Cwm fjordbank glyphs vext quiz, 😃",2,15),n.fillStyle="rgba(102, 204, 0, 0.2)",n.font="18pt Arial",n.fillText("Cwm fjordbank glyphs vext quiz, 😃",4,45),n.globalCompositeOperation="multiply",n.fillStyle="rgb(255,0,255)",n.beginPath(),n.arc(50,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(0,255,255)",n.beginPath(),n.arc(100,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,255,0)",n.beginPath(),n.arc(75,100,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,0,255)",n.arc(75,75,75,0,2*Math.PI,!0),n.arc(75,75,25,0,2*Math.PI,!0),n.fill("evenodd"),a.toDataURL&&t.push("canvas fp:"+a.toDataURL()),t},E=function(){var o,e=function(e){return o.clearColor(0,0,0,1),o.enable(o.DEPTH_TEST),o.depthFunc(o.LEQUAL),o.clear(o.COLOR_BUFFER_BIT|o.DEPTH_BUFFER_BIT),"["+e[0]+", "+e[1]+"]"};if(!(o=F()))return null;var l=[],t=o.createBuffer();o.bindBuffer(o.ARRAY_BUFFER,t);var a=new Float32Array([-.2,-.9,0,.4,-.26,0,0,.732134444,0]);o.bufferData(o.ARRAY_BUFFER,a,o.STATIC_DRAW),t.itemSize=3,t.numItems=3;var n=o.createProgram(),r=o.createShader(o.VERTEX_SHADER);o.shaderSource(r,"attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}"),o.compileShader(r);var i=o.createShader(o.FRAGMENT_SHADER);o.shaderSource(i,"precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}"),o.compileShader(i),o.attachShader(n,r),o.attachShader(n,i),o.linkProgram(n),o.useProgram(n),n.vertexPosAttrib=o.getAttribLocation(n,"attrVertex"),n.offsetUniform=o.getUniformLocation(n,"uniformOffset"),o.enableVertexAttribArray(n.vertexPosArray),o.vertexAttribPointer(n.vertexPosAttrib,t.itemSize,o.FLOAT,!1,0,0),o.uniform2f(n.offsetUniform,1,1),o.drawArrays(o.TRIANGLE_STRIP,0,t.numItems);try{l.push(o.canvas.toDataURL())}catch(e){}l.push("extensions:"+(o.getSupportedExtensions()||[]).join(";")),l.push("webgl aliased line width range:"+e(o.getParameter(o.ALIASED_LINE_WIDTH_RANGE))),l.push("webgl aliased point size range:"+e(o.getParameter(o.ALIASED_POINT_SIZE_RANGE))),l.push("webgl alpha bits:"+o.getParameter(o.ALPHA_BITS)),l.push("webgl antialiasing:"+(o.getContextAttributes().antialias?"yes":"no")),l.push("webgl blue bits:"+o.getParameter(o.BLUE_BITS)),l.push("webgl depth bits:"+o.getParameter(o.DEPTH_BITS)),l.push("webgl green bits:"+o.getParameter(o.GREEN_BITS)),l.push("webgl max anisotropy:"+function(e){var t=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic");if(t){var a=e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT);return 0===a&&(a=2),a}return null}(o)),l.push("webgl max combined texture image units:"+o.getParameter(o.MAX_COMBINED_TEXTURE_IMAGE_UNITS)),l.push("webgl max cube map texture size:"+o.getParameter(o.MAX_CUBE_MAP_TEXTURE_SIZE)),l.push("webgl max fragment uniform vectors:"+o.getParameter(o.MAX_FRAGMENT_UNIFORM_VECTORS)),l.push("webgl max render buffer size:"+o.getParameter(o.MAX_RENDERBUFFER_SIZE)),l.push("webgl max texture image units:"+o.getParameter(o.MAX_TEXTURE_IMAGE_UNITS)),l.push("webgl max texture size:"+o.getParameter(o.MAX_TEXTURE_SIZE)),l.push("webgl max varying vectors:"+o.getParameter(o.MAX_VARYING_VECTORS)),l.push("webgl max vertex attribs:"+o.getParameter(o.MAX_VERTEX_ATTRIBS)),l.push("webgl max vertex texture image units:"+o.getParameter(o.MAX_VERTEX_TEXTURE_IMAGE_UNITS)),l.push("webgl max vertex uniform vectors:"+o.getParameter(o.MAX_VERTEX_UNIFORM_VECTORS)),l.push("webgl max viewport dims:"+e(o.getParameter(o.MAX_VIEWPORT_DIMS))),l.push("webgl red bits:"+o.getParameter(o.RED_BITS)),l.push("webgl renderer:"+o.getParameter(o.RENDERER)),l.push("webgl shading language version:"+o.getParameter(o.SHADING_LANGUAGE_VERSION)),l.push("webgl stencil bits:"+o.getParameter(o.STENCIL_BITS)),l.push("webgl vendor:"+o.getParameter(o.VENDOR)),l.push("webgl version:"+o.getParameter(o.VERSION));try{var s=o.getExtension("WEBGL_debug_renderer_info");s&&(l.push("webgl unmasked vendor:"+o.getParameter(s.UNMASKED_VENDOR_WEBGL)),l.push("webgl unmasked renderer:"+o.getParameter(s.UNMASKED_RENDERER_WEBGL)))}catch(e){}return o.getShaderPrecisionFormat&&c(["FLOAT","INT"],function(i){c(["VERTEX","FRAGMENT"],function(r){c(["HIGH","MEDIUM","LOW"],function(n){c(["precision","rangeMin","rangeMax"],function(e){var t=o.getShaderPrecisionFormat(o[r+"_SHADER"],o[n+"_"+i])[e];"precision"!==e&&(e="precision "+e);var a=["webgl ",r.toLowerCase()," shader ",n.toLowerCase()," ",i.toLowerCase()," ",e,":",t].join("");l.push(a)})})})}),l},M=function(){try{var e=F(),t=e.getExtension("WEBGL_debug_renderer_info");return e.getParameter(t.UNMASKED_VENDOR_WEBGL)+"~"+e.getParameter(t.UNMASKED_RENDERER_WEBGL)}catch(e){return null}},x=function(){var e=document.createElement("div");e.innerHTML="&nbsp;";var t=!(e.className="adsbox");try{document.body.appendChild(e),t=0===document.getElementsByClassName("adsbox")[0].offsetHeight,document.body.removeChild(e)}catch(e){t=!1}return t},O=function(){if(void 0!==navigator.languages)try{if(navigator.languages[0].substr(0,2)!==navigator.language.substr(0,2))return!0}catch(e){return!0}return!1},b=function(){return window.screen.width<window.screen.availWidth||window.screen.height<window.screen.availHeight},P=function(){var e,t=navigator.userAgent.toLowerCase(),a=navigator.oscpu,n=navigator.platform.toLowerCase();if(e=0<=t.indexOf("windows phone")?"Windows Phone":0<=t.indexOf("win")?"Windows":0<=t.indexOf("android")?"Android":0<=t.indexOf("linux")||0<=t.indexOf("cros")?"Linux":0<=t.indexOf("iphone")||0<=t.indexOf("ipad")?"iOS":0<=t.indexOf("mac")?"Mac":"Other",("ontouchstart"in window||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints)&&"Windows Phone"!==e&&"Android"!==e&&"iOS"!==e&&"Other"!==e)return!0;if(void 0!==a){if(0<=(a=a.toLowerCase()).indexOf("win")&&"Windows"!==e&&"Windows Phone"!==e)return!0;if(0<=a.indexOf("linux")&&"Linux"!==e&&"Android"!==e)return!0;if(0<=a.indexOf("mac")&&"Mac"!==e&&"iOS"!==e)return!0;if((-1===a.indexOf("win")&&-1===a.indexOf("linux")&&-1===a.indexOf("mac"))!=("Other"===e))return!0}return 0<=n.indexOf("win")&&"Windows"!==e&&"Windows Phone"!==e||((0<=n.indexOf("linux")||0<=n.indexOf("android")||0<=n.indexOf("pike"))&&"Linux"!==e&&"Android"!==e||((0<=n.indexOf("mac")||0<=n.indexOf("ipad")||0<=n.indexOf("ipod")||0<=n.indexOf("iphone"))&&"Mac"!==e&&"iOS"!==e||((n.indexOf("win")<0&&n.indexOf("linux")<0&&n.indexOf("mac")<0&&n.indexOf("iphone")<0&&n.indexOf("ipad")<0)!==("Other"===e)||void 0===navigator.plugins&&"Windows"!==e&&"Windows Phone"!==e)))},L=function(){var e,t=navigator.userAgent.toLowerCase(),a=navigator.productSub;if(("Chrome"===(e=0<=t.indexOf("firefox")?"Firefox":0<=t.indexOf("opera")||0<=t.indexOf("opr")?"Opera":0<=t.indexOf("chrome")?"Chrome":0<=t.indexOf("safari")?"Safari":0<=t.indexOf("trident")?"Internet Explorer":"Other")||"Safari"===e||"Opera"===e)&&"20030107"!==a)return!0;var n,r=eval.toString().length;if(37===r&&"Safari"!==e&&"Firefox"!==e&&"Other"!==e)return!0;if(39===r&&"Internet Explorer"!==e&&"Other"!==e)return!0;if(33===r&&"Chrome"!==e&&"Opera"!==e&&"Other"!==e)return!0;try{throw"a"}catch(e){try{e.toSource(),n=!0}catch(e){n=!1}}return n&&"Firefox"!==e&&"Other"!==e},I=function(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))},k=function(){if(!I())return!1;var e=F();return!!window.WebGLRenderingContext&&!!e},R=function(){return"Microsoft Internet Explorer"===navigator.appName||!("Netscape"!==navigator.appName||!/Trident/.test(navigator.userAgent))},D=function(){return void 0!==window.swfobject},N=function(){return window.swfobject.hasFlashPlayerVersion("9.0.0")},_=function(t,e){var a="___fp_swf_loaded";window[a]=function(e){t(e)};var n,r,i=e.fonts.swfContainerId;(r=document.createElement("div")).setAttribute("id",n.fonts.swfContainerId),document.body.appendChild(r);var o={onReady:a};window.swfobject.embedSWF(e.fonts.swfPath,i,"1","1","9.0.0",!1,o,{allowScriptAccess:"always",menu:"false"},{})},F=function(){var e=document.createElement("canvas"),t=null;try{t=e.getContext("webgl")||e.getContext("experimental-webgl")}catch(e){}return t||(t=null),t},G=[{key:"userAgent",getData:function(e){e(navigator.userAgent)}},{key:"webdriver",getData:function(e,t){e(null==navigator.webdriver?t.NOT_AVAILABLE:navigator.webdriver)}},{key:"language",getData:function(e,t){e(navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||t.NOT_AVAILABLE)}},{key:"colorDepth",getData:function(e,t){e(window.screen.colorDepth||t.NOT_AVAILABLE)}},{key:"deviceMemory",getData:function(e,t){e(navigator.deviceMemory||t.NOT_AVAILABLE)}},{key:"pixelRatio",getData:function(e,t){e(window.devicePixelRatio||t.NOT_AVAILABLE)}},{key:"hardwareConcurrency",getData:function(e,t){e(S(t))}},{key:"screenResolution",getData:function(e,t){e(n(t))}},{key:"availableScreenResolution",getData:function(e,t){e(r(t))}},{key:"timezoneOffset",getData:function(e){e((new Date).getTimezoneOffset())}},{key:"timezone",getData:function(e,t){window.Intl&&window.Intl.DateTimeFormat?e((new window.Intl.DateTimeFormat).resolvedOptions().timeZone):e(t.NOT_AVAILABLE)}},{key:"sessionStorage",getData:function(e,t){e(p(t))}},{key:"localStorage",getData:function(e,t){e(v(t))}},{key:"indexedDb",getData:function(e,t){e(A(t))}},{key:"addBehavior",getData:function(e){e(!(!document.body||!document.body.addBehavior))}},{key:"openDatabase",getData:function(e){e(!!window.openDatabase)}},{key:"cpuClass",getData:function(e,t){e(C(t))}},{key:"platform",getData:function(e,t){e(B(t))}},{key:"doNotTrack",getData:function(e,t){e(w(t))}},{key:"plugins",getData:function(e,t){R()?t.plugins.excludeIE?e(t.EXCLUDED):e(o(t)):e(i(t))}},{key:"canvas",getData:function(e,t){I()?e(y(t)):e(t.NOT_AVAILABLE)}},{key:"webgl",getData:function(e,t){k()?e(E()):e(t.NOT_AVAILABLE)}},{key:"webglVendorAndRenderer",getData:function(e){k()?e(M()):e()}},{key:"adBlock",getData:function(e){e(x())}},{key:"hasLiedLanguages",getData:function(e){e(O())}},{key:"hasLiedResolution",getData:function(e){e(b())}},{key:"hasLiedOs",getData:function(e){e(P())}},{key:"hasLiedBrowser",getData:function(e){e(L())}},{key:"touchSupport",getData:function(e){e(t())}},{key:"fonts",getData:function(e,t){var u=["monospace","sans-serif","serif"],d=["Andale Mono","Arial","Arial Black","Arial Hebrew","Arial MT","Arial Narrow","Arial Rounded MT Bold","Arial Unicode MS","Bitstream Vera Sans Mono","Book Antiqua","Bookman Old Style","Calibri","Cambria","Cambria Math","Century","Century Gothic","Century Schoolbook","Comic Sans","Comic Sans MS","Consolas","Courier","Courier New","Geneva","Georgia","Helvetica","Helvetica Neue","Impact","Lucida Bright","Lucida Calligraphy","Lucida Console","Lucida Fax","LUCIDA GRANDE","Lucida Handwriting","Lucida Sans","Lucida Sans Typewriter","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Monotype Corsiva","MS Gothic","MS Outlook","MS PGothic","MS Reference Sans Serif","MS Sans Serif","MS Serif","MYRIAD","MYRIAD PRO","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Times New Roman PS","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3"];t.fonts.extendedJsFonts&&(d=d.concat(["Abadi MT Condensed Light","Academy Engraved LET","ADOBE CASLON PRO","Adobe Garamond","ADOBE GARAMOND PRO","Agency FB","Aharoni","Albertus Extra Bold","Albertus Medium","Algerian","Amazone BT","American Typewriter","American Typewriter Condensed","AmerType Md BT","Andalus","Angsana New","AngsanaUPC","Antique Olive","Aparajita","Apple Chancery","Apple Color Emoji","Apple SD Gothic Neo","Arabic Typesetting","ARCHER","ARNO PRO","Arrus BT","Aurora Cn BT","AvantGarde Bk BT","AvantGarde Md BT","AVENIR","Ayuthaya","Bandy","Bangla Sangam MN","Bank Gothic","BankGothic Md BT","Baskerville","Baskerville Old Face","Batang","BatangChe","Bauer Bodoni","Bauhaus 93","Bazooka","Bell MT","Bembo","Benguiat Bk BT","Berlin Sans FB","Berlin Sans FB Demi","Bernard MT Condensed","BernhardFashion BT","BernhardMod BT","Big Caslon","BinnerD","Blackadder ITC","BlairMdITC TT","Bodoni 72","Bodoni 72 Oldstyle","Bodoni 72 Smallcaps","Bodoni MT","Bodoni MT Black","Bodoni MT Condensed","Bodoni MT Poster Compressed","Bookshelf Symbol 7","Boulder","Bradley Hand","Bradley Hand ITC","Bremen Bd BT","Britannic Bold","Broadway","Browallia New","BrowalliaUPC","Brush Script MT","Californian FB","Calisto MT","Calligrapher","Candara","CaslonOpnface BT","Castellar","Centaur","Cezanne","CG Omega","CG Times","Chalkboard","Chalkboard SE","Chalkduster","Charlesworth","Charter Bd BT","Charter BT","Chaucer","ChelthmITC Bk BT","Chiller","Clarendon","Clarendon Condensed","CloisterBlack BT","Cochin","Colonna MT","Constantia","Cooper Black","Copperplate","Copperplate Gothic","Copperplate Gothic Bold","Copperplate Gothic Light","CopperplGoth Bd BT","Corbel","Cordia New","CordiaUPC","Cornerstone","Coronet","Cuckoo","Curlz MT","DaunPenh","Dauphin","David","DB LCD Temp","DELICIOUS","Denmark","DFKai-SB","Didot","DilleniaUPC","DIN","DokChampa","Dotum","DotumChe","Ebrima","Edwardian Script ITC","Elephant","English 111 Vivace BT","Engravers MT","EngraversGothic BT","Eras Bold ITC","Eras Demi ITC","Eras Light ITC","Eras Medium ITC","EucrosiaUPC","Euphemia","Euphemia UCAS","EUROSTILE","Exotc350 Bd BT","FangSong","Felix Titling","Fixedsys","FONTIN","Footlight MT Light","Forte","FrankRuehl","Fransiscan","Freefrm721 Blk BT","FreesiaUPC","Freestyle Script","French Script MT","FrnkGothITC Bk BT","Fruitger","FRUTIGER","Futura","Futura Bk BT","Futura Lt BT","Futura Md BT","Futura ZBlk BT","FuturaBlack BT","Gabriola","Galliard BT","Gautami","Geeza Pro","Geometr231 BT","Geometr231 Hv BT","Geometr231 Lt BT","GeoSlab 703 Lt BT","GeoSlab 703 XBd BT","Gigi","Gill Sans","Gill Sans MT","Gill Sans MT Condensed","Gill Sans MT Ext Condensed Bold","Gill Sans Ultra Bold","Gill Sans Ultra Bold Condensed","Gisha","Gloucester MT Extra Condensed","GOTHAM","GOTHAM BOLD","Goudy Old Style","Goudy Stout","GoudyHandtooled BT","GoudyOLSt BT","Gujarati Sangam MN","Gulim","GulimChe","Gungsuh","GungsuhChe","Gurmukhi MN","Haettenschweiler","Harlow Solid Italic","Harrington","Heather","Heiti SC","Heiti TC","HELV","Herald","High Tower Text","Hiragino Kaku Gothic ProN","Hiragino Mincho ProN","Hoefler Text","Humanst 521 Cn BT","Humanst521 BT","Humanst521 Lt BT","Imprint MT Shadow","Incised901 Bd BT","Incised901 BT","Incised901 Lt BT","INCONSOLATA","Informal Roman","Informal011 BT","INTERSTATE","IrisUPC","Iskoola Pota","JasmineUPC","Jazz LET","Jenson","Jester","Jokerman","Juice ITC","Kabel Bk BT","Kabel Ult BT","Kailasa","KaiTi","Kalinga","Kannada Sangam MN","Kartika","Kaufmann Bd BT","Kaufmann BT","Khmer UI","KodchiangUPC","Kokila","Korinna BT","Kristen ITC","Krungthep","Kunstler Script","Lao UI","Latha","Leelawadee","Letter Gothic","Levenim MT","LilyUPC","Lithograph","Lithograph Light","Long Island","Lydian BT","Magneto","Maiandra GD","Malayalam Sangam MN","Malgun Gothic","Mangal","Marigold","Marion","Marker Felt","Market","Marlett","Matisse ITC","Matura MT Script Capitals","Meiryo","Meiryo UI","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Uighur","Microsoft YaHei","Microsoft Yi Baiti","MingLiU","MingLiU_HKSCS","MingLiU_HKSCS-ExtB","MingLiU-ExtB","Minion","Minion Pro","Miriam","Miriam Fixed","Mistral","Modern","Modern No. 20","Mona Lisa Solid ITC TT","Mongolian Baiti","MONO","MoolBoran","Mrs Eaves","MS LineDraw","MS Mincho","MS PMincho","MS Reference Specialty","MS UI Gothic","MT Extra","MUSEO","MV Boli","Nadeem","Narkisim","NEVIS","News Gothic","News GothicMT","NewsGoth BT","Niagara Engraved","Niagara Solid","Noteworthy","NSimSun","Nyala","OCR A Extended","Old Century","Old English Text MT","Onyx","Onyx BT","OPTIMA","Oriya Sangam MN","OSAKA","OzHandicraft BT","Palace Script MT","Papyrus","Parchment","Party LET","Pegasus","Perpetua","Perpetua Titling MT","PetitaBold","Pickwick","Plantagenet Cherokee","Playbill","PMingLiU","PMingLiU-ExtB","Poor Richard","Poster","PosterBodoni BT","PRINCETOWN LET","Pristina","PTBarnum BT","Pythagoras","Raavi","Rage Italic","Ravie","Ribbon131 Bd BT","Rockwell","Rockwell Condensed","Rockwell Extra Bold","Rod","Roman","Sakkal Majalla","Santa Fe LET","Savoye LET","Sceptre","Script","Script MT Bold","SCRIPTINA","Serifa","Serifa BT","Serifa Th BT","ShelleyVolante BT","Sherwood","Shonar Bangla","Showcard Gothic","Shruti","Signboard","SILKSCREEN","SimHei","Simplified Arabic","Simplified Arabic Fixed","SimSun","SimSun-ExtB","Sinhala Sangam MN","Sketch Rockwell","Skia","Small Fonts","Snap ITC","Snell Roundhand","Socket","Souvenir Lt BT","Staccato222 BT","Steamer","Stencil","Storybook","Styllo","Subway","Swis721 BlkEx BT","Swiss911 XCm BT","Sylfaen","Synchro LET","System","Tamil Sangam MN","Technical","Teletype","Telugu Sangam MN","Tempus Sans ITC","Terminal","Thonburi","Traditional Arabic","Trajan","TRAJAN PRO","Tristan","Tubular","Tunga","Tw Cen MT","Tw Cen MT Condensed","Tw Cen MT Condensed Extra Bold","TypoUpright BT","Unicorn","Univers","Univers CE 55 Medium","Univers Condensed","Utsaah","Vagabond","Vani","Vijaya","Viner Hand ITC","VisualUI","Vivaldi","Vladimir Script","Vrinda","Westminster","WHITNEY","Wide Latin","ZapfEllipt BT","ZapfHumnst BT","ZapfHumnst Dm BT","Zapfino","Zurich BlkEx BT","Zurich Ex BT","ZWAdobeF"]));d=(d=d.concat(t.fonts.userDefinedFonts)).filter(function(e,t){return d.indexOf(e)===t});var a=document.getElementsByTagName("body")[0],r=document.createElement("div"),g=document.createElement("div"),n={},i={},f=function(){var e=document.createElement("span");return e.style.position="absolute",e.style.left="-9999px",e.style.fontSize="72px",e.style.fontStyle="normal",e.style.fontWeight="normal",e.style.letterSpacing="normal",e.style.lineBreak="auto",e.style.lineHeight="normal",e.style.textTransform="none",e.style.textAlign="left",e.style.textDecoration="none",e.style.textShadow="none",e.style.whiteSpace="normal",e.style.wordBreak="normal",e.style.wordSpacing="normal",e.innerHTML="mmmmmmmmmmlli",e},o=function(e){for(var t=!1,a=0;a<u.length;a++)if(t=e[a].offsetWidth!==n[u[a]]||e[a].offsetHeight!==i[u[a]])return t;return t},l=function(){for(var e=[],t=0,a=u.length;t<a;t++){var n=f();n.style.fontFamily=u[t],r.appendChild(n),e.push(n)}return e}();a.appendChild(r);for(var s=0,c=u.length;s<c;s++)n[u[s]]=l[s].offsetWidth,i[u[s]]=l[s].offsetHeight;var h=function(){for(var e,t,a,n={},r=0,i=d.length;r<i;r++){for(var o=[],l=0,s=u.length;l<s;l++){var c=(e=d[r],t=u[l],a=void 0,(a=f()).style.fontFamily="'"+e+"',"+t,a);g.appendChild(c),o.push(c)}n[d[r]]=o}return n}();a.appendChild(g);for(var m=[],T=0,p=d.length;T<p;T++)o(h[d[T]])&&m.push(d[T]);a.removeChild(g),a.removeChild(r),e(m)},pauseBefore:!0},{key:"fontsFlash",getData:function(t,e){return D()?N()?e.fonts.swfPath?void _(function(e){t(e)},e):t("missing options.fonts.swfPath"):t("flash not installed"):t("swf object not loaded")},pauseBefore:!0},{key:"audio",getData:function(a,e){var t=e.audio;if(t.excludeIOS11&&navigator.userAgent.match(/OS 11.+Version\/11.+Safari/))return a(e.EXCLUDED);var n=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(null==n)return a(e.NOT_AVAILABLE);var r=new n(1,44100,44100),i=r.createOscillator();i.type="triangle",i.frequency.setValueAtTime(1e4,r.currentTime);var o=r.createDynamicsCompressor();c([["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]],function(e){void 0!==o[e[0]]&&"function"==typeof o[e[0]].setValueAtTime&&o[e[0]].setValueAtTime(e[1],r.currentTime)}),i.connect(o),o.connect(r.destination),i.start(0),r.startRendering();var l=setTimeout(function(){return console.warn('Audio fingerprint timed out. Please report bug at https://github.com/Valve/fingerprintjs2 with your user agent: "'+navigator.userAgent+'".'),r.oncomplete=function(){},r=null,a("audioTimeout")},t.timeout);r.oncomplete=function(e){var t;try{clearTimeout(l),t=e.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(function(e,t){return e+Math.abs(t)},0).toString(),i.disconnect(),o.disconnect()}catch(e){return void a(e)}a(t)}}},{key:"enumerateDevices",getData:function(t,e){if(!a())return t(e.NOT_AVAILABLE);navigator.mediaDevices.enumerateDevices().then(function(e){t(e.map(function(e){return"id="+e.deviceId+";gid="+e.groupId+";"+e.kind+";"+e.label}))}).catch(function(e){t(e)})}}],U=function(e){throw new Error("'new Fingerprint()' is deprecated, see https://github.com/Valve/fingerprintjs2#upgrade-guide-from-182-to-200")};return U.get=function(a,n){n?a||(a={}):(n=a,a={}),function(e,t){if(null==t)return;var a,n;for(n in t)null==(a=t[n])||Object.prototype.hasOwnProperty.call(e,n)||(e[n]=a)}(a,e),a.components=a.extraComponents.concat(G);var r={data:[],addPreprocessedComponent:function(e,t){"function"==typeof a.preprocessor&&(t=a.preprocessor(e,t)),r.data.push({key:e,value:t})}},i=-1,o=function(e){if((i+=1)>=a.components.length)n(r.data);else{var t=a.components[i];if(a.excludes[t.key])o(!1);else{if(!e&&t.pauseBefore)return i-=1,void setTimeout(function(){o(!0)},1);try{t.getData(function(e){r.addPreprocessedComponent(t.key,e),o(!1)},a)}catch(e){r.addPreprocessedComponent(t.key,String(e)),o(!1)}}}};o(!1)},U.getPromise=function(a){return new Promise(function(e,t){U.get(a,e)})},U.getV18=function(i,o){return null==o&&(o=i,i={}),U.get(i,function(e){for(var t=[],a=0;a<e.length;a++){var n=e[a];if(n.value===(i.NOT_AVAILABLE||"not available"))t.push({key:n.key,value:"unknown"});else if("plugins"===n.key)t.push({key:"plugins",value:s(n.value,function(e){var t=s(e[2],function(e){return e.join?e.join("~"):e}).join(",");return[e[0],e[1],t].join("::")})});else if(-1!==["canvas","webgl"].indexOf(n.key))t.push({key:n.key,value:n.value.join("~")});else if(-1!==["sessionStorage","localStorage","indexedDb","addBehavior","openDatabase"].indexOf(n.key)){if(!n.value)continue;t.push({key:n.key,value:1})}else n.value?t.push(n.value.join?{key:n.key,value:n.value.join(";")}:n):t.push({key:n.key,value:n.value})}var r=l(s(t,function(e){return e.value}).join("~~~"),31);o(r,t)})},U.x64hash128=l,U.VERSION="2.1.0",U});
 
wp-slimstat.min.js CHANGED
@@ -1 +1 @@
1
- var SlimStat={_base64_key_str:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-",_utf8_encode:function(t){var e,a,r="";for(t=t.replace(/\r\n/g,"\n"),e=0;e<t.length;e++)(a=t.charCodeAt(e))<128?r+=String.fromCharCode(a):(127<a&&a<2048?r+=String.fromCharCode(a>>6|192):(r+=String.fromCharCode(a>>12|224),r+=String.fromCharCode(a>>6&63|128)),r+=String.fromCharCode(63&a|128));return r},_base64_encode:function(t){var e,a,r,n,o,i,m,s="",d=0;for(t=SlimStat._utf8_encode(t);d<t.length;)n=(e=t.charCodeAt(d++))>>2,o=(3&e)<<4|(a=t.charCodeAt(d++))>>4,i=(15&a)<<2|(r=t.charCodeAt(d++))>>6,m=63&r,isNaN(a)?i=m=64:isNaN(r)&&(m=64),s=s+SlimStat._base64_key_str.charAt(n)+SlimStat._base64_key_str.charAt(o)+SlimStat._base64_key_str.charAt(i)+SlimStat._base64_key_str.charAt(m);return s},get_page_performance:function(){return slim_performance=window.performance||window.mozPerformance||window.msPerformance||window.webkitPerformance||{},void 0===slim_performance.timing?0:slim_performance.timing.loadEventEnd-slim_performance.timing.responseEnd},get_server_latency:function(){return slim_performance=window.performance||window.mozPerformance||window.msPerformance||window.webkitPerformance||{},void 0===slim_performance.timing?0:slim_performance.timing.responseEnd-slim_performance.timing.connectEnd},optout:function(t,e){t.preventDefault(),"string"==typeof SlimStatParams.baseurl&&0!=SlimStatParams.baseurl.length||(SlimStatParams.baseurl="/"),expiration=new Date,expiration.setTime(expiration.getTime()+31536e6),document.cookie="slimstat_optout_tracking="+e+";path="+SlimStatParams.baseurl+";expires="+expiration.toGMTString(),t.target.parentNode.parentNode.removeChild(t.target.parentNode)},show_optout_message:function(){opt_out_cookies=SlimStat.empty(SlimStatParams.oc)?[]:SlimStatParams.oc.split(","),Array.isArray(opt_out_cookies)||(opt_out_cookies=[]),show_optout=0<opt_out_cookies.length;for(var t=0;t<opt_out_cookies.length;t++)""!=SlimStat.get_cookie(opt_out_cookies[t])&&(show_optout=!1);if(show_optout){try{xhr=new XMLHttpRequest}catch(t){return!1}if("object"==typeof xhr)return xhr.open("POST",SlimStatParams.ajaxurl,!0),xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.withCredentials=!0,xhr.send("action=slimstat_optout_html"),xhr.onreadystatechange=function(){4==xhr.readyState&&document.body.insertAdjacentHTML("beforeend",xhr.responseText)},!0}},add_event:function(t,e,a){t&&t.addEventListener?t.addEventListener(e,a,!1):t&&t.attachEvent?(t["e"+e+a]=a,t[e+a]=function(){t["e"+e+a](window.event)},t.attachEvent("on"+e,t[e+a])):t["on"+e]=t["e"+e+a]},in_array:function(t,e){for(var a=0;a<e.length;a++)if(-1!=t.indexOf(e[a].trim()))return!0;return!1},empty:function(t){return void 0===t||null==t||("number"==typeof t?0==t:"boolean"==typeof t?!t:"string"!=typeof t&&"object"!=typeof t||0==t.length)},get_cookie:function(t){var e=("; "+document.cookie).split("; "+t+"=");return 2==e.length?e.pop().split(";").shift():""},send_to_server:function(t,e){if(SlimStat.empty(SlimStatParams.ajaxurl)||SlimStat.empty(t))return!1;if(void 0===e&&(e=!0),slimstat_data_with_client_info=t+"&sw="+screen.width+"&sh="+screen.height+"&bw="+window.innerWidth+"&bh="+window.innerHeight+"&sl="+SlimStat.get_server_latency()+"&pp="+SlimStat.get_page_performance(),e&&navigator.sendBeacon)navigator.sendBeacon(SlimStatParams.ajaxurl,slimstat_data_with_client_info);else{try{xhr=new XMLHttpRequest}catch(t){return!1}if("object"==typeof xhr)return xhr.open("POST",SlimStatParams.ajaxurl,!0),xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.withCredentials=!0,xhr.send(slimstat_data_with_client_info),xhr.onreadystatechange=function(){4==xhr.readyState&&(parsed_id=parseInt(xhr.responseText),!isNaN(parsed_id)&&0<parsed_id&&(SlimStatParams.id=xhr.responseText))},!0}return!1},ss_track:function(t,e){if(SlimStat.empty(SlimStatParams.id)||isNaN(parseInt(SlimStatParams.id))||parseInt(SlimStatParams.id)<=0)return!1;if(note_array=[],SlimStat.empty(t)||note_array.push(t),void 0===e&&(e=!0),SlimStat.empty(window.event))return!1;if(SlimStat.empty(window.event.target)){if(SlimStat.empty(window.event.srcElement))return!1;target_node=window.event.srcElement}else target_node=window.event.target;if(resource_url="",do_not_track=SlimStat.empty(SlimStatParams.dnt)?[]:SlimStatParams.dnt.split(","),!SlimStat.empty(target_node.nodeName)){switch(target_node.nodeName){case"INPUT":case"BUTTON":for(;!SlimStat.empty(target_node)&&!SlimStat.empty(target_node.nodeName)&&"form"!=target_node.nodeName.toLowerCase();)target_node=target_node.parentNode;SlimStat.empty(target_node)||SlimStat.empty(target_node.nodeName)||SlimStat.empty(target_node.action)||(resource_url=target_node.action);break;default:for(;!SlimStat.empty(target_node)&&!SlimStat.empty(target_node.nodeName)&&"a"!=target_node.nodeName.toLowerCase();)target_node=target_node.parentNode;if(!SlimStat.empty(target_node)){if(SlimStat.empty(target_node.hash)||target_node.hostname!=location.hostname){if(!SlimStat.empty(target_node.href)&&-1==target_node.href.indexOf("javascript:")){if(SlimStat.in_array(target_node.href,do_not_track))return!1;resource_url=target_node.href}}else resource_url=target_node.hash;"function"==typeof target_node.getAttribute&&(SlimStat.empty(target_node.getAttribute("title"))||note_array.push("Title:"+target_node.getAttribute("title")),SlimStat.empty(target_node.getAttribute("id"))||note_array.push("ID:"+target_node.getAttribute("id")))}}if(!SlimStat.empty(do_not_track.length)&&!SlimStat.empty(target_node)&&(target_classes=SlimStat.empty(target_node.className)?[]:target_node.className.split(" "),0!=target_classes.filter(function(t){return-1!==do_not_track.indexOf(t)}).length||!SlimStat.empty(target_node.attributes)&&!SlimStat.empty(target_node.attributes.rel)&&!SlimStat.empty(target_node.attributes.rel.value)&&SlimStat.in_array(target_node.attributes.rel.value,do_not_track)))return!1}return position="0,0",SlimStat.empty(window.event.pageX)||SlimStat.empty(window.event.pageY)?SlimStat.empty(window.event.clientX)||SlimStat.empty(document.body.scrollLeft)||SlimStat.empty(document.documentElement.scrollLeft)||(position=window.event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft+","+window.event.clientY+document.body.scrollTop+document.documentElement.scrollTop):position=window.event.pageX+","+window.event.pageY,SlimStat.empty(window.event.type)||(note_array.push("type:"+window.event.type),"keypress"==window.event.type?note_array.push("keypress:"+String.fromCharCode(parseInt(window.event.which))):"click"==window.event.type&&note_array.push("which:"+window.event.which)),SlimStat.send_to_server("action=slimtrack&id="+SlimStatParams.id+"&ref="+SlimStat._base64_encode(document.referrer)+"&res="+SlimStat._base64_encode(resource_url)+"&pos="+position+"&no="+SlimStat._base64_encode(note_array.join(", ")),e),!0}};"function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),SlimStat.add_event(window,"load",function(){slimstat_data="",use_beacon=!0,SlimStat.empty(SlimStatParams.id)?(slimstat_data="action=slimtrack&ref="+SlimStat._base64_encode(document.referrer)+"&res="+SlimStat._base64_encode(window.location.href),SlimStat.empty(SlimStatParams.ci)||(slimstat_data+="&ci="+SlimStatParams.ci),use_beacon=!1):0<parseInt(SlimStatParams.id)&&(slimstat_data="action=slimtrack&id="+SlimStatParams.id),0<slimstat_data.length&&setTimeout(function(){SlimStat.send_to_server(slimstat_data,use_beacon)},50),all_links=document.getElementsByTagName("a");for(var t=0;t<all_links.length;t++)SlimStat.add_event(all_links[t],"click",function(t){SlimStat.ss_track()});SlimStat.show_optout_message()});
1
+ var SlimStat={base64_key_str:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-",fingerprint_hash:"",utf8_encode:function(e){var t,a,n="";for(e=e.replace(/\r\n/g,"\n"),t=0;t<e.length;t++)(a=e.charCodeAt(t))<128?n+=String.fromCharCode(a):(127<a&&a<2048?n+=String.fromCharCode(a>>6|192):(n+=String.fromCharCode(a>>12|224),n+=String.fromCharCode(a>>6&63|128)),n+=String.fromCharCode(63&a|128));return n},base64_encode:function(e){var t,a,n,r,i,o,s,l="",d=0;for(e=SlimStat.utf8_encode(e);d<e.length;)r=(t=e.charCodeAt(d++))>>2,i=(3&t)<<4|(a=e.charCodeAt(d++))>>4,o=(15&a)<<2|(n=e.charCodeAt(d++))>>6,s=63&n,isNaN(a)?o=s=64:isNaN(n)&&(s=64),l=l+SlimStat.base64_key_str.charAt(r)+SlimStat.base64_key_str.charAt(i)+SlimStat.base64_key_str.charAt(o)+SlimStat.base64_key_str.charAt(s);return l},get_page_performance:function(){return slim_performance=window.performance||window.mozPerformance||window.msPerformance||window.webkitPerformance||{},void 0===slim_performance.timing?0:slim_performance.timing.loadEventEnd-slim_performance.timing.responseEnd},get_server_latency:function(){return slim_performance=window.performance||window.mozPerformance||window.msPerformance||window.webkitPerformance||{},void 0===slim_performance.timing?0:slim_performance.timing.responseEnd-slim_performance.timing.connectEnd},optout:function(e,t){e.preventDefault(),"string"==typeof SlimStatParams.baseurl&&0!=SlimStatParams.baseurl.length||(SlimStatParams.baseurl="/"),expiration=new Date,expiration.setTime(expiration.getTime()+31536e6),document.cookie="slimstat_optout_tracking="+t+";path="+SlimStatParams.baseurl+";expires="+expiration.toGMTString(),e.target.parentNode.parentNode.removeChild(e.target.parentNode)},show_optout_message:function(){opt_out_cookies=SlimStat.empty(SlimStatParams.oc)?[]:SlimStatParams.oc.split(","),Array.isArray(opt_out_cookies)||(opt_out_cookies=[]),show_optout=0<opt_out_cookies.length;for(var e=0;e<opt_out_cookies.length;e++)""!=SlimStat.get_cookie(opt_out_cookies[e])&&(show_optout=!1);if(show_optout){try{xhr=new XMLHttpRequest}catch(e){return!1}if("object"==typeof xhr)return xhr.open("POST",SlimStatParams.ajaxurl,!0),xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.withCredentials=!0,xhr.send("action=slimstat_optout_html"),xhr.onreadystatechange=function(){4==xhr.readyState&&document.body.insertAdjacentHTML("beforeend",xhr.responseText)},!0}},add_event:function(e,t,a){e&&e.addEventListener?e.addEventListener(t,a,!1):e&&e.attachEvent?(e["e"+t+a]=a,e[t+a]=function(){e["e"+t+a](window.event)},e.attachEvent("on"+t,e[t+a])):e["on"+t]=e["e"+t+a]},in_array:function(e,t){for(var a=0;a<t.length;a++)if(-1!=e.indexOf(t[a].trim()))return!0;return!1},empty:function(e){return void 0===e||null==e||("number"==typeof e?0==e:"boolean"==typeof e?!e:"string"!=typeof e&&"object"!=typeof e||0==e.length)},get_cookie:function(e){var t=("; "+document.cookie).split("; "+e+"=");return 2==t.length?t.pop().split(";").shift():""},send_to_server:function(e,t){if(SlimStat.empty(SlimStatParams.ajaxurl)||SlimStat.empty(e))return!1;if(void 0===t&&(t=!0),t&&navigator.sendBeacon)navigator.sendBeacon(SlimStatParams.ajaxurl,e);else{try{xhr=new XMLHttpRequest}catch(e){return!1}if("object"==typeof xhr)return xhr.open("POST",SlimStatParams.ajaxurl,!0),xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"),xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),xhr.withCredentials=!0,xhr.send(e),xhr.onreadystatechange=function(){4==xhr.readyState&&(parsed_id=parseInt(xhr.responseText),!isNaN(parsed_id)&&0<parsed_id&&(SlimStatParams.id=xhr.responseText))},!0}return!1},ss_track:function(e,t){if(SlimStat.empty(SlimStatParams.id)||isNaN(parseInt(SlimStatParams.id))||parseInt(SlimStatParams.id)<=0)return!1;if(note_array=[],SlimStat.empty(e)||note_array.push(e),void 0===t&&(t=!0),SlimStat.empty(window.event))return!1;if(SlimStat.empty(window.event.target)){if(SlimStat.empty(window.event.srcElement))return!1;target_node=window.event.srcElement}else target_node=window.event.target;var a="",n="";if(SlimStat.empty(window.event.type)||"focus"==window.event.type)return!1;switch(note_array.push("Type:"+window.event.type),"keypress"==window.event.type?note_array.push("Keypress:"+String.fromCharCode(parseInt(window.event.which))):"click"==window.event.type&&note_array.push("Button:"+(1==window.event.which?"left":2==window.event.which?"middle":"right")),target_node.nodeName.toLowerCase()){case"input":case"button":for(;!SlimStat.empty(target_node)&&!SlimStat.empty(target_node.nodeName)&&"form"!=target_node.nodeName.toLowerCase();)target_node=target_node.parentNode;SlimStat.empty(target_node)||SlimStat.empty(target_node.action)||(a=target_node.action);break;default:if(SlimStat.empty(target_node.href)||"string"!=typeof target_node.href){for(parent_node=target_node.parentNode;!SlimStat.empty(parent_node)&&!SlimStat.empty(parent_node.nodeName)&&SlimStat.empty(parent_node.href);)parent_node=parent_node.parentNode;SlimStat.empty(parent_node)||(SlimStat.empty(parent_node.hash)||parent_node.hostname!=location.hostname?SlimStat.empty(parent_node.href)||(a=parent_node.href):a=parent_node.hash,"function"==typeof parent_node.getAttribute&&(SlimStat.empty(parent_node.getAttribute("title"))||note_array.push("Parent Title:"+parent_node.getAttribute("title")),SlimStat.empty(parent_node.getAttribute("id"))||note_array.push("Parent ID:"+parent_node.getAttribute("id"))))}else a=SlimStat.empty(target_node.hash)?target_node.href:target_node.hash;"function"==typeof target_node.getAttribute&&(SlimStat.empty(target_node.getAttribute("title"))||note_array.push("Title:"+target_node.getAttribute("title")),SlimStat.empty(target_node.getAttribute("id"))||note_array.push("ID:"+target_node.getAttribute("id")))}if(do_not_track=SlimStat.empty(SlimStatParams.dnt)?[]:SlimStatParams.dnt.split(","),!SlimStat.empty(a)){if(!SlimStat.empty(do_not_track)&&SlimStat.in_array(a,do_not_track))return!1;n="&fh="+SlimStat.fingerprint_hash}return target_classes=SlimStat.empty(target_node.className)||"string"!=typeof target_node.className?[]:target_node.className.split(" "),!!(SlimStat.empty(do_not_track)||SlimStat.empty(target_classes)||0==target_classes.filter(function(e){return-1!==do_not_track.indexOf(e)}).length&&(SlimStat.empty(target_node.attributes)||SlimStat.empty(target_node.attributes.rel)||SlimStat.empty(target_node.attributes.rel.value)||!SlimStat.in_array(target_node.attributes.rel.value,do_not_track)))&&(position="0,0",SlimStat.empty(window.event.pageX)||SlimStat.empty(window.event.pageY)?SlimStat.empty(window.event.clientX)||SlimStat.empty(document.body.scrollLeft)||SlimStat.empty(document.documentElement.scrollLeft)||(position=window.event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft+","+window.event.clientY+document.body.scrollTop+document.documentElement.scrollTop):position=window.event.pageX+","+window.event.pageY,SlimStat.send_to_server("action=slimtrack&id="+SlimStatParams.id+"&res="+SlimStat.base64_encode(a)+"&pos="+position+"&no="+SlimStat.base64_encode(note_array.join(","))+n,t),!0)},get_slimstat_data:function(e){return screenres=SlimStat.get_component_value(e,"screenResolution",[0,0]),"&sw="+screenres[0]+"&sh="+screenres[1]+"&bw="+window.innerWidth+"&bh="+window.innerHeight+"&sl="+SlimStat.get_server_latency()+"&pp="+SlimStat.get_page_performance()+"&fh="+SlimStat.fingerprint_hash+"&tz="+SlimStat.get_component_value(e,"timezoneOffset",0)},get_component_value:function(e,t,a){for(x=0;x<e.length;x++)if(e[x].key===t)return e[x].value;return a},init_fingerprint_hash:function(e){values=e.map(function(e){return e.value}),SlimStat.fingerprint_hash=Fingerprint2.x64hash128(values.join(""),31)}};"function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),SlimStat.add_event(window,"load",function(){if(slimstat_data="",use_beacon=!0,!SlimStat.empty(SlimStatParams.id)&&0<parseInt(SlimStatParams.id)?slimstat_data="action=slimtrack&id="+SlimStatParams.id:(slimstat_data="action=slimtrack&ref="+SlimStat.base64_encode(document.referrer)+"&res="+SlimStat.base64_encode(window.location.href),SlimStat.empty(SlimStatParams.ci)||(slimstat_data+="&ci="+SlimStatParams.ci),use_beacon=!1),0<slimstat_data.length){window.requestIdleCallback?requestIdleCallback(function(){Fingerprint2.get(function(e){SlimStat.init_fingerprint_hash(e),SlimStat.send_to_server(slimstat_data+SlimStat.get_slimstat_data(e),use_beacon),SlimStat.show_optout_message()})}):setTimeout(function(){Fingerprint2.get(function(e){SlimStat.init_fingerprint_hash(e),SlimStat.send_to_server(slimstat_data+SlimStat.get_slimstat_data(e),use_beacon),SlimStat.show_optout_message()})},250)}all_clickable=document.querySelectorAll("a,button,input,area");for(var e=0;e<all_clickable.length;e++)SlimStat.add_event(all_clickable[e],"click",function(e){SlimStat.ss_track()})}),SlimStat.add_event(window,"beforeunload",function(){!SlimStat.empty(document.activeElement)&&!SlimStat.empty(document.activeElement.nodeName)&&"body"==document.activeElement.nodeName.toLowerCase()&&!SlimStat.empty(SlimStatParams.id)&&0<parseInt(SlimStatParams.id)&&SlimStat.send_to_server("action=slimtrack&id="+SlimStatParams.id,!0)}),function(e,t,a){"use strict";"undefined"!=typeof window&&"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&module.exports?module.exports=a():t.exports?t.exports=a():t.Fingerprint2=a()}(0,this,function(){"use strict";function u(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var a=[0,0,0,0];return a[3]+=e[3]+t[3],a[2]+=a[3]>>>16,a[3]&=65535,a[2]+=e[2]+t[2],a[1]+=a[2]>>>16,a[2]&=65535,a[1]+=e[1]+t[1],a[0]+=a[1]>>>16,a[1]&=65535,a[0]+=e[0]+t[0],a[0]&=65535,[a[0]<<16|a[1],a[2]<<16|a[3]]}function m(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var a=[0,0,0,0];return a[3]+=e[3]*t[3],a[2]+=a[3]>>>16,a[3]&=65535,a[2]+=e[2]*t[3],a[1]+=a[2]>>>16,a[2]&=65535,a[2]+=e[3]*t[2],a[1]+=a[2]>>>16,a[2]&=65535,a[1]+=e[1]*t[3],a[0]+=a[1]>>>16,a[1]&=65535,a[1]+=e[2]*t[2],a[0]+=a[1]>>>16,a[1]&=65535,a[1]+=e[3]*t[1],a[0]+=a[1]>>>16,a[1]&=65535,a[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],a[0]&=65535,[a[0]<<16|a[1],a[2]<<16|a[3]]}function g(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function f(e,t){return 0==(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function p(e,t){return[e[0]^t[0],e[1]^t[1]]}function h(e){return e=p(e,[0,e[0]>>>1]),e=m(e,[4283543511,3981806797]),e=p(e,[0,e[0]>>>1]),e=m(e,[3301882366,444984403]),p(e,[0,e[0]>>>1])}function s(e,t){t=t||0;for(var a=(e=e||"").length%16,n=e.length-a,r=[0,t],i=[0,t],o=[0,0],s=[0,0],l=[2277735313,289559509],d=[1291169091,658871167],c=0;c<n;c+=16)o=[255&e.charCodeAt(c+4)|(255&e.charCodeAt(c+5))<<8|(255&e.charCodeAt(c+6))<<16|(255&e.charCodeAt(c+7))<<24,255&e.charCodeAt(c)|(255&e.charCodeAt(c+1))<<8|(255&e.charCodeAt(c+2))<<16|(255&e.charCodeAt(c+3))<<24],s=[255&e.charCodeAt(c+12)|(255&e.charCodeAt(c+13))<<8|(255&e.charCodeAt(c+14))<<16|(255&e.charCodeAt(c+15))<<24,255&e.charCodeAt(c+8)|(255&e.charCodeAt(c+9))<<8|(255&e.charCodeAt(c+10))<<16|(255&e.charCodeAt(c+11))<<24],o=m(o,l),o=g(o,31),o=m(o,d),r=p(r,o),r=g(r,27),r=u(r,i),r=u(m(r,[0,5]),[0,1390208809]),s=m(s,d),s=g(s,33),s=m(s,l),i=p(i,s),i=g(i,31),i=u(i,r),i=u(m(i,[0,5]),[0,944331445]);switch(o=[0,0],s=[0,0],a){case 15:s=p(s,f([0,e.charCodeAt(c+14)],48));case 14:s=p(s,f([0,e.charCodeAt(c+13)],40));case 13:s=p(s,f([0,e.charCodeAt(c+12)],32));case 12:s=p(s,f([0,e.charCodeAt(c+11)],24));case 11:s=p(s,f([0,e.charCodeAt(c+10)],16));case 10:s=p(s,f([0,e.charCodeAt(c+9)],8));case 9:s=p(s,[0,e.charCodeAt(c+8)]),s=m(s,d),s=g(s,33),s=m(s,l),i=p(i,s);case 8:o=p(o,f([0,e.charCodeAt(c+7)],56));case 7:o=p(o,f([0,e.charCodeAt(c+6)],48));case 6:o=p(o,f([0,e.charCodeAt(c+5)],40));case 5:o=p(o,f([0,e.charCodeAt(c+4)],32));case 4:o=p(o,f([0,e.charCodeAt(c+3)],24));case 3:o=p(o,f([0,e.charCodeAt(c+2)],16));case 2:o=p(o,f([0,e.charCodeAt(c+1)],8));case 1:o=p(o,[0,e.charCodeAt(c)]),o=m(o,l),o=g(o,31),o=m(o,d),r=p(r,o)}return r=p(r,[0,e.length]),i=p(i,[0,e.length]),r=u(r,i),i=u(i,r),r=h(r),i=h(i),r=u(r,i),i=u(i,r),("00000000"+(r[0]>>>0).toString(16)).slice(-8)+("00000000"+(r[1]>>>0).toString(16)).slice(-8)+("00000000"+(i[0]>>>0).toString(16)).slice(-8)+("00000000"+(i[1]>>>0).toString(16)).slice(-8)}function d(e,t){if(Array.prototype.forEach&&e.forEach===Array.prototype.forEach)e.forEach(t);else if(e.length===+e.length)for(var a=0,n=e.length;a<n;a++)t(e[a],a,e);else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r,e)}function l(e,n){var r=[];return null==e?r:Array.prototype.map&&e.map===Array.prototype.map?e.map(n):(d(e,function(e,t,a){r.push(n(e,t,a))}),r)}function a(e){if(null==navigator.plugins)return e.NOT_AVAILABLE;for(var t=[],a=0,n=navigator.plugins.length;a<n;a++)navigator.plugins[a]&&t.push(navigator.plugins[a]);return i(e)&&(t=t.sort(function(e,t){return e.name>t.name?1:e.name<t.name?-1:0})),l(t,function(e){var t=l(e,function(e){return[e.type,e.suffixes]});return[e.name,e.description,t]})}function n(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))}function r(){if(!n())return!1;var e=S();return!!window.WebGLRenderingContext&&!!e}function c(e){throw new Error("'new Fingerprint()' is deprecated, see https://github.com/Valve/fingerprintjs2#upgrade-guide-from-182-to-200")}var e={preprocessor:null,audio:{timeout:1e3,excludeIOS11:!0},fonts:{swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf",userDefinedFonts:[],extendedJsFonts:!1},screen:{detectScreenOrientation:!0},plugins:{sortPluginsFor:[/palemoon/i],excludeIE:!1},extraComponents:[],excludes:{enumerateDevices:!0,pixelRatio:!0,doNotTrack:!0,fontsFlash:!0},NOT_AVAILABLE:"not available",ERROR:"error",EXCLUDED:"excluded"},i=function(e){for(var t=!1,a=0,n=e.plugins.sortPluginsFor.length;a<n;a++){var r=e.plugins.sortPluginsFor[a];if(navigator.userAgent.match(r)){t=!0;break}}return t},S=function(){var e=document.createElement("canvas"),t=null;try{t=e.getContext("webgl")||e.getContext("experimental-webgl")}catch(e){}return t=t||null},t=[{key:"userAgent",getData:function(e){e(navigator.userAgent)}},{key:"webdriver",getData:function(e,t){e(null==navigator.webdriver?t.NOT_AVAILABLE:navigator.webdriver)}},{key:"language",getData:function(e,t){e(navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||t.NOT_AVAILABLE)}},{key:"colorDepth",getData:function(e,t){e(window.screen.colorDepth||t.NOT_AVAILABLE)}},{key:"deviceMemory",getData:function(e,t){e(navigator.deviceMemory||t.NOT_AVAILABLE)}},{key:"pixelRatio",getData:function(e,t){e(window.devicePixelRatio||t.NOT_AVAILABLE)}},{key:"hardwareConcurrency",getData:function(e,t){e(function(e){return navigator.hardwareConcurrency?navigator.hardwareConcurrency:e.NOT_AVAILABLE}(t))}},{key:"screenResolution",getData:function(e,t){e(function(e){var t=[window.screen.width,window.screen.height];return e.screen.detectScreenOrientation&&t.sort().reverse(),t}(t))}},{key:"availableScreenResolution",getData:function(e,t){e(function(e){if(window.screen.availWidth&&window.screen.availHeight){var t=[window.screen.availHeight,window.screen.availWidth];return e.screen.detectScreenOrientation&&t.sort().reverse(),t}return e.NOT_AVAILABLE}(t))}},{key:"timezoneOffset",getData:function(e){e((new Date).getTimezoneOffset())}},{key:"timezone",getData:function(e,t){window.Intl&&window.Intl.DateTimeFormat?e((new window.Intl.DateTimeFormat).resolvedOptions().timeZone):e(t.NOT_AVAILABLE)}},{key:"sessionStorage",getData:function(e,t){e(function(t){try{return!!window.sessionStorage}catch(e){return t.ERROR}}(t))}},{key:"localStorage",getData:function(e,t){e(function(t){try{return!!window.localStorage}catch(e){return t.ERROR}}(t))}},{key:"indexedDb",getData:function(e,t){e(function(t){try{return!!window.indexedDB}catch(e){return t.ERROR}}(t))}},{key:"addBehavior",getData:function(e){e(!(!document.body||!document.body.addBehavior))}},{key:"openDatabase",getData:function(e){e(!!window.openDatabase)}},{key:"cpuClass",getData:function(e,t){e(function(e){return navigator.cpuClass||e.NOT_AVAILABLE}(t))}},{key:"platform",getData:function(e,t){e(function(e){return navigator.platform?navigator.platform:e.NOT_AVAILABLE}(t))}},{key:"doNotTrack",getData:function(e,t){e(function(e){return navigator.doNotTrack?navigator.doNotTrack:navigator.msDoNotTrack?navigator.msDoNotTrack:window.doNotTrack?window.doNotTrack:e.NOT_AVAILABLE}(t))}},{key:"plugins",getData:function(e,t){"Microsoft Internet Explorer"===navigator.appName||"Netscape"===navigator.appName&&/Trident/.test(navigator.userAgent)?t.plugins.excludeIE?e(t.EXCLUDED):e(function(t){var e=[];return Object.getOwnPropertyDescriptor&&Object.getOwnPropertyDescriptor(window,"ActiveXObject")||"ActiveXObject"in window?e=l(["AcroPDF.PDF","Adodb.Stream","AgControl.AgControl","DevalVRXCtrl.DevalVRXCtrl.1","MacromediaFlashPaper.MacromediaFlashPaper","Msxml2.DOMDocument","Msxml2.XMLHTTP","PDF.PdfCtrl","QuickTime.QuickTime","QuickTimeCheckObject.QuickTimeCheck.1","RealPlayer","RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)","RealVideo.RealVideo(tm) ActiveX Control (32-bit)","Scripting.Dictionary","SWCtl.SWCtl","Shell.UIHelper","ShockwaveFlash.ShockwaveFlash","Skype.Detection","TDCCtl.TDCCtl","WMPlayer.OCX","rmocx.RealPlayer G2 Control","rmocx.RealPlayer G2 Control.1"],function(e){try{return new window.ActiveXObject(e),e}catch(e){return t.ERROR}}):e.push(t.NOT_AVAILABLE),navigator.plugins&&(e=e.concat(a(t))),e}(t)):e(a(t))}},{key:"canvas",getData:function(e,t){n()?e(function(e){var t=[],a=document.createElement("canvas");a.width=2e3,a.height=200,a.style.display="inline";var n=a.getContext("2d");return n.rect(0,0,10,10),n.rect(2,2,6,6),t.push("canvas winding:"+(!1===n.isPointInPath(5,5,"evenodd")?"yes":"no")),n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(125,1,62,20),n.fillStyle="#069",e.dontUseFakeFontInCanvas?n.font="11pt Arial":n.font="11pt no-real-font-123",n.fillText("Cwm fjordbank glyphs vext quiz, 😃",2,15),n.fillStyle="rgba(102, 204, 0, 0.2)",n.font="18pt Arial",n.fillText("Cwm fjordbank glyphs vext quiz, 😃",4,45),n.globalCompositeOperation="multiply",n.fillStyle="rgb(255,0,255)",n.beginPath(),n.arc(50,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(0,255,255)",n.beginPath(),n.arc(100,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,255,0)",n.beginPath(),n.arc(75,100,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,0,255)",n.arc(75,75,75,0,2*Math.PI,!0),n.arc(75,75,25,0,2*Math.PI,!0),n.fill("evenodd"),a.toDataURL&&t.push("canvas fp:"+a.toDataURL()),t}(t)):e(t.NOT_AVAILABLE)}},{key:"webgl",getData:function(e,t){r()?e(function(){function e(e){return o.clearColor(0,0,0,1),o.enable(o.DEPTH_TEST),o.depthFunc(o.LEQUAL),o.clear(o.COLOR_BUFFER_BIT|o.DEPTH_BUFFER_BIT),"["+e[0]+", "+e[1]+"]"}var o;if(!(o=S()))return null;var s=[],t=o.createBuffer();o.bindBuffer(o.ARRAY_BUFFER,t);var a=new Float32Array([-.2,-.9,0,.4,-.26,0,0,.732134444,0]);o.bufferData(o.ARRAY_BUFFER,a,o.STATIC_DRAW),t.itemSize=3,t.numItems=3;var n=o.createProgram(),r=o.createShader(o.VERTEX_SHADER);o.shaderSource(r,"attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}"),o.compileShader(r);var i=o.createShader(o.FRAGMENT_SHADER);o.shaderSource(i,"precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}"),o.compileShader(i),o.attachShader(n,r),o.attachShader(n,i),o.linkProgram(n),o.useProgram(n),n.vertexPosAttrib=o.getAttribLocation(n,"attrVertex"),n.offsetUniform=o.getUniformLocation(n,"uniformOffset"),o.enableVertexAttribArray(n.vertexPosArray),o.vertexAttribPointer(n.vertexPosAttrib,t.itemSize,o.FLOAT,!1,0,0),o.uniform2f(n.offsetUniform,1,1),o.drawArrays(o.TRIANGLE_STRIP,0,t.numItems);try{s.push(o.canvas.toDataURL())}catch(e){}s.push("extensions:"+(o.getSupportedExtensions()||[]).join(";")),s.push("webgl aliased line width range:"+e(o.getParameter(o.ALIASED_LINE_WIDTH_RANGE))),s.push("webgl aliased point size range:"+e(o.getParameter(o.ALIASED_POINT_SIZE_RANGE))),s.push("webgl alpha bits:"+o.getParameter(o.ALPHA_BITS)),s.push("webgl antialiasing:"+(o.getContextAttributes().antialias?"yes":"no")),s.push("webgl blue bits:"+o.getParameter(o.BLUE_BITS)),s.push("webgl depth bits:"+o.getParameter(o.DEPTH_BITS)),s.push("webgl green bits:"+o.getParameter(o.GREEN_BITS)),s.push("webgl max anisotropy:"+function(e){var t=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic");if(t){var a=e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT);return 0===a&&(a=2),a}return null}(o)),s.push("webgl max combined texture image units:"+o.getParameter(o.MAX_COMBINED_TEXTURE_IMAGE_UNITS)),s.push("webgl max cube map texture size:"+o.getParameter(o.MAX_CUBE_MAP_TEXTURE_SIZE)),s.push("webgl max fragment uniform vectors:"+o.getParameter(o.MAX_FRAGMENT_UNIFORM_VECTORS)),s.push("webgl max render buffer size:"+o.getParameter(o.MAX_RENDERBUFFER_SIZE)),s.push("webgl max texture image units:"+o.getParameter(o.MAX_TEXTURE_IMAGE_UNITS)),s.push("webgl max texture size:"+o.getParameter(o.MAX_TEXTURE_SIZE)),s.push("webgl max varying vectors:"+o.getParameter(o.MAX_VARYING_VECTORS)),s.push("webgl max vertex attribs:"+o.getParameter(o.MAX_VERTEX_ATTRIBS)),s.push("webgl max vertex texture image units:"+o.getParameter(o.MAX_VERTEX_TEXTURE_IMAGE_UNITS)),s.push("webgl max vertex uniform vectors:"+o.getParameter(o.MAX_VERTEX_UNIFORM_VECTORS)),s.push("webgl max viewport dims:"+e(o.getParameter(o.MAX_VIEWPORT_DIMS))),s.push("webgl red bits:"+o.getParameter(o.RED_BITS)),s.push("webgl renderer:"+o.getParameter(o.RENDERER)),s.push("webgl shading language version:"+o.getParameter(o.SHADING_LANGUAGE_VERSION)),s.push("webgl stencil bits:"+o.getParameter(o.STENCIL_BITS)),s.push("webgl vendor:"+o.getParameter(o.VENDOR)),s.push("webgl version:"+o.getParameter(o.VERSION));try{var l=o.getExtension("WEBGL_debug_renderer_info");l&&(s.push("webgl unmasked vendor:"+o.getParameter(l.UNMASKED_VENDOR_WEBGL)),s.push("webgl unmasked renderer:"+o.getParameter(l.UNMASKED_RENDERER_WEBGL)))}catch(e){}return o.getShaderPrecisionFormat&&d(["FLOAT","INT"],function(i){d(["VERTEX","FRAGMENT"],function(r){d(["HIGH","MEDIUM","LOW"],function(n){d(["precision","rangeMin","rangeMax"],function(e){var t=o.getShaderPrecisionFormat(o[r+"_SHADER"],o[n+"_"+i])[e];"precision"!==e&&(e="precision "+e);var a=["webgl ",r.toLowerCase()," shader ",n.toLowerCase()," ",i.toLowerCase()," ",e,":",t].join("");s.push(a)})})})}),s}()):e(t.NOT_AVAILABLE)}},{key:"webglVendorAndRenderer",getData:function(e){r()?e(function(){try{var e=S(),t=e.getExtension("WEBGL_debug_renderer_info");return e.getParameter(t.UNMASKED_VENDOR_WEBGL)+"~"+e.getParameter(t.UNMASKED_RENDERER_WEBGL)}catch(e){return null}}()):e()}},{key:"adBlock",getData:function(e){e(function(){var e=document.createElement("div");e.innerHTML="&nbsp;";var t=!(e.className="adsbox");try{document.body.appendChild(e),t=0===document.getElementsByClassName("adsbox")[0].offsetHeight,document.body.removeChild(e)}catch(e){t=!1}return t}())}},{key:"hasLiedLanguages",getData:function(e){e(function(){if(void 0!==navigator.languages)try{if(navigator.languages[0].substr(0,2)!==navigator.language.substr(0,2))return!0}catch(e){return!0}return!1}())}},{key:"hasLiedResolution",getData:function(e){e(window.screen.width<window.screen.availWidth||window.screen.height<window.screen.availHeight)}},{key:"hasLiedOs",getData:function(e){e(function(){var e,t=navigator.userAgent.toLowerCase(),a=navigator.oscpu,n=navigator.platform.toLowerCase();if(e=0<=t.indexOf("windows phone")?"Windows Phone":0<=t.indexOf("win")?"Windows":0<=t.indexOf("android")?"Android":0<=t.indexOf("linux")||0<=t.indexOf("cros")?"Linux":0<=t.indexOf("iphone")||0<=t.indexOf("ipad")?"iOS":0<=t.indexOf("mac")?"Mac":"Other",("ontouchstart"in window||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints)&&"Windows Phone"!=e&&"Android"!=e&&"iOS"!=e&&"Other"!=e)return!0;if(void 0!==a){if(0<=(a=a.toLowerCase()).indexOf("win")&&"Windows"!=e&&"Windows Phone"!=e)return!0;if(0<=a.indexOf("linux")&&"Linux"!=e&&"Android"!=e)return!0;if(0<=a.indexOf("mac")&&"Mac"!=e&&"iOS"!=e)return!0;if((-1===a.indexOf("win")&&-1===a.indexOf("linux")&&-1===a.indexOf("mac"))!=("Other"==e))return!0}return 0<=n.indexOf("win")&&"Windows"!=e&&"Windows Phone"!=e||(0<=n.indexOf("linux")||0<=n.indexOf("android")||0<=n.indexOf("pike"))&&"Linux"!=e&&"Android"!=e||(0<=n.indexOf("mac")||0<=n.indexOf("ipad")||0<=n.indexOf("ipod")||0<=n.indexOf("iphone"))&&"Mac"!=e&&"iOS"!=e||(n.indexOf("win")<0&&n.indexOf("linux")<0&&n.indexOf("mac")<0&&n.indexOf("iphone")<0&&n.indexOf("ipad")<0)!=("Other"==e)||void 0===navigator.plugins&&"Windows"!=e&&"Windows Phone"!=e}())}},{key:"hasLiedBrowser",getData:function(e){e(function(){var e,t=navigator.userAgent.toLowerCase(),a=navigator.productSub;if(("Chrome"==(e=0<=t.indexOf("firefox")?"Firefox":0<=t.indexOf("opera")||0<=t.indexOf("opr")?"Opera":0<=t.indexOf("chrome")?"Chrome":0<=t.indexOf("safari")?"Safari":0<=t.indexOf("trident")?"Internet Explorer":"Other")||"Safari"==e||"Opera"==e)&&"20030107"!==a)return!0;var n,r=eval.toString().length;if(37===r&&"Safari"!=e&&"Firefox"!=e&&"Other"!=e)return!0;if(39===r&&"Internet Explorer"!=e&&"Other"!=e)return!0;if(33===r&&"Chrome"!=e&&"Opera"!=e&&"Other"!=e)return!0;try{throw"a"}catch(e){try{e.toSource(),n=!0}catch(e){n=!1}}return n&&"Firefox"!=e&&"Other"!=e}())}},{key:"touchSupport",getData:function(e){e(function(){var e,t=0;void 0!==navigator.maxTouchPoints?t=navigator.maxTouchPoints:void 0!==navigator.msMaxTouchPoints&&(t=navigator.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(t){e=!1}return[t,e,"ontouchstart"in window]}())}},{key:"fonts",getData:function(e,t){var c=["monospace","sans-serif","serif"],u=["Andale Mono","Arial","Arial Black","Arial Hebrew","Arial MT","Arial Narrow","Arial Rounded MT Bold","Arial Unicode MS","Bitstream Vera Sans Mono","Book Antiqua","Bookman Old Style","Calibri","Cambria","Cambria Math","Century","Century Gothic","Century Schoolbook","Comic Sans","Comic Sans MS","Consolas","Courier","Courier New","Geneva","Georgia","Helvetica","Helvetica Neue","Impact","Lucida Bright","Lucida Calligraphy","Lucida Console","Lucida Fax","LUCIDA GRANDE","Lucida Handwriting","Lucida Sans","Lucida Sans Typewriter","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Monotype Corsiva","MS Gothic","MS Outlook","MS PGothic","MS Reference Sans Serif","MS Sans Serif","MS Serif","MYRIAD","MYRIAD PRO","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Times New Roman PS","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3"];t.fonts.extendedJsFonts&&(u=u.concat(["Abadi MT Condensed Light","Academy Engraved LET","ADOBE CASLON PRO","Adobe Garamond","ADOBE GARAMOND PRO","Agency FB","Aharoni","Albertus Extra Bold","Albertus Medium","Algerian","Amazone BT","American Typewriter","American Typewriter Condensed","AmerType Md BT","Andalus","Angsana New","AngsanaUPC","Antique Olive","Aparajita","Apple Chancery","Apple Color Emoji","Apple SD Gothic Neo","Arabic Typesetting","ARCHER","ARNO PRO","Arrus BT","Aurora Cn BT","AvantGarde Bk BT","AvantGarde Md BT","AVENIR","Ayuthaya","Bandy","Bangla Sangam MN","Bank Gothic","BankGothic Md BT","Baskerville","Baskerville Old Face","Batang","BatangChe","Bauer Bodoni","Bauhaus 93","Bazooka","Bell MT","Bembo","Benguiat Bk BT","Berlin Sans FB","Berlin Sans FB Demi","Bernard MT Condensed","BernhardFashion BT","BernhardMod BT","Big Caslon","BinnerD","Blackadder ITC","BlairMdITC TT","Bodoni 72","Bodoni 72 Oldstyle","Bodoni 72 Smallcaps","Bodoni MT","Bodoni MT Black","Bodoni MT Condensed","Bodoni MT Poster Compressed","Bookshelf Symbol 7","Boulder","Bradley Hand","Bradley Hand ITC","Bremen Bd BT","Britannic Bold","Broadway","Browallia New","BrowalliaUPC","Brush Script MT","Californian FB","Calisto MT","Calligrapher","Candara","CaslonOpnface BT","Castellar","Centaur","Cezanne","CG Omega","CG Times","Chalkboard","Chalkboard SE","Chalkduster","Charlesworth","Charter Bd BT","Charter BT","Chaucer","ChelthmITC Bk BT","Chiller","Clarendon","Clarendon Condensed","CloisterBlack BT","Cochin","Colonna MT","Constantia","Cooper Black","Copperplate","Copperplate Gothic","Copperplate Gothic Bold","Copperplate Gothic Light","CopperplGoth Bd BT","Corbel","Cordia New","CordiaUPC","Cornerstone","Coronet","Cuckoo","Curlz MT","DaunPenh","Dauphin","David","DB LCD Temp","DELICIOUS","Denmark","DFKai-SB","Didot","DilleniaUPC","DIN","DokChampa","Dotum","DotumChe","Ebrima","Edwardian Script ITC","Elephant","English 111 Vivace BT","Engravers MT","EngraversGothic BT","Eras Bold ITC","Eras Demi ITC","Eras Light ITC","Eras Medium ITC","EucrosiaUPC","Euphemia","Euphemia UCAS","EUROSTILE","Exotc350 Bd BT","FangSong","Felix Titling","Fixedsys","FONTIN","Footlight MT Light","Forte","FrankRuehl","Fransiscan","Freefrm721 Blk BT","FreesiaUPC","Freestyle Script","French Script MT","FrnkGothITC Bk BT","Fruitger","FRUTIGER","Futura","Futura Bk BT","Futura Lt BT","Futura Md BT","Futura ZBlk BT","FuturaBlack BT","Gabriola","Galliard BT","Gautami","Geeza Pro","Geometr231 BT","Geometr231 Hv BT","Geometr231 Lt BT","GeoSlab 703 Lt BT","GeoSlab 703 XBd BT","Gigi","Gill Sans","Gill Sans MT","Gill Sans MT Condensed","Gill Sans MT Ext Condensed Bold","Gill Sans Ultra Bold","Gill Sans Ultra Bold Condensed","Gisha","Gloucester MT Extra Condensed","GOTHAM","GOTHAM BOLD","Goudy Old Style","Goudy Stout","GoudyHandtooled BT","GoudyOLSt BT","Gujarati Sangam MN","Gulim","GulimChe","Gungsuh","GungsuhChe","Gurmukhi MN","Haettenschweiler","Harlow Solid Italic","Harrington","Heather","Heiti SC","Heiti TC","HELV","Herald","High Tower Text","Hiragino Kaku Gothic ProN","Hiragino Mincho ProN","Hoefler Text","Humanst 521 Cn BT","Humanst521 BT","Humanst521 Lt BT","Imprint MT Shadow","Incised901 Bd BT","Incised901 BT","Incised901 Lt BT","INCONSOLATA","Informal Roman","Informal011 BT","INTERSTATE","IrisUPC","Iskoola Pota","JasmineUPC","Jazz LET","Jenson","Jester","Jokerman","Juice ITC","Kabel Bk BT","Kabel Ult BT","Kailasa","KaiTi","Kalinga","Kannada Sangam MN","Kartika","Kaufmann Bd BT","Kaufmann BT","Khmer UI","KodchiangUPC","Kokila","Korinna BT","Kristen ITC","Krungthep","Kunstler Script","Lao UI","Latha","Leelawadee","Letter Gothic","Levenim MT","LilyUPC","Lithograph","Lithograph Light","Long Island","Lydian BT","Magneto","Maiandra GD","Malayalam Sangam MN","Malgun Gothic","Mangal","Marigold","Marion","Marker Felt","Market","Marlett","Matisse ITC","Matura MT Script Capitals","Meiryo","Meiryo UI","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Uighur","Microsoft YaHei","Microsoft Yi Baiti","MingLiU","MingLiU_HKSCS","MingLiU_HKSCS-ExtB","MingLiU-ExtB","Minion","Minion Pro","Miriam","Miriam Fixed","Mistral","Modern","Modern No. 20","Mona Lisa Solid ITC TT","Mongolian Baiti","MONO","MoolBoran","Mrs Eaves","MS LineDraw","MS Mincho","MS PMincho","MS Reference Specialty","MS UI Gothic","MT Extra","MUSEO","MV Boli","Nadeem","Narkisim","NEVIS","News Gothic","News GothicMT","NewsGoth BT","Niagara Engraved","Niagara Solid","Noteworthy","NSimSun","Nyala","OCR A Extended","Old Century","Old English Text MT","Onyx","Onyx BT","OPTIMA","Oriya Sangam MN","OSAKA","OzHandicraft BT","Palace Script MT","Papyrus","Parchment","Party LET","Pegasus","Perpetua","Perpetua Titling MT","PetitaBold","Pickwick","Plantagenet Cherokee","Playbill","PMingLiU","PMingLiU-ExtB","Poor Richard","Poster","PosterBodoni BT","PRINCETOWN LET","Pristina","PTBarnum BT","Pythagoras","Raavi","Rage Italic","Ravie","Ribbon131 Bd BT","Rockwell","Rockwell Condensed","Rockwell Extra Bold","Rod","Roman","Sakkal Majalla","Santa Fe LET","Savoye LET","Sceptre","Script","Script MT Bold","SCRIPTINA","Serifa","Serifa BT","Serifa Th BT","ShelleyVolante BT","Sherwood","Shonar Bangla","Showcard Gothic","Shruti","Signboard","SILKSCREEN","SimHei","Simplified Arabic","Simplified Arabic Fixed","SimSun","SimSun-ExtB","Sinhala Sangam MN","Sketch Rockwell","Skia","Small Fonts","Snap ITC","Snell Roundhand","Socket","Souvenir Lt BT","Staccato222 BT","Steamer","Stencil","Storybook","Styllo","Subway","Swis721 BlkEx BT","Swiss911 XCm BT","Sylfaen","Synchro LET","System","Tamil Sangam MN","Technical","Teletype","Telugu Sangam MN","Tempus Sans ITC","Terminal","Thonburi","Traditional Arabic","Trajan","TRAJAN PRO","Tristan","Tubular","Tunga","Tw Cen MT","Tw Cen MT Condensed","Tw Cen MT Condensed Extra Bold","TypoUpright BT","Unicorn","Univers","Univers CE 55 Medium","Univers Condensed","Utsaah","Vagabond","Vani","Vijaya","Viner Hand ITC","VisualUI","Vivaldi","Vladimir Script","Vrinda","Westminster","WHITNEY","Wide Latin","ZapfEllipt BT","ZapfHumnst BT","ZapfHumnst Dm BT","Zapfino","Zurich BlkEx BT","Zurich Ex BT","ZWAdobeF"])),u=(u=u.concat(t.fonts.userDefinedFonts)).filter(function(e,t){return u.indexOf(e)===t});function m(){var e=document.createElement("span");return e.style.position="absolute",e.style.left="-9999px",e.style.fontSize="72px",e.style.fontStyle="normal",e.style.fontWeight="normal",e.style.letterSpacing="normal",e.style.lineBreak="auto",e.style.lineHeight="normal",e.style.textTransform="none",e.style.textAlign="left",e.style.textDecoration="none",e.style.textShadow="none",e.style.whiteSpace="normal",e.style.wordBreak="normal",e.style.wordSpacing="normal",e.innerHTML="mmmmmmmmmmlli",e}function a(e){for(var t=!1,a=0;a<c.length;a++)if(t=e[a].offsetWidth!==i[c[a]]||e[a].offsetHeight!==o[c[a]])return t;return t}var n=document.getElementsByTagName("body")[0],r=document.createElement("div"),g=document.createElement("div"),i={},o={},s=function(){for(var e=[],t=0,a=c.length;t<a;t++){var n=m();n.style.fontFamily=c[t],r.appendChild(n),e.push(n)}return e}();n.appendChild(r);for(var l=0,d=c.length;l<d;l++)i[c[l]]=s[l].offsetWidth,o[c[l]]=s[l].offsetHeight;var f=function(){for(var e,t,a,n={},r=0,i=u.length;r<i;r++){for(var o=[],s=0,l=c.length;s<l;s++){var d=(e=u[r],t=c[s],a=void 0,(a=m()).style.fontFamily="'"+e+"',"+t,a);g.appendChild(d),o.push(d)}n[u[r]]=o}return n}();n.appendChild(g);for(var p=[],h=0,S=u.length;h<S;h++)a(f[u[h]])&&p.push(u[h]);n.removeChild(g),n.removeChild(r),e(p)},pauseBefore:!0},{key:"fontsFlash",getData:function(t,e){return void 0!==window.swfobject?window.swfobject.hasFlashPlayerVersion("9.0.0")?e.fonts.swfPath?void function(t,e){var a="___fp_swf_loaded";window[a]=function(e){t(e)};var n,r=e.fonts.swfContainerId;(n=document.createElement("div")).setAttribute("id",(void 0).fonts.swfContainerId),document.body.appendChild(n);var i={onReady:a};window.swfobject.embedSWF(e.fonts.swfPath,r,"1","1","9.0.0",!1,i,{allowScriptAccess:"always",menu:"false"},{})}(function(e){t(e)},e):t("missing options.fonts.swfPath"):t("flash not installed"):t("swf object not loaded")},pauseBefore:!0},{key:"audio",getData:function(a,e){var t=e.audio;if(t.excludeIOS11&&navigator.userAgent.match(/OS 11.+Version\/11.+Safari/))return a(e.EXCLUDED);var n=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(null==n)return a(e.NOT_AVAILABLE);var r=new n(1,44100,44100),i=r.createOscillator();i.type="triangle",i.frequency.setValueAtTime(1e4,r.currentTime);var o=r.createDynamicsCompressor();d([["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]],function(e){void 0!==o[e[0]]&&"function"==typeof o[e[0]].setValueAtTime&&o[e[0]].setValueAtTime(e[1],r.currentTime)}),i.connect(o),o.connect(r.destination),i.start(0),r.startRendering();var s=setTimeout(function(){return console.warn('Audio fingerprint timed out. Please report bug at https://github.com/Valve/fingerprintjs2 with your user agent: "'+navigator.userAgent+'".'),r.oncomplete=function(){},r=null,a("audioTimeout")},t.timeout);r.oncomplete=function(e){var t;try{clearTimeout(s),t=e.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(function(e,t){return e+Math.abs(t)},0).toString(),i.disconnect(),o.disconnect()}catch(e){return void a(e)}a(t)}}},{key:"enumerateDevices",getData:function(t,e){if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices)return t(e.NOT_AVAILABLE);navigator.mediaDevices.enumerateDevices().then(function(e){t(e.map(function(e){return"id="+e.deviceId+";gid="+e.groupId+";"+e.kind+";"+e.label}))}).catch(function(e){t(e)})}}];return c.get=function(a,n){(function(e,t){var a,n;if(null!=t)for(n in t)null==(a=t[n])||Object.prototype.hasOwnProperty.call(e,n)||(e[n]=a)})(a=n?a||{}:(n=a,{}),e),a.components=a.extraComponents.concat(t);var r={data:[],addPreprocessedComponent:function(e,t){"function"==typeof a.preprocessor&&(t=a.preprocessor(e,t)),r.data.push({key:e,value:t})}},i=-1,o=function(e){if((i+=1)>=a.components.length)n(r.data);else{var t=a.components[i];if(a.excludes[t.key])o(!1);else{if(!e&&t.pauseBefore)return i-=1,void setTimeout(function(){o(!0)},1);try{t.getData(function(e){r.addPreprocessedComponent(t.key,e),o(!1)},a)}catch(e){r.addPreprocessedComponent(t.key,String(e)),o(!1)}}}};o(!1)},c.getPromise=function(a){return new Promise(function(e,t){c.get(a,e)})},c.getV18=function(i,o){return null==o&&(o=i,i={}),c.get(i,function(e){for(var t=[],a=0;a<e.length;a++){var n=e[a];if(n.value===(i.NOT_AVAILABLE||"not available"))t.push({key:n.key,value:"unknown"});else if("plugins"===n.key)t.push({key:"plugins",value:l(n.value,function(e){var t=l(e[2],function(e){return e.join?e.join("~"):e}).join(",");return[e[0],e[1],t].join("::")})});else if(-1!==["canvas","webgl"].indexOf(n.key))t.push({key:n.key,value:n.value.join("~")});else if(-1!==["sessionStorage","localStorage","indexedDb","addBehavior","openDatabase"].indexOf(n.key)){if(!n.value)continue;t.push({key:n.key,value:1})}else n.value?t.push(n.value.join?{key:n.key,value:n.value.join(";")}:n):t.push({key:n.key,value:n.value})}var r=s(l(t,function(e){return e.value}).join("~~~"),31);o(r,t)})},c.x64hash128=s,c.VERSION="2.1.0",c});
wp-slimstat.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Slimstat Analytics
4
  Plugin URI: https://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
- Version: 4.8.7.3
7
  Author: Jason Crouse
8
  Author URI: https://www.wp-slimstat.com/
9
  Text Domain: wp-slimstat
@@ -15,12 +15,11 @@ if ( !empty( wp_slimstat::$settings ) ) {
15
  }
16
 
17
  class wp_slimstat {
18
- public static $version = '4.8.7.3';
19
  public static $settings = array();
20
 
21
  public static $wpdb = '';
22
  public static $upload_dir = '';
23
- public static $maxmind_path = '';
24
 
25
  public static $update_checker = array();
26
  public static $raw_post_array = array();
@@ -70,8 +69,6 @@ class wp_slimstat {
70
  self::$upload_dir = apply_filters( 'slimstat_maxmind_path', self::$upload_dir );
71
  }
72
 
73
- self::$maxmind_path = self::$upload_dir . '/maxmind.mmdb';
74
-
75
  // Allow add-ons to turn off the tracker based on other conditions
76
  $is_tracking_filter = apply_filters( 'slimstat_filter_pre_tracking', strpos( self::get_request_uri(), 'wp-admin/admin-ajax.php' ) === false );
77
  $is_tracking_filter_js = apply_filters( 'slimstat_filter_pre_tracking_js', true );
@@ -89,9 +86,9 @@ class wp_slimstat {
89
  }
90
 
91
  // Slimstat tracks screen resolutions, outbound links and other client-side information using a client-side tracker
92
- add_action( is_admin() ? 'admin_enqueue_scripts' : 'wp_enqueue_scripts' , array( __CLASS__, 'wp_slimstat_enqueue_tracking_script' ), 15 );
93
  if ( self::$settings[ 'ignore_wp_users' ] != 'on' ) {
94
- add_action( 'login_enqueue_scripts', array( __CLASS__, 'wp_slimstat_enqueue_tracking_script' ), 10 );
95
  }
96
  }
97
 
@@ -130,7 +127,7 @@ class wp_slimstat {
130
  // end init
131
 
132
  /**
133
- * Ajax Tracking
134
  */
135
  public static function slimtrack_ajax() {
136
  // If the website is using a caching plugin, the tracking code might still be there, even if the user turned off tracking
@@ -151,10 +148,6 @@ class wp_slimstat {
151
  if ( $parsed_ref === false ) {
152
  exit( self::_log_error( 201 ) );
153
  }
154
-
155
- if ( !empty( $parsed_ref ) && $parsed_ref == $site_host && self::$settings[ 'track_same_domain_referers' ] != 'on' ) {
156
- self::$stat[ 'referer' ] = '';
157
- }
158
  }
159
 
160
  // Do we have an id for this request? If we do, we are either updating an existing pageview, or recording an event on the page
@@ -180,6 +173,16 @@ class wp_slimstat {
180
  // Retrieves all the client-side info (screen resolution, server latency, etc) and sets the corresponding entries in self::$stat
181
  self::$stat = self::_get_client_info( self::$data_js, self::$stat );
182
 
 
 
 
 
 
 
 
 
 
 
183
  $id = self::_update_row( self::$stat );
184
  }
185
  // ... otherwise, is this an event: a click on a link (maybe a 'download'?) or other user action
@@ -197,9 +200,6 @@ class wp_slimstat {
197
 
198
  self::_insert_row( $event_info, $GLOBALS[ 'wpdb' ]->prefix . 'slim_events' );
199
 
200
- // Track outbound links and downloads by adding the appropriate informaton to the database
201
- $parsed_resource = array( 'host' => '', 'path' => '' );
202
-
203
  if ( !empty( self::$data_js[ 'res' ] ) ) {
204
  $resource = self::_base64_url_decode( self::$data_js[ 'res' ] );
205
  $parsed_resource = parse_url( $resource );
@@ -207,21 +207,29 @@ class wp_slimstat {
207
  if ( $parsed_resource === false ) {
208
  exit( self::_log_error( 203 ) );
209
  }
210
- }
211
 
212
- // Is this a download? If it is, add a new record to the database
213
- if ( in_array( pathinfo( $resource, PATHINFO_EXTENSION ), self::string_to_array( self::$settings[ 'extensions_to_track' ] ) ) ) {
214
- self::$stat[ 'resource' ] = $parsed_resource[ 'path' ];
215
- self::$stat[ 'content_type' ] = 'download';
216
 
217
- $id = self::slimtrack();
218
- }
219
- // .. or outbound link? If so, update the pageview with the new info
220
- else {
221
- if ( $parsed_resource[ 'host' ] != $site_host ) {
222
- self::$stat[ 'outbound_resource' ] = $resource;
223
  }
 
 
 
224
 
 
 
 
 
 
 
 
225
  // Visitor is still on this page, record the timestamp in the corresponding field
226
  self::$stat[ 'dt_out' ] = self::date_i18n( 'U' );
227
 
@@ -267,6 +275,11 @@ class wp_slimstat {
267
  self::$stat[ 'content_type' ] = 'external';
268
  }
269
 
 
 
 
 
 
270
  // Track the rest of the information related to this pageview
271
  $id = self::slimtrack();
272
  }
@@ -280,13 +293,17 @@ class wp_slimstat {
280
  do_action( 'slimstat_track_success' );
281
  exit( self::_get_value_with_checksum( $id ) );
282
  }
 
283
 
284
  /**
285
- * Core tracking functionality
286
  */
287
  public static function slimtrack() {
288
  self::$stat[ 'dt' ] = self::date_i18n( 'U' );
289
- self::$stat[ 'notes' ] = array();
 
 
 
290
 
291
  // Allow third-party tools to initialize the stat array
292
  self::$stat = apply_filters( 'slimstat_filter_pageview_stat_init', self::$stat );
@@ -363,12 +380,12 @@ class wp_slimstat {
363
  list( $ip_to_ignore, $cidr_mask ) = explode( '/', trim( $ip_to_ignore ) );
364
  }
365
  else{
366
- $cidr_mask = self::get_mask_length( $ip_to_ignore );
367
  }
368
 
369
- $long_masked_ip_to_ignore = substr( self::dtr_pton( $ip_to_ignore ), 0, $cidr_mask );
370
- $long_masked_user_ip = substr( self::dtr_pton( self::$stat[ 'ip' ] ), 0, $cidr_mask );
371
- $long_masked_user_other_ip = substr( self::dtr_pton( self::$stat[ 'other_ip' ] ), 0 , $cidr_mask );
372
 
373
  if ( $long_masked_user_ip === $long_masked_ip_to_ignore || $long_masked_user_other_ip === $long_masked_ip_to_ignore ) {
374
  return false;
@@ -380,7 +397,7 @@ class wp_slimstat {
380
  // IPv4 or IPv6
381
  $needle = '.';
382
  $replace = '.0';
383
- if ( self::get_mask_length( self::$stat[ 'ip' ] ) == 128 ) {
384
  $needle = ':';
385
  $replace = ':0000';
386
  }
@@ -418,7 +435,6 @@ class wp_slimstat {
418
  }
419
 
420
  if ( !empty( self::$stat[ 'referer' ] ) ) {
421
-
422
  // Is this a 'seriously malformed' URL?
423
  $parsed_url = parse_url( self::$stat[ 'referer' ] );
424
  if ( !$parsed_url ) {
@@ -431,36 +447,23 @@ class wp_slimstat {
431
  unset( self::$stat[ 'referer' ] );
432
  }
433
 
434
- $parsed_site_url = parse_url( get_site_url(), PHP_URL_HOST );
435
- if ( !empty( $parsed_url[ 'host' ] ) && $parsed_url[ 'host' ] == $parsed_site_url && self::$settings[ 'track_same_domain_referers' ] != 'on' ) {
436
- unset( self::$stat[ 'referer' ] );
437
- }
438
- else {
439
- // Fix Google Images referring domain
440
- if ( strpos( self::$stat[ 'referer' ], 'www.google' ) !== false ) {
441
- if ( strpos( self::$stat[ 'referer' ], '/imgres?' ) !== false ) {
442
- self::$stat[ 'referer' ] = str_replace( 'www.google', 'images.google', self::$stat[ 'referer' ] );
443
- }
444
- if ( strpos( self::$stat[ 'referer' ], '/url?' ) !== false ) {
445
- self::$stat[ 'referer' ] = str_replace( '/url?', '/search?', self::$stat[ 'referer' ] );
446
- }
447
- }
448
- }
449
-
450
  // Is this referer blacklisted?
451
  if ( !empty( self::$settings[ 'ignore_referers' ] ) && self::_is_blacklisted( self::$stat[ 'referer' ], self::$settings[ 'ignore_referers' ] ) ) {
452
  return false;
453
  }
454
- }
455
 
456
- // Search terms
457
- if ( !empty( self::$stat[ 'resource' ] ) ) {
458
- self::$stat[ 'searchterms' ] = self::_get_search_terms( self::$stat[ 'resource' ] );
459
- }
460
- if ( empty( self::$stat[ 'searchterms' ] ) && !empty( self::$stat[ 'referer' ] ) ) {
461
  self::$stat[ 'searchterms' ] = self::_get_search_terms( self::$stat[ 'referer' ] );
 
 
 
 
 
 
462
  }
463
- if ( empty( self::$stat[ 'searchterms' ] ) && !empty( $_REQUEST[ 's' ] ) ) {
 
 
464
  self::$stat[ 'searchterms' ] = sanitize_text_field( str_replace( '\\', '', $_REQUEST[ 's' ] ) );
465
  }
466
 
@@ -550,7 +553,7 @@ class wp_slimstat {
550
  }
551
 
552
  // Geolocation
553
- include_once ( plugin_dir_path( __FILE__ ) . 'vendor/maxmind.php' );
554
  try {
555
  $geolocation_data = maxmind_geolite2_connector::get_geolocation_info( self::$stat[ 'ip' ] );
556
  }
@@ -626,7 +629,7 @@ class wp_slimstat {
626
 
627
  // Implode the notes
628
  if ( !empty( self::$stat[ 'notes' ] ) ) {
629
- self::$stat[ 'notes' ] = implode( ';', self::$stat[ 'notes' ] );
630
  }
631
 
632
  // Remove empty values
@@ -701,18 +704,6 @@ class wp_slimstat {
701
  }
702
  // end get_request_uri
703
 
704
- /**
705
- * Update content type as needed
706
- */
707
- public static function update_content_type( $_status = 301, $_location = '' ) {
708
- if ( $_status >= 300 && $_status < 400 ) {
709
- // SEE WHY THIS DOESN'T WORK?!
710
- self::$stat[ 'content_type' ] = 'redirect:' . intval( $_status );
711
- self::_update_row( self::$stat );
712
- }
713
- }
714
- // end update_content_type
715
-
716
  public static function is_local_ip_address( $ip_address = '' ) {
717
  if ( !filter_var( $ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) {
718
  return true;
@@ -721,163 +712,16 @@ class wp_slimstat {
721
  return false;
722
  }
723
 
724
- public static function dtr_pton( $ip ){
725
- if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
726
- $unpacked = unpack( 'A4', inet_pton( $ip ) );
727
- }
728
- else if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) && defined( 'AF_INET6' ) ) {
729
- $unpacked = unpack( 'A16', inet_pton( $ip ) );
730
- }
731
-
732
- $binary_ip = '';
733
- if ( !empty( $unpacked ) ) {
734
- $unpacked = str_split( $unpacked[ 1 ] );
735
- foreach ( $unpacked as $char ) {
736
- $binary_ip .= str_pad( decbin( ord( $char ) ), 8, '0', STR_PAD_LEFT );
737
- }
738
- }
739
-
740
- return $binary_ip;
741
- }
742
-
743
- public static function get_mask_length( $ip ){
744
- if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
745
- return 32;
746
- }
747
- else if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
748
- return 128;
749
- }
750
-
751
- return false;
752
- }
753
-
754
- /**
755
- * Opens given domains during CORS requests to admin-ajax.php
756
- */
757
- public static function open_cors_admin_ajax( $_allowed_origins = array() ) {
758
- $exploded_domains = self::string_to_array( self::$settings[ 'external_domains' ] );
759
-
760
- if ( !empty( $exploded_domains ) && !empty( $exploded_domains[ 0 ] ) ) {
761
- $_allowed_origins = array_merge( $_allowed_origins, $exploded_domains );
762
- }
763
-
764
- return $_allowed_origins;
765
- }
766
-
767
  /**
768
- * Downloads the MaxMind geolocation database from their repository
769
  */
770
- public static function download_maxmind_database() {
771
- // Create the folder, if it doesn't exist
772
- if ( !file_exists( dirname( self::$maxmind_path ) ) ) {
773
- mkdir( dirname( self::$maxmind_path ) );
774
- }
775
-
776
- if ( file_exists( self::$maxmind_path ) ) {
777
- if ( is_file( self::$maxmind_path ) ) {
778
- $is_deleted = @unlink( self::$maxmind_path );
779
- }
780
- else {
781
- // This should not happen, but hey...
782
- $is_deleted = @rmdir( self::$maxmind_path );
783
- }
784
-
785
- if ( !$is_deleted ) {
786
- return __( "The geolocation database cannot be updated. Please check your server's file permissions and try again.", 'wp-slimstat' );
787
- }
788
- }
789
-
790
- // Download the most recent database directly from MaxMind's repository
791
- if ( self::$settings[ 'geolocation_country' ] == 'on' ) {
792
- $maxmind_tmp = self::download_url( 'https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz' );
793
- }
794
- else {
795
- $maxmind_tmp = self::download_url( 'https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz' );
796
- }
797
-
798
- if ( is_wp_error( $maxmind_tmp ) ) {
799
- return __( 'There was an error downloading the MaxMind Geolite DB:', 'wp-slimstat' ) . ' ' . $maxmind_tmp->get_error_message();
800
- }
801
-
802
- $zh = false;
803
-
804
- if ( !function_exists( 'gzopen' ) ) {
805
- if ( function_exists( 'gzopen64' ) ) {
806
- if ( false === ( $zh = gzopen64( $maxmind_tmp, 'rb' ) ) ) {
807
- return __( "There was an error opening the zipped MaxMind Geolite DB. Please check your server's file permissions and try again.", 'wp-slimstat' );
808
- }
809
- }
810
- else {
811
- return __( 'Function <code>gzopen</code> is not defined in your environment. Please ask your server administrator to install the corresponding library.', 'wp-slimstat' );
812
- }
813
- }
814
- else{
815
- if ( false === ( $zh = gzopen( $maxmind_tmp, 'rb' ) ) ) {
816
- return __( "There was an error opening the zipped MaxMind Geolite DB. Please check your server's file permissions and try again.", 'wp-slimstat' );
817
- }
818
- }
819
-
820
- if ( false === ( $fh = fopen( self::$maxmind_path, 'wb' ) ) ) {
821
- return __( "There was an error opening the MaxMind Geolite DB. Please check your server's file permissions and try again.", 'wp-slimstat' );
822
- }
823
-
824
- while ( ( $data = gzread( $zh, 4096 ) ) != false ) {
825
- fwrite( $fh, $data );
826
- }
827
-
828
- @gzclose( $zh );
829
- @fclose( $fh );
830
-
831
- if ( !is_file( self::$maxmind_path ) ) {
832
- // Something went wrong, maybe a folder was created instead of a regular file
833
- @rmdir( self::$maxmind_path );
834
- return __( 'There was an error creating the MaxMind Geolite DB.', 'wp-slimstat' );
835
- }
836
-
837
- @unlink( $maxmind_tmp );
838
-
839
- return '';
840
- }
841
-
842
- public static function download_url( $url ) {
843
- // Include the FILE API, if it's not defined
844
- if ( !function_exists( 'download_url' ) ) {
845
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
846
- }
847
-
848
- if ( !$url ) {
849
- return new WP_Error( 'http_no_url', __( 'The provided URL is invalid.', 'wp-slimstat' ) );
850
- }
851
-
852
- $url_filename = basename( parse_url( $url, PHP_URL_PATH ) );
853
-
854
- $tmpfname = wp_tempnam( $url_filename );
855
- if ( ! $tmpfname ) {
856
- return new WP_Error( 'http_no_file', __( "A temporary file could not be created. Please check your server's file permissions and try again.", 'wp-slimstat' ) );
857
- }
858
-
859
- $response = wp_safe_remote_get( $url, array( 'timeout' => 300, 'stream' => true, 'filename' => $tmpfname, 'user-agent' => 'Slimstat Analytics/' . self::$version . '; ' . home_url() ) );
860
-
861
- if ( is_wp_error( $response ) ) {
862
- unlink( $tmpfname );
863
- return $response;
864
- }
865
-
866
- if ( 200 != wp_remote_retrieve_response_code( $response ) ){
867
- unlink( $tmpfname );
868
- return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ) );
869
- }
870
-
871
- return $tmpfname;
872
- }
873
-
874
  public static function slimstat_shortcode( $_attributes = '', $_content = '' ) {
875
  extract( shortcode_atts( array(
876
- 'f' => '', // recent, popular, count, widget
877
- 'w' => '', // column to use (for recent, popular and count) or widget to use
878
- 's' => ' ', // separator
879
- 'o' => 0 // offset for counters
880
- ), $_attributes));
881
 
882
  $output = $where = $as_column = '';
883
  $s = "<span class='slimstat-item-separator'>$s</span>";
@@ -981,7 +825,7 @@ class wp_slimstat {
981
  break;
982
 
983
  case 'country':
984
- $output[ $result_idx ][ $a_column ] .= slim_i18n::get_string( 'c-' . $a_result[ $a_column ] );
985
  break;
986
 
987
  case 'display_name':
@@ -1004,11 +848,11 @@ class wp_slimstat {
1004
  break;
1005
 
1006
  case 'language':
1007
- $output[ $result_idx ][ $a_column ] .= slim_i18n::get_string( 'l-' . $a_result[ $a_column ] );
1008
  break;
1009
 
1010
  case 'platform':
1011
- $output[ $result_idx ][ $a_column ] .= slim_i18n::get_string( $a_result[ $a_column ] );
1012
  break;
1013
 
1014
  case 'post_link':
@@ -1040,7 +884,25 @@ class wp_slimstat {
1040
 
1041
  return $output;
1042
  }
 
 
 
 
 
 
 
1043
 
 
 
 
 
 
 
 
 
 
 
 
1044
  public static function rest_api_response( $_request = array() ) {
1045
  $filters = '';
1046
  if ( !empty( $_request[ 'filters' ] ) ) {
@@ -1089,7 +951,11 @@ class wp_slimstat {
1089
 
1090
  return rest_ensure_response( $response );
1091
  }
 
1092
 
 
 
 
1093
  public static function rest_api_authorization( $_request = array() ) {
1094
  if ( empty( $_request[ 'token' ] ) ) {
1095
  return new WP_Error( 'rest_invalid', esc_html__( '[REST API] Please use a valid token in order to access the REST API endpoint at this URL.', 'wp-slimstat' ), array( 'status' => 400 ) );
@@ -1101,7 +967,11 @@ class wp_slimstat {
1101
 
1102
  return true;
1103
  }
 
1104
 
 
 
 
1105
  public static function register_rest_route() {
1106
  register_rest_route( 'slimstat/v1', '/get', array(
1107
  'methods' => WP_REST_Server::READABLE,
@@ -1129,6 +999,7 @@ class wp_slimstat {
1129
  )
1130
  ) );
1131
  }
 
1132
 
1133
  /**
1134
  * Converts a series of comma separated values into an array
@@ -1141,6 +1012,7 @@ class wp_slimstat {
1141
  return array_filter( array_map( 'trim', explode( ',', $_option ) ) );
1142
  }
1143
  }
 
1144
 
1145
  /**
1146
  * Toggles WordPress filters on date_i18n function
@@ -1160,6 +1032,7 @@ class wp_slimstat {
1160
  remove_all_filters( 'date_i18n' );
1161
  }
1162
  }
 
1163
 
1164
  /**
1165
  * Calls the date_i18n function without filters
@@ -1171,6 +1044,7 @@ class wp_slimstat {
1171
 
1172
  return $date;
1173
  }
 
1174
 
1175
  /**
1176
  * Sets the default values for all the options
@@ -1333,7 +1207,7 @@ class wp_slimstat {
1333
  /**
1334
  * Attach a script to every page to track visitors' screen resolution and other browser-based information
1335
  */
1336
- public static function wp_slimstat_enqueue_tracking_script() {
1337
  // Pass some information to the tracker
1338
  $params = array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) );
1339
 
@@ -1385,6 +1259,7 @@ class wp_slimstat {
1385
  wp_enqueue_script( 'wp_slimstat' );
1386
  wp_localize_script( 'wp_slimstat', 'SlimStatParams', $params );
1387
  }
 
1388
 
1389
  /**
1390
  * Removes old entries from the main table and performs other daily tasks
@@ -1440,9 +1315,10 @@ class wp_slimstat {
1440
  public static function get_optout_html() {
1441
  die( stripslashes( self::$settings[ 'opt_out_message' ] ) );
1442
  }
 
1443
 
1444
  /**
1445
- * Checks for add-on updates
1446
  */
1447
  public static function update_checker() {
1448
  if ( empty( self::$update_checker ) || !is_admin() ) {
@@ -1464,6 +1340,7 @@ class wp_slimstat {
1464
  }
1465
  }
1466
  }
 
1467
 
1468
  public static function add_plugin_manual_download_link( $_links = array(), $_plugin_file = '' ) {
1469
  $a_clean_slug = str_replace( array( 'wp-slimstat-', '/index.php' ), array( '', '' ), $_plugin_file );
@@ -1488,54 +1365,49 @@ class wp_slimstat {
1488
  return $_links;
1489
  }
1490
 
 
 
 
1491
  public static function register_widget() {
1492
  return register_widget( "slimstat_widget" );
1493
  }
 
1494
 
1495
  /**
1496
- * Tries to find the user's REAL IP address
1497
  */
1498
- protected static function _get_remote_ip() {
1499
- $ip_array = array( '', '' );
1500
-
1501
- if ( !empty( $_SERVER[ 'REMOTE_ADDR' ] ) && filter_var( $_SERVER[ 'REMOTE_ADDR' ], FILTER_VALIDATE_IP ) !== false ) {
1502
- $ip_array[ 0 ] = $_SERVER[ 'REMOTE_ADDR' ];
1503
- }
1504
-
1505
- $originating_ip_headers = array( 'X-Forwarded-For', 'HTTP_X_FORWARDED_FOR', 'CF-Connecting-IP', 'HTTP_CLIENT_IP', 'HTTP_X_REAL_IP', 'HTTP_FORWARDED', 'HTTP_X_FORWARDED' );
1506
- foreach ( $originating_ip_headers as $a_header ) {
1507
- if ( !empty( $_SERVER[ $a_header ] ) ) {
1508
- foreach ( explode( ',', $_SERVER[ $a_header ] ) as $a_ip ) {
1509
- if ( filter_var( $a_ip, FILTER_VALIDATE_IP ) !== false && $a_ip != $ip_array[ 0 ] ) {
1510
- $ip_array[ 1 ] = $a_ip;
1511
- break;
1512
- }
1513
- }
1514
- }
1515
- }
1516
-
1517
- return apply_filters( 'slimstat_filter_ip_address', $ip_array );
1518
  }
1519
- // end _get_remote_ip
1520
 
1521
  /**
1522
- * Extracts the accepted language from browser headers
1523
  */
1524
- protected static function _get_language() {
1525
- if ( isset( $_SERVER[ 'HTTP_ACCEPT_LANGUAGE' ] ) ) {
1526
-
1527
- // Capture up to the first delimiter (, found in Safari)
1528
- preg_match( "/([^,;]*)/", $_SERVER[ 'HTTP_ACCEPT_LANGUAGE' ], $array_languages );
1529
-
1530
- // Fix some codes, the correct syntax is with minus (-) not underscore (_)
1531
- return str_replace( '_', '-', strtolower( $array_languages[ 0 ] ) );
1532
  }
1533
- return ''; // Indeterminable language
1534
  }
1535
- // end _get_language
1536
 
1537
  /**
1538
- * Stores the information (array) in the appropriate table and returns the corresponding ID
1539
  */
1540
  protected static function _insert_row( $_data = array(), $_table = '' ) {
1541
  if ( empty( $_data ) || empty( $_table ) ) {
@@ -1570,23 +1442,75 @@ class wp_slimstat {
1570
 
1571
  // Sanitize column names (SQL/XSS injections, anyone?)
1572
  $_data = array_filter( $_data );
1573
- foreach ( array_keys( $_data ) as $a_key ) {
1574
- if ( $a_key != sanitize_key( $a_key ) ) {
1575
- $_data[ sanitize_key( $a_key ) ] = $_data[ $a_key ];
1576
- unset( $_data[ $a_key ] );
1577
- }
 
 
1578
  }
1579
 
1580
- self::$wpdb->update(
1581
- $GLOBALS[ 'wpdb' ]->prefix . 'slim_stats',
1582
- $_data,
1583
- array( 'id' => $id )
1584
- );
 
 
 
 
 
 
 
 
1585
 
1586
  return $id;
1587
  }
1588
  // end _update_row
1589
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1590
  /**
1591
  * Sniffs out referrals from search engines and tries to determine the query string
1592
  */
@@ -1596,46 +1520,59 @@ class wp_slimstat {
1596
  }
1597
 
1598
  $searchterms = '';
1599
- $parsed_url = parse_url( $_url );
1600
-
1601
- // Engines with different character encodings should always be listed here, regardless of their query string format
1602
- $query_strings = array(
1603
- 'baidu.com' => 'wd',
1604
- 'eniro' => 'search_word',
1605
- 'seznam' => 'oq',
1606
- 'virgilio' => 'qs',
1607
- 'voila' => 'rdata',
1608
- 'yandex' => 'text',
1609
- 'yell' => 'keywords',
1610
- 'yippy' => 'query'
1611
- );
1612
 
1613
- $charsets = array( 'baidu' => 'EUC-CN' );
1614
- $regex_match = implode( '|', array_keys( $query_strings ) );
 
 
 
 
 
 
1615
 
1616
- if ( !empty( $parsed_url[ 'query' ] ) ) {
1617
- parse_str( $parsed_url[ 'query' ], $query );
1618
- }
1619
 
1620
- if ( !empty( $parsed_url[ 'host' ] ) ) {
1621
- preg_match( "~($regex_match).~i", $parsed_url[ 'host' ], $matches );
1622
  }
1623
 
1624
- if ( !empty( $matches[ 1 ] ) ) {
1625
- if ( !empty( $query[ $query_strings[ $matches[ 1 ] ] ] ) ) {
1626
- $searchterms = str_replace( '\\', '', trim( urldecode( $query[ $query_strings[ $matches[ 1 ] ] ] ) ) );
1627
-
1628
- // Test for encodings different from UTF-8
1629
- if ( function_exists( 'mb_check_encoding' ) && !mb_check_encoding( $query[ $query_strings[ $matches[ 1 ] ] ], 'UTF-8' ) && !empty( $charsets[ $matches[ 1 ] ] ) ) {
1630
- $searchterms = mb_convert_encoding( urldecode( $query[ $query_strings[ $matches[ 1 ] ] ] ), 'UTF-8', $charsets[ $matches[ 1 ] ] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1631
  }
1632
  }
1633
  }
1634
  else {
1635
  // We weren't lucky, but there's still hope
1636
- foreach( array( 'k', 'q', 'qt', 'query', 's' ) as $a_format ) {
1637
- if ( !empty( $query[ $a_format ] ) ) {
1638
- $searchterms = str_replace( '\\', '', trim( urldecode( $query[ $a_format ] ) ) );
1639
  break;
1640
  }
1641
  }
@@ -1645,6 +1582,20 @@ class wp_slimstat {
1645
  }
1646
  // end _get_search_terms
1647
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1648
  /**
1649
  * Returns details about the resource being accessed
1650
  */
@@ -1756,6 +1707,36 @@ class wp_slimstat {
1756
  }
1757
  // end _get_content_info
1758
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1759
  /**
1760
  * Reads the cookie to get the visit_id and sets the variable accordingly
1761
  */
@@ -1814,29 +1795,8 @@ class wp_slimstat {
1814
  // end _set_visit_id
1815
 
1816
  /**
1817
- * Reads the information sent by the Javascript tracker and adds it to the $_stat array
1818
  */
1819
- protected static function _get_client_info( $_data_js = array(), $_stat = array() ) {
1820
- if ( !empty( $_data_js[ 'bw' ] ) ) {
1821
- $_stat[ 'resolution' ] = strip_tags( trim( $_data_js[ 'bw' ] . 'x' . $_data_js[ 'bh' ] ) );
1822
- }
1823
- if ( !empty( $_data_js[ 'sw' ] ) ) {
1824
- $_stat[ 'screen_width' ] = intval( $_data_js[ 'sw' ] );
1825
- }
1826
- if ( !empty( $_data_js[ 'sh' ] ) ) {
1827
- $_stat[ 'screen_height' ] = intval( $_data_js[ 'sh' ] );
1828
- }
1829
- if ( !empty( $_data_js[ 'sl' ] ) && $_data_js[ 'sl' ] > 0 && $_data_js[ 'sl' ] < 60000 ) {
1830
- $_stat[ 'server_latency' ] = intval( $_data_js[ 'sl' ] );
1831
- }
1832
- if ( !empty( $_data_js[ 'pp' ] ) && $_data_js[ 'pp' ] > 0 && $_data_js[ 'pp' ] < 60000 ) {
1833
- $_stat[ 'page_performance' ] = intval( $_data_js[ 'pp' ] );
1834
- }
1835
-
1836
- return $_stat;
1837
- }
1838
- // end _get_client_info
1839
-
1840
  protected static function _log_error( $_error_code = 0 ) {
1841
  // Save this error in the database
1842
  self::update_option( 'slimstat_tracker_error', array( $_error_code, self::date_i18n( 'U' ) ) );
@@ -1846,6 +1806,7 @@ class wp_slimstat {
1846
 
1847
  return -$_error_code;
1848
  }
 
1849
 
1850
  protected static function _get_value_with_checksum( $_value = 0 ) {
1851
  return $_value . '.' . md5( $_value . self::$settings[ 'secret' ] );
@@ -1861,6 +1822,9 @@ class wp_slimstat {
1861
  return false;
1862
  }
1863
 
 
 
 
1864
  protected static function _is_blacklisted( $_needles = array(), $_haystack_string = '' ) {
1865
  foreach ( self::string_to_array( $_haystack_string ) as $a_item ) {
1866
  $pattern = str_replace( array( '\*', '\!' ) , array( '(.*)', '.' ), preg_quote( $a_item, '@' ) );
@@ -1878,13 +1842,70 @@ class wp_slimstat {
1878
 
1879
  return false;
1880
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1881
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1882
  protected static function _base64_url_encode( $_input = '' ) {
1883
  return strtr( base64_encode( $_input ), '+/=', '._-' );
1884
  }
1885
  protected static function _base64_url_decode( $_input = '' ) {
1886
  return strip_tags( trim( base64_decode( strtr( $_input, '._-', '+/=' ) ) ) );
1887
  }
 
1888
  }
1889
  // end of class declaration
1890
 
@@ -1906,11 +1927,16 @@ class slimstat_widget extends WP_Widget {
1906
  * @param array $args
1907
  * @param array $instance
1908
  */
1909
- public function widget( $args, $instance ) {
1910
- extract( $instance );
1911
-
1912
- $slimstat_widget_filters = empty( $slimstat_widget_filters ) ? '' : $slimstat_widget_filters;
 
 
1913
 
 
 
 
1914
  if ( !empty( $slimstat_widget_id ) ) {
1915
  echo do_shortcode( "[slimstat f='widget' w='{$slimstat_widget_id}']{$slimstat_widget_filters}[/slimstat]" );
1916
  }
@@ -1924,13 +1950,17 @@ class slimstat_widget extends WP_Widget {
1924
  *
1925
  * @param array $instance The widget options
1926
  */
1927
- public function form( $instance ) {
 
 
 
 
 
 
1928
  // Let's build the dropdown
1929
  include_once( plugin_dir_path( __FILE__ ) . 'admin/view/wp-slimstat-reports.php' );
1930
  wp_slimstat_reports::init();
1931
  $select_options = '';
1932
- $slimstat_widget_id = !empty( $instance[ 'slimstat_widget_id' ] ) ? $instance[ 'slimstat_widget_id' ] : '';
1933
- $slimstat_widget_filters = !empty( $instance[ 'slimstat_widget_filters' ] ) ? $instance[ 'slimstat_widget_filters' ] : '';
1934
 
1935
  foreach ( wp_slimstat_reports::$reports as $a_report_id => $a_report_info ) {
1936
  $select_options .= "<option value='$a_report_id' " . ( ( $slimstat_widget_id == $a_report_id ) ? 'selected="selected"' : '' ) . ">{$a_report_info[ 'title' ]}</option>";
@@ -1938,13 +1968,18 @@ class slimstat_widget extends WP_Widget {
1938
  ?>
1939
 
1940
  <p>
1941
- <label for="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_id' ) ); ?>">Widget</label>
1942
  <select class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_id' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'slimstat_widget_id' ) ); ?>">
1943
  <option value="">Select a widget</option>
1944
  <?php echo $select_options ?>
1945
  </select>
1946
  </p>
1947
 
 
 
 
 
 
1948
  <p>
1949
  <label for="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_filters' ) ); ?>"><?php _e( 'Optional filters', 'wp-slimstat' ); ?></label>
1950
  <a href="https://slimstat.freshdesk.com/solution/articles/5000631833-what-is-the-syntax-of-a-slimstat-shortcode-#slimstat-operators" target="_blank">[?]</a>
@@ -1959,11 +1994,12 @@ class slimstat_widget extends WP_Widget {
1959
  * @param array $new_instance The new options
1960
  * @param array $old_instance The previous options
1961
  */
1962
- public function update( $new_instance, $old_instance ) {
1963
- $instance = $old_instance;
1964
 
1965
- $instance[ 'slimstat_widget_id' ] = $new_instance[ 'slimstat_widget_id' ];
1966
- $instance[ 'slimstat_widget_filters' ] = $new_instance[ 'slimstat_widget_filters' ];
 
1967
  return $instance;
1968
  }
1969
  }
3
  Plugin Name: Slimstat Analytics
4
  Plugin URI: https://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
+ Version: 4.8.8
7
  Author: Jason Crouse
8
  Author URI: https://www.wp-slimstat.com/
9
  Text Domain: wp-slimstat
15
  }
16
 
17
  class wp_slimstat {
18
+ public static $version = '4.8.8';
19
  public static $settings = array();
20
 
21
  public static $wpdb = '';
22
  public static $upload_dir = '';
 
23
 
24
  public static $update_checker = array();
25
  public static $raw_post_array = array();
69
  self::$upload_dir = apply_filters( 'slimstat_maxmind_path', self::$upload_dir );
70
  }
71
 
 
 
72
  // Allow add-ons to turn off the tracker based on other conditions
73
  $is_tracking_filter = apply_filters( 'slimstat_filter_pre_tracking', strpos( self::get_request_uri(), 'wp-admin/admin-ajax.php' ) === false );
74
  $is_tracking_filter_js = apply_filters( 'slimstat_filter_pre_tracking_js', true );
86
  }
87
 
88
  // Slimstat tracks screen resolutions, outbound links and other client-side information using a client-side tracker
89
+ add_action( is_admin() ? 'admin_enqueue_scripts' : 'wp_enqueue_scripts' , array( __CLASS__, 'enqueue_tracker' ), 15 );
90
  if ( self::$settings[ 'ignore_wp_users' ] != 'on' ) {
91
+ add_action( 'login_enqueue_scripts', array( __CLASS__, 'enqueue_tracker' ), 10 );
92
  }
93
  }
94
 
127
  // end init
128
 
129
  /**
130
+ * Reads and processes the data received by the XHR tracker
131
  */
132
  public static function slimtrack_ajax() {
133
  // If the website is using a caching plugin, the tracking code might still be there, even if the user turned off tracking
148
  if ( $parsed_ref === false ) {
149
  exit( self::_log_error( 201 ) );
150
  }
 
 
 
 
151
  }
152
 
153
  // Do we have an id for this request? If we do, we are either updating an existing pageview, or recording an event on the page
173
  // Retrieves all the client-side info (screen resolution, server latency, etc) and sets the corresponding entries in self::$stat
174
  self::$stat = self::_get_client_info( self::$data_js, self::$stat );
175
 
176
+ // Visitor is still on this page, record the timestamp in the corresponding field if this WAS NOT a request to update a "server-side" pageview with client-side info
177
+ if ( empty( self::$stat[ 'resolution' ] ) ) {
178
+ self::$stat[ 'dt_out' ] = self::date_i18n( 'U' );
179
+ }
180
+
181
+ // Is this a new visitor, based on his fingerprint?
182
+ if ( !empty( self::$stat[ 'fingerprint' ] ) && self::_is_new_visitor( self::$stat[ 'fingerprint' ] ) ) {
183
+ self::$stat[ 'notes' ] = array( 'new:yes' );
184
+ }
185
+
186
  $id = self::_update_row( self::$stat );
187
  }
188
  // ... otherwise, is this an event: a click on a link (maybe a 'download'?) or other user action
200
 
201
  self::_insert_row( $event_info, $GLOBALS[ 'wpdb' ]->prefix . 'slim_events' );
202
 
 
 
 
203
  if ( !empty( self::$data_js[ 'res' ] ) ) {
204
  $resource = self::_base64_url_decode( self::$data_js[ 'res' ] );
205
  $parsed_resource = parse_url( $resource );
207
  if ( $parsed_resource === false ) {
208
  exit( self::_log_error( 203 ) );
209
  }
 
210
 
211
+ // Is this a download? If it is, add a new record to the database
212
+ if ( in_array( pathinfo( $resource, PATHINFO_EXTENSION ), self::string_to_array( self::$settings[ 'extensions_to_track' ] ) ) && !empty( $parsed_resource[ 'path' ] ) ) {
213
+ self::$stat[ 'resource' ] = $parsed_resource[ 'path' ];
214
+ self::$stat[ 'content_type' ] = 'download';
215
 
216
+ if ( !empty( self::$data_js[ 'fh' ] ) ) {
217
+ self::$stat[ 'fingerprint' ] = sanitize_text_field( self::$data_js[ 'fh' ] );
218
+ }
219
+
220
+ $id = self::slimtrack();
 
221
  }
222
+ // .. or outbound link? If so, update the pageview with the new info
223
+ else if ( $parsed_resource[ 'host' ] != $site_host ) {
224
+ self::$stat[ 'outbound_resource' ] = $resource;
225
 
226
+ // Visitor is still on this page, record the timestamp in the corresponding field
227
+ self::$stat[ 'dt_out' ] = self::date_i18n( 'U' );
228
+
229
+ $id = self::_update_row( self::$stat );
230
+ }
231
+ }
232
+ else {
233
  // Visitor is still on this page, record the timestamp in the corresponding field
234
  self::$stat[ 'dt_out' ] = self::date_i18n( 'U' );
235
 
275
  self::$stat[ 'content_type' ] = 'external';
276
  }
277
 
278
+ // Is this a new visitor, based on his fingerprint?
279
+ if ( !empty( self::$stat[ 'fingerprint' ] ) && self::_is_new_visitor( self::$stat[ 'fingerprint' ] ) ) {
280
+ self::$stat[ 'notes' ] = array( 'new:yes' );
281
+ }
282
+
283
  // Track the rest of the information related to this pageview
284
  $id = self::slimtrack();
285
  }
293
  do_action( 'slimstat_track_success' );
294
  exit( self::_get_value_with_checksum( $id ) );
295
  }
296
+ // end slimtrack_ajax
297
 
298
  /**
299
+ * THE Slimstat tracker
300
  */
301
  public static function slimtrack() {
302
  self::$stat[ 'dt' ] = self::date_i18n( 'U' );
303
+
304
+ if ( empty( self::$stat[ 'notes' ] ) ) {
305
+ self::$stat[ 'notes' ] = array();
306
+ }
307
 
308
  // Allow third-party tools to initialize the stat array
309
  self::$stat = apply_filters( 'slimstat_filter_pageview_stat_init', self::$stat );
380
  list( $ip_to_ignore, $cidr_mask ) = explode( '/', trim( $ip_to_ignore ) );
381
  }
382
  else{
383
+ $cidr_mask = self::_get_mask_length( $ip_to_ignore );
384
  }
385
 
386
+ $long_masked_ip_to_ignore = substr( self::_dtr_pton( $ip_to_ignore ), 0, $cidr_mask );
387
+ $long_masked_user_ip = substr( self::_dtr_pton( self::$stat[ 'ip' ] ), 0, $cidr_mask );
388
+ $long_masked_user_other_ip = substr( self::_dtr_pton( self::$stat[ 'other_ip' ] ), 0 , $cidr_mask );
389
 
390
  if ( $long_masked_user_ip === $long_masked_ip_to_ignore || $long_masked_user_other_ip === $long_masked_ip_to_ignore ) {
391
  return false;
397
  // IPv4 or IPv6
398
  $needle = '.';
399
  $replace = '.0';
400
+ if ( self::_get_mask_length( self::$stat[ 'ip' ] ) == 128 ) {
401
  $needle = ':';
402
  $replace = ':0000';
403
  }
435
  }
436
 
437
  if ( !empty( self::$stat[ 'referer' ] ) ) {
 
438
  // Is this a 'seriously malformed' URL?
439
  $parsed_url = parse_url( self::$stat[ 'referer' ] );
440
  if ( !$parsed_url ) {
447
  unset( self::$stat[ 'referer' ] );
448
  }
449
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450
  // Is this referer blacklisted?
451
  if ( !empty( self::$settings[ 'ignore_referers' ] ) && self::_is_blacklisted( self::$stat[ 'referer' ], self::$settings[ 'ignore_referers' ] ) ) {
452
  return false;
453
  }
 
454
 
455
+ // Search terms
 
 
 
 
456
  self::$stat[ 'searchterms' ] = self::_get_search_terms( self::$stat[ 'referer' ] );
457
+
458
+ // Are we storing internal referrers in the database?
459
+ $parsed_site_url = parse_url( get_site_url(), PHP_URL_HOST );
460
+ if ( !empty( $parsed_url[ 'host' ] ) && $parsed_url[ 'host' ] == $parsed_site_url && self::$settings[ 'track_same_domain_referers' ] != 'on' ) {
461
+ unset( self::$stat[ 'referer' ] );
462
+ }
463
  }
464
+
465
+ // Internal WP search?
466
+ if ( empty( self::$stat[ 'searchterms' ] ) && !empty( $_POST[ 's' ] ) ) {
467
  self::$stat[ 'searchterms' ] = sanitize_text_field( str_replace( '\\', '', $_REQUEST[ 's' ] ) );
468
  }
469
 
553
  }
554
 
555
  // Geolocation
556
+ include_once( plugin_dir_path( __FILE__ ) . 'vendor/maxmind.php' );
557
  try {
558
  $geolocation_data = maxmind_geolite2_connector::get_geolocation_info( self::$stat[ 'ip' ] );
559
  }
629
 
630
  // Implode the notes
631
  if ( !empty( self::$stat[ 'notes' ] ) ) {
632
+ self::$stat[ 'notes' ] = '[' . implode( '][', self::$stat[ 'notes' ] ) . ']';
633
  }
634
 
635
  // Remove empty values
704
  }
705
  // end get_request_uri
706
 
 
 
 
 
 
 
 
 
 
 
 
 
707
  public static function is_local_ip_address( $ip_address = '' ) {
708
  if ( !filter_var( $ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) {
709
  return true;
712
  return false;
713
  }
714
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
715
  /**
716
+ * Implements the Slimstat Shortcode API
717
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
718
  public static function slimstat_shortcode( $_attributes = '', $_content = '' ) {
719
  extract( shortcode_atts( array(
720
+ 'f' => '', // recent, popular, count, widget
721
+ 'w' => '', // column to use (for recent, popular and count) or widget to use
722
+ 's' => ' ', // separator
723
+ 'o' => 0 // offset for counters
724
+ ), $_attributes ) );
725
 
726
  $output = $where = $as_column = '';
727
  $s = "<span class='slimstat-item-separator'>$s</span>";
825
  break;
826
 
827
  case 'country':
828
+ $output[ $result_idx ][ $a_column ] .= wp_slimstat_i18n::get_string( 'c-' . $a_result[ $a_column ] );
829
  break;
830
 
831
  case 'display_name':
848
  break;
849
 
850
  case 'language':
851
+ $output[ $result_idx ][ $a_column ] .= wp_slimstat_i18n::get_string( 'l-' . $a_result[ $a_column ] );
852
  break;
853
 
854
  case 'platform':
855
+ $output[ $result_idx ][ $a_column ] .= wp_slimstat_i18n::get_string( $a_result[ $a_column ] );
856
  break;
857
 
858
  case 'post_link':
884
 
885
  return $output;
886
  }
887
+ // end slimstat_shortcode
888
+
889
+ /**
890
+ * Opens given domains during CORS requests to admin-ajax.php
891
+ */
892
+ public static function open_cors_admin_ajax( $_allowed_origins = array() ) {
893
+ $exploded_domains = self::string_to_array( self::$settings[ 'external_domains' ] );
894
 
895
+ if ( !empty( $exploded_domains ) && !empty( $exploded_domains[ 0 ] ) ) {
896
+ $_allowed_origins = array_merge( $_allowed_origins, $exploded_domains );
897
+ }
898
+
899
+ return $_allowed_origins;
900
+ }
901
+ // end open_cors_admin_ajax
902
+
903
+ /**
904
+ * Implements a REST API interface to retrieve Slimstat reports and metrics
905
+ */
906
  public static function rest_api_response( $_request = array() ) {
907
  $filters = '';
908
  if ( !empty( $_request[ 'filters' ] ) ) {
951
 
952
  return rest_ensure_response( $response );
953
  }
954
+ // end rest_api_response
955
 
956
+ /**
957
+ * Implements a REST API authentication mechanism via token
958
+ */
959
  public static function rest_api_authorization( $_request = array() ) {
960
  if ( empty( $_request[ 'token' ] ) ) {
961
  return new WP_Error( 'rest_invalid', esc_html__( '[REST API] Please use a valid token in order to access the REST API endpoint at this URL.', 'wp-slimstat' ), array( 'status' => 400 ) );
967
 
968
  return true;
969
  }
970
+ // end rest_api_authorization
971
 
972
+ /**
973
+ * Registers a new REST API route for the Slimstat endpoint
974
+ */
975
  public static function register_rest_route() {
976
  register_rest_route( 'slimstat/v1', '/get', array(
977
  'methods' => WP_REST_Server::READABLE,
999
  )
1000
  ) );
1001
  }
1002
+ // end register_rest_route
1003
 
1004
  /**
1005
  * Converts a series of comma separated values into an array
1012
  return array_filter( array_map( 'trim', explode( ',', $_option ) ) );
1013
  }
1014
  }
1015
+ // end string_to_array
1016
 
1017
  /**
1018
  * Toggles WordPress filters on date_i18n function
1032
  remove_all_filters( 'date_i18n' );
1033
  }
1034
  }
1035
+ // end toggle_date_i18n_filters
1036
 
1037
  /**
1038
  * Calls the date_i18n function without filters
1044
 
1045
  return $date;
1046
  }
1047
+ // end date_i18n
1048
 
1049
  /**
1050
  * Sets the default values for all the options
1207
  /**
1208
  * Attach a script to every page to track visitors' screen resolution and other browser-based information
1209
  */
1210
+ public static function enqueue_tracker() {
1211
  // Pass some information to the tracker
1212
  $params = array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) );
1213
 
1259
  wp_enqueue_script( 'wp_slimstat' );
1260
  wp_localize_script( 'wp_slimstat', 'SlimStatParams', $params );
1261
  }
1262
+ // end enqueue_tracker
1263
 
1264
  /**
1265
  * Removes old entries from the main table and performs other daily tasks
1315
  public static function get_optout_html() {
1316
  die( stripslashes( self::$settings[ 'opt_out_message' ] ) );
1317
  }
1318
+ // end get_optout_html
1319
 
1320
  /**
1321
+ * Checks for add-on updates, using the third-party library PUC
1322
  */
1323
  public static function update_checker() {
1324
  if ( empty( self::$update_checker ) || !is_admin() ) {
1340
  }
1341
  }
1342
  }
1343
+ // end update_checker
1344
 
1345
  public static function add_plugin_manual_download_link( $_links = array(), $_plugin_file = '' ) {
1346
  $a_clean_slug = str_replace( array( 'wp-slimstat-', '/index.php' ), array( '', '' ), $_plugin_file );
1365
  return $_links;
1366
  }
1367
 
1368
+ /**
1369
+ * Registers the Slimstat widget
1370
+ */
1371
  public static function register_widget() {
1372
  return register_widget( "slimstat_widget" );
1373
  }
1374
+ // end register_widget
1375
 
1376
  /**
1377
+ * Generates the key to see if a given host is listed as a search engine in the corresponding Json data file
1378
  */
1379
+ public static function get_lossy_url( $_url = '' ) {
1380
+ return preg_replace(
1381
+ array(
1382
+ '/^(w+[0-9]*|search)\./',
1383
+ '/(^|\.)m\./',
1384
+ '/(\.(com|org|net|co|it|edu))?\.(ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bl|bm|bn|bo|bq|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mf|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(\/|$)/',
1385
+ '/(^|\.)(ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bl|bm|bn|bo|bq|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mf|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)\./',
1386
+ ),
1387
+ array(
1388
+ '',
1389
+ '$1',
1390
+ '.{}$4',
1391
+ '$1{}.',
1392
+ ),
1393
+ $_url );
 
 
 
 
 
1394
  }
1395
+ // end get_lossy_url
1396
 
1397
  /**
1398
+ * Update content type as needed
1399
  */
1400
+ public static function update_content_type( $_status = 301, $_location = '' ) {
1401
+ if ( $_status >= 300 && $_status < 400 ) {
1402
+ // SEE WHY THIS DOESN'T WORK?!
1403
+ self::$stat[ 'content_type' ] = 'redirect:' . intval( $_status );
1404
+ self::_update_row( self::$stat );
 
 
 
1405
  }
 
1406
  }
1407
+ // end update_content_type
1408
 
1409
  /**
1410
+ * Stores the pageview information in the database and returns the ID associated to the new entry
1411
  */
1412
  protected static function _insert_row( $_data = array(), $_table = '' ) {
1413
  if ( empty( $_data ) || empty( $_table ) ) {
1442
 
1443
  // Sanitize column names (SQL/XSS injections, anyone?)
1444
  $_data = array_filter( $_data );
1445
+
1446
+ // The 'notes' column stores multiple comma-separated values: we need to append the new value to the existing ones
1447
+ // Also, values are organized in an array, which we need to implode as a string
1448
+ $notes = '';
1449
+ if ( !empty( $_data[ 'notes' ] ) && is_array( $_data[ 'notes' ] ) ) {
1450
+ $notes = ( count( $_data ) > 1 ? ',' : '' ) . "notes=CONCAT( IFNULL( notes, '' ), '[" . esc_sql( implode( '][', $_data[ 'notes' ] ) ) . "]' )";
1451
+ unset( $_data[ 'notes' ] );
1452
  }
1453
 
1454
+ $prepared_query = self::$wpdb->prepare( "
1455
+ UPDATE IGNORE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats
1456
+ SET " . implode( '=%s,', array_keys( $_data ) ) . "=%s
1457
+ WHERE id = $id
1458
+ ", $_data );
1459
+
1460
+ // Add the notes
1461
+ if ( !empty( $notes ) ) {
1462
+ $prepared_query = str_replace( 'WHERE id =', $notes . ' WHERE id =', $prepared_query );
1463
+ }
1464
+
1465
+ // Save the data in the database
1466
+ self::$wpdb->query( $prepared_query );
1467
 
1468
  return $id;
1469
  }
1470
  // end _update_row
1471
 
1472
+ /**
1473
+ * Tries to find the user's REAL IP address
1474
+ */
1475
+ protected static function _get_remote_ip() {
1476
+ $ip_array = array( '', '' );
1477
+
1478
+ if ( !empty( $_SERVER[ 'REMOTE_ADDR' ] ) && filter_var( $_SERVER[ 'REMOTE_ADDR' ], FILTER_VALIDATE_IP ) !== false ) {
1479
+ $ip_array[ 0 ] = $_SERVER[ 'REMOTE_ADDR' ];
1480
+ }
1481
+
1482
+ $originating_ip_headers = array( 'X-Forwarded-For', 'HTTP_X_FORWARDED_FOR', 'CF-Connecting-IP', 'HTTP_CLIENT_IP', 'HTTP_X_REAL_IP', 'HTTP_FORWARDED', 'HTTP_X_FORWARDED' );
1483
+ foreach ( $originating_ip_headers as $a_header ) {
1484
+ if ( !empty( $_SERVER[ $a_header ] ) ) {
1485
+ foreach ( explode( ',', $_SERVER[ $a_header ] ) as $a_ip ) {
1486
+ if ( filter_var( $a_ip, FILTER_VALIDATE_IP ) !== false && $a_ip != $ip_array[ 0 ] ) {
1487
+ $ip_array[ 1 ] = $a_ip;
1488
+ break;
1489
+ }
1490
+ }
1491
+ }
1492
+ }
1493
+
1494
+ return apply_filters( 'slimstat_filter_ip_address', $ip_array );
1495
+ }
1496
+ // end _get_remote_ip
1497
+
1498
+ /**
1499
+ * Extracts the accepted language from browser headers
1500
+ */
1501
+ protected static function _get_language() {
1502
+ if ( isset( $_SERVER[ 'HTTP_ACCEPT_LANGUAGE' ] ) ) {
1503
+
1504
+ // Capture up to the first delimiter (, found in Safari)
1505
+ preg_match( "/([^,;]*)/", $_SERVER[ 'HTTP_ACCEPT_LANGUAGE' ], $array_languages );
1506
+
1507
+ // Fix some codes, the correct syntax is with minus (-) not underscore (_)
1508
+ return str_replace( '_', '-', strtolower( $array_languages[ 0 ] ) );
1509
+ }
1510
+ return ''; // Indeterminable language
1511
+ }
1512
+ // end _get_language
1513
+
1514
  /**
1515
  * Sniffs out referrals from search engines and tries to determine the query string
1516
  */
1520
  }
1521
 
1522
  $searchterms = '';
 
 
 
 
 
 
 
 
 
 
 
 
 
1523
 
1524
+ // Load the search engines list to mark pageviews accordingly
1525
+ // Each entry contains the following attributes
1526
+ // - params: which query string params is associated to the search keyword
1527
+ // - backlink: format of the URL point to the search engine result page
1528
+ // - charsets: list of charset used to encode the keywords
1529
+ //
1530
+ $search_engines = file_get_contents( plugin_dir_path( __FILE__ ) . 'vendor/matomo-searchengine.json' );
1531
+ $search_engines = json_decode( $search_engines, TRUE );
1532
 
1533
+ $parsed_url = @parse_url( $_url );
 
 
1534
 
1535
+ if ( empty( $search_engines ) || empty( $parsed_url ) || empty( $parsed_url[ 'host' ] ) ) {
1536
+ return '';
1537
  }
1538
 
1539
+ $sek = self::get_lossy_url( $parsed_url[ 'host' ] );
1540
+
1541
+ if ( !empty( $search_engines[ $sek ] ) ) {
1542
+ if ( empty( $search_engines[ $sek ][ 'params' ] ) ) {
1543
+ $search_engines[ $sek ][ 'params' ] = array( 'q' );
1544
+ }
1545
+
1546
+ foreach ( $search_engines[ $sek ][ 'params' ] as $a_param ) {
1547
+ $searchterms = self::_get_param_from_query_string( $parsed_url[ 'query' ], $a_param );
1548
+ if ( !empty( $searchterms ) ) {
1549
+ break;
1550
+ }
1551
+ }
1552
+
1553
+ // Make sure to use the appropriate charset, if specified
1554
+ if ( !empty( $searchterms ) ) {
1555
+ if ( !empty( $search_engines[ 'charsets' ] ) && function_exists( 'iconv' ) ) {
1556
+ $charset = $search_engines[ 'charsets' ][ 0 ];
1557
+ if ( count( $search_engines[ 'charsets' ] ) > 1 && function_exists( 'mb_detect_encoding' ) ) {
1558
+ $charset = mb_detect_encoding( $searchterms, $search_engines[ 'charsets' ] );
1559
+ if ( $charset === false ) {
1560
+ $charset = $search_engines[ 'charsets' ][ 0 ];
1561
+ }
1562
+ }
1563
+
1564
+ $new_searchterms = @iconv( $charset, 'UTF-8//IGNORE', $searchterms );
1565
+ if ( !empty( $new_searchterms ) ) {
1566
+ $searchterms = $new_searchterms;
1567
+ }
1568
  }
1569
  }
1570
  }
1571
  else {
1572
  // We weren't lucky, but there's still hope
1573
+ foreach( array( 'ask', 'k', 'q', 'qs', 'qt', 'query', 's', 'string' ) as $a_param ) {
1574
+ $searchterms = self::_get_param_from_query_string( $parsed_url[ 'query' ], $a_param );
1575
+ if ( !empty( $searchterms ) ) {
1576
  break;
1577
  }
1578
  }
1582
  }
1583
  // end _get_search_terms
1584
 
1585
+ /**
1586
+ * Retrieves a param value from a string treated as a URL query string
1587
+ */
1588
+ protected static function _get_param_from_query_string( $_query = '', $_parameter = '' ) {
1589
+ if ( empty( $_query ) ) {
1590
+ return '';
1591
+ }
1592
+
1593
+ $parsed_query = @parse_str( $_query, $values );
1594
+
1595
+ return !empty( $values[ $_parameter ] ) ? $values[ $_parameter ] : '';
1596
+ }
1597
+ // end _get_param_from_query_string
1598
+
1599
  /**
1600
  * Returns details about the resource being accessed
1601
  */
1707
  }
1708
  // end _get_content_info
1709
 
1710
+ /**
1711
+ * Reads the information sent by the Javascript tracker and adds it to the $_stat array
1712
+ */
1713
+ protected static function _get_client_info( $_data_js = array(), $_stat = array() ) {
1714
+ if ( !empty( $_data_js[ 'bw' ] ) ) {
1715
+ $_stat[ 'resolution' ] = strip_tags( trim( $_data_js[ 'bw' ] . 'x' . $_data_js[ 'bh' ] ) );
1716
+ }
1717
+ if ( !empty( $_data_js[ 'sw' ] ) ) {
1718
+ $_stat[ 'screen_width' ] = intval( $_data_js[ 'sw' ] );
1719
+ }
1720
+ if ( !empty( $_data_js[ 'sh' ] ) ) {
1721
+ $_stat[ 'screen_height' ] = intval( $_data_js[ 'sh' ] );
1722
+ }
1723
+ if ( !empty( $_data_js[ 'sl' ] ) && $_data_js[ 'sl' ] > 0 && $_data_js[ 'sl' ] < 60000 ) {
1724
+ $_stat[ 'server_latency' ] = intval( $_data_js[ 'sl' ] );
1725
+ }
1726
+ if ( !empty( $_data_js[ 'pp' ] ) && $_data_js[ 'pp' ] > 0 && $_data_js[ 'pp' ] < 60000 ) {
1727
+ $_stat[ 'page_performance' ] = intval( $_data_js[ 'pp' ] );
1728
+ }
1729
+ if ( !empty( $_data_js[ 'fh' ] ) ) {
1730
+ $_stat[ 'fingerprint' ] = sanitize_text_field( $_data_js[ 'fh' ] );
1731
+ }
1732
+ if ( !empty( $_data_js[ 'tz' ] ) ) {
1733
+ $_stat[ 'tz_offset' ] = intval( $_data_js[ 'tz' ] );
1734
+ }
1735
+
1736
+ return $_stat;
1737
+ }
1738
+ // end _get_client_info
1739
+
1740
  /**
1741
  * Reads the cookie to get the visit_id and sets the variable accordingly
1742
  */
1795
  // end _set_visit_id
1796
 
1797
  /**
1798
+ * Saves an error detected by the tracker in the database
1799
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1800
  protected static function _log_error( $_error_code = 0 ) {
1801
  // Save this error in the database
1802
  self::update_option( 'slimstat_tracker_error', array( $_error_code, self::date_i18n( 'U' ) ) );
1806
 
1807
  return -$_error_code;
1808
  }
1809
+ // end _log_error
1810
 
1811
  protected static function _get_value_with_checksum( $_value = 0 ) {
1812
  return $_value . '.' . md5( $_value . self::$settings[ 'secret' ] );
1822
  return false;
1823
  }
1824
 
1825
+ /**
1826
+ * Determines if a given string is listed in the corresponding 'exclusion' field
1827
+ */
1828
  protected static function _is_blacklisted( $_needles = array(), $_haystack_string = '' ) {
1829
  foreach ( self::string_to_array( $_haystack_string ) as $a_item ) {
1830
  $pattern = str_replace( array( '\*', '\!' ) , array( '(.*)', '.' ), preg_quote( $a_item, '@' ) );
1842
 
1843
  return false;
1844
  }
1845
+ // end _is_blacklisted
1846
+
1847
+ /**
1848
+ * Determines if this is a new visitor, meaning that we've never seen this fingerprint before
1849
+ */
1850
+ protected static function _is_new_visitor( $_fingerprint = '' ) {
1851
+ $count_fingerprint = self::$wpdb->get_var( self::$wpdb->prepare( "
1852
+ SELECT COUNT( id )
1853
+ FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_stats
1854
+ WHERE fingerprint = %s", $_fingerprint
1855
+ ) );
1856
+
1857
+ return $count_fingerprint == 0;
1858
+ }
1859
+ // end _is_new_visitor
1860
+
1861
+ /**
1862
+ * Validates and unpacks an IP Address
1863
+ */
1864
+ protected static function _dtr_pton( $_ip ){
1865
+ if ( filter_var( $_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
1866
+ $unpacked = unpack( 'A4', inet_pton( $_ip ) );
1867
+ }
1868
+ else if ( filter_var( $_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) && defined( 'AF_INET6' ) ) {
1869
+ $unpacked = unpack( 'A16', inet_pton( $_ip ) );
1870
+ }
1871
+
1872
+ $binary_ip = '';
1873
+ if ( !empty( $unpacked ) ) {
1874
+ $unpacked = str_split( $unpacked[ 1 ] );
1875
+ foreach ( $unpacked as $char ) {
1876
+ $binary_ip .= str_pad( decbin( ord( $char ) ), 8, '0', STR_PAD_LEFT );
1877
+ }
1878
+ }
1879
+
1880
+ return $binary_ip;
1881
+ }
1882
+ // end _dtr_pton
1883
 
1884
+ /**
1885
+ * Helper function to determine if we should ignore visits coming from this IP address
1886
+ */
1887
+ protected static function _get_mask_length( $ip ){
1888
+ if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
1889
+ return 32;
1890
+ }
1891
+ else if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
1892
+ return 128;
1893
+ }
1894
+
1895
+ return false;
1896
+ }
1897
+ // end _get_mask_length
1898
+
1899
+ /**
1900
+ * These two functions here implement an URL-safe base64 string
1901
+ */
1902
  protected static function _base64_url_encode( $_input = '' ) {
1903
  return strtr( base64_encode( $_input ), '+/=', '._-' );
1904
  }
1905
  protected static function _base64_url_decode( $_input = '' ) {
1906
  return strip_tags( trim( base64_decode( strtr( $_input, '._-', '+/=' ) ) ) );
1907
  }
1908
+ // end _base64_url_encode/decode
1909
  }
1910
  // end of class declaration
1911
 
1927
  * @param array $args
1928
  * @param array $instance
1929
  */
1930
+ public function widget( $_args = array(), $_instance = array() ) {
1931
+ extract( shortcode_atts( array(
1932
+ 'slimstat_widget_id' => '',
1933
+ 'slimstat_widget_title' => '',
1934
+ 'slimstat_widget_filters' => ''
1935
+ ), $_instance ) );
1936
 
1937
+ if ( !empty( $slimstat_widget_title ) ) {
1938
+ echo ( !empty( $_args[ 'before_title' ] ) ? $_args[ 'before_title' ] : '<h2 class="widget-title">' ) . $slimstat_widget_title . ( !empty( $_args[ 'after_title' ] ) ? $_args[ 'after_title' ] : '</h2>' );
1939
+ }
1940
  if ( !empty( $slimstat_widget_id ) ) {
1941
  echo do_shortcode( "[slimstat f='widget' w='{$slimstat_widget_id}']{$slimstat_widget_filters}[/slimstat]" );
1942
  }
1950
  *
1951
  * @param array $instance The widget options
1952
  */
1953
+ public function form( $_instance ) {
1954
+ extract( shortcode_atts( array(
1955
+ 'slimstat_widget_id' => '',
1956
+ 'slimstat_widget_title' => '',
1957
+ 'slimstat_widget_filters' => ''
1958
+ ), $_instance ) );
1959
+
1960
  // Let's build the dropdown
1961
  include_once( plugin_dir_path( __FILE__ ) . 'admin/view/wp-slimstat-reports.php' );
1962
  wp_slimstat_reports::init();
1963
  $select_options = '';
 
 
1964
 
1965
  foreach ( wp_slimstat_reports::$reports as $a_report_id => $a_report_info ) {
1966
  $select_options .= "<option value='$a_report_id' " . ( ( $slimstat_widget_id == $a_report_id ) ? 'selected="selected"' : '' ) . ">{$a_report_info[ 'title' ]}</option>";
1968
  ?>
1969
 
1970
  <p>
1971
+ <label for="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_id' ) ); ?>"><?php _e( 'Report', 'wp-slimstat' ) ?></label>
1972
  <select class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_id' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'slimstat_widget_id' ) ); ?>">
1973
  <option value="">Select a widget</option>
1974
  <?php echo $select_options ?>
1975
  </select>
1976
  </p>
1977
 
1978
+ <p>
1979
+ <label for="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_title' ) ); ?>"><?php _e( 'Title', 'wp-slimstat' ) ?></label>
1980
+ <input type="text" class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'slimstat_widget_title' ) ); ?>" value="<?php echo trim( strip_tags( $slimstat_widget_title ) ) ?>">
1981
+ </p>
1982
+
1983
  <p>
1984
  <label for="<?php echo esc_attr( $this->get_field_id( 'slimstat_widget_filters' ) ); ?>"><?php _e( 'Optional filters', 'wp-slimstat' ); ?></label>
1985
  <a href="https://slimstat.freshdesk.com/solution/articles/5000631833-what-is-the-syntax-of-a-slimstat-shortcode-#slimstat-operators" target="_blank">[?]</a>
1994
  * @param array $new_instance The new options
1995
  * @param array $old_instance The previous options
1996
  */
1997
+ public function update( $_new_instance, $_old_instance ) {
1998
+ $instance = $_old_instance;
1999
 
2000
+ $instance[ 'slimstat_widget_id' ] = $_new_instance[ 'slimstat_widget_id' ];
2001
+ $instance[ 'slimstat_widget_title' ] = $_new_instance[ 'slimstat_widget_title' ];
2002
+ $instance[ 'slimstat_widget_filters' ] = $_new_instance[ 'slimstat_widget_filters' ];
2003
  return $instance;
2004
  }
2005
  }