diff --git a/wp/.lando.yml b/wp/.lando.yml
new file mode 100644
index 00000000..e15f3e44
--- /dev/null
+++ b/wp/.lando.yml
@@ -0,0 +1,14 @@
+name: medicalalert
+recipe: pantheon
+proxy:
+ pma:
+ - pma.wordpress.lndo.site
+config:
+ framework: wordpress
+ site: medicalalert
+ id: 5454b5d7-f7b8-4f64-bf8b-bcbcc77582ff
+services:
+ pma:
+ type: phpmyadmin
+ host:
+ - database
diff --git a/wp/pantheon.upstream.yml b/wp/pantheon.upstream.yml
new file mode 100644
index 00000000..ec2d615f
--- /dev/null
+++ b/wp/pantheon.upstream.yml
@@ -0,0 +1,25 @@
+# IMPORTANT NOTE:
+# Do not edit this file unless you are doing so in your custom upstream repository.
+# Override the defaults specified here in a site-specific `pantheon.yml` file.
+# For more information see: https://pantheon.io/docs/pantheon-upstream-yml
+api_version: 1
+php_version: 8.1
+
+# See https://pantheon.io/docs/pantheon-yml#specify-a-version-of-mariadb
+database:
+ version: 10.4
+
+# See https://pantheon.io/docs/pantheon-yml/#enforce-https--hsts for valid values.
+enforce_https: transitional
+
+# See https://pantheon.io/docs/pantheon-yml#protected-web-paths for usage.
+protected_web_paths:
+ - /private/
+ - /wp-content/uploads/private/
+ - /xmlrpc.php
+
+# By default, any 'protected_web_paths' added to the pantheon.yml file
+# are combined with the paths from the pantheon.upstream.yml file. If
+# 'protected_web_paths_override' is set to true, then the upstream paths
+# are disabled.
+protected_web_paths_override: false
diff --git a/wp/pantheon.yml b/wp/pantheon.yml
new file mode 100644
index 00000000..ca64f39e
--- /dev/null
+++ b/wp/pantheon.yml
@@ -0,0 +1,22 @@
+api_version: 1
+enforce_https: full+subdomains
+php_version: 7.4
+
+protected_web_paths:
+ - /.user.ini
+
+workflows:
+
+ # Commits
+ sync_code:
+ after:
+ - type: webphp
+ description: Post to Slack after each code pushed
+ script: private/scripts/slack_notification.php
+
+ # Database Clone
+ clone_database:
+ after:
+ - type: webphp
+ description: Change SFDC environment after database clone
+ script: private/scripts/sfdc_env.php
diff --git a/wp/wp-config.php_local b/wp/wp-config.php_local
new file mode 100644
index 00000000..0031c9b1
--- /dev/null
+++ b/wp/wp-config.php_local
@@ -0,0 +1,71 @@
+
+ * @license GPL-3.0
+ * @link http://www.ipgeoblock.com/
+ * @see http://www.ipgeoblock.com/codex/#filter-hooks
+ * @example Use `IP_Geo_Block::add_filter()` instead of `add_filter()`
+ */
+class_exists( 'IP_Geo_Block', FALSE ) or die;
+
+/**
+ * Analyze entries in "Validation logs"
+ *
+ * @param array $logs An array including each entry where:
+ * Array (
+ * [0 DB row number] => 154
+ * [1 Target ] => comment
+ * [2 Time ] => 1534580897
+ * [3 IP address ] => 102.177.147.***
+ * [4 Country code ] => ZA
+ * [5 Result ] => blocked
+ * [6 AS number ] => AS328239
+ * [7 Request ] => POST[80]:/wp-comments-post.php
+ * [8 User agent ] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) ...
+ * [9 HTTP headers ] => HTTP_ORIGIN=http://localhost,HTTP_X_FORWARDED_FOR=102.177.147.***
+ * [10 $_POST data ] => comment=Hello.,author,email,url,comment_post_ID,comment_parent
+ * )
+ *
+ * And put a mark at "Target"
+ * ¹¹: Passed in Whitelist
+ * ¹²: Passed in Blacklist
+ * ¹³: Passed not in Lists
+ * ²¹: Blocked in Whitelist
+ * ²²: Blocked in Blacklist
+ * ²³: Blocked not in Lists
+ */
+function ip_geo_block_logs( $logs ) {
+ // Get settings of IP Geo Block
+ $settings = IP_Geo_Block::get_option();
+
+ // White/Black list for back-end
+ $white_backend = $settings['white_list'];
+ $black_backend = $settings['black_list'];
+
+ // White/Black list for front-end
+ if ( $settings['public']['matching_rule'] < 0 ) {
+ // Follow "Validation rule settings"
+ $white_frontend = $white_backend;
+ $black_frontend = $black_backend;
+ } else {
+ // Whitelist or Blacklist for "Public facing pages"
+ $white_frontend = $settings['public']['white_list'];
+ $black_frontend = $settings['public']['black_list'];
+ }
+
+ foreach ( $logs as $key => $log ) {
+ // Passed or Blocked
+ $mark = IP_Geo_Block::is_passed( $log[5] ) ? '¹' : '²';
+
+ // Whitelisted, Blacklisted or N/A
+ if ( 'public' === $log[1] ) {
+ $mark .= IP_Geo_Block::is_listed( $log[4], $white_frontend ) ? '¹' : (
+ IP_Geo_Block::is_listed( $log[4], $black_frontend ) ? '²' : '³' );
+ } else {
+ $mark .= IP_Geo_Block::is_listed( $log[4], $white_backend ) ? '¹' : (
+ IP_Geo_Block::is_listed( $log[4], $black_backend ) ? '²' : '³' );
+ }
+
+ // Put a mark at "Target"
+ $logs[ $key ][1] .= $mark;
+ }
+
+ return $logs;
+}
+
+IP_Geo_Block::add_filter( 'ip-geo-block-logs', 'ip_geo_block_logs' );
+
+/**
+ * Register UI "Preset filters" at "Search in logs"
+ *
+ * @param array $filters An empty array by default.
+ * @return array $filters The array of paired with 'title' and 'value'.
+ */
+function ip_geo_block_logs_preset( $filters ) {
+ return array(
+ array( 'title' => '' . __( 'Passed in Whitelist', 'ip-geo-block' ), 'value' => '¹¹' ),
+ array( 'title' => '' . __( 'Passed in Blacklist', 'ip-geo-block' ), 'value' => '¹²' ),
+ array( 'title' => '' . __( 'Passed not in List', 'ip-geo-block' ), 'value' => '¹³' ),
+ array( 'title' => '' . __( 'Blocked in Whitelist', 'ip-geo-block' ), 'value' => '²¹' ),
+ array( 'title' => '' . __( 'Blocked in Blacklist', 'ip-geo-block' ), 'value' => '²²' ),
+ array( 'title' => '' . __( 'Blocked not in List', 'ip-geo-block' ), 'value' => '²³' ),
+ );
+}
+
+IP_Geo_Block::add_filter( 'ip-geo-block-logs-preset', 'ip_geo_block_logs_preset' );
diff --git a/wp/wp-content/ip-geo-api/drop-in-sample.php b/wp/wp-content/ip-geo-api/drop-in-sample.php
new file mode 100644
index 00000000..8a883943
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/drop-in-sample.php
@@ -0,0 +1,61 @@
+
+ * @license GPL-3.0
+ * @link https://www.ipgeoblock.com/
+ * @see https://www.ipgeoblock.com/codex/#filter-hooks
+ * @example Use `IP_Geo_Block::add_filter()` instead of `add_filter()`
+ */
+class_exists( 'IP_Geo_Block', FALSE ) or die;
+
+/**
+ * Enables some debug features on dashboard
+ *
+ */
+// define( 'IP_GEO_BLOCK_DEBUG', true );
+
+/**
+ * Example: Returns "404 Not found" to hide login page.
+ *
+ * @param int $code HTTP status code.
+ * @return int modified HTTP status code.
+ */
+/* -- ADD `/` TO THE TOP OR END OF THIS LINE TO ACTIVATE THE FOLLOWINGS -- *
+function my_login_status( $code ) {
+ return 404;
+}
+
+IP_Geo_Block::add_filter( 'ip-geo-block-login-status', 'my_login_status', 10, 1 );
+//*/
+
+/**
+ * Example: Change mode of recording log according to the target.
+ *
+ * @param int $mode 1:blocked 2:passed 3:unauth 4:auth 5:all
+ * @param string $hook 'comment', 'xmlrpc', 'login', 'admin', 'public'
+ * @param array 'ip', 'auth', 'code', 'result'
+ * @return int $mode modefied recording mode.
+ */
+/* -- ADD `/` TO THE TOP OR END OF THIS LINE TO ACTIVATE THE FOLLOWINGS -- *
+function my_record_logs( $mode, $hook, $validate ) {
+ // Countries where you want to supress recording logs.
+ $whitelist = array(
+ 'JP',
+ );
+
+ // Suppress recording logs in case of whitelisted countries on public facing pages.
+ if ( 'public' !== $hook || in_array( $validate['code'], $whitelist, TRUE ) ) {
+ return 1; // Only when blocked
+ }
+ else {
+ return 3; // Unauthenticated user
+ }
+}
+
+IP_Geo_Block::add_filter( 'ip-geo-block-record-logs', 'my_record_logs', 10, 3 );
+//*/
diff --git a/wp/wp-content/ip-geo-api/index.php b/wp/wp-content/ip-geo-api/index.php
new file mode 100644
index 00000000..62200328
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/index.php
@@ -0,0 +1,2 @@
+.
+ */
+
+class IP2LocationRecord {
+ public $ipAddress;
+ public $ipNumber;
+ public $countryCode;
+ public $countryName;
+ public $regionName;
+ public $cityName;
+ public $latitude;
+ public $longitude;
+ public $isp;
+ public $domainName;
+ public $zipCode;
+ public $timeZone;
+ public $netSpeed;
+ public $iddCode;
+ public $areaCode;
+ public $weatherStationCode;
+ public $weatherStationName;
+ public $mcc;
+ public $mnc;
+ public $mobileCarrierName;
+ public $elevation;
+ public $usageType;
+}
+
+class IP2Location {
+ // Current version.
+ const VERSION = '7.0.0';
+
+ // Database storage method.
+ const FILE_IO = 0;
+ const MEMORY_CACHE = 1;
+ const SHARED_MEMORY = 2;
+
+ // Unpack method.
+ const ENDIAN = 0;
+ const BIG_ENDIAN = 1;
+
+ // Record field.
+ const ALL = 100;
+ const COUNTRY_CODE = 1;
+ const COUNTRY_NAME = 2;
+ const REGION_NAME = 3;
+ const CITY_NAME = 4;
+ const LATITUDE = 5;
+ const LONGITUDE = 6;
+ const ISP = 7;
+ const DOMAIN_NAME = 8;
+ const ZIP_CODE = 9;
+ const TIME_ZONE = 10;
+ const NET_SPEED = 11;
+ const IDD_CODE = 12;
+ const AREA_CODE = 13;
+ const WEATHER_STATION_CODE = 14;
+ const WEATHER_STATION_NAME = 15;
+ const MCC = 16;
+ const MNC = 17;
+ const MOBILE_CARRIER_NAME = 18;
+ const ELEVATION = 19;
+ const USAGE_TYPE = 20;
+
+ // IP version.
+ const IPV4 = 0;
+ const IPV6 = 1;
+
+ // SHMOP memory address.
+ const SHM_KEY = 4194500608;
+
+ // Message.
+ const FIELD_NOT_SUPPORTED = 'This parameter is unavailable in selected .BIN data file. Please upgrade data file.';
+ const INVALID_IP_ADDRESS = 'Invalid IP address.';
+
+ private $columns = array(
+ 'COUNTRY_CODE' => array(
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ ),
+ 'COUNTRY_NAME' => array(
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ ),
+ 'REGION_NAME' => array(
+ 0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+ ),
+ 'CITY_NAME' => array(
+ 0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ ),
+ 'LATITUDE' => array(
+ 0,0,0,0,0,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+ ),
+ 'LONGITUDE' => array(
+ 0,0,0,0,0,6,6,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ ),
+ 'ISP' => array(
+ 0,0,3,0,5,0,7,5,7,0,8,0,9,0,9,0,9,0,9,7,9,0,9,7,9,
+ ),
+ 'DOMAIN_NAME' => array(
+ 0,0,0,0,0,0,0,6,8,0,9,0,10,0,10,0,10,0,10,8,10,0,10,8,10,
+ ),
+ 'ZIP_CODE' => array(
+ 0,0,0,0,0,0,0,0,0,7,7,7,7,0,7,7,7,0,7,0,7,7,7,0,7,
+ ),
+ 'TIME_ZONE' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,8,8,7,8,8,8,7,8,0,8,8,8,0,8,
+ ),
+ 'NET_SPEED' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,8,11,0,11,8,11,0,11,0,11,0,11,
+ ),
+ 'IDD_CODE' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,12,0,12,0,12,9,12,0,12,
+ ),
+ 'AREA_CODE' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,13,0,13,0,13,10,13,0,13,
+ ),
+ 'WEATHER_STATION_CODE' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,14,0,14,0,14,0,14,
+ ),
+ 'WEATHER_STATION_NAME' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,15,0,15,0,15,0,15,
+ ),
+ 'MCC' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,16,0,16,9,16,
+ ),
+ 'MNC' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,17,0,17,10,17,
+ ),
+ 'MOBILE_CARRIER_NAME' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,18,0,18,11,18,
+ ),
+ 'ELEVATION' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,19,0,19,
+ ),
+ 'USAGE_TYPE' => array(
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,
+ ),
+ );
+
+ private $shmId = '';
+ private $database = array();
+ private $unpackMethod;
+ private $buffer;
+ private $mode;
+ private $resource;
+ private $result;
+
+ /**
+ * Added for IP Geo Block
+ */
+ public function get_database_type() {
+ return ( $this->database['ipv4_count'] ? IP_GEO_BLOCK_API_TYPE_IPV4 : 0 ) |
+ ( $this->database['ipv6_count'] ? IP_GEO_BLOCK_API_TYPE_IPV6 : 0 );
+ }
+
+ /**
+ * Constructor.
+ */
+ public function __construct($file = NULL, $mode = self::FILE_IO) {
+ if (!file_exists($file)) {
+ throw new Exception('IP2Location.class.php: Unable to open file "' . $file . '".');
+ }
+
+ // Define system unpack method.
+ list($test) = array_values(unpack('L1L', pack('V', 1)));
+
+ // Use Big Endian Unpack if endian test failed.
+ $this->unpackMethod = (($test != 1)) ? self::BIG_ENDIAN : self::ENDIAN;
+
+ switch ($mode) {
+ case self::SHARED_MEMORY:
+ if (!function_exists('shmop_open')) {
+ throw new Exception('IP2Location.class.php: Please make sure your PHP setup has "php_shmop" enabled.');
+ }
+
+ $this->mode = self::SHARED_MEMORY;
+
+ $this->shmId = @shmop_open(self::SHM_KEY, 'a', 0, 0);
+
+ if ($this->shmId === FALSE) {
+ // First execution, load database into memory.
+ if (($fp = fopen($file, 'rb')) === FALSE) {
+ throw new Exception('IP2Location.class.php: Unable to open file "' . $file . '".');
+ }
+
+ flock($fp, LOCK_SH); // @since 1.1.6
+ $stats = fstat($fp);
+
+ if ($shm_id = @shmop_open(self::SHM_KEY, 'w', 0, 0)) {
+ shmop_delete($shm_id);
+ shmop_close($shm_id);
+ }
+
+ if ($shm_id = @shmop_open(self::SHM_KEY, 'c', 0644, $stats['size'])) {
+ $pointer = 0;
+ while ($pointer < $stats['size']) {
+ $buf = fread($fp, 524288);
+ shmop_write($shm_id, $buf, $pointer);
+ $pointer += 524288;
+ }
+ shmop_close($shm_id);
+ }
+ flock($fp, LOCK_UN); // @since 1.1.6
+ fclose($fp);
+
+ $this->shmId = @shmop_open(self::SHM_KEY, 'a', 0, 0);
+
+ if ($this->shmId === FALSE) {
+ throw new Exception('IP2Location.class.php: Unable to access shared memory block.');
+ }
+ }
+ break;
+
+ default:
+ $this->mode = self::FILE_IO;
+ $this->resource = fopen($file, 'rb');
+ flock($this->resource, LOCK_SH); // @since 1.1.6
+
+ if ($mode == self::MEMORY_CACHE) {
+ $this->mode = self::MEMORY_CACHE;
+ $stats = fstat($this->resource);
+ $this->buffer = fread($this->resource, $stats['size']);
+ $this->close(); // @since 1.1.6
+ }
+ }
+
+ $this->database['type'] = $this->readByte(1, '8');
+ $this->database['column'] = $this->readByte(2, '8');
+ $this->database['year'] = $this->readByte(3, '8');
+ $this->database['month'] = $this->readByte(4, '8');
+ $this->database['day'] = $this->readByte(5, '8');
+ $this->database['ipv4_count'] = $this->readByte(6, '32');
+ $this->database['ipv4_base_address'] = $this->readByte(10, '32');
+ $this->database['ipv6_count'] = $this->readByte(14, '32');
+ $this->database['ipv6_base_address'] = $this->readByte(18, '32');
+
+ $this->result = new IP2LocationRecord();
+ }
+
+ /**
+ * Close resource.
+ *
+ * @since 1.1.6
+ */
+ public function close() {
+ if ($this->resource) {
+ flock($this->resource, LOCK_UN);
+ fclose($this->resource);
+ $this->resource = NULL;
+ }
+ }
+
+ /**
+ * Read bytes.
+ */
+ private function readByte($pos, $mode = 'string', $auto_size = FALSE) {
+ $result = '';
+
+ switch ($this->mode) {
+ case self::SHARED_MEMORY:
+ if ($mode == 'string') {
+ $data = shmop_read($this->shmId, $pos, ($auto_size) ? shmop_size($this->shmId) - $pos : 100);
+ }
+ else {
+ $data = shmop_read($this->shmId, $pos - 1, 50);
+ }
+ break;
+
+ case self::MEMORY_CACHE:
+ $data = substr($this->buffer, (($mode == 'string') ? $pos : $pos - 1), 100);
+ break;
+
+ default:
+ if ($mode == 'string') {
+ fseek($this->resource, $pos, SEEK_SET);
+ $data = @fread($this->resource, 1);
+ }
+ else {
+ fseek($this->resource, $pos - 1, SEEK_SET);
+ $data = @fread($this->resource, 50);
+ }
+ }
+
+ switch ($mode) {
+ case '8':
+ $out = $this->readBinary('C', $data);
+ $result = $out[1];
+
+ break;
+
+ case '32':
+ $out = $this->readBinary('V', $data);
+ if ($out[1] < 0) {
+ $out[1] += 4294967296;
+ }
+
+ $result = (int) $out[1];
+
+ break;
+
+ case '128':
+ $array = preg_split('//', $data, -1, PREG_SPLIT_NO_EMPTY);
+
+ if (count($array) != 16) {
+ $result = 0;
+ }
+
+ $ip96_127 = $this->readBinary('V', $array[0] . $array[1] . $array[2] . $array[3]);
+ $ip64_95 = $this->readBinary('V', $array[4] . $array[5] . $array[6] . $array[7]);
+ $ip32_63 = $this->readBinary('V', $array[8] . $array[9] . $array[10] . $array[11]);
+ $ip1_31 = $this->readBinary('V', $array[12] . $array[13] . $array[14] . $array[15]);
+
+ if ($ip96_127[1] < 0) {
+ $ip96_127[1] += 4294967296;
+ }
+ if ($ip64_95[1] < 0) {
+ $ip64_95[1] += 4294967296;
+ }
+ if ($ip32_63[1] < 0) {
+ $ip32_63[1] += 4294967296;
+ }
+ if ($ip1_31[1] < 0) {
+ $ip1_31[1] += 4294967296;
+ }
+
+ $result = bcadd(bcadd(bcmul($ip1_31[1], bcpow(4294967296, 3)), bcmul($ip32_63[1], bcpow(4294967296, 2))), bcadd(bcmul($ip64_95[1], 4294967296), $ip96_127[1]));
+
+ break;
+
+ case 'float':
+ $out = $this->readBinary('f', $data);
+
+ $result = $out[1];
+
+ break;
+
+ default:
+ $out = $this->readBinary('C', $data);
+ $result = (in_array($this->mode, array(self::SHARED_MEMORY, self::MEMORY_CACHE))) ? substr($data, 1, $out[1]) : @fread($this->resource, $out[1]);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Read binary.
+ */
+ private function readBinary($format, $data) {
+ if ($this->unpackMethod == self::BIG_ENDIAN) {
+ $ar = unpack($format, $data);
+ $vals = array_values($ar);
+ $f = explode('/', $format);
+ $i = 0;
+
+ foreach ($f as $f_value) {
+ $repeater = intval(substr($f_value, 1));
+
+ if ($repeater == 0) {
+ $repeater = 1;
+ }
+ if ($f_value{1} == '*') {
+ $repeater = count($ar) - $i;
+ }
+ if ($f_value{0} != 'd') {
+ $i += $repeater;
+ continue;
+ }
+
+ $j = $i + $repeater;
+
+ for ($a = $i; $a < $j; ++$a) {
+ $p = pack('d', $vals[$i]);
+ $p = strrev($p);
+ list($vals[$i]) = array_values(unpack('d1d', $p));
+ ++$i;
+ }
+ }
+
+ $a = 0;
+ foreach ($ar as $ar_key => $ar_value) {
+ $ar[$ar_key] = $vals[$a];
+ ++$a;
+ }
+ return $ar;
+ }
+ return unpack($format, $data);
+ }
+
+ /**
+ * Convert IPv6 into long integer.
+ */
+ private function ipv6Numeric($ipv6) {
+
+if ( extension_loaded('gmp') ):
+
+ $ip_n = inet_pton($ipv6);
+ $bits = 15;
+
+ // 16 x 8 bit = 128bit
+ $ipv6long = 0;
+
+ while ($bits >= 0) {
+ $bin = sprintf("%08b", (ord($ip_n[$bits])));
+
+ if ($ipv6long) {
+ $ipv6long = $bin . $ipv6long;
+ }
+ else {
+ $ipv6long = $bin;
+ }
+ $bits--;
+ }
+ return gmp_strval(gmp_init($ipv6long, 2), 10);
+
+else:
+
+ /**
+ * Added for IP Geo Block (code from ip2location.class.php)
+ */
+ $n = substr_count($ipv6, ':');
+
+ if($n < 7){
+ $expanded = '::';
+
+ while($n < 7){
+ $expanded .= ':';
+ $n++;
+ }
+ $ipv6 = preg_replace('/::/', $expanded, $ipv6);
+ }
+
+ $subLoc = 8;
+ $ipv6No = '0';
+
+ foreach(preg_split('/:/', $ipv6) as $ipSub){
+ $subLoc--;
+
+ if($ipSub == '') continue;
+ $ipv6No = bcadd( $ipv6No, bcmul(hexdec($ipSub), bcpow('65536', $subLoc))); // hexdec('0x10000')
+ }
+ return $ipv6No;
+
+endif;
+ }
+
+ /**
+ * Validate IP address.
+ */
+ private function validate($ip) {
+ if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+ return 4;
+ }
+
+ if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ return 6;
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Core function to lookup geolocation data.
+ */
+ public function lookup($ip, $fields = self::ALL) {
+ $this->result->ipAddress = $ip;
+
+ if (($version = $this->validate($ip)) === FALSE) {
+ foreach ($this->result as &$obj) {
+ if ($obj) {
+ continue;
+ }
+
+ $obj = self::INVALID_IP_ADDRESS;
+ }
+
+ return $this->result;
+ }
+
+ if ($version == 4) {
+ return $this->ipv4Lookup($ip, $fields);
+ }
+
+ if ($version == 6) {
+ return $this->ipv6Lookup($ip, $fields);
+ }
+ }
+
+ /**
+ * Lookup for IPv4 records.
+ */
+ private function ipv4Lookup($ip, $fields) {
+ $keys = array_keys($this->columns);
+
+ $base_address = $this->database['ipv4_base_address'];
+ $high = $this->database['ipv4_count'];
+ $ip_number = sprintf('%u', ip2long($ip));
+ $ip_number = ($ip_number >= 4294967295) ? ($ip_number - 1) : $ip_number;
+ $this->result->ipNumber = $ip_number;
+
+ $low = 0;
+ $mid = 0;
+ $ip_from = 0;
+ $ip_to = 0;
+
+ while ($low <= $high) {
+ $mid = (int) (($low + $high) / 2);
+ $ip_from = $this->readByte($base_address + $mid * ($this->database['column'] * 4), 32);
+ $ip_to = $this->readByte($base_address + ($mid + 1) * ($this->database['column'] * 4), 32);
+
+ if ($ip_from < 0) {
+ $ip_from += pow(2, 32);
+ }
+
+ if ($ip_to < 0) {
+ $ip_to += pow(2, 32);
+ }
+
+ if (($ip_number >= $ip_from) && ($ip_number < $ip_to)) {
+ $return = self::FIELD_NOT_SUPPORTED;
+ $pointer = $base_address + ($mid * $this->database['column'] * 4);
+
+ switch ($fields) {
+ case self::COUNTRY_CODE:
+ case self::REGION_NAME:
+ case self::CITY_NAME:
+ case self::ISP:
+ case self::DOMAIN_NAME:
+ case self::ZIP_CODE:
+ case self::TIME_ZONE:
+ case self::NET_SPEED:
+ case self::IDD_CODE:
+ case self::AREA_CODE:
+ case self::WEATHER_STATION_CODE:
+ case self::WEATHER_STATION_NAME:
+ case self::MCC:
+ case self::MNC:
+ case self::MOBILE_CARRIER_NAME:
+ case self::ELEVATION:
+ if($this->columns[$keys[$fields - 1]][$this->database['type']] != 0){
+ $return = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ break;
+
+ case self::COUNTRY_NAME:
+ if($this->columns[$keys[$fields - 1]][$this->database['type']] != 0){
+ $return = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']] - 1), '32') + 3, 'string', TRUE);
+ }
+
+ break;
+
+ case self::LATITUDE:
+ case self::LONGITUDE:
+ if($this->columns[$keys[$fields - 1]][$this->database['type']] != 0){
+ $return = $this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']] - 1), 'float', TRUE);
+ }
+
+ break;
+
+ case self::USAGE_TYPE:
+ if($this->columns[$keys[$fields - 1]][$this->database['type']] != 0){
+ $return = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ break;
+
+ default:
+ $this->result->regionName = $this->result->cityName = $this->result->latitude = $this->result->longitude = $this->result->isp = $this->result->domainName = $this->result->zipCode = $this->result->timeZone = $this->result->netSpeed = $this->result->iddCode = $this->result->areaCode = $this->result->weatherStationCode = $this->result->weatherStationName = $this->result->mcc = $this->result->mnc = $this->result->mobileCarrierName = $this->result->elevation = $this->result->usageType = self::FIELD_NOT_SUPPORTED;
+
+ $this->result->countryCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::COUNTRY_CODE - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+
+ $this->result->countryName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::COUNTRY_NAME - 1]][$this->database['type']] - 1), '32') + 3, 'string', TRUE);
+
+ if ($this->columns[$keys[self::REGION_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->regionName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::REGION_NAME - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::CITY_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->cityName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::CITY_NAME - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::LATITUDE - 1]][$this->database['type']] != 0) {
+ $this->result->latitude = $this->readByte($pointer + 4 * ($this->columns[$keys[self::LATITUDE - 1]][$this->database['type']] - 1), 'float', TRUE);
+ }
+
+ if ($this->columns[$keys[self::LONGITUDE - 1]][$this->database['type']] != 0) {
+ $this->result->longitude = $this->readByte($pointer + 4 * ($this->columns[$keys[self::LONGITUDE - 1]][$this->database['type']] - 1), 'float', TRUE);
+ }
+
+ if ($this->columns[$keys[self::ISP - 1]][$this->database['type']] != 0) {
+ $this->result->isp = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::ISP - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::DOMAIN_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->domainName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::DOMAIN_NAME - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::ZIP_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->zipCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::ZIP_CODE - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::TIME_ZONE - 1]][$this->database['type']] != 0) {
+ $this->result->timeZone = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::TIME_ZONE - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::NET_SPEED - 1]][$this->database['type']] != 0) {
+ $this->result->netSpeed = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::NET_SPEED - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::IDD_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->iddCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::IDD_CODE - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::AREA_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->areaCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::AREA_CODE - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::WEATHER_STATION_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->weatherStationCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::WEATHER_STATION_CODE - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::WEATHER_STATION_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->weatherStationName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::WEATHER_STATION_NAME - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::MCC - 1]][$this->database['type']] != 0) {
+ $this->result->mcc = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::MCC - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::MNC - 1]][$this->database['type']] != 0) {
+ $this->result->mnc = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::MNC - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::MOBILE_CARRIER_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->mobileCarrierName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::MOBILE_CARRIER_NAME - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::ELEVATION - 1]][$this->database['type']] != 0) {
+ $this->result->elevation = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::ELEVATION - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::USAGE_TYPE - 1]][$this->database['type']] != 0) {
+ $this->result->usageType = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::USAGE_TYPE - 1]][$this->database['type']] - 1), '32'), 'string', TRUE);
+ }
+
+ return $this->result;
+ }
+ return $return;
+ }
+ else {
+ if ($ip_number < $ip_from) {
+ $high = $mid - 1;
+ }
+ else {
+ $low = $mid + 1;
+ }
+ }
+ }
+ }
+
+ /**
+ * Lookup for IPv6 records.
+ */
+ private function ipv6Lookup($ip, $fields) {
+ $keys = array_keys($this->columns);
+
+ $base_address = $this->database['ipv6_base_address'];
+ $ip_number = $this->ipv6Numeric($ip);
+ $this->result->ipNumber = $ip_number;
+
+ $low = 0;
+ $mid = 0;
+ $high = $this->database['ipv6_count'];
+ $ip_from = 0;
+ $ip_to = 0;
+
+ while ($low <= $high) {
+ $mid = (int) (($low + $high) / 2);
+ $ip_from = $this->readByte($base_address + $mid * ($this->database['column'] * 4 + 12), 128);
+ $ip_to = $this->readByte($base_address + ($mid + 1) * ($this->database['column'] * 4 + 12), 128);
+
+ if ($ip_from < 0) {
+ $ip_from += pow(2, 32);
+ }
+
+ if ($ip_to < 0) {
+ $ip_to += pow(2, 32);
+ }
+
+ if (($ip_number >= $ip_from) && ($ip_number < $ip_to)) {
+ $return = '';
+ $pointer = $base_address + ($mid * ($this->database['column'] * 4 + 12)) + 8;
+
+ switch ($fields) {
+ case self::COUNTRY_CODE:
+ case self::REGION_NAME:
+ case self::CITY_NAME:
+ case self::ISP:
+ case self::DOMAIN_NAME:
+ case self::ZIP_CODE:
+ case self::TIME_ZONE:
+ case self::NET_SPEED:
+ case self::IDD_CODE:
+ case self::AREA_CODE:
+ case self::WEATHER_STATION_CODE:
+ case self::WEATHER_STATION_NAME:
+ case self::MCC:
+ case self::MNC:
+ case self::MOBILE_CARRIER_NAME:
+ case self::ELEVATION:
+ $return = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']]), '32'), 'string', TRUE);
+
+ break;
+
+ case self::COUNTRY_NAME:
+ $return = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']]), '32') + 3, 'string', TRUE);
+
+ break;
+
+ case self::LATITUDE:
+ case self::LONGITUDE:
+ $return = $this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']]), 'float', TRUE);
+
+ break;
+
+ case self::USAGE_TYPE:
+ $return = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[$fields - 1]][$this->database['type']]), '32'), 'string', TRUE);
+
+ break;
+
+ default:
+ $this->result->regionName = $this->result->cityName = $this->result->latitude = $this->result->longitude = $this->result->isp = $this->result->domainName = $this->result->zipCode = $this->result->timeZone = $this->result->netSpeed = $this->result->iddCode = $this->result->areaCode = $this->result->weatherStationCode = $this->result->weatherStationName = $this->result->mcc = $this->result->mnc = $this->result->mobileCarrierName = $this->result->elevation = $this->result->usageType = self::FIELD_NOT_SUPPORTED;
+
+ if ($this->columns[$keys[self::COUNTRY_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->countryCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::COUNTRY_CODE - 1]][$this->database['type']]), '32'), 'string', TRUE);
+
+ $this->result->countryName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::COUNTRY_CODE - 1]][$this->database['type']]), '32') + 3, 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::REGION_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->regionName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::REGION_NAME - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::CITY_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->cityName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::CITY_NAME - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::LATITUDE - 1]][$this->database['type']] != 0) {
+ $this->result->latitude = $this->readByte($pointer + 4 * ($this->columns[$keys[self::LATITUDE - 1]][$this->database['type']]), 'float', TRUE);
+ }
+
+ if ($this->columns[$keys[self::LONGITUDE - 1]][$this->database['type']] != 0) {
+ $this->result->longitude = $this->readByte($pointer + 4 * ($this->columns[$keys[self::LONGITUDE - 1]][$this->database['type']]), 'float', TRUE);
+ }
+
+ if ($this->columns[$keys[self::ISP - 1]][$this->database['type']] != 0) {
+ $this->result->isp = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::ISP - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::DOMAIN_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->domainName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::DOMAIN_NAME - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::ZIP_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->zipCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::ZIP_CODE - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::TIME_ZONE - 1]][$this->database['type']] != 0) {
+ $this->result->timeZone = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::TIME_ZONE - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::NET_SPEED - 1]][$this->database['type']] != 0) {
+ $this->result->netSpeed = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::NET_SPEED - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::IDD_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->iddCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::IDD_CODE - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::AREA_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->areaCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::AREA_CODE - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::WEATHER_STATION_CODE - 1]][$this->database['type']] != 0) {
+ $this->result->weatherStationCode = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::WEATHER_STATION_CODE - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::WEATHER_STATION_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->weatherStationName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::WEATHER_STATION_NAME - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::MCC - 1]][$this->database['type']] != 0) {
+ $this->result->mcc = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::MCC - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::MNC - 1]][$this->database['type']] != 0) {
+ $this->result->mnc = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::MNC - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::MOBILE_CARRIER_NAME - 1]][$this->database['type']] != 0) {
+ $this->result->mobileCarrierName = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::MOBILE_CARRIER_NAME - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::ELEVATION - 1]][$this->database['type']] != 0) {
+ $this->result->elevation = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::ELEVATION - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ if ($this->columns[$keys[self::USAGE_TYPE - 1]][$this->database['type']] != 0) {
+ $this->result->usageType = $this->readByte($this->readByte($pointer + 4 * ($this->columns[$keys[self::USAGE_TYPE - 1]][$this->database['type']]), '32'), 'string', TRUE);
+ }
+
+ return $this->result;
+ }
+ return $return;
+ }
+ else {
+ if ($ip_number < $ip_from) {
+ $high = $mid - 1;
+ }
+ else {
+ $low = $mid + 1;
+ }
+ }
+ }
+ }
+}
+?>
\ No newline at end of file
diff --git a/wp/wp-content/ip-geo-api/ip2location/bcmath.php b/wp/wp-content/ip-geo-api/ip2location/bcmath.php
new file mode 100644
index 00000000..c70cf757
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/ip2location/bcmath.php
@@ -0,0 +1,216 @@
+9) $Output[$i+1]=1;
+ }
+
+ // convert the array to string and reverse it
+ $Output=strrev(implode($Output));
+
+ // substring the decimal digits from the result, pad if necessary (if $Scale > amount of actual decimals)
+ // next, since actual zero values can cause a problem with the substring values, if so, just simply give '0'
+ // next, append the decimal value, if $Scale is defined, and return result
+// $Decimal=str_pad(substr($Output,-$DLen,$Scale),$Scale,'0');
+// $Output=(($MLen-$DLen<1)?'0':substr($Output,0,-$DLen));
+// $Output.=(($Scale>0)?".{$Decimal}":'');
+// return($Output);
+ return( $Output ? $Output : '0' );
+}
+endif; // ! function_exists('bcadd')
+
+if ( ! function_exists('bcsub') ):
+/**
+ * bcsub - Subtract one arbitrary precision number from another.
+ * @link https://php.net/manual/en/function.bcsub.php
+ */
+function bcsub($Num1='0',$Num2='0',$Scale=null) {
+ // check if they're valid positive numbers, extract the whole numbers and decimals
+ if(!preg_match("/^\+?(\d+)(\.\d+)?$/",$Num1,$Tmp1)||
+ !preg_match("/^\+?(\d+)(\.\d+)?$/",$Num2,$Tmp2)) return('0');
+
+ // this is where the result is stored
+ $Output=array();
+
+ // remove ending zeroes from decimals and remove point
+ $Dec1=isset($Tmp1[2])?rtrim(substr($Tmp1[2],1),'0'):'';
+ $Dec2=isset($Tmp2[2])?rtrim(substr($Tmp2[2],1),'0'):'';
+
+ // calculate the longest length of decimals
+ $DLen=max(strlen($Dec1),strlen($Dec2));
+
+ // if $Scale is null, automatically set it to the amount of decimal places for accuracy
+ if($Scale==null) $Scale=$DLen;
+
+ // remove leading zeroes and reverse the whole numbers, then append padded decimals on the end
+ $Num1=strrev(ltrim($Tmp1[1],'0').str_pad($Dec1,$DLen,'0'));
+ $Num2=strrev(ltrim($Tmp2[1],'0').str_pad($Dec2,$DLen,'0'));
+
+ // calculate the longest length we need to process
+ $MLen=max(strlen($Num1),strlen($Num2));
+
+ // pad the two numbers so they are of equal length (both equal to $MLen)
+ $Num1=str_pad($Num1,$MLen,'0');
+ $Num2=str_pad($Num2,$MLen,'0');
+
+ // process each digit, keep the ones, carry the tens (remainders)
+ for($i=0;$i<$MLen;$i++) {
+ $Sum=((int)$Num1{$i}-(int)$Num2{$i});
+ if(isset($Output[$i])) $Sum+=$Output[$i];
+ $Output[$i]=$Sum%10;
+ if($Sum>9) $Output[$i+1]=1;
+ }
+
+ // convert the array to string and reverse it
+ $Output=strrev(implode($Output));
+
+ // substring the decimal digits from the result, pad if necessary (if $Scale > amount of actual decimals)
+ // next, since actual zero values can cause a problem with the substring values, if so, just simply give '0'
+ // next, append the decimal value, if $Scale is defined, and return result
+// $Decimal=str_pad(substr($Output,-$DLen,$Scale),$Scale,'0');
+// $Output=(($MLen-$DLen<1)?'0':substr($Output,0,-$DLen));
+// $Output.=(($Scale>0)?".{$Decimal}":'');
+// return($Output);
+ return( $Output ? $Output : '0' );
+}
+endif; // ! function_exists('bcsub')
+
+if ( ! function_exists('bcmul') ):
+/**
+ * bcmul - Multiply two arbitrary precision numbers.
+ * @link https://php.net/manual/en/function.bcmul.php
+ */
+function bcmul($Num1='0',$Num2='0') {
+ // check if they're both plain numbers
+ if(!preg_match("/^\d+$/",$Num1)||!preg_match("/^\d+$/",$Num2)) return(0);
+
+ // remove zeroes from beginning of numbers
+ for($i=0;$i ' . $date . ' ' . $date . ' ' . $date . ' ' . $date . ' ' . $date . ' ' . $date . ' ' . $date . ' ' . $date . '
(IPv4)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'ipv4_path',
+ 'value' => $db['ipv4_path'],
+ 'disabled' => TRUE,
+ 'after' => '
(IPv6)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'ipv6_path',
+ 'value' => $db['ipv6_path'],
+ 'disabled' => TRUE,
+ 'after' => '
(IPv4 and IPv6)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'ip_path',
+ 'value' => $db['ip_path'],
+ 'disabled' => TRUE,
+ 'after' => '
(ASN for IPv4 and IPv6)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'asn_path',
+ 'value' => $db['asn_path'],
+ 'disabled' => TRUE,
+ 'after' => '
(IPv4)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'ipv4_path',
+ 'value' => $db['ipv4_path'],
+ 'disabled' => TRUE,
+ 'after' => '
(IPv6)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'ipv6_path',
+ 'value' => $db['ipv6_path'],
+ 'disabled' => TRUE,
+ 'after' => '
(ASN for IPv4)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'asn4_path',
+ 'value' => $db['asn4_path'],
+ 'disabled' => TRUE,
+ 'after' => '
(ASN for IPv6)",
+ $callback,
+ $option_slug,
+ $section,
+ array(
+ 'type' => 'text',
+ 'option' => $option_name,
+ 'field' => $field,
+ 'sub-field' => 'asn6_path',
+ 'value' => $db['asn6_path'],
+ 'disabled' => TRUE,
+ 'after' => '
+ * This attribute is only available from the Insights web service and the + * GeoIP2 Enterprise database. + *
+ */ +class Traits extends AbstractRecord +{ + /** + * @ignore + */ + protected $validAttributes = [ + 'autonomousSystemNumber', + 'autonomousSystemOrganization', + 'connectionType', + 'domain', + 'ipAddress', + 'isAnonymous', + 'isAnonymousProxy', + 'isAnonymousVpn', + 'isHostingProvider', + 'isLegitimateProxy', + 'isp', + 'isPublicProxy', + 'isSatelliteProvider', + 'isTorExitNode', + 'organization', + 'userType', + ]; +} diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/WebService/Client.php b/wp/wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/WebService/Client.php new file mode 100644 index 00000000..bac82f85 --- /dev/null +++ b/wp/wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/WebService/Client.php @@ -0,0 +1,239 @@ +locales = $locales; + + // This is for backwards compatibility. Do not remove except for a + // major version bump. + if (is_string($options)) { + $options = ['host' => $options]; + } + + if (!isset($options['host'])) { + $options['host'] = 'geoip.maxmind.com'; + } + + $options['userAgent'] = $this->userAgent(); + + $this->client = new WsClient($userId, $licenseKey, $options); + } + + private function userAgent() + { + return 'GeoIP2-API/' . self::VERSION; + } + + /** + * This method calls the GeoIP2 Precision: City service. + * + * @param string $ipAddress IPv4 or IPv6 address as a string. If no + * address is provided, the address that the web service is called + * from will be used. + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address you + * provided is not in our database (e.g., a private address). + * @throws \GeoIp2\Exception\AuthenticationException if there is a problem + * with the user ID or license key that you provided + * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out + * of queries + * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is + * invalid for some other reason. This may indicate an issue + * with this API. Please report the error to MaxMind. + * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned. + * This could indicate a problem with the connection between + * your server and the web service or that the web service + * returned an invalid document or 500 error code. + * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent + * class to the above exceptions. It will be thrown directly + * if a 200 status code is returned but the body is invalid. + * + * @return \GeoIp2\Model\City + */ + public function city($ipAddress = 'me') + { + return $this->responseFor('city', 'City', $ipAddress); + } + + /** + * This method calls the GeoIP2 Precision: Country service. + * + * @param string $ipAddress IPv4 or IPv6 address as a string. If no + * address is provided, the address that the web service is called + * from will be used. + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address you provided is not in our database (e.g., + * a private address). + * @throws \GeoIp2\Exception\AuthenticationException if there is a problem + * with the user ID or license key that you provided + * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out of queries + * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is + * invalid for some other reason. This may indicate an + * issue with this API. Please report the error to MaxMind. + * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error + * code or message was returned. This could indicate a problem + * with the connection between your server and the web service + * or that the web service returned an invalid document or 500 + * error code. + * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent class to the above exceptions. It + * will be thrown directly if a 200 status code is returned but + * the body is invalid. + * + * @return \GeoIp2\Model\Country + */ + public function country($ipAddress = 'me') + { + return $this->responseFor('country', 'Country', $ipAddress); + } + + /** + * This method calls the GeoIP2 Precision: Insights service. + * + * @param string $ipAddress IPv4 or IPv6 address as a string. If no + * address is provided, the address that the web service is called + * from will be used. + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address you + * provided is not in our database (e.g., a private address). + * @throws \GeoIp2\Exception\AuthenticationException if there is a problem + * with the user ID or license key that you provided + * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out + * of queries + * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is + * invalid for some other reason. This may indicate an + * issue with this API. Please report the error to MaxMind. + * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned. + * This could indicate a problem with the connection between + * your server and the web service or that the web service + * returned an invalid document or 500 error code. + * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent + * class to the above exceptions. It will be thrown directly + * if a 200 status code is returned but the body is invalid. + * + * @return \GeoIp2\Model\Insights + */ + public function insights($ipAddress = 'me') + { + return $this->responseFor('insights', 'Insights', $ipAddress); + } + + private function responseFor($endpoint, $class, $ipAddress) + { + $path = implode('/', [self::$basePath, $endpoint, $ipAddress]); + + try { + $body = $this->client->get('GeoIP2 ' . $class, $path); + } catch (\MaxMind\Exception\IpAddressNotFoundException $ex) { + throw new AddressNotFoundException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex + ); + } catch (\MaxMind\Exception\AuthenticationException $ex) { + throw new AuthenticationException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex + ); + } catch (\MaxMind\Exception\InsufficientFundsException $ex) { + throw new OutOfQueriesException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex + ); + } catch (\MaxMind\Exception\InvalidRequestException $ex) { + throw new InvalidRequestException( + $ex->getMessage(), + $ex->getErrorCode(), + $ex->getStatusCode(), + $ex->getUri(), + $ex + ); + } catch (\MaxMind\Exception\HttpException $ex) { + throw new HttpException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex->getUri(), + $ex + ); + } catch (\MaxMind\Exception\WebServiceException $ex) { + throw new GeoIp2Exception( + $ex->getMessage(), + $ex->getCode(), + $ex + ); + } + + $class = 'GeoIp2\\Model\\' . $class; + + return new $class($body, $this->locales); + } +} diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/CHANGELOG.md b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/CHANGELOG.md new file mode 100644 index 00000000..9d320ac5 --- /dev/null +++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/CHANGELOG.md @@ -0,0 +1,108 @@ +CHANGELOG +========= + +1.2.0 (2017-10-27) +------------------ + +* PHP 5.4 is now required. +* The `Reader` class for the `maxminddb` extension is no longer final. + This was change to match the behavior of the pure PHP class. + Reported and fixed by venyii. GitHub #52 & #54. + +1.1.3 (2017-01-19) +------------------ + +* Fix incorrect version in `ext/php_maxminddb.h`. GitHub #48. + +1.1.2 (2016-11-22) +------------------ + +* Searching for database metadata only occurs within the last 128KB + (128 * 1024 bytes) of the file, speeding detection of corrupt + datafiles. Reported by Eric Teubert. GitHub #42. +* Suggest relevant extensions when installing with Composer. GitHub #37. + +1.1.1 (2016-09-15) +------------------ + +* Development files were added to the `.gitattributes` as `export-ignore` so + that they are not part of the Composer release. Pull request by Michele + Locati. GitHub #39. + +1.1.0 (2016-01-04) +------------------ + +* The MaxMind DB extension now supports PHP 7. Pull request by John Boehr. + GitHub #27. + +1.0.3 (2015-03-13) +------------------ + +* All uses of `strlen` were removed. This should prevent issues in situations + where the function is overloaded or otherwise broken. + +1.0.2 (2015-01-19) +------------------ + +* Previously the MaxMind DB extension would cause a segfault if the Reader + object's destructor was called without first having called the constructor. + (Reported by Matthias Saou & Juan Peri. GitHub #20.) + +1.0.1 (2015-01-12) +------------------ + +* In the last several releases, the version number in the extension was + incorrect. This release is being done to correct it. No other code changes + are included. + +1.0.0 (2014-09-22) +------------------ + +* First production release. +* In the pure PHP reader, a string length test after `fread()` was replaced + with the difference between the start pointer and the end pointer. This + provided a 15% speed increase. + +0.3.3 (2014-09-15) +------------------ + +* Clarified behavior of 128-bit type in documentation. +* Updated phpunit and fixed some test breakage from the newer version. + +0.3.2 (2014-09-10) +------------------ + +* Fixed invalid reference to global class RuntimeException from namespaced + code. Fixed by Steven Don. GitHub issue #15. +* Additional documentation of `Metadata` class as well as misc. documentation + cleanup. + +0.3.1 (2014-05-01) +------------------ + +* The API now works when `mbstring.func_overload` is set. +* BCMath is no longer required. If the decoder encounters a big integer, + it will try to use GMP and then BCMath. If both of those fail, it will + throw an exception. No databases released by MaxMind currently use big + integers. +* The API now officially supports HHVM when using the pure PHP reader. + +0.3.0 (2014-02-19) +------------------ + +* This API is now licensed under the Apache License, Version 2.0. +* The code for the C extension was cleaned up, fixing several potential + issues. + +0.2.0 (2013-10-21) +------------------ + +* Added optional C extension for using libmaxminddb in place of the pure PHP + reader. +* Significantly improved error handling in pure PHP reader. +* Improved performance for IPv4 lookups in an IPv6 database. + +0.1.0 (2013-07-16) +------------------ + +* Initial release diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/LICENSE b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/LICENSE new file mode 100644 index 00000000..62589edd --- /dev/null +++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/README.md b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/README.md new file mode 100644 index 00000000..fb84ed30 --- /dev/null +++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/README.md @@ -0,0 +1,139 @@ +# MaxMind DB Reader PHP API # + +## Description ## + +This is the PHP API for reading MaxMind DB files. MaxMind DB is a binary file +format that stores data indexed by IP address subnets (IPv4 or IPv6). + +## Installation ## + +We recommend installing this package with [Composer](https://getcomposer.org/). + +### Download Composer ### + +To download Composer, run in the root directory of your project: + +```bash +curl -sS https://getcomposer.org/installer | php +``` + +You should now have the file `composer.phar` in your project directory. + +### Install Dependencies ### + +Run in your project root: + +``` +php composer.phar require maxmind-db/reader:~1.0 +``` + +You should now have the files `composer.json` and `composer.lock` as well as +the directory `vendor` in your project directory. If you use a version control +system, `composer.json` should be added to it. + +### Require Autoloader ### + +After installing the dependencies, you need to require the Composer autoloader +from your code: + +```php +require 'vendor/autoload.php'; +``` + +## Usage ## + +## Example ## + +```php +get($ipAddress)); + +$reader->close(); +``` + +## Optional PHP C Extension ## + +MaxMind provides an optional C extension that is a drop-in replacement for +`MaxMind\Db\Reader`. In order to use this extension, you must install the +Reader API as described above and install the extension as described below. If +you are using an autoloader, no changes to your code should be necessary. + +### Installing Extension ### + +First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as +described in its [README.md +file](https://github.com/maxmind/libmaxminddb/blob/master/README.md#installing-from-a-tarball). +After successfully installing libmaxmindb, run the following commands from the +top-level directory of this distribution: + +``` +cd ext +phpize +./configure +make +make test +sudo make install +``` + +You then must load your extension. The recommend method is to add the +following to your `php.ini` file: + +``` +extension=maxminddb.so +``` + +Note: You may need to install the PHP development package on your OS such as +php5-dev for Debian-based systems or php-devel for RedHat/Fedora-based ones. + +## 128-bit Integer Support ## + +The MaxMind DB format includes 128-bit unsigned integer as a type. Although +no MaxMind-distributed database currently makes use of this type, both the +pure PHP reader and the C extension support this type. The pure PHP reader +requires gmp or bcmath to read databases with 128-bit unsigned integers. + +The integer is currently returned as a hexadecimal string (prefixed with "0x") +by the C extension and a decimal string (no prefix) by the pure PHP reader. +Any change to make the reader implementations always return either a +hexadecimal or decimal representation of the integer will NOT be considered a +breaking change. + +## Support ## + +Please report all issues with this code using the [GitHub issue tracker] +(https://github.com/maxmind/MaxMind-DB-Reader-php/issues). + +If you are having an issue with a MaxMind service that is not specific to the +client API, please see [our support page](https://www.maxmind.com/en/support). + +## Requirements ## + +This library requires PHP 5.4 or greater. The pure PHP reader included with +this library works and is tested with HHVM. + +The GMP or BCMath extension may be required to read some databases +using the pure PHP API. + +## Contributing ## + +Patches and pull requests are encouraged. All code should follow the PSR-1 and +PSR-2 style guidelines. Please include unit tests whenever possible. + +## Versioning ## + +The MaxMind DB Reader PHP API uses [Semantic Versioning](https://semver.org/). + +## Copyright and License ## + +This software is Copyright (c) 2014-2017 by MaxMind, Inc. + +This is free software, licensed under the Apache License, Version 2.0. diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/composer.json b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/composer.json new file mode 100644 index 00000000..9d767ee7 --- /dev/null +++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/composer.json @@ -0,0 +1,34 @@ +{ + "name": "maxmind-db/reader", + "description": "MaxMind DB Reader API", + "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"], + "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php", + "type": "library", + "license": "Apache-2.0", + "authors": [ + { + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "http://www.maxmind.com/" + } + ], + "require": { + "php": ">=5.4" + }, + "suggest": { + "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "2.*", + "phpunit/phpunit": "4.*", + "satooshi/php-coveralls": "1.0.*", + "squizlabs/php_codesniffer": "3.*" + }, + "autoload": { + "psr-4": { + "MaxMind\\Db\\": "src/MaxMind/Db" + } + } +} diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/ext/config.m4 b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/ext/config.m4 new file mode 100644 index 00000000..a08bb2c4 --- /dev/null +++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/ext/config.m4 @@ -0,0 +1,19 @@ +PHP_ARG_WITH(maxminddb, + [Whether to enable the MaxMind DB Reader extension], + [ --with-maxminddb Enable MaxMind DB Reader extension support]) + +PHP_ARG_ENABLE(maxminddb-debug, for MaxMind DB debug support, + [ --enable-maxminddb-debug Enable enable MaxMind DB deubg support], no, no) + +if test $PHP_MAXMINDDB != "no"; then + PHP_CHECK_LIBRARY(maxminddb, MMDB_open) + + if test $PHP_MAXMINDDB_DEBUG != "no"; then + CFLAGS="$CFLAGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror" + fi + + PHP_ADD_LIBRARY(maxminddb, 1, MAXMINDDB_SHARED_LIBADD) + PHP_SUBST(MAXMINDDB_SHARED_LIBADD) + + PHP_NEW_EXTENSION(maxminddb, maxminddb.c, $ext_shared) +fi diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/ext/maxminddb.c b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/ext/maxminddb.c new file mode 100644 index 00000000..92df16a0 --- /dev/null +++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/ext/maxminddb.c @@ -0,0 +1,564 @@ +/* MaxMind, Inc., licenses this file to you under the Apache License, Version + * 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#include "php_maxminddb.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#includeaddress in the MaxMind DB.
+ *
+ * @param string $ipAddress
+ * the IP address to look up
+ *
+ * @throws \BadMethodCallException if this method is called on a closed database
+ * @throws \InvalidArgumentException if something other than a single IP address is passed to the method
+ * @throws InvalidDatabaseException
+ * if the database is invalid or there is an error reading
+ * from it
+ *
+ * @return array the record for the IP address
+ */
+ public function get($ipAddress)
+ {
+ if (func_num_args() !== 1) {
+ throw new \InvalidArgumentException(
+ 'Method takes exactly one argument.'
+ );
+ }
+
+ if (!is_resource($this->fileHandle)) {
+ throw new \BadMethodCallException(
+ 'Attempt to read from a closed MaxMind DB.'
+ );
+ }
+
+ if (!filter_var($ipAddress, FILTER_VALIDATE_IP)) {
+ throw new \InvalidArgumentException(
+ "The value \"$ipAddress\" is not a valid IP address."
+ );
+ }
+
+ if ($this->metadata->ipVersion === 4 && strrpos($ipAddress, ':')) {
+ throw new \InvalidArgumentException(
+ "Error looking up $ipAddress. You attempted to look up an"
+ . ' IPv6 address in an IPv4-only database.'
+ );
+ }
+ $pointer = $this->findAddressInTree($ipAddress);
+ if ($pointer === 0) {
+ return null;
+ }
+
+ return $this->resolveDataPointer($pointer);
+ }
+
+ private function findAddressInTree($ipAddress)
+ {
+ // XXX - could simplify. Done as a byte array to ease porting
+ $rawAddress = array_merge(unpack('C*', inet_pton($ipAddress)));
+
+ $bitCount = count($rawAddress) * 8;
+
+ // The first node of the tree is always node 0, at the beginning of the
+ // value
+ $node = $this->startNode($bitCount);
+
+ for ($i = 0; $i < $bitCount; $i++) {
+ if ($node >= $this->metadata->nodeCount) {
+ break;
+ }
+ $tempBit = 0xFF & $rawAddress[$i >> 3];
+ $bit = 1 & ($tempBit >> 7 - ($i % 8));
+
+ $node = $this->readNode($node, $bit);
+ }
+ if ($node === $this->metadata->nodeCount) {
+ // Record is empty
+ return 0;
+ } elseif ($node > $this->metadata->nodeCount) {
+ // Record is a data pointer
+ return $node;
+ }
+ throw new InvalidDatabaseException('Something bad happened');
+ }
+
+ private function startNode($length)
+ {
+ // Check if we are looking up an IPv4 address in an IPv6 tree. If this
+ // is the case, we can skip over the first 96 nodes.
+ if ($this->metadata->ipVersion === 6 && $length === 32) {
+ return $this->ipV4StartNode();
+ }
+ // The first node of the tree is always node 0, at the beginning of the
+ // value
+ return 0;
+ }
+
+ private function ipV4StartNode()
+ {
+ // This is a defensive check. There is no reason to call this when you
+ // have an IPv4 tree.
+ if ($this->metadata->ipVersion === 4) {
+ return 0;
+ }
+
+ if ($this->ipV4Start) {
+ return $this->ipV4Start;
+ }
+ $node = 0;
+
+ for ($i = 0; $i < 96 && $node < $this->metadata->nodeCount; $i++) {
+ $node = $this->readNode($node, 0);
+ }
+ $this->ipV4Start = $node;
+
+ return $node;
+ }
+
+ private function readNode($nodeNumber, $index)
+ {
+ $baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
+
+ // XXX - probably could condense this.
+ switch ($this->metadata->recordSize) {
+ case 24:
+ $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
+ list(, $node) = unpack('N', "\x00" . $bytes);
+
+ return $node;
+ case 28:
+ $middleByte = Util::read($this->fileHandle, $baseOffset + 3, 1);
+ list(, $middle) = unpack('C', $middleByte);
+ if ($index === 0) {
+ $middle = (0xF0 & $middle) >> 4;
+ } else {
+ $middle = 0x0F & $middle;
+ }
+ $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 3);
+ list(, $node) = unpack('N', chr($middle) . $bytes);
+
+ return $node;
+ case 32:
+ $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
+ list(, $node) = unpack('N', $bytes);
+
+ return $node;
+ default:
+ throw new InvalidDatabaseException(
+ 'Unknown record size: '
+ . $this->metadata->recordSize
+ );
+ }
+ }
+
+ private function resolveDataPointer($pointer)
+ {
+ $resolved = $pointer - $this->metadata->nodeCount
+ + $this->metadata->searchTreeSize;
+ if ($resolved > $this->fileSize) {
+ throw new InvalidDatabaseException(
+ "The MaxMind DB file's search tree is corrupt"
+ );
+ }
+
+ list($data) = $this->decoder->decode($resolved);
+
+ return $data;
+ }
+
+ /*
+ * This is an extremely naive but reasonably readable implementation. There
+ * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
+ * an issue, but I suspect it won't be.
+ */
+ private function findMetadataStart($filename)
+ {
+ $handle = $this->fileHandle;
+ $fstat = fstat($handle);
+ $fileSize = $fstat['size'];
+ $marker = self::$METADATA_START_MARKER;
+ $markerLength = self::$METADATA_START_MARKER_LENGTH;
+ $metadataMaxLengthExcludingMarker
+ = min(self::$METADATA_MAX_SIZE, $fileSize) - $markerLength;
+
+ for ($i = 0; $i <= $metadataMaxLengthExcludingMarker; $i++) {
+ for ($j = 0; $j < $markerLength; $j++) {
+ fseek($handle, $fileSize - $i - $j - 1);
+ $matchBit = fgetc($handle);
+ if ($matchBit !== $marker[$markerLength - $j - 1]) {
+ continue 2;
+ }
+ }
+
+ return $fileSize - $i;
+ }
+ throw new InvalidDatabaseException(
+ "Error opening database file ($filename). " .
+ 'Is this a valid MaxMind DB file?'
+ );
+ }
+
+ /**
+ * @throws \InvalidArgumentException if arguments are passed to the method
+ * @throws \BadMethodCallException if the database has been closed
+ *
+ * @return Metadata object for the database
+ */
+ public function metadata()
+ {
+ if (func_num_args()) {
+ throw new \InvalidArgumentException(
+ 'Method takes no arguments.'
+ );
+ }
+
+ // Not technically required, but this makes it consistent with
+ // C extension and it allows us to change our implementation later.
+ if (!is_resource($this->fileHandle)) {
+ throw new \BadMethodCallException(
+ 'Attempt to read from a closed MaxMind DB.'
+ );
+ }
+
+ return $this->metadata;
+ }
+
+ /**
+ * Closes the MaxMind DB and returns resources to the system.
+ *
+ * @throws \Exception
+ * if an I/O error occurs
+ */
+ public function close()
+ {
+ if (!is_resource($this->fileHandle)) {
+ throw new \BadMethodCallException(
+ 'Attempt to close a closed MaxMind DB.'
+ );
+ }
+ fclose($this->fileHandle);
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php
new file mode 100644
index 00000000..40ae27e0
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php
@@ -0,0 +1,311 @@
+ 'extended',
+ 1 => 'pointer',
+ 2 => 'utf8_string',
+ 3 => 'double',
+ 4 => 'bytes',
+ 5 => 'uint16',
+ 6 => 'uint32',
+ 7 => 'map',
+ 8 => 'int32',
+ 9 => 'uint64',
+ 10 => 'uint128',
+ 11 => 'array',
+ 12 => 'container',
+ 13 => 'end_marker',
+ 14 => 'boolean',
+ 15 => 'float',
+ ];
+
+ public function __construct(
+ $fileStream,
+ $pointerBase = 0,
+ $pointerTestHack = false
+ ) {
+ $this->fileStream = $fileStream;
+ $this->pointerBase = $pointerBase;
+ $this->pointerTestHack = $pointerTestHack;
+
+ $this->switchByteOrder = $this->isPlatformLittleEndian();
+ }
+
+ public function decode($offset)
+ {
+ list(, $ctrlByte) = unpack(
+ 'C',
+ Util::read($this->fileStream, $offset, 1)
+ );
+ $offset++;
+
+ $type = $this->types[$ctrlByte >> 5];
+
+ // Pointers are a special case, we don't read the next $size bytes, we
+ // use the size to determine the length of the pointer and then follow
+ // it.
+ if ($type === 'pointer') {
+ list($pointer, $offset) = $this->decodePointer($ctrlByte, $offset);
+
+ // for unit testing
+ if ($this->pointerTestHack) {
+ return [$pointer];
+ }
+
+ list($result) = $this->decode($pointer);
+
+ return [$result, $offset];
+ }
+
+ if ($type === 'extended') {
+ list(, $nextByte) = unpack(
+ 'C',
+ Util::read($this->fileStream, $offset, 1)
+ );
+
+ $typeNum = $nextByte + 7;
+
+ if ($typeNum < 8) {
+ throw new InvalidDatabaseException(
+ 'Something went horribly wrong in the decoder. An extended type '
+ . 'resolved to a type number < 8 ('
+ . $this->types[$typeNum]
+ . ')'
+ );
+ }
+
+ $type = $this->types[$typeNum];
+ $offset++;
+ }
+
+ list($size, $offset) = $this->sizeFromCtrlByte($ctrlByte, $offset);
+
+ return $this->decodeByType($type, $offset, $size);
+ }
+
+ private function decodeByType($type, $offset, $size)
+ {
+ switch ($type) {
+ case 'map':
+ return $this->decodeMap($size, $offset);
+ case 'array':
+ return $this->decodeArray($size, $offset);
+ case 'boolean':
+ return [$this->decodeBoolean($size), $offset];
+ }
+
+ $newOffset = $offset + $size;
+ $bytes = Util::read($this->fileStream, $offset, $size);
+ switch ($type) {
+ case 'utf8_string':
+ return [$this->decodeString($bytes), $newOffset];
+ case 'double':
+ $this->verifySize(8, $size);
+
+ return [$this->decodeDouble($bytes), $newOffset];
+ case 'float':
+ $this->verifySize(4, $size);
+
+ return [$this->decodeFloat($bytes), $newOffset];
+ case 'bytes':
+ return [$bytes, $newOffset];
+ case 'uint16':
+ case 'uint32':
+ return [$this->decodeUint($bytes), $newOffset];
+ case 'int32':
+ return [$this->decodeInt32($bytes), $newOffset];
+ case 'uint64':
+ case 'uint128':
+ return [$this->decodeBigUint($bytes, $size), $newOffset];
+ default:
+ throw new InvalidDatabaseException(
+ 'Unknown or unexpected type: ' . $type
+ );
+ }
+ }
+
+ private function verifySize($expected, $actual)
+ {
+ if ($expected !== $actual) {
+ throw new InvalidDatabaseException(
+ "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
+ );
+ }
+ }
+
+ private function decodeArray($size, $offset)
+ {
+ $array = [];
+
+ for ($i = 0; $i < $size; $i++) {
+ list($value, $offset) = $this->decode($offset);
+ array_push($array, $value);
+ }
+
+ return [$array, $offset];
+ }
+
+ private function decodeBoolean($size)
+ {
+ return $size === 0 ? false : true;
+ }
+
+ private function decodeDouble($bits)
+ {
+ // XXX - Assumes IEEE 754 double on platform
+ list(, $double) = unpack('d', $this->maybeSwitchByteOrder($bits));
+
+ return $double;
+ }
+
+ private function decodeFloat($bits)
+ {
+ // XXX - Assumes IEEE 754 floats on platform
+ list(, $float) = unpack('f', $this->maybeSwitchByteOrder($bits));
+
+ return $float;
+ }
+
+ private function decodeInt32($bytes)
+ {
+ $bytes = $this->zeroPadLeft($bytes, 4);
+ list(, $int) = unpack('l', $this->maybeSwitchByteOrder($bytes));
+
+ return $int;
+ }
+
+ private function decodeMap($size, $offset)
+ {
+ $map = [];
+
+ for ($i = 0; $i < $size; $i++) {
+ list($key, $offset) = $this->decode($offset);
+ list($value, $offset) = $this->decode($offset);
+ $map[$key] = $value;
+ }
+
+ return [$map, $offset];
+ }
+
+ private $pointerValueOffset = [
+ 1 => 0,
+ 2 => 2048,
+ 3 => 526336,
+ 4 => 0,
+ ];
+
+ private function decodePointer($ctrlByte, $offset)
+ {
+ $pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
+
+ $buffer = Util::read($this->fileStream, $offset, $pointerSize);
+ $offset = $offset + $pointerSize;
+
+ $packed = $pointerSize === 4
+ ? $buffer
+ : (pack('C', $ctrlByte & 0x7)) . $buffer;
+
+ $unpacked = $this->decodeUint($packed);
+ $pointer = $unpacked + $this->pointerBase
+ + $this->pointerValueOffset[$pointerSize];
+
+ return [$pointer, $offset];
+ }
+
+ private function decodeUint($bytes)
+ {
+ list(, $int) = unpack('N', $this->zeroPadLeft($bytes, 4));
+
+ return $int;
+ }
+
+ private function decodeBigUint($bytes, $byteLength)
+ {
+ $maxUintBytes = log(PHP_INT_MAX, 2) / 8;
+
+ if ($byteLength === 0) {
+ return 0;
+ }
+
+ $numberOfLongs = ceil($byteLength / 4);
+ $paddedLength = $numberOfLongs * 4;
+ $paddedBytes = $this->zeroPadLeft($bytes, $paddedLength);
+ $unpacked = array_merge(unpack("N$numberOfLongs", $paddedBytes));
+
+ $integer = 0;
+
+ // 2^32
+ $twoTo32 = '4294967296';
+
+ foreach ($unpacked as $part) {
+ // We only use gmp or bcmath if the final value is too big
+ if ($byteLength <= $maxUintBytes) {
+ $integer = ($integer << 32) + $part;
+ } elseif (extension_loaded('gmp')) {
+ $integer = gmp_strval(gmp_add(gmp_mul($integer, $twoTo32), $part));
+ } elseif (extension_loaded('bcmath')) {
+ $integer = bcadd(bcmul($integer, $twoTo32), $part);
+ } else {
+ throw new \RuntimeException(
+ 'The gmp or bcmath extension must be installed to read this database.'
+ );
+ }
+ }
+
+ return $integer;
+ }
+
+ private function decodeString($bytes)
+ {
+ // XXX - NOOP. As far as I know, the end user has to explicitly set the
+ // encoding in PHP. Strings are just bytes.
+ return $bytes;
+ }
+
+ private function sizeFromCtrlByte($ctrlByte, $offset)
+ {
+ $size = $ctrlByte & 0x1f;
+ $bytesToRead = $size < 29 ? 0 : $size - 28;
+ $bytes = Util::read($this->fileStream, $offset, $bytesToRead);
+ $decoded = $this->decodeUint($bytes);
+
+ if ($size === 29) {
+ $size = 29 + $decoded;
+ } elseif ($size === 30) {
+ $size = 285 + $decoded;
+ } elseif ($size > 30) {
+ $size = ($decoded & (0x0FFFFFFF >> (32 - (8 * $bytesToRead))))
+ + 65821;
+ }
+
+ return [$size, $offset + $bytesToRead];
+ }
+
+ private function zeroPadLeft($content, $desiredLength)
+ {
+ return str_pad($content, $desiredLength, "\x00", STR_PAD_LEFT);
+ }
+
+ private function maybeSwitchByteOrder($bytes)
+ {
+ return $this->switchByteOrder ? strrev($bytes) : $bytes;
+ }
+
+ private function isPlatformLittleEndian()
+ {
+ $testint = 0x00FF;
+ $packed = pack('S', $testint);
+
+ return $testint === current(unpack('v', $packed));
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php
new file mode 100644
index 00000000..d2a9a775
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php
@@ -0,0 +1,10 @@
+binaryFormatMajorVersion =
+ $metadata['binary_format_major_version'];
+ $this->binaryFormatMinorVersion =
+ $metadata['binary_format_minor_version'];
+ $this->buildEpoch = $metadata['build_epoch'];
+ $this->databaseType = $metadata['database_type'];
+ $this->languages = $metadata['languages'];
+ $this->description = $metadata['description'];
+ $this->ipVersion = $metadata['ip_version'];
+ $this->nodeCount = $metadata['node_count'];
+ $this->recordSize = $metadata['record_size'];
+ $this->nodeByteSize = $this->recordSize / 4;
+ $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
+ }
+
+ public function __get($var)
+ {
+ return $this->$var;
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php
new file mode 100644
index 00000000..87ebbf13
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php
@@ -0,0 +1,26 @@
+=5.4",
+ "composer/ca-bundle": "^1.0.3",
+ "ext-curl": "*",
+ "ext-json": "*"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "2.*",
+ "phpunit/phpunit": "4.*",
+ "squizlabs/php_codesniffer": "3.*"
+ },
+ "autoload": {
+ "psr-4": {
+ "MaxMind\\Exception\\": "src/Exception",
+ "MaxMind\\WebService\\": "src/WebService"
+ }
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php
new file mode 100644
index 00000000..ba423627
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php
@@ -0,0 +1,10 @@
+uri = $uri;
+ parent::__construct($message, $httpStatus, $previous);
+ }
+
+ public function getUri()
+ {
+ return $this->uri;
+ }
+
+ public function getStatusCode()
+ {
+ return $this->getCode();
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php
new file mode 100644
index 00000000..fe159a2a
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php
@@ -0,0 +1,10 @@
+error = $error;
+ parent::__construct($message, $httpStatus, $uri, $previous);
+ }
+
+ public function getErrorCode()
+ {
+ return $this->error;
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php
new file mode 100644
index 00000000..31608f71
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php
@@ -0,0 +1,7 @@
+userId = $userId;
+ $this->licenseKey = $licenseKey;
+
+ $this->httpRequestFactory = isset($options['httpRequestFactory'])
+ ? $options['httpRequestFactory']
+ : new RequestFactory();
+
+ if (isset($options['host'])) {
+ $this->host = $options['host'];
+ }
+ if (isset($options['userAgent'])) {
+ $this->userAgentPrefix = $options['userAgent'] . ' ';
+ }
+
+ $this->caBundle = isset($options['caBundle']) ?
+ $this->caBundle = $options['caBundle'] : $this->getCaBundle();
+
+ if (isset($options['connectTimeout'])) {
+ $this->connectTimeout = $options['connectTimeout'];
+ }
+ if (isset($options['timeout'])) {
+ $this->timeout = $options['timeout'];
+ }
+
+ if (isset($options['proxy'])) {
+ $this->proxy = $options['proxy'];
+ }
+ }
+
+ /**
+ * @param string $service name of the service querying
+ * @param string $path the URI path to use
+ * @param array $input the data to be posted as JSON
+ *
+ * @throws InvalidInputException when the request has missing or invalid
+ * data
+ * @throws AuthenticationException when there is an issue authenticating the
+ * request
+ * @throws InsufficientFundsException when your account is out of funds
+ * @throws InvalidRequestException when the request is invalid for some
+ * other reason, e.g., invalid JSON in the POST.
+ * @throws HttpException when an unexpected HTTP error occurs
+ * @throws WebServiceException when some other error occurs. This also
+ * serves as the base class for the above exceptions.
+ *
+ * @return array The decoded content of a successful response
+ */
+ public function post($service, $path, $input)
+ {
+ $body = json_encode($input);
+ if ($body === false) {
+ throw new InvalidInputException(
+ 'Error encoding input as JSON: '
+ . $this->jsonErrorDescription()
+ );
+ }
+
+ $request = $this->createRequest(
+ $path,
+ ['Content-Type: application/json']
+ );
+
+ list($statusCode, $contentType, $body) = $request->post($body);
+
+ return $this->handleResponse(
+ $statusCode,
+ $contentType,
+ $body,
+ $service,
+ $path
+ );
+ }
+
+ public function get($service, $path)
+ {
+ $request = $this->createRequest($path);
+
+ list($statusCode, $contentType, $body) = $request->get();
+
+ return $this->handleResponse(
+ $statusCode,
+ $contentType,
+ $body,
+ $service,
+ $path
+ );
+ }
+
+ private function userAgent()
+ {
+ $curlVersion = curl_version();
+
+ return $this->userAgentPrefix . 'MaxMind-WS-API/' . self::VERSION . ' PHP/' . PHP_VERSION .
+ ' curl/' . $curlVersion['version'];
+ }
+
+ private function createRequest($path, $headers = [])
+ {
+ array_push(
+ $headers,
+ 'Authorization: Basic '
+ . base64_encode($this->userId . ':' . $this->licenseKey),
+ 'Accept: application/json'
+ );
+
+ return $this->httpRequestFactory->request(
+ $this->urlFor($path),
+ [
+ 'caBundle' => $this->caBundle,
+ 'connectTimeout' => $this->connectTimeout,
+ 'headers' => $headers,
+ 'proxy' => $this->proxy,
+ 'timeout' => $this->timeout,
+ 'userAgent' => $this->userAgent(),
+ ]
+ );
+ }
+
+ /**
+ * @param int $statusCode the HTTP status code of the response
+ * @param string $contentType the Content-Type of the response
+ * @param string $body the response body
+ * @param string $service the name of the service
+ * @param string $path the path used in the request
+ *
+ * @throws AuthenticationException when there is an issue authenticating the
+ * request
+ * @throws InsufficientFundsException when your account is out of funds
+ * @throws InvalidRequestException when the request is invalid for some
+ * other reason, e.g., invalid JSON in the POST.
+ * @throws HttpException when an unexpected HTTP error occurs
+ * @throws WebServiceException when some other error occurs. This also
+ * serves as the base class for the above exceptions
+ *
+ * @return array The decoded content of a successful response
+ */
+ private function handleResponse(
+ $statusCode,
+ $contentType,
+ $body,
+ $service,
+ $path
+ ) {
+ if ($statusCode >= 400 && $statusCode <= 499) {
+ $this->handle4xx($statusCode, $contentType, $body, $service, $path);
+ } elseif ($statusCode >= 500) {
+ $this->handle5xx($statusCode, $service, $path);
+ } elseif ($statusCode !== 200) {
+ $this->handleUnexpectedStatus($statusCode, $service, $path);
+ }
+
+ return $this->handleSuccess($body, $service);
+ }
+
+ /**
+ * @return string describing the JSON error
+ */
+ private function jsonErrorDescription()
+ {
+ $errno = json_last_error();
+ switch ($errno) {
+ case JSON_ERROR_DEPTH:
+ return 'The maximum stack depth has been exceeded.';
+ case JSON_ERROR_STATE_MISMATCH:
+ return 'Invalid or malformed JSON.';
+ case JSON_ERROR_CTRL_CHAR:
+ return 'Control character error.';
+ case JSON_ERROR_SYNTAX:
+ return 'Syntax error.';
+ case JSON_ERROR_UTF8:
+ return 'Malformed UTF-8 characters.';
+ default:
+ return "Other JSON error ($errno).";
+ }
+ }
+
+ /**
+ * @param string $path the path to use in the URL
+ *
+ * @return string the constructed URL
+ */
+ private function urlFor($path)
+ {
+ return 'https://' . $this->host . $path;
+ }
+
+ /**
+ * @param int $statusCode the HTTP status code
+ * @param string $contentType the response content-type
+ * @param string $body the response body
+ * @param string $service the service name
+ * @param string $path the path used in the request
+ *
+ * @throws AuthenticationException
+ * @throws HttpException
+ * @throws InsufficientFundsException
+ * @throws InvalidRequestException
+ */
+ private function handle4xx(
+ $statusCode,
+ $contentType,
+ $body,
+ $service,
+ $path
+ ) {
+ if (strlen($body) === 0) {
+ throw new HttpException(
+ "Received a $statusCode error for $service with no body",
+ $statusCode,
+ $this->urlFor($path)
+ );
+ }
+ if (!strstr($contentType, 'json')) {
+ throw new HttpException(
+ "Received a $statusCode error for $service with " .
+ 'the following body: ' . $body,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ }
+
+ $message = json_decode($body, true);
+ if ($message === null) {
+ throw new HttpException(
+ "Received a $statusCode error for $service but could " .
+ 'not decode the response as JSON: '
+ . $this->jsonErrorDescription() . ' Body: ' . $body,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ }
+
+ if (!isset($message['code']) || !isset($message['error'])) {
+ throw new HttpException(
+ 'Error response contains JSON but it does not ' .
+ 'specify code or error keys: ' . $body,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ }
+
+ $this->handleWebServiceError(
+ $message['error'],
+ $message['code'],
+ $statusCode,
+ $path
+ );
+ }
+
+ /**
+ * @param string $message the error message from the web service
+ * @param string $code the error code from the web service
+ * @param int $statusCode the HTTP status code
+ * @param string $path the path used in the request
+ *
+ * @throws AuthenticationException
+ * @throws InvalidRequestException
+ * @throws InsufficientFundsException
+ */
+ private function handleWebServiceError(
+ $message,
+ $code,
+ $statusCode,
+ $path
+ ) {
+ switch ($code) {
+ case 'IP_ADDRESS_NOT_FOUND':
+ case 'IP_ADDRESS_RESERVED':
+ throw new IpAddressNotFoundException(
+ $message,
+ $code,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ case 'AUTHORIZATION_INVALID':
+ case 'LICENSE_KEY_REQUIRED':
+ case 'USER_ID_REQUIRED':
+ case 'USER_ID_UNKNOWN':
+ throw new AuthenticationException(
+ $message,
+ $code,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ case 'OUT_OF_QUERIES':
+ case 'INSUFFICIENT_FUNDS':
+ throw new InsufficientFundsException(
+ $message,
+ $code,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ case 'PERMISSION_REQUIRED':
+ throw new PermissionRequiredException(
+ $message,
+ $code,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ default:
+ throw new InvalidRequestException(
+ $message,
+ $code,
+ $statusCode,
+ $this->urlFor($path)
+ );
+ }
+ }
+
+ /**
+ * @param int $statusCode the HTTP status code
+ * @param string $service the service name
+ * @param string $path the URI path used in the request
+ *
+ * @throws HttpException
+ */
+ private function handle5xx($statusCode, $service, $path)
+ {
+ throw new HttpException(
+ "Received a server error ($statusCode) for $service",
+ $statusCode,
+ $this->urlFor($path)
+ );
+ }
+
+ /**
+ * @param int $statusCode the HTTP status code
+ * @param string $service the service name
+ * @param string $path the URI path used in the request
+ *
+ * @throws HttpException
+ */
+ private function handleUnexpectedStatus($statusCode, $service, $path)
+ {
+ throw new HttpException(
+ 'Received an unexpected HTTP status ' .
+ "($statusCode) for $service",
+ $statusCode,
+ $this->urlFor($path)
+ );
+ }
+
+ /**
+ * @param string $body the successful request body
+ * @param string $service the service name
+ *
+ * @throws WebServiceException if the request body cannot be decoded as
+ * JSON
+ *
+ * @return array the decoded request body
+ */
+ private function handleSuccess($body, $service)
+ {
+ if (strlen($body) === 0) {
+ throw new WebServiceException(
+ "Received a 200 response for $service but did not " .
+ 'receive a HTTP body.'
+ );
+ }
+
+ $decodedContent = json_decode($body, true);
+ if ($decodedContent === null) {
+ throw new WebServiceException(
+ "Received a 200 response for $service but could " .
+ 'not decode the response as JSON: '
+ . $this->jsonErrorDescription() . ' Body: ' . $body
+ );
+ }
+
+ return $decodedContent;
+ }
+
+ private function getCaBundle()
+ {
+ $curlVersion = curl_version();
+
+ // On OS X, when the SSL version is "SecureTransport", the system's
+ // keychain will be used.
+ if ($curlVersion['ssl_version'] === 'SecureTransport') {
+ return;
+ }
+ $cert = CaBundle::getSystemCaRootBundlePath();
+
+ // Check if the cert is inside a phar. If so, we need to copy the cert
+ // to a temp file so that curl can see it.
+ if (substr($cert, 0, 7) === 'phar://') {
+ $tempDir = sys_get_temp_dir();
+ $newCert = tempnam($tempDir, 'geoip2-');
+ if ($newCert === false) {
+ throw new \RuntimeException(
+ "Unable to create temporary file in $tempDir"
+ );
+ }
+ if (!copy($cert, $newCert)) {
+ throw new \RuntimeException(
+ "Could not copy $cert to $newCert: "
+ . var_export(error_get_last(), true)
+ );
+ }
+
+ // We use a shutdown function rather than the destructor as the
+ // destructor isn't called on a fatal error such as an uncaught
+ // exception.
+ register_shutdown_function(
+ function () use ($newCert) {
+ unlink($newCert);
+ }
+ );
+ $cert = $newCert;
+ }
+ if (!file_exists($cert)) {
+ throw new \RuntimeException("CA cert does not exist at $cert");
+ }
+
+ return $cert;
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php
new file mode 100644
index 00000000..e44e408a
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php
@@ -0,0 +1,110 @@
+url = $url;
+ $this->options = $options;
+ }
+
+ /**
+ * @param $body
+ *
+ * @return array
+ */
+ public function post($body)
+ {
+ $curl = $this->createCurl();
+
+ curl_setopt($curl, CURLOPT_POST, true);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
+
+ return $this->execute($curl);
+ }
+
+ public function get()
+ {
+ $curl = $this->createCurl();
+
+ curl_setopt($curl, CURLOPT_HTTPGET, true);
+
+ return $this->execute($curl);
+ }
+
+ /**
+ * @return resource
+ */
+ private function createCurl()
+ {
+ $curl = curl_init($this->url);
+
+ if (!empty($this->options['caBundle'])) {
+ $opts[CURLOPT_CAINFO] = $this->options['caBundle'];
+ }
+ $opts[CURLOPT_SSL_VERIFYHOST] = 2;
+ $opts[CURLOPT_FOLLOWLOCATION] = false;
+ $opts[CURLOPT_SSL_VERIFYPEER] = true;
+ $opts[CURLOPT_RETURNTRANSFER] = true;
+
+ $opts[CURLOPT_HTTPHEADER] = $this->options['headers'];
+ $opts[CURLOPT_USERAGENT] = $this->options['userAgent'];
+ $opts[CURLOPT_PROXY] = $this->options['proxy'];
+
+ // The defined()s are here as the *_MS opts are not available on older
+ // cURL versions
+ $connectTimeout = $this->options['connectTimeout'];
+ if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
+ $opts[CURLOPT_CONNECTTIMEOUT_MS] = ceil($connectTimeout * 1000);
+ } else {
+ $opts[CURLOPT_CONNECTTIMEOUT] = ceil($connectTimeout);
+ }
+
+ $timeout = $this->options['timeout'];
+ if (defined('CURLOPT_TIMEOUT_MS')) {
+ $opts[CURLOPT_TIMEOUT_MS] = ceil($timeout * 1000);
+ } else {
+ $opts[CURLOPT_TIMEOUT] = ceil($timeout);
+ }
+
+ curl_setopt_array($curl, $opts);
+
+ return $curl;
+ }
+
+ private function execute($curl)
+ {
+ $body = curl_exec($curl);
+ if ($errno = curl_errno($curl)) {
+ $errorMessage = curl_error($curl);
+
+ throw new HttpException(
+ "cURL error ({$errno}): {$errorMessage}",
+ 0,
+ $this->url
+ );
+ }
+
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
+ curl_close($curl);
+
+ return [$statusCode, $contentType, $body];
+ }
+}
diff --git a/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/WebService/Http/Request.php b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/WebService/Http/Request.php
new file mode 100644
index 00000000..27bdd58e
--- /dev/null
+++ b/wp/wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/src/WebService/Http/Request.php
@@ -0,0 +1,29 @@
+ 'form',
+ ) );
+
+ return (bool) apply_filters( 'wpcf7_autop_or_not', WPCF7_AUTOP, $options );
}
diff --git a/wp/wp-content/plugins/contact-form-7/includes/mail.php b/wp/wp-content/plugins/contact-form-7/includes/mail.php
index 70cfc2fb..4d68fc95 100644
--- a/wp/wp-content/plugins/contact-form-7/includes/mail.php
+++ b/wp/wp-content/plugins/contact-form-7/includes/mail.php
@@ -6,7 +6,7 @@ add_filter( 'wpcf7_mail_html_body', 'wpcf7_mail_html_body_autop', 10, 1 );
* Filter callback that applies auto-p to HTML email message body.
*/
function wpcf7_mail_html_body_autop( $body ) {
- if ( wpcf7_autop_or_not() ) {
+ if ( wpcf7_autop_or_not( array( 'for' => 'mail' ) ) ) {
$body = wpcf7_autop( $body );
}
diff --git a/wp/wp-content/plugins/contact-form-7/includes/submission.php b/wp/wp-content/plugins/contact-form-7/includes/submission.php
index 9036b703..39d89645 100644
--- a/wp/wp-content/plugins/contact-form-7/includes/submission.php
+++ b/wp/wp-content/plugins/contact-form-7/includes/submission.php
@@ -68,6 +68,14 @@ class WPCF7_Submission {
}
+ /**
+ * Destructor.
+ */
+ public function __destruct() {
+ $this->remove_uploaded_files();
+ }
+
+
/**
* The main logic of submission.
*/
@@ -124,8 +132,6 @@ class WPCF7_Submission {
do_action( 'wpcf7_mail_failed', $contact_form );
}
}
-
- $this->remove_uploaded_files();
};
wpcf7_switch_locale( $this->contact_form->locale(), $callback );
diff --git a/wp/wp-content/plugins/contact-form-7/license.txt b/wp/wp-content/plugins/contact-form-7/license.txt
index 7ded71ac..daf093c5 100644
--- a/wp/wp-content/plugins/contact-form-7/license.txt
+++ b/wp/wp-content/plugins/contact-form-7/license.txt
@@ -1,4 +1,4 @@
-Contact Form 7 WordPress Plugin, 2007-2023 Takayuki Miyoshi
+Contact Form 7 WordPress Plugin, 2007-2024 Takayuki Miyoshi
Contact Form 7 is distributed under the terms of the GNU GPL
This program is free software; you can redistribute it and/or modify
diff --git a/wp/wp-content/plugins/contact-form-7/modules/sendinblue/contact-form-properties.php b/wp/wp-content/plugins/contact-form-7/modules/sendinblue/contact-form-properties.php
index 668456ff..2926659d 100644
--- a/wp/wp-content/plugins/contact-form-7/modules/sendinblue/contact-form-properties.php
+++ b/wp/wp-content/plugins/contact-form-7/modules/sendinblue/contact-form-properties.php
@@ -102,7 +102,7 @@ function wpcf7_sendinblue_editor_panels( $panels ) {
)
);
- $lists = $service->get_lists();
+ $lists = wpcf7_sendinblue_get_lists();
$templates = $service->get_templates();
?>
@@ -301,3 +301,39 @@ function wpcf7_sendinblue_editor_panels( $panels ) {
return $panels;
}
+
+
+/**
+ * Retrieves contact lists from Brevo's database.
+ */
+function wpcf7_sendinblue_get_lists() {
+ static $lists = array();
+
+ $service = WPCF7_Sendinblue::get_instance();
+
+ if ( ! empty( $lists ) or ! $service->is_active() ) {
+ return $lists;
+ }
+
+ $limit = 50;
+ $offset = 0;
+
+ while ( count( $lists ) < $limit * 10 ) {
+ $lists_next = (array) $service->get_lists( array(
+ 'limit' => $limit,
+ 'offset' => $offset,
+ ) );
+
+ if ( ! empty( $lists_next ) ) {
+ $lists = array_merge( $lists, $lists_next );
+ }
+
+ if ( count( $lists_next ) < $limit ) {
+ break;
+ }
+
+ $offset += $limit;
+ }
+
+ return $lists;
+}
diff --git a/wp/wp-content/plugins/contact-form-7/modules/sendinblue/service.php b/wp/wp-content/plugins/contact-form-7/modules/sendinblue/service.php
index 305287cc..752dc1e7 100644
--- a/wp/wp-content/plugins/contact-form-7/modules/sendinblue/service.php
+++ b/wp/wp-content/plugins/contact-form-7/modules/sendinblue/service.php
@@ -252,12 +252,14 @@ trait WPCF7_Sendinblue_API {
}
- public function get_lists() {
+ public function get_lists( $options = '' ) {
+ $options = wp_parse_args( $options, array(
+ 'limit' => 50,
+ 'offset' => 0,
+ ) );
+
$endpoint = add_query_arg(
- array(
- 'limit' => 50,
- 'offset' => 0,
- ),
+ $options,
'https://api.sendinblue.com/v3/contacts/lists'
);
diff --git a/wp/wp-content/plugins/contact-form-7/readme.txt b/wp/wp-content/plugins/contact-form-7/readme.txt
index e8190e81..ea80793d 100644
--- a/wp/wp-content/plugins/contact-form-7/readme.txt
+++ b/wp/wp-content/plugins/contact-form-7/readme.txt
@@ -5,7 +5,7 @@ Tags: contact, form, contact form, feedback, email, ajax, captcha, akismet, mult
Requires at least: 6.2
Requires PHP: 7.4
Tested up to: 6.4
-Stable tag: 5.8.5
+Stable tag: 5.8.6
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -78,6 +78,10 @@ Do you have questions or issues with Contact Form 7? Use these support channels
For more information, see [Releases](https://contactform7.com/category/releases/).
+= 5.8.6 =
+
+[https://contactform7.com/contact-form-7-586/](https://contactform7.com/contact-form-7-586/)
+
= 5.8.5 =
[https://contactform7.com/contact-form-7-585/](https://contactform7.com/contact-form-7-585/)
diff --git a/wp/wp-content/plugins/contact-form-7/wp-contact-form-7.php b/wp/wp-content/plugins/contact-form-7/wp-contact-form-7.php
index ff60a500..1f85730b 100644
--- a/wp/wp-content/plugins/contact-form-7/wp-contact-form-7.php
+++ b/wp/wp-content/plugins/contact-form-7/wp-contact-form-7.php
@@ -7,12 +7,12 @@
* Author URI: https://ideasilo.wordpress.com/
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
- * Version: 5.8.5
+ * Version: 5.8.6
* Requires at least: 6.2
* Requires PHP: 7.4
*/
-define( 'WPCF7_VERSION', '5.8.5' );
+define( 'WPCF7_VERSION', '5.8.6' );
define( 'WPCF7_REQUIRED_WP_VERSION', '6.2' );
diff --git a/wp/wp-content/plugins/ip-geo-block/LICENSE.txt b/wp/wp-content/plugins/ip-geo-block/LICENSE.txt
new file mode 100644
index 00000000..f288702d
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/LICENSE.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. '; + if ( 'updated' === $type ) + echo '', IP_Geo_Block_Util::kses( $msg ), ''; + else + echo 'IP Geo Block: ', IP_Geo_Block_Util::kses( $msg ); + echo '
%s. It seems to have failed downloading ZIP file from WordPress-IP-Geo-API. Try to deactivate IP Geo Block once and activate it again, or install ip-geo-api with write permission according to this instruction.', 'ip-geo-block' ),
+ apply_filters( 'ip-geo-block-api-dir', $settings['api_dir'] ? $settings['api_dir'] : basename( WP_CONTENT_DIR ) )
+ ) );
+ }
+
+ else {
+ $providers = IP_Geo_Block_Provider::get_valid_providers( $settings, FALSE, FALSE, TRUE );
+ if ( empty( $providers ) ) {
+ $this->add_admin_notice( 'error', sprintf(
+ __( 'You should select at least one API at Geolocation API settings. Otherwise you\'ll be blocked after the cache expires.', 'ip-geo-block' ),
+ esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0, 'sec' => 4 ), $network ) ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-4'
+ ) );
+ }
+
+ else {
+ $providers = IP_Geo_Block_Provider::get_addons( $settings['providers'] );
+ if ( empty( $providers ) ) {
+ $this->add_admin_notice( 'error', sprintf(
+ __( 'You should select at least one API for local database at Geolocation API settings. Otherwise access to the external API may slow down the site.', 'ip-geo-block' ),
+ esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0, 'sec' => 4 ), $network ) ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-4'
+ ) );
+ }
+ }
+ }
+
+ // Check consistency of matching rule
+ if ( -1 === (int)$settings['matching_rule'] ) {
+ if ( FALSE !== $updating ) {
+ self::add_admin_notice( 'notice-warning', sprintf(
+ __( 'Now downloading geolocation databases in background. After a little while, please check your country code and “Matching rule” at Validation rules and behavior.', 'ip-geo-block' ),
+ esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME ), $network ) )
+ ) );
+ }
+ else {
+ self::add_admin_notice( 'error', sprintf(
+ __( 'The “Matching rule” is not set properly. Please confirm it at Validation rules and behavior.', 'ip-geo-block' ),
+ esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME ), $network ) )
+ ) );
+ }
+ }
+
+ // Check to finish updating matching rule
+ elseif ( 'done' === $updating ) {
+ delete_transient( IP_Geo_Block::CRON_NAME );
+ self::add_admin_notice( 'updated ', __( 'Local database and matching rule have been updated.', 'ip-geo-block' ) );
+ }
+
+ // Check self blocking (skip during updating)
+ if ( FALSE === $updating && 1 === (int)$settings['validation']['login'] ) {
+ $instance = IP_Geo_Block::get_instance();
+ $validate = $instance->validate_ip( 'login', $settings, TRUE, FALSE ); // skip authentication check
+
+ switch( $validate['result'] ) {
+ case 'limited':
+ self::add_admin_notice( 'error',
+ __( 'Once you logout, you will be unable to login again because the number of login attempts reaches the limit.', 'ip-geo-block' ) . ' ' .
+ sprintf(
+ __( 'Please remove your IP address in “%1$sStatistics in IP address cache%2$s” on “%3$sStatistics%4$s” tab to prevent locking yourself out.', 'ip-geo-block' ),
+ '', '',
+ '', ''
+ )
+ );
+ break;
+
+ case 'blocked':
+ case 'extra':
+ self::add_admin_notice( 'error',
+ ( $settings['matching_rule'] ?
+ __( 'Once you logout, you will be unable to login again because your country code or IP address is in the blacklist.', 'ip-geo-block' ) :
+ __( 'Once you logout, you will be unable to login again because your country code or IP address is not in the whitelist.', 'ip-geo-block' )
+ ) . ' ' .
+ ( 'ZZ' !== $validate['code'] ?
+ sprintf(
+ __( 'Please check your “%sValidation rules and behavior%s”.', 'ip-geo-block' ),
+ '', ''
+ ) :
+ sprintf(
+ __( 'Please confirm your local geolocation database files exist at “%sLocal database settings%s” section, or remove your IP address in cache at “%sStatistics in cache%s” section.', 'ip-geo-block' ),
+ '', '',
+ '', ''
+ )
+ )
+ );
+ break;
+ }
+ }
+
+ // Check consistency of emergency login link
+ if ( isset( $settings['login_link'] ) && $settings['login_link']['link'] && ! IP_Geo_Block_Util::verify_link( $settings['login_link']['link'], $settings['login_link']['hash'] ) ) {
+ self::add_admin_notice( 'error',
+ sprintf(
+ __( 'Emergency login link is outdated. Please delete it once and generate again at “%sPlugin settings%s” section. Also do not forget to update favorites / bookmarks in your browser.', 'ip-geo-block' ),
+ '', ''
+ )
+ );
+ }
+
+ // Check activation of IP Geo Allow
+ if ( $settings['validation']['timing'] && is_plugin_active( 'ip-geo-allow/index.php' ) ) {
+ self::add_admin_notice( 'error',
+ __( '“mu-plugins” (ip-geo-block-mu.php) at “Validation timing” is imcompatible with IP Geo Allow. Please select “init” action hook.', 'ip-geo-block' )
+ );
+ }
+ }
+
+ /**
+ * Setup menu and option page for this plugin
+ *
+ */
+ public function setup_admin_page() {
+ $settings = IP_Geo_Block::get_option();
+
+ // Register the administration menu.
+ $this->add_plugin_admin_menu( $settings );
+
+ // Avoid multiple validation.
+ if ( 'GET' === $_SERVER['REQUEST_METHOD'] )
+ $this->diagnose_admin_screen( $settings );
+
+ // Register settings page only if it is needed.
+ if ( ( isset( $_GET ['page' ] ) && IP_Geo_Block::PLUGIN_NAME === $_GET ['page' ] ) ||
+ ( isset( $_POST['option_page'] ) && IP_Geo_Block::PLUGIN_NAME === $_POST['option_page'] ) ) {
+ $this->register_settings_tab();
+ }
+
+ // Add an action link pointing to the options page. @since 2.7
+ else {
+ add_filter( 'plugin_row_meta', array( $this, 'add_plugin_meta_links' ), 10, 2 );
+ add_filter( 'plugin_action_links_' . IP_GEO_BLOCK_BASE, array( $this, 'add_action_links' ), 10, 1 );
+ }
+
+ // Register scripts for admin.
+ add_action( 'admin_enqueue_scripts', array( 'IP_Geo_Block', 'enqueue_nonce' ), 0 );
+
+ // Show admin notices at the place where it should be. @since 2.5.0
+ add_action( 'admin_notices', array( $this, 'show_admin_notices' ) );
+ add_action( 'network_admin_notices', array( $this, 'show_admin_notices' ) );
+ }
+
+ /**
+ * Get cookie that indicates open/close section
+ *
+ */
+ public function get_cookie() {
+ static $cookie = array();
+
+ if ( empty( $cookie ) && ! empty( $_COOKIE[ IP_Geo_Block::PLUGIN_NAME ] ) ) {
+ foreach ( explode( '&', $_COOKIE[ IP_Geo_Block::PLUGIN_NAME ] ) as $i => $v ) {
+ list( $i, $v ) = explode( '=', $v );
+ $cookie[ $i ] = str_split( $v );
+ }
+ }
+
+ return $cookie;
+ }
+
+ /**
+ * Prints out all settings sections added to a particular settings page
+ *
+ * wp-admin/includes/template.php @since 2.7.0
+ */
+ private function do_settings_sections( $page, $tab ) {
+ global $wp_settings_sections, $wp_settings_fields;
+
+ // target section to be opened
+ $target = isset( $_GET['sec'] ) ? (int)$_GET['sec'] : -1;
+
+ if ( isset( $wp_settings_sections[ $page ] ) ) {
+ $index = 0; // index of fieldset
+ $cookie = $this->get_cookie();
+
+ foreach ( (array) $wp_settings_sections[ $page ] as $section ) {
+ // TRUE if open ('o') or FALSE if close ('x')
+ $stat = empty( $cookie[ $tab ][ $index ] ) || 'x' !== $cookie[ $tab ][ $index ] || $index === $target;
+
+ echo "\n", '\n";
+ ++$index;
+ }
+ }
+ }
+
+ /**
+ * Render the settings page for this plugin.
+ *
+ */
+ public function display_plugin_admin_page() {
+ $tab = $this->admin_tab;
+ $tabs = array(
+ 5 => __( 'Sites list', 'ip-geo-block' ),
+ 0 => __( 'Settings', 'ip-geo-block' ),
+ 1 => __( 'Statistics', 'ip-geo-block' ),
+ 4 => __( 'Logs', 'ip-geo-block' ),
+ 2 => __( 'Search', 'ip-geo-block' ),
+ 3 => __( 'Attribution', 'ip-geo-block' ),
+ );
+
+ $settings = IP_Geo_Block::get_option();
+ $cookie = $this->get_cookie();
+ $title = esc_html( get_admin_page_title() );
+
+ // Target page that depends on the network multisite or not.
+ if ( 'options-general.php' === $GLOBALS['pagenow'] ) {
+ $action = 'options.php';
+ unset( $tabs[5] ); // Sites list
+ if ( $this->is_network_admin ) {
+ $title .= ' ';
+ }
+ }
+
+ // '/wp-admin/network/admin.php'
+ else {
+ // `edit.php` is an action handler for Multisite administration dashboard.
+ // `edit.php` ==> do action `network_admin_edit_ip-geo-block` ==> `validate_network_settings()`
+ $action = 'edit.php?action=' . IP_Geo_Block::PLUGIN_NAME;
+ if ( $this->is_network_admin ) {
+ unset( $tabs[1], $tabs[4], $tabs[2], $tabs[3] ); // Statistics, Logs, Search, Attribution
+ $title .= ' ';
+ }
+ }
+
+?>
+', implode( '
', $tab ), "
', __( 'Thanks for providing these great services for free.', 'ip-geo-block' ), "
\n";
+ echo __( '(Most browsers will redirect you to each site without referrer when you click the link.)', 'ip-geo-block' ), "
', $desc, "
\n"; + + if ( 'select' === $args['type'] ) + break; + + echo "%s. Please check the permission.', 'ip-geo-block' ), '' . $file . ''
+ ) );
+ }
+
+ // Force to finish update matching rule
+ delete_transient( IP_Geo_Block::CRON_NAME );
+
+ // start to update databases immediately
+ do_action( IP_Geo_Block::PLUGIN_NAME . '-settings-updated', $options, TRUE );
+
+ return $options;
+ }
+
+ /**
+ * Validate settings and configure some features for network multisite.
+ *
+ * @see https://vedovini.net/2015/10/using-the-wordpress-settings-api-with-network-admin-pages/
+ */
+ public function validate_network_settings() {
+ // Must check that the user has the required capability
+ $this->check_admin_post( FALSE );
+
+ // The list of registered options (IP_Geo_Block::OPTION_NAME).
+ global $new_whitelist_options;
+ $options = $new_whitelist_options[ IP_Geo_Block::PLUGIN_NAME ];
+
+ // Go through the posted data and save the targetted options.
+ foreach ( $options as $option ) {
+ if ( isset( $_POST[ $option ] ) ) {
+ $this->update_multisite_settings( $_POST[ $option ] );
+ }
+ }
+
+ // Register a settings error to be displayed to the user
+ self::add_admin_notice( 'updated', __( 'Settings saved.' ) );
+
+ // Redirect in order to back to the settings page.
+ wp_redirect( esc_url_raw(
+ add_query_arg(
+ array( 'page' => IP_Geo_Block::PLUGIN_NAME ),
+ $this->dashboard_url( ! empty( $_POST[ $option ]['network_wide'] ) )
+ )
+ ) );
+
+ exit;
+ }
+
+ /**
+ * Update option in all blogs.
+ *
+ * @note: This function triggers `validate_settings()` on register_setting() in wp-include/option.php.
+ */
+ public function update_multisite_settings( $settings ) {
+ global $wpdb;
+ $blog_ids = $wpdb->get_col( "SELECT `blog_id` FROM `$wpdb->blogs`" );
+ $ret = TRUE;
+
+ foreach ( $blog_ids as $id ) {
+ switch_to_blog( $id );
+ $map = IP_Geo_Block::get_option( FALSE );
+ $settings['api_key']['GoogleMap'] = $map['api_key']['GoogleMap'];
+ $ret &= IP_Geo_Block::update_option( $settings, FALSE );
+ restore_current_blog();
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Analyze entries in "Validation logs"
+ *
+ * @param array $logs An array including each entry where:
+ * Array (
+ * [0 DB row number] => 154
+ * [1 Target ] => comment
+ * [2 Time ] => 1534580897
+ * [3 IP address ] => 102.177.147.***
+ * [4 Country code ] => ZA
+ * [5 Result ] => blocked
+ * [6 AS number ] => AS328239
+ * [7 Request ] => POST[80]:/wp-comments-post.php
+ * [8 User agent ] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) ...
+ * [9 HTTP headers ] => HTTP_ORIGIN=http://localhost,HTTP_X_FORWARDED_FOR=102.177.147.***
+ * [10 $_POST data ] => comment=Hello.,author,email,url,comment_post_ID,comment_parent
+ * )
+ * And put a mark at "Target"
+ * ¹¹: Passed in Whitelist
+ * ¹²: Passed in Blacklist
+ * ¹³: Passed not in list
+ * ²¹: Blocked in Whitelist
+ * ²²: Blocked in Blacklist
+ * ²³: Blocked not in list
+ */
+ public function filter_logs( $logs ) {
+ $settings = IP_Geo_Block::get_option();
+
+ // White/Black list for back-end
+ $white_backend = $settings['white_list'];
+ $black_backend = $settings['black_list'];
+
+ // White/Black list for front-end
+ if ( $settings['public']['matching_rule'] < 0 ) {
+ // Follow "Validation rule settings"
+ $white_frontend = $white_backend;
+ $black_frontend = $black_backend;
+ } else {
+ // Whitelist or Blacklist for "Public facing pages"
+ $white_frontend = $settings['public']['white_list'];
+ $black_frontend = $settings['public']['black_list'];
+ }
+
+ foreach ( $logs as $key => $log ) {
+ // Passed or Blocked
+ $mark = IP_Geo_Block::is_passed( $log[5] ) ? '¹' : '²';
+
+ // Whitelisted, Blacklisted or N/A
+ if ( 'public' === $log[1] ) {
+ $mark .= IP_Geo_Block::is_listed( $log[4], $white_frontend ) ? '¹' : (
+ IP_Geo_Block::is_listed( $log[4], $black_frontend ) ? '²' : '³' );
+ } else {
+ $mark .= IP_Geo_Block::is_listed( $log[4], $white_backend ) ? '¹' : (
+ IP_Geo_Block::is_listed( $log[4], $black_backend ) ? '²' : '³' );
+ }
+
+ // Put a mark at "Target"
+ $logs[ $key ][1] .= $mark;
+ }
+
+ return $logs;
+ }
+
+ /**
+ * Register UI "Preset filters" at "Search in logs"
+ *
+ * @param array $filters An empty array by default.
+ * @return array $filters The array of paired with 'title' and 'value'.
+ */
+ public function preset_filters( $filters = array() ) {
+ return array(
+ array( 'title' => '' . __( 'Passed in Whitelist', 'ip-geo-block' ), 'value' => '¹¹' ),
+ array( 'title' => '' . __( 'Passed in Blacklist', 'ip-geo-block' ), 'value' => '¹²' ),
+ array( 'title' => '' . __( 'Passed not in List', 'ip-geo-block' ), 'value' => '¹³' ),
+ array( 'title' => '' . __( 'Blocked in Whitelist', 'ip-geo-block' ), 'value' => '²¹' ),
+ array( 'title' => '' . __( 'Blocked in Blacklist', 'ip-geo-block' ), 'value' => '²²' ),
+ array( 'title' => '' . __( 'Blocked not in List', 'ip-geo-block' ), 'value' => '²³' ),
+ );
+ }
+
+ /**
+ * Ajax callback function
+ *
+ * @link https://codex.wordpress.org/AJAX_in_Plugins
+ * @link https://codex.wordpress.org/Function_Reference/check_ajax_referer
+ * @link https://core.trac.wordpress.org/browser/trunk/wp-admin/admin-ajax.php
+ */
+ public function admin_ajax_callback() {
+ require_once IP_GEO_BLOCK_PATH . 'admin/includes/class-admin-ajax.php';
+
+ // Check request origin, nonce, capability.
+ $this->check_admin_post( TRUE );
+
+ // `$which` and `$cmd` should be restricted by whitelist in each function
+ $settings = IP_Geo_Block::get_option();
+ $which = isset( $_POST['which'] ) ? $_POST['which'] : NULL;
+ $cmd = isset( $_POST['cmd' ] ) ? $_POST['cmd' ] : NULL;
+
+ switch ( $cmd ) {
+ case 'download':
+ $res = IP_Geo_Block::get_instance();
+ $res = $res->exec_update_db();
+ break;
+
+ case 'search': // Get geolocation by IP
+ $res = array();
+ foreach ( (array)$which as $cmd ) {
+ $res[ $cmd ] = IP_Geo_Block_Admin_Ajax::search_ip( $cmd );
+ }
+ break;
+
+ case 'scan-code': // Fetch providers to get country code
+ $res = IP_Geo_Block_Admin_Ajax::scan_country( $which );
+ break;
+
+ case 'clear-statistics': // Set default values
+ IP_Geo_Block_Logs::clear_stat();
+ $res = array(
+ 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
+ 'tab' => 'tab=1'
+ );
+ break;
+
+ case 'clear-cache': // Delete cache of IP address
+ IP_Geo_Block_API_Cache::clear_cache();
+ $res = array(
+ 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
+ 'tab' => 'tab=1'
+ );
+ break;
+
+ case 'clear-logs': // Delete logs in MySQL DB
+ IP_Geo_Block_Logs::clear_logs( $which );
+ $res = array(
+ 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
+ 'tab' => 'tab=4'
+ );
+ break;
+
+ case 'export-logs':// Export logs from MySQL DB
+ IP_Geo_Block_Admin_Ajax::export_logs( $which );
+ break;
+
+ case 'restore-logs': // Get logs from MySQL DB
+ has_filter( $cmd = IP_Geo_Block::PLUGIN_NAME . '-logs' ) or add_filter( $cmd, array( $this, 'filter_logs' ) );
+ $res = IP_Geo_Block_Admin_Ajax::restore_logs( $which );
+ break;
+
+ case 'live-start': // Restore live log
+ has_filter( $cmd = IP_Geo_Block::PLUGIN_NAME . '-logs' ) or add_filter( $cmd, array( $this, 'filter_logs' ) );
+ if ( is_wp_error( $res = IP_Geo_Block_Admin_Ajax::restore_live_log( $which, $settings ) ) )
+ $res = array( 'error' => $res->get_error_message() );
+ break;
+
+ case 'live-pause': // Pause live log
+ if ( ! is_wp_error( $res = IP_Geo_Block_Admin_Ajax::catch_live_log() ) )
+ $res = array( 'data' => array() );
+ else
+ $res = array( 'error' => $res->get_error_message() );
+ break;
+
+ case 'live-stop': // Stop live log
+ if ( ! is_wp_error( $res = IP_Geo_Block_Admin_Ajax::release_live_log() ) )
+ $res = array( 'data' => array() );
+ else
+ $res = array( 'error' => $res->get_error_message() );
+ break;
+
+ case 'reset-live': // Reset data source of live log
+ $res = IP_Geo_Block_Admin_Ajax::reset_live_log();
+ break;
+
+ case 'validate': // Validate settings
+ IP_Geo_Block_Admin_Ajax::validate_settings( $this );
+ break;
+
+ case 'import-default': // Import initial settings
+ $res = IP_Geo_Block_Admin_Ajax::settings_to_json( IP_Geo_Block::get_default() );
+ break;
+
+ case 'import-preferred': // Import preference
+ $res = IP_Geo_Block_Admin_Ajax::preferred_to_json();
+ break;
+
+ case 'gmap-error': // Reset Google Maps API key
+ if ( $settings['api_key']['GoogleMap'] === 'default' ) {
+ $settings['api_key']['GoogleMap'] = NULL;
+ IP_Geo_Block::update_option( $settings );
+ $res = array(
+ 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
+ 'tab' => 'tab=2'
+ );
+ }
+ break;
+
+ case 'generate-link': // Generate new link
+ $res = array( 'link' => IP_Geo_Block_Util::generate_link( $this ) );
+ break;
+
+ case 'delete-link': // Delete existing link
+ IP_Geo_Block_Util::delete_link( $this );
+ break;
+
+ case 'show-info': // Show system and debug information
+ $res = IP_Geo_Block_Admin_Ajax::get_wp_info();
+ break;
+
+ case 'get-actions': // Get all the ajax/post actions
+ $res = IP_Geo_Block_Util::get_registered_actions( TRUE );
+ break;
+
+ case 'export-cache': // Restore cache from database and format for DataTables
+ IP_Geo_Block_Admin_Ajax::export_cache( $settings['anonymize'] );
+ break;
+
+ case 'restore-cache': // Restore cache from database and format for DataTables
+ $res = IP_Geo_Block_Admin_Ajax::restore_cache( $settings['anonymize'] );
+ break;
+
+ case 'bulk-action-remove': // Delete specified IP addresses from cache
+ $res = IP_Geo_Block_Logs::delete_cache_entry( $which['IP'] );
+ break;
+
+ case 'bulk-action-ip-erase':
+ $res = IP_Geo_Block_Logs::delete_logs_entry( $which['IP'] );
+ break;
+
+ case 'bulk-action-ip-white':
+ case 'bulk-action-ip-black':
+ case 'bulk-action-as-white':
+ case 'bulk-action-as-black':
+ // Bulk actions for registration of settings
+ $src = ( FALSE !== strpos( $cmd, '-ip-' ) ? 'IP' : 'AS' );
+ $dst = ( FALSE !== strpos( $cmd, '-white' ) ? 'white_list' : 'black_list' );
+
+ if ( empty( $which[ $src ] ) ) {
+ $res = array( 'error' => sprintf( __( 'An error occurred while executing the ajax command `%s`.', 'ip-geo-block' ), $cmd ) );
+ break;
+ }
+
+ foreach ( array_unique( (array)$which[ $src ] ) as $val ) {
+ // replace anonymized IP address with CIDR (IPv4:256, IPv6:4096)
+ $val = preg_replace(
+ array( '/\.\*\*\*$/', '/:\w*\*\*\*$/', '/(::.*)::\/116$/' ),
+ array( '.0/24', '::/116', '$1/116' ),
+ trim( $val )
+ );
+ if ( ( filter_var( preg_replace( '/\/\d+$/', '', $val ), FILTER_VALIDATE_IP ) || preg_match( '/^AS\d+$/', $val ) ) &&
+ ( FALSE === strpos( $settings['extra_ips'][ $dst ], $val ) ) ) {
+ $settings['extra_ips'][ $dst ] .= "\n" . $val;
+ }
+ }
+
+ if ( $this->is_network_admin && $settings['network_wide'] )
+ $this->update_multisite_settings( $settings );
+ else
+ IP_Geo_Block::update_option( $settings );
+
+ $res = array( 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME );
+ break;
+
+ case 'restore-network': // Restore blocked per target in logs
+ $res = IP_Geo_Block_Admin_Ajax::restore_network( $which, (int)$_POST['offset'], (int)$_POST['length'], FALSE );
+ break;
+
+ case 'find-admin':
+ case 'find-plugins':
+ case 'find-themes':
+ // Get slug in blocked requests for exceptions
+ $res = IP_Geo_Block_Admin_Ajax::find_exceptions( $cmd );
+ break;
+
+ case 'diag-tables': // Check database tables
+ IP_Geo_Block_Logs::diag_tables() or IP_Geo_Block_Logs::create_tables();
+ $res = array( 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME );
+ break;
+ }
+
+ if ( isset( $res ) ) // wp_send_json_{success,error}() @since 3.5.0
+ wp_send_json( $res ); // @since 3.5.0
+
+ die(); // End of ajax
+ }
+
+}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/admin-icons.css b/wp/wp-content/plugins/ip-geo-block/admin/css/admin-icons.css
new file mode 100644
index 00000000..61110679
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/css/admin-icons.css
@@ -0,0 +1,79 @@
+/*! IP Geo Block admin icons
+ * This package includes the following icon font.
+ * IcoMoon - Free / Designer: Keyamoon / License: GPL / CC BY 4.0
+ * Zondicons / Designer: Steve Schoger / License: CC BY 4.0
+ * Material Icons / Designer: Google / License: Apache License 2.0
+ */
+@font-face {
+ font-family: 'icomoon';
+ src: url('fonts/icomoon.eot?jihakz');
+ src: url('fonts/icomoon.eot?jihakz#iefix') format('embedded-opentype'),
+ url('fonts/icomoon.ttf?jihakz') format('truetype'),
+ url('fonts/icomoon.woff?jihakz') format('woff'),
+ url('fonts/icomoon.svg?jihakz#icomoon') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+[class^="ip-geo-block-icon-"], [class*=" ip-geo-block-icon-"] {
+ /* use !important to prevent issues with browser extensions that change fonts */
+ font-family: 'icomoon' !important;
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+
+ /* Better Font Rendering =========== */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.ip-geo-block-icon-calc {
+ margin-top: 0.2em !important;
+}
+.ip-geo-block-icon-calc:before {
+ content: "\e901";
+}
+.ip-geo-block-icon-vpn_lock:before {
+ content: "\e62f";
+}
+.ip-geo-block-icon-play:before {
+ content: "\ea1c";
+}
+.ip-geo-block-icon-pause:before {
+ content: "\ea1d";
+}
+.ip-geo-block-icon-stop:before {
+ content: "\ea1e";
+}
+.ip-geo-block-icon-warning:before {
+ content: "\e900";
+}
+.ip-geo-block-icon-happy:before {
+ content: "\e9df";
+}
+.ip-geo-block-icon-grin2:before {
+ content: "\e9ea";
+}
+.ip-geo-block-icon-cool:before {
+ content: "\e9eb";
+}
+.ip-geo-block-icon-confused:before {
+ content: "\e9f5";
+}
+.ip-geo-block-icon-confused2:before {
+ content: "\e9f6";
+}
+.ip-geo-block-icon-crying:before {
+ content: "\ea01";
+}
+
+/* Dashicons is the official icon font of the WordPress admin as of 3.8+. */
+#toplevel_page_ip-geo-block .dashicons-admin-generic:before {
+ font-family: 'icomoon';
+ content: "\e62f";
+ font-size: 18px;
+ margin-left: 2px;
+}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/admin-icons.min.css b/wp/wp-content/plugins/ip-geo-block/admin/css/admin-icons.min.css
new file mode 100644
index 00000000..6c9419fe
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/css/admin-icons.min.css
@@ -0,0 +1,7 @@
+/*! IP Geo Block admin icons
+ * This package includes the following icon font.
+ * IcoMoon - Free / Designer: Keyamoon / License: GPL / CC BY 4.0
+ * Zondicons / Designer: Steve Schoger / License: CC BY 4.0
+ * Material Icons / Designer: Google / License: Apache License 2.0
+ */
+@font-face{font-family:icomoon;src:url(fonts/icomoon.eot?jihakz);src:url(fonts/icomoon.eot?jihakz#iefix) format('embedded-opentype'),url(fonts/icomoon.ttf?jihakz) format('truetype'),url(fonts/icomoon.woff?jihakz) format('woff'),url(fonts/icomoon.svg?jihakz#icomoon) format('svg');font-weight:400;font-style:normal}[class*=" ip-geo-block-icon-"],[class^=ip-geo-block-icon-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ip-geo-block-icon-calc{margin-top:.2em!important}.ip-geo-block-icon-calc:before{content:"\e901"}.ip-geo-block-icon-vpn_lock:before{content:"\e62f"}.ip-geo-block-icon-play:before{content:"\ea1c"}.ip-geo-block-icon-pause:before{content:"\ea1d"}.ip-geo-block-icon-stop:before{content:"\ea1e"}.ip-geo-block-icon-warning:before{content:"\e900"}.ip-geo-block-icon-happy:before{content:"\e9df"}.ip-geo-block-icon-grin2:before{content:"\e9ea"}.ip-geo-block-icon-cool:before{content:"\e9eb"}.ip-geo-block-icon-confused:before{content:"\e9f5"}.ip-geo-block-icon-confused2:before{content:"\e9f6"}.ip-geo-block-icon-crying:before{content:"\ea01"}#toplevel_page_ip-geo-block .dashicons-admin-generic:before{font-family:icomoon;content:"\e62f";font-size:18px;margin-left:2px}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/admin.css b/wp/wp-content/plugins/ip-geo-block/admin/css/admin.css
new file mode 100644
index 00000000..cf7a61d7
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/css/admin.css
@@ -0,0 +1,1015 @@
+/*!
+ * Project: WordPress IP Geo Block
+ * Copyright (c) 2013-2019 tokkonopapa (tokkonopapa@yahoo.com)
+ * This software is released under the MIT License.
+ */
+dfn {
+ cursor: help;
+ border-bottom: 1px dotted #888;
+}
+
+/* style legend and fieldset as panel */
+fieldset, legend {
+ padding: 0;
+ margin: 0;
+ border: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+fieldset {
+ min-width: 0;
+}
+legend {
+ display: block;
+ line-height: inherit;
+ width: 100%;
+}
+label {
+ display: inline-block;
+ max-width: 100%;
+}
+.panel {
+ border-color: #888;
+ border: 1px solid #e5e5e5;
+ -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.04);
+ -moz-box-shadow: 0 1px 1px rgba(0,0,0,.04);
+ box-shadow: 0 1px 1px rgba(0,0,0,.04);
+ background: #f5f5f5;
+}
+.panel-heading {
+ float: left !important;
+ background: #fff;
+}
+.panel-default > .panel-heading {
+ border-color: inherit;
+}
+.panel-body {
+ width: 100%;
+ padding: 0 1em;
+ display: inline-block;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.panel-body:before,
+.panel-body:after {
+ content: " ";
+ display: table;
+}
+.panel-body:after {
+ clear: both;
+}
+.ip-geo-block-navi-link {
+ text-align: left;
+}
+.ip-geo-block-help-link {
+ float: right;
+ font-size: 90%;
+ font-weight: normal;
+}
+.ip-geo-block-help-link a {
+ box-shadow: none;
+}
+
+/* style legend and fieldset */
+fieldset label {
+ vertical-align: text-middle;
+}
+fieldset input[type="checkbox"] {
+ margin: 1px 2px 0;
+}
+fieldset.ip-geo-block-field {
+/* padding: 0 10px;*/
+ margin: 1em 0;
+}
+fieldset.ip-geo-block-field h2,
+fieldset.ip-geo-block-field h3 {
+ padding: 0;
+ margin: 0;
+ font-size: 14px !important;
+}
+fieldset.ip-geo-block-field h4 {
+ margin: 0.75em 0 0.5em 0;
+}
+fieldset.ip-geo-block-field legend.panel-heading {
+ padding: 10px;
+}
+
+fieldset.ip-geo-block-field .ip-geo-block-dropup,
+fieldset.ip-geo-block-field .ip-geo-block-dropdown {
+ cursor: pointer;
+ position: relative;
+ padding-left: 1em;
+}
+fieldset.ip-geo-block-field .ip-geo-block-dropup:before,
+fieldset.ip-geo-block-field .ip-geo-block-dropdown:before {
+ content: '';
+ height: 0;
+ width: 0;
+ border: 0.4em solid transparent;
+ position: absolute;
+}
+fieldset.ip-geo-block-field .ip-geo-block-dropup:before {
+ border-left: 0.4em solid #555;
+ left: 2px;
+ top: 18%;
+}
+fieldset.ip-geo-block-field .ip-geo-block-dropdown:before {
+ border-top: 0.4em solid #555;
+ left: -2px;
+ top: 38%;
+}
+fieldset.ip-geo-block-field .form-table .ip-geo-block-dropup,
+fieldset.ip-geo-block-field .form-table .ip-geo-block-dropdown {
+ margin-top: 0.75em;
+}
+fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before {
+ top: 0.25em;
+}
+fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before {
+ top: 0.5em;
+}
+fieldset.ip-geo-block-field table.form-table {
+ margin: 0 0 0.5em;
+ width: 100%;
+}
+
+/* Text */
+textarea.regular-text {
+ width: 25em;
+}
+fieldset.ip-geo-block-field input.regular-text,
+fieldset.ip-geo-block-field textarea.regular-text {
+ font-size: 95%;
+}
+
+/* Checkbox / Radio */
+p.ip-geo-block-navi-link input[type="checkbox"],
+fieldset.ip-geo-block-field input[type="checkbox"],
+fieldset.ip-geo-block-field input[type="radio"] {
+ margin-right: 0.4em;
+}
+
+/* Plugins/Themes area, Geolocation API settings */
+input[id*="ip_geo_block_settings_rewrite_"] + label {
+ margin-left: 0.25em;
+}
+input[id*="ip_geo_block_settings_providers"] + label {
+ min-width: 7em;
+}
+
+/* Folding */
+.ip-geo-block-settings-folding {
+ margin: 0.5em 0;
+}
+.ip-geo-block-settings-folding ul {
+ margin-bottom: 0;
+}
+.ip-geo-block-settings-folding li {
+ margin: 0.5em 0;
+}
+.folding-disable {
+ pointer-events: none;
+ opacity: 0.5;
+}
+.folding-inactive {
+ opacity: 0.5;
+ font-style:oblique !important;
+}
+
+/* Etc */
+.ip-geo-block-float li {
+ display: inline-block;
+ width: 18em;
+ margin-top: 0;
+}
+.ip-geo-block-checked {
+ list-style-type: disc;
+}
+.ip-geo-block-ip-addr {
+ display: inline-block;
+ padding-top: 5px;
+}
+.ip-geo-block-hide {
+ display: none;
+}
+.ip-geo-block-sup {
+ margin-left: 0.2em;
+ display: inline-block;
+}
+.ip-geo-block-note {
+ margin-top: 1em;
+ list-style: disc inside;
+}
+.ip-geo-block-note li {
+ text-indent: -1em;
+ padding-left: 1em;
+}
+.ip-geo-block-border {
+ border-top: inherit;
+}
+.ip-geo-block-notice {
+ color: #dd3d36;
+}
+.ip-geo-block-title {
+ width: 100px;
+ display: inline-block;
+}
+.ip-geo-block-result {
+ color: #2786C2;
+ display: inline-block;
+}
+.ip-geo-block-primary {
+ color: #fff !important;;
+ background: #00838f !important;
+ border-color: #00707a !important;
+ text-shadow: none; /* for WordPress 3.7.21 */
+}
+.ip-geo-block-primary:hover {
+ background-color: #00919e !important;
+ border-color: #00525a !important;
+}
+ul#ip-geo-block-logs-preset {
+ margin: 0.25em 0;
+ max-width: 600px;
+}
+ul#ip-geo-block-logs-preset li {
+ float: left;
+ line-height: 1.5em;
+ margin-right: 1em;
+ min-width: 160px;
+}
+
+/* Loading image */
+.ip-geo-block-loading,
+#ip-geo-block-live-loading {
+ height: 16px;
+ width: 16px;
+ background-size: 16px 16px;
+ background-position: center center;
+ background-repeat: no-repeat;
+ margin-left: 1em;
+ margin-top: 0.2em;
+ display: inline-block;
+ vertical-align: top;
+}
+.ip-geo-block-loading {
+ background-image: url(data:image/gif;base64,R0lGODlhEAAQAPYCAKqqqsbGxlZWVsrKyvr6+ubm5tDQ0K6urmZmZmJiYuzs7IaGhvT09JycnLq6us7Ozurq6o6OjtbW1tra2vDw8CgoKCYmJvz8/NLS0kJCQlJSUqysrPLy8vb29pqamra2tm5ubujo6Kampvj4+IiIiMjIyEhISNzc3OLi4rKysj4+PlBQULi4uJKSkmRkZODg4KKiou7u7iQkJB4eHlpaWhISErCwsHh4eMDAwDIyMi4uLqSkpIKCgr6+vt7e3n5+fggICJCQkAwMDEpKSmBgYHZ2dhgYGBYWFnx8fF5eXk5OTiIiIjAwMIyMjISEhDQ0NJaWltTU1AQEBBwcHGpqaoqKiuTk5CoqKlhYWAoKCtjY2Hp6ehAQEJ6ensLCwkxMTJSUlCwsLAYGBnR0dDg4OFxcXLy8vKCgoA4ODsTExMzMzDw8PERERDY2NqioqHJycrS0tGhoaBQUFEZGRjo6OkBAQICAgHBwcFRUVCAgIGxsbP///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgACACwAAAAAEAAQAEAHjIACgoOEhYJsbTGGghcPGIJRbFNNhgQKCheDDkllDQYMHSc4MAcvhTB0aFliggQjmYNEFQ6LAh0+VoIwbFW1GGamhCgfUE5NbgMKtQYLc0a1gjsyR3E2IYwMFASDYDJvtRRWFIJ1TMq1ElqCICpetQoBEoInVCsAhhI2XhyEPUgIIG7waALlwAloCAMBACH5BAkKAAIALAEAAQAOAA4AAAeDgAKCEmBYYRVKJAaCjAcrVzIzRjVoTw2MKRk5Ww4KECkuWTWCE0Rrl4yCTow7bAupsBcCW19psKkjBEQaFLeMHBwINBy+ggoxVQkPxSMFMXBUMMUQPhRWVUU9tyFRLwQCA048cCcjIyFaJQYxjA8NEVBnAClmahCwEANwbjYBJwyMAgEAIfkECQoABQAsAQABAA4ADgAAB4OABYInO29DbC5QUYKMZiBfbCptTBUmIow4LgJBaTExZkVLFTAFKD8JB4yMQUZrBixUXaqqVFwkUG8Ys4wpQiZOWwy7ghBiRk08HcOqblUTy4wlLWbLBCMFCgBdurMjFMoFE24ADxAXFwwKITEEjD5mH2YBDxI+IdeqHCcGAxgv7IwCAQAh+QQJCgAAACwBAAEADgAOAAAHhYAAglYfTVQJSCITgowDVSAISQJKJgkpjA8LWyIGHBQBJCoZBwAQDU44jIxdTxoSAxEfqqpbFWApUCezjA5LWCJdI7uCClNXGyLCwxBHFl4HBcMAKVxfEx8Y0glZCxwlOCjDUkwPACElAygMghftAB6MClpRJygQFB0EuyMKBQUKDPQxCgQAIfkECQoAAAAsAQABAA4ADgAAB4SAAIIKahstTQ0OVoKMJzYeLVU8W29OXowvBztePh0dUTtxVD0AHDgHEoyMKWVvPj4sBqqqLUoiGDgQs4wBJmNqARe7gjEqXxgPwsMxbWw+UQzDAGY6LjEnusNjFmAEBVbRs00zc1EAHRAKHYw2CHIyO4wEHAwjgmJCZDC7F8psC7IEBQIAIfkECQoARwAsAQABAA4ADgAAB4OAR4IMPgMfNg4PCoKMEA84LCkAMB47GIwxBiUTEAQjKD0REQ9HBD4YIYyMATwtBRQnqaqMG0UOEC8ds4wYIEEQBbuMHC4gMYvCRxw0CAwcF8kBGj8EHdDCJCYiRxfXsw0qCROqRDYQECw3ORkpqjpAQjVGMxYrB7MPC0MyFQItEowCAQAh+QQJCgACACwBAAEADgAOAAAHgIACghcUVhIYEigMgowjEC8nUQ8BOGkojAQxITEdAhcxEh9wPoIMFCOMjBMAKTEXHaipjGldDxcEsqkvUAe5sh1NLb6pHTxNbGK9vlE3DU5ZLsNnIA4GbTVVuQcJdpdnS0Z3LAoxXhF4LjiMMBl5FjptKiZ6ZrJRLUkqbCAwJ4yBACH5BAUKAAEALAEAAQAOAA4AAAd/gAGCARcjHDExHASDjAQdHAoFLy8Ugw2MgiMKWhIKAQ9MYpiCEA8YHQtZCaOCJ14vX2g2rAEKZgMyNRC0BCksFUa7rCMANgIzH7QvZw4tMmO0DlAPUV9hHqNeVTC7G2tkTmkUHA8iSFUGgzZlGSYaNC4gTWqYEzA3SQhVH1aDgQA7);
+}
+
+/* Google Map infomation window */
+#ip-geo-block-map {
+ height: 400px;
+ margin: 1em auto;
+}
+#ip-geo-block-apis div.nav-tab-wrapper {
+ padding-top: 0;
+ margin-bottom: 1em;
+}
+#ip-geo-block-geoinfo {
+ white-space: normal;
+ word-wrap: break-word;
+ word-break: break-all;
+}
+#ip-geo-block-geoinfo ul {
+ margin-top: 0;
+ margin-left: 1em;
+}
+.gm-style-iw {
+ width: 18em;
+ height: auto !important;
+ height: 100%;
+ min-height: 100%:
+}
+.gm-style-iw ul {
+ margin: 0.1em;
+}
+.gm-style-iw li {
+ margin: 0.2em;
+}
+
+/* SVG in google chart */
+svg a {
+ cursor: pointer;
+}
+svg a:hover > text {
+ fill: #0096dd;
+}
+svg a > text {
+ fill: #0073aa;
+ text-decoration: underline;
+}
+
+/* table */
+table.ip-geo-block-statistics-table {
+ float: right;
+}
+table.ip-geo-block-statistics-table th,
+table.ip-geo-block-statistics-table td {
+ width: 12em;
+ margin: 0;
+ padding: 0.2em;
+ text-align: right;
+ line-height: 1.5em;
+ word-wrap: break-word;
+}
+table.ip-geo-block-statistics-table tr:nth-child(even) {
+ background-color: #eee;
+}
+table.ip-geo-block-statistics-table tr:nth-child(odd) {
+}
+table.ip-geo-block-table {
+ margin: 1em 0;
+ width: 100%;
+ white-space: normal;
+ word-wrap: break-word;
+ word-break: break-all;
+}
+table.ip-geo-block-table td:first-child {
+ min-width: 4.3em;
+ max-width: 5.0em;
+}
+
+/* Whois */
+@media screen and (max-width:782px) {
+ #ip-geo-block-whois .panel-body {
+ padding: 0 0.5em;
+ }
+}
+
+/* Scan the country code */
+#ip-geo-block-scan-code {
+ vertical-align: middle;
+}
+#ip-geo-block-code-list {
+ display: none;
+ margin-bottom: 0;
+}
+
+/* Google Chart */
+#ip-geo-block-chart-countries {
+ height: 200px;
+}
+#ip-geo-block-chart-daily {
+ height: 240px;
+}
+#ip_geo_block_settings_validation_mimetype + label {
+ padding-top: 0.25em;
+}
+#ip_geo_block_settings_validation_mimetype + label + ul {
+ margin-top: 0.7em;
+}
+#ip_geo_block_settings_create_user {
+ margin-bottom: 0.5em;
+}
+#ip-geo-block-toggle-sections,
+#ip-geo-block-back-to-top a {
+ box-shadow: none;
+}
+#ip-geo-block-wp-info textarea {
+ margin-top: 0.5em;
+ overflow: auto;
+ width: 100%;
+ word-wrap: normal;
+ word-break: normal;
+ white-space: pre;
+}
+#ip-geo-block-back-to-top {
+ margin:0;
+ text-align:right;
+}
+#ip-geo-block-open-new,
+#ip-geo-block-live-update {
+ margin-left: 1em;
+}
+
+/* Top menu link */
+.ip-geo-block-menu-link {
+ font-size: 13px !important;
+}
+
+/* Icons */
+dfn ~ .ip-geo-block-icon {
+ margin-left: 0.4em;
+}
+.ip-geo-block-icon {
+ position: relative;
+ cursor: pointer;
+ outline: none;
+ box-shadow: none;
+ text-decoration: none;
+ background-color: transparent;
+}
+.ip-geo-block-icon:active {
+ top: 1px;
+}
+.ip-geo-block-icon span {
+ height: 16px;
+ width: 16px;
+ margin: 0;
+ border: none;
+ display: inline-block;
+ vertical-align: middle;
+ background-size: 16px 16px;
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+.ip-geo-block-icon-cycle span {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAda2otLp+rsSHprWHr8IBd7EpfKRGhaNajqeUqrRymKuKoq5yo7prlKgAcqoVe6w8gqQmgq5Tj6wIdqsVdKIshrEMea1Uhp+Anqw0hawDdq4gfKhljqE7hqoLdKYbgbM4jLQygKUGeK8CdawQd6gVeKcad6NKkrSerrZAj7UAc6sAc6rc3NySrVGQAAAALXRSTlP//////////////////////////////////////////////////////////wCl7wv9AAACOklEQVR4Ae2W15rzKgxF9xTZzhTX9B7S/gN6/9ebYqzzGZsw/S7LV3FZgCSIwD/kQ8FVcBU8xatZUczy8luC/ABNOn0DSHEsvyZ4PgLatNCYR3efFxyhTQ8g+qQgJxgv2JefERzJXATRh4LHOUwAHD4S7OGEztRJaN86hAUxtaNWDUf/bRdDBbQMWVDAO8jn89WUhag1MeyCAh6hHofyrliLgZKggDMYgzF3eVAwFq0uCZq5KY0TezjIHDDzC0qqmkwe2ctGDOQVLMkgu+F3/rGXwb4xIPcJ6P3JgkM8wFjmfcFAWfeKQywaAz33BJVuHsUcAt09gVbuLDThAJkdR687ggLmf4gDJLIGV7BydtB8yn3u+fbtuj/LS7G9wZAd1AKK+yxJ1x+aBmibTtgCcEHGHsh0wdbOgNLek4L7lI5BigY8nWuZUQ3qGEXes9JzOKGJztPaGtLslu3lIXJirdxCWkASHGDTMqg7V1DKPplygDG61YJukLHjEErGSXqCSos6xNSOgzP3BDmsQBcchNwkoV8oiNnPA78zIefUgCdJeGIfE7LmFWXsFTCFdzTJ/RlfEMRiSGnFXXbkC7AIeqcKDu4ynseozeouKJiSEYBDwkJyIC1nRUjgblkNWp/e/1vXc2gjoAoLksYgjrrFMi0oDgjEEIDij1scBXMJSH6DAj6RNl7o8MkuLak8Co15/Pk+MRmT0xilQJV/sdWNKg2kTaeroudvNNsDjmejYjSL+e6v2/2r4Cp4BXNajr0H7hRfAAAAAElFTkSuQmCC);
+}
+.ip-geo-block-icon-lock span {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3Ny3y9Zzq8dRmb7M1dlXnsIFdK0AcawAcqwphrYAcKvZ29wAb6oJd680jrqlw9MBcqxmo8MUfbJLl75eoMI7kbzX2ttqp8VSmL1YnL8NeK+Tu89DlL1ImMEOebBNmL4OkqMoAAAAAXRSTlMAQObYZgAAAPlJREFUeAG9kAWyhTAQBIPOsCzufv9TPnf4Ll0CSbpmxXwNy3Yc23rz2fV8kPA99433AIQIiGDTCD0lojiOQPXCDSFJIbF16CMWItkQMkF+inZzSLYhFKLl+a9UKTZaqJTZJYtarZuo40chrv9CqJTN+behVi+Cm7RdDgRld6AMgLxrE/dxBz0BEjwBEmD/uIsWPAOAF9A+CE56ufSryr8oqfOYcBbQJ8YkES7COkFOYzTypqCDOTDo2wljaEw4vp1APYyWKd8WMBozylvCpcvmXeHQ5fCegHia4s1FgZcIVeVFeFx1M4MvYG4eBHdYWufC+addBtf8E3vdjBNhWnVQqAAAAABJRU5ErkJggg==);
+}
+.ip-geo-block-icon-unlock span {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC);
+}
+.ip-geo-block-icon-find span {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NzS19rD0NWHtMpGk7kYfbAGda0Req+WtcTT1temwM4AcasAcqwAc6wAcKydvMt1pr8Ab6pqpcLX2doggrKoxdNYm7yzw8u/y9HO1tkKdq4th7Td3t6DrcLL0taxyNPGe/YhAAAAAXRSTlMAQObYZgAAARVJREFUeAGtkkeiwyAMRP2xDfxoRjElvd3/lOkNUlZ5u0GPruan/Bnz96Xadr21rvP/7+ujXsAjom78rj4ApCoERIipqfGB1H7wPmYhw1DXjZI6nOel1oJhVAmdUP0tTEDkVC4AYvqIbaDOCqFV6vwRF0tIeYoo6J/X7ICuPAJl9ZynwiIfB5DXxZlRChulbh8xZci0EHZK3TziJFDL504rEOZ+iR5cVj82DoS7XtSshLJpKqaB0Dg3ZjcsQWKaKiF1gVQlITwh/bw2pgKeEeURhE29yKSzUFF03p1V7Wqj2Y7GfrY9X/NirJsPxKsxfBLSSs5GmH8yjAWPSNd8Yoez4f4/G1nIsksqFtGK1i9e39o0P+EAqaoRLlQ+r94AAAAASUVORK5CYII=);
+}
+span.ip-geo-block-icon-alert,
+.ip-geo-block-icon-alert span {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEXc3Nzc2trWl5DHRDTFOyvOgXfc1tXCLBrEMiHEMyLNcmfaxMLDMSDDLx7bu7jRiYHDLhzDMB/LX1PaxsTDLh3YtrHMY1bWmpPJVknSjYXUkYnZuLTMZVnENCPWlI3QhXzENiXXrqrDLRzXsa3Oal7Pe3Hc2NjVn5nNbmPayMbbwb7ay8rUj4fc09Lbw8Db0dDBbRUDAAAAAXRSTlMAQObYZgAAAPVJREFUeAG9ktXWwyAQBonC12brFvff5f2frr4nBredK2DnTFS8Gst2XM8XZmypIGeWcT4PFABaGIXlClfWG1NiC4Ubu705oKRcY32wTAHl2MdTYEqEK8hIiHgHSnSJeaogMyEWO4BijZCvwII2MS9UJ2BXTh+hQidoEttboBOwq3WBnkCNpQlA2iyAhol2hRu71n97p4fw0Z9/ugoPHCfFA+o/iLfCkyBglRJdICBas7uuey+R56fF14wNanj+/QjwY3aX23cBFn6EiHmHNT/ICYxystv/wJy4UHWGlN2cuPB72tFqAq3dP/Hk3zs0E5LZVryGC/hqGNnUa0SVAAAAAElFTkSuQmCC);
+ vertical-align: bottom;
+}
+
+table.form-table th .ip-geo-block-cycle span {
+ vertical-align: text-bottom;
+}
+
+/* Option list */
+.ip-geo-block-list {
+ margin-top: 0;
+ margin-bottom: 0.7em;
+}
+@media screen and (min-width:782px) {
+ ul.ip-geo-block-list .code {
+ width: 15em;
+ }
+}
+
+/* Exceptions */
+.ip-geo-block-list-exceptions label {
+ display: inline-block;
+}
+.ip-geo-block-list-exceptions dfn {
+ border: none;
+}
+.ip-geo-block-list-exceptions span.dashicons {
+ font-size: 14px;
+}
+.ip-geo-block-list-exceptions a.ip-geo-block-icon {
+ margin-left: 0.3em;
+ outline: none;
+ box-shadow: none;
+ text-decoration: none;
+ background-color: transparent;
+}
+
+/* Description */
+.form-table td p.ip-geo-block-desc,
+.form-table td p.ip-geo-block-find-desc {
+ color: #666;
+ font-size: 13px !important;
+ margin: 4px 0 0.5em 0.5em;
+}
+.ip-geo-block-find-desc {
+ display: none;
+}
+
+/* Action for admin post */
+.ip-geo-block-admin-post {
+ color: #c43322;
+ margin-left: 0.25em;
+}
+.ip-geo-block-warn {
+ color: #c43322;
+ font-weight: bold;
+}
+
+/* Badly-behaved bots and crawlers */
+input#ip_geo_block_settings_behavior_view,
+input#ip_geo_block_settings_behavior_time {
+ width: 3.5em;
+}
+
+/* Statistics */
+.ip-geo-block-top-list {
+ display: inline-table;
+ list-style-position: outside;
+ margin: 0 2em 0.5em 1.75em;
+}
+.ip-geo-block-top-list h4 {
+ margin: 1em 0;
+}
+.ip-geo-block-top-list li code {
+ background: none;
+}
+
+/* Embeded data for network site list */
+.ip-geo-block-network {
+ margin-bottom: 1em;
+}
+
+/*------------------------------------------------------------
+ * multi column for Site List
+ * https://caniuse.com/#search=flexbox
+ *------------------------------------------------------------*/
+.ip-geo-block-container {
+ margin: 0 auto;
+ padding: 0 1em;
+ position: relative;
+ width: 100%;
+}
+.ip-geo-block-row {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ align-items: stretch; /* baseline */
+ padding: 0;
+ width: 100%;
+}
+.ip-geo-block-row .ip-geo-block-column {
+ display: block;
+ flex: 1 1 auto;
+ align-self: flex-start;
+ margin-left: 0;
+ max-width: 100%;
+ width: 100%;
+}
+.ip-geo-block-row .ip-geo-block-column.column-20 {
+ flex: 0 0 20%;
+ max-width: 20%;
+}
+.ip-geo-block-row .ip-geo-block-column.column-25 {
+ flex: 0 0 25%;
+ max-width: 25%;
+}
+.ip-geo-block-row .ip-geo-block-column.column-33 {
+ flex: 0 0 33.3333%;
+ max-width: 33.3333%;
+}
+.ip-geo-block-row .ip-geo-block-column.column-50 {
+ flex: 0 0 50%;
+ max-width: 50%;
+}
+@media (min-width: 40rem) {
+ .ip-geo-block-row {
+ flex-direction: row;
+ margin-left: -2em;
+ width: calc(100% + 2em);
+ }
+ .ip-geo-block-row .ip-geo-block-column {
+ margin-bottom: inherit;
+ padding: 0 1em;
+ }
+}
+
+/*------------------------------------------------------------
+ * Customizing based on jquery.dataTables.css
+ *------------------------------------------------------------*/
+table.ip-geo-block-dataTable {
+ clear: none !important;
+}
+table.ip-geo-block-dataTable th,
+table.ip-geo-block-dataTable td {
+ text-align: right;
+}
+table.ip-geo-block-dataTable th:nth-child(n+2),
+table.ip-geo-block-dataTable td:nth-child(n+2) {
+ padding-left: 0 !important;
+}
+table.ip-geo-block-dataTable th {
+ white-space: nowrap;
+}
+table.ip-geo-block-dataTable > thead > tr {
+ line-height: 1.8em;
+}
+table.ip-geo-block-dataTable > tbody > tr {
+ cursor: pointer;
+}
+table.ip-geo-block-dataTable > thead > tr > th,
+table.ip-geo-block-dataTable > thead > tr > td,
+table.ip-geo-block-dataTable.no-footer {
+ border-bottom: 1px solid #ddd;
+}
+table.ip-geo-block-dataTable thead th,
+table.ip-geo-block-dataTable thead td {
+ padding: 10px 16px;
+}
+/* country code */
+#ip-geo-block-statistics-cache td:nth-child(3),
+#ip-geo-block-validation-logs td:nth-child(4) {
+ min-width: 1.6em;
+}
+
+/* Scroll bar */
+div[class*="ip-geo-block"] .dataTables_wrapper.no-footer .dataTables_scrollBody {
+ border-bottom: 1px solid #ddd;
+}
+
+/* Size of column */
+table.ip-geo-block-dataTable.nowrap td,
+table.ip-geo-block-dataTable > tbody > tr > td span {
+ white-space: normal !important;
+ word-wrap: break-word !important;
+ word-break: break-all !important;
+}
+table.ip-geo-block-dataTable > tbody > tr > td span {
+ display: inline-block;
+}
+
+/* Checkbox */
+.ip-geo-block-settings-folding input[type="checkbox"] {
+ margin-right: 0.5em;
+}
+table.ip-geo-block-dataTable input[type="checkbox"] {
+ margin: 0;
+ max-height: 16px;
+ max-width: 16px;
+ vertical-align: middle;
+}
+table.ip-geo-block-dataTable > thead > tr > th:first-child,
+table.ip-geo-block-dataTable > tbody > tr > td:first-child {
+ padding: 8px 4px 8px 1.4em;
+ text-align: left;
+}
+
+/* No data available in table */
+table.ip-geo-block-dataTable > tbody > tr > td.dataTables_empty,
+table.collapsed > tbody > tr > td.dataTables_empty:first-child::before {
+ border: none;
+ text-align: center;
+}
+
+/* Checkbox column */
+table.ip-geo-block-dataTable thead > tr > th:first-child.sorting_asc {
+ background-image: none !important;
+}
+table.ip-geo-block-dataTable.display tbody tr.even > .sorting_1,
+table.ip-geo-block-dataTable.display tbody tr.odd > .sorting_1,
+table.ip-geo-block-dataTable.display tbody tr:hover > .sorting_1 {
+ background-color: inherit !important;
+}
+
+/* Collapsed */
+table.ip-geo-block-dataTable.collapsed > tbody > tr > td:first-child {
+ padding: 8px 4px 8px 8px !important;
+}
+table.collapsed > tbody > tr > td:first-child::before,
+table.collapsed > tbody > tr.parent > td:first-child::before {
+ content: '';
+ height: 0;
+ width: 0;
+ display: inline-block;
+ border-radius: 0;
+ border: 5px solid transparent;
+ box-shadow: none;
+ position: relative;
+ background-color: transparent;
+}
+table.collapsed > tbody > tr > td:first-child::before {
+ border-left: 5px solid #555;
+ top: 1px;
+ left: -2px;
+}
+table.collapsed > tbody > tr.parent > td:first-child::before {
+ border-top: 5px solid #555;
+ top: 4px;
+ left: -4px;
+}
+table.collapsed > tbody > tr.child > td:first-child::before {
+ border: none;
+}
+table.collapsed > tbody > tr.child > td.child > ul li {
+ border: none;
+ padding: 0;
+ margin: 0;
+ line-height: 1.8em;
+}
+table.collapsed > tbody > tr.child > td.child > ul li span.dtr-title,
+table.collapsed > tbody > tr.child > td.child > ul li span.dtr-data {
+ font-size: 13px !important;
+ display: block;
+ white-space: normal;
+ word-wrap: break-word;
+ word-break: break-all;
+}
+table.collapsed > tbody > tr.child > td.child > ul li span.dtr-data {
+ margin-left: 1.25em;
+ margin-right: 0.3em;
+}
+
+/* Length menu */
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length {
+ padding-top: 0.15em;
+ margin: 0.5em 0 0 0.3em;
+ position: relative;
+ display: inline-block;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length:after {
+ content: '';
+ width: 6px;
+ height: 6px;
+ border: 0px;
+ border-bottom: solid 2px #999;
+ border-right: solid 2px #999;
+ -ms-transform: rotate(45deg);
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ position: absolute;
+ top: 50%;
+ right: 10px;
+ margin-top: -4px;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length select {
+ padding-top: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ font-size: 13px !important;
+ line-height: 1.4em;
+ width: 100%;
+ height: 2.05em !important;
+ background: transparent;
+ position: relative;
+ z-index: 1;
+ padding: 0.125em 1.5em 0.125em 0.25em;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ box-shadow: none;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length select::-ms-expand {
+ display: none;
+}
+
+/* Pagenation */
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
+ float: none;
+ text-align: center;
+ margin-bottom: 1em;
+ margin-top: 0 !important;
+}
+@media screen and (min-width:640px) {
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length {
+ margin: 0.5em 0 0 0.6em;
+ }
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
+ position: relative;
+ left: -2.25em;
+ }
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate span.ellipsis,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button:active,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active {
+ min-width: 2em;
+ background: inherit;
+ border-color: #ddd;
+ border-radius: 0;
+ border-image: none;
+ border-style: solid;
+ border-width: 1px 1px 1px 0;
+ box-shadow: none;
+ margin: 0.5em 0 0 0;
+ padding: 0.25em 0;
+ display: inline-block;
+ text-decoration: none;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate > a.paginate_button:first-child,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate:hover > a.paginate_button:first-child,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate:active > a.paginate_button:first-child {
+ border-left-width: 1px;
+ border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate > a.paginate_button:last-child,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate:hover > a.paginate_button:last-child,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate:active > a.paginate_button:last-child {
+ border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button {
+ color: #0073aa !important;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover {
+ color: #0096dd !important;
+ background-color: #fff;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate span.ellipsis,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active {
+ cursor: default;
+ color: #999 !important;
+ background-color: transparent;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active {
+ cursor: default;
+ color: #444 !important;
+ background-color: #fff !important;
+}
+
+/* Alignment of table */
+#ip-geo-block-1 #ip-geo-block-section-2 .panel-body,
+#ip-geo-block-4 #ip-geo-block-section-0 .panel-body {
+ padding: 0;
+}
+#ip-geo-block-1 #ip-geo-block-section-2 table.form-table,
+#ip-geo-block-4 #ip-geo-block-section-0 table.form-table {
+ margin-left: 1em;
+ max-width: 95%;
+}
+
+/* Select target / Period to extract */
+#ip-geo-block-select-target,
+#ip-geo-block-select-layout,
+#ip-geo-block-select-duration {
+ margin: 0;
+}
+#ip-geo-block-select-target li,
+#ip-geo-block-select-layout li,
+#ip-geo-block-select-duration li {
+ float: left;
+ margin-right: 1.5em;
+}
+#ip-geo-block-select-target li label,
+#ip-geo-block-select-duration li label {
+ cursor: pointer;
+}
+
+/* Filter */
+#ip_geo_block_settings_search_filter {
+ width: 16em;
+ padding-top: 3px;
+}
+
+/* Transition for new row */
+table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-passed {
+ background-color: #edf6ff !important;
+}
+table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-blocked {
+ background-color: #ffefef !important;
+}
+.ip-geo-block-new-passed {
+ animation: ip-geo-block-flash-passed 1s ease-out 0s 1 normal both running;
+}
+.ip-geo-block-new-blocked {
+ animation: ip-geo-block-flash-blocked 1s ease-out 0s 1 normal both running;
+}
+@keyframes ip-geo-block-flash-passed {
+ 0% { background-color: #ffd700; }
+ 100% { background-color: #edf6ff; }
+}
+@keyframes ip-geo-block-flash-blocked {
+ 0% { background-color: #ffd700; }
+ 100% { background-color: #ffefef; }
+}
+
+/* Mark.js */
+mark {
+ padding: 0;
+ background: #ffd700; // Gold
+}
+
+/* Live update log */
+#ip-geo-block-live-log {
+ margin: 0;
+}
+#ip-geo-block-live-log li {
+ float: left;
+ margin-right: 3em;
+}
+#ip-geo-block-live-log li:last-child {
+ margin-right: 0;
+}
+#ip-geo-block-live-log li input[type=radio] {
+ visibility: hidden;
+ position: absolute;
+}
+#ip-geo-block-live-log li input[type=radio] + label {
+ display:inline-block;
+ margin:-2px;
+ padding: 4px 12px;
+ margin-bottom: 0;
+ font-size: 14px;
+ line-height: 20px;
+ color: #333;
+ text-align: center;
+ text-shadow: 0 1px 1px rgba(255,255,255,0.75);
+ vertical-align: middle;
+ cursor: pointer;
+ background-color: #f5f5f5;
+ background-image: -moz-linear-gradient(top,#fff,#e6e6e6);
+ background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));
+ background-image: -webkit-linear-gradient(top,#fff,#e6e6e6);
+ background-image: -o-linear-gradient(top,#fff,#e6e6e6);
+ background-image: linear-gradient(to bottom,#fff,#e6e6e6);
+ background-repeat: repeat-x;
+ border: 1px solid #ccc;
+ border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+ border-color: rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);
+ border-bottom-color: #b3b3b3;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
+ -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
+}
+#ip-geo-block-live-log li input[type=radio]:checked + label {
+ background-image: none;
+ outline: 0;
+ -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);
+ -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);
+ box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);
+ background-color: #e0e0e0;
+}
+
+/*----------------------------------------------------------------------
+ * Timer animation based on https://codepen.io/paulobrien/pen/joptI
+ *----------------------------------------------------------------------*/
+.ip-geo-block-live-timer {
+ height: 1em;
+ width: 1em;
+ margin: 0;
+ position: relative;
+ top: 0;
+ left: 0;
+}
+.ip-geo-block-live-timer:before {
+ content: "";
+ display: block;
+ height: 1em;
+ width: 1em;
+ background: #0073aa;
+ border-radius: 50%;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.ip-geo-block-live-timer:after {
+ display: none
+}
+.ip-geo-block-live-timer > div {
+ position: absolute;
+ width: 1em;
+ height: 1em;
+ clip: rect(0, 1em, 1em, .5em);
+}
+.ip-geo-block-live-timer > div:before {
+ content: " ";
+ position: absolute;
+ width: 1em;
+ height: 1em;
+ border-radius: .5em;
+ clip: rect(0, .5em, 1em, 0);
+ background-color: #f1f1f1;
+ transform: rotate(0deg);
+}
+.ip-geo-block-live-timer > div:first-child:before {
+ animation: 30s spin-timer linear forwards;
+}
+.ip-geo-block-live-timer > div:last-child {
+ transform: rotate(180deg);
+}
+.ip-geo-block-live-timer > div:last-child:before {
+ /* older webkit seems buggy with zero so use 0.00001 if you notice something strange */
+ transform: rotate(0deg);
+ animation: 30s spin-timer linear 30s forwards;
+}
+@keyframes spin-timer {
+ 0% {transform: rotate( 0deg);}
+ 100% {transform: rotate(180deg);}
+}
+
+/* sub items in settings */
+.ip-geo-block-subitem {
+ margin-left: 1.7em
+}
+.ip-geo-block-subitem:before {
+ content: "\00bb"; /* » */
+ position: absolute;
+ left: 2em;
+}
+.ip-geo-block-subitem dfn {
+ vertical-align: middle;
+}
+.ip-geo-block-subitem-parent th,
+.ip-geo-block-subitem-parent td {
+ padding-top: 0;
+}
+
+/* placeholder */
+:placeholder-shown { color: #888; }
+::-webkit-input-placeholder { color: #888; } /* Google Chrome, Safari, Opera 15+, Android, iOS */
+:-moz-placeholder { color: #888; opacity: 1; } /* Firefox 18- */
+::-moz-placeholder { color: #888; opacity: 1; } /* Firefox 19+ */
+:-ms-input-placeholder { color: #888; } /* IE 10+ */
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/admin.min.css b/wp/wp-content/plugins/ip-geo-block/admin/css/admin.min.css
new file mode 100644
index 00000000..50795951
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/css/admin.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Project: WordPress IP Geo Block
+ * Copyright (c) 2013-2019 tokkonopapa (tokkonopapa@yahoo.com)
+ * This software is released under the MIT License.
+ */
+dfn{cursor:help;border-bottom:1px dotted #888}fieldset,legend{padding:0;margin:0;border:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}fieldset{min-width:0}legend{display:block;line-height:inherit;width:100%}label{display:inline-block;max-width:100%}.panel{border-color:#888;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);-moz-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04);background:#f5f5f5}.panel-heading{float:left!important;background:#fff}.panel-default>.panel-heading{border-color:inherit}.panel-body{width:100%;padding:0 1em;display:inline-block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.panel-body:after,.panel-body:before{content:" ";display:table}.panel-body:after{clear:both}.ip-geo-block-navi-link{text-align:left}.ip-geo-block-help-link{float:right;font-size:90%;font-weight:400}.ip-geo-block-help-link a{box-shadow:none}fieldset label{vertical-align:text-middle}fieldset input[type=checkbox]{margin:1px 2px 0}fieldset.ip-geo-block-field{margin:1em 0}fieldset.ip-geo-block-field h2,fieldset.ip-geo-block-field h3{padding:0;margin:0;font-size:14px!important}fieldset.ip-geo-block-field h4{margin:.75em 0 .5em 0}fieldset.ip-geo-block-field legend.panel-heading{padding:10px}fieldset.ip-geo-block-field .ip-geo-block-dropdown,fieldset.ip-geo-block-field .ip-geo-block-dropup{cursor:pointer;position:relative;padding-left:1em}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before,fieldset.ip-geo-block-field .ip-geo-block-dropup:before{content:'';height:0;width:0;border:.4em solid transparent;position:absolute}fieldset.ip-geo-block-field .ip-geo-block-dropup:before{border-left:.4em solid #555;left:2px;top:18%}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before{border-top:.4em solid #555;left:-2px;top:38%}fieldset.ip-geo-block-field .form-table .ip-geo-block-dropdown,fieldset.ip-geo-block-field .form-table .ip-geo-block-dropup{margin-top:.75em}fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before{top:.25em}fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before{top:.5em}fieldset.ip-geo-block-field table.form-table{margin:0 0 .5em;width:100%}textarea.regular-text{width:25em}fieldset.ip-geo-block-field input.regular-text,fieldset.ip-geo-block-field textarea.regular-text{font-size:95%}fieldset.ip-geo-block-field input[type=checkbox],fieldset.ip-geo-block-field input[type=radio],p.ip-geo-block-navi-link input[type=checkbox]{margin-right:.4em}input[id*=ip_geo_block_settings_rewrite_]+label{margin-left:.25em}input[id*=ip_geo_block_settings_providers]+label{min-width:7em}.ip-geo-block-settings-folding{margin:.5em 0}.ip-geo-block-settings-folding ul{margin-bottom:0}.ip-geo-block-settings-folding li{margin:.5em 0}.folding-disable{pointer-events:none;opacity:.5}.folding-inactive{opacity:.5;font-style:oblique!important}.ip-geo-block-float li{display:inline-block;width:18em;margin-top:0}.ip-geo-block-checked{list-style-type:disc}.ip-geo-block-ip-addr{display:inline-block;padding-top:5px}.ip-geo-block-hide{display:none}.ip-geo-block-sup{margin-left:.2em;display:inline-block}.ip-geo-block-note{margin-top:1em;list-style:disc inside}.ip-geo-block-note li{text-indent:-1em;padding-left:1em}.ip-geo-block-border{border-top:inherit}.ip-geo-block-notice{color:#dd3d36}.ip-geo-block-title{width:100px;display:inline-block}.ip-geo-block-result{color:#2786c2;display:inline-block}.ip-geo-block-primary{color:#fff!important;background:#00838f!important;border-color:#00707a!important;text-shadow:none}.ip-geo-block-primary:hover{background-color:#00919e!important;border-color:#00525a!important}ul#ip-geo-block-logs-preset{margin:.25em 0;max-width:600px}ul#ip-geo-block-logs-preset li{float:left;line-height:1.5em;margin-right:1em;min-width:160px}#ip-geo-block-live-loading,.ip-geo-block-loading{height:16px;width:16px;background-size:16px 16px;background-position:center center;background-repeat:no-repeat;margin-left:1em;margin-top:.2em;display:inline-block;vertical-align:top}.ip-geo-block-loading{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPYCAKqqqsbGxlZWVsrKyvr6+ubm5tDQ0K6urmZmZmJiYuzs7IaGhvT09JycnLq6us7Ozurq6o6OjtbW1tra2vDw8CgoKCYmJvz8/NLS0kJCQlJSUqysrPLy8vb29pqamra2tm5ubujo6Kampvj4+IiIiMjIyEhISNzc3OLi4rKysj4+PlBQULi4uJKSkmRkZODg4KKiou7u7iQkJB4eHlpaWhISErCwsHh4eMDAwDIyMi4uLqSkpIKCgr6+vt7e3n5+fggICJCQkAwMDEpKSmBgYHZ2dhgYGBYWFnx8fF5eXk5OTiIiIjAwMIyMjISEhDQ0NJaWltTU1AQEBBwcHGpqaoqKiuTk5CoqKlhYWAoKCtjY2Hp6ehAQEJ6ensLCwkxMTJSUlCwsLAYGBnR0dDg4OFxcXLy8vKCgoA4ODsTExMzMzDw8PERERDY2NqioqHJycrS0tGhoaBQUFEZGRjo6OkBAQICAgHBwcFRUVCAgIGxsbP///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgACACwAAAAAEAAQAEAHjIACgoOEhYJsbTGGghcPGIJRbFNNhgQKCheDDkllDQYMHSc4MAcvhTB0aFliggQjmYNEFQ6LAh0+VoIwbFW1GGamhCgfUE5NbgMKtQYLc0a1gjsyR3E2IYwMFASDYDJvtRRWFIJ1TMq1ElqCICpetQoBEoInVCsAhhI2XhyEPUgIIG7waALlwAloCAMBACH5BAkKAAIALAEAAQAOAA4AAAeDgAKCEmBYYRVKJAaCjAcrVzIzRjVoTw2MKRk5Ww4KECkuWTWCE0Rrl4yCTow7bAupsBcCW19psKkjBEQaFLeMHBwINBy+ggoxVQkPxSMFMXBUMMUQPhRWVUU9tyFRLwQCA048cCcjIyFaJQYxjA8NEVBnAClmahCwEANwbjYBJwyMAgEAIfkECQoABQAsAQABAA4ADgAAB4OABYInO29DbC5QUYKMZiBfbCptTBUmIow4LgJBaTExZkVLFTAFKD8JB4yMQUZrBixUXaqqVFwkUG8Ys4wpQiZOWwy7ghBiRk08HcOqblUTy4wlLWbLBCMFCgBdurMjFMoFE24ADxAXFwwKITEEjD5mH2YBDxI+IdeqHCcGAxgv7IwCAQAh+QQJCgAAACwBAAEADgAOAAAHhYAAglYfTVQJSCITgowDVSAISQJKJgkpjA8LWyIGHBQBJCoZBwAQDU44jIxdTxoSAxEfqqpbFWApUCezjA5LWCJdI7uCClNXGyLCwxBHFl4HBcMAKVxfEx8Y0glZCxwlOCjDUkwPACElAygMghftAB6MClpRJygQFB0EuyMKBQUKDPQxCgQAIfkECQoAAAAsAQABAA4ADgAAB4SAAIIKahstTQ0OVoKMJzYeLVU8W29OXowvBztePh0dUTtxVD0AHDgHEoyMKWVvPj4sBqqqLUoiGDgQs4wBJmNqARe7gjEqXxgPwsMxbWw+UQzDAGY6LjEnusNjFmAEBVbRs00zc1EAHRAKHYw2CHIyO4wEHAwjgmJCZDC7F8psC7IEBQIAIfkECQoARwAsAQABAA4ADgAAB4OAR4IMPgMfNg4PCoKMEA84LCkAMB47GIwxBiUTEAQjKD0REQ9HBD4YIYyMATwtBRQnqaqMG0UOEC8ds4wYIEEQBbuMHC4gMYvCRxw0CAwcF8kBGj8EHdDCJCYiRxfXsw0qCROqRDYQECw3ORkpqjpAQjVGMxYrB7MPC0MyFQItEowCAQAh+QQJCgACACwBAAEADgAOAAAHgIACghcUVhIYEigMgowjEC8nUQ8BOGkojAQxITEdAhcxEh9wPoIMFCOMjBMAKTEXHaipjGldDxcEsqkvUAe5sh1NLb6pHTxNbGK9vlE3DU5ZLsNnIA4GbTVVuQcJdpdnS0Z3LAoxXhF4LjiMMBl5FjptKiZ6ZrJRLUkqbCAwJ4yBACH5BAUKAAEALAEAAQAOAA4AAAd/gAGCARcjHDExHASDjAQdHAoFLy8Ugw2MgiMKWhIKAQ9MYpiCEA8YHQtZCaOCJ14vX2g2rAEKZgMyNRC0BCksFUa7rCMANgIzH7QvZw4tMmO0DlAPUV9hHqNeVTC7G2tkTmkUHA8iSFUGgzZlGSYaNC4gTWqYEzA3SQhVH1aDgQA7)}#ip-geo-block-map{height:400px;margin:1em auto}#ip-geo-block-apis div.nav-tab-wrapper{padding-top:0;margin-bottom:1em}#ip-geo-block-geoinfo{white-space:normal;word-wrap:break-word;word-break:break-all}#ip-geo-block-geoinfo ul{margin-top:0;margin-left:1em}.gm-style-iw{width:18em;height:auto!important;height:100%;min-height:100%:}.gm-style-iw ul{margin:.1em}.gm-style-iw li{margin:.2em}svg a{cursor:pointer}svg a:hover>text{fill:#0096dd}svg a>text{fill:#0073aa;text-decoration:underline}table.ip-geo-block-statistics-table{float:right}table.ip-geo-block-statistics-table td,table.ip-geo-block-statistics-table th{width:12em;margin:0;padding:.2em;text-align:right;line-height:1.5em;word-wrap:break-word}table.ip-geo-block-statistics-table tr:nth-child(even){background-color:#eee}table.ip-geo-block-table{margin:1em 0;width:100%;white-space:normal;word-wrap:break-word;word-break:break-all}table.ip-geo-block-table td:first-child{min-width:4.3em;max-width:5em}@media screen and (max-width:782px){#ip-geo-block-whois .panel-body{padding:0 .5em}}#ip-geo-block-scan-code{vertical-align:middle}#ip-geo-block-code-list{display:none;margin-bottom:0}#ip-geo-block-chart-countries{height:200px}#ip-geo-block-chart-daily{height:240px}#ip_geo_block_settings_validation_mimetype+label{padding-top:.25em}#ip_geo_block_settings_validation_mimetype+label+ul{margin-top:.7em}#ip_geo_block_settings_create_user{margin-bottom:.5em}#ip-geo-block-back-to-top a,#ip-geo-block-toggle-sections{box-shadow:none}#ip-geo-block-wp-info textarea{margin-top:.5em;overflow:auto;width:100%;word-wrap:normal;word-break:normal;white-space:pre}#ip-geo-block-back-to-top{margin:0;text-align:right}#ip-geo-block-live-update,#ip-geo-block-open-new{margin-left:1em}.ip-geo-block-menu-link{font-size:13px!important}dfn~.ip-geo-block-icon{margin-left:.4em}.ip-geo-block-icon{position:relative;cursor:pointer;outline:0;box-shadow:none;text-decoration:none;background-color:transparent}.ip-geo-block-icon:active{top:1px}.ip-geo-block-icon span{height:16px;width:16px;margin:0;border:none;display:inline-block;vertical-align:middle;background-size:16px 16px;background-position:center center;background-repeat:no-repeat}.ip-geo-block-icon-cycle span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAda2otLp+rsSHprWHr8IBd7EpfKRGhaNajqeUqrRymKuKoq5yo7prlKgAcqoVe6w8gqQmgq5Tj6wIdqsVdKIshrEMea1Uhp+Anqw0hawDdq4gfKhljqE7hqoLdKYbgbM4jLQygKUGeK8CdawQd6gVeKcad6NKkrSerrZAj7UAc6sAc6rc3NySrVGQAAAALXRSTlP//////////////////////////////////////////////////////////wCl7wv9AAACOklEQVR4Ae2W15rzKgxF9xTZzhTX9B7S/gN6/9ebYqzzGZsw/S7LV3FZgCSIwD/kQ8FVcBU8xatZUczy8luC/ABNOn0DSHEsvyZ4PgLatNCYR3efFxyhTQ8g+qQgJxgv2JefERzJXATRh4LHOUwAHD4S7OGEztRJaN86hAUxtaNWDUf/bRdDBbQMWVDAO8jn89WUhag1MeyCAh6hHofyrliLgZKggDMYgzF3eVAwFq0uCZq5KY0TezjIHDDzC0qqmkwe2ctGDOQVLMkgu+F3/rGXwb4xIPcJ6P3JgkM8wFjmfcFAWfeKQywaAz33BJVuHsUcAt09gVbuLDThAJkdR687ggLmf4gDJLIGV7BydtB8yn3u+fbtuj/LS7G9wZAd1AKK+yxJ1x+aBmibTtgCcEHGHsh0wdbOgNLek4L7lI5BigY8nWuZUQ3qGEXes9JzOKGJztPaGtLslu3lIXJirdxCWkASHGDTMqg7V1DKPplygDG61YJukLHjEErGSXqCSos6xNSOgzP3BDmsQBcchNwkoV8oiNnPA78zIefUgCdJeGIfE7LmFWXsFTCFdzTJ/RlfEMRiSGnFXXbkC7AIeqcKDu4ynseozeouKJiSEYBDwkJyIC1nRUjgblkNWp/e/1vXc2gjoAoLksYgjrrFMi0oDgjEEIDij1scBXMJSH6DAj6RNl7o8MkuLak8Co15/Pk+MRmT0xilQJV/sdWNKg2kTaeroudvNNsDjmejYjSL+e6v2/2r4Cp4BXNajr0H7hRfAAAAAElFTkSuQmCC)}.ip-geo-block-icon-lock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3Ny3y9Zzq8dRmb7M1dlXnsIFdK0AcawAcqwphrYAcKvZ29wAb6oJd680jrqlw9MBcqxmo8MUfbJLl75eoMI7kbzX2ttqp8VSmL1YnL8NeK+Tu89DlL1ImMEOebBNmL4OkqMoAAAAAXRSTlMAQObYZgAAAPlJREFUeAG9kAWyhTAQBIPOsCzufv9TPnf4Ll0CSbpmxXwNy3Yc23rz2fV8kPA99433AIQIiGDTCD0lojiOQPXCDSFJIbF16CMWItkQMkF+inZzSLYhFKLl+a9UKTZaqJTZJYtarZuo40chrv9CqJTN+behVi+Cm7RdDgRld6AMgLxrE/dxBz0BEjwBEmD/uIsWPAOAF9A+CE56ufSryr8oqfOYcBbQJ8YkES7COkFOYzTypqCDOTDo2wljaEw4vp1APYyWKd8WMBozylvCpcvmXeHQ5fCegHia4s1FgZcIVeVFeFx1M4MvYG4eBHdYWufC+addBtf8E3vdjBNhWnVQqAAAAABJRU5ErkJggg==)}.ip-geo-block-icon-unlock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC)}.ip-geo-block-icon-find span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NzS19rD0NWHtMpGk7kYfbAGda0Req+WtcTT1temwM4AcasAcqwAc6wAcKydvMt1pr8Ab6pqpcLX2doggrKoxdNYm7yzw8u/y9HO1tkKdq4th7Td3t6DrcLL0taxyNPGe/YhAAAAAXRSTlMAQObYZgAAARVJREFUeAGtkkeiwyAMRP2xDfxoRjElvd3/lOkNUlZ5u0GPruan/Bnz96Xadr21rvP/7+ujXsAjom78rj4ApCoERIipqfGB1H7wPmYhw1DXjZI6nOel1oJhVAmdUP0tTEDkVC4AYvqIbaDOCqFV6vwRF0tIeYoo6J/X7ICuPAJl9ZynwiIfB5DXxZlRChulbh8xZci0EHZK3TziJFDL504rEOZ+iR5cVj82DoS7XtSshLJpKqaB0Dg3ZjcsQWKaKiF1gVQlITwh/bw2pgKeEeURhE29yKSzUFF03p1V7Wqj2Y7GfrY9X/NirJsPxKsxfBLSSs5GmH8yjAWPSNd8Yoez4f4/G1nIsksqFtGK1i9e39o0P+EAqaoRLlQ+r94AAAAASUVORK5CYII=)}.ip-geo-block-icon-alert span,span.ip-geo-block-icon-alert{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEXc3Nzc2trWl5DHRDTFOyvOgXfc1tXCLBrEMiHEMyLNcmfaxMLDMSDDLx7bu7jRiYHDLhzDMB/LX1PaxsTDLh3YtrHMY1bWmpPJVknSjYXUkYnZuLTMZVnENCPWlI3QhXzENiXXrqrDLRzXsa3Oal7Pe3Hc2NjVn5nNbmPayMbbwb7ay8rUj4fc09Lbw8Db0dDBbRUDAAAAAXRSTlMAQObYZgAAAPVJREFUeAG9ktXWwyAQBonC12brFvff5f2frr4nBredK2DnTFS8Gst2XM8XZmypIGeWcT4PFABaGIXlClfWG1NiC4Ubu705oKRcY32wTAHl2MdTYEqEK8hIiHgHSnSJeaogMyEWO4BijZCvwII2MS9UJ2BXTh+hQidoEttboBOwq3WBnkCNpQlA2iyAhol2hRu71n97p4fw0Z9/ugoPHCfFA+o/iLfCkyBglRJdICBas7uuey+R56fF14wNanj+/QjwY3aX23cBFn6EiHmHNT/ICYxystv/wJy4UHWGlN2cuPB72tFqAq3dP/Hk3zs0E5LZVryGC/hqGNnUa0SVAAAAAElFTkSuQmCC);vertical-align:bottom}table.form-table th .ip-geo-block-cycle span{vertical-align:text-bottom}.ip-geo-block-list{margin-top:0;margin-bottom:.7em}@media screen and (min-width:782px){ul.ip-geo-block-list .code{width:15em}}.ip-geo-block-list-exceptions label{display:inline-block}.ip-geo-block-list-exceptions dfn{border:none}.ip-geo-block-list-exceptions span.dashicons{font-size:14px}.ip-geo-block-list-exceptions a.ip-geo-block-icon{margin-left:.3em;outline:0;box-shadow:none;text-decoration:none;background-color:transparent}.form-table td p.ip-geo-block-desc,.form-table td p.ip-geo-block-find-desc{color:#666;font-size:13px!important;margin:4px 0 .5em .5em}.ip-geo-block-find-desc{display:none}.ip-geo-block-admin-post{color:#c43322;margin-left:.25em}.ip-geo-block-warn{color:#c43322;font-weight:700}input#ip_geo_block_settings_behavior_time,input#ip_geo_block_settings_behavior_view{width:3.5em}.ip-geo-block-top-list{display:inline-table;list-style-position:outside;margin:0 2em .5em 1.75em}.ip-geo-block-top-list h4{margin:1em 0}.ip-geo-block-top-list li code{background:0 0}.ip-geo-block-network{margin-bottom:1em}.ip-geo-block-container{margin:0 auto;padding:0 1em;position:relative;width:100%}.ip-geo-block-row{display:flex;flex-direction:column;align-items:flex-start;align-items:stretch;padding:0;width:100%}.ip-geo-block-row .ip-geo-block-column{display:block;flex:1 1 auto;align-self:flex-start;margin-left:0;max-width:100%;width:100%}.ip-geo-block-row .ip-geo-block-column.column-20{flex:0 0 20%;max-width:20%}.ip-geo-block-row .ip-geo-block-column.column-25{flex:0 0 25%;max-width:25%}.ip-geo-block-row .ip-geo-block-column.column-33{flex:0 0 33.3333%;max-width:33.3333%}.ip-geo-block-row .ip-geo-block-column.column-50{flex:0 0 50%;max-width:50%}@media (min-width:40rem){.ip-geo-block-row{flex-direction:row;margin-left:-2em;width:calc(100% + 2em)}.ip-geo-block-row .ip-geo-block-column{margin-bottom:inherit;padding:0 1em}}table.ip-geo-block-dataTable{clear:none!important}table.ip-geo-block-dataTable td,table.ip-geo-block-dataTable th{text-align:right}table.ip-geo-block-dataTable td:nth-child(n+2),table.ip-geo-block-dataTable th:nth-child(n+2){padding-left:0!important}table.ip-geo-block-dataTable th{white-space:nowrap}table.ip-geo-block-dataTable>thead>tr{line-height:1.8em}table.ip-geo-block-dataTable>tbody>tr{cursor:pointer}table.ip-geo-block-dataTable.no-footer,table.ip-geo-block-dataTable>thead>tr>td,table.ip-geo-block-dataTable>thead>tr>th{border-bottom:1px solid #ddd}table.ip-geo-block-dataTable thead td,table.ip-geo-block-dataTable thead th{padding:10px 16px}#ip-geo-block-statistics-cache td:nth-child(3),#ip-geo-block-validation-logs td:nth-child(4){min-width:1.6em}div[class*=ip-geo-block] .dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #ddd}table.ip-geo-block-dataTable.nowrap td,table.ip-geo-block-dataTable>tbody>tr>td span{white-space:normal!important;word-wrap:break-word!important;word-break:break-all!important}table.ip-geo-block-dataTable>tbody>tr>td span{display:inline-block}.ip-geo-block-settings-folding input[type=checkbox]{margin-right:.5em}table.ip-geo-block-dataTable input[type=checkbox]{margin:0;max-height:16px;max-width:16px;vertical-align:middle}table.ip-geo-block-dataTable>tbody>tr>td:first-child,table.ip-geo-block-dataTable>thead>tr>th:first-child{padding:8px 4px 8px 1.4em;text-align:left}table.collapsed>tbody>tr>td.dataTables_empty:first-child::before,table.ip-geo-block-dataTable>tbody>tr>td.dataTables_empty{border:none;text-align:center}table.ip-geo-block-dataTable thead>tr>th:first-child.sorting_asc{background-image:none!important}table.ip-geo-block-dataTable.display tbody tr.even>.sorting_1,table.ip-geo-block-dataTable.display tbody tr.odd>.sorting_1,table.ip-geo-block-dataTable.display tbody tr:hover>.sorting_1{background-color:inherit!important}table.ip-geo-block-dataTable.collapsed>tbody>tr>td:first-child{padding:8px 4px 8px 8px!important}table.collapsed>tbody>tr.parent>td:first-child::before,table.collapsed>tbody>tr>td:first-child::before{content:'';height:0;width:0;display:inline-block;border-radius:0;border:5px solid transparent;box-shadow:none;position:relative;background-color:transparent}table.collapsed>tbody>tr>td:first-child::before{border-left:5px solid #555;top:1px;left:-2px}table.collapsed>tbody>tr.parent>td:first-child::before{border-top:5px solid #555;top:4px;left:-4px}table.collapsed>tbody>tr.child>td:first-child::before{border:none}table.collapsed>tbody>tr.child>td.child>ul li{border:none;padding:0;margin:0;line-height:1.8em}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data,table.collapsed>tbody>tr.child>td.child>ul li span.dtr-title{font-size:13px!important;display:block;white-space:normal;word-wrap:break-word;word-break:break-all}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data{margin-left:1.25em;margin-right:.3em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length{padding-top:.15em;margin:.5em 0 0 .3em;position:relative;display:inline-block}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length:after{content:'';width:6px;height:6px;border:0;border-bottom:solid 2px #999;border-right:solid 2px #999;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;top:50%;right:10px;margin-top:-4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length select{padding-top:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:13px!important;line-height:1.4em;width:100%;height:2.05em!important;background:0 0;position:relative;z-index:1;padding:.125em 1.5em .125em .25em;border:1px solid #ddd;border-radius:4px;box-shadow:none}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length select::-ms-expand{display:none}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{float:none;text-align:center;margin-bottom:1em;margin-top:0!important}@media screen and (min-width:640px){div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length{margin:.5em 0 0 .6em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{position:relative;left:-2.25em}}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate span.ellipsis{min-width:2em;background:inherit;border-color:#ddd;border-radius:0;border-image:none;border-style:solid;border-width:1px 1px 1px 0;box-shadow:none;margin:.5em 0 0 0;padding:.25em 0;display:inline-block;text-decoration:none}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:active>a.paginate_button:first-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:first-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate>a.paginate_button:first-child{border-left-width:1px;border-bottom-left-radius:4px;border-top-left-radius:4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:active>a.paginate_button:last-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:last-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate>a.paginate_button:last-child{border-bottom-right-radius:4px;border-top-right-radius:4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button{color:#0073aa!important}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover{color:#0096dd!important;background-color:#fff}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate span.ellipsis{cursor:default;color:#999!important;background-color:transparent}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover{cursor:default;color:#444!important;background-color:#fff!important}#ip-geo-block-1 #ip-geo-block-section-2 .panel-body,#ip-geo-block-4 #ip-geo-block-section-0 .panel-body{padding:0}#ip-geo-block-1 #ip-geo-block-section-2 table.form-table,#ip-geo-block-4 #ip-geo-block-section-0 table.form-table{margin-left:1em;max-width:95%}#ip-geo-block-select-duration,#ip-geo-block-select-layout,#ip-geo-block-select-target{margin:0}#ip-geo-block-select-duration li,#ip-geo-block-select-layout li,#ip-geo-block-select-target li{float:left;margin-right:1.5em}#ip-geo-block-select-duration li label,#ip-geo-block-select-target li label{cursor:pointer}#ip_geo_block_settings_search_filter{width:16em;padding-top:3px}table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-passed{background-color:#edf6ff!important}table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-blocked{background-color:#ffefef!important}.ip-geo-block-new-passed{animation:ip-geo-block-flash-passed 1s ease-out 0s 1 normal both running}.ip-geo-block-new-blocked{animation:ip-geo-block-flash-blocked 1s ease-out 0s 1 normal both running}@keyframes ip-geo-block-flash-passed{0%{background-color:gold}100%{background-color:#edf6ff}}@keyframes ip-geo-block-flash-blocked{0%{background-color:gold}100%{background-color:#ffefef}}mark{padding:0;background:gold}// Gold #ip-geo-block-live-log{margin:0}#ip-geo-block-live-log li{float:left;margin-right:3em}#ip-geo-block-live-log li:last-child{margin-right:0}#ip-geo-block-live-log li input[type=radio]{visibility:hidden;position:absolute}#ip-geo-block-live-log li input[type=radio]+label{display:inline-block;margin:-2px;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border-bottom-color:#b3b3b3;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}#ip-geo-block-live-log li input[type=radio]:checked+label{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);background-color:#e0e0e0}.ip-geo-block-live-timer{height:1em;width:1em;margin:0;position:relative;top:0;left:0}.ip-geo-block-live-timer:before{content:"";display:block;height:1em;width:1em;background:#0073aa;border-radius:50%;position:absolute;top:0;left:0}.ip-geo-block-live-timer:after{display:none}.ip-geo-block-live-timer>div{position:absolute;width:1em;height:1em;clip:rect(0,1em,1em,.5em)}.ip-geo-block-live-timer>div:before{content:" ";position:absolute;width:1em;height:1em;border-radius:.5em;clip:rect(0,.5em,1em,0);background-color:#f1f1f1;transform:rotate(0)}.ip-geo-block-live-timer>div:first-child:before{animation:30s spin-timer linear forwards}.ip-geo-block-live-timer>div:last-child{transform:rotate(180deg)}.ip-geo-block-live-timer>div:last-child:before{transform:rotate(0);animation:30s spin-timer linear 30s forwards}@keyframes spin-timer{0%{transform:rotate(0)}100%{transform:rotate(180deg)}}.ip-geo-block-subitem{margin-left:1.7em}.ip-geo-block-subitem:before{content:"\00bb";position:absolute;left:2em}.ip-geo-block-subitem dfn{vertical-align:middle}.ip-geo-block-subitem-parent td,.ip-geo-block-subitem-parent th{padding-top:0}:placeholder-shown{color:#888}::-webkit-input-placeholder{color:#888}:-moz-placeholder{color:#888;opacity:1}::-moz-placeholder{color:#888;opacity:1}:-ms-input-placeholder{color:#888}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/cidr.min.css b/wp/wp-content/plugins/ip-geo-block/admin/css/cidr.min.css
new file mode 100644
index 00000000..09539b5c
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/css/cidr.min.css
@@ -0,0 +1 @@
+*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:8xp;font-size:14px;line-height:1.4}.container{margin:0;padding:0}.clr:after,.col:after,.container:after,.row:after{content:"";display:table;clear:both}.row{padding-bottom:0}.col{display:block;float:left;width:100%}.span_2{width:8.33333333333%}.span_11{width:45.8333333333%}.span_24{width:100%}fieldset{border:none;margin:0;padding:.5rem}textarea{width:100%;height:4.5rem;resize:horizontal;border:1px solid #ccc;font-size:12px;font-family:Consolas,Monaco,monospace}legend input[type=button]{margin-left:.5rem;vertical-align:middle}#j,#i{display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;justify-content:center;align-items:center}#j{padding:0 .5rem}ul#h{padding:1.5rem 0 0;list-style:none}ul#h li{width:100%;margin:.1rem 0;display:inline-block}ul#h li input{padding:0}#g{height:3em;text-align:center;border:1px solid #ccc;padding:.5rem;font-size:12px;font-family:Consolas,Monaco,monospace}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.eot b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.eot
new file mode 100644
index 00000000..ae697d38
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.eot differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.svg b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.svg
new file mode 100644
index 00000000..3d17dedf
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.svg
@@ -0,0 +1,22 @@
+
+
+
\ No newline at end of file
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.ttf b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.ttf
new file mode 100644
index 00000000..8868e55a
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.ttf differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.woff b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.woff
new file mode 100644
index 00000000..51e97329
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/css/fonts/icomoon.woff differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables-all.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables-all.css
new file mode 100644
index 00000000..5734bbdd
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables-all.css
@@ -0,0 +1,679 @@
+/*! DataTables 1.10.16
+ * 2008-2017 SpryMedia Ltd - datatables.net/license
+ */
+
+table.ip-geo-block-dataTable {
+ width: 100%;
+ margin: 0 auto;
+ clear: both;
+ border-collapse: separate;
+ border-spacing: 0;
+ /*
+ * Header and footer styles
+ */
+ /*
+ * Body styles
+ */
+}
+table.ip-geo-block-dataTable thead th,
+table.ip-geo-block-dataTable tfoot th {
+ font-weight: bold;
+}
+table.ip-geo-block-dataTable thead th,
+table.ip-geo-block-dataTable thead td {
+ padding: 10px 18px;
+ border-bottom: 1px solid #111;
+}
+table.ip-geo-block-dataTable thead th:active,
+table.ip-geo-block-dataTable thead td:active {
+ outline: none;
+}
+table.ip-geo-block-dataTable tfoot th,
+table.ip-geo-block-dataTable tfoot td {
+ padding: 10px 18px 6px 18px;
+ border-top: 1px solid #111;
+}
+table.ip-geo-block-dataTable thead .sorting,
+table.ip-geo-block-dataTable thead .sorting_asc,
+table.ip-geo-block-dataTable thead .sorting_desc,
+table.ip-geo-block-dataTable thead .sorting_asc_disabled,
+table.ip-geo-block-dataTable thead .sorting_desc_disabled {
+ cursor: pointer;
+ *cursor: hand;
+ background-repeat: no-repeat;
+ background-position: center right;
+}
+table.ip-geo-block-dataTable thead .sorting {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAAN0lEQVR4AWO4c+cORZhmBvyH4QEx4D86pqsB/3Fjwgb8J4RpaQBhPES8gE/z0ElI9M9MA1+gAAD5jWGc4eZ87AAAAABJRU5ErkJggg==); /*url("../images/sort_both.png");*/
+}
+table.ip-geo-block-dataTable thead .sorting_asc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAIAAAAWBRqYAAAABnRSTlMA3ADcANwpVcdiAAAAdUlEQVR4AWO4QyKgWMONG3eWrrh76xbRGtZvulPTdHfzVuI0nDl7p7XrblXD3Y7eu+fPE6FhwWKgaihasuIuAQ2Hj95pbENoqG+9e/QYbg3Xr9+ZPB2iFIGmzrp78yYODdt3gvxa24yCgCK79pAcD8NEw6gGAPv5+lejjyPQAAAAAElFTkSuQmCC); /*url("../images/sort_asc.png");*/
+}
+table.ip-geo-block-dataTable thead .sorting_desc {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAIAAAAWBRqYAAAABnRSTlMA3ADcANwpVcdiAAAAcklEQVR4AWO4QyIY2hpGNezac6em6W5tMwoCimzfiUPDzZt3ps66W9WAgiZPv3v9Om4nHT12p74Vobqx7e7ho4T8sGQFQsOCxXcJe/r8+TsdvSDVrV13z5wlLpQ2bwX5fv0mooP11q07S1fcvXFjACMOAM7v+leNDkNAAAAAAElFTkSuQmCC); /*url("../images/sort_desc.png");*/
+}
+table.ip-geo-block-dataTable thead .sorting_asc_disabled {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAALklEQVR4AWO4c+cORZhmBvyH4QEx4D86pqsB/3Fjwgb8J4RpZsDAJ6RRA0YNAAAd2DjFaOCLnQAAAABJRU5ErkJggg==); /*url("../images/sort_asc_disabled.png");*/
+}
+table.ip-geo-block-dataTable thead .sorting_desc_disabled {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAALUlEQVR4AWO4c+cORZjqBowaMGrAf0KYlgYQNoToMMClma4GMKBrpqsB9E9IAFTzOMWpD7f6AAAAAElFTkSuQmCC); /*url("../images/sort_desc_disabled.png");*/
+}
+table.ip-geo-block-dataTable tbody tr {
+ background-color: #ffffff;
+}
+table.ip-geo-block-dataTable tbody tr.selected {
+ background-color: #B0BED9;
+}
+table.ip-geo-block-dataTable tbody th,
+table.ip-geo-block-dataTable tbody td {
+ padding: 8px 10px;
+}
+table.ip-geo-block-dataTable.row-border tbody th,
+table.ip-geo-block-dataTable.row-border tbody td,
+table.ip-geo-block-dataTable.display tbody th,
+table.ip-geo-block-dataTable.display tbody td {
+ border-top: 1px solid #ddd;
+}
+table.ip-geo-block-dataTable.row-border tbody tr:first-child th,
+table.ip-geo-block-dataTable.row-border tbody tr:first-child td,
+table.ip-geo-block-dataTable.display tbody tr:first-child th,
+table.ip-geo-block-dataTable.display tbody tr:first-child td {
+ border-top: none;
+}
+table.ip-geo-block-dataTable.cell-border tbody th,
+table.ip-geo-block-dataTable.cell-border tbody td {
+ border-top: 1px solid #ddd;
+ border-right: 1px solid #ddd;
+}
+table.ip-geo-block-dataTable.cell-border tbody tr th:first-child,
+table.ip-geo-block-dataTable.cell-border tbody tr td:first-child {
+ border-left: 1px solid #ddd;
+}
+table.ip-geo-block-dataTable.cell-border tbody tr:first-child th,
+table.ip-geo-block-dataTable.cell-border tbody tr:first-child td {
+ border-top: none;
+}
+table.ip-geo-block-dataTable.stripe tbody tr.odd,
+table.ip-geo-block-dataTable.display tbody tr.odd {
+ background-color: #f9f9f9;
+}
+table.ip-geo-block-dataTable.stripe tbody tr.odd.selected,
+table.ip-geo-block-dataTable.display tbody tr.odd.selected {
+ background-color: #acbad4;
+}
+table.ip-geo-block-dataTable.hover tbody tr:hover,
+table.ip-geo-block-dataTable.display tbody tr:hover {
+ background-color: #f6f6f6;
+}
+table.ip-geo-block-dataTable.hover tbody tr:hover.selected,
+table.ip-geo-block-dataTable.display tbody tr:hover.selected {
+ background-color: #aab7d1;
+}
+table.ip-geo-block-dataTable.order-column tbody tr > .sorting_1,
+table.ip-geo-block-dataTable.order-column tbody tr > .sorting_2,
+table.ip-geo-block-dataTable.order-column tbody tr > .sorting_3,
+table.ip-geo-block-dataTable.display tbody tr > .sorting_1,
+table.ip-geo-block-dataTable.display tbody tr > .sorting_2,
+table.ip-geo-block-dataTable.display tbody tr > .sorting_3 {
+ background-color: #fafafa;
+}
+table.ip-geo-block-dataTable.order-column tbody tr.selected > .sorting_1,
+table.ip-geo-block-dataTable.order-column tbody tr.selected > .sorting_2,
+table.ip-geo-block-dataTable.order-column tbody tr.selected > .sorting_3,
+table.ip-geo-block-dataTable.display tbody tr.selected > .sorting_1,
+table.ip-geo-block-dataTable.display tbody tr.selected > .sorting_2,
+table.ip-geo-block-dataTable.display tbody tr.selected > .sorting_3 {
+ background-color: #acbad5;
+}
+table.ip-geo-block-dataTable.display tbody tr.odd > .sorting_1,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+ background-color: #f1f1f1;
+}
+table.ip-geo-block-dataTable.display tbody tr.odd > .sorting_2,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+ background-color: #f3f3f3;
+}
+table.ip-geo-block-dataTable.display tbody tr.odd > .sorting_3,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+ background-color: whitesmoke;
+}
+table.ip-geo-block-dataTable.display tbody tr.odd.selected > .sorting_1,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+ background-color: #a6b4cd;
+}
+table.ip-geo-block-dataTable.display tbody tr.odd.selected > .sorting_2,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+ background-color: #a8b5cf;
+}
+table.ip-geo-block-dataTable.display tbody tr.odd.selected > .sorting_3,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+ background-color: #a9b7d1;
+}
+table.ip-geo-block-dataTable.display tbody tr.even > .sorting_1,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+ background-color: #fafafa;
+}
+table.ip-geo-block-dataTable.display tbody tr.even > .sorting_2,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+ background-color: #fcfcfc;
+}
+table.ip-geo-block-dataTable.display tbody tr.even > .sorting_3,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+ background-color: #fefefe;
+}
+table.ip-geo-block-dataTable.display tbody tr.even.selected > .sorting_1,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+ background-color: #acbad5;
+}
+table.ip-geo-block-dataTable.display tbody tr.even.selected > .sorting_2,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+ background-color: #aebcd6;
+}
+table.ip-geo-block-dataTable.display tbody tr.even.selected > .sorting_3,
+table.ip-geo-block-dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+ background-color: #afbdd8;
+}
+table.ip-geo-block-dataTable.display tbody tr:hover > .sorting_1,
+table.ip-geo-block-dataTable.order-column.hover tbody tr:hover > .sorting_1 {
+ background-color: #eaeaea;
+}
+table.ip-geo-block-dataTable.display tbody tr:hover > .sorting_2,
+table.ip-geo-block-dataTable.order-column.hover tbody tr:hover > .sorting_2 {
+ background-color: #ececec;
+}
+table.ip-geo-block-dataTable.display tbody tr:hover > .sorting_3,
+table.ip-geo-block-dataTable.order-column.hover tbody tr:hover > .sorting_3 {
+ background-color: #efefef;
+}
+table.ip-geo-block-dataTable.display tbody tr:hover.selected > .sorting_1,
+table.ip-geo-block-dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
+ background-color: #a2aec7;
+}
+table.ip-geo-block-dataTable.display tbody tr:hover.selected > .sorting_2,
+table.ip-geo-block-dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
+ background-color: #a3b0c9;
+}
+table.ip-geo-block-dataTable.display tbody tr:hover.selected > .sorting_3,
+table.ip-geo-block-dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
+ background-color: #a5b2cb;
+}
+table.ip-geo-block-dataTable.no-footer {
+ border-bottom: 1px solid #111;
+}
+table.ip-geo-block-dataTable.nowrap th,
+table.ip-geo-block-dataTable.nowrap td {
+ white-space: nowrap;
+}
+table.ip-geo-block-dataTable.compact thead th,
+table.ip-geo-block-dataTable.compact thead td {
+ padding: 4px 17px 4px 4px;
+}
+table.ip-geo-block-dataTable.compact tfoot th,
+table.ip-geo-block-dataTable.compact tfoot td {
+ padding: 4px;
+}
+table.ip-geo-block-dataTable.compact tbody th,
+table.ip-geo-block-dataTable.compact tbody td {
+ padding: 4px;
+}
+table.ip-geo-block-dataTable th.dt-left,
+table.ip-geo-block-dataTable td.dt-left {
+ text-align: left;
+}
+table.ip-geo-block-dataTable th.dt-center,
+table.ip-geo-block-dataTable td.dt-center,
+table.ip-geo-block-dataTable td.dataTables_empty {
+ text-align: center;
+}
+table.ip-geo-block-dataTable th.dt-right,
+table.ip-geo-block-dataTable td.dt-right {
+ text-align: right;
+}
+table.ip-geo-block-dataTable th.dt-justify,
+table.ip-geo-block-dataTable td.dt-justify {
+ text-align: justify;
+}
+table.ip-geo-block-dataTable th.dt-nowrap,
+table.ip-geo-block-dataTable td.dt-nowrap {
+ white-space: nowrap;
+}
+table.ip-geo-block-dataTable thead th.dt-head-left,
+table.ip-geo-block-dataTable thead td.dt-head-left,
+table.ip-geo-block-dataTable tfoot th.dt-head-left,
+table.ip-geo-block-dataTable tfoot td.dt-head-left {
+ text-align: left;
+}
+table.ip-geo-block-dataTable thead th.dt-head-center,
+table.ip-geo-block-dataTable thead td.dt-head-center,
+table.ip-geo-block-dataTable tfoot th.dt-head-center,
+table.ip-geo-block-dataTable tfoot td.dt-head-center {
+ text-align: center;
+}
+table.ip-geo-block-dataTable thead th.dt-head-right,
+table.ip-geo-block-dataTable thead td.dt-head-right,
+table.ip-geo-block-dataTable tfoot th.dt-head-right,
+table.ip-geo-block-dataTable tfoot td.dt-head-right {
+ text-align: right;
+}
+table.ip-geo-block-dataTable thead th.dt-head-justify,
+table.ip-geo-block-dataTable thead td.dt-head-justify,
+table.ip-geo-block-dataTable tfoot th.dt-head-justify,
+table.ip-geo-block-dataTable tfoot td.dt-head-justify {
+ text-align: justify;
+}
+table.ip-geo-block-dataTable thead th.dt-head-nowrap,
+table.ip-geo-block-dataTable thead td.dt-head-nowrap,
+table.ip-geo-block-dataTable tfoot th.dt-head-nowrap,
+table.ip-geo-block-dataTable tfoot td.dt-head-nowrap {
+ white-space: nowrap;
+}
+table.ip-geo-block-dataTable tbody th.dt-body-left,
+table.ip-geo-block-dataTable tbody td.dt-body-left {
+ text-align: left;
+}
+table.ip-geo-block-dataTable tbody th.dt-body-center,
+table.ip-geo-block-dataTable tbody td.dt-body-center {
+ text-align: center;
+}
+table.ip-geo-block-dataTable tbody th.dt-body-right,
+table.ip-geo-block-dataTable tbody td.dt-body-right {
+ text-align: right;
+}
+table.ip-geo-block-dataTable tbody th.dt-body-justify,
+table.ip-geo-block-dataTable tbody td.dt-body-justify {
+ text-align: justify;
+}
+table.ip-geo-block-dataTable tbody th.dt-body-nowrap,
+table.ip-geo-block-dataTable tbody td.dt-body-nowrap {
+ white-space: nowrap;
+}
+
+table.ip-geo-block-dataTable,
+table.ip-geo-block-dataTable th,
+table.ip-geo-block-dataTable td {
+ box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+div[class*="ip-geo-block"] .dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+ zoom: 1;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length {
+ float: left;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_filter {
+ float: right;
+ text-align: right;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_filter input {
+ margin-left: 0.5em;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_info {
+ clear: both;
+ float: left;
+ padding-top: 0.755em;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
+ float: right;
+ text-align: right;
+ padding-top: 0.25em;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button {
+ box-sizing: border-box;
+ display: inline-block;
+ min-width: 1.5em;
+ padding: 0.5em 1em;
+ margin-left: 2px;
+ text-align: center;
+ text-decoration: none !important;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333 !important;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button.current,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+ color: #333 !important;
+ border: 1px solid #979797;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
+ /* W3C */
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+ cursor: default;
+ color: #666 !important;
+ border: 1px solid transparent;
+ background: transparent;
+ box-shadow: none;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+ color: white !important;
+ border: 1px solid #111;
+ background-color: #585858;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #585858 0%, #111 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #585858 0%, #111 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #585858 0%, #111 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #585858 0%, #111 100%);
+ /* W3C */
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .paginate_button:active {
+ outline: none;
+ background-color: #2b2b2b;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+ /* W3C */
+ box-shadow: inset 0 0 3px #111;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate .ellipsis {
+ padding: 0 1em;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 40px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_filter,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_info,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_processing,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
+ color: #333;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll {
+ clear: both;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
+ vertical-align: middle;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
+div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
+ height: 0;
+ overflow: hidden;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper.no-footer .dataTables_scrollBody {
+ border-bottom: 1px solid #111;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper.no-footer div.dataTables_scrollHead table.ip-geo-block-dataTable,
+div[class*="ip-geo-block"] .dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
+ border-bottom: none;
+}
+div[class*="ip-geo-block"] .dataTables_wrapper:after {
+ visibility: hidden;
+ display: block;
+ content: "";
+ clear: both;
+ height: 0;
+}
+
+@media screen and (max-width: 767px) {
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_info,
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
+ float: none;
+ text-align: center;
+ }
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
+ margin-top: 0.5em;
+ }
+}
+@media screen and (max-width: 640px) {
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length,
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_filter {
+ float: none;
+ text-align: center;
+ }
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_filter {
+ margin-top: 0.5em;
+ }
+}
+
+/*! Responsive 2.1.1
+ * 2014-2016 SpryMedia Ltd - datatables.net/license
+ */
+
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > td.child,
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > th.child,
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > td.dataTables_empty {
+ cursor: default !important;
+}
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > td.child:before,
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > th.child:before,
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > td.dataTables_empty:before {
+ display: none !important;
+}
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > td:first-child,
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > th:first-child {
+ position: relative;
+ padding-left: 30px;
+ cursor: pointer;
+}
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > td:first-child:before,
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr > th:first-child:before {
+ top: 9px;
+ left: 4px;
+ height: 14px;
+ width: 14px;
+ display: block;
+ position: absolute;
+ color: white;
+ border: 2px solid white;
+ border-radius: 14px;
+ box-shadow: 0 0 3px #444;
+ box-sizing: content-box;
+ text-align: center;
+ font-family: 'Courier New', Courier, monospace;
+ line-height: 14px;
+ content: '+';
+ background-color: #31b131;
+}
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr.parent > td:first-child:before,
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr.parent > th:first-child:before {
+ content: '-';
+ background-color: #d33333;
+}
+table.ip-geo-block-dataTable.dtr-inline.collapsed > tbody > tr.child td:before {
+ display: none;
+}
+table.ip-geo-block-dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child,
+table.ip-geo-block-dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child {
+ padding-left: 27px;
+}
+table.ip-geo-block-dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child:before,
+table.ip-geo-block-dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child:before {
+ top: 5px;
+ left: 4px;
+ height: 14px;
+ width: 14px;
+ border-radius: 14px;
+ line-height: 14px;
+ text-indent: 3px;
+}
+table.ip-geo-block-dataTable.dtr-column > tbody > tr > td.control,
+table.ip-geo-block-dataTable.dtr-column > tbody > tr > th.control {
+ position: relative;
+ cursor: pointer;
+}
+table.ip-geo-block-dataTable.dtr-column > tbody > tr > td.control:before,
+table.ip-geo-block-dataTable.dtr-column > tbody > tr > th.control:before {
+ top: 50%;
+ left: 50%;
+ height: 16px;
+ width: 16px;
+ margin-top: -10px;
+ margin-left: -10px;
+ display: block;
+ position: absolute;
+ color: white;
+ border: 2px solid white;
+ border-radius: 14px;
+ box-shadow: 0 0 3px #444;
+ box-sizing: content-box;
+ text-align: center;
+ font-family: 'Courier New', Courier, monospace;
+ line-height: 14px;
+ content: '+';
+ background-color: #31b131;
+}
+table.ip-geo-block-dataTable.dtr-column > tbody > tr.parent td.control:before,
+table.ip-geo-block-dataTable.dtr-column > tbody > tr.parent th.control:before {
+ content: '-';
+ background-color: #d33333;
+}
+table.ip-geo-block-dataTable > tbody > tr.child {
+ padding: 0.5em 1em;
+}
+table.ip-geo-block-dataTable > tbody > tr.child:hover {
+ background: transparent !important;
+}
+table.ip-geo-block-dataTable > tbody > tr.child ul.dtr-details {
+ display: inline-block;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+table.ip-geo-block-dataTable > tbody > tr.child ul.dtr-details li {
+ border-bottom: 1px solid #efefef;
+ padding: 0.5em 0;
+}
+table.ip-geo-block-dataTable > tbody > tr.child ul.dtr-details li:first-child {
+ padding-top: 0;
+}
+table.ip-geo-block-dataTable > tbody > tr.child ul.dtr-details li:last-child {
+ border-bottom: none;
+}
+table.ip-geo-block-dataTable > tbody > tr.child span.dtr-title {
+ display: inline-block;
+ min-width: 75px;
+ font-weight: bold;
+}
+
+div.dtr-modal {
+ position: fixed;
+ box-sizing: border-box;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 100;
+ padding: 10em 1em;
+}
+div.dtr-modal div.dtr-modal-display {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ width: 50%;
+ height: 50%;
+ overflow: auto;
+ margin: auto;
+ z-index: 102;
+ overflow: auto;
+ background-color: #f5f5f7;
+ border: 1px solid black;
+ border-radius: 0.5em;
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.6);
+}
+div.dtr-modal div.dtr-modal-content {
+ position: relative;
+ padding: 1em;
+}
+div.dtr-modal div.dtr-modal-close {
+ position: absolute;
+ top: 6px;
+ right: 6px;
+ width: 22px;
+ height: 22px;
+ border: 1px solid #eaeaea;
+ background-color: #f9f9f9;
+ text-align: center;
+ border-radius: 3px;
+ cursor: pointer;
+ z-index: 12;
+}
+div.dtr-modal div.dtr-modal-close:hover {
+ background-color: #eaeaea;
+}
+div.dtr-modal div.dtr-modal-background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 101;
+ background: rgba(0, 0, 0, 0.6);
+}
+
+@media screen and (max-width: 767px) {
+ div.dtr-modal div.dtr-modal-display {
+ width: 95%;
+ }
+}
+
+/*! datatables.mark.js v2.0.1
+ * Copyright (c) 2016-2017 Julian Motz
+ * https://github.com/julmot/datatables.mark.js/blob/master/LICENSE
+ */
+
+mark {
+ background: orange;
+ color: black;
+}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables-all.min.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables-all.min.css
new file mode 100644
index 00000000..330a13cf
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables-all.min.css
@@ -0,0 +1,15 @@
+/*! DataTables 1.10.16
+ * 2008-2017 SpryMedia Ltd - datatables.net/license
+ */
+table.ip-geo-block-dataTable tbody td.dt-body-nowrap,table.ip-geo-block-dataTable tbody th.dt-body-nowrap,table.ip-geo-block-dataTable td.dt-nowrap,table.ip-geo-block-dataTable tfoot td.dt-head-nowrap,table.ip-geo-block-dataTable tfoot th.dt-head-nowrap,table.ip-geo-block-dataTable th.dt-nowrap,table.ip-geo-block-dataTable thead td.dt-head-nowrap,table.ip-geo-block-dataTable thead th.dt-head-nowrap,table.ip-geo-block-dataTable.nowrap td,table.ip-geo-block-dataTable.nowrap th{white-space:nowrap}table.ip-geo-block-dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.ip-geo-block-dataTable tfoot th,table.ip-geo-block-dataTable thead th{font-weight:700}table.ip-geo-block-dataTable thead td,table.ip-geo-block-dataTable thead th{padding:10px 18px;border-bottom:1px solid #111}table.ip-geo-block-dataTable thead td:active,table.ip-geo-block-dataTable thead th:active{outline:0}table.ip-geo-block-dataTable tfoot td,table.ip-geo-block-dataTable tfoot th{padding:10px 18px 6px;border-top:1px solid #111}table.ip-geo-block-dataTable thead .sorting,table.ip-geo-block-dataTable thead .sorting_asc,table.ip-geo-block-dataTable thead .sorting_asc_disabled,table.ip-geo-block-dataTable thead .sorting_desc,table.ip-geo-block-dataTable thead .sorting_desc_disabled{cursor:pointer;background-repeat:no-repeat;background-position:center right}table.ip-geo-block-dataTable thead .sorting{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAAN0lEQVR4AWO4c+cORZhmBvyH4QEx4D86pqsB/3Fjwgb8J4RpaQBhPES8gE/z0ElI9M9MA1+gAAD5jWGc4eZ87AAAAABJRU5ErkJggg==)}table.ip-geo-block-dataTable thead .sorting_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAIAAAAWBRqYAAAABnRSTlMA3ADcANwpVcdiAAAAdUlEQVR4AWO4QyKgWMONG3eWrrh76xbRGtZvulPTdHfzVuI0nDl7p7XrblXD3Y7eu+fPE6FhwWKgaihasuIuAQ2Hj95pbENoqG+9e/QYbg3Xr9+ZPB2iFIGmzrp78yYODdt3gvxa24yCgCK79pAcD8NEw6gGAPv5+lejjyPQAAAAAElFTkSuQmCC)}table.ip-geo-block-dataTable thead .sorting_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAIAAAAWBRqYAAAABnRSTlMA3ADcANwpVcdiAAAAcklEQVR4AWO4QyIY2hpGNezac6em6W5tMwoCimzfiUPDzZt3ps66W9WAgiZPv3v9Om4nHT12p74Vobqx7e7ho4T8sGQFQsOCxXcJe/r8+TsdvSDVrV13z5wlLpQ2bwX5fv0mooP11q07S1fcvXFjACMOAM7v+leNDkNAAAAAAElFTkSuQmCC)}table.ip-geo-block-dataTable thead .sorting_asc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAALklEQVR4AWO4c+cORZhmBvyH4QEx4D86pqsB/3Fjwgb8J4RpZsDAJ6RRA0YNAAAd2DjFaOCLnQAAAABJRU5ErkJggg==)}table.ip-geo-block-dataTable thead .sorting_desc_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAALUlEQVR4AWO4c+cORZjqBowaMGrAf0KYlgYQNoToMMClma4GMKBrpqsB9E9IAFTzOMWpD7f6AAAAAElFTkSuQmCC)}table.ip-geo-block-dataTable tbody tr{background-color:#fff}table.ip-geo-block-dataTable tbody tr.selected{background-color:#B0BED9}table.ip-geo-block-dataTable tbody td,table.ip-geo-block-dataTable tbody th{padding:8px 10px}table.ip-geo-block-dataTable.display tbody td,table.ip-geo-block-dataTable.display tbody th,table.ip-geo-block-dataTable.row-border tbody td,table.ip-geo-block-dataTable.row-border tbody th{border-top:1px solid #ddd}table.ip-geo-block-dataTable.display tbody tr:first-child td,table.ip-geo-block-dataTable.display tbody tr:first-child th,table.ip-geo-block-dataTable.row-border tbody tr:first-child td,table.ip-geo-block-dataTable.row-border tbody tr:first-child th{border-top:none}table.ip-geo-block-dataTable.cell-border tbody td,table.ip-geo-block-dataTable.cell-border tbody th{border-top:1px solid #ddd;border-right:1px solid #ddd}table.ip-geo-block-dataTable.cell-border tbody tr td:first-child,table.ip-geo-block-dataTable.cell-border tbody tr th:first-child{border-left:1px solid #ddd}table.ip-geo-block-dataTable.cell-border tbody tr:first-child td,table.ip-geo-block-dataTable.cell-border tbody tr:first-child th{border-top:none}table.ip-geo-block-dataTable.display tbody tr.odd,table.ip-geo-block-dataTable.stripe tbody tr.odd{background-color:#f9f9f9}table.ip-geo-block-dataTable.display tbody tr.odd.selected,table.ip-geo-block-dataTable.stripe tbody tr.odd.selected{background-color:#acbad4}table.ip-geo-block-dataTable.display tbody tr:hover,table.ip-geo-block-dataTable.hover tbody tr:hover{background-color:#f6f6f6}table.ip-geo-block-dataTable.display tbody tr:hover.selected,table.ip-geo-block-dataTable.hover tbody tr:hover.selected{background-color:#aab7d1}table.ip-geo-block-dataTable.display tbody tr>.sorting_1,table.ip-geo-block-dataTable.display tbody tr>.sorting_2,table.ip-geo-block-dataTable.display tbody tr>.sorting_3,table.ip-geo-block-dataTable.order-column tbody tr>.sorting_1,table.ip-geo-block-dataTable.order-column tbody tr>.sorting_2,table.ip-geo-block-dataTable.order-column tbody tr>.sorting_3{background-color:#fafafa}table.ip-geo-block-dataTable.display tbody tr.selected>.sorting_1,table.ip-geo-block-dataTable.display tbody tr.selected>.sorting_2,table.ip-geo-block-dataTable.display tbody tr.selected>.sorting_3,table.ip-geo-block-dataTable.order-column tbody tr.selected>.sorting_1,table.ip-geo-block-dataTable.order-column tbody tr.selected>.sorting_2,table.ip-geo-block-dataTable.order-column tbody tr.selected>.sorting_3{background-color:#acbad5}table.ip-geo-block-dataTable.display tbody tr.odd>.sorting_1,table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.ip-geo-block-dataTable.display tbody tr.odd>.sorting_2,table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.ip-geo-block-dataTable.display tbody tr.odd>.sorting_3,table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.ip-geo-block-dataTable.display tbody tr.odd.selected>.sorting_1,table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.ip-geo-block-dataTable.display tbody tr.odd.selected>.sorting_2,table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.ip-geo-block-dataTable.display tbody tr.odd.selected>.sorting_3,table.ip-geo-block-dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.ip-geo-block-dataTable.display tbody tr.even>.sorting_1,table.ip-geo-block-dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.ip-geo-block-dataTable.display tbody tr.even>.sorting_2,table.ip-geo-block-dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.ip-geo-block-dataTable.display tbody tr.even>.sorting_3,table.ip-geo-block-dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.ip-geo-block-dataTable.display tbody tr.even.selected>.sorting_1,table.ip-geo-block-dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.ip-geo-block-dataTable.display tbody tr.even.selected>.sorting_2,table.ip-geo-block-dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.ip-geo-block-dataTable.display tbody tr.even.selected>.sorting_3,table.ip-geo-block-dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.ip-geo-block-dataTable.display tbody tr:hover>.sorting_1,table.ip-geo-block-dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.ip-geo-block-dataTable.display tbody tr:hover>.sorting_2,table.ip-geo-block-dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.ip-geo-block-dataTable.display tbody tr:hover>.sorting_3,table.ip-geo-block-dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.ip-geo-block-dataTable.display tbody tr:hover.selected>.sorting_1,table.ip-geo-block-dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.ip-geo-block-dataTable.display tbody tr:hover.selected>.sorting_2,table.ip-geo-block-dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.ip-geo-block-dataTable.display tbody tr:hover.selected>.sorting_3,table.ip-geo-block-dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.ip-geo-block-dataTable.no-footer{border-bottom:1px solid #111}table.ip-geo-block-dataTable.compact thead td,table.ip-geo-block-dataTable.compact thead th{padding:4px 17px 4px 4px}table.ip-geo-block-dataTable.compact tbody td,table.ip-geo-block-dataTable.compact tbody th,table.ip-geo-block-dataTable.compact tfoot td,table.ip-geo-block-dataTable.compact tfoot th{padding:4px}table.ip-geo-block-dataTable td.dt-left,table.ip-geo-block-dataTable th.dt-left{text-align:left}table.ip-geo-block-dataTable td.dataTables_empty,table.ip-geo-block-dataTable td.dt-center,table.ip-geo-block-dataTable th.dt-center{text-align:center}table.ip-geo-block-dataTable td.dt-right,table.ip-geo-block-dataTable th.dt-right{text-align:right}table.ip-geo-block-dataTable td.dt-justify,table.ip-geo-block-dataTable th.dt-justify{text-align:justify}table.ip-geo-block-dataTable tfoot td.dt-head-left,table.ip-geo-block-dataTable tfoot th.dt-head-left,table.ip-geo-block-dataTable thead td.dt-head-left,table.ip-geo-block-dataTable thead th.dt-head-left{text-align:left}table.ip-geo-block-dataTable tfoot td.dt-head-center,table.ip-geo-block-dataTable tfoot th.dt-head-center,table.ip-geo-block-dataTable thead td.dt-head-center,table.ip-geo-block-dataTable thead th.dt-head-center{text-align:center}table.ip-geo-block-dataTable tfoot td.dt-head-right,table.ip-geo-block-dataTable tfoot th.dt-head-right,table.ip-geo-block-dataTable thead td.dt-head-right,table.ip-geo-block-dataTable thead th.dt-head-right{text-align:right}table.ip-geo-block-dataTable tfoot td.dt-head-justify,table.ip-geo-block-dataTable tfoot th.dt-head-justify,table.ip-geo-block-dataTable thead td.dt-head-justify,table.ip-geo-block-dataTable thead th.dt-head-justify{text-align:justify}table.ip-geo-block-dataTable tbody td.dt-body-left,table.ip-geo-block-dataTable tbody th.dt-body-left{text-align:left}table.ip-geo-block-dataTable tbody td.dt-body-center,table.ip-geo-block-dataTable tbody th.dt-body-center{text-align:center}table.ip-geo-block-dataTable tbody td.dt-body-right,table.ip-geo-block-dataTable tbody th.dt-body-right{text-align:right}table.ip-geo-block-dataTable tbody td.dt-body-justify,table.ip-geo-block-dataTable tbody th.dt-body-justify{text-align:justify}table.ip-geo-block-dataTable,table.ip-geo-block-dataTable td,table.ip-geo-block-dataTable th{box-sizing:content-box}div[class*=ip-geo-block] .dataTables_wrapper{position:relative;clear:both;zoom:1}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length{float:left}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_filter{float:right;text-align:right}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_filter input{margin-left:.5em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none!important;cursor:pointer;color:#333!important;border:1px solid transparent;border-radius:2px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button.current,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333!important;border:1px solid #979797;background-color:#fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(100%,#dcdcdc));background:-webkit-linear-gradient(top,#fff 0,#dcdcdc 100%);background:-moz-linear-gradient(top,#fff 0,#dcdcdc 100%);background:-ms-linear-gradient(top,#fff 0,#dcdcdc 100%);background:-o-linear-gradient(top,#fff 0,#dcdcdc 100%);background:linear-gradient(to bottom,#fff 0,#dcdcdc 100%)}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover{cursor:default;color:#666!important;border:1px solid transparent;background:0 0;box-shadow:none}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:#fff!important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0,#111 100%);background:-moz-linear-gradient(top,#585858 0,#111 100%);background:-ms-linear-gradient(top,#585858 0,#111 100%);background:-o-linear-gradient(top,#585858 0,#111 100%);background:linear-gradient(to bottom,#585858 0,#111 100%)}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:0;background-color:#2b2b2b;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b 0,#0c0c0c 100%);box-shadow:inset 0 0 3px #111}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:#fff;background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),color-stop(25%,rgba(255,255,255,.9)),color-stop(75%,rgba(255,255,255,.9)),color-stop(100%,rgba(255,255,255,0)));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,.9) 25%,rgba(255,255,255,.9) 75%,rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,.9) 25%,rgba(255,255,255,.9) 75%,rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,.9) 25%,rgba(255,255,255,.9) 75%,rgba(255,255,255,0) 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,.9) 25%,rgba(255,255,255,.9) 75%,rgba(255,255,255,0) 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,.9) 25%,rgba(255,255,255,.9) 75%,rgba(255,255,255,0) 100%)}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_filter,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_info,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_processing{color:#333}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll{clear:both}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th{vertical-align:middle}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing{height:0;overflow:hidden;margin:0!important;padding:0!important}div[class*=ip-geo-block] .dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}div[class*=ip-geo-block] .dataTables_wrapper.no-footer div.dataTables_scrollBody>table,div[class*=ip-geo-block] .dataTables_wrapper.no-footer div.dataTables_scrollHead table.ip-geo-block-dataTable{border-bottom:none}div[class*=ip-geo-block] .dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width:767px){div[class*=ip-geo-block] .dataTables_wrapper .dataTables_info,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{float:none;text-align:center}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width:640px){div[class*=ip-geo-block] .dataTables_wrapper .dataTables_filter,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length{float:none;text-align:center}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_filter{margin-top:.5em}}
+
+/*! Responsive 2.1.1
+ * 2014-2016 SpryMedia Ltd - datatables.net/license
+ */
+table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty,table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>th.child{cursor:default!important}table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before,table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>th.child:before{display:none!important}table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before{top:9px;left:4px;height:14px;width:14px;display:block;position:absolute;color:#fff;border:2px solid #fff;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New',Courier,monospace;line-height:14px;content:'+';background-color:#31b131}table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.ip-geo-block-dataTable.dtr-inline.collapsed>tbody>tr.child td:before{display:none}table.ip-geo-block-dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.ip-geo-block-dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.ip-geo-block-dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.ip-geo-block-dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.ip-geo-block-dataTable.dtr-column>tbody>tr>td.control,table.ip-geo-block-dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.ip-geo-block-dataTable.dtr-column>tbody>tr>td.control:before,table.ip-geo-block-dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:#fff;border:2px solid #fff;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New',Courier,monospace;line-height:14px;content:'+';background-color:#31b131}table.ip-geo-block-dataTable.dtr-column>tbody>tr.parent td.control:before,table.ip-geo-block-dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.ip-geo-block-dataTable>tbody>tr.child{padding:.5em 1em}table.ip-geo-block-dataTable>tbody>tr.child:hover{background:0 0!important}table.ip-geo-block-dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.ip-geo-block-dataTable>tbody>tr.child ul.dtr-details li{border-bottom:1px solid #efefef;padding:.5em 0}table.ip-geo-block-dataTable>tbody>tr.child ul.dtr-details li:first-child{padding-top:0}table.ip-geo-block-dataTable>tbody>tr.child ul.dtr-details li:last-child{border-bottom:none}table.ip-geo-block-dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:700}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid #000;border-radius:.5em;box-shadow:0 12px 30px rgba(0,0,0,.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,.6)}@media screen and (max-width:767px){div.dtr-modal div.dtr-modal-display{width:95%}}
+
+/*! datatables.mark.js v2.0.1
+ * Copyright (c) 2016-2017 Julian Motz
+ * https://github.com/julmot/datatables.mark.js/blob/master/LICENSE
+ */
+mark{background:orange;color:#000}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables.mark.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables.mark.css
new file mode 100644
index 00000000..15046205
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables.mark.css
@@ -0,0 +1,9 @@
+/*! datatables.mark.js v2.0.1
+ * Copyright (c) 2016–2017 Julian Motz
+ * https://github.com/julmot/datatables.mark.js/blob/master/LICENSE
+ */
+
+mark {
+ background: orange;
+ color: black;
+}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables.mark.min.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables.mark.min.css
new file mode 100644
index 00000000..722870b7
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/datatables.mark.min.css
@@ -0,0 +1 @@
+mark{background:orange;color:black;}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/jquery.dataTables.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/jquery.dataTables.css
new file mode 100644
index 00000000..8235019d
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/jquery.dataTables.css
@@ -0,0 +1,449 @@
+/*! DataTables 1.10.16
+ * 2008-2017 SpryMedia Ltd - datatables.net/license
+ */
+
+table.dataTable {
+ width: 100%;
+ margin: 0 auto;
+ clear: both;
+ border-collapse: separate;
+ border-spacing: 0;
+ /*
+ * Header and footer styles
+ */
+ /*
+ * Body styles
+ */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+ font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+ padding: 10px 18px;
+ border-bottom: 1px solid #111;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+ outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+ padding: 10px 18px 6px 18px;
+ border-top: 1px solid #111;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ cursor: pointer;
+ *cursor: hand;
+ background-repeat: no-repeat;
+ background-position: center right;
+}
+table.dataTable thead .sorting {
+ background-image: url("../images/sort_both.png");
+}
+table.dataTable thead .sorting_asc {
+ background-image: url("../images/sort_asc.png");
+}
+table.dataTable thead .sorting_desc {
+ background-image: url("../images/sort_desc.png");
+}
+table.dataTable thead .sorting_asc_disabled {
+ background-image: url("../images/sort_asc_disabled.png");
+}
+table.dataTable thead .sorting_desc_disabled {
+ background-image: url("../images/sort_desc_disabled.png");
+}
+table.dataTable tbody tr {
+ background-color: #ffffff;
+}
+table.dataTable tbody tr.selected {
+ background-color: #B0BED9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+ padding: 8px 10px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+ border-top: 1px solid #ddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+ border-top: 1px solid #ddd;
+ border-right: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+ border-left: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+ background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+ background-color: #acbad4;
+}
+table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
+ background-color: #f6f6f6;
+}
+table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
+ background-color: #aab7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+ background-color: #fafafa;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+ background-color: #acbad5;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+ background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+ background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+ background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+ background-color: #a6b4cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+ background-color: #a8b5cf;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+ background-color: #a9b7d1;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+ background-color: #fafafa;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+ background-color: #fcfcfc;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+ background-color: #fefefe;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+ background-color: #acbad5;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+ background-color: #aebcd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+ background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
+ background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
+ background-color: #ececec;
+}
+table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
+ background-color: #efefef;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
+ background-color: #a2aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
+ background-color: #a3b0c9;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
+ background-color: #a5b2cb;
+}
+table.dataTable.no-footer {
+ border-bottom: 1px solid #111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+ white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+ padding: 4px 17px 4px 4px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+ padding: 4px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+ padding: 4px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+ text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+ text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+ text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+ text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+ white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+ text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+ text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+ text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+ text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+ white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+ text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+ text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+ text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+ text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+ white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+ box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+ zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+ float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+ float: right;
+ text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+ margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+ clear: both;
+ float: left;
+ padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+ float: right;
+ text-align: right;
+ padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+ box-sizing: border-box;
+ display: inline-block;
+ min-width: 1.5em;
+ padding: 0.5em 1em;
+ margin-left: 2px;
+ text-align: center;
+ text-decoration: none !important;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333 !important;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+ color: #333 !important;
+ border: 1px solid #979797;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+ cursor: default;
+ color: #666 !important;
+ border: 1px solid transparent;
+ background: transparent;
+ box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+ color: white !important;
+ border: 1px solid #111;
+ background-color: #585858;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #585858 0%, #111 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #585858 0%, #111 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #585858 0%, #111 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #585858 0%, #111 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+ outline: none;
+ background-color: #2b2b2b;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+ /* W3C */
+ box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_paginate .ellipsis {
+ padding: 0 1em;
+}
+.dataTables_wrapper .dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 40px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+ color: #333;
+}
+.dataTables_wrapper .dataTables_scroll {
+ clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
+ vertical-align: middle;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
+ height: 0;
+ overflow: hidden;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+ border-bottom: 1px solid #111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
+ border-bottom: none;
+}
+.dataTables_wrapper:after {
+ visibility: hidden;
+ display: block;
+ content: "";
+ clear: both;
+ height: 0;
+}
+
+@media screen and (max-width: 767px) {
+ .dataTables_wrapper .dataTables_info,
+ .dataTables_wrapper .dataTables_paginate {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_paginate {
+ margin-top: 0.5em;
+ }
+}
+@media screen and (max-width: 640px) {
+ .dataTables_wrapper .dataTables_length,
+ .dataTables_wrapper .dataTables_filter {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_filter {
+ margin-top: 0.5em;
+ }
+}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/jquery.dataTables.min.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/jquery.dataTables.min.css
new file mode 100644
index 00000000..6565b406
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/jquery.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/responsive.dataTables.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/responsive.dataTables.css
new file mode 100644
index 00000000..d9f36e94
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/responsive.dataTables.css
@@ -0,0 +1,182 @@
+/*! Responsive 2.1.1
+ * 2014-2016 SpryMedia Ltd - datatables.net/license
+ */
+
+table.dataTable.dtr-inline.collapsed > tbody > tr > td.child,
+table.dataTable.dtr-inline.collapsed > tbody > tr > th.child,
+table.dataTable.dtr-inline.collapsed > tbody > tr > td.dataTables_empty {
+ cursor: default !important;
+}
+table.dataTable.dtr-inline.collapsed > tbody > tr > td.child:before,
+table.dataTable.dtr-inline.collapsed > tbody > tr > th.child:before,
+table.dataTable.dtr-inline.collapsed > tbody > tr > td.dataTables_empty:before {
+ display: none !important;
+}
+table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child,
+table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child {
+ position: relative;
+ padding-left: 30px;
+ cursor: pointer;
+}
+table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child:before,
+table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child:before {
+ top: 9px;
+ left: 4px;
+ height: 14px;
+ width: 14px;
+ display: block;
+ position: absolute;
+ color: white;
+ border: 2px solid white;
+ border-radius: 14px;
+ box-shadow: 0 0 3px #444;
+ box-sizing: content-box;
+ text-align: center;
+ font-family: 'Courier New', Courier, monospace;
+ line-height: 14px;
+ content: '+';
+ background-color: #31b131;
+}
+table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td:first-child:before,
+table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th:first-child:before {
+ content: '-';
+ background-color: #d33333;
+}
+table.dataTable.dtr-inline.collapsed > tbody > tr.child td:before {
+ display: none;
+}
+table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child,
+table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child {
+ padding-left: 27px;
+}
+table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child:before,
+table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child:before {
+ top: 5px;
+ left: 4px;
+ height: 14px;
+ width: 14px;
+ border-radius: 14px;
+ line-height: 14px;
+ text-indent: 3px;
+}
+table.dataTable.dtr-column > tbody > tr > td.control,
+table.dataTable.dtr-column > tbody > tr > th.control {
+ position: relative;
+ cursor: pointer;
+}
+table.dataTable.dtr-column > tbody > tr > td.control:before,
+table.dataTable.dtr-column > tbody > tr > th.control:before {
+ top: 50%;
+ left: 50%;
+ height: 16px;
+ width: 16px;
+ margin-top: -10px;
+ margin-left: -10px;
+ display: block;
+ position: absolute;
+ color: white;
+ border: 2px solid white;
+ border-radius: 14px;
+ box-shadow: 0 0 3px #444;
+ box-sizing: content-box;
+ text-align: center;
+ font-family: 'Courier New', Courier, monospace;
+ line-height: 14px;
+ content: '+';
+ background-color: #31b131;
+}
+table.dataTable.dtr-column > tbody > tr.parent td.control:before,
+table.dataTable.dtr-column > tbody > tr.parent th.control:before {
+ content: '-';
+ background-color: #d33333;
+}
+table.dataTable > tbody > tr.child {
+ padding: 0.5em 1em;
+}
+table.dataTable > tbody > tr.child:hover {
+ background: transparent !important;
+}
+table.dataTable > tbody > tr.child ul.dtr-details {
+ display: inline-block;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+table.dataTable > tbody > tr.child ul.dtr-details li {
+ border-bottom: 1px solid #efefef;
+ padding: 0.5em 0;
+}
+table.dataTable > tbody > tr.child ul.dtr-details li:first-child {
+ padding-top: 0;
+}
+table.dataTable > tbody > tr.child ul.dtr-details li:last-child {
+ border-bottom: none;
+}
+table.dataTable > tbody > tr.child span.dtr-title {
+ display: inline-block;
+ min-width: 75px;
+ font-weight: bold;
+}
+
+div.dtr-modal {
+ position: fixed;
+ box-sizing: border-box;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 100;
+ padding: 10em 1em;
+}
+div.dtr-modal div.dtr-modal-display {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ width: 50%;
+ height: 50%;
+ overflow: auto;
+ margin: auto;
+ z-index: 102;
+ overflow: auto;
+ background-color: #f5f5f7;
+ border: 1px solid black;
+ border-radius: 0.5em;
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.6);
+}
+div.dtr-modal div.dtr-modal-content {
+ position: relative;
+ padding: 1em;
+}
+div.dtr-modal div.dtr-modal-close {
+ position: absolute;
+ top: 6px;
+ right: 6px;
+ width: 22px;
+ height: 22px;
+ border: 1px solid #eaeaea;
+ background-color: #f9f9f9;
+ text-align: center;
+ border-radius: 3px;
+ cursor: pointer;
+ z-index: 12;
+}
+div.dtr-modal div.dtr-modal-close:hover {
+ background-color: #eaeaea;
+}
+div.dtr-modal div.dtr-modal-background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 101;
+ background: rgba(0, 0, 0, 0.6);
+}
+
+@media screen and (max-width: 767px) {
+ div.dtr-modal div.dtr-modal-display {
+ width: 95%;
+ }
+}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/responsive.dataTables.min.css b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/responsive.dataTables.min.css
new file mode 100644
index 00000000..db2f7d9c
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/css/responsive.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before{top:9px;left:4px;height:14px;width:14px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#31b131}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed>tbody>tr.child td:before{display:none}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:white;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#31b131}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul.dtr-details li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/Sorting icons.psd b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/Sorting icons.psd
new file mode 100644
index 00000000..53b2e068
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/Sorting icons.psd differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/favicon.ico b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/favicon.ico
new file mode 100644
index 00000000..6eeaa2a0
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/favicon.ico differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_asc.png b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_asc.png
new file mode 100644
index 00000000..5381d92d
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_asc.png differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_asc_disabled.png b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_asc_disabled.png
new file mode 100644
index 00000000..f9c80eec
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_asc_disabled.png differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_both.png b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_both.png
new file mode 100644
index 00000000..c4fbedfe
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_both.png differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_desc.png b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_desc.png
new file mode 100644
index 00000000..9c9601f1
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_desc.png differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_desc_disabled.png b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_desc_disabled.png
new file mode 100644
index 00000000..49843662
Binary files /dev/null and b/wp/wp-content/plugins/ip-geo-block/admin/datatables/images/sort_desc_disabled.png differ
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/js/LICENSE b/wp/wp-content/plugins/ip-geo-block/admin/datatables/js/LICENSE
new file mode 100644
index 00000000..605df390
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/js/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016–2017 Julian Motz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/wp/wp-content/plugins/ip-geo-block/admin/datatables/js/dataTables.responsive.js b/wp/wp-content/plugins/ip-geo-block/admin/datatables/js/dataTables.responsive.js
new file mode 100644
index 00000000..4abce0bd
--- /dev/null
+++ b/wp/wp-content/plugins/ip-geo-block/admin/datatables/js/dataTables.responsive.js
@@ -0,0 +1,1255 @@
+/*! Responsive 2.1.1
+ * 2014-2016 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * @summary Responsive
+ * @description Responsive tables plug-in for DataTables
+ * @version 2.1.1
+ * @file dataTables.responsive.js
+ * @author SpryMedia Ltd (www.sprymedia.co.uk)
+ * @contact www.sprymedia.co.uk/contact
+ * @copyright Copyright 2014-2016 SpryMedia Ltd.
+ *
+ * This source file is free software, available under the following license:
+ * MIT license - https://datatables.net/license/mit
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ * For details please refer to: https://www.datatables.net
+ */
+(function( factory ){
+ if ( typeof define === 'function' && define.amd ) {
+ // AMD
+ define( ['jquery', 'datatables.net'], function ( $ ) {
+ return factory( $, window, document );
+ } );
+ }
+ else if ( typeof exports === 'object' ) {
+ // CommonJS
+ module.exports = function (root, $) {
+ if ( ! root ) {
+ root = window;
+ }
+
+ if ( ! $ || ! $.fn.dataTable ) {
+ $ = require('datatables.net')(root, $).$;
+ }
+
+ return factory( $, root, root.document );
+ };
+ }
+ else {
+ // Browser
+ factory( jQuery, window, document );
+ }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/**
+ * Responsive is a plug-in for the DataTables library that makes use of
+ * DataTables' ability to change the visibility of columns, changing the
+ * visibility of columns so the displayed columns fit into the table container.
+ * The end result is that complex tables will be dynamically adjusted to fit
+ * into the viewport, be it on a desktop, tablet or mobile browser.
+ *
+ * Responsive for DataTables has two modes of operation, which can used
+ * individually or combined:
+ *
+ * * Class name based control - columns assigned class names that match the
+ * breakpoint logic can be shown / hidden as required for each breakpoint.
+ * * Automatic control - columns are automatically hidden when there is no
+ * room left to display them. Columns removed from the right.
+ *
+ * In additional to column visibility control, Responsive also has built into
+ * options to use DataTables' child row display to show / hide the information
+ * from the table that has been hidden. There are also two modes of operation
+ * for this child row display:
+ *
+ * * Inline - when the control element that the user can use to show / hide
+ * child rows is displayed inside the first column of the table.
+ * * Column - where a whole column is dedicated to be the show / hide control.
+ *
+ * Initialisation of Responsive is performed by:
+ *
+ * * Adding the class `responsive` or `dt-responsive` to the table. In this case
+ * Responsive will automatically be initialised with the default configuration
+ * options when the DataTable is created.
+ * * Using the `responsive` option in the DataTables configuration options. This
+ * can also be used to specify the configuration options, or simply set to
+ * `true` to use the defaults.
+ *
+ * @class
+ * @param {object} settings DataTables settings object for the host table
+ * @param {object} [opts] Configuration options
+ * @requires jQuery 1.7+
+ * @requires DataTables 1.10.3+
+ *
+ * @example
+ * $('#example').DataTable( {
+ * responsive: true
+ * } );
+ * } );
+ */
+var Responsive = function ( settings, opts ) {
+ // Sanity check that we are using DataTables 1.10 or newer
+ if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.3' ) ) {
+ throw 'DataTables Responsive requires DataTables 1.10.3 or newer';
+ }
+
+ this.s = {
+ dt: new DataTable.Api( settings ),
+ columns: [],
+ current: []
+ };
+
+ // Check if responsive has already been initialised on this table
+ if ( this.s.dt.settings()[0].responsive ) {
+ return;
+ }
+
+ // details is an object, but for simplicity the user can give it as a string
+ // or a boolean
+ if ( opts && typeof opts.details === 'string' ) {
+ opts.details = { type: opts.details };
+ }
+ else if ( opts && opts.details === false ) {
+ opts.details = { type: false };
+ }
+ else if ( opts && opts.details === true ) {
+ opts.details = { type: 'inline' };
+ }
+
+ this.c = $.extend( true, {}, Responsive.defaults, DataTable.defaults.responsive, opts );
+ settings.responsive = this;
+ this._constructor();
+};
+
+$.extend( Responsive.prototype, {
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Constructor
+ */
+
+ /**
+ * Initialise the Responsive instance
+ *
+ * @private
+ */
+ _constructor: function ()
+ {
+ var that = this;
+ var dt = this.s.dt;
+ var dtPrivateSettings = dt.settings()[0];
+ var oldWindowWidth = $(window).width();
+
+ dt.settings()[0]._responsive = this;
+
+ // Use DataTables' throttle function to avoid processor thrashing on
+ // resize
+ $(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () {
+ // iOS has a bug whereby resize can fire when only scrolling
+ // See: https://stackoverflow.com/questions/8898412
+ var width = $(window).width();
+
+ if ( width !== oldWindowWidth ) {
+ that._resize();
+ oldWindowWidth = width;
+ }
+ } ) );
+
+ // DataTables doesn't currently trigger an event when a row is added, so
+ // we need to hook into its private API to enforce the hidden rows when
+ // new data is added
+ dtPrivateSettings.oApi._fnCallbackReg( dtPrivateSettings, 'aoRowCreatedCallback', function (tr, data, idx) {
+ if ( $.inArray( false, that.s.current ) !== -1 ) {
+ $('>td, >th', tr).each( function ( i ) {
+ var idx = dt.column.index( 'toData', i );
+
+ if ( that.s.current[idx] === false ) {
+ $(this).css('display', 'none');
+ }
+ } );
+ }
+ } );
+
+ // Destroy event handler
+ dt.on( 'destroy.dtr', function () {
+ dt.off( '.dtr' );
+ $( dt.table().body() ).off( '.dtr' );
+ $(window).off( 'resize.dtr orientationchange.dtr' );
+
+ // Restore the columns that we've hidden
+ $.each( that.s.current, function ( i, val ) {
+ if ( val === false ) {
+ that._setColumnVis( i, true );
+ }
+ } );
+ } );
+
+ // Reorder the breakpoints array here in case they have been added out
+ // of order
+ this.c.breakpoints.sort( function (a, b) {
+ return a.width < b.width ? 1 :
+ a.width > b.width ? -1 : 0;
+ } );
+
+ this._classLogic();
+ this._resizeAuto();
+
+ // Details handler
+ var details = this.c.details;
+
+ if ( details.type !== false ) {
+ that._detailsInit();
+
+ // DataTables will trigger this event on every column it shows and
+ // hides individually
+ dt.on( 'column-visibility.dtr', function (e, ctx, col, vis) {
+ that._classLogic();
+ that._resizeAuto();
+ that._resize();
+ } );
+
+ // Redraw the details box on each draw which will happen if the data
+ // has changed. This is used until DataTables implements a native
+ // `updated` event for rows
+ dt.on( 'draw.dtr', function () {
+ that._redrawChildren();
+ } );
+
+ $(dt.table().node()).addClass( 'dtr-'+details.type );
+ }
+
+ dt.on( 'column-reorder.dtr', function (e, settings, details) {
+ that._classLogic();
+ that._resizeAuto();
+ that._resize();
+ } );
+
+ // Change in column sizes means we need to calc
+ dt.on( 'column-sizing.dtr', function () {
+ that._resizeAuto();
+ that._resize();
+ });
+
+ // On Ajax reload we want to reopen any child rows which are displayed
+ // by responsive
+ dt.on( 'preXhr.dtr', function () {
+ var rowIds = [];
+ dt.rows().every( function () {
+ if ( this.child.isShown() ) {
+ rowIds.push( this.id(true) );
+ }
+ } );
+
+ dt.one( 'draw.dtr', function () {
+ dt.rows( rowIds ).every( function () {
+ that._detailsDisplay( this, false );
+ } );
+ } );
+ });
+
+ dt.on( 'init.dtr', function (e, settings, details) {
+ that._resizeAuto();
+ that._resize();
+
+ // If columns were hidden, then DataTables needs to adjust the
+ // column sizing
+ if ( $.inArray( false, that.s.current ) ) {
+ dt.columns.adjust();
+ }
+ } );
+
+ // First pass - draw the table for the current viewport size
+ this._resize();
+ },
+
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Private methods
+ */
+
+ /**
+ * Calculate the visibility for the columns in a table for a given
+ * breakpoint. The result is pre-determined based on the class logic if
+ * class names are used to control all columns, but the width of the table
+ * is also used if there are columns which are to be automatically shown
+ * and hidden.
+ *
+ * @param {string} breakpoint Breakpoint name to use for the calculation
+ * @return {array} Array of boolean values initiating the visibility of each
+ * column.
+ * @private
+ */
+ _columnsVisiblity: function ( breakpoint )
+ {
+ var dt = this.s.dt;
+ var columns = this.s.columns;
+ var i, ien;
+
+ // Create an array that defines the column ordering based first on the
+ // column's priority, and secondly the column index. This allows the
+ // columns to be removed from the right if the priority matches
+ var order = columns
+ .map( function ( col, idx ) {
+ return {
+ columnIdx: idx,
+ priority: col.priority
+ };
+ } )
+ .sort( function ( a, b ) {
+ if ( a.priority !== b.priority ) {
+ return a.priority - b.priority;
+ }
+ return a.columnIdx - b.columnIdx;
+ } );
+
+ // Class logic - determine which columns are in this breakpoint based
+ // on the classes. If no class control (i.e. `auto`) then `-` is used
+ // to indicate this to the rest of the function
+ var display = $.map( columns, function ( col ) {
+ return col.auto && col.minWidth === null ?
+ false :
+ col.auto === true ?
+ '-' :
+ $.inArray( breakpoint, col.includeIn ) !== -1;
+ } );
+
+ // Auto column control - first pass: how much width is taken by the
+ // ones that must be included from the non-auto columns
+ var requiredWidth = 0;
+ for ( i=0, ien=display.length ; i