Version Description
- Improvement: Compatibility with the plugin WP Offload S3 Pro, and fixed a few things for both Lite and Pro versions.
- Improvement: Improved performance on the bulk optimization page for huge image libraries.
- Improvement: When performing a bulk optimization, moved the attachments with the "WELL DONE" message at the end of the queue, it helps to speed up things.
- Improvement: Use cURL directly only to optimize an image. It helps when cURL is not available: less things will break in that case.
- Bug Fix: Fixed a bug with the plugin Screets Live Chat, prior to version 2.2.8.
- Regression fix: Fixed the buffer size on the bulk optimization page.
- Dev stuff: Added a hook allowing to filter arguments when doing a request to our API. It can be used to increase the timeout value for example.
Download this release
Release Info
Developer | wp_media |
Plugin | Imagify Image Optimizer |
Version | 1.6.7 |
Comparing to | |
See all releases |
Code changes from version 1.6.6 to 1.6.7
- assets/css/admin.css +23 -23
- assets/css/admin.min.css +1 -1
- assets/css/sweetalert2.css +0 -0
- assets/css/sweetalert2.min.css +0 -0
- assets/images/big-blue-check.png +0 -0
- assets/images/icon-arrow-choice.png +0 -0
- assets/images/icon-arrow-choice.svg +0 -0
- assets/images/icon-lock.png +0 -0
- assets/images/icon-lock.svg +0 -0
- assets/images/icon-pack.png +0 -0
- assets/images/icon-pack.svg +0 -0
- assets/images/pic-ericwaltr.jpg +0 -0
- assets/images/pic-srhdesign.jpg +0 -0
- assets/js/es6-promise.auto.js +0 -0
- assets/js/es6-promise.auto.min.js +0 -0
- assets/js/imagify.js +4 -2
- assets/js/imagify.min.js +1 -1
- assets/js/sweetalert2.js +0 -0
- assets/js/sweetalert2.min.js +0 -0
- imagify.php +2 -2
- inc/3rd-party/3rd-party.php +1 -0
- inc/3rd-party/amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php +1 -1
- inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf-attachment.php +6 -12
- inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf.php +145 -1
- inc/3rd-party/enable-media-replace.php +0 -0
- inc/3rd-party/hosting/wpengine.php +7 -3
- inc/3rd-party/nextgen-gallery/inc/admin/ajax.php +4 -3
- inc/3rd-party/nextgen-gallery/inc/admin/bulk.php +1 -1
- inc/3rd-party/nextgen-gallery/inc/admin/db.php +0 -0
- inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php +0 -0
- inc/3rd-party/nextgen-gallery/inc/admin/gallery.php +0 -0
- inc/3rd-party/nextgen-gallery/inc/admin/heartbeat.php +1 -1
- inc/3rd-party/nextgen-gallery/inc/admin/menu.php +0 -0
- inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-attachment.php +2 -1
- inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-db.php +0 -0
- inc/3rd-party/nextgen-gallery/inc/common/attachments.php +0 -0
- inc/3rd-party/nextgen-gallery/inc/functions/admin-stats.php +93 -6
- inc/3rd-party/screets-lc.php +31 -0
- inc/admin/ajax.php +108 -114
- inc/admin/heartbeat.php +0 -0
- inc/admin/options.php +1 -1
- inc/api/imagify.php +2 -0
- inc/classes/abstracts/class-imagify-abstract-attachment.php +16 -2
- inc/classes/abstracts/class-imagify-abstract-db.php +0 -0
- inc/classes/class-imagify-attachment.php +0 -18
- inc/classes/class-imagify.php +132 -18
- inc/compat.php +34 -5
- inc/functions/admin-stats.php +198 -116
- inc/functions/admin-ui.php +0 -0
- inc/functions/admin.php +62 -5
- inc/functions/attachments.php +108 -38
- inc/functions/deprecated.php +19 -0
- inc/functions/process.php +1 -1
- readme.txt +11 -2
assets/css/admin.css
CHANGED
@@ -164,7 +164,7 @@ body.imagify-modal-is-open {
|
|
164 |
width: 100%;
|
165 |
padding: 0 !important;
|
166 |
}
|
167 |
-
.imagify-sweet-alert .sa-input-error:before,
|
168 |
.imagify-sweet-alert .sa-input-error:after,
|
169 |
.imagify-sweet-alert .la-ball-fall {
|
170 |
top: 25% !important;
|
@@ -189,7 +189,7 @@ body.imagify-modal-is-open {
|
|
189 |
}
|
190 |
|
191 |
#imagify-check-api-container {
|
192 |
-
font-weight: bold;
|
193 |
}
|
194 |
|
195 |
#imagify-check-api-container .dashicons {
|
@@ -245,7 +245,7 @@ body.imagify-modal-is-open {
|
|
245 |
height: 25px;
|
246 |
border-radius: 50%;
|
247 |
}
|
248 |
-
|
249 |
.imagify-chart {
|
250 |
float: left;
|
251 |
margin-bottom: 20px;
|
@@ -345,10 +345,10 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar {
|
|
345 |
}
|
346 |
|
347 |
|
348 |
-
|
349 |
*
|
350 |
* == Settings page
|
351 |
-
*
|
352 |
*/
|
353 |
|
354 |
|
@@ -425,7 +425,7 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar {
|
|
425 |
padding: 3px 6px 5px;
|
426 |
font-size: 12px;
|
427 |
box-shadow: none!important;
|
428 |
-
line-height: 1.2;
|
429 |
}
|
430 |
.imagify-settings .button.button-mini-flat:hover,
|
431 |
.imagify-settings .button.button-mini-flat:focus {
|
@@ -479,7 +479,7 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar {
|
|
479 |
background: #8BC34A;
|
480 |
color: #FFF;
|
481 |
box-shadow: 0 3px 0 #6F9C3B;
|
482 |
-
text-shadow: 0 -1px 1px #6F9C3B, 1px 0 1px #6F9C3B, 0 1px 1px #6F9C3B!important;
|
483 |
}
|
484 |
.imagify-settings .button-primary:hover,
|
485 |
.imagify-settings .button-primary:focus,
|
@@ -1166,7 +1166,7 @@ input[id^="imagify_sizes_"]:checked + label {
|
|
1166 |
margin-top: 2em;
|
1167 |
}
|
1168 |
@media (max-width: 820px) {
|
1169 |
-
.imagify-settings {
|
1170 |
display: -webkit-box;
|
1171 |
display: -ms-flexbox;
|
1172 |
display: flex;
|
@@ -1293,7 +1293,7 @@ a.btn-rocket:focus {
|
|
1293 |
}
|
1294 |
|
1295 |
|
1296 |
-
|
1297 |
* == Welcome section
|
1298 |
*/
|
1299 |
|
@@ -1383,8 +1383,8 @@ a.btn-rocket:focus {
|
|
1383 |
}
|
1384 |
|
1385 |
|
1386 |
-
|
1387 |
-
* == Imagify Notices
|
1388 |
*/
|
1389 |
.imagify-notice.imagify-notice {
|
1390 |
position: relative;
|
@@ -1459,7 +1459,7 @@ a.btn-rocket:focus {
|
|
1459 |
background: rgba(0, 0, 0, 0.4) none repeat scroll 0 0;
|
1460 |
}
|
1461 |
|
1462 |
-
|
1463 |
* == Custom column & Metabox
|
1464 |
*/
|
1465 |
.column-imagify_optimized_file.column-imagify_optimized_file {
|
@@ -1631,7 +1631,7 @@ ul.imagify-datas-details.imagify-datas-details {
|
|
1631 |
font-size: 11px;
|
1632 |
}
|
1633 |
|
1634 |
-
|
1635 |
* == Bulk page
|
1636 |
*/
|
1637 |
|
@@ -1756,7 +1756,7 @@ ul.imagify-datas-details.imagify-datas-details {
|
|
1756 |
[class^="imagify-bar-"],
|
1757 |
#wp-admin-bar-imagify-profile [class^="imagify-bar-"] {
|
1758 |
position: relative;
|
1759 |
-
height:
|
1760 |
width: 100%;
|
1761 |
background: #60758D;
|
1762 |
color: #FFF;
|
@@ -1768,14 +1768,14 @@ ul.imagify-datas-details.imagify-datas-details {
|
|
1768 |
[class^="imagify-bar-"].right-outside-number {
|
1769 |
-webkit-box-sizing: border-box;
|
1770 |
box-sizing: border-box;
|
1771 |
-
padding-right:
|
1772 |
}
|
1773 |
.right-outside-number .imagify-barnb {
|
1774 |
display: block;
|
1775 |
-
margin-right: -
|
1776 |
text-align: right;
|
1777 |
font-weight: bold;
|
1778 |
-
line-height:
|
1779 |
}
|
1780 |
.imagify-progress-value,
|
1781 |
#wp-admin-bar-imagify-profile .imagify-progress-value {
|
@@ -1787,7 +1787,7 @@ ul.imagify-datas-details.imagify-datas-details {
|
|
1787 |
}
|
1788 |
.imagify-progress,
|
1789 |
#wp-admin-bar-imagify-profile .imagify-progress {
|
1790 |
-
height:
|
1791 |
}
|
1792 |
.imagify-progress {
|
1793 |
transition: width .3s;
|
@@ -2084,7 +2084,7 @@ ul.imagify-datas-details.imagify-datas-details {
|
|
2084 |
display: table;
|
2085 |
width: 100%;
|
2086 |
}
|
2087 |
-
.tooltip-content.tooltip-table > * {
|
2088 |
display: table-cell;
|
2089 |
vertical-align: middle;
|
2090 |
}
|
@@ -2153,7 +2153,7 @@ ul.imagify-datas-details.imagify-datas-details {
|
|
2153 |
color: #46b1ce;
|
2154 |
}
|
2155 |
|
2156 |
-
|
2157 |
* == Bulk table
|
2158 |
*/
|
2159 |
.imagify-bulk-table {
|
@@ -2251,7 +2251,7 @@ ul.imagify-datas-details.imagify-datas-details {
|
|
2251 |
opacity: 1;
|
2252 |
}
|
2253 |
}
|
2254 |
-
|
2255 |
@keyframes congrate {
|
2256 |
0% {
|
2257 |
opacity: 0;
|
@@ -2791,7 +2791,7 @@ td.imagify-cell-filename {
|
|
2791 |
.imagify-analyzing .imagify-numbers-notcalc,
|
2792 |
.imagify-modal-section.imagify-analyzing .imagify-loader {
|
2793 |
display: block;
|
2794 |
-
}
|
2795 |
.imagify-modal-section .imagify-loader {
|
2796 |
margin: 2em auto;
|
2797 |
}
|
@@ -3786,4 +3786,4 @@ p.imagify-modal-sidebar-title {
|
|
3786 |
color: #40b1d0;
|
3787 |
float: right;
|
3788 |
font-weight: bold;
|
3789 |
-
}
|
164 |
width: 100%;
|
165 |
padding: 0 !important;
|
166 |
}
|
167 |
+
.imagify-sweet-alert .sa-input-error:before,
|
168 |
.imagify-sweet-alert .sa-input-error:after,
|
169 |
.imagify-sweet-alert .la-ball-fall {
|
170 |
top: 25% !important;
|
189 |
}
|
190 |
|
191 |
#imagify-check-api-container {
|
192 |
+
font-weight: bold;
|
193 |
}
|
194 |
|
195 |
#imagify-check-api-container .dashicons {
|
245 |
height: 25px;
|
246 |
border-radius: 50%;
|
247 |
}
|
248 |
+
|
249 |
.imagify-chart {
|
250 |
float: left;
|
251 |
margin-bottom: 20px;
|
345 |
}
|
346 |
|
347 |
|
348 |
+
/**
|
349 |
*
|
350 |
* == Settings page
|
351 |
+
*
|
352 |
*/
|
353 |
|
354 |
|
425 |
padding: 3px 6px 5px;
|
426 |
font-size: 12px;
|
427 |
box-shadow: none!important;
|
428 |
+
line-height: 1.2;
|
429 |
}
|
430 |
.imagify-settings .button.button-mini-flat:hover,
|
431 |
.imagify-settings .button.button-mini-flat:focus {
|
479 |
background: #8BC34A;
|
480 |
color: #FFF;
|
481 |
box-shadow: 0 3px 0 #6F9C3B;
|
482 |
+
text-shadow: 0 -1px 1px #6F9C3B, 1px 0 1px #6F9C3B, 0 1px 1px #6F9C3B!important;
|
483 |
}
|
484 |
.imagify-settings .button-primary:hover,
|
485 |
.imagify-settings .button-primary:focus,
|
1166 |
margin-top: 2em;
|
1167 |
}
|
1168 |
@media (max-width: 820px) {
|
1169 |
+
.imagify-settings {
|
1170 |
display: -webkit-box;
|
1171 |
display: -ms-flexbox;
|
1172 |
display: flex;
|
1293 |
}
|
1294 |
|
1295 |
|
1296 |
+
/**
|
1297 |
* == Welcome section
|
1298 |
*/
|
1299 |
|
1383 |
}
|
1384 |
|
1385 |
|
1386 |
+
/**
|
1387 |
+
* == Imagify Notices
|
1388 |
*/
|
1389 |
.imagify-notice.imagify-notice {
|
1390 |
position: relative;
|
1459 |
background: rgba(0, 0, 0, 0.4) none repeat scroll 0 0;
|
1460 |
}
|
1461 |
|
1462 |
+
/**
|
1463 |
* == Custom column & Metabox
|
1464 |
*/
|
1465 |
.column-imagify_optimized_file.column-imagify_optimized_file {
|
1631 |
font-size: 11px;
|
1632 |
}
|
1633 |
|
1634 |
+
/**
|
1635 |
* == Bulk page
|
1636 |
*/
|
1637 |
|
1756 |
[class^="imagify-bar-"],
|
1757 |
#wp-admin-bar-imagify-profile [class^="imagify-bar-"] {
|
1758 |
position: relative;
|
1759 |
+
height: 1.5em;
|
1760 |
width: 100%;
|
1761 |
background: #60758D;
|
1762 |
color: #FFF;
|
1768 |
[class^="imagify-bar-"].right-outside-number {
|
1769 |
-webkit-box-sizing: border-box;
|
1770 |
box-sizing: border-box;
|
1771 |
+
padding-right: 4.5em;
|
1772 |
}
|
1773 |
.right-outside-number .imagify-barnb {
|
1774 |
display: block;
|
1775 |
+
margin-right: -4.5em;
|
1776 |
text-align: right;
|
1777 |
font-weight: bold;
|
1778 |
+
line-height: 1.5;
|
1779 |
}
|
1780 |
.imagify-progress-value,
|
1781 |
#wp-admin-bar-imagify-profile .imagify-progress-value {
|
1787 |
}
|
1788 |
.imagify-progress,
|
1789 |
#wp-admin-bar-imagify-profile .imagify-progress {
|
1790 |
+
height: 1.5em;
|
1791 |
}
|
1792 |
.imagify-progress {
|
1793 |
transition: width .3s;
|
2084 |
display: table;
|
2085 |
width: 100%;
|
2086 |
}
|
2087 |
+
.tooltip-content.tooltip-table > * {
|
2088 |
display: table-cell;
|
2089 |
vertical-align: middle;
|
2090 |
}
|
2153 |
color: #46b1ce;
|
2154 |
}
|
2155 |
|
2156 |
+
/**
|
2157 |
* == Bulk table
|
2158 |
*/
|
2159 |
.imagify-bulk-table {
|
2251 |
opacity: 1;
|
2252 |
}
|
2253 |
}
|
2254 |
+
|
2255 |
@keyframes congrate {
|
2256 |
0% {
|
2257 |
opacity: 0;
|
2791 |
.imagify-analyzing .imagify-numbers-notcalc,
|
2792 |
.imagify-modal-section.imagify-analyzing .imagify-loader {
|
2793 |
display: block;
|
2794 |
+
}
|
2795 |
.imagify-modal-section .imagify-loader {
|
2796 |
margin: 2em auto;
|
2797 |
}
|
3786 |
color: #40b1d0;
|
3787 |
float: right;
|
3788 |
font-weight: bold;
|
3789 |
+
}
|
assets/css/admin.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.imagify-cell,.imagify-cell.va-top,.va-top .imagify-cell{vertical-align:top}#imagify-overview-chart-legend,.imagify-oh,body.imagify-modal-is-open{overflow:hidden}.imagify-start{float:left}.imagify-end{float:right}.imagify-txt-start.imagify-txt-start.imagify-txt-start{text-align:left}.imagify-txt-center.imagify-txt-center.imagify-txt-center{text-align:center}.imagify-txt-end.imagify-txt-end.imagify-txt-end{text-align:right}.imagify-mt1.imagify-mt1{margin-top:1em}.imagify-mb1.imagify-mb1{margin-bottom:1em}.imagify-mr1.imagify-mr1{margin-right:1em}.imagify-ml2.imagify-ml2{margin-left:2em}.imagify-mr2.imagify-mr2{margin-right:2em}.imagify-pl0.imagify-pl0.imagify-pl0{padding-left:0}.imagify-pr1.imagify-pr1{padding-right:1em}.imagify-clear{clear:both}.imagify-clearfix:after,.imagify-inline-options:after{content:"";display:table;clear:both}.imagify-count.imagify-count{counter-reset:num}.imagify-count .imagify-count-title{font-weight:700}.imagify-default-settings{color:#73818c;font-weight:400}.imagify-count .imagify-count-title:before{counter-increment:num 1;content:counter(num) ". "}.imagify-table{display:table;width:100%}.imagify-cell{display:table-cell;padding:10px}.imagify-bulk-submit .imagify-cell{padding-top:0}.imagify-plugins-error{overflow:hidden;padding-left:20px;list-style-type:disc}.imagify-plugins-error li{width:300px;line-height:30px}@media (max-width:570px){.imagify-plugins-error li{width:auto}}.imagify-notice-dismiss.notice-dismiss{text-decoration:none}.imagify-spinner{display:inline-block;width:20px;height:20px;margin-right:5px;vertical-align:middle;background:url(../images/spinner.gif) 0 0/20px 20px no-repeat rgba(0,0,0,0);opacity:.7}.spinner.imagify-hidden{width:0;margin:4px 0 0}.misc-pub-section.misc-pub-imagify h4{font-size:14px;margin-top:5px;margin-bottom:0}.imagify-sweet-alert button{margin-top:17px!important;height:45px!important;letter-spacing:3px;text-transform:uppercase!important;border-radius:3px!important;background-color:#40b1d0!important;-webkit-box-shadow:0 3px 0 #338ea6!important;box-shadow:0 3px 0 #338ea6!important}.imagify-sweet-alert button.loading{border-radius:100%!important;height:40px!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{background:#777!important;-webkit-box-shadow:0 3px 0 #444!important;box-shadow:0 3px 0 #444!important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup button{width:100%;padding:0!important}.imagify-sweet-alert .la-ball-fall,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .sa-input-error:before{top:25%!important}#wpwrap{-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s}.stop-scrolling #wpwrap{-webkit-filter:blur(2px);filter:blur(2px)}.stop-scrolling #wpwrap #wpadminbar{top:-32px}.imagify-primary.imagify-primary.imagify-primary{color:#40b1d0}.imagify-secondary.imagify-secondary.imagify-secondary{color:#8cc152}#imagify-check-api-container{font-weight:700}#imagify-check-api-container .dashicons{font-size:25px}#imagify-check-api-container .dashicons-no:before{color:#f06e57;vertical-align:-1px}#imagify-check-api-container .dashicons-yes:before{color:#8BC34A;vertical-align:-1px}.imagify-valid{color:#8BC34A}.imagify-chart{width:33.33%;position:relative}.imagify-doughnut-legend{margin-top:38px;list-style:none}.imagify-doughnut-legend li{display:block;padding-left:30px;position:relative;margin-bottom:15px;border-radius:5px;padding:3px 8px 2px 31px;font-size:14px;font-weight:600;cursor:default;-webkit-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.imagify-doughnut-legend li span{display:block;position:absolute;left:0;top:0;width:25px;height:25px;border-radius:50%}.button-text,.imagify-bulk-info p{display:inline-block}.imagify-chart{float:left;margin-bottom:20px}td .imagify-chart{float:none;margin-bottom:0;top:4px}.imagify-chart-container{position:relative;width:180px;float:left;margin-right:20px}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;font-weight:700;text-align:center}.imagify-total-percent{color:#46b1ce}td .imagify-chart-container{width:18px;height:18px;float:none;margin-right:10px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-14px;text-align:center;font-size:55px;font-weight:700;color:#46B1CE}.imagify-chart-percent span{font-size:20px;vertical-align:super}.media_page_imagify-bulk-optimization .notice,.settings_page_imagify .notice,body[class*="_imagify-ngg-bulk-optimization"] .notice{margin-right:20px;margin-left:2px}.media_page_imagify-bulk-optimization .media-item,body[class*="_imagify-ngg-bulk-optimization"] .media-item{margin:0}.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{float:none;width:100%;margin:0;background:#1F2331;-webkit-box-shadow:0;box-shadow:0;border-radius:0}.media_page_imagify-bulk-optimization .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent{width:auto;padding:0 5px;line-height:1.85;font-size:12px}.media_page_imagify-bulk-optimization .media-item .percent,.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{text-align:right}.media_page_imagify-bulk-optimization .media-item .progress .bar,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar{width:1px;height:22px;margin-top:0;background:#46B1CE;border-radius:0;overflow:visible;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}.imagify-settings .button,.imagify-settings a,.imagify-settings input,.imagify-welcome .button,.imagify-welcome a,.imagify-weolcome input{-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-settings a{color:#40b1d0}.imagify-options-title{padding-bottom:.5em;border-bottom:3px solid #F2F2F2;font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.025em;color:#40b1d0}.imagify-settings,.imagify-settings p,.imagify-settings th{color:#5F758E}@media (max-width:782px){.imagify-settings .form-table th{padding-top:2em;padding-bottom:.5em}}.imagify-settings .form-table td{vertical-align:top}.button .dashicons,.button-text,.imagify-button-primary.imagify-button-primary .dashicons,.imagify-button-secondary.imagify-button-secondary .dashicons,.imagify-button.imagify-button .dashicons,.imagify-notice .button .dashicons,.imagify-settings .button .dashicons,.imagify-welcome .button .dashicons{vertical-align:middle}.imagify-settings .form-table th span{cursor:pointer}.imagify-middle th{padding-top:35px}.imagify-button-primary.imagify-button-primary,.imagify-button-secondary.imagify-button-secondary,.imagify-button.imagify-button,.imagify-notice .button,.imagify-settings .button,.imagify-welcome .button{height:auto;padding:8px 20px;border:0;font-size:14px;font-weight:600;-webkit-box-shadow:0 3px 0 rgba(0,0,0,.15);box-shadow:0 3px 0 rgba(0,0,0,.15);border-radius:3px;cursor:pointer;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-notice .button-mini{padding:2px 10px;font-size:13px}.button-primary.button-mini{padding:2px 10px}.imagify-settings .button.button-mini-flat{padding:3px 6px 5px;font-size:12px;-webkit-box-shadow:none!important;box-shadow:none!important;line-height:1.2}.imagify-settings .button.button-mini-flat:focus,.imagify-settings .button.button-mini-flat:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-button-ghost.imagify-button-ghost,.imagify-title .button-ghost.button-ghost{padding:2px 9px;border:1px solid #40B1D0;font-size:12px;font-weight:400;color:#40B1D0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover,.imagify-title .button-ghost.button-ghost:focus,.imagify-title .button-ghost.button-ghost:hover{border-color:transparent;color:#000;background:#40B1D0}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover{color:#FFF}.imagify-button-medium.imagify-button-medium{text-transform:uppercase;letter-spacing:.1em;padding:3px 10px;font-weight:700}.imagify-button-medium.imagify-button-ghost{border-width:2px}.button .dashicons{margin-right:5px}.imagify-button-primary.imagify-button-primary,.imagify-settings .button-primary.button-primary,.imagify-welcome .button-primary.button-primary{background:#40B1D0;color:#FFF;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1);text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799!important}.imagify-button-secondary.imagify-button-secondary{background:#8BC34A;color:#FFF;-webkit-box-shadow:0 3px 0 #6F9C3B;box-shadow:0 3px 0 #6F9C3B;text-shadow:0 -1px 1px #6F9C3B,1px 0 1px #6F9C3B,0 1px 1px #6F9C3B!important}.imagify-button-primary.imagify-button-primary:focus,.imagify-button-primary.imagify-button-primary:hover,.imagify-settings .button-primary:focus,.imagify-settings .button-primary:hover,.imagify-welcome .button-primary:focus,.imagify-welcome .button-primary:hover{background:#338ea6;-webkit-box-shadow:0 3px 0 #1f7a92;box-shadow:0 3px 0 #1f7a92}.imagify-button-secondary.imagify-button-secondary:focus,.imagify-button-secondary.imagify-button-secondary:hover{background:#6F9C3B;color:#FFF}.imagify-button-light.imagify-button-light{background:#FFF;color:#4a4a4a;-webkit-box-shadow:0 2px 0 rgba(0,0,0,.2);box-shadow:0 2px 0 rgba(0,0,0,.2)}.imagify-button-light.imagify-button-light:focus,.imagify-button-light.imagify-button-light:hover{color:#FFF;background:rgba(0,0,0,.2)}.imagify-section-positive .imagify-button-light{color:#709A41}.imagify-button.imagify-button-big{font-size:15px;padding:11px 30px}.imagify-button-big .dashicons{font-size:1.45em;margin-right:6px;margin-left:-4px}.imagify-info,.imagify-logo{vertical-align:top}#imagify-bulk-action{padding:11px 20px}.media-frame-content .imagify-button-primary,.wp_attachment_image .imagify-button-primary{float:left;padding:0 10px 1px;margin:0 5px 2px 0;font-size:13px;line-height:26px;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1)}.imagify-settings input[type=text]{color:#4A4A4A;font-weight:600;-webkit-box-shadow:none;box-shadow:none}.imagify-settings div.submit.submit{padding-left:235px;padding-top:40px}.imagify-settings p.submit{float:left;margin-top:0}.imagify-settings p.submit .button{margin:0 5px}@media (max-width:850px){.imagify-settings div.submit{padding-left:0}.imagify-settings p.submit{text-align:center}}.imagify-title.imagify-title{position:relative;padding:30px 50px;font-size:23px;background:#2E3243;color:#FFF}.imagify-settings .imagify-title+.imagify-notice{margin:0;border-right:1px solid #D9D9D9;padding-top:15px;padding-bottom:15px}.imagify-section,.imagify-settings div.submit,.imagify-sub-header,.imagify-sub-title.imagify-sub-title{margin:0;padding:20px;background:#F2F5F7}.imagify-section-positive,.imagify-sub-title.imagify-sub-title{padding-left:40px}.imagify-section-positive{background:#8cc152;color:#FFF}.imagify-section-positive p{color:#FFF}.imagify-section-gray{background:#D9E4EB}.imagify-section-gray .imagify-count-title{color:#4a4a4a}.imagify-section p:first-child{margin-top:0}.imagify-section p:last-child{margin-bottom:0}p.imagify-section-title.imagify-section-title{font-size:20px;margin-top:-.3em;margin-bottom:-.6em}.imagify-bulk-info{margin:1em 1em 1em 5px;-webkit-transition:margin .3s;-o-transition:margin .3s;transition:margin .3s}@media (max-width:850px){.imagify-bulk-info{margin:1em}}.imagify-bulk-info p{text-align:left;width:400px;max-width:100%;font-weight:700}@media (min-width:1500px){.imagify-settings div.submit{display:table;width:100%}.imagify-settings div.submit>*{display:table-cell;vertical-align:middle}.imagify-bulk-info{padding:0 25px;text-align:right}}.imagify-settings div.submit{margin-top:2em;padding:20px 0}.imagify-notice .imagify-rate-us .stars,.imagify-sub-header .form-table{margin:0}.imagify-sub-header th{text-align:right}.imagify-sub-header td,.imagify-sub-header th{padding-top:0;padding-bottom:0}[for=api_key]{padding-top:5px}.imagify-notice .imagify-rate-us.imagify-rate-us{position:relative;bottom:0;right:0;text-align:left}.imagify-rate-us.imagify-rate-us{position:absolute;bottom:50%;right:20px;text-align:right;margin-bottom:-2.4em;color:#FFF}.imagify-rate-us a{color:#40B1D0}.imagify-rate-us .stars{display:inline-block;margin:2px 0 0 10px;text-decoration:none;letter-spacing:.2em;vertical-align:-1px}.imagify-rate-us .stars .dashicons:before{font-size:18px}.imagify-rate-us a:focus,.imagify-rate-us a:hover{color:#FEE102}@media (max-width:1220px){.imagify-rate-us.imagify-rate-us{position:static;margin-bottom:0;text-align:left}.imagify-rate-us.imagify-rate-us br{display:none}.imagify-rate-us .stars{display:block;margin-left:0}}.imagify-rkt-notice.imagify-rkt-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;padding:10px 45px 10px 0;border:0;-webkit-box-shadow:none;box-shadow:none;color:#FFF;background:#412355}.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:2px;margin-right:20px}@media (max-width:782px){.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:0;margin-right:12px}}.imagify-rkt-notice .imagify-cross{position:absolute;right:8px;top:50%;width:22px;height:22px;padding:0;margin-top:-11px;background:0 0;color:#FD7300;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross .dashicons{position:relative;top:2px;left:1px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross:hover{background:#FFF}.imagify-rkt-notice .imagify-cross:hover .dashicons{color:#412355}.imagify-rkt-notice .imagify-rkt-coupon,.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo{-ms-flex-negative:0;flex-shrink:0}.imagify-rkt-notice .imagify-rkt-logo{width:150px!important;text-align:center;padding:0 25px 0 30px;line-height:.8}.imagify-rkt-notice .imagify-rkt-msg{width:100%!important;padding:0 15px;font-size:14px;line-height:1.6}.imagify-rkt-notice .imagify-rkt-coupon{width:150px!important;padding:0 15px}.imagify-rkt-notice .imagify-rkt-coupon-code{padding:5px 10px;font-size:23px;font-weight:700;border:1px dashed #F7A933;color:#F7A933}.imagify-rkt-notice .imagify-rkt-cta{width:250px!important;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:200px;flex-basis:200px}.imagify-rkt-notice .button.button{position:relative;top:-1px;height:auto;font-weight:600;font-size:14px;-webkit-box-shadow:0 4px 0 #B27A27;box-shadow:0 4px 0 #B27A27;border:0;padding:9px 18px;background:#F7A933;text-shadow:1px 1px 1px rgba(0,0,0,.2)}@media (max-width:880px){.imagify-rkt-notice{-ms-flex-wrap:wrap;flex-wrap:wrap}.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo,.imagify-rkt-notice .imagify-rkt-msg{text-align:left;padding:5px 15px}.imagify-cross.imagify-cross{top:8px;margin-top:0}.imagify-rkt-notice .imagify-cross .dashicons{top:1px}}.imagify-settings-section{padding:10px 20px}.imagify-welcome .imagify-settings-section,[id=imagify-settings]{border:1px solid #D9D9D9;border-top:0 none;background:#FFF}.imagify-br{line-height:2}.imagify-important{color:#F5A623}.imagify-info,.imagify-info a{color:#40B1D0;font-size:12px}.imagify-info{position:relative;display:inline-block;padding-left:25px}.imagify-info .dashicons{position:absolute;left:0;top:-1px}.imagify-visual-label,label+.imagify-info,label+.imagify-options-line{display:inline-block;max-width:70%;margin-left:15px;margin-top:2px!important;-webkit-transition:opacity .3s;-o-transition:opacity .3s;transition:opacity .3s}.imagify-visual-label{vertical-align:-5px}label[for=imagify_sizes_full]+.imagify-info{vertical-align:middle}.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label+.imagify-options-line{opacity:.5}.imagify-settings.imagify-settings [type=checkbox]:checked+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:checked+label+.imagify-options-line{opacity:1}.imagify-checkbox-marged{max-width:500px;margin-left:45px}.imagify-checkbox.imagify-checkbox:checked,.imagify-checkbox.imagify-checkbox:not(:checked),.imagify-settings.imagify-settings [type=checkbox]:checked,.imagify-settings.imagify-settings [type=checkbox]:not(:checked){opacity:.01}.imagify-checkbox.imagify-checkbox:checked:focus,.imagify-checkbox.imagify-checkbox:not(:checked):focus,.imagify-settings.imagify-settings [type=checkbox]:checked:focus,.imagify-settings.imagify-settings [type=checkbox]:not(:checked):focus{-webkit-box-shadow:none!important;box-shadow:none!important;outline:0!important;border:0!important}.imagify-checkbox.imagify-checkbox:checked+label,.imagify-checkbox.imagify-checkbox:not(:checked)+label,.imagify-settings [type=checkbox]:checked+label,.imagify-settings [type=checkbox]:not(:checked)+label{position:relative;padding-left:6px;cursor:pointer;vertical-align:top}.imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-checkbox.imagify-checkbox:not(:checked)+label:before,.imagify-settings [type=checkbox]:checked+label:before,.imagify-settings [type=checkbox]:not(:checked)+label:before{content:'';position:absolute;left:0;top:0;width:28px;height:28px;margin:0 0 0 -24px;border:2px solid #8BA6B4;background:#FFF;border-radius:4px}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:checked+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{content:"✓";position:absolute;font-size:1.4em;top:3px;left:-16px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.imagify-checkbox.imagify-checkbox[disabled]:checked+label:before,.imagify-checkbox.imagify-checkbox[disabled]:not(:checked)+label:before,.imagify-settings [type=checkbox][disabled]:checked+label:before,.imagify-settings [type=checkbox][disabled]:not(:checked)+label:before{border-color:#ccc;background:#ddd}.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-settings [type=checkbox]:checked+label:after{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}input[id^=imagify_sizes_]:checked+label{font-weight:700}.medium.imagify-checkbox:checked+label:before,.medium.imagify-checkbox:not(:checked)+label:before{width:22px;height:22px;border-width:1.5px;border-radius:2px;margin-top:0}.medium.imagify-checkbox:checked+label:after,.medium.imagify-checkbox:not(:checked)+label:after{font-size:1.1em;left:-17px;top:3px}.imagify-settings .mini[type=checkbox]:checked+label:before,.imagify-settings .mini[type=checkbox]:not(:checked)+label:before,.mini.imagify-checkbox:checked+label:before,.mini.imagify-checkbox:not(:checked)+label:before{width:15px;height:15px;border-width:1px;border-radius:2px;margin-top:0}.imagify-settings .mini[type=checkbox]:checked+label:after,.imagify-settings .mini[type=checkbox]:not(:checked)+label:after,.mini.imagify-checkbox:checked+label:after,.mini.imagify-checkbox:not(:checked)+label:after{font-size:.9em;left:-21px;top:1px}.imagify-checkbox.imagify-checkbox:checked:focus+label:before,.imagify-checkbox.imagify-checkbox:not(:checked):focus+label:before,.imagify-settings [type=checkbox]:checked:focus+label:before,.imagify-settings [type=checkbox]:not(:checked):focus+label:before{border-style:dotted;border-color:#40b1d0}.imagify-inline-options{position:relative;display:table;width:100%;max-width:600px;border-collapse:collapse}.imagify-small-options{width:300px;margin:1em auto .5em;background:#338EA6;border-radius:4px}.imagify-inline-options input[type=radio]:checked,.imagify-inline-options input[type=radio]:not(:checked){position:absolute;left:5px;top:5px;display:none}.imagify-inline-options input[type=radio]:checked+label,.imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;display:table-cell;padding:13px 10px;text-align:center;font-weight:600;font-size:16px;text-transform:uppercase;letter-spacing:.1em;color:#FFF;background:#2E3243;border-left:1px solid rgba(255,255,255,.2);-webkit-box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);z-index:2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-small-options input[type=radio]:checked+label,.imagify-small-options input[type=radio]:not(:checked)+label{padding:8px 10px;font-size:13px;color:#FFF;-webkit-box-shadow:none;box-shadow:none;border-left:0}.imagify-bulk-submit .imagify-inline-options input[type=radio]:checked+label,.imagify-bulk-submit .imagify-inline-options input[type=radio]:not(:checked)+label{margin-bottom:1.75em}.imagify-inline-options input[type=radio]:checked+label:first-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:first-of-type{border-radius:3px 0 0 3px}.imagify-inline-options input[type=radio]:checked+label:last-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:last-of-type{border-radius:0 3px 3px 0}.imagify-inline-options input[type=radio]:checked+label{background:#8BC34A}.imagify-small-options input[type=radio]:not(:checked)+label{background:#338EA6;color:rgba(255,255,255,.4)}.imagify-small-options input[type=radio]:checked+label{background:#40B1D0}.imagify-inline-options .imagify-info{margin-top:15px}.imagify-btn-info{display:block;font-size:.7em;letter-spacing:0;line-height:1;text-transform:none}.imagify-datas-more-action a,a.btn-rocket{text-transform:uppercase;text-decoration:none}#describe-resize-larger input{width:5em}.imagify-cols:after{content:"";display:table;clear:both}.imagify-col{float:left;width:50%}.imagify-main{float:left;width:70%}.imagify-sidebar{float:right;width:28%;max-width:300px}.imagify-sidebar-section{border:1px solid #BBB;background:#FFF}.imagify-sidebar-section+.imagify-sidebar-section{margin-top:2em}@media (max-width:820px){.imagify-main,.imagify-sidebar{float:none;width:auto}.imagify-settings{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-sidebar{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;max-width:none;margin-left:0;margin-top:25px}.wp-media-products{text-align:center}.wp-media-products li{display:inline-block;width:100%;max-width:276px}}@media (min-width:1400px){.imagify-main{width:74%}}.imagify-sidebar-title{display:block;padding:20px 15px;border-bottom:1px solid #BBB;font-size:14px;font-weight:700;color:#23282d;background:#F2F5F7}.imagify-sidebar-title img{vertical-align:top;margin-right:5px}.imagify-sidebar .wp-media-products{margin-top:0;margin-bottom:-.5em}.imagify-sidebar .wp-media-products .links{display:block;padding:85px 25px 24px;text-align:center;background-color:#2E3243;background-size:contain;background-repeat:no-repeat;background-position:50% 0;text-decoration:none}.imagify-sidebar .wp-media-products .links p{margin:1.5em auto;color:#FFF}.imagify-sidebar .wp-media-products .wprocket-link{background-image:-o-linear-gradient(top,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-image:linear-gradient(to bottom,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-color:#3B1E4E;background-repeat:repeat-x,no-repeat}.imagify-sidebar-content{padding:10px 20px}.imagify-mark-styled{display:inline-block;padding:1px 2px 1px 4px;line-height:1.3;font-weight:700;background:#F7A933;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);text-shadow:1px 1px 0 rgba(0,0,0,.2)}.imagify-mark-styled span{display:inline-block;-webkit-transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg);transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg)}.imagify-discount-code,a.btn-rocket{display:block;text-shadow:1px 1px 0 rgba(0,0,0,.2);font-weight:700}.imagify-discount-code{margin:.35em 0 .5em;font-size:2em;letter-spacing:.05em;text-align:center}.imagify-big-text{font-size:15px;font-weight:700}.imagify-big-text strong{font-size:20px}a.btn-rocket{font-size:1.15em;padding:12px;background:#F7A933;-webkit-box-shadow:0 3px 0 #D69626;box-shadow:0 3px 0 #D69626;border-radius:3px;color:#FFF}a.btn-rocket:focus,a.btn-rocket:hover{background:#ff8c00;-webkit-box-shadow:0 3px 0 #ff8c00;box-shadow:0 3px 0 #ff8c00}.imagify-welcome{margin:30px 20px 0 0}.imagify-welcome .baseline{display:inline-block;margin:.2em 0 0 2em;font-size:17px}.imagify-welcome .imagify-logo{vertical-align:middle}.imagify-welcome-remove{position:absolute;top:50%;right:15px;margin-top:-8px;color:#FFF;text-decoration:none}.imagify-columns{overflow:hidden;padding:15px 0;counter-reset:cols}.imagify-columns [class^=col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-columns .col-1-3{width:33.333%;padding-left:28px}.imagify-columns .col-2-3{width:66.666%;padding-left:28px}.imagify-columns .col-1-2{width:50%;padding:0 20px}.imagify-columns .col-overview{padding-left:20px}.imagify-columns .col-informations{width:36.6%;padding-right:30px}.imagify-columns .col-statistics{width:30%}@media (max-width:830px){.imagify-columns [class^=col-]{float:none;margin-bottom:1.5em}.imagify-columns .col-1-2,.imagify-columns .col-1-3{width:auto;padding:0 28px;clear:both;padding-top:1em}}.imagify-columns [class^=col-] img{float:left;margin-right:18px}.imagify-col-content{overflow:hidden}.imagify-col-title{margin:0 0 15px;font-size:23px}.counter .imagify-col-title:before{counter-increment:cols;content:counter(cols) ". ";color:#40B1D0}.imagify-col-desc{color:#5F758E;margin-bottom:2em}.imagify-notice.imagify-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0;margin:10px 20px 10px 2px;border:0;background:#2E3243;-webkit-box-shadow:none;box-shadow:none;color:#FFF}@media (max-width:782px){.imagify-notice.imagify-notice,.imagify-welcome{margin-right:12px}}@media (max-width:450px){.imagify-notice.imagify-notice{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.wrap .imagify-notice{margin:5px 15px 2px;position:relative}.imagify-notice-logo{padding:18px 23px;background:#40B1D0}.updated .imagify-notice-logo{background:#8BC34A}.error .imagify-notice-logo{background:#D0021B}.imagify-popin-message{padding:5px 15px;text-align:left}.imagify-popin-message.imagify-error p{color:#FFF}.imagify-notice-title{font-size:15px}.imagify-notice-content{padding:5px 23px}.imagify-notice-content.imagify-notice-content p{margin:.65em 0}.imagify-notice a{color:#40B1D0}.imagify-notice a:focus,.imagify-notice a:hover{color:#FEE102}.imagify-notice code{background:rgba(0,0,0,.4)}.column-imagify_optimized_file.column-imagify_optimized_file{width:300px;text-align:center;vertical-align:middle}.column-imagify_optimized_file>*{max-width:235px;margin:0 auto}ul.imagify-datas-list.imagify-datas-list{margin:0 auto;color:#555;font-size:10px}.compat-field-imagify .label{vertical-align:top}.compat-field-imagify ul.imagify-datas-list{margin-top:7px;font-size:11px}ul.imagify-datas-list .big{font-size:12px;color:#40B1D0}.imagify-data-item{overflow:hidden}.imagify-data-item .imagify-chart{display:inline-block;top:1px;width:20px;vertical-align:middle;margin-bottom:0}li.imagify-data-item{clear:both;margin-bottom:2px}ul.imagify-datas-list .imagify-data-item span.data,ul.imagify-datas-list .imagify-data-item strong{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}ul.imagify-datas-list .imagify-data-item span.data{text-align:left;padding-right:5px}.compat-field-imagify .imagify-datas-list .imagify-data-item .data{width:130px;text-align:left;font-weight:700}.media-sidebar .imagify-datas-list .imagify-data-item .data,.media-sidebar .imagify-datas-list .imagify-data-item strong{width:auto;float:none}ul.imagify-datas-list .imagify-data-item strong{text-align:left;padding-left:5px}.imagify-datas-more-action.imagify-datas-more-action{margin:.4em auto;background:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(49%,transparent),color-stop(50%,rgba(0,0,0,.075)),color-stop(58%,rgba(0,0,0,.075)),color-stop(58%,transparent),to(transparent));background:-o-linear-gradient(top,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent);background:linear-gradient(to bottom,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent)}.imagify-datas-more-action a{display:inline-block;padding:0 5px;background:#40B1D0;color:#FFF;font-size:9px;font-weight:700;line-height:1.9}.imagify-datas-more-action a.is-open{background:#555}.imagify-datas-more-action a.is-open .dashicons{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.imagify-datas-more-action a .dashicons{font-size:14px;vertical-align:middle;line-height:.8}.imagify-datas-more-action .the-text,.imagify-datas-more-action a .dashicons:before{line-height:20px;vertical-align:middle}.imagify-datas-more-action .the-text{display:inline-block;height:20px}ul.imagify-datas-details.imagify-datas-details{margin:.7em auto}.imagify-datas-details strong{color:#40B1D0}.imagify-datas-details .original{color:#555}.imagify-datas-actions-links{overflow:hidden;border-top:2px solid transparent;padding-top:5px;font-size:8px}.imagify-datas-actions-links a{position:relative;display:inline-block;padding-left:17px;text-decoration:none;font-weight:600}.compat-field-imagify .imagify-datas-actions-links{max-width:300px}.misc-pub-imagify .imagify-datas-actions-links{border-top:2px solid #f2f2f2;padding-bottom:5px}.compat-field-imagify .imagify-datas-actions-links a,.misc-pub-imagify .imagify-datas-actions-links a{font-size:10px;float:left;width:50%}.media-sidebar .compat-field-imagify .imagify-datas-actions-links a,.submitbox .misc-pub-imagify .imagify-datas-actions-links a{display:block;width:auto;float:none}.column-imagify_optimized_file .imagify-datas-actions-links a{margin:0 .7em;padding-left:15px}.imagify-datas-actions-links a:only-child{float:none;width:auto}.imagify-datas-details.is-open+.imagify-datas-actions-links{border-top-color:rgba(0,0,0,.075)}.imagify-datas-actions-links .dashicons{position:absolute;left:0;top:4px;width:12px;margin-right:2px;font-size:11px}.imagify-title>h1{padding:0}.imagify-title-right{display:table;float:right;margin-top:-10px}.imagify-title-right p{margin:0}.imagify-title-right a{font-weight:700;text-decoration:none}.imagify-title-right>div{display:table-cell;vertical-align:middle}.imagify-title-right .dashicons-arrow-down-alt2{vertical-align:-4px;margin-left:2px}@media (max-width:1200px){.imagify-bulk .imagify-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-title-right{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-top:20px}}.imagify-account,.imagify-account-link{padding-right:15px}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.imagify-credit-left{position:relative;min-width:280px;padding-left:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}@media (max-width:630px){.imagify-title-right,.imagify-title-right>div{display:block;width:auto}.imagify-title-right>div{margin-top:10px;max-width:100%}.imagify-credit-left{padding-left:0}}.imagify-meteo-title.imagify-meteo-title{color:#FFF;font-size:17px}.imagify-space-left{display:inline-block;min-height:38px;min-width:245px;vertical-align:middle}.imagify-space-left>p{color:#FFF}#wp-admin-bar-imagify-profile [class^=imagify-bar-],[class^=imagify-bar-]{position:relative;height:15px;width:100%;background:#60758D;color:#FFF;font-size:10px}.base-transparent{background:0 0}[class^=imagify-bar-].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:45px}.right-outside-number .imagify-barnb{display:block;margin-right:-45px;text-align:right;font-weight:700;line-height:15px}#wp-admin-bar-imagify-profile .imagify-progress-value,.imagify-progress-value{position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:13px;font-weight:700}#wp-admin-bar-imagify-profile .imagify-progress,.imagify-progress{height:15px}.imagify-progress{-webkit-transition:width .3s;-o-transition:width .3s;transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8CC152}.imagify-bar-positive .imagify-barnb{color:#8CC152}.imagify-bar-negative .imagify-progress{background:#73818C}.imagify-bar-negative .imagify-barnb{color:#73818C}.imagify-bar-neutral .imagify-progress{background:#F5A623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#D0021B}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889F}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40B1D0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p,.imagify-list-infos li+li{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost,.btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #FFF;text-align:center;background:0 0;color:#FFF;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:hover,.btn-ghost:focus,.btn-ghost:hover{background:#FFF;color:#888}.imagify-list-infos{max-width:100%;width:415px}.imagify-info-block,.imagify-list-infos li{position:relative;padding:10px;padding-left:42px;background:#D9E4EB;border-radius:4px;line-height:1.6}.imagify-list-infos .imagify-alt.imagify-alt{background:#8BA7B5;color:#FFF;font-weight:700}.imagify-info-block:before,.imagify-list-infos li:before{content:"";position:absolute;left:13px;top:14px;height:16px;width:16px;border:1px solid #46b1ce;border-radius:10px}.imagify-info-block:after,.imagify-list-infos li:after{content:"i";position:absolute;left:20px;top:13px;font-style:italic;color:#46b1ce}.imagify-cell .imagify-info-block{padding-top:0}.imagify-cell .imagify-info-block:after{top:6px}.imagify-cell .imagify-info-block:before{top:7px}.imagify-list-infos .imagify-alt:after,.imagify-list-infos .imagify-alt:before{color:#fff;border-color:#fff}.imagify-sub-title.imagify-sub-title{font-size:23px;background:#FFF;color:#2E3243;border-left:1px solid #D9D9D9;border-right:1px solid #D9D9D9;font-weight:lighter}.imagify-sub-title .icon-bulk{margin-right:10px;vertical-align:middle}.imagify-sub-title .title-text{display:inline-block;line-height:1;vertical-align:middle}.imagify-bulk .imagify-settings-section{border:1px solid #D9D9D9;border-top:0;background:#F2F5F7;color:#4A4A4A}.imagify-bulk .imagify-settings-section h3,.imagify-bulk .imagify-settings-section li,.imagify-bulk .imagify-settings-section p{color:#4A4A4A}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.imagify-title .imagify-tooltips{position:absolute;top:100%;left:0}.imagify-tooltips .icon-round{float:left;display:inline-block;width:28px;height:28px;border:1px solid #FFF;margin-right:8px;margin-bottom:8px;font-size:17px;font-style:italic;line-height:29px;font-weight:700;text-align:center;border-radius:50%}.imagify-tooltips .tooltip-content{display:block;position:relative;max-width:250px;padding:7px 15px 8px;background:#2e3242;color:#FFF;font-size:10px;border-radius:3px}.imagify-tooltips.right .tooltip-content{margin-left:12px}.imagify-tooltips.bottom .tooltip-content{margin-top:4px}.imagify-inline-options label .tooltip-content{position:absolute;left:0;right:0;top:100%;text-transform:none;font-size:10px;letter-spacing:0;text-align:center}.imagify-ac-rt-big,.imagistatus{text-transform:uppercase;font-weight:700}.imagify-tooltips .tooltip-content:after{content:"";position:absolute}.imagify-tooltips.right .tooltip-content:after{top:16px;left:-6px;border-right:8px solid #2e3242;border-top:6px solid transparent;border-bottom:6px solid transparent}.imagify-tooltips.bottom .tooltip-content:after{top:-5px;left:50%;margin-left:-3px;border-bottom:6px solid #2e3242;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-space-tooltips .tooltip-content{max-width:280px;margin-top:20px;margin-left:0;padding:5px 15px;font-size:13px;background:#40B1D0;-webkit-box-shadow:0 3px 0 #338EA6;box-shadow:0 3px 0 #338EA6}.imagify-space-tooltips .tooltip-content:after{top:-14px;left:50%;margin-left:-7px;border:0;border-bottom:15px solid #40B1D0;border-left:15px solid transparent;border-right:15px solid transparent}.tooltip-content.tooltip-table{display:table;width:100%}.tooltip-content.tooltip-table>*{display:table-cell;vertical-align:middle}.tooltip-content .cell-icon{width:28px}.tooltip-content .cell-icon .icon{margin-bottom:0}.tooltip-content .cell-text{padding:5px 10px 5px 0;line-height:1.3}.tooltip-content .cell-sep{width:1px;background:rgba(255,255,255,.4)}.tooltip-content .cell-cta{padding-left:10px}.tooltip-content .cell-cta a{display:block;color:#FFF;width:100%;height:100%;white-space:nowrap}.imagify-number-you-optimized .number{display:table-cell;padding-right:15px;font-size:36px;font-weight:700;line-height:1.1;vertical-align:middle;white-space:nowrap}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px}.imagify-number-you-optimized .text br{display:none}.imagify-number-you-optimized>p{display:table}.imagify-number-you-optimized{padding-bottom:.85em;margin-bottom:1.35em;overflow:hidden;border-bottom:1px solid rgba(0,0,0,.05)}.imagify-bars p{font-weight:700;font-size:12px;margin-bottom:0}.imagify-bars+.imagify-number-you-optimized{border-bottom:0;padding-top:.85em}.imagify-bars+.imagify-number-you-optimized p{color:#46b1ce}.imagify-bulk-table{margin-top:2em;max-height:600px;max-height:60vh;overflow:auto}.imagify-ac-report-text,.imagiuploaded{overflow:hidden}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse;border:1px solid #D3D3D3}.imagify-bulk-table td{padding:8px 15px}.imagify-bulk-table thead th,.imagify-bulk-table thead tr{background:#2E3242}.imagify-bulk-table tfoot th,.imagify-bulk-table tfoot tr{background:#73818C}.imagify-bulk-table thead th{padding:14px 15px;text-align:left;color:#F2F5F7;font-weight:700;font-size:14px}.imagify-bulk-table tfoot td{padding:14px 15px;color:#F9FAFA}.imagify-bulk-table tbody td,.imagify-bulk-table tbody tr{background:#FFF}.imagify-bulk-table tbody tr:nth-child(odd),.imagify-bulk-table tbody tr:nth-child(odd) td{background:#F2F5F7}.imagify-bulk-table .imagify-row-progress{display:none}.imagify-bulk-table .imagify-row-progress,.imagify-bulk-table .imagify-row-progress td{height:15px;padding:0}.imagify-bulk-table .imagify-no-uploaded-yet td{height:200px;font-size:17px;letter-spacing:.1em;word-spacing:.12em;vertical-align:middle;text-transform:uppercase;font-weight:700;text-align:center;color:#999;background-color:#FFF}.imagify-row-complete{padding:35px 20px;margin-top:2em;background:#8BC34A;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.1)}.imagify-row-complete .imagify-ac-chart{margin-top:3px}.imagify-row-complete p{color:#FFF;margin:0}@-webkit-keyframes congrate{0%{opacity:0;-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);opacity:1}} @keyframes congrate{0%{opacity:0;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}.imagify-row-complete.done{-webkit-animation:congrate .5s ease-in-out;animation:congrate .5s ease-in-out}.imagify-all-complete{margin:1.5em 0}.imagify-all-complete>div{display:inline-block;vertical-align:middle}.imagify-ac-report{min-width:310px}.imagify-ac-chart{width:46px;height:46px;float:left;margin:0 20px 0 10px}.imagify-ac-report-text p{line-height:1.3}.imagify-ac-rt-big{font-size:24px;letter-spacing:.15em;word-spacing:.15em}.imagify-ac-share{text-align:right}.imagify-ac-share-content{display:inline-block;padding:10px 15px;background:rgba(255,255,255,.2)}.imagify-ac-share-content>*{display:inline-block;vertical-align:middle}.imagify-bulk-table .imagify-ac-share-content p{margin-right:5px}.imagify-share-networks,.imagify-share-networks li{margin:0}.imagify-share-networks li{display:inline-block}.imagify-share-networks a{display:inline-block;vertical-align:-7px;margin:0 5px;text-decoration:none;color:#FFF}.imagify-cell-filename{max-width:200px}.imagify-cell-status{max-width:145px}.imagify-cell-status .dashicons-warning{margin-right:2px}.imagify-cell-thumbnails{max-width:120px}td.imagify-cell-filename{-o-text-overflow:clip;text-overflow:clip;white-space:nowrap;overflow:hidden}.imagify-bulk-table td.imagify-cell-totaloriginal{padding-right:78px}.imagifilename,.imagiuploaded{display:inline-block;vertical-align:middle}.imagifilename{font-size:12px}.imagiuploaded{width:33px;height:33px;margin-right:5px;margin-left:-8px;background:url(../images/upload-image.png) no-repeat;background-size:cover}.imagiuploaded img{max-widht:100%;height:auto}.imagistatus{color:#8CA6B3}.status-compressing{color:#46B1CE}.status-error{color:#CE0B24}.status-warning{color:#f5a623}.status-complete{color:#8CC152}.imagify-error{background:#D0021B;color:#FFF}#wpadminbar .imagify-warning *,.imagify-warning{background:#f5a623;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.2)}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46B1CE;font-weight:700}.imagify-cell-optimized{font-weight:700}.imagify-cell-totaloriginal{text-align:right}.imagify-modal .h2,.imagify-modal .h3{font-weight:400;letter-spacing:.075em;text-align:center}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.dashicons-admin-generic{-webkit-transform-origin:48.75% 51.75%;-ms-transform-origin:48.75% 51.75%;transform-origin:48.75% 51.75%}.imagify-modal{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.js .imagify-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#1F2332;background-color:rgba(31,35,50,.95);z-index:99999}.imagify-modal-content{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;width:800px;max-width:95%;max-height:90vw;overflow:auto;padding:20px 25px;margin:1em auto;background:#FFF;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.7);box-shadow:1px 1px 4px rgba(0,0,0,.7);border-radius:3px}#imagify-visual-comparison .imagify-modal-content,.imagify-visual-comparison .imagify-modal-content{max-width:1400px;background:0 0;padding:5px;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.imagify-modal .h2{margin:.5em 0;color:#8ba6b4;font-size:24px}.imagify-modal .h3{color:#40b1d0;font-size:18px}.text-justify{text-align:justify}.imagify-modal .close-btn{display:none;visibility:hidden;position:absolute;right:20px;top:20px;font-size:1.2em;border:0;background:0 0;border-radius:0;cursor:pointer}.imagify-modal .close-btn i{margin-left:-2px}.imagify-modal .close-btn:focus,.imagify-modal .close-btn:hover{color:#40b1d0}.js .imagify-modal .close-btn{display:block;visibility:visible}.js .imagify-iframe-viewing .close-btn{display:none}#imagify-visual-comparison .close-btn,.imagify-visual-comparison .close-btn{top:50px;right:5px;width:33px;height:33px;padding:1px 0 0 2px;border:1px solid #F2F2F2;color:#F2F2F2;line-height:19px;text-align:center;border-radius:50%}.imagify-visual-comparison .close-btn,.wp_attachment_image #imagify-visual-comparison .close-btn{top:0}.imagify-visual-comparison .imagify-modal-content,.wp_attachment_image #imagify-visual-comparison .imagify-modal-content{padding-top:40px}.imagify-modal .imagify-comparison-title{font-size:28px;margin-bottom:1em;color:#F2F2F2;text-align:left}.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons{position:static;margin:0 10px 0 15px}.imagify-comparison-title .twentytwenty-duo-buttons button{float:none;padding:6px 12px;font-size:16px;text-transform:none;border:1px solid #40B1D0;color:#889;letter-spacing:0}.imagify-comparison-title .twentytwenty-duo-buttons button:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.imagify-comparison-title .twentytwenty-duo-buttons .selected{border:1px solid #40B1D0;color:#FFF;background:#40B1D0}.imagify-comparison-levels{margin:15px 0;overflow:hidden}.imagify-comparison-levels div{display:none;min-width:175px;font-size:11px}.imagify-comparison-levels .imagify-chart,.imagify-comparison-levels .imagify-chart-container{width:25px;float:none;margin:0}.imagify-visual-comparison .imagify-chart-container canvas{width:15px!important;height:15px!important;margin-right:5px}.imagify-c-level.go-left{float:left}.imagify-c-level.go-right{float:right}.imagify-c-level.go-left,.imagify-c-level.go-right{display:table}.imagify-c-level .imagify-c-level-row{display:table-row;margin:0;color:#FFF}.imagify-c-level-row>span{display:table-cell;padding:2px 0}.imagify-c-level-row .value{text-align:right;padding-left:5px}.imagify-c-level-row .value.level{color:#40b1d0}.imagify-c-level-row .value.size{color:#8bc34a;font-weight:700}.imagify-c-level-row .value .imagify-chart{top:1px}@-webkit-keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-menu-bar-img{margin-top:1em}.imagify-modal .loader{position:absolute;top:50%;left:50%;margin:-32px 0 0 -32px;opacity:0;visibility:hidden;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.imagify-modal .loading .loader{visibility:visible;opacity:1}.imagify-settings .imagify-visual-comparison-text{margin-top:1em;color:#40b1d0;font-weight:700}.imagify-border-styled,.imagify-flex-table,.imagify-modal-cols,.imagify-offer-header,.imagify-payment-modal .imagify-modal-content,.imagify-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.imagify-analyzing .imagify-numbers-calc,.imagify-modal-content.imagify-iframe-viewing .imagify-modal-sidebar,.imagify-modal-content.imagify-success-viewing .imagify-modal-sidebar,.imagify-modal-section .imagify-loader,.imagify-modal-section.imagify-analyzing .imagify-modal-cols,.imagify-numbers-notcalc{display:none}.imagify-border-styled,.imagify-modal-cols{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-payment-modal{text-align:center;color:#7A8996}.imagify-payment-modal *{-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-modal-loader{position:absolute;top:0;left:0;right:0;bottom:0;background:url(../images/loader-balls.svg) center no-repeat #fff;z-index:10}.imagify-payment-modal .imagify-modal-content{width:980px;max-width:100%;min-width:925px;padding:0}.imagify-modal-content.imagify-iframe-viewing{width:980px;height:672px;overflow:hidden}.imagify-iframe-viewing #imagify-payment-process-view{width:980px;height:668px}.imagify-payment-modal .imagify-modal-main{width:70%}.imagify-iframe-viewing .imagify-modal-main{width:auto}.imagify-payment-modal .imagify-modal-content.imagify-success-viewing{min-width:auto;width:450px;min-height:300px}.imagify-success-viewing .imagify-modal-main{width:100%}.imagify-payment-modal .imagify-modal-sidebar{width:30%;padding:15px 20px;background:#1F2332;color:#FFF}.imagify-modal-section{padding:0 25px}.imagify-modal-section.section-gray{margin:0 0 1em;padding:10px 25px 15px;background:#F6F7FB}.imagify-tabs-contents .section-gray{padding:8px 25px 10px}.imagify-modal-section .imagify-modal-title:first-child{margin-top:1em;margin-bottom:1.5em}.imagify-modal-section.section-gray .imagify-modal-title{margin-top:.5em;margin-bottom:.5em}.imagify-modal-title{font-size:1.8em}.imagify-analyzing .imagify-numbers-notcalc,.imagify-modal-section.imagify-analyzing .imagify-loader{display:block}.imagify-modal-section .imagify-loader{margin:2em auto}.imagify-border-styled{width:200px;margin:0 auto;color:#8BC34A;font-weight:700;font-size:.925em}.imagify-big-number,.imagify-payment-modal strong{font-weight:700;color:#4A4A4A}.imagify-big-number{font-size:3.7em;margin:-3px 0;line-height:1}.imagify-border-styled:after,.imagify-border-styled:before{content:"";height:1px;background:rgba(0,0,0,.1);-ms-flex-preferred-size:40px;flex-basis:40px}.imagify-border-styled:before{margin-right:5px}.imagify-border-styled:after{margin-left:5px}.imagify-col{-ms-flex-preferred-size:50%;flex-basis:50%}.imagify-modal .imagify-cols{padding:0 20px}.imagify-payment-modal .imagify-iconed{margin:1.5em 5em 1.5em 0}.imagify-iconed{position:relative;text-align:left;padding-left:42px;margin-right:15px;font-weight:500}.imagify-iconed .dashicons,.imagify-iconed .icon{position:absolute;font-size:2em;left:0;top:2px;color:#40B1D0}.imagify-payment-modal .close-btn{top:10px;right:10px;width:24px;height:24px;padding:2px 0 0 4.5px;color:#FFF;background:#40B1D0;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-payment-modal .close-btn i{margin-left:-3.5px;margin-top:-.5px}.imagify-payment-modal .close-btn:hover{background:#F6F7FB}.imagify-offer-line{margin-top:1.5em}.imagify-offer-line+.imagify-offer-line{margin-top:.75em}.imagify-offer-header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 0 0 15px;border-radius:4px 4px 0 0;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-header.imagify-offer-header.imagify-offer-header .imagify-inline-options label:last-child{border-radius:0 4px 0 0}.imagify-offer-header .imagify-inline-options{width:auto}.imagify-offer-title{font-weight:700;margin:0}.imagify-offer-header,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#E5EBEF}.imagify-offer-onetime .imagify-offer-header{padding-top:8px;padding-bottom:8px}.imagify-offer-onetimes>div{padding-top:15px;padding-bottom:15px}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;padding:7px 30px;font-size:1em;letter-spacing:.05em;color:inherit;-webkit-box-shadow:0 0 0;box-shadow:0 0 0;border-radius:0}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#F6F7FB}.imagify-2-free{position:absolute;bottom:100%;left:0;right:0;padding:2px 10px;margin-bottom:8px;font-size:.8em;letter-spacing:0;text-transform:none;text-align:center;color:#FFF;background:#10121A;border-radius:2px}.imagify-2-free:after{content:"";position:absolute;left:50%;bottom:-3px;margin-left:-3px;border-top:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent}.imagify-2-free.imagify-b-right{bottom:auto;left:100%;right:-100%;margin-bottom:0;margin-left:8px}.imagify-2-free.imagify-b-right:after{left:-3px;bottom:auto;top:50%;margin-top:-3px;margin-left:0;border-right:3px solid #10121A;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:0}.imagify-2-free.imagify-b-bottom{bottom:-100%;left:0;right:0;margin-top:8px}.imagify-2-free.imagify-b-bottom:after{top:-3px;bottom:auto;border-bottom:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent;border-top:0}.imagify-offer-content{text-align:left;background:#F6F7FB;border-radius:0 0 4px 4px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-onetime .imagify-offer-content{padding:10px 0}div.imagify-col-checkbox{position:relative;width:25.5%;padding-top:10px;padding-bottom:7px}.imagify-col-checkbox label{display:block;padding-left:55px!important}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked){position:absolute;top:50%;left:6px;margin:-8px 0 0}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{margin:0;top:-2px;left:6px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-by,.imagify-offer-size{-webkit-transition:all .275s;-o-transition:all .275s}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:after{top:1px;left:13px}.imagify-offer-size{font-size:30px;color:#2E3243;font-weight:700;transition:all .275s}.imagify-offer-by{font-size:10px;transition:all .275s}.imagify-approx{display:none;font-size:11px;line-height:1.2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}div.imagify-col-price{width:35%}.imagify-flex-table .imagify-price-block{padding-left:0;padding-right:0}.imagify-offer-monthlies .imagify-price-block,.imagify-offer-monthly .imagify-flex-table .imagify-price-block{padding-top:0}.imagify-flex-table .imagify-price-complement{padding-right:0;font-size:10px;font-weight:700}.imagify-price-block,.imagify-price-discount{white-space:nowrap}.imagify-price-block span,.imagify-price-discount span{display:inline-block;vertical-align:middle}.imagify-price-discount.imagify-price-discount{position:relative;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding-top:15px;font-weight:700;width:70px}.imagify-price-discount:before{content:"";position:absolute;top:25px;width:62%;height:2px;background:#2E3243;-webkit-transform:rotate(-15deg);-ms-transform:rotate(-15deg);transform:rotate(-15deg)}.imagify-offer-onetimes .imagify-price-discount:before{width:100%}.imagify-price-discount-dollar{color:#2E3243}.imagify-price-discount-number{color:#8BA6B4}.imagify-offer-selected .imagify-price-discount-number{color:#FFF}span.imagify-dollars{color:#1F2332;font-size:18px;font-weight:700;vertical-align:-2px}.imagify-offer-onetime .imagify-col-price{padding-top:0}.imagify-offer-onetime .imagify-dollars{vertical-align:-1px}.imagify-price-big,.imagify-price-mini{color:#40B1D0;font-weight:700}.imagify-price-big{font-size:36px}span.imagify-price-mini{font-size:18px;vertical-align:2px}span.imagify-price-by{font-size:10px;color:#1F2332;vertical-align:-13px;text-indent:-27px}.imagify-col-other-actions{width:18.5%;text-align:right}.imagify-col-other-actions a{font-size:11px}.imagify-offer-selected,.imagify-offer-selected .imagify-col-other-actions a,.imagify-offer-selected .imagify-offer-size,.imagify-offer-selected .imagify-offer-title,.imagify-offer-selected .imagify-price-big,.imagify-offer-selected .imagify-price-complement,.imagify-offer-selected .imagify-price-mini{color:#FFF}.imagify-offer-selected .imagify-offer-header,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#338EA6}.imagify-offer-selected .imagify-offer-content,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#40B1D0}.imagify-offer-selected .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-offer-selected .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{border-color:#FFF;background:#40B1D0}.imagify-offer-selected .imagify-offer-by{color:#2E3243}.imagify-enough-free .imagify-not-enough-title,.imagify-enough-title{display:none}.imagify-enough-free .imagify-enough-title{display:block}.imagify-submit-line{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:2em 0;text-align:left}.imagify-coupon-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-coupon-section p{margin:0;line-height:1.3}.imagify-coupon-text{width:200px;max-width:100%;padding-right:15px}.imagify-coupon-loader{display:none}.imagify-coupon-text.checking{text-align:right}.imagify-coupon-text.checking .imagify-coupon-loader{display:inline}.imagify-coupon-text.checking label{display:none}.imagify-coupon-input{position:relative}.imagify-coupon-input input{position:relative;z-index:1}[id=imagify-coupon-validate].button-secondary{position:absolute;top:1px;right:3px;bottom:2px;-webkit-box-shadow:none;box-shadow:none;padding:4px 10px;z-index:0;-webkit-transition:-webkit-transform .275s;-o-transition:transform .275s;transition:transform .275s;transition:transform .275s,-webkit-transform .275s}.imagify-canbe-validate [id=imagify-coupon-validate]{-webkit-transform:translateX(45px);-ms-transform:translateX(45px);transform:translateX(45px)}.imagify-modal-section+.imagify-modal-promotion{margin-top:-1em}.imagify-modal-promotion{position:relative;overflow:hidden;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 25px;background:#604D90;text-shadow:0 0 3px rgba(0,0,0,.3)}.imagify-modal-promotion.active{display:-webkit-box;display:-ms-flexbox;display:flex}[id=imagify-pricing-tab-onetime] .imagify-modal-promotion{margin-bottom:4em}.imagify-modal-promotion:before{content:"\f488";position:absolute;top:28px;left:8%;font-family:dashicons;font-size:90px;color:#8476A9;text-shadow:none}.imagify-modal-promotion p{position:relative;margin:.2em 0;color:#FFF}.imagify-promo-title{-ms-flex-preferred-size:100%;flex-basis:100%;text-transform:uppercase;font-size:20px;font-weight:700;letter-spacing:.125em}.imagify-until-date{-ms-flex-preferred-size:200px;flex-basis:200px;text-align:right}.imagify-until-date strong{color:#FFF}.imagify-submit-line button{font-size:16px}input.imagify-coupon-code{padding:10px;border:2px solid #7A8996;font-size:.875em;font-weight:700;border-radius:3px}.validated.imagify-coupon-section .imagify-coupon-text,.validated.imagify-coupon-section strong{color:#8BC34A}.validated.imagify-coupon-section .imagify-coupon-code{color:#8BC34A;border-color:#8BC34A}.invalid.imagify-coupon-section .imagify-coupon-text,.invalid.imagify-coupon-section strong{color:#d0021b}.invalid.imagify-coupon-section .imagify-coupon-code{color:#d0021b;border-color:#d0021b}.imagify-footer-lines{width:500px;max-width:100%;margin:2em auto 2.5em;font-size:.85em;line-height:1.5}.imagify-year-selected .imagify-switch-my .imagify-yearly{display:block}.imagify-month-selected .imagify-switch-my .imagify-yearly,.imagify-year-selected .imagify-switch-my .imagify-monthly{display:none}.imagify-month-selected .imagify-switch-my .imagify-monthly{display:block}.imagify-flex-table{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-flex-table>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:7px 15px}div.imagify-col-details{width:22%;padding-left:25px}.imagify-col-details p{margin:0}.imagify-pricing-table{margin:0 20px}.imagify-pricing-table .imagify-offer-line{padding:.6em 0;border:2px solid #E8EEF0;text-align:left;border-radius:3px}.imagify-pricing-table .imagify-offer-line:first-child{margin-top:.75em}.imagify-pricing-table .imagify-offer-line.imagify-offer-selected:first-child{margin-top:1.75em}.imagify-pricing-table .imagify-offer-line+.imagify-offer-line{margin-top:-2px}.imagify-pricing-table .imagify-col-other-actions{width:20.5%}.imagify-pricing-table .imagify-approx{margin-left:0;line-height:.5;margin-bottom:1em}.imagify-pricing-table .imagify-offer-selected{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03);background:#40B1D0;border-width:0}.imagify-pricing-table .imagify-offer-selected .imagify-approx{color:#FFF}.imagify-pricing-table .imagify-button-secondary{padding:3px 20px;-webkit-box-shadow:none;box-shadow:none;text-transform:uppercase;font-size:12px;letter-spacing:.025em}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary{border:2px solid #FFF;background:#40B1D0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none!important}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:focus,.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:hover{background:#FFF;color:#40B1D0}.imagify-col .imagify-special-needs{margin-left:25px}.imagify-special-needs strong{font-size:25px;font-weight:700;color:#40B1D0}.imagify-special-needs span{display:block;font-size:12px;margin-top:-.5em}div.imagify-col-price{position:relative}.imagify-recommend{display:none;position:absolute;left:-20px;bottom:100%;padding:0;margin-bottom:8px;color:#1F2332;font-weight:700;font-style:italic}.imagify-offer-selected .imagify-recommend,.imagify-tab-content.imagify-current{display:block}[class*=imagify-onetime-] .imagify-recommend{left:65px;margin-bottom:20px}.imagify-recommend:before{content:"";position:absolute;top:7px;left:-35px;width:29px;height:30px;background:url(../images/icon-arrow-choice.png) 0 no-repeat;background-size:contain}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.imagify-recommend:before{background-image:url(../images/icon-arrow-choice.svg)}}.imagify-offer-line[class*=imagify-onetime-]{padding:0;margin:.3em 0 0}.imagify-offer-line.imagify-offer-line[class*=imagify-onetime-]:first-child{margin-top:2em}.imagify-offer-line[class*=imagify-onetime-]+.imagify-offer-line{margin-top:.5em}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-]{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);border-width:2px}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{position:relative;overflow:hidden;width:21%;background:#1F2332;color:#FFF}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{background:#338EA6}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details:before{content:"";position:absolute;bottom:0;right:25px;width:75px;height:54px;background:url(../images/icon-pack.png)}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-other-actions{width:30%}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx,.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{color:#FFF}.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{font-size:24px}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx{font-size:12px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-block{padding-left:10px}.imagify-offer-line[class*=imagify-onetime-] .imagify-dollars{vertical-align:middle}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-big{vertical-align:-5px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-mini{vertical-align:7px}.imagify-tabs{margin-bottom:0;list-style:none;background:#E5EBEF}.imagify-modal-content .imagify-tabs{margin:1em 0 0}.imagify-tab{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;width:50%;margin:0;font-size:23px}.imagify-tab a{display:block;padding:15px 10px;color:inherit;text-decoration:none}.imagify-tab a:focus{-webkit-box-shadow:none;box-shadow:none;outline:0;color:#40B1D8}.imagify-tab.imagify-current a{background:#F6F7FB}.imagify-tab-content{display:none}.imagify-tab-content .imagify-modal-section:first-child{margin-top:0}.imagify-modal-sidebar-content,.imagify-payment-modal .imagify-modal-sidebar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-modal-sidebar-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}p.imagify-modal-sidebar-title{margin-top:5px;padding-right:40px;font-size:18px;color:#FFF}.imagify-modal-testimony{margin-top:1em}.imagify-modal-testimony+.imagify-modal-testimony{margin-top:2em}@media (max-height:620px){.imagify-modal-testimony+.imagify-modal-testimony{display:none}}.imagify-modal-testimony-person{display:table;width:100%}.imagify-modal-testimony-person>*{display:table-cell;vertical-align:middle}.imagify-modal-avatar{width:114px;line-height:0}.imagify-modal-avatar img{border:2px solid #FFF;border-radius:50%;width:96px;height:96px}.imagify-modal-identity a{text-decoration:none;font-weight:700}.imagify-modal-identity a:first-child{font-size:13px}.imagify-modal-identity a:first-child+a{display:block;font-size:10px;color:#7A8996}.imagify-modal-testimony-content p{font-size:13px;font-style:italic;line-height:1.7;color:#7A8996}.imagify-modal-sidebar-trust{margin-top:auto;padding-top:1.5em}.imagify-modal-sidebar-trust p{margin:0;font-weight:700;font-size:12px;line-height:1.7}.imagify-modal-sidebar-trust p img{margin-right:3px;vertical-align:-2px}.imagify-modal-sidebar-trust p+p{font-size:11px}.imagify-cart{text-align:left}.imagify-cart .imagify-cart-list{border-top:1px solid rgba(122,137,150,.2);border-bottom:1px solid rgba(122,137,150,.2)}.imagify-cart .imagify-cart-label{margin-bottom:.5em;font-size:10px;color:#2E3243}.imagify-cart-list p{margin:0;font-weight:700}.imagify-cart-item{margin:.4em 0}.imagify-cart .imagify-cart-suggestion{margin-top:-.3em}.imagify-cart-suggestion a,.imagify-cl-description p{font-size:10px}.imagify-remove-from-cart{border:0;padding:0;width:14px;height:14px;line-height:13px;border-radius:50%;background:#40B1D0;cursor:pointer;-webkit-transition:background .3s;-o-transition:background .3s;transition:background .3s}.imagify-remove-from-cart i:before{position:relative;top:-6px;left:-3px;font-size:13px;color:#FFF}.imagify-remove-from-cart:focus,.imagify-remove-from-cart:hover{background:#D0021B}.imagify-cart .imagify-cl-remove{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:45px}.imagify-cart .imagify-cl-name{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:200px}.imagify-cart .imagify-cl-description{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding-top:10px}.imagify-cart .imagify-cl-price{text-align:right}#imagify-payment-iframe{width:980px;height:672px;background:url(../images/loader-balls.svg) 50% 50% no-repeat #f6f7fb}.imagify-success-view{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.imagify-success-view p{font-weight:700;font-size:16px}.imagify-cart-emptied-item{margin:.3em auto;padding:6px 20px;background:#E6EBEF;border-radius:20px}.imagify-cart-emptied-item.imagify-cart-emptied-item p{font-weight:700}.imagify-cart-emptied-item a{color:#40b1d0;float:right;font-weight:700}
|
1 |
+
.imagify-cell,.imagify-cell.va-top,.va-top .imagify-cell{vertical-align:top}#imagify-overview-chart-legend,.imagify-oh,body.imagify-modal-is-open{overflow:hidden}.imagify-start{float:left}.imagify-end{float:right}.imagify-txt-start.imagify-txt-start.imagify-txt-start{text-align:left}.imagify-txt-center.imagify-txt-center.imagify-txt-center{text-align:center}.imagify-txt-end.imagify-txt-end.imagify-txt-end{text-align:right}.imagify-mt1.imagify-mt1{margin-top:1em}.imagify-mb1.imagify-mb1{margin-bottom:1em}.imagify-mr1.imagify-mr1{margin-right:1em}.imagify-ml2.imagify-ml2{margin-left:2em}.imagify-mr2.imagify-mr2{margin-right:2em}.imagify-pl0.imagify-pl0.imagify-pl0{padding-left:0}.imagify-pr1.imagify-pr1{padding-right:1em}.imagify-clear{clear:both}.imagify-clearfix:after,.imagify-inline-options:after{content:"";display:table;clear:both}.imagify-count.imagify-count{counter-reset:num}.imagify-count .imagify-count-title{font-weight:700}.imagify-default-settings{color:#73818c;font-weight:400}.imagify-count .imagify-count-title:before{counter-increment:num 1;content:counter(num) ". "}.imagify-table{display:table;width:100%}.imagify-cell{display:table-cell;padding:10px}.imagify-bulk-submit .imagify-cell{padding-top:0}.imagify-plugins-error{overflow:hidden;padding-left:20px;list-style-type:disc}.imagify-plugins-error li{width:300px;line-height:30px}@media (max-width:570px){.imagify-plugins-error li{width:auto}}.imagify-notice-dismiss.notice-dismiss{text-decoration:none}.imagify-spinner{display:inline-block;width:20px;height:20px;margin-right:5px;vertical-align:middle;background:url(../images/spinner.gif) 0 0/20px 20px no-repeat rgba(0,0,0,0);opacity:.7}.spinner.imagify-hidden{width:0;margin:4px 0 0}.misc-pub-section.misc-pub-imagify h4{font-size:14px;margin-top:5px;margin-bottom:0}.imagify-sweet-alert button{margin-top:17px!important;height:45px!important;letter-spacing:3px;text-transform:uppercase!important;border-radius:3px!important;background-color:#40b1d0!important;-webkit-box-shadow:0 3px 0 #338ea6!important;box-shadow:0 3px 0 #338ea6!important}.imagify-sweet-alert button.loading{border-radius:100%!important;height:40px!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{background:#777!important;-webkit-box-shadow:0 3px 0 #444!important;box-shadow:0 3px 0 #444!important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup button{width:100%;padding:0!important}.imagify-sweet-alert .la-ball-fall,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .sa-input-error:before{top:25%!important}#wpwrap{-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s}.stop-scrolling #wpwrap{-webkit-filter:blur(2px);filter:blur(2px)}.stop-scrolling #wpwrap #wpadminbar{top:-32px}.imagify-primary.imagify-primary.imagify-primary{color:#40b1d0}.imagify-secondary.imagify-secondary.imagify-secondary{color:#8cc152}#imagify-check-api-container{font-weight:700}#imagify-check-api-container .dashicons{font-size:25px}#imagify-check-api-container .dashicons-no:before{color:#f06e57;vertical-align:-1px}#imagify-check-api-container .dashicons-yes:before{color:#8BC34A;vertical-align:-1px}.imagify-valid{color:#8BC34A}.imagify-chart{width:33.33%;position:relative}.imagify-doughnut-legend{margin-top:38px;list-style:none}.imagify-doughnut-legend li{display:block;padding-left:30px;position:relative;margin-bottom:15px;border-radius:5px;padding:3px 8px 2px 31px;font-size:14px;font-weight:600;cursor:default;-webkit-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.imagify-doughnut-legend li span{display:block;position:absolute;left:0;top:0;width:25px;height:25px;border-radius:50%}.button-text,.imagify-bulk-info p{display:inline-block}.imagify-chart{float:left;margin-bottom:20px}td .imagify-chart{float:none;margin-bottom:0;top:4px}.imagify-chart-container{position:relative;width:180px;float:left;margin-right:20px}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;font-weight:700;text-align:center}.imagify-total-percent{color:#46b1ce}td .imagify-chart-container{width:18px;height:18px;float:none;margin-right:10px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-14px;text-align:center;font-size:55px;font-weight:700;color:#46B1CE}.imagify-chart-percent span{font-size:20px;vertical-align:super}.media_page_imagify-bulk-optimization .notice,.settings_page_imagify .notice,body[class*="_imagify-ngg-bulk-optimization"] .notice{margin-right:20px;margin-left:2px}.media_page_imagify-bulk-optimization .media-item,body[class*="_imagify-ngg-bulk-optimization"] .media-item{margin:0}.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{float:none;width:100%;margin:0;background:#1F2331;-webkit-box-shadow:0;box-shadow:0;border-radius:0}.media_page_imagify-bulk-optimization .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent{width:auto;padding:0 5px;line-height:1.85;font-size:12px}.media_page_imagify-bulk-optimization .media-item .percent,.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{text-align:right}.media_page_imagify-bulk-optimization .media-item .progress .bar,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar{width:1px;height:22px;margin-top:0;background:#46B1CE;border-radius:0;overflow:visible;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}.imagify-settings .button,.imagify-settings a,.imagify-settings input,.imagify-welcome .button,.imagify-welcome a,.imagify-weolcome input{-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-settings a{color:#40b1d0}.imagify-options-title{padding-bottom:.5em;border-bottom:3px solid #F2F2F2;font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.025em;color:#40b1d0}.imagify-settings,.imagify-settings p,.imagify-settings th{color:#5F758E}@media (max-width:782px){.imagify-settings .form-table th{padding-top:2em;padding-bottom:.5em}}.imagify-settings .form-table td{vertical-align:top}.button .dashicons,.button-text,.imagify-button-primary.imagify-button-primary .dashicons,.imagify-button-secondary.imagify-button-secondary .dashicons,.imagify-button.imagify-button .dashicons,.imagify-notice .button .dashicons,.imagify-settings .button .dashicons,.imagify-welcome .button .dashicons{vertical-align:middle}.imagify-settings .form-table th span{cursor:pointer}.imagify-middle th{padding-top:35px}.imagify-button-primary.imagify-button-primary,.imagify-button-secondary.imagify-button-secondary,.imagify-button.imagify-button,.imagify-notice .button,.imagify-settings .button,.imagify-welcome .button{height:auto;padding:8px 20px;border:0;font-size:14px;font-weight:600;-webkit-box-shadow:0 3px 0 rgba(0,0,0,.15);box-shadow:0 3px 0 rgba(0,0,0,.15);border-radius:3px;cursor:pointer;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-notice .button-mini{padding:2px 10px;font-size:13px}.button-primary.button-mini{padding:2px 10px}.imagify-settings .button.button-mini-flat{padding:3px 6px 5px;font-size:12px;-webkit-box-shadow:none!important;box-shadow:none!important;line-height:1.2}.imagify-settings .button.button-mini-flat:focus,.imagify-settings .button.button-mini-flat:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-button-ghost.imagify-button-ghost,.imagify-title .button-ghost.button-ghost{padding:2px 9px;border:1px solid #40B1D0;font-size:12px;font-weight:400;color:#40B1D0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover,.imagify-title .button-ghost.button-ghost:focus,.imagify-title .button-ghost.button-ghost:hover{border-color:transparent;color:#000;background:#40B1D0}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover{color:#FFF}.imagify-button-medium.imagify-button-medium{text-transform:uppercase;letter-spacing:.1em;padding:3px 10px;font-weight:700}.imagify-button-medium.imagify-button-ghost{border-width:2px}.button .dashicons{margin-right:5px}.imagify-button-primary.imagify-button-primary,.imagify-settings .button-primary.button-primary,.imagify-welcome .button-primary.button-primary{background:#40B1D0;color:#FFF;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1);text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799!important}.imagify-button-secondary.imagify-button-secondary{background:#8BC34A;color:#FFF;-webkit-box-shadow:0 3px 0 #6F9C3B;box-shadow:0 3px 0 #6F9C3B;text-shadow:0 -1px 1px #6F9C3B,1px 0 1px #6F9C3B,0 1px 1px #6F9C3B!important}.imagify-button-primary.imagify-button-primary:focus,.imagify-button-primary.imagify-button-primary:hover,.imagify-settings .button-primary:focus,.imagify-settings .button-primary:hover,.imagify-welcome .button-primary:focus,.imagify-welcome .button-primary:hover{background:#338ea6;-webkit-box-shadow:0 3px 0 #1f7a92;box-shadow:0 3px 0 #1f7a92}.imagify-button-secondary.imagify-button-secondary:focus,.imagify-button-secondary.imagify-button-secondary:hover{background:#6F9C3B;color:#FFF}.imagify-button-light.imagify-button-light{background:#FFF;color:#4a4a4a;-webkit-box-shadow:0 2px 0 rgba(0,0,0,.2);box-shadow:0 2px 0 rgba(0,0,0,.2)}.imagify-button-light.imagify-button-light:focus,.imagify-button-light.imagify-button-light:hover{color:#FFF;background:rgba(0,0,0,.2)}.imagify-section-positive .imagify-button-light{color:#709A41}.imagify-button.imagify-button-big{font-size:15px;padding:11px 30px}.imagify-button-big .dashicons{font-size:1.45em;margin-right:6px;margin-left:-4px}.imagify-info,.imagify-logo{vertical-align:top}#imagify-bulk-action{padding:11px 20px}.media-frame-content .imagify-button-primary,.wp_attachment_image .imagify-button-primary{float:left;padding:0 10px 1px;margin:0 5px 2px 0;font-size:13px;line-height:26px;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1)}.imagify-settings input[type=text]{color:#4A4A4A;font-weight:600;-webkit-box-shadow:none;box-shadow:none}.imagify-settings div.submit.submit{padding-left:235px;padding-top:40px}.imagify-settings p.submit{float:left;margin-top:0}.imagify-settings p.submit .button{margin:0 5px}@media (max-width:850px){.imagify-settings div.submit{padding-left:0}.imagify-settings p.submit{text-align:center}}.imagify-title.imagify-title{position:relative;padding:30px 50px;font-size:23px;background:#2E3243;color:#FFF}.imagify-settings .imagify-title+.imagify-notice{margin:0;border-right:1px solid #D9D9D9;padding-top:15px;padding-bottom:15px}.imagify-section,.imagify-settings div.submit,.imagify-sub-header,.imagify-sub-title.imagify-sub-title{margin:0;padding:20px;background:#F2F5F7}.imagify-section-positive,.imagify-sub-title.imagify-sub-title{padding-left:40px}.imagify-section-positive{background:#8cc152;color:#FFF}.imagify-section-positive p{color:#FFF}.imagify-section-gray{background:#D9E4EB}.imagify-section-gray .imagify-count-title{color:#4a4a4a}.imagify-section p:first-child{margin-top:0}.imagify-section p:last-child{margin-bottom:0}p.imagify-section-title.imagify-section-title{font-size:20px;margin-top:-.3em;margin-bottom:-.6em}.imagify-bulk-info{margin:1em 1em 1em 5px;-webkit-transition:margin .3s;-o-transition:margin .3s;transition:margin .3s}@media (max-width:850px){.imagify-bulk-info{margin:1em}}.imagify-bulk-info p{text-align:left;width:400px;max-width:100%;font-weight:700}@media (min-width:1500px){.imagify-settings div.submit{display:table;width:100%}.imagify-settings div.submit>*{display:table-cell;vertical-align:middle}.imagify-bulk-info{padding:0 25px;text-align:right}}.imagify-settings div.submit{margin-top:2em;padding:20px 0}.imagify-notice .imagify-rate-us .stars,.imagify-sub-header .form-table{margin:0}.imagify-sub-header th{text-align:right}.imagify-sub-header td,.imagify-sub-header th{padding-top:0;padding-bottom:0}[for=api_key]{padding-top:5px}.imagify-notice .imagify-rate-us.imagify-rate-us{position:relative;bottom:0;right:0;text-align:left}.imagify-rate-us.imagify-rate-us{position:absolute;bottom:50%;right:20px;text-align:right;margin-bottom:-2.4em;color:#FFF}.imagify-rate-us a{color:#40B1D0}.imagify-rate-us .stars{display:inline-block;margin:2px 0 0 10px;text-decoration:none;letter-spacing:.2em;vertical-align:-1px}.imagify-rate-us .stars .dashicons:before{font-size:18px}.imagify-rate-us a:focus,.imagify-rate-us a:hover{color:#FEE102}@media (max-width:1220px){.imagify-rate-us.imagify-rate-us{position:static;margin-bottom:0;text-align:left}.imagify-rate-us.imagify-rate-us br{display:none}.imagify-rate-us .stars{display:block;margin-left:0}}.imagify-rkt-notice.imagify-rkt-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;padding:10px 45px 10px 0;border:0;-webkit-box-shadow:none;box-shadow:none;color:#FFF;background:#412355}.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:2px;margin-right:20px}@media (max-width:782px){.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:0;margin-right:12px}}.imagify-rkt-notice .imagify-cross{position:absolute;right:8px;top:50%;width:22px;height:22px;padding:0;margin-top:-11px;background:0 0;color:#FD7300;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross .dashicons{position:relative;top:2px;left:1px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross:hover{background:#FFF}.imagify-rkt-notice .imagify-cross:hover .dashicons{color:#412355}.imagify-rkt-notice .imagify-rkt-coupon,.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo{-ms-flex-negative:0;flex-shrink:0}.imagify-rkt-notice .imagify-rkt-logo{width:150px!important;text-align:center;padding:0 25px 0 30px;line-height:.8}.imagify-rkt-notice .imagify-rkt-msg{width:100%!important;padding:0 15px;font-size:14px;line-height:1.6}.imagify-rkt-notice .imagify-rkt-coupon{width:150px!important;padding:0 15px}.imagify-rkt-notice .imagify-rkt-coupon-code{padding:5px 10px;font-size:23px;font-weight:700;border:1px dashed #F7A933;color:#F7A933}.imagify-rkt-notice .imagify-rkt-cta{width:250px!important;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:200px;flex-basis:200px}.imagify-rkt-notice .button.button{position:relative;top:-1px;height:auto;font-weight:600;font-size:14px;-webkit-box-shadow:0 4px 0 #B27A27;box-shadow:0 4px 0 #B27A27;border:0;padding:9px 18px;background:#F7A933;text-shadow:1px 1px 1px rgba(0,0,0,.2)}@media (max-width:880px){.imagify-rkt-notice{-ms-flex-wrap:wrap;flex-wrap:wrap}.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo,.imagify-rkt-notice .imagify-rkt-msg{text-align:left;padding:5px 15px}.imagify-cross.imagify-cross{top:8px;margin-top:0}.imagify-rkt-notice .imagify-cross .dashicons{top:1px}}.imagify-settings-section{padding:10px 20px}.imagify-welcome .imagify-settings-section,[id=imagify-settings]{border:1px solid #D9D9D9;border-top:0 none;background:#FFF}.imagify-br{line-height:2}.imagify-important{color:#F5A623}.imagify-info,.imagify-info a{color:#40B1D0;font-size:12px}.imagify-info{position:relative;display:inline-block;padding-left:25px}.imagify-info .dashicons{position:absolute;left:0;top:-1px}.imagify-visual-label,label+.imagify-info,label+.imagify-options-line{display:inline-block;max-width:70%;margin-left:15px;margin-top:2px!important;-webkit-transition:opacity .3s;-o-transition:opacity .3s;transition:opacity .3s}.imagify-visual-label{vertical-align:-5px}label[for=imagify_sizes_full]+.imagify-info{vertical-align:middle}.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label+.imagify-options-line{opacity:.5}.imagify-settings.imagify-settings [type=checkbox]:checked+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:checked+label+.imagify-options-line{opacity:1}.imagify-checkbox-marged{max-width:500px;margin-left:45px}.imagify-checkbox.imagify-checkbox:checked,.imagify-checkbox.imagify-checkbox:not(:checked),.imagify-settings.imagify-settings [type=checkbox]:checked,.imagify-settings.imagify-settings [type=checkbox]:not(:checked){opacity:.01}.imagify-checkbox.imagify-checkbox:checked:focus,.imagify-checkbox.imagify-checkbox:not(:checked):focus,.imagify-settings.imagify-settings [type=checkbox]:checked:focus,.imagify-settings.imagify-settings [type=checkbox]:not(:checked):focus{-webkit-box-shadow:none!important;box-shadow:none!important;outline:0!important;border:0!important}.imagify-checkbox.imagify-checkbox:checked+label,.imagify-checkbox.imagify-checkbox:not(:checked)+label,.imagify-settings [type=checkbox]:checked+label,.imagify-settings [type=checkbox]:not(:checked)+label{position:relative;padding-left:6px;cursor:pointer;vertical-align:top}.imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-checkbox.imagify-checkbox:not(:checked)+label:before,.imagify-settings [type=checkbox]:checked+label:before,.imagify-settings [type=checkbox]:not(:checked)+label:before{content:'';position:absolute;left:0;top:0;width:28px;height:28px;margin:0 0 0 -24px;border:2px solid #8BA6B4;background:#FFF;border-radius:4px}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:checked+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{content:"✓";position:absolute;font-size:1.4em;top:3px;left:-16px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.imagify-checkbox.imagify-checkbox[disabled]:checked+label:before,.imagify-checkbox.imagify-checkbox[disabled]:not(:checked)+label:before,.imagify-settings [type=checkbox][disabled]:checked+label:before,.imagify-settings [type=checkbox][disabled]:not(:checked)+label:before{border-color:#ccc;background:#ddd}.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-settings [type=checkbox]:checked+label:after{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}input[id^=imagify_sizes_]:checked+label{font-weight:700}.medium.imagify-checkbox:checked+label:before,.medium.imagify-checkbox:not(:checked)+label:before{width:22px;height:22px;border-width:1.5px;border-radius:2px;margin-top:0}.medium.imagify-checkbox:checked+label:after,.medium.imagify-checkbox:not(:checked)+label:after{font-size:1.1em;left:-17px;top:3px}.imagify-settings .mini[type=checkbox]:checked+label:before,.imagify-settings .mini[type=checkbox]:not(:checked)+label:before,.mini.imagify-checkbox:checked+label:before,.mini.imagify-checkbox:not(:checked)+label:before{width:15px;height:15px;border-width:1px;border-radius:2px;margin-top:0}.imagify-settings .mini[type=checkbox]:checked+label:after,.imagify-settings .mini[type=checkbox]:not(:checked)+label:after,.mini.imagify-checkbox:checked+label:after,.mini.imagify-checkbox:not(:checked)+label:after{font-size:.9em;left:-21px;top:1px}.imagify-checkbox.imagify-checkbox:checked:focus+label:before,.imagify-checkbox.imagify-checkbox:not(:checked):focus+label:before,.imagify-settings [type=checkbox]:checked:focus+label:before,.imagify-settings [type=checkbox]:not(:checked):focus+label:before{border-style:dotted;border-color:#40b1d0}.imagify-inline-options{position:relative;display:table;width:100%;max-width:600px;border-collapse:collapse}.imagify-small-options{width:300px;margin:1em auto .5em;background:#338EA6;border-radius:4px}.imagify-inline-options input[type=radio]:checked,.imagify-inline-options input[type=radio]:not(:checked){position:absolute;left:5px;top:5px;display:none}.imagify-inline-options input[type=radio]:checked+label,.imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;display:table-cell;padding:13px 10px;text-align:center;font-weight:600;font-size:16px;text-transform:uppercase;letter-spacing:.1em;color:#FFF;background:#2E3243;border-left:1px solid rgba(255,255,255,.2);-webkit-box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);z-index:2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-small-options input[type=radio]:checked+label,.imagify-small-options input[type=radio]:not(:checked)+label{padding:8px 10px;font-size:13px;color:#FFF;-webkit-box-shadow:none;box-shadow:none;border-left:0}.imagify-bulk-submit .imagify-inline-options input[type=radio]:checked+label,.imagify-bulk-submit .imagify-inline-options input[type=radio]:not(:checked)+label{margin-bottom:1.75em}.imagify-inline-options input[type=radio]:checked+label:first-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:first-of-type{border-radius:3px 0 0 3px}.imagify-inline-options input[type=radio]:checked+label:last-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:last-of-type{border-radius:0 3px 3px 0}.imagify-inline-options input[type=radio]:checked+label{background:#8BC34A}.imagify-small-options input[type=radio]:not(:checked)+label{background:#338EA6;color:rgba(255,255,255,.4)}.imagify-small-options input[type=radio]:checked+label{background:#40B1D0}.imagify-inline-options .imagify-info{margin-top:15px}.imagify-btn-info{display:block;font-size:.7em;letter-spacing:0;line-height:1;text-transform:none}.imagify-datas-more-action a,a.btn-rocket{text-transform:uppercase;text-decoration:none}#describe-resize-larger input{width:5em}.imagify-cols:after{content:"";display:table;clear:both}.imagify-col{float:left;width:50%}.imagify-main{float:left;width:70%}.imagify-sidebar{float:right;width:28%;max-width:300px}.imagify-sidebar-section{border:1px solid #BBB;background:#FFF}.imagify-sidebar-section+.imagify-sidebar-section{margin-top:2em}@media (max-width:820px){.imagify-main,.imagify-sidebar{float:none;width:auto}.imagify-settings{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-sidebar{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;max-width:none;margin-left:0;margin-top:25px}.wp-media-products{text-align:center}.wp-media-products li{display:inline-block;width:100%;max-width:276px}}@media (min-width:1400px){.imagify-main{width:74%}}.imagify-sidebar-title{display:block;padding:20px 15px;border-bottom:1px solid #BBB;font-size:14px;font-weight:700;color:#23282d;background:#F2F5F7}.imagify-sidebar-title img{vertical-align:top;margin-right:5px}.imagify-sidebar .wp-media-products{margin-top:0;margin-bottom:-.5em}.imagify-sidebar .wp-media-products .links{display:block;padding:85px 25px 24px;text-align:center;background-color:#2E3243;background-size:contain;background-repeat:no-repeat;background-position:50% 0;text-decoration:none}.imagify-sidebar .wp-media-products .links p{margin:1.5em auto;color:#FFF}.imagify-sidebar .wp-media-products .wprocket-link{background-image:-o-linear-gradient(top,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-image:linear-gradient(to bottom,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-color:#3B1E4E;background-repeat:repeat-x,no-repeat}.imagify-sidebar-content{padding:10px 20px}.imagify-mark-styled{display:inline-block;padding:1px 2px 1px 4px;line-height:1.3;font-weight:700;background:#F7A933;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);text-shadow:1px 1px 0 rgba(0,0,0,.2)}.imagify-mark-styled span{display:inline-block;-webkit-transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg);transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg)}.imagify-discount-code,a.btn-rocket{display:block;text-shadow:1px 1px 0 rgba(0,0,0,.2);font-weight:700}.imagify-discount-code{margin:.35em 0 .5em;font-size:2em;letter-spacing:.05em;text-align:center}.imagify-big-text{font-size:15px;font-weight:700}.imagify-big-text strong{font-size:20px}a.btn-rocket{font-size:1.15em;padding:12px;background:#F7A933;-webkit-box-shadow:0 3px 0 #D69626;box-shadow:0 3px 0 #D69626;border-radius:3px;color:#FFF}a.btn-rocket:focus,a.btn-rocket:hover{background:#ff8c00;-webkit-box-shadow:0 3px 0 #ff8c00;box-shadow:0 3px 0 #ff8c00}.imagify-welcome{margin:30px 20px 0 0}.imagify-welcome .baseline{display:inline-block;margin:.2em 0 0 2em;font-size:17px}.imagify-welcome .imagify-logo{vertical-align:middle}.imagify-welcome-remove{position:absolute;top:50%;right:15px;margin-top:-8px;color:#FFF;text-decoration:none}.imagify-columns{overflow:hidden;padding:15px 0;counter-reset:cols}.imagify-columns [class^=col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-columns .col-1-3{width:33.333%;padding-left:28px}.imagify-columns .col-2-3{width:66.666%;padding-left:28px}.imagify-columns .col-1-2{width:50%;padding:0 20px}.imagify-columns .col-overview{padding-left:20px}.imagify-columns .col-informations{width:36.6%;padding-right:30px}.imagify-columns .col-statistics{width:30%}@media (max-width:830px){.imagify-columns [class^=col-]{float:none;margin-bottom:1.5em}.imagify-columns .col-1-2,.imagify-columns .col-1-3{width:auto;padding:0 28px;clear:both;padding-top:1em}}.imagify-columns [class^=col-] img{float:left;margin-right:18px}.imagify-col-content{overflow:hidden}.imagify-col-title{margin:0 0 15px;font-size:23px}.counter .imagify-col-title:before{counter-increment:cols;content:counter(cols) ". ";color:#40B1D0}.imagify-col-desc{color:#5F758E;margin-bottom:2em}.imagify-notice.imagify-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0;margin:10px 20px 10px 2px;border:0;background:#2E3243;-webkit-box-shadow:none;box-shadow:none;color:#FFF}@media (max-width:782px){.imagify-notice.imagify-notice,.imagify-welcome{margin-right:12px}}@media (max-width:450px){.imagify-notice.imagify-notice{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.wrap .imagify-notice{margin:5px 15px 2px;position:relative}.imagify-notice-logo{padding:18px 23px;background:#40B1D0}.updated .imagify-notice-logo{background:#8BC34A}.error .imagify-notice-logo{background:#D0021B}.imagify-popin-message{padding:5px 15px;text-align:left}.imagify-popin-message.imagify-error p{color:#FFF}.imagify-notice-title{font-size:15px}.imagify-notice-content{padding:5px 23px}.imagify-notice-content.imagify-notice-content p{margin:.65em 0}.imagify-notice a{color:#40B1D0}.imagify-notice a:focus,.imagify-notice a:hover{color:#FEE102}.imagify-notice code{background:rgba(0,0,0,.4)}.column-imagify_optimized_file.column-imagify_optimized_file{width:300px;text-align:center;vertical-align:middle}.column-imagify_optimized_file>*{max-width:235px;margin:0 auto}ul.imagify-datas-list.imagify-datas-list{margin:0 auto;color:#555;font-size:10px}.compat-field-imagify .label{vertical-align:top}.compat-field-imagify ul.imagify-datas-list{margin-top:7px;font-size:11px}ul.imagify-datas-list .big{font-size:12px;color:#40B1D0}.imagify-data-item{overflow:hidden}.imagify-data-item .imagify-chart{display:inline-block;top:1px;width:20px;vertical-align:middle;margin-bottom:0}li.imagify-data-item{clear:both;margin-bottom:2px}ul.imagify-datas-list .imagify-data-item span.data,ul.imagify-datas-list .imagify-data-item strong{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}ul.imagify-datas-list .imagify-data-item span.data{text-align:left;padding-right:5px}.compat-field-imagify .imagify-datas-list .imagify-data-item .data{width:130px;text-align:left;font-weight:700}.media-sidebar .imagify-datas-list .imagify-data-item .data,.media-sidebar .imagify-datas-list .imagify-data-item strong{width:auto;float:none}ul.imagify-datas-list .imagify-data-item strong{text-align:left;padding-left:5px}.imagify-datas-more-action.imagify-datas-more-action{margin:.4em auto;background:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(49%,transparent),color-stop(50%,rgba(0,0,0,.075)),color-stop(58%,rgba(0,0,0,.075)),color-stop(58%,transparent),to(transparent));background:-o-linear-gradient(top,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent);background:linear-gradient(to bottom,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent)}.imagify-datas-more-action a{display:inline-block;padding:0 5px;background:#40B1D0;color:#FFF;font-size:9px;font-weight:700;line-height:1.9}.imagify-datas-more-action a.is-open{background:#555}.imagify-datas-more-action a.is-open .dashicons{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.imagify-datas-more-action a .dashicons{font-size:14px;vertical-align:middle;line-height:.8}.imagify-datas-more-action .the-text,.imagify-datas-more-action a .dashicons:before{line-height:20px;vertical-align:middle}.imagify-datas-more-action .the-text{display:inline-block;height:20px}ul.imagify-datas-details.imagify-datas-details{margin:.7em auto}.imagify-datas-details strong{color:#40B1D0}.imagify-datas-details .original{color:#555}.imagify-datas-actions-links{overflow:hidden;border-top:2px solid transparent;padding-top:5px;font-size:8px}.imagify-datas-actions-links a{position:relative;display:inline-block;padding-left:17px;text-decoration:none;font-weight:600}.compat-field-imagify .imagify-datas-actions-links{max-width:300px}.misc-pub-imagify .imagify-datas-actions-links{border-top:2px solid #f2f2f2;padding-bottom:5px}.compat-field-imagify .imagify-datas-actions-links a,.misc-pub-imagify .imagify-datas-actions-links a{font-size:10px;float:left;width:50%}.media-sidebar .compat-field-imagify .imagify-datas-actions-links a,.submitbox .misc-pub-imagify .imagify-datas-actions-links a{display:block;width:auto;float:none}.column-imagify_optimized_file .imagify-datas-actions-links a{margin:0 .7em;padding-left:15px}.imagify-datas-actions-links a:only-child{float:none;width:auto}.imagify-datas-details.is-open+.imagify-datas-actions-links{border-top-color:rgba(0,0,0,.075)}.imagify-datas-actions-links .dashicons{position:absolute;left:0;top:4px;width:12px;margin-right:2px;font-size:11px}.imagify-title>h1{padding:0}.imagify-title-right{display:table;float:right;margin-top:-10px}.imagify-title-right p{margin:0}.imagify-title-right a{font-weight:700;text-decoration:none}.imagify-title-right>div{display:table-cell;vertical-align:middle}.imagify-title-right .dashicons-arrow-down-alt2{vertical-align:-4px;margin-left:2px}@media (max-width:1200px){.imagify-bulk .imagify-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-title-right{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-top:20px}}.imagify-account,.imagify-account-link{padding-right:15px}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.imagify-credit-left{position:relative;min-width:280px;padding-left:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}@media (max-width:630px){.imagify-title-right,.imagify-title-right>div{display:block;width:auto}.imagify-title-right>div{margin-top:10px;max-width:100%}.imagify-credit-left{padding-left:0}}.imagify-meteo-title.imagify-meteo-title{color:#FFF;font-size:17px}.imagify-space-left{display:inline-block;min-height:38px;min-width:245px;vertical-align:middle}.imagify-space-left>p{color:#FFF}#wp-admin-bar-imagify-profile [class^=imagify-bar-],[class^=imagify-bar-]{position:relative;height:1.5em;width:100%;background:#60758D;color:#FFF;font-size:10px}.base-transparent{background:0 0}[class^=imagify-bar-].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:4.5em}.right-outside-number .imagify-barnb{display:block;margin-right:-4.5em;text-align:right;font-weight:700;line-height:1.5}#wp-admin-bar-imagify-profile .imagify-progress-value,.imagify-progress-value{position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:13px;font-weight:700}#wp-admin-bar-imagify-profile .imagify-progress,.imagify-progress{height:1.5em}.imagify-progress{-webkit-transition:width .3s;-o-transition:width .3s;transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8CC152}.imagify-bar-positive .imagify-barnb{color:#8CC152}.imagify-bar-negative .imagify-progress{background:#73818C}.imagify-bar-negative .imagify-barnb{color:#73818C}.imagify-bar-neutral .imagify-progress{background:#F5A623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#D0021B}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889F}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40B1D0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p,.imagify-list-infos li+li{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost,.btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #FFF;text-align:center;background:0 0;color:#FFF;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:hover,.btn-ghost:focus,.btn-ghost:hover{background:#FFF;color:#888}.imagify-list-infos{max-width:100%;width:415px}.imagify-info-block,.imagify-list-infos li{position:relative;padding:10px;padding-left:42px;background:#D9E4EB;border-radius:4px;line-height:1.6}.imagify-list-infos .imagify-alt.imagify-alt{background:#8BA7B5;color:#FFF;font-weight:700}.imagify-info-block:before,.imagify-list-infos li:before{content:"";position:absolute;left:13px;top:14px;height:16px;width:16px;border:1px solid #46b1ce;border-radius:10px}.imagify-info-block:after,.imagify-list-infos li:after{content:"i";position:absolute;left:20px;top:13px;font-style:italic;color:#46b1ce}.imagify-cell .imagify-info-block{padding-top:0}.imagify-cell .imagify-info-block:after{top:6px}.imagify-cell .imagify-info-block:before{top:7px}.imagify-list-infos .imagify-alt:after,.imagify-list-infos .imagify-alt:before{color:#fff;border-color:#fff}.imagify-sub-title.imagify-sub-title{font-size:23px;background:#FFF;color:#2E3243;border-left:1px solid #D9D9D9;border-right:1px solid #D9D9D9;font-weight:lighter}.imagify-sub-title .icon-bulk{margin-right:10px;vertical-align:middle}.imagify-sub-title .title-text{display:inline-block;line-height:1;vertical-align:middle}.imagify-bulk .imagify-settings-section{border:1px solid #D9D9D9;border-top:0;background:#F2F5F7;color:#4A4A4A}.imagify-bulk .imagify-settings-section h3,.imagify-bulk .imagify-settings-section li,.imagify-bulk .imagify-settings-section p{color:#4A4A4A}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.imagify-title .imagify-tooltips{position:absolute;top:100%;left:0}.imagify-tooltips .icon-round{float:left;display:inline-block;width:28px;height:28px;border:1px solid #FFF;margin-right:8px;margin-bottom:8px;font-size:17px;font-style:italic;line-height:29px;font-weight:700;text-align:center;border-radius:50%}.imagify-tooltips .tooltip-content{display:block;position:relative;max-width:250px;padding:7px 15px 8px;background:#2e3242;color:#FFF;font-size:10px;border-radius:3px}.imagify-tooltips.right .tooltip-content{margin-left:12px}.imagify-tooltips.bottom .tooltip-content{margin-top:4px}.imagify-inline-options label .tooltip-content{position:absolute;left:0;right:0;top:100%;text-transform:none;font-size:10px;letter-spacing:0;text-align:center}.imagify-ac-rt-big,.imagistatus{text-transform:uppercase;font-weight:700}.imagify-tooltips .tooltip-content:after{content:"";position:absolute}.imagify-tooltips.right .tooltip-content:after{top:16px;left:-6px;border-right:8px solid #2e3242;border-top:6px solid transparent;border-bottom:6px solid transparent}.imagify-tooltips.bottom .tooltip-content:after{top:-5px;left:50%;margin-left:-3px;border-bottom:6px solid #2e3242;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-space-tooltips .tooltip-content{max-width:280px;margin-top:20px;margin-left:0;padding:5px 15px;font-size:13px;background:#40B1D0;-webkit-box-shadow:0 3px 0 #338EA6;box-shadow:0 3px 0 #338EA6}.imagify-space-tooltips .tooltip-content:after{top:-14px;left:50%;margin-left:-7px;border:0;border-bottom:15px solid #40B1D0;border-left:15px solid transparent;border-right:15px solid transparent}.tooltip-content.tooltip-table{display:table;width:100%}.tooltip-content.tooltip-table>*{display:table-cell;vertical-align:middle}.tooltip-content .cell-icon{width:28px}.tooltip-content .cell-icon .icon{margin-bottom:0}.tooltip-content .cell-text{padding:5px 10px 5px 0;line-height:1.3}.tooltip-content .cell-sep{width:1px;background:rgba(255,255,255,.4)}.tooltip-content .cell-cta{padding-left:10px}.tooltip-content .cell-cta a{display:block;color:#FFF;width:100%;height:100%;white-space:nowrap}.imagify-number-you-optimized .number{display:table-cell;padding-right:15px;font-size:36px;font-weight:700;line-height:1.1;vertical-align:middle;white-space:nowrap}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px}.imagify-number-you-optimized .text br{display:none}.imagify-number-you-optimized>p{display:table}.imagify-number-you-optimized{padding-bottom:.85em;margin-bottom:1.35em;overflow:hidden;border-bottom:1px solid rgba(0,0,0,.05)}.imagify-bars p{font-weight:700;font-size:12px;margin-bottom:0}.imagify-bars+.imagify-number-you-optimized{border-bottom:0;padding-top:.85em}.imagify-bars+.imagify-number-you-optimized p{color:#46b1ce}.imagify-bulk-table{margin-top:2em;max-height:600px;max-height:60vh;overflow:auto}.imagify-ac-report-text,.imagiuploaded{overflow:hidden}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse;border:1px solid #D3D3D3}.imagify-bulk-table td{padding:8px 15px}.imagify-bulk-table thead th,.imagify-bulk-table thead tr{background:#2E3242}.imagify-bulk-table tfoot th,.imagify-bulk-table tfoot tr{background:#73818C}.imagify-bulk-table thead th{padding:14px 15px;text-align:left;color:#F2F5F7;font-weight:700;font-size:14px}.imagify-bulk-table tfoot td{padding:14px 15px;color:#F9FAFA}.imagify-bulk-table tbody td,.imagify-bulk-table tbody tr{background:#FFF}.imagify-bulk-table tbody tr:nth-child(odd),.imagify-bulk-table tbody tr:nth-child(odd) td{background:#F2F5F7}.imagify-bulk-table .imagify-row-progress{display:none}.imagify-bulk-table .imagify-row-progress,.imagify-bulk-table .imagify-row-progress td{height:15px;padding:0}.imagify-bulk-table .imagify-no-uploaded-yet td{height:200px;font-size:17px;letter-spacing:.1em;word-spacing:.12em;vertical-align:middle;text-transform:uppercase;font-weight:700;text-align:center;color:#999;background-color:#FFF}.imagify-row-complete{padding:35px 20px;margin-top:2em;background:#8BC34A;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.1)}.imagify-row-complete .imagify-ac-chart{margin-top:3px}.imagify-row-complete p{color:#FFF;margin:0}@-webkit-keyframes congrate{0%{opacity:0;-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);opacity:1}}@keyframes congrate{0%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.05);transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.imagify-row-complete.done{-webkit-animation:congrate .5s ease-in-out;animation:congrate .5s ease-in-out}.imagify-all-complete{margin:1.5em 0}.imagify-all-complete>div{display:inline-block;vertical-align:middle}.imagify-ac-report{min-width:310px}.imagify-ac-chart{width:46px;height:46px;float:left;margin:0 20px 0 10px}.imagify-ac-report-text p{line-height:1.3}.imagify-ac-rt-big{font-size:24px;letter-spacing:.15em;word-spacing:.15em}.imagify-ac-share{text-align:right}.imagify-ac-share-content{display:inline-block;padding:10px 15px;background:rgba(255,255,255,.2)}.imagify-ac-share-content>*{display:inline-block;vertical-align:middle}.imagify-bulk-table .imagify-ac-share-content p{margin-right:5px}.imagify-share-networks,.imagify-share-networks li{margin:0}.imagify-share-networks li{display:inline-block}.imagify-share-networks a{display:inline-block;vertical-align:-7px;margin:0 5px;text-decoration:none;color:#FFF}.imagify-cell-filename{max-width:200px}.imagify-cell-status{max-width:145px}.imagify-cell-status .dashicons-warning{margin-right:2px}.imagify-cell-thumbnails{max-width:120px}td.imagify-cell-filename{-o-text-overflow:clip;text-overflow:clip;white-space:nowrap;overflow:hidden}.imagify-bulk-table td.imagify-cell-totaloriginal{padding-right:78px}.imagifilename,.imagiuploaded{display:inline-block;vertical-align:middle}.imagifilename{font-size:12px}.imagiuploaded{width:33px;height:33px;margin-right:5px;margin-left:-8px;background:url(../images/upload-image.png) no-repeat;background-size:cover}.imagiuploaded img{max-widht:100%;height:auto}.imagistatus{color:#8CA6B3}.status-compressing{color:#46B1CE}.status-error{color:#CE0B24}.status-warning{color:#f5a623}.status-complete{color:#8CC152}.imagify-error{background:#D0021B;color:#FFF}#wpadminbar .imagify-warning *,.imagify-warning{background:#f5a623;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.2)}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46B1CE;font-weight:700}.imagify-cell-optimized{font-weight:700}.imagify-cell-totaloriginal{text-align:right}.imagify-modal .h2,.imagify-modal .h3{font-weight:400;letter-spacing:.075em;text-align:center}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.dashicons-admin-generic{-webkit-transform-origin:48.75% 51.75%;-ms-transform-origin:48.75% 51.75%;transform-origin:48.75% 51.75%}.imagify-modal{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.js .imagify-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#1F2332;background-color:rgba(31,35,50,.95);z-index:99999}.imagify-modal-content{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;width:800px;max-width:95%;max-height:90vw;overflow:auto;padding:20px 25px;margin:1em auto;background:#FFF;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.7);box-shadow:1px 1px 4px rgba(0,0,0,.7);border-radius:3px}#imagify-visual-comparison .imagify-modal-content,.imagify-visual-comparison .imagify-modal-content{max-width:1400px;background:0 0;padding:5px;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.imagify-modal .h2{margin:.5em 0;color:#8ba6b4;font-size:24px}.imagify-modal .h3{color:#40b1d0;font-size:18px}.text-justify{text-align:justify}.imagify-modal .close-btn{display:none;visibility:hidden;position:absolute;right:20px;top:20px;font-size:1.2em;border:0;background:0 0;border-radius:0;cursor:pointer}.imagify-modal .close-btn i{margin-left:-2px}.imagify-modal .close-btn:focus,.imagify-modal .close-btn:hover{color:#40b1d0}.js .imagify-modal .close-btn{display:block;visibility:visible}.js .imagify-iframe-viewing .close-btn{display:none}#imagify-visual-comparison .close-btn,.imagify-visual-comparison .close-btn{top:50px;right:5px;width:33px;height:33px;padding:1px 0 0 2px;border:1px solid #F2F2F2;color:#F2F2F2;line-height:19px;text-align:center;border-radius:50%}.imagify-visual-comparison .close-btn,.wp_attachment_image #imagify-visual-comparison .close-btn{top:0}.imagify-visual-comparison .imagify-modal-content,.wp_attachment_image #imagify-visual-comparison .imagify-modal-content{padding-top:40px}.imagify-modal .imagify-comparison-title{font-size:28px;margin-bottom:1em;color:#F2F2F2;text-align:left}.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons{position:static;margin:0 10px 0 15px}.imagify-comparison-title .twentytwenty-duo-buttons button{float:none;padding:6px 12px;font-size:16px;text-transform:none;border:1px solid #40B1D0;color:#889;letter-spacing:0}.imagify-comparison-title .twentytwenty-duo-buttons button:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.imagify-comparison-title .twentytwenty-duo-buttons .selected{border:1px solid #40B1D0;color:#FFF;background:#40B1D0}.imagify-comparison-levels{margin:15px 0;overflow:hidden}.imagify-comparison-levels div{display:none;min-width:175px;font-size:11px}.imagify-comparison-levels .imagify-chart,.imagify-comparison-levels .imagify-chart-container{width:25px;float:none;margin:0}.imagify-visual-comparison .imagify-chart-container canvas{width:15px!important;height:15px!important;margin-right:5px}.imagify-c-level.go-left{float:left}.imagify-c-level.go-right{float:right}.imagify-c-level.go-left,.imagify-c-level.go-right{display:table}.imagify-c-level .imagify-c-level-row{display:table-row;margin:0;color:#FFF}.imagify-c-level-row>span{display:table-cell;padding:2px 0}.imagify-c-level-row .value{text-align:right;padding-left:5px}.imagify-c-level-row .value.level{color:#40b1d0}.imagify-c-level-row .value.size{color:#8bc34a;font-weight:700}.imagify-c-level-row .value .imagify-chart{top:1px}@-webkit-keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-menu-bar-img{margin-top:1em}.imagify-modal .loader{position:absolute;top:50%;left:50%;margin:-32px 0 0 -32px;opacity:0;visibility:hidden;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.imagify-modal .loading .loader{visibility:visible;opacity:1}.imagify-settings .imagify-visual-comparison-text{margin-top:1em;color:#40b1d0;font-weight:700}.imagify-border-styled,.imagify-flex-table,.imagify-modal-cols,.imagify-offer-header,.imagify-payment-modal .imagify-modal-content,.imagify-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.imagify-analyzing .imagify-numbers-calc,.imagify-modal-content.imagify-iframe-viewing .imagify-modal-sidebar,.imagify-modal-content.imagify-success-viewing .imagify-modal-sidebar,.imagify-modal-section .imagify-loader,.imagify-modal-section.imagify-analyzing .imagify-modal-cols,.imagify-numbers-notcalc{display:none}.imagify-border-styled,.imagify-modal-cols{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-payment-modal{text-align:center;color:#7A8996}.imagify-payment-modal *{-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-modal-loader{position:absolute;top:0;left:0;right:0;bottom:0;background:url(../images/loader-balls.svg) center no-repeat #fff;z-index:10}.imagify-payment-modal .imagify-modal-content{width:980px;max-width:100%;min-width:925px;padding:0}.imagify-modal-content.imagify-iframe-viewing{width:980px;height:672px;overflow:hidden}.imagify-iframe-viewing #imagify-payment-process-view{width:980px;height:668px}.imagify-payment-modal .imagify-modal-main{width:70%}.imagify-iframe-viewing .imagify-modal-main{width:auto}.imagify-payment-modal .imagify-modal-content.imagify-success-viewing{min-width:auto;width:450px;min-height:300px}.imagify-success-viewing .imagify-modal-main{width:100%}.imagify-payment-modal .imagify-modal-sidebar{width:30%;padding:15px 20px;background:#1F2332;color:#FFF}.imagify-modal-section{padding:0 25px}.imagify-modal-section.section-gray{margin:0 0 1em;padding:10px 25px 15px;background:#F6F7FB}.imagify-tabs-contents .section-gray{padding:8px 25px 10px}.imagify-modal-section .imagify-modal-title:first-child{margin-top:1em;margin-bottom:1.5em}.imagify-modal-section.section-gray .imagify-modal-title{margin-top:.5em;margin-bottom:.5em}.imagify-modal-title{font-size:1.8em}.imagify-analyzing .imagify-numbers-notcalc,.imagify-modal-section.imagify-analyzing .imagify-loader{display:block}.imagify-modal-section .imagify-loader{margin:2em auto}.imagify-border-styled{width:200px;margin:0 auto;color:#8BC34A;font-weight:700;font-size:.925em}.imagify-big-number,.imagify-payment-modal strong{font-weight:700;color:#4A4A4A}.imagify-big-number{font-size:3.7em;margin:-3px 0;line-height:1}.imagify-border-styled:after,.imagify-border-styled:before{content:"";height:1px;background:rgba(0,0,0,.1);-ms-flex-preferred-size:40px;flex-basis:40px}.imagify-border-styled:before{margin-right:5px}.imagify-border-styled:after{margin-left:5px}.imagify-col{-ms-flex-preferred-size:50%;flex-basis:50%}.imagify-modal .imagify-cols{padding:0 20px}.imagify-payment-modal .imagify-iconed{margin:1.5em 5em 1.5em 0}.imagify-iconed{position:relative;text-align:left;padding-left:42px;margin-right:15px;font-weight:500}.imagify-iconed .dashicons,.imagify-iconed .icon{position:absolute;font-size:2em;left:0;top:2px;color:#40B1D0}.imagify-payment-modal .close-btn{top:10px;right:10px;width:24px;height:24px;padding:2px 0 0 4.5px;color:#FFF;background:#40B1D0;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-payment-modal .close-btn i{margin-left:-3.5px;margin-top:-.5px}.imagify-payment-modal .close-btn:hover{background:#F6F7FB}.imagify-offer-line{margin-top:1.5em}.imagify-offer-line+.imagify-offer-line{margin-top:.75em}.imagify-offer-header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 0 0 15px;border-radius:4px 4px 0 0;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-header.imagify-offer-header.imagify-offer-header .imagify-inline-options label:last-child{border-radius:0 4px 0 0}.imagify-offer-header .imagify-inline-options{width:auto}.imagify-offer-title{font-weight:700;margin:0}.imagify-offer-header,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#E5EBEF}.imagify-offer-onetime .imagify-offer-header{padding-top:8px;padding-bottom:8px}.imagify-offer-onetimes>div{padding-top:15px;padding-bottom:15px}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;padding:7px 30px;font-size:1em;letter-spacing:.05em;color:inherit;-webkit-box-shadow:0 0 0;box-shadow:0 0 0;border-radius:0}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#F6F7FB}.imagify-2-free{position:absolute;bottom:100%;left:0;right:0;padding:2px 10px;margin-bottom:8px;font-size:.8em;letter-spacing:0;text-transform:none;text-align:center;color:#FFF;background:#10121A;border-radius:2px}.imagify-2-free:after{content:"";position:absolute;left:50%;bottom:-3px;margin-left:-3px;border-top:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent}.imagify-2-free.imagify-b-right{bottom:auto;left:100%;right:-100%;margin-bottom:0;margin-left:8px}.imagify-2-free.imagify-b-right:after{left:-3px;bottom:auto;top:50%;margin-top:-3px;margin-left:0;border-right:3px solid #10121A;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:0}.imagify-2-free.imagify-b-bottom{bottom:-100%;left:0;right:0;margin-top:8px}.imagify-2-free.imagify-b-bottom:after{top:-3px;bottom:auto;border-bottom:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent;border-top:0}.imagify-offer-content{text-align:left;background:#F6F7FB;border-radius:0 0 4px 4px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-onetime .imagify-offer-content{padding:10px 0}div.imagify-col-checkbox{position:relative;width:25.5%;padding-top:10px;padding-bottom:7px}.imagify-col-checkbox label{display:block;padding-left:55px!important}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked){position:absolute;top:50%;left:6px;margin:-8px 0 0}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{margin:0;top:-2px;left:6px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-by,.imagify-offer-size{-webkit-transition:all .275s;-o-transition:all .275s}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:after{top:1px;left:13px}.imagify-offer-size{font-size:30px;color:#2E3243;font-weight:700;transition:all .275s}.imagify-offer-by{font-size:10px;transition:all .275s}.imagify-approx{display:none;font-size:11px;line-height:1.2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}div.imagify-col-price{width:35%}.imagify-flex-table .imagify-price-block{padding-left:0;padding-right:0}.imagify-offer-monthlies .imagify-price-block,.imagify-offer-monthly .imagify-flex-table .imagify-price-block{padding-top:0}.imagify-flex-table .imagify-price-complement{padding-right:0;font-size:10px;font-weight:700}.imagify-price-block,.imagify-price-discount{white-space:nowrap}.imagify-price-block span,.imagify-price-discount span{display:inline-block;vertical-align:middle}.imagify-price-discount.imagify-price-discount{position:relative;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding-top:15px;font-weight:700;width:70px}.imagify-price-discount:before{content:"";position:absolute;top:25px;width:62%;height:2px;background:#2E3243;-webkit-transform:rotate(-15deg);-ms-transform:rotate(-15deg);transform:rotate(-15deg)}.imagify-offer-onetimes .imagify-price-discount:before{width:100%}.imagify-price-discount-dollar{color:#2E3243}.imagify-price-discount-number{color:#8BA6B4}.imagify-offer-selected .imagify-price-discount-number{color:#FFF}span.imagify-dollars{color:#1F2332;font-size:18px;font-weight:700;vertical-align:-2px}.imagify-offer-onetime .imagify-col-price{padding-top:0}.imagify-offer-onetime .imagify-dollars{vertical-align:-1px}.imagify-price-big,.imagify-price-mini{color:#40B1D0;font-weight:700}.imagify-price-big{font-size:36px}span.imagify-price-mini{font-size:18px;vertical-align:2px}span.imagify-price-by{font-size:10px;color:#1F2332;vertical-align:-13px;text-indent:-27px}.imagify-col-other-actions{width:18.5%;text-align:right}.imagify-col-other-actions a{font-size:11px}.imagify-offer-selected,.imagify-offer-selected .imagify-col-other-actions a,.imagify-offer-selected .imagify-offer-size,.imagify-offer-selected .imagify-offer-title,.imagify-offer-selected .imagify-price-big,.imagify-offer-selected .imagify-price-complement,.imagify-offer-selected .imagify-price-mini{color:#FFF}.imagify-offer-selected .imagify-offer-header,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#338EA6}.imagify-offer-selected .imagify-offer-content,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#40B1D0}.imagify-offer-selected .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-offer-selected .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{border-color:#FFF;background:#40B1D0}.imagify-offer-selected .imagify-offer-by{color:#2E3243}.imagify-enough-free .imagify-not-enough-title,.imagify-enough-title{display:none}.imagify-enough-free .imagify-enough-title{display:block}.imagify-submit-line{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:2em 0;text-align:left}.imagify-coupon-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-coupon-section p{margin:0;line-height:1.3}.imagify-coupon-text{width:200px;max-width:100%;padding-right:15px}.imagify-coupon-loader{display:none}.imagify-coupon-text.checking{text-align:right}.imagify-coupon-text.checking .imagify-coupon-loader{display:inline}.imagify-coupon-text.checking label{display:none}.imagify-coupon-input{position:relative}.imagify-coupon-input input{position:relative;z-index:1}[id=imagify-coupon-validate].button-secondary{position:absolute;top:1px;right:3px;bottom:2px;-webkit-box-shadow:none;box-shadow:none;padding:4px 10px;z-index:0;-webkit-transition:-webkit-transform .275s;-o-transition:transform .275s;transition:transform .275s;transition:transform .275s,-webkit-transform .275s}.imagify-canbe-validate [id=imagify-coupon-validate]{-webkit-transform:translateX(45px);-ms-transform:translateX(45px);transform:translateX(45px)}.imagify-modal-section+.imagify-modal-promotion{margin-top:-1em}.imagify-modal-promotion{position:relative;overflow:hidden;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 25px;background:#604D90;text-shadow:0 0 3px rgba(0,0,0,.3)}.imagify-modal-promotion.active{display:-webkit-box;display:-ms-flexbox;display:flex}[id=imagify-pricing-tab-onetime] .imagify-modal-promotion{margin-bottom:4em}.imagify-modal-promotion:before{content:"\f488";position:absolute;top:28px;left:8%;font-family:dashicons;font-size:90px;color:#8476A9;text-shadow:none}.imagify-modal-promotion p{position:relative;margin:.2em 0;color:#FFF}.imagify-promo-title{-ms-flex-preferred-size:100%;flex-basis:100%;text-transform:uppercase;font-size:20px;font-weight:700;letter-spacing:.125em}.imagify-until-date{-ms-flex-preferred-size:200px;flex-basis:200px;text-align:right}.imagify-until-date strong{color:#FFF}.imagify-submit-line button{font-size:16px}input.imagify-coupon-code{padding:10px;border:2px solid #7A8996;font-size:.875em;font-weight:700;border-radius:3px}.validated.imagify-coupon-section .imagify-coupon-text,.validated.imagify-coupon-section strong{color:#8BC34A}.validated.imagify-coupon-section .imagify-coupon-code{color:#8BC34A;border-color:#8BC34A}.invalid.imagify-coupon-section .imagify-coupon-text,.invalid.imagify-coupon-section strong{color:#d0021b}.invalid.imagify-coupon-section .imagify-coupon-code{color:#d0021b;border-color:#d0021b}.imagify-footer-lines{width:500px;max-width:100%;margin:2em auto 2.5em;font-size:.85em;line-height:1.5}.imagify-year-selected .imagify-switch-my .imagify-yearly{display:block}.imagify-month-selected .imagify-switch-my .imagify-yearly,.imagify-year-selected .imagify-switch-my .imagify-monthly{display:none}.imagify-month-selected .imagify-switch-my .imagify-monthly{display:block}.imagify-flex-table{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-flex-table>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:7px 15px}div.imagify-col-details{width:22%;padding-left:25px}.imagify-col-details p{margin:0}.imagify-pricing-table{margin:0 20px}.imagify-pricing-table .imagify-offer-line{padding:.6em 0;border:2px solid #E8EEF0;text-align:left;border-radius:3px}.imagify-pricing-table .imagify-offer-line:first-child{margin-top:.75em}.imagify-pricing-table .imagify-offer-line.imagify-offer-selected:first-child{margin-top:1.75em}.imagify-pricing-table .imagify-offer-line+.imagify-offer-line{margin-top:-2px}.imagify-pricing-table .imagify-col-other-actions{width:20.5%}.imagify-pricing-table .imagify-approx{margin-left:0;line-height:.5;margin-bottom:1em}.imagify-pricing-table .imagify-offer-selected{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03);background:#40B1D0;border-width:0}.imagify-pricing-table .imagify-offer-selected .imagify-approx{color:#FFF}.imagify-pricing-table .imagify-button-secondary{padding:3px 20px;-webkit-box-shadow:none;box-shadow:none;text-transform:uppercase;font-size:12px;letter-spacing:.025em}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary{border:2px solid #FFF;background:#40B1D0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none!important}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:focus,.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:hover{background:#FFF;color:#40B1D0}.imagify-col .imagify-special-needs{margin-left:25px}.imagify-special-needs strong{font-size:25px;font-weight:700;color:#40B1D0}.imagify-special-needs span{display:block;font-size:12px;margin-top:-.5em}div.imagify-col-price{position:relative}.imagify-recommend{display:none;position:absolute;left:-20px;bottom:100%;padding:0;margin-bottom:8px;color:#1F2332;font-weight:700;font-style:italic}.imagify-offer-selected .imagify-recommend,.imagify-tab-content.imagify-current{display:block}[class*=imagify-onetime-] .imagify-recommend{left:65px;margin-bottom:20px}.imagify-recommend:before{content:"";position:absolute;top:7px;left:-35px;width:29px;height:30px;background:url(../images/icon-arrow-choice.png) 0 no-repeat;background-size:contain}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.imagify-recommend:before{background-image:url(../images/icon-arrow-choice.svg)}}.imagify-offer-line[class*=imagify-onetime-]{padding:0;margin:.3em 0 0}.imagify-offer-line.imagify-offer-line[class*=imagify-onetime-]:first-child{margin-top:2em}.imagify-offer-line[class*=imagify-onetime-]+.imagify-offer-line{margin-top:.5em}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-]{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);border-width:2px}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{position:relative;overflow:hidden;width:21%;background:#1F2332;color:#FFF}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{background:#338EA6}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details:before{content:"";position:absolute;bottom:0;right:25px;width:75px;height:54px;background:url(../images/icon-pack.png)}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-other-actions{width:30%}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx,.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{color:#FFF}.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{font-size:24px}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx{font-size:12px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-block{padding-left:10px}.imagify-offer-line[class*=imagify-onetime-] .imagify-dollars{vertical-align:middle}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-big{vertical-align:-5px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-mini{vertical-align:7px}.imagify-tabs{margin-bottom:0;list-style:none;background:#E5EBEF}.imagify-modal-content .imagify-tabs{margin:1em 0 0}.imagify-tab{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;width:50%;margin:0;font-size:23px}.imagify-tab a{display:block;padding:15px 10px;color:inherit;text-decoration:none}.imagify-tab a:focus{-webkit-box-shadow:none;box-shadow:none;outline:0;color:#40B1D8}.imagify-tab.imagify-current a{background:#F6F7FB}.imagify-tab-content{display:none}.imagify-tab-content .imagify-modal-section:first-child{margin-top:0}.imagify-modal-sidebar-content,.imagify-payment-modal .imagify-modal-sidebar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-modal-sidebar-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}p.imagify-modal-sidebar-title{margin-top:5px;padding-right:40px;font-size:18px;color:#FFF}.imagify-modal-testimony{margin-top:1em}.imagify-modal-testimony+.imagify-modal-testimony{margin-top:2em}@media (max-height:620px){.imagify-modal-testimony+.imagify-modal-testimony{display:none}}.imagify-modal-testimony-person{display:table;width:100%}.imagify-modal-testimony-person>*{display:table-cell;vertical-align:middle}.imagify-modal-avatar{width:114px;line-height:0}.imagify-modal-avatar img{border:2px solid #FFF;border-radius:50%;width:96px;height:96px}.imagify-modal-identity a{text-decoration:none;font-weight:700}.imagify-modal-identity a:first-child{font-size:13px}.imagify-modal-identity a:first-child+a{display:block;font-size:10px;color:#7A8996}.imagify-modal-testimony-content p{font-size:13px;font-style:italic;line-height:1.7;color:#7A8996}.imagify-modal-sidebar-trust{margin-top:auto;padding-top:1.5em}.imagify-modal-sidebar-trust p{margin:0;font-weight:700;font-size:12px;line-height:1.7}.imagify-modal-sidebar-trust p img{margin-right:3px;vertical-align:-2px}.imagify-modal-sidebar-trust p+p{font-size:11px}.imagify-cart{text-align:left}.imagify-cart .imagify-cart-list{border-top:1px solid rgba(122,137,150,.2);border-bottom:1px solid rgba(122,137,150,.2)}.imagify-cart .imagify-cart-label{margin-bottom:.5em;font-size:10px;color:#2E3243}.imagify-cart-list p{margin:0;font-weight:700}.imagify-cart-item{margin:.4em 0}.imagify-cart .imagify-cart-suggestion{margin-top:-.3em}.imagify-cart-suggestion a,.imagify-cl-description p{font-size:10px}.imagify-remove-from-cart{border:0;padding:0;width:14px;height:14px;line-height:13px;border-radius:50%;background:#40B1D0;cursor:pointer;-webkit-transition:background .3s;-o-transition:background .3s;transition:background .3s}.imagify-remove-from-cart i:before{position:relative;top:-6px;left:-3px;font-size:13px;color:#FFF}.imagify-remove-from-cart:focus,.imagify-remove-from-cart:hover{background:#D0021B}.imagify-cart .imagify-cl-remove{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:45px}.imagify-cart .imagify-cl-name{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:200px}.imagify-cart .imagify-cl-description{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding-top:10px}.imagify-cart .imagify-cl-price{text-align:right}#imagify-payment-iframe{width:980px;height:672px;background:url(../images/loader-balls.svg) 50% 50% no-repeat #f6f7fb}.imagify-success-view{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.imagify-success-view p{font-weight:700;font-size:16px}.imagify-cart-emptied-item{margin:.3em auto;padding:6px 20px;background:#E6EBEF;border-radius:20px}.imagify-cart-emptied-item.imagify-cart-emptied-item p{font-weight:700}.imagify-cart-emptied-item a{color:#40b1d0;float:right;font-weight:700}
|
assets/css/sweetalert2.css
CHANGED
File without changes
|
assets/css/sweetalert2.min.css
CHANGED
File without changes
|
assets/images/big-blue-check.png
CHANGED
File without changes
|
assets/images/icon-arrow-choice.png
CHANGED
File without changes
|
assets/images/icon-arrow-choice.svg
CHANGED
File without changes
|
assets/images/icon-lock.png
CHANGED
File without changes
|
assets/images/icon-lock.svg
CHANGED
File without changes
|
assets/images/icon-pack.png
CHANGED
File without changes
|
assets/images/icon-pack.svg
CHANGED
File without changes
|
assets/images/pic-ericwaltr.jpg
CHANGED
File without changes
|
assets/images/pic-srhdesign.jpg
CHANGED
File without changes
|
assets/js/es6-promise.auto.js
CHANGED
File without changes
|
assets/js/es6-promise.auto.min.js
CHANGED
File without changes
|
assets/js/imagify.js
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
-
|
2 |
* imagify-gulpjs - version 0.0.1 - 2016-04-07
|
3 |
* WP Media <contact@wp-media.me>
|
|
|
|
|
4 |
*/
|
5 |
(function () {
|
6 |
'use strict';
|
@@ -41,7 +43,7 @@ window.ImagifyGulp = function () {
|
|
41 |
function ImagifyGulp( settings ) {
|
42 |
_classCallCheck( this, ImagifyGulp );
|
43 |
|
44 |
-
this.buffer_size =
|
45 |
this.lib_url = settings.lib;
|
46 |
this.default_thumb = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==";
|
47 |
this.images = settings.images;
|
1 |
+
/**
|
2 |
* imagify-gulpjs - version 0.0.1 - 2016-04-07
|
3 |
* WP Media <contact@wp-media.me>
|
4 |
+
*
|
5 |
+
* Note: when updating this file, don't forget to replace `this.buffer_size = 1;` by `this.buffer_size = imagifyBulk.buffer_size;`.
|
6 |
*/
|
7 |
(function () {
|
8 |
'use strict';
|
43 |
function ImagifyGulp( settings ) {
|
44 |
_classCallCheck( this, ImagifyGulp );
|
45 |
|
46 |
+
this.buffer_size = imagifyBulk.buffer_size;
|
47 |
this.lib_url = settings.lib;
|
48 |
this.default_thumb = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==";
|
49 |
this.images = settings.images;
|
assets/js/imagify.min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
!function(){"use strict";function a(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var b=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();window.ImagifyGulp=function(){function c(b){a(this,c),this.buffer_size=
|
1 |
+
!function(){"use strict";function a(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var b=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();window.ImagifyGulp=function(){function c(b){a(this,c),this.buffer_size=imagifyBulk.buffer_size,this.lib_url=b.lib,this.default_thumb="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==",this.images=b.images,this.images_ids=Object.keys(b.images),this.total_images=this.images_ids.length,this.processed_images=0,this.inprocess_images=0,this._before=function(){},this._each=function(){},this._done=function(){},this._error=function(){},this.total_original_size=0,this.total_optimized_size=0,this.total_gain=0,this.total_percent=0,this.global_original_size=0,this.global_optimized_size=0,this.global_gain=0,this.global_percent=0,this.context=b.context||"wp"}return b(c,[{key:"before",value:function(a){return this._before=a,this}},{key:"each",value:function(a){return this._each=a,this}},{key:"done",value:function(a){return this._done=a,this}},{key:"error",value:function(a){return this._error=a,this}},{key:"humanSize",value:function(a){if(0===a)return"0kb";var b=["b","kb","mb"],c=parseInt(Math.floor(Math.log(a)/Math.log(1024)));return(a/Math.pow(1024,c)).toFixed(2)+b[c]}},{key:"run",value:function(){for(var a=this.images_ids.length>this.buffer_size?this.buffer_size:this.images_ids.length,b=0;b<a;b++){var c=this.images_ids.shift();this.process(c)}return this}},{key:"process",value:function(a){this.inprocess_images++;var b={id:a,image_id:parseInt(a.toString().substr(1),10),image_src:this.images[a],filename:this.images[a].split("/").pop(),thumbnail:this.default_thumb,error:""};this.createThumb(b)}},{key:"createThumb",value:function(a){var b=this,c=new Image;c.onerror=function(){var c=a;c.id=a.image_id,b._before(c),b.send(a)},c.onload=function(){var d=c.width,e=c.height,f=1,g=0,h=0,i=null,j=null;d<e?(f=33/d,h=33,g=e*f):(f=33/e,g=33,h=d*f),i=document.createElement("canvas"),i.width=h,i.height=g,c.width=h,c.height=g,j=i.getContext("2d"),j.drawImage(this,0,0,h,g);try{a.thumbnail=i.toDataURL("image/jpeg")}catch(c){a.thumbnail=b.default_thumb}var k=a;k.id=a.image_id,b._before(k),b.send(a),i=null},c.src=a.image_src}},{key:"send",value:function(a){var b=this,c=new XMLHttpRequest,d=!1,e={},f={filename:a.filename,image:a.image_id,error:""};c.onreadystatechange=function(){if(4===this.readyState){b.processed_images++;try{e=JSON.parse(this.responseText),d=!1}catch(a){f.success=!1,f.error="Unknown error occured",d=!0}if(f.progress=Math.floor(b.processed_images/b.total_images*100),!d){var a=e.data;f.success=e.success,!0===e.success?(b.total_original_size+=a.original_size,b.total_optimized_size+=a.new_size,b.total_gain+=a.original_size-a.new_size,b.total_percent=(b.total_optimized_size/b.total_original_size*100).toFixed(2),b.global_original_size+=a.original_overall_size,b.global_optimized_size+=a.new_overall_size,b.global_gain+=a.overall_saving,b.global_percent=(100-b.global_optimized_size/b.global_optimized_size*100).toFixed(2),f.original_size=a.original_size,f.original_size_human=b.humanSize(a.original_size),f.new_size=a.new_size,f.new_size_human=b.humanSize(a.new_size),f.percent=a.percent,f.thumbnails=a.thumbnails,f.overall_saving=a.overall_saving,f.overall_saving_human=b.humanSize(a.overall_saving),f.original_overall_size=a.original_overall_size,f.original_overall_size_human=b.humanSize(a.original_overall_size)):f.error=a.error}if(b._each(f),b.inprocess_images<b.total_images&&b.process(b.images_ids.shift()),b.processed_images===b.total_images){var c=0;0!==b.global_original_size&&(c=(100-b.global_optimized_size/b.global_original_size*100).toFixed(2)),b._done({global_original_size_human:b.humanSize(b.global_original_size),global_gain_human:b.humanSize(b.global_gain),global_percent:c})}}},c.open("POST",this.lib_url,!0),c.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),c.send("image="+a.image_id+"&context="+this.context)}}]),c}()}();
|
assets/js/sweetalert2.js
CHANGED
File without changes
|
assets/js/sweetalert2.min.js
CHANGED
File without changes
|
imagify.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: Imagify
|
4 |
* Plugin URI: https://wordpress.org/plugins/imagify/
|
5 |
* Description: Dramaticaly reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth using Imagify, the new most advanced image optimization tool.
|
6 |
-
* Version: 1.6.
|
7 |
* Author: WP Media
|
8 |
* Author URI: http://wp-media.me
|
9 |
* Licence: GPLv2
|
@@ -17,7 +17,7 @@
|
|
17 |
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
18 |
|
19 |
// Imagify defines.
|
20 |
-
define( 'IMAGIFY_VERSION' , '1.6.
|
21 |
define( 'IMAGIFY_SLUG' , 'imagify' );
|
22 |
define( 'IMAGIFY_SETTINGS_SLUG' , IMAGIFY_SLUG . '_settings' );
|
23 |
define( 'IMAGIFY_WEB_MAIN' , 'https://imagify.io' );
|
3 |
* Plugin Name: Imagify
|
4 |
* Plugin URI: https://wordpress.org/plugins/imagify/
|
5 |
* Description: Dramaticaly reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth using Imagify, the new most advanced image optimization tool.
|
6 |
+
* Version: 1.6.7
|
7 |
* Author: WP Media
|
8 |
* Author URI: http://wp-media.me
|
9 |
* Licence: GPLv2
|
17 |
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
18 |
|
19 |
// Imagify defines.
|
20 |
+
define( 'IMAGIFY_VERSION' , '1.6.7' );
|
21 |
define( 'IMAGIFY_SLUG' , 'imagify' );
|
22 |
define( 'IMAGIFY_SETTINGS_SLUG' , IMAGIFY_SLUG . '_settings' );
|
23 |
define( 'IMAGIFY_WEB_MAIN' , 'https://imagify.io' );
|
inc/3rd-party/3rd-party.php
CHANGED
@@ -4,6 +4,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
|
4 |
require( IMAGIFY_3RD_PARTY_PATH . 'amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php' );
|
5 |
require( IMAGIFY_3RD_PARTY_PATH . 'enable-media-replace.php' );
|
6 |
require( IMAGIFY_3RD_PARTY_PATH . 'nextgen-gallery/nextgen-gallery.php' );
|
|
|
7 |
require( IMAGIFY_3RD_PARTY_PATH . 'wp-retina-2x.php' );
|
8 |
|
9 |
// Hosting.
|
4 |
require( IMAGIFY_3RD_PARTY_PATH . 'amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php' );
|
5 |
require( IMAGIFY_3RD_PARTY_PATH . 'enable-media-replace.php' );
|
6 |
require( IMAGIFY_3RD_PARTY_PATH . 'nextgen-gallery/nextgen-gallery.php' );
|
7 |
+
require( IMAGIFY_3RD_PARTY_PATH . 'screets-lc.php' );
|
8 |
require( IMAGIFY_3RD_PARTY_PATH . 'wp-retina-2x.php' );
|
9 |
|
10 |
// Hosting.
|
inc/3rd-party/amazon-s3-and-cloudfront/amazon-s3-and-cloudfront.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
-
if ( function_exists( 'as3cf_init' )
|
5 |
|
6 |
require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf.php' );
|
7 |
require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf-attachment.php' );
|
1 |
<?php
|
2 |
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
if ( is_admin() && ( function_exists( 'as3cf_init' ) || function_exists( 'as3cf_pro_init' ) ) ) :
|
5 |
|
6 |
require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf.php' );
|
7 |
require( dirname( __FILE__ ) . '/inc/classes/class-imagify-as3cf-attachment.php' );
|
inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf-attachment.php
CHANGED
@@ -46,15 +46,7 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
|
|
46 |
* @param int $id The attachment ID.
|
47 |
*/
|
48 |
public function __construct( $id = 0 ) {
|
49 |
-
|
50 |
-
|
51 |
-
if ( $id && is_a( $id, 'WP_Post' ) ) {
|
52 |
-
$id = $id->ID;
|
53 |
-
} elseif ( ! $id && is_object( $post ) ) {
|
54 |
-
$this->id = $post->ID;
|
55 |
-
} else {
|
56 |
-
$this->id = absint( $id );
|
57 |
-
}
|
58 |
|
59 |
$this->optimization_state_transient = 'imagify-async-in-progress-' . $this->id;
|
60 |
}
|
@@ -592,7 +584,7 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
|
|
592 |
* This means we'll follow AS3CF settings to know if the local files must be sent to S3 and/or deleted.
|
593 |
*/
|
594 |
$this->use_s3_settings = true;
|
595 |
-
$this->delete_files = $as3cf->get_setting( '
|
596 |
|
597 |
return $metadata;
|
598 |
}
|
@@ -605,7 +597,7 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
|
|
605 |
*/
|
606 |
$metadata = wp_get_attachment_metadata( $this->id, true );
|
607 |
$this->use_s3_settings = false;
|
608 |
-
$this->delete_files = isset( $metadata['filesize'] );
|
609 |
|
610 |
return $metadata;
|
611 |
}
|
@@ -675,7 +667,9 @@ class Imagify_AS3CF_Attachment extends Imagify_Attachment {
|
|
675 |
}
|
676 |
|
677 |
$filesystem = imagify_get_filesystem();
|
678 |
-
$
|
|
|
|
|
679 |
|
680 |
// Retrieve file from S3.
|
681 |
$as3cf->plugin_compat->copy_s3_file_to_server( $s3_object, $file_path );
|
46 |
* @param int $id The attachment ID.
|
47 |
*/
|
48 |
public function __construct( $id = 0 ) {
|
49 |
+
parent::__construct( $id );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
51 |
$this->optimization_state_transient = 'imagify-async-in-progress-' . $this->id;
|
52 |
}
|
584 |
* This means we'll follow AS3CF settings to know if the local files must be sent to S3 and/or deleted.
|
585 |
*/
|
586 |
$this->use_s3_settings = true;
|
587 |
+
$this->delete_files = $as3cf->get_setting( 'remove-local-file' ) && $this->can_send_to_s3();
|
588 |
|
589 |
return $metadata;
|
590 |
}
|
597 |
*/
|
598 |
$metadata = wp_get_attachment_metadata( $this->id, true );
|
599 |
$this->use_s3_settings = false;
|
600 |
+
$this->delete_files = isset( $metadata['filesize'] ) && $this->can_send_to_s3();
|
601 |
|
602 |
return $metadata;
|
603 |
}
|
667 |
}
|
668 |
|
669 |
$filesystem = imagify_get_filesystem();
|
670 |
+
$directory = dirname( $s3_object['key'] );
|
671 |
+
$directory = '.' === $directory || '' === $directory ? '' : $directory . '/';
|
672 |
+
$s3_object['key'] = $directory . wp_basename( $file_path );
|
673 |
|
674 |
// Retrieve file from S3.
|
675 |
$as3cf->plugin_compat->copy_s3_file_to_server( $s3_object, $file_path );
|
inc/3rd-party/amazon-s3-and-cloudfront/inc/classes/class-imagify-as3cf.php
CHANGED
@@ -83,6 +83,16 @@ class Imagify_AS3CF {
|
|
83 |
*/
|
84 |
add_filter( 'imagify_optimize_attachment_context', array( $this, 'optimize_attachment_context' ), 10, 2 );
|
85 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
/**
|
87 |
* Automatic optimisation.
|
88 |
*/
|
@@ -123,6 +133,140 @@ class Imagify_AS3CF {
|
|
123 |
return $context;
|
124 |
}
|
125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
126 |
|
127 |
/** ----------------------------------------------------------------------------------------- */
|
128 |
/** AUTOMATIC OPTIMIZATION: OPTIMIZE AFTER S3 HAS DONE ITS WORK ============================= */
|
@@ -235,7 +379,7 @@ class Imagify_AS3CF {
|
|
235 |
|
236 |
// Some specifics for the image editor.
|
237 |
if ( ! empty( $_POST['data']['do'] ) ) {
|
238 |
-
$optimization_level = (
|
239 |
|
240 |
// Remove old optimization data.
|
241 |
$attachment->delete_imagify_data();
|
83 |
*/
|
84 |
add_filter( 'imagify_optimize_attachment_context', array( $this, 'optimize_attachment_context' ), 10, 2 );
|
85 |
|
86 |
+
/**
|
87 |
+
* Bulk optimization.
|
88 |
+
*/
|
89 |
+
add_action( 'imagify_bulk_optimize_before_file_existence_tests', array( $this, 'maybe_copy_files_from_s3' ), 8, 3 );
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Stats.
|
93 |
+
*/
|
94 |
+
add_filter( 'imagify_total_attachment_filesize', array( $this, 'add_stats_for_s3_files' ), 8, 4 );
|
95 |
+
|
96 |
/**
|
97 |
* Automatic optimisation.
|
98 |
*/
|
133 |
return $context;
|
134 |
}
|
135 |
|
136 |
+
/**
|
137 |
+
* When getting all unoptimized attachment ids before performing a bulk optimization, download the missing files from S3.
|
138 |
+
*
|
139 |
+
* @since 1.6.7
|
140 |
+
* @author Grégory Viguier
|
141 |
+
*
|
142 |
+
* @param array $ids An array of attachment IDs.
|
143 |
+
* @param array $results An array of the data fetched from the database.
|
144 |
+
* @param int $optimization_level The optimization level that will be used for the optimization.
|
145 |
+
*/
|
146 |
+
public function maybe_copy_files_from_s3( $ids, $results, $optimization_level ) {
|
147 |
+
global $wpdb, $as3cf;
|
148 |
+
|
149 |
+
if ( ! $as3cf->is_plugin_setup() ) {
|
150 |
+
return;
|
151 |
+
}
|
152 |
+
|
153 |
+
// Remove from the list files that exist.
|
154 |
+
$ids = array_flip( $ids );
|
155 |
+
|
156 |
+
foreach ( $ids as $id => $i ) {
|
157 |
+
$file_path = get_imagify_attached_file( $results['filenames'][ $id ] );
|
158 |
+
|
159 |
+
/** This filter is documented in inc/functions/process.php. */
|
160 |
+
$file_path = apply_filters( 'imagify_file_path', $file_path, $id, 'as3cf_maybe_copy_files_from_s3' );
|
161 |
+
|
162 |
+
if ( ! $file_path || file_exists( $file_path ) ) {
|
163 |
+
// The file exists, no need to retrieve it from S3.
|
164 |
+
unset( $ids[ $id ] );
|
165 |
+
} else {
|
166 |
+
$ids[ $id ] = $file_path;
|
167 |
+
}
|
168 |
+
}
|
169 |
+
|
170 |
+
if ( ! $ids ) {
|
171 |
+
// All files are already on the server.
|
172 |
+
return;
|
173 |
+
}
|
174 |
+
|
175 |
+
// Determine which files are on S3.
|
176 |
+
$ids = array_flip( $ids );
|
177 |
+
$sql_ids = implode( ',', $ids );
|
178 |
+
|
179 |
+
$s3_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
180 |
+
"SELECT pm.post_id as id, pm.meta_value as value
|
181 |
+
FROM $wpdb->postmeta as pm
|
182 |
+
WHERE pm.meta_key = 'amazonS3_info'
|
183 |
+
AND pm.post_id IN ( $sql_ids )
|
184 |
+
ORDER BY pm.post_id DESC",
|
185 |
+
ARRAY_A
|
186 |
+
);
|
187 |
+
|
188 |
+
$wpdb->flush();
|
189 |
+
|
190 |
+
if ( ! $s3_data ) {
|
191 |
+
return;
|
192 |
+
}
|
193 |
+
|
194 |
+
unset( $sql_ids );
|
195 |
+
$s3_data = imagify_query_results_combine( $ids, $s3_data, true );
|
196 |
+
|
197 |
+
// Retrieve the missing files from S3.
|
198 |
+
$ids = array_flip( $ids );
|
199 |
+
|
200 |
+
foreach ( $s3_data as $id => $s3_object ) {
|
201 |
+
$s3_object = maybe_unserialize( $s3_object );
|
202 |
+
$file_path = $ids[ $id ];
|
203 |
+
|
204 |
+
$attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
|
205 |
+
$attachment_status = isset( $results['statuses'][ $id ] ) ? $results['statuses'][ $id ] : false;
|
206 |
+
$attachment_optimization_level = isset( $results['optimization_levels'][ $id ] ) ? $results['optimization_levels'][ $id ] : false;
|
207 |
+
|
208 |
+
// Don't try to re-optimize if there is no backup file.
|
209 |
+
if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
|
210 |
+
unset( $s3_data[ $id ], $ids[ $id ] );
|
211 |
+
continue;
|
212 |
+
}
|
213 |
+
|
214 |
+
$directory = dirname( $s3_object['key'] );
|
215 |
+
$directory = '.' === $directory || '' === $directory ? '' : $directory . '/';
|
216 |
+
$s3_object['key'] = $directory . wp_basename( $file_path );
|
217 |
+
|
218 |
+
// Retrieve file from S3.
|
219 |
+
$as3cf->plugin_compat->copy_s3_file_to_server( $s3_object, $file_path );
|
220 |
+
|
221 |
+
unset( $s3_data[ $id ], $ids[ $id ] );
|
222 |
+
}
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
* Provide the file sizes and the number of thumbnails for files that are only on S3.
|
227 |
+
*
|
228 |
+
* @since 1.6.7
|
229 |
+
* @author Grégory Viguier
|
230 |
+
*
|
231 |
+
* @param bool $size_and_count False by default.
|
232 |
+
* @param int $image_id The attachment ID.
|
233 |
+
* @param array $files An array of file paths with thumbnail sizes as keys.
|
234 |
+
* @param array $image_ids An array of all attachment IDs.
|
235 |
+
* @return bool|array False by default. Provide an array with the keys 'filesize' (containing the total filesize) and 'thumbnails' (containing the number of thumbnails).
|
236 |
+
*/
|
237 |
+
function add_stats_for_s3_files( $size_and_count, $image_id, $files, $image_ids ) {
|
238 |
+
static $data;
|
239 |
+
|
240 |
+
if ( is_array( $size_and_count ) ) {
|
241 |
+
return $size_and_count;
|
242 |
+
}
|
243 |
+
|
244 |
+
if ( file_exists( $files['full'] ) ) {
|
245 |
+
// If the full size is on the server, that probably means all files are on the server too.
|
246 |
+
return $size_and_count;
|
247 |
+
}
|
248 |
+
|
249 |
+
if ( ! isset( $data ) ) {
|
250 |
+
$data = imagify_get_wpdb_metas( array(
|
251 |
+
// Get the filesizes.
|
252 |
+
's3_filesize' => 'wpos3_filesize_total',
|
253 |
+
), $image_ids );
|
254 |
+
|
255 |
+
$data = array_map( 'absint', $data['s3_filesize'] );
|
256 |
+
}
|
257 |
+
|
258 |
+
if ( empty( $data[ $image_id ] ) ) {
|
259 |
+
// The file is not on S3.
|
260 |
+
return $size_and_count;
|
261 |
+
}
|
262 |
+
|
263 |
+
// We can't take the disallowed sizes into account here.
|
264 |
+
return array(
|
265 |
+
'filesize' => (int) $data[ $image_id ],
|
266 |
+
'thumbnails' => count( $files ) - 1,
|
267 |
+
);
|
268 |
+
}
|
269 |
+
|
270 |
|
271 |
/** ----------------------------------------------------------------------------------------- */
|
272 |
/** AUTOMATIC OPTIMIZATION: OPTIMIZE AFTER S3 HAS DONE ITS WORK ============================= */
|
379 |
|
380 |
// Some specifics for the image editor.
|
381 |
if ( ! empty( $_POST['data']['do'] ) ) {
|
382 |
+
$optimization_level = $attachment->get_optimization_level();
|
383 |
|
384 |
// Remove old optimization data.
|
385 |
$attachment->delete_imagify_data();
|
inc/3rd-party/enable-media-replace.php
CHANGED
File without changes
|
inc/3rd-party/hosting/wpengine.php
CHANGED
@@ -3,14 +3,18 @@ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
|
3 |
|
4 |
if ( class_exists( 'WpeCommon' ) ) :
|
5 |
|
6 |
-
add_filter( 'imagify_unoptimized_attachment_limit', '
|
|
|
7 |
/**
|
8 |
-
*
|
9 |
*
|
10 |
* @since 1.4.7
|
|
|
11 |
* @author Jonathan Buttigieg
|
|
|
|
|
12 |
*/
|
13 |
-
function
|
14 |
return 2500;
|
15 |
}
|
16 |
|
3 |
|
4 |
if ( class_exists( 'WpeCommon' ) ) :
|
5 |
|
6 |
+
add_filter( 'imagify_unoptimized_attachment_limit', '_imagify_wpengine_unoptimized_attachment_limit' );
|
7 |
+
add_filter( 'imagify_count_saving_data_limit', '_imagify_wpengine_unoptimized_attachment_limit' );
|
8 |
/**
|
9 |
+
* Change the limit for the number of posts: WP Engine limits SQL queries size to 2048 octets (16384 characters).
|
10 |
*
|
11 |
* @since 1.4.7
|
12 |
+
* @since 1.6.7 Renamed (and deprecated) _imagify_wengine_unoptimized_attachment_limit() into _imagify_wpengine_unoptimized_attachment_limit().
|
13 |
* @author Jonathan Buttigieg
|
14 |
+
*
|
15 |
+
* @return int
|
16 |
*/
|
17 |
+
function _imagify_wpengine_unoptimized_attachment_limit() {
|
18 |
return 2500;
|
19 |
}
|
20 |
|
inc/3rd-party/nextgen-gallery/inc/admin/ajax.php
CHANGED
@@ -58,12 +58,13 @@ function _do_wp_ajax_imagify_ngg_get_unoptimized_attachment_ids() {
|
|
58 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
59 |
|
60 |
foreach ( $images as $image ) {
|
61 |
-
$id
|
|
|
62 |
|
63 |
/** This filter is documented in inc/functions/process.php. */
|
64 |
-
$file_path = apply_filters( 'imagify_file_path', $
|
65 |
|
66 |
-
if ( ! file_exists( $file_path ) ) {
|
67 |
continue;
|
68 |
}
|
69 |
|
58 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
59 |
|
60 |
foreach ( $images as $image ) {
|
61 |
+
$id = absint( $image['id'] );
|
62 |
+
$file_path = $storage->get_image_abspath( $id );
|
63 |
|
64 |
/** This filter is documented in inc/functions/process.php. */
|
65 |
+
$file_path = apply_filters( 'imagify_file_path', $file_path );
|
66 |
|
67 |
+
if ( ! $file_path || ! file_exists( $file_path ) ) {
|
68 |
continue;
|
69 |
}
|
70 |
|
inc/3rd-party/nextgen-gallery/inc/admin/bulk.php
CHANGED
@@ -18,5 +18,5 @@ function _imagify_ngg_update_bulk_stats() {
|
|
18 |
add_filter( 'imagify_count_error_attachments' , 'imagify_ngg_count_error_attachments' );
|
19 |
add_filter( 'imagify_count_unoptimized_attachments' , 'imagify_ngg_count_unoptimized_attachments' );
|
20 |
add_filter( 'imagify_percent_optimized_attachments' , 'imagify_ngg_percent_optimized_attachments' );
|
21 |
-
add_filter( 'imagify_count_saving_data' , 'imagify_ngg_count_saving_data' );
|
22 |
}
|
18 |
add_filter( 'imagify_count_error_attachments' , 'imagify_ngg_count_error_attachments' );
|
19 |
add_filter( 'imagify_count_unoptimized_attachments' , 'imagify_ngg_count_unoptimized_attachments' );
|
20 |
add_filter( 'imagify_percent_optimized_attachments' , 'imagify_ngg_percent_optimized_attachments' );
|
21 |
+
add_filter( 'imagify_count_saving_data' , 'imagify_ngg_count_saving_data', 8 );
|
22 |
}
|
inc/3rd-party/nextgen-gallery/inc/admin/db.php
CHANGED
File without changes
|
inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php
CHANGED
File without changes
|
inc/3rd-party/nextgen-gallery/inc/admin/gallery.php
CHANGED
File without changes
|
inc/3rd-party/nextgen-gallery/inc/admin/heartbeat.php
CHANGED
@@ -18,7 +18,7 @@ function _imagify_ngg_heartbeat_received( $response, $data ) {
|
|
18 |
return $response;
|
19 |
}
|
20 |
|
21 |
-
add_filter( 'imagify_count_saving_data', 'imagify_ngg_count_saving_data' );
|
22 |
$saving_data = imagify_count_saving_data();
|
23 |
$user = new Imagify_User();
|
24 |
|
18 |
return $response;
|
19 |
}
|
20 |
|
21 |
+
add_filter( 'imagify_count_saving_data', 'imagify_ngg_count_saving_data', 8 );
|
22 |
$saving_data = imagify_count_saving_data();
|
23 |
$user = new Imagify_User();
|
24 |
|
inc/3rd-party/nextgen-gallery/inc/admin/menu.php
CHANGED
File without changes
|
inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-attachment.php
CHANGED
@@ -50,10 +50,11 @@ class Imagify_NGG_Attachment extends Imagify_Attachment {
|
|
50 |
$this->image = $id;
|
51 |
$this->id = $id->pid;
|
52 |
} else {
|
53 |
-
$this->image = nggdb::find_image( (
|
54 |
$this->id = $this->image->pid;
|
55 |
}
|
56 |
|
|
|
57 |
$this->row = $this->get_row();
|
58 |
|
59 |
// Load nggAdmin class.
|
50 |
$this->image = $id;
|
51 |
$this->id = $id->pid;
|
52 |
} else {
|
53 |
+
$this->image = nggdb::find_image( absint( $id ) );
|
54 |
$this->id = $this->image->pid;
|
55 |
}
|
56 |
|
57 |
+
$this->id = absint( $this->id );
|
58 |
$this->row = $this->get_row();
|
59 |
|
60 |
// Load nggAdmin class.
|
inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-db.php
CHANGED
File without changes
|
inc/3rd-party/nextgen-gallery/inc/common/attachments.php
CHANGED
File without changes
|
inc/3rd-party/nextgen-gallery/inc/functions/admin-stats.php
CHANGED
@@ -87,21 +87,108 @@ function imagify_ngg_percent_optimized_attachments() {
|
|
87 |
$total_attachments = imagify_ngg_count_attachments();
|
88 |
$total_optimized_attachments = imagify_ngg_count_optimized_attachments();
|
89 |
|
90 |
-
return
|
91 |
}
|
92 |
|
93 |
/**
|
94 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
95 |
*
|
96 |
-
* @since
|
|
|
97 |
* @author Jonathan Buttigieg
|
98 |
*
|
99 |
-
* @
|
|
|
100 |
*/
|
101 |
-
function imagify_ngg_count_saving_data() {
|
102 |
global $wpdb;
|
103 |
|
104 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
|
106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
}
|
87 |
$total_attachments = imagify_ngg_count_attachments();
|
88 |
$total_optimized_attachments = imagify_ngg_count_optimized_attachments();
|
89 |
|
90 |
+
return $total_attachments && $total_optimized_attachments ? round( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) : 0;
|
91 |
}
|
92 |
|
93 |
/**
|
94 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
95 |
*
|
96 |
+
* @since 1.5
|
97 |
+
* @since 1.6.7 Revamped to handle huge libraries.
|
98 |
* @author Jonathan Buttigieg
|
99 |
*
|
100 |
+
* @param bool|array $attachments An array containing the keys 'count', 'original_size', and 'optimized_size', or an array of attachments (back compat', deprecated), or false.
|
101 |
+
* @return array An array containing the keys 'count', 'original_size', and 'optimized_size'.
|
102 |
*/
|
103 |
+
function imagify_ngg_count_saving_data( $attachments ) {
|
104 |
global $wpdb;
|
105 |
|
106 |
+
if ( is_array( $attachments ) ) {
|
107 |
+
return $attachments;
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Filter the query to get all optimized NGG attachments.
|
112 |
+
* 3rd party will be able to override the result.
|
113 |
+
*
|
114 |
+
* @since 1.6.7
|
115 |
+
*
|
116 |
+
* @param bool|array $attachments An array containing the keys ('count', 'original_size', and 'optimized_size'), or false.
|
117 |
+
*/
|
118 |
+
$attachments = apply_filters( 'imagify_ngg_count_saving_data', false );
|
119 |
+
|
120 |
+
if ( is_array( $attachments ) ) {
|
121 |
+
return $attachments;
|
122 |
+
}
|
123 |
|
124 |
+
$table_name = $wpdb->ngg_imagify_data;
|
125 |
+
$original_size = 0;
|
126 |
+
$optimized_size = 0;
|
127 |
+
$count = 0;
|
128 |
+
|
129 |
+
/** This filter is documented in /inc/functions/admin-stats.php */
|
130 |
+
$limit = apply_filters( 'imagify_count_saving_data_limit', 15000 );
|
131 |
+
$limit = absint( $limit );
|
132 |
+
$offset = 0;
|
133 |
+
|
134 |
+
$attachments = $wpdb->get_col( // WPCS: unprepared SQL ok.
|
135 |
+
"SELECT $table_name.data
|
136 |
+
FROM {$wpdb->ngg_imagify_data}
|
137 |
+
WHERE status = 'success'
|
138 |
+
LIMIT $offset, $limit"
|
139 |
+
);
|
140 |
+
$wpdb->flush();
|
141 |
+
|
142 |
+
while ( $attachments ) {
|
143 |
+
$attachments = array_map( 'maybe_unserialize', $attachments );
|
144 |
+
|
145 |
+
foreach ( $attachments as $attachment_data ) {
|
146 |
+
if ( ! $attachment_data ) {
|
147 |
+
continue;
|
148 |
+
}
|
149 |
+
|
150 |
+
++$count;
|
151 |
+
$original_data = $attachment_data['sizes']['full'];
|
152 |
+
|
153 |
+
// Increment the original sizes.
|
154 |
+
$original_size += $original_data['original_size'] ? $original_data['original_size'] : 0;
|
155 |
+
$optimized_size += $original_data['optimized_size'] ? $original_data['optimized_size'] : 0;
|
156 |
+
|
157 |
+
unset( $attachment_data['sizes']['full'], $original_data );
|
158 |
+
|
159 |
+
// Increment the thumbnails sizes.
|
160 |
+
foreach ( $attachment_data['sizes'] as $size_data ) {
|
161 |
+
if ( ! empty( $size_data['success'] ) ) {
|
162 |
+
$original_size += $size_data['original_size'] ? $size_data['original_size'] : 0;
|
163 |
+
$optimized_size += $size_data['optimized_size'] ? $size_data['optimized_size'] : 0;
|
164 |
+
}
|
165 |
+
}
|
166 |
+
|
167 |
+
unset( $size_data );
|
168 |
+
}
|
169 |
+
|
170 |
+
unset( $attachment_data );
|
171 |
+
|
172 |
+
if ( count( $attachments ) === $limit ) {
|
173 |
+
// Unless we are really unlucky, we still have attachments to fetch.
|
174 |
+
$offset += $limit;
|
175 |
+
|
176 |
+
$attachments = $wpdb->get_col( // WPCS: unprepared SQL ok.
|
177 |
+
"SELECT $table_name.data
|
178 |
+
FROM {$wpdb->ngg_imagify_data}
|
179 |
+
WHERE status = 'success'
|
180 |
+
LIMIT $offset, $limit"
|
181 |
+
);
|
182 |
+
$wpdb->flush();
|
183 |
+
} else {
|
184 |
+
// Save one request, don't go back to the beginning of the loop.
|
185 |
+
$attachments = array();
|
186 |
+
}
|
187 |
+
} // End while().
|
188 |
+
|
189 |
+
return array(
|
190 |
+
'count' => $count,
|
191 |
+
'original_size' => $original_size,
|
192 |
+
'optimized_size' => $optimized_size,
|
193 |
+
);
|
194 |
}
|
inc/3rd-party/screets-lc.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
if ( function_exists( 'fn_lc_fix_ssl_upload_url' ) && defined( 'SLC_VERSION' ) && version_compare( SLC_VERSION, '2.2.8' ) < 0 ) :
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Fixes a bug in Screets Live Chat plugin (prior version 2.2.8), preventing wp_get_upload_dir() to work properly.
|
8 |
+
*/
|
9 |
+
remove_filter( 'upload_dir', 'fn_lc_fix_ssl_upload_url' );
|
10 |
+
add_filter( 'upload_dir', 'imagify_screets_lc_fix_ssl_upload_url' );
|
11 |
+
/**
|
12 |
+
* Filters the uploads directory data to force https URLs.
|
13 |
+
*
|
14 |
+
* @since 1.6.7
|
15 |
+
* @author Grégory Viguier
|
16 |
+
*
|
17 |
+
* @param array $uploads Array of upload directory data with keys of 'path', 'url', 'subdir, 'basedir', 'baseurl', and 'error'.
|
18 |
+
* @return array
|
19 |
+
*/
|
20 |
+
function imagify_screets_lc_fix_ssl_upload_url( $uploads ) {
|
21 |
+
if ( false !== $uploads['error'] || ! is_ssl() ) {
|
22 |
+
return $uploads;
|
23 |
+
}
|
24 |
+
|
25 |
+
$uploads['url'] = str_replace( 'http://', 'https://', $uploads['url'] );
|
26 |
+
$uploads['baseurl'] = str_replace( 'http://', 'https://', $uploads['baseurl'] );
|
27 |
+
|
28 |
+
return $uploads;
|
29 |
+
}
|
30 |
+
|
31 |
+
endif;
|
inc/admin/ajax.php
CHANGED
@@ -292,27 +292,9 @@ function _do_wp_ajax_imagify_get_unoptimized_attachment_ids() {
|
|
292 |
|
293 |
@set_time_limit( 0 );
|
294 |
|
|
|
295 |
$optimization_level = (int) $_GET['optimization_level'];
|
296 |
-
$optimization_level = ( -1 !== $optimization_level ) ? $optimization_level : get_imagify_option( 'optimization_level', 1 );
|
297 |
-
$optimization_level = (int) $optimization_level;
|
298 |
-
|
299 |
-
$meta_query = array(
|
300 |
-
'relation' => 'OR',
|
301 |
-
array(
|
302 |
-
'key' => '_imagify_optimization_level',
|
303 |
-
'value' => $optimization_level,
|
304 |
-
'compare' => '!=',
|
305 |
-
),
|
306 |
-
array(
|
307 |
-
'key' => '_imagify_optimization_level',
|
308 |
-
'compare' => 'NOT EXISTS',
|
309 |
-
),
|
310 |
-
array(
|
311 |
-
'key' => '_imagify_status',
|
312 |
-
'value' => 'error',
|
313 |
-
'compare' => '=',
|
314 |
-
),
|
315 |
-
);
|
316 |
|
317 |
/**
|
318 |
* Filter the unoptimized attachments limit query.
|
@@ -321,131 +303,143 @@ function _do_wp_ajax_imagify_get_unoptimized_attachment_ids() {
|
|
321 |
*
|
322 |
* @param int The limit (-1 for unlimited).
|
323 |
*/
|
324 |
-
$unoptimized_attachment_limit = apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
338 |
|
339 |
-
$
|
340 |
-
|
341 |
-
$ids
|
342 |
-
$ids = array_filter( (array) $ids );
|
343 |
-
$sql_ids = implode( ',', $ids );
|
344 |
|
345 |
-
if (
|
346 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
347 |
}
|
348 |
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
$attachments_filename = imagify_query_results_combine( $ids, $attachments_filename );
|
360 |
-
|
361 |
-
// Get attachments data.
|
362 |
-
$attachments_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
363 |
-
"SELECT pm.post_id as id, pm.meta_value as value
|
364 |
-
FROM $wpdb->postmeta as pm
|
365 |
-
WHERE pm.meta_key = '_imagify_data'
|
366 |
-
AND pm.post_id IN ($sql_ids)
|
367 |
-
ORDER BY pm.post_id DESC",
|
368 |
-
ARRAY_A
|
369 |
-
);
|
370 |
-
|
371 |
-
$attachments_data = imagify_query_results_combine( $ids, $attachments_data );
|
372 |
-
$attachments_data = array_map( 'maybe_unserialize', $attachments_data );
|
373 |
-
|
374 |
-
// Get attachments optimization level.
|
375 |
-
$attachments_optimization_level = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
376 |
-
"SELECT pm.post_id as id, pm.meta_value as value
|
377 |
-
FROM $wpdb->postmeta as pm
|
378 |
-
WHERE pm.meta_key = '_imagify_optimization_level'
|
379 |
-
AND pm.post_id IN ($sql_ids)
|
380 |
-
ORDER BY pm.post_id DESC",
|
381 |
-
ARRAY_A
|
382 |
-
);
|
383 |
-
|
384 |
-
$attachments_optimization_level = imagify_query_results_combine( $ids, $attachments_optimization_level );
|
385 |
-
|
386 |
-
// Get attachments status.
|
387 |
-
$attachments_status = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
388 |
-
"SELECT pm.post_id as id, pm.meta_value as value
|
389 |
-
FROM $wpdb->postmeta as pm
|
390 |
-
WHERE pm.meta_key = '_imagify_status'
|
391 |
-
AND pm.post_id IN ($sql_ids)
|
392 |
-
ORDER BY pm.post_id DESC",
|
393 |
-
ARRAY_A
|
394 |
-
);
|
395 |
-
|
396 |
-
$attachments_status = imagify_query_results_combine( $ids, $attachments_status );
|
397 |
|
398 |
// Save the optimization level in a transient to retrieve it later during the process.
|
399 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
400 |
|
401 |
-
|
402 |
-
|
403 |
-
$
|
|
|
|
|
404 |
|
405 |
-
if (
|
406 |
-
|
407 |
}
|
408 |
|
409 |
-
$attachment_data = isset( $attachments_data[ $id ] ) ? $attachments_data[ $id ] : false;
|
410 |
-
$attachment_error = '';
|
411 |
-
|
412 |
-
if ( isset( $attachment_data['sizes']['full']['error'] ) ) {
|
413 |
-
$attachment_error = $attachment_data['sizes']['full']['error'];
|
414 |
-
}
|
415 |
-
|
416 |
-
$attachment_error = trim( $attachment_error );
|
417 |
-
$attachment_status = isset( $attachments_status[ $id ] ) ? $attachments_status[ $id ] : false;
|
418 |
-
$attachment_optimization_level = isset( $attachments_optimization_level[ $id ] ) ? $attachments_optimization_level[ $id ] : false;
|
419 |
-
$attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
|
420 |
-
|
421 |
// Don't try to re-optimize if the optimization level is still the same.
|
422 |
if ( $optimization_level === $attachment_optimization_level && is_string( $attachment_error ) ) {
|
423 |
-
|
424 |
-
}
|
425 |
-
|
426 |
-
// Don't try to re-optimize if there is no backup file.
|
427 |
-
if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
|
428 |
continue;
|
429 |
}
|
430 |
|
431 |
// Don't try to re-optimize images already compressed.
|
432 |
if ( 'already_optimized' === $attachment_status && $attachment_optimization_level >= $optimization_level ) {
|
|
|
433 |
continue;
|
434 |
}
|
435 |
|
|
|
|
|
436 |
// Don't try to re-optimize images with an empty error message.
|
437 |
if ( 'error' === $attachment_status && empty( $attachment_error ) ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
438 |
continue;
|
439 |
}
|
440 |
|
441 |
-
$data[ '_' . $id ] = get_imagify_attachment_url( $
|
442 |
} // End foreach().
|
443 |
|
444 |
-
if ( $data ) {
|
445 |
-
|
446 |
}
|
447 |
|
448 |
-
|
449 |
}
|
450 |
|
451 |
/** --------------------------------------------------------------------------------------------- */
|
292 |
|
293 |
@set_time_limit( 0 );
|
294 |
|
295 |
+
// Get (ordered) IDs.
|
296 |
$optimization_level = (int) $_GET['optimization_level'];
|
297 |
+
$optimization_level = ( -1 !== $optimization_level ) ? $optimization_level : (int) get_imagify_option( 'optimization_level', 1 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
298 |
|
299 |
/**
|
300 |
* Filter the unoptimized attachments limit query.
|
303 |
*
|
304 |
* @param int The limit (-1 for unlimited).
|
305 |
*/
|
306 |
+
$unoptimized_attachment_limit = (int) apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
|
307 |
+
$unoptimized_attachment_limit = -1 === $unoptimized_attachment_limit ? PHP_INT_MAX : $unoptimized_attachment_limit;
|
308 |
+
|
309 |
+
$mime_types = get_imagify_mime_type();
|
310 |
+
$mime_types = esc_sql( $mime_types );
|
311 |
+
$mime_types = "'" . implode( "','", $mime_types ) . "'";
|
312 |
+
|
313 |
+
$ids = $wpdb->get_col( $wpdb->prepare( // WPCS: unprepared SQL ok.
|
314 |
+
"SELECT $wpdb->posts.ID
|
315 |
+
FROM $wpdb->posts
|
316 |
+
LEFT JOIN $wpdb->postmeta
|
317 |
+
ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = '_imagify_optimization_level' )
|
318 |
+
LEFT JOIN $wpdb->postmeta AS mt1
|
319 |
+
ON ( $wpdb->posts.ID = mt1.post_id AND mt1.meta_key = '_imagify_status' )
|
320 |
+
WHERE
|
321 |
+
$wpdb->posts.post_mime_type IN ( $mime_types )
|
322 |
+
AND (
|
323 |
+
$wpdb->postmeta.meta_value != '%d'
|
324 |
+
OR
|
325 |
+
$wpdb->postmeta.post_id IS NULL
|
326 |
+
OR
|
327 |
+
mt1.meta_value = 'error'
|
328 |
+
)
|
329 |
+
AND $wpdb->posts.post_type = 'attachment'
|
330 |
+
AND $wpdb->posts.post_status <> 'trash'
|
331 |
+
AND $wpdb->posts.post_status <> 'auto-draft'
|
332 |
+
GROUP BY $wpdb->posts.ID
|
333 |
+
ORDER BY
|
334 |
+
CASE mt1.meta_value
|
335 |
+
WHEN 'already_optimized' THEN 2
|
336 |
+
ELSE 1
|
337 |
+
END ASC,
|
338 |
+
$wpdb->posts.ID DESC
|
339 |
+
LIMIT 0, %d",
|
340 |
+
$optimization_level,
|
341 |
+
$unoptimized_attachment_limit
|
342 |
+
) );
|
343 |
|
344 |
+
$wpdb->flush();
|
345 |
+
unset( $unoptimized_attachment_limit, $mime_types );
|
346 |
+
$ids = array_filter( array_map( 'absint', $ids ) );
|
|
|
|
|
347 |
|
348 |
+
if ( ! $ids ) {
|
349 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
350 |
}
|
351 |
|
352 |
+
$results = imagify_get_wpdb_metas( array(
|
353 |
+
// Get attachments filename.
|
354 |
+
'filenames' => '_wp_attached_file',
|
355 |
+
// Get attachments data.
|
356 |
+
'data' => '_imagify_data',
|
357 |
+
// Get attachments optimization level.
|
358 |
+
'optimization_levels' => '_imagify_optimization_level',
|
359 |
+
// Get attachments status.
|
360 |
+
'statuses' => '_imagify_status',
|
361 |
+
), $ids );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
362 |
|
363 |
// Save the optimization level in a transient to retrieve it later during the process.
|
364 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
365 |
|
366 |
+
// First run.
|
367 |
+
foreach ( $ids as $i => $id ) {
|
368 |
+
$attachment_status = isset( $results['statuses'][ $id ] ) ? $results['statuses'][ $id ] : false;
|
369 |
+
$attachment_optimization_level = isset( $results['optimization_levels'][ $id ] ) ? $results['optimization_levels'][ $id ] : false;
|
370 |
+
$attachment_error = '';
|
371 |
|
372 |
+
if ( isset( $results['data'][ $id ]['sizes']['full']['error'] ) ) {
|
373 |
+
$attachment_error = $results['data'][ $id ]['sizes']['full']['error'];
|
374 |
}
|
375 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
376 |
// Don't try to re-optimize if the optimization level is still the same.
|
377 |
if ( $optimization_level === $attachment_optimization_level && is_string( $attachment_error ) ) {
|
378 |
+
unset( $ids[ $i ] );
|
|
|
|
|
|
|
|
|
379 |
continue;
|
380 |
}
|
381 |
|
382 |
// Don't try to re-optimize images already compressed.
|
383 |
if ( 'already_optimized' === $attachment_status && $attachment_optimization_level >= $optimization_level ) {
|
384 |
+
unset( $ids[ $i ] );
|
385 |
continue;
|
386 |
}
|
387 |
|
388 |
+
$attachment_error = trim( $attachment_error );
|
389 |
+
|
390 |
// Don't try to re-optimize images with an empty error message.
|
391 |
if ( 'error' === $attachment_status && empty( $attachment_error ) ) {
|
392 |
+
unset( $ids[ $i ] );
|
393 |
+
}
|
394 |
+
}
|
395 |
+
|
396 |
+
if ( ! $ids ) {
|
397 |
+
wp_send_json_error( array( 'message' => 'no-images' ) );
|
398 |
+
}
|
399 |
+
|
400 |
+
$ids = array_values( $ids );
|
401 |
+
|
402 |
+
/**
|
403 |
+
* Triggered before testing for file existence.
|
404 |
+
*
|
405 |
+
* @since 1.6.7
|
406 |
+
* @author Grégory Viguier
|
407 |
+
*
|
408 |
+
* @param array $ids An array of attachment IDs.
|
409 |
+
* @param array $results An array of the data fetched from the database.
|
410 |
+
* @param int $optimization_level The optimization level that will be used for the optimization.
|
411 |
+
*/
|
412 |
+
do_action( 'imagify_bulk_optimize_before_file_existence_tests', $ids, $results, $optimization_level );
|
413 |
+
|
414 |
+
$data = array();
|
415 |
+
|
416 |
+
foreach ( $ids as $i => $id ) {
|
417 |
+
$file_path = get_imagify_attached_file( $results['filenames'][ $id ] );
|
418 |
+
|
419 |
+
/** This filter is documented in inc/functions/process.php. */
|
420 |
+
$file_path = apply_filters( 'imagify_file_path', $file_path );
|
421 |
+
|
422 |
+
if ( ! $file_path || ! file_exists( $file_path ) ) {
|
423 |
+
continue;
|
424 |
+
}
|
425 |
+
|
426 |
+
$attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
|
427 |
+
$attachment_status = isset( $results['statuses'][ $id ] ) ? $results['statuses'][ $id ] : false;
|
428 |
+
$attachment_optimization_level = isset( $results['optimization_levels'][ $id ] ) ? $results['optimization_levels'][ $id ] : false;
|
429 |
+
|
430 |
+
// Don't try to re-optimize if there is no backup file.
|
431 |
+
if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
|
432 |
continue;
|
433 |
}
|
434 |
|
435 |
+
$data[ '_' . $id ] = get_imagify_attachment_url( $results['filenames'][ $id ] );
|
436 |
} // End foreach().
|
437 |
|
438 |
+
if ( ! $data ) {
|
439 |
+
wp_send_json_error( array( 'message' => 'no-images' ) );
|
440 |
}
|
441 |
|
442 |
+
wp_send_json_success( $data );
|
443 |
}
|
444 |
|
445 |
/** --------------------------------------------------------------------------------------------- */
|
inc/admin/heartbeat.php
CHANGED
File without changes
|
inc/admin/options.php
CHANGED
@@ -107,7 +107,7 @@ add_action( 'update_option_' . IMAGIFY_SETTINGS_SLUG, '_imagify_after_save_optio
|
|
107 |
function _imagify_after_save_options( $old_value, $value ) {
|
108 |
|
109 |
if ( $old_value && $value && ( ! isset( $old_value['api_key'] ) || $old_value['api_key'] !== $value['api_key'] ) ) {
|
110 |
-
if ( is_wp_error(
|
111 |
imagify_renew_notice( 'wrong-api-key' );
|
112 |
delete_site_transient( 'imagify_check_licence_1' );
|
113 |
} else {
|
107 |
function _imagify_after_save_options( $old_value, $value ) {
|
108 |
|
109 |
if ( $old_value && $value && ( ! isset( $old_value['api_key'] ) || $old_value['api_key'] !== $value['api_key'] ) ) {
|
110 |
+
if ( is_wp_error( get_imagify_user() ) ) {
|
111 |
imagify_renew_notice( 'wrong-api-key' );
|
112 |
delete_site_transient( 'imagify_check_licence_1' );
|
113 |
} else {
|
inc/api/imagify.php
CHANGED
@@ -62,6 +62,8 @@ function fetch_imagify_image( $data ) {
|
|
62 |
/**
|
63 |
* Optimize an image by sharing its URL on Imagify.
|
64 |
*
|
|
|
|
|
65 |
* @param array $data All image data.
|
66 |
* @return object
|
67 |
*/
|
62 |
/**
|
63 |
* Optimize an image by sharing its URL on Imagify.
|
64 |
*
|
65 |
+
* @since 1.6.7 $data['image'] can contain the file path (prefered) or the result of `curl_file_create()`.
|
66 |
+
*
|
67 |
* @param array $data All image data.
|
68 |
* @return object
|
69 |
*/
|
inc/classes/abstracts/class-imagify-abstract-attachment.php
CHANGED
@@ -23,7 +23,7 @@ class Imagify_Abstract_Attachment {
|
|
23 |
* @var int
|
24 |
* @access public
|
25 |
*/
|
26 |
-
public $id;
|
27 |
|
28 |
/**
|
29 |
* The constructor.
|
@@ -33,7 +33,21 @@ class Imagify_Abstract_Attachment {
|
|
33 |
* @param int $id The attachment ID.
|
34 |
* @return void
|
35 |
*/
|
36 |
-
public function __construct( $id = 0 ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
|
38 |
/**
|
39 |
* Get the attachment backup filepath.
|
23 |
* @var int
|
24 |
* @access public
|
25 |
*/
|
26 |
+
public $id = 0;
|
27 |
|
28 |
/**
|
29 |
* The constructor.
|
33 |
* @param int $id The attachment ID.
|
34 |
* @return void
|
35 |
*/
|
36 |
+
public function __construct( $id = 0 ) {
|
37 |
+
global $post;
|
38 |
+
|
39 |
+
if ( $id ) {
|
40 |
+
if ( is_a( $id, 'WP_Post' ) ) {
|
41 |
+
$this->id = $id->ID;
|
42 |
+
} elseif ( is_numeric( $id ) ) {
|
43 |
+
$this->id = $id;
|
44 |
+
}
|
45 |
+
} elseif ( $post && is_a( $post, 'WP_Post' ) ) {
|
46 |
+
$this->id = $post->ID;
|
47 |
+
}
|
48 |
+
|
49 |
+
$this->id = absint( $this->id );
|
50 |
+
}
|
51 |
|
52 |
/**
|
53 |
* Get the attachment backup filepath.
|
inc/classes/abstracts/class-imagify-abstract-db.php
CHANGED
File without changes
|
inc/classes/class-imagify-attachment.php
CHANGED
@@ -15,24 +15,6 @@ class Imagify_Attachment extends Imagify_Abstract_Attachment {
|
|
15 |
*/
|
16 |
const VERSION = '1.0.2';
|
17 |
|
18 |
-
/**
|
19 |
-
* The constructor
|
20 |
-
*
|
21 |
-
* @since 1.0
|
22 |
-
*
|
23 |
-
* @param int $id The attachment ID.
|
24 |
-
* @return void
|
25 |
-
*/
|
26 |
-
public function __construct( $id = 0 ) {
|
27 |
-
global $post;
|
28 |
-
|
29 |
-
if ( is_object( $post ) && ! $id ) {
|
30 |
-
$this->id = $post->ID;
|
31 |
-
} else {
|
32 |
-
$this->id = (int) $id;
|
33 |
-
}
|
34 |
-
}
|
35 |
-
|
36 |
/**
|
37 |
* Get the attachment backup filepath.
|
38 |
*
|
15 |
*/
|
16 |
const VERSION = '1.0.2';
|
17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
/**
|
19 |
* Get the attachment backup filepath.
|
20 |
*
|
inc/classes/class-imagify.php
CHANGED
@@ -11,7 +11,7 @@ class Imagify extends Imagify_Deprecated {
|
|
11 |
*
|
12 |
* @var string
|
13 |
*/
|
14 |
-
const VERSION = '1.0.
|
15 |
/**
|
16 |
* The Imagify API endpoint.
|
17 |
*
|
@@ -27,12 +27,19 @@ class Imagify extends Imagify_Deprecated {
|
|
27 |
private $api_key = '';
|
28 |
|
29 |
/**
|
30 |
-
* HTTP headers.
|
31 |
*
|
32 |
* @var array
|
33 |
*/
|
34 |
private $headers = array();
|
35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
/**
|
37 |
* The single instance of the class.
|
38 |
*
|
@@ -59,9 +66,9 @@ class Imagify extends Imagify_Deprecated {
|
|
59 |
$this->api_key = IMAGIFY_API_KEY;
|
60 |
}
|
61 |
|
62 |
-
$this->
|
63 |
-
$this->
|
64 |
-
$this->
|
65 |
}
|
66 |
|
67 |
/**
|
@@ -93,6 +100,8 @@ class Imagify extends Imagify_Deprecated {
|
|
93 |
static $user;
|
94 |
|
95 |
if ( ! isset( $user ) ) {
|
|
|
|
|
96 |
$user = $this->http_call( 'users/me/', array(
|
97 |
'timeout' => 10,
|
98 |
) );
|
@@ -111,8 +120,7 @@ class Imagify extends Imagify_Deprecated {
|
|
111 |
* @return object
|
112 |
*/
|
113 |
public function create_user( $data ) {
|
114 |
-
|
115 |
-
|
116 |
$data['from_plugin'] = true;
|
117 |
|
118 |
return $this->http_call( 'users/', array(
|
@@ -131,6 +139,8 @@ class Imagify extends Imagify_Deprecated {
|
|
131 |
* @return object
|
132 |
*/
|
133 |
public function update_user( $data ) {
|
|
|
|
|
134 |
return $this->http_call( 'users/me/', array(
|
135 |
'method' => 'PUT',
|
136 |
'post_data' => $data,
|
@@ -151,8 +161,9 @@ class Imagify extends Imagify_Deprecated {
|
|
151 |
static $status = array();
|
152 |
|
153 |
if ( ! isset( $status[ $data ] ) ) {
|
154 |
-
|
155 |
-
|
|
|
156 |
|
157 |
$status[ $data ] = $this->http_call( 'status/', array(
|
158 |
'timeout' => 10,
|
@@ -174,7 +185,9 @@ class Imagify extends Imagify_Deprecated {
|
|
174 |
static $api_version;
|
175 |
|
176 |
if ( ! isset( $api_version ) ) {
|
177 |
-
|
|
|
|
|
178 |
|
179 |
$api_version = $this->http_call( 'version/', array(
|
180 |
'timeout' => 5,
|
@@ -193,20 +206,25 @@ class Imagify extends Imagify_Deprecated {
|
|
193 |
* @return object
|
194 |
*/
|
195 |
public function get_public_info() {
|
|
|
|
|
196 |
return $this->http_call( 'public-info' );
|
197 |
}
|
198 |
|
199 |
/**
|
200 |
* Optimize an image from its binary content.
|
201 |
*
|
202 |
-
* @access
|
203 |
-
* @since
|
|
|
204 |
*
|
205 |
-
* @param string $data All options.
|
206 |
* @return object
|
207 |
*/
|
208 |
public function upload_image( $data ) {
|
209 |
-
|
|
|
|
|
210 |
|
211 |
return $this->http_call( 'upload/', array(
|
212 |
'method' => 'POST',
|
@@ -224,6 +242,8 @@ class Imagify extends Imagify_Deprecated {
|
|
224 |
* @return object
|
225 |
*/
|
226 |
public function fetch_image( $data ) {
|
|
|
|
|
227 |
return $this->http_call( 'fetch/', array(
|
228 |
'method' => 'POST',
|
229 |
'post_data' => wp_json_encode( $data ),
|
@@ -239,6 +259,8 @@ class Imagify extends Imagify_Deprecated {
|
|
239 |
* @return object
|
240 |
*/
|
241 |
public function get_plans_prices() {
|
|
|
|
|
242 |
return $this->http_call( 'pricing/plan/' );
|
243 |
}
|
244 |
|
@@ -251,6 +273,8 @@ class Imagify extends Imagify_Deprecated {
|
|
251 |
* @return object
|
252 |
*/
|
253 |
public function get_packs_prices() {
|
|
|
|
|
254 |
return $this->http_call( 'pricing/pack/' );
|
255 |
}
|
256 |
|
@@ -263,6 +287,8 @@ class Imagify extends Imagify_Deprecated {
|
|
263 |
* @return object
|
264 |
*/
|
265 |
public function get_all_prices() {
|
|
|
|
|
266 |
return $this->http_call( 'pricing/all/' );
|
267 |
}
|
268 |
|
@@ -276,6 +302,8 @@ class Imagify extends Imagify_Deprecated {
|
|
276 |
* @return object
|
277 |
*/
|
278 |
public function check_coupon_code( $coupon ) {
|
|
|
|
|
279 |
return $this->http_call( 'coupons/' . $coupon . '/' );
|
280 |
}
|
281 |
|
@@ -288,14 +316,17 @@ class Imagify extends Imagify_Deprecated {
|
|
288 |
* @return object
|
289 |
*/
|
290 |
public function check_discount() {
|
|
|
|
|
291 |
return $this->http_call( 'pricing/discount/' );
|
292 |
}
|
293 |
|
294 |
/**
|
295 |
* Make an HTTP call using curl.
|
296 |
*
|
297 |
-
* @access
|
298 |
-
* @since
|
|
|
299 |
*
|
300 |
* @param string $url The URL to call.
|
301 |
* @param array $args The request args.
|
@@ -308,6 +339,64 @@ class Imagify extends Imagify_Deprecated {
|
|
308 |
'timeout' => 45,
|
309 |
), $args );
|
310 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
311 |
// Check if php-curl is enabled.
|
312 |
if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
|
313 |
return new WP_Error( 'curl', 'cURL isn\'t installed on the server.' );
|
@@ -316,9 +405,16 @@ class Imagify extends Imagify_Deprecated {
|
|
316 |
try {
|
317 |
$ch = curl_init();
|
318 |
|
|
|
|
|
|
|
|
|
319 |
if ( 'POST' === $args['method'] ) {
|
320 |
curl_setopt( $ch, CURLOPT_POST, true );
|
321 |
curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
|
|
|
|
|
|
|
322 |
}
|
323 |
|
324 |
curl_setopt( $ch, CURLOPT_URL, self::API_ENDPOINT . $url );
|
@@ -329,7 +425,7 @@ class Imagify extends Imagify_Deprecated {
|
|
329 |
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
|
330 |
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
|
331 |
|
332 |
-
$response =
|
333 |
$error = curl_error( $ch );
|
334 |
$http_code = (int) curl_getinfo( $ch, CURLINFO_HTTP_CODE );
|
335 |
|
@@ -338,6 +434,24 @@ class Imagify extends Imagify_Deprecated {
|
|
338 |
return new WP_Error( 'curl', 'Unknown error occurred' );
|
339 |
}
|
340 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
341 |
if ( 200 !== $http_code && isset( $response->code, $response->detail ) ) {
|
342 |
return new WP_Error( $http_code, $response->detail );
|
343 |
}
|
@@ -348,7 +462,7 @@ class Imagify extends Imagify_Deprecated {
|
|
348 |
|
349 |
if ( 200 !== $http_code ) {
|
350 |
$error = '' !== $error ? ' - ' . htmlentities( $error ) : '';
|
351 |
-
return new WP_Error( $http_code, "Unknown error occurred ({$http_code}{$error})
|
352 |
}
|
353 |
|
354 |
return $response;
|
11 |
*
|
12 |
* @var string
|
13 |
*/
|
14 |
+
const VERSION = '1.0.6';
|
15 |
/**
|
16 |
* The Imagify API endpoint.
|
17 |
*
|
27 |
private $api_key = '';
|
28 |
|
29 |
/**
|
30 |
+
* HTTP headers. Each http call must fill it (even if it's with an empty array).
|
31 |
*
|
32 |
* @var array
|
33 |
*/
|
34 |
private $headers = array();
|
35 |
|
36 |
+
/**
|
37 |
+
* All (default) HTTP headers. They must not be modified once the class is instanciated, or it will affect any following HTTP calls.
|
38 |
+
*
|
39 |
+
* @var array
|
40 |
+
*/
|
41 |
+
private $all_headers = array();
|
42 |
+
|
43 |
/**
|
44 |
* The single instance of the class.
|
45 |
*
|
66 |
$this->api_key = IMAGIFY_API_KEY;
|
67 |
}
|
68 |
|
69 |
+
$this->all_headers['Accept'] = 'Accept: application/json';
|
70 |
+
$this->all_headers['Content-Type'] = 'Content-Type: application/json';
|
71 |
+
$this->all_headers['Authorization'] = 'Authorization: token ' . $this->api_key;
|
72 |
}
|
73 |
|
74 |
/**
|
100 |
static $user;
|
101 |
|
102 |
if ( ! isset( $user ) ) {
|
103 |
+
$this->headers = $this->all_headers;
|
104 |
+
|
105 |
$user = $this->http_call( 'users/me/', array(
|
106 |
'timeout' => 10,
|
107 |
) );
|
120 |
* @return object
|
121 |
*/
|
122 |
public function create_user( $data ) {
|
123 |
+
$this->headers = array();
|
|
|
124 |
$data['from_plugin'] = true;
|
125 |
|
126 |
return $this->http_call( 'users/', array(
|
139 |
* @return object
|
140 |
*/
|
141 |
public function update_user( $data ) {
|
142 |
+
$this->headers = $this->all_headers;
|
143 |
+
|
144 |
return $this->http_call( 'users/me/', array(
|
145 |
'method' => 'PUT',
|
146 |
'post_data' => $data,
|
161 |
static $status = array();
|
162 |
|
163 |
if ( ! isset( $status[ $data ] ) ) {
|
164 |
+
$this->headers = array(
|
165 |
+
'Authorization' => 'Authorization: token ' . $data,
|
166 |
+
);
|
167 |
|
168 |
$status[ $data ] = $this->http_call( 'status/', array(
|
169 |
'timeout' => 10,
|
185 |
static $api_version;
|
186 |
|
187 |
if ( ! isset( $api_version ) ) {
|
188 |
+
$this->headers = array(
|
189 |
+
'Authorization' => $this->all_headers['Authorization'],
|
190 |
+
);
|
191 |
|
192 |
$api_version = $this->http_call( 'version/', array(
|
193 |
'timeout' => 5,
|
206 |
* @return object
|
207 |
*/
|
208 |
public function get_public_info() {
|
209 |
+
$this->headers = $this->all_headers;
|
210 |
+
|
211 |
return $this->http_call( 'public-info' );
|
212 |
}
|
213 |
|
214 |
/**
|
215 |
* Optimize an image from its binary content.
|
216 |
*
|
217 |
+
* @access public
|
218 |
+
* @since 1.6.5
|
219 |
+
* @since 1.6.7 $data['image'] can contain the file path (prefered) or the result of `curl_file_create()`.
|
220 |
*
|
221 |
+
* @param string $data All options.
|
222 |
* @return object
|
223 |
*/
|
224 |
public function upload_image( $data ) {
|
225 |
+
$this->headers = array(
|
226 |
+
'Authorization' => $this->all_headers['Authorization'],
|
227 |
+
);
|
228 |
|
229 |
return $this->http_call( 'upload/', array(
|
230 |
'method' => 'POST',
|
242 |
* @return object
|
243 |
*/
|
244 |
public function fetch_image( $data ) {
|
245 |
+
$this->headers = $this->all_headers;
|
246 |
+
|
247 |
return $this->http_call( 'fetch/', array(
|
248 |
'method' => 'POST',
|
249 |
'post_data' => wp_json_encode( $data ),
|
259 |
* @return object
|
260 |
*/
|
261 |
public function get_plans_prices() {
|
262 |
+
$this->headers = $this->all_headers;
|
263 |
+
|
264 |
return $this->http_call( 'pricing/plan/' );
|
265 |
}
|
266 |
|
273 |
* @return object
|
274 |
*/
|
275 |
public function get_packs_prices() {
|
276 |
+
$this->headers = $this->all_headers;
|
277 |
+
|
278 |
return $this->http_call( 'pricing/pack/' );
|
279 |
}
|
280 |
|
287 |
* @return object
|
288 |
*/
|
289 |
public function get_all_prices() {
|
290 |
+
$this->headers = $this->all_headers;
|
291 |
+
|
292 |
return $this->http_call( 'pricing/all/' );
|
293 |
}
|
294 |
|
302 |
* @return object
|
303 |
*/
|
304 |
public function check_coupon_code( $coupon ) {
|
305 |
+
$this->headers = $this->all_headers;
|
306 |
+
|
307 |
return $this->http_call( 'coupons/' . $coupon . '/' );
|
308 |
}
|
309 |
|
316 |
* @return object
|
317 |
*/
|
318 |
public function check_discount() {
|
319 |
+
$this->headers = $this->all_headers;
|
320 |
+
|
321 |
return $this->http_call( 'pricing/discount/' );
|
322 |
}
|
323 |
|
324 |
/**
|
325 |
* Make an HTTP call using curl.
|
326 |
*
|
327 |
+
* @access private
|
328 |
+
* @since 1.6.5
|
329 |
+
* @since 1.6.7 Use `wp_remote_request()` when possible (when we don't need to send an image).
|
330 |
*
|
331 |
* @param string $url The URL to call.
|
332 |
* @param array $args The request args.
|
339 |
'timeout' => 45,
|
340 |
), $args );
|
341 |
|
342 |
+
$endpoint = trim( $url, '/' );
|
343 |
+
/**
|
344 |
+
* Filter the timeout value for any request to the API.
|
345 |
+
*
|
346 |
+
* @since 1.6.7
|
347 |
+
* @author Grégory Viguier
|
348 |
+
*
|
349 |
+
* @param int $timeout Timeout value in seconds.
|
350 |
+
* @param string $endpoint The targetted endpoint. It's basically URI without heading nor trailing slash.
|
351 |
+
*/
|
352 |
+
$args['timeout'] = apply_filters( 'imagify_api_http_request_timeout', $args['timeout'], $endpoint );
|
353 |
+
|
354 |
+
// We need to send an image: we must use cURL directly.
|
355 |
+
if ( isset( $args['post_data']['image'] ) ) {
|
356 |
+
return $this->curl_http_call( $url, $args );
|
357 |
+
}
|
358 |
+
|
359 |
+
$args = array_merge( array(
|
360 |
+
'headers' => array(),
|
361 |
+
'body' => $args['post_data'],
|
362 |
+
'sslverify' => apply_filters( 'https_ssl_verify', false ),
|
363 |
+
), $args );
|
364 |
+
|
365 |
+
unset( $args['post_data'] );
|
366 |
+
|
367 |
+
if ( $this->headers ) {
|
368 |
+
foreach ( $this->headers as $name => $value ) {
|
369 |
+
$value = explode( ':', $value, 2 );
|
370 |
+
$value = end( $value );
|
371 |
+
|
372 |
+
$args['headers'][ $name ] = trim( $value );
|
373 |
+
}
|
374 |
+
}
|
375 |
+
|
376 |
+
$response = wp_remote_request( self::API_ENDPOINT . $url, $args );
|
377 |
+
|
378 |
+
if ( is_wp_error( $response ) ) {
|
379 |
+
return $response;
|
380 |
+
}
|
381 |
+
|
382 |
+
$http_code = wp_remote_retrieve_response_code( $response );
|
383 |
+
$response = wp_remote_retrieve_body( $response );
|
384 |
+
|
385 |
+
return $this->handle_response( $response, $http_code );
|
386 |
+
}
|
387 |
+
|
388 |
+
/**
|
389 |
+
* Make an HTTP call using curl.
|
390 |
+
*
|
391 |
+
* @access private
|
392 |
+
* @since 1.6.7
|
393 |
+
* @author Grégory Viguier
|
394 |
+
*
|
395 |
+
* @param string $url The URL to call.
|
396 |
+
* @param array $args The request args.
|
397 |
+
* @return object
|
398 |
+
*/
|
399 |
+
private function curl_http_call( $url, $args = array() ) {
|
400 |
// Check if php-curl is enabled.
|
401 |
if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
|
402 |
return new WP_Error( 'curl', 'cURL isn\'t installed on the server.' );
|
405 |
try {
|
406 |
$ch = curl_init();
|
407 |
|
408 |
+
if ( isset( $args['post_data']['image'] ) && is_string( $args['post_data']['image'] ) && file_exists( $args['post_data']['image'] ) ) {
|
409 |
+
$args['post_data']['image'] = curl_file_create( $args['post_data']['image'] );
|
410 |
+
}
|
411 |
+
|
412 |
if ( 'POST' === $args['method'] ) {
|
413 |
curl_setopt( $ch, CURLOPT_POST, true );
|
414 |
curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
|
415 |
+
} elseif ( 'PUT' === $args['method'] ) {
|
416 |
+
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );
|
417 |
+
curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
|
418 |
}
|
419 |
|
420 |
curl_setopt( $ch, CURLOPT_URL, self::API_ENDPOINT . $url );
|
425 |
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
|
426 |
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
|
427 |
|
428 |
+
$response = curl_exec( $ch );
|
429 |
$error = curl_error( $ch );
|
430 |
$http_code = (int) curl_getinfo( $ch, CURLINFO_HTTP_CODE );
|
431 |
|
434 |
return new WP_Error( 'curl', 'Unknown error occurred' );
|
435 |
}
|
436 |
|
437 |
+
return $this->handle_response( $response, $http_code, $error );
|
438 |
+
}
|
439 |
+
|
440 |
+
/**
|
441 |
+
* Handle the request response and maybe trigger an error.
|
442 |
+
*
|
443 |
+
* @access private
|
444 |
+
* @since 1.6.7
|
445 |
+
* @author Grégory Viguier
|
446 |
+
*
|
447 |
+
* @param string $response The request response.
|
448 |
+
* @param int $http_code The request HTTP code.
|
449 |
+
* @param string $error An error message.
|
450 |
+
* @return object
|
451 |
+
*/
|
452 |
+
private function handle_response( $response, $http_code, $error = '' ) {
|
453 |
+
$response = json_decode( $response );
|
454 |
+
|
455 |
if ( 200 !== $http_code && isset( $response->code, $response->detail ) ) {
|
456 |
return new WP_Error( $http_code, $response->detail );
|
457 |
}
|
462 |
|
463 |
if ( 200 !== $http_code ) {
|
464 |
$error = '' !== $error ? ' - ' . htmlentities( $error ) : '';
|
465 |
+
return new WP_Error( $http_code, "Unknown error occurred ({$http_code} {$error})" );
|
466 |
}
|
467 |
|
468 |
return $response;
|
inc/compat.php
CHANGED
@@ -30,9 +30,9 @@ if ( ! function_exists( 'wp_json_encode' ) ) :
|
|
30 |
* @since 1.6.5
|
31 |
* @since WP 4.1.0
|
32 |
*
|
33 |
-
* @param
|
34 |
-
* @param
|
35 |
-
* @param
|
36 |
* @return string|false The JSON encoded string, or false if it cannot be encoded.
|
37 |
*/
|
38 |
function wp_json_encode( $data, $options = 0, $depth = 512 ) {
|
@@ -83,7 +83,7 @@ if ( ! function_exists( '_wp_json_prepare_data' ) ) :
|
|
83 |
* @since WP 4.4.0
|
84 |
* @access private
|
85 |
*
|
86 |
-
* @param
|
87 |
* @return bool|int|float|null|string|array Data ready for `json_encode()`.
|
88 |
*/
|
89 |
function _wp_json_prepare_data( $data ) {
|
@@ -207,7 +207,7 @@ if ( ! function_exists( '_wp_json_convert_string' ) ) :
|
|
207 |
*
|
208 |
* @staticvar bool $use_mb
|
209 |
*
|
210 |
-
* @param
|
211 |
* @return string The checked string.
|
212 |
*/
|
213 |
function _wp_json_convert_string( $string ) {
|
@@ -229,3 +229,32 @@ if ( ! function_exists( '_wp_json_convert_string' ) ) :
|
|
229 |
}
|
230 |
|
231 |
endif;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
* @since 1.6.5
|
31 |
* @since WP 4.1.0
|
32 |
*
|
33 |
+
* @param mixed $data Variable (usually an array or object) to encode as JSON.
|
34 |
+
* @param int $options Optional. Options to be passed to json_encode(). Default 0.
|
35 |
+
* @param int $depth Optional. Maximum depth to walk through $data. Must be greater than 0. Default 512.
|
36 |
* @return string|false The JSON encoded string, or false if it cannot be encoded.
|
37 |
*/
|
38 |
function wp_json_encode( $data, $options = 0, $depth = 512 ) {
|
83 |
* @since WP 4.4.0
|
84 |
* @access private
|
85 |
*
|
86 |
+
* @param mixed $data Native representation.
|
87 |
* @return bool|int|float|null|string|array Data ready for `json_encode()`.
|
88 |
*/
|
89 |
function _wp_json_prepare_data( $data ) {
|
207 |
*
|
208 |
* @staticvar bool $use_mb
|
209 |
*
|
210 |
+
* @param string $string The string which is to be converted.
|
211 |
* @return string The checked string.
|
212 |
*/
|
213 |
function _wp_json_convert_string( $string ) {
|
229 |
}
|
230 |
|
231 |
endif;
|
232 |
+
|
233 |
+
if ( ! function_exists( 'wp_normalize_path' ) ) :
|
234 |
+
|
235 |
+
/**
|
236 |
+
* Normalize a filesystem path.
|
237 |
+
*
|
238 |
+
* On windows systems, replaces backslashes with forward slashes
|
239 |
+
* and forces upper-case drive letters.
|
240 |
+
* Allows for two leading slashes for Windows network shares, but
|
241 |
+
* ensures that all other duplicate slashes are reduced to a single.
|
242 |
+
*
|
243 |
+
* @since 1.6.7
|
244 |
+
* @since WP 3.9.0
|
245 |
+
* @since WP 4.4.0 Ensures upper-case drive letters on Windows systems.
|
246 |
+
* @since WP 4.5.0 Allows for Windows network shares.
|
247 |
+
*
|
248 |
+
* @param string $path Path to normalize.
|
249 |
+
* @return string Normalized path.
|
250 |
+
*/
|
251 |
+
function wp_normalize_path( $path ) {
|
252 |
+
$path = str_replace( '\\', '/', $path );
|
253 |
+
$path = preg_replace( '|(?<=.)/+|', '/', $path );
|
254 |
+
if ( ':' === substr( $path, 1, 1 ) ) {
|
255 |
+
$path = ucfirst( $path );
|
256 |
+
}
|
257 |
+
return $path;
|
258 |
+
}
|
259 |
+
|
260 |
+
endif;
|
inc/functions/admin-stats.php
CHANGED
@@ -186,13 +186,14 @@ function imagify_percent_optimized_attachments() {
|
|
186 |
$total_attachments = imagify_count_attachments();
|
187 |
$total_optimized_attachments = imagify_count_optimized_attachments();
|
188 |
|
189 |
-
return
|
190 |
}
|
191 |
|
192 |
/**
|
193 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
194 |
*
|
195 |
-
* @since
|
|
|
196 |
* @author Jonathan Buttigieg
|
197 |
*
|
198 |
* @param string $key What data to return. Choices are between 'count', 'original_size', 'optimized_size', and 'percent'. If left empty, the whole array is returned.
|
@@ -206,54 +207,137 @@ function imagify_count_saving_data( $key = '' ) {
|
|
206 |
* 3rd party will be able to override the result.
|
207 |
*
|
208 |
* @since 1.5
|
|
|
|
|
|
|
209 |
*/
|
210 |
$attachments = apply_filters( 'imagify_count_saving_data', false );
|
211 |
|
212 |
-
if ( false === $attachments ) {
|
213 |
-
$attachments = $wpdb->get_col( "
|
214 |
-
SELECT pm1.meta_value
|
215 |
-
FROM $wpdb->postmeta as pm1
|
216 |
-
INNER JOIN $wpdb->postmeta as pm2
|
217 |
-
ON pm1.post_id = pm2.post_id
|
218 |
-
WHERE pm1.meta_key = '_imagify_data'
|
219 |
-
AND ( pm2.meta_key = '_imagify_status' AND pm2.meta_value = 'success' )"
|
220 |
-
);
|
221 |
-
}
|
222 |
-
|
223 |
-
$attachments = array_map( 'maybe_unserialize', (array) $attachments );
|
224 |
-
|
225 |
$original_size = 0;
|
226 |
$optimized_size = 0;
|
227 |
$count = 0;
|
228 |
|
229 |
-
|
230 |
-
|
231 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
232 |
}
|
233 |
|
234 |
-
|
235 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
236 |
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
|
241 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
242 |
|
243 |
-
|
244 |
-
|
245 |
-
if ( !
|
246 |
-
|
247 |
-
|
248 |
}
|
249 |
-
|
250 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
251 |
|
252 |
$data = array(
|
253 |
'count' => $count,
|
254 |
'original_size' => $original_size,
|
255 |
'optimized_size' => $optimized_size,
|
256 |
-
'percent' => $optimized_size ? ceil( ( ( $original_size - $optimized_size ) / $original_size ) * 100 ) : 0,
|
257 |
);
|
258 |
|
259 |
if ( ! empty( $key ) ) {
|
@@ -277,22 +361,22 @@ function imagify_count_saving_data( $key = '' ) {
|
|
277 |
function imagify_calculate_total_size_images_library() {
|
278 |
global $wpdb;
|
279 |
|
280 |
-
$
|
281 |
SELECT ID FROM $wpdb->posts
|
282 |
WHERE ( post_mime_type LIKE 'image/%' )
|
283 |
AND post_type = 'attachment' AND ( post_status = 'inherit' )
|
284 |
LIMIT 250
|
285 |
", ARRAY_A );
|
286 |
|
287 |
-
$
|
288 |
|
289 |
-
if ( ! $
|
290 |
return 0;
|
291 |
}
|
292 |
|
293 |
-
$partial_total_images = count( $
|
294 |
$total_images = imagify_count_attachments();
|
295 |
-
$total_size_images = imagify_calculate_total_image_size( $
|
296 |
|
297 |
return $total_size_images;
|
298 |
}
|
@@ -390,105 +474,103 @@ function imagify_calculate_average_size_images_per_month() {
|
|
390 |
* @since 1.6
|
391 |
* @author Remy Perona
|
392 |
*
|
393 |
-
* @param array $
|
394 |
* @param int $partial_total_images The number of images we're doing the calculation with.
|
395 |
* @param int $total_images The total number of images.
|
396 |
* @return int The estimated total size of images.
|
397 |
*/
|
398 |
-
function imagify_calculate_total_image_size( $
|
399 |
global $wpdb;
|
400 |
-
$partial_size_images = '';
|
401 |
-
$partial_total_intermediate_images = '';
|
402 |
-
$sql_ids = implode( ',', $images_id );
|
403 |
-
|
404 |
-
// Get attachments filename.
|
405 |
-
$attachments_filename = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
406 |
-
"
|
407 |
-
SELECT pm.post_id as id, pm.meta_value as value
|
408 |
-
FROM $wpdb->postmeta as pm
|
409 |
-
WHERE pm.meta_key = '_wp_attached_file'
|
410 |
-
AND pm.post_id IN ($sql_ids)
|
411 |
-
ORDER BY pm.post_id DESC
|
412 |
-
", ARRAY_A
|
413 |
-
);
|
414 |
|
415 |
-
$
|
416 |
-
|
417 |
-
// Get attachments data.
|
418 |
-
$attachments_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
419 |
-
"
|
420 |
-
SELECT pm.post_id as id, pm.meta_value as value
|
421 |
-
FROM $wpdb->postmeta as pm
|
422 |
-
WHERE pm.meta_key = '_wp_attachment_metadata'
|
423 |
-
AND pm.post_id IN ($sql_ids)
|
424 |
-
ORDER BY pm.post_id DESC
|
425 |
-
", ARRAY_A
|
426 |
-
);
|
427 |
-
|
428 |
-
$attachments_data = imagify_query_results_combine( $images_id, $attachments_data );
|
429 |
-
$attachments_data = array_map( 'maybe_unserialize', $attachments_data );
|
430 |
-
|
431 |
-
// Get imagify data.
|
432 |
-
$imagify_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
433 |
-
"
|
434 |
-
SELECT pm.post_id as id, pm.meta_value as value
|
435 |
-
FROM $wpdb->postmeta as pm
|
436 |
-
WHERE pm.meta_key = '_imagify_data'
|
437 |
-
AND pm.post_id IN ($sql_ids)
|
438 |
-
ORDER BY pm.post_id DESC
|
439 |
-
", ARRAY_A
|
440 |
-
);
|
441 |
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
// Get attachments status.
|
446 |
-
$attachments_status = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
447 |
-
"
|
448 |
-
SELECT pm.post_id as id, pm.meta_value as value
|
449 |
-
FROM $wpdb->postmeta as pm
|
450 |
-
WHERE pm.meta_key = '_imagify_status'
|
451 |
-
AND pm.post_id IN ($sql_ids)
|
452 |
-
ORDER BY pm.post_id DESC
|
453 |
-
", ARRAY_A
|
454 |
-
);
|
455 |
-
|
456 |
-
$attachments_status = imagify_query_results_combine( $images_id, $attachments_status );
|
457 |
-
|
458 |
-
foreach ( $images_id as $image_id ) {
|
459 |
-
$attachment_status = isset( $attachments_status[ $image_id ] ) ? $attachments_status[ $image_id ] : false;
|
460 |
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
465 |
continue;
|
466 |
}
|
467 |
|
468 |
-
|
469 |
-
$
|
|
|
|
|
470 |
|
471 |
/** This filter is documented in inc/functions/process.php. */
|
472 |
-
$
|
473 |
-
$partial_size_images += filesize( $full_image );
|
474 |
|
475 |
-
|
476 |
-
continue;
|
477 |
-
}
|
478 |
|
479 |
-
|
480 |
-
|
481 |
-
|
|
|
|
|
482 |
}
|
483 |
|
484 |
-
|
|
|
|
|
|
|
|
|
|
|
485 |
|
486 |
-
|
487 |
-
|
488 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
489 |
}
|
|
|
|
|
|
|
490 |
}
|
491 |
-
|
|
|
|
|
492 |
|
493 |
$intermediate_images_per_image = $partial_total_intermediate_images / $partial_total_images;
|
494 |
$average_size_images = $partial_size_images / ( $partial_total_images + $partial_total_intermediate_images );
|
186 |
$total_attachments = imagify_count_attachments();
|
187 |
$total_optimized_attachments = imagify_count_optimized_attachments();
|
188 |
|
189 |
+
return $total_attachments && $total_optimized_attachments ? round( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) : 0;
|
190 |
}
|
191 |
|
192 |
/**
|
193 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
194 |
*
|
195 |
+
* @since 1.0
|
196 |
+
* @since 1.6.7 Revamped to handle huge libraries.
|
197 |
* @author Jonathan Buttigieg
|
198 |
*
|
199 |
* @param string $key What data to return. Choices are between 'count', 'original_size', 'optimized_size', and 'percent'. If left empty, the whole array is returned.
|
207 |
* 3rd party will be able to override the result.
|
208 |
*
|
209 |
* @since 1.5
|
210 |
+
* @since 1.6.7 This filter should return an array containing the following keys: 'count', 'original_size', and 'optimized_size'.
|
211 |
+
*
|
212 |
+
* @param bool|array $attachments An array containing the keys ('count', 'original_size', and 'optimized_size'), or an array of attachments (back compat', deprecated), or false.
|
213 |
*/
|
214 |
$attachments = apply_filters( 'imagify_count_saving_data', false );
|
215 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
216 |
$original_size = 0;
|
217 |
$optimized_size = 0;
|
218 |
$count = 0;
|
219 |
|
220 |
+
if ( is_array( $attachments ) ) {
|
221 |
+
/**
|
222 |
+
* Bypass.
|
223 |
+
*/
|
224 |
+
if ( isset( $attachments['count'], $attachments['original_size'], $attachments['optimized_size'] ) ) {
|
225 |
+
/**
|
226 |
+
* We have the results we need.
|
227 |
+
*/
|
228 |
+
$attachments['percent'] = $attachments['optimized_size'] && $attachments['original_size'] ? ceil( ( ( $attachments['original_size'] - $attachments['optimized_size'] ) / $attachments['original_size'] ) * 100 ) : 0;
|
229 |
+
|
230 |
+
return $attachments;
|
231 |
}
|
232 |
|
233 |
+
/**
|
234 |
+
* Back compat'.
|
235 |
+
* The following shouldn't be used. Sites with a huge library won't like it.
|
236 |
+
*/
|
237 |
+
$attachments = array_map( 'maybe_unserialize', (array) $attachments );
|
238 |
+
|
239 |
+
if ( $attachments ) {
|
240 |
+
foreach ( $attachments as $attachment_data ) {
|
241 |
+
if ( ! $attachment_data ) {
|
242 |
+
continue;
|
243 |
+
}
|
244 |
+
|
245 |
+
++$count;
|
246 |
+
$original_data = $attachment_data['sizes']['full'];
|
247 |
+
|
248 |
+
// Increment the original sizes.
|
249 |
+
$original_size += $original_data['original_size'] ? $original_data['original_size'] : 0;
|
250 |
+
$optimized_size += $original_data['optimized_size'] ? $original_data['optimized_size'] : 0;
|
251 |
+
|
252 |
+
unset( $attachment_data['sizes']['full'] );
|
253 |
+
|
254 |
+
// Increment the thumbnails sizes.
|
255 |
+
foreach ( $attachment_data['sizes'] as $size_data ) {
|
256 |
+
if ( ! empty( $size_data['success'] ) ) {
|
257 |
+
$original_size += $size_data['original_size'] ? $size_data['original_size'] : 0;
|
258 |
+
$optimized_size += $size_data['optimized_size'] ? $size_data['optimized_size'] : 0;
|
259 |
+
}
|
260 |
+
}
|
261 |
+
}
|
262 |
+
}
|
263 |
+
} else {
|
264 |
+
|
265 |
+
/**
|
266 |
+
* Filter the chunk size of the requests fetching the data.
|
267 |
+
* 15,000 seems to be a good balance between memory used, speed, and number of DB hits.
|
268 |
+
*
|
269 |
+
* @param int $limit The maximum number of elements per chunk.
|
270 |
+
*/
|
271 |
+
$limit = apply_filters( 'imagify_count_saving_data_limit', 15000 );
|
272 |
+
$limit = absint( $limit );
|
273 |
+
|
274 |
+
$attachment_ids = $wpdb->get_col(
|
275 |
+
"SELECT post_id
|
276 |
+
FROM $wpdb->postmeta
|
277 |
+
WHERE meta_key = '_imagify_status'
|
278 |
+
AND meta_value = 'success'
|
279 |
+
ORDER BY CAST( post_id AS UNSIGNED )"
|
280 |
+
);
|
281 |
+
$wpdb->flush();
|
282 |
+
|
283 |
+
$attachment_ids = array_map( 'absint', $attachment_ids );
|
284 |
+
$attachment_ids = array_chunk( $attachment_ids, $limit );
|
285 |
|
286 |
+
while ( $attachment_ids ) {
|
287 |
+
$limit_ids = array_shift( $attachment_ids );
|
288 |
+
$limit_ids = implode( ',', $limit_ids );
|
289 |
|
290 |
+
$attachments = $wpdb->get_col( // WPCS: unprepared SQL ok.
|
291 |
+
"SELECT meta_value
|
292 |
+
FROM $wpdb->postmeta
|
293 |
+
WHERE post_id IN ( $limit_ids )
|
294 |
+
AND meta_key = '_imagify_data'"
|
295 |
+
);
|
296 |
+
$wpdb->flush();
|
297 |
|
298 |
+
unset( $limit_ids );
|
299 |
+
|
300 |
+
if ( ! $attachments ) {
|
301 |
+
// Uh?!
|
302 |
+
continue;
|
303 |
}
|
304 |
+
|
305 |
+
$attachments = array_map( 'maybe_unserialize', $attachments );
|
306 |
+
|
307 |
+
foreach ( $attachments as $attachment_data ) {
|
308 |
+
if ( ! $attachment_data ) {
|
309 |
+
continue;
|
310 |
+
}
|
311 |
+
|
312 |
+
++$count;
|
313 |
+
$original_data = $attachment_data['sizes']['full'];
|
314 |
+
|
315 |
+
// Increment the original sizes.
|
316 |
+
$original_size += $original_data['original_size'] ? $original_data['original_size'] : 0;
|
317 |
+
$optimized_size += $original_data['optimized_size'] ? $original_data['optimized_size'] : 0;
|
318 |
+
|
319 |
+
unset( $attachment_data['sizes']['full'], $original_data );
|
320 |
+
|
321 |
+
// Increment the thumbnails sizes.
|
322 |
+
foreach ( $attachment_data['sizes'] as $size_data ) {
|
323 |
+
if ( ! empty( $size_data['success'] ) ) {
|
324 |
+
$original_size += $size_data['original_size'] ? $size_data['original_size'] : 0;
|
325 |
+
$optimized_size += $size_data['optimized_size'] ? $size_data['optimized_size'] : 0;
|
326 |
+
}
|
327 |
+
}
|
328 |
+
|
329 |
+
unset( $size_data );
|
330 |
+
}
|
331 |
+
|
332 |
+
unset( $attachments, $attachment_data );
|
333 |
+
} // End while().
|
334 |
+
} // End if().
|
335 |
|
336 |
$data = array(
|
337 |
'count' => $count,
|
338 |
'original_size' => $original_size,
|
339 |
'optimized_size' => $optimized_size,
|
340 |
+
'percent' => $original_size && $optimized_size ? ceil( ( ( $original_size - $optimized_size ) / $original_size ) * 100 ) : 0,
|
341 |
);
|
342 |
|
343 |
if ( ! empty( $key ) ) {
|
361 |
function imagify_calculate_total_size_images_library() {
|
362 |
global $wpdb;
|
363 |
|
364 |
+
$image_ids = $wpdb->get_results( "
|
365 |
SELECT ID FROM $wpdb->posts
|
366 |
WHERE ( post_mime_type LIKE 'image/%' )
|
367 |
AND post_type = 'attachment' AND ( post_status = 'inherit' )
|
368 |
LIMIT 250
|
369 |
", ARRAY_A );
|
370 |
|
371 |
+
$image_ids = wp_list_pluck( $image_ids, 'ID' );
|
372 |
|
373 |
+
if ( ! $image_ids ) {
|
374 |
return 0;
|
375 |
}
|
376 |
|
377 |
+
$partial_total_images = count( $image_ids );
|
378 |
$total_images = imagify_count_attachments();
|
379 |
+
$total_size_images = imagify_calculate_total_image_size( $image_ids, $partial_total_images, $total_images );
|
380 |
|
381 |
return $total_size_images;
|
382 |
}
|
474 |
* @since 1.6
|
475 |
* @author Remy Perona
|
476 |
*
|
477 |
+
* @param array $image_ids Array of image IDs.
|
478 |
* @param int $partial_total_images The number of images we're doing the calculation with.
|
479 |
* @param int $total_images The total number of images.
|
480 |
* @return int The estimated total size of images.
|
481 |
*/
|
482 |
+
function imagify_calculate_total_image_size( $image_ids, $partial_total_images, $total_images ) {
|
483 |
global $wpdb;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
484 |
|
485 |
+
$image_ids = array_filter( array_map( 'absint', $image_ids ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
486 |
|
487 |
+
if ( ! $image_ids ) {
|
488 |
+
return 0;
|
489 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
490 |
|
491 |
+
$results = imagify_get_wpdb_metas( array(
|
492 |
+
// Get attachments filename.
|
493 |
+
'filenames' => '_wp_attached_file',
|
494 |
+
// Get attachments data.
|
495 |
+
'data' => '_wp_attachment_metadata',
|
496 |
+
// Get Imagify data.
|
497 |
+
'imagify_data' => '_imagify_data',
|
498 |
+
// Get attachments status.
|
499 |
+
'statuses' => '_imagify_status',
|
500 |
+
), $image_ids );
|
501 |
+
|
502 |
+
// Total unoptimized size.
|
503 |
+
$partial_size_images = 0;
|
504 |
+
// Total number of thumbnails.
|
505 |
+
$partial_total_intermediate_images = 0;
|
506 |
+
|
507 |
+
$is_active_for_network = imagify_is_active_for_network();
|
508 |
+
$disallowed_sizes = array_filter( (array) get_imagify_option( 'disallowed-sizes', array() ) );
|
509 |
+
|
510 |
+
foreach ( $image_ids as $i => $image_id ) {
|
511 |
+
$attachment_status = isset( $results['statuses'][ $image_id ] ) ? $results['statuses'][ $image_id ] : false;
|
512 |
+
|
513 |
+
if ( 'success' === $attachment_status ) {
|
514 |
+
$partial_size_images += isset( $results['imagify_data'][ $image_id ]['stats']['original_size'] ) ? $results['imagify_data'][ $image_id ]['stats']['original_size'] : 0;
|
515 |
+
$partial_total_intermediate_images += count( $results['imagify_data'][ $image_id ]['sizes'] );
|
516 |
+
unset( $image_ids[ $i ], $results['filenames'][ $image_id ], $results['data'][ $image_id ], $results['imagify_data'][ $image_id ], $results['statuses'][ $image_id ] );
|
517 |
continue;
|
518 |
}
|
519 |
|
520 |
+
// Create an array containing all this attachment files.
|
521 |
+
$files = array(
|
522 |
+
'full' => get_imagify_attached_file( $results['filenames'][ $image_id ] ),
|
523 |
+
);
|
524 |
|
525 |
/** This filter is documented in inc/functions/process.php. */
|
526 |
+
$files['full'] = apply_filters( 'imagify_file_path', $files['full'] );
|
|
|
527 |
|
528 |
+
$sizes = isset( $results['data'][ $image_id ]['sizes'] ) ? $results['data'][ $image_id ]['sizes'] : array();
|
|
|
|
|
529 |
|
530 |
+
if ( $sizes && is_array( $sizes ) ) {
|
531 |
+
$full_dirname = trailingslashit( dirname( $files['full'] ) );
|
532 |
+
|
533 |
+
if ( ! $is_active_for_network ) {
|
534 |
+
$sizes = array_intersect_key( $sizes, $disallowed_sizes );
|
535 |
}
|
536 |
|
537 |
+
if ( $sizes ) {
|
538 |
+
foreach ( $sizes as $size_key => $size_data ) {
|
539 |
+
$files[ $size_key ] = $full_dirname . $size_data['file'];
|
540 |
+
}
|
541 |
+
}
|
542 |
+
}
|
543 |
|
544 |
+
/**
|
545 |
+
* Allow to provide all files size and the number of thumbnails.
|
546 |
+
*
|
547 |
+
* @since 1.6.7
|
548 |
+
* @author Grégory Viguier
|
549 |
+
*
|
550 |
+
* @param bool $size_and_count False by default.
|
551 |
+
* @param int $image_id The attachment ID.
|
552 |
+
* @param array $files An array of file paths with thumbnail sizes as keys.
|
553 |
+
* @param array $image_ids An array of all attachment IDs.
|
554 |
+
* @return bool|array False by default. Provide an array with the keys 'filesize' (containing the total filesize) and 'thumbnails' (containing the number of thumbnails).
|
555 |
+
*/
|
556 |
+
$size_and_count = apply_filters( 'imagify_total_attachment_filesize', false, $image_id, $files, $image_ids );
|
557 |
+
|
558 |
+
if ( is_array( $size_and_count ) ) {
|
559 |
+
$partial_size_images += $size_and_count['filesize'];
|
560 |
+
$partial_total_intermediate_images += $size_and_count['thumbnails'];
|
561 |
+
} else {
|
562 |
+
foreach ( $files as $file ) {
|
563 |
+
if ( file_exists( $file ) ) {
|
564 |
+
$partial_size_images += filesize( $file );
|
565 |
+
}
|
566 |
}
|
567 |
+
|
568 |
+
unset( $files['full'] );
|
569 |
+
$partial_total_intermediate_images += count( $files );
|
570 |
}
|
571 |
+
|
572 |
+
unset( $image_ids[ $i ], $results['filenames'][ $image_id ], $results['data'][ $image_id ], $results['imagify_data'][ $image_id ], $results['statuses'][ $image_id ] );
|
573 |
+
} // End foreach().
|
574 |
|
575 |
$intermediate_images_per_image = $partial_total_intermediate_images / $partial_total_images;
|
576 |
$average_size_images = $partial_size_images / ( $partial_total_images + $partial_total_intermediate_images );
|
inc/functions/admin-ui.php
CHANGED
File without changes
|
inc/functions/admin.php
CHANGED
@@ -180,12 +180,14 @@ function imagify_notice_is_dismissed( $notice, $user_id = 0 ) {
|
|
180 |
* We use this function to combine the result of 2 SQL queries.
|
181 |
*
|
182 |
* @since 1.4.5
|
|
|
183 |
*
|
184 |
-
* @param array $keys
|
185 |
-
* @param array $values
|
186 |
-
* @return array $
|
|
|
187 |
*/
|
188 |
-
function imagify_query_results_combine( $keys, $values ) {
|
189 |
if ( ! $keys || ! $values ) {
|
190 |
return array();
|
191 |
}
|
@@ -199,6 +201,11 @@ function imagify_query_results_combine( $keys, $values ) {
|
|
199 |
}
|
200 |
}
|
201 |
|
|
|
|
|
|
|
|
|
|
|
202 |
return $result;
|
203 |
}
|
204 |
|
@@ -214,7 +221,7 @@ function get_imagify_bulk_buffer_size() {
|
|
214 |
$sizes = count( get_imagify_thumbnail_sizes() );
|
215 |
|
216 |
switch ( true ) {
|
217 |
-
case
|
218 |
return 1;
|
219 |
|
220 |
case ( $sizes >= 8 ) :
|
@@ -227,3 +234,53 @@ function get_imagify_bulk_buffer_size() {
|
|
227 |
return 4;
|
228 |
}
|
229 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
180 |
* We use this function to combine the result of 2 SQL queries.
|
181 |
*
|
182 |
* @since 1.4.5
|
183 |
+
* @since 1.6.7 Added the $keep_keys_order parameter.
|
184 |
*
|
185 |
+
* @param array $keys An array of keys.
|
186 |
+
* @param array $values An array of arrays like array( 'id' => id, 'value' => value ).
|
187 |
+
* @param int $keep_keys_order Set to true to return an array ordered like $keys instead of $values.
|
188 |
+
* @return array The combined arrays.
|
189 |
*/
|
190 |
+
function imagify_query_results_combine( $keys, $values, $keep_keys_order = false ) {
|
191 |
if ( ! $keys || ! $values ) {
|
192 |
return array();
|
193 |
}
|
201 |
}
|
202 |
}
|
203 |
|
204 |
+
if ( $keep_keys_order ) {
|
205 |
+
$keys = array_intersect_key( $keys, $result );
|
206 |
+
return array_replace( $keys, $result );
|
207 |
+
}
|
208 |
+
|
209 |
return $result;
|
210 |
}
|
211 |
|
221 |
$sizes = count( get_imagify_thumbnail_sizes() );
|
222 |
|
223 |
switch ( true ) {
|
224 |
+
case ( $sizes >= 10 ) :
|
225 |
return 1;
|
226 |
|
227 |
case ( $sizes >= 8 ) :
|
234 |
return 4;
|
235 |
}
|
236 |
}
|
237 |
+
|
238 |
+
/**
|
239 |
+
* A helper to retrieve all values from one or several post metas, given a list of post IDs.
|
240 |
+
* The $wpdb cache is flushed to save memory.
|
241 |
+
*
|
242 |
+
* @since 1.6.7
|
243 |
+
* @author Grégory Viguier
|
244 |
+
*
|
245 |
+
* @param array $metas An array of meta names like:
|
246 |
+
* array(
|
247 |
+
* 'key1' => 'meta_name_1',
|
248 |
+
* 'key2' => 'meta_name_2',
|
249 |
+
* 'key3' => 'meta_name_3',
|
250 |
+
* )
|
251 |
+
* If a key contains 'data', the results will be unserialized.
|
252 |
+
* @param array $ids An array of post IDs.
|
253 |
+
* @return array An array of arrays of results like:
|
254 |
+
* array(
|
255 |
+
* 'key1' => array( post_id_1 => 'result_1', post_id_2 => 'result_2', post_id_3 => 'result_3' ),
|
256 |
+
* 'key2' => array( post_id_1 => 'result_4', post_id_3 => 'result_5' ),
|
257 |
+
* 'key3' => array( post_id_1 => 'result_6', post_id_2 => 'result_7' ),
|
258 |
+
* )
|
259 |
+
*/
|
260 |
+
function imagify_get_wpdb_metas( $metas, $ids ) {
|
261 |
+
if ( ! $ids ) {
|
262 |
+
return array_fill_keys( array_keys( $metas ), array() );
|
263 |
+
}
|
264 |
+
|
265 |
+
$sql_ids = implode( ',', $ids );
|
266 |
+
|
267 |
+
foreach ( $metas as $result_name => $meta_name ) {
|
268 |
+
$metas[ $result_name ] = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
269 |
+
"SELECT pm.post_id as id, pm.meta_value as value
|
270 |
+
FROM $wpdb->postmeta as pm
|
271 |
+
WHERE pm.meta_key = '$meta_name'
|
272 |
+
AND pm.post_id IN ( $sql_ids )
|
273 |
+
ORDER BY pm.post_id DESC",
|
274 |
+
ARRAY_A
|
275 |
+
);
|
276 |
+
|
277 |
+
$wpdb->flush();
|
278 |
+
$metas[ $result_name ] = imagify_query_results_combine( $ids, $metas[ $result_name ], true );
|
279 |
+
|
280 |
+
if ( strpos( $result_name, 'data' ) !== false ) {
|
281 |
+
$metas[ $result_name ] = array_map( 'maybe_unserialize', $metas[ $result_name ] );
|
282 |
+
}
|
283 |
+
}
|
284 |
+
|
285 |
+
return $metas;
|
286 |
+
}
|
inc/functions/attachments.php
CHANGED
@@ -21,23 +21,32 @@ function get_imagify_mime_type() {
|
|
21 |
*
|
22 |
* @since 1.0
|
23 |
*
|
24 |
-
* @param int $file_path The
|
25 |
-
* @return string
|
26 |
*/
|
27 |
function get_imagify_attachment_backup_path( $file_path ) {
|
28 |
-
$
|
29 |
-
|
30 |
-
$
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
42 |
return str_replace( $upload_basedir, $backup_dir, $file_path );
|
43 |
}
|
@@ -47,50 +56,57 @@ function get_imagify_attachment_backup_path( $file_path ) {
|
|
47 |
*
|
48 |
* @since 1.4.5
|
49 |
*
|
50 |
-
* @param int $
|
51 |
-
* @return string|false
|
52 |
*/
|
53 |
-
function get_imagify_attached_file( $
|
54 |
-
|
55 |
-
|
56 |
-
$uploads = wp_upload_dir();
|
57 |
|
58 |
-
|
59 |
-
|
60 |
-
}
|
61 |
}
|
62 |
|
63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
}
|
65 |
|
66 |
/**
|
67 |
-
* Retrieve the URL for an attachment based on
|
68 |
*
|
69 |
* @since 1.4.5
|
70 |
*
|
71 |
-
* @param
|
72 |
-
* @return string|bool
|
73 |
*/
|
74 |
-
function get_imagify_attachment_url( $
|
75 |
-
$
|
|
|
76 |
|
77 |
-
if (
|
78 |
-
return
|
79 |
}
|
80 |
|
81 |
-
|
82 |
-
|
|
|
|
|
83 |
// Replace file location with url location.
|
84 |
-
return str_replace( $
|
85 |
}
|
86 |
|
87 |
-
if ( false !== strpos( $
|
88 |
// Get the directory name relative to the basedir (back compat for pre-2.7 uploads).
|
89 |
-
return trailingslashit( $
|
90 |
}
|
91 |
|
92 |
// It's a newly-uploaded file, therefore $file is relative to the basedir.
|
93 |
-
return $
|
94 |
}
|
95 |
|
96 |
/**
|
@@ -134,3 +150,57 @@ function get_imagify_thumbnail_sizes() {
|
|
134 |
|
135 |
return $sizes;
|
136 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
*
|
22 |
* @since 1.0
|
23 |
*
|
24 |
+
* @param int $file_path The file path.
|
25 |
+
* @return string|bool The backup path. False on failure.
|
26 |
*/
|
27 |
function get_imagify_attachment_backup_path( $file_path ) {
|
28 |
+
static $backup_dir;
|
29 |
+
|
30 |
+
$file_path = wp_normalize_path( (string) $file_path );
|
31 |
+
$upload_basedir = get_imagify_upload_basedir();
|
32 |
+
|
33 |
+
if ( ! $file_path || ! $upload_basedir ) {
|
34 |
+
return false;
|
35 |
+
}
|
36 |
+
|
37 |
+
if ( ! isset( $backup_dir ) ) {
|
38 |
+
$backup_dir = $upload_basedir . 'backup/';
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Filter the backup directory path.
|
42 |
+
*
|
43 |
+
* @since 1.0
|
44 |
+
*
|
45 |
+
* @param string $backup_dir The backup directory path.
|
46 |
+
*/
|
47 |
+
$backup_dir = apply_filters( 'imagify_backup_directory', $backup_dir );
|
48 |
+
$backup_dir = trailingslashit( wp_normalize_path( $backup_dir ) );
|
49 |
+
}
|
50 |
|
51 |
return str_replace( $upload_basedir, $backup_dir, $file_path );
|
52 |
}
|
56 |
*
|
57 |
* @since 1.4.5
|
58 |
*
|
59 |
+
* @param int $file_path The file path.
|
60 |
+
* @return string|false The file path to where the attached file should be, false otherwise.
|
61 |
*/
|
62 |
+
function get_imagify_attached_file( $file_path ) {
|
63 |
+
$file_path = wp_normalize_path( (string) $file_path );
|
64 |
+
$upload_basedir = get_imagify_upload_basedir();
|
|
|
65 |
|
66 |
+
if ( ! $file_path || ! $upload_basedir ) {
|
67 |
+
return false;
|
|
|
68 |
}
|
69 |
|
70 |
+
// The file path is absolute.
|
71 |
+
if ( strpos( $file_path, '/' ) === 0 || preg_match( '|^.:\\\|', $file_path ) ) {
|
72 |
+
return false;
|
73 |
+
}
|
74 |
+
|
75 |
+
// Prepend upload dir.
|
76 |
+
return $upload_basedir . $file_path;
|
77 |
}
|
78 |
|
79 |
/**
|
80 |
+
* Retrieve the URL for an attachment based on file path.
|
81 |
*
|
82 |
* @since 1.4.5
|
83 |
*
|
84 |
+
* @param string $file_path A relative of absolute file path.
|
85 |
+
* @return string|bool File URL, otherwise false.
|
86 |
*/
|
87 |
+
function get_imagify_attachment_url( $file_path ) {
|
88 |
+
$file_path = wp_normalize_path( (string) $file_path );
|
89 |
+
$upload_basedir = get_imagify_upload_basedir();
|
90 |
|
91 |
+
if ( ! $file_path || ! $upload_basedir ) {
|
92 |
+
return false;
|
93 |
}
|
94 |
|
95 |
+
$upload_baseurl = get_imagify_upload_baseurl();
|
96 |
+
|
97 |
+
// Check that the upload base exists in the (absolute) file location.
|
98 |
+
if ( 0 === strpos( $file_path, $upload_basedir ) ) {
|
99 |
// Replace file location with url location.
|
100 |
+
return str_replace( $upload_basedir, $upload_baseurl, $file_path );
|
101 |
}
|
102 |
|
103 |
+
if ( false !== strpos( '/' . $file_path, '/wp-content/uploads/' ) ) {
|
104 |
// Get the directory name relative to the basedir (back compat for pre-2.7 uploads).
|
105 |
+
return trailingslashit( $upload_baseurl . _wp_get_attachment_relative_path( $file_path ) ) . basename( $file_path );
|
106 |
}
|
107 |
|
108 |
// It's a newly-uploaded file, therefore $file is relative to the basedir.
|
109 |
+
return $upload_baseurl . $file_path;
|
110 |
}
|
111 |
|
112 |
/**
|
150 |
|
151 |
return $sizes;
|
152 |
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* A simple helper to get the upload basedir.
|
156 |
+
*
|
157 |
+
* @since 1.6.7
|
158 |
+
* @author Grégory Viguier
|
159 |
+
*
|
160 |
+
* @return string|bool The path. False on failure.
|
161 |
+
*/
|
162 |
+
function get_imagify_upload_basedir() {
|
163 |
+
static $upload_basedir;
|
164 |
+
|
165 |
+
if ( isset( $upload_basedir ) ) {
|
166 |
+
return $upload_basedir;
|
167 |
+
}
|
168 |
+
|
169 |
+
$uploads = wp_upload_dir();
|
170 |
+
|
171 |
+
if ( false !== $uploads['error'] ) {
|
172 |
+
$upload_basedir = false;
|
173 |
+
return $upload_basedir;
|
174 |
+
}
|
175 |
+
|
176 |
+
$upload_basedir = trailingslashit( wp_normalize_path( $uploads['basedir'] ) );
|
177 |
+
|
178 |
+
return $upload_basedir;
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* A simple helper to get the upload baseurl.
|
183 |
+
*
|
184 |
+
* @since 1.6.7
|
185 |
+
* @author Grégory Viguier
|
186 |
+
*
|
187 |
+
* @return string|bool The path. False on failure.
|
188 |
+
*/
|
189 |
+
function get_imagify_upload_baseurl() {
|
190 |
+
static $upload_baseurl;
|
191 |
+
|
192 |
+
if ( isset( $upload_baseurl ) ) {
|
193 |
+
return $upload_baseurl;
|
194 |
+
}
|
195 |
+
|
196 |
+
$uploads = wp_upload_dir();
|
197 |
+
|
198 |
+
if ( false !== $uploads['error'] ) {
|
199 |
+
$upload_baseurl = false;
|
200 |
+
return $upload_baseurl;
|
201 |
+
}
|
202 |
+
|
203 |
+
$upload_baseurl = trailingslashit( $uploads['baseurl'] );
|
204 |
+
|
205 |
+
return $upload_baseurl;
|
206 |
+
}
|
inc/functions/deprecated.php
CHANGED
@@ -183,3 +183,22 @@ class Imagify_Deprecated {
|
|
183 |
return $this->http_call( $url, $args );
|
184 |
}
|
185 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
183 |
return $this->http_call( $url, $args );
|
184 |
}
|
185 |
}
|
186 |
+
|
187 |
+
|
188 |
+
if ( class_exists( 'WpeCommon' ) ) :
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Change the limit for the number of posts: WP Engine limits SQL queries size to 2048 octets (16384 characters).
|
192 |
+
*
|
193 |
+
* @since 1.4.7
|
194 |
+
* @since 1.6.7 Deprecated.
|
195 |
+
* @author Jonathan Buttigieg
|
196 |
+
*
|
197 |
+
* @return int
|
198 |
+
*/
|
199 |
+
function _imagify_wengine_unoptimized_attachment_limit() {
|
200 |
+
_deprecated_function( __FUNCTION__ . '()', '1.6.7', '_imagify_wpengine_unoptimized_attachment_limit()' );
|
201 |
+
return _imagify_wpengine_unoptimized_attachment_limit();
|
202 |
+
}
|
203 |
+
|
204 |
+
endif;
|
inc/functions/process.php
CHANGED
@@ -89,7 +89,7 @@ function do_imagify( $file_path, $args = array() ) {
|
|
89 |
|
90 |
// Send image for optimization and fetch the response.
|
91 |
$response = upload_imagify_image( array(
|
92 |
-
'image' =>
|
93 |
'data' => wp_json_encode( array(
|
94 |
'aggressive' => ( 1 === (int) $args['optimization_level'] ),
|
95 |
'ultra' => ( 2 === (int) $args['optimization_level'] ),
|
89 |
|
90 |
// Send image for optimization and fetch the response.
|
91 |
$response = upload_imagify_image( array(
|
92 |
+
'image' => $file_path,
|
93 |
'data' => wp_json_encode( array(
|
94 |
'aggressive' => ( 1 === (int) $args['optimization_level'] ),
|
95 |
'ultra' => ( 2 === (int) $args['optimization_level'] ),
|
readme.txt
CHANGED
@@ -3,7 +3,7 @@ Contributors: wp_media, GregLone
|
|
3 |
Tags: compress image, images, performance, optimization, photos, upload, resize, gif, png, jpg, reduce image size, retina
|
4 |
Requires at least: 3.7.0
|
5 |
Tested up to: 4.8.0
|
6 |
-
Stable tag: 1.6.
|
7 |
|
8 |
Dramatically reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth.
|
9 |
|
@@ -136,6 +136,15 @@ When the plugin is disabled, your existing images remain optimized. Backups of t
|
|
136 |
3. Media Page
|
137 |
|
138 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
= 1.6.6 =
|
140 |
* New: Compatibility with the plugin WP Offload S3 Lite. Your images now will be sent to Amazon S3 after being optimized. Also works when you store your images only on S3, not locally.
|
141 |
* Improvement: Added a filter to the asynchronous job arguments.
|
@@ -155,7 +164,7 @@ When the plugin is disabled, your existing images remain optimized. Backups of t
|
|
155 |
* Improvement: The discount is now automatically applied in when you buy from the plugin and a promotion is active
|
156 |
|
157 |
= 1.6.2 =
|
158 |
-
* Bug Fix: Correctly display the modal when clicking on the plan suggestion button on bulk
|
159 |
|
160 |
= 1.6.1 =
|
161 |
* Bug Fix: Better offer suggestion when your medias library is bigger than 3GB
|
3 |
Tags: compress image, images, performance, optimization, photos, upload, resize, gif, png, jpg, reduce image size, retina
|
4 |
Requires at least: 3.7.0
|
5 |
Tested up to: 4.8.0
|
6 |
+
Stable tag: 1.6.7
|
7 |
|
8 |
Dramatically reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth.
|
9 |
|
136 |
3. Media Page
|
137 |
|
138 |
== Changelog ==
|
139 |
+
= 1.6.7 =
|
140 |
+
* Improvement: Compatibility with the plugin WP Offload S3 Pro, and fixed a few things for both Lite and Pro versions.
|
141 |
+
* Improvement: Improved performance on the bulk optimization page for huge image libraries.
|
142 |
+
* Improvement: When performing a bulk optimization, moved the attachments with the "WELL DONE" message at the end of the queue, it helps to speed up things.
|
143 |
+
* Improvement: Use cURL directly only to optimize an image. It helps when cURL is not available: less things will break in that case.
|
144 |
+
* Bug Fix: Fixed a bug with the plugin Screets Live Chat, prior to version 2.2.8.
|
145 |
+
* Regression fix: Fixed the buffer size on the bulk optimization page.
|
146 |
+
* Dev stuff: Added a hook allowing to filter arguments when doing a request to our API. It can be used to increase the timeout value for example.
|
147 |
+
|
148 |
= 1.6.6 =
|
149 |
* New: Compatibility with the plugin WP Offload S3 Lite. Your images now will be sent to Amazon S3 after being optimized. Also works when you store your images only on S3, not locally.
|
150 |
* Improvement: Added a filter to the asynchronous job arguments.
|
164 |
* Improvement: The discount is now automatically applied in when you buy from the plugin and a promotion is active
|
165 |
|
166 |
= 1.6.2 =
|
167 |
+
* Bug Fix: Correctly display the modal when clicking on the plan suggestion button on bulk optimization page
|
168 |
|
169 |
= 1.6.1 =
|
170 |
* Bug Fix: Better offer suggestion when your medias library is bigger than 3GB
|