Version Description
- NEW: An
else
shortcode forgeoip_detect2_show_if
andgeoip_detect2_hide_if
:[geoip_detect2_show_if city="Berlin"]Hallo Berlin![else]Not in Berlin[/geoip_detect2_show_if]
- FIX: The JS for AJAX wasn't working for Safari browsers
- FIX: Improving some edge cases of
Record.get_with_locales()
and other methods ofRecord
to be consistent with non-AJAX mode - FIX: Revert more Maxmind libraries to fix incompatibility with WooCommerce
Download this release
Release Info
Developer | benjamin4 |
Plugin | GeoIP Detection |
Version | 4.1.0 |
Comparing to | |
See all releases |
Code changes from version 4.0.1 to 4.1.0
- composer.json +8 -6
- composer.lock +163 -45
- geoip-detect.php +2 -2
- js/body_classes.js +10 -6
- js/body_classes.test.js +30 -0
- js/dist/frontend.1115d690.js +41 -0
- js/dist/frontend.1115d690.js.map +1 -0
- js/dist/parcel.js +2 -2
- js/dist/parcel.json +1 -1
- js/dist/parcel.urls +1 -1
- js/models/record.js +49 -23
- js/models/record.test.js +69 -3
- package.json +11 -11
- readme.txt +8 -1
- renovate.json +42 -0
- shortcodes/show_if.php +24 -9
- vendor/composer/autoload_classmap.php +0 -1
- vendor/composer/autoload_static.php +0 -1
- vendor/composer/installed.json +39 -40
- vendor/maxmind-db/reader/CHANGELOG.md +0 -35
- vendor/maxmind-db/reader/README.md +5 -12
- vendor/maxmind-db/reader/autoload.php +5 -7
- vendor/maxmind-db/reader/composer.json +6 -7
- vendor/maxmind-db/reader/ext/maxminddb.c +238 -340
- vendor/maxmind-db/reader/ext/php_maxminddb.h +1 -1
- vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php +49 -95
- vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php +82 -111
- vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php +0 -2
- vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php +62 -86
- vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php +2 -8
- vendor/maxmind/web-service-common/CHANGELOG.md +0 -15
- vendor/maxmind/web-service-common/README.md +1 -1
- vendor/maxmind/web-service-common/composer.json +2 -2
- vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php +0 -2
- vendor/maxmind/web-service-common/src/Exception/HttpException.php +5 -7
- vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php +0 -2
- vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php +0 -2
- vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php +6 -8
- vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php +0 -2
- vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php +0 -2
- vendor/maxmind/web-service-common/src/Exception/WebServiceException.php +0 -2
- vendor/maxmind/web-service-common/src/WebService/Client.php +49 -51
- vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php +15 -15
- vendor/maxmind/web-service-common/src/WebService/Http/Request.php +15 -5
- vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php +4 -3
- vendor/symfony/property-info/Extractor/PhpDocExtractor.php +32 -2
- vendor/symfony/property-info/Extractor/ReflectionExtractor.php +2 -2
- vendor/symfony/property-info/Util/PhpDocTypeHelper.php +4 -0
- vendor/symfony/string/Resources/functions.php +19 -13
- yarn.lock +513 -32
composer.json
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
"type": "wordpress-plugin",
|
5 |
"authors": [
|
6 |
{
|
7 |
-
"name": "Benjamin Pick (wp-geoip-detect
|
8 |
}
|
9 |
],
|
10 |
"keywords": [],
|
@@ -15,13 +15,15 @@
|
|
15 |
"require": {
|
16 |
"php": ">=7.2.5",
|
17 |
"geoip2/geoip2": "2.10.0",
|
18 |
-
"
|
19 |
-
"
|
|
|
|
|
20 |
},
|
21 |
"require-dev": {
|
22 |
-
"phpunit/phpunit": "
|
23 |
-
"roots/wordpress": "5.6",
|
24 |
-
"wp-phpunit/wp-phpunit": "5.6"
|
25 |
},
|
26 |
"scripts": {
|
27 |
"test": "phpunit"
|
4 |
"type": "wordpress-plugin",
|
5 |
"authors": [
|
6 |
{
|
7 |
+
"name": "Benjamin Pick (wp-geoip-detect posteo de)"
|
8 |
}
|
9 |
],
|
10 |
"keywords": [],
|
15 |
"require": {
|
16 |
"php": ">=7.2.5",
|
17 |
"geoip2/geoip2": "2.10.0",
|
18 |
+
"maxmind-db/reader": "1.6.0",
|
19 |
+
"maxmind/web-service-common": "0.7.0",
|
20 |
+
"symfony/property-access": "5.2.4",
|
21 |
+
"symfony/http-foundation": "5.2.4"
|
22 |
},
|
23 |
"require-dev": {
|
24 |
+
"phpunit/phpunit": "7.5.20",
|
25 |
+
"roots/wordpress": "5.6.2",
|
26 |
+
"wp-phpunit/wp-phpunit": "5.6.2"
|
27 |
},
|
28 |
"scripts": {
|
29 |
"test": "phpunit"
|
composer.lock
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
5 |
"This file is @generated automatically"
|
6 |
],
|
7 |
-
"content-hash": "
|
8 |
"packages": [
|
9 |
{
|
10 |
"name": "composer/ca-bundle",
|
@@ -118,30 +118,29 @@
|
|
118 |
},
|
119 |
{
|
120 |
"name": "maxmind-db/reader",
|
121 |
-
"version": "v1.
|
122 |
"source": {
|
123 |
"type": "git",
|
124 |
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
|
125 |
-
"reference": "
|
126 |
},
|
127 |
"dist": {
|
128 |
"type": "zip",
|
129 |
-
"url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/
|
130 |
-
"reference": "
|
131 |
"shasum": ""
|
132 |
},
|
133 |
"require": {
|
134 |
-
"php": ">=
|
135 |
},
|
136 |
"conflict": {
|
137 |
-
"ext-maxminddb": "<1.
|
138 |
},
|
139 |
"require-dev": {
|
140 |
-
"friendsofphp/php-cs-fixer": "
|
141 |
"php-coveralls/php-coveralls": "^2.1",
|
142 |
-
"
|
143 |
-
"phpunit/
|
144 |
-
"phpunit/phpunit": ">=8.0.0,<10.0.0",
|
145 |
"squizlabs/php_codesniffer": "3.*"
|
146 |
},
|
147 |
"suggest": {
|
@@ -175,31 +174,31 @@
|
|
175 |
"geolocation",
|
176 |
"maxmind"
|
177 |
],
|
178 |
-
"time": "
|
179 |
},
|
180 |
{
|
181 |
"name": "maxmind/web-service-common",
|
182 |
-
"version": "v0.
|
183 |
"source": {
|
184 |
"type": "git",
|
185 |
"url": "https://github.com/maxmind/web-service-common-php.git",
|
186 |
-
"reference": "
|
187 |
},
|
188 |
"dist": {
|
189 |
"type": "zip",
|
190 |
-
"url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/
|
191 |
-
"reference": "
|
192 |
"shasum": ""
|
193 |
},
|
194 |
"require": {
|
195 |
"composer/ca-bundle": "^1.0.3",
|
196 |
"ext-curl": "*",
|
197 |
"ext-json": "*",
|
198 |
-
"php": ">=
|
199 |
},
|
200 |
"require-dev": {
|
201 |
"friendsofphp/php-cs-fixer": "2.*",
|
202 |
-
"phpunit/phpunit": "^8.
|
203 |
"squizlabs/php_codesniffer": "3.*"
|
204 |
},
|
205 |
"type": "library",
|
@@ -221,7 +220,7 @@
|
|
221 |
],
|
222 |
"description": "Internal MaxMind Web Service API",
|
223 |
"homepage": "https://github.com/maxmind/web-service-common-php",
|
224 |
-
"time": "2020-
|
225 |
},
|
226 |
{
|
227 |
"name": "symfony/deprecation-contracts",
|
@@ -275,16 +274,16 @@
|
|
275 |
},
|
276 |
{
|
277 |
"name": "symfony/http-foundation",
|
278 |
-
"version": "v5.2.
|
279 |
"source": {
|
280 |
"type": "git",
|
281 |
"url": "https://github.com/symfony/http-foundation.git",
|
282 |
-
"reference": "
|
283 |
},
|
284 |
"dist": {
|
285 |
"type": "zip",
|
286 |
-
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/
|
287 |
-
"reference": "
|
288 |
"shasum": ""
|
289 |
},
|
290 |
"require": {
|
@@ -327,7 +326,7 @@
|
|
327 |
],
|
328 |
"description": "Defines an object-oriented layer for the HTTP specification",
|
329 |
"homepage": "https://symfony.com",
|
330 |
-
"time": "2021-02-
|
331 |
},
|
332 |
{
|
333 |
"name": "symfony/polyfill-ctype",
|
@@ -653,7 +652,7 @@
|
|
653 |
},
|
654 |
{
|
655 |
"name": "symfony/property-access",
|
656 |
-
"version": "v5.2.
|
657 |
"source": {
|
658 |
"type": "git",
|
659 |
"url": "https://github.com/symfony/property-access.git",
|
@@ -717,16 +716,16 @@
|
|
717 |
},
|
718 |
{
|
719 |
"name": "symfony/property-info",
|
720 |
-
"version": "v5.2.
|
721 |
"source": {
|
722 |
"type": "git",
|
723 |
"url": "https://github.com/symfony/property-info.git",
|
724 |
-
"reference": "
|
725 |
},
|
726 |
"dist": {
|
727 |
"type": "zip",
|
728 |
-
"url": "https://api.github.com/repos/symfony/property-info/zipball/
|
729 |
-
"reference": "
|
730 |
"shasum": ""
|
731 |
},
|
732 |
"require": {
|
@@ -786,20 +785,20 @@
|
|
786 |
"type",
|
787 |
"validator"
|
788 |
],
|
789 |
-
"time": "2021-
|
790 |
},
|
791 |
{
|
792 |
"name": "symfony/string",
|
793 |
-
"version": "v5.2.
|
794 |
"source": {
|
795 |
"type": "git",
|
796 |
"url": "https://github.com/symfony/string.git",
|
797 |
-
"reference": "
|
798 |
},
|
799 |
"dist": {
|
800 |
"type": "zip",
|
801 |
-
"url": "https://api.github.com/repos/symfony/string/zipball/
|
802 |
-
"reference": "
|
803 |
"shasum": ""
|
804 |
},
|
805 |
"require": {
|
@@ -852,7 +851,7 @@
|
|
852 |
"utf-8",
|
853 |
"utf8"
|
854 |
],
|
855 |
-
"time": "2021-
|
856 |
}
|
857 |
],
|
858 |
"packages-dev": [
|
@@ -905,6 +904,20 @@
|
|
905 |
"constructor",
|
906 |
"instantiate"
|
907 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
908 |
"time": "2020-11-10T18:47:58+00:00"
|
909 |
},
|
910 |
{
|
@@ -953,6 +966,12 @@
|
|
953 |
"object",
|
954 |
"object graph"
|
955 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
956 |
"time": "2020-11-13T09:40:50+00:00"
|
957 |
},
|
958 |
{
|
@@ -1377,6 +1396,12 @@
|
|
1377 |
"filesystem",
|
1378 |
"iterator"
|
1379 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
1380 |
"time": "2020-11-30T08:25:21+00:00"
|
1381 |
},
|
1382 |
{
|
@@ -1467,6 +1492,12 @@
|
|
1467 |
"keywords": [
|
1468 |
"timer"
|
1469 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
1470 |
"time": "2020-11-30T08:20:02+00:00"
|
1471 |
},
|
1472 |
{
|
@@ -1516,6 +1547,12 @@
|
|
1516 |
"keywords": [
|
1517 |
"tokenizer"
|
1518 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
1519 |
"abandoned": true,
|
1520 |
"time": "2020-11-30T08:38:46+00:00"
|
1521 |
},
|
@@ -1605,15 +1642,15 @@
|
|
1605 |
},
|
1606 |
{
|
1607 |
"name": "roots/wordpress",
|
1608 |
-
"version": "5.6",
|
1609 |
"source": {
|
1610 |
"type": "git",
|
1611 |
"url": "https://github.com/WordPress/WordPress.git",
|
1612 |
-
"reference": "5.6"
|
1613 |
},
|
1614 |
"dist": {
|
1615 |
"type": "zip",
|
1616 |
-
"url": "https://api.github.com/repos/WordPress/WordPress/zipball/5.6"
|
1617 |
},
|
1618 |
"require": {
|
1619 |
"php": ">=5.3.2",
|
@@ -1637,7 +1674,17 @@
|
|
1637 |
"cms",
|
1638 |
"wordpress"
|
1639 |
],
|
1640 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1641 |
},
|
1642 |
{
|
1643 |
"name": "roots/wordpress-core-installer",
|
@@ -1694,6 +1741,16 @@
|
|
1694 |
"keywords": [
|
1695 |
"wordpress"
|
1696 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1697 |
"time": "2020-08-20T00:27:30+00:00"
|
1698 |
},
|
1699 |
{
|
@@ -1739,6 +1796,12 @@
|
|
1739 |
],
|
1740 |
"description": "Looks up which function or method a line of code belongs to",
|
1741 |
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
|
|
|
|
|
|
|
|
|
|
|
|
|
1742 |
"time": "2020-11-30T08:15:22+00:00"
|
1743 |
},
|
1744 |
{
|
@@ -1803,6 +1866,12 @@
|
|
1803 |
"compare",
|
1804 |
"equality"
|
1805 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
1806 |
"time": "2020-11-30T08:04:30+00:00"
|
1807 |
},
|
1808 |
{
|
@@ -1859,6 +1928,12 @@
|
|
1859 |
"unidiff",
|
1860 |
"unified diff"
|
1861 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
1862 |
"time": "2020-11-30T07:59:04+00:00"
|
1863 |
},
|
1864 |
{
|
@@ -1912,6 +1987,12 @@
|
|
1912 |
"environment",
|
1913 |
"hhvm"
|
1914 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
1915 |
"time": "2020-11-30T07:53:42+00:00"
|
1916 |
},
|
1917 |
{
|
@@ -1979,6 +2060,12 @@
|
|
1979 |
"export",
|
1980 |
"exporter"
|
1981 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
1982 |
"time": "2020-11-30T07:47:53+00:00"
|
1983 |
},
|
1984 |
{
|
@@ -2077,6 +2164,12 @@
|
|
2077 |
],
|
2078 |
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
|
2079 |
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
|
|
|
|
|
|
|
|
|
|
|
|
|
2080 |
"time": "2020-11-30T07:40:27+00:00"
|
2081 |
},
|
2082 |
{
|
@@ -2122,6 +2215,12 @@
|
|
2122 |
],
|
2123 |
"description": "Allows reflection of object attributes, including inherited and non-public ones",
|
2124 |
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
|
|
|
|
|
|
|
|
|
|
|
|
|
2125 |
"time": "2020-11-30T07:37:18+00:00"
|
2126 |
},
|
2127 |
{
|
@@ -2175,6 +2274,12 @@
|
|
2175 |
],
|
2176 |
"description": "Provides functionality to recursively process PHP variables",
|
2177 |
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
|
|
|
|
|
|
|
|
|
|
|
|
2178 |
"time": "2020-11-30T07:34:24+00:00"
|
2179 |
},
|
2180 |
{
|
@@ -2217,6 +2322,12 @@
|
|
2217 |
],
|
2218 |
"description": "Provides a list of PHP built-in functions that operate on resources",
|
2219 |
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
|
|
|
|
|
|
|
|
|
|
|
|
|
2220 |
"time": "2020-11-30T07:30:19+00:00"
|
2221 |
},
|
2222 |
{
|
@@ -2300,6 +2411,12 @@
|
|
2300 |
}
|
2301 |
],
|
2302 |
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
|
|
|
|
|
|
|
|
|
|
|
|
2303 |
"time": "2020-07-12T23:59:07+00:00"
|
2304 |
},
|
2305 |
{
|
@@ -2353,16 +2470,16 @@
|
|
2353 |
},
|
2354 |
{
|
2355 |
"name": "wp-phpunit/wp-phpunit",
|
2356 |
-
"version": "5.6.
|
2357 |
"source": {
|
2358 |
"type": "git",
|
2359 |
"url": "https://github.com/wp-phpunit/wp-phpunit.git",
|
2360 |
-
"reference": "
|
2361 |
},
|
2362 |
"dist": {
|
2363 |
"type": "zip",
|
2364 |
-
"url": "https://api.github.com/repos/wp-phpunit/wp-phpunit/zipball/
|
2365 |
-
"reference": "
|
2366 |
"shasum": ""
|
2367 |
},
|
2368 |
"type": "library",
|
@@ -2392,7 +2509,7 @@
|
|
2392 |
"test",
|
2393 |
"wordpress"
|
2394 |
],
|
2395 |
-
"time": "
|
2396 |
}
|
2397 |
],
|
2398 |
"aliases": [],
|
@@ -2403,5 +2520,6 @@
|
|
2403 |
"platform": {
|
2404 |
"php": ">=7.2.5"
|
2405 |
},
|
2406 |
-
"platform-dev": []
|
|
|
2407 |
}
|
4 |
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
5 |
"This file is @generated automatically"
|
6 |
],
|
7 |
+
"content-hash": "43cdc359395ba142c745e032b2f10112",
|
8 |
"packages": [
|
9 |
{
|
10 |
"name": "composer/ca-bundle",
|
118 |
},
|
119 |
{
|
120 |
"name": "maxmind-db/reader",
|
121 |
+
"version": "v1.6.0",
|
122 |
"source": {
|
123 |
"type": "git",
|
124 |
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
|
125 |
+
"reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4"
|
126 |
},
|
127 |
"dist": {
|
128 |
"type": "zip",
|
129 |
+
"url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/febd4920bf17c1da84cef58e56a8227dfb37fbe4",
|
130 |
+
"reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4",
|
131 |
"shasum": ""
|
132 |
},
|
133 |
"require": {
|
134 |
+
"php": ">=5.6"
|
135 |
},
|
136 |
"conflict": {
|
137 |
+
"ext-maxminddb": "<1.6.0,>=2.0.0"
|
138 |
},
|
139 |
"require-dev": {
|
140 |
+
"friendsofphp/php-cs-fixer": "2.*",
|
141 |
"php-coveralls/php-coveralls": "^2.1",
|
142 |
+
"phpunit/phpcov": "^3.0",
|
143 |
+
"phpunit/phpunit": "5.*",
|
|
|
144 |
"squizlabs/php_codesniffer": "3.*"
|
145 |
},
|
146 |
"suggest": {
|
174 |
"geolocation",
|
175 |
"maxmind"
|
176 |
],
|
177 |
+
"time": "2019-12-19T22:59:03+00:00"
|
178 |
},
|
179 |
{
|
180 |
"name": "maxmind/web-service-common",
|
181 |
+
"version": "v0.7.0",
|
182 |
"source": {
|
183 |
"type": "git",
|
184 |
"url": "https://github.com/maxmind/web-service-common-php.git",
|
185 |
+
"reference": "74c996c218ada5c639c8c2f076756e059f5552fc"
|
186 |
},
|
187 |
"dist": {
|
188 |
"type": "zip",
|
189 |
+
"url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc",
|
190 |
+
"reference": "74c996c218ada5c639c8c2f076756e059f5552fc",
|
191 |
"shasum": ""
|
192 |
},
|
193 |
"require": {
|
194 |
"composer/ca-bundle": "^1.0.3",
|
195 |
"ext-curl": "*",
|
196 |
"ext-json": "*",
|
197 |
+
"php": ">=5.6"
|
198 |
},
|
199 |
"require-dev": {
|
200 |
"friendsofphp/php-cs-fixer": "2.*",
|
201 |
+
"phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
|
202 |
"squizlabs/php_codesniffer": "3.*"
|
203 |
},
|
204 |
"type": "library",
|
220 |
],
|
221 |
"description": "Internal MaxMind Web Service API",
|
222 |
"homepage": "https://github.com/maxmind/web-service-common-php",
|
223 |
+
"time": "2020-05-06T14:07:26+00:00"
|
224 |
},
|
225 |
{
|
226 |
"name": "symfony/deprecation-contracts",
|
274 |
},
|
275 |
{
|
276 |
"name": "symfony/http-foundation",
|
277 |
+
"version": "v5.2.4",
|
278 |
"source": {
|
279 |
"type": "git",
|
280 |
"url": "https://github.com/symfony/http-foundation.git",
|
281 |
+
"reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf"
|
282 |
},
|
283 |
"dist": {
|
284 |
"type": "zip",
|
285 |
+
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf",
|
286 |
+
"reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf",
|
287 |
"shasum": ""
|
288 |
},
|
289 |
"require": {
|
326 |
],
|
327 |
"description": "Defines an object-oriented layer for the HTTP specification",
|
328 |
"homepage": "https://symfony.com",
|
329 |
+
"time": "2021-02-25T17:16:57+00:00"
|
330 |
},
|
331 |
{
|
332 |
"name": "symfony/polyfill-ctype",
|
652 |
},
|
653 |
{
|
654 |
"name": "symfony/property-access",
|
655 |
+
"version": "v5.2.4",
|
656 |
"source": {
|
657 |
"type": "git",
|
658 |
"url": "https://github.com/symfony/property-access.git",
|
716 |
},
|
717 |
{
|
718 |
"name": "symfony/property-info",
|
719 |
+
"version": "v5.2.4",
|
720 |
"source": {
|
721 |
"type": "git",
|
722 |
"url": "https://github.com/symfony/property-info.git",
|
723 |
+
"reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189"
|
724 |
},
|
725 |
"dist": {
|
726 |
"type": "zip",
|
727 |
+
"url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
|
728 |
+
"reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
|
729 |
"shasum": ""
|
730 |
},
|
731 |
"require": {
|
785 |
"type",
|
786 |
"validator"
|
787 |
],
|
788 |
+
"time": "2021-02-17T15:24:54+00:00"
|
789 |
},
|
790 |
{
|
791 |
"name": "symfony/string",
|
792 |
+
"version": "v5.2.4",
|
793 |
"source": {
|
794 |
"type": "git",
|
795 |
"url": "https://github.com/symfony/string.git",
|
796 |
+
"reference": "4e78d7d47061fa183639927ec40d607973699609"
|
797 |
},
|
798 |
"dist": {
|
799 |
"type": "zip",
|
800 |
+
"url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609",
|
801 |
+
"reference": "4e78d7d47061fa183639927ec40d607973699609",
|
802 |
"shasum": ""
|
803 |
},
|
804 |
"require": {
|
851 |
"utf-8",
|
852 |
"utf8"
|
853 |
],
|
854 |
+
"time": "2021-02-16T10:20:28+00:00"
|
855 |
}
|
856 |
],
|
857 |
"packages-dev": [
|
904 |
"constructor",
|
905 |
"instantiate"
|
906 |
],
|
907 |
+
"funding": [
|
908 |
+
{
|
909 |
+
"url": "https://www.doctrine-project.org/sponsorship.html",
|
910 |
+
"type": "custom"
|
911 |
+
},
|
912 |
+
{
|
913 |
+
"url": "https://www.patreon.com/phpdoctrine",
|
914 |
+
"type": "patreon"
|
915 |
+
},
|
916 |
+
{
|
917 |
+
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
|
918 |
+
"type": "tidelift"
|
919 |
+
}
|
920 |
+
],
|
921 |
"time": "2020-11-10T18:47:58+00:00"
|
922 |
},
|
923 |
{
|
966 |
"object",
|
967 |
"object graph"
|
968 |
],
|
969 |
+
"funding": [
|
970 |
+
{
|
971 |
+
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
|
972 |
+
"type": "tidelift"
|
973 |
+
}
|
974 |
+
],
|
975 |
"time": "2020-11-13T09:40:50+00:00"
|
976 |
},
|
977 |
{
|
1396 |
"filesystem",
|
1397 |
"iterator"
|
1398 |
],
|
1399 |
+
"funding": [
|
1400 |
+
{
|
1401 |
+
"url": "https://github.com/sebastianbergmann",
|
1402 |
+
"type": "github"
|
1403 |
+
}
|
1404 |
+
],
|
1405 |
"time": "2020-11-30T08:25:21+00:00"
|
1406 |
},
|
1407 |
{
|
1492 |
"keywords": [
|
1493 |
"timer"
|
1494 |
],
|
1495 |
+
"funding": [
|
1496 |
+
{
|
1497 |
+
"url": "https://github.com/sebastianbergmann",
|
1498 |
+
"type": "github"
|
1499 |
+
}
|
1500 |
+
],
|
1501 |
"time": "2020-11-30T08:20:02+00:00"
|
1502 |
},
|
1503 |
{
|
1547 |
"keywords": [
|
1548 |
"tokenizer"
|
1549 |
],
|
1550 |
+
"funding": [
|
1551 |
+
{
|
1552 |
+
"url": "https://github.com/sebastianbergmann",
|
1553 |
+
"type": "github"
|
1554 |
+
}
|
1555 |
+
],
|
1556 |
"abandoned": true,
|
1557 |
"time": "2020-11-30T08:38:46+00:00"
|
1558 |
},
|
1642 |
},
|
1643 |
{
|
1644 |
"name": "roots/wordpress",
|
1645 |
+
"version": "5.6.2",
|
1646 |
"source": {
|
1647 |
"type": "git",
|
1648 |
"url": "https://github.com/WordPress/WordPress.git",
|
1649 |
+
"reference": "5.6.2"
|
1650 |
},
|
1651 |
"dist": {
|
1652 |
"type": "zip",
|
1653 |
+
"url": "https://api.github.com/repos/WordPress/WordPress/zipball/5.6.2"
|
1654 |
},
|
1655 |
"require": {
|
1656 |
"php": ">=5.3.2",
|
1674 |
"cms",
|
1675 |
"wordpress"
|
1676 |
],
|
1677 |
+
"funding": [
|
1678 |
+
{
|
1679 |
+
"url": "https://github.com/roots",
|
1680 |
+
"type": "github"
|
1681 |
+
},
|
1682 |
+
{
|
1683 |
+
"url": "https://www.patreon.com/rootsdev",
|
1684 |
+
"type": "patreon"
|
1685 |
+
}
|
1686 |
+
],
|
1687 |
+
"time": "2021-02-22T15:12:53+00:00"
|
1688 |
},
|
1689 |
{
|
1690 |
"name": "roots/wordpress-core-installer",
|
1741 |
"keywords": [
|
1742 |
"wordpress"
|
1743 |
],
|
1744 |
+
"funding": [
|
1745 |
+
{
|
1746 |
+
"url": "https://github.com/roots",
|
1747 |
+
"type": "github"
|
1748 |
+
},
|
1749 |
+
{
|
1750 |
+
"url": "https://www.patreon.com/rootsdev",
|
1751 |
+
"type": "patreon"
|
1752 |
+
}
|
1753 |
+
],
|
1754 |
"time": "2020-08-20T00:27:30+00:00"
|
1755 |
},
|
1756 |
{
|
1796 |
],
|
1797 |
"description": "Looks up which function or method a line of code belongs to",
|
1798 |
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
|
1799 |
+
"funding": [
|
1800 |
+
{
|
1801 |
+
"url": "https://github.com/sebastianbergmann",
|
1802 |
+
"type": "github"
|
1803 |
+
}
|
1804 |
+
],
|
1805 |
"time": "2020-11-30T08:15:22+00:00"
|
1806 |
},
|
1807 |
{
|
1866 |
"compare",
|
1867 |
"equality"
|
1868 |
],
|
1869 |
+
"funding": [
|
1870 |
+
{
|
1871 |
+
"url": "https://github.com/sebastianbergmann",
|
1872 |
+
"type": "github"
|
1873 |
+
}
|
1874 |
+
],
|
1875 |
"time": "2020-11-30T08:04:30+00:00"
|
1876 |
},
|
1877 |
{
|
1928 |
"unidiff",
|
1929 |
"unified diff"
|
1930 |
],
|
1931 |
+
"funding": [
|
1932 |
+
{
|
1933 |
+
"url": "https://github.com/sebastianbergmann",
|
1934 |
+
"type": "github"
|
1935 |
+
}
|
1936 |
+
],
|
1937 |
"time": "2020-11-30T07:59:04+00:00"
|
1938 |
},
|
1939 |
{
|
1987 |
"environment",
|
1988 |
"hhvm"
|
1989 |
],
|
1990 |
+
"funding": [
|
1991 |
+
{
|
1992 |
+
"url": "https://github.com/sebastianbergmann",
|
1993 |
+
"type": "github"
|
1994 |
+
}
|
1995 |
+
],
|
1996 |
"time": "2020-11-30T07:53:42+00:00"
|
1997 |
},
|
1998 |
{
|
2060 |
"export",
|
2061 |
"exporter"
|
2062 |
],
|
2063 |
+
"funding": [
|
2064 |
+
{
|
2065 |
+
"url": "https://github.com/sebastianbergmann",
|
2066 |
+
"type": "github"
|
2067 |
+
}
|
2068 |
+
],
|
2069 |
"time": "2020-11-30T07:47:53+00:00"
|
2070 |
},
|
2071 |
{
|
2164 |
],
|
2165 |
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
|
2166 |
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
|
2167 |
+
"funding": [
|
2168 |
+
{
|
2169 |
+
"url": "https://github.com/sebastianbergmann",
|
2170 |
+
"type": "github"
|
2171 |
+
}
|
2172 |
+
],
|
2173 |
"time": "2020-11-30T07:40:27+00:00"
|
2174 |
},
|
2175 |
{
|
2215 |
],
|
2216 |
"description": "Allows reflection of object attributes, including inherited and non-public ones",
|
2217 |
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
|
2218 |
+
"funding": [
|
2219 |
+
{
|
2220 |
+
"url": "https://github.com/sebastianbergmann",
|
2221 |
+
"type": "github"
|
2222 |
+
}
|
2223 |
+
],
|
2224 |
"time": "2020-11-30T07:37:18+00:00"
|
2225 |
},
|
2226 |
{
|
2274 |
],
|
2275 |
"description": "Provides functionality to recursively process PHP variables",
|
2276 |
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
2277 |
+
"funding": [
|
2278 |
+
{
|
2279 |
+
"url": "https://github.com/sebastianbergmann",
|
2280 |
+
"type": "github"
|
2281 |
+
}
|
2282 |
+
],
|
2283 |
"time": "2020-11-30T07:34:24+00:00"
|
2284 |
},
|
2285 |
{
|
2322 |
],
|
2323 |
"description": "Provides a list of PHP built-in functions that operate on resources",
|
2324 |
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
|
2325 |
+
"funding": [
|
2326 |
+
{
|
2327 |
+
"url": "https://github.com/sebastianbergmann",
|
2328 |
+
"type": "github"
|
2329 |
+
}
|
2330 |
+
],
|
2331 |
"time": "2020-11-30T07:30:19+00:00"
|
2332 |
},
|
2333 |
{
|
2411 |
}
|
2412 |
],
|
2413 |
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
2414 |
+
"funding": [
|
2415 |
+
{
|
2416 |
+
"url": "https://github.com/theseer",
|
2417 |
+
"type": "github"
|
2418 |
+
}
|
2419 |
+
],
|
2420 |
"time": "2020-07-12T23:59:07+00:00"
|
2421 |
},
|
2422 |
{
|
2470 |
},
|
2471 |
{
|
2472 |
"name": "wp-phpunit/wp-phpunit",
|
2473 |
+
"version": "5.6.2",
|
2474 |
"source": {
|
2475 |
"type": "git",
|
2476 |
"url": "https://github.com/wp-phpunit/wp-phpunit.git",
|
2477 |
+
"reference": "f6b3fb65bccc0ff70b3bc7cc241935597dbd5562"
|
2478 |
},
|
2479 |
"dist": {
|
2480 |
"type": "zip",
|
2481 |
+
"url": "https://api.github.com/repos/wp-phpunit/wp-phpunit/zipball/f6b3fb65bccc0ff70b3bc7cc241935597dbd5562",
|
2482 |
+
"reference": "f6b3fb65bccc0ff70b3bc7cc241935597dbd5562",
|
2483 |
"shasum": ""
|
2484 |
},
|
2485 |
"type": "library",
|
2509 |
"test",
|
2510 |
"wordpress"
|
2511 |
],
|
2512 |
+
"time": "2021-02-04T18:24:14+00:00"
|
2513 |
}
|
2514 |
],
|
2515 |
"aliases": [],
|
2520 |
"platform": {
|
2521 |
"php": ">=7.2.5"
|
2522 |
},
|
2523 |
+
"platform-dev": [],
|
2524 |
+
"plugin-api-version": "1.1.0"
|
2525 |
}
|
geoip-detect.php
CHANGED
@@ -5,7 +5,7 @@ Plugin URI: http://www.yellowtree.de
|
|
5 |
Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
|
6 |
Author: Yellow Tree (Benjamin Pick)
|
7 |
Author URI: http://www.yellowtree.de
|
8 |
-
Version: 4.0
|
9 |
License: GPLv3 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
11 |
Text Domain: geoip-detect
|
@@ -16,7 +16,7 @@ Requires WP: 5.0
|
|
16 |
Requires PHP: 7.2.5
|
17 |
*/
|
18 |
|
19 |
-
define('GEOIP_DETECT_VERSION', '4.0
|
20 |
|
21 |
/*
|
22 |
Copyright 2013-2021 Yellow Tree, Siegen, Germany
|
5 |
Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
|
6 |
Author: Yellow Tree (Benjamin Pick)
|
7 |
Author URI: http://www.yellowtree.de
|
8 |
+
Version: 4.1.0
|
9 |
License: GPLv3 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
11 |
Text Domain: geoip-detect
|
16 |
Requires PHP: 7.2.5
|
17 |
*/
|
18 |
|
19 |
+
define('GEOIP_DETECT_VERSION', '4.1.0');
|
20 |
|
21 |
/*
|
22 |
Copyright 2013-2021 Yellow Tree, Siegen, Germany
|
js/body_classes.js
CHANGED
@@ -1,6 +1,15 @@
|
|
1 |
import { domReady } from './lib/html';
|
2 |
import { get_info } from './lookup';
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
export async function add_body_classes() {
|
5 |
const record = await get_info();
|
6 |
|
@@ -9,12 +18,7 @@ export async function add_body_classes() {
|
|
9 |
return;
|
10 |
}
|
11 |
|
12 |
-
const css_classes =
|
13 |
-
country: record.get('country.iso_code'),
|
14 |
-
'country-is-in-european-union': record.has_property('country.is_in_european_union') && record.get('country.is_in_european_union'),
|
15 |
-
continent: record.get('continent.code'),
|
16 |
-
province: record.get('most_specific_subdivision.iso_code'),
|
17 |
-
};
|
18 |
|
19 |
await domReady;
|
20 |
|
1 |
import { domReady } from './lib/html';
|
2 |
import { get_info } from './lookup';
|
3 |
|
4 |
+
export function calc_classes(record) {
|
5 |
+
return {
|
6 |
+
country: record.get('country.iso_code'),
|
7 |
+
'country-is-in-european-union': record.get('country.is_in_european_union', false),
|
8 |
+
continent: record.get('continent.code'),
|
9 |
+
province: record.get('most_specific_subdivision.iso_code'),
|
10 |
+
};
|
11 |
+
}
|
12 |
+
|
13 |
export async function add_body_classes() {
|
14 |
const record = await get_info();
|
15 |
|
18 |
return;
|
19 |
}
|
20 |
|
21 |
+
const css_classes = calc_classes(record);
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
await domReady;
|
24 |
|
js/body_classes.test.js
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { getTestRecord, getTestRecordError } from "./test-lib/test-records";
|
2 |
+
import { calc_classes } from "./body_classes";
|
3 |
+
import Record from "./models/record";
|
4 |
+
|
5 |
+
|
6 |
+
const emptyRecord = new Record();
|
7 |
+
const defaultRecord = getTestRecord();
|
8 |
+
const errorRecord = getTestRecordError();
|
9 |
+
|
10 |
+
test('calc_classes', () => {
|
11 |
+
expect(calc_classes(defaultRecord)).toStrictEqual({
|
12 |
+
"continent": "EU",
|
13 |
+
"country": "DE",
|
14 |
+
"country-is-in-european-union": false, /* because the test data set has EU not set yet */
|
15 |
+
"province": "HE",
|
16 |
+
});
|
17 |
+
expect(calc_classes(errorRecord)).toStrictEqual({
|
18 |
+
"continent": "",
|
19 |
+
"country": "",
|
20 |
+
"country-is-in-european-union": false,
|
21 |
+
"province": "",
|
22 |
+
});
|
23 |
+
expect(calc_classes(emptyRecord)).toStrictEqual({
|
24 |
+
"continent": "",
|
25 |
+
"country": "",
|
26 |
+
"country-is-in-european-union": false,
|
27 |
+
"province": "",
|
28 |
+
});
|
29 |
+
|
30 |
+
});
|
js/dist/frontend.1115d690.js
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"LNzP":[function(require,module,exports) {
|
2 |
+
function o(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?module.exports=o=function(o){return typeof o}:module.exports=o=function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},o(t)}module.exports=o;
|
3 |
+
},{}],"fwsn":[function(require,module,exports) {
|
4 |
+
function n(n,t,o,r,e,i,u){try{var c=n[i](u),v=c.value}catch(a){return void o(a)}c.done?t(v):Promise.resolve(v).then(r,e)}function t(t){return function(){var o=this,r=arguments;return new Promise(function(e,i){var u=t.apply(o,r);function c(t){n(u,e,i,c,v,"next",t)}function v(t){n(u,e,i,c,v,"throw",t)}c(void 0)})}}module.exports=t;
|
5 |
+
},{}],"KA2S":[function(require,module,exports) {
|
6 |
+
var define;
|
7 |
+
var t,r=function(t){"use strict";var r,e=Object.prototype,n=e.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function u(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{u({},"")}catch(P){u=function(t,r,e){return t[r]=e}}function h(t,r,e,n){var o=r&&r.prototype instanceof d?r:d,i=Object.create(o.prototype),a=new G(n||[]);return i._invoke=function(t,r,e){var n=l;return function(o,i){if(n===p)throw new Error("Generator is already running");if(n===y){if("throw"===o)throw i;return F()}for(e.method=o,e.arg=i;;){var a=e.delegate;if(a){var c=j(a,e);if(c){if(c===v)continue;return c}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if(n===l)throw n=y,e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n=p;var u=f(t,r,e);if("normal"===u.type){if(n=e.done?y:s,u.arg===v)continue;return{value:u.arg,done:e.done}}"throw"===u.type&&(n=y,e.method="throw",e.arg=u.arg)}}}(t,e,a),i}function f(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(P){return{type:"throw",arg:P}}}t.wrap=h;var l="suspendedStart",s="suspendedYield",p="executing",y="completed",v={};function d(){}function g(){}function m(){}var w={};w[i]=function(){return this};var L=Object.getPrototypeOf,x=L&&L(L(N([])));x&&x!==e&&n.call(x,i)&&(w=x);var b=m.prototype=d.prototype=Object.create(w);function E(t){["next","throw","return"].forEach(function(r){u(t,r,function(t){return this._invoke(r,t)})})}function _(t,r){var e;this._invoke=function(o,i){function a(){return new r(function(e,a){!function e(o,i,a,c){var u=f(t[o],t,i);if("throw"!==u.type){var h=u.arg,l=h.value;return l&&"object"==typeof l&&n.call(l,"__await")?r.resolve(l.__await).then(function(t){e("next",t,a,c)},function(t){e("throw",t,a,c)}):r.resolve(l).then(function(t){h.value=t,a(h)},function(t){return e("throw",t,a,c)})}c(u.arg)}(o,i,e,a)})}return e=e?e.then(a,a):a()}}function j(t,e){var n=t.iterator[e.method];if(n===r){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=r,j(t,e),"throw"===e.method))return v;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var o=f(n,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,v;var i=o.arg;return i?i.done?(e[t.resultName]=i.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=r),e.delegate=null,v):i:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,v)}function O(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function k(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function G(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(O,this),this.reset(!0)}function N(t){if(t){var e=t[i];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function e(){for(;++o<t.length;)if(n.call(t,o))return e.value=t[o],e.done=!1,e;return e.value=r,e.done=!0,e};return a.next=a}}return{next:F}}function F(){return{value:r,done:!0}}return g.prototype=b.constructor=m,m.constructor=g,g.displayName=u(m,c,"GeneratorFunction"),t.isGeneratorFunction=function(t){var r="function"==typeof t&&t.constructor;return!!r&&(r===g||"GeneratorFunction"===(r.displayName||r.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,m):(t.__proto__=m,u(t,c,"GeneratorFunction")),t.prototype=Object.create(b),t},t.awrap=function(t){return{__await:t}},E(_.prototype),_.prototype[a]=function(){return this},t.AsyncIterator=_,t.async=function(r,e,n,o,i){void 0===i&&(i=Promise);var a=new _(h(r,e,n,o),i);return t.isGeneratorFunction(e)?a:a.next().then(function(t){return t.done?t.value:a.next()})},E(b),u(b,c,"Generator"),b[i]=function(){return this},b.toString=function(){return"[object Generator]"},t.keys=function(t){var r=[];for(var e in t)r.push(e);return r.reverse(),function e(){for(;r.length;){var n=r.pop();if(n in t)return e.value=n,e.done=!1,e}return e.done=!0,e}},t.values=N,G.prototype={constructor:G,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=r,this.done=!1,this.delegate=null,this.method="next",this.arg=r,this.tryEntries.forEach(k),!t)for(var e in this)"t"===e.charAt(0)&&n.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=r)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function o(n,o){return c.type="throw",c.arg=t,e.next=n,o&&(e.method="next",e.arg=r),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),h=n.call(a,"finallyLoc");if(u&&h){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!h)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,r){for(var e=this.tryEntries.length-1;e>=0;--e){var o=this.tryEntries[e];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=r&&r<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=r,i?(this.method="next",this.next=i.finallyLoc,v):this.complete(a)},complete:function(t,r){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&r&&(this.next=r),v},finish:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),k(e),v}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;k(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:N(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),v}},t}("object"==typeof module?module.exports:{});try{regeneratorRuntime=r}catch(e){Function("r","regeneratorRuntime = r")(r)}
|
8 |
+
},{}],"m4eR":[function(require,module,exports) {
|
9 |
+
module.exports=require("regenerator-runtime");
|
10 |
+
},{"regenerator-runtime":"KA2S"}],"ZBnv":[function(require,module,exports) {
|
11 |
+
function n(n,o){if(!(n instanceof o))throw new TypeError("Cannot call a class as a function")}module.exports=n;
|
12 |
+
},{}],"NoOd":[function(require,module,exports) {
|
13 |
+
function e(e,r){for(var n=0;n<r.length;n++){var t=r[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}function r(r,n,t){return n&&e(r.prototype,n),t&&e(r,t),r}module.exports=r;
|
14 |
+
},{}],"AuD4":[function(require,module,exports) {
|
15 |
+
var global = arguments[3];
|
16 |
+
var define;
|
17 |
+
var t,n=arguments[3],r=e(require("@babel/runtime/helpers/typeof"));function e(t){return t&&t.__esModule?t:{default:t}}(function(){var e,u="Expected a function",o="__lodash_hash_undefined__",i=500,a=800,c=16,f=1/0,l=9007199254740991,s="[object AsyncFunction]",h="[object Function]",p="[object GeneratorFunction]",_="[object Null]",d="[object Proxy]",y="[object Symbol]",v="[object Undefined]",g=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,b=/^\w*$/,j=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,m=/\\(\\)?/g,O=/^\[object .+?Constructor\]$/,w="object"==(void 0===n?"undefined":(0,r.default)(n))&&n&&n.Object===Object&&n,z="object"==("undefined"==typeof self?"undefined":(0,r.default)(self))&&self&&self.Object===Object&&self,A=w||z||Function("return this")(),x="object"==("undefined"==typeof exports?"undefined":(0,r.default)(exports))&&exports&&!exports.nodeType&&exports,S=x&&"object"==("undefined"==typeof module?"undefined":(0,r.default)(module))&&module&&!module.nodeType&&module;function $(t,n){return!!(null==t?0:t.length)&&function(t,n,r){return n==n?function(t,n,r){var e=r-1,u=t.length;for(;++e<u;)if(t[e]===n)return e;return-1}(t,n,r):function(t,n,r,e){var u=t.length,o=r+(e?1:-1);for(;e?o--:++o<u;)if(n(t[o],o,t))return o;return-1}(t,E,r)}(t,n,0)>-1}function F(t,n,r){for(var e=-1,u=null==t?0:t.length;++e<u;)if(r(n,t[e]))return!0;return!1}function k(t,n){for(var r=-1,e=null==t?0:t.length,u=Array(e);++r<e;)u[r]=n(t[r],r,t);return u}function E(t){return t!=t}function P(t){return function(n){return t(n)}}function T(t,n){return t.has(n)}var C,L=Array.prototype,M=Function.prototype,R=Object.prototype,q=A["__core-js_shared__"],I=M.toString,N=R.hasOwnProperty,D=(C=/[^.]+$/.exec(q&&q.keys&&q.keys.IE_PROTO||""))?"Symbol(src)_1."+C:"",G=R.toString,U=RegExp("^"+I.call(N).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),V=A.Symbol,B=L.splice,H=V?V.toStringTag:e,J=function(){try{var t=pt(Object,"defineProperty");return t({},"",{}),t}catch(n){}}(),K=Math.max,Q=Math.min,W=Date.now,X=pt(A,"Map"),Y=pt(Object,"create"),Z=V?V.prototype:e,tt=Z?Z.toString:e;function nt(){}function rt(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function et(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function ut(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function ot(t){var n=-1,r=null==t?0:t.length;for(this.__data__=new ut;++n<r;)this.add(t[n])}function it(t,n){for(var r=t.length;r--;)if(Ot(t[r][0],n))return r;return-1}function at(t,n){for(var u=0,o=(n=function(t,n){if(wt(t))return t;return function(t,n){if(wt(t))return!1;var e=(0,r.default)(t);if("number"==e||"symbol"==e||"boolean"==e||null==t||kt(t))return!0;return b.test(t)||!g.test(t)||null!=n&&t in Object(n)}(t,n)?[t]:gt(Et(t))}(n,t)).length;null!=t&&u<o;)t=t[bt(n[u++])];return u&&u==o?t:e}function ct(t){return null==t?t===e?v:_:H&&H in Object(t)?function(t){var n=N.call(t,H),r=t[H];try{t[H]=e;var u=!0}catch(i){}var o=G.call(t);u&&(n?t[H]=r:delete t[H]);return o}(t):function(t){return G.call(t)}(t)}function ft(t){return!(!$t(t)||(n=t,D&&D in n))&&(xt(t)?U:O).test(function(t){if(null!=t){try{return I.call(t)}catch(n){}try{return t+""}catch(n){}}return""}(t));var n}function lt(t){if("string"==typeof t)return t;if(wt(t))return k(t,lt)+"";if(kt(t))return tt?tt.call(t):"";var n=t+"";return"0"==n&&1/t==-f?"-0":n}function st(t){return At(t)?t:[]}function ht(t,n){var e,u,o=t.__data__;return e=n,("string"==(u=(0,r.default)(e))||"number"==u||"symbol"==u||"boolean"==u?"__proto__"!==e:null===e)?o["string"==typeof n?"string":"hash"]:o.map}function pt(t,n){var r=function(t,n){return null==t?e:t[n]}(t,n);return ft(r)?r:e}rt.prototype.clear=function(){this.__data__=Y?Y(null):{},this.size=0},rt.prototype.delete=function(t){var n=this.has(t)&&delete this.__data__[t];return this.size-=n?1:0,n},rt.prototype.get=function(t){var n=this.__data__;if(Y){var r=n[t];return r===o?e:r}return N.call(n,t)?n[t]:e},rt.prototype.has=function(t){var n=this.__data__;return Y?n[t]!==e:N.call(n,t)},rt.prototype.set=function(t,n){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Y&&n===e?o:n,this},et.prototype.clear=function(){this.__data__=[],this.size=0},et.prototype.delete=function(t){var n=this.__data__,r=it(n,t);return!(r<0||(r==n.length-1?n.pop():B.call(n,r,1),--this.size,0))},et.prototype.get=function(t){var n=this.__data__,r=it(n,t);return r<0?e:n[r][1]},et.prototype.has=function(t){return it(this.__data__,t)>-1},et.prototype.set=function(t,n){var r=this.__data__,e=it(r,t);return e<0?(++this.size,r.push([t,n])):r[e][1]=n,this},ut.prototype.clear=function(){this.size=0,this.__data__={hash:new rt,map:new(X||et),string:new rt}},ut.prototype.delete=function(t){var n=ht(this,t).delete(t);return this.size-=n?1:0,n},ut.prototype.get=function(t){return ht(this,t).get(t)},ut.prototype.has=function(t){return ht(this,t).has(t)},ut.prototype.set=function(t,n){var r=ht(this,t),e=r.size;return r.set(t,n),this.size+=r.size==e?0:1,this},ot.prototype.add=ot.prototype.push=function(t){return this.__data__.set(t,o),this},ot.prototype.has=function(t){return this.__data__.has(t)};var _t,dt,yt,vt=(_t=J?function(t,n){return J(t,"toString",{configurable:!0,enumerable:!1,value:Pt(n),writable:!0})}:Tt,dt=0,yt=0,function(){var t=W(),n=c-(t-yt);if(yt=t,n>0){if(++dt>=a)return arguments[0]}else dt=0;return _t.apply(e,arguments)});var gt=function(t){var n=mt(t,function(t){return r.size===i&&r.clear(),t}),r=n.cache;return n}(function(t){var n=[];return 46===t.charCodeAt(0)&&n.push(""),t.replace(j,function(t,r,e,u){n.push(e?u.replace(m,"$1"):r||t)}),n});function bt(t){if("string"==typeof t||kt(t))return t;var n=t+"";return"0"==n&&1/t==-f?"-0":n}var jt=function(t,n){return vt(function(t,n,r){return n=K(n===e?t.length-1:n,0),function(){for(var e=arguments,u=-1,o=K(e.length-n,0),i=Array(o);++u<o;)i[u]=e[n+u];u=-1;for(var a=Array(n+1);++u<n;)a[u]=e[u];return a[n]=r(i),function(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}(t,this,a)}}(t,n,Tt),t+"")}(function(t){var n=k(t,st);return n.length&&n[0]===t[0]?function(t,n,r){for(var u=r?F:$,o=t[0].length,i=t.length,a=i,c=Array(i),f=1/0,l=[];a--;){var s=t[a];a&&n&&(s=k(s,P(n))),f=Q(s.length,f),c[a]=!r&&(n||o>=120&&s.length>=120)?new ot(a&&s):e}s=t[0];var h=-1,p=c[0];t:for(;++h<o&&l.length<f;){var _=s[h],d=n?n(_):_;if(_=r||0!==_?_:0,!(p?T(p,d):u(l,d,r))){for(a=i;--a;){var y=c[a];if(!(y?T(y,d):u(t[a],d,r)))continue t}p&&p.push(d),l.push(_)}}return l}(n):[]});function mt(t,n){if("function"!=typeof t||null!=n&&"function"!=typeof n)throw new TypeError(u);var r=function r(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;if(o.has(u))return o.get(u);var i=t.apply(this,e);return r.cache=o.set(u,i)||o,i};return r.cache=new(mt.Cache||ut),r}function Ot(t,n){return t===n||t!=t&&n!=n}mt.Cache=ut;var wt=Array.isArray;function zt(t){return null!=t&&St(t.length)&&!xt(t)}function At(t){return Ft(t)&&zt(t)}function xt(t){if(!$t(t))return!1;var n=ct(t);return n==h||n==p||n==s||n==d}function St(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=l}function $t(t){var n=(0,r.default)(t);return null!=t&&("object"==n||"function"==n)}function Ft(t){return null!=t&&"object"==(0,r.default)(t)}function kt(t){return"symbol"==(0,r.default)(t)||Ft(t)&&ct(t)==y}function Et(t){return null==t?"":lt(t)}function Pt(t){return function(){return t}}function Tt(t){return t}nt.constant=Pt,nt.intersection=jt,nt.memoize=mt,nt.eq=Ot,nt.get=function(t,n,r){var u=null==t?e:at(t,n);return u===e?r:u},nt.identity=Tt,nt.isArray=wt,nt.isArrayLike=zt,nt.isArrayLikeObject=At,nt.isFunction=xt,nt.isLength=St,nt.isObject=$t,nt.isObjectLike=Ft,nt.isSymbol=kt,nt.toString=Et,nt.VERSION="4.17.5","function"==typeof t&&"object"==(0,r.default)(t.amd)&&t.amd?(A._=nt,t(function(){return nt})):S?((S.exports=nt)._=nt,x._=nt):A._=nt}).call(void 0);
|
18 |
+
},{"@babel/runtime/helpers/typeof":"LNzP"}],"yK6K":[function(require,module,exports) {
|
19 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.camelToUnderscore=void 0;var e=l(require("@babel/runtime/helpers/classCallCheck")),t=l(require("@babel/runtime/helpers/createClass")),r=l(require("@babel/runtime/helpers/typeof")),a=l(require("../lodash.custom"));function l(e){return e&&e.__esModule?e:{default:e}}var o=function(e,t){if("object"===(0,r.default)(e)&&null!==e){if("object"===(0,r.default)(e.names)&&"object"===(0,r.default)(t))for(var a=0;a<t.length;a++){var l=t[a];if(e.names[l])return e.names[l]}return e.name?e.name:""}return e},s=function(e){return e=e.split(".").map(function(e){return"string"!=typeof e||"string"!=typeof e[0]?"":e=(e=e[0].toLowerCase()+e.slice(1)).replace(/([A-Z])/g,"_$1").toLowerCase()}).join(".")};exports.camelToUnderscore=s;var n=function(){function l(t,r){(0,e.default)(this,l),this.data={},this.default_locales=[],this.data=t||{is_empty:!0},this.default_locales=["en"],this.default_locales=this._process_locales(r)}return(0,t.default)(l,[{key:"get",value:function(e,t){return this.get_with_locales(e,null,t)}},{key:"get_raw",value:function(e){return e=s(e),a.default.get(this.data,e,null)}},{key:"has_property",value:function(e){return null!==this._lookup_with_locales(e,this.default_locales,null)}},{key:"_lookup_with_locales",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";t=this._process_locales(t),".name"===e.substr(-5)&&(e=e.substr(0,e.length-5));var a=this.get_raw(e);return null!==(a=o(a,t))&&""!==a||(a=r),a}},{key:"_process_locales",value:function(e){return"string"==typeof e&&(e=[e]),Array.isArray(e)&&0!==e.length||(e=this.default_locales),e}},{key:"get_with_locales",value:function(e,t,a){var l=this._lookup_with_locales(e,t,a);return"object"===(0,r.default)(l)&&console.warn('Geolocation IP Detection: The property "'+e+'" is of type "'+(0,r.default)(l)+'", should be string or similar',l),void 0===l?(console.warn('Geolocation IP Detection: The property "'+e+'" is not defined, please check spelling or maybe you need a different data source',{data:this.data}),""):l}},{key:"get_country_iso",value:function(){var e=this.get("country.iso_code");return e&&(e=e.substr(0,2).toLowerCase()),e}},{key:"is_empty",value:function(){return this.get("is_empty",!1)}},{key:"error",value:function(){return this.get_raw("extra.error")||""}},{key:"serialize",value:function(){return this.data}}]),l}(),u=n;exports.default=u;
|
20 |
+
},{"@babel/runtime/helpers/classCallCheck":"ZBnv","@babel/runtime/helpers/createClass":"NoOd","@babel/runtime/helpers/typeof":"LNzP","../lodash.custom":"AuD4"}],"VVpI":[function(require,module,exports) {
|
21 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getLocalStorage=exports.setLocalStorage=void 0;var e=function(e,t,r){var a={value:t,expires_at:(new Date).getTime()+1e3*r/1};localStorage.setItem(e.toString(),JSON.stringify(a))};exports.setLocalStorage=e;var t=function(e){var t=null;try{t=JSON.parse(localStorage.getItem(e.toString()))}catch(r){return null}if(null!==t){if(!(null!==t.expires_at&&t.expires_at<(new Date).getTime()))return t.value;localStorage.removeItem(e.toString())}return null};exports.getLocalStorage=t;
|
22 |
+
},{}],"jf5f":[function(require,module,exports) {
|
23 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.makeJSONRequest=exports.makeRequest=void 0;var e=r(require("@babel/runtime/helpers/asyncToGenerator")),t=r(require("@babel/runtime/regenerator"));function r(e){return e&&e.__esModule?e:{default:e}}var n=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"GET",r=new XMLHttpRequest;return new Promise(function(n,u){r.onreadystatechange=function(){4===r.readyState&&(r.status>=200&&r.status<300?n(r):u({status:r.status,statusText:r.statusText,request:r}))},r.open(t||"GET",e,!0),r.send()})};exports.makeRequest=n;var u=function(e){try{return JSON.parse(e)}catch(t){return e}},s=function(){var r=(0,e.default)(t.default.mark(function e(r){var s,a,o=arguments;return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s=o.length>1&&void 0!==o[1]?o[1]:"GET",e.prev=1,e.next=4,n(r,s);case 4:return a=e.sent,e.abrupt("return",u(a.responseText));case 8:return e.prev=8,e.t0=e.catch(1),e.abrupt("return",u(e.t0.request.responseText));case 11:case"end":return e.stop()}},e,null,[[1,8]])}));return function(e){return r.apply(this,arguments)}}();exports.makeJSONRequest=s;
|
24 |
+
},{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR"}],"yyFn":[function(require,module,exports) {
|
25 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.set_override=_,exports.remove_override=x,exports.get_info=m,exports.options=void 0;var e,r=s(require("@babel/runtime/helpers/typeof")),t=s(require("@babel/runtime/helpers/asyncToGenerator")),o=s(require("@babel/runtime/regenerator")),n=s(require("./models/record")),a=require("./lib/localStorageAccess"),i=s(require("./lodash.custom")),u=require("./lib/xhr");function s(e){return e&&e.__esModule?e:{default:e}}var c=(null===(e=window.geoip_detect)||void 0===e?void 0:e.options)||{ajaxurl:"/wp-admin/admin-ajax.php",default_locales:["en"],cookie_duration_in_days:7,cookie_name:"geoip-detect-result"};exports.options=c;var l=null;function d(){if(!l){var e=c.ajaxurl+"?action=geoip_detect2_get_info_from_current_ip";l=(0,u.makeJSONRequest)(e)}return l}function p(){return f.apply(this,arguments)}function f(){return(f=(0,t.default)(o.default.mark(function e(){var r,t,n,i;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(r=!1,t=!1,!c.cookie_name){e.next=6;break}if(!(t=(0,a.getLocalStorage)(c.cookie_name))||!t.extra){e.next=6;break}return e.abrupt("return",t);case 6:return e.prev=6,e.next=9,d();case 9:r=e.sent,e.next=15;break;case 12:e.prev=12,e.t0=e.catch(6),r=e.t0.responseJSON||e.t0;case 15:if(!c.cookie_name){e.next=20;break}if(t=(0,a.getLocalStorage)(c.cookie_name),!0!==(null===(n=t)||void 0===n?void 0:null===(i=n.extra)||void 0===i?void 0:i.override)){e.next=19;break}return e.abrupt("return",t);case 19:(0,a.setLocalStorage)(c.cookie_name,r,24*c.cookie_duration_in_days*60*60);case 20:return e.abrupt("return",r);case 21:case"end":return e.stop()}},e,null,[[6,12]])}))).apply(this,arguments)}function _(e,r){return e&&"function"==typeof e.serialize&&(e=e.serialize()),(r=r||c.cookie_duration_in_days)<0?(console.warn("set_override_data() did nothing: A negative duration doesn't make sense. If you want to remove the override, use remove_override() instead."),!1):v(e,r)}function v(e,r){return e||(e={}),e.extra||(e.extra={}),e.extra.override=!0,(0,a.setLocalStorage)(c.cookie_name,e,24*r*60*60),!0}function x(){return(0,a.setLocalStorage)(c.cookie_name,{},-1),!0}function m(){return k.apply(this,arguments)}function k(){return(k=(0,t.default)(o.default.mark(function e(){var t,a;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p();case 2:return t=e.sent,"object"!==(0,r.default)(t)&&(console.error("Geoip-detect: Record should be an object, not a "+(0,r.default)(t),t),t={extra:{error:t||"Network error, look at the original server response ..."}}),a=new n.default(t,c.default_locales),e.abrupt("return",a);case 6:case"end":return e.stop()}},e)}))).apply(this,arguments)}
|
26 |
+
},{"@babel/runtime/helpers/typeof":"LNzP","@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","./models/record":"yK6K","./lib/localStorageAccess":"VVpI","./lodash.custom":"AuD4","./lib/xhr":"jf5f"}],"YIwO":[function(require,module,exports) {
|
27 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.selectItemByValue=t,exports.selectItemByAttribute=n,exports.triggerNativeEvent=o,exports.domReady=void 0;var e=new Promise(function(e){"loading"===document.readyState?document.addEventListener?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"loading"!=document.readyState&&e()}):e()});function t(e,t){for(var n=0;n<e.options.length;n++)if(e.options[n].value===t){e.selectedIndex=n;break}}function n(e,t,n){for(var o=0;o<e.options.length;o++)if(e.options[o].getAttribute(t)===n){e.selectedIndex=o;break}}function o(e,t){if(document.createEvent){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!1),e.dispatchEvent(n)}else e.fireEvent("on"+t)}exports.domReady=e;
|
28 |
+
},{}],"IyEz":[function(require,module,exports) {
|
29 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.get_options=o,exports.action_on_elements=a,exports.get_value_from_record=s;var e=n(require("@babel/runtime/helpers/asyncToGenerator")),r=n(require("@babel/runtime/regenerator")),t=require("../lookup");function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var r=e.getAttribute("data-options");try{return JSON.parse(r)}catch(t){return{}}}function a(e,r,t){return u.apply(this,arguments)}function u(){return(u=(0,e.default)(r.default.mark(function e(n,o,a){var u,s;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if((u=document.getElementsByClassName(n)).length){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,(0,t.get_info)();case 5:if(!(s=e.sent).error()){e.next=9;break}return console.error("Geolocation IP Detection Error ("+o+"): "+s.error()),e.abrupt("return");case 9:Array.from(u).forEach(function(e){return a(e,s)});case 10:case"end":return e.stop()}},e)}))).apply(this,arguments)}function s(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=o(e);return t=t||n.property,n.skip_cache&&console.warn("Geolocation IP Detection: The property 'skip_cache' is ignored in AJAX mode. You could disable the response caching on the server by setting the constant GEOIP_DETECT_READER_CACHE_TIME."),r.get_with_locales(t,n.lang,n.default)}
|
30 |
+
},{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","../lookup":"yyFn"}],"AwHB":[function(require,module,exports) {
|
31 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcode_normal=o,exports.do_shortcode_flags=r,exports.do_shortcode_country_select=_,exports.do_shortcode_text_input=c;var e=require("../lib/html"),t=require("./helpers");function o(e,o){e.innerText=(0,t.get_value_from_record)(e,o)}function r(e,o){var r=o.get_country_iso()||(0,t.get_options)(e).default;r&&e.classList.add("flag-icon-"+r)}function _(t,o){var r=o.get_country_iso();(0,e.selectItemByAttribute)(t,"data-c",r),(0,e.triggerNativeEvent)(t,"change")}function c(o,r){o.value=(0,t.get_value_from_record)(o,r),(0,e.triggerNativeEvent)(o,"change")}
|
32 |
+
},{"../lib/html":"YIwO","./helpers":"IyEz"}],"jiwS":[function(require,module,exports) {
|
33 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcode_show_if=r,exports.geoip_detect2_shortcode_evaluate_conditions=i;var e=n(require("@babel/runtime/helpers/typeof")),o=require("./helpers"),t=n(require("../lodash.custom"));function n(e){return e&&e.__esModule?e:{default:e}}function r(e,t){var n=(0,o.get_options)(e),r=i(n.parsed,n,t);e.style.display=r?"":"none !important"}function i(o,t,n){var r=["name","iso_code","iso_code3","code","geoname_id"],i="or"!==o.op;return o.conditions.forEach(function(u){var a=!1,c=[],l=n.get_raw(u.p);null===l?a=!1:"object"===(0,e.default)(l)?r.forEach(function(e){l[e]?c.push(l[e]):"name"==e&&c.push(n.get_with_locales(u.p,t.lang))}):c=[l],a=s(u.v,c),u.not&&(a=!a),i="or"===o.op?i||a:i&&a}),o.not&&(i=!i),i}function s(e,o){return!0===o[0]?o=["true","yes","y","1"]:!1===o[0]&&(o=["false","no","n","0",""]),o=o.map(function(e){return String(e).toLowerCase()}),e=e.split(","),t.default.intersection(e,o).length>0}
|
34 |
+
},{"@babel/runtime/helpers/typeof":"LNzP","./helpers":"IyEz","../lodash.custom":"AuD4"}],"d5ii":[function(require,module,exports) {
|
35 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcodes=void 0;var e=c(require("@babel/runtime/helpers/asyncToGenerator")),t=c(require("@babel/runtime/regenerator")),o=require("../lib/html"),r=require("./helpers"),n=require("./normal"),s=require("./show-if");function c(e){return e&&e.__esModule?e:{default:e}}var i=function(){var c=(0,e.default)(t.default.mark(function e(){return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,o.domReady;case 2:(0,r.action_on_elements)("js-geoip-detect-shortcode","could not execute shortcode(s) [geoip_detect2]",n.do_shortcode_normal),(0,r.action_on_elements)("js-geoip-detect-flag","could not configure the flag(s)",n.do_shortcode_flags),(0,r.action_on_elements)("js-geoip-text-input","could not set the value of the text input field(s)",n.do_shortcode_text_input),(0,r.action_on_elements)("js-geoip-detect-country-select","could not set the value of the select field(s)",n.do_shortcode_country_select),(0,r.action_on_elements)("js-geoip-detect-show-if","could not execute the show-if/hide-if conditions",s.do_shortcode_show_if);case 7:case"end":return e.stop()}},e)}));return function(){return c.apply(this,arguments)}}();exports.do_shortcodes=i;
|
36 |
+
},{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","../lib/html":"YIwO","./helpers":"IyEz","./normal":"AwHB","./show-if":"jiwS"}],"EtfF":[function(require,module,exports) {
|
37 |
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.calc_classes=s,exports.add_body_classes=c;var e=o(require("@babel/runtime/helpers/asyncToGenerator")),r=o(require("@babel/runtime/regenerator")),t=require("./lib/html"),n=require("./lookup");function o(e){return e&&e.__esModule?e:{default:e}}function s(e){return{country:e.get("country.iso_code"),"country-is-in-european-union":e.get("country.is_in_european_union",!1),continent:e.get("continent.code"),province:e.get("most_specific_subdivision.iso_code")}}function c(){return a.apply(this,arguments)}function a(){return(a=(0,e.default)(r.default.mark(function e(){var o,c,a,u,i,d,l;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,(0,n.get_info)();case 2:if(!(o=e.sent).error()){e.next=6;break}return console.error("Geodata Error (could not add CSS-classes to body): "+o.error()),e.abrupt("return");case 6:return c=s(o),e.next=9,t.domReady;case 9:for(a=document.getElementsByTagName("body")[0],u=0,i=Object.keys(c);u<i.length;u++)d=i[u],(l=c[d])&&("string"==typeof l?a.classList.add("geoip-".concat(d,"-").concat(l)):a.classList.add("geoip-".concat(d)));case 11:case"end":return e.stop()}},e)}))).apply(this,arguments)}
|
38 |
+
},{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","./lib/html":"YIwO","./lookup":"yyFn"}],"ZVsn":[function(require,module,exports) {
|
39 |
+
"use strict";var e=require("./lookup"),o=require("./shortcodes/index"),d=require("./body_classes");e.options.do_body_classes&&(0,d.add_body_classes)(),e.options.do_shortcodes&&(0,o.do_shortcodes)(),window.geoip_detect.get_info=e.get_info,window.geoip_detect.set_override=e.set_override,window.geoip_detect.remove_override=e.remove_override;
|
40 |
+
},{"./lookup":"yyFn","./shortcodes/index":"d5ii","./body_classes":"EtfF"}]},{},["ZVsn"], null)
|
41 |
+
//# sourceMappingURL=frontend.1115d690.js.map
|
js/dist/frontend.1115d690.js.map
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
{"version":3,"sources":["node_modules/@babel/runtime/helpers/typeof.js","node_modules/@babel/runtime/helpers/asyncToGenerator.js","node_modules/regenerator-runtime/runtime.js","node_modules/@babel/runtime/regenerator/index.js","node_modules/@babel/runtime/helpers/classCallCheck.js","node_modules/@babel/runtime/helpers/createClass.js","js/lodash.custom.js","js/models/record.js","js/lib/localStorageAccess.js","js/lib/xhr.js","js/lookup.js","js/lib/html.js","js/shortcodes/helpers.js","js/shortcodes/normal.js","js/shortcodes/show-if.js","js/shortcodes/index.js","js/body_classes.js","js/frontend.js"],"names":["undefined","FUNC_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","HOT_COUNT","HOT_SPAN","INFINITY","MAX_SAFE_INTEGER","asyncTag","funcTag","genTag","nullTag","proxyTag","symbolTag","undefinedTag","reIsDeepProp","reIsPlainProp","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","arrayIncludes","array","value","length","baseIndexOf","fromIndex","strictIndexOf","index","baseFindIndex","predicate","fromRight","baseIsNaN","arrayIncludesWith","comparator","arrayMap","iteratee","result","Array","baseUnary","func","cacheHas","cache","key","has","arrayProto","uid","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","maskSrcKey","exec","keys","IE_PROTO","nativeObjectToString","reIsNative","RegExp","call","replace","Symbol","splice","symToStringTag","toStringTag","defineProperty","getNative","e","nativeMax","Math","max","nativeMin","min","nativeNow","Date","now","Map","nativeCreate","symbolProto","symbolToString","lodash","Hash","entries","clear","entry","set","ListCache","MapCache","SetCache","values","__data__","add","assocIndexOf","eq","baseGet","object","path","castPath","isArray","isKey","type","isSymbol","test","stringToPath","toKey","baseGetTag","getRawTag","isOwn","tag","unmasked","objectToString","baseIsNative","isObject","isFunction","toSource","isMasked","baseToString","castArrayLikeObject","isArrayLikeObject","getMapData","map","data","isKeyable","getValue","hashClear","size","hashDelete","get","hashGet","hashHas","hashSet","listCacheClear","listCacheDelete","pop","listCacheGet","listCacheHas","listCacheSet","push","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","setCacheAdd","setCacheHas","setToString","count","lastCalled","string","constant","identity","stamp","remaining","arguments","apply","memoizeCapped","memoize","charCodeAt","match","number","quote","subString","intersection","baseRest","start","overRest","transform","args","otherArgs","thisArg","arrays","mapped","baseIntersection","othIndex","includes","othLength","caches","maxLength","Infinity","seen","outer","computed","resolver","TypeError","memoized","Cache","other","isArrayLike","isLength","isObjectLike","defaultValue","VERSION","define","amd","_","Record","_get_localized","ret","locales","names","i","locale","name","camelToUnderscore","split","x","toLowerCase","slice","join","default_locales","is_empty","_process_locales","prop","default_value","get_with_locales","_lookup_with_locales","substr","get_raw","console","warn","country","setLocalStorage","variable","ttl_sec","expires_at","getTime","localStorage","setItem","JSON","stringify","getLocalStorage","parse","getItem","removeItem","makeRequest","url","method","request","XMLHttpRequest","Promise","resolve","reject","onreadystatechange","readyState","status","statusText","open","send","jsonDecodeIfPossible","str","makeJSONRequest","responseText","options","window","geoip_detect","ajaxurl","cookie_duration_in_days","cookie_name","ajaxPromise","get_info_raw","get_info_cached","response","storedResponse","extra","responseJSON","override","set_override","record","duration_in_days","serialize","set_override_data","remove_override","get_info","error","domReady","document","addEventListener","attachEvent","selectItemByValue","el","selectedIndex","selectItemByAttribute","attributeName","attributeValue","getAttribute","triggerNativeEvent","createEvent","event","initEvent","dispatchEvent","fireEvent","get_options","raw","action_on_elements","className","errorMessage","callback","elements","getElementsByClassName","from","forEach","get_value_from_record","property","opt","skip_cache","lang","default","do_shortcode_normal","innerText","do_shortcode_flags","get_country_iso","classList","do_shortcode_country_select","do_shortcode_text_input","do_shortcode_show_if","evaluated","geoip_detect2_shortcode_evaluate_conditions","parsed","style","display","alternativePropertyNames","isConditionMatching","op","conditions","c","subConditionMatching","raw_value","p","geoip_detect2_shortcode_check_subcondition","v","not","expectedValues","actualValues","intersect","String","do_shortcodes","calc_classes","continent","province","add_body_classes","css_classes","body","getElementsByTagName","do_body_classes"],"mappings":"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","file":"frontend.1115d690.js","sourceRoot":"../..","sourcesContent":["function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","module.exports = require(\"regenerator-runtime\");\n","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","/**\n * @license\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash include=\"get,intersection\" -o js/lodash.custom.js`\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.5';\n\n /** Error message constants. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n /** `Object#toString` result references. */\n var asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n nullTag = '[object Null]',\n proxyTag = '[object Proxy]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]';\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = root['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Symbol = root.Symbol,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now;\n\n /* Built-in method references that are verified to be native. */\n var Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash() {\n // No operation performed.\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return wrapped values in chain sequences.\n lodash.constant = constant;\n lodash.intersection = intersection;\n lodash.memoize = memoize;\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return unwrapped values in chain sequences.\n lodash.eq = eq;\n lodash.get = get;\n lodash.identity = identity;\n lodash.isArray = isArray;\n lodash.isArrayLike = isArrayLike;\n lodash.isArrayLikeObject = isArrayLikeObject;\n lodash.isFunction = isFunction;\n lodash.isLength = isLength;\n lodash.isObject = isObject;\n lodash.isObjectLike = isObjectLike;\n lodash.isSymbol = isSymbol;\n lodash.toString = toString;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type {string}\n */\n lodash.VERSION = VERSION;\n\n /*--------------------------------------------------------------------------*/\n\n // Some AMD build optimizers, like r.js, check for condition patterns like:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose Lodash on the global object to prevent errors when Lodash is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n // Use `_.noConflict` to remove Lodash from the global object.\n root._ = lodash;\n\n // Define as an anonymous module so, through path mapping, it can be\n // referenced as the \"underscore\" module.\n define(function() {\n return lodash;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds it.\n else if (freeModule) {\n // Export for Node.js.\n (freeModule.exports = lodash)._ = lodash;\n // Export for CommonJS support.\n freeExports._ = lodash;\n }\n else {\n // Export to the global object.\n root._ = lodash;\n }\n}.call(this));\n","\nimport _ from '../lodash.custom';\n\n\nconst _get_localized = function(ret, locales) {\n if (typeof(ret) === 'object' && ret !== null) {\n if (typeof (ret.names) === 'object' && typeof (locales) === 'object') {\n for (let i = 0 ; i < locales.length ; i++) {\n let locale = locales[i];\n\n if (ret.names[locale]) {\n return ret.names[locale];\n }\n }\n }\n\n if (ret.name) {\n return ret.name;\n }\n\n return '';\n }\n return ret;\n}\n\nexport const camelToUnderscore = function(key) {\n key = key.split('.').map((x) => {\n if (typeof (x) !== 'string' || typeof (x[0]) !== 'string') {\n return '';\n }\n x = x[0].toLowerCase() + x.slice(1); // to allow \"MostSpecificSubdivision\"\n x = x.replace(/([A-Z])/g, \"_$1\").toLowerCase();\n return x;\n }).join('.');\n\n return key;\n}\n\nclass Record {\n data = {};\n default_locales = [];\n\n constructor(data, default_locales) {\n this.data = data || { is_empty: true };\n \n this.default_locales = ['en']; \n this.default_locales = this._process_locales(default_locales);\n }\n\n get(prop, default_value) {\n return this.get_with_locales(prop, null, default_value);\n }\n\n get_raw(prop) {\n prop = camelToUnderscore(prop);\n return _.get(this.data, prop, null);\n }\n \n has_property(prop) {\n const ret = this._lookup_with_locales(prop, this.default_locales, null)\n return ret !== null;\n }\n\n _lookup_with_locales(prop, locales, default_value = '') {\n locales = this._process_locales(locales);\n\n // Treat pseudo-property 'name' as if it never existed\n if (prop.substr(-5) === '.name') {\n prop = prop.substr(0, prop.length - 5);\n }\n\n let ret = this.get_raw(prop);\n \n // Localize property, if possible\n ret = _get_localized(ret, locales);\n \n if (ret === null || ret === '') {\n ret = default_value;\n }\n\n return ret;\n }\n \n _process_locales(locales) {\n if (typeof(locales) === 'string') {\n locales = [ locales ];\n }\n if (!Array.isArray(locales) || locales.length === 0) {\n locales = this.default_locales;\n }\n return locales;\n }\n\n get_with_locales(prop, locales, default_value) {\n const ret = this._lookup_with_locales(prop, locales, default_value);\n\n if (typeof(ret) === 'object') {\n console.warn('Geolocation IP Detection: The property \"' + prop + '\" is of type \"' + typeof (ret) + '\", should be string or similar', ret)\n }\n if (typeof(ret) === 'undefined') {\n console.warn('Geolocation IP Detection: The property \"' + prop + '\" is not defined, please check spelling or maybe you need a different data source', { data: this.data })\n return '';\n }\n\n return ret;\n }\n\n get_country_iso() {\n let country = this.get('country.iso_code');\n if(country) {\n country = country.substr(0, 2).toLowerCase();\n }\n return country;\n }\n\n /**\n * Check if there is information available for this IP\n * @returns boolean \n */\n is_empty() {\n return this.get('is_empty', false);\n }\n \n /**\n * Get error message, if any\n * @return string Error Message\n */\n error() {\n return this.get_raw('extra.error') || '';\n }\n\n /**\n * Get the raw data of this object\n * @returns object\n */\n serialize() {\n return this.data;\n }\n}\n\nexport default Record;","export const setLocalStorage = function (variable, value, ttl_sec) {\n var data = { value: value, expires_at: new Date().getTime() + (ttl_sec * 1000) / 1 };\n localStorage.setItem(variable.toString(), JSON.stringify(data));\n};\n\nexport const getLocalStorage = function (variable) {\n let data = null;\n try {\n data = JSON.parse(localStorage.getItem(variable.toString()));\n } catch(e) {\n return null;\n }\n if (data !== null) {\n if (data.expires_at !== null && data.expires_at < new Date().getTime()) {\n localStorage.removeItem(variable.toString());\n } else {\n return data.value;\n }\n }\n return null;\n}\n","// @see https://gomakethings.com/promise-based-xhr/\n\nexport const makeRequest = function (url, method = 'GET') {\n\n // Create the XHR request\n var request = new XMLHttpRequest();\n\n // Return it as a Promise\n return new Promise(function (resolve, reject) {\n\n // Setup our listener to process compeleted requests\n request.onreadystatechange = function () {\n\n // Only run if the request is complete\n if (request.readyState !== 4) return;\n\n // Process the response\n if (request.status >= 200 && request.status < 300) {\n // If successful\n resolve(request);\n } else {\n // If failed\n reject({\n status: request.status,\n statusText: request.statusText,\n request: request\n });\n }\n\n };\n\n // Setup our HTTP request\n request.open(method || 'GET', url, true);\n\n // Send the request\n request.send();\n\n });\n};\n\nconst jsonDecodeIfPossible = function(str) {\n try {\n return JSON.parse(str);\n } catch(e) {\n return str;\n }\n}\n\nexport const makeJSONRequest = async function(url, method = 'GET') {\n try {\n const request = await makeRequest(url, method);\n return jsonDecodeIfPossible(request.responseText);\n } catch(e) {\n return jsonDecodeIfPossible(e.request.responseText);\n }\n}\n","import Record from './models/record';\nimport { getLocalStorage, setLocalStorage } from './lib/localStorageAccess';\nimport _ from './lodash.custom';\nimport { makeJSONRequest } from './lib/xhr';\n\n\nexport const options = window.geoip_detect?.options || {\n ajaxurl: \"/wp-admin/admin-ajax.php\",\n default_locales: ['en'],\n cookie_duration_in_days: 7,\n cookie_name: 'geoip-detect-result'\n};\n\nlet ajaxPromise = null;\n\nfunction get_info_raw() {\n if (!ajaxPromise) {\n // Do Ajax Request only once per page load\n const url = options.ajaxurl + '?action=geoip_detect2_get_info_from_current_ip'\n\n ajaxPromise = makeJSONRequest(url);\n }\n\n return ajaxPromise;\n}\n\nasync function get_info_cached() {\n let response = false;\n let storedResponse = false;\n\n // 1) Load Info from localstorage cookie cache, if possible\n if (options.cookie_name) {\n storedResponse = getLocalStorage(options.cookie_name)\n if (storedResponse && storedResponse.extra) {\n return storedResponse;\n }\n }\n\n // 2) Get response\n try {\n response = await get_info_raw();\n } catch (err) {\n response = err.responseJSON || err;\n }\n\n // 3) Save info to localstorage cookie cache\n if (options.cookie_name) {\n storedResponse = getLocalStorage(options.cookie_name)\n if (storedResponse?.extra?.override === true) {\n return storedResponse;\n }\n\n // This might be an error object - cache it anyway\n setLocalStorage(options.cookie_name, response, options.cookie_duration_in_days * 24 * 60 * 60);\n }\n\n return response;\n}\n\n\n/**\n * This functions allows to override the geodetected data manually (e.g. a country selector)\n * \n * @api\n * @param {*} record \n * @param {number} duration_in_days When this override expires (default: 1 week later)\n * @return boolean\n */\nexport function set_override(record, duration_in_days) {\n if (record && typeof(record.serialize) === 'function') {\n record = record.serialize();\n }\n\n duration_in_days = duration_in_days || options.cookie_duration_in_days;\n if (duration_in_days < 0) {\n console.warn('set_override_data() did nothing: A negative duration doesn\\'t make sense. If you want to remove the override, use remove_override() instead.');\n return false;\n }\n\n return set_override_data(record, duration_in_days);\n}\nfunction set_override_data(data, duration_in_days) {\n if (!data) {\n data = {};\n }\n if (!data.extra) {\n data.extra = {};\n }\n data.extra.override = true;\n\n setLocalStorage(options.cookie_name, data, duration_in_days * 24 * 60 * 60);\n return true;\n}\n\n/**\n * Remove the override data.\n * On next page load, the record data will be loaded from the server again.\n * \n * @return boolean\n */\nexport function remove_override() {\n setLocalStorage(options.cookie_name, {}, -1);\n return true;\n}\n\n\n/**\n * Load the data from the server\n * \n * (It can also be loaded from the browser localstorage, if the record data is present there already.)\n * \n * @api\n * @return Promise(Record)\n */\nexport async function get_info() {\n let response = await get_info_cached();\n\n if (typeof (response) !== 'object') {\n console.error('Geoip-detect: Record should be an object, not a ' + typeof (response), response);\n response = { 'extra': { 'error': response || 'Network error, look at the original server response ...' } };\n }\n\n const record = new Record(response, options.default_locales);\n return record;\n}","export const domReady = new Promise(resolve => {\n if (document.readyState === \"loading\") {\n if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', resolve);\n } else {\n document.attachEvent('onreadystatechange', function () {\n if (document.readyState != 'loading')\n resolve();\n });\n }\n }\n else {\n resolve();\n }\n});\n\nexport function selectItemByValue(el, value) {\n for (var i = 0; i < el.options.length; i++) {\n if (el.options[i].value === value) {\n el.selectedIndex = i;\n break;\n }\n }\n}\n\nexport function selectItemByAttribute(el, attributeName, attributeValue) {\n for (var i = 0; i < el.options.length; i++) {\n if (el.options[i].getAttribute(attributeName) === attributeValue) {\n el.selectedIndex = i;\n break;\n }\n }\n}\n\n\nexport function triggerNativeEvent(el, name) {\n if (document.createEvent) {\n const event = document.createEvent('HTMLEvents');\n event.initEvent(name, true, false);\n el.dispatchEvent(event);\n } else {\n el.fireEvent('on' + name);\n }\n}","import { get_info } from \"../lookup\";\n\n// Get Options from data-options and json parse them\nexport function get_options(el) {\n const raw = el.getAttribute('data-options');\n try {\n return JSON.parse(raw);\n } catch (e) {\n return {};\n }\n}\n\nexport async function action_on_elements(className, errorMessage, callback) {\n const elements = document.getElementsByClassName(className);\n if (!elements.length) return;\n\n const record = await get_info();\n\n if (record.error()) {\n console.error('Geolocation IP Detection Error (' + errorMessage + '): ' + record.error());\n return;\n }\n\n Array.from(elements)\n .forEach(el => callback(el, record));\n}\n\nexport function get_value_from_record(el, record, property = null) {\n const opt = get_options(el);\n property = property || opt.property;\n if (opt.skip_cache) {\n console.warn(\"Geolocation IP Detection: The property 'skip_cache' is ignored in AJAX mode. You could disable the response caching on the server by setting the constant GEOIP_DETECT_READER_CACHE_TIME.\");\n }\n\n return record.get_with_locales(property, opt.lang, opt.default);\n}","import { selectItemByAttribute, triggerNativeEvent } from \"../lib/html\";\nimport { get_value_from_record, get_options } from \"./helpers\";\n\nexport function do_shortcode_normal(el, record) {\n el.innerText = get_value_from_record(el, record);\n}\n\nexport function do_shortcode_flags(el, record) {\n const country = record.get_country_iso() || get_options(el).default;\n if (country) {\n el.classList.add('flag-icon-' + country)\n }\n}\n\nexport function do_shortcode_country_select(el, record) {\n let country = record.get_country_iso();\n\n selectItemByAttribute(el, 'data-c', country);\n triggerNativeEvent(el, 'change');\n}\n\nexport function do_shortcode_text_input(el, record) {\n el.value = get_value_from_record(el, record);\n triggerNativeEvent(el, 'change');\n}","import { get_options } from './helpers';\nimport _ from '../lodash.custom'; // we might use lodash-es in the future\n\n\nexport function do_shortcode_show_if(el, record) {\n const opt = get_options(el);\n const evaluated = geoip_detect2_shortcode_evaluate_conditions(opt.parsed, opt, record);\n\n if (!evaluated) {\n el.style.display = \"none !important\";\n } else {\n el.style.display = '';\n }\n}\n\nexport function geoip_detect2_shortcode_evaluate_conditions(parsed, opt, record) {\n const alternativePropertyNames = [\n 'name',\n 'iso_code',\n 'iso_code3',\n 'code',\n 'geoname_id',\n ];\n\n let isConditionMatching = (parsed.op === 'or') ? false : true;\n\n parsed.conditions.forEach(c => {\n let subConditionMatching = false;\n let values = [];\n\n const raw_value = record.get_raw(c.p);\n\n if (raw_value === null) {\n subConditionMatching = false;\n } else {\n if (typeof (raw_value) === 'object') {\n alternativePropertyNames.forEach(name => {\n if (raw_value[name]) {\n values.push(raw_value[name]);\n } else if (name == 'name') {\n values.push(record.get_with_locales(c.p, opt.lang));\n }\n })\n } else {\n values = [raw_value]\n }\n }\n\n subConditionMatching = geoip_detect2_shortcode_check_subcondition(c.v, values);\n\n if (c.not) {\n subConditionMatching = !subConditionMatching;\n }\n\n if (parsed.op === 'or') {\n isConditionMatching = isConditionMatching || subConditionMatching;\n } else {\n isConditionMatching = isConditionMatching && subConditionMatching;\n }\n\n });\n\n if (parsed.not) {\n isConditionMatching = !isConditionMatching;\n }\n\n return isConditionMatching;\n}\n\nfunction geoip_detect2_shortcode_check_subcondition(expectedValues, actualValues) {\n if (actualValues[0] === true) {\n actualValues = ['true', 'yes', 'y', '1'];\n } else if (actualValues[0] === false) {\n actualValues = ['false', 'no', 'n', '0', ''];\n }\n\n actualValues = actualValues.map(x => String(x).toLowerCase())\n\n expectedValues = expectedValues.split(',');\n\n const intersect = _.intersection(expectedValues, actualValues);\n\n return intersect.length > 0;\n}","import { domReady } from \"../lib/html\";\nimport { action_on_elements } from \"./helpers\";\nimport { do_shortcode_country_select, do_shortcode_flags, do_shortcode_normal, do_shortcode_text_input } from \"./normal\";\nimport { do_shortcode_show_if } from \"./show-if\";\n\n\nexport const do_shortcodes = async function do_shortcodes() {\n await domReady;\n\n // These are called in parallel, as they are async functions\n action_on_elements('js-geoip-detect-shortcode',\n 'could not execute shortcode(s) [geoip_detect2]', do_shortcode_normal);\n\n action_on_elements('js-geoip-detect-flag',\n 'could not configure the flag(s)', do_shortcode_flags);\n\n action_on_elements('js-geoip-text-input',\n 'could not set the value of the text input field(s)', do_shortcode_text_input);\n\n action_on_elements('js-geoip-detect-country-select',\n 'could not set the value of the select field(s)', do_shortcode_country_select);\n\n action_on_elements('js-geoip-detect-show-if',\n 'could not execute the show-if/hide-if conditions', do_shortcode_show_if);\n\n};","import { domReady } from './lib/html';\nimport { get_info } from './lookup';\n\nexport function calc_classes(record) {\n return {\n country: record.get('country.iso_code'),\n 'country-is-in-european-union': record.get('country.is_in_european_union', false),\n continent: record.get('continent.code'),\n province: record.get('most_specific_subdivision.iso_code'),\n };\n}\n\nexport async function add_body_classes() {\n const record = await get_info();\n\n if (record.error()) {\n console.error('Geodata Error (could not add CSS-classes to body): ' + record.error());\n return;\n }\n\n const css_classes = calc_classes(record);\n\n await domReady;\n\n const body = document.getElementsByTagName('body')[0];\n for (let key of Object.keys(css_classes)) {\n const value = css_classes[key];\n if (value) {\n if (typeof (value) == 'string') {\n body.classList.add(`geoip-${key}-${value}`);\n } else {\n body.classList.add(`geoip-${key}`);\n }\n }\n }\n}","import { get_info, options, remove_override, set_override } from './lookup';\nimport { do_shortcodes } from './shortcodes/index';\nimport { add_body_classes } from './body_classes';\n\n\n\nif (options.do_body_classes) {\n add_body_classes();\n}\nif (options.do_shortcodes) {\n do_shortcodes();\n}\n\n// Extend window object \nwindow.geoip_detect.get_info = get_info;\n\nwindow.geoip_detect.set_override = set_override;\nwindow.geoip_detect.remove_override = remove_override;"]}
|
js/dist/parcel.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"mzZo":[function(require,module,exports) {
|
2 |
-
module.exports={frontendJS:"frontend.
|
3 |
-
},{"./js/frontend.js":[["frontend.
|
1 |
parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"mzZo":[function(require,module,exports) {
|
2 |
+
module.exports={frontendJS:"frontend.1115d690.js",backendJS:"backend.f84e1103.js"};
|
3 |
+
},{"./js/frontend.js":[["frontend.1115d690.js","ZVsn"],"frontend.1115d690.js.map","ZVsn"],"./js/backend.js":[["backend.f84e1103.js","gP7L"],"backend.f84e1103.js.map","gP7L"]}]},{},[], null)
|
js/dist/parcel.json
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
{
|
2 |
-
"frontendJS": "frontend.
|
3 |
"backendJS": "backend.f84e1103.js"
|
4 |
}
|
1 |
{
|
2 |
+
"frontendJS": "frontend.1115d690.js",
|
3 |
"backendJS": "backend.f84e1103.js"
|
4 |
}
|
js/dist/parcel.urls
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
frontendJS: frontend.
|
2 |
backendJS: backend.f84e1103.js
|
1 |
+
frontendJS: frontend.1115d690.js
|
2 |
backendJS: backend.f84e1103.js
|
js/models/record.js
CHANGED
@@ -3,16 +3,8 @@ import _ from '../lodash.custom';
|
|
3 |
|
4 |
|
5 |
const _get_localized = function(ret, locales) {
|
6 |
-
if (typeof(ret) === 'object') {
|
7 |
-
|
8 |
-
if (typeof(locales) === 'string') {
|
9 |
-
locales = [ locales ];
|
10 |
-
}
|
11 |
-
if (typeof(locales) !== 'object') {
|
12 |
-
locales = [];
|
13 |
-
}
|
14 |
-
|
15 |
-
if (typeof(ret.names) === 'object') {
|
16 |
for (let i = 0 ; i < locales.length ; i++) {
|
17 |
let locale = locales[i];
|
18 |
|
@@ -25,13 +17,23 @@ const _get_localized = function(ret, locales) {
|
|
25 |
if (ret.name) {
|
26 |
return ret.name;
|
27 |
}
|
|
|
|
|
28 |
}
|
29 |
return ret;
|
30 |
}
|
31 |
|
32 |
export const camelToUnderscore = function(key) {
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
}
|
36 |
|
37 |
class Record {
|
@@ -39,8 +41,10 @@ class Record {
|
|
39 |
default_locales = [];
|
40 |
|
41 |
constructor(data, default_locales) {
|
42 |
-
this.data = data || {};
|
43 |
-
|
|
|
|
|
44 |
}
|
45 |
|
46 |
get(prop, default_value) {
|
@@ -53,31 +57,41 @@ class Record {
|
|
53 |
}
|
54 |
|
55 |
has_property(prop) {
|
56 |
-
const ret = this._lookup_with_locales(prop, this.default_locales)
|
57 |
-
return
|
58 |
}
|
59 |
|
60 |
_lookup_with_locales(prop, locales, default_value = '') {
|
61 |
-
|
62 |
-
|
63 |
// Treat pseudo-property 'name' as if it never existed
|
64 |
if (prop.substr(-5) === '.name') {
|
65 |
prop = prop.substr(0, prop.length - 5);
|
66 |
}
|
67 |
-
|
68 |
-
let ret =
|
69 |
-
|
70 |
// Localize property, if possible
|
71 |
ret = _get_localized(ret, locales);
|
|
|
|
|
|
|
|
|
72 |
|
73 |
return ret;
|
74 |
}
|
75 |
|
76 |
-
|
|
|
|
|
|
|
77 |
if (!Array.isArray(locales) || locales.length === 0) {
|
78 |
locales = this.default_locales;
|
79 |
}
|
|
|
|
|
80 |
|
|
|
81 |
const ret = this._lookup_with_locales(prop, locales, default_value);
|
82 |
|
83 |
if (typeof(ret) === 'object') {
|
@@ -98,15 +112,27 @@ class Record {
|
|
98 |
}
|
99 |
return country;
|
100 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
|
102 |
/**
|
103 |
* Get error message, if any
|
104 |
* @return string Error Message
|
105 |
*/
|
106 |
error() {
|
107 |
-
return
|
108 |
}
|
109 |
|
|
|
|
|
|
|
|
|
110 |
serialize() {
|
111 |
return this.data;
|
112 |
}
|
3 |
|
4 |
|
5 |
const _get_localized = function(ret, locales) {
|
6 |
+
if (typeof(ret) === 'object' && ret !== null) {
|
7 |
+
if (typeof (ret.names) === 'object' && typeof (locales) === 'object') {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
for (let i = 0 ; i < locales.length ; i++) {
|
9 |
let locale = locales[i];
|
10 |
|
17 |
if (ret.name) {
|
18 |
return ret.name;
|
19 |
}
|
20 |
+
|
21 |
+
return '';
|
22 |
}
|
23 |
return ret;
|
24 |
}
|
25 |
|
26 |
export const camelToUnderscore = function(key) {
|
27 |
+
key = key.split('.').map((x) => {
|
28 |
+
if (typeof (x) !== 'string' || typeof (x[0]) !== 'string') {
|
29 |
+
return '';
|
30 |
+
}
|
31 |
+
x = x[0].toLowerCase() + x.slice(1); // to allow "MostSpecificSubdivision"
|
32 |
+
x = x.replace(/([A-Z])/g, "_$1").toLowerCase();
|
33 |
+
return x;
|
34 |
+
}).join('.');
|
35 |
+
|
36 |
+
return key;
|
37 |
}
|
38 |
|
39 |
class Record {
|
41 |
default_locales = [];
|
42 |
|
43 |
constructor(data, default_locales) {
|
44 |
+
this.data = data || { is_empty: true };
|
45 |
+
|
46 |
+
this.default_locales = ['en'];
|
47 |
+
this.default_locales = this._process_locales(default_locales);
|
48 |
}
|
49 |
|
50 |
get(prop, default_value) {
|
57 |
}
|
58 |
|
59 |
has_property(prop) {
|
60 |
+
const ret = this._lookup_with_locales(prop, this.default_locales, null)
|
61 |
+
return ret !== null;
|
62 |
}
|
63 |
|
64 |
_lookup_with_locales(prop, locales, default_value = '') {
|
65 |
+
locales = this._process_locales(locales);
|
66 |
+
|
67 |
// Treat pseudo-property 'name' as if it never existed
|
68 |
if (prop.substr(-5) === '.name') {
|
69 |
prop = prop.substr(0, prop.length - 5);
|
70 |
}
|
71 |
+
|
72 |
+
let ret = this.get_raw(prop);
|
73 |
+
|
74 |
// Localize property, if possible
|
75 |
ret = _get_localized(ret, locales);
|
76 |
+
|
77 |
+
if (ret === null || ret === '') {
|
78 |
+
ret = default_value;
|
79 |
+
}
|
80 |
|
81 |
return ret;
|
82 |
}
|
83 |
|
84 |
+
_process_locales(locales) {
|
85 |
+
if (typeof(locales) === 'string') {
|
86 |
+
locales = [ locales ];
|
87 |
+
}
|
88 |
if (!Array.isArray(locales) || locales.length === 0) {
|
89 |
locales = this.default_locales;
|
90 |
}
|
91 |
+
return locales;
|
92 |
+
}
|
93 |
|
94 |
+
get_with_locales(prop, locales, default_value) {
|
95 |
const ret = this._lookup_with_locales(prop, locales, default_value);
|
96 |
|
97 |
if (typeof(ret) === 'object') {
|
112 |
}
|
113 |
return country;
|
114 |
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Check if there is information available for this IP
|
118 |
+
* @returns boolean
|
119 |
+
*/
|
120 |
+
is_empty() {
|
121 |
+
return this.get('is_empty', false);
|
122 |
+
}
|
123 |
|
124 |
/**
|
125 |
* Get error message, if any
|
126 |
* @return string Error Message
|
127 |
*/
|
128 |
error() {
|
129 |
+
return this.get_raw('extra.error') || '';
|
130 |
}
|
131 |
|
132 |
+
/**
|
133 |
+
* Get the raw data of this object
|
134 |
+
* @returns object
|
135 |
+
*/
|
136 |
serialize() {
|
137 |
return this.data;
|
138 |
}
|
js/models/record.test.js
CHANGED
@@ -1,25 +1,64 @@
|
|
1 |
import { getTestRecord, getTestRecordError } from "../test-lib/test-records";
|
2 |
-
import Record from "./record";
|
3 |
|
4 |
|
5 |
const emptyRecord = new Record();
|
6 |
const defaultRecord = getTestRecord();
|
7 |
const errorRecord = getTestRecordError();
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
test('get error message', () => {
|
10 |
expect(emptyRecord.error()).toBe('');
|
11 |
expect(defaultRecord.error()).toBe('');
|
12 |
expect(errorRecord.error()).not.toBe('');
|
13 |
})
|
14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
test('localisation variants', () => {
|
16 |
expect(defaultRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
|
17 |
expect(defaultRecord.get_with_locales('country', ['de', 'en'])).toBe('Deutschland');
|
18 |
expect(defaultRecord.get_with_locales('country.names.de', ['de', 'en'])).toBe('Deutschland');
|
19 |
expect(defaultRecord.get_with_locales('country.names.en', ['de', 'en'])).toBe('Germany');
|
20 |
-
|
21 |
expect(defaultRecord.get_with_locales('most_specific_subdivision', ['de', 'en'])).toBe('Hessen');
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
});
|
24 |
|
25 |
test('localisation', () => {
|
@@ -27,9 +66,36 @@ test('localisation', () => {
|
|
27 |
expect(defaultRecord.get_with_locales('country.name', ['en', 'de'])).toBe('Germany');
|
28 |
expect(defaultRecord.get_with_locales('country.name', ['nn', 'mm', 'de', 'en'])).toBe('Deutschland');
|
29 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
|
31 |
test('country iso', () => {
|
32 |
expect(defaultRecord.get_country_iso()).toBe('de');
|
33 |
expect(emptyRecord.get_country_iso()).toBe('');
|
34 |
expect(errorRecord.get_country_iso()).toBe('');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
});
|
1 |
import { getTestRecord, getTestRecordError } from "../test-lib/test-records";
|
2 |
+
import Record, { camelToUnderscore } from "./record";
|
3 |
|
4 |
|
5 |
const emptyRecord = new Record();
|
6 |
const defaultRecord = getTestRecord();
|
7 |
const errorRecord = getTestRecordError();
|
8 |
|
9 |
+
test('serialize', () => {
|
10 |
+
const testData = {a: '1', c: { names: {de: 'b', en: 'a'} } };
|
11 |
+
const testRecord = new Record(testData)
|
12 |
+
expect(testRecord.serialize()).toStrictEqual(testData);
|
13 |
+
expect(testRecord.get_with_locales('c')).toBe('a');
|
14 |
+
expect(emptyRecord.serialize()).toStrictEqual({'is_empty': true});
|
15 |
+
});
|
16 |
+
|
17 |
test('get error message', () => {
|
18 |
expect(emptyRecord.error()).toBe('');
|
19 |
expect(defaultRecord.error()).toBe('');
|
20 |
expect(errorRecord.error()).not.toBe('');
|
21 |
})
|
22 |
|
23 |
+
test('get with default', () => {
|
24 |
+
expect(defaultRecord.get('')).toBe('');
|
25 |
+
expect(defaultRecord.get('', 'default')).toBe('default');
|
26 |
+
expect(defaultRecord.get('xyz', 'default')).toBe('default');
|
27 |
+
expect(defaultRecord.get('city.xyz', 'default')).toBe('default');
|
28 |
+
expect(defaultRecord.get('city', 'default')).toBe('Eschborn');
|
29 |
+
});
|
30 |
+
|
31 |
+
test('is_empty', () => {
|
32 |
+
expect(defaultRecord.get('is_empty', 'default')).toBe(false);
|
33 |
+
expect(emptyRecord.get('is_empty', 'default')).toBe(true);
|
34 |
+
expect(errorRecord.get('is_empty', 'default')).toBe(true);
|
35 |
+
|
36 |
+
expect(defaultRecord.is_empty()).toBe(false);
|
37 |
+
expect(emptyRecord.is_empty()).toBe(true);
|
38 |
+
expect(errorRecord.is_empty()).toBe(true);
|
39 |
+
})
|
40 |
+
|
41 |
test('localisation variants', () => {
|
42 |
expect(defaultRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
|
43 |
expect(defaultRecord.get_with_locales('country', ['de', 'en'])).toBe('Deutschland');
|
44 |
expect(defaultRecord.get_with_locales('country.names.de', ['de', 'en'])).toBe('Deutschland');
|
45 |
expect(defaultRecord.get_with_locales('country.names.en', ['de', 'en'])).toBe('Germany');
|
46 |
+
|
47 |
expect(defaultRecord.get_with_locales('most_specific_subdivision', ['de', 'en'])).toBe('Hessen');
|
48 |
+
|
49 |
+
const otherRecord = new Record({country: {name: 'Deutschland'}});
|
50 |
+
expect(otherRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
|
51 |
+
|
52 |
+
expect(defaultRecord.get_with_locales('extra', ['de', 'en'])).toBe('');
|
53 |
+
expect(defaultRecord.get_with_locales('xyz.name', ['de', 'en'])).toBe('');
|
54 |
+
expect(otherRecord.get_with_locales('city.name', ['de', 'en'])).toBe('');
|
55 |
+
|
56 |
+
expect(defaultRecord.get_with_locales('country.name', 'de')).toBe('Deutschland');
|
57 |
+
expect(defaultRecord.get_with_locales('country.name', [])).toBe('Germany');
|
58 |
+
expect(defaultRecord.get_with_locales('country.name', null)).toBe('Germany');
|
59 |
+
expect(defaultRecord.get_with_locales('country.name', undefined)).toBe('Germany');
|
60 |
+
expect(defaultRecord.get_with_locales('country.name')).toBe('Germany');
|
61 |
+
expect(defaultRecord.get('country.name')).toBe('Germany');
|
62 |
});
|
63 |
|
64 |
test('localisation', () => {
|
66 |
expect(defaultRecord.get_with_locales('country.name', ['en', 'de'])).toBe('Germany');
|
67 |
expect(defaultRecord.get_with_locales('country.name', ['nn', 'mm', 'de', 'en'])).toBe('Deutschland');
|
68 |
});
|
69 |
+
test('localisation with defaults', () => {
|
70 |
+
expect(defaultRecord.get_with_locales('unknownAttribute', ['en'], 'default')).toBe('default');
|
71 |
+
expect(defaultRecord.get_with_locales('country.name', ['xs'])).toBe('');
|
72 |
+
expect(defaultRecord.get_with_locales('country.name', ['xs'], 'default')).toBe('default');
|
73 |
+
});
|
74 |
+
|
75 |
+
test('camelCase', () => {
|
76 |
+
expect(camelToUnderscore('_specific_subdivision')).toBe('_specific_subdivision');
|
77 |
+
expect(camelToUnderscore('MostSpecificSubdivision')).toBe('most_specific_subdivision');
|
78 |
+
expect(camelToUnderscore('mostSpecificSubdivision')).toBe('most_specific_subdivision');
|
79 |
+
expect(camelToUnderscore('mostSpecificSubdivision.isoCode')).toBe('most_specific_subdivision.iso_code');
|
80 |
+
expect(camelToUnderscore('most_specific_subdivision')).toBe('most_specific_subdivision');
|
81 |
+
expect(camelToUnderscore('country.iso_code')).toBe('country.iso_code');
|
82 |
+
expect(camelToUnderscore('country.iso_code.0')).toBe('country.iso_code.0');
|
83 |
+
expect(camelToUnderscore('Country.IsoCode')).toBe('country.iso_code');
|
84 |
+
});
|
85 |
|
86 |
test('country iso', () => {
|
87 |
expect(defaultRecord.get_country_iso()).toBe('de');
|
88 |
expect(emptyRecord.get_country_iso()).toBe('');
|
89 |
expect(errorRecord.get_country_iso()).toBe('');
|
90 |
+
});
|
91 |
+
|
92 |
+
test('has_property', () => {
|
93 |
+
expect(defaultRecord.has_property('country')).toBe(true);
|
94 |
+
expect(emptyRecord.has_property('country')).toBe(false);
|
95 |
+
expect(defaultRecord.has_property('xyz')).toBe(false);
|
96 |
+
expect(defaultRecord.has_property('is_empty')).toBe(true);
|
97 |
+
expect(emptyRecord.has_property('is_empty')).toBe(true);
|
98 |
+
|
99 |
+
expect(defaultRecord.has_property('country.name')).toBe(true);
|
100 |
+
expect(emptyRecord.has_property('country')).toBe(false);
|
101 |
});
|
package.json
CHANGED
@@ -11,7 +11,7 @@
|
|
11 |
"build-lodash": "lodash include=get,intersection -o js/lodash.custom.js",
|
12 |
"start": "rm -rf js/dist && parcel parcel.urls --out-dir js/dist --public-url .",
|
13 |
"build": "rm -rf js/dist && parcel build parcel.urls --out-dir js/dist --public-url .",
|
14 |
-
"test": "jest"
|
15 |
},
|
16 |
"private": false,
|
17 |
"dependencies": {
|
@@ -19,16 +19,16 @@
|
|
19 |
"emoji-flags": ">=1.3.0"
|
20 |
},
|
21 |
"devDependencies": {
|
22 |
-
"@babel/core": "
|
23 |
-
"@babel/plugin-transform-runtime": "
|
24 |
-
"@babel/preset-env": "
|
25 |
-
"babel-jest": "
|
26 |
-
"babel-plugin-transform-class-properties": "
|
27 |
-
"eslint": "
|
28 |
-
"jest": "
|
29 |
-
"lodash-cli": "
|
30 |
-
"parcel-bundler": "
|
31 |
-
"parcel-plugin-assets-list": "
|
32 |
},
|
33 |
"resolutions": {
|
34 |
"node-forge": "0.10.0"
|
11 |
"build-lodash": "lodash include=get,intersection -o js/lodash.custom.js",
|
12 |
"start": "rm -rf js/dist && parcel parcel.urls --out-dir js/dist --public-url .",
|
13 |
"build": "rm -rf js/dist && parcel build parcel.urls --out-dir js/dist --public-url .",
|
14 |
+
"test": "jest --coverage"
|
15 |
},
|
16 |
"private": false,
|
17 |
"dependencies": {
|
19 |
"emoji-flags": ">=1.3.0"
|
20 |
},
|
21 |
"devDependencies": {
|
22 |
+
"@babel/core": "7.13.8",
|
23 |
+
"@babel/plugin-transform-runtime": "7.13.9",
|
24 |
+
"@babel/preset-env": "7.13.9",
|
25 |
+
"babel-jest": "26.6.3",
|
26 |
+
"babel-plugin-transform-class-properties": "6.24.1",
|
27 |
+
"eslint": "7.21.0",
|
28 |
+
"jest": "26.6.3",
|
29 |
+
"lodash-cli": "4.17.5",
|
30 |
+
"parcel-bundler": "1.12.4",
|
31 |
+
"parcel-plugin-assets-list": "1.7.1"
|
32 |
},
|
33 |
"resolutions": {
|
34 |
"node-forge": "0.10.0"
|
readme.txt
CHANGED
@@ -163,8 +163,15 @@ If you use Maxmind "Automatic download" then you need to upgrade to this plugin
|
|
163 |
|
164 |
== Changelog ==
|
165 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
= 4.0.1 =
|
167 |
-
* Revert Maxmind library to 2.10.0 for now as the most current version seems to be incompatible with Wordfence and other plugins using the older version of the Maxmind library
|
168 |
|
169 |
= 4.0.0 =
|
170 |
This version has many changes regarding the Shortcodes API. It is a major version because it increases some system requirements (see below).
|
163 |
|
164 |
== Changelog ==
|
165 |
|
166 |
+
|
167 |
+
= 4.1.0 =
|
168 |
+
* NEW: An `else` shortcode for `geoip_detect2_show_if` and `geoip_detect2_hide_if`: `[geoip_detect2_show_if city="Berlin"]Hallo Berlin![else]Not in Berlin[/geoip_detect2_show_if]`
|
169 |
+
* FIX: The JS for AJAX wasn't working for Safari browsers
|
170 |
+
* FIX: Improving some edge cases of `Record.get_with_locales()` and other methods of `Record` to be consistent with non-AJAX mode
|
171 |
+
* FIX: Revert more Maxmind libraries to fix incompatibility with WooCommerce
|
172 |
+
|
173 |
= 4.0.1 =
|
174 |
+
* FIX: Revert Maxmind library to 2.10.0 for now as the most current version seems to be incompatible with Wordfence and other plugins using the older version of the Maxmind library
|
175 |
|
176 |
= 4.0.0 =
|
177 |
This version has many changes regarding the Shortcodes API. It is a major version because it increases some system requirements (see below).
|
renovate.json
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"extends": [
|
3 |
+
"config:base"
|
4 |
+
],
|
5 |
+
"ignoreDeps": ["geoip2/geoip2", "maxmind-db/reader", "maxmind/web-service-common"],
|
6 |
+
"packageRules": [
|
7 |
+
{
|
8 |
+
"matchPackagePatterns": [
|
9 |
+
"eslint",
|
10 |
+
"jest"
|
11 |
+
],
|
12 |
+
"groupName": "testing (JS)",
|
13 |
+
"schedule": [
|
14 |
+
"before 2am on monday"
|
15 |
+
],
|
16 |
+
"automerge": true,
|
17 |
+
"automergeType": "branch"
|
18 |
+
},
|
19 |
+
{
|
20 |
+
"matchPackagePatterns": [
|
21 |
+
"phpunit",
|
22 |
+
"roots/wordpress"
|
23 |
+
],
|
24 |
+
"groupName": "testing (PHP)",
|
25 |
+
"schedule": [
|
26 |
+
"before 2am on monday"
|
27 |
+
],
|
28 |
+
"automerge": true,
|
29 |
+
"automergeType": "branch"
|
30 |
+
},
|
31 |
+
{
|
32 |
+
"matchPackagePatterns": [
|
33 |
+
"symfony"
|
34 |
+
],
|
35 |
+
"groupName": "symfony",
|
36 |
+
"schedule": [
|
37 |
+
"before 3am on the first day of the month"
|
38 |
+
],
|
39 |
+
"automerge": false
|
40 |
+
}
|
41 |
+
]
|
42 |
+
}
|
shortcodes/show_if.php
CHANGED
@@ -62,26 +62,42 @@
|
|
62 |
* Show TEXT if the visitor is from Berlin OR France (since 4.0.0)
|
63 |
* `[geoip_detect2_show_if city="Berlin" operator="or" country="France"]TEXT[/geoip_detect2_show_if]`
|
64 |
*
|
|
|
|
|
|
|
65 |
* LIMITATIONS:
|
66 |
* - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
|
67 |
* - City names can be ambigous. For example, [geoip_detect2_show_if country="US,FR" not_city="Paris"] will exclude both Paris in France and Paris in Texas, US. Instead, you can find out the geoname_id or seperate the shortcode to make it more specific.
|
68 |
* - Conditions can either be combined by AND or OR. It is not possible to write this condition within a shortcode: (city = Berlin AND country = Germany) OR country = France
|
69 |
*/
|
70 |
-
function geoip_detect2_shortcode_show_if($attr, $content =
|
71 |
$shortcode_options = _geoip_detect2_shortcode_options($attr);
|
72 |
$options = array('skipCache' => $shortcode_options['skip_cache']);
|
73 |
|
74 |
$showContentIfMatch = ($shortcodeName === 'geoip_detect2_show_if');
|
75 |
|
76 |
$attr = (array) $attr;
|
|
|
|
|
|
|
|
|
|
|
77 |
|
78 |
$parsed = geoip_detect2_shortcode_parse_conditions_from_attributes($attr, !$showContentIfMatch);
|
79 |
|
80 |
if (geoip_detect2_shortcode_is_ajax_mode($attr)) {
|
81 |
geoip_detect2_enqueue_javascript('shortcode');
|
|
|
82 |
$shortcode_options['parsed'] = $parsed;
|
83 |
-
$
|
84 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
} else {
|
86 |
$info = geoip_detect2_get_info_from_current_ip($shortcode_options['lang'], $options);
|
87 |
|
@@ -97,11 +113,12 @@ function geoip_detect2_shortcode_show_if($attr, $content = null, $shortcodeName
|
|
97 |
$info = apply_filters('geoip_detect2_shortcode_show_if_ip_info_override', $info, $attr, $showContentIfMatch);
|
98 |
|
99 |
$evaluated = geoip_detect2_shortcode_evaluate_conditions($parsed, $info);
|
100 |
-
|
101 |
if ($evaluated) {
|
102 |
-
return do_shortcode($
|
|
|
|
|
103 |
}
|
104 |
-
return '';
|
105 |
}
|
106 |
}
|
107 |
add_shortcode('geoip_detect2_show_if', 'geoip_detect2_shortcode_show_if');
|
@@ -130,9 +147,7 @@ function geoip_detect2_shortcode_parse_conditions_from_attributes(array $attr, b
|
|
130 |
$parsed = [
|
131 |
'op' => ( !empty($attr['operator']) && strtolower($attr['operator']) === 'or' ) ? 'or' : 'and',
|
132 |
];
|
133 |
-
|
134 |
-
$parsed['not'] = 1;
|
135 |
-
}
|
136 |
|
137 |
$conditions = [];
|
138 |
|
62 |
* Show TEXT if the visitor is from Berlin OR France (since 4.0.0)
|
63 |
* `[geoip_detect2_show_if city="Berlin" operator="or" country="France"]TEXT[/geoip_detect2_show_if]`
|
64 |
*
|
65 |
+
* Show TEXT if the visitor is from Berlin, otherwise show OTHER (since 4.1.0)
|
66 |
+
* `[geoip_detect2_show_if city="Berlin"]TEXT[else]OTHER[/geoip_detect2_show_if]`
|
67 |
+
*
|
68 |
* LIMITATIONS:
|
69 |
* - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
|
70 |
* - City names can be ambigous. For example, [geoip_detect2_show_if country="US,FR" not_city="Paris"] will exclude both Paris in France and Paris in Texas, US. Instead, you can find out the geoname_id or seperate the shortcode to make it more specific.
|
71 |
* - Conditions can either be combined by AND or OR. It is not possible to write this condition within a shortcode: (city = Berlin AND country = Germany) OR country = France
|
72 |
*/
|
73 |
+
function geoip_detect2_shortcode_show_if($attr, $content = '', $shortcodeName = '') {
|
74 |
$shortcode_options = _geoip_detect2_shortcode_options($attr);
|
75 |
$options = array('skipCache' => $shortcode_options['skip_cache']);
|
76 |
|
77 |
$showContentIfMatch = ($shortcodeName === 'geoip_detect2_show_if');
|
78 |
|
79 |
$attr = (array) $attr;
|
80 |
+
|
81 |
+
$else_seperator = apply_filters('geoip_detect2_shortcode_show_if_else_seperator', '[else]');
|
82 |
+
$parts = explode($else_seperator, $content, 2);
|
83 |
+
$content_if = $parts[0];
|
84 |
+
$content_else = isset($parts[1]) ? $parts[1] : '';
|
85 |
|
86 |
$parsed = geoip_detect2_shortcode_parse_conditions_from_attributes($attr, !$showContentIfMatch);
|
87 |
|
88 |
if (geoip_detect2_shortcode_is_ajax_mode($attr)) {
|
89 |
geoip_detect2_enqueue_javascript('shortcode');
|
90 |
+
|
91 |
$shortcode_options['parsed'] = $parsed;
|
92 |
+
$span_attributes = [ 'class' => 'js-geoip-detect-show-if', 'style' => 'display: none !important' ];
|
93 |
+
$span_tagname = 'span'; // TODO: Should be 'div' under certain cirumstances, to test
|
94 |
+
|
95 |
+
$span_if = _geoip_detect2_create_placeholder($span_tagname, $span_attributes, $shortcode_options, do_shortcode($content_if));
|
96 |
+
|
97 |
+
$shortcode_options['parsed']['not'] = ($shortcode_options['parsed']['not'] === 1 ? 0 : 1); // negate
|
98 |
+
$span_else = _geoip_detect2_create_placeholder($span_tagname, $span_attributes, $shortcode_options, do_shortcode($content_else));
|
99 |
+
|
100 |
+
return $span_if . $span_else;
|
101 |
} else {
|
102 |
$info = geoip_detect2_get_info_from_current_ip($shortcode_options['lang'], $options);
|
103 |
|
113 |
$info = apply_filters('geoip_detect2_shortcode_show_if_ip_info_override', $info, $attr, $showContentIfMatch);
|
114 |
|
115 |
$evaluated = geoip_detect2_shortcode_evaluate_conditions($parsed, $info);
|
116 |
+
|
117 |
if ($evaluated) {
|
118 |
+
return do_shortcode($content_if);
|
119 |
+
} else {
|
120 |
+
return do_shortcode($content_else);
|
121 |
}
|
|
|
122 |
}
|
123 |
}
|
124 |
add_shortcode('geoip_detect2_show_if', 'geoip_detect2_shortcode_show_if');
|
147 |
$parsed = [
|
148 |
'op' => ( !empty($attr['operator']) && strtolower($attr['operator']) === 'or' ) ? 'or' : 'and',
|
149 |
];
|
150 |
+
$parsed['not'] = $hide_if ? 1 : 0;
|
|
|
|
|
151 |
|
152 |
$conditions = [];
|
153 |
|
vendor/composer/autoload_classmap.php
CHANGED
@@ -160,7 +160,6 @@ return array(
|
|
160 |
'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php',
|
161 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php',
|
162 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php',
|
163 |
-
'Symfony\\Component\\PropertyAccess\\StringUtil' => $vendorDir . '/symfony/property-access/StringUtil.php',
|
164 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
|
165 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
|
166 |
'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => $vendorDir . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
|
160 |
'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php',
|
161 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php',
|
162 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php',
|
|
|
163 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
|
164 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
|
165 |
'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => $vendorDir . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
|
vendor/composer/autoload_static.php
CHANGED
@@ -259,7 +259,6 @@ class ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107
|
|
259 |
'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php',
|
260 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php',
|
261 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php',
|
262 |
-
'Symfony\\Component\\PropertyAccess\\StringUtil' => __DIR__ . '/..' . '/symfony/property-access/StringUtil.php',
|
263 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
|
264 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
|
265 |
'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
|
259 |
'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php',
|
260 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php',
|
261 |
'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php',
|
|
|
262 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
|
263 |
'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
|
264 |
'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
|
vendor/composer/installed.json
CHANGED
@@ -115,31 +115,30 @@
|
|
115 |
},
|
116 |
{
|
117 |
"name": "maxmind-db/reader",
|
118 |
-
"version": "v1.
|
119 |
-
"version_normalized": "1.
|
120 |
"source": {
|
121 |
"type": "git",
|
122 |
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
|
123 |
-
"reference": "
|
124 |
},
|
125 |
"dist": {
|
126 |
"type": "zip",
|
127 |
-
"url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/
|
128 |
-
"reference": "
|
129 |
"shasum": ""
|
130 |
},
|
131 |
"require": {
|
132 |
-
"php": ">=
|
133 |
},
|
134 |
"conflict": {
|
135 |
-
"ext-maxminddb": "<1.
|
136 |
},
|
137 |
"require-dev": {
|
138 |
-
"friendsofphp/php-cs-fixer": "
|
139 |
"php-coveralls/php-coveralls": "^2.1",
|
140 |
-
"
|
141 |
-
"phpunit/
|
142 |
-
"phpunit/phpunit": ">=8.0.0,<10.0.0",
|
143 |
"squizlabs/php_codesniffer": "3.*"
|
144 |
},
|
145 |
"suggest": {
|
@@ -147,7 +146,7 @@
|
|
147 |
"ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
|
148 |
"ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
|
149 |
},
|
150 |
-
"time": "
|
151 |
"type": "library",
|
152 |
"installation-source": "dist",
|
153 |
"autoload": {
|
@@ -178,31 +177,31 @@
|
|
178 |
},
|
179 |
{
|
180 |
"name": "maxmind/web-service-common",
|
181 |
-
"version": "v0.
|
182 |
-
"version_normalized": "0.
|
183 |
"source": {
|
184 |
"type": "git",
|
185 |
"url": "https://github.com/maxmind/web-service-common-php.git",
|
186 |
-
"reference": "
|
187 |
},
|
188 |
"dist": {
|
189 |
"type": "zip",
|
190 |
-
"url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/
|
191 |
-
"reference": "
|
192 |
"shasum": ""
|
193 |
},
|
194 |
"require": {
|
195 |
"composer/ca-bundle": "^1.0.3",
|
196 |
"ext-curl": "*",
|
197 |
"ext-json": "*",
|
198 |
-
"php": ">=
|
199 |
},
|
200 |
"require-dev": {
|
201 |
"friendsofphp/php-cs-fixer": "2.*",
|
202 |
-
"phpunit/phpunit": "^8.
|
203 |
"squizlabs/php_codesniffer": "3.*"
|
204 |
},
|
205 |
-
"time": "2020-
|
206 |
"type": "library",
|
207 |
"installation-source": "dist",
|
208 |
"autoload": {
|
@@ -278,17 +277,17 @@
|
|
278 |
},
|
279 |
{
|
280 |
"name": "symfony/http-foundation",
|
281 |
-
"version": "v5.2.
|
282 |
-
"version_normalized": "5.2.
|
283 |
"source": {
|
284 |
"type": "git",
|
285 |
"url": "https://github.com/symfony/http-foundation.git",
|
286 |
-
"reference": "
|
287 |
},
|
288 |
"dist": {
|
289 |
"type": "zip",
|
290 |
-
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/
|
291 |
-
"reference": "
|
292 |
"shasum": ""
|
293 |
},
|
294 |
"require": {
|
@@ -306,7 +305,7 @@
|
|
306 |
"suggest": {
|
307 |
"symfony/mime": "To use the file extension guesser"
|
308 |
},
|
309 |
-
"time": "2021-02-
|
310 |
"type": "library",
|
311 |
"installation-source": "dist",
|
312 |
"autoload": {
|
@@ -668,8 +667,8 @@
|
|
668 |
},
|
669 |
{
|
670 |
"name": "symfony/property-access",
|
671 |
-
"version": "v5.2.
|
672 |
-
"version_normalized": "5.2.
|
673 |
"source": {
|
674 |
"type": "git",
|
675 |
"url": "https://github.com/symfony/property-access.git",
|
@@ -734,17 +733,17 @@
|
|
734 |
},
|
735 |
{
|
736 |
"name": "symfony/property-info",
|
737 |
-
"version": "v5.2.
|
738 |
-
"version_normalized": "5.2.
|
739 |
"source": {
|
740 |
"type": "git",
|
741 |
"url": "https://github.com/symfony/property-info.git",
|
742 |
-
"reference": "
|
743 |
},
|
744 |
"dist": {
|
745 |
"type": "zip",
|
746 |
-
"url": "https://api.github.com/repos/symfony/property-info/zipball/
|
747 |
-
"reference": "
|
748 |
"shasum": ""
|
749 |
},
|
750 |
"require": {
|
@@ -771,7 +770,7 @@
|
|
771 |
"symfony/doctrine-bridge": "To use Doctrine metadata",
|
772 |
"symfony/serializer": "To use Serializer metadata"
|
773 |
},
|
774 |
-
"time": "2021-
|
775 |
"type": "library",
|
776 |
"installation-source": "dist",
|
777 |
"autoload": {
|
@@ -809,17 +808,17 @@
|
|
809 |
},
|
810 |
{
|
811 |
"name": "symfony/string",
|
812 |
-
"version": "v5.2.
|
813 |
-
"version_normalized": "5.2.
|
814 |
"source": {
|
815 |
"type": "git",
|
816 |
"url": "https://github.com/symfony/string.git",
|
817 |
-
"reference": "
|
818 |
},
|
819 |
"dist": {
|
820 |
"type": "zip",
|
821 |
-
"url": "https://api.github.com/repos/symfony/string/zipball/
|
822 |
-
"reference": "
|
823 |
"shasum": ""
|
824 |
},
|
825 |
"require": {
|
@@ -836,7 +835,7 @@
|
|
836 |
"symfony/translation-contracts": "^1.1|^2",
|
837 |
"symfony/var-exporter": "^4.4|^5.0"
|
838 |
},
|
839 |
-
"time": "2021-
|
840 |
"type": "library",
|
841 |
"installation-source": "dist",
|
842 |
"autoload": {
|
115 |
},
|
116 |
{
|
117 |
"name": "maxmind-db/reader",
|
118 |
+
"version": "v1.6.0",
|
119 |
+
"version_normalized": "1.6.0.0",
|
120 |
"source": {
|
121 |
"type": "git",
|
122 |
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
|
123 |
+
"reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4"
|
124 |
},
|
125 |
"dist": {
|
126 |
"type": "zip",
|
127 |
+
"url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/febd4920bf17c1da84cef58e56a8227dfb37fbe4",
|
128 |
+
"reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4",
|
129 |
"shasum": ""
|
130 |
},
|
131 |
"require": {
|
132 |
+
"php": ">=5.6"
|
133 |
},
|
134 |
"conflict": {
|
135 |
+
"ext-maxminddb": "<1.6.0,>=2.0.0"
|
136 |
},
|
137 |
"require-dev": {
|
138 |
+
"friendsofphp/php-cs-fixer": "2.*",
|
139 |
"php-coveralls/php-coveralls": "^2.1",
|
140 |
+
"phpunit/phpcov": "^3.0",
|
141 |
+
"phpunit/phpunit": "5.*",
|
|
|
142 |
"squizlabs/php_codesniffer": "3.*"
|
143 |
},
|
144 |
"suggest": {
|
146 |
"ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
|
147 |
"ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
|
148 |
},
|
149 |
+
"time": "2019-12-19T22:59:03+00:00",
|
150 |
"type": "library",
|
151 |
"installation-source": "dist",
|
152 |
"autoload": {
|
177 |
},
|
178 |
{
|
179 |
"name": "maxmind/web-service-common",
|
180 |
+
"version": "v0.7.0",
|
181 |
+
"version_normalized": "0.7.0.0",
|
182 |
"source": {
|
183 |
"type": "git",
|
184 |
"url": "https://github.com/maxmind/web-service-common-php.git",
|
185 |
+
"reference": "74c996c218ada5c639c8c2f076756e059f5552fc"
|
186 |
},
|
187 |
"dist": {
|
188 |
"type": "zip",
|
189 |
+
"url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc",
|
190 |
+
"reference": "74c996c218ada5c639c8c2f076756e059f5552fc",
|
191 |
"shasum": ""
|
192 |
},
|
193 |
"require": {
|
194 |
"composer/ca-bundle": "^1.0.3",
|
195 |
"ext-curl": "*",
|
196 |
"ext-json": "*",
|
197 |
+
"php": ">=5.6"
|
198 |
},
|
199 |
"require-dev": {
|
200 |
"friendsofphp/php-cs-fixer": "2.*",
|
201 |
+
"phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
|
202 |
"squizlabs/php_codesniffer": "3.*"
|
203 |
},
|
204 |
+
"time": "2020-05-06T14:07:26+00:00",
|
205 |
"type": "library",
|
206 |
"installation-source": "dist",
|
207 |
"autoload": {
|
277 |
},
|
278 |
{
|
279 |
"name": "symfony/http-foundation",
|
280 |
+
"version": "v5.2.4",
|
281 |
+
"version_normalized": "5.2.4.0",
|
282 |
"source": {
|
283 |
"type": "git",
|
284 |
"url": "https://github.com/symfony/http-foundation.git",
|
285 |
+
"reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf"
|
286 |
},
|
287 |
"dist": {
|
288 |
"type": "zip",
|
289 |
+
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf",
|
290 |
+
"reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf",
|
291 |
"shasum": ""
|
292 |
},
|
293 |
"require": {
|
305 |
"suggest": {
|
306 |
"symfony/mime": "To use the file extension guesser"
|
307 |
},
|
308 |
+
"time": "2021-02-25T17:16:57+00:00",
|
309 |
"type": "library",
|
310 |
"installation-source": "dist",
|
311 |
"autoload": {
|
667 |
},
|
668 |
{
|
669 |
"name": "symfony/property-access",
|
670 |
+
"version": "v5.2.4",
|
671 |
+
"version_normalized": "5.2.4.0",
|
672 |
"source": {
|
673 |
"type": "git",
|
674 |
"url": "https://github.com/symfony/property-access.git",
|
733 |
},
|
734 |
{
|
735 |
"name": "symfony/property-info",
|
736 |
+
"version": "v5.2.4",
|
737 |
+
"version_normalized": "5.2.4.0",
|
738 |
"source": {
|
739 |
"type": "git",
|
740 |
"url": "https://github.com/symfony/property-info.git",
|
741 |
+
"reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189"
|
742 |
},
|
743 |
"dist": {
|
744 |
"type": "zip",
|
745 |
+
"url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
|
746 |
+
"reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
|
747 |
"shasum": ""
|
748 |
},
|
749 |
"require": {
|
770 |
"symfony/doctrine-bridge": "To use Doctrine metadata",
|
771 |
"symfony/serializer": "To use Serializer metadata"
|
772 |
},
|
773 |
+
"time": "2021-02-17T15:24:54+00:00",
|
774 |
"type": "library",
|
775 |
"installation-source": "dist",
|
776 |
"autoload": {
|
808 |
},
|
809 |
{
|
810 |
"name": "symfony/string",
|
811 |
+
"version": "v5.2.4",
|
812 |
+
"version_normalized": "5.2.4.0",
|
813 |
"source": {
|
814 |
"type": "git",
|
815 |
"url": "https://github.com/symfony/string.git",
|
816 |
+
"reference": "4e78d7d47061fa183639927ec40d607973699609"
|
817 |
},
|
818 |
"dist": {
|
819 |
"type": "zip",
|
820 |
+
"url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609",
|
821 |
+
"reference": "4e78d7d47061fa183639927ec40d607973699609",
|
822 |
"shasum": ""
|
823 |
},
|
824 |
"require": {
|
835 |
"symfony/translation-contracts": "^1.1|^2",
|
836 |
"symfony/var-exporter": "^4.4|^5.0"
|
837 |
},
|
838 |
+
"time": "2021-02-16T10:20:28+00:00",
|
839 |
"type": "library",
|
840 |
"installation-source": "dist",
|
841 |
"autoload": {
|
vendor/maxmind-db/reader/CHANGELOG.md
CHANGED
@@ -1,41 +1,6 @@
|
|
1 |
CHANGELOG
|
2 |
=========
|
3 |
|
4 |
-
1.10.0 (2021-02-09)
|
5 |
-
-------------------
|
6 |
-
|
7 |
-
* When using the pure PHP reader, unsigned integers up to PHP_MAX_INT
|
8 |
-
will now be integers in PHP rather than strings. Previously integers
|
9 |
-
greater than 2^24 on 32-bit platforms and 2^56 on 64-bit platforms
|
10 |
-
would be strings due to the use of `gmp` or `bcmath` to decode them.
|
11 |
-
Reported by Alejandro Celaya. GitHub #119.
|
12 |
-
|
13 |
-
1.9.0 (2021-01-07)
|
14 |
-
------------------
|
15 |
-
|
16 |
-
* The `maxminddb` extension is now buildable on Windows. Pull request
|
17 |
-
by Jan Ehrhardt. GitHub #115.
|
18 |
-
|
19 |
-
1.8.0 (2020-10-01)
|
20 |
-
------------------
|
21 |
-
|
22 |
-
* Fixes for PHP 8.0. Pull Request by Remi Collet. GitHub #108.
|
23 |
-
|
24 |
-
1.7.0 (2020-08-07)
|
25 |
-
------------------
|
26 |
-
|
27 |
-
* IMPORTANT: PHP 7.2 or greater is now required.
|
28 |
-
* The extension no longer depends on the pure PHP classes in
|
29 |
-
`maxmind-db/reader`. You can use it independently.
|
30 |
-
* Type hints have been added to both the pure PHP implementation
|
31 |
-
and the extension.
|
32 |
-
* The `metadata` method on the reader now returns a new copy of the
|
33 |
-
metadata object rather than the actual object used by the reader.
|
34 |
-
* Work around PHP `is_readable()` bug. Reported by Ben Roberts. GitHub
|
35 |
-
#92.
|
36 |
-
* This is the first release of the extension as a PECL package.
|
37 |
-
GitHub #34.
|
38 |
-
|
39 |
1.6.0 (2019-12-19)
|
40 |
------------------
|
41 |
|
1 |
CHANGELOG
|
2 |
=========
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
1.6.0 (2019-12-19)
|
5 |
------------------
|
6 |
|
vendor/maxmind-db/reader/README.md
CHANGED
@@ -112,16 +112,9 @@ you are using an autoloader, no changes to your code should be necessary.
|
|
112 |
|
113 |
First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
|
114 |
described in its [README.md
|
115 |
-
file](https://github.com/maxmind/libmaxminddb/blob/
|
116 |
-
After successfully installing libmaxmindb,
|
117 |
-
|
118 |
-
|
119 |
-
```
|
120 |
-
pecl install maxminddb
|
121 |
-
```
|
122 |
-
|
123 |
-
Alternatively, you may install it from the source. To do so, run the following
|
124 |
-
commands from the top-level directory of this distribution:
|
125 |
|
126 |
```
|
127 |
cd ext
|
@@ -164,7 +157,7 @@ client API, please see [our support page](https://www.maxmind.com/en/support).
|
|
164 |
|
165 |
## Requirements ##
|
166 |
|
167 |
-
This library requires PHP
|
168 |
|
169 |
The GMP or BCMath extension may be required to read some databases
|
170 |
using the pure PHP API.
|
@@ -180,6 +173,6 @@ The MaxMind DB Reader PHP API uses [Semantic Versioning](https://semver.org/).
|
|
180 |
|
181 |
## Copyright and License ##
|
182 |
|
183 |
-
This software is Copyright (c) 2014-
|
184 |
|
185 |
This is free software, licensed under the Apache License, Version 2.0.
|
112 |
|
113 |
First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
|
114 |
described in its [README.md
|
115 |
+
file](https://github.com/maxmind/libmaxminddb/blob/master/README.md#installing-from-a-tarball).
|
116 |
+
After successfully installing libmaxmindb, run the following commands from the
|
117 |
+
top-level directory of this distribution:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
118 |
|
119 |
```
|
120 |
cd ext
|
157 |
|
158 |
## Requirements ##
|
159 |
|
160 |
+
This library requires PHP 5.6 or greater.
|
161 |
|
162 |
The GMP or BCMath extension may be required to read some databases
|
163 |
using the pure PHP API.
|
173 |
|
174 |
## Copyright and License ##
|
175 |
|
176 |
+
This software is Copyright (c) 2014-2019 by MaxMind, Inc.
|
177 |
|
178 |
This is free software, licensed under the Apache License, Version 2.0.
|
vendor/maxmind-db/reader/autoload.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
/**
|
6 |
* PSR-4 autoloader implementation for the MaxMind\DB namespace.
|
7 |
* First we define the 'mmdb_autoload' function, and then we register
|
@@ -16,7 +14,7 @@ declare(strict_types=1);
|
|
16 |
* @param string $class
|
17 |
* the name of the class to load
|
18 |
*/
|
19 |
-
function mmdb_autoload($class)
|
20 |
{
|
21 |
/*
|
22 |
* A project-specific mapping between the namespaces and where
|
@@ -28,16 +26,16 @@ function mmdb_autoload($class): void
|
|
28 |
$namespace_map = ['MaxMind\\Db\\' => __DIR__ . '/src/MaxMind/Db/'];
|
29 |
|
30 |
foreach ($namespace_map as $prefix => $dir) {
|
31 |
-
|
32 |
$path = str_replace($prefix, $dir, $class);
|
33 |
|
34 |
-
|
35 |
$path = str_replace('\\', '/', $path);
|
36 |
|
37 |
-
|
38 |
$path = $path . '.php';
|
39 |
|
40 |
-
|
41 |
if (file_exists($path)) {
|
42 |
include $path;
|
43 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
/**
|
4 |
* PSR-4 autoloader implementation for the MaxMind\DB namespace.
|
5 |
* First we define the 'mmdb_autoload' function, and then we register
|
14 |
* @param string $class
|
15 |
* the name of the class to load
|
16 |
*/
|
17 |
+
function mmdb_autoload($class)
|
18 |
{
|
19 |
/*
|
20 |
* A project-specific mapping between the namespaces and where
|
26 |
$namespace_map = ['MaxMind\\Db\\' => __DIR__ . '/src/MaxMind/Db/'];
|
27 |
|
28 |
foreach ($namespace_map as $prefix => $dir) {
|
29 |
+
/* First swap out the namespace prefix with a directory... */
|
30 |
$path = str_replace($prefix, $dir, $class);
|
31 |
|
32 |
+
/* replace the namespace separator with a directory separator... */
|
33 |
$path = str_replace('\\', '/', $path);
|
34 |
|
35 |
+
/* and finally, add the PHP file extension to the result. */
|
36 |
$path = $path . '.php';
|
37 |
|
38 |
+
/* $path should now contain the path to a PHP file defining $class */
|
39 |
if (file_exists($path)) {
|
40 |
include $path;
|
41 |
}
|
vendor/maxmind-db/reader/composer.json
CHANGED
@@ -13,7 +13,7 @@
|
|
13 |
}
|
14 |
],
|
15 |
"require": {
|
16 |
-
"php": ">=
|
17 |
},
|
18 |
"suggest": {
|
19 |
"ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
|
@@ -21,15 +21,14 @@
|
|
21 |
"ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
|
22 |
},
|
23 |
"conflict": {
|
24 |
-
"ext-maxminddb": "<1.
|
25 |
},
|
26 |
"require-dev": {
|
27 |
-
"friendsofphp/php-cs-fixer": "
|
28 |
-
"phpunit/phpunit": "
|
29 |
"php-coveralls/php-coveralls": "^2.1",
|
30 |
-
"phpunit/phpcov": "
|
31 |
-
"squizlabs/php_codesniffer": "3.*"
|
32 |
-
"phpstan/phpstan": "*"
|
33 |
},
|
34 |
"autoload": {
|
35 |
"psr-4": {
|
13 |
}
|
14 |
],
|
15 |
"require": {
|
16 |
+
"php": ">=5.6"
|
17 |
},
|
18 |
"suggest": {
|
19 |
"ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
|
21 |
"ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
|
22 |
},
|
23 |
"conflict": {
|
24 |
+
"ext-maxminddb": "<1.6.0,>=2.0.0"
|
25 |
},
|
26 |
"require-dev": {
|
27 |
+
"friendsofphp/php-cs-fixer": "2.*",
|
28 |
+
"phpunit/phpunit": "5.*",
|
29 |
"php-coveralls/php-coveralls": "^2.1",
|
30 |
+
"phpunit/phpcov": "^3.0",
|
31 |
+
"squizlabs/php_codesniffer": "3.*"
|
|
|
32 |
},
|
33 |
"autoload": {
|
34 |
"psr-4": {
|
vendor/maxmind-db/reader/ext/maxminddb.c
CHANGED
@@ -21,8 +21,6 @@
|
|
21 |
#include <zend.h>
|
22 |
|
23 |
#include "Zend/zend_exceptions.h"
|
24 |
-
#include "Zend/zend_types.h"
|
25 |
-
#include "ext/spl/spl_exceptions.h"
|
26 |
#include "ext/standard/info.h"
|
27 |
#include <maxminddb.h>
|
28 |
|
@@ -35,44 +33,49 @@
|
|
35 |
|
36 |
#define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
|
37 |
#define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
|
38 |
-
#define PHP_MAXMINDDB_METADATA_NS \
|
39 |
-
ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata")
|
40 |
#define PHP_MAXMINDDB_READER_EX_NS \
|
41 |
ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "InvalidDatabaseException")
|
42 |
|
|
|
43 |
#define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
|
|
|
|
|
44 |
typedef size_t strsize_t;
|
45 |
typedef zend_object free_obj_t;
|
46 |
-
|
47 |
-
/* For PHP 8 compatibility */
|
48 |
-
#if PHP_VERSION_ID < 80000
|
49 |
-
|
50 |
-
#define PROP_OBJ(zv) (zv)
|
51 |
-
|
52 |
#else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
|
54 |
-
|
55 |
-
|
56 |
#define TSRMLS_C
|
|
|
|
|
57 |
#define TSRMLS_CC
|
|
|
|
|
58 |
#define TSRMLS_DC
|
59 |
-
|
60 |
-
/* End PHP 8 compatibility */
|
61 |
#endif
|
62 |
-
|
63 |
#ifndef ZEND_ACC_CTOR
|
64 |
#define ZEND_ACC_CTOR 0
|
65 |
#endif
|
66 |
|
67 |
-
|
68 |
-
#ifndef IS_MIXED
|
69 |
-
#define IS_MIXED IS_UNDEF
|
70 |
-
#endif
|
71 |
-
|
72 |
typedef struct _maxminddb_obj {
|
73 |
MMDB_s *mmdb;
|
74 |
zend_object std;
|
75 |
} maxminddb_obj;
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
|
77 |
PHP_FUNCTION(maxminddb);
|
78 |
|
@@ -93,6 +96,7 @@ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
|
|
93 |
zval *z_value TSRMLS_DC);
|
94 |
static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
|
95 |
zval *z_value TSRMLS_DC);
|
|
|
96 |
|
97 |
#define CHECK_ALLOCATED(val) \
|
98 |
if (!val) { \
|
@@ -100,16 +104,38 @@ static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
|
|
100 |
return; \
|
101 |
}
|
102 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
103 |
static zend_object_handlers maxminddb_obj_handlers;
|
104 |
-
static zend_class_entry *maxminddb_ce
|
105 |
|
106 |
static inline maxminddb_obj *
|
107 |
php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) {
|
|
|
108 |
return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std));
|
|
|
|
|
|
|
109 |
}
|
110 |
|
111 |
-
ZEND_BEGIN_ARG_INFO_EX(
|
112 |
-
|
113 |
ZEND_END_ARG_INFO()
|
114 |
|
115 |
PHP_METHOD(MaxMind_Db_Reader, __construct) {
|
@@ -124,16 +150,16 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
|
|
124 |
maxminddb_ce,
|
125 |
&db_file,
|
126 |
&name_len) == FAILURE) {
|
|
|
|
|
127 |
return;
|
128 |
}
|
129 |
|
130 |
if (0 != php_check_open_basedir(db_file TSRMLS_CC) ||
|
131 |
0 != access(db_file, R_OK)) {
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
"The file \"%s\" does not exist or is not readable.",
|
136 |
-
db_file);
|
137 |
return;
|
138 |
}
|
139 |
|
@@ -141,12 +167,10 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
|
|
141 |
uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
|
142 |
|
143 |
if (MMDB_SUCCESS != status) {
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
"MaxMind DB file?",
|
149 |
-
db_file);
|
150 |
efree(mmdb);
|
151 |
return;
|
152 |
}
|
@@ -155,9 +179,8 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
|
|
155 |
mmdb_obj->mmdb = mmdb;
|
156 |
}
|
157 |
|
158 |
-
|
159 |
-
|
160 |
-
ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)
|
161 |
ZEND_END_ARG_INFO()
|
162 |
|
163 |
PHP_METHOD(MaxMind_Db_Reader, get) {
|
@@ -165,41 +188,45 @@ PHP_METHOD(MaxMind_Db_Reader, get) {
|
|
165 |
get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len);
|
166 |
}
|
167 |
|
168 |
-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(
|
169 |
-
arginfo_maxminddbreader_getWithPrefixLen, 0, 1, IS_ARRAY, 1)
|
170 |
-
ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)
|
171 |
-
ZEND_END_ARG_INFO()
|
172 |
-
|
173 |
PHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) {
|
174 |
-
zval record, z_prefix_len;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
|
176 |
int prefix_len = 0;
|
177 |
-
if (get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU,
|
178 |
-
FAILURE) {
|
179 |
return;
|
180 |
}
|
181 |
|
182 |
array_init(return_value);
|
183 |
-
add_next_index_zval(return_value,
|
184 |
|
185 |
-
ZVAL_LONG(
|
186 |
-
add_next_index_zval(return_value,
|
187 |
}
|
188 |
|
189 |
static int
|
190 |
get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
|
191 |
char *ip_address = NULL;
|
192 |
strsize_t name_len;
|
193 |
-
zval *
|
194 |
|
195 |
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
|
196 |
getThis(),
|
197 |
"Os",
|
198 |
-
&
|
199 |
maxminddb_ce,
|
200 |
&ip_address,
|
201 |
&name_len) == FAILURE) {
|
202 |
-
|
|
|
|
|
203 |
}
|
204 |
|
205 |
const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
|
@@ -207,33 +234,30 @@ get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
|
|
207 |
MMDB_s *mmdb = mmdb_obj->mmdb;
|
208 |
|
209 |
if (NULL == mmdb) {
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
return FAILURE;
|
214 |
}
|
215 |
|
216 |
struct addrinfo hints = {
|
217 |
.ai_family = AF_UNSPEC,
|
218 |
.ai_flags = AI_NUMERICHOST,
|
219 |
-
|
220 |
.ai_socktype = SOCK_STREAM};
|
221 |
|
222 |
struct addrinfo *addresses = NULL;
|
223 |
int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses);
|
224 |
if (gai_status) {
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
return FAILURE;
|
230 |
}
|
231 |
if (!addresses || !addresses->ai_addr) {
|
232 |
-
|
233 |
-
|
234 |
-
0 TSRMLS_CC,
|
235 |
"getaddrinfo was successful but failed to set the addrinfo");
|
236 |
-
return
|
237 |
}
|
238 |
|
239 |
int sa_family = addresses->ai_addr->sa_family;
|
@@ -245,127 +269,132 @@ get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
|
|
245 |
freeaddrinfo(addresses);
|
246 |
|
247 |
if (MMDB_SUCCESS != mmdb_error) {
|
248 |
-
|
249 |
if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
|
250 |
-
|
251 |
} else {
|
252 |
-
|
253 |
}
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
return FAILURE;
|
260 |
}
|
261 |
|
262 |
*prefix_len = result.netmask;
|
263 |
|
264 |
if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) {
|
265 |
-
|
266 |
-
|
267 |
*prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0;
|
268 |
}
|
269 |
|
270 |
if (!result.found_entry) {
|
271 |
ZVAL_NULL(record);
|
272 |
-
return
|
273 |
}
|
274 |
|
275 |
MMDB_entry_data_list_s *entry_data_list = NULL;
|
276 |
int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
|
277 |
|
278 |
if (MMDB_SUCCESS != status) {
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
MMDB_strerror(status));
|
284 |
MMDB_free_entry_data_list(entry_data_list);
|
285 |
-
return
|
286 |
} else if (NULL == entry_data_list) {
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
ip_address);
|
293 |
-
return FAILURE;
|
294 |
}
|
295 |
|
296 |
-
|
297 |
-
handle_entry_data_list(entry_data_list, record TSRMLS_CC);
|
298 |
-
if (rv == NULL) {
|
299 |
-
/* We should have already thrown the exception in handle_entry_data_list
|
300 |
-
*/
|
301 |
-
return FAILURE;
|
302 |
-
}
|
303 |
MMDB_free_entry_data_list(entry_data_list);
|
304 |
-
return
|
305 |
}
|
306 |
|
307 |
-
ZEND_BEGIN_ARG_INFO_EX(
|
308 |
ZEND_END_ARG_INFO()
|
309 |
|
310 |
PHP_METHOD(MaxMind_Db_Reader, metadata) {
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
getThis(),
|
315 |
-
"O",
|
316 |
-
&this_zval,
|
317 |
-
maxminddb_ce) == FAILURE) {
|
318 |
return;
|
319 |
}
|
320 |
|
321 |
const maxminddb_obj *const mmdb_obj =
|
322 |
-
(maxminddb_obj *)Z_MAXMINDDB_P(
|
323 |
|
324 |
if (NULL == mmdb_obj->mmdb) {
|
325 |
-
|
326 |
-
|
327 |
-
"Attempt to read from a closed MaxMind DB.");
|
328 |
return;
|
329 |
}
|
330 |
|
|
|
|
|
|
|
331 |
object_init_ex(return_value, metadata_ce);
|
332 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
333 |
MMDB_entry_data_list_s *entry_data_list;
|
334 |
MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
|
335 |
|
336 |
-
|
337 |
-
const MMDB_entry_data_list_s *rv =
|
338 |
-
handle_entry_data_list(entry_data_list, &metadata_array TSRMLS_CC);
|
339 |
-
if (rv == NULL) {
|
340 |
-
return;
|
341 |
-
}
|
342 |
MMDB_free_entry_data_list(entry_data_list);
|
343 |
-
|
|
|
344 |
metadata_ce,
|
345 |
&metadata_ce->constructor,
|
346 |
ZEND_CONSTRUCTOR_FUNC_NAME,
|
347 |
NULL,
|
348 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
349 |
zval_ptr_dtor(&metadata_array);
|
|
|
350 |
}
|
351 |
|
352 |
PHP_METHOD(MaxMind_Db_Reader, close) {
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
getThis(),
|
357 |
-
"O",
|
358 |
-
&this_zval,
|
359 |
-
maxminddb_ce) == FAILURE) {
|
360 |
return;
|
361 |
}
|
362 |
|
363 |
-
maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(
|
364 |
|
365 |
if (NULL == mmdb_obj->mmdb) {
|
366 |
-
|
367 |
-
|
368 |
-
"Attempt to close a closed MaxMind DB.");
|
369 |
return;
|
370 |
}
|
371 |
MMDB_close(mmdb_obj->mmdb);
|
@@ -382,14 +411,14 @@ handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
|
|
382 |
case MMDB_DATA_TYPE_ARRAY:
|
383 |
return handle_array(entry_data_list, z_value TSRMLS_CC);
|
384 |
case MMDB_DATA_TYPE_UTF8_STRING:
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
break;
|
389 |
case MMDB_DATA_TYPE_BYTES:
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
break;
|
394 |
case MMDB_DATA_TYPE_DOUBLE:
|
395 |
ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
|
@@ -416,10 +445,9 @@ handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
|
|
416 |
ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
|
417 |
break;
|
418 |
default:
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
entry_data_list->entry_data.type);
|
423 |
return NULL;
|
424 |
}
|
425 |
return entry_data_list;
|
@@ -431,26 +459,30 @@ handle_map(const MMDB_entry_data_list_s *entry_data_list,
|
|
431 |
array_init(z_value);
|
432 |
const uint32_t map_size = entry_data_list->entry_data.data_size;
|
433 |
|
434 |
-
|
435 |
for (i = 0; i < map_size && entry_data_list; i++) {
|
436 |
entry_data_list = entry_data_list->next;
|
437 |
|
438 |
char *key = estrndup((char *)entry_data_list->entry_data.utf8_string,
|
439 |
entry_data_list->entry_data.data_size);
|
440 |
if (NULL == key) {
|
441 |
-
|
442 |
-
|
443 |
-
"Invalid data type arguments");
|
444 |
return NULL;
|
445 |
}
|
446 |
|
447 |
entry_data_list = entry_data_list->next;
|
448 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
449 |
entry_data_list =
|
450 |
-
handle_entry_data_list(entry_data_list,
|
451 |
-
|
452 |
-
add_assoc_zval(z_value, key, &new_value);
|
453 |
-
}
|
454 |
efree(key);
|
455 |
}
|
456 |
return entry_data_list;
|
@@ -463,15 +495,20 @@ handle_array(const MMDB_entry_data_list_s *entry_data_list,
|
|
463 |
|
464 |
array_init(z_value);
|
465 |
|
466 |
-
|
467 |
for (i = 0; i < size && entry_data_list; i++) {
|
468 |
entry_data_list = entry_data_list->next;
|
469 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
470 |
entry_data_list =
|
471 |
-
handle_entry_data_list(entry_data_list,
|
472 |
-
|
473 |
-
add_next_index_zval(z_value, &new_value);
|
474 |
-
}
|
475 |
}
|
476 |
return entry_data_list;
|
477 |
}
|
@@ -498,7 +535,7 @@ static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,
|
|
498 |
spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
|
499 |
CHECK_ALLOCATED(num_str);
|
500 |
|
501 |
-
|
502 |
efree(num_str);
|
503 |
}
|
504 |
|
@@ -519,7 +556,7 @@ static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
|
|
519 |
spprintf(&int_str, 0, "%" PRIu32, val);
|
520 |
CHECK_ALLOCATED(int_str);
|
521 |
|
522 |
-
|
523 |
efree(int_str);
|
524 |
#endif
|
525 |
}
|
@@ -541,11 +578,29 @@ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
|
|
541 |
spprintf(&int_str, 0, "%" PRIu64, val);
|
542 |
CHECK_ALLOCATED(int_str);
|
543 |
|
544 |
-
|
545 |
efree(int_str);
|
546 |
#endif
|
547 |
}
|
548 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
549 |
static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
|
550 |
maxminddb_obj *obj =
|
551 |
php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
|
@@ -555,8 +610,12 @@ static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
|
|
555 |
}
|
556 |
|
557 |
zend_object_std_dtor(&obj->std TSRMLS_CC);
|
|
|
|
|
|
|
558 |
}
|
559 |
|
|
|
560 |
static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
|
561 |
maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
|
562 |
zend_object_std_init(&obj->std, type TSRMLS_CC);
|
@@ -566,210 +625,49 @@ static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
|
|
566 |
|
567 |
return &obj->std;
|
568 |
}
|
|
|
|
|
|
|
|
|
569 |
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
574 |
-
PHP_ME(MaxMind_Db_Reader, close, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)
|
575 |
-
PHP_ME(MaxMind_Db_Reader, get, arginfo_maxminddbreader_get, ZEND_ACC_PUBLIC)
|
576 |
-
PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxminddbreader_getWithPrefixLen, ZEND_ACC_PUBLIC)
|
577 |
-
PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)
|
578 |
-
{ NULL, NULL, NULL }
|
579 |
-
};
|
580 |
-
/* clang-format on */
|
581 |
-
|
582 |
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_metadata_construct, 0, 0, 1)
|
583 |
-
ZEND_ARG_TYPE_INFO(0, metadata, IS_ARRAY, 0)
|
584 |
-
ZEND_END_ARG_INFO()
|
585 |
-
|
586 |
-
PHP_METHOD(MaxMind_Db_Reader_Metadata, __construct) {
|
587 |
-
zval *object = NULL;
|
588 |
-
zval *metadata_array = NULL;
|
589 |
-
zend_long node_count = 0;
|
590 |
-
zend_long record_size = 0;
|
591 |
-
|
592 |
-
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
|
593 |
-
getThis(),
|
594 |
-
"Oa",
|
595 |
-
&object,
|
596 |
-
metadata_ce,
|
597 |
-
&metadata_array) == FAILURE) {
|
598 |
-
return;
|
599 |
-
}
|
600 |
-
|
601 |
-
zval *tmp = NULL;
|
602 |
-
if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
|
603 |
-
"binary_format_major_version",
|
604 |
-
sizeof("binary_format_major_version") - 1))) {
|
605 |
-
zend_update_property(metadata_ce,
|
606 |
-
PROP_OBJ(object),
|
607 |
-
"binaryFormatMajorVersion",
|
608 |
-
sizeof("binaryFormatMajorVersion") - 1,
|
609 |
-
tmp);
|
610 |
-
}
|
611 |
-
|
612 |
-
if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
|
613 |
-
"binary_format_minor_version",
|
614 |
-
sizeof("binary_format_minor_version") - 1))) {
|
615 |
-
zend_update_property(metadata_ce,
|
616 |
-
PROP_OBJ(object),
|
617 |
-
"binaryFormatMinorVersion",
|
618 |
-
sizeof("binaryFormatMinorVersion") - 1,
|
619 |
-
tmp);
|
620 |
-
}
|
621 |
-
|
622 |
-
if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
|
623 |
-
"build_epoch",
|
624 |
-
sizeof("build_epoch") - 1))) {
|
625 |
-
zend_update_property(metadata_ce,
|
626 |
-
PROP_OBJ(object),
|
627 |
-
"buildEpoch",
|
628 |
-
sizeof("buildEpoch") - 1,
|
629 |
-
tmp);
|
630 |
-
}
|
631 |
-
|
632 |
-
if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
|
633 |
-
"database_type",
|
634 |
-
sizeof("database_type") - 1))) {
|
635 |
-
zend_update_property(metadata_ce,
|
636 |
-
PROP_OBJ(object),
|
637 |
-
"databaseType",
|
638 |
-
sizeof("databaseType") - 1,
|
639 |
-
tmp);
|
640 |
-
}
|
641 |
-
|
642 |
-
if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
|
643 |
-
"description",
|
644 |
-
sizeof("description") - 1))) {
|
645 |
-
zend_update_property(metadata_ce,
|
646 |
-
PROP_OBJ(object),
|
647 |
-
"description",
|
648 |
-
sizeof("description") - 1,
|
649 |
-
tmp);
|
650 |
-
}
|
651 |
-
|
652 |
-
if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
|
653 |
-
"ip_version",
|
654 |
-
sizeof("ip_version") - 1))) {
|
655 |
-
zend_update_property(metadata_ce,
|
656 |
-
PROP_OBJ(object),
|
657 |
-
"ipVersion",
|
658 |
-
sizeof("ipVersion") - 1,
|
659 |
-
tmp);
|
660 |
-
}
|
661 |
-
|
662 |
-
if ((tmp = zend_hash_str_find(
|
663 |
-
HASH_OF(metadata_array), "languages", sizeof("languages") - 1))) {
|
664 |
-
zend_update_property(metadata_ce,
|
665 |
-
PROP_OBJ(object),
|
666 |
-
"languages",
|
667 |
-
sizeof("languages") - 1,
|
668 |
-
tmp);
|
669 |
-
}
|
670 |
-
|
671 |
-
if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
|
672 |
-
"record_size",
|
673 |
-
sizeof("record_size") - 1))) {
|
674 |
-
zend_update_property(metadata_ce,
|
675 |
-
PROP_OBJ(object),
|
676 |
-
"recordSize",
|
677 |
-
sizeof("recordSize") - 1,
|
678 |
-
tmp);
|
679 |
-
if (Z_TYPE_P(tmp) == IS_LONG) {
|
680 |
-
record_size = Z_LVAL_P(tmp);
|
681 |
-
}
|
682 |
-
}
|
683 |
-
|
684 |
-
if (record_size != 0) {
|
685 |
-
zend_update_property_long(metadata_ce,
|
686 |
-
PROP_OBJ(object),
|
687 |
-
"nodeByteSize",
|
688 |
-
sizeof("nodeByteSize") - 1,
|
689 |
-
record_size / 4);
|
690 |
-
}
|
691 |
|
692 |
-
|
693 |
-
|
694 |
-
|
695 |
-
zend_update_property(metadata_ce,
|
696 |
-
PROP_OBJ(object),
|
697 |
-
"nodeCount",
|
698 |
-
sizeof("nodeCount") - 1,
|
699 |
-
tmp);
|
700 |
-
if (Z_TYPE_P(tmp) == IS_LONG) {
|
701 |
-
node_count = Z_LVAL_P(tmp);
|
702 |
-
}
|
703 |
-
}
|
704 |
|
705 |
-
|
706 |
-
zend_update_property_long(metadata_ce,
|
707 |
-
PROP_OBJ(object),
|
708 |
-
"searchTreeSize",
|
709 |
-
sizeof("searchTreeSize") - 1,
|
710 |
-
record_size * node_count / 4);
|
711 |
-
}
|
712 |
}
|
|
|
713 |
|
714 |
// clang-format off
|
715 |
-
static zend_function_entry
|
716 |
-
PHP_ME(
|
717 |
-
|
|
|
|
|
|
|
|
|
|
|
718 |
};
|
719 |
// clang-format on
|
720 |
|
721 |
PHP_MINIT_FUNCTION(maxminddb) {
|
722 |
zend_class_entry ce;
|
723 |
|
724 |
-
INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_EX_NS, NULL);
|
725 |
-
maxminddb_exception_ce =
|
726 |
-
zend_register_internal_class_ex(&ce, zend_ce_exception);
|
727 |
-
|
728 |
INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
|
729 |
maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
|
730 |
maxminddb_ce->create_object = maxminddb_create_handler;
|
731 |
-
|
732 |
-
INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_METADATA_NS, metadata_methods);
|
733 |
-
metadata_ce = zend_register_internal_class(&ce TSRMLS_CC);
|
734 |
-
zend_declare_property_null(metadata_ce,
|
735 |
-
"binaryFormatMajorVersion",
|
736 |
-
sizeof("binaryFormatMajorVersion") - 1,
|
737 |
-
ZEND_ACC_PUBLIC);
|
738 |
-
zend_declare_property_null(metadata_ce,
|
739 |
-
"binaryFormatMinorVersion",
|
740 |
-
sizeof("binaryFormatMinorVersion") - 1,
|
741 |
-
ZEND_ACC_PUBLIC);
|
742 |
-
zend_declare_property_null(
|
743 |
-
metadata_ce, "buildEpoch", sizeof("buildEpoch") - 1, ZEND_ACC_PUBLIC);
|
744 |
-
zend_declare_property_null(metadata_ce,
|
745 |
-
"databaseType",
|
746 |
-
sizeof("databaseType") - 1,
|
747 |
-
ZEND_ACC_PUBLIC);
|
748 |
-
zend_declare_property_null(
|
749 |
-
metadata_ce, "description", sizeof("description") - 1, ZEND_ACC_PUBLIC);
|
750 |
-
zend_declare_property_null(
|
751 |
-
metadata_ce, "ipVersion", sizeof("ipVersion") - 1, ZEND_ACC_PUBLIC);
|
752 |
-
zend_declare_property_null(
|
753 |
-
metadata_ce, "languages", sizeof("languages") - 1, ZEND_ACC_PUBLIC);
|
754 |
-
zend_declare_property_null(metadata_ce,
|
755 |
-
"nodeByteSize",
|
756 |
-
sizeof("nodeByteSize") - 1,
|
757 |
-
ZEND_ACC_PUBLIC);
|
758 |
-
zend_declare_property_null(
|
759 |
-
metadata_ce, "nodeCount", sizeof("nodeCount") - 1, ZEND_ACC_PUBLIC);
|
760 |
-
zend_declare_property_null(
|
761 |
-
metadata_ce, "recordSize", sizeof("recordSize") - 1, ZEND_ACC_PUBLIC);
|
762 |
-
zend_declare_property_null(metadata_ce,
|
763 |
-
"searchTreeSize",
|
764 |
-
sizeof("searchTreeSize") - 1,
|
765 |
-
ZEND_ACC_PUBLIC);
|
766 |
-
|
767 |
memcpy(&maxminddb_obj_handlers,
|
768 |
zend_get_std_object_handlers(),
|
769 |
sizeof(zend_object_handlers));
|
770 |
maxminddb_obj_handlers.clone_obj = NULL;
|
|
|
771 |
maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
|
772 |
maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
|
|
|
773 |
zend_declare_class_constant_string(maxminddb_ce,
|
774 |
"MMDB_LIB_VERSION",
|
775 |
sizeof("MMDB_LIB_VERSION") - 1,
|
21 |
#include <zend.h>
|
22 |
|
23 |
#include "Zend/zend_exceptions.h"
|
|
|
|
|
24 |
#include "ext/standard/info.h"
|
25 |
#include <maxminddb.h>
|
26 |
|
33 |
|
34 |
#define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
|
35 |
#define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
|
|
|
|
|
36 |
#define PHP_MAXMINDDB_READER_EX_NS \
|
37 |
ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "InvalidDatabaseException")
|
38 |
|
39 |
+
#ifdef ZEND_ENGINE_3
|
40 |
#define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
|
41 |
+
#define _ZVAL_STRING ZVAL_STRING
|
42 |
+
#define _ZVAL_STRINGL ZVAL_STRINGL
|
43 |
typedef size_t strsize_t;
|
44 |
typedef zend_object free_obj_t;
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
#else
|
46 |
+
#define Z_MAXMINDDB_P(zv) \
|
47 |
+
(maxminddb_obj *)zend_object_store_get_object(zv TSRMLS_CC)
|
48 |
+
#define _ZVAL_STRING(a, b) ZVAL_STRING(a, b, 1)
|
49 |
+
#define _ZVAL_STRINGL(a, b, c) ZVAL_STRINGL(a, b, c, 1)
|
50 |
+
typedef int strsize_t;
|
51 |
+
typedef void free_obj_t;
|
52 |
+
#endif
|
53 |
|
54 |
+
/* For PHP 8 compatibility */
|
55 |
+
#ifndef TSRMLS_C
|
56 |
#define TSRMLS_C
|
57 |
+
#endif
|
58 |
+
#ifndef TSRMLS_CC
|
59 |
#define TSRMLS_CC
|
60 |
+
#endif
|
61 |
+
#ifndef TSRMLS_DC
|
62 |
#define TSRMLS_DC
|
|
|
|
|
63 |
#endif
|
|
|
64 |
#ifndef ZEND_ACC_CTOR
|
65 |
#define ZEND_ACC_CTOR 0
|
66 |
#endif
|
67 |
|
68 |
+
#ifdef ZEND_ENGINE_3
|
|
|
|
|
|
|
|
|
69 |
typedef struct _maxminddb_obj {
|
70 |
MMDB_s *mmdb;
|
71 |
zend_object std;
|
72 |
} maxminddb_obj;
|
73 |
+
#else
|
74 |
+
typedef struct _maxminddb_obj {
|
75 |
+
zend_object std;
|
76 |
+
MMDB_s *mmdb;
|
77 |
+
} maxminddb_obj;
|
78 |
+
#endif
|
79 |
|
80 |
PHP_FUNCTION(maxminddb);
|
81 |
|
96 |
zval *z_value TSRMLS_DC);
|
97 |
static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
|
98 |
zval *z_value TSRMLS_DC);
|
99 |
+
static zend_class_entry *lookup_class(const char *name TSRMLS_DC);
|
100 |
|
101 |
#define CHECK_ALLOCATED(val) \
|
102 |
if (!val) { \
|
104 |
return; \
|
105 |
}
|
106 |
|
107 |
+
#define THROW_EXCEPTION(name, ...) \
|
108 |
+
{ \
|
109 |
+
zend_class_entry *exception_ce = lookup_class(name TSRMLS_CC); \
|
110 |
+
zend_throw_exception_ex(exception_ce, 0 TSRMLS_CC, __VA_ARGS__); \
|
111 |
+
}
|
112 |
+
|
113 |
+
#if PHP_VERSION_ID < 50399
|
114 |
+
#define object_properties_init(zo, class_type) \
|
115 |
+
{ \
|
116 |
+
zval *tmp; \
|
117 |
+
zend_hash_copy((*zo).properties, \
|
118 |
+
&class_type->default_properties, \
|
119 |
+
(copy_ctor_func_t)zval_add_ref, \
|
120 |
+
(void *)&tmp, \
|
121 |
+
sizeof(zval *)); \
|
122 |
+
}
|
123 |
+
#endif
|
124 |
+
|
125 |
static zend_object_handlers maxminddb_obj_handlers;
|
126 |
+
static zend_class_entry *maxminddb_ce;
|
127 |
|
128 |
static inline maxminddb_obj *
|
129 |
php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) {
|
130 |
+
#ifdef ZEND_ENGINE_3
|
131 |
return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std));
|
132 |
+
#else
|
133 |
+
return (maxminddb_obj *)obj;
|
134 |
+
#endif
|
135 |
}
|
136 |
|
137 |
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_construct, 0, 0, 1)
|
138 |
+
ZEND_ARG_INFO(0, db_file)
|
139 |
ZEND_END_ARG_INFO()
|
140 |
|
141 |
PHP_METHOD(MaxMind_Db_Reader, __construct) {
|
150 |
maxminddb_ce,
|
151 |
&db_file,
|
152 |
&name_len) == FAILURE) {
|
153 |
+
THROW_EXCEPTION("InvalidArgumentException",
|
154 |
+
"The constructor takes exactly one argument.");
|
155 |
return;
|
156 |
}
|
157 |
|
158 |
if (0 != php_check_open_basedir(db_file TSRMLS_CC) ||
|
159 |
0 != access(db_file, R_OK)) {
|
160 |
+
THROW_EXCEPTION("InvalidArgumentException",
|
161 |
+
"The file \"%s\" does not exist or is not readable.",
|
162 |
+
db_file);
|
|
|
|
|
163 |
return;
|
164 |
}
|
165 |
|
167 |
uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
|
168 |
|
169 |
if (MMDB_SUCCESS != status) {
|
170 |
+
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
171 |
+
"Error opening database file (%s). Is this a valid "
|
172 |
+
"MaxMind DB file?",
|
173 |
+
db_file);
|
|
|
|
|
174 |
efree(mmdb);
|
175 |
return;
|
176 |
}
|
179 |
mmdb_obj->mmdb = mmdb;
|
180 |
}
|
181 |
|
182 |
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_get, 0, 0, 1)
|
183 |
+
ZEND_ARG_INFO(0, ip_address)
|
|
|
184 |
ZEND_END_ARG_INFO()
|
185 |
|
186 |
PHP_METHOD(MaxMind_Db_Reader, get) {
|
188 |
get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len);
|
189 |
}
|
190 |
|
|
|
|
|
|
|
|
|
|
|
191 |
PHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) {
|
192 |
+
zval *record, *z_prefix_len;
|
193 |
+
#ifdef ZEND_ENGINE_3
|
194 |
+
zval _record, _z_prefix_len;
|
195 |
+
record = &_record;
|
196 |
+
z_prefix_len = &_z_prefix_len;
|
197 |
+
#else
|
198 |
+
ALLOC_INIT_ZVAL(record);
|
199 |
+
ALLOC_INIT_ZVAL(z_prefix_len);
|
200 |
+
#endif
|
201 |
|
202 |
int prefix_len = 0;
|
203 |
+
if (get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, record, &prefix_len)) {
|
|
|
204 |
return;
|
205 |
}
|
206 |
|
207 |
array_init(return_value);
|
208 |
+
add_next_index_zval(return_value, record);
|
209 |
|
210 |
+
ZVAL_LONG(z_prefix_len, prefix_len);
|
211 |
+
add_next_index_zval(return_value, z_prefix_len);
|
212 |
}
|
213 |
|
214 |
static int
|
215 |
get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
|
216 |
char *ip_address = NULL;
|
217 |
strsize_t name_len;
|
218 |
+
zval *_this_zval = NULL;
|
219 |
|
220 |
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
|
221 |
getThis(),
|
222 |
"Os",
|
223 |
+
&_this_zval,
|
224 |
maxminddb_ce,
|
225 |
&ip_address,
|
226 |
&name_len) == FAILURE) {
|
227 |
+
THROW_EXCEPTION("InvalidArgumentException",
|
228 |
+
"Method takes exactly one argument.");
|
229 |
+
return 1;
|
230 |
}
|
231 |
|
232 |
const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
|
234 |
MMDB_s *mmdb = mmdb_obj->mmdb;
|
235 |
|
236 |
if (NULL == mmdb) {
|
237 |
+
THROW_EXCEPTION("BadMethodCallException",
|
238 |
+
"Attempt to read from a closed MaxMind DB.");
|
239 |
+
return 1;
|
|
|
240 |
}
|
241 |
|
242 |
struct addrinfo hints = {
|
243 |
.ai_family = AF_UNSPEC,
|
244 |
.ai_flags = AI_NUMERICHOST,
|
245 |
+
// We set ai_socktype so that we only get one result back
|
246 |
.ai_socktype = SOCK_STREAM};
|
247 |
|
248 |
struct addrinfo *addresses = NULL;
|
249 |
int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses);
|
250 |
if (gai_status) {
|
251 |
+
THROW_EXCEPTION("InvalidArgumentException",
|
252 |
+
"The value \"%s\" is not a valid IP address.",
|
253 |
+
ip_address);
|
254 |
+
return 1;
|
|
|
255 |
}
|
256 |
if (!addresses || !addresses->ai_addr) {
|
257 |
+
THROW_EXCEPTION(
|
258 |
+
"InvalidArgumentException",
|
|
|
259 |
"getaddrinfo was successful but failed to set the addrinfo");
|
260 |
+
return 1;
|
261 |
}
|
262 |
|
263 |
int sa_family = addresses->ai_addr->sa_family;
|
269 |
freeaddrinfo(addresses);
|
270 |
|
271 |
if (MMDB_SUCCESS != mmdb_error) {
|
272 |
+
char *exception_name;
|
273 |
if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
|
274 |
+
exception_name = "InvalidArgumentException";
|
275 |
} else {
|
276 |
+
exception_name = PHP_MAXMINDDB_READER_EX_NS;
|
277 |
}
|
278 |
+
THROW_EXCEPTION(exception_name,
|
279 |
+
"Error looking up %s. %s",
|
280 |
+
ip_address,
|
281 |
+
MMDB_strerror(mmdb_error));
|
282 |
+
return 1;
|
|
|
283 |
}
|
284 |
|
285 |
*prefix_len = result.netmask;
|
286 |
|
287 |
if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) {
|
288 |
+
// We return the prefix length given the IPv4 address. If there is
|
289 |
+
// no IPv4 subtree, we return a prefix length of 0.
|
290 |
*prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0;
|
291 |
}
|
292 |
|
293 |
if (!result.found_entry) {
|
294 |
ZVAL_NULL(record);
|
295 |
+
return 0;
|
296 |
}
|
297 |
|
298 |
MMDB_entry_data_list_s *entry_data_list = NULL;
|
299 |
int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
|
300 |
|
301 |
if (MMDB_SUCCESS != status) {
|
302 |
+
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
303 |
+
"Error while looking up data for %s. %s",
|
304 |
+
ip_address,
|
305 |
+
MMDB_strerror(status));
|
|
|
306 |
MMDB_free_entry_data_list(entry_data_list);
|
307 |
+
return 1;
|
308 |
} else if (NULL == entry_data_list) {
|
309 |
+
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
310 |
+
"Error while looking up data for %s. Your database may "
|
311 |
+
"be corrupt or you have found a bug in libmaxminddb.",
|
312 |
+
ip_address);
|
313 |
+
return 1;
|
|
|
|
|
314 |
}
|
315 |
|
316 |
+
handle_entry_data_list(entry_data_list, record TSRMLS_CC);
|
|
|
|
|
|
|
|
|
|
|
|
|
317 |
MMDB_free_entry_data_list(entry_data_list);
|
318 |
+
return 0;
|
319 |
}
|
320 |
|
321 |
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_void, 0, 0, 0)
|
322 |
ZEND_END_ARG_INFO()
|
323 |
|
324 |
PHP_METHOD(MaxMind_Db_Reader, metadata) {
|
325 |
+
if (ZEND_NUM_ARGS() != 0) {
|
326 |
+
THROW_EXCEPTION("InvalidArgumentException",
|
327 |
+
"Method takes no arguments.");
|
|
|
|
|
|
|
|
|
328 |
return;
|
329 |
}
|
330 |
|
331 |
const maxminddb_obj *const mmdb_obj =
|
332 |
+
(maxminddb_obj *)Z_MAXMINDDB_P(getThis());
|
333 |
|
334 |
if (NULL == mmdb_obj->mmdb) {
|
335 |
+
THROW_EXCEPTION("BadMethodCallException",
|
336 |
+
"Attempt to read from a closed MaxMind DB.");
|
|
|
337 |
return;
|
338 |
}
|
339 |
|
340 |
+
const char *const name = ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata");
|
341 |
+
zend_class_entry *metadata_ce = lookup_class(name TSRMLS_CC);
|
342 |
+
|
343 |
object_init_ex(return_value, metadata_ce);
|
344 |
|
345 |
+
#ifdef ZEND_ENGINE_3
|
346 |
+
zval _metadata_array;
|
347 |
+
zval *metadata_array = &_metadata_array;
|
348 |
+
ZVAL_NULL(metadata_array);
|
349 |
+
#else
|
350 |
+
zval *metadata_array;
|
351 |
+
ALLOC_INIT_ZVAL(metadata_array);
|
352 |
+
#endif
|
353 |
+
|
354 |
MMDB_entry_data_list_s *entry_data_list;
|
355 |
MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
|
356 |
|
357 |
+
handle_entry_data_list(entry_data_list, metadata_array TSRMLS_CC);
|
|
|
|
|
|
|
|
|
|
|
358 |
MMDB_free_entry_data_list(entry_data_list);
|
359 |
+
#if PHP_VERSION_ID >= 80000
|
360 |
+
zend_call_method_with_1_params(Z_OBJ_P(return_value),
|
361 |
metadata_ce,
|
362 |
&metadata_ce->constructor,
|
363 |
ZEND_CONSTRUCTOR_FUNC_NAME,
|
364 |
NULL,
|
365 |
+
metadata_array);
|
366 |
+
zval_ptr_dtor(metadata_array);
|
367 |
+
#elif defined(ZEND_ENGINE_3)
|
368 |
+
zend_call_method_with_1_params(return_value,
|
369 |
+
metadata_ce,
|
370 |
+
&metadata_ce->constructor,
|
371 |
+
ZEND_CONSTRUCTOR_FUNC_NAME,
|
372 |
+
NULL,
|
373 |
+
metadata_array);
|
374 |
+
zval_ptr_dtor(metadata_array);
|
375 |
+
#else
|
376 |
+
zend_call_method_with_1_params(&return_value,
|
377 |
+
metadata_ce,
|
378 |
+
&metadata_ce->constructor,
|
379 |
+
ZEND_CONSTRUCTOR_FUNC_NAME,
|
380 |
+
NULL,
|
381 |
+
metadata_array);
|
382 |
zval_ptr_dtor(&metadata_array);
|
383 |
+
#endif
|
384 |
}
|
385 |
|
386 |
PHP_METHOD(MaxMind_Db_Reader, close) {
|
387 |
+
if (ZEND_NUM_ARGS() != 0) {
|
388 |
+
THROW_EXCEPTION("InvalidArgumentException",
|
389 |
+
"Method takes no arguments.");
|
|
|
|
|
|
|
|
|
390 |
return;
|
391 |
}
|
392 |
|
393 |
+
maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
|
394 |
|
395 |
if (NULL == mmdb_obj->mmdb) {
|
396 |
+
THROW_EXCEPTION("BadMethodCallException",
|
397 |
+
"Attempt to close a closed MaxMind DB.");
|
|
|
398 |
return;
|
399 |
}
|
400 |
MMDB_close(mmdb_obj->mmdb);
|
411 |
case MMDB_DATA_TYPE_ARRAY:
|
412 |
return handle_array(entry_data_list, z_value TSRMLS_CC);
|
413 |
case MMDB_DATA_TYPE_UTF8_STRING:
|
414 |
+
_ZVAL_STRINGL(z_value,
|
415 |
+
(char *)entry_data_list->entry_data.utf8_string,
|
416 |
+
entry_data_list->entry_data.data_size);
|
417 |
break;
|
418 |
case MMDB_DATA_TYPE_BYTES:
|
419 |
+
_ZVAL_STRINGL(z_value,
|
420 |
+
(char *)entry_data_list->entry_data.bytes,
|
421 |
+
entry_data_list->entry_data.data_size);
|
422 |
break;
|
423 |
case MMDB_DATA_TYPE_DOUBLE:
|
424 |
ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
|
445 |
ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
|
446 |
break;
|
447 |
default:
|
448 |
+
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
449 |
+
"Invalid data type arguments: %d",
|
450 |
+
entry_data_list->entry_data.type);
|
|
|
451 |
return NULL;
|
452 |
}
|
453 |
return entry_data_list;
|
459 |
array_init(z_value);
|
460 |
const uint32_t map_size = entry_data_list->entry_data.data_size;
|
461 |
|
462 |
+
uint i;
|
463 |
for (i = 0; i < map_size && entry_data_list; i++) {
|
464 |
entry_data_list = entry_data_list->next;
|
465 |
|
466 |
char *key = estrndup((char *)entry_data_list->entry_data.utf8_string,
|
467 |
entry_data_list->entry_data.data_size);
|
468 |
if (NULL == key) {
|
469 |
+
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
470 |
+
"Invalid data type arguments");
|
|
|
471 |
return NULL;
|
472 |
}
|
473 |
|
474 |
entry_data_list = entry_data_list->next;
|
475 |
+
#ifdef ZEND_ENGINE_3
|
476 |
+
zval _new_value;
|
477 |
+
zval *new_value = &_new_value;
|
478 |
+
ZVAL_NULL(new_value);
|
479 |
+
#else
|
480 |
+
zval *new_value;
|
481 |
+
ALLOC_INIT_ZVAL(new_value);
|
482 |
+
#endif
|
483 |
entry_data_list =
|
484 |
+
handle_entry_data_list(entry_data_list, new_value TSRMLS_CC);
|
485 |
+
add_assoc_zval(z_value, key, new_value);
|
|
|
|
|
486 |
efree(key);
|
487 |
}
|
488 |
return entry_data_list;
|
495 |
|
496 |
array_init(z_value);
|
497 |
|
498 |
+
uint i;
|
499 |
for (i = 0; i < size && entry_data_list; i++) {
|
500 |
entry_data_list = entry_data_list->next;
|
501 |
+
#ifdef ZEND_ENGINE_3
|
502 |
+
zval _new_value;
|
503 |
+
zval *new_value = &_new_value;
|
504 |
+
ZVAL_NULL(new_value);
|
505 |
+
#else
|
506 |
+
zval *new_value;
|
507 |
+
ALLOC_INIT_ZVAL(new_value);
|
508 |
+
#endif
|
509 |
entry_data_list =
|
510 |
+
handle_entry_data_list(entry_data_list, new_value TSRMLS_CC);
|
511 |
+
add_next_index_zval(z_value, new_value);
|
|
|
|
|
512 |
}
|
513 |
return entry_data_list;
|
514 |
}
|
535 |
spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
|
536 |
CHECK_ALLOCATED(num_str);
|
537 |
|
538 |
+
_ZVAL_STRING(z_value, num_str);
|
539 |
efree(num_str);
|
540 |
}
|
541 |
|
556 |
spprintf(&int_str, 0, "%" PRIu32, val);
|
557 |
CHECK_ALLOCATED(int_str);
|
558 |
|
559 |
+
_ZVAL_STRING(z_value, int_str);
|
560 |
efree(int_str);
|
561 |
#endif
|
562 |
}
|
578 |
spprintf(&int_str, 0, "%" PRIu64, val);
|
579 |
CHECK_ALLOCATED(int_str);
|
580 |
|
581 |
+
_ZVAL_STRING(z_value, int_str);
|
582 |
efree(int_str);
|
583 |
#endif
|
584 |
}
|
585 |
|
586 |
+
static zend_class_entry *lookup_class(const char *name TSRMLS_DC) {
|
587 |
+
#ifdef ZEND_ENGINE_3
|
588 |
+
zend_string *n = zend_string_init(name, strlen(name), 0);
|
589 |
+
zend_class_entry *ce = zend_lookup_class(n);
|
590 |
+
zend_string_release(n);
|
591 |
+
if (NULL == ce) {
|
592 |
+
zend_error(E_ERROR, "Class %s not found", name);
|
593 |
+
}
|
594 |
+
return ce;
|
595 |
+
#else
|
596 |
+
zend_class_entry **ce;
|
597 |
+
if (FAILURE == zend_lookup_class(name, strlen(name), &ce TSRMLS_CC)) {
|
598 |
+
zend_error(E_ERROR, "Class %s not found", name);
|
599 |
+
}
|
600 |
+
return *ce;
|
601 |
+
#endif
|
602 |
+
}
|
603 |
+
|
604 |
static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
|
605 |
maxminddb_obj *obj =
|
606 |
php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
|
610 |
}
|
611 |
|
612 |
zend_object_std_dtor(&obj->std TSRMLS_CC);
|
613 |
+
#ifndef ZEND_ENGINE_3
|
614 |
+
efree(object);
|
615 |
+
#endif
|
616 |
}
|
617 |
|
618 |
+
#ifdef ZEND_ENGINE_3
|
619 |
static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
|
620 |
maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
|
621 |
zend_object_std_init(&obj->std, type TSRMLS_CC);
|
625 |
|
626 |
return &obj->std;
|
627 |
}
|
628 |
+
#else
|
629 |
+
static zend_object_value
|
630 |
+
maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
|
631 |
+
zend_object_value retval;
|
632 |
|
633 |
+
maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
|
634 |
+
zend_object_std_init(&obj->std, type TSRMLS_CC);
|
635 |
+
object_properties_init(&(obj->std), type);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
636 |
|
637 |
+
retval.handle = zend_objects_store_put(
|
638 |
+
obj, NULL, maxminddb_free_storage, NULL TSRMLS_CC);
|
639 |
+
retval.handlers = &maxminddb_obj_handlers;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
640 |
|
641 |
+
return retval;
|
|
|
|
|
|
|
|
|
|
|
|
|
642 |
}
|
643 |
+
#endif
|
644 |
|
645 |
// clang-format off
|
646 |
+
static zend_function_entry maxminddb_methods[] = {
|
647 |
+
PHP_ME(MaxMind_Db_Reader, __construct, arginfo_maxmindbreader_construct,
|
648 |
+
ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
649 |
+
PHP_ME(MaxMind_Db_Reader, close, arginfo_maxmindbreader_void, ZEND_ACC_PUBLIC)
|
650 |
+
PHP_ME(MaxMind_Db_Reader, get, arginfo_maxmindbreader_get, ZEND_ACC_PUBLIC)
|
651 |
+
PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxmindbreader_get, ZEND_ACC_PUBLIC)
|
652 |
+
PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxmindbreader_void, ZEND_ACC_PUBLIC)
|
653 |
+
{ NULL, NULL, NULL }
|
654 |
};
|
655 |
// clang-format on
|
656 |
|
657 |
PHP_MINIT_FUNCTION(maxminddb) {
|
658 |
zend_class_entry ce;
|
659 |
|
|
|
|
|
|
|
|
|
660 |
INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
|
661 |
maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
|
662 |
maxminddb_ce->create_object = maxminddb_create_handler;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
663 |
memcpy(&maxminddb_obj_handlers,
|
664 |
zend_get_std_object_handlers(),
|
665 |
sizeof(zend_object_handlers));
|
666 |
maxminddb_obj_handlers.clone_obj = NULL;
|
667 |
+
#ifdef ZEND_ENGINE_3
|
668 |
maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
|
669 |
maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
|
670 |
+
#endif
|
671 |
zend_declare_class_constant_string(maxminddb_ce,
|
672 |
"MMDB_LIB_VERSION",
|
673 |
sizeof("MMDB_LIB_VERSION") - 1,
|
vendor/maxmind-db/reader/ext/php_maxminddb.h
CHANGED
@@ -15,7 +15,7 @@
|
|
15 |
|
16 |
#ifndef PHP_MAXMINDDB_H
|
17 |
#define PHP_MAXMINDDB_H 1
|
18 |
-
#define PHP_MAXMINDDB_VERSION "1.
|
19 |
#define PHP_MAXMINDDB_EXTNAME "maxminddb"
|
20 |
|
21 |
extern zend_module_entry maxminddb_module_entry;
|
15 |
|
16 |
#ifndef PHP_MAXMINDDB_H
|
17 |
#define PHP_MAXMINDDB_H 1
|
18 |
+
#define PHP_MAXMINDDB_VERSION "1.6.0"
|
19 |
#define PHP_MAXMINDDB_EXTNAME "maxminddb"
|
20 |
|
21 |
extern zend_module_entry maxminddb_module_entry;
|
vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php
CHANGED
@@ -1,10 +1,7 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Db;
|
6 |
|
7 |
-
use ArgumentCountError;
|
8 |
use BadMethodCallException;
|
9 |
use Exception;
|
10 |
use InvalidArgumentException;
|
@@ -20,42 +17,15 @@ use UnexpectedValueException;
|
|
20 |
*/
|
21 |
class Reader
|
22 |
{
|
23 |
-
/**
|
24 |
-
* @var int
|
25 |
-
*/
|
26 |
private static $DATA_SECTION_SEPARATOR_SIZE = 16;
|
27 |
-
/**
|
28 |
-
* @var string
|
29 |
-
*/
|
30 |
private static $METADATA_START_MARKER = "\xAB\xCD\xEFMaxMind.com";
|
31 |
-
/**
|
32 |
-
* @var int
|
33 |
-
*/
|
34 |
private static $METADATA_START_MARKER_LENGTH = 14;
|
35 |
-
|
36 |
-
* @var int
|
37 |
-
*/
|
38 |
-
private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KiB
|
39 |
|
40 |
-
/**
|
41 |
-
* @var Decoder
|
42 |
-
*/
|
43 |
private $decoder;
|
44 |
-
/**
|
45 |
-
* @var resource
|
46 |
-
*/
|
47 |
private $fileHandle;
|
48 |
-
/**
|
49 |
-
* @var int
|
50 |
-
*/
|
51 |
private $fileSize;
|
52 |
-
/**
|
53 |
-
* @var int
|
54 |
-
*/
|
55 |
private $ipV4Start;
|
56 |
-
/**
|
57 |
-
* @var Metadata
|
58 |
-
*/
|
59 |
private $metadata;
|
60 |
|
61 |
/**
|
@@ -65,38 +35,40 @@ class Reader
|
|
65 |
* @param string $database
|
66 |
* the MaxMind DB file to use
|
67 |
*
|
68 |
-
* @throws InvalidArgumentException
|
69 |
-
* @throws InvalidDatabaseException
|
70 |
-
*
|
71 |
-
*
|
72 |
*/
|
73 |
-
public function __construct(
|
74 |
{
|
75 |
if (\func_num_args() !== 1) {
|
76 |
-
throw new
|
77 |
-
|
78 |
);
|
79 |
}
|
80 |
|
81 |
-
|
82 |
-
if ($fileHandle === false) {
|
83 |
throw new InvalidArgumentException(
|
84 |
"The file \"$database\" does not exist or is not readable."
|
85 |
);
|
86 |
}
|
87 |
-
$this->fileHandle = $
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
91 |
throw new UnexpectedValueException(
|
92 |
"Error determining the size of \"$database\"."
|
93 |
);
|
94 |
}
|
95 |
-
$this->fileSize = $fileSize;
|
96 |
|
97 |
$start = $this->findMetadataStart($database);
|
98 |
$metadataDecoder = new Decoder($this->fileHandle, $start);
|
99 |
-
|
100 |
$this->metadata = new Metadata($metadataArray);
|
101 |
$this->decoder = new Decoder(
|
102 |
$this->fileHandle,
|
@@ -119,14 +91,14 @@ class Reader
|
|
119 |
*
|
120 |
* @return mixed the record for the IP address
|
121 |
*/
|
122 |
-
public function get(
|
123 |
{
|
124 |
if (\func_num_args() !== 1) {
|
125 |
-
throw new
|
126 |
-
|
127 |
);
|
128 |
}
|
129 |
-
|
130 |
|
131 |
return $record;
|
132 |
}
|
@@ -146,11 +118,11 @@ class Reader
|
|
146 |
* @return array an array where the first element is the record and the
|
147 |
* second the network prefix length for the record
|
148 |
*/
|
149 |
-
public function getWithPrefixLen(
|
150 |
{
|
151 |
if (\func_num_args() !== 1) {
|
152 |
-
throw new
|
153 |
-
|
154 |
);
|
155 |
}
|
156 |
|
@@ -160,7 +132,13 @@ class Reader
|
|
160 |
);
|
161 |
}
|
162 |
|
163 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
if ($pointer === 0) {
|
165 |
return [null, $prefixLen];
|
166 |
}
|
@@ -168,16 +146,9 @@ class Reader
|
|
168 |
return [$this->resolveDataPointer($pointer), $prefixLen];
|
169 |
}
|
170 |
|
171 |
-
private function findAddressInTree(
|
172 |
{
|
173 |
-
$
|
174 |
-
if ($packedAddr === false) {
|
175 |
-
throw new InvalidArgumentException(
|
176 |
-
"The value \"$ipAddress\" is not a valid IP address."
|
177 |
-
);
|
178 |
-
}
|
179 |
-
|
180 |
-
$rawAddress = unpack('C*', $packedAddr);
|
181 |
|
182 |
$bitCount = \count($rawAddress) * 8;
|
183 |
|
@@ -211,18 +182,14 @@ class Reader
|
|
211 |
if ($node === $nodeCount) {
|
212 |
// Record is empty
|
213 |
return [0, $i];
|
214 |
-
}
|
215 |
-
if ($node > $nodeCount) {
|
216 |
// Record is a data pointer
|
217 |
return [$node, $i];
|
218 |
}
|
219 |
-
|
220 |
-
throw new InvalidDatabaseException(
|
221 |
-
'Invalid or corrupt database. Maximum search depth reached without finding a leaf node'
|
222 |
-
);
|
223 |
}
|
224 |
|
225 |
-
private function ipV4StartNode()
|
226 |
{
|
227 |
// If we have an IPv4 database, the start node is the first node
|
228 |
if ($this->metadata->ipVersion === 4) {
|
@@ -238,17 +205,16 @@ class Reader
|
|
238 |
return $node;
|
239 |
}
|
240 |
|
241 |
-
private function readNode(
|
242 |
{
|
243 |
$baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
|
244 |
|
245 |
switch ($this->metadata->recordSize) {
|
246 |
case 24:
|
247 |
$bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
|
248 |
-
|
249 |
|
250 |
return $node;
|
251 |
-
|
252 |
case 28:
|
253 |
$bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4);
|
254 |
if ($index === 0) {
|
@@ -256,16 +222,14 @@ class Reader
|
|
256 |
} else {
|
257 |
$middle = 0x0F & \ord($bytes[0]);
|
258 |
}
|
259 |
-
|
260 |
|
261 |
return $node;
|
262 |
-
|
263 |
case 32:
|
264 |
$bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
|
265 |
-
|
266 |
|
267 |
return $node;
|
268 |
-
|
269 |
default:
|
270 |
throw new InvalidDatabaseException(
|
271 |
'Unknown record size: '
|
@@ -274,10 +238,7 @@ class Reader
|
|
274 |
}
|
275 |
}
|
276 |
|
277 |
-
|
278 |
-
* @return mixed
|
279 |
-
*/
|
280 |
-
private function resolveDataPointer(int $pointer)
|
281 |
{
|
282 |
$resolved = $pointer - $this->metadata->nodeCount
|
283 |
+ $this->metadata->searchTreeSize;
|
@@ -287,7 +248,7 @@ class Reader
|
|
287 |
);
|
288 |
}
|
289 |
|
290 |
-
|
291 |
|
292 |
return $data;
|
293 |
}
|
@@ -297,7 +258,7 @@ class Reader
|
|
297 |
* are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
|
298 |
* an issue, but I suspect it won't be.
|
299 |
*/
|
300 |
-
private function findMetadataStart(
|
301 |
{
|
302 |
$handle = $this->fileHandle;
|
303 |
$fstat = fstat($handle);
|
@@ -317,7 +278,6 @@ class Reader
|
|
317 |
return $offset + $markerLength;
|
318 |
}
|
319 |
}
|
320 |
-
|
321 |
throw new InvalidDatabaseException(
|
322 |
"Error opening database file ($filename). " .
|
323 |
'Is this a valid MaxMind DB file?'
|
@@ -330,11 +290,11 @@ class Reader
|
|
330 |
*
|
331 |
* @return Metadata object for the database
|
332 |
*/
|
333 |
-
public function metadata()
|
334 |
{
|
335 |
if (\func_num_args()) {
|
336 |
-
throw new
|
337 |
-
|
338 |
);
|
339 |
}
|
340 |
|
@@ -346,7 +306,7 @@ class Reader
|
|
346 |
);
|
347 |
}
|
348 |
|
349 |
-
return
|
350 |
}
|
351 |
|
352 |
/**
|
@@ -355,14 +315,8 @@ class Reader
|
|
355 |
* @throws Exception
|
356 |
* if an I/O error occurs
|
357 |
*/
|
358 |
-
public function close()
|
359 |
{
|
360 |
-
if (\func_num_args()) {
|
361 |
-
throw new ArgumentCountError(
|
362 |
-
sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \func_num_args())
|
363 |
-
);
|
364 |
-
}
|
365 |
-
|
366 |
if (!\is_resource($this->fileHandle)) {
|
367 |
throw new BadMethodCallException(
|
368 |
'Attempt to close a closed MaxMind DB.'
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Db;
|
4 |
|
|
|
5 |
use BadMethodCallException;
|
6 |
use Exception;
|
7 |
use InvalidArgumentException;
|
17 |
*/
|
18 |
class Reader
|
19 |
{
|
|
|
|
|
|
|
20 |
private static $DATA_SECTION_SEPARATOR_SIZE = 16;
|
|
|
|
|
|
|
21 |
private static $METADATA_START_MARKER = "\xAB\xCD\xEFMaxMind.com";
|
|
|
|
|
|
|
22 |
private static $METADATA_START_MARKER_LENGTH = 14;
|
23 |
+
private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KB
|
|
|
|
|
|
|
24 |
|
|
|
|
|
|
|
25 |
private $decoder;
|
|
|
|
|
|
|
26 |
private $fileHandle;
|
|
|
|
|
|
|
27 |
private $fileSize;
|
|
|
|
|
|
|
28 |
private $ipV4Start;
|
|
|
|
|
|
|
29 |
private $metadata;
|
30 |
|
31 |
/**
|
35 |
* @param string $database
|
36 |
* the MaxMind DB file to use
|
37 |
*
|
38 |
+
* @throws InvalidArgumentException for invalid database path or unknown arguments
|
39 |
+
* @throws \MaxMind\Db\Reader\InvalidDatabaseException
|
40 |
+
* if the database is invalid or there is an error reading
|
41 |
+
* from it
|
42 |
*/
|
43 |
+
public function __construct($database)
|
44 |
{
|
45 |
if (\func_num_args() !== 1) {
|
46 |
+
throw new InvalidArgumentException(
|
47 |
+
'The constructor takes exactly one argument.'
|
48 |
);
|
49 |
}
|
50 |
|
51 |
+
if (!is_readable($database)) {
|
|
|
52 |
throw new InvalidArgumentException(
|
53 |
"The file \"$database\" does not exist or is not readable."
|
54 |
);
|
55 |
}
|
56 |
+
$this->fileHandle = @fopen($database, 'rb');
|
57 |
+
if ($this->fileHandle === false) {
|
58 |
+
throw new InvalidArgumentException(
|
59 |
+
"Error opening \"$database\"."
|
60 |
+
);
|
61 |
+
}
|
62 |
+
$this->fileSize = @filesize($database);
|
63 |
+
if ($this->fileSize === false) {
|
64 |
throw new UnexpectedValueException(
|
65 |
"Error determining the size of \"$database\"."
|
66 |
);
|
67 |
}
|
|
|
68 |
|
69 |
$start = $this->findMetadataStart($database);
|
70 |
$metadataDecoder = new Decoder($this->fileHandle, $start);
|
71 |
+
list($metadataArray) = $metadataDecoder->decode($start);
|
72 |
$this->metadata = new Metadata($metadataArray);
|
73 |
$this->decoder = new Decoder(
|
74 |
$this->fileHandle,
|
91 |
*
|
92 |
* @return mixed the record for the IP address
|
93 |
*/
|
94 |
+
public function get($ipAddress)
|
95 |
{
|
96 |
if (\func_num_args() !== 1) {
|
97 |
+
throw new InvalidArgumentException(
|
98 |
+
'Method takes exactly one argument.'
|
99 |
);
|
100 |
}
|
101 |
+
list($record) = $this->getWithPrefixLen($ipAddress);
|
102 |
|
103 |
return $record;
|
104 |
}
|
118 |
* @return array an array where the first element is the record and the
|
119 |
* second the network prefix length for the record
|
120 |
*/
|
121 |
+
public function getWithPrefixLen($ipAddress)
|
122 |
{
|
123 |
if (\func_num_args() !== 1) {
|
124 |
+
throw new InvalidArgumentException(
|
125 |
+
'Method takes exactly one argument.'
|
126 |
);
|
127 |
}
|
128 |
|
132 |
);
|
133 |
}
|
134 |
|
135 |
+
if (!filter_var($ipAddress, FILTER_VALIDATE_IP)) {
|
136 |
+
throw new InvalidArgumentException(
|
137 |
+
"The value \"$ipAddress\" is not a valid IP address."
|
138 |
+
);
|
139 |
+
}
|
140 |
+
|
141 |
+
list($pointer, $prefixLen) = $this->findAddressInTree($ipAddress);
|
142 |
if ($pointer === 0) {
|
143 |
return [null, $prefixLen];
|
144 |
}
|
146 |
return [$this->resolveDataPointer($pointer), $prefixLen];
|
147 |
}
|
148 |
|
149 |
+
private function findAddressInTree($ipAddress)
|
150 |
{
|
151 |
+
$rawAddress = unpack('C*', inet_pton($ipAddress));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
|
153 |
$bitCount = \count($rawAddress) * 8;
|
154 |
|
182 |
if ($node === $nodeCount) {
|
183 |
// Record is empty
|
184 |
return [0, $i];
|
185 |
+
} elseif ($node > $nodeCount) {
|
|
|
186 |
// Record is a data pointer
|
187 |
return [$node, $i];
|
188 |
}
|
189 |
+
throw new InvalidDatabaseException('Something bad happened');
|
|
|
|
|
|
|
190 |
}
|
191 |
|
192 |
+
private function ipV4StartNode()
|
193 |
{
|
194 |
// If we have an IPv4 database, the start node is the first node
|
195 |
if ($this->metadata->ipVersion === 4) {
|
205 |
return $node;
|
206 |
}
|
207 |
|
208 |
+
private function readNode($nodeNumber, $index)
|
209 |
{
|
210 |
$baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
|
211 |
|
212 |
switch ($this->metadata->recordSize) {
|
213 |
case 24:
|
214 |
$bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
|
215 |
+
list(, $node) = unpack('N', "\x00" . $bytes);
|
216 |
|
217 |
return $node;
|
|
|
218 |
case 28:
|
219 |
$bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4);
|
220 |
if ($index === 0) {
|
222 |
} else {
|
223 |
$middle = 0x0F & \ord($bytes[0]);
|
224 |
}
|
225 |
+
list(, $node) = unpack('N', \chr($middle) . substr($bytes, $index, 3));
|
226 |
|
227 |
return $node;
|
|
|
228 |
case 32:
|
229 |
$bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
|
230 |
+
list(, $node) = unpack('N', $bytes);
|
231 |
|
232 |
return $node;
|
|
|
233 |
default:
|
234 |
throw new InvalidDatabaseException(
|
235 |
'Unknown record size: '
|
238 |
}
|
239 |
}
|
240 |
|
241 |
+
private function resolveDataPointer($pointer)
|
|
|
|
|
|
|
242 |
{
|
243 |
$resolved = $pointer - $this->metadata->nodeCount
|
244 |
+ $this->metadata->searchTreeSize;
|
248 |
);
|
249 |
}
|
250 |
|
251 |
+
list($data) = $this->decoder->decode($resolved);
|
252 |
|
253 |
return $data;
|
254 |
}
|
258 |
* are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
|
259 |
* an issue, but I suspect it won't be.
|
260 |
*/
|
261 |
+
private function findMetadataStart($filename)
|
262 |
{
|
263 |
$handle = $this->fileHandle;
|
264 |
$fstat = fstat($handle);
|
278 |
return $offset + $markerLength;
|
279 |
}
|
280 |
}
|
|
|
281 |
throw new InvalidDatabaseException(
|
282 |
"Error opening database file ($filename). " .
|
283 |
'Is this a valid MaxMind DB file?'
|
290 |
*
|
291 |
* @return Metadata object for the database
|
292 |
*/
|
293 |
+
public function metadata()
|
294 |
{
|
295 |
if (\func_num_args()) {
|
296 |
+
throw new InvalidArgumentException(
|
297 |
+
'Method takes no arguments.'
|
298 |
);
|
299 |
}
|
300 |
|
306 |
);
|
307 |
}
|
308 |
|
309 |
+
return $this->metadata;
|
310 |
}
|
311 |
|
312 |
/**
|
315 |
* @throws Exception
|
316 |
* if an I/O error occurs
|
317 |
*/
|
318 |
+
public function close()
|
319 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
320 |
if (!\is_resource($this->fileHandle)) {
|
321 |
throw new BadMethodCallException(
|
322 |
'Attempt to close a closed MaxMind DB.'
|
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php
CHANGED
@@ -1,68 +1,63 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Db\Reader;
|
6 |
|
7 |
// @codingStandardsIgnoreLine
|
8 |
use RuntimeException;
|
9 |
|
10 |
-
|
11 |
* @ignore
|
12 |
*
|
13 |
* We subtract 1 from the log to protect against precision loss.
|
14 |
*/
|
15 |
-
\define(__NAMESPACE__ . '\_MM_MAX_INT_BYTES', (
|
16 |
|
17 |
class Decoder
|
18 |
{
|
19 |
-
/**
|
20 |
-
* @var resource
|
21 |
-
*/
|
22 |
private $fileStream;
|
23 |
-
/**
|
24 |
-
* @var int
|
25 |
-
*/
|
26 |
private $pointerBase;
|
27 |
-
/**
|
28 |
-
* @var float
|
29 |
-
*/
|
30 |
private $pointerBaseByteSize;
|
31 |
-
|
32 |
-
* This is only used for unit testing.
|
33 |
-
*
|
34 |
-
* @var bool
|
35 |
-
*/
|
36 |
private $pointerTestHack;
|
37 |
-
/**
|
38 |
-
* @var bool
|
39 |
-
*/
|
40 |
private $switchByteOrder;
|
41 |
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
public function __construct(
|
63 |
$fileStream,
|
64 |
-
|
65 |
-
|
66 |
) {
|
67 |
$this->fileStream = $fileStream;
|
68 |
$this->pointerBase = $pointerBase;
|
@@ -73,7 +68,7 @@ class Decoder
|
|
73 |
$this->switchByteOrder = $this->isPlatformLittleEndian();
|
74 |
}
|
75 |
|
76 |
-
public function decode(
|
77 |
{
|
78 |
$ctrlByte = \ord(Util::read($this->fileStream, $offset, 1));
|
79 |
++$offset;
|
@@ -84,14 +79,14 @@ class Decoder
|
|
84 |
// use the size to determine the length of the pointer and then follow
|
85 |
// it.
|
86 |
if ($type === self::_POINTER) {
|
87 |
-
|
88 |
|
89 |
// for unit testing
|
90 |
if ($this->pointerTestHack) {
|
91 |
return [$pointer];
|
92 |
}
|
93 |
|
94 |
-
|
95 |
|
96 |
return [$result, $offset];
|
97 |
}
|
@@ -113,51 +108,43 @@ class Decoder
|
|
113 |
++$offset;
|
114 |
}
|
115 |
|
116 |
-
|
117 |
|
118 |
return $this->decodeByType($type, $offset, $size);
|
119 |
}
|
120 |
|
121 |
-
private function decodeByType(
|
122 |
{
|
123 |
switch ($type) {
|
124 |
case self::_MAP:
|
125 |
return $this->decodeMap($size, $offset);
|
126 |
-
|
127 |
case self::_ARRAY:
|
128 |
return $this->decodeArray($size, $offset);
|
129 |
-
|
130 |
case self::_BOOLEAN:
|
131 |
return [$this->decodeBoolean($size), $offset];
|
132 |
}
|
133 |
|
134 |
$newOffset = $offset + $size;
|
135 |
$bytes = Util::read($this->fileStream, $offset, $size);
|
136 |
-
|
137 |
switch ($type) {
|
138 |
case self::_BYTES:
|
139 |
case self::_UTF8_STRING:
|
140 |
return [$bytes, $newOffset];
|
141 |
-
|
142 |
case self::_DOUBLE:
|
143 |
$this->verifySize(8, $size);
|
144 |
|
145 |
return [$this->decodeDouble($bytes), $newOffset];
|
146 |
-
|
147 |
case self::_FLOAT:
|
148 |
$this->verifySize(4, $size);
|
149 |
|
150 |
return [$this->decodeFloat($bytes), $newOffset];
|
151 |
-
|
152 |
case self::_INT32:
|
153 |
return [$this->decodeInt32($bytes, $size), $newOffset];
|
154 |
-
|
155 |
case self::_UINT16:
|
156 |
case self::_UINT32:
|
157 |
case self::_UINT64:
|
158 |
case self::_UINT128:
|
159 |
return [$this->decodeUint($bytes, $size), $newOffset];
|
160 |
-
|
161 |
default:
|
162 |
throw new InvalidDatabaseException(
|
163 |
'Unknown or unexpected type: ' . $type
|
@@ -165,7 +152,7 @@ class Decoder
|
|
165 |
}
|
166 |
}
|
167 |
|
168 |
-
private function verifySize(
|
169 |
{
|
170 |
if ($expected !== $actual) {
|
171 |
throw new InvalidDatabaseException(
|
@@ -174,82 +161,86 @@ class Decoder
|
|
174 |
}
|
175 |
}
|
176 |
|
177 |
-
private function decodeArray(
|
178 |
{
|
179 |
$array = [];
|
180 |
|
181 |
for ($i = 0; $i < $size; ++$i) {
|
182 |
-
|
183 |
-
$array
|
184 |
}
|
185 |
|
186 |
return [$array, $offset];
|
187 |
}
|
188 |
|
189 |
-
private function decodeBoolean(
|
190 |
{
|
191 |
-
return $size
|
192 |
}
|
193 |
|
194 |
-
private function decodeDouble(
|
195 |
{
|
196 |
// This assumes IEEE 754 doubles, but most (all?) modern platforms
|
197 |
// use them.
|
198 |
-
|
|
|
|
|
|
|
|
|
199 |
|
200 |
return $double;
|
201 |
}
|
202 |
|
203 |
-
private function decodeFloat(
|
204 |
{
|
205 |
// This assumes IEEE 754 floats, but most (all?) modern platforms
|
206 |
// use them.
|
207 |
-
|
|
|
|
|
|
|
|
|
208 |
|
209 |
return $float;
|
210 |
}
|
211 |
|
212 |
-
private function decodeInt32(
|
213 |
{
|
214 |
switch ($size) {
|
215 |
case 0:
|
216 |
return 0;
|
217 |
-
|
218 |
case 1:
|
219 |
case 2:
|
220 |
case 3:
|
221 |
-
$bytes = str_pad($bytes, 4, "\x00",
|
222 |
-
|
223 |
break;
|
224 |
-
|
225 |
case 4:
|
226 |
break;
|
227 |
-
|
228 |
default:
|
229 |
throw new InvalidDatabaseException(
|
230 |
"The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
|
231 |
);
|
232 |
}
|
233 |
|
234 |
-
|
235 |
|
236 |
return $int;
|
237 |
}
|
238 |
|
239 |
-
private function decodeMap(
|
240 |
{
|
241 |
$map = [];
|
242 |
|
243 |
for ($i = 0; $i < $size; ++$i) {
|
244 |
-
|
245 |
-
|
246 |
$map[$key] = $value;
|
247 |
}
|
248 |
|
249 |
return [$map, $offset];
|
250 |
}
|
251 |
|
252 |
-
private function decodePointer(
|
253 |
{
|
254 |
$pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
|
255 |
|
@@ -259,28 +250,22 @@ class Decoder
|
|
259 |
switch ($pointerSize) {
|
260 |
case 1:
|
261 |
$packed = \chr($ctrlByte & 0x7) . $buffer;
|
262 |
-
|
263 |
$pointer += $this->pointerBase;
|
264 |
-
|
265 |
break;
|
266 |
-
|
267 |
case 2:
|
268 |
$packed = "\x00" . \chr($ctrlByte & 0x7) . $buffer;
|
269 |
-
|
270 |
$pointer += $this->pointerBase + 2048;
|
271 |
-
|
272 |
break;
|
273 |
-
|
274 |
case 3:
|
275 |
$packed = \chr($ctrlByte & 0x7) . $buffer;
|
276 |
|
277 |
// It is safe to use 'N' here, even on 32 bit machines as the
|
278 |
// first bit is 0.
|
279 |
-
|
280 |
$pointer += $this->pointerBase + 526336;
|
281 |
-
|
282 |
break;
|
283 |
-
|
284 |
case 4:
|
285 |
// We cannot use unpack here as we might overflow on 32 bit
|
286 |
// machines
|
@@ -293,26 +278,18 @@ class Decoder
|
|
293 |
} elseif (\extension_loaded('gmp')) {
|
294 |
$pointer = gmp_strval(gmp_add($pointerOffset, $this->pointerBase));
|
295 |
} elseif (\extension_loaded('bcmath')) {
|
296 |
-
$pointer = bcadd($pointerOffset,
|
297 |
} else {
|
298 |
throw new RuntimeException(
|
299 |
'The gmp or bcmath extension must be installed to read this database.'
|
300 |
);
|
301 |
}
|
302 |
-
|
303 |
-
break;
|
304 |
-
|
305 |
-
default:
|
306 |
-
throw new InvalidDatabaseException(
|
307 |
-
'Unexpected pointer size ' . $pointerSize
|
308 |
-
);
|
309 |
}
|
310 |
|
311 |
return [$pointer, $offset];
|
312 |
}
|
313 |
|
314 |
-
|
315 |
-
private function decodeUint(string $bytes, int $byteLength)
|
316 |
{
|
317 |
if ($byteLength === 0) {
|
318 |
return 0;
|
@@ -320,22 +297,16 @@ class Decoder
|
|
320 |
|
321 |
$integer = 0;
|
322 |
|
323 |
-
// PHP integers are signed. _MM_MAX_INT_BYTES is the number of
|
324 |
-
// complete bytes that can be converted to an integer. However,
|
325 |
-
// we can convert another byte if the leading bit is zero.
|
326 |
-
$useRealInts = $byteLength <= _MM_MAX_INT_BYTES
|
327 |
-
|| ($byteLength === _MM_MAX_INT_BYTES + 1 && (\ord($bytes[0]) & 0x80) === 0);
|
328 |
-
|
329 |
for ($i = 0; $i < $byteLength; ++$i) {
|
330 |
$part = \ord($bytes[$i]);
|
331 |
|
332 |
// We only use gmp or bcmath if the final value is too big
|
333 |
-
if ($
|
334 |
$integer = ($integer << 8) + $part;
|
335 |
} elseif (\extension_loaded('gmp')) {
|
336 |
-
$integer = gmp_strval(gmp_add(gmp_mul(
|
337 |
} elseif (\extension_loaded('bcmath')) {
|
338 |
-
$integer = bcadd(bcmul(
|
339 |
} else {
|
340 |
throw new RuntimeException(
|
341 |
'The gmp or bcmath extension must be installed to read this database.'
|
@@ -346,7 +317,7 @@ class Decoder
|
|
346 |
return $integer;
|
347 |
}
|
348 |
|
349 |
-
private function sizeFromCtrlByte(
|
350 |
{
|
351 |
$size = $ctrlByte & 0x1f;
|
352 |
|
@@ -360,22 +331,22 @@ class Decoder
|
|
360 |
if ($size === 29) {
|
361 |
$size = 29 + \ord($bytes);
|
362 |
} elseif ($size === 30) {
|
363 |
-
|
364 |
$size = 285 + $adjust;
|
365 |
-
}
|
366 |
-
|
367 |
$size = $adjust + 65821;
|
368 |
}
|
369 |
|
370 |
return [$size, $offset + $bytesToRead];
|
371 |
}
|
372 |
|
373 |
-
private function maybeSwitchByteOrder(
|
374 |
{
|
375 |
return $this->switchByteOrder ? strrev($bytes) : $bytes;
|
376 |
}
|
377 |
|
378 |
-
private function isPlatformLittleEndian()
|
379 |
{
|
380 |
$testint = 0x00FF;
|
381 |
$packed = pack('S', $testint);
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Db\Reader;
|
4 |
|
5 |
// @codingStandardsIgnoreLine
|
6 |
use RuntimeException;
|
7 |
|
8 |
+
/**
|
9 |
* @ignore
|
10 |
*
|
11 |
* We subtract 1 from the log to protect against precision loss.
|
12 |
*/
|
13 |
+
\define(__NAMESPACE__ . '\_MM_MAX_INT_BYTES', (log(PHP_INT_MAX, 2) - 1) / 8);
|
14 |
|
15 |
class Decoder
|
16 |
{
|
|
|
|
|
|
|
17 |
private $fileStream;
|
|
|
|
|
|
|
18 |
private $pointerBase;
|
|
|
|
|
|
|
19 |
private $pointerBaseByteSize;
|
20 |
+
// This is only used for unit testing
|
|
|
|
|
|
|
|
|
21 |
private $pointerTestHack;
|
|
|
|
|
|
|
22 |
private $switchByteOrder;
|
23 |
|
24 |
+
/** @ignore */
|
25 |
+
const _EXTENDED = 0;
|
26 |
+
/** @ignore */
|
27 |
+
const _POINTER = 1;
|
28 |
+
/** @ignore */
|
29 |
+
const _UTF8_STRING = 2;
|
30 |
+
/** @ignore */
|
31 |
+
const _DOUBLE = 3;
|
32 |
+
/** @ignore */
|
33 |
+
const _BYTES = 4;
|
34 |
+
/** @ignore */
|
35 |
+
const _UINT16 = 5;
|
36 |
+
/** @ignore */
|
37 |
+
const _UINT32 = 6;
|
38 |
+
/** @ignore */
|
39 |
+
const _MAP = 7;
|
40 |
+
/** @ignore */
|
41 |
+
const _INT32 = 8;
|
42 |
+
/** @ignore */
|
43 |
+
const _UINT64 = 9;
|
44 |
+
/** @ignore */
|
45 |
+
const _UINT128 = 10;
|
46 |
+
/** @ignore */
|
47 |
+
const _ARRAY = 11;
|
48 |
+
/** @ignore */
|
49 |
+
const _CONTAINER = 12;
|
50 |
+
/** @ignore */
|
51 |
+
const _END_MARKER = 13;
|
52 |
+
/** @ignore */
|
53 |
+
const _BOOLEAN = 14;
|
54 |
+
/** @ignore */
|
55 |
+
const _FLOAT = 15;
|
56 |
+
|
57 |
public function __construct(
|
58 |
$fileStream,
|
59 |
+
$pointerBase = 0,
|
60 |
+
$pointerTestHack = false
|
61 |
) {
|
62 |
$this->fileStream = $fileStream;
|
63 |
$this->pointerBase = $pointerBase;
|
68 |
$this->switchByteOrder = $this->isPlatformLittleEndian();
|
69 |
}
|
70 |
|
71 |
+
public function decode($offset)
|
72 |
{
|
73 |
$ctrlByte = \ord(Util::read($this->fileStream, $offset, 1));
|
74 |
++$offset;
|
79 |
// use the size to determine the length of the pointer and then follow
|
80 |
// it.
|
81 |
if ($type === self::_POINTER) {
|
82 |
+
list($pointer, $offset) = $this->decodePointer($ctrlByte, $offset);
|
83 |
|
84 |
// for unit testing
|
85 |
if ($this->pointerTestHack) {
|
86 |
return [$pointer];
|
87 |
}
|
88 |
|
89 |
+
list($result) = $this->decode($pointer);
|
90 |
|
91 |
return [$result, $offset];
|
92 |
}
|
108 |
++$offset;
|
109 |
}
|
110 |
|
111 |
+
list($size, $offset) = $this->sizeFromCtrlByte($ctrlByte, $offset);
|
112 |
|
113 |
return $this->decodeByType($type, $offset, $size);
|
114 |
}
|
115 |
|
116 |
+
private function decodeByType($type, $offset, $size)
|
117 |
{
|
118 |
switch ($type) {
|
119 |
case self::_MAP:
|
120 |
return $this->decodeMap($size, $offset);
|
|
|
121 |
case self::_ARRAY:
|
122 |
return $this->decodeArray($size, $offset);
|
|
|
123 |
case self::_BOOLEAN:
|
124 |
return [$this->decodeBoolean($size), $offset];
|
125 |
}
|
126 |
|
127 |
$newOffset = $offset + $size;
|
128 |
$bytes = Util::read($this->fileStream, $offset, $size);
|
|
|
129 |
switch ($type) {
|
130 |
case self::_BYTES:
|
131 |
case self::_UTF8_STRING:
|
132 |
return [$bytes, $newOffset];
|
|
|
133 |
case self::_DOUBLE:
|
134 |
$this->verifySize(8, $size);
|
135 |
|
136 |
return [$this->decodeDouble($bytes), $newOffset];
|
|
|
137 |
case self::_FLOAT:
|
138 |
$this->verifySize(4, $size);
|
139 |
|
140 |
return [$this->decodeFloat($bytes), $newOffset];
|
|
|
141 |
case self::_INT32:
|
142 |
return [$this->decodeInt32($bytes, $size), $newOffset];
|
|
|
143 |
case self::_UINT16:
|
144 |
case self::_UINT32:
|
145 |
case self::_UINT64:
|
146 |
case self::_UINT128:
|
147 |
return [$this->decodeUint($bytes, $size), $newOffset];
|
|
|
148 |
default:
|
149 |
throw new InvalidDatabaseException(
|
150 |
'Unknown or unexpected type: ' . $type
|
152 |
}
|
153 |
}
|
154 |
|
155 |
+
private function verifySize($expected, $actual)
|
156 |
{
|
157 |
if ($expected !== $actual) {
|
158 |
throw new InvalidDatabaseException(
|
161 |
}
|
162 |
}
|
163 |
|
164 |
+
private function decodeArray($size, $offset)
|
165 |
{
|
166 |
$array = [];
|
167 |
|
168 |
for ($i = 0; $i < $size; ++$i) {
|
169 |
+
list($value, $offset) = $this->decode($offset);
|
170 |
+
array_push($array, $value);
|
171 |
}
|
172 |
|
173 |
return [$array, $offset];
|
174 |
}
|
175 |
|
176 |
+
private function decodeBoolean($size)
|
177 |
{
|
178 |
+
return $size === 0 ? false : true;
|
179 |
}
|
180 |
|
181 |
+
private function decodeDouble($bits)
|
182 |
{
|
183 |
// This assumes IEEE 754 doubles, but most (all?) modern platforms
|
184 |
// use them.
|
185 |
+
//
|
186 |
+
// We are not using the "E" format as that was only added in
|
187 |
+
// 7.0.15 and 7.1.1. As such, we must switch byte order on
|
188 |
+
// little endian machines.
|
189 |
+
list(, $double) = unpack('d', $this->maybeSwitchByteOrder($bits));
|
190 |
|
191 |
return $double;
|
192 |
}
|
193 |
|
194 |
+
private function decodeFloat($bits)
|
195 |
{
|
196 |
// This assumes IEEE 754 floats, but most (all?) modern platforms
|
197 |
// use them.
|
198 |
+
//
|
199 |
+
// We are not using the "G" format as that was only added in
|
200 |
+
// 7.0.15 and 7.1.1. As such, we must switch byte order on
|
201 |
+
// little endian machines.
|
202 |
+
list(, $float) = unpack('f', $this->maybeSwitchByteOrder($bits));
|
203 |
|
204 |
return $float;
|
205 |
}
|
206 |
|
207 |
+
private function decodeInt32($bytes, $size)
|
208 |
{
|
209 |
switch ($size) {
|
210 |
case 0:
|
211 |
return 0;
|
|
|
212 |
case 1:
|
213 |
case 2:
|
214 |
case 3:
|
215 |
+
$bytes = str_pad($bytes, 4, "\x00", STR_PAD_LEFT);
|
|
|
216 |
break;
|
|
|
217 |
case 4:
|
218 |
break;
|
|
|
219 |
default:
|
220 |
throw new InvalidDatabaseException(
|
221 |
"The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
|
222 |
);
|
223 |
}
|
224 |
|
225 |
+
list(, $int) = unpack('l', $this->maybeSwitchByteOrder($bytes));
|
226 |
|
227 |
return $int;
|
228 |
}
|
229 |
|
230 |
+
private function decodeMap($size, $offset)
|
231 |
{
|
232 |
$map = [];
|
233 |
|
234 |
for ($i = 0; $i < $size; ++$i) {
|
235 |
+
list($key, $offset) = $this->decode($offset);
|
236 |
+
list($value, $offset) = $this->decode($offset);
|
237 |
$map[$key] = $value;
|
238 |
}
|
239 |
|
240 |
return [$map, $offset];
|
241 |
}
|
242 |
|
243 |
+
private function decodePointer($ctrlByte, $offset)
|
244 |
{
|
245 |
$pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
|
246 |
|
250 |
switch ($pointerSize) {
|
251 |
case 1:
|
252 |
$packed = \chr($ctrlByte & 0x7) . $buffer;
|
253 |
+
list(, $pointer) = unpack('n', $packed);
|
254 |
$pointer += $this->pointerBase;
|
|
|
255 |
break;
|
|
|
256 |
case 2:
|
257 |
$packed = "\x00" . \chr($ctrlByte & 0x7) . $buffer;
|
258 |
+
list(, $pointer) = unpack('N', $packed);
|
259 |
$pointer += $this->pointerBase + 2048;
|
|
|
260 |
break;
|
|
|
261 |
case 3:
|
262 |
$packed = \chr($ctrlByte & 0x7) . $buffer;
|
263 |
|
264 |
// It is safe to use 'N' here, even on 32 bit machines as the
|
265 |
// first bit is 0.
|
266 |
+
list(, $pointer) = unpack('N', $packed);
|
267 |
$pointer += $this->pointerBase + 526336;
|
|
|
268 |
break;
|
|
|
269 |
case 4:
|
270 |
// We cannot use unpack here as we might overflow on 32 bit
|
271 |
// machines
|
278 |
} elseif (\extension_loaded('gmp')) {
|
279 |
$pointer = gmp_strval(gmp_add($pointerOffset, $this->pointerBase));
|
280 |
} elseif (\extension_loaded('bcmath')) {
|
281 |
+
$pointer = bcadd($pointerOffset, $this->pointerBase);
|
282 |
} else {
|
283 |
throw new RuntimeException(
|
284 |
'The gmp or bcmath extension must be installed to read this database.'
|
285 |
);
|
286 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
287 |
}
|
288 |
|
289 |
return [$pointer, $offset];
|
290 |
}
|
291 |
|
292 |
+
private function decodeUint($bytes, $byteLength)
|
|
|
293 |
{
|
294 |
if ($byteLength === 0) {
|
295 |
return 0;
|
297 |
|
298 |
$integer = 0;
|
299 |
|
|
|
|
|
|
|
|
|
|
|
|
|
300 |
for ($i = 0; $i < $byteLength; ++$i) {
|
301 |
$part = \ord($bytes[$i]);
|
302 |
|
303 |
// We only use gmp or bcmath if the final value is too big
|
304 |
+
if ($byteLength <= _MM_MAX_INT_BYTES) {
|
305 |
$integer = ($integer << 8) + $part;
|
306 |
} elseif (\extension_loaded('gmp')) {
|
307 |
+
$integer = gmp_strval(gmp_add(gmp_mul($integer, 256), $part));
|
308 |
} elseif (\extension_loaded('bcmath')) {
|
309 |
+
$integer = bcadd(bcmul($integer, 256), $part);
|
310 |
} else {
|
311 |
throw new RuntimeException(
|
312 |
'The gmp or bcmath extension must be installed to read this database.'
|
317 |
return $integer;
|
318 |
}
|
319 |
|
320 |
+
private function sizeFromCtrlByte($ctrlByte, $offset)
|
321 |
{
|
322 |
$size = $ctrlByte & 0x1f;
|
323 |
|
331 |
if ($size === 29) {
|
332 |
$size = 29 + \ord($bytes);
|
333 |
} elseif ($size === 30) {
|
334 |
+
list(, $adjust) = unpack('n', $bytes);
|
335 |
$size = 285 + $adjust;
|
336 |
+
} elseif ($size > 30) {
|
337 |
+
list(, $adjust) = unpack('N', "\x00" . $bytes);
|
338 |
$size = $adjust + 65821;
|
339 |
}
|
340 |
|
341 |
return [$size, $offset + $bytesToRead];
|
342 |
}
|
343 |
|
344 |
+
private function maybeSwitchByteOrder($bytes)
|
345 |
{
|
346 |
return $this->switchByteOrder ? strrev($bytes) : $bytes;
|
347 |
}
|
348 |
|
349 |
+
private function isPlatformLittleEndian()
|
350 |
{
|
351 |
$testint = 0x00FF;
|
352 |
$packed = pack('S', $testint);
|
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Db\Reader;
|
6 |
|
7 |
use Exception;
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Db\Reader;
|
4 |
|
5 |
use Exception;
|
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php
CHANGED
@@ -1,100 +1,71 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Db\Reader;
|
6 |
|
7 |
-
use ArgumentCountError;
|
8 |
-
|
9 |
/**
|
10 |
* This class provides the metadata for the MaxMind DB file.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
*/
|
12 |
class Metadata
|
13 |
{
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
* @var int
|
26 |
-
*/
|
27 |
-
public $binaryFormatMinorVersion;
|
28 |
-
/**
|
29 |
-
* This is an unsigned 64-bit integer that contains the database build
|
30 |
-
* timestamp as a Unix epoch value.
|
31 |
-
*
|
32 |
-
* @var int
|
33 |
-
*/
|
34 |
-
public $buildEpoch;
|
35 |
-
/**
|
36 |
-
* This is a string that indicates the structure of each data record
|
37 |
-
* associated with an IP address. The actual definition of these
|
38 |
-
* structures is left up to the database creator.
|
39 |
-
*
|
40 |
-
* @var string
|
41 |
-
*/
|
42 |
-
public $databaseType;
|
43 |
-
/**
|
44 |
-
* This key will always point to a map (associative array). The keys of
|
45 |
-
* that map will be language codes, and the values will be a description
|
46 |
-
* in that language as a UTF-8 string. May be undefined for some
|
47 |
-
* databases.
|
48 |
-
*
|
49 |
-
* @var array
|
50 |
-
*/
|
51 |
-
public $description;
|
52 |
-
/**
|
53 |
-
* This is an unsigned 16-bit integer which is always 4 or 6. It indicates
|
54 |
-
* whether the database contains IPv4 or IPv6 address data.
|
55 |
-
*
|
56 |
-
* @var int
|
57 |
-
*/
|
58 |
-
public $ipVersion;
|
59 |
-
/**
|
60 |
-
* An array of strings, each of which is a language code. A given record
|
61 |
-
* may contain data items that have been localized to some or all of
|
62 |
-
* these languages. This may be undefined.
|
63 |
-
*
|
64 |
-
* @var array
|
65 |
-
*/
|
66 |
-
public $languages;
|
67 |
-
/**
|
68 |
-
* @var int
|
69 |
-
*/
|
70 |
-
public $nodeByteSize;
|
71 |
-
/**
|
72 |
-
* This is an unsigned 32-bit integer indicating the number of nodes in
|
73 |
-
* the search tree.
|
74 |
-
*
|
75 |
-
* @var int
|
76 |
-
*/
|
77 |
-
public $nodeCount;
|
78 |
-
/**
|
79 |
-
* This is an unsigned 16-bit integer. It indicates the number of bits in a
|
80 |
-
* record in the search tree. Note that each node consists of two records.
|
81 |
-
*
|
82 |
-
* @var int
|
83 |
-
*/
|
84 |
-
public $recordSize;
|
85 |
-
/**
|
86 |
-
* @var int
|
87 |
-
*/
|
88 |
-
public $searchTreeSize;
|
89 |
|
90 |
-
public function __construct(
|
91 |
{
|
92 |
-
if (\func_num_args() !== 1) {
|
93 |
-
throw new ArgumentCountError(
|
94 |
-
sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
|
95 |
-
);
|
96 |
-
}
|
97 |
-
|
98 |
$this->binaryFormatMajorVersion =
|
99 |
$metadata['binary_format_major_version'];
|
100 |
$this->binaryFormatMinorVersion =
|
@@ -109,4 +80,9 @@ class Metadata
|
|
109 |
$this->nodeByteSize = $this->recordSize / 4;
|
110 |
$this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
|
111 |
}
|
|
|
|
|
|
|
|
|
|
|
112 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Db\Reader;
|
4 |
|
|
|
|
|
5 |
/**
|
6 |
* This class provides the metadata for the MaxMind DB file.
|
7 |
+
*
|
8 |
+
* @property int $nodeCount This is an unsigned 32-bit
|
9 |
+
* integer indicating the number of
|
10 |
+
* nodes in the search tree.
|
11 |
+
* @property int $recordSize This is an unsigned 16-bit
|
12 |
+
* integer. It indicates the number
|
13 |
+
* of bits in a record in the search
|
14 |
+
* tree. Note that each node
|
15 |
+
* consists of two records.
|
16 |
+
* @property int $ipVersion This is an unsigned 16-bit
|
17 |
+
* integer which is always 4 or 6.
|
18 |
+
* It indicates whether the database
|
19 |
+
* contains IPv4 or IPv6 address
|
20 |
+
* data.
|
21 |
+
* @property string $databaseType This is a string that indicates
|
22 |
+
* the structure of each data record
|
23 |
+
* associated with an IP address.
|
24 |
+
* The actual definition of these
|
25 |
+
* structures is left up to the
|
26 |
+
* database creator.
|
27 |
+
* @property array $languages An array of strings, each of
|
28 |
+
* which is a language code. A given
|
29 |
+
* record may contain data items
|
30 |
+
* that have been localized to some
|
31 |
+
* or all of these languages. This
|
32 |
+
* may be undefined.
|
33 |
+
* @property int $binaryFormatMajorVersion This is an unsigned 16-bit
|
34 |
+
* integer indicating the major
|
35 |
+
* version number for the database's
|
36 |
+
* binary format.
|
37 |
+
* @property int $binaryFormatMinorVersion This is an unsigned 16-bit
|
38 |
+
* integer indicating the minor
|
39 |
+
* version number for the database's
|
40 |
+
* binary format.
|
41 |
+
* @property int $buildEpoch This is an unsigned 64-bit
|
42 |
+
* integer that contains the
|
43 |
+
* database build timestamp as a
|
44 |
+
* Unix epoch value.
|
45 |
+
* @property array $description This key will always point to a
|
46 |
+
* map (associative array). The keys
|
47 |
+
* of that map will be language
|
48 |
+
* codes, and the values will be a
|
49 |
+
* description in that language as a
|
50 |
+
* UTF-8 string. May be undefined
|
51 |
+
* for some databases.
|
52 |
*/
|
53 |
class Metadata
|
54 |
{
|
55 |
+
private $binaryFormatMajorVersion;
|
56 |
+
private $binaryFormatMinorVersion;
|
57 |
+
private $buildEpoch;
|
58 |
+
private $databaseType;
|
59 |
+
private $description;
|
60 |
+
private $ipVersion;
|
61 |
+
private $languages;
|
62 |
+
private $nodeByteSize;
|
63 |
+
private $nodeCount;
|
64 |
+
private $recordSize;
|
65 |
+
private $searchTreeSize;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
|
67 |
+
public function __construct($metadata)
|
68 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
$this->binaryFormatMajorVersion =
|
70 |
$metadata['binary_format_major_version'];
|
71 |
$this->binaryFormatMinorVersion =
|
80 |
$this->nodeByteSize = $this->recordSize / 4;
|
81 |
$this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
|
82 |
}
|
83 |
+
|
84 |
+
public function __get($var)
|
85 |
+
{
|
86 |
+
return $this->$var;
|
87 |
+
}
|
88 |
}
|
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php
CHANGED
@@ -1,15 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Db\Reader;
|
6 |
|
7 |
class Util
|
8 |
{
|
9 |
-
|
10 |
-
* @param resource $stream
|
11 |
-
*/
|
12 |
-
public static function read($stream, int $offset, int $numberOfBytes): string
|
13 |
{
|
14 |
if ($numberOfBytes === 0) {
|
15 |
return '';
|
@@ -20,11 +15,10 @@ class Util
|
|
20 |
// We check that the number of bytes read is equal to the number
|
21 |
// asked for. We use ftell as getting the length of $value is
|
22 |
// much slower.
|
23 |
-
if (
|
24 |
return $value;
|
25 |
}
|
26 |
}
|
27 |
-
|
28 |
throw new InvalidDatabaseException(
|
29 |
'The MaxMind DB file contains bad data'
|
30 |
);
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Db\Reader;
|
4 |
|
5 |
class Util
|
6 |
{
|
7 |
+
public static function read($stream, $offset, $numberOfBytes)
|
|
|
|
|
|
|
8 |
{
|
9 |
if ($numberOfBytes === 0) {
|
10 |
return '';
|
15 |
// We check that the number of bytes read is equal to the number
|
16 |
// asked for. We use ftell as getting the length of $value is
|
17 |
// much slower.
|
18 |
+
if (ftell($stream) - $offset === $numberOfBytes) {
|
19 |
return $value;
|
20 |
}
|
21 |
}
|
|
|
22 |
throw new InvalidDatabaseException(
|
23 |
'The MaxMind DB file contains bad data'
|
24 |
);
|
vendor/maxmind/web-service-common/CHANGELOG.md
CHANGED
@@ -1,21 +1,6 @@
|
|
1 |
CHANGELOG
|
2 |
=========
|
3 |
|
4 |
-
0.8.1 (2020-11-02)
|
5 |
-
------------------
|
6 |
-
|
7 |
-
* We now correctly handle responses without a `Content-Type` header. In 0.8.0,
|
8 |
-
such responses could lead to a type error. In particular, this affected the
|
9 |
-
minFraud Report Transaction endpoint, which returns a response with no
|
10 |
-
content. Reported by Dmitry Malashko. GitHub #99 on
|
11 |
-
`maxmind/minfraud-api-php`.
|
12 |
-
|
13 |
-
0.8.0 (2020-10-01)
|
14 |
-
------------------
|
15 |
-
|
16 |
-
* PHP 7.2 or greater is now required.
|
17 |
-
* Added additional type hints.
|
18 |
-
|
19 |
0.7.0 (2020-05-06)
|
20 |
------------------
|
21 |
|
1 |
CHANGELOG
|
2 |
=========
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
0.7.0 (2020-05-06)
|
5 |
------------------
|
6 |
|
vendor/maxmind/web-service-common/README.md
CHANGED
@@ -5,7 +5,7 @@ shared code between MaxMind's various web service client APIs.
|
|
5 |
|
6 |
## Requirements ##
|
7 |
|
8 |
-
The library requires PHP
|
9 |
|
10 |
There are several other dependencies as defined in the `composer.json` file.
|
11 |
|
5 |
|
6 |
## Requirements ##
|
7 |
|
8 |
+
The library requires PHP 5.6 or greater.
|
9 |
|
10 |
There are several other dependencies as defined in the `composer.json` file.
|
11 |
|
vendor/maxmind/web-service-common/composer.json
CHANGED
@@ -12,14 +12,14 @@
|
|
12 |
}
|
13 |
],
|
14 |
"require": {
|
15 |
-
"php": ">=
|
16 |
"composer/ca-bundle": "^1.0.3",
|
17 |
"ext-curl": "*",
|
18 |
"ext-json": "*"
|
19 |
},
|
20 |
"require-dev": {
|
21 |
"friendsofphp/php-cs-fixer": "2.*",
|
22 |
-
"phpunit/phpunit": "^8.
|
23 |
"squizlabs/php_codesniffer": "3.*"
|
24 |
},
|
25 |
"autoload": {
|
12 |
}
|
13 |
],
|
14 |
"require": {
|
15 |
+
"php": ">=5.6",
|
16 |
"composer/ca-bundle": "^1.0.3",
|
17 |
"ext-curl": "*",
|
18 |
"ext-json": "*"
|
19 |
},
|
20 |
"require-dev": {
|
21 |
"friendsofphp/php-cs-fixer": "2.*",
|
22 |
+
"phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
|
23 |
"squizlabs/php_codesniffer": "3.*"
|
24 |
},
|
25 |
"autoload": {
|
vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
/**
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
/**
|
vendor/maxmind/web-service-common/src/Exception/HttpException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
/**
|
@@ -21,21 +19,21 @@ class HttpException extends WebServiceException
|
|
21 |
* @param \Exception $previous the previous exception, if any
|
22 |
*/
|
23 |
public function __construct(
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
\Exception $previous = null
|
28 |
) {
|
29 |
$this->uri = $uri;
|
30 |
parent::__construct($message, $httpStatus, $previous);
|
31 |
}
|
32 |
|
33 |
-
public function getUri()
|
34 |
{
|
35 |
return $this->uri;
|
36 |
}
|
37 |
|
38 |
-
public function getStatusCode()
|
39 |
{
|
40 |
return $this->getCode();
|
41 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
/**
|
19 |
* @param \Exception $previous the previous exception, if any
|
20 |
*/
|
21 |
public function __construct(
|
22 |
+
$message,
|
23 |
+
$httpStatus,
|
24 |
+
$uri,
|
25 |
\Exception $previous = null
|
26 |
) {
|
27 |
$this->uri = $uri;
|
28 |
parent::__construct($message, $httpStatus, $previous);
|
29 |
}
|
30 |
|
31 |
+
public function getUri()
|
32 |
{
|
33 |
return $this->uri;
|
34 |
}
|
35 |
|
36 |
+
public function getStatusCode()
|
37 |
{
|
38 |
return $this->getCode();
|
39 |
}
|
vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
/**
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
/**
|
vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
/**
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
/**
|
vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
/**
|
@@ -16,23 +14,23 @@ class InvalidRequestException extends HttpException
|
|
16 |
|
17 |
/**
|
18 |
* @param string $message the exception message
|
19 |
-
* @param
|
20 |
* @param int $httpStatus the HTTP status code of the response
|
21 |
* @param string $uri the URI queries
|
22 |
* @param \Exception $previous the previous exception, if any
|
23 |
*/
|
24 |
public function __construct(
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
\Exception $previous = null
|
30 |
) {
|
31 |
$this->error = $error;
|
32 |
parent::__construct($message, $httpStatus, $uri, $previous);
|
33 |
}
|
34 |
|
35 |
-
public function getErrorCode()
|
36 |
{
|
37 |
return $this->error;
|
38 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
/**
|
14 |
|
15 |
/**
|
16 |
* @param string $message the exception message
|
17 |
+
* @param int $error the error code returned by the MaxMind web service
|
18 |
* @param int $httpStatus the HTTP status code of the response
|
19 |
* @param string $uri the URI queries
|
20 |
* @param \Exception $previous the previous exception, if any
|
21 |
*/
|
22 |
public function __construct(
|
23 |
+
$message,
|
24 |
+
$error,
|
25 |
+
$httpStatus,
|
26 |
+
$uri,
|
27 |
\Exception $previous = null
|
28 |
) {
|
29 |
$this->error = $error;
|
30 |
parent::__construct($message, $httpStatus, $uri, $previous);
|
31 |
}
|
32 |
|
33 |
+
public function getErrorCode()
|
34 |
{
|
35 |
return $this->error;
|
36 |
}
|
vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
class IpAddressNotFoundException extends InvalidRequestException
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
class IpAddressNotFoundException extends InvalidRequestException
|
vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
/**
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
/**
|
vendor/maxmind/web-service-common/src/Exception/WebServiceException.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\Exception;
|
6 |
|
7 |
/**
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\Exception;
|
4 |
|
5 |
/**
|
vendor/maxmind/web-service-common/src/WebService/Client.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\WebService;
|
6 |
|
7 |
use Composer\CaBundle\CaBundle;
|
@@ -49,9 +47,9 @@ class Client
|
|
49 |
* username, and password, e.g., `http://username:password@127.0.0.1:10`.
|
50 |
*/
|
51 |
public function __construct(
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
) {
|
56 |
$this->accountId = $accountId;
|
57 |
$this->licenseKey = $licenseKey;
|
@@ -98,9 +96,9 @@ class Client
|
|
98 |
* @throws WebServiceException when some other error occurs. This also
|
99 |
* serves as the base class for the above exceptions.
|
100 |
*
|
101 |
-
* @return array
|
102 |
*/
|
103 |
-
public function post(
|
104 |
{
|
105 |
$requestBody = json_encode($input);
|
106 |
if ($requestBody === false) {
|
@@ -126,7 +124,7 @@ class Client
|
|
126 |
);
|
127 |
}
|
128 |
|
129 |
-
public function get(
|
130 |
{
|
131 |
$request = $this->createRequest($path);
|
132 |
|
@@ -141,7 +139,7 @@ class Client
|
|
141 |
);
|
142 |
}
|
143 |
|
144 |
-
private function userAgent()
|
145 |
{
|
146 |
$curlVersion = curl_version();
|
147 |
|
@@ -149,7 +147,7 @@ class Client
|
|
149 |
' curl/' . $curlVersion['version'];
|
150 |
}
|
151 |
|
152 |
-
private function createRequest(
|
153 |
{
|
154 |
array_push(
|
155 |
$headers,
|
@@ -172,11 +170,11 @@ class Client
|
|
172 |
}
|
173 |
|
174 |
/**
|
175 |
-
* @param int
|
176 |
-
* @param string
|
177 |
-
* @param string
|
178 |
-
* @param string
|
179 |
-
* @param string
|
180 |
*
|
181 |
* @throws AuthenticationException when there is an issue authenticating the
|
182 |
* request
|
@@ -187,15 +185,15 @@ class Client
|
|
187 |
* @throws WebServiceException when some other error occurs. This also
|
188 |
* serves as the base class for the above exceptions
|
189 |
*
|
190 |
-
* @return array
|
191 |
*/
|
192 |
private function handleResponse(
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
)
|
199 |
if ($statusCode >= 400 && $statusCode <= 499) {
|
200 |
$this->handle4xx($statusCode, $contentType, $responseBody, $service, $path);
|
201 |
} elseif ($statusCode >= 500) {
|
@@ -210,7 +208,7 @@ class Client
|
|
210 |
/**
|
211 |
* @return string describing the JSON error
|
212 |
*/
|
213 |
-
private function jsonErrorDescription()
|
214 |
{
|
215 |
$errno = json_last_error();
|
216 |
switch ($errno) {
|
@@ -234,17 +232,17 @@ class Client
|
|
234 |
*
|
235 |
* @return string the constructed URL
|
236 |
*/
|
237 |
-
private function urlFor(
|
238 |
{
|
239 |
return 'https://' . $this->host . $path;
|
240 |
}
|
241 |
|
242 |
/**
|
243 |
-
* @param int
|
244 |
-
* @param string
|
245 |
-
* @param string
|
246 |
-
* @param string
|
247 |
-
* @param string
|
248 |
*
|
249 |
* @throws AuthenticationException
|
250 |
* @throws HttpException
|
@@ -252,20 +250,20 @@ class Client
|
|
252 |
* @throws InvalidRequestException
|
253 |
*/
|
254 |
private function handle4xx(
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
)
|
261 |
-
if ($body ===
|
262 |
throw new HttpException(
|
263 |
"Received a $statusCode error for $service with no body",
|
264 |
$statusCode,
|
265 |
$this->urlFor($path)
|
266 |
);
|
267 |
}
|
268 |
-
if (
|
269 |
throw new HttpException(
|
270 |
"Received a $statusCode error for $service with " .
|
271 |
'the following body: ' . $body,
|
@@ -313,11 +311,11 @@ class Client
|
|
313 |
* @throws InsufficientFundsException
|
314 |
*/
|
315 |
private function handleWebServiceError(
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
)
|
321 |
switch ($code) {
|
322 |
case 'IP_ADDRESS_NOT_FOUND':
|
323 |
case 'IP_ADDRESS_RESERVED':
|
@@ -371,7 +369,7 @@ class Client
|
|
371 |
*
|
372 |
* @throws HttpException
|
373 |
*/
|
374 |
-
private function handle5xx(
|
375 |
{
|
376 |
throw new HttpException(
|
377 |
"Received a server error ($statusCode) for $service",
|
@@ -387,7 +385,7 @@ class Client
|
|
387 |
*
|
388 |
* @throws HttpException
|
389 |
*/
|
390 |
-
private function handleUnexpectedStatus(
|
391 |
{
|
392 |
throw new HttpException(
|
393 |
'Received an unexpected HTTP status ' .
|
@@ -398,22 +396,22 @@ class Client
|
|
398 |
}
|
399 |
|
400 |
/**
|
401 |
-
* @param int
|
402 |
-
* @param string
|
403 |
-
* @param string
|
404 |
*
|
405 |
* @throws WebServiceException if a response body is included but not
|
406 |
* expected, or is not expected but not
|
407 |
* included, or is expected and included
|
408 |
* but cannot be decoded as JSON
|
409 |
*
|
410 |
-
* @return array
|
411 |
*/
|
412 |
-
private function handleSuccess(
|
413 |
{
|
414 |
// A 204 should have no response body
|
415 |
if ($statusCode === 204) {
|
416 |
-
if ($body !==
|
417 |
throw new WebServiceException(
|
418 |
"Received a 204 response for $service along with an " .
|
419 |
"unexpected HTTP body: $body"
|
@@ -424,7 +422,7 @@ class Client
|
|
424 |
}
|
425 |
|
426 |
// A 200 should have a valid JSON body
|
427 |
-
if ($body ===
|
428 |
throw new WebServiceException(
|
429 |
"Received a 200 response for $service but did not " .
|
430 |
'receive a HTTP body.'
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\WebService;
|
4 |
|
5 |
use Composer\CaBundle\CaBundle;
|
47 |
* username, and password, e.g., `http://username:password@127.0.0.1:10`.
|
48 |
*/
|
49 |
public function __construct(
|
50 |
+
$accountId,
|
51 |
+
$licenseKey,
|
52 |
+
$options = []
|
53 |
) {
|
54 |
$this->accountId = $accountId;
|
55 |
$this->licenseKey = $licenseKey;
|
96 |
* @throws WebServiceException when some other error occurs. This also
|
97 |
* serves as the base class for the above exceptions.
|
98 |
*
|
99 |
+
* @return array The decoded content of a successful response
|
100 |
*/
|
101 |
+
public function post($service, $path, $input)
|
102 |
{
|
103 |
$requestBody = json_encode($input);
|
104 |
if ($requestBody === false) {
|
124 |
);
|
125 |
}
|
126 |
|
127 |
+
public function get($service, $path)
|
128 |
{
|
129 |
$request = $this->createRequest($path);
|
130 |
|
139 |
);
|
140 |
}
|
141 |
|
142 |
+
private function userAgent()
|
143 |
{
|
144 |
$curlVersion = curl_version();
|
145 |
|
147 |
' curl/' . $curlVersion['version'];
|
148 |
}
|
149 |
|
150 |
+
private function createRequest($path, $headers = [])
|
151 |
{
|
152 |
array_push(
|
153 |
$headers,
|
170 |
}
|
171 |
|
172 |
/**
|
173 |
+
* @param int $statusCode the HTTP status code of the response
|
174 |
+
* @param string $contentType the Content-Type of the response
|
175 |
+
* @param string $responseBody the response body
|
176 |
+
* @param string $service the name of the service
|
177 |
+
* @param string $path the path used in the request
|
178 |
*
|
179 |
* @throws AuthenticationException when there is an issue authenticating the
|
180 |
* request
|
185 |
* @throws WebServiceException when some other error occurs. This also
|
186 |
* serves as the base class for the above exceptions
|
187 |
*
|
188 |
+
* @return array The decoded content of a successful response
|
189 |
*/
|
190 |
private function handleResponse(
|
191 |
+
$statusCode,
|
192 |
+
$contentType,
|
193 |
+
$responseBody,
|
194 |
+
$service,
|
195 |
+
$path
|
196 |
+
) {
|
197 |
if ($statusCode >= 400 && $statusCode <= 499) {
|
198 |
$this->handle4xx($statusCode, $contentType, $responseBody, $service, $path);
|
199 |
} elseif ($statusCode >= 500) {
|
208 |
/**
|
209 |
* @return string describing the JSON error
|
210 |
*/
|
211 |
+
private function jsonErrorDescription()
|
212 |
{
|
213 |
$errno = json_last_error();
|
214 |
switch ($errno) {
|
232 |
*
|
233 |
* @return string the constructed URL
|
234 |
*/
|
235 |
+
private function urlFor($path)
|
236 |
{
|
237 |
return 'https://' . $this->host . $path;
|
238 |
}
|
239 |
|
240 |
/**
|
241 |
+
* @param int $statusCode the HTTP status code
|
242 |
+
* @param string $contentType the response content-type
|
243 |
+
* @param string $body the response body
|
244 |
+
* @param string $service the service name
|
245 |
+
* @param string $path the path used in the request
|
246 |
*
|
247 |
* @throws AuthenticationException
|
248 |
* @throws HttpException
|
250 |
* @throws InvalidRequestException
|
251 |
*/
|
252 |
private function handle4xx(
|
253 |
+
$statusCode,
|
254 |
+
$contentType,
|
255 |
+
$body,
|
256 |
+
$service,
|
257 |
+
$path
|
258 |
+
) {
|
259 |
+
if (\strlen($body) === 0) {
|
260 |
throw new HttpException(
|
261 |
"Received a $statusCode error for $service with no body",
|
262 |
$statusCode,
|
263 |
$this->urlFor($path)
|
264 |
);
|
265 |
}
|
266 |
+
if (!strstr($contentType, 'json')) {
|
267 |
throw new HttpException(
|
268 |
"Received a $statusCode error for $service with " .
|
269 |
'the following body: ' . $body,
|
311 |
* @throws InsufficientFundsException
|
312 |
*/
|
313 |
private function handleWebServiceError(
|
314 |
+
$message,
|
315 |
+
$code,
|
316 |
+
$statusCode,
|
317 |
+
$path
|
318 |
+
) {
|
319 |
switch ($code) {
|
320 |
case 'IP_ADDRESS_NOT_FOUND':
|
321 |
case 'IP_ADDRESS_RESERVED':
|
369 |
*
|
370 |
* @throws HttpException
|
371 |
*/
|
372 |
+
private function handle5xx($statusCode, $service, $path)
|
373 |
{
|
374 |
throw new HttpException(
|
375 |
"Received a server error ($statusCode) for $service",
|
385 |
*
|
386 |
* @throws HttpException
|
387 |
*/
|
388 |
+
private function handleUnexpectedStatus($statusCode, $service, $path)
|
389 |
{
|
390 |
throw new HttpException(
|
391 |
'Received an unexpected HTTP status ' .
|
396 |
}
|
397 |
|
398 |
/**
|
399 |
+
* @param int $statusCode the HTTP status code
|
400 |
+
* @param string $body the successful request body
|
401 |
+
* @param string $service the service name
|
402 |
*
|
403 |
* @throws WebServiceException if a response body is included but not
|
404 |
* expected, or is not expected but not
|
405 |
* included, or is expected and included
|
406 |
* but cannot be decoded as JSON
|
407 |
*
|
408 |
+
* @return array the decoded request body
|
409 |
*/
|
410 |
+
private function handleSuccess($statusCode, $body, $service)
|
411 |
{
|
412 |
// A 204 should have no response body
|
413 |
if ($statusCode === 204) {
|
414 |
+
if (\strlen($body) !== 0) {
|
415 |
throw new WebServiceException(
|
416 |
"Received a 204 response for $service along with an " .
|
417 |
"unexpected HTTP body: $body"
|
422 |
}
|
423 |
|
424 |
// A 200 should have a valid JSON body
|
425 |
+
if (\strlen($body) === 0) {
|
426 |
throw new WebServiceException(
|
427 |
"Received a 200 response for $service but did not " .
|
428 |
'receive a HTTP body.'
|
vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\WebService\Http;
|
6 |
|
7 |
use MaxMind\Exception\HttpException;
|
@@ -28,7 +26,11 @@ class CurlRequest implements Request
|
|
28 |
*/
|
29 |
private $options;
|
30 |
|
31 |
-
|
|
|
|
|
|
|
|
|
32 |
{
|
33 |
$this->url = $url;
|
34 |
$this->options = $options;
|
@@ -36,9 +38,13 @@ class CurlRequest implements Request
|
|
36 |
}
|
37 |
|
38 |
/**
|
|
|
|
|
39 |
* @throws HttpException
|
|
|
|
|
40 |
*/
|
41 |
-
public function post(
|
42 |
{
|
43 |
$curl = $this->createCurl();
|
44 |
|
@@ -48,7 +54,7 @@ class CurlRequest implements Request
|
|
48 |
return $this->execute($curl);
|
49 |
}
|
50 |
|
51 |
-
public function get()
|
52 |
{
|
53 |
$curl = $this->createCurl();
|
54 |
|
@@ -106,8 +112,10 @@ class CurlRequest implements Request
|
|
106 |
* @param resource $curl
|
107 |
*
|
108 |
* @throws HttpException
|
|
|
|
|
109 |
*/
|
110 |
-
private function execute($curl)
|
111 |
{
|
112 |
$body = curl_exec($curl);
|
113 |
if ($errno = curl_errno($curl)) {
|
@@ -123,14 +131,6 @@ class CurlRequest implements Request
|
|
123 |
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
124 |
$contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
|
125 |
|
126 |
-
return [
|
127 |
-
$statusCode,
|
128 |
-
// The PHP docs say "Content-Type: of the requested document. NULL
|
129 |
-
// indicates server did not send valid Content-Type: header" for
|
130 |
-
// CURLINFO_CONTENT_TYPE. However, it will return FALSE if no header
|
131 |
-
// is set. To keep our types simple, we return null in this case.
|
132 |
-
($contentType === false ? null : $contentType),
|
133 |
-
$body,
|
134 |
-
];
|
135 |
}
|
136 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\WebService\Http;
|
4 |
|
5 |
use MaxMind\Exception\HttpException;
|
26 |
*/
|
27 |
private $options;
|
28 |
|
29 |
+
/**
|
30 |
+
* @param string $url
|
31 |
+
* @param array $options
|
32 |
+
*/
|
33 |
+
public function __construct($url, $options)
|
34 |
{
|
35 |
$this->url = $url;
|
36 |
$this->options = $options;
|
38 |
}
|
39 |
|
40 |
/**
|
41 |
+
* @param string $body
|
42 |
+
*
|
43 |
* @throws HttpException
|
44 |
+
*
|
45 |
+
* @return array
|
46 |
*/
|
47 |
+
public function post($body)
|
48 |
{
|
49 |
$curl = $this->createCurl();
|
50 |
|
54 |
return $this->execute($curl);
|
55 |
}
|
56 |
|
57 |
+
public function get()
|
58 |
{
|
59 |
$curl = $this->createCurl();
|
60 |
|
112 |
* @param resource $curl
|
113 |
*
|
114 |
* @throws HttpException
|
115 |
+
*
|
116 |
+
* @return array
|
117 |
*/
|
118 |
+
private function execute($curl)
|
119 |
{
|
120 |
$body = curl_exec($curl);
|
121 |
if ($errno = curl_errno($curl)) {
|
131 |
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
132 |
$contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
|
133 |
|
134 |
+
return [$statusCode, $contentType, $body];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
}
|
136 |
}
|
vendor/maxmind/web-service-common/src/WebService/Http/Request.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\WebService\Http;
|
6 |
|
7 |
/**
|
@@ -11,9 +9,21 @@ namespace MaxMind\WebService\Http;
|
|
11 |
*/
|
12 |
interface Request
|
13 |
{
|
14 |
-
|
|
|
|
|
|
|
|
|
15 |
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
-
|
|
|
|
|
|
|
19 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\WebService\Http;
|
4 |
|
5 |
/**
|
9 |
*/
|
10 |
interface Request
|
11 |
{
|
12 |
+
/**
|
13 |
+
* @param string $url
|
14 |
+
* @param array $options
|
15 |
+
*/
|
16 |
+
public function __construct($url, $options);
|
17 |
|
18 |
+
/**
|
19 |
+
* @param string $body
|
20 |
+
*
|
21 |
+
* @return mixed
|
22 |
+
*/
|
23 |
+
public function post($body);
|
24 |
|
25 |
+
/**
|
26 |
+
* @return mixed
|
27 |
+
*/
|
28 |
+
public function get();
|
29 |
}
|
vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
declare(strict_types=1);
|
4 |
-
|
5 |
namespace MaxMind\WebService\Http;
|
6 |
|
7 |
/**
|
@@ -37,9 +35,12 @@ class RequestFactory
|
|
37 |
}
|
38 |
|
39 |
/**
|
|
|
|
|
|
|
40 |
* @return Request
|
41 |
*/
|
42 |
-
public function request(
|
43 |
{
|
44 |
$options['curlHandle'] = $this->getCurlHandle();
|
45 |
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
namespace MaxMind\WebService\Http;
|
4 |
|
5 |
/**
|
35 |
}
|
36 |
|
37 |
/**
|
38 |
+
* @param string $url
|
39 |
+
* @param array $options
|
40 |
+
*
|
41 |
* @return Request
|
42 |
*/
|
43 |
+
public function request($url, $options)
|
44 |
{
|
45 |
$options['curlHandle'] = $this->getCurlHandle();
|
46 |
|
vendor/symfony/property-info/Extractor/PhpDocExtractor.php
CHANGED
@@ -142,11 +142,31 @@ class PhpDocExtractor implements PropertyDescriptionExtractorInterface, Property
|
|
142 |
break;
|
143 |
}
|
144 |
|
|
|
145 |
$types = [];
|
146 |
/** @var DocBlock\Tags\Var_|DocBlock\Tags\Return_|DocBlock\Tags\Param $tag */
|
147 |
foreach ($docBlock->getTagsByName($tag) as $tag) {
|
148 |
if ($tag && !$tag instanceof InvalidTag && null !== $tag->getType()) {
|
149 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
}
|
151 |
}
|
152 |
|
@@ -258,7 +278,17 @@ class PhpDocExtractor implements PropertyDescriptionExtractorInterface, Property
|
|
258 |
}
|
259 |
|
260 |
try {
|
261 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
262 |
} catch (\InvalidArgumentException $e) {
|
263 |
return null;
|
264 |
} catch (\RuntimeException $e) {
|
142 |
break;
|
143 |
}
|
144 |
|
145 |
+
$parentClass = null;
|
146 |
$types = [];
|
147 |
/** @var DocBlock\Tags\Var_|DocBlock\Tags\Return_|DocBlock\Tags\Param $tag */
|
148 |
foreach ($docBlock->getTagsByName($tag) as $tag) {
|
149 |
if ($tag && !$tag instanceof InvalidTag && null !== $tag->getType()) {
|
150 |
+
foreach ($this->phpDocTypeHelper->getTypes($tag->getType()) as $type) {
|
151 |
+
switch ($type->getClassName()) {
|
152 |
+
case 'self':
|
153 |
+
case 'static':
|
154 |
+
$resolvedClass = $class;
|
155 |
+
break;
|
156 |
+
|
157 |
+
case 'parent':
|
158 |
+
if (false !== $resolvedClass = $parentClass ?? $parentClass = get_parent_class($class)) {
|
159 |
+
break;
|
160 |
+
}
|
161 |
+
// no break
|
162 |
+
|
163 |
+
default:
|
164 |
+
$types[] = $type;
|
165 |
+
continue 2;
|
166 |
+
}
|
167 |
+
|
168 |
+
$types[] = new Type(Type::BUILTIN_TYPE_OBJECT, $type->isNullable(), $resolvedClass, $type->isCollection(), $type->getCollectionKeyType(), $type->getCollectionValueType());
|
169 |
+
}
|
170 |
}
|
171 |
}
|
172 |
|
278 |
}
|
279 |
|
280 |
try {
|
281 |
+
$reflector = $reflectionProperty->getDeclaringClass();
|
282 |
+
|
283 |
+
foreach ($reflector->getTraits() as $trait) {
|
284 |
+
if ($trait->hasProperty($property)) {
|
285 |
+
$reflector = $trait;
|
286 |
+
|
287 |
+
break;
|
288 |
+
}
|
289 |
+
}
|
290 |
+
|
291 |
+
return $this->docBlockFactory->create($reflectionProperty, $this->createFromReflector($reflector));
|
292 |
} catch (\InvalidArgumentException $e) {
|
293 |
return null;
|
294 |
} catch (\RuntimeException $e) {
|
vendor/symfony/property-info/Extractor/ReflectionExtractor.php
CHANGED
@@ -164,8 +164,8 @@ class ReflectionExtractor implements PropertyListExtractorInterface, PropertyTyp
|
|
164 |
try {
|
165 |
$reflectionProperty = new \ReflectionProperty($class, $property);
|
166 |
$type = $reflectionProperty->getType();
|
167 |
-
if (null !== $type) {
|
168 |
-
return $
|
169 |
}
|
170 |
} catch (\ReflectionException $e) {
|
171 |
// noop
|
164 |
try {
|
165 |
$reflectionProperty = new \ReflectionProperty($class, $property);
|
166 |
$type = $reflectionProperty->getType();
|
167 |
+
if (null !== $type && $types = $this->extractFromReflectionType($type, $reflectionProperty->getDeclaringClass())) {
|
168 |
+
return $types;
|
169 |
}
|
170 |
} catch (\ReflectionException $e) {
|
171 |
// noop
|
vendor/symfony/property-info/Util/PhpDocTypeHelper.php
CHANGED
@@ -172,6 +172,10 @@ final class PhpDocTypeHelper
|
|
172 |
return [$docType, null];
|
173 |
}
|
174 |
|
|
|
|
|
|
|
|
|
175 |
return ['object', substr($docType, 1)]; // substr to strip the namespace's `\`-prefix
|
176 |
}
|
177 |
}
|
172 |
return [$docType, null];
|
173 |
}
|
174 |
|
175 |
+
if (\in_array($docType, ['parent', 'self', 'static'], true)) {
|
176 |
+
return ['object', $docType];
|
177 |
+
}
|
178 |
+
|
179 |
return ['object', substr($docType, 1)]; // substr to strip the namespace's `\`-prefix
|
180 |
}
|
181 |
}
|
vendor/symfony/string/Resources/functions.php
CHANGED
@@ -11,22 +11,28 @@
|
|
11 |
|
12 |
namespace Symfony\Component\String;
|
13 |
|
14 |
-
|
15 |
-
|
16 |
-
|
|
|
|
|
17 |
}
|
18 |
|
19 |
-
|
20 |
-
|
21 |
-
|
|
|
|
|
22 |
}
|
23 |
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
|
|
30 |
|
31 |
-
|
|
|
32 |
}
|
11 |
|
12 |
namespace Symfony\Component\String;
|
13 |
|
14 |
+
if (!\function_exists(u::class)) {
|
15 |
+
function u(?string $string = ''): UnicodeString
|
16 |
+
{
|
17 |
+
return new UnicodeString($string ?? '');
|
18 |
+
}
|
19 |
}
|
20 |
|
21 |
+
if (!\function_exists(b::class)) {
|
22 |
+
function b(?string $string = ''): ByteString
|
23 |
+
{
|
24 |
+
return new ByteString($string ?? '');
|
25 |
+
}
|
26 |
}
|
27 |
|
28 |
+
if (!\function_exists(s::class)) {
|
29 |
+
/**
|
30 |
+
* @return UnicodeString|ByteString
|
31 |
+
*/
|
32 |
+
function s(?string $string = ''): AbstractString
|
33 |
+
{
|
34 |
+
$string = $string ?? '';
|
35 |
|
36 |
+
return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string);
|
37 |
+
}
|
38 |
}
|
yarn.lock
CHANGED
@@ -21,7 +21,34 @@
|
|
21 |
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8"
|
22 |
integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==
|
23 |
|
24 |
-
"@babel/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
version "7.12.17"
|
26 |
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2"
|
27 |
integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ==
|
@@ -51,6 +78,15 @@
|
|
51 |
jsesc "^2.5.1"
|
52 |
source-map "^0.5.0"
|
53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
"@babel/helper-annotate-as-pure@^7.12.13":
|
55 |
version "7.12.13"
|
56 |
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
|
@@ -76,6 +112,16 @@
|
|
76 |
browserslist "^4.14.5"
|
77 |
semver "^5.5.0"
|
78 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
"@babel/helper-create-class-features-plugin@^7.12.13":
|
80 |
version "7.12.17"
|
81 |
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944"
|
@@ -87,6 +133,17 @@
|
|
87 |
"@babel/helper-replace-supers" "^7.12.13"
|
88 |
"@babel/helper-split-export-declaration" "^7.12.13"
|
89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
"@babel/helper-create-regexp-features-plugin@^7.12.13":
|
91 |
version "7.12.17"
|
92 |
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
|
@@ -95,6 +152,20 @@
|
|
95 |
"@babel/helper-annotate-as-pure" "^7.12.13"
|
96 |
regexpu-core "^4.7.1"
|
97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
"@babel/helper-explode-assignable-expression@^7.12.13":
|
99 |
version "7.12.13"
|
100 |
resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a"
|
@@ -125,6 +196,14 @@
|
|
125 |
dependencies:
|
126 |
"@babel/types" "^7.12.13"
|
127 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17":
|
129 |
version "7.12.17"
|
130 |
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac"
|
@@ -132,6 +211,13 @@
|
|
132 |
dependencies:
|
133 |
"@babel/types" "^7.12.17"
|
134 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
"@babel/helper-module-imports@^7.12.13":
|
136 |
version "7.12.13"
|
137 |
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0"
|
@@ -154,6 +240,21 @@
|
|
154 |
"@babel/types" "^7.12.17"
|
155 |
lodash "^4.17.19"
|
156 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
"@babel/helper-optimise-call-expression@^7.12.13":
|
158 |
version "7.12.13"
|
159 |
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
|
@@ -166,6 +267,11 @@
|
|
166 |
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb"
|
167 |
integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==
|
168 |
|
|
|
|
|
|
|
|
|
|
|
169 |
"@babel/helper-remap-async-to-generator@^7.12.13":
|
170 |
version "7.12.13"
|
171 |
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878"
|
@@ -175,6 +281,15 @@
|
|
175 |
"@babel/helper-wrap-function" "^7.12.13"
|
176 |
"@babel/types" "^7.12.13"
|
177 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
178 |
"@babel/helper-replace-supers@^7.12.13":
|
179 |
version "7.12.13"
|
180 |
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121"
|
@@ -185,6 +300,16 @@
|
|
185 |
"@babel/traverse" "^7.12.13"
|
186 |
"@babel/types" "^7.12.13"
|
187 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
188 |
"@babel/helper-simple-access@^7.12.13":
|
189 |
version "7.12.13"
|
190 |
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4"
|
@@ -226,6 +351,16 @@
|
|
226 |
"@babel/traverse" "^7.12.13"
|
227 |
"@babel/types" "^7.12.13"
|
228 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
229 |
"@babel/helpers@^7.12.17":
|
230 |
version "7.12.17"
|
231 |
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc"
|
@@ -235,6 +370,15 @@
|
|
235 |
"@babel/traverse" "^7.12.17"
|
236 |
"@babel/types" "^7.12.17"
|
237 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
238 |
"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
|
239 |
version "7.12.13"
|
240 |
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c"
|
@@ -249,6 +393,11 @@
|
|
249 |
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848"
|
250 |
integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==
|
251 |
|
|
|
|
|
|
|
|
|
|
|
252 |
"@babel/plugin-proposal-async-generator-functions@^7.12.13":
|
253 |
version "7.12.13"
|
254 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5"
|
@@ -258,6 +407,15 @@
|
|
258 |
"@babel/helper-remap-async-to-generator" "^7.12.13"
|
259 |
"@babel/plugin-syntax-async-generators" "^7.8.0"
|
260 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
261 |
"@babel/plugin-proposal-class-properties@^7.12.13":
|
262 |
version "7.12.13"
|
263 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8"
|
@@ -266,6 +424,14 @@
|
|
266 |
"@babel/helper-create-class-features-plugin" "^7.12.13"
|
267 |
"@babel/helper-plugin-utils" "^7.12.13"
|
268 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
269 |
"@babel/plugin-proposal-dynamic-import@^7.12.17":
|
270 |
version "7.12.17"
|
271 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512"
|
@@ -274,6 +440,14 @@
|
|
274 |
"@babel/helper-plugin-utils" "^7.12.13"
|
275 |
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
|
276 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
277 |
"@babel/plugin-proposal-export-namespace-from@^7.12.13":
|
278 |
version "7.12.13"
|
279 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d"
|
@@ -290,6 +464,14 @@
|
|
290 |
"@babel/helper-plugin-utils" "^7.12.13"
|
291 |
"@babel/plugin-syntax-json-strings" "^7.8.0"
|
292 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
293 |
"@babel/plugin-proposal-logical-assignment-operators@^7.12.13":
|
294 |
version "7.12.13"
|
295 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350"
|
@@ -298,6 +480,14 @@
|
|
298 |
"@babel/helper-plugin-utils" "^7.12.13"
|
299 |
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
|
300 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
301 |
"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13":
|
302 |
version "7.12.13"
|
303 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde"
|
@@ -306,6 +496,14 @@
|
|
306 |
"@babel/helper-plugin-utils" "^7.12.13"
|
307 |
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
|
308 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
309 |
"@babel/plugin-proposal-numeric-separator@^7.12.13":
|
310 |
version "7.12.13"
|
311 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db"
|
@@ -323,6 +521,17 @@
|
|
323 |
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
|
324 |
"@babel/plugin-transform-parameters" "^7.12.13"
|
325 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
326 |
"@babel/plugin-proposal-optional-catch-binding@^7.12.13":
|
327 |
version "7.12.13"
|
328 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5"
|
@@ -331,6 +540,14 @@
|
|
331 |
"@babel/helper-plugin-utils" "^7.12.13"
|
332 |
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
|
333 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
334 |
"@babel/plugin-proposal-optional-chaining@^7.12.17":
|
335 |
version "7.12.17"
|
336 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c"
|
@@ -340,6 +557,15 @@
|
|
340 |
"@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
|
341 |
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
|
342 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
343 |
"@babel/plugin-proposal-private-methods@^7.12.13":
|
344 |
version "7.12.13"
|
345 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71"
|
@@ -348,6 +574,14 @@
|
|
348 |
"@babel/helper-create-class-features-plugin" "^7.12.13"
|
349 |
"@babel/helper-plugin-utils" "^7.12.13"
|
350 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
351 |
"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
|
352 |
version "7.12.13"
|
353 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba"
|
@@ -377,7 +611,7 @@
|
|
377 |
dependencies:
|
378 |
"@babel/helper-plugin-utils" "^7.12.13"
|
379 |
|
380 |
-
"@babel/plugin-syntax-dynamic-import@^7.8.0":
|
381 |
version "7.8.3"
|
382 |
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
|
383 |
integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
|
@@ -475,6 +709,13 @@
|
|
475 |
dependencies:
|
476 |
"@babel/helper-plugin-utils" "^7.12.13"
|
477 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
478 |
"@babel/plugin-transform-async-to-generator@^7.12.13":
|
479 |
version "7.12.13"
|
480 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae"
|
@@ -484,6 +725,15 @@
|
|
484 |
"@babel/helper-plugin-utils" "^7.12.13"
|
485 |
"@babel/helper-remap-async-to-generator" "^7.12.13"
|
486 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
487 |
"@babel/plugin-transform-block-scoped-functions@^7.12.13":
|
488 |
version "7.12.13"
|
489 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
|
@@ -511,6 +761,19 @@
|
|
511 |
"@babel/helper-split-export-declaration" "^7.12.13"
|
512 |
globals "^11.1.0"
|
513 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
514 |
"@babel/plugin-transform-computed-properties@^7.12.13":
|
515 |
version "7.12.13"
|
516 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d"
|
@@ -518,6 +781,13 @@
|
|
518 |
dependencies:
|
519 |
"@babel/helper-plugin-utils" "^7.12.13"
|
520 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
521 |
"@babel/plugin-transform-destructuring@^7.12.13":
|
522 |
version "7.12.13"
|
523 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb"
|
@@ -525,6 +795,13 @@
|
|
525 |
dependencies:
|
526 |
"@babel/helper-plugin-utils" "^7.12.13"
|
527 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
528 |
"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
|
529 |
version "7.12.13"
|
530 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad"
|
@@ -563,6 +840,13 @@
|
|
563 |
dependencies:
|
564 |
"@babel/helper-plugin-utils" "^7.12.13"
|
565 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
566 |
"@babel/plugin-transform-function-name@^7.12.13":
|
567 |
version "7.12.13"
|
568 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
|
@@ -594,6 +878,15 @@
|
|
594 |
"@babel/helper-plugin-utils" "^7.12.13"
|
595 |
babel-plugin-dynamic-import-node "^2.3.3"
|
596 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
597 |
"@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.4.4":
|
598 |
version "7.12.13"
|
599 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50"
|
@@ -604,6 +897,16 @@
|
|
604 |
"@babel/helper-simple-access" "^7.12.13"
|
605 |
babel-plugin-dynamic-import-node "^2.3.3"
|
606 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
607 |
"@babel/plugin-transform-modules-systemjs@^7.12.13":
|
608 |
version "7.12.13"
|
609 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5"
|
@@ -615,6 +918,17 @@
|
|
615 |
"@babel/helper-validator-identifier" "^7.12.11"
|
616 |
babel-plugin-dynamic-import-node "^2.3.3"
|
617 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
618 |
"@babel/plugin-transform-modules-umd@^7.12.13":
|
619 |
version "7.12.13"
|
620 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37"
|
@@ -623,6 +937,14 @@
|
|
623 |
"@babel/helper-module-transforms" "^7.12.13"
|
624 |
"@babel/helper-plugin-utils" "^7.12.13"
|
625 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
626 |
"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
|
627 |
version "7.12.13"
|
628 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9"
|
@@ -652,6 +974,13 @@
|
|
652 |
dependencies:
|
653 |
"@babel/helper-plugin-utils" "^7.12.13"
|
654 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
655 |
"@babel/plugin-transform-property-literals@^7.12.13":
|
656 |
version "7.12.13"
|
657 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81"
|
@@ -684,14 +1013,17 @@
|
|
684 |
dependencies:
|
685 |
"@babel/helper-plugin-utils" "^7.12.13"
|
686 |
|
687 |
-
"@babel/plugin-transform-runtime
|
688 |
-
version "7.
|
689 |
-
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.
|
690 |
-
integrity sha512-
|
691 |
dependencies:
|
692 |
"@babel/helper-module-imports" "^7.12.13"
|
693 |
-
"@babel/helper-plugin-utils" "^7.
|
694 |
-
|
|
|
|
|
|
|
695 |
|
696 |
"@babel/plugin-transform-shorthand-properties@^7.12.13":
|
697 |
version "7.12.13"
|
@@ -708,6 +1040,14 @@
|
|
708 |
"@babel/helper-plugin-utils" "^7.12.13"
|
709 |
"@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
|
710 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
711 |
"@babel/plugin-transform-sticky-regex@^7.12.13":
|
712 |
version "7.12.13"
|
713 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
|
@@ -722,6 +1062,13 @@
|
|
722 |
dependencies:
|
723 |
"@babel/helper-plugin-utils" "^7.12.13"
|
724 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
725 |
"@babel/plugin-transform-typeof-symbol@^7.12.13":
|
726 |
version "7.12.13"
|
727 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
|
@@ -744,7 +1091,81 @@
|
|
744 |
"@babel/helper-create-regexp-features-plugin" "^7.12.13"
|
745 |
"@babel/helper-plugin-utils" "^7.12.13"
|
746 |
|
747 |
-
"@babel/preset-env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
748 |
version "7.12.17"
|
749 |
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa"
|
750 |
integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg==
|
@@ -816,7 +1237,7 @@
|
|
816 |
core-js-compat "^3.8.0"
|
817 |
semver "^5.5.0"
|
818 |
|
819 |
-
"@babel/preset-modules@^0.1.3":
|
820 |
version "0.1.4"
|
821 |
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
|
822 |
integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
|
@@ -858,6 +1279,21 @@
|
|
858 |
globals "^11.1.0"
|
859 |
lodash "^4.17.19"
|
860 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
861 |
"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
|
862 |
version "7.12.17"
|
863 |
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963"
|
@@ -867,6 +1303,15 @@
|
|
867 |
lodash "^4.17.19"
|
868 |
to-fast-properties "^2.0.0"
|
869 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
870 |
"@bcoe/v8-coverage@^0.2.3":
|
871 |
version "0.2.3"
|
872 |
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
@@ -880,10 +1325,10 @@
|
|
880 |
exec-sh "^0.3.2"
|
881 |
minimist "^1.2.0"
|
882 |
|
883 |
-
"@eslint/eslintrc@^0.
|
884 |
-
version "0.
|
885 |
-
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.
|
886 |
-
integrity sha512-
|
887 |
dependencies:
|
888 |
ajv "^6.12.4"
|
889 |
debug "^4.1.1"
|
@@ -892,7 +1337,6 @@
|
|
892 |
ignore "^4.0.6"
|
893 |
import-fresh "^3.2.1"
|
894 |
js-yaml "^3.13.1"
|
895 |
-
lodash "^4.17.20"
|
896 |
minimatch "^3.0.4"
|
897 |
strip-json-comments "^3.1.1"
|
898 |
|
@@ -1541,7 +1985,7 @@ babel-helper-get-function-arity@^6.24.1:
|
|
1541 |
babel-runtime "^6.22.0"
|
1542 |
babel-types "^6.24.1"
|
1543 |
|
1544 |
-
babel-jest@^26.6.3:
|
1545 |
version "26.6.3"
|
1546 |
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056"
|
1547 |
integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==
|
@@ -1590,12 +2034,36 @@ babel-plugin-jest-hoist@^26.6.2:
|
|
1590 |
"@types/babel__core" "^7.0.0"
|
1591 |
"@types/babel__traverse" "^7.0.6"
|
1592 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1593 |
babel-plugin-syntax-class-properties@^6.8.0:
|
1594 |
version "6.13.0"
|
1595 |
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
|
1596 |
integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=
|
1597 |
|
1598 |
-
babel-plugin-transform-class-properties
|
1599 |
version "6.24.1"
|
1600 |
resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
|
1601 |
integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=
|
@@ -2286,6 +2754,14 @@ core-js-compat@^3.8.0:
|
|
2286 |
browserslist "^4.16.3"
|
2287 |
semver "7.0.0"
|
2288 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2289 |
core-js@^2.4.0, core-js@^2.6.5:
|
2290 |
version "2.6.12"
|
2291 |
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
|
@@ -2985,13 +3461,13 @@ eslint-visitor-keys@^2.0.0:
|
|
2985 |
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
|
2986 |
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
|
2987 |
|
2988 |
-
eslint
|
2989 |
-
version "7.
|
2990 |
-
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.
|
2991 |
-
integrity sha512-
|
2992 |
dependencies:
|
2993 |
"@babel/code-frame" "7.12.11"
|
2994 |
-
"@eslint/eslintrc" "^0.
|
2995 |
ajv "^6.10.0"
|
2996 |
chalk "^4.0.0"
|
2997 |
cross-spawn "^7.0.2"
|
@@ -3004,7 +3480,7 @@ eslint@^7.19.0:
|
|
3004 |
espree "^7.3.1"
|
3005 |
esquery "^1.4.0"
|
3006 |
esutils "^2.0.2"
|
3007 |
-
file-entry-cache "^6.0.
|
3008 |
functional-red-black-tree "^1.0.1"
|
3009 |
glob-parent "^5.0.0"
|
3010 |
globals "^12.1.0"
|
@@ -3250,7 +3726,7 @@ fb-watchman@^2.0.0:
|
|
3250 |
dependencies:
|
3251 |
bser "2.1.1"
|
3252 |
|
3253 |
-
file-entry-cache@^6.0.
|
3254 |
version "6.0.1"
|
3255 |
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
|
3256 |
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
|
@@ -3369,7 +3845,7 @@ functional-red-black-tree@^1.0.1:
|
|
3369 |
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
|
3370 |
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
|
3371 |
|
3372 |
-
gensync@^1.0.0-beta.1:
|
3373 |
version "1.0.0-beta.2"
|
3374 |
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
|
3375 |
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
|
@@ -4517,7 +4993,7 @@ jest-worker@^26.6.2:
|
|
4517 |
merge-stream "^2.0.0"
|
4518 |
supports-color "^7.0.0"
|
4519 |
|
4520 |
-
jest
|
4521 |
version "26.6.3"
|
4522 |
resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef"
|
4523 |
integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==
|
@@ -4749,7 +5225,7 @@ locate-path@^5.0.0:
|
|
4749 |
dependencies:
|
4750 |
p-locate "^4.1.0"
|
4751 |
|
4752 |
-
lodash-cli
|
4753 |
version "4.17.5"
|
4754 |
resolved "https://registry.yarnpkg.com/lodash-cli/-/lodash-cli-4.17.5.tgz#1bab72c8c9980febf4fe7a1900b0971ce040dd0b"
|
4755 |
integrity sha512-eeQi+oVS76ofP791g4wEGs4B4nyc4fiHboUCc0BzM8qCkLAzqbroewOt98A8ISoY1HH2di00pENNErXf0MWxiw==
|
@@ -4811,6 +5287,11 @@ lodash.clone@^4.5.0:
|
|
4811 |
resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
|
4812 |
integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
|
4813 |
|
|
|
|
|
|
|
|
|
|
|
4814 |
lodash.find@3.2.1:
|
4815 |
version "3.2.1"
|
4816 |
resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-3.2.1.tgz#046e319f3ace912ac6c9246c7f683c5ec07b36ad"
|
@@ -5431,7 +5912,7 @@ pako@~1.0.5:
|
|
5431 |
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
|
5432 |
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
|
5433 |
|
5434 |
-
parcel-bundler
|
5435 |
version "1.12.4"
|
5436 |
resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.12.4.tgz#31223f4ab4d00323a109fce28d5e46775409a9ee"
|
5437 |
integrity sha512-G+iZGGiPEXcRzw0fiRxWYCKxdt/F7l9a0xkiU4XbcVRJCSlBnioWEwJMutOCCpoQmaQtjB4RBHDGIHN85AIhLQ==
|
@@ -5496,7 +5977,7 @@ parcel-bundler@>=1.12.4:
|
|
5496 |
v8-compile-cache "^2.0.0"
|
5497 |
ws "^5.1.1"
|
5498 |
|
5499 |
-
parcel-plugin-assets-list
|
5500 |
version "1.7.1"
|
5501 |
resolved "https://registry.yarnpkg.com/parcel-plugin-assets-list/-/parcel-plugin-assets-list-1.7.1.tgz#0495f0cee1413763a2e5bc62610ad3744ff77867"
|
5502 |
integrity sha512-PCWPBEoiAAHvw5I472aOfTV3anhpQ8Y981NUewuNHN4ZmaJTGC15z37hM/UynasjFMm3gG/o2TRtXJBNosJEYg==
|
@@ -6396,7 +6877,7 @@ resolve-url@^0.2.1:
|
|
6396 |
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
6397 |
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
|
6398 |
|
6399 |
-
resolve@^1.1.5, resolve@^1.10.0, resolve@^1.18.1, resolve@^1.4.0:
|
6400 |
version "1.20.0"
|
6401 |
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
6402 |
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
|
@@ -6517,7 +6998,7 @@ saxes@^5.0.0:
|
|
6517 |
dependencies:
|
6518 |
xmlchars "^2.2.0"
|
6519 |
|
6520 |
-
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0
|
6521 |
version "5.7.1"
|
6522 |
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
6523 |
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
@@ -6532,7 +7013,7 @@ semver@7.0.0:
|
|
6532 |
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
|
6533 |
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
|
6534 |
|
6535 |
-
semver@^6.0.0, semver@^6.3.0:
|
6536 |
version "6.3.0"
|
6537 |
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
6538 |
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
21 |
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8"
|
22 |
integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==
|
23 |
|
24 |
+
"@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.8":
|
25 |
+
version "7.13.8"
|
26 |
+
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.8.tgz#5b783b9808f15cef71547f1b691f34f8ff6003a6"
|
27 |
+
integrity sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog==
|
28 |
+
|
29 |
+
"@babel/core@7.13.8":
|
30 |
+
version "7.13.8"
|
31 |
+
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.8.tgz#c191d9c5871788a591d69ea1dc03e5843a3680fb"
|
32 |
+
integrity sha512-oYapIySGw1zGhEFRd6lzWNLWFX2s5dA/jm+Pw/+59ZdXtjyIuwlXbrId22Md0rgZVop+aVoqow2riXhBLNyuQg==
|
33 |
+
dependencies:
|
34 |
+
"@babel/code-frame" "^7.12.13"
|
35 |
+
"@babel/generator" "^7.13.0"
|
36 |
+
"@babel/helper-compilation-targets" "^7.13.8"
|
37 |
+
"@babel/helper-module-transforms" "^7.13.0"
|
38 |
+
"@babel/helpers" "^7.13.0"
|
39 |
+
"@babel/parser" "^7.13.4"
|
40 |
+
"@babel/template" "^7.12.13"
|
41 |
+
"@babel/traverse" "^7.13.0"
|
42 |
+
"@babel/types" "^7.13.0"
|
43 |
+
convert-source-map "^1.7.0"
|
44 |
+
debug "^4.1.0"
|
45 |
+
gensync "^1.0.0-beta.2"
|
46 |
+
json5 "^2.1.2"
|
47 |
+
lodash "^4.17.19"
|
48 |
+
semver "^6.3.0"
|
49 |
+
source-map "^0.5.0"
|
50 |
+
|
51 |
+
"@babel/core@^7.1.0", "@babel/core@^7.4.4", "@babel/core@^7.7.5":
|
52 |
version "7.12.17"
|
53 |
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2"
|
54 |
integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ==
|
78 |
jsesc "^2.5.1"
|
79 |
source-map "^0.5.0"
|
80 |
|
81 |
+
"@babel/generator@^7.13.0":
|
82 |
+
version "7.13.9"
|
83 |
+
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39"
|
84 |
+
integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==
|
85 |
+
dependencies:
|
86 |
+
"@babel/types" "^7.13.0"
|
87 |
+
jsesc "^2.5.1"
|
88 |
+
source-map "^0.5.0"
|
89 |
+
|
90 |
"@babel/helper-annotate-as-pure@^7.12.13":
|
91 |
version "7.12.13"
|
92 |
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
|
112 |
browserslist "^4.14.5"
|
113 |
semver "^5.5.0"
|
114 |
|
115 |
+
"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.8":
|
116 |
+
version "7.13.8"
|
117 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.8.tgz#02bdb22783439afb11b2f009814bdd88384bd468"
|
118 |
+
integrity sha512-pBljUGC1y3xKLn1nrx2eAhurLMA8OqBtBP/JwG4U8skN7kf8/aqwwxpV1N6T0e7r6+7uNitIa/fUxPFagSXp3A==
|
119 |
+
dependencies:
|
120 |
+
"@babel/compat-data" "^7.13.8"
|
121 |
+
"@babel/helper-validator-option" "^7.12.17"
|
122 |
+
browserslist "^4.14.5"
|
123 |
+
semver "^6.3.0"
|
124 |
+
|
125 |
"@babel/helper-create-class-features-plugin@^7.12.13":
|
126 |
version "7.12.17"
|
127 |
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944"
|
133 |
"@babel/helper-replace-supers" "^7.12.13"
|
134 |
"@babel/helper-split-export-declaration" "^7.12.13"
|
135 |
|
136 |
+
"@babel/helper-create-class-features-plugin@^7.13.0":
|
137 |
+
version "7.13.8"
|
138 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.8.tgz#0367bd0a7505156ce018ca464f7ac91ba58c1a04"
|
139 |
+
integrity sha512-qioaRrKHQbn4hkRKDHbnuQ6kAxmmOF+kzKGnIfxPK4j2rckSJCpKzr/SSTlohSCiE3uAQpNDJ9FIh4baeE8W+w==
|
140 |
+
dependencies:
|
141 |
+
"@babel/helper-function-name" "^7.12.13"
|
142 |
+
"@babel/helper-member-expression-to-functions" "^7.13.0"
|
143 |
+
"@babel/helper-optimise-call-expression" "^7.12.13"
|
144 |
+
"@babel/helper-replace-supers" "^7.13.0"
|
145 |
+
"@babel/helper-split-export-declaration" "^7.12.13"
|
146 |
+
|
147 |
"@babel/helper-create-regexp-features-plugin@^7.12.13":
|
148 |
version "7.12.17"
|
149 |
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
|
152 |
"@babel/helper-annotate-as-pure" "^7.12.13"
|
153 |
regexpu-core "^4.7.1"
|
154 |
|
155 |
+
"@babel/helper-define-polyfill-provider@^0.1.5":
|
156 |
+
version "0.1.5"
|
157 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e"
|
158 |
+
integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==
|
159 |
+
dependencies:
|
160 |
+
"@babel/helper-compilation-targets" "^7.13.0"
|
161 |
+
"@babel/helper-module-imports" "^7.12.13"
|
162 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
163 |
+
"@babel/traverse" "^7.13.0"
|
164 |
+
debug "^4.1.1"
|
165 |
+
lodash.debounce "^4.0.8"
|
166 |
+
resolve "^1.14.2"
|
167 |
+
semver "^6.1.2"
|
168 |
+
|
169 |
"@babel/helper-explode-assignable-expression@^7.12.13":
|
170 |
version "7.12.13"
|
171 |
resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a"
|
196 |
dependencies:
|
197 |
"@babel/types" "^7.12.13"
|
198 |
|
199 |
+
"@babel/helper-hoist-variables@^7.13.0":
|
200 |
+
version "7.13.0"
|
201 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8"
|
202 |
+
integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==
|
203 |
+
dependencies:
|
204 |
+
"@babel/traverse" "^7.13.0"
|
205 |
+
"@babel/types" "^7.13.0"
|
206 |
+
|
207 |
"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17":
|
208 |
version "7.12.17"
|
209 |
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac"
|
211 |
dependencies:
|
212 |
"@babel/types" "^7.12.17"
|
213 |
|
214 |
+
"@babel/helper-member-expression-to-functions@^7.13.0":
|
215 |
+
version "7.13.0"
|
216 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091"
|
217 |
+
integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==
|
218 |
+
dependencies:
|
219 |
+
"@babel/types" "^7.13.0"
|
220 |
+
|
221 |
"@babel/helper-module-imports@^7.12.13":
|
222 |
version "7.12.13"
|
223 |
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0"
|
240 |
"@babel/types" "^7.12.17"
|
241 |
lodash "^4.17.19"
|
242 |
|
243 |
+
"@babel/helper-module-transforms@^7.13.0":
|
244 |
+
version "7.13.0"
|
245 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1"
|
246 |
+
integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==
|
247 |
+
dependencies:
|
248 |
+
"@babel/helper-module-imports" "^7.12.13"
|
249 |
+
"@babel/helper-replace-supers" "^7.13.0"
|
250 |
+
"@babel/helper-simple-access" "^7.12.13"
|
251 |
+
"@babel/helper-split-export-declaration" "^7.12.13"
|
252 |
+
"@babel/helper-validator-identifier" "^7.12.11"
|
253 |
+
"@babel/template" "^7.12.13"
|
254 |
+
"@babel/traverse" "^7.13.0"
|
255 |
+
"@babel/types" "^7.13.0"
|
256 |
+
lodash "^4.17.19"
|
257 |
+
|
258 |
"@babel/helper-optimise-call-expression@^7.12.13":
|
259 |
version "7.12.13"
|
260 |
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
|
267 |
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb"
|
268 |
integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==
|
269 |
|
270 |
+
"@babel/helper-plugin-utils@^7.13.0":
|
271 |
+
version "7.13.0"
|
272 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
|
273 |
+
integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
|
274 |
+
|
275 |
"@babel/helper-remap-async-to-generator@^7.12.13":
|
276 |
version "7.12.13"
|
277 |
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878"
|
281 |
"@babel/helper-wrap-function" "^7.12.13"
|
282 |
"@babel/types" "^7.12.13"
|
283 |
|
284 |
+
"@babel/helper-remap-async-to-generator@^7.13.0":
|
285 |
+
version "7.13.0"
|
286 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209"
|
287 |
+
integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==
|
288 |
+
dependencies:
|
289 |
+
"@babel/helper-annotate-as-pure" "^7.12.13"
|
290 |
+
"@babel/helper-wrap-function" "^7.13.0"
|
291 |
+
"@babel/types" "^7.13.0"
|
292 |
+
|
293 |
"@babel/helper-replace-supers@^7.12.13":
|
294 |
version "7.12.13"
|
295 |
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121"
|
300 |
"@babel/traverse" "^7.12.13"
|
301 |
"@babel/types" "^7.12.13"
|
302 |
|
303 |
+
"@babel/helper-replace-supers@^7.13.0":
|
304 |
+
version "7.13.0"
|
305 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24"
|
306 |
+
integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==
|
307 |
+
dependencies:
|
308 |
+
"@babel/helper-member-expression-to-functions" "^7.13.0"
|
309 |
+
"@babel/helper-optimise-call-expression" "^7.12.13"
|
310 |
+
"@babel/traverse" "^7.13.0"
|
311 |
+
"@babel/types" "^7.13.0"
|
312 |
+
|
313 |
"@babel/helper-simple-access@^7.12.13":
|
314 |
version "7.12.13"
|
315 |
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4"
|
351 |
"@babel/traverse" "^7.12.13"
|
352 |
"@babel/types" "^7.12.13"
|
353 |
|
354 |
+
"@babel/helper-wrap-function@^7.13.0":
|
355 |
+
version "7.13.0"
|
356 |
+
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4"
|
357 |
+
integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==
|
358 |
+
dependencies:
|
359 |
+
"@babel/helper-function-name" "^7.12.13"
|
360 |
+
"@babel/template" "^7.12.13"
|
361 |
+
"@babel/traverse" "^7.13.0"
|
362 |
+
"@babel/types" "^7.13.0"
|
363 |
+
|
364 |
"@babel/helpers@^7.12.17":
|
365 |
version "7.12.17"
|
366 |
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc"
|
370 |
"@babel/traverse" "^7.12.17"
|
371 |
"@babel/types" "^7.12.17"
|
372 |
|
373 |
+
"@babel/helpers@^7.13.0":
|
374 |
+
version "7.13.0"
|
375 |
+
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0"
|
376 |
+
integrity sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ==
|
377 |
+
dependencies:
|
378 |
+
"@babel/template" "^7.12.13"
|
379 |
+
"@babel/traverse" "^7.13.0"
|
380 |
+
"@babel/types" "^7.13.0"
|
381 |
+
|
382 |
"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
|
383 |
version "7.12.13"
|
384 |
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c"
|
393 |
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848"
|
394 |
integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==
|
395 |
|
396 |
+
"@babel/parser@^7.13.0", "@babel/parser@^7.13.4":
|
397 |
+
version "7.13.9"
|
398 |
+
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.9.tgz#ca34cb95e1c2dd126863a84465ae8ef66114be99"
|
399 |
+
integrity sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw==
|
400 |
+
|
401 |
"@babel/plugin-proposal-async-generator-functions@^7.12.13":
|
402 |
version "7.12.13"
|
403 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5"
|
407 |
"@babel/helper-remap-async-to-generator" "^7.12.13"
|
408 |
"@babel/plugin-syntax-async-generators" "^7.8.0"
|
409 |
|
410 |
+
"@babel/plugin-proposal-async-generator-functions@^7.13.8":
|
411 |
+
version "7.13.8"
|
412 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1"
|
413 |
+
integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==
|
414 |
+
dependencies:
|
415 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
416 |
+
"@babel/helper-remap-async-to-generator" "^7.13.0"
|
417 |
+
"@babel/plugin-syntax-async-generators" "^7.8.4"
|
418 |
+
|
419 |
"@babel/plugin-proposal-class-properties@^7.12.13":
|
420 |
version "7.12.13"
|
421 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8"
|
424 |
"@babel/helper-create-class-features-plugin" "^7.12.13"
|
425 |
"@babel/helper-plugin-utils" "^7.12.13"
|
426 |
|
427 |
+
"@babel/plugin-proposal-class-properties@^7.13.0":
|
428 |
+
version "7.13.0"
|
429 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37"
|
430 |
+
integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==
|
431 |
+
dependencies:
|
432 |
+
"@babel/helper-create-class-features-plugin" "^7.13.0"
|
433 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
434 |
+
|
435 |
"@babel/plugin-proposal-dynamic-import@^7.12.17":
|
436 |
version "7.12.17"
|
437 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512"
|
440 |
"@babel/helper-plugin-utils" "^7.12.13"
|
441 |
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
|
442 |
|
443 |
+
"@babel/plugin-proposal-dynamic-import@^7.13.8":
|
444 |
+
version "7.13.8"
|
445 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d"
|
446 |
+
integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==
|
447 |
+
dependencies:
|
448 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
449 |
+
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
|
450 |
+
|
451 |
"@babel/plugin-proposal-export-namespace-from@^7.12.13":
|
452 |
version "7.12.13"
|
453 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d"
|
464 |
"@babel/helper-plugin-utils" "^7.12.13"
|
465 |
"@babel/plugin-syntax-json-strings" "^7.8.0"
|
466 |
|
467 |
+
"@babel/plugin-proposal-json-strings@^7.13.8":
|
468 |
+
version "7.13.8"
|
469 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b"
|
470 |
+
integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==
|
471 |
+
dependencies:
|
472 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
473 |
+
"@babel/plugin-syntax-json-strings" "^7.8.3"
|
474 |
+
|
475 |
"@babel/plugin-proposal-logical-assignment-operators@^7.12.13":
|
476 |
version "7.12.13"
|
477 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350"
|
480 |
"@babel/helper-plugin-utils" "^7.12.13"
|
481 |
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
|
482 |
|
483 |
+
"@babel/plugin-proposal-logical-assignment-operators@^7.13.8":
|
484 |
+
version "7.13.8"
|
485 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a"
|
486 |
+
integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==
|
487 |
+
dependencies:
|
488 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
489 |
+
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
|
490 |
+
|
491 |
"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13":
|
492 |
version "7.12.13"
|
493 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde"
|
496 |
"@babel/helper-plugin-utils" "^7.12.13"
|
497 |
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
|
498 |
|
499 |
+
"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8":
|
500 |
+
version "7.13.8"
|
501 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3"
|
502 |
+
integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==
|
503 |
+
dependencies:
|
504 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
505 |
+
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
|
506 |
+
|
507 |
"@babel/plugin-proposal-numeric-separator@^7.12.13":
|
508 |
version "7.12.13"
|
509 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db"
|
521 |
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
|
522 |
"@babel/plugin-transform-parameters" "^7.12.13"
|
523 |
|
524 |
+
"@babel/plugin-proposal-object-rest-spread@^7.13.8":
|
525 |
+
version "7.13.8"
|
526 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a"
|
527 |
+
integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==
|
528 |
+
dependencies:
|
529 |
+
"@babel/compat-data" "^7.13.8"
|
530 |
+
"@babel/helper-compilation-targets" "^7.13.8"
|
531 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
532 |
+
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
|
533 |
+
"@babel/plugin-transform-parameters" "^7.13.0"
|
534 |
+
|
535 |
"@babel/plugin-proposal-optional-catch-binding@^7.12.13":
|
536 |
version "7.12.13"
|
537 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5"
|
540 |
"@babel/helper-plugin-utils" "^7.12.13"
|
541 |
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
|
542 |
|
543 |
+
"@babel/plugin-proposal-optional-catch-binding@^7.13.8":
|
544 |
+
version "7.13.8"
|
545 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107"
|
546 |
+
integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==
|
547 |
+
dependencies:
|
548 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
549 |
+
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
|
550 |
+
|
551 |
"@babel/plugin-proposal-optional-chaining@^7.12.17":
|
552 |
version "7.12.17"
|
553 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c"
|
557 |
"@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
|
558 |
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
|
559 |
|
560 |
+
"@babel/plugin-proposal-optional-chaining@^7.13.8":
|
561 |
+
version "7.13.8"
|
562 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz#e39df93efe7e7e621841babc197982e140e90756"
|
563 |
+
integrity sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==
|
564 |
+
dependencies:
|
565 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
566 |
+
"@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
|
567 |
+
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
|
568 |
+
|
569 |
"@babel/plugin-proposal-private-methods@^7.12.13":
|
570 |
version "7.12.13"
|
571 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71"
|
574 |
"@babel/helper-create-class-features-plugin" "^7.12.13"
|
575 |
"@babel/helper-plugin-utils" "^7.12.13"
|
576 |
|
577 |
+
"@babel/plugin-proposal-private-methods@^7.13.0":
|
578 |
+
version "7.13.0"
|
579 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787"
|
580 |
+
integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==
|
581 |
+
dependencies:
|
582 |
+
"@babel/helper-create-class-features-plugin" "^7.13.0"
|
583 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
584 |
+
|
585 |
"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
|
586 |
version "7.12.13"
|
587 |
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba"
|
611 |
dependencies:
|
612 |
"@babel/helper-plugin-utils" "^7.12.13"
|
613 |
|
614 |
+
"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3":
|
615 |
version "7.8.3"
|
616 |
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
|
617 |
integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
|
709 |
dependencies:
|
710 |
"@babel/helper-plugin-utils" "^7.12.13"
|
711 |
|
712 |
+
"@babel/plugin-transform-arrow-functions@^7.13.0":
|
713 |
+
version "7.13.0"
|
714 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae"
|
715 |
+
integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==
|
716 |
+
dependencies:
|
717 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
718 |
+
|
719 |
"@babel/plugin-transform-async-to-generator@^7.12.13":
|
720 |
version "7.12.13"
|
721 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae"
|
725 |
"@babel/helper-plugin-utils" "^7.12.13"
|
726 |
"@babel/helper-remap-async-to-generator" "^7.12.13"
|
727 |
|
728 |
+
"@babel/plugin-transform-async-to-generator@^7.13.0":
|
729 |
+
version "7.13.0"
|
730 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f"
|
731 |
+
integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==
|
732 |
+
dependencies:
|
733 |
+
"@babel/helper-module-imports" "^7.12.13"
|
734 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
735 |
+
"@babel/helper-remap-async-to-generator" "^7.13.0"
|
736 |
+
|
737 |
"@babel/plugin-transform-block-scoped-functions@^7.12.13":
|
738 |
version "7.12.13"
|
739 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
|
761 |
"@babel/helper-split-export-declaration" "^7.12.13"
|
762 |
globals "^11.1.0"
|
763 |
|
764 |
+
"@babel/plugin-transform-classes@^7.13.0":
|
765 |
+
version "7.13.0"
|
766 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b"
|
767 |
+
integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==
|
768 |
+
dependencies:
|
769 |
+
"@babel/helper-annotate-as-pure" "^7.12.13"
|
770 |
+
"@babel/helper-function-name" "^7.12.13"
|
771 |
+
"@babel/helper-optimise-call-expression" "^7.12.13"
|
772 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
773 |
+
"@babel/helper-replace-supers" "^7.13.0"
|
774 |
+
"@babel/helper-split-export-declaration" "^7.12.13"
|
775 |
+
globals "^11.1.0"
|
776 |
+
|
777 |
"@babel/plugin-transform-computed-properties@^7.12.13":
|
778 |
version "7.12.13"
|
779 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d"
|
781 |
dependencies:
|
782 |
"@babel/helper-plugin-utils" "^7.12.13"
|
783 |
|
784 |
+
"@babel/plugin-transform-computed-properties@^7.13.0":
|
785 |
+
version "7.13.0"
|
786 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed"
|
787 |
+
integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==
|
788 |
+
dependencies:
|
789 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
790 |
+
|
791 |
"@babel/plugin-transform-destructuring@^7.12.13":
|
792 |
version "7.12.13"
|
793 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb"
|
795 |
dependencies:
|
796 |
"@babel/helper-plugin-utils" "^7.12.13"
|
797 |
|
798 |
+
"@babel/plugin-transform-destructuring@^7.13.0":
|
799 |
+
version "7.13.0"
|
800 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963"
|
801 |
+
integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==
|
802 |
+
dependencies:
|
803 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
804 |
+
|
805 |
"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
|
806 |
version "7.12.13"
|
807 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad"
|
840 |
dependencies:
|
841 |
"@babel/helper-plugin-utils" "^7.12.13"
|
842 |
|
843 |
+
"@babel/plugin-transform-for-of@^7.13.0":
|
844 |
+
version "7.13.0"
|
845 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062"
|
846 |
+
integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==
|
847 |
+
dependencies:
|
848 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
849 |
+
|
850 |
"@babel/plugin-transform-function-name@^7.12.13":
|
851 |
version "7.12.13"
|
852 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
|
878 |
"@babel/helper-plugin-utils" "^7.12.13"
|
879 |
babel-plugin-dynamic-import-node "^2.3.3"
|
880 |
|
881 |
+
"@babel/plugin-transform-modules-amd@^7.13.0":
|
882 |
+
version "7.13.0"
|
883 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3"
|
884 |
+
integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==
|
885 |
+
dependencies:
|
886 |
+
"@babel/helper-module-transforms" "^7.13.0"
|
887 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
888 |
+
babel-plugin-dynamic-import-node "^2.3.3"
|
889 |
+
|
890 |
"@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.4.4":
|
891 |
version "7.12.13"
|
892 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50"
|
897 |
"@babel/helper-simple-access" "^7.12.13"
|
898 |
babel-plugin-dynamic-import-node "^2.3.3"
|
899 |
|
900 |
+
"@babel/plugin-transform-modules-commonjs@^7.13.8":
|
901 |
+
version "7.13.8"
|
902 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b"
|
903 |
+
integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==
|
904 |
+
dependencies:
|
905 |
+
"@babel/helper-module-transforms" "^7.13.0"
|
906 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
907 |
+
"@babel/helper-simple-access" "^7.12.13"
|
908 |
+
babel-plugin-dynamic-import-node "^2.3.3"
|
909 |
+
|
910 |
"@babel/plugin-transform-modules-systemjs@^7.12.13":
|
911 |
version "7.12.13"
|
912 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5"
|
918 |
"@babel/helper-validator-identifier" "^7.12.11"
|
919 |
babel-plugin-dynamic-import-node "^2.3.3"
|
920 |
|
921 |
+
"@babel/plugin-transform-modules-systemjs@^7.13.8":
|
922 |
+
version "7.13.8"
|
923 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3"
|
924 |
+
integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==
|
925 |
+
dependencies:
|
926 |
+
"@babel/helper-hoist-variables" "^7.13.0"
|
927 |
+
"@babel/helper-module-transforms" "^7.13.0"
|
928 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
929 |
+
"@babel/helper-validator-identifier" "^7.12.11"
|
930 |
+
babel-plugin-dynamic-import-node "^2.3.3"
|
931 |
+
|
932 |
"@babel/plugin-transform-modules-umd@^7.12.13":
|
933 |
version "7.12.13"
|
934 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37"
|
937 |
"@babel/helper-module-transforms" "^7.12.13"
|
938 |
"@babel/helper-plugin-utils" "^7.12.13"
|
939 |
|
940 |
+
"@babel/plugin-transform-modules-umd@^7.13.0":
|
941 |
+
version "7.13.0"
|
942 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b"
|
943 |
+
integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==
|
944 |
+
dependencies:
|
945 |
+
"@babel/helper-module-transforms" "^7.13.0"
|
946 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
947 |
+
|
948 |
"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
|
949 |
version "7.12.13"
|
950 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9"
|
974 |
dependencies:
|
975 |
"@babel/helper-plugin-utils" "^7.12.13"
|
976 |
|
977 |
+
"@babel/plugin-transform-parameters@^7.13.0":
|
978 |
+
version "7.13.0"
|
979 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007"
|
980 |
+
integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==
|
981 |
+
dependencies:
|
982 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
983 |
+
|
984 |
"@babel/plugin-transform-property-literals@^7.12.13":
|
985 |
version "7.12.13"
|
986 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81"
|
1013 |
dependencies:
|
1014 |
"@babel/helper-plugin-utils" "^7.12.13"
|
1015 |
|
1016 |
+
"@babel/plugin-transform-runtime@7.13.9":
|
1017 |
+
version "7.13.9"
|
1018 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.9.tgz#744d3103338a0d6c90dee0497558150b490cee07"
|
1019 |
+
integrity sha512-XCxkY/wBI6M6Jj2mlWxkmqbKPweRanszWbF3Tyut+hKh+PHcuIH/rSr/7lmmE7C3WW+HSIm2GT+d5jwmheuB0g==
|
1020 |
dependencies:
|
1021 |
"@babel/helper-module-imports" "^7.12.13"
|
1022 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
1023 |
+
babel-plugin-polyfill-corejs2 "^0.1.4"
|
1024 |
+
babel-plugin-polyfill-corejs3 "^0.1.3"
|
1025 |
+
babel-plugin-polyfill-regenerator "^0.1.2"
|
1026 |
+
semver "^6.3.0"
|
1027 |
|
1028 |
"@babel/plugin-transform-shorthand-properties@^7.12.13":
|
1029 |
version "7.12.13"
|
1040 |
"@babel/helper-plugin-utils" "^7.12.13"
|
1041 |
"@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
|
1042 |
|
1043 |
+
"@babel/plugin-transform-spread@^7.13.0":
|
1044 |
+
version "7.13.0"
|
1045 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd"
|
1046 |
+
integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==
|
1047 |
+
dependencies:
|
1048 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
1049 |
+
"@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
|
1050 |
+
|
1051 |
"@babel/plugin-transform-sticky-regex@^7.12.13":
|
1052 |
version "7.12.13"
|
1053 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
|
1062 |
dependencies:
|
1063 |
"@babel/helper-plugin-utils" "^7.12.13"
|
1064 |
|
1065 |
+
"@babel/plugin-transform-template-literals@^7.13.0":
|
1066 |
+
version "7.13.0"
|
1067 |
+
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d"
|
1068 |
+
integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==
|
1069 |
+
dependencies:
|
1070 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
1071 |
+
|
1072 |
"@babel/plugin-transform-typeof-symbol@^7.12.13":
|
1073 |
version "7.12.13"
|
1074 |
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
|
1091 |
"@babel/helper-create-regexp-features-plugin" "^7.12.13"
|
1092 |
"@babel/helper-plugin-utils" "^7.12.13"
|
1093 |
|
1094 |
+
"@babel/preset-env@7.13.9":
|
1095 |
+
version "7.13.9"
|
1096 |
+
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.9.tgz#3ee5f233316b10d066d7f379c6d1e13a96853654"
|
1097 |
+
integrity sha512-mcsHUlh2rIhViqMG823JpscLMesRt3QbMsv1+jhopXEb3W2wXvQ9QoiOlZI9ZbR3XqPtaFpZwEZKYqGJnGMZTQ==
|
1098 |
+
dependencies:
|
1099 |
+
"@babel/compat-data" "^7.13.8"
|
1100 |
+
"@babel/helper-compilation-targets" "^7.13.8"
|
1101 |
+
"@babel/helper-plugin-utils" "^7.13.0"
|
1102 |
+
"@babel/helper-validator-option" "^7.12.17"
|
1103 |
+
"@babel/plugin-proposal-async-generator-functions" "^7.13.8"
|
1104 |
+
"@babel/plugin-proposal-class-properties" "^7.13.0"
|
1105 |
+
"@babel/plugin-proposal-dynamic-import" "^7.13.8"
|
1106 |
+
"@babel/plugin-proposal-export-namespace-from" "^7.12.13"
|
1107 |
+
"@babel/plugin-proposal-json-strings" "^7.13.8"
|
1108 |
+
"@babel/plugin-proposal-logical-assignment-operators" "^7.13.8"
|
1109 |
+
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8"
|
1110 |
+
"@babel/plugin-proposal-numeric-separator" "^7.12.13"
|
1111 |
+
"@babel/plugin-proposal-object-rest-spread" "^7.13.8"
|
1112 |
+
"@babel/plugin-proposal-optional-catch-binding" "^7.13.8"
|
1113 |
+
"@babel/plugin-proposal-optional-chaining" "^7.13.8"
|
1114 |
+
"@babel/plugin-proposal-private-methods" "^7.13.0"
|
1115 |
+
"@babel/plugin-proposal-unicode-property-regex" "^7.12.13"
|
1116 |
+
"@babel/plugin-syntax-async-generators" "^7.8.4"
|
1117 |
+
"@babel/plugin-syntax-class-properties" "^7.12.13"
|
1118 |
+
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
|
1119 |
+
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
|
1120 |
+
"@babel/plugin-syntax-json-strings" "^7.8.3"
|
1121 |
+
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
|
1122 |
+
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
|
1123 |
+
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
|
1124 |
+
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
|
1125 |
+
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
|
1126 |
+
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
|
1127 |
+
"@babel/plugin-syntax-top-level-await" "^7.12.13"
|
1128 |
+
"@babel/plugin-transform-arrow-functions" "^7.13.0"
|
1129 |
+
"@babel/plugin-transform-async-to-generator" "^7.13.0"
|
1130 |
+
"@babel/plugin-transform-block-scoped-functions" "^7.12.13"
|
1131 |
+
"@babel/plugin-transform-block-scoping" "^7.12.13"
|
1132 |
+
"@babel/plugin-transform-classes" "^7.13.0"
|
1133 |
+
"@babel/plugin-transform-computed-properties" "^7.13.0"
|
1134 |
+
"@babel/plugin-transform-destructuring" "^7.13.0"
|
1135 |
+
"@babel/plugin-transform-dotall-regex" "^7.12.13"
|
1136 |
+
"@babel/plugin-transform-duplicate-keys" "^7.12.13"
|
1137 |
+
"@babel/plugin-transform-exponentiation-operator" "^7.12.13"
|
1138 |
+
"@babel/plugin-transform-for-of" "^7.13.0"
|
1139 |
+
"@babel/plugin-transform-function-name" "^7.12.13"
|
1140 |
+
"@babel/plugin-transform-literals" "^7.12.13"
|
1141 |
+
"@babel/plugin-transform-member-expression-literals" "^7.12.13"
|
1142 |
+
"@babel/plugin-transform-modules-amd" "^7.13.0"
|
1143 |
+
"@babel/plugin-transform-modules-commonjs" "^7.13.8"
|
1144 |
+
"@babel/plugin-transform-modules-systemjs" "^7.13.8"
|
1145 |
+
"@babel/plugin-transform-modules-umd" "^7.13.0"
|
1146 |
+
"@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13"
|
1147 |
+
"@babel/plugin-transform-new-target" "^7.12.13"
|
1148 |
+
"@babel/plugin-transform-object-super" "^7.12.13"
|
1149 |
+
"@babel/plugin-transform-parameters" "^7.13.0"
|
1150 |
+
"@babel/plugin-transform-property-literals" "^7.12.13"
|
1151 |
+
"@babel/plugin-transform-regenerator" "^7.12.13"
|
1152 |
+
"@babel/plugin-transform-reserved-words" "^7.12.13"
|
1153 |
+
"@babel/plugin-transform-shorthand-properties" "^7.12.13"
|
1154 |
+
"@babel/plugin-transform-spread" "^7.13.0"
|
1155 |
+
"@babel/plugin-transform-sticky-regex" "^7.12.13"
|
1156 |
+
"@babel/plugin-transform-template-literals" "^7.13.0"
|
1157 |
+
"@babel/plugin-transform-typeof-symbol" "^7.12.13"
|
1158 |
+
"@babel/plugin-transform-unicode-escapes" "^7.12.13"
|
1159 |
+
"@babel/plugin-transform-unicode-regex" "^7.12.13"
|
1160 |
+
"@babel/preset-modules" "^0.1.4"
|
1161 |
+
"@babel/types" "^7.13.0"
|
1162 |
+
babel-plugin-polyfill-corejs2 "^0.1.4"
|
1163 |
+
babel-plugin-polyfill-corejs3 "^0.1.3"
|
1164 |
+
babel-plugin-polyfill-regenerator "^0.1.2"
|
1165 |
+
core-js-compat "^3.9.0"
|
1166 |
+
semver "^6.3.0"
|
1167 |
+
|
1168 |
+
"@babel/preset-env@^7.4.4":
|
1169 |
version "7.12.17"
|
1170 |
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa"
|
1171 |
integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg==
|
1237 |
core-js-compat "^3.8.0"
|
1238 |
semver "^5.5.0"
|
1239 |
|
1240 |
+
"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4":
|
1241 |
version "0.1.4"
|
1242 |
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
|
1243 |
integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
|
1279 |
globals "^11.1.0"
|
1280 |
lodash "^4.17.19"
|
1281 |
|
1282 |
+
"@babel/traverse@^7.13.0":
|
1283 |
+
version "7.13.0"
|
1284 |
+
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc"
|
1285 |
+
integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==
|
1286 |
+
dependencies:
|
1287 |
+
"@babel/code-frame" "^7.12.13"
|
1288 |
+
"@babel/generator" "^7.13.0"
|
1289 |
+
"@babel/helper-function-name" "^7.12.13"
|
1290 |
+
"@babel/helper-split-export-declaration" "^7.12.13"
|
1291 |
+
"@babel/parser" "^7.13.0"
|
1292 |
+
"@babel/types" "^7.13.0"
|
1293 |
+
debug "^4.1.0"
|
1294 |
+
globals "^11.1.0"
|
1295 |
+
lodash "^4.17.19"
|
1296 |
+
|
1297 |
"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
|
1298 |
version "7.12.17"
|
1299 |
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963"
|
1303 |
lodash "^4.17.19"
|
1304 |
to-fast-properties "^2.0.0"
|
1305 |
|
1306 |
+
"@babel/types@^7.13.0":
|
1307 |
+
version "7.13.0"
|
1308 |
+
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80"
|
1309 |
+
integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==
|
1310 |
+
dependencies:
|
1311 |
+
"@babel/helper-validator-identifier" "^7.12.11"
|
1312 |
+
lodash "^4.17.19"
|
1313 |
+
to-fast-properties "^2.0.0"
|
1314 |
+
|
1315 |
"@bcoe/v8-coverage@^0.2.3":
|
1316 |
version "0.2.3"
|
1317 |
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
1325 |
exec-sh "^0.3.2"
|
1326 |
minimist "^1.2.0"
|
1327 |
|
1328 |
+
"@eslint/eslintrc@^0.4.0":
|
1329 |
+
version "0.4.0"
|
1330 |
+
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547"
|
1331 |
+
integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==
|
1332 |
dependencies:
|
1333 |
ajv "^6.12.4"
|
1334 |
debug "^4.1.1"
|
1337 |
ignore "^4.0.6"
|
1338 |
import-fresh "^3.2.1"
|
1339 |
js-yaml "^3.13.1"
|
|
|
1340 |
minimatch "^3.0.4"
|
1341 |
strip-json-comments "^3.1.1"
|
1342 |
|
1985 |
babel-runtime "^6.22.0"
|
1986 |
babel-types "^6.24.1"
|
1987 |
|
1988 |
+
babel-jest@26.6.3, babel-jest@^26.6.3:
|
1989 |
version "26.6.3"
|
1990 |
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056"
|
1991 |
integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==
|
2034 |
"@types/babel__core" "^7.0.0"
|
2035 |
"@types/babel__traverse" "^7.0.6"
|
2036 |
|
2037 |
+
babel-plugin-polyfill-corejs2@^0.1.4:
|
2038 |
+
version "0.1.10"
|
2039 |
+
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1"
|
2040 |
+
integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==
|
2041 |
+
dependencies:
|
2042 |
+
"@babel/compat-data" "^7.13.0"
|
2043 |
+
"@babel/helper-define-polyfill-provider" "^0.1.5"
|
2044 |
+
semver "^6.1.1"
|
2045 |
+
|
2046 |
+
babel-plugin-polyfill-corejs3@^0.1.3:
|
2047 |
+
version "0.1.7"
|
2048 |
+
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0"
|
2049 |
+
integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==
|
2050 |
+
dependencies:
|
2051 |
+
"@babel/helper-define-polyfill-provider" "^0.1.5"
|
2052 |
+
core-js-compat "^3.8.1"
|
2053 |
+
|
2054 |
+
babel-plugin-polyfill-regenerator@^0.1.2:
|
2055 |
+
version "0.1.6"
|
2056 |
+
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f"
|
2057 |
+
integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==
|
2058 |
+
dependencies:
|
2059 |
+
"@babel/helper-define-polyfill-provider" "^0.1.5"
|
2060 |
+
|
2061 |
babel-plugin-syntax-class-properties@^6.8.0:
|
2062 |
version "6.13.0"
|
2063 |
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
|
2064 |
integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=
|
2065 |
|
2066 |
+
babel-plugin-transform-class-properties@6.24.1:
|
2067 |
version "6.24.1"
|
2068 |
resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
|
2069 |
integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=
|
2754 |
browserslist "^4.16.3"
|
2755 |
semver "7.0.0"
|
2756 |
|
2757 |
+
core-js-compat@^3.8.1, core-js-compat@^3.9.0:
|
2758 |
+
version "3.9.1"
|
2759 |
+
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455"
|
2760 |
+
integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==
|
2761 |
+
dependencies:
|
2762 |
+
browserslist "^4.16.3"
|
2763 |
+
semver "7.0.0"
|
2764 |
+
|
2765 |
core-js@^2.4.0, core-js@^2.6.5:
|
2766 |
version "2.6.12"
|
2767 |
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
|
3461 |
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
|
3462 |
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
|
3463 |
|
3464 |
+
eslint@7.21.0:
|
3465 |
+
version "7.21.0"
|
3466 |
+
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.21.0.tgz#4ecd5b8c5b44f5dedc9b8a110b01bbfeb15d1c83"
|
3467 |
+
integrity sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==
|
3468 |
dependencies:
|
3469 |
"@babel/code-frame" "7.12.11"
|
3470 |
+
"@eslint/eslintrc" "^0.4.0"
|
3471 |
ajv "^6.10.0"
|
3472 |
chalk "^4.0.0"
|
3473 |
cross-spawn "^7.0.2"
|
3480 |
espree "^7.3.1"
|
3481 |
esquery "^1.4.0"
|
3482 |
esutils "^2.0.2"
|
3483 |
+
file-entry-cache "^6.0.1"
|
3484 |
functional-red-black-tree "^1.0.1"
|
3485 |
glob-parent "^5.0.0"
|
3486 |
globals "^12.1.0"
|
3726 |
dependencies:
|
3727 |
bser "2.1.1"
|
3728 |
|
3729 |
+
file-entry-cache@^6.0.1:
|
3730 |
version "6.0.1"
|
3731 |
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
|
3732 |
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
|
3845 |
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
|
3846 |
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
|
3847 |
|
3848 |
+
gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2:
|
3849 |
version "1.0.0-beta.2"
|
3850 |
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
|
3851 |
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
|
4993 |
merge-stream "^2.0.0"
|
4994 |
supports-color "^7.0.0"
|
4995 |
|
4996 |
+
jest@26.6.3:
|
4997 |
version "26.6.3"
|
4998 |
resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef"
|
4999 |
integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==
|
5225 |
dependencies:
|
5226 |
p-locate "^4.1.0"
|
5227 |
|
5228 |
+
lodash-cli@4.17.5:
|
5229 |
version "4.17.5"
|
5230 |
resolved "https://registry.yarnpkg.com/lodash-cli/-/lodash-cli-4.17.5.tgz#1bab72c8c9980febf4fe7a1900b0971ce040dd0b"
|
5231 |
integrity sha512-eeQi+oVS76ofP791g4wEGs4B4nyc4fiHboUCc0BzM8qCkLAzqbroewOt98A8ISoY1HH2di00pENNErXf0MWxiw==
|
5287 |
resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
|
5288 |
integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
|
5289 |
|
5290 |
+
lodash.debounce@^4.0.8:
|
5291 |
+
version "4.0.8"
|
5292 |
+
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
|
5293 |
+
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
|
5294 |
+
|
5295 |
lodash.find@3.2.1:
|
5296 |
version "3.2.1"
|
5297 |
resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-3.2.1.tgz#046e319f3ace912ac6c9246c7f683c5ec07b36ad"
|
5912 |
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
|
5913 |
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
|
5914 |
|
5915 |
+
parcel-bundler@1.12.4:
|
5916 |
version "1.12.4"
|
5917 |
resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.12.4.tgz#31223f4ab4d00323a109fce28d5e46775409a9ee"
|
5918 |
integrity sha512-G+iZGGiPEXcRzw0fiRxWYCKxdt/F7l9a0xkiU4XbcVRJCSlBnioWEwJMutOCCpoQmaQtjB4RBHDGIHN85AIhLQ==
|
5977 |
v8-compile-cache "^2.0.0"
|
5978 |
ws "^5.1.1"
|
5979 |
|
5980 |
+
parcel-plugin-assets-list@1.7.1:
|
5981 |
version "1.7.1"
|
5982 |
resolved "https://registry.yarnpkg.com/parcel-plugin-assets-list/-/parcel-plugin-assets-list-1.7.1.tgz#0495f0cee1413763a2e5bc62610ad3744ff77867"
|
5983 |
integrity sha512-PCWPBEoiAAHvw5I472aOfTV3anhpQ8Y981NUewuNHN4ZmaJTGC15z37hM/UynasjFMm3gG/o2TRtXJBNosJEYg==
|
6877 |
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
6878 |
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
|
6879 |
|
6880 |
+
resolve@^1.1.5, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.4.0:
|
6881 |
version "1.20.0"
|
6882 |
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
6883 |
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
|
6998 |
dependencies:
|
6999 |
xmlchars "^2.2.0"
|
7000 |
|
7001 |
+
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0:
|
7002 |
version "5.7.1"
|
7003 |
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
7004 |
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
7013 |
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
|
7014 |
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
|
7015 |
|
7016 |
+
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
|
7017 |
version "6.3.0"
|
7018 |
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
7019 |
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|