Version Description
(released 7 dec 2021) * An innocent text file triggered Windows Defender. It has been removed. Thanks to Javad Naroogheh from Iran for notifying
Download this release
Release Info
Developer | rosell.dk |
Plugin | WebP Express |
Version | 0.25.1 |
Comparing to | |
See all releases |
Code changes from version 0.25.0 to 0.25.1
README.txt
CHANGED
@@ -4,7 +4,7 @@ Donate link: https://ko-fi.com/rosell
|
|
4 |
Tags: webp, images, performance
|
5 |
Requires at least: 4.0
|
6 |
Tested up to: 5.8
|
7 |
-
Stable tag: 0.25.
|
8 |
Requires PHP: 5.6
|
9 |
License: GPLv3
|
10 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
@@ -35,6 +35,7 @@ The plugin implements the "WebP On Demand" solution described [here](https://git
|
|
35 |
- [Image MimeType Guesser](https://github.com/rosell-dk/image-mime-type-guesser): For detecting mime types of images.
|
36 |
- [HTAccess Capability Tester](https://github.com/rosell-dk/htaccess-capability-tester): For testing .htaccess capabilities in a given directory, using live tests
|
37 |
- [WebP Convert File Manager](https://github.com/rosell-dk/webp-convert-filemanager): For browsing conversions and triggering conversions.
|
|
|
38 |
|
39 |
### Benefits
|
40 |
- Much faster load time for images in browsers that supports webp. The converted images are typically *less than half the size* (for jpeg), while maintaining the same quality. Bear in mind that for most web sites, images are responsible for the largest part of the waiting time.
|
@@ -177,11 +178,11 @@ Bread on the table don't come for free, even though this plugin does, and always
|
|
177 |
* Ruben Solvang
|
178 |
|
179 |
**Persons who recently contributed with [ko-fi](https://ko-fi.com/rosell) - Thanks!**
|
|
|
|
|
180 |
* 20 Nov: Ben J
|
181 |
* 13 Nov: @sween
|
182 |
* 9 Nov: @utrenkner
|
183 |
-
* 26 Oct: Anonymous
|
184 |
-
* 29 Aug: Pawa Tecnologia
|
185 |
|
186 |
**Persons who contributed with extra generously amounts of coffee / lifetime backing (>30$) - thanks!:**
|
187 |
|
@@ -813,6 +814,10 @@ If you want to make sure that my coffee supplies don't run dry, you can even buy
|
|
813 |
|
814 |
== Changelog ==
|
815 |
|
|
|
|
|
|
|
|
|
816 |
= 0.25.0 =
|
817 |
(released 7 dec 2021, on my daughters 10 year birthday!)
|
818 |
* No exec()? - We don't give up easily, but now emulates it if possible, using proc_open(), passthru() or other alternatives. The result is that the cwebp converter now is available on more systems. Quality detection of jpegs also works on more systems now. The fallback feature with the emulations is btw implemented in a new library, [exec-with-fallback](https://github.com/rosell-dk/exec-with-fallback)
|
@@ -906,6 +911,9 @@ For older releases, check out changelog.txt
|
|
906 |
|
907 |
== Upgrade Notice ==
|
908 |
|
|
|
|
|
|
|
909 |
= 0.25.0 =
|
910 |
* No exec()? - We don't give up so easily anymore.
|
911 |
|
4 |
Tags: webp, images, performance
|
5 |
Requires at least: 4.0
|
6 |
Tested up to: 5.8
|
7 |
+
Stable tag: 0.25.1
|
8 |
Requires PHP: 5.6
|
9 |
License: GPLv3
|
10 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
35 |
- [Image MimeType Guesser](https://github.com/rosell-dk/image-mime-type-guesser): For detecting mime types of images.
|
36 |
- [HTAccess Capability Tester](https://github.com/rosell-dk/htaccess-capability-tester): For testing .htaccess capabilities in a given directory, using live tests
|
37 |
- [WebP Convert File Manager](https://github.com/rosell-dk/webp-convert-filemanager): For browsing conversions and triggering conversions.
|
38 |
+
- [Exec With Fallback](https://github.com/rosell-dk/exec-with-fallback): For emulating exec() on systems where it is disabled (using proc_open(), passthru() or similar alternatives).
|
39 |
|
40 |
### Benefits
|
41 |
- Much faster load time for images in browsers that supports webp. The converted images are typically *less than half the size* (for jpeg), while maintaining the same quality. Bear in mind that for most web sites, images are responsible for the largest part of the waiting time.
|
178 |
* Ruben Solvang
|
179 |
|
180 |
**Persons who recently contributed with [ko-fi](https://ko-fi.com/rosell) - Thanks!**
|
181 |
+
* 3 Dec: Dallas
|
182 |
+
* 29 Nov: tadesco.org
|
183 |
* 20 Nov: Ben J
|
184 |
* 13 Nov: @sween
|
185 |
* 9 Nov: @utrenkner
|
|
|
|
|
186 |
|
187 |
**Persons who contributed with extra generously amounts of coffee / lifetime backing (>30$) - thanks!:**
|
188 |
|
814 |
|
815 |
== Changelog ==
|
816 |
|
817 |
+
= 0.25.1 =
|
818 |
+
(released 7 dec 2021)
|
819 |
+
* An innocent text file triggered Windows Defender. It has been removed. Thanks to Javad Naroogheh from Iran for notifying
|
820 |
+
|
821 |
= 0.25.0 =
|
822 |
(released 7 dec 2021, on my daughters 10 year birthday!)
|
823 |
* No exec()? - We don't give up easily, but now emulates it if possible, using proc_open(), passthru() or other alternatives. The result is that the cwebp converter now is available on more systems. Quality detection of jpegs also works on more systems now. The fallback feature with the emulations is btw implemented in a new library, [exec-with-fallback](https://github.com/rosell-dk/exec-with-fallback)
|
911 |
|
912 |
== Upgrade Notice ==
|
913 |
|
914 |
+
= 0.25.1 =
|
915 |
+
* An innocent text file was triggering Windows Defender.
|
916 |
+
|
917 |
= 0.25.0 =
|
918 |
* No exec()? - We don't give up so easily anymore.
|
919 |
|
changelog.txt
CHANGED
@@ -1,3 +1,7 @@
|
|
|
|
|
|
|
|
|
|
1 |
= 0.25.0 =
|
2 |
(released 7 dec 2021, on my daughters 10 year birthday!)
|
3 |
* No exec()? - We don't give up easily, but now emulates it if possible, using proc_open(), passthru() or other alternatives. The result is that the cwebp converter now is available on more systems. Quality detection of jpegs also works on more systems now. The fallback feature with the emulations is btw implemented in a new library, [exec-with-fallback](https://github.com/rosell-dk/exec-with-fallback)
|
1 |
+
= 0.25.1 =
|
2 |
+
(released 7 dec 2021)
|
3 |
+
* An innocent text file triggered Windows Defender. It has been removed. Thanks to Javad Naroogheh from Iran for notifying
|
4 |
+
|
5 |
= 0.25.0 =
|
6 |
(released 7 dec 2021, on my daughters 10 year birthday!)
|
7 |
* No exec()? - We don't give up easily, but now emulates it if possible, using proc_open(), passthru() or other alternatives. The result is that the cwebp converter now is available on more systems. Quality detection of jpegs also works on more systems now. The fallback feature with the emulations is btw implemented in a new library, [exec-with-fallback](https://github.com/rosell-dk/exec-with-fallback)
|
docs/publishing.md
CHANGED
@@ -114,12 +114,12 @@ svn status | grep '^!' | awk '{print $2}' | xargs svn delete --force (t
|
|
114 |
Then add a new tag
|
115 |
```
|
116 |
cd svn
|
117 |
-
svn cp trunk tags/0.
|
118 |
```
|
119 |
|
120 |
And commit!
|
121 |
```
|
122 |
-
svn ci -m '0.
|
123 |
```
|
124 |
|
125 |
|
114 |
Then add a new tag
|
115 |
```
|
116 |
cd svn
|
117 |
+
svn cp trunk tags/0.25.0 (this will copy trunk into a new tag)
|
118 |
```
|
119 |
|
120 |
And commit!
|
121 |
```
|
122 |
+
svn ci -m '0.25.0'
|
123 |
```
|
124 |
|
125 |
|
lib/classes/ConvertHelperIndependent.php
CHANGED
@@ -571,7 +571,7 @@ APACHE
|
|
571 |
$text = preg_replace('#' . preg_quote($_SERVER["DOCUMENT_ROOT"]) . '#', '[doc-root]', $text);
|
572 |
|
573 |
// TODO: Put version number somewhere else. Ie \WebPExpress\VersionNumber::version
|
574 |
-
$text = 'WebP Express 0.25.
|
575 |
|
576 |
$logFile = self::getLogFilename($source, $logDir);
|
577 |
|
571 |
$text = preg_replace('#' . preg_quote($_SERVER["DOCUMENT_ROOT"]) . '#', '[doc-root]', $text);
|
572 |
|
573 |
// TODO: Put version number somewhere else. Ie \WebPExpress\VersionNumber::version
|
574 |
+
$text = 'WebP Express 0.25.1. ' . $msgTop . ', ' . date("Y-m-d H:i:s") . "\n\r\n\r" . $text;
|
575 |
|
576 |
$logFile = self::getLogFilename($source, $logDir);
|
577 |
|
vendor/composer/installed.json
CHANGED
@@ -284,17 +284,17 @@
|
|
284 |
},
|
285 |
{
|
286 |
"name": "rosell-dk/exec-with-fallback",
|
287 |
-
"version": "1.1.
|
288 |
-
"version_normalized": "1.1.
|
289 |
"source": {
|
290 |
"type": "git",
|
291 |
"url": "https://github.com/rosell-dk/exec-with-fallback.git",
|
292 |
-
"reference": "
|
293 |
},
|
294 |
"dist": {
|
295 |
"type": "zip",
|
296 |
-
"url": "https://api.github.com/repos/rosell-dk/exec-with-fallback/zipball/
|
297 |
-
"reference": "
|
298 |
"shasum": ""
|
299 |
},
|
300 |
"require": {
|
@@ -308,7 +308,7 @@
|
|
308 |
"suggest": {
|
309 |
"php-stan/php-stan": "Suggested for dev, in order to analyse code before committing"
|
310 |
},
|
311 |
-
"time": "2021-12-
|
312 |
"type": "library",
|
313 |
"extra": {
|
314 |
"scripts-descriptions": {
|
@@ -348,7 +348,7 @@
|
|
348 |
],
|
349 |
"support": {
|
350 |
"issues": "https://github.com/rosell-dk/exec-with-fallback/issues",
|
351 |
-
"source": "https://github.com/rosell-dk/exec-with-fallback/tree/1.1.
|
352 |
},
|
353 |
"funding": [
|
354 |
{
|
284 |
},
|
285 |
{
|
286 |
"name": "rosell-dk/exec-with-fallback",
|
287 |
+
"version": "1.1.1",
|
288 |
+
"version_normalized": "1.1.1.0",
|
289 |
"source": {
|
290 |
"type": "git",
|
291 |
"url": "https://github.com/rosell-dk/exec-with-fallback.git",
|
292 |
+
"reference": "af7d9b513edd2a85ce8ad392f27099dab6d9def9"
|
293 |
},
|
294 |
"dist": {
|
295 |
"type": "zip",
|
296 |
+
"url": "https://api.github.com/repos/rosell-dk/exec-with-fallback/zipball/af7d9b513edd2a85ce8ad392f27099dab6d9def9",
|
297 |
+
"reference": "af7d9b513edd2a85ce8ad392f27099dab6d9def9",
|
298 |
"shasum": ""
|
299 |
},
|
300 |
"require": {
|
308 |
"suggest": {
|
309 |
"php-stan/php-stan": "Suggested for dev, in order to analyse code before committing"
|
310 |
},
|
311 |
+
"time": "2021-12-07T10:37:35+00:00",
|
312 |
"type": "library",
|
313 |
"extra": {
|
314 |
"scripts-descriptions": {
|
348 |
],
|
349 |
"support": {
|
350 |
"issues": "https://github.com/rosell-dk/exec-with-fallback/issues",
|
351 |
+
"source": "https://github.com/rosell-dk/exec-with-fallback/tree/1.1.1"
|
352 |
},
|
353 |
"funding": [
|
354 |
{
|
vendor/composer/installed.php
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
'type' => 'wordpress-plugin',
|
6 |
'install_path' => __DIR__ . '/../../',
|
7 |
'aliases' => array(),
|
8 |
-
'reference' => '
|
9 |
'name' => 'rosell-dk/webp-express',
|
10 |
'dev' => true,
|
11 |
),
|
@@ -38,12 +38,12 @@
|
|
38 |
'dev_requirement' => false,
|
39 |
),
|
40 |
'rosell-dk/exec-with-fallback' => array(
|
41 |
-
'pretty_version' => '1.1.
|
42 |
-
'version' => '1.1.
|
43 |
'type' => 'library',
|
44 |
'install_path' => __DIR__ . '/../rosell-dk/exec-with-fallback',
|
45 |
'aliases' => array(),
|
46 |
-
'reference' => '
|
47 |
'dev_requirement' => false,
|
48 |
),
|
49 |
'rosell-dk/htaccess-capability-tester' => array(
|
@@ -88,7 +88,7 @@
|
|
88 |
'type' => 'wordpress-plugin',
|
89 |
'install_path' => __DIR__ . '/../../',
|
90 |
'aliases' => array(),
|
91 |
-
'reference' => '
|
92 |
'dev_requirement' => false,
|
93 |
),
|
94 |
'roundcube/plugin-installer' => array(
|
5 |
'type' => 'wordpress-plugin',
|
6 |
'install_path' => __DIR__ . '/../../',
|
7 |
'aliases' => array(),
|
8 |
+
'reference' => 'ea58ba41b482adf628b88813812c3d927770d8f6',
|
9 |
'name' => 'rosell-dk/webp-express',
|
10 |
'dev' => true,
|
11 |
),
|
38 |
'dev_requirement' => false,
|
39 |
),
|
40 |
'rosell-dk/exec-with-fallback' => array(
|
41 |
+
'pretty_version' => '1.1.1',
|
42 |
+
'version' => '1.1.1.0',
|
43 |
'type' => 'library',
|
44 |
'install_path' => __DIR__ . '/../rosell-dk/exec-with-fallback',
|
45 |
'aliases' => array(),
|
46 |
+
'reference' => 'af7d9b513edd2a85ce8ad392f27099dab6d9def9',
|
47 |
'dev_requirement' => false,
|
48 |
),
|
49 |
'rosell-dk/htaccess-capability-tester' => array(
|
88 |
'type' => 'wordpress-plugin',
|
89 |
'install_path' => __DIR__ . '/../../',
|
90 |
'aliases' => array(),
|
91 |
+
'reference' => 'ea58ba41b482adf628b88813812c3d927770d8f6',
|
92 |
'dev_requirement' => false,
|
93 |
),
|
94 |
'roundcube/plugin-installer' => array(
|
vendor/rosell-dk/exec-with-fallback/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
[![Build Status](https://github.com/rosell-dk/exec-with-fallback/actions/workflows/php.yml/badge.svg)](https://github.com/rosell-dk/exec-with-fallback/actions/workflows/php.yml)
|
5 |
[![Software License](http://poser.pugx.org/rosell-dk/exec-with-fallback/license)](https://github.com/rosell-dk/exec-with-fallback/blob/master/LICENSE)
|
6 |
[![PHP Version Require](http://poser.pugx.org/rosell-dk/exec-with-fallback/require/php)](https://packagist.org/packages/rosell-dk/exec-with-fallback)
|
7 |
-
|
8 |
|
9 |
Some shared hosts may have disabled *exec()*, but leaved *proc_open()*, *passthru()*, *popen()* or *shell_exec()* open. In case you want to easily fall back to emulating *exec()* with one of these, you have come to the right library.
|
10 |
|
@@ -54,3 +54,9 @@ I made sure that the function behaves exactly like *exec()*, and wrote a lot of
|
|
54 |
|
55 |
**going to be maintained**\
|
56 |
I'm going to use this library in [webp-convert](https://github.com/rosell-dk/webp-convert), which is used in many projects. So it is going to be widely used. While I don't expect much need for maintenance for this project, it is going to be there, if needed.
|
|
|
|
|
|
|
|
|
|
|
|
4 |
[![Build Status](https://github.com/rosell-dk/exec-with-fallback/actions/workflows/php.yml/badge.svg)](https://github.com/rosell-dk/exec-with-fallback/actions/workflows/php.yml)
|
5 |
[![Software License](http://poser.pugx.org/rosell-dk/exec-with-fallback/license)](https://github.com/rosell-dk/exec-with-fallback/blob/master/LICENSE)
|
6 |
[![PHP Version Require](http://poser.pugx.org/rosell-dk/exec-with-fallback/require/php)](https://packagist.org/packages/rosell-dk/exec-with-fallback)
|
7 |
+
[![Daily Downloads](http://poser.pugx.org/rosell-dk/exec-with-fallback/d/daily)](https://packagist.org/packages/rosell-dk/exec-with-fallback)
|
8 |
|
9 |
Some shared hosts may have disabled *exec()*, but leaved *proc_open()*, *passthru()*, *popen()* or *shell_exec()* open. In case you want to easily fall back to emulating *exec()* with one of these, you have come to the right library.
|
10 |
|
54 |
|
55 |
**going to be maintained**\
|
56 |
I'm going to use this library in [webp-convert](https://github.com/rosell-dk/webp-convert), which is used in many projects. So it is going to be widely used. While I don't expect much need for maintenance for this project, it is going to be there, if needed.
|
57 |
+
|
58 |
+
## Do you like what I do?
|
59 |
+
Perhaps you want to support my work, so I can continue doing it :)
|
60 |
+
|
61 |
+
- [Become a backer or sponsor on Patreon](https://www.patreon.com/rosell).
|
62 |
+
- [Buy me a Coffee](https://ko-fi.com/rosell)
|
vendor/rosell-dk/exec-with-fallback/docs/notes.md
DELETED
@@ -1,116 +0,0 @@
|
|
1 |
-
|
2 |
-
Read up on proc_open
|
3 |
-
https://www.sitepoint.com/proc-open-communicate-with-the-outside-world/
|
4 |
-
https://www.php.net/manual/en/function.proc-open.php
|
5 |
-
https://www.php.net/manual/en/function.proc-close.php
|
6 |
-
https://www.php.net/manual/en/function.stream-set-blocking.php
|
7 |
-
https://www.php.net/manual/en/function.stream-select.php
|
8 |
-
https://stackoverflow.com/questions/21353611/how-to-wait-for-a-process-executed-by-proc-open-in-php
|
9 |
-
https://pretagteam.com/question/how-to-wait-for-a-process-executed-by-procopen-in-php
|
10 |
-
https://www.google.com/search?q=proc_open+wait&oq=proc_open+wait&aqs=chrome..69i57.2386j0j1&sourceid=chrome&ie=UTF-8
|
11 |
-
https://wuhzat.wordpress.com/2011/01/11/php-exec-vs-proc_open/
|
12 |
-
https://stackoverflow.com/questions/5673740/php-or-apache-exec-popen-system-and-proc-open-commands-do-not-execute-any-com
|
13 |
-
https://stackoverflow.com/questions/25424506/the-difference-between-exec-and-popen/25424608
|
14 |
-
|
15 |
-
And see how other uses it:
|
16 |
-
https://packagist.org/packages/tivie/command
|
17 |
-
https://github.com/tivie/command/blob/master/src/Command.php
|
18 |
-
https://packagist.org/packages/symfony/process
|
19 |
-
https://github.com/axute/process
|
20 |
-
https://packagist.org/?query=proc_open
|
21 |
-
https://stackoverflow.com/questions/6014819/how-to-get-output-of-proc-open
|
22 |
-
|
23 |
-
|
24 |
-
https://linuxhint.com/wait_command_linux/
|
25 |
-
|
26 |
-
|
27 |
-
#pcntl_exec
|
28 |
-
Should we use it?
|
29 |
-
https://www.php.net/manual/en/function.proc-open.php#102239
|
30 |
-
https://www.php.net/manual/en/function.pcntl-exec.php
|
31 |
-
https://www.php.net/manual/en/function.posix-mkfifo.php
|
32 |
-
|
33 |
-
|
34 |
-
#popen
|
35 |
-
https://www.php.net/manual/en/function.popen.php
|
36 |
-
|
37 |
-
|
38 |
-
#shell_exec
|
39 |
-
Hm... no exit code.. how to deal with that?
|
40 |
-
https://www.php.net/manual/en/function.shell-exec.php
|
41 |
-
|
42 |
-
|
43 |
-
# disable_functions
|
44 |
-
Perhaps check `ini_get('disable_functions')` too ?
|
45 |
-
https://stackoverflow.com/questions/3938120/check-if-exec-is-disabled
|
46 |
-
https://stackoverflow.com/questions/2749591/php-exec-check-if-enabled-or-disabled
|
47 |
-
https://www.py4u.net/discuss/26911
|
48 |
-
|
49 |
-
# passthrough
|
50 |
-
https://www.php.net/manual/en/function.passthru.php
|
51 |
-
|
52 |
-
According to this, you cannot store in variable:
|
53 |
-
https://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru
|
54 |
-
|
55 |
-
However, it can be done with output buffering:
|
56 |
-
```
|
57 |
-
function yemenEx($in)
|
58 |
-
{
|
59 |
-
$out = '';
|
60 |
-
if (function_exists('exec')) {
|
61 |
-
@exec($in, $out);
|
62 |
-
$out = @join("\n", $out);
|
63 |
-
} elseif (function_exists('passthru')) {
|
64 |
-
ob_start();
|
65 |
-
@passthru($in);
|
66 |
-
$out = ob_get_clean();
|
67 |
-
} elseif (function_exists('system')) {
|
68 |
-
ob_start();
|
69 |
-
@system($in);
|
70 |
-
$out = ob_get_clean();
|
71 |
-
} elseif (function_exists('shell_exec')) {
|
72 |
-
$out = shell_exec($in);
|
73 |
-
} elseif (is_resource($f = @popen($in, "r"))) {
|
74 |
-
$out = "";
|
75 |
-
while (!@feof($f)) {
|
76 |
-
$out .= fread($f, 1024);
|
77 |
-
}
|
78 |
-
pclose($f);
|
79 |
-
}
|
80 |
-
return $out;
|
81 |
-
}
|
82 |
-
```
|
83 |
-
(got it from here: https://hotexamples.com/examples/-/-/passthru/php-passthru-function-examples.html)
|
84 |
-
Also check this little overview out: https://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru
|
85 |
-
https://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
#system
|
90 |
-
|
91 |
-
|
92 |
-
Should I call the library ExecWithBackup or something like that instead? - nah, only if I find a better name than that
|
93 |
-
|
94 |
-
|
95 |
-
# What should this be called?
|
96 |
-
Simply what it does:
|
97 |
-
- ExecWithFallback
|
98 |
-
- ExecOrSimilar
|
99 |
-
- TryHarderExec / ExecTryHarder
|
100 |
-
|
101 |
-
The rat finds its way… And dont give up easily. Tries different ways
|
102 |
-
- ExecRat / RatExec
|
103 |
-
|
104 |
-
Eller navngiv efter Wolfe, “the fixer” i Pulp Fiction - a no nonense charactor who gets the job done (with style)
|
105 |
-
- WolfeExec / ExecWolfe
|
106 |
-
|
107 |
-
Nationality:
|
108 |
-
- GermanExec
|
109 |
-
- DanishExec
|
110 |
-
|
111 |
-
Material:
|
112 |
-
- RubberExec
|
113 |
-
- RubberbandExec
|
114 |
-
|
115 |
-
Other ideas:
|
116 |
-
StrongExec, ResilientExec, EmulatedExec, GoalOrientedExec, ExecContractor, ExecDeLuxe, DropInExec, BetterExec, ExecMaster, ExecDragon, CuteExec, PersistantExec, ToughExec, ExecWithFallback, AdaptableExec, CompliantExec, ImprovedExec, ResoluteExec, StautExec, ObstinateExec, KeenExec, AgileExec, Smooth, Flexible, ExecAndFriends, SturdyExex, ResilientExec
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|