Wordfence Security – Firewall & Malware Scan - Version 6.3.3

Version Description

  • New: Malicious IPs are now preemptively blocked by a regularly-updated blacklist. [Premium Feature]
  • Improvement: Better layout and display for mobile screen sizes.
  • Improvement: Dashboard chart data is now updated more frequently.
  • Fix: Fixed database errors on notifications page on multisite installations.
  • Fix: Fixed site URL detection for multisite installations.
  • Fix: Fixed tour popup positioning on multisite.
  • Fix: Increased the z-index of the AJAX error watcher alert.
  • Fix: Addressed an additional way to enumerate authors with the REST JSON API.
Download this release

Release Info

Developer wfryan
Plugin Icon 128x128 Wordfence Security – Firewall & Malware Scan
Version 6.3.3
Comparing to
See all releases

Code changes from version 6.3.2 to 6.3.3

css/dt_table.css CHANGED
@@ -21,7 +21,7 @@ table.display thead th div.DataTables_sort_wrapper span{position:absolute;top:50
21
  .paginate_enabled_previous{background-image:url(../images/back_enabled.jpg)}
22
  .paginate_disabled_next{background-image:url(../images/forward_disabled.jpg)}
23
  .paginate_enabled_next{background-image:url(../images/forward_enabled.jpg)}
24
- table.display{width:800px;clear:both;border-collapse:collapse;margin:0 0 24px;background:#fff;position:relative;top:12px}
25
  table.display tfoot th{font-weight:400;padding:3px 8px 3px 8px}
26
  table.display tr.heading2 td{border-bottom:1px solid #aaa}
27
  table.display td{padding:5px 8px;border:1px solid #ccc}
@@ -46,7 +46,6 @@ td.details{background-color:#d1cfd0;border:2px solid #A19B9E}
46
  .paging_full_numbers span.paginate_button_disabled:hover {background:#fff}
47
  table.display tr.even.row_selected td{background-color:#B0BED9}
48
  table.display tr.odd.row_selected td{background-color:#9FAFD1}
49
- .sorting_1 {background:#f5f5f5}
50
  table.display td.center,.dataTables_empty{text-align:center}
51
  .dataTables_empty{background:#fff}
52
  .paging_full_numbers span.paginate_button{background-color:#fff}
21
  .paginate_enabled_previous{background-image:url(../images/back_enabled.jpg)}
22
  .paginate_disabled_next{background-image:url(../images/forward_disabled.jpg)}
23
  .paginate_enabled_next{background-image:url(../images/forward_enabled.jpg)}
24
+ table.display{max-width:800px;clear:both;border-collapse:collapse;margin:0 0 24px;background:#fff;position:relative;top:12px}
25
  table.display tfoot th{font-weight:400;padding:3px 8px 3px 8px}
26
  table.display tr.heading2 td{border-bottom:1px solid #aaa}
27
  table.display td{padding:5px 8px;border:1px solid #ccc}
46
  .paging_full_numbers span.paginate_button_disabled:hover {background:#fff}
47
  table.display tr.even.row_selected td{background-color:#B0BED9}
48
  table.display tr.odd.row_selected td{background-color:#9FAFD1}
 
49
  table.display td.center,.dataTables_empty{text-align:center}
50
  .dataTables_empty{background:#fff}
51
  .paging_full_numbers span.paginate_button{background-color:#fff}
css/main.css CHANGED
@@ -1 +1 @@
1
- .wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}@-ms-viewport{width:device-width}.wf-visible-xs{display:none !important}.wf-visible-sm{display:none !important}.wf-visible-md{display:none !important}.wf-visible-lg{display:none !important}.wf-visible-xs-block,.wf-visible-xs-inline,.wf-visible-xs-inline-block,.wf-visible-sm-block,.wf-visible-sm-inline,.wf-visible-sm-inline-block,.wf-visible-md-block,.wf-visible-md-inline,.wf-visible-md-inline-block,.wf-visible-lg-block,.wf-visible-lg-inline,.wf-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wf-visible-xs{display:block !important}table.wf-visible-xs{display:table !important}tr.wf-visible-xs{display:table-row !important}th.wf-visible-xs,td.wf-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wf-visible-xs-block{display:block !important}}@media (max-width: 767px){.wf-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wf-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm{display:block !important}table.wf-visible-sm{display:table !important}tr.wf-visible-sm{display:table-row !important}th.wf-visible-sm,td.wf-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md{display:block !important}table.wf-visible-md{display:table !important}tr.wf-visible-md{display:table-row !important}th.wf-visible-md,td.wf-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wf-visible-lg{display:block !important}table.wf-visible-lg{display:table !important}tr.wf-visible-lg{display:table-row !important}th.wf-visible-lg,td.wf-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wf-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wf-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wf-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wf-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wf-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-hidden-md{display:none !important}}@media (min-width: 1200px){.wf-hidden-lg{display:none !important}}.wf-visible-print{display:none !important}@media print{.wf-visible-print{display:block !important}table.wf-visible-print{display:table !important}tr.wf-visible-print{display:table-row !important}th.wf-visible-print,td.wf-visible-print{display:table-cell !important}}.wf-visible-print-block{display:none !important}@media print{.wf-visible-print-block{display:block !important}}.wf-visible-print-inline{display:none !important}@media print{.wf-visible-print-inline{display:inline !important}}.wf-visible-print-inline-block{display:none !important}@media print{.wf-visible-print-inline-block{display:inline-block !important}}@media print{.wf-hidden-print{display:none !important}}.wf-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container:before,.wf-container:after{content:" ";display:table}.wf-container:after{clear:both}@media (min-width: 768px){.wf-container{width:750px}}@media (min-width: 992px){.wf-container{width:970px}}@media (min-width: 1200px){.wf-container{width:1170px}}.wf-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container-fluid:before,.wf-container-fluid:after{content:" ";display:table}.wf-container-fluid:after{clear:both}.wf-row{margin-left:-15px;margin-right:-15px}.wf-row:before,.wf-row:after{content:" ";display:table}.wf-row:after{clear:both}.wf-col-xs-1,.wf-col-sm-1,.wf-col-md-1,.wf-col-lg-1,.wf-col-xs-2,.wf-col-sm-2,.wf-col-md-2,.wf-col-lg-2,.wf-col-xs-3,.wf-col-sm-3,.wf-col-md-3,.wf-col-lg-3,.wf-col-xs-4,.wf-col-sm-4,.wf-col-md-4,.wf-col-lg-4,.wf-col-xs-5,.wf-col-sm-5,.wf-col-md-5,.wf-col-lg-5,.wf-col-xs-6,.wf-col-sm-6,.wf-col-md-6,.wf-col-lg-6,.wf-col-xs-7,.wf-col-sm-7,.wf-col-md-7,.wf-col-lg-7,.wf-col-xs-8,.wf-col-sm-8,.wf-col-md-8,.wf-col-lg-8,.wf-col-xs-9,.wf-col-sm-9,.wf-col-md-9,.wf-col-lg-9,.wf-col-xs-10,.wf-col-sm-10,.wf-col-md-10,.wf-col-lg-10,.wf-col-xs-11,.wf-col-sm-11,.wf-col-md-11,.wf-col-lg-11,.wf-col-xs-12,.wf-col-sm-12,.wf-col-md-12,.wf-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wf-col-xs-1,.wf-col-xs-2,.wf-col-xs-3,.wf-col-xs-4,.wf-col-xs-5,.wf-col-xs-6,.wf-col-xs-7,.wf-col-xs-8,.wf-col-xs-9,.wf-col-xs-10,.wf-col-xs-11,.wf-col-xs-12{float:left}.wf-col-xs-1{width:8.33333%}.wf-col-xs-2{width:16.66667%}.wf-col-xs-3{width:25%}.wf-col-xs-4{width:33.33333%}.wf-col-xs-5{width:41.66667%}.wf-col-xs-6{width:50%}.wf-col-xs-7{width:58.33333%}.wf-col-xs-8{width:66.66667%}.wf-col-xs-9{width:75%}.wf-col-xs-10{width:83.33333%}.wf-col-xs-11{width:91.66667%}.wf-col-xs-12{width:100%}.wf-col-xs-pull-0{right:auto}.wf-col-xs-pull-1{right:8.33333%}.wf-col-xs-pull-2{right:16.66667%}.wf-col-xs-pull-3{right:25%}.wf-col-xs-pull-4{right:33.33333%}.wf-col-xs-pull-5{right:41.66667%}.wf-col-xs-pull-6{right:50%}.wf-col-xs-pull-7{right:58.33333%}.wf-col-xs-pull-8{right:66.66667%}.wf-col-xs-pull-9{right:75%}.wf-col-xs-pull-10{right:83.33333%}.wf-col-xs-pull-11{right:91.66667%}.wf-col-xs-pull-12{right:100%}.wf-col-xs-push-0{left:auto}.wf-col-xs-push-1{left:8.33333%}.wf-col-xs-push-2{left:16.66667%}.wf-col-xs-push-3{left:25%}.wf-col-xs-push-4{left:33.33333%}.wf-col-xs-push-5{left:41.66667%}.wf-col-xs-push-6{left:50%}.wf-col-xs-push-7{left:58.33333%}.wf-col-xs-push-8{left:66.66667%}.wf-col-xs-push-9{left:75%}.wf-col-xs-push-10{left:83.33333%}.wf-col-xs-push-11{left:91.66667%}.wf-col-xs-push-12{left:100%}.wf-col-xs-offset-0{margin-left:0%}.wf-col-xs-offset-1{margin-left:8.33333%}.wf-col-xs-offset-2{margin-left:16.66667%}.wf-col-xs-offset-3{margin-left:25%}.wf-col-xs-offset-4{margin-left:33.33333%}.wf-col-xs-offset-5{margin-left:41.66667%}.wf-col-xs-offset-6{margin-left:50%}.wf-col-xs-offset-7{margin-left:58.33333%}.wf-col-xs-offset-8{margin-left:66.66667%}.wf-col-xs-offset-9{margin-left:75%}.wf-col-xs-offset-10{margin-left:83.33333%}.wf-col-xs-offset-11{margin-left:91.66667%}.wf-col-xs-offset-12{margin-left:100%}.wf-col-xs-half-padding-left{padding-left:8px}.wf-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wf-col-sm-1,.wf-col-sm-2,.wf-col-sm-3,.wf-col-sm-4,.wf-col-sm-5,.wf-col-sm-6,.wf-col-sm-7,.wf-col-sm-8,.wf-col-sm-9,.wf-col-sm-10,.wf-col-sm-11,.wf-col-sm-12{float:left}.wf-col-sm-1{width:8.33333%}.wf-col-sm-2{width:16.66667%}.wf-col-sm-3{width:25%}.wf-col-sm-4{width:33.33333%}.wf-col-sm-5{width:41.66667%}.wf-col-sm-6{width:50%}.wf-col-sm-7{width:58.33333%}.wf-col-sm-8{width:66.66667%}.wf-col-sm-9{width:75%}.wf-col-sm-10{width:83.33333%}.wf-col-sm-11{width:91.66667%}.wf-col-sm-12{width:100%}.wf-col-sm-pull-0{right:auto}.wf-col-sm-pull-1{right:8.33333%}.wf-col-sm-pull-2{right:16.66667%}.wf-col-sm-pull-3{right:25%}.wf-col-sm-pull-4{right:33.33333%}.wf-col-sm-pull-5{right:41.66667%}.wf-col-sm-pull-6{right:50%}.wf-col-sm-pull-7{right:58.33333%}.wf-col-sm-pull-8{right:66.66667%}.wf-col-sm-pull-9{right:75%}.wf-col-sm-pull-10{right:83.33333%}.wf-col-sm-pull-11{right:91.66667%}.wf-col-sm-pull-12{right:100%}.wf-col-sm-push-0{left:auto}.wf-col-sm-push-1{left:8.33333%}.wf-col-sm-push-2{left:16.66667%}.wf-col-sm-push-3{left:25%}.wf-col-sm-push-4{left:33.33333%}.wf-col-sm-push-5{left:41.66667%}.wf-col-sm-push-6{left:50%}.wf-col-sm-push-7{left:58.33333%}.wf-col-sm-push-8{left:66.66667%}.wf-col-sm-push-9{left:75%}.wf-col-sm-push-10{left:83.33333%}.wf-col-sm-push-11{left:91.66667%}.wf-col-sm-push-12{left:100%}.wf-col-sm-offset-0{margin-left:0%}.wf-col-sm-offset-1{margin-left:8.33333%}.wf-col-sm-offset-2{margin-left:16.66667%}.wf-col-sm-offset-3{margin-left:25%}.wf-col-sm-offset-4{margin-left:33.33333%}.wf-col-sm-offset-5{margin-left:41.66667%}.wf-col-sm-offset-6{margin-left:50%}.wf-col-sm-offset-7{margin-left:58.33333%}.wf-col-sm-offset-8{margin-left:66.66667%}.wf-col-sm-offset-9{margin-left:75%}.wf-col-sm-offset-10{margin-left:83.33333%}.wf-col-sm-offset-11{margin-left:91.66667%}.wf-col-sm-offset-12{margin-left:100%}.wf-col-sm-half-padding-left{padding-left:8px}.wf-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wf-col-md-1,.wf-col-md-2,.wf-col-md-3,.wf-col-md-4,.wf-col-md-5,.wf-col-md-6,.wf-col-md-7,.wf-col-md-8,.wf-col-md-9,.wf-col-md-10,.wf-col-md-11,.wf-col-md-12{float:left}.wf-col-md-1{width:8.33333%}.wf-col-md-2{width:16.66667%}.wf-col-md-3{width:25%}.wf-col-md-4{width:33.33333%}.wf-col-md-5{width:41.66667%}.wf-col-md-6{width:50%}.wf-col-md-7{width:58.33333%}.wf-col-md-8{width:66.66667%}.wf-col-md-9{width:75%}.wf-col-md-10{width:83.33333%}.wf-col-md-11{width:91.66667%}.wf-col-md-12{width:100%}.wf-col-md-pull-0{right:auto}.wf-col-md-pull-1{right:8.33333%}.wf-col-md-pull-2{right:16.66667%}.wf-col-md-pull-3{right:25%}.wf-col-md-pull-4{right:33.33333%}.wf-col-md-pull-5{right:41.66667%}.wf-col-md-pull-6{right:50%}.wf-col-md-pull-7{right:58.33333%}.wf-col-md-pull-8{right:66.66667%}.wf-col-md-pull-9{right:75%}.wf-col-md-pull-10{right:83.33333%}.wf-col-md-pull-11{right:91.66667%}.wf-col-md-pull-12{right:100%}.wf-col-md-push-0{left:auto}.wf-col-md-push-1{left:8.33333%}.wf-col-md-push-2{left:16.66667%}.wf-col-md-push-3{left:25%}.wf-col-md-push-4{left:33.33333%}.wf-col-md-push-5{left:41.66667%}.wf-col-md-push-6{left:50%}.wf-col-md-push-7{left:58.33333%}.wf-col-md-push-8{left:66.66667%}.wf-col-md-push-9{left:75%}.wf-col-md-push-10{left:83.33333%}.wf-col-md-push-11{left:91.66667%}.wf-col-md-push-12{left:100%}.wf-col-md-offset-0{margin-left:0%}.wf-col-md-offset-1{margin-left:8.33333%}.wf-col-md-offset-2{margin-left:16.66667%}.wf-col-md-offset-3{margin-left:25%}.wf-col-md-offset-4{margin-left:33.33333%}.wf-col-md-offset-5{margin-left:41.66667%}.wf-col-md-offset-6{margin-left:50%}.wf-col-md-offset-7{margin-left:58.33333%}.wf-col-md-offset-8{margin-left:66.66667%}.wf-col-md-offset-9{margin-left:75%}.wf-col-md-offset-10{margin-left:83.33333%}.wf-col-md-offset-11{margin-left:91.66667%}.wf-col-md-offset-12{margin-left:100%}.wf-col-md-half-padding-left{padding-left:8px}.wf-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wf-col-lg-1,.wf-col-lg-2,.wf-col-lg-3,.wf-col-lg-4,.wf-col-lg-5,.wf-col-lg-6,.wf-col-lg-7,.wf-col-lg-8,.wf-col-lg-9,.wf-col-lg-10,.wf-col-lg-11,.wf-col-lg-12{float:left}.wf-col-lg-1{width:8.33333%}.wf-col-lg-2{width:16.66667%}.wf-col-lg-3{width:25%}.wf-col-lg-4{width:33.33333%}.wf-col-lg-5{width:41.66667%}.wf-col-lg-6{width:50%}.wf-col-lg-7{width:58.33333%}.wf-col-lg-8{width:66.66667%}.wf-col-lg-9{width:75%}.wf-col-lg-10{width:83.33333%}.wf-col-lg-11{width:91.66667%}.wf-col-lg-12{width:100%}.wf-col-lg-pull-0{right:auto}.wf-col-lg-pull-1{right:8.33333%}.wf-col-lg-pull-2{right:16.66667%}.wf-col-lg-pull-3{right:25%}.wf-col-lg-pull-4{right:33.33333%}.wf-col-lg-pull-5{right:41.66667%}.wf-col-lg-pull-6{right:50%}.wf-col-lg-pull-7{right:58.33333%}.wf-col-lg-pull-8{right:66.66667%}.wf-col-lg-pull-9{right:75%}.wf-col-lg-pull-10{right:83.33333%}.wf-col-lg-pull-11{right:91.66667%}.wf-col-lg-pull-12{right:100%}.wf-col-lg-push-0{left:auto}.wf-col-lg-push-1{left:8.33333%}.wf-col-lg-push-2{left:16.66667%}.wf-col-lg-push-3{left:25%}.wf-col-lg-push-4{left:33.33333%}.wf-col-lg-push-5{left:41.66667%}.wf-col-lg-push-6{left:50%}.wf-col-lg-push-7{left:58.33333%}.wf-col-lg-push-8{left:66.66667%}.wf-col-lg-push-9{left:75%}.wf-col-lg-push-10{left:83.33333%}.wf-col-lg-push-11{left:91.66667%}.wf-col-lg-push-12{left:100%}.wf-col-lg-offset-0{margin-left:0%}.wf-col-lg-offset-1{margin-left:8.33333%}.wf-col-lg-offset-2{margin-left:16.66667%}.wf-col-lg-offset-3{margin-left:25%}.wf-col-lg-offset-4{margin-left:33.33333%}.wf-col-lg-offset-5{margin-left:41.66667%}.wf-col-lg-offset-6{margin-left:50%}.wf-col-lg-offset-7{margin-left:58.33333%}.wf-col-lg-offset-8{margin-left:66.66667%}.wf-col-lg-offset-9{margin-left:75%}.wf-col-lg-offset-10{margin-left:83.33333%}.wf-col-lg-offset-11{margin-left:91.66667%}.wf-col-lg-offset-12{margin-left:100%}.wf-col-lg-half-padding-left{padding-left:8px}.wf-col-lg-half-padding-right{padding-right:7px}}.wrap.wordfence{direction:ltr;min-width:1024px}.wrap.wordfence>.wf-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wrap.wordfence h3{font-size:1.15em}a{color:#00709e}.wordfenceWrap{margin:20px 0 0 20px}.wordfence-icon32{width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:7px 5px 0 0;float:left}#wfHeading{white-space:nowrap}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}div.wordfence-lock-icon{background-image:url(../images/wordfence-logo-32x32.png)}a.wfhelp{background-image:url(../images/help.png);width:12px;height:12px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../images/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../images/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../images/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../images/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}img.wfFlag{vertical-align:middle;margin:-3px 4px 0 0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle}.wf-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wf-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:2px 8px 2px 24px;z-index:100000;position:fixed;right:2px;bottom:2px;border:1px solid #000;background-color:#F00;color:#FFF;font-size:12px;font-weight:bold;font-family:Arial;text-align:center;background-image:url("../images/icons/ajaxRed16.gif");background-position:2px 2px;background-repeat:no-repeat}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:Trebuchet, Arial, sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wf-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wf-striped-table th,.wf-striped-table td{padding:6px 4px;border:1px solid #ccc}.wf-striped-table thead th,.wf-striped-table thead td,.wf-striped-table tfoot th,.wf-striped-table tfoot td,.wf-striped-table tbody.thead th,.wf-striped-table tbody.thead td{background-color:#222;color:#fff;font-weight:bold;border-color:#474747;text-align:left}.wf-striped-table tbody tr.even td,.wf-striped-table tbody tr:nth-child(2n) td{background-color:#eee}.wf-striped-table tbody tr td,.wf-striped-table tbody tr.odd td{background-color:#fff}.wf-striped-table tbody tr:hover>td{background-color:#fffbd8}.wf-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wf-striped-table td.error{color:#d0514c;font-weight:bold}.wf-striped-table td.error:before{content:"\2718"}.wf-striped-table td.success{color:#008c10;font-weight:bold;max-width:20%}.wf-striped-table td.success:before{content:"\2713"}.wf-striped-table td.success:before,.wf-striped-table td.error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wf-striped-table td.inactive{font-weight:bold;color:#666666}.wordfence-waiting{line-height:32px}.wordfence-waiting img{vertical-align:middle}pre.wf-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wf-center{text-align:center}#wfConfigForm{max-width:1035px}.wf-hidden{display:none !important}.wf-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-card .wf-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wf-card .wf-card-inner .wf-card-content{max-width:75%}.wf-card .wf-card-inner .wf-card-content .wf-card-title{font-size:1.125rem;width:100%}.wf-card .wf-card-inner .wf-card-content .wf-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wf-card .wf-card-inner .wf-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-card .wf-card-inner .wf-card-action .wf-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox.checked{background-position:right center}.wf-card .wf-card-extra{display:none;padding:16px;margin-top:1rem;border-top:1px solid #f3f6f8}.wf-card.active .wf-card-extra{display:block}.wf-card.wf-card-left .wf-card-content{margin-left:48px}.wf-card.wf-card-left .wf-card-action{right:auto;left:0px}.wf-card.disabled .wf-card-content .wf-card-title{color:#aaaaaa}.wf-card.disabled .wf-card-content .wf-card-subtitle{color:#8ea6be}.wf-add-top{margin-top:20px !important}.wf-add-top-small{margin-top:10px !important}.wf-add-bottom{margin-bottom:20px !important}.wf-add-bottom-small{margin-bottom:10px !important}.wf-center{text-align:center}.wf-right{text-align:right}.wf-scroll-x::-webkit-scrollbar,.wf-scroll-y::-webkit-scrollbar{-webkit-appearance:none;width:7px;height:7px}.wf-scroll-x::-webkit-scrollbar-thumb,.wf-scroll-y::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgba(0,0,0,0.194);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5)}.select2-container{min-width:320px}#wf-notices{margin-top:15px}#wf-notices .wf-admin-notice{margin-left:0px;margin-right:0px}.wf-success-text,.wf-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wf-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wf-notice-text{color:#6d798c}.wf-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wf-success-text{color:#11967a}.wf-premium-callout{border:1px solid #00709e;background-color:#ffffff;padding:16px;margin:20px 0 0}.wf-premium-callout h3{margin:0 0 8px;color:#11967a}.wf-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wf-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wf-premium-callout .center{text-align:center;margin:0}.wf-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}#wfLiveTrafficOverlayAnchor::after{position:absolute;z-index:3002;top:0;right:0;width:0;height:0;background:rgba(241,241,241,0.6);content:'';opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused #wfLiveTrafficOverlayAnchor::after{width:100%;height:100%;opacity:1;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}#wordfenceLiveActivityDisabled{background:#fff;border-left:4px solid #ffb900;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin-bottom:12px;padding:1px 13px;max-width:900px}#wfLiveTrafficDisabledMessage{display:none;position:fixed;z-index:3003;left:0;width:100%;top:50%;transform:translateY(-50%);text-align:center;color:#666666;opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}#wfLiveTrafficDisabledMessage h2{background-color:#FFF;overflow:hidden;border:1px solid #CCC;max-width:350px;margin:0 auto;padding:15px;font-size:2.0em}#wfLiveTrafficDisabledMessage h2 small{font-size:0.5em;font-weight:normal;margin-top:20px}.wordfenceLiveActivityPaused #wfLiveTrafficDisabledMessage{display:block;opacity:1;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}.wf-live-activity{position:relative;margin:20px 0 10px 0;padding:0.75rem;box-sizing:border-box;background:#FFFCEF;box-shadow:0 0 0 1px rgba(153,155,135,0.5),0 1px 2px #e8f3e0}.wf-live-activity .wf-live-activity-inner{width:100%;box-sizing:border-box;position:relative}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:flex-start}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-title{color:#888888;font-size:0.85rem;font-weight:bold;padding-right:0.5rem}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-message{font-size:0.80rem;color:#000000}.wf-live-activity .wf-live-activity-inner .wf-live-activity-state{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background:rgba(255,252,239,0.9);display:none;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:center;z-index:3001;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused .wf-live-activity .wf-live-activity-inner .wf-live-activity-state{display:-ms-flexbox;display:flex;opacity:1;-webkit-transition:opacity 0.5s;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}.wordfence .wordfenceScanButton{margin:20px 0 20px 0}.wordfence .wordfenceScanButton input.button-wf-grey{background:#EFEFEF url(../images/button-grad-grey.png) repeat-x scroll left top;border-color:#EFEFEF}.wordfence .wordfenceScanButton table td{vertical-align:top}.wordfence .wordfenceScanButton .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E;height:44px;line-height:44px;padding:0px 20px}table.wfSummaryParent{font-family:sans-serif;font-size:14px;color:#000;z-index:9}table.wfSummaryParent td{vertical-align:top;padding:0;margin:0}table.wfSummaryParent table.wfSummaryChild th{font-weight:bold;text-align:right;font-family:Georgia,Times New Roman,Times,serif;color:#000;padding:5px 10px 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSummaryChild td{font-weight:normal;text-align:left;padding:5px 0 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSC1 td{width:300px;padding:0 25px 10px 0}table.wfSummaryParent table.wfSC2 th{width:80px}table.wfSummaryParent table.wfSC2 td{width:100px}table.wfSummaryParent table.wfSC3 th{width:80px}table.wfSummaryParent table.wfSC3 td{width:250px}table.wfSummaryParent th.wfHead{font-size:22px;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;color:#555;font-weight:bold;text-align:left;padding:20px 0 20px 0;-webkit-font-smoothing:antialiased}div.wfIssue table.wfIssue td{padding:2px;margin:0;border-width:0;text-align:left}div.wfIssue table.wfIssue th{padding:2px;margin:0;font-weight:bold;text-align:left;color:#777}div.wfIssue table.wfIssueLinks td{border-width:0;text-align:left;padding-right:10px}div.wfIssue h2{margin:0 0 5px 0;padding:0}.wfIssueOptions{border-top:1px solid #CCC;padding:10px}.wfIssueOptions a{margin-left:10px}.wfIssueOptions strong{float:left;display:block;width:60px}.wfIssueOptions p{margin:6px 0px 0px}.wfProbSev1,.wfProbSev2,.wfAjaxLight128,.wfResolved{width:128px;height:128px;border:0;margin:0 auto;background-repeat:no-repeat;background-position:0 0;text-decoration:none;display:block}.wfProbSev1{background-image:url(../images/icons/error128.png)}.wfProbSev2{background-image:url(../images/icons/warning128.png)}.wfResolved{background-image:url(../images/icons/tick128.png)}.wfIssuesContainer{width:100%;display:none}.wfIssuesContainer p{width:550px}.wfALogTime{color:#999}.wfALogMailLink,.wfALogViewLink{display:block;position:absolute;padding:0 0 0 18px;margin:0;right:10px;top:0;background-repeat:no-repeat;font-weight:normal}.wfALogMailLink{background-image:url(../images/icons/email_go.png)}.wfALogViewLink{background-image:url(../images/icons/magnifier.png)}#wfActivity{position:relative}.consoleHead{position:relative;padding:0 0 0 3px;font-weight:bold;width:100%}.consoleHeadText{margin-bottom:4px;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;color:#555;font-weight:bold;-webkit-font-smoothing:antialiased}.consoleFooter{position:relative}.consoleOuter{width:100%}.consoleInner{height:116px;overflow:auto;z-index:1}.bevelDiv1{border:1px solid #EFEFEF}.bevelDiv2{border:1px solid #AAA}.bevelDiv3{background-color:#ffffed;padding:5px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}.wfSecure{color:#0A0;font-weight:bold}.wfSummaryDate{float:left;margin-left:3px}.wfSummaryMsg{float:left;margin-left:3px}.wfSummaryResult{float:right;text-align:left;width:280px}.wfSummaryLoading{width:16px;height:11px;background-image:url("../images/icons/ajaxScan.gif")}.wfSummaryBad,.wfSummaryErr{color:#930000}.wfSummaryOK{color:#11967a}.wfClear{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}.wfSummaryFinal{-webkit-font-smoothing:antialiased;font-weight:bold;color:#555}.wfStartScanButton{text-align:center}.wordfenceScanHelp{border:1px solid #CCC;padding:4px}.wf-scan-no-issues{font-size:1.25rem;color:#11967a}.scan-schedule{border-collapse:collapse;border-spacing:0}.scan-schedule td{padding:0}.scan-schedule th{padding:0 8px 0 0}.next-scan{font-size:1em;display:block;position:relative;width:7em;height:7em;background-color:#fff;border-radius:0.6em;box-shadow:0 1px 0 rgba(189,189,189,0.6);overflow:hidden}.next-scan *{display:block;width:100%;font-size:1em;font-weight:bold;font-style:normal;text-align:center}.next-scan strong{position:absolute;top:0;padding:0.4em 0;color:#fff;background-color:#00709E;box-shadow:0 2px 0 #00709E}.next-scan em{position:absolute;bottom:0.3em;color:#00709E}.next-scan span{width:100%;font-size:2.8em;padding-top:1.15em;color:#2f2f2f}.schedule-times{margin-bottom:0;padding-left:0;list-style:none;clear:both}.schedule-times>li{float:left;position:relative;display:block;margin:0px 0px 2px 0px}.schedule-times>li.disabled>a{color:#777}.schedule-times>li.disabled>a:hover,.schedule-times>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.schedule-times>li>a{text-decoration:none;border:1px solid #e2e2e2;border-radius:4px;position:relative;display:block;padding:8px 12px}.schedule-times>li>a:hover,.schedule-times>li>a:focus{text-decoration:none;background-color:#e2e2e2}.schedule-times>li+li{margin-left:2px}.schedule-times>li.active>a,.schedule-times>li.active>a:hover,.schedule-times>li.active>a:focus{color:#fff;background-color:#00709e;border-color:#00709e}.schedule-times>li.text-only{position:relative;display:block;padding:8px 12px}.schedule-times>li>a>img{max-width:none}#wf-lt-listings .wfActEvent{padding-left:15px;border-left:5px solid #cccccc}#wf-lt-listings .wfActEvent.wfHuman{border-left:5px solid #16bc9b}#wf-lt-listings .wfActEvent.wfActionBlocked{border-left:5px solid #d03935}#wf-lt-listings .wfActEvent.wfNotice{border-left:5px solid #c10000}#wf-lt-listings .wfActEvent.wfWarning,#wf-lt-listings .wfActEvent.wf404{border-left:5px solid #ffd10a}#wf-lt-listings .wfActEvent:hover{background-color:#fff9e9 !important}#wf-live-traffic{position:relative;overflow:visible}#wf-live-traffic-legend{white-space:nowrap;background-color:#fff;border:1px solid #cccccc;padding:12px}#wf-live-traffic-legend.sticky{position:fixed;top:42px;right:auto;left:182px;z-index:2000}#wf-live-traffic-legend-placeholder{display:none;padding:12px}#wf-live-traffic-legend-placeholder.sticky{display:block}#wf-live-traffic-legend ul{margin:0;padding:0}#wf-live-traffic-legend ul:before,#wf-live-traffic-legend ul:after{content:" ";display:table}#wf-live-traffic-legend ul:after{clear:both}#wf-live-traffic-legend ul li{margin:0;padding:0;position:relative;float:left}#wf-live-traffic-legend ul li+li{margin-left:8px}#wf-live-traffic-legend ul li:before{content:'';display:block;float:left;margin:3px 6px 0 0;width:12px;height:12px;background-color:#CCCCCC}#wf-live-traffic-legend ul li.wfHuman:before{background-color:#16bc9b}#wf-live-traffic-legend ul li.wfNotice:before{background-color:#ffd10a}#wf-live-traffic-legend ul li.wfBlocked:before{background-color:#d03935}.wfTimeAgo{font-family:Georgia,Times New Roman,Times,serif;color:#999;font-weight:bold;font-style:italic}.wfActEvent{border-bottom:1px solid #CCC;padding:10px 20px;overflow:auto}.wf-pad-small{margin:8px 0}#wf-lt-listings{margin:0 0 0}#wf-lt-listings a{cursor:pointer;text-decoration:underline}#wf-lt-listings a.button,#wf-lt-listings a.wf-btn{text-decoration:none}.wfActionBlocked{background-color:#fff6f6}[class*="span"]{float:left;min-height:1px;margin-left:30px}.highlighted{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-moz-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-webkit-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-moz-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@-webkit-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}.highlighted{-webkit-animation-name:highlighted;animation-name:highlighted}.highlighted.wfActionBlocked{-webkit-animation-name:highlightedBlocked;animation-name:highlightedBlocked}#wf-lt-preset-filters{min-width:250px}#wf-lt-advanced-filters>table{width:100%}#wf-lt-advanced-filters>table>tr>td{vertical-align:top}.wf-lt-url{white-space:nowrap}table.block-ranges-table{border-collapse:collapse;margin:10px 0 0}table.block-ranges-table tr td{border:1px solid #CCC;border-width:1px 0;padding:10px 0 12px 0}#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:18px}.wafStatus-enabled,.wafStatus-learning-mode,.wafStatus-disabled,.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__rendered{color:#ffffff}#waf-config-form .waf-config-label{font-size:1.3em}#waf-config-form .select2-container--default .select2-selection--single{padding:4px;text-shadow:0 0 3px #000000;font-weight:bold;border-radius:3px}#waf-config-form .select2-container .select2-selection--single{height:auto}.wafStatus-enabled.select2-container--default .select2-selection--single{background-color:#11967a;border-color:#073a2f}.wafStatus-learning-mode.select2-container--default .select2-selection--single{background-color:#ffd10a;border-color:#a38400}.wafStatus-disabled.select2-container--default .select2-selection--single,.wafStatus-disabled.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-learning-mode.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-enabled.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#c10000;border-color:#5b0000}#waf-config-form .select2-container--default .select2-selection--single .select2-selection__arrow{height:100%;top:0}.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#ffffff transparent transparent}.wafStatus-enabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #ffffff}.wafStatus-description{display:none;max-width:500px;font-style:italic;font-size:14px;line-height:1.3}table.whitelist-table .whitelist-edit{display:none}table.whitelist-table .edit-mode .whitelist-display{display:none}table.whitelist-table .edit-mode .whitelist-edit{display:block}table.whitelist-table .edit-mode span.whitelist-edit,table.whitelist-table .edit-mode input.whitelist-edit{display:inline}.wf-bulk-action{margin:12px 0}tr.wf-table-filters input{max-width:120px}#wordfenceRightRail img{max-width:100%}#wordfenceRightRail ul{list-style-type:none;margin:0;margin-top:15px}#wordfenceRightRail .center{text-align:center}#wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wordfenceRightRail img{width:100%}.wordfenceRightRailLiveTraffic,.wordfenceRightRailOptions,.wordfenceRightRailDiagnostics{margin-left:1055px}.wordfenceRightRailBlockedIPs,.wordfenceRightRailWAF,.wordfenceRightRailCountryBlocking,.wordfenceRightRailScanSchedule{margin-left:950px}.wordfenceRightRail ul{list-style-type:none;margin:0}.wordfenceRightRail .center{text-align:center}.wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wordfenceWrap.wordfence-community{min-height:760px}#wfTwoFactorQRCodeTable{width:256px;height:256px;margin:0 auto}#wfTwoFactorRecoveryCodes{list-style-type:none}#wfTwoFactorRecoveryCodes li{font-family:monospace;text-align:center}#wfTwoFactorDownload .dashicons{line-height:26px}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}label.wf-plain{font-weight:normal}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857;color:#555}.wf-form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wf-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wf-form-control::-moz-placeholder{color:#999;opacity:1}.wf-form-control:-ms-input-placeholder{color:#999}.wf-form-control::-webkit-input-placeholder{color:#999}.wf-form-control::-ms-expand{border:0;background-color:transparent}.wf-form-control[disabled],.wf-form-control[readonly],fieldset[disabled] .wf-form-control{background-color:#e2e2e2;opacity:1}.wf-form-control[disabled],fieldset[disabled] .wf-form-control{cursor:not-allowed}textarea.wf-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wf-form-control,input[type="time"].wf-form-control,input[type="datetime-local"].wf-form-control,input[type="month"].wf-form-control{line-height:34px}input[type="date"].wf-input-sm,.wf-input-group-sm input[type="date"],input[type="time"].wf-input-sm,.wf-input-group-sm input[type="time"],input[type="datetime-local"].wf-input-sm,.wf-input-group-sm input[type="datetime-local"],input[type="month"].wf-input-sm,.wf-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wf-input-lg,.wf-input-group-lg input[type="date"],input[type="time"].wf-input-lg,.wf-input-group-lg input[type="time"],input[type="datetime-local"].wf-input-lg,.wf-input-group-lg input[type="datetime-local"],input[type="month"].wf-input-lg,.wf-input-group-lg input[type="month"]{line-height:46px}}.wf-form-group{margin-bottom:8px}.wf-form-group.wf-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wf-form-group.wf-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wf-form-group.wf-focus label{margin-left:-4px}.wf-radio,.wf-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wf-radio label,.wf-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wf-radio input[type="radio"],.wf-radio-inline input[type="radio"],.wf-checkbox input[type="checkbox"],.wf-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wf-radio+.wf-radio,.wf-checkbox+.wf-checkbox{margin-top:-5px}.wf-radio-inline,.wf-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wf-radio-inline+.wf-radio-inline,.wf-checkbox-inline+.wf-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].wf-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].wf-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.wf-radio-inline.wf-disabled,fieldset[disabled] .wf-radio-inline,.wf-checkbox-inline.wf-disabled,fieldset[disabled] .wf-checkbox-inline{cursor:not-allowed}.wf-radio.wf-disabled label,fieldset[disabled] .wf-radio label,.wf-checkbox.wf-disabled label,fieldset[disabled] .wf-checkbox label{cursor:not-allowed}.wf-form-control-static{padding-top:7px;padding-bottom:7px;margin:0;line-height:1}.wf-form-control-static.wf-input-lg,.wf-form-control-static.wf-input-sm{padding-left:0;padding-right:0}.wf-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wf-input-sm{height:30px;line-height:30px}textarea.wf-input-sm,select[multiple].wf-input-sm{height:auto}.wf-form-group-sm .wf-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wf-form-group-sm select.wf-form-control{height:30px;line-height:30px}.wf-form-group-sm textarea.wf-form-control,.wf-form-group-sm select[multiple].wf-form-control{height:auto}.wf-form-group-sm .wf-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wf-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wf-input-lg{height:46px;line-height:46px}textarea.wf-input-lg,select[multiple].wf-input-lg{height:auto}.wf-form-group-lg .wf-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-form-group-lg select.wf-form-control{height:46px;line-height:46px}.wf-form-group-lg textarea.wf-form-control,.wf-form-group-lg select[multiple].wf-form-control{height:auto}.wf-form-group-lg .wf-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wf-has-feedback{position:relative}.wf-has-feedback .wf-form-control{padding-right:42.5px}.wf-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.wf-input-lg+.wf-form-control-feedback,.wf-input-group-lg+.wf-form-control-feedback,.wf-form-group-lg .wf-form-control+.wf-form-control-feedback{width:46px;height:46px;line-height:46px}.wf-input-sm+.wf-form-control-feedback,.wf-input-group-sm+.wf-form-control-feedback,.wf-form-group-sm .wf-form-control+.wf-form-control-feedback{width:30px;height:30px;line-height:30px}.wf-has-success .wf-help-block,.wf-has-success .wf-control-label,.wf-has-success .wf-radio,.wf-has-success .wf-checkbox,.wf-has-success .wf-radio-inline,.wf-has-success .wf-checkbox-inline,.wf-has-success.wf-radio label,.wf-has-success.wf-checkbox label,.wf-has-success.wf-radio-inline label,.wf-has-success.wf-checkbox-inline label{color:#3c763d}.wf-has-success .wf-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-success .wf-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wf-has-success .wf-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wf-has-success .wf-form-control-feedback{color:#3c763d}.wf-has-warning .wf-help-block,.wf-has-warning .wf-control-label,.wf-has-warning .wf-radio,.wf-has-warning .wf-checkbox,.wf-has-warning .wf-radio-inline,.wf-has-warning .wf-checkbox-inline,.wf-has-warning.wf-radio label,.wf-has-warning.wf-checkbox label,.wf-has-warning.wf-radio-inline label,.wf-has-warning.wf-checkbox-inline label{color:#8a6d3b}.wf-has-warning .wf-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-warning .wf-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wf-has-warning .wf-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wf-has-warning .wf-form-control-feedback{color:#8a6d3b}.wf-has-error .wf-help-block,.wf-has-error .wf-control-label,.wf-has-error .wf-radio,.wf-has-error .wf-checkbox,.wf-has-error .wf-radio-inline,.wf-has-error .wf-checkbox-inline,.wf-has-error.wf-radio label,.wf-has-error.wf-checkbox label,.wf-has-error.wf-radio-inline label,.wf-has-error.wf-checkbox-inline label{color:#a94442}.wf-has-error .wf-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-error .wf-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wf-has-error .wf-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wf-has-error .wf-form-control-feedback{color:#a94442}.wf-has-feedback label ~ .wf-form-control-feedback{top:25px}.wf-has-feedback label.wf-sr-only ~ .wf-form-control-feedback{top:0}.wf-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wf-form-inline .wf-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-form-control{display:inline-block;width:auto;vertical-align:middle}.wf-form-inline .wf-form-control-static{display:inline-block}.wf-form-inline .wf-input-group{display:inline-table;vertical-align:middle}.wf-form-inline .wf-input-group .wf-input-group-addon,.wf-form-inline .wf-input-group .wf-input-group-btn,.wf-form-inline .wf-input-group .wf-form-control{width:auto}.wf-form-inline .wf-input-group>.wf-form-control{width:100%}.wf-form-inline .wf-control-label{margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio,.wf-form-inline .wf-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio label,.wf-form-inline .wf-checkbox label{padding-left:0}.wf-form-inline .wf-radio input[type="radio"],.wf-form-inline .wf-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wf-form-inline .wf-has-feedback .wf-form-control-feedback{top:0}}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox,.wf-form-horizontal .wf-radio-inline,.wf-form-horizontal .wf-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox{min-height:27px}.wf-form-horizontal .wf-form-group{margin-left:-15px;margin-right:-15px}.wf-form-horizontal .wf-form-group:before,.wf-form-horizontal .wf-form-group:after{content:" ";display:table}.wf-form-horizontal .wf-form-group:after{clear:both}@media (min-width: 768px){.wf-form-horizontal .wf-control-label{text-align:right;margin-bottom:0;padding-top:7px}}.wf-form-horizontal .wf-has-feedback .wf-form-control-feedback{right:15px}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-lg .wf-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-sm .wf-control-label{padding-top:6px;font-size:12px}}.wf-dashboard-item{position:relative;margin:0 auto 1rem;padding:0 1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-dashboard-item .wf-dashboard-item-inner{min-height:44px;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content{max-width:75%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-title{font-size:0.75rem;width:100%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text{width:auto}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-success{color:#11967a}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning a{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox.checked{background-position:right center}.wf-dashboard-item .wf-dashboard-item-extra{display:none;margin:0 -1rem;padding:0 1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list{margin:0 -1rem;padding:0;list-style:none}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #eeeeee;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>.wf-dashboard-item-list>li{border-top:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0;border-left:1px solid #eeeeee}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>*:first-child{border-left:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-enabled .fa{color:#11967a}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-disabled .fa{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-premium{color:#9f9fa0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss{padding-left:2rem;font-size:1.25rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss a{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-count{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wf-dashboard-item.active .wf-dashboard-item-extra{display:block}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-content{margin-left:48px}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-action{right:auto;left:0px}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-title{color:#aaaaaa}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-subtitle{color:#8ea6be}.wf-notifications-empty{font-size:0.9rem;color:#9f9fa0}.wf-dashboard-graph-wrapper{width:100%}.wf-dashboard-badge{display:inline-block;min-width:10px;padding:3px 7px;margin-left:0.5rem;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#fcb214;border-radius:10px}.wf-dashboard-badge:empty{display:none}.wf-btn .wf-dashboard-badge{position:relative;top:-1px}.wf-btn-xs .wf-dashboard-badge,.wf-btn-group-xs>.wf-btn .wf-dashboard-badge{top:0;padding:1px 5px}.wf-list-group-item.active>.wf-dashboard-badge,.wf-nav-pills>.active>a>.wf-dashboard-badge{color:#00709e;background-color:#fff}.wf-list-group-item>.wf-dashboard-badge{float:right}.wf-list-group-item>.wf-dashboard-badge+.wf-dashboard-badge{margin-right:5px}.wf-nav-pills>li>a>.wf-dashboard-badge{margin-left:3px}.wf-dashboard-toggle-btns{text-align:center}.wf-dashboard-toggle-btns .wf-pagination{margin:1rem 1rem 0.5rem 1rem}.wf-dashboard-show-more{position:relative;font-size:14px;color:#959595;text-align:center;line-height:1rem;background:#ffffff;width:60%;margin:20px auto 0 auto}.wf-dashboard-show-more:before{display:inline-block;content:"";position:absolute;height:1px;background:#dddddd;top:50%;width:100%;left:0;right:0}.wf-dashboard-show-more a{display:inline-block;position:relative;padding:0 10px;background-color:#ffffff}.wf-ips,.wf-recent-logins,.wf-countries{max-height:30rem;overflow-y:hidden;margin-bottom:20px}.wf-ips .wf-table,.wf-recent-logins .wf-table,.wf-countries .wf-table{margin-bottom:0}table.wf-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wf-table td,table.wf-table th{padding:0}.wf-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wf-table th{text-align:left}.wf-table{width:100%;max-width:100%;margin-bottom:20px}.wf-table>thead>tr>th,.wf-table>thead>tr>td,.wf-table>tbody>tr>th,.wf-table>tbody>tr>td,.wf-table>tfoot>tr>th,.wf-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wf-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wf-table>caption+thead>tr:first-child>th,.wf-table>caption+thead>tr:first-child>td,.wf-table>colgroup+thead>tr:first-child>th,.wf-table>colgroup+thead>tr:first-child>td,.wf-table>thead:first-child>tr:first-child>th,.wf-table>thead:first-child>tr:first-child>td{border-top:0}.wf-table>tbody+tbody{border-top:2px solid #ddd}.wf-table .wf-table{background-color:#fff}.wf-table-condensed>thead>tr>th,.wf-table-condensed>thead>tr>td,.wf-table-condensed>tbody>tr>th,.wf-table-condensed>tbody>tr>td,.wf-table-condensed>tfoot>tr>th,.wf-table-condensed>tfoot>tr>td{padding:5px}.wf-table-bordered{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td,.wf-table-bordered>tbody>tr>th,.wf-table-bordered>tbody>tr>td,.wf-table-bordered>tfoot>tr>th,.wf-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td{border-bottom-width:2px}.wf-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wf-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wf-table col[class*="col-"]{position:static;float:none;display:table-column}table.wf-table td[class*="col-"],table.wf-table th[class*="col-"]{position:static;float:none;display:table-cell}.wf-table>thead>tr>td.active,.wf-table>thead>tr>th.active,.wf-table>thead>tr.active>td,.wf-table>thead>tr.active>th,.wf-table>tbody>tr>td.active,.wf-table>tbody>tr>th.active,.wf-table>tbody>tr.active>td,.wf-table>tbody>tr.active>th,.wf-table>tfoot>tr>td.active,.wf-table>tfoot>tr>th.active,.wf-table>tfoot>tr.active>td,.wf-table>tfoot>tr.active>th{background-color:#f5f5f5}.wf-table-hover>tbody>tr>td.active:hover,.wf-table-hover>tbody>tr>th.active:hover,.wf-table-hover>tbody>tr.active:hover>td,.wf-table-hover>tbody>tr:hover>.active,.wf-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wf-table>thead>tr>td.success,.wf-table>thead>tr>th.success,.wf-table>thead>tr.success>td,.wf-table>thead>tr.success>th,.wf-table>tbody>tr>td.success,.wf-table>tbody>tr>th.success,.wf-table>tbody>tr.success>td,.wf-table>tbody>tr.success>th,.wf-table>tfoot>tr>td.success,.wf-table>tfoot>tr>th.success,.wf-table>tfoot>tr.success>td,.wf-table>tfoot>tr.success>th{background-color:#dff0d8}.wf-table-hover>tbody>tr>td.success:hover,.wf-table-hover>tbody>tr>th.success:hover,.wf-table-hover>tbody>tr.success:hover>td,.wf-table-hover>tbody>tr:hover>.success,.wf-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wf-table>thead>tr>td.info,.wf-table>thead>tr>th.info,.wf-table>thead>tr.info>td,.wf-table>thead>tr.info>th,.wf-table>tbody>tr>td.info,.wf-table>tbody>tr>th.info,.wf-table>tbody>tr.info>td,.wf-table>tbody>tr.info>th,.wf-table>tfoot>tr>td.info,.wf-table>tfoot>tr>th.info,.wf-table>tfoot>tr.info>td,.wf-table>tfoot>tr.info>th{background-color:#d9edf7}.wf-table-hover>tbody>tr>td.info:hover,.wf-table-hover>tbody>tr>th.info:hover,.wf-table-hover>tbody>tr.info:hover>td,.wf-table-hover>tbody>tr:hover>.info,.wf-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wf-table>thead>tr>td.warning,.wf-table>thead>tr>th.warning,.wf-table>thead>tr.warning>td,.wf-table>thead>tr.warning>th,.wf-table>tbody>tr>td.warning,.wf-table>tbody>tr>th.warning,.wf-table>tbody>tr.warning>td,.wf-table>tbody>tr.warning>th,.wf-table>tfoot>tr>td.warning,.wf-table>tfoot>tr>th.warning,.wf-table>tfoot>tr.warning>td,.wf-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wf-table-hover>tbody>tr>td.warning:hover,.wf-table-hover>tbody>tr>th.warning:hover,.wf-table-hover>tbody>tr.warning:hover>td,.wf-table-hover>tbody>tr:hover>.warning,.wf-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wf-table>thead>tr>td.danger,.wf-table>thead>tr>th.danger,.wf-table>thead>tr.danger>td,.wf-table>thead>tr.danger>th,.wf-table>tbody>tr>td.danger,.wf-table>tbody>tr>th.danger,.wf-table>tbody>tr.danger>td,.wf-table>tbody>tr.danger>th,.wf-table>tfoot>tr>td.danger,.wf-table>tfoot>tr>th.danger,.wf-table>tfoot>tr.danger>td,.wf-table>tfoot>tr.danger>th{background-color:#f2dede}.wf-table-hover>tbody>tr>td.danger:hover,.wf-table-hover>tbody>tr>th.danger:hover,.wf-table-hover>tbody>tr.danger:hover>td,.wf-table-hover>tbody>tr:hover>.danger,.wf-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wf-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wf-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wf-table-responsive>.wf-table{margin-bottom:0}.wf-table-responsive>.wf-table>thead>tr>th,.wf-table-responsive>.wf-table>thead>tr>td,.wf-table-responsive>.wf-table>tbody>tr>th,.wf-table-responsive>.wf-table>tbody>tr>td,.wf-table-responsive>.wf-table>tfoot>tr>th,.wf-table-responsive>.wf-table>tfoot>tr>td{white-space:nowrap}.wf-table-responsive>.wf-table-bordered{border:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:first-child{border-left:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:last-child{border-right:0}.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>td,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}
1
+ .wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}@-ms-viewport{width:device-width}.wf-visible-xs{display:none !important}.wf-visible-sm{display:none !important}.wf-visible-md{display:none !important}.wf-visible-lg{display:none !important}.wf-visible-xs-block,.wf-visible-xs-inline,.wf-visible-xs-inline-block,.wf-visible-sm-block,.wf-visible-sm-inline,.wf-visible-sm-inline-block,.wf-visible-md-block,.wf-visible-md-inline,.wf-visible-md-inline-block,.wf-visible-lg-block,.wf-visible-lg-inline,.wf-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wf-visible-xs{display:block !important}table.wf-visible-xs{display:table !important}tr.wf-visible-xs{display:table-row !important}th.wf-visible-xs,td.wf-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wf-visible-xs-block{display:block !important}}@media (max-width: 767px){.wf-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wf-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm{display:block !important}table.wf-visible-sm{display:table !important}tr.wf-visible-sm{display:table-row !important}th.wf-visible-sm,td.wf-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md{display:block !important}table.wf-visible-md{display:table !important}tr.wf-visible-md{display:table-row !important}th.wf-visible-md,td.wf-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wf-visible-lg{display:block !important}table.wf-visible-lg{display:table !important}tr.wf-visible-lg{display:table-row !important}th.wf-visible-lg,td.wf-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wf-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wf-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wf-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wf-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wf-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-hidden-md{display:none !important}}@media (min-width: 1200px){.wf-hidden-lg{display:none !important}}.wf-visible-print{display:none !important}@media print{.wf-visible-print{display:block !important}table.wf-visible-print{display:table !important}tr.wf-visible-print{display:table-row !important}th.wf-visible-print,td.wf-visible-print{display:table-cell !important}}.wf-visible-print-block{display:none !important}@media print{.wf-visible-print-block{display:block !important}}.wf-visible-print-inline{display:none !important}@media print{.wf-visible-print-inline{display:inline !important}}.wf-visible-print-inline-block{display:none !important}@media print{.wf-visible-print-inline-block{display:inline-block !important}}@media print{.wf-hidden-print{display:none !important}}.wf-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container:before,.wf-container:after{content:" ";display:table}.wf-container:after{clear:both}@media (min-width: 768px){.wf-container{width:750px}}@media (min-width: 992px){.wf-container{width:970px}}@media (min-width: 1200px){.wf-container{width:1170px}}.wf-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container-fluid:before,.wf-container-fluid:after{content:" ";display:table}.wf-container-fluid:after{clear:both}.wf-row{margin-left:-15px;margin-right:-15px}.wf-row:before,.wf-row:after{content:" ";display:table}.wf-row:after{clear:both}.wf-col-xs-1,.wf-col-sm-1,.wf-col-md-1,.wf-col-lg-1,.wf-col-xs-2,.wf-col-sm-2,.wf-col-md-2,.wf-col-lg-2,.wf-col-xs-3,.wf-col-sm-3,.wf-col-md-3,.wf-col-lg-3,.wf-col-xs-4,.wf-col-sm-4,.wf-col-md-4,.wf-col-lg-4,.wf-col-xs-5,.wf-col-sm-5,.wf-col-md-5,.wf-col-lg-5,.wf-col-xs-6,.wf-col-sm-6,.wf-col-md-6,.wf-col-lg-6,.wf-col-xs-7,.wf-col-sm-7,.wf-col-md-7,.wf-col-lg-7,.wf-col-xs-8,.wf-col-sm-8,.wf-col-md-8,.wf-col-lg-8,.wf-col-xs-9,.wf-col-sm-9,.wf-col-md-9,.wf-col-lg-9,.wf-col-xs-10,.wf-col-sm-10,.wf-col-md-10,.wf-col-lg-10,.wf-col-xs-11,.wf-col-sm-11,.wf-col-md-11,.wf-col-lg-11,.wf-col-xs-12,.wf-col-sm-12,.wf-col-md-12,.wf-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wf-col-xs-1,.wf-col-xs-2,.wf-col-xs-3,.wf-col-xs-4,.wf-col-xs-5,.wf-col-xs-6,.wf-col-xs-7,.wf-col-xs-8,.wf-col-xs-9,.wf-col-xs-10,.wf-col-xs-11,.wf-col-xs-12{float:left}.wf-col-xs-1{width:8.33333%}.wf-col-xs-2{width:16.66667%}.wf-col-xs-3{width:25%}.wf-col-xs-4{width:33.33333%}.wf-col-xs-5{width:41.66667%}.wf-col-xs-6{width:50%}.wf-col-xs-7{width:58.33333%}.wf-col-xs-8{width:66.66667%}.wf-col-xs-9{width:75%}.wf-col-xs-10{width:83.33333%}.wf-col-xs-11{width:91.66667%}.wf-col-xs-12{width:100%}.wf-col-xs-pull-0{right:auto}.wf-col-xs-pull-1{right:8.33333%}.wf-col-xs-pull-2{right:16.66667%}.wf-col-xs-pull-3{right:25%}.wf-col-xs-pull-4{right:33.33333%}.wf-col-xs-pull-5{right:41.66667%}.wf-col-xs-pull-6{right:50%}.wf-col-xs-pull-7{right:58.33333%}.wf-col-xs-pull-8{right:66.66667%}.wf-col-xs-pull-9{right:75%}.wf-col-xs-pull-10{right:83.33333%}.wf-col-xs-pull-11{right:91.66667%}.wf-col-xs-pull-12{right:100%}.wf-col-xs-push-0{left:auto}.wf-col-xs-push-1{left:8.33333%}.wf-col-xs-push-2{left:16.66667%}.wf-col-xs-push-3{left:25%}.wf-col-xs-push-4{left:33.33333%}.wf-col-xs-push-5{left:41.66667%}.wf-col-xs-push-6{left:50%}.wf-col-xs-push-7{left:58.33333%}.wf-col-xs-push-8{left:66.66667%}.wf-col-xs-push-9{left:75%}.wf-col-xs-push-10{left:83.33333%}.wf-col-xs-push-11{left:91.66667%}.wf-col-xs-push-12{left:100%}.wf-col-xs-offset-0{margin-left:0%}.wf-col-xs-offset-1{margin-left:8.33333%}.wf-col-xs-offset-2{margin-left:16.66667%}.wf-col-xs-offset-3{margin-left:25%}.wf-col-xs-offset-4{margin-left:33.33333%}.wf-col-xs-offset-5{margin-left:41.66667%}.wf-col-xs-offset-6{margin-left:50%}.wf-col-xs-offset-7{margin-left:58.33333%}.wf-col-xs-offset-8{margin-left:66.66667%}.wf-col-xs-offset-9{margin-left:75%}.wf-col-xs-offset-10{margin-left:83.33333%}.wf-col-xs-offset-11{margin-left:91.66667%}.wf-col-xs-offset-12{margin-left:100%}.wf-col-xs-half-padding-left{padding-left:8px}.wf-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wf-col-sm-1,.wf-col-sm-2,.wf-col-sm-3,.wf-col-sm-4,.wf-col-sm-5,.wf-col-sm-6,.wf-col-sm-7,.wf-col-sm-8,.wf-col-sm-9,.wf-col-sm-10,.wf-col-sm-11,.wf-col-sm-12{float:left}.wf-col-sm-1{width:8.33333%}.wf-col-sm-2{width:16.66667%}.wf-col-sm-3{width:25%}.wf-col-sm-4{width:33.33333%}.wf-col-sm-5{width:41.66667%}.wf-col-sm-6{width:50%}.wf-col-sm-7{width:58.33333%}.wf-col-sm-8{width:66.66667%}.wf-col-sm-9{width:75%}.wf-col-sm-10{width:83.33333%}.wf-col-sm-11{width:91.66667%}.wf-col-sm-12{width:100%}.wf-col-sm-pull-0{right:auto}.wf-col-sm-pull-1{right:8.33333%}.wf-col-sm-pull-2{right:16.66667%}.wf-col-sm-pull-3{right:25%}.wf-col-sm-pull-4{right:33.33333%}.wf-col-sm-pull-5{right:41.66667%}.wf-col-sm-pull-6{right:50%}.wf-col-sm-pull-7{right:58.33333%}.wf-col-sm-pull-8{right:66.66667%}.wf-col-sm-pull-9{right:75%}.wf-col-sm-pull-10{right:83.33333%}.wf-col-sm-pull-11{right:91.66667%}.wf-col-sm-pull-12{right:100%}.wf-col-sm-push-0{left:auto}.wf-col-sm-push-1{left:8.33333%}.wf-col-sm-push-2{left:16.66667%}.wf-col-sm-push-3{left:25%}.wf-col-sm-push-4{left:33.33333%}.wf-col-sm-push-5{left:41.66667%}.wf-col-sm-push-6{left:50%}.wf-col-sm-push-7{left:58.33333%}.wf-col-sm-push-8{left:66.66667%}.wf-col-sm-push-9{left:75%}.wf-col-sm-push-10{left:83.33333%}.wf-col-sm-push-11{left:91.66667%}.wf-col-sm-push-12{left:100%}.wf-col-sm-offset-0{margin-left:0%}.wf-col-sm-offset-1{margin-left:8.33333%}.wf-col-sm-offset-2{margin-left:16.66667%}.wf-col-sm-offset-3{margin-left:25%}.wf-col-sm-offset-4{margin-left:33.33333%}.wf-col-sm-offset-5{margin-left:41.66667%}.wf-col-sm-offset-6{margin-left:50%}.wf-col-sm-offset-7{margin-left:58.33333%}.wf-col-sm-offset-8{margin-left:66.66667%}.wf-col-sm-offset-9{margin-left:75%}.wf-col-sm-offset-10{margin-left:83.33333%}.wf-col-sm-offset-11{margin-left:91.66667%}.wf-col-sm-offset-12{margin-left:100%}.wf-col-sm-half-padding-left{padding-left:8px}.wf-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wf-col-md-1,.wf-col-md-2,.wf-col-md-3,.wf-col-md-4,.wf-col-md-5,.wf-col-md-6,.wf-col-md-7,.wf-col-md-8,.wf-col-md-9,.wf-col-md-10,.wf-col-md-11,.wf-col-md-12{float:left}.wf-col-md-1{width:8.33333%}.wf-col-md-2{width:16.66667%}.wf-col-md-3{width:25%}.wf-col-md-4{width:33.33333%}.wf-col-md-5{width:41.66667%}.wf-col-md-6{width:50%}.wf-col-md-7{width:58.33333%}.wf-col-md-8{width:66.66667%}.wf-col-md-9{width:75%}.wf-col-md-10{width:83.33333%}.wf-col-md-11{width:91.66667%}.wf-col-md-12{width:100%}.wf-col-md-pull-0{right:auto}.wf-col-md-pull-1{right:8.33333%}.wf-col-md-pull-2{right:16.66667%}.wf-col-md-pull-3{right:25%}.wf-col-md-pull-4{right:33.33333%}.wf-col-md-pull-5{right:41.66667%}.wf-col-md-pull-6{right:50%}.wf-col-md-pull-7{right:58.33333%}.wf-col-md-pull-8{right:66.66667%}.wf-col-md-pull-9{right:75%}.wf-col-md-pull-10{right:83.33333%}.wf-col-md-pull-11{right:91.66667%}.wf-col-md-pull-12{right:100%}.wf-col-md-push-0{left:auto}.wf-col-md-push-1{left:8.33333%}.wf-col-md-push-2{left:16.66667%}.wf-col-md-push-3{left:25%}.wf-col-md-push-4{left:33.33333%}.wf-col-md-push-5{left:41.66667%}.wf-col-md-push-6{left:50%}.wf-col-md-push-7{left:58.33333%}.wf-col-md-push-8{left:66.66667%}.wf-col-md-push-9{left:75%}.wf-col-md-push-10{left:83.33333%}.wf-col-md-push-11{left:91.66667%}.wf-col-md-push-12{left:100%}.wf-col-md-offset-0{margin-left:0%}.wf-col-md-offset-1{margin-left:8.33333%}.wf-col-md-offset-2{margin-left:16.66667%}.wf-col-md-offset-3{margin-left:25%}.wf-col-md-offset-4{margin-left:33.33333%}.wf-col-md-offset-5{margin-left:41.66667%}.wf-col-md-offset-6{margin-left:50%}.wf-col-md-offset-7{margin-left:58.33333%}.wf-col-md-offset-8{margin-left:66.66667%}.wf-col-md-offset-9{margin-left:75%}.wf-col-md-offset-10{margin-left:83.33333%}.wf-col-md-offset-11{margin-left:91.66667%}.wf-col-md-offset-12{margin-left:100%}.wf-col-md-half-padding-left{padding-left:8px}.wf-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wf-col-lg-1,.wf-col-lg-2,.wf-col-lg-3,.wf-col-lg-4,.wf-col-lg-5,.wf-col-lg-6,.wf-col-lg-7,.wf-col-lg-8,.wf-col-lg-9,.wf-col-lg-10,.wf-col-lg-11,.wf-col-lg-12{float:left}.wf-col-lg-1{width:8.33333%}.wf-col-lg-2{width:16.66667%}.wf-col-lg-3{width:25%}.wf-col-lg-4{width:33.33333%}.wf-col-lg-5{width:41.66667%}.wf-col-lg-6{width:50%}.wf-col-lg-7{width:58.33333%}.wf-col-lg-8{width:66.66667%}.wf-col-lg-9{width:75%}.wf-col-lg-10{width:83.33333%}.wf-col-lg-11{width:91.66667%}.wf-col-lg-12{width:100%}.wf-col-lg-pull-0{right:auto}.wf-col-lg-pull-1{right:8.33333%}.wf-col-lg-pull-2{right:16.66667%}.wf-col-lg-pull-3{right:25%}.wf-col-lg-pull-4{right:33.33333%}.wf-col-lg-pull-5{right:41.66667%}.wf-col-lg-pull-6{right:50%}.wf-col-lg-pull-7{right:58.33333%}.wf-col-lg-pull-8{right:66.66667%}.wf-col-lg-pull-9{right:75%}.wf-col-lg-pull-10{right:83.33333%}.wf-col-lg-pull-11{right:91.66667%}.wf-col-lg-pull-12{right:100%}.wf-col-lg-push-0{left:auto}.wf-col-lg-push-1{left:8.33333%}.wf-col-lg-push-2{left:16.66667%}.wf-col-lg-push-3{left:25%}.wf-col-lg-push-4{left:33.33333%}.wf-col-lg-push-5{left:41.66667%}.wf-col-lg-push-6{left:50%}.wf-col-lg-push-7{left:58.33333%}.wf-col-lg-push-8{left:66.66667%}.wf-col-lg-push-9{left:75%}.wf-col-lg-push-10{left:83.33333%}.wf-col-lg-push-11{left:91.66667%}.wf-col-lg-push-12{left:100%}.wf-col-lg-offset-0{margin-left:0%}.wf-col-lg-offset-1{margin-left:8.33333%}.wf-col-lg-offset-2{margin-left:16.66667%}.wf-col-lg-offset-3{margin-left:25%}.wf-col-lg-offset-4{margin-left:33.33333%}.wf-col-lg-offset-5{margin-left:41.66667%}.wf-col-lg-offset-6{margin-left:50%}.wf-col-lg-offset-7{margin-left:58.33333%}.wf-col-lg-offset-8{margin-left:66.66667%}.wf-col-lg-offset-9{margin-left:75%}.wf-col-lg-offset-10{margin-left:83.33333%}.wf-col-lg-offset-11{margin-left:91.66667%}.wf-col-lg-offset-12{margin-left:100%}.wf-col-lg-half-padding-left{padding-left:8px}.wf-col-lg-half-padding-right{padding-right:7px}}.wrap.wordfence{direction:ltr}@media (min-width: 768px){.wrap.wordfence{max-width:750px}}@media (min-width: 992px){.wrap.wordfence{max-width:970px}}@media (min-width: 1200px){.wrap.wordfence{max-width:1170px}}.wrap.wordfence>.wf-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wrap.wordfence h3{font-size:1.15em}a{color:#00709e}.wordfenceWrap{margin:20px 0 0 20px}.wordfence-icon32{width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:7px 5px 0 0;float:left}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}div.wordfence-lock-icon{background-image:url(../images/wordfence-logo-32x32.png)}a.wfhelp{background-image:url(../images/help.png);width:12px;height:12px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../images/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../images/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../images/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../images/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}img.wfFlag{vertical-align:middle;margin:-3px 4px 0 0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle}.wf-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wf-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:2px 8px 2px 24px;z-index:100000;position:fixed;right:2px;bottom:2px;border:1px solid #000;background-color:#F00;color:#FFF;font-size:12px;font-weight:bold;font-family:Arial;text-align:center;background-image:url("../images/icons/ajaxRed16.gif");background-position:2px 2px;background-repeat:no-repeat}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important;margin:0}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:Trebuchet, Arial, sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wf-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wf-striped-table th,.wf-striped-table td{padding:6px 4px;border:1px solid #ccc}.wf-striped-table thead th,.wf-striped-table thead td,.wf-striped-table tfoot th,.wf-striped-table tfoot td,.wf-striped-table tbody.thead th,.wf-striped-table tbody.thead td{background-color:#222;color:#fff;font-weight:bold;border-color:#474747;text-align:left}.wf-striped-table tbody tr.even td,.wf-striped-table tbody tr:nth-child(2n) td{background-color:#eee}.wf-striped-table tbody tr td,.wf-striped-table tbody tr.odd td{background-color:#fff}.wf-striped-table tbody tr:hover>td{background-color:#fffbd8}.wf-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wf-striped-table td.error{color:#d0514c;font-weight:bold}.wf-striped-table td.error:before{content:"\2718"}.wf-striped-table td.success{color:#008c10;font-weight:bold;max-width:20%}.wf-striped-table td.success:before{content:"\2713"}.wf-striped-table td.success:before,.wf-striped-table td.error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wf-striped-table td.inactive{font-weight:bold;color:#666666}.wordfence-waiting{line-height:32px}.wordfence-waiting img{vertical-align:middle}pre.wf-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wf-center{text-align:center}#wfConfigForm{max-width:1035px}.wf-hidden{display:none !important}.wf-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-card .wf-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wf-card .wf-card-inner .wf-card-content{max-width:75%}.wf-card .wf-card-inner .wf-card-content .wf-card-title{font-size:1.125rem;width:100%}.wf-card .wf-card-inner .wf-card-content .wf-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wf-card .wf-card-inner .wf-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-card .wf-card-inner .wf-card-action .wf-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox.checked{background-position:right center}.wf-card .wf-card-extra{display:none;padding:0.5rem;margin-top:1rem;border-top:1px solid #f3f6f8}@media (min-width: 768px){.wf-card .wf-card-extra{padding:1rem}}.wf-card.active .wf-card-extra{display:block}.wf-card.wf-card-left .wf-card-content{margin-left:48px}.wf-card.wf-card-left .wf-card-action{right:auto;left:0px}.wf-card.disabled .wf-card-content .wf-card-title{color:#aaaaaa}.wf-card.disabled .wf-card-content .wf-card-subtitle{color:#8ea6be}.wf-add-top{margin-top:20px !important}.wf-add-top-small{margin-top:10px !important}.wf-add-bottom{margin-bottom:20px !important}.wf-add-bottom-small{margin-bottom:10px !important}.wf-center{text-align:center}.wf-right{text-align:right}.wf-scroll-x::-webkit-scrollbar,.wf-scroll-y::-webkit-scrollbar{-webkit-appearance:none;width:7px;height:7px}.wf-scroll-x::-webkit-scrollbar-thumb,.wf-scroll-y::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgba(0,0,0,0.194);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5)}.wf-split-word{word-wrap:break-word;word-break:break-all}@media (max-width: 767px){.wf-split-word-xs{word-wrap:break-word;word-break:break-all;white-space:normal !important}}.select2-container{min-width:240px}@media (min-width: 768px){.select2-container{min-width:280px}}@media (min-width: 992px){.select2-container{min-width:320px}}.wf-page-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;margin-top:0.5rem}.wf-page-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wf-page-title>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px;padding-right:0.25rem}.wf-page-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wf-page-title h2{padding:0 !important}.wf-page-title .wfOnOffSwitch{-webkit-flex-basis:69px;flex-basis:69px;-webkit-flex-shrink:0;flex-shrink:0;margin-left:0.5rem}#wf-notices{margin-top:15px}#wf-notices .wf-admin-notice{margin-left:0px;margin-right:0px}.wf-success-text,.wf-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wf-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wf-notice-text{color:#6d798c}.wf-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wf-success-text{color:#11967a}.wf-premium-callout{border:1px solid #00709e;background-color:#ffffff;padding:16px;margin:20px 0 0}.wf-premium-callout h3{margin:0 0 8px;color:#11967a}.wf-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wf-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wf-premium-callout .center{text-align:center;margin:0}.wf-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}#wfLiveTrafficOverlayAnchor::after{position:absolute;z-index:3002;top:0;right:0;width:0;height:0;background:rgba(241,241,241,0.6);content:'';opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused #wfLiveTrafficOverlayAnchor::after{width:100%;height:100%;opacity:1;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}#wordfenceLiveActivityDisabled{background:#fff;border-left:4px solid #ffb900;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin-bottom:12px;padding:1px 13px}#wfLiveTrafficDisabledMessage{display:none;position:fixed;z-index:3003;left:0;width:100%;top:50%;transform:translateY(-50%);text-align:center;color:#666666;opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}#wfLiveTrafficDisabledMessage h2{background-color:#FFF;overflow:hidden;border:1px solid #CCC;max-width:350px;margin:0 auto;padding:15px;font-size:2.0em}#wfLiveTrafficDisabledMessage h2 small{font-size:0.5em;font-weight:normal;margin-top:20px}.wordfenceLiveActivityPaused #wfLiveTrafficDisabledMessage{display:block;opacity:1;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}.wf-live-activity{position:relative;margin:20px 0 10px 0;padding:0.75rem;box-sizing:border-box;background:#FFFCEF;box-shadow:0 0 0 1px rgba(153,155,135,0.5),0 1px 2px #e8f3e0}.wf-live-activity .wf-live-activity-inner{width:100%;box-sizing:border-box;position:relative}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:flex-start}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-title{color:#888888;font-size:0.85rem;font-weight:bold;padding-right:0.5rem}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-message{font-size:0.80rem;color:#000000}.wf-live-activity .wf-live-activity-inner .wf-live-activity-state{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background:rgba(255,252,239,0.9);display:none;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:center;z-index:3001;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused .wf-live-activity .wf-live-activity-inner .wf-live-activity-state{display:-ms-flexbox;display:flex;opacity:1;-webkit-transition:opacity 0.5s;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}.wordfence .wordfenceScanButton{margin:20px 0 20px 0}.wordfence .wordfenceScanButton input.button-wf-grey{background:#EFEFEF url(../images/button-grad-grey.png) repeat-x scroll left top;border-color:#EFEFEF}.wordfence .wordfenceScanButton table td{vertical-align:top}.wordfence .wordfenceScanButton .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E;height:44px;line-height:44px;padding:0px 20px}table.wfSummaryParent{font-family:sans-serif;font-size:14px;color:#000;z-index:9}table.wfSummaryParent td{vertical-align:top;padding:0;margin:0}table.wfSummaryParent table.wfSummaryChild th{font-weight:bold;text-align:right;font-family:Georgia,Times New Roman,Times,serif;color:#000;padding:5px 10px 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSummaryChild td{font-weight:normal;text-align:left;padding:5px 0 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSC1 td{width:300px;padding:0 25px 10px 0}table.wfSummaryParent table.wfSC2 th{width:80px}table.wfSummaryParent table.wfSC2 td{width:100px}table.wfSummaryParent table.wfSC3 th{width:80px}table.wfSummaryParent table.wfSC3 td{width:250px}table.wfSummaryParent th.wfHead{font-size:22px;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;color:#555;font-weight:bold;text-align:left;padding:20px 0 20px 0;-webkit-font-smoothing:antialiased}.wf-issues-table{table-layout:fixed;width:100%}div.wfIssue{width:100%}div.wfIssue table.wfIssue td{padding:2px;margin:0;border-width:0;text-align:left;width:100%}div.wfIssue table.wfIssue th{padding:2px;margin:0;font-weight:bold;text-align:left;color:#777;white-space:nowrap}div.wfIssue table.wfIssueLinks td{border-width:0;text-align:left;padding-right:10px}div.wfIssue h2{margin:0 0 5px 0;padding:0;font-size:0.9rem}@media (min-width: 768px){div.wfIssue h2{font-size:1.05rem}}.wfIssueOptions{border-top:1px solid #CCC;padding:10px}.wfIssueOptions h3{font-size:0.8rem;margin:0}@media (min-width: 768px){.wfIssueOptions h3{display:inline-block}}.wfIssueOptions ul{margin-bottom:0;padding-left:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfIssueOptions ul{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}.wfIssueOptions ul>li>a{position:relative;display:block;padding:8px 12px/2}.wfIssueOptions ul>li>a:hover,.wfIssueOptions ul>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wfIssueOptions a{margin-left:10px}.wfIssueOptions strong{float:left;display:block;width:60px}.wfIssueOptions p{margin:6px 0px 0px}.wfProbSev1,.wfProbSev2,.wfAjaxLight128,.wfResolved{width:128px;height:128px;border:0;margin:0 auto;background-repeat:no-repeat;background-position:0 0;text-decoration:none;display:block}.wfProbSev1{background-image:url(../images/icons/error128.png)}.wfProbSev2{background-image:url(../images/icons/warning128.png)}.wfResolved{background-image:url(../images/icons/tick128.png)}.wfIssuesContainer{width:100%;display:none}.wfIssuesContainer p{max-width:550px}.wfALogTime{color:#999}.wfALogMailLink,.wfALogViewLink{display:block;position:absolute;padding:0 0 0 18px;margin:0;right:10px;top:0;background-repeat:no-repeat;font-weight:normal}.wfALogMailLink{background-image:url(../images/icons/email_go.png)}.wfALogViewLink{background-image:url(../images/icons/magnifier.png)}#wfActivity{position:relative}.consoleHead{position:relative;padding:0 0 0 3px;font-weight:bold;width:100%}.consoleHeadText{margin-bottom:4px;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;color:#555;font-weight:bold;-webkit-font-smoothing:antialiased}.consoleFooter{position:relative}.consoleOuter{width:100%}.consoleInner{height:116px;overflow:auto;z-index:1}.bevelDiv1{border:1px solid #EFEFEF}.bevelDiv2{border:1px solid #AAA}.bevelDiv3{background-color:#ffffed;padding:5px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}.wfSecure{color:#0A0;font-weight:bold}.wfSummaryLine{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfSummaryLine{-webkit-flex-direction:row;flex-direction:row}}.wfSummaryLine .wfSummaryDate{padding-left:3px}.wfSummaryLine .wfSummaryMsg{padding-left:3px;-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfSummaryLoading{width:16px;height:11px;background-image:url("../images/icons/ajaxScan.gif")}.wfSummaryBad,.wfSummaryErr{color:#930000}.wfSummaryOK{color:#11967a}.wfClear{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}.wfSummaryFinal{-webkit-font-smoothing:antialiased;font-weight:bold;color:#555}.wfStartScanButton{text-align:center}.wordfenceScanHelp{border:1px solid #CCC;padding:4px}.wf-scan-no-issues{font-size:1.25rem;color:#11967a}.wf-scan-severity{position:relative;width:10px}@media (min-width: 768px){.wf-scan-severity{width:144px}}.wf-scan-severity-1,.wf-scan-severity-2{position:absolute;top:0px;right:0px;bottom:0px;left:0px}.wf-scan-severity-1{background-color:#c10000}.wf-scan-severity-2{background-color:#ffd10a}.scan-schedule{border-collapse:collapse;border-spacing:0}.scan-schedule tr:first-of-type th{padding-top:0}.scan-schedule td{padding:0}.scan-schedule th{padding:1.5rem 0.5rem 0.75rem 0;font-size:1rem;text-align:left}@media (min-width: 768px){.scan-schedule th{padding:0 0.5rem 0 0;font-size:0.8125rem;text-align:center}}.next-scan{font-size:1em;display:block;position:relative;width:7em;height:7em;background-color:#fff;border-radius:0.6em;box-shadow:0 1px 0 rgba(189,189,189,0.6);overflow:hidden}.next-scan *{display:block;width:100%;font-size:1em;font-weight:bold;font-style:normal;text-align:center}.next-scan strong{position:absolute;top:0;padding:0.4em 0;color:#fff;background-color:#00709E;box-shadow:0 2px 0 #00709E}.next-scan em{position:absolute;bottom:0.3em;color:#00709E}.next-scan span{width:100%;font-size:2.8em;padding-top:1.15em;color:#2f2f2f}.schedule-times-wrapper{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;margin-top:1rem}@media (min-width: 768px){.schedule-times-wrapper{margin-top:0.25rem}}.schedule-times-wrapper:first-of-type{margin-top:0}@media (min-width: 768px){.schedule-times-wrapper:first-of-type{margin-top:1rem}}.schedule-times-wrapper>*{-webkit-flex-grow:1;flex-grow:1;min-width:0}.schedule-times-wrapper>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:initial;padding-right:0.25rem}.schedule-times{margin-bottom:0;margin-top:0;padding-left:0;list-style:none;clear:both}.schedule-times>li{float:left;position:relative;display:block;margin:0px 0px 2px 0px}.schedule-times>li.disabled>a{color:#777}.schedule-times>li.disabled>a:hover,.schedule-times>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.schedule-times>li>a{text-decoration:none;border:1px solid #e2e2e2;border-radius:4px;position:relative;display:block;padding:8px 12px}.schedule-times>li>a:hover,.schedule-times>li>a:focus{text-decoration:none;background-color:#e2e2e2}.schedule-times>li+li{margin-left:2px}.schedule-times>li.active>a,.schedule-times>li.active>a:hover,.schedule-times>li.active>a:focus{color:#fff;background-color:#00709e;border-color:#00709e}.schedule-times>li.text-only{position:relative;display:block;padding:8px 12px}.schedule-times>li>a>img{max-width:none}#wf-lt-listings .wfActEvent{padding-left:15px;border-left:5px solid #cccccc}#wf-lt-listings .wfActEvent.wfHuman{border-left:5px solid #16bc9b}#wf-lt-listings .wfActEvent.wfActionBlocked{border-left:5px solid #d03935}#wf-lt-listings .wfActEvent.wfNotice{border-left:5px solid #c10000}#wf-lt-listings .wfActEvent.wfWarning,#wf-lt-listings .wfActEvent.wf404{border-left:5px solid #ffd10a}#wf-lt-listings .wfActEvent:hover{background-color:#fff9e9 !important}.wfActEvent.wf-live-traffic-filter{padding-left:0;padding-right:0;display:-webkit-flex;display:flex;-webkit-align-items:baseline;align-items:baseline;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfActEvent.wf-live-traffic-filter{-webkit-flex-direction:row;flex-direction:row}}.wfActEvent.wf-live-traffic-filter h2{margin:0;padding-bottom:0.5rem}@media (min-width: 768px){.wfActEvent.wf-live-traffic-filter h2{padding-bottom:0;padding-right:0.5rem}}#wf-lt-advanced-filters{padding-left:0;padding-right:0;overflow:hidden}.wf-live-traffic-filter-detail{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wf-live-traffic-filter-detail{-webkit-flex-direction:row;flex-direction:row}.wf-live-traffic-filter-detail *{-webkit-flex-grow:1;flex-grow:1}}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-remove{margin-left:0.5rem;font-size:1.5rem;color:#333}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters div{padding:0.25rem 0}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters select{font-size:0.75rem !important}@media (min-width: 768px){.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters div{padding:0}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters select{font-size:1rem !important}}.wf-filtered-traffic{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-filtered-traffic .wf-filtered-traffic-hits{font-size:1.75rem;color:#999999}#wf-live-traffic{position:relative;overflow:visible}#wf-live-traffic-legend{white-space:nowrap;background-color:#fff;border:1px solid #cccccc;padding:12px}#wf-live-traffic-legend.sticky{position:fixed;top:10px;right:auto;left:10px;z-index:2000}@media (min-width: 768px){#wf-live-traffic-legend.sticky{top:42px;left:182px}}#wf-live-traffic-legend-placeholder{display:none;padding:12px}#wf-live-traffic-legend-placeholder.sticky{display:block}#wf-live-traffic-legend ul{margin:0;padding:0}#wf-live-traffic-legend ul:before,#wf-live-traffic-legend ul:after{content:" ";display:table}#wf-live-traffic-legend ul:after{clear:both}#wf-live-traffic-legend ul li{margin:0;padding:0;position:relative;float:left;font-size:11.5px}@media (min-width: 768px){#wf-live-traffic-legend ul li{font-size:13px}}#wf-live-traffic-legend ul li+li{margin-left:8px}#wf-live-traffic-legend ul li:before{content:'';display:block;float:left;margin:3px 6px 0 0;width:12px;height:12px;background-color:#CCCCCC}#wf-live-traffic-legend ul li.wfHuman:before{background-color:#16bc9b}#wf-live-traffic-legend ul li.wfNotice:before{background-color:#ffd10a}#wf-live-traffic-legend ul li.wfBlocked:before{background-color:#d03935}.wfTimeAgo{font-family:Georgia,Times New Roman,Times,serif;color:#999;font-weight:bold;font-style:italic}.wfActEvent{border-bottom:1px solid #CCC;padding:10px 20px;overflow:auto}.wf-pad-small{margin:8px 0}#wf-lt-listings{margin:0 0 0}#wf-lt-listings a{cursor:pointer;text-decoration:underline}#wf-lt-listings a.button,#wf-lt-listings a.wf-btn{text-decoration:none}.wfActionBlocked{background-color:#fff6f6}[class*="span"]{float:left;min-height:1px;margin-left:30px}.highlighted{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-moz-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-webkit-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-moz-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@-webkit-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}.highlighted{-webkit-animation-name:highlighted;animation-name:highlighted}.highlighted.wfActionBlocked{-webkit-animation-name:highlightedBlocked;animation-name:highlightedBlocked}#wf-lt-preset-filters{min-width:250px}#wf-lt-advanced-filters>table{width:100%}#wf-lt-advanced-filters>table>tr>td{vertical-align:top}.wf-lt-url{white-space:nowrap}table.block-ranges-table{border-collapse:collapse;margin:10px 0 0}table.block-ranges-table tr td{border:1px solid #CCC;border-width:1px 0;padding:10px 0 12px 0}#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:0.9rem}@media (min-width: 768px){#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:1.0rem}}@media (min-width: 992px){#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:1.125rem}}.wafStatus-enabled,.wafStatus-learning-mode,.wafStatus-disabled,.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__rendered{color:#ffffff}#waf-config-form .waf-config-label{font-size:1.3em}#waf-config-form .select2-container--default .select2-selection--single{padding:4px;text-shadow:0 0 3px #000000;font-weight:bold;border-radius:3px}#waf-config-form .select2-container .select2-selection--single{height:auto}.wafStatus-enabled.select2-container--default .select2-selection--single{background-color:#11967a;border-color:#073a2f}.wafStatus-learning-mode.select2-container--default .select2-selection--single{background-color:#ffd10a;border-color:#a38400}.wafStatus-disabled.select2-container--default .select2-selection--single,.wafStatus-disabled.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-learning-mode.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-enabled.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#c10000;border-color:#5b0000}#waf-config-form .select2-container--default .select2-selection--single .select2-selection__arrow{height:100%;top:0}.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#ffffff transparent transparent}.wafStatus-enabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #ffffff}.wafStatus-description{display:none;max-width:500px;font-style:italic;font-size:14px;line-height:1.3}.whitelist-table-container{overflow-x:auto}table.whitelist-table .whitelist-edit{display:none}table.whitelist-table .edit-mode .whitelist-display{display:none}table.whitelist-table .edit-mode .whitelist-edit{display:block}table.whitelist-table .edit-mode span.whitelist-edit,table.whitelist-table .edit-mode input.whitelist-edit{display:inline}.wf-bulk-action{margin:12px 0}tr.wf-table-filters input{max-width:120px}#wordfenceRightRail img{max-width:100%}#wordfenceRightRail ul{list-style-type:none;margin:0;margin-top:15px}#wordfenceRightRail .center{text-align:center}#wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wordfenceRightRail img{width:100%}.wordfenceRightRailLiveTraffic,.wordfenceRightRailOptions,.wordfenceRightRailDiagnostics{margin-left:1055px}.wordfenceRightRailBlockedIPs,.wordfenceRightRailWAF,.wordfenceRightRailCountryBlocking,.wordfenceRightRailScanSchedule{margin-left:950px}.wordfenceRightRail ul{list-style-type:none;margin:0}.wordfenceRightRail .center{text-align:center}.wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wordfenceWrap.wordfence-community{min-height:760px}#wfTwoFactorQRCodeTable{width:175px;height:175px;margin:0 auto}@media (min-width: 500px){#wfTwoFactorQRCodeTable{width:256px;height:256px}}#wfTwoFactorRecoveryCodes{list-style-type:none}#wfTwoFactorRecoveryCodes li{font-family:monospace;text-align:center}#wfTwoFactorDownload .dashicons{line-height:26px}.wf-twofactor-delete{font-size:1.5rem}.wf-twofactor-delete a{text-decoration:none;color:#333}.wf-table.wf-table-twofactor>tbody>tr>td{vertical-align:middle}.wf-form-twofactor{max-width:400px}.wf-form-twofactor .wf-radio label{padding-left:0}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}label.wf-plain{font-weight:normal}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857;color:#555}.wf-form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wf-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wf-form-control::-moz-placeholder{color:#999;opacity:1}.wf-form-control:-ms-input-placeholder{color:#999}.wf-form-control::-webkit-input-placeholder{color:#999}.wf-form-control::-ms-expand{border:0;background-color:transparent}.wf-form-control[disabled],.wf-form-control[readonly],fieldset[disabled] .wf-form-control{background-color:#e2e2e2;opacity:1}.wf-form-control[disabled],fieldset[disabled] .wf-form-control{cursor:not-allowed}textarea.wf-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wf-form-control,input[type="time"].wf-form-control,input[type="datetime-local"].wf-form-control,input[type="month"].wf-form-control{line-height:34px}input[type="date"].wf-input-sm,.wf-input-group-sm input[type="date"],input[type="time"].wf-input-sm,.wf-input-group-sm input[type="time"],input[type="datetime-local"].wf-input-sm,.wf-input-group-sm input[type="datetime-local"],input[type="month"].wf-input-sm,.wf-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wf-input-lg,.wf-input-group-lg input[type="date"],input[type="time"].wf-input-lg,.wf-input-group-lg input[type="time"],input[type="datetime-local"].wf-input-lg,.wf-input-group-lg input[type="datetime-local"],input[type="month"].wf-input-lg,.wf-input-group-lg input[type="month"]{line-height:46px}}.wf-form-group{margin-bottom:8px}.wf-form-group.wf-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wf-form-group.wf-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wf-form-group.wf-focus label{margin-left:-4px}.wf-radio,.wf-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wf-radio label,.wf-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wf-radio input[type="radio"],.wf-radio-inline input[type="radio"],.wf-checkbox input[type="checkbox"],.wf-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wf-radio-offset{padding-left:29px}@media (min-width: 768px){.wf-radio-offset{padding-left:20px}}.wf-radio+.wf-radio,.wf-checkbox+.wf-checkbox{margin-top:-5px}.wf-radio-inline,.wf-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wf-radio-inline+.wf-radio-inline,.wf-checkbox-inline+.wf-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].wf-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].wf-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.wf-radio-inline.wf-disabled,fieldset[disabled] .wf-radio-inline,.wf-checkbox-inline.wf-disabled,fieldset[disabled] .wf-checkbox-inline{cursor:not-allowed}.wf-radio.wf-disabled label,fieldset[disabled] .wf-radio label,.wf-checkbox.wf-disabled label,fieldset[disabled] .wf-checkbox label{cursor:not-allowed}.wf-form-control-static{padding-top:7px;padding-bottom:7px;margin:0;line-height:1}.wf-form-control-static.wf-input-lg,.wf-form-control-static.wf-input-sm{padding-left:0;padding-right:0}.wf-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wf-input-sm{height:30px;line-height:30px}textarea.wf-input-sm,select[multiple].wf-input-sm{height:auto}.wf-form-group-sm .wf-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wf-form-group-sm select.wf-form-control{height:30px;line-height:30px}.wf-form-group-sm textarea.wf-form-control,.wf-form-group-sm select[multiple].wf-form-control{height:auto}.wf-form-group-sm .wf-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wf-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wf-input-lg{height:46px;line-height:46px}textarea.wf-input-lg,select[multiple].wf-input-lg{height:auto}.wf-form-group-lg .wf-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-form-group-lg select.wf-form-control{height:46px;line-height:46px}.wf-form-group-lg textarea.wf-form-control,.wf-form-group-lg select[multiple].wf-form-control{height:auto}.wf-form-group-lg .wf-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wf-has-feedback{position:relative}.wf-has-feedback .wf-form-control{padding-right:42.5px}.wf-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.wf-input-lg+.wf-form-control-feedback,.wf-input-group-lg+.wf-form-control-feedback,.wf-form-group-lg .wf-form-control+.wf-form-control-feedback{width:46px;height:46px;line-height:46px}.wf-input-sm+.wf-form-control-feedback,.wf-input-group-sm+.wf-form-control-feedback,.wf-form-group-sm .wf-form-control+.wf-form-control-feedback{width:30px;height:30px;line-height:30px}.wf-has-success .wf-help-block,.wf-has-success .wf-control-label,.wf-has-success .wf-radio,.wf-has-success .wf-checkbox,.wf-has-success .wf-radio-inline,.wf-has-success .wf-checkbox-inline,.wf-has-success.wf-radio label,.wf-has-success.wf-checkbox label,.wf-has-success.wf-radio-inline label,.wf-has-success.wf-checkbox-inline label{color:#3c763d}.wf-has-success .wf-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-success .wf-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wf-has-success .wf-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wf-has-success .wf-form-control-feedback{color:#3c763d}.wf-has-warning .wf-help-block,.wf-has-warning .wf-control-label,.wf-has-warning .wf-radio,.wf-has-warning .wf-checkbox,.wf-has-warning .wf-radio-inline,.wf-has-warning .wf-checkbox-inline,.wf-has-warning.wf-radio label,.wf-has-warning.wf-checkbox label,.wf-has-warning.wf-radio-inline label,.wf-has-warning.wf-checkbox-inline label{color:#8a6d3b}.wf-has-warning .wf-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-warning .wf-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wf-has-warning .wf-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wf-has-warning .wf-form-control-feedback{color:#8a6d3b}.wf-has-error .wf-help-block,.wf-has-error .wf-control-label,.wf-has-error .wf-radio,.wf-has-error .wf-checkbox,.wf-has-error .wf-radio-inline,.wf-has-error .wf-checkbox-inline,.wf-has-error.wf-radio label,.wf-has-error.wf-checkbox label,.wf-has-error.wf-radio-inline label,.wf-has-error.wf-checkbox-inline label{color:#a94442}.wf-has-error .wf-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-error .wf-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wf-has-error .wf-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wf-has-error .wf-form-control-feedback{color:#a94442}.wf-has-feedback label ~ .wf-form-control-feedback{top:25px}.wf-has-feedback label.wf-sr-only ~ .wf-form-control-feedback{top:0}.wf-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wf-form-inline .wf-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-form-control{display:inline-block;width:auto;vertical-align:middle}.wf-form-inline .wf-form-control-static{display:inline-block}.wf-form-inline .wf-input-group{display:inline-table;vertical-align:middle}.wf-form-inline .wf-input-group .wf-input-group-addon,.wf-form-inline .wf-input-group .wf-input-group-btn,.wf-form-inline .wf-input-group .wf-form-control{width:auto}.wf-form-inline .wf-input-group>.wf-form-control{width:100%}.wf-form-inline .wf-control-label{margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio,.wf-form-inline .wf-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio label,.wf-form-inline .wf-checkbox label{padding-left:0}.wf-form-inline .wf-radio input[type="radio"],.wf-form-inline .wf-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wf-form-inline .wf-has-feedback .wf-form-control-feedback{top:0}}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox,.wf-form-horizontal .wf-radio-inline,.wf-form-horizontal .wf-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox{min-height:27px}.wf-form-horizontal .wf-form-group{margin-left:-15px;margin-right:-15px}.wf-form-horizontal .wf-form-group:before,.wf-form-horizontal .wf-form-group:after{content:" ";display:table}.wf-form-horizontal .wf-form-group:after{clear:both}@media (min-width: 768px){.wf-form-horizontal .wf-control-label{text-align:right;margin-bottom:0;padding-top:7px}}.wf-form-horizontal .wf-has-feedback .wf-form-control-feedback{right:15px}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-lg .wf-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-sm .wf-control-label{padding-top:6px;font-size:12px}}.wf-dashboard-item{position:relative;margin:0 auto 1rem;padding:0 1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-dashboard-item .wf-dashboard-item-inner{min-height:44px;padding:1rem 0;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content{max-width:75%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-title{font-size:0.75rem;width:100%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text{width:auto}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-success{color:#11967a}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning a{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox.checked{background-position:right center}.wf-dashboard-item .wf-dashboard-item-extra{display:none;margin:0 -1rem;padding:0 1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list{margin:0 -1rem;padding:0;list-style:none}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #eeeeee;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal{box-sizing:border-box;margin-top:-1px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:100%;flex-basis:100%;border-left:1px solid #eeeeee}@media (min-width: 768px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-basis:50%;flex-basis:50%}}@media (min-width: 992px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-basis:20%;flex-basis:20%}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>*:first-child{border-left:0}@media (min-width: 768px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal.wf-dashboard-item-list-equal>li{max-width:50%}}@media (min-width: 992px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal.wf-dashboard-item-list-equal>li{max-width:20%}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state{text-align:center}@media (min-width: 1200px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state{text-align:left}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-enabled .fa{color:#11967a}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-disabled .fa{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-premium{color:#9f9fa0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss{padding-left:2rem;font-size:1.25rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss a{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-count{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wf-dashboard-item.active .wf-dashboard-item-extra{display:block}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-content{margin-left:48px}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-action{right:auto;left:0px}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-title{color:#aaaaaa}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-subtitle{color:#8ea6be}.wf-notifications-empty{font-size:0.9rem;color:#9f9fa0}.wf-dashboard-graph-wrapper{width:100%}.wf-dashboard-badge{display:inline-block;min-width:10px;padding:3px 7px;margin-left:0.5rem;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#fcb214;border-radius:10px}.wf-dashboard-badge:empty{display:none}.wf-btn .wf-dashboard-badge{position:relative;top:-1px}.wf-btn-xs .wf-dashboard-badge,.wf-btn-group-xs>.wf-btn .wf-dashboard-badge{top:0;padding:1px 5px}.wf-list-group-item.active>.wf-dashboard-badge,.wf-nav-pills>.active>a>.wf-dashboard-badge{color:#00709e;background-color:#fff}.wf-list-group-item>.wf-dashboard-badge{float:right}.wf-list-group-item>.wf-dashboard-badge+.wf-dashboard-badge{margin-right:5px}.wf-nav-pills>li>a>.wf-dashboard-badge{margin-left:3px}.wf-dashboard-toggle-btns{text-align:center}.wf-dashboard-toggle-btns .wf-pagination{margin:1rem 1rem 0.5rem 1rem}.wf-dashboard-show-more{position:relative;font-size:14px;color:#959595;text-align:center;line-height:1rem;background:#ffffff;width:60%;margin:20px auto 0 auto}.wf-dashboard-show-more:before{display:inline-block;content:"";position:absolute;height:1px;background:#dddddd;top:50%;width:100%;left:0;right:0}.wf-dashboard-show-more a{display:inline-block;position:relative;padding:0 10px;background-color:#ffffff}.wf-ips,.wf-recent-logins,.wf-countries{max-height:30rem;overflow-y:hidden;margin-bottom:20px}.wf-ips .wf-table,.wf-recent-logins .wf-table,.wf-countries .wf-table{margin-bottom:0}.wf-dashboard-last-updated{font-style:italic;font-size:0.6rem;text-align:center;padding-bottom:1rem;margin:0}table.wf-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wf-table td,table.wf-table th{padding:0}.wf-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wf-table th{text-align:left}.wf-table{width:100%;max-width:100%;margin-bottom:20px}.wf-table>thead>tr>th,.wf-table>thead>tr>td,.wf-table>tbody>tr>th,.wf-table>tbody>tr>td,.wf-table>tfoot>tr>th,.wf-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wf-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wf-table>caption+thead>tr:first-child>th,.wf-table>caption+thead>tr:first-child>td,.wf-table>colgroup+thead>tr:first-child>th,.wf-table>colgroup+thead>tr:first-child>td,.wf-table>thead:first-child>tr:first-child>th,.wf-table>thead:first-child>tr:first-child>td{border-top:0}.wf-table>tbody+tbody{border-top:2px solid #ddd}.wf-table .wf-table{background-color:#fff}.wf-table-condensed>thead>tr>th,.wf-table-condensed>thead>tr>td,.wf-table-condensed>tbody>tr>th,.wf-table-condensed>tbody>tr>td,.wf-table-condensed>tfoot>tr>th,.wf-table-condensed>tfoot>tr>td{padding:5px}.wf-table-bordered{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td,.wf-table-bordered>tbody>tr>th,.wf-table-bordered>tbody>tr>td,.wf-table-bordered>tfoot>tr>th,.wf-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td{border-bottom-width:2px}.wf-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wf-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wf-table col[class*="col-"]{position:static;float:none;display:table-column}table.wf-table td[class*="col-"],table.wf-table th[class*="col-"]{position:static;float:none;display:table-cell}.wf-table>thead>tr>td.active,.wf-table>thead>tr>th.active,.wf-table>thead>tr.active>td,.wf-table>thead>tr.active>th,.wf-table>tbody>tr>td.active,.wf-table>tbody>tr>th.active,.wf-table>tbody>tr.active>td,.wf-table>tbody>tr.active>th,.wf-table>tfoot>tr>td.active,.wf-table>tfoot>tr>th.active,.wf-table>tfoot>tr.active>td,.wf-table>tfoot>tr.active>th{background-color:#f5f5f5}.wf-table-hover>tbody>tr>td.active:hover,.wf-table-hover>tbody>tr>th.active:hover,.wf-table-hover>tbody>tr.active:hover>td,.wf-table-hover>tbody>tr:hover>.active,.wf-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wf-table>thead>tr>td.success,.wf-table>thead>tr>th.success,.wf-table>thead>tr.success>td,.wf-table>thead>tr.success>th,.wf-table>tbody>tr>td.success,.wf-table>tbody>tr>th.success,.wf-table>tbody>tr.success>td,.wf-table>tbody>tr.success>th,.wf-table>tfoot>tr>td.success,.wf-table>tfoot>tr>th.success,.wf-table>tfoot>tr.success>td,.wf-table>tfoot>tr.success>th{background-color:#dff0d8}.wf-table-hover>tbody>tr>td.success:hover,.wf-table-hover>tbody>tr>th.success:hover,.wf-table-hover>tbody>tr.success:hover>td,.wf-table-hover>tbody>tr:hover>.success,.wf-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wf-table>thead>tr>td.info,.wf-table>thead>tr>th.info,.wf-table>thead>tr.info>td,.wf-table>thead>tr.info>th,.wf-table>tbody>tr>td.info,.wf-table>tbody>tr>th.info,.wf-table>tbody>tr.info>td,.wf-table>tbody>tr.info>th,.wf-table>tfoot>tr>td.info,.wf-table>tfoot>tr>th.info,.wf-table>tfoot>tr.info>td,.wf-table>tfoot>tr.info>th{background-color:#d9edf7}.wf-table-hover>tbody>tr>td.info:hover,.wf-table-hover>tbody>tr>th.info:hover,.wf-table-hover>tbody>tr.info:hover>td,.wf-table-hover>tbody>tr:hover>.info,.wf-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wf-table>thead>tr>td.warning,.wf-table>thead>tr>th.warning,.wf-table>thead>tr.warning>td,.wf-table>thead>tr.warning>th,.wf-table>tbody>tr>td.warning,.wf-table>tbody>tr>th.warning,.wf-table>tbody>tr.warning>td,.wf-table>tbody>tr.warning>th,.wf-table>tfoot>tr>td.warning,.wf-table>tfoot>tr>th.warning,.wf-table>tfoot>tr.warning>td,.wf-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wf-table-hover>tbody>tr>td.warning:hover,.wf-table-hover>tbody>tr>th.warning:hover,.wf-table-hover>tbody>tr.warning:hover>td,.wf-table-hover>tbody>tr:hover>.warning,.wf-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wf-table>thead>tr>td.danger,.wf-table>thead>tr>th.danger,.wf-table>thead>tr.danger>td,.wf-table>thead>tr.danger>th,.wf-table>tbody>tr>td.danger,.wf-table>tbody>tr>th.danger,.wf-table>tbody>tr.danger>td,.wf-table>tbody>tr.danger>th,.wf-table>tfoot>tr>td.danger,.wf-table>tfoot>tr>th.danger,.wf-table>tfoot>tr.danger>td,.wf-table>tfoot>tr.danger>th{background-color:#f2dede}.wf-table-hover>tbody>tr>td.danger:hover,.wf-table-hover>tbody>tr>th.danger:hover,.wf-table-hover>tbody>tr.danger:hover>td,.wf-table-hover>tbody>tr:hover>.danger,.wf-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wf-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wf-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wf-table-responsive>.wf-table{margin-bottom:0}.wf-table-responsive>.wf-table>thead>tr>th,.wf-table-responsive>.wf-table>thead>tr>td,.wf-table-responsive>.wf-table>tbody>tr>th,.wf-table-responsive>.wf-table>tbody>tr>td,.wf-table-responsive>.wf-table>tfoot>tr>th,.wf-table-responsive>.wf-table>tfoot>tr>td{white-space:nowrap}.wf-table-responsive>.wf-table-bordered{border:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:first-child{border-left:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:last-child{border-right:0}.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>td,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.wf-nav{margin-bottom:0;padding-left:0;list-style:none}.wf-nav:before,.wf-nav:after{content:" ";display:table}.wf-nav:after{clear:both}.wf-nav>li{position:relative;display:block}.wf-nav>li>a{position:relative;display:block;padding:8px 12px}.wf-nav>li>a:hover,.wf-nav>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wf-nav>li.wf-disabled>a{color:#777}.wf-nav>li.wf-disabled>a:hover,.wf-nav>li.wf-disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wf-nav .wf-open>a,.wf-nav .wf-open>a:hover,.wf-nav .wf-open>a:focus{background-color:#e2e2e2;border-color:#00709e}.wf-nav>li>a>img{max-width:none}.wf-nav-tabs{border-bottom:1px solid #ddd}.wf-nav-tabs>li{float:left;margin-bottom:-1px}.wf-nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.wf-nav-tabs>li>a:hover{border-color:#e2e2e2 #e2e2e2 #ddd}.wf-nav-tabs>li.wf-active>a,.wf-nav-tabs>li.wf-active>a:hover,.wf-nav-tabs>li.wf-active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.wf-nav-pills>li{float:left}.wf-nav-pills>li>a{border-radius:4px}.wf-nav-pills>li+li{margin-left:2px}.wf-nav-pills>li.wf-active>a,.wf-nav-pills>li.wf-active>a:hover,.wf-nav-pills>li.wf-active>a:focus{color:#fff;background-color:#00709e}.wf-nav-stacked>li{float:none}.wf-nav-stacked>li+li{margin-top:2px;margin-left:0}.wf-nav-justified,.wf-nav-tabs.wf-nav-justified{width:100%}.wf-nav-justified>li,.wf-nav-tabs.wf-nav-justified>li{float:none}.wf-nav-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{text-align:center;margin-bottom:5px}.wf-nav-justified>.wf-dropdown .wf-dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.wf-nav-justified>li,.wf-nav-tabs.wf-nav-justified>li{display:table-cell;width:1%}.wf-nav-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{margin-bottom:0}}.wf-nav-tabs-justified,.wf-nav-tabs.wf-nav-justified{border-bottom:0}.wf-nav-tabs-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{margin-right:0;border-radius:4px}.wf-nav-tabs-justified>.wf-active>a,.wf-nav-tabs.wf-nav-justified>.wf-active>a,.wf-nav-tabs-justified>.wf-active>a:hover,.wf-nav-tabs.wf-nav-justified>.wf-active>a:hover,.wf-nav-tabs-justified>.wf-active>a:focus,.wf-nav-tabs.wf-nav-justified>.wf-active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.wf-nav-tabs-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.wf-nav-tabs-justified>.wf-active>a,.wf-nav-tabs.wf-nav-justified>.wf-active>a,.wf-nav-tabs-justified>.wf-active>a:hover,.wf-nav-tabs.wf-nav-justified>.wf-active>a:hover,.wf-nav-tabs-justified>.wf-active>a:focus,.wf-nav-tabs.wf-nav-justified>.wf-active>a:focus{border-bottom-color:#fff}}.wf-tab-content>.wf-tab-pane{display:none}.wf-tab-content>.wf-active{display:block}.wf-nav-tabs .wf-dropdown-menu{margin-top:-1px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wf-navbar-brand{float:left;padding:12px 8px;font-size:18px;line-height:20px;margin:10px 0 0 0}.wf-navbar-brand:hover,.wf-navbar-brand:focus{text-decoration:none}.wf-navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .wf-navbar-brand,.navbar>.container-fluid .wf-navbar-brand{margin-left:-8px}}.wf-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.wf-dropup,.wf-dropdown{position:relative}.wf-dropdown-toggle:focus{outline:0}.wf-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.wf-dropdown-menu .wf-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.wf-dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;text-decoration:none;white-space:nowrap}.wf-dropdown-menu>li>a:hover,.wf-dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.wf-dropdown-menu>.wf-active>a,.wf-dropdown-menu>.wf-active>a:hover,.wf-dropdown-menu>.wf-active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00709e}.wf-dropdown-menu>.wf-disabled>a,.wf-dropdown-menu>.wf-disabled>a:hover,.wf-dropdown-menu>.wf-disabled>a:focus{color:#777}.wf-dropdown-menu>.wf-disabled>a:hover,.wf-dropdown-menu>.wf-disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.wf-open>.wf-dropdown-menu{display:block}.wf-open>a{outline:0}.wf-dropdown-menu-right{left:auto;right:0}.wf-dropdown-menu-left{left:0;right:auto}.wf-dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.wf-dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.wf-pull-right>.wf-dropdown-menu{right:0;left:auto}.wf-dropup .wf-caret,.wf-navbar-fixed-bottom .wf-dropdown .wf-caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.wf-dropup .wf-dropdown-menu,.wf-navbar-fixed-bottom .wf-dropdown .wf-dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.wf-navbar-right .wf-dropdown-menu{right:0;left:auto}.wf-navbar-right .wf-dropdown-menu-left{left:0;right:auto}}.wf-mobile-dropdown{border:1px solid #ccc;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:24px;margin:10px 10px 0 0;background:#f1f1f1;color:#000;font-weight:600;text-decoration:none}.wf-blocked-countries{margin-bottom:0;margin-top:0;padding-left:0;list-style:none;margin-left:-6px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wf-blocked-countries>li{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;margin:0px 0px 2px 6px;text-align:center;border:1px solid #e2e2e2;border-radius:4px;padding:8px 12px;background-color:#ffffff;-webkit-flex-basis:38%;flex-basis:38%}@media (min-width: 768px){.wf-blocked-countries>li{-webkit-flex-basis:20%;flex-basis:20%}}@media (min-width: 992px){.wf-blocked-countries>li{-webkit-flex-basis:15%;flex-basis:15%}}@media (min-width: 1200px){.wf-blocked-countries>li{-webkit-flex-basis:10%;flex-basis:10%}}.wf-blocked-countries>li:hover,.wf-blocked-countries>li:focus{text-decoration:none;background-color:#e2e2e2}.wf-blocked-countries>li.disabled>a{color:#777}.wf-blocked-countries>li.disabled>a:hover,.wf-blocked-countries>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wf-blocked-countries>li>a{text-decoration:none;position:relative;display:block}.wf-blocked-countries>li.active,.wf-blocked-countries>li.active:hover,.wf-blocked-countries>li.active:focus{background-color:#00709e;border-color:#00709e}.wf-blocked-countries>li.active>a,.wf-blocked-countries>li.active:hover>a,.wf-blocked-countries>li.active:focus>a{color:#fff}.wf-blocked-countries>li.text-only{position:relative;display:block;padding:8px 12px}.wf-blocked-countries>li>a>img{max-width:none}.wf-blocked-countries-section{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-blocked-countries-section-title{font-size:1.1rem;padding-right:0.5rem}.wf-blocked-countries-section-spacer{-webkit-flex-basis:30px;flex-basis:30px;height:1px;background:#aaa}.wf-blocked-countries-section-options{margin-bottom:0;margin-top:0;padding-left:0.5rem;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-blocked-countries-section-options li{padding:0;margin:0;color:#777}.wf-blocked-countries-section-options li a{padding:2px 4px;text-decoration:none;color:#777}.wf-blocked-countries-section-options li a.active-section{background-color:#777;color:#e2e2e2}
css/wf-ionicons.css ADDED
@@ -0,0 +1 @@
 
1
+ @font-face{font-family:"Ionicons";src:url("../fonts/ionicons.woff?v=2.0.0") format("woff");font-weight:normal;font-style:normal}.wf-ion,.wf-ionicons,.wf-ion-alert:before,.wf-ion-alert-circled:before,.wf-ion-android-add:before,.wf-ion-android-add-circle:before,.wf-ion-android-alarm-clock:before,.wf-ion-android-alert:before,.wf-ion-android-apps:before,.wf-ion-android-archive:before,.wf-ion-android-arrow-back:before,.wf-ion-android-arrow-down:before,.wf-ion-android-arrow-dropdown:before,.wf-ion-android-arrow-dropdown-circle:before,.wf-ion-android-arrow-dropleft:before,.wf-ion-android-arrow-dropleft-circle:before,.wf-ion-android-arrow-dropright:before,.wf-ion-android-arrow-dropright-circle:before,.wf-ion-android-arrow-dropup:before,.wf-ion-android-arrow-dropup-circle:before,.wf-ion-android-arrow-forward:before,.wf-ion-android-arrow-up:before,.wf-ion-android-attach:before,.wf-ion-android-bar:before,.wf-ion-android-bicycle:before,.wf-ion-android-boat:before,.wf-ion-android-bookmark:before,.wf-ion-android-bulb:before,.wf-ion-android-bus:before,.wf-ion-android-calendar:before,.wf-ion-android-call:before,.wf-ion-android-camera:before,.wf-ion-android-cancel:before,.wf-ion-android-car:before,.wf-ion-android-cart:before,.wf-ion-android-chat:before,.wf-ion-android-checkbox:before,.wf-ion-android-checkbox-blank:before,.wf-ion-android-checkbox-outline:before,.wf-ion-android-checkbox-outline-blank:before,.wf-ion-android-checkmark-circle:before,.wf-ion-android-clipboard:before,.wf-ion-android-close:before,.wf-ion-android-cloud:before,.wf-ion-android-cloud-circle:before,.wf-ion-android-cloud-done:before,.wf-ion-android-cloud-outline:before,.wf-ion-android-color-palette:before,.wf-ion-android-compass:before,.wf-ion-android-contact:before,.wf-ion-android-contacts:before,.wf-ion-android-contract:before,.wf-ion-android-create:before,.wf-ion-android-delete:before,.wf-ion-android-desktop:before,.wf-ion-android-document:before,.wf-ion-android-done:before,.wf-ion-android-done-all:before,.wf-ion-android-download:before,.wf-ion-android-drafts:before,.wf-ion-android-exit:before,.wf-ion-android-expand:before,.wf-ion-android-favorite:before,.wf-ion-android-favorite-outline:before,.wf-ion-android-film:before,.wf-ion-android-folder:before,.wf-ion-android-folder-open:before,.wf-ion-android-funnel:before,.wf-ion-android-globe:before,.wf-ion-android-hand:before,.wf-ion-android-hangout:before,.wf-ion-android-happy:before,.wf-ion-android-home:before,.wf-ion-android-image:before,.wf-ion-android-laptop:before,.wf-ion-android-list:before,.wf-ion-android-locate:before,.wf-ion-android-lock:before,.wf-ion-android-mail:before,.wf-ion-android-map:before,.wf-ion-android-menu:before,.wf-ion-android-microphone:before,.wf-ion-android-microphone-off:before,.wf-ion-android-more-horizontal:before,.wf-ion-android-more-vertical:before,.wf-ion-android-navigate:before,.wf-ion-android-notifications:before,.wf-ion-android-notifications-none:before,.wf-ion-android-notifications-off:before,.wf-ion-android-open:before,.wf-ion-android-options:before,.wf-ion-android-people:before,.wf-ion-android-person:before,.wf-ion-android-person-add:before,.wf-ion-android-phone-landscape:before,.wf-ion-android-phone-portrait:before,.wf-ion-android-pin:before,.wf-ion-android-plane:before,.wf-ion-android-playstore:before,.wf-ion-android-print:before,.wf-ion-android-radio-button-off:before,.wf-ion-android-radio-button-on:before,.wf-ion-android-refresh:before,.wf-ion-android-remove:before,.wf-ion-android-remove-circle:before,.wf-ion-android-restaurant:before,.wf-ion-android-sad:before,.wf-ion-android-search:before,.wf-ion-android-send:before,.wf-ion-android-settings:before,.wf-ion-android-share:before,.wf-ion-android-share-alt:before,.wf-ion-android-star:before,.wf-ion-android-star-half:before,.wf-ion-android-star-outline:before,.wf-ion-android-stopwatch:before,.wf-ion-android-subway:before,.wf-ion-android-sunny:before,.wf-ion-android-sync:before,.wf-ion-android-textsms:before,.wf-ion-android-time:before,.wf-ion-android-train:before,.wf-ion-android-unlock:before,.wf-ion-android-upload:before,.wf-ion-android-volume-down:before,.wf-ion-android-volume-mute:before,.wf-ion-android-volume-off:before,.wf-ion-android-volume-up:before,.wf-ion-android-walk:before,.wf-ion-android-warning:before,.wf-ion-android-watch:before,.wf-ion-android-wifi:before,.wf-ion-aperture:before,.wf-ion-archive:before,.wf-ion-arrow-down-a:before,.wf-ion-arrow-down-b:before,.wf-ion-arrow-down-c:before,.wf-ion-arrow-expand:before,.wf-ion-arrow-graph-down-left:before,.wf-ion-arrow-graph-down-right:before,.wf-ion-arrow-graph-up-left:before,.wf-ion-arrow-graph-up-right:before,.wf-ion-arrow-left-a:before,.wf-ion-arrow-left-b:before,.wf-ion-arrow-left-c:before,.wf-ion-arrow-move:before,.wf-ion-arrow-resize:before,.wf-ion-arrow-return-left:before,.wf-ion-arrow-return-right:before,.wf-ion-arrow-right-a:before,.wf-ion-arrow-right-b:before,.wf-ion-arrow-right-c:before,.wf-ion-arrow-shrink:before,.wf-ion-arrow-swap:before,.wf-ion-arrow-up-a:before,.wf-ion-arrow-up-b:before,.wf-ion-arrow-up-c:before,.wf-ion-asterisk:before,.wf-ion-at:before,.wf-ion-backspace:before,.wf-ion-backspace-outline:before,.wf-ion-bag:before,.wf-ion-battery-charging:before,.wf-ion-battery-empty:before,.wf-ion-battery-full:before,.wf-ion-battery-half:before,.wf-ion-battery-low:before,.wf-ion-beaker:before,.wf-ion-beer:before,.wf-ion-bluetooth:before,.wf-ion-bonfire:before,.wf-ion-bookmark:before,.wf-ion-bowtie:before,.wf-ion-briefcase:before,.wf-ion-bug:before,.wf-ion-calculator:before,.wf-ion-calendar:before,.wf-ion-camera:before,.wf-ion-card:before,.wf-ion-cash:before,.wf-ion-chatbox:before,.wf-ion-chatbox-working:before,.wf-ion-chatboxes:before,.wf-ion-chatbubble:before,.wf-ion-chatbubble-working:before,.wf-ion-chatbubbles:before,.wf-ion-checkmark:before,.wf-ion-checkmark-circled:before,.wf-ion-checkmark-round:before,.wf-ion-chevron-down:before,.wf-ion-chevron-left:before,.wf-ion-chevron-right:before,.wf-ion-chevron-up:before,.wf-ion-clipboard:before,.wf-ion-clock:before,.wf-ion-close:before,.wf-ion-close-circled:before,.wf-ion-close-round:before,.wf-ion-closed-captioning:before,.wf-ion-cloud:before,.wf-ion-code:before,.wf-ion-code-download:before,.wf-ion-code-working:before,.wf-ion-coffee:before,.wf-ion-compass:before,.wf-ion-compose:before,.wf-ion-connection-bars:before,.wf-ion-contrast:before,.wf-ion-crop:before,.wf-ion-cube:before,.wf-ion-disc:before,.wf-ion-document:before,.wf-ion-document-text:before,.wf-ion-drag:before,.wf-ion-earth:before,.wf-ion-easel:before,.wf-ion-edit:before,.wf-ion-egg:before,.wf-ion-eject:before,.wf-ion-email:before,.wf-ion-email-unread:before,.wf-ion-erlenmeyer-flask:before,.wf-ion-erlenmeyer-flask-bubbles:before,.wf-ion-eye:before,.wf-ion-eye-disabled:before,.wf-ion-female:before,.wf-ion-filing:before,.wf-ion-film-marker:before,.wf-ion-fireball:before,.wf-ion-flag:before,.wf-ion-flame:before,.wf-ion-flash:before,.wf-ion-flash-off:before,.wf-ion-folder:before,.wf-ion-fork:before,.wf-ion-fork-repo:before,.wf-ion-forward:before,.wf-ion-funnel:before,.wf-ion-gear-a:before,.wf-ion-gear-b:before,.wf-ion-grid:before,.wf-ion-hammer:before,.wf-ion-happy:before,.wf-ion-happy-outline:before,.wf-ion-headphone:before,.wf-ion-heart:before,.wf-ion-heart-broken:before,.wf-ion-help:before,.wf-ion-help-buoy:before,.wf-ion-help-circled:before,.wf-ion-home:before,.wf-ion-icecream:before,.wf-ion-image:before,.wf-ion-images:before,.wf-ion-information:before,.wf-ion-information-circled:before,.wf-ion-ionic:before,.wf-ion-ios-alarm:before,.wf-ion-ios-alarm-outline:before,.wf-ion-ios-albums:before,.wf-ion-ios-albums-outline:before,.wf-ion-ios-americanfootball:before,.wf-ion-ios-americanfootball-outline:before,.wf-ion-ios-analytics:before,.wf-ion-ios-analytics-outline:before,.wf-ion-ios-arrow-back:before,.wf-ion-ios-arrow-down:before,.wf-ion-ios-arrow-forward:before,.wf-ion-ios-arrow-left:before,.wf-ion-ios-arrow-right:before,.wf-ion-ios-arrow-thin-down:before,.wf-ion-ios-arrow-thin-left:before,.wf-ion-ios-arrow-thin-right:before,.wf-ion-ios-arrow-thin-up:before,.wf-ion-ios-arrow-up:before,.wf-ion-ios-at:before,.wf-ion-ios-at-outline:before,.wf-ion-ios-barcode:before,.wf-ion-ios-barcode-outline:before,.wf-ion-ios-baseball:before,.wf-ion-ios-baseball-outline:before,.wf-ion-ios-basketball:before,.wf-ion-ios-basketball-outline:before,.wf-ion-ios-bell:before,.wf-ion-ios-bell-outline:before,.wf-ion-ios-body:before,.wf-ion-ios-body-outline:before,.wf-ion-ios-bolt:before,.wf-ion-ios-bolt-outline:before,.wf-ion-ios-book:before,.wf-ion-ios-book-outline:before,.wf-ion-ios-bookmarks:before,.wf-ion-ios-bookmarks-outline:before,.wf-ion-ios-box:before,.wf-ion-ios-box-outline:before,.wf-ion-ios-briefcase:before,.wf-ion-ios-briefcase-outline:before,.wf-ion-ios-browsers:before,.wf-ion-ios-browsers-outline:before,.wf-ion-ios-calculator:before,.wf-ion-ios-calculator-outline:before,.wf-ion-ios-calendar:before,.wf-ion-ios-calendar-outline:before,.wf-ion-ios-camera:before,.wf-ion-ios-camera-outline:before,.wf-ion-ios-cart:before,.wf-ion-ios-cart-outline:before,.wf-ion-ios-chatboxes:before,.wf-ion-ios-chatboxes-outline:before,.wf-ion-ios-chatbubble:before,.wf-ion-ios-chatbubble-outline:before,.wf-ion-ios-checkmark:before,.wf-ion-ios-checkmark-empty:before,.wf-ion-ios-checkmark-outline:before,.wf-ion-ios-circle-filled:before,.wf-ion-ios-circle-outline:before,.wf-ion-ios-clock:before,.wf-ion-ios-clock-outline:before,.wf-ion-ios-close:before,.wf-ion-ios-close-empty:before,.wf-ion-ios-close-outline:before,.wf-ion-ios-cloud:before,.wf-ion-ios-cloud-download:before,.wf-ion-ios-cloud-download-outline:before,.wf-ion-ios-cloud-outline:before,.wf-ion-ios-cloud-upload:before,.wf-ion-ios-cloud-upload-outline:before,.wf-ion-ios-cloudy:before,.wf-ion-ios-cloudy-night:before,.wf-ion-ios-cloudy-night-outline:before,.wf-ion-ios-cloudy-outline:before,.wf-ion-ios-cog:before,.wf-ion-ios-cog-outline:before,.wf-ion-ios-color-filter:before,.wf-ion-ios-color-filter-outline:before,.wf-ion-ios-color-wand:before,.wf-ion-ios-color-wand-outline:before,.wf-ion-ios-compose:before,.wf-ion-ios-compose-outline:before,.wf-ion-ios-contact:before,.wf-ion-ios-contact-outline:before,.wf-ion-ios-copy:before,.wf-ion-ios-copy-outline:before,.wf-ion-ios-crop:before,.wf-ion-ios-crop-strong:before,.wf-ion-ios-download:before,.wf-ion-ios-download-outline:before,.wf-ion-ios-drag:before,.wf-ion-ios-email:before,.wf-ion-ios-email-outline:before,.wf-ion-ios-eye:before,.wf-ion-ios-eye-outline:before,.wf-ion-ios-fastforward:before,.wf-ion-ios-fastforward-outline:before,.wf-ion-ios-filing:before,.wf-ion-ios-filing-outline:before,.wf-ion-ios-film:before,.wf-ion-ios-film-outline:before,.wf-ion-ios-flag:before,.wf-ion-ios-flag-outline:before,.wf-ion-ios-flame:before,.wf-ion-ios-flame-outline:before,.wf-ion-ios-flask:before,.wf-ion-ios-flask-outline:before,.wf-ion-ios-flower:before,.wf-ion-ios-flower-outline:before,.wf-ion-ios-folder:before,.wf-ion-ios-folder-outline:before,.wf-ion-ios-football:before,.wf-ion-ios-football-outline:before,.wf-ion-ios-game-controller-a:before,.wf-ion-ios-game-controller-a-outline:before,.wf-ion-ios-game-controller-b:before,.wf-ion-ios-game-controller-b-outline:before,.wf-ion-ios-gear:before,.wf-ion-ios-gear-outline:before,.wf-ion-ios-glasses:before,.wf-ion-ios-glasses-outline:before,.wf-ion-ios-grid-view:before,.wf-ion-ios-grid-view-outline:before,.wf-ion-ios-heart:before,.wf-ion-ios-heart-outline:before,.wf-ion-ios-help:before,.wf-ion-ios-help-empty:before,.wf-ion-ios-help-outline:before,.wf-ion-ios-home:before,.wf-ion-ios-home-outline:before,.wf-ion-ios-infinite:before,.wf-ion-ios-infinite-outline:before,.wf-ion-ios-information:before,.wf-ion-ios-information-empty:before,.wf-ion-ios-information-outline:before,.wf-ion-ios-ionic-outline:before,.wf-ion-ios-keypad:before,.wf-ion-ios-keypad-outline:before,.wf-ion-ios-lightbulb:before,.wf-ion-ios-lightbulb-outline:before,.wf-ion-ios-list:before,.wf-ion-ios-list-outline:before,.wf-ion-ios-location:before,.wf-ion-ios-location-outline:before,.wf-ion-ios-locked:before,.wf-ion-ios-locked-outline:before,.wf-ion-ios-loop:before,.wf-ion-ios-loop-strong:before,.wf-ion-ios-medical:before,.wf-ion-ios-medical-outline:before,.wf-ion-ios-medkit:before,.wf-ion-ios-medkit-outline:before,.wf-ion-ios-mic:before,.wf-ion-ios-mic-off:before,.wf-ion-ios-mic-outline:before,.wf-ion-ios-minus:before,.wf-ion-ios-minus-empty:before,.wf-ion-ios-minus-outline:before,.wf-ion-ios-monitor:before,.wf-ion-ios-monitor-outline:before,.wf-ion-ios-moon:before,.wf-ion-ios-moon-outline:before,.wf-ion-ios-more:before,.wf-ion-ios-more-outline:before,.wf-ion-ios-musical-note:before,.wf-ion-ios-musical-notes:before,.wf-ion-ios-navigate:before,.wf-ion-ios-navigate-outline:before,.wf-ion-ios-nutrition:before,.wf-ion-ios-nutrition-outline:before,.wf-ion-ios-paper:before,.wf-ion-ios-paper-outline:before,.wf-ion-ios-paperplane:before,.wf-ion-ios-paperplane-outline:before,.wf-ion-ios-partlysunny:before,.wf-ion-ios-partlysunny-outline:before,.wf-ion-ios-pause:before,.wf-ion-ios-pause-outline:before,.wf-ion-ios-paw:before,.wf-ion-ios-paw-outline:before,.wf-ion-ios-people:before,.wf-ion-ios-people-outline:before,.wf-ion-ios-person:before,.wf-ion-ios-person-outline:before,.wf-ion-ios-personadd:before,.wf-ion-ios-personadd-outline:before,.wf-ion-ios-photos:before,.wf-ion-ios-photos-outline:before,.wf-ion-ios-pie:before,.wf-ion-ios-pie-outline:before,.wf-ion-ios-pint:before,.wf-ion-ios-pint-outline:before,.wf-ion-ios-play:before,.wf-ion-ios-play-outline:before,.wf-ion-ios-plus:before,.wf-ion-ios-plus-empty:before,.wf-ion-ios-plus-outline:before,.wf-ion-ios-pricetag:before,.wf-ion-ios-pricetag-outline:before,.wf-ion-ios-pricetags:before,.wf-ion-ios-pricetags-outline:before,.wf-ion-ios-printer:before,.wf-ion-ios-printer-outline:before,.wf-ion-ios-pulse:before,.wf-ion-ios-pulse-strong:before,.wf-ion-ios-rainy:before,.wf-ion-ios-rainy-outline:before,.wf-ion-ios-recording:before,.wf-ion-ios-recording-outline:before,.wf-ion-ios-redo:before,.wf-ion-ios-redo-outline:before,.wf-ion-ios-refresh:before,.wf-ion-ios-refresh-empty:before,.wf-ion-ios-refresh-outline:before,.wf-ion-ios-reload:before,.wf-ion-ios-reverse-camera:before,.wf-ion-ios-reverse-camera-outline:before,.wf-ion-ios-rewind:before,.wf-ion-ios-rewind-outline:before,.wf-ion-ios-rose:before,.wf-ion-ios-rose-outline:before,.wf-ion-ios-search:before,.wf-ion-ios-search-strong:before,.wf-ion-ios-settings:before,.wf-ion-ios-settings-strong:before,.wf-ion-ios-shuffle:before,.wf-ion-ios-shuffle-strong:before,.wf-ion-ios-skipbackward:before,.wf-ion-ios-skipbackward-outline:before,.wf-ion-ios-skipforward:before,.wf-ion-ios-skipforward-outline:before,.wf-ion-ios-snowy:before,.wf-ion-ios-speedometer:before,.wf-ion-ios-speedometer-outline:before,.wf-ion-ios-star:before,.wf-ion-ios-star-half:before,.wf-ion-ios-star-outline:before,.wf-ion-ios-stopwatch:before,.wf-ion-ios-stopwatch-outline:before,.wf-ion-ios-sunny:before,.wf-ion-ios-sunny-outline:before,.wf-ion-ios-telephone:before,.wf-ion-ios-telephone-outline:before,.wf-ion-ios-tennisball:before,.wf-ion-ios-tennisball-outline:before,.wf-ion-ios-thunderstorm:before,.wf-ion-ios-thunderstorm-outline:before,.wf-ion-ios-time:before,.wf-ion-ios-time-outline:before,.wf-ion-ios-timer:before,.wf-ion-ios-timer-outline:before,.wf-ion-ios-toggle:before,.wf-ion-ios-toggle-outline:before,.wf-ion-ios-trash:before,.wf-ion-ios-trash-outline:before,.wf-ion-ios-undo:before,.wf-ion-ios-undo-outline:before,.wf-ion-ios-unlocked:before,.wf-ion-ios-unlocked-outline:before,.wf-ion-ios-upload:before,.wf-ion-ios-upload-outline:before,.wf-ion-ios-videocam:before,.wf-ion-ios-videocam-outline:before,.wf-ion-ios-volume-high:before,.wf-ion-ios-volume-low:before,.wf-ion-ios-wineglass:before,.wf-ion-ios-wineglass-outline:before,.wf-ion-ios-world:before,.wf-ion-ios-world-outline:before,.wf-ion-ipad:before,.wf-ion-iphone:before,.wf-ion-ipod:before,.wf-ion-jet:before,.wf-ion-key:before,.wf-ion-knife:before,.wf-ion-laptop:before,.wf-ion-leaf:before,.wf-ion-levels:before,.wf-ion-lightbulb:before,.wf-ion-link:before,.wf-ion-load-a:before,.wf-ion-load-b:before,.wf-ion-load-c:before,.wf-ion-load-d:before,.wf-ion-location:before,.wf-ion-lock-combination:before,.wf-ion-locked:before,.wf-ion-log-in:before,.wf-ion-log-out:before,.wf-ion-loop:before,.wf-ion-magnet:before,.wf-ion-male:before,.wf-ion-man:before,.wf-ion-map:before,.wf-ion-medkit:before,.wf-ion-merge:before,.wf-ion-mic-a:before,.wf-ion-mic-b:before,.wf-ion-mic-c:before,.wf-ion-minus:before,.wf-ion-minus-circled:before,.wf-ion-minus-round:before,.wf-ion-model-s:before,.wf-ion-monitor:before,.wf-ion-more:before,.wf-ion-mouse:before,.wf-ion-music-note:before,.wf-ion-navicon:before,.wf-ion-navicon-round:before,.wf-ion-navigate:before,.wf-ion-network:before,.wf-ion-no-smoking:before,.wf-ion-nuclear:before,.wf-ion-outlet:before,.wf-ion-paintbrush:before,.wf-ion-paintbucket:before,.wf-ion-paper-airplane:before,.wf-ion-paperclip:before,.wf-ion-pause:before,.wf-ion-person:before,.wf-ion-person-add:before,.wf-ion-person-stalker:before,.wf-ion-pie-graph:before,.wf-ion-pin:before,.wf-ion-pinpoint:before,.wf-ion-pizza:before,.wf-ion-plane:before,.wf-ion-planet:before,.wf-ion-play:before,.wf-ion-playstation:before,.wf-ion-plus:before,.wf-ion-plus-circled:before,.wf-ion-plus-round:before,.wf-ion-podium:before,.wf-ion-pound:before,.wf-ion-power:before,.wf-ion-pricetag:before,.wf-ion-pricetags:before,.wf-ion-printer:before,.wf-ion-pull-request:before,.wf-ion-qr-scanner:before,.wf-ion-quote:before,.wf-ion-radio-waves:before,.wf-ion-record:before,.wf-ion-refresh:before,.wf-ion-reply:before,.wf-ion-reply-all:before,.wf-ion-ribbon-a:before,.wf-ion-ribbon-b:before,.wf-ion-sad:before,.wf-ion-sad-outline:before,.wf-ion-scissors:before,.wf-ion-search:before,.wf-ion-settings:before,.wf-ion-share:before,.wf-ion-shuffle:before,.wf-ion-skip-backward:before,.wf-ion-skip-forward:before,.wf-ion-social-android:before,.wf-ion-social-android-outline:before,.wf-ion-social-angular:before,.wf-ion-social-angular-outline:before,.wf-ion-social-apple:before,.wf-ion-social-apple-outline:before,.wf-ion-social-bitcoin:before,.wf-ion-social-bitcoin-outline:before,.wf-ion-social-buffer:before,.wf-ion-social-buffer-outline:before,.wf-ion-social-chrome:before,.wf-ion-social-chrome-outline:before,.wf-ion-social-codepen:before,.wf-ion-social-codepen-outline:before,.wf-ion-social-css3:before,.wf-ion-social-css3-outline:before,.wf-ion-social-designernews:before,.wf-ion-social-designernews-outline:before,.wf-ion-social-dribbble:before,.wf-ion-social-dribbble-outline:before,.wf-ion-social-dropbox:before,.wf-ion-social-dropbox-outline:before,.wf-ion-social-euro:before,.wf-ion-social-euro-outline:before,.wf-ion-social-facebook:before,.wf-ion-social-facebook-outline:before,.wf-ion-social-foursquare:before,.wf-ion-social-foursquare-outline:before,.wf-ion-social-freebsd-devil:before,.wf-ion-social-github:before,.wf-ion-social-github-outline:before,.wf-ion-social-google:before,.wf-ion-social-google-outline:before,.wf-ion-social-googleplus:before,.wf-ion-social-googleplus-outline:before,.wf-ion-social-hackernews:before,.wf-ion-social-hackernews-outline:before,.wf-ion-social-html5:before,.wf-ion-social-html5-outline:before,.wf-ion-social-instagram:before,.wf-ion-social-instagram-outline:before,.wf-ion-social-javascript:before,.wf-ion-social-javascript-outline:before,.wf-ion-social-linkedin:before,.wf-ion-social-linkedin-outline:before,.wf-ion-social-markdown:before,.wf-ion-social-nodejs:before,.wf-ion-social-octocat:before,.wf-ion-social-pinterest:before,.wf-ion-social-pinterest-outline:before,.wf-ion-social-python:before,.wf-ion-social-reddit:before,.wf-ion-social-reddit-outline:before,.wf-ion-social-rss:before,.wf-ion-social-rss-outline:before,.wf-ion-social-sass:before,.wf-ion-social-skype:before,.wf-ion-social-skype-outline:before,.wf-ion-social-snapchat:before,.wf-ion-social-snapchat-outline:before,.wf-ion-social-tumblr:before,.wf-ion-social-tumblr-outline:before,.wf-ion-social-tux:before,.wf-ion-social-twitch:before,.wf-ion-social-twitch-outline:before,.wf-ion-social-twitter:before,.wf-ion-social-twitter-outline:before,.wf-ion-social-usd:before,.wf-ion-social-usd-outline:before,.wf-ion-social-vimeo:before,.wf-ion-social-vimeo-outline:before,.wf-ion-social-whatsapp:before,.wf-ion-social-whatsapp-outline:before,.wf-ion-social-windows:before,.wf-ion-social-windows-outline:before,.wf-ion-social-wordpress:before,.wf-ion-social-wordpress-outline:before,.wf-ion-social-yahoo:before,.wf-ion-social-yahoo-outline:before,.wf-ion-social-yen:before,.wf-ion-social-yen-outline:before,.wf-ion-social-youtube:before,.wf-ion-social-youtube-outline:before,.wf-ion-soup-can:before,.wf-ion-soup-can-outline:before,.wf-ion-speakerphone:before,.wf-ion-speedometer:before,.wf-ion-spoon:before,.wf-ion-star:before,.wf-ion-stats-bars:before,.wf-ion-steam:before,.wf-ion-stop:before,.wf-ion-thermometer:before,.wf-ion-thumbsdown:before,.wf-ion-thumbsup:before,.wf-ion-toggle:before,.wf-ion-toggle-filled:before,.wf-ion-transgender:before,.wf-ion-trash-a:before,.wf-ion-trash-b:before,.wf-ion-trophy:before,.wf-ion-tshirt:before,.wf-ion-tshirt-outline:before,.wf-ion-umbrella:before,.wf-ion-university:before,.wf-ion-unlocked:before,.wf-ion-upload:before,.wf-ion-usb:before,.wf-ion-videocamera:before,.wf-ion-volume-high:before,.wf-ion-volume-low:before,.wf-ion-volume-medium:before,.wf-ion-volume-mute:before,.wf-ion-wand:before,.wf-ion-waterdrop:before,.wf-ion-wifi:before,.wf-ion-wineglass:before,.wf-ion-woman:before,.wf-ion-wrench:before,.wf-ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wf-ion-alert:before{content:""}.wf-ion-alert-circled:before{content:""}.wf-ion-android-add:before{content:""}.wf-ion-android-add-circle:before{content:""}.wf-ion-android-alarm-clock:before{content:""}.wf-ion-android-alert:before{content:""}.wf-ion-android-apps:before{content:""}.wf-ion-android-archive:before{content:""}.wf-ion-android-arrow-back:before{content:""}.wf-ion-android-arrow-down:before{content:""}.wf-ion-android-arrow-dropdown:before{content:""}.wf-ion-android-arrow-dropdown-circle:before{content:""}.wf-ion-android-arrow-dropleft:before{content:""}.wf-ion-android-arrow-dropleft-circle:before{content:""}.wf-ion-android-arrow-dropright:before{content:""}.wf-ion-android-arrow-dropright-circle:before{content:""}.wf-ion-android-arrow-dropup:before{content:""}.wf-ion-android-arrow-dropup-circle:before{content:""}.wf-ion-android-arrow-forward:before{content:""}.wf-ion-android-arrow-up:before{content:""}.wf-ion-android-attach:before{content:""}.wf-ion-android-bar:before{content:""}.wf-ion-android-bicycle:before{content:""}.wf-ion-android-boat:before{content:""}.wf-ion-android-bookmark:before{content:""}.wf-ion-android-bulb:before{content:""}.wf-ion-android-bus:before{content:""}.wf-ion-android-calendar:before{content:""}.wf-ion-android-call:before{content:""}.wf-ion-android-camera:before{content:""}.wf-ion-android-cancel:before{content:""}.wf-ion-android-car:before{content:""}.wf-ion-android-cart:before{content:""}.wf-ion-android-chat:before{content:""}.wf-ion-android-checkbox:before{content:""}.wf-ion-android-checkbox-blank:before{content:""}.wf-ion-android-checkbox-outline:before{content:""}.wf-ion-android-checkbox-outline-blank:before{content:""}.wf-ion-android-checkmark-circle:before{content:""}.wf-ion-android-clipboard:before{content:""}.wf-ion-android-close:before{content:""}.wf-ion-android-cloud:before{content:""}.wf-ion-android-cloud-circle:before{content:""}.wf-ion-android-cloud-done:before{content:""}.wf-ion-android-cloud-outline:before{content:""}.wf-ion-android-color-palette:before{content:""}.wf-ion-android-compass:before{content:""}.wf-ion-android-contact:before{content:""}.wf-ion-android-contacts:before{content:""}.wf-ion-android-contract:before{content:""}.wf-ion-android-create:before{content:""}.wf-ion-android-delete:before{content:""}.wf-ion-android-desktop:before{content:""}.wf-ion-android-document:before{content:""}.wf-ion-android-done:before{content:""}.wf-ion-android-done-all:before{content:""}.wf-ion-android-download:before{content:""}.wf-ion-android-drafts:before{content:""}.wf-ion-android-exit:before{content:""}.wf-ion-android-expand:before{content:""}.wf-ion-android-favorite:before{content:""}.wf-ion-android-favorite-outline:before{content:""}.wf-ion-android-film:before{content:""}.wf-ion-android-folder:before{content:""}.wf-ion-android-folder-open:before{content:""}.wf-ion-android-funnel:before{content:""}.wf-ion-android-globe:before{content:""}.wf-ion-android-hand:before{content:""}.wf-ion-android-hangout:before{content:""}.wf-ion-android-happy:before{content:""}.wf-ion-android-home:before{content:""}.wf-ion-android-image:before{content:""}.wf-ion-android-laptop:before{content:""}.wf-ion-android-list:before{content:""}.wf-ion-android-locate:before{content:""}.wf-ion-android-lock:before{content:""}.wf-ion-android-mail:before{content:""}.wf-ion-android-map:before{content:""}.wf-ion-android-menu:before{content:""}.wf-ion-android-microphone:before{content:""}.wf-ion-android-microphone-off:before{content:""}.wf-ion-android-more-horizontal:before{content:""}.wf-ion-android-more-vertical:before{content:""}.wf-ion-android-navigate:before{content:""}.wf-ion-android-notifications:before{content:""}.wf-ion-android-notifications-none:before{content:""}.wf-ion-android-notifications-off:before{content:""}.wf-ion-android-open:before{content:""}.wf-ion-android-options:before{content:""}.wf-ion-android-people:before{content:""}.wf-ion-android-person:before{content:""}.wf-ion-android-person-add:before{content:""}.wf-ion-android-phone-landscape:before{content:""}.wf-ion-android-phone-portrait:before{content:""}.wf-ion-android-pin:before{content:""}.wf-ion-android-plane:before{content:""}.wf-ion-android-playstore:before{content:""}.wf-ion-android-print:before{content:""}.wf-ion-android-radio-button-off:before{content:""}.wf-ion-android-radio-button-on:before{content:""}.wf-ion-android-refresh:before{content:""}.wf-ion-android-remove:before{content:""}.wf-ion-android-remove-circle:before{content:""}.wf-ion-android-restaurant:before{content:""}.wf-ion-android-sad:before{content:""}.wf-ion-android-search:before{content:""}.wf-ion-android-send:before{content:""}.wf-ion-android-settings:before{content:""}.wf-ion-android-share:before{content:""}.wf-ion-android-share-alt:before{content:""}.wf-ion-android-star:before{content:""}.wf-ion-android-star-half:before{content:""}.wf-ion-android-star-outline:before{content:""}.wf-ion-android-stopwatch:before{content:""}.wf-ion-android-subway:before{content:""}.wf-ion-android-sunny:before{content:""}.wf-ion-android-sync:before{content:""}.wf-ion-android-textsms:before{content:""}.wf-ion-android-time:before{content:""}.wf-ion-android-train:before{content:""}.wf-ion-android-unlock:before{content:""}.wf-ion-android-upload:before{content:""}.wf-ion-android-volume-down:before{content:""}.wf-ion-android-volume-mute:before{content:""}.wf-ion-android-volume-off:before{content:""}.wf-ion-android-volume-up:before{content:""}.wf-ion-android-walk:before{content:""}.wf-ion-android-warning:before{content:""}.wf-ion-android-watch:before{content:""}.wf-ion-android-wifi:before{content:""}.wf-ion-aperture:before{content:""}.wf-ion-archive:before{content:""}.wf-ion-arrow-down-a:before{content:""}.wf-ion-arrow-down-b:before{content:""}.wf-ion-arrow-down-c:before{content:""}.wf-ion-arrow-expand:before{content:""}.wf-ion-arrow-graph-down-left:before{content:""}.wf-ion-arrow-graph-down-right:before{content:""}.wf-ion-arrow-graph-up-left:before{content:""}.wf-ion-arrow-graph-up-right:before{content:""}.wf-ion-arrow-left-a:before{content:""}.wf-ion-arrow-left-b:before{content:""}.wf-ion-arrow-left-c:before{content:""}.wf-ion-arrow-move:before{content:""}.wf-ion-arrow-resize:before{content:""}.wf-ion-arrow-return-left:before{content:""}.wf-ion-arrow-return-right:before{content:""}.wf-ion-arrow-right-a:before{content:""}.wf-ion-arrow-right-b:before{content:""}.wf-ion-arrow-right-c:before{content:""}.wf-ion-arrow-shrink:before{content:""}.wf-ion-arrow-swap:before{content:""}.wf-ion-arrow-up-a:before{content:""}.wf-ion-arrow-up-b:before{content:""}.wf-ion-arrow-up-c:before{content:""}.wf-ion-asterisk:before{content:""}.wf-ion-at:before{content:""}.wf-ion-backspace:before{content:""}.wf-ion-backspace-outline:before{content:""}.wf-ion-bag:before{content:""}.wf-ion-battery-charging:before{content:""}.wf-ion-battery-empty:before{content:""}.wf-ion-battery-full:before{content:""}.wf-ion-battery-half:before{content:""}.wf-ion-battery-low:before{content:""}.wf-ion-beaker:before{content:""}.wf-ion-beer:before{content:""}.wf-ion-bluetooth:before{content:""}.wf-ion-bonfire:before{content:""}.wf-ion-bookmark:before{content:""}.wf-ion-bowtie:before{content:""}.wf-ion-briefcase:before{content:""}.wf-ion-bug:before{content:""}.wf-ion-calculator:before{content:""}.wf-ion-calendar:before{content:""}.wf-ion-camera:before{content:""}.wf-ion-card:before{content:""}.wf-ion-cash:before{content:""}.wf-ion-chatbox:before{content:""}.wf-ion-chatbox-working:before{content:""}.wf-ion-chatboxes:before{content:""}.wf-ion-chatbubble:before{content:""}.wf-ion-chatbubble-working:before{content:""}.wf-ion-chatbubbles:before{content:""}.wf-ion-checkmark:before{content:""}.wf-ion-checkmark-circled:before{content:""}.wf-ion-checkmark-round:before{content:""}.wf-ion-chevron-down:before{content:""}.wf-ion-chevron-left:before{content:""}.wf-ion-chevron-right:before{content:""}.wf-ion-chevron-up:before{content:""}.wf-ion-clipboard:before{content:""}.wf-ion-clock:before{content:""}.wf-ion-close:before{content:""}.wf-ion-close-circled:before{content:""}.wf-ion-close-round:before{content:""}.wf-ion-closed-captioning:before{content:""}.wf-ion-cloud:before{content:""}.wf-ion-code:before{content:""}.wf-ion-code-download:before{content:""}.wf-ion-code-working:before{content:""}.wf-ion-coffee:before{content:""}.wf-ion-compass:before{content:""}.wf-ion-compose:before{content:""}.wf-ion-connection-bars:before{content:""}.wf-ion-contrast:before{content:""}.wf-ion-crop:before{content:""}.wf-ion-cube:before{content:""}.wf-ion-disc:before{content:""}.wf-ion-document:before{content:""}.wf-ion-document-text:before{content:""}.wf-ion-drag:before{content:""}.wf-ion-earth:before{content:""}.wf-ion-easel:before{content:""}.wf-ion-edit:before{content:""}.wf-ion-egg:before{content:""}.wf-ion-eject:before{content:""}.wf-ion-email:before{content:""}.wf-ion-email-unread:before{content:""}.wf-ion-erlenmeyer-flask:before{content:""}.wf-ion-erlenmeyer-flask-bubbles:before{content:""}.wf-ion-eye:before{content:""}.wf-ion-eye-disabled:before{content:""}.wf-ion-female:before{content:""}.wf-ion-filing:before{content:""}.wf-ion-film-marker:before{content:""}.wf-ion-fireball:before{content:""}.wf-ion-flag:before{content:""}.wf-ion-flame:before{content:""}.wf-ion-flash:before{content:""}.wf-ion-flash-off:before{content:""}.wf-ion-folder:before{content:""}.wf-ion-fork:before{content:""}.wf-ion-fork-repo:before{content:""}.wf-ion-forward:before{content:""}.wf-ion-funnel:before{content:""}.wf-ion-gear-a:before{content:""}.wf-ion-gear-b:before{content:""}.wf-ion-grid:before{content:""}.wf-ion-hammer:before{content:""}.wf-ion-happy:before{content:""}.wf-ion-happy-outline:before{content:""}.wf-ion-headphone:before{content:""}.wf-ion-heart:before{content:""}.wf-ion-heart-broken:before{content:""}.wf-ion-help:before{content:""}.wf-ion-help-buoy:before{content:""}.wf-ion-help-circled:before{content:""}.wf-ion-home:before{content:""}.wf-ion-icecream:before{content:""}.wf-ion-image:before{content:""}.wf-ion-images:before{content:""}.wf-ion-information:before{content:""}.wf-ion-information-circled:before{content:""}.wf-ion-ionic:before{content:""}.wf-ion-ios-alarm:before{content:""}.wf-ion-ios-alarm-outline:before{content:""}.wf-ion-ios-albums:before{content:""}.wf-ion-ios-albums-outline:before{content:""}.wf-ion-ios-americanfootball:before{content:""}.wf-ion-ios-americanfootball-outline:before{content:""}.wf-ion-ios-analytics:before{content:""}.wf-ion-ios-analytics-outline:before{content:""}.wf-ion-ios-arrow-back:before{content:""}.wf-ion-ios-arrow-down:before{content:""}.wf-ion-ios-arrow-forward:before{content:""}.wf-ion-ios-arrow-left:before{content:""}.wf-ion-ios-arrow-right:before{content:""}.wf-ion-ios-arrow-thin-down:before{content:""}.wf-ion-ios-arrow-thin-left:before{content:""}.wf-ion-ios-arrow-thin-right:before{content:""}.wf-ion-ios-arrow-thin-up:before{content:""}.wf-ion-ios-arrow-up:before{content:""}.wf-ion-ios-at:before{content:""}.wf-ion-ios-at-outline:before{content:""}.wf-ion-ios-barcode:before{content:""}.wf-ion-ios-barcode-outline:before{content:""}.wf-ion-ios-baseball:before{content:""}.wf-ion-ios-baseball-outline:before{content:""}.wf-ion-ios-basketball:before{content:""}.wf-ion-ios-basketball-outline:before{content:""}.wf-ion-ios-bell:before{content:""}.wf-ion-ios-bell-outline:before{content:""}.wf-ion-ios-body:before{content:""}.wf-ion-ios-body-outline:before{content:""}.wf-ion-ios-bolt:before{content:""}.wf-ion-ios-bolt-outline:before{content:""}.wf-ion-ios-book:before{content:""}.wf-ion-ios-book-outline:before{content:""}.wf-ion-ios-bookmarks:before{content:""}.wf-ion-ios-bookmarks-outline:before{content:""}.wf-ion-ios-box:before{content:""}.wf-ion-ios-box-outline:before{content:""}.wf-ion-ios-briefcase:before{content:""}.wf-ion-ios-briefcase-outline:before{content:""}.wf-ion-ios-browsers:before{content:""}.wf-ion-ios-browsers-outline:before{content:""}.wf-ion-ios-calculator:before{content:""}.wf-ion-ios-calculator-outline:before{content:""}.wf-ion-ios-calendar:before{content:""}.wf-ion-ios-calendar-outline:before{content:""}.wf-ion-ios-camera:before{content:""}.wf-ion-ios-camera-outline:before{content:""}.wf-ion-ios-cart:before{content:""}.wf-ion-ios-cart-outline:before{content:""}.wf-ion-ios-chatboxes:before{content:""}.wf-ion-ios-chatboxes-outline:before{content:""}.wf-ion-ios-chatbubble:before{content:""}.wf-ion-ios-chatbubble-outline:before{content:""}.wf-ion-ios-checkmark:before{content:""}.wf-ion-ios-checkmark-empty:before{content:""}.wf-ion-ios-checkmark-outline:before{content:""}.wf-ion-ios-circle-filled:before{content:""}.wf-ion-ios-circle-outline:before{content:""}.wf-ion-ios-clock:before{content:""}.wf-ion-ios-clock-outline:before{content:""}.wf-ion-ios-close:before{content:""}.wf-ion-ios-close-empty:before{content:""}.wf-ion-ios-close-outline:before{content:""}.wf-ion-ios-cloud:before{content:""}.wf-ion-ios-cloud-download:before{content:""}.wf-ion-ios-cloud-download-outline:before{content:""}.wf-ion-ios-cloud-outline:before{content:""}.wf-ion-ios-cloud-upload:before{content:""}.wf-ion-ios-cloud-upload-outline:before{content:""}.wf-ion-ios-cloudy:before{content:""}.wf-ion-ios-cloudy-night:before{content:""}.wf-ion-ios-cloudy-night-outline:before{content:""}.wf-ion-ios-cloudy-outline:before{content:""}.wf-ion-ios-cog:before{content:""}.wf-ion-ios-cog-outline:before{content:""}.wf-ion-ios-color-filter:before{content:""}.wf-ion-ios-color-filter-outline:before{content:""}.wf-ion-ios-color-wand:before{content:""}.wf-ion-ios-color-wand-outline:before{content:""}.wf-ion-ios-compose:before{content:""}.wf-ion-ios-compose-outline:before{content:""}.wf-ion-ios-contact:before{content:""}.wf-ion-ios-contact-outline:before{content:""}.wf-ion-ios-copy:before{content:""}.wf-ion-ios-copy-outline:before{content:""}.wf-ion-ios-crop:before{content:""}.wf-ion-ios-crop-strong:before{content:""}.wf-ion-ios-download:before{content:""}.wf-ion-ios-download-outline:before{content:""}.wf-ion-ios-drag:before{content:""}.wf-ion-ios-email:before{content:""}.wf-ion-ios-email-outline:before{content:""}.wf-ion-ios-eye:before{content:""}.wf-ion-ios-eye-outline:before{content:""}.wf-ion-ios-fastforward:before{content:""}.wf-ion-ios-fastforward-outline:before{content:""}.wf-ion-ios-filing:before{content:""}.wf-ion-ios-filing-outline:before{content:""}.wf-ion-ios-film:before{content:""}.wf-ion-ios-film-outline:before{content:""}.wf-ion-ios-flag:before{content:""}.wf-ion-ios-flag-outline:before{content:""}.wf-ion-ios-flame:before{content:""}.wf-ion-ios-flame-outline:before{content:""}.wf-ion-ios-flask:before{content:""}.wf-ion-ios-flask-outline:before{content:""}.wf-ion-ios-flower:before{content:""}.wf-ion-ios-flower-outline:before{content:""}.wf-ion-ios-folder:before{content:""}.wf-ion-ios-folder-outline:before{content:""}.wf-ion-ios-football:before{content:""}.wf-ion-ios-football-outline:before{content:""}.wf-ion-ios-game-controller-a:before{content:""}.wf-ion-ios-game-controller-a-outline:before{content:""}.wf-ion-ios-game-controller-b:before{content:""}.wf-ion-ios-game-controller-b-outline:before{content:""}.wf-ion-ios-gear:before{content:""}.wf-ion-ios-gear-outline:before{content:""}.wf-ion-ios-glasses:before{content:""}.wf-ion-ios-glasses-outline:before{content:""}.wf-ion-ios-grid-view:before{content:""}.wf-ion-ios-grid-view-outline:before{content:""}.wf-ion-ios-heart:before{content:""}.wf-ion-ios-heart-outline:before{content:""}.wf-ion-ios-help:before{content:""}.wf-ion-ios-help-empty:before{content:""}.wf-ion-ios-help-outline:before{content:""}.wf-ion-ios-home:before{content:""}.wf-ion-ios-home-outline:before{content:""}.wf-ion-ios-infinite:before{content:""}.wf-ion-ios-infinite-outline:before{content:""}.wf-ion-ios-information:before{content:""}.wf-ion-ios-information-empty:before{content:""}.wf-ion-ios-information-outline:before{content:""}.wf-ion-ios-ionic-outline:before{content:""}.wf-ion-ios-keypad:before{content:""}.wf-ion-ios-keypad-outline:before{content:""}.wf-ion-ios-lightbulb:before{content:""}.wf-ion-ios-lightbulb-outline:before{content:""}.wf-ion-ios-list:before{content:""}.wf-ion-ios-list-outline:before{content:""}.wf-ion-ios-location:before{content:""}.wf-ion-ios-location-outline:before{content:""}.wf-ion-ios-locked:before{content:""}.wf-ion-ios-locked-outline:before{content:""}.wf-ion-ios-loop:before{content:""}.wf-ion-ios-loop-strong:before{content:""}.wf-ion-ios-medical:before{content:""}.wf-ion-ios-medical-outline:before{content:""}.wf-ion-ios-medkit:before{content:""}.wf-ion-ios-medkit-outline:before{content:""}.wf-ion-ios-mic:before{content:""}.wf-ion-ios-mic-off:before{content:""}.wf-ion-ios-mic-outline:before{content:""}.wf-ion-ios-minus:before{content:""}.wf-ion-ios-minus-empty:before{content:""}.wf-ion-ios-minus-outline:before{content:""}.wf-ion-ios-monitor:before{content:""}.wf-ion-ios-monitor-outline:before{content:""}.wf-ion-ios-moon:before{content:""}.wf-ion-ios-moon-outline:before{content:""}.wf-ion-ios-more:before{content:""}.wf-ion-ios-more-outline:before{content:""}.wf-ion-ios-musical-note:before{content:""}.wf-ion-ios-musical-notes:before{content:""}.wf-ion-ios-navigate:before{content:""}.wf-ion-ios-navigate-outline:before{content:""}.wf-ion-ios-nutrition:before{content:""}.wf-ion-ios-nutrition-outline:before{content:""}.wf-ion-ios-paper:before{content:""}.wf-ion-ios-paper-outline:before{content:""}.wf-ion-ios-paperplane:before{content:""}.wf-ion-ios-paperplane-outline:before{content:""}.wf-ion-ios-partlysunny:before{content:""}.wf-ion-ios-partlysunny-outline:before{content:""}.wf-ion-ios-pause:before{content:""}.wf-ion-ios-pause-outline:before{content:""}.wf-ion-ios-paw:before{content:""}.wf-ion-ios-paw-outline:before{content:""}.wf-ion-ios-people:before{content:""}.wf-ion-ios-people-outline:before{content:""}.wf-ion-ios-person:before{content:""}.wf-ion-ios-person-outline:before{content:""}.wf-ion-ios-personadd:before{content:""}.wf-ion-ios-personadd-outline:before{content:""}.wf-ion-ios-photos:before{content:""}.wf-ion-ios-photos-outline:before{content:""}.wf-ion-ios-pie:before{content:""}.wf-ion-ios-pie-outline:before{content:""}.wf-ion-ios-pint:before{content:""}.wf-ion-ios-pint-outline:before{content:""}.wf-ion-ios-play:before{content:""}.wf-ion-ios-play-outline:before{content:""}.wf-ion-ios-plus:before{content:""}.wf-ion-ios-plus-empty:before{content:""}.wf-ion-ios-plus-outline:before{content:""}.wf-ion-ios-pricetag:before{content:""}.wf-ion-ios-pricetag-outline:before{content:""}.wf-ion-ios-pricetags:before{content:""}.wf-ion-ios-pricetags-outline:before{content:""}.wf-ion-ios-printer:before{content:""}.wf-ion-ios-printer-outline:before{content:""}.wf-ion-ios-pulse:before{content:""}.wf-ion-ios-pulse-strong:before{content:""}.wf-ion-ios-rainy:before{content:""}.wf-ion-ios-rainy-outline:before{content:""}.wf-ion-ios-recording:before{content:""}.wf-ion-ios-recording-outline:before{content:""}.wf-ion-ios-redo:before{content:""}.wf-ion-ios-redo-outline:before{content:""}.wf-ion-ios-refresh:before{content:""}.wf-ion-ios-refresh-empty:before{content:""}.wf-ion-ios-refresh-outline:before{content:""}.wf-ion-ios-reload:before{content:""}.wf-ion-ios-reverse-camera:before{content:""}.wf-ion-ios-reverse-camera-outline:before{content:""}.wf-ion-ios-rewind:before{content:""}.wf-ion-ios-rewind-outline:before{content:""}.wf-ion-ios-rose:before{content:""}.wf-ion-ios-rose-outline:before{content:""}.wf-ion-ios-search:before{content:""}.wf-ion-ios-search-strong:before{content:""}.wf-ion-ios-settings:before{content:""}.wf-ion-ios-settings-strong:before{content:""}.wf-ion-ios-shuffle:before{content:""}.wf-ion-ios-shuffle-strong:before{content:""}.wf-ion-ios-skipbackward:before{content:""}.wf-ion-ios-skipbackward-outline:before{content:""}.wf-ion-ios-skipforward:before{content:""}.wf-ion-ios-skipforward-outline:before{content:""}.wf-ion-ios-snowy:before{content:""}.wf-ion-ios-speedometer:before{content:""}.wf-ion-ios-speedometer-outline:before{content:""}.wf-ion-ios-star:before{content:""}.wf-ion-ios-star-half:before{content:""}.wf-ion-ios-star-outline:before{content:""}.wf-ion-ios-stopwatch:before{content:""}.wf-ion-ios-stopwatch-outline:before{content:""}.wf-ion-ios-sunny:before{content:""}.wf-ion-ios-sunny-outline:before{content:""}.wf-ion-ios-telephone:before{content:""}.wf-ion-ios-telephone-outline:before{content:""}.wf-ion-ios-tennisball:before{content:""}.wf-ion-ios-tennisball-outline:before{content:""}.wf-ion-ios-thunderstorm:before{content:""}.wf-ion-ios-thunderstorm-outline:before{content:""}.wf-ion-ios-time:before{content:""}.wf-ion-ios-time-outline:before{content:""}.wf-ion-ios-timer:before{content:""}.wf-ion-ios-timer-outline:before{content:""}.wf-ion-ios-toggle:before{content:""}.wf-ion-ios-toggle-outline:before{content:""}.wf-ion-ios-trash:before{content:""}.wf-ion-ios-trash-outline:before{content:""}.wf-ion-ios-undo:before{content:""}.wf-ion-ios-undo-outline:before{content:""}.wf-ion-ios-unlocked:before{content:""}.wf-ion-ios-unlocked-outline:before{content:""}.wf-ion-ios-upload:before{content:""}.wf-ion-ios-upload-outline:before{content:""}.wf-ion-ios-videocam:before{content:""}.wf-ion-ios-videocam-outline:before{content:""}.wf-ion-ios-volume-high:before{content:""}.wf-ion-ios-volume-low:before{content:""}.wf-ion-ios-wineglass:before{content:""}.wf-ion-ios-wineglass-outline:before{content:""}.wf-ion-ios-world:before{content:""}.wf-ion-ios-world-outline:before{content:""}.wf-ion-ipad:before{content:""}.wf-ion-iphone:before{content:""}.wf-ion-ipod:before{content:""}.wf-ion-jet:before{content:""}.wf-ion-key:before{content:""}.wf-ion-knife:before{content:""}.wf-ion-laptop:before{content:""}.wf-ion-leaf:before{content:""}.wf-ion-levels:before{content:""}.wf-ion-lightbulb:before{content:""}.wf-ion-link:before{content:""}.wf-ion-load-a:before{content:""}.wf-ion-load-b:before{content:""}.wf-ion-load-c:before{content:""}.wf-ion-load-d:before{content:""}.wf-ion-location:before{content:""}.wf-ion-lock-combination:before{content:""}.wf-ion-locked:before{content:""}.wf-ion-log-in:before{content:""}.wf-ion-log-out:before{content:""}.wf-ion-loop:before{content:""}.wf-ion-magnet:before{content:""}.wf-ion-male:before{content:""}.wf-ion-man:before{content:""}.wf-ion-map:before{content:""}.wf-ion-medkit:before{content:""}.wf-ion-merge:before{content:""}.wf-ion-mic-a:before{content:""}.wf-ion-mic-b:before{content:""}.wf-ion-mic-c:before{content:""}.wf-ion-minus:before{content:""}.wf-ion-minus-circled:before{content:""}.wf-ion-minus-round:before{content:""}.wf-ion-model-s:before{content:""}.wf-ion-monitor:before{content:""}.wf-ion-more:before{content:""}.wf-ion-mouse:before{content:""}.wf-ion-music-note:before{content:""}.wf-ion-navicon:before{content:""}.wf-ion-navicon-round:before{content:""}.wf-ion-navigate:before{content:""}.wf-ion-network:before{content:""}.wf-ion-no-smoking:before{content:""}.wf-ion-nuclear:before{content:""}.wf-ion-outlet:before{content:""}.wf-ion-paintbrush:before{content:""}.wf-ion-paintbucket:before{content:""}.wf-ion-paper-airplane:before{content:""}.wf-ion-paperclip:before{content:""}.wf-ion-pause:before{content:""}.wf-ion-person:before{content:""}.wf-ion-person-add:before{content:""}.wf-ion-person-stalker:before{content:""}.wf-ion-pie-graph:before{content:""}.wf-ion-pin:before{content:""}.wf-ion-pinpoint:before{content:""}.wf-ion-pizza:before{content:""}.wf-ion-plane:before{content:""}.wf-ion-planet:before{content:""}.wf-ion-play:before{content:""}.wf-ion-playstation:before{content:""}.wf-ion-plus:before{content:""}.wf-ion-plus-circled:before{content:""}.wf-ion-plus-round:before{content:""}.wf-ion-podium:before{content:""}.wf-ion-pound:before{content:""}.wf-ion-power:before{content:""}.wf-ion-pricetag:before{content:""}.wf-ion-pricetags:before{content:""}.wf-ion-printer:before{content:""}.wf-ion-pull-request:before{content:""}.wf-ion-qr-scanner:before{content:""}.wf-ion-quote:before{content:""}.wf-ion-radio-waves:before{content:""}.wf-ion-record:before{content:""}.wf-ion-refresh:before{content:""}.wf-ion-reply:before{content:""}.wf-ion-reply-all:before{content:""}.wf-ion-ribbon-a:before{content:""}.wf-ion-ribbon-b:before{content:""}.wf-ion-sad:before{content:""}.wf-ion-sad-outline:before{content:""}.wf-ion-scissors:before{content:""}.wf-ion-search:before{content:""}.wf-ion-settings:before{content:""}.wf-ion-share:before{content:""}.wf-ion-shuffle:before{content:""}.wf-ion-skip-backward:before{content:""}.wf-ion-skip-forward:before{content:""}.wf-ion-social-android:before{content:""}.wf-ion-social-android-outline:before{content:""}.wf-ion-social-angular:before{content:""}.wf-ion-social-angular-outline:before{content:""}.wf-ion-social-apple:before{content:""}.wf-ion-social-apple-outline:before{content:""}.wf-ion-social-bitcoin:before{content:""}.wf-ion-social-bitcoin-outline:before{content:""}.wf-ion-social-buffer:before{content:""}.wf-ion-social-buffer-outline:before{content:""}.wf-ion-social-chrome:before{content:""}.wf-ion-social-chrome-outline:before{content:""}.wf-ion-social-codepen:before{content:""}.wf-ion-social-codepen-outline:before{content:""}.wf-ion-social-css3:before{content:""}.wf-ion-social-css3-outline:before{content:""}.wf-ion-social-designernews:before{content:""}.wf-ion-social-designernews-outline:before{content:""}.wf-ion-social-dribbble:before{content:""}.wf-ion-social-dribbble-outline:before{content:""}.wf-ion-social-dropbox:before{content:""}.wf-ion-social-dropbox-outline:before{content:""}.wf-ion-social-euro:before{content:""}.wf-ion-social-euro-outline:before{content:""}.wf-ion-social-facebook:before{content:""}.wf-ion-social-facebook-outline:before{content:""}.wf-ion-social-foursquare:before{content:""}.wf-ion-social-foursquare-outline:before{content:""}.wf-ion-social-freebsd-devil:before{content:""}.wf-ion-social-github:before{content:""}.wf-ion-social-github-outline:before{content:""}.wf-ion-social-google:before{content:""}.wf-ion-social-google-outline:before{content:""}.wf-ion-social-googleplus:before{content:""}.wf-ion-social-googleplus-outline:before{content:""}.wf-ion-social-hackernews:before{content:""}.wf-ion-social-hackernews-outline:before{content:""}.wf-ion-social-html5:before{content:""}.wf-ion-social-html5-outline:before{content:""}.wf-ion-social-instagram:before{content:""}.wf-ion-social-instagram-outline:before{content:""}.wf-ion-social-javascript:before{content:""}.wf-ion-social-javascript-outline:before{content:""}.wf-ion-social-linkedin:before{content:""}.wf-ion-social-linkedin-outline:before{content:""}.wf-ion-social-markdown:before{content:""}.wf-ion-social-nodejs:before{content:""}.wf-ion-social-octocat:before{content:""}.wf-ion-social-pinterest:before{content:""}.wf-ion-social-pinterest-outline:before{content:""}.wf-ion-social-python:before{content:""}.wf-ion-social-reddit:before{content:""}.wf-ion-social-reddit-outline:before{content:""}.wf-ion-social-rss:before{content:""}.wf-ion-social-rss-outline:before{content:""}.wf-ion-social-sass:before{content:""}.wf-ion-social-skype:before{content:""}.wf-ion-social-skype-outline:before{content:""}.wf-ion-social-snapchat:before{content:""}.wf-ion-social-snapchat-outline:before{content:""}.wf-ion-social-tumblr:before{content:""}.wf-ion-social-tumblr-outline:before{content:""}.wf-ion-social-tux:before{content:""}.wf-ion-social-twitch:before{content:""}.wf-ion-social-twitch-outline:before{content:""}.wf-ion-social-twitter:before{content:""}.wf-ion-social-twitter-outline:before{content:""}.wf-ion-social-usd:before{content:""}.wf-ion-social-usd-outline:before{content:""}.wf-ion-social-vimeo:before{content:""}.wf-ion-social-vimeo-outline:before{content:""}.wf-ion-social-whatsapp:before{content:""}.wf-ion-social-whatsapp-outline:before{content:""}.wf-ion-social-windows:before{content:""}.wf-ion-social-windows-outline:before{content:""}.wf-ion-social-wordpress:before{content:""}.wf-ion-social-wordpress-outline:before{content:""}.wf-ion-social-yahoo:before{content:""}.wf-ion-social-yahoo-outline:before{content:""}.wf-ion-social-yen:before{content:""}.wf-ion-social-yen-outline:before{content:""}.wf-ion-social-youtube:before{content:""}.wf-ion-social-youtube-outline:before{content:""}.wf-ion-soup-can:before{content:""}.wf-ion-soup-can-outline:before{content:""}.wf-ion-speakerphone:before{content:""}.wf-ion-speedometer:before{content:""}.wf-ion-spoon:before{content:""}.wf-ion-star:before{content:""}.wf-ion-stats-bars:before{content:""}.wf-ion-steam:before{content:""}.wf-ion-stop:before{content:""}.wf-ion-thermometer:before{content:""}.wf-ion-thumbsdown:before{content:""}.wf-ion-thumbsup:before{content:""}.wf-ion-toggle:before{content:""}.wf-ion-toggle-filled:before{content:""}.wf-ion-transgender:before{content:""}.wf-ion-trash-a:before{content:""}.wf-ion-trash-b:before{content:""}.wf-ion-trophy:before{content:""}.wf-ion-tshirt:before{content:""}.wf-ion-tshirt-outline:before{content:""}.wf-ion-umbrella:before{content:""}.wf-ion-university:before{content:""}.wf-ion-unlocked:before{content:""}.wf-ion-upload:before{content:""}.wf-ion-usb:before{content:""}.wf-ion-videocamera:before{content:""}.wf-ion-volume-high:before{content:""}.wf-ion-volume-low:before{content:""}.wf-ion-volume-medium:before{content:""}.wf-ion-volume-mute:before{content:""}.wf-ion-wand:before{content:""}.wf-ion-waterdrop:before{content:""}.wf-ion-wifi:before{content:""}.wf-ion-wineglass:before{content:""}.wf-ion-woman:before{content:""}.wf-ion-wrench:before{content:""}.wf-ion-xbox:before{content:""}
css/wordfenceBox.css CHANGED
@@ -2,7 +2,7 @@
2
  ColorBox Core Style:
3
  The following CSS is consistent between example themes and should not be altered.
4
  */
5
- #wordfenceBox, #wfboxOverlay, #wfboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
6
  #wfboxOverlay{position:fixed; width:100%; height:100%;}
7
  #wfboxMiddleLeft, #wfboxBottomLeft{clear:left;}
8
  #wfboxContent{position:relative;}
2
  ColorBox Core Style:
3
  The following CSS is consistent between example themes and should not be altered.
4
  */
5
+ #wordfenceBox, #wfboxOverlay, #wfboxWrapper{position:absolute; top:0; left:0; z-index:16777271; overflow:hidden;}
6
  #wfboxOverlay{position:fixed; width:100%; height:100%;}
7
  #wfboxMiddleLeft, #wfboxBottomLeft{clear:left;}
8
  #wfboxContent{position:relative;}
fonts/ionicons.woff ADDED
Binary file
js/admin.js CHANGED
@@ -1,6 +1,7 @@
1
  (function($) {
2
  if (!window['wordfenceAdmin']) { //To compile for checking: java -jar /usr/local/bin/closure.jar --js=admin.js --js_output_file=test.js
3
  window['wordfenceAdmin'] = {
 
4
  loading16: '<div class="wfLoading16"></div>',
5
  loadingCount: 0,
6
  dbCheckTables: [],
@@ -46,6 +47,8 @@
46
  basePageName: '',
47
 
48
  init: function() {
 
 
49
  this.nonce = WordfenceAdminVars.firstNonce;
50
  this.debugOn = WordfenceAdminVars.debugOn == '1' ? true : false;
51
  this.tourClosed = WordfenceAdminVars.tourClosed == '1' ? true : false;
@@ -74,14 +77,14 @@
74
  $('#doSendEmail').click(function() {
75
  var ticket = $('#_ticketnumber').val();
76
  if (ticket === null || typeof ticket === "undefined" || ticket.length == 0) {
77
- self.colorbox('400px', "Error", "Please include your support ticket number or forum username.");
78
  return;
79
  }
80
  WFAD.ajax('wordfence_sendDiagnostic', {email: $('#_email').val(), ticket: ticket}, function(res) {
81
  if (res.result) {
82
- self.colorbox('400px', "Email Diagnostic Report", "Diagnostic report has been sent successfully.");
83
  } else {
84
- self.colorbox('400px', "Error", "There was an error while sending the email.");
85
  }
86
  });
87
  });
@@ -101,6 +104,7 @@
101
  var tab = jQuery('#' + jQuery(this).attr('id').replace('-tab', ''));
102
  tab.addClass('active');
103
  jQuery('#wfHeading').html(tab.data('title'));
 
104
  document.title = tab.data('title') + " \u2039 " + self.basePageName;
105
  self.sectionInit();
106
  });
@@ -369,7 +373,7 @@
369
  var self = this;
370
  this.ajax('wordfence_sendTestEmail', {email: email}, function(res) {
371
  if (res.result) {
372
- self.colorbox('400px', "Test Email Sent", "Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: " +
373
  res.result + "<br /><br />A 'True' result means WordPress thinks the mail was sent without errors. A 'False' result means that WordPress encountered an error sending your mail. Note that it's possible to get a 'True' response with an error elsewhere in your mail system that may cause emails to not be delivered.");
374
  }
375
  });
@@ -427,7 +431,7 @@
427
  });
428
  },
429
  downgradeLicense: function() {
430
- this.colorbox('400px', "Confirm Downgrade", "Are you sure you want to downgrade your Wordfence Premium License? This will disable all Premium features and return you to the free version of Wordfence. <a href=\"https://www.wordfence.com/manage-wordfence-api-keys/\" target=\"_blank\">Click here to renew your paid membership</a> or click the button below to confirm you want to downgrade.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Downgrade and disable Premium features\" onclick=\"WFAD.downgradeLicenseConfirm();\" /><br />");
431
  },
432
  downgradeLicenseConfirm: function() {
433
  jQuery.colorbox.close();
@@ -860,9 +864,9 @@
860
  var self = this;
861
  this.ajax('wordfence_killScan', {}, function(res) {
862
  if (res.ok) {
863
- self.colorbox('400px', "Kill requested", "A termination request has been sent to any running scans.");
864
  } else {
865
- self.colorbox('400px', "Kill failed", "We failed to send a termination request.");
866
  }
867
  });
868
  },
@@ -954,7 +958,7 @@
954
  }
955
  continue;
956
  }
957
- jQuery('#' + containerID).html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="' + tableID + '"></table>');
958
 
959
  jQuery.fn.dataTableExt.oSort['severity-asc'] = function(y, x) {
960
  x = WFAD.sev2num(x);
@@ -988,19 +992,19 @@
988
  //"aaData": res.issuesLists[issueStatus],
989
  "aoColumns": [
990
  {
991
- "sTitle": '<div class="th_wrapp">Severity</div>',
992
- "sWidth": '128px',
993
- "sClass": "center",
994
  "sType": 'severity',
995
  "fnRender": function(obj) {
996
  var cls = 'wfProbSev' + obj.aData.severity;
997
- return '<span class="' + cls + '"></span>';
998
  }
999
  },
1000
  {
1001
  "sTitle": '<div class="th_wrapp">Issue</div>',
1002
  "bSortable": false,
1003
- "sWidth": '400px',
1004
  "sType": 'html',
1005
  fnRender: function(obj) {
1006
  var issueType = (obj.aData.type == 'knownfile' ? 'file' : obj.aData.type);
@@ -1076,7 +1080,7 @@
1076
  self.nonce = json.nonce;
1077
  }
1078
  if (json && json.errorMsg) {
1079
- self.colorbox('400px', 'An error occurred', json.errorMsg);
1080
  }
1081
  cb(json);
1082
  },
@@ -1122,10 +1126,10 @@
1122
  jQuery.colorbox.close();
1123
  },
1124
  scanRunningMsg: function() {
1125
- this.colorbox('400px', "A scan is running", "A scan is currently in progress. Please wait until it finishes before starting another scan.");
1126
  },
1127
  errorMsg: function(msg) {
1128
- this.colorbox('400px', "An error occurred:", msg);
1129
  },
1130
  bulkOperation: function(op) {
1131
  var self = this;
@@ -1134,13 +1138,13 @@
1134
  return jQuery(this).val();
1135
  }).get();
1136
  if (ids.length < 1) {
1137
- this.colorbox('400px', "No files were selected", "You need to select files to perform a bulk operation. There is a checkbox in each issue that lets you select that file. You can then select a bulk operation and hit the button to perform that bulk operation.");
1138
  return;
1139
  }
1140
  if (op == 'del') {
1141
- this.colorbox('400px', "Are you sure you want to delete?", "Are you sure you want to delete a total of " + ids.length + " files? Do not delete files on your system unless you're ABSOLUTELY sure you know what you're doing. If you delete the wrong file it could cause your WordPress website to stop functioning and you will probably have to restore from backups. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Delete Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1142
  } else if (op == 'repair') {
1143
- this.colorbox('400px', "Are you sure you want to repair?", "Are you sure you want to repair a total of " + ids.length + " files? Do not repair files on your system unless you're sure you have reviewed the differences between the original file and your version of the file in the files you are repairing. If you repair a file that has been customized for your system by a developer or your hosting provider it may leave your system unusable. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Repair Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1144
  }
1145
  } else {
1146
  return;
@@ -1162,7 +1166,7 @@
1162
  var self = this;
1163
  if (res.ok) {
1164
  this.loadIssues(function() {
1165
- self.colorbox('400px', res.bulkHeading, res.bulkBody);
1166
  });
1167
  } else {
1168
  this.loadIssues(function() {
@@ -1187,11 +1191,11 @@
1187
  var self = this;
1188
  if (res.ok) {
1189
  this.loadIssues(function() {
1190
- self.colorbox('400px', "Success deleting file", "The file " + res.file + " was successfully deleted.");
1191
  });
1192
  } else if (res.cerrorMsg) {
1193
  this.loadIssues(function() {
1194
- self.colorbox('400px', 'An error occurred', res.cerrorMsg);
1195
  });
1196
  }
1197
  },
@@ -1208,11 +1212,11 @@
1208
  var self = this;
1209
  if (res.ok) {
1210
  this.loadIssues(function() {
1211
- self.colorbox('400px', "Success removing option", "The option " + res.option_name + " was successfully removed.");
1212
  });
1213
  } else if (res.cerrorMsg) {
1214
  this.loadIssues(function() {
1215
- self.colorbox('400px', 'An error occurred', res.cerrorMsg);
1216
  });
1217
  }
1218
  },
@@ -1226,11 +1230,11 @@
1226
  jQuery('#wordfenceMisconfiguredHowGetIPsNotice').fadeOut();
1227
 
1228
  self.loadIssues(function() {
1229
- self.colorbox('400px', "Success updating option", "The 'How does Wordfence get IPs' option was successfully updated to the recommended value.");
1230
  });
1231
  } else if (res.cerrorMsg) {
1232
  self.loadIssues(function() {
1233
- self.colorbox('400px', 'An error occurred', res.cerrorMsg);
1234
  });
1235
  }
1236
  });
@@ -1242,13 +1246,13 @@
1242
 
1243
  this.ajax('wordfence_checkHtaccess', {}, function(res) {
1244
  if (res.ok) {
1245
- self.colorbox("400px", title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1246
  + '<br/>'
1247
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wfFPDNextBut\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a><br /><br /><input type="button" class="wf-btn wf-btn-default" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" onclick="WFAD.fixFPD_WriteHtAccess(' + issueID + ');" />');
1248
  } else if (res.nginx) {
1249
- self.colorbox("400px", title, 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually modify your php.ini to disable <em>display_error</em>');
1250
  } else if (res.err) {
1251
- self.colorbox('400px', "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
1252
  }
1253
  });
1254
  },
@@ -1260,11 +1264,11 @@
1260
  }, function(res) {
1261
  if (res.ok) {
1262
  self.loadIssues(function() {
1263
- self.colorbox("400px", "File restored OK", "The Full Path disclosure issue has been fixed");
1264
  });
1265
  } else {
1266
  self.loadIssues(function() {
1267
- self.colorbox('400px', 'An error occurred', res.cerrorMsg);
1268
  });
1269
  }
1270
  });
@@ -1274,7 +1278,7 @@
1274
  var self = this;
1275
  return function(res) {
1276
  if (res.ok) {
1277
- self.colorbox("400px", title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1278
  + '<br/>'
1279
  + '<a id="dlButton" href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '">Click here to download a backup copy of your .htaccess file now</a>'
1280
  + '<br /><br /><input type="button" class="wf-btn wf-btn-default" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" />'
@@ -1286,9 +1290,9 @@
1286
  self[callback](issueID);
1287
  });
1288
  } else if (res.nginx) {
1289
- self.colorbox("400px", title, 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. ' + nginx);
1290
  } else if (res.err) {
1291
- self.colorbox('400px', "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
1292
  }
1293
  };
1294
  },
@@ -1301,9 +1305,9 @@
1301
  jQuery.colorbox.close();
1302
  self.loadIssues(function() {
1303
  if (res.ok) {
1304
- self.colorbox("400px", title, 'Your .htaccess file has been updated successfully.');
1305
  } else {
1306
- self.colorbox("400px", title, 'We encountered a problem while trying to update your .htaccess file.');
1307
  }
1308
  });
1309
  });
@@ -1333,11 +1337,11 @@
1333
  var self = this;
1334
  if (res.ok) {
1335
  this.loadIssues(function() {
1336
- self.colorbox("400px", "File restored OK", "The file " + res.file + " was restored successfully.");
1337
  });
1338
  } else if (res.cerrorMsg) {
1339
  this.loadIssues(function() {
1340
- self.colorbox('400px', 'An error occurred', res.cerrorMsg);
1341
  });
1342
  }
1343
  },
@@ -1349,17 +1353,17 @@
1349
 
1350
  this.ajax('wordfence_checkHtaccess', {}, function(res) {
1351
  if (res.ok) {
1352
- self.colorbox("400px", title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1353
  + '<br/>'
1354
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
1355
  '<br /><br />' +
1356
  '<button class="wf-btn wf-btn-default" type="button" id="wf-htaccess-confirm" disabled="disabled" onclick="WFAD.confirmDisableDirectoryListing(' + issueID + ');">Add code to .htaccess</button>');
1357
  } else if (res.nginx) {
1358
- self.colorbox('400px', "You are using Nginx as your web server. " +
1359
  "You'll need to disable autoindexing in your nginx.conf. " +
1360
  "See the <a target='_blank' href='http://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this.");
1361
  } else if (res.err) {
1362
- self.colorbox('400px', "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
1363
  }
1364
  });
1365
  },
@@ -1371,7 +1375,7 @@
1371
  }, function(res) {
1372
  if (res.ok) {
1373
  self.loadIssues(function() {
1374
- self.colorbox("400px", "Directory Listing Disabled", "Directory listing has been disabled on your server.");
1375
  });
1376
  } else {
1377
  //self.loadIssues(function() {
@@ -1407,7 +1411,7 @@
1407
  } else {
1408
  return;
1409
  }
1410
- this.colorbox('450px', head, body + '<br /><br /><center><input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;<input class="wf-btn wf-btn-default" type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmUpdateAllIssues(\'' + op + '\');" /><br />');
1411
  },
1412
  confirmUpdateAllIssues: function(op) {
1413
  var self = this;
@@ -1460,7 +1464,7 @@
1460
  });
1461
  },
1462
  emailActivityLog: function() {
1463
- this.colorbox('400px', 'Email Wordfence Activity Log', "Enter the email address you would like to send the Wordfence activity log to. Note that the activity log may contain thousands of lines of data. This log is usually only sent to a member of the Wordfence support team. It also contains your PHP configuration from the phpinfo() function for diagnostic data.<br /><br /><input type='text' value='wftest@wordfence.com' size='20' id='wfALogRecip' /><input class='wf-btn wf-btn-default' type='button' value='Send' onclick=\"WFAD.completeEmailActivityLog();\" /><input class='wf-btn wf-btn-default' type='button' value='Cancel' onclick='jQuery.colorbox.close();' /><br /><br />");
1464
  },
1465
  completeEmailActivityLog: function() {
1466
  jQuery.colorbox.close();
@@ -1472,7 +1476,7 @@
1472
  var self = this;
1473
  this.ajax('wordfence_sendActivityLog', {email: jQuery('#wfALogRecip').val()}, function(res) {
1474
  if (res.ok) {
1475
- self.colorbox('400px', 'Activity Log Sent', "Your Wordfence activity log was sent to " + email + "<br /><br /><input class='wf-btn wf-btn-default' type='button' value='Close' onclick='jQuery.colorbox.close();' /><br /><br />");
1476
  }
1477
  });
1478
  },
@@ -2031,10 +2035,10 @@
2031
  jQuery('.wfAjax24').hide();
2032
  if (res.ok) {
2033
  if (res['paidKeyMsg']) {
2034
- self.colorbox('400px', "Congratulations! You have been upgraded to Premium Scanning.", "You have upgraded to a Premium API key. Once this page reloads, you can choose which premium scanning options you would like to enable and then click save. Click the button below to reload this page now.<br /><br /><center><input class='wf-btn wf-btn-default' type='button' name='wfReload' value='Reload page and enable Premium options' onclick='window.location.reload(true);' /></center>");
2035
  return;
2036
  } else if (res['reload'] == 'reload' || WFAD.reloadConfigPage) {
2037
- self.colorbox('400px', "Please reload this page", "You selected a config option that requires a page reload. Click the button below to reload this page to update the menu.<br /><br /><center><input class='wf-btn wf-btn-default' type='button' name='wfReload' value='Reload page' onclick='window.location.reload(true);' /></center>");
2038
  return;
2039
  } else {
2040
  self.pulse('.wfSavedMsg');
@@ -2042,7 +2046,7 @@
2042
  } else if (res.errorMsg) {
2043
  return;
2044
  } else {
2045
- self.colorbox('400px', 'An error occurred', 'We encountered an error trying to save your changes.');
2046
  }
2047
  });
2048
  },
@@ -2062,7 +2066,7 @@
2062
  } else if (res.errorMsg) {
2063
  return;
2064
  } else {
2065
- self.colorbox('400px', 'An error occurred', 'We encountered an error trying to save your changes.');
2066
  }
2067
  });
2068
  },
@@ -2078,7 +2082,7 @@
2078
  } else if (res.errorMsg) {
2079
  return;
2080
  } else {
2081
- self.colorbox('400px', 'An error occurred', 'We encountered an error trying to save your changes.');
2082
  }
2083
  });
2084
  },
@@ -2103,7 +2107,7 @@
2103
  } else {
2104
  return;
2105
  }
2106
- this.colorbox('450px', "Please confirm", body +
2107
  '<br /><br /><center><input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;' +
2108
  '<input class="wf-btn wf-btn-default" type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmClearAllBlocked(\'' + op + '\');"><br />');
2109
  },
@@ -2119,7 +2123,7 @@
2119
  loadBlockedCountries: function(str) {
2120
  var codes = str.split(',');
2121
  for (var i = 0; i < codes.length; i++) {
2122
- jQuery('#wfCountryCheckbox_' + codes[i]).prop('checked', true);
2123
  }
2124
  },
2125
  saveCountryBlocking: function() {
@@ -2130,16 +2134,16 @@
2130
  var bypassViewURL = jQuery('#wfBypassViewURL').val();
2131
 
2132
  if (action == 'redir' && (!/^https?:\/\/[^\/]+/i.test(redirURL))) {
2133
- this.colorbox('400px', "Please enter a URL for redirection", "You have chosen to redirect blocked countries to a specific page. You need to enter a URL in the text box provided that starts with http:// or https://");
2134
  return;
2135
  }
2136
  if (bypassRedirURL || bypassRedirDest) {
2137
  if (!(bypassRedirURL && bypassRedirDest)) {
2138
- this.colorbox('400px', "Missing data from form", "If you want to set up a URL that will bypass country blocking, you must enter a URL that a visitor can hit and the destination they will be redirected to. You have only entered one of these components. Please enter both.");
2139
  return;
2140
  }
2141
  if (bypassRedirURL == bypassRedirDest) {
2142
- this.colorbox('400px', "URLs are the same", "The URL that a user hits to bypass country blocking and the URL they are redirected to are the same. This would cause a circular redirect. Please fix this.");
2143
  return;
2144
  }
2145
  }
@@ -2159,9 +2163,9 @@
2159
  var codesArr = [];
2160
  var ownCountryBlocked = false;
2161
  var self = this;
2162
- jQuery('.wfCountryCheckbox').each(function(idx, elem) {
2163
- if (jQuery(elem).is(':checked')) {
2164
- var code = jQuery(elem).val();
2165
  codesArr.push(code);
2166
  if (code == self.ownCountry) {
2167
  ownCountryBlocked = true;
@@ -2170,14 +2174,14 @@
2170
  });
2171
  this.countryCodesToSave = codesArr.join(',');
2172
  if (ownCountryBlocked) {
2173
- this.colorbox('400px', "Please confirm blocking yourself", "You are about to block your own country. This could lead to you being locked out. Please make sure that your user profile on this machine has a current and valid email address and make sure you know what it is. That way if you are locked out, you can send yourself an unlock email. If you're sure you want to block your own country, click 'Confirm' below, otherwise click 'Cancel'.<br />" +
2174
  '<input class="wf-btn wf-btn-default" type="button" name="but1" value="Confirm" onclick="jQuery.colorbox.close(); WFAD.confirmSaveCountryBlocking();" />&nbsp;<input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />');
2175
  } else {
2176
  this.confirmSaveCountryBlocking();
2177
  }
2178
  },
2179
  invalidCountryURLMsg: function(URL) {
2180
- this.colorbox('400px', "Invalid URL", "URL's that you provide for bypassing country blocking must start with '/' or 'http://' without quotes. The URL that is invalid is: " + this.htmlEscape(URL));
2181
  return;
2182
  },
2183
  confirmSaveCountryBlocking: function() {
@@ -2223,7 +2227,7 @@
2223
  },
2224
  sched_shortcut: function(mode) {
2225
  if (jQuery('#schedMode').val() == 'auto') {
2226
- this.colorbox('400px', 'Change the scan mode', "You need to change the scan mode to manually scheduled scans if you want to select scan times.");
2227
  return;
2228
  }
2229
  jQuery('.wfSchedCheckbox').prop('checked', false);
@@ -2314,7 +2318,7 @@
2314
  var totpURL = "otpauth://totp/" + encodeURI(res.homeurl) + encodeURI(" (" + res.username + ")") + "?" + res.uriQueryString + "&issuer=Wordfence";
2315
  self.twoFacStatus('User added! Scan the QR code with your authenticator app to add it.');
2316
 
2317
- var message = "Scan the code below with your authenticator app to add this account. Some authenticator apps also allow you to type in the text version instead.<br><div id=\"wfTwoFactorQRCodeTable\"></div><br><strong>Key:</strong> <input type=\"text\" size=\"45\" value=\"" + res.base32Secret + "\" onclick=\"this.select();\" readonly>";
2318
  if (res.recoveryCodes.length > 0) {
2319
  message = message + "<br><br><strong>Recovery Codes</strong><br><p>Use one of these " + res.recoveryCodes.length + " codes to log in if you lose access to your authenticator device. Codes are 16 characters long, plus optional spaces. Each one may be used only once.</p><ul id=\"wfTwoFactorRecoveryCodes\">";
2320
 
@@ -2335,8 +2339,8 @@
2335
 
2336
  message = message + "<p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
2337
 
2338
- self.colorbox('440px', "Authentication Code", message, {onComplete: function() {
2339
- jQuery('#wfTwoFactorQRCodeTable').qrcode({text: totpURL});
2340
  jQuery('#wfTwoFactorDownload').on('click', function(e) {
2341
  e.preventDefault();
2342
  e.stopPropagation();
@@ -2364,8 +2368,7 @@
2364
 
2365
  message = message + "</ul><p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
2366
 
2367
- self.colorbox('400px', "Recovery Codes", message, {onComplete: function() {
2368
- jQuery('#wfTwoFactorQRCodeTable').qrcode({text: totpURL});
2369
  jQuery('#wfTwoFactorDownload').on('click', function(e) {
2370
  e.preventDefault();
2371
  e.stopPropagation();
@@ -2530,11 +2533,11 @@
2530
  var self = this;
2531
  this.ajax('wordfence_exportSettings', {}, function(res) {
2532
  if (res.ok && res.token) {
2533
- self.colorbox('400px', "Export Successful", "We successfully exported your site settings. To import your site settings on another site, copy and paste the token below into the import text box on the destination site. Keep this token secret. It is like a password. If anyone else discovers the token it will allow them to import your settings excluding your API key.<br /><br />Token:<input type=\"text\" size=\"20\" value=\"" + res.token + "\" onclick=\"this.select();\" /><br />");
2534
  } else if (res.err) {
2535
- self.colorbox('400px', "Error during Export", res.err);
2536
  } else {
2537
- self.colorbox('400px', "An unknown error occurred", "An unknown error occurred during the export. We received an undefined error from your web server.");
2538
  }
2539
  });
2540
  },
@@ -2542,11 +2545,11 @@
2542
  var self = this;
2543
  this.ajax('wordfence_importSettings', {token: token}, function(res) {
2544
  if (res.ok) {
2545
- self.colorbox('400px', "Import Successful", "You successfully imported " + res.totalSet + " options. Your import is complete. Please reload this page or click the button below to reload it:<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Reload Page\" onclick=\"window.location.reload(true);\" />");
2546
  } else if (res.err) {
2547
- self.colorbox('400px', "Error during Import", res.err);
2548
  } else {
2549
- self.colorbox('400px', "Error during Export", "An unknown error occurred during the import");
2550
  }
2551
  });
2552
  },
@@ -2555,9 +2558,9 @@
2555
  this.ajax('wordfence_startPasswdAudit', {auditType: auditType, emailAddr: emailAddr}, function(res) {
2556
  self.loadPasswdAuditJobs();
2557
  if (res.ok) {
2558
- self.colorbox('400px', "Password Audit Started", "Your password audit started successfully. The results will appear here once it is complete. You will also receive an email letting you know the results are ready at: " + emailAddr);
2559
  } else if (!res.errorMsg) { //error displayed
2560
- self.colorbox('400px', "Error Starting Audit", "An unknown error occurred when trying to start your password audit.");
2561
  }
2562
  });
2563
  },
@@ -2569,12 +2572,12 @@
2569
  }, function(res) {
2570
  if (res.ok) {
2571
  self.loadIssues(function() {
2572
- self.colorbox('400px', "Successfully deleted admin", "The admin user " +
2573
  self.htmlEscape(res.user_login) + " was successfully deleted.");
2574
  });
2575
  } else if (res.errorMsg) {
2576
  self.loadIssues(function() {
2577
- self.colorbox('400px', 'An error occurred', res.errorMsg);
2578
  });
2579
  }
2580
  });
@@ -2587,12 +2590,12 @@
2587
  }, function(res) {
2588
  if (res.ok) {
2589
  self.loadIssues(function() {
2590
- self.colorbox('400px', "Successfully revoked admin", "All capabilties of admin user " +
2591
  self.htmlEscape(res.user_login) + " were successfully revoked.");
2592
  });
2593
  } else if (res.errorMsg) {
2594
  self.loadIssues(function() {
2595
- self.colorbox('400px', 'An error occurred', res.errorMsg);
2596
  });
2597
  }
2598
  });
@@ -2687,7 +2690,7 @@
2687
  this.ajax('wordfence_saveWAFConfig', data, function(res) {
2688
  if (typeof res === 'object' && res.success) {
2689
  if (showColorBox) {
2690
- self.colorbox('400px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
2691
  'configuration was saved successfully.');
2692
  }
2693
  self.wafData = res.data;
@@ -2696,7 +2699,7 @@
2696
  return onSuccess.apply(this, arguments);
2697
  }
2698
  } else {
2699
- self.colorbox('400px', 'Error saving Firewall configuration', 'There was an error saving the ' +
2700
  'Web Application Firewall configuration settings.');
2701
  }
2702
  });
@@ -2772,17 +2775,17 @@
2772
  self.wafConfigPageRender();
2773
  if (self.wafData['updated']) {
2774
  if (!self.wafData['isPaid']) {
2775
- self.colorbox('400px', 'Rules Updated', 'Your rules have been updated successfully. You are ' +
2776
  'currently using the the free version of Wordfence. ' +
2777
  'Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. ' +
2778
  '<a href="https://www.wordfence.com/wafUpdateRules1/wordfence-signup/">Click here to purchase a premium API key</a>. ' +
2779
  '<em>Note: Your rules will still update every 30 days as a free user.</em>');
2780
  } else {
2781
- self.colorbox('400px', 'Rules Updated', 'Your rules have been updated successfully.');
2782
  }
2783
  }
2784
  else {
2785
- self.colorbox('400px', 'Rule Update Failed', 'No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory.');
2786
  }
2787
  if (typeof onSuccess === 'function') {
2788
  return onSuccess.apply(this, arguments);
@@ -2803,13 +2806,13 @@
2803
  wafAddBootstrap: function() {
2804
  var self = this;
2805
  this.ajax('wordfence_wafAddBootstrap', {}, function(res) {
2806
- self.colorbox('400px', 'File Created', "");
2807
  });
2808
  },
2809
 
2810
  wafConfigureAutoPrepend: function() {
2811
  var self = this;
2812
- self.colorbox("400px", 'Backup .htaccess before continuing', 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file before proceeding.'
2813
  + '<br/>'
2814
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
2815
  '<br /><br />' +
@@ -2819,7 +2822,7 @@
2819
  confirmWAFConfigureAutoPrepend: function() {
2820
  var self = this;
2821
  this.ajax('wordfence_wafConfigureAutoPrepend', {}, function(res) {
2822
- self.colorbox('400px', '.htaccess Updated', "Your .htaccess has been updated successfully. Please " +
2823
  "verify your site is functioning normally.");
2824
  });
2825
  },
1
  (function($) {
2
  if (!window['wordfenceAdmin']) { //To compile for checking: java -jar /usr/local/bin/closure.jar --js=admin.js --js_output_file=test.js
3
  window['wordfenceAdmin'] = {
4
+ isSmallScreen: false,
5
  loading16: '<div class="wfLoading16"></div>',
6
  loadingCount: 0,
7
  dbCheckTables: [],
47
  basePageName: '',
48
 
49
  init: function() {
50
+ this.isSmallScreen = window.matchMedia("only screen and (max-width: 500px)").matches;
51
+
52
  this.nonce = WordfenceAdminVars.firstNonce;
53
  this.debugOn = WordfenceAdminVars.debugOn == '1' ? true : false;
54
  this.tourClosed = WordfenceAdminVars.tourClosed == '1' ? true : false;
77
  $('#doSendEmail').click(function() {
78
  var ticket = $('#_ticketnumber').val();
79
  if (ticket === null || typeof ticket === "undefined" || ticket.length == 0) {
80
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error", "Please include your support ticket number or forum username.");
81
  return;
82
  }
83
  WFAD.ajax('wordfence_sendDiagnostic', {email: $('#_email').val(), ticket: ticket}, function(res) {
84
  if (res.result) {
85
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Email Diagnostic Report", "Diagnostic report has been sent successfully.");
86
  } else {
87
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error", "There was an error while sending the email.");
88
  }
89
  });
90
  });
104
  var tab = jQuery('#' + jQuery(this).attr('id').replace('-tab', ''));
105
  tab.addClass('active');
106
  jQuery('#wfHeading').html(tab.data('title'));
107
+ jQuery('#wordfenceTopTabsMobileTitle').text(jQuery(this).text());
108
  document.title = tab.data('title') + " \u2039 " + self.basePageName;
109
  self.sectionInit();
110
  });
373
  var self = this;
374
  this.ajax('wordfence_sendTestEmail', {email: email}, function(res) {
375
  if (res.result) {
376
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Test Email Sent", "Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: " +
377
  res.result + "<br /><br />A 'True' result means WordPress thinks the mail was sent without errors. A 'False' result means that WordPress encountered an error sending your mail. Note that it's possible to get a 'True' response with an error elsewhere in your mail system that may cause emails to not be delivered.");
378
  }
379
  });
431
  });
432
  },
433
  downgradeLicense: function() {
434
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Confirm Downgrade", "Are you sure you want to downgrade your Wordfence Premium License? This will disable all Premium features and return you to the free version of Wordfence. <a href=\"https://www.wordfence.com/manage-wordfence-api-keys/\" target=\"_blank\">Click here to renew your paid membership</a> or click the button below to confirm you want to downgrade.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Downgrade and disable Premium features\" onclick=\"WFAD.downgradeLicenseConfirm();\" /><br />");
435
  },
436
  downgradeLicenseConfirm: function() {
437
  jQuery.colorbox.close();
864
  var self = this;
865
  this.ajax('wordfence_killScan', {}, function(res) {
866
  if (res.ok) {
867
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Kill requested", "A termination request has been sent to any running scans.");
868
  } else {
869
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Kill failed", "We failed to send a termination request.");
870
  }
871
  });
872
  },
958
  }
959
  continue;
960
  }
961
+ jQuery('#' + containerID).html('<table cellpadding="0" cellspacing="0" border="0" class="display wf-issues-table" id="' + tableID + '"></table>');
962
 
963
  jQuery.fn.dataTableExt.oSort['severity-asc'] = function(y, x) {
964
  x = WFAD.sev2num(x);
992
  //"aaData": res.issuesLists[issueStatus],
993
  "aoColumns": [
994
  {
995
+ "sTitle": '<div class="th_wrapp wf-hidden-xs">Severity</div>',
996
+ //"sWidth": '128px',
997
+ "sClass": "center wf-scan-severity",
998
  "sType": 'severity',
999
  "fnRender": function(obj) {
1000
  var cls = 'wfProbSev' + obj.aData.severity;
1001
+ return '<span class="wf-hidden-xs ' + cls + '"></span><div class="wf-visible-xs wf-scan-severity-' + obj.aData.severity + '"></div>';
1002
  }
1003
  },
1004
  {
1005
  "sTitle": '<div class="th_wrapp">Issue</div>',
1006
  "bSortable": false,
1007
+ //"sWidth": '400px',
1008
  "sType": 'html',
1009
  fnRender: function(obj) {
1010
  var issueType = (obj.aData.type == 'knownfile' ? 'file' : obj.aData.type);
1080
  self.nonce = json.nonce;
1081
  }
1082
  if (json && json.errorMsg) {
1083
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', json.errorMsg);
1084
  }
1085
  cb(json);
1086
  },
1126
  jQuery.colorbox.close();
1127
  },
1128
  scanRunningMsg: function() {
1129
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "A scan is running", "A scan is currently in progress. Please wait until it finishes before starting another scan.");
1130
  },
1131
  errorMsg: function(msg) {
1132
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "An error occurred:", msg);
1133
  },
1134
  bulkOperation: function(op) {
1135
  var self = this;
1138
  return jQuery(this).val();
1139
  }).get();
1140
  if (ids.length < 1) {
1141
+ this.colorbox((self.isSmallScreen ? '300px' : '400px'), "No files were selected", "You need to select files to perform a bulk operation. There is a checkbox in each issue that lets you select that file. You can then select a bulk operation and hit the button to perform that bulk operation.");
1142
  return;
1143
  }
1144
  if (op == 'del') {
1145
+ this.colorbox((self.isSmallScreen ? '300px' : '400px'), "Are you sure you want to delete?", "Are you sure you want to delete a total of " + ids.length + " files? Do not delete files on your system unless you're ABSOLUTELY sure you know what you're doing. If you delete the wrong file it could cause your WordPress website to stop functioning and you will probably have to restore from backups. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Delete Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1146
  } else if (op == 'repair') {
1147
+ this.colorbox((self.isSmallScreen ? '300px' : '400px'), "Are you sure you want to repair?", "Are you sure you want to repair a total of " + ids.length + " files? Do not repair files on your system unless you're sure you have reviewed the differences between the original file and your version of the file in the files you are repairing. If you repair a file that has been customized for your system by a developer or your hosting provider it may leave your system unusable. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Repair Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1148
  }
1149
  } else {
1150
  return;
1166
  var self = this;
1167
  if (res.ok) {
1168
  this.loadIssues(function() {
1169
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), res.bulkHeading, res.bulkBody);
1170
  });
1171
  } else {
1172
  this.loadIssues(function() {
1191
  var self = this;
1192
  if (res.ok) {
1193
  this.loadIssues(function() {
1194
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Success deleting file", "The file " + res.file + " was successfully deleted.");
1195
  });
1196
  } else if (res.cerrorMsg) {
1197
  this.loadIssues(function() {
1198
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
1199
  });
1200
  }
1201
  },
1212
  var self = this;
1213
  if (res.ok) {
1214
  this.loadIssues(function() {
1215
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Success removing option", "The option " + res.option_name + " was successfully removed.");
1216
  });
1217
  } else if (res.cerrorMsg) {
1218
  this.loadIssues(function() {
1219
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
1220
  });
1221
  }
1222
  },
1230
  jQuery('#wordfenceMisconfiguredHowGetIPsNotice').fadeOut();
1231
 
1232
  self.loadIssues(function() {
1233
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Success updating option", "The 'How does Wordfence get IPs' option was successfully updated to the recommended value.");
1234
  });
1235
  } else if (res.cerrorMsg) {
1236
  self.loadIssues(function() {
1237
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
1238
  });
1239
  }
1240
  });
1246
 
1247
  this.ajax('wordfence_checkHtaccess', {}, function(res) {
1248
  if (res.ok) {
1249
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1250
  + '<br/>'
1251
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wfFPDNextBut\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a><br /><br /><input type="button" class="wf-btn wf-btn-default" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" onclick="WFAD.fixFPD_WriteHtAccess(' + issueID + ');" />');
1252
  } else if (res.nginx) {
1253
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually modify your php.ini to disable <em>display_error</em>');
1254
  } else if (res.err) {
1255
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
1256
  }
1257
  });
1258
  },
1264
  }, function(res) {
1265
  if (res.ok) {
1266
  self.loadIssues(function() {
1267
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "File restored OK", "The Full Path disclosure issue has been fixed");
1268
  });
1269
  } else {
1270
  self.loadIssues(function() {
1271
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
1272
  });
1273
  }
1274
  });
1278
  var self = this;
1279
  return function(res) {
1280
  if (res.ok) {
1281
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1282
  + '<br/>'
1283
  + '<a id="dlButton" href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '">Click here to download a backup copy of your .htaccess file now</a>'
1284
  + '<br /><br /><input type="button" class="wf-btn wf-btn-default" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" />'
1290
  self[callback](issueID);
1291
  });
1292
  } else if (res.nginx) {
1293
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. ' + nginx);
1294
  } else if (res.err) {
1295
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
1296
  }
1297
  };
1298
  },
1305
  jQuery.colorbox.close();
1306
  self.loadIssues(function() {
1307
  if (res.ok) {
1308
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'Your .htaccess file has been updated successfully.');
1309
  } else {
1310
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We encountered a problem while trying to update your .htaccess file.');
1311
  }
1312
  });
1313
  });
1337
  var self = this;
1338
  if (res.ok) {
1339
  this.loadIssues(function() {
1340
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "File restored OK", "The file " + res.file + " was restored successfully.");
1341
  });
1342
  } else if (res.cerrorMsg) {
1343
  this.loadIssues(function() {
1344
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
1345
  });
1346
  }
1347
  },
1353
 
1354
  this.ajax('wordfence_checkHtaccess', {}, function(res) {
1355
  if (res.ok) {
1356
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1357
  + '<br/>'
1358
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
1359
  '<br /><br />' +
1360
  '<button class="wf-btn wf-btn-default" type="button" id="wf-htaccess-confirm" disabled="disabled" onclick="WFAD.confirmDisableDirectoryListing(' + issueID + ');">Add code to .htaccess</button>');
1361
  } else if (res.nginx) {
1362
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "You are using Nginx as your web server. " +
1363
  "You'll need to disable autoindexing in your nginx.conf. " +
1364
  "See the <a target='_blank' href='http://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this.");
1365
  } else if (res.err) {
1366
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
1367
  }
1368
  });
1369
  },
1375
  }, function(res) {
1376
  if (res.ok) {
1377
  self.loadIssues(function() {
1378
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Directory Listing Disabled", "Directory listing has been disabled on your server.");
1379
  });
1380
  } else {
1381
  //self.loadIssues(function() {
1411
  } else {
1412
  return;
1413
  }
1414
+ this.colorbox((this.isSmallScreen ? '300px' : '450px'), head, body + '<br /><br /><center><input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;<input class="wf-btn wf-btn-default" type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmUpdateAllIssues(\'' + op + '\');" /><br />');
1415
  },
1416
  confirmUpdateAllIssues: function(op) {
1417
  var self = this;
1464
  });
1465
  },
1466
  emailActivityLog: function() {
1467
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), 'Email Wordfence Activity Log', "Enter the email address you would like to send the Wordfence activity log to. Note that the activity log may contain thousands of lines of data. This log is usually only sent to a member of the Wordfence support team. It also contains your PHP configuration from the phpinfo() function for diagnostic data.<br /><br /><input type='text' value='wftest@wordfence.com' size='20' id='wfALogRecip' /><input class='wf-btn wf-btn-default' type='button' value='Send' onclick=\"WFAD.completeEmailActivityLog();\" /><input class='wf-btn wf-btn-default' type='button' value='Cancel' onclick='jQuery.colorbox.close();' /><br /><br />");
1468
  },
1469
  completeEmailActivityLog: function() {
1470
  jQuery.colorbox.close();
1476
  var self = this;
1477
  this.ajax('wordfence_sendActivityLog', {email: jQuery('#wfALogRecip').val()}, function(res) {
1478
  if (res.ok) {
1479
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Activity Log Sent', "Your Wordfence activity log was sent to " + email + "<br /><br /><input class='wf-btn wf-btn-default' type='button' value='Close' onclick='jQuery.colorbox.close();' /><br /><br />");
1480
  }
1481
  });
1482
  },
2035
  jQuery('.wfAjax24').hide();
2036
  if (res.ok) {
2037
  if (res['paidKeyMsg']) {
2038
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Congratulations! You have been upgraded to Premium Scanning.", "You have upgraded to a Premium API key. Once this page reloads, you can choose which premium scanning options you would like to enable and then click save. Click the button below to reload this page now.<br /><br /><center><input class='wf-btn wf-btn-default' type='button' name='wfReload' value='Reload page and enable Premium options' onclick='window.location.reload(true);' /></center>");
2039
  return;
2040
  } else if (res['reload'] == 'reload' || WFAD.reloadConfigPage) {
2041
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Please reload this page", "You selected a config option that requires a page reload. Click the button below to reload this page to update the menu.<br /><br /><center><input class='wf-btn wf-btn-default' type='button' name='wfReload' value='Reload page' onclick='window.location.reload(true);' /></center>");
2042
  return;
2043
  } else {
2044
  self.pulse('.wfSavedMsg');
2046
  } else if (res.errorMsg) {
2047
  return;
2048
  } else {
2049
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', 'We encountered an error trying to save your changes.');
2050
  }
2051
  });
2052
  },
2066
  } else if (res.errorMsg) {
2067
  return;
2068
  } else {
2069
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', 'We encountered an error trying to save your changes.');
2070
  }
2071
  });
2072
  },
2082
  } else if (res.errorMsg) {
2083
  return;
2084
  } else {
2085
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', 'We encountered an error trying to save your changes.');
2086
  }
2087
  });
2088
  },
2107
  } else {
2108
  return;
2109
  }
2110
+ this.colorbox((this.isSmallScreen ? '300px' : '450px'), "Please confirm", body +
2111
  '<br /><br /><center><input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;' +
2112
  '<input class="wf-btn wf-btn-default" type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmClearAllBlocked(\'' + op + '\');"><br />');
2113
  },
2123
  loadBlockedCountries: function(str) {
2124
  var codes = str.split(',');
2125
  for (var i = 0; i < codes.length; i++) {
2126
+ jQuery('#wfCountryCheckbox_' + codes[i]).addClass('active');
2127
  }
2128
  },
2129
  saveCountryBlocking: function() {
2134
  var bypassViewURL = jQuery('#wfBypassViewURL').val();
2135
 
2136
  if (action == 'redir' && (!/^https?:\/\/[^\/]+/i.test(redirURL))) {
2137
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Please enter a URL for redirection", "You have chosen to redirect blocked countries to a specific page. You need to enter a URL in the text box provided that starts with http:// or https://");
2138
  return;
2139
  }
2140
  if (bypassRedirURL || bypassRedirDest) {
2141
  if (!(bypassRedirURL && bypassRedirDest)) {
2142
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Missing data from form", "If you want to set up a URL that will bypass country blocking, you must enter a URL that a visitor can hit and the destination they will be redirected to. You have only entered one of these components. Please enter both.");
2143
  return;
2144
  }
2145
  if (bypassRedirURL == bypassRedirDest) {
2146
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "URLs are the same", "The URL that a user hits to bypass country blocking and the URL they are redirected to are the same. This would cause a circular redirect. Please fix this.");
2147
  return;
2148
  }
2149
  }
2163
  var codesArr = [];
2164
  var ownCountryBlocked = false;
2165
  var self = this;
2166
+ jQuery('.wf-blocked-countries li').each(function(idx, elem) {
2167
+ if (jQuery(elem).hasClass('active')) {
2168
+ var code = jQuery(elem).data('country');
2169
  codesArr.push(code);
2170
  if (code == self.ownCountry) {
2171
  ownCountryBlocked = true;
2174
  });
2175
  this.countryCodesToSave = codesArr.join(',');
2176
  if (ownCountryBlocked) {
2177
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Please confirm blocking yourself", "You are about to block your own country. This could lead to you being locked out. Please make sure that your user profile on this machine has a current and valid email address and make sure you know what it is. That way if you are locked out, you can send yourself an unlock email. If you're sure you want to block your own country, click 'Confirm' below, otherwise click 'Cancel'.<br />" +
2178
  '<input class="wf-btn wf-btn-default" type="button" name="but1" value="Confirm" onclick="jQuery.colorbox.close(); WFAD.confirmSaveCountryBlocking();" />&nbsp;<input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />');
2179
  } else {
2180
  this.confirmSaveCountryBlocking();
2181
  }
2182
  },
2183
  invalidCountryURLMsg: function(URL) {
2184
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Invalid URL", "URL's that you provide for bypassing country blocking must start with '/' or 'http://' without quotes. The URL that is invalid is: " + this.htmlEscape(URL));
2185
  return;
2186
  },
2187
  confirmSaveCountryBlocking: function() {
2227
  },
2228
  sched_shortcut: function(mode) {
2229
  if (jQuery('#schedMode').val() == 'auto') {
2230
+ this.colorbox((this.isSmallScreen ? '300px' : '400px'), 'Change the scan mode', "You need to change the scan mode to manually scheduled scans if you want to select scan times.");
2231
  return;
2232
  }
2233
  jQuery('.wfSchedCheckbox').prop('checked', false);
2318
  var totpURL = "otpauth://totp/" + encodeURI(res.homeurl) + encodeURI(" (" + res.username + ")") + "?" + res.uriQueryString + "&issuer=Wordfence";
2319
  self.twoFacStatus('User added! Scan the QR code with your authenticator app to add it.');
2320
 
2321
+ var message = "Scan the code below with your authenticator app to add this account. Some authenticator apps also allow you to type in the text version instead.<br><div id=\"wfTwoFactorQRCodeTable\"></div><br><strong>Key:</strong> <input type=\"text\"" + (self.isSmallScreen ? "" : " size=\"45\"") + " value=\"" + res.base32Secret + "\" onclick=\"this.select();\" readonly>";
2322
  if (res.recoveryCodes.length > 0) {
2323
  message = message + "<br><br><strong>Recovery Codes</strong><br><p>Use one of these " + res.recoveryCodes.length + " codes to log in if you lose access to your authenticator device. Codes are 16 characters long, plus optional spaces. Each one may be used only once.</p><ul id=\"wfTwoFactorRecoveryCodes\">";
2324
 
2339
 
2340
  message = message + "<p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
2341
 
2342
+ self.colorbox((self.isSmallScreen ? '300px' : '440px'), "Authentication Code", message, {onComplete: function() {
2343
+ jQuery('#wfTwoFactorQRCodeTable').qrcode({text: totpURL, width: (self.isSmallScreen ? 175 : 256), height: (self.isSmallScreen ? 175 : 256)});
2344
  jQuery('#wfTwoFactorDownload').on('click', function(e) {
2345
  e.preventDefault();
2346
  e.stopPropagation();
2368
 
2369
  message = message + "</ul><p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
2370
 
2371
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Recovery Codes", message, {onComplete: function() {
 
2372
  jQuery('#wfTwoFactorDownload').on('click', function(e) {
2373
  e.preventDefault();
2374
  e.stopPropagation();
2533
  var self = this;
2534
  this.ajax('wordfence_exportSettings', {}, function(res) {
2535
  if (res.ok && res.token) {
2536
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Export Successful", "We successfully exported your site settings. To import your site settings on another site, copy and paste the token below into the import text box on the destination site. Keep this token secret. It is like a password. If anyone else discovers the token it will allow them to import your settings excluding your API key.<br /><br />Token:<input type=\"text\" size=\"20\" value=\"" + res.token + "\" onclick=\"this.select();\" /><br />");
2537
  } else if (res.err) {
2538
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error during Export", res.err);
2539
  } else {
2540
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "An unknown error occurred", "An unknown error occurred during the export. We received an undefined error from your web server.");
2541
  }
2542
  });
2543
  },
2545
  var self = this;
2546
  this.ajax('wordfence_importSettings', {token: token}, function(res) {
2547
  if (res.ok) {
2548
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Import Successful", "You successfully imported " + res.totalSet + " options. Your import is complete. Please reload this page or click the button below to reload it:<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Reload Page\" onclick=\"window.location.reload(true);\" />");
2549
  } else if (res.err) {
2550
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error during Import", res.err);
2551
  } else {
2552
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error during Export", "An unknown error occurred during the import");
2553
  }
2554
  });
2555
  },
2558
  this.ajax('wordfence_startPasswdAudit', {auditType: auditType, emailAddr: emailAddr}, function(res) {
2559
  self.loadPasswdAuditJobs();
2560
  if (res.ok) {
2561
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Password Audit Started", "Your password audit started successfully. The results will appear here once it is complete. You will also receive an email letting you know the results are ready at: " + emailAddr);
2562
  } else if (!res.errorMsg) { //error displayed
2563
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error Starting Audit", "An unknown error occurred when trying to start your password audit.");
2564
  }
2565
  });
2566
  },
2572
  }, function(res) {
2573
  if (res.ok) {
2574
  self.loadIssues(function() {
2575
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Successfully deleted admin", "The admin user " +
2576
  self.htmlEscape(res.user_login) + " was successfully deleted.");
2577
  });
2578
  } else if (res.errorMsg) {
2579
  self.loadIssues(function() {
2580
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.errorMsg);
2581
  });
2582
  }
2583
  });
2590
  }, function(res) {
2591
  if (res.ok) {
2592
  self.loadIssues(function() {
2593
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Successfully revoked admin", "All capabilties of admin user " +
2594
  self.htmlEscape(res.user_login) + " were successfully revoked.");
2595
  });
2596
  } else if (res.errorMsg) {
2597
  self.loadIssues(function() {
2598
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.errorMsg);
2599
  });
2600
  }
2601
  });
2690
  this.ajax('wordfence_saveWAFConfig', data, function(res) {
2691
  if (typeof res === 'object' && res.success) {
2692
  if (showColorBox) {
2693
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
2694
  'configuration was saved successfully.');
2695
  }
2696
  self.wafData = res.data;
2699
  return onSuccess.apply(this, arguments);
2700
  }
2701
  } else {
2702
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Error saving Firewall configuration', 'There was an error saving the ' +
2703
  'Web Application Firewall configuration settings.');
2704
  }
2705
  });
2775
  self.wafConfigPageRender();
2776
  if (self.wafData['updated']) {
2777
  if (!self.wafData['isPaid']) {
2778
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Rules Updated', 'Your rules have been updated successfully. You are ' +
2779
  'currently using the the free version of Wordfence. ' +
2780
  'Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. ' +
2781
  '<a href="https://www.wordfence.com/wafUpdateRules1/wordfence-signup/">Click here to purchase a premium API key</a>. ' +
2782
  '<em>Note: Your rules will still update every 30 days as a free user.</em>');
2783
  } else {
2784
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Rules Updated', 'Your rules have been updated successfully.');
2785
  }
2786
  }
2787
  else {
2788
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Rule Update Failed', 'No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory.');
2789
  }
2790
  if (typeof onSuccess === 'function') {
2791
  return onSuccess.apply(this, arguments);
2806
  wafAddBootstrap: function() {
2807
  var self = this;
2808
  this.ajax('wordfence_wafAddBootstrap', {}, function(res) {
2809
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'File Created', "");
2810
  });
2811
  },
2812
 
2813
  wafConfigureAutoPrepend: function() {
2814
  var self = this;
2815
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Backup .htaccess before continuing', 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file before proceeding.'
2816
  + '<br/>'
2817
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
2818
  '<br /><br />' +
2822
  confirmWAFConfigureAutoPrepend: function() {
2823
  var self = this;
2824
  this.ajax('wordfence_wafConfigureAutoPrepend', {}, function(res) {
2825
+ self.colorbox((self.isSmallScreen ? '300px' : '400px'), '.htaccess Updated', "Your .htaccess has been updated successfully. Please " +
2826
  "verify your site is functioning normally.");
2827
  });
2828
  },
js/admin.liveTraffic.js CHANGED
@@ -658,7 +658,8 @@
658
  var loadingListings = false;
659
  $(window).on('scroll', function() {
660
  var win = $(this);
661
- if (legendWrapper.offset().top < win.scrollTop() + adminBar.outerHeight() + 10) {
 
662
  var legendWidth = legend.width();
663
  var legendHeight = legend.height();
664
 
658
  var loadingListings = false;
659
  $(window).on('scroll', function() {
660
  var win = $(this);
661
+ var needsSticky = (WFAD.isSmallScreen ? (legendWrapper.offset().top < win.scrollTop() + 10) : (legendWrapper.offset().top < win.scrollTop() + adminBar.outerHeight() + 10));
662
+ if (needsSticky) {
663
  var legendWidth = legend.width();
664
  var legendHeight = legend.height();
665
 
js/tourTip.js CHANGED
@@ -151,7 +151,7 @@ if(WordfenceAdminVars.tourClosed != '1' && WordfenceAdminVars.welcomeClosed != '
151
  formHTML +
152
  "<p>Then click \"Start Tour\" to get a quick introduction to how Wordfence protects your site, keeps you off Google's SEO black-list and can even help clean a hacked site.</p>",
153
  pointerWidth: 300,
154
- position: { edge: 'bottom', align: 'left' },
155
  buttons: function(event, t){
156
  var buttonElem = jQuery('<a id="pointer-close" style="margin-left:5px" class="button-secondary">Close</a>');
157
  buttonElem.bind('click.pointer', function(){ t.element.pointer('close');
151
  formHTML +
152
  "<p>Then click \"Start Tour\" to get a quick introduction to how Wordfence protects your site, keeps you off Google's SEO black-list and can even help clean a hacked site.</p>",
153
  pointerWidth: 300,
154
+ position: { edge: (jQuery('body.multisite').length == 0 ? 'bottom' : 'left'), align: 'left' },
155
  buttons: function(event, t){
156
  var buttonElem = jQuery('<a id="pointer-close" style="margin-left:5px" class="button-secondary">Close</a>');
157
  buttonElem.bind('click.pointer', function(){ t.element.pointer('close');
js/wfdropdown.js ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ========================================================================
2
+ * Bootstrap: dropdown.js v3.3.7 (adapted to WF prefix)
3
+ * http://getbootstrap.com/javascript/#dropdowns
4
+ * ========================================================================
5
+ * Copyright 2011-2016 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // DROPDOWN CLASS DEFINITION
14
+ // =========================
15
+
16
+ var backdrop = '.wf-dropdown-backdrop'
17
+ var toggle = '[data-toggle="wf-dropdown"]'
18
+ var WFDropdown = function (element) {
19
+ $(element).on('click.bs.wf-dropdown', this.toggle)
20
+ }
21
+
22
+ WFDropdown.VERSION = '3.3.7'
23
+
24
+ function getParent($this) {
25
+ var selector = $this.attr('data-target')
26
+
27
+ if (!selector) {
28
+ selector = $this.attr('href')
29
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
30
+ }
31
+
32
+ var $parent = selector && $(selector)
33
+
34
+ return $parent && $parent.length ? $parent : $this.parent()
35
+ }
36
+
37
+ function clearMenus(e) {
38
+ if (e && e.which === 3) return
39
+ $(backdrop).remove()
40
+ $(toggle).each(function () {
41
+ var $this = $(this)
42
+ var $parent = getParent($this)
43
+ var relatedTarget = { relatedTarget: this }
44
+
45
+ if (!$parent.hasClass('wf-open')) return
46
+
47
+ if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
48
+
49
+ $parent.trigger(e = $.Event('hide.bs.wf-dropdown', relatedTarget))
50
+
51
+ if (e.isDefaultPrevented()) return
52
+
53
+ $this.attr('aria-expanded', 'false')
54
+ $parent.removeClass('wf-open').trigger($.Event('hidden.bs.wf-dropdown', relatedTarget))
55
+ })
56
+ }
57
+
58
+ WFDropdown.prototype.toggle = function (e) {
59
+ var $this = $(this)
60
+
61
+ if ($this.is('.wf-disabled, :disabled')) return
62
+
63
+ var $parent = getParent($this)
64
+ var isActive = $parent.hasClass('wf-open')
65
+
66
+ clearMenus()
67
+
68
+ if (!isActive) {
69
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.wf-navbar-nav').length) {
70
+ // if mobile we use a backdrop because click events don't delegate
71
+ $(document.createElement('div'))
72
+ .addClass('wf-dropdown-backdrop')
73
+ .insertAfter($(this))
74
+ .on('click', clearMenus)
75
+ }
76
+
77
+ var relatedTarget = { relatedTarget: this }
78
+ $parent.trigger(e = $.Event('show.bs.wf-dropdown', relatedTarget))
79
+
80
+ if (e.isDefaultPrevented()) return
81
+
82
+ $this
83
+ .trigger('focus')
84
+ .attr('aria-expanded', 'true')
85
+
86
+ $parent
87
+ .toggleClass('wf-open')
88
+ .trigger($.Event('shown.bs.wf-dropdown', relatedTarget))
89
+ }
90
+
91
+ return false
92
+ }
93
+
94
+ WFDropdown.prototype.keydown = function (e) {
95
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
96
+
97
+ var $this = $(this)
98
+
99
+ e.preventDefault()
100
+ e.stopPropagation()
101
+
102
+ if ($this.is('.wf-disabled, :disabled')) return
103
+
104
+ var $parent = getParent($this)
105
+ var isActive = $parent.hasClass('wf-open')
106
+
107
+ if (!isActive && e.which != 27 || isActive && e.which == 27) {
108
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
109
+ return $this.trigger('click')
110
+ }
111
+
112
+ var desc = ' li:not(.wf-disabled):visible a'
113
+ var $items = $parent.find('.wf-dropdown-menu' + desc)
114
+
115
+ if (!$items.length) return
116
+
117
+ var index = $items.index(e.target)
118
+
119
+ if (e.which == 38 && index > 0) index-- // up
120
+ if (e.which == 40 && index < $items.length - 1) index++ // down
121
+ if (!~index) index = 0
122
+
123
+ $items.eq(index).trigger('focus')
124
+ }
125
+
126
+
127
+ // DROPDOWN PLUGIN DEFINITION
128
+ // ==========================
129
+
130
+ function Plugin(option) {
131
+ return this.each(function () {
132
+ var $this = $(this)
133
+ var data = $this.data('bs.wf-dropdown')
134
+
135
+ if (!data) $this.data('bs.wf-dropdown', (data = new WFDropdown(this)))
136
+ if (typeof option == 'string') data[option].call($this)
137
+ })
138
+ }
139
+
140
+ var old = $.fn.wfdropdown
141
+
142
+ $.fn.wfdropdown = Plugin
143
+ $.fn.wfdropdown.Constructor = WFDropdown
144
+
145
+
146
+ // DROPDOWN NO CONFLICT
147
+ // ====================
148
+
149
+ $.fn.wfdropdown.noConflict = function () {
150
+ $.fn.wfdropdown = old
151
+ return this
152
+ }
153
+
154
+
155
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
156
+ // ===================================
157
+
158
+ $(document)
159
+ .on('click.bs.wf-dropdown.data-api', clearMenus)
160
+ .on('click.bs.wf-dropdown.data-api', '.wf-dropdown form', function (e) { e.stopPropagation() })
161
+ .on('click.bs.wf-dropdown.data-api', toggle, WFDropdown.prototype.toggle)
162
+ .on('keydown.bs.wf-dropdown.data-api', toggle, WFDropdown.prototype.keydown)
163
+ .on('keydown.bs.wf-dropdown.data-api', '.wf-dropdown-menu', WFDropdown.prototype.keydown)
164
+
165
+ }(jQuery);
lib/dashboard/widget_ips.php CHANGED
@@ -89,7 +89,7 @@ if (!isset($limit)) { $limit = 10; $initial = true; }
89
  $(self).closest('.wf-ips').find('table').replaceWith(table);
90
  }
91
  else {
92
- WFAD.colorbox('400px', 'An error occurred', 'We encountered an error trying load more data.');
93
  $(this).closest('.wf-dashboard-item-list-text').fadeIn();
94
  }
95
  });
89
  $(self).closest('.wf-ips').find('table').replaceWith(table);
90
  }
91
  else {
92
+ WFAD.colorbox('300px', 'An error occurred', 'We encountered an error trying load more data.');
93
  $(this).closest('.wf-dashboard-item-list-text').fadeIn();
94
  }
95
  });
lib/dashboard/widget_logins.php CHANGED
@@ -73,7 +73,7 @@
73
  $(self).closest('.wf-recent-logins').find('table').replaceWith(table);
74
  }
75
  else {
76
- WFAD.colorbox('400px', 'An error occurred', 'We encountered an error trying load more data.');
77
  $(this).closest('.wf-dashboard-item-list-text').fadeIn();
78
  }
79
  });
73
  $(self).closest('.wf-recent-logins').find('table').replaceWith(table);
74
  }
75
  else {
76
+ WFAD.colorbox('300px', 'An error occurred', 'We encountered an error trying load more data.');
77
  $(this).closest('.wf-dashboard-item-list-text').fadeIn();
78
  }
79
  });
lib/dashboard/widget_networkattacks.php CHANGED
@@ -66,12 +66,18 @@ STYLING;
66
  foreach ($blocks as $b) {
67
  $values[] = $b['c'];
68
 
69
- $dtStr = date("c", $b['t']); //Have to do it this way because of PHP 5.2
70
  $dt = new DateTime($dtStr, $utc);
71
  $tz = get_option('timezone_string');
72
  if (!empty($tz)) {
73
  $dt->setTimezone(new DateTimeZone($tz));
74
  }
 
 
 
 
 
 
75
  $labels[] = "'" . $dt->format('g a') . "'";
76
  }
77
  ?>
@@ -118,12 +124,18 @@ STYLING;
118
  foreach ($blocks as $b) {
119
  $values[] = $b['c'];
120
 
121
- $dtStr = date("c", $b['t']); //Have to do it this way because of PHP 5.2
122
  $dt = new DateTime($dtStr, $utc);
123
  $tz = get_option('timezone_string');
124
  if (!empty($tz)) {
125
  $dt->setTimezone(new DateTimeZone($tz));
126
  }
 
 
 
 
 
 
127
  $labels[] = "'" . $dt->format('M j') . "'";
128
  }
129
  ?>
@@ -170,12 +182,18 @@ STYLING;
170
  foreach ($blocks as $b) {
171
  $values[] = $b['c'];
172
 
173
- $dtStr = date("c", $b['t']); //Have to do it this way because of PHP 5.2
174
  $dt = new DateTime($dtStr, $utc);
175
  $tz = get_option('timezone_string');
176
  if (!empty($tz)) {
177
  $dt->setTimezone(new DateTimeZone($tz));
178
  }
 
 
 
 
 
 
179
  $labels[] = "'" . $dt->format('M j') . "'";
180
  }
181
  ?>
@@ -226,6 +244,7 @@ STYLING;
226
  <?php endif; ?>
227
  </li>
228
  </ul>
 
229
  </div>
230
  </div>
231
  </div>
66
  foreach ($blocks as $b) {
67
  $values[] = $b['c'];
68
 
69
+ $dtStr = gmdate("c", $b['t']); //Have to do it this way because of PHP 5.2
70
  $dt = new DateTime($dtStr, $utc);
71
  $tz = get_option('timezone_string');
72
  if (!empty($tz)) {
73
  $dt->setTimezone(new DateTimeZone($tz));
74
  }
75
+ else {
76
+ $gmt = get_option('gmt_offset');
77
+ if (!empty($gmt)) {
78
+ $dt->setTimezone(new DateTimeZone('Etc/GMT' . ($gmt < 0 ? '+' : '-') . abs($gmt))); //The Etc/GMT timezones have the +- signs flipped
79
+ }
80
+ }
81
  $labels[] = "'" . $dt->format('g a') . "'";
82
  }
83
  ?>
124
  foreach ($blocks as $b) {
125
  $values[] = $b['c'];
126
 
127
+ $dtStr = gmdate("c", $b['t']); //Have to do it this way because of PHP 5.2
128
  $dt = new DateTime($dtStr, $utc);
129
  $tz = get_option('timezone_string');
130
  if (!empty($tz)) {
131
  $dt->setTimezone(new DateTimeZone($tz));
132
  }
133
+ else {
134
+ $gmt = get_option('gmt_offset');
135
+ if (!empty($gmt)) {
136
+ $dt->setTimezone(new DateTimeZone('Etc/GMT' . ($gmt < 0 ? '+' : '-') . abs($gmt))); //The Etc/GMT timezones have the +- signs flipped
137
+ }
138
+ }
139
  $labels[] = "'" . $dt->format('M j') . "'";
140
  }
141
  ?>
182
  foreach ($blocks as $b) {
183
  $values[] = $b['c'];
184
 
185
+ $dtStr = gmdate("c", $b['t']); //Have to do it this way because of PHP 5.2
186
  $dt = new DateTime($dtStr, $utc);
187
  $tz = get_option('timezone_string');
188
  if (!empty($tz)) {
189
  $dt->setTimezone(new DateTimeZone($tz));
190
  }
191
+ else {
192
+ $gmt = get_option('gmt_offset');
193
+ if (!empty($gmt)) {
194
+ $dt->setTimezone(new DateTimeZone('Etc/GMT' . ($gmt < 0 ? '+' : '-') . abs($gmt))); //The Etc/GMT timezones have the +- signs flipped
195
+ }
196
+ }
197
  $labels[] = "'" . $dt->format('M j') . "'";
198
  }
199
  ?>
244
  <?php endif; ?>
245
  </li>
246
  </ul>
247
+ <p class="wf-dashboard-last-updated">Last Updated: <?php echo esc_html(wfUtils::makeTimeAgo(time() - $d->lastGenerated)); ?> ago</p>
248
  </div>
249
  </div>
250
  </div>
lib/menu_activity.php CHANGED
@@ -5,23 +5,22 @@
5
  </div>
6
  <?php endif ?>
7
  <div class="wrap wordfence">
8
- <h2 id="wfHeading">
9
- <div style="float: left;">
10
- Your Site Activity in Real-Time
 
 
 
 
 
 
 
 
 
11
  </div>
12
- <div class="wordfenceWrap" style="margin: 5px 0 0 15px; float: left;">
13
- <div class="wfOnOffSwitch" id="wfOnOffSwitchID">
14
- <input type="checkbox" name="wfOnOffSwitch" class="wfOnOffSwitch-checkbox"
15
- id="wfLiveTrafficOnOff" <?php if (wfConfig::liveTrafficEnabled()) {
16
- echo ' checked ';
17
- } ?>>
18
- <label class="wfOnOffSwitch-label" for="wfLiveTrafficOnOff">
19
- <div class="wfOnOffSwitch-inner"></div>
20
- <div class="wfOnOffSwitch-switch"></div>
21
- </label>
22
- </div>
23
- </div>
24
- </h2>
25
  <a href="http://docs.wordfence.com/en/Live_traffic" target="_blank" class="wfhelp"></a><a href="http://docs.wordfence.com/en/Live_traffic" target="_blank">Learn more about Wordfence Live Traffic</a>
26
 
27
  <div class="wordfenceModeElem" id="wordfenceMode_activity"></div>
@@ -61,8 +60,8 @@
61
  <pre data-bind="text: 'DEBUG: ' + sql(), visible: sql"></pre>
62
  <?php endif ?>
63
 
64
- <div class="wfActEvent">
65
- <h2 style="float: left;padding: 0;margin: 0 10px 0 0;">Filter Traffic: </h2>
66
 
67
  <select id="wf-lt-preset-filters" data-bind="options: presetFiltersOptions, optionsText: presetFiltersOptionsText,
68
  value: selectedPresetFilter">
@@ -75,124 +74,79 @@
75
  </div>
76
 
77
  <div class="wfActEvent" data-bind="visible: showAdvancedFilters" id="wf-lt-advanced-filters">
78
- <table>
79
- <tr>
80
- <td>
81
- <table>
82
- <tbody data-bind="foreach: filters">
83
- <tr>
84
- <td>
85
- <select name="param[]" class="wf-lt-advanced-filters-param" data-bind="options: filterParamOptions,
86
- optionsText: filterParamOptionsText, value: selectedFilterParamOptionValue, optionsCaption: 'Filter...'"></select>
87
- </td>
88
- <td data-bind="visible: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() != 'bool'">
89
- <select name="operator[]" class="wf-lt-advanced-filters-operator"
90
- data-bind="options: filterOperatorOptions,
91
- optionsText: filterOperatorOptionsText, value: selectedFilterOperatorOptionValue"></select>
92
- </td>
93
- <td data-bind="attr: {colSpan: (selectedFilterParamOptionValue() &&
94
- selectedFilterParamOptionValue().type() == 'bool' ? 2 : 1)}"
95
- class="wf-lt-advanced-filters-value-cell">
96
-
97
- <span
98
- data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'enum'">
99
- <select
100
- data-bind="options: selectedFilterParamOptionValue().values,
101
- optionsText: selectedFilterParamOptionValue().optionsText,
102
- value: value"></select>
103
  </span>
104
 
105
- <span
106
- data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'text'">
107
- <input data-bind="value: value" type="text"/>
108
  </span>
109
 
110
- <span
111
- data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'bool'">
112
- <label>Yes <input data-bind="checked: value" type="radio"
113
- value="1"></label>
114
- <label>No <input data-bind="checked: value" type="radio"
115
- value="0"></label>
116
  </span>
117
-
118
- </td>
119
- <td>
120
- <button data-bind="click: $root.removeFilter" type="button"
121
- class="wf-btn wf-btn-default">
122
- Remove
123
- </button>
124
- </td>
125
- </tr>
126
- </tbody>
127
- <tbody>
128
- <tr>
129
- <td colspan="3">
130
- <div class="wf-pad-small">
131
- <button type="button" class="wf-btn wf-btn-default" data-bind="click: addFilter">
132
- Add Filter
133
- </button>
134
- </div>
135
- </td>
136
- </tr>
137
- </tbody>
138
- </table>
139
- </td>
140
- <td>
141
- <table>
142
- <tbody>
143
- <tr>
144
- <td>
145
- <label for="wf-live-traffic-from">From:&nbsp;</label>
146
- </td>
147
- <td><input placeholder="Start date" id="wf-live-traffic-from" type="text"
148
- class="wf-datetime"
149
- data-bind="value: startDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
150
- </td>
151
- <td>
152
- <button data-bind="click: startDate('')" class="wf-btn wf-btn-default wf-btn-sm"
153
- type="button">
154
- Clear
155
- </button>
156
- </td>
157
- </tr>
158
- <tr>
159
- <td>
160
- <label for="wf-live-traffic-to">To:&nbsp;</label>
161
- </td>
162
- <td><input placeholder="End date" id="wf-live-traffic-to" type="text"
163
- class="wf-datetime"
164
- data-bind="value: endDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
165
- </td>
166
- <td>
167
- <button data-bind="click: endDate('')" class="wf-btn wf-btn-default wf-btn-sm"
168
- type="button">
169
- Clear
170
- </button>
171
- </td>
172
- </tr>
173
- <tr>
174
- <td>
175
- <label for="wf-live-traffic-group-by">Group&nbsp;By:&nbsp;</label>
176
- </td>
177
- <td>
178
- <select id="wf-live-traffic-group-by" name="groupby"
179
- class="wf-lt-advanced-filters-groupby"
180
- data-bind="options: filterGroupByOptions,
181
- optionsText: filterGroupByOptionsText, value: groupBy, optionsCaption: 'None'"></select>
182
- </td>
183
- </tr>
184
- </tbody>
185
- </table>
186
- </td>
187
- </tr>
188
- </table>
189
  </div>
190
  </form>
191
 
192
- <table data-bind="if: groupBy()" border="0" style="width: 100%">
193
- <tbody data-bind="foreach: listings">
194
- <tr>
195
- <td>
196
  <div data-bind="if: loc()">
197
  <img data-bind="attr: { src: '<?php echo wfUtils::getBaseURL() . 'images/flags/'; ?>' + loc().countryCode.toLowerCase() + '.png',
198
  alt: loc().countryName, title: loc().countryName }" width="16" height="11"
@@ -228,20 +182,18 @@
228
  data-bind="attr: { 'data-timestamp': ctime, text: 'Last hit was ' + ctime() + ' ago.' }"
229
  class="wfTimeAgo wfTimeAgo-timestamp"></span>
230
  </div>
231
- </td>
232
- <td style="font-size: 28px; color: #999;">
233
- <span data-bind="text: hitCount"></span> hits
234
- </td>
235
- </tr>
236
- </tbody>
237
- </table>
238
 
239
  <div data-bind="if: !groupBy()">
240
  <div id="wf-lt-listings" data-bind="foreach: listings">
241
  <div data-bind="attr: { id: ('wfActEvent_' + id()), 'class': cssClasses }">
242
- <table border="0" cellpadding="1" cellspacing="0">
243
- <tr>
244
- <td>
245
  <span data-bind="if: action() != 'loginOK' && user()">
246
  <span data-bind="html: user.avatar" class="wfAvatar"></span>
247
  <a data-bind="attr: { href: user.editLink }, text: user().display_name"
@@ -267,12 +219,12 @@
267
  <span data-bind="if: extReferer()">
268
  arrived from <a data-bind="text: referer, attr: { href: referer }"
269
  target="_blank"
270
- style="color: #A00; font-weight: bold;"></a> and
271
  </span>
272
  <span data-bind="if: !extReferer()">
273
  left <a data-bind="text: referer, attr: { href: referer }"
274
  target="_blank"
275
- style="color: #999; font-weight: normal;"></a> and
276
  </span>
277
  </span>
278
  <span data-bind="if: statusCode() == 404">
@@ -305,13 +257,12 @@
305
  <span data-bind="if: action() == 'user:passwordReset'">
306
  changed their password.
307
  </span>
308
- <a class="wf-lt-url"
309
  data-bind="text: displayURL, attr: { href: URL, title: URL }"
310
  target="_blank"></a>
311
- </td>
312
- </tr>
313
- <tr>
314
- <td><span data-bind="text: timeAgo, attr: { 'data-timestamp': ctime }"
315
  class="wfTimeAgo wfTimeAgo-timestamp"></span>&nbsp;&nbsp;
316
  <strong>IP:</strong> <a
317
  data-bind="attr: { href: WFAD.makeIPTrafLink(IP()) }, text: IP"
@@ -330,24 +281,18 @@
330
  <span data-bind="text: IP"
331
  style="display:none;"></span>
332
  </span>
333
- </td>
334
- </tr>
335
 
336
- <tr data-bind="if: browser() && browser().browser != 'Default Browser'">
337
- <td>
338
  <strong>Browser:</strong>
339
  <span data-bind="text: browser().browser +
340
  (browser().version ? ' version ' + browser().version : '') +
341
  (browser().platform && browser().platform != 'unknown' ? ' running on ' + browser().platform : '')
342
  ">
343
  </span>
344
- </td>
345
- </tr>
346
- <tr>
347
- <td data-bind="text: UA" style="color: #AAA;"></td>
348
- </tr>
349
- <tr>
350
- <td>
351
  <span data-bind="if: blocked()">
352
  <a href="#" class="wf-btn wf-btn-default wf-btn-sm"
353
  data-bind="click: $root.unblockIP">
@@ -389,9 +334,7 @@
389
  </a>
390
  <?php endif ?>
391
  </span>
392
- </td>
393
- </tr>
394
- </table>
395
  </div>
396
  </div>
397
  </div>
5
  </div>
6
  <?php endif ?>
7
  <div class="wrap wordfence">
8
+ <div class="wf-page-title">
9
+ <div class="wordfence-lock-icon wordfence-icon32"></div>
10
+ <h2 id="wfHeading">Site Activity in Real-Time</h2>
11
+ <div class="wfOnOffSwitch" id="wfOnOffSwitchID">
12
+ <input type="checkbox" name="wfOnOffSwitch" class="wfOnOffSwitch-checkbox"
13
+ id="wfLiveTrafficOnOff" <?php if (wfConfig::liveTrafficEnabled()) {
14
+ echo ' checked ';
15
+ } ?>>
16
+ <label class="wfOnOffSwitch-label" for="wfLiveTrafficOnOff">
17
+ <div class="wfOnOffSwitch-inner"></div>
18
+ <div class="wfOnOffSwitch-switch"></div>
19
+ </label>
20
  </div>
21
+ </div>
22
+ <div class="wp-header-end"></div>
23
+
 
 
 
 
 
 
 
 
 
 
24
  <a href="http://docs.wordfence.com/en/Live_traffic" target="_blank" class="wfhelp"></a><a href="http://docs.wordfence.com/en/Live_traffic" target="_blank">Learn more about Wordfence Live Traffic</a>
25
 
26
  <div class="wordfenceModeElem" id="wordfenceMode_activity"></div>
60
  <pre data-bind="text: 'DEBUG: ' + sql(), visible: sql"></pre>
61
  <?php endif ?>
62
 
63
+ <div class="wfActEvent wf-live-traffic-filter">
64
+ <h2>Filter Traffic:</h2>
65
 
66
  <select id="wf-lt-preset-filters" data-bind="options: presetFiltersOptions, optionsText: presetFiltersOptionsText,
67
  value: selectedPresetFilter">
74
  </div>
75
 
76
  <div class="wfActEvent" data-bind="visible: showAdvancedFilters" id="wf-lt-advanced-filters">
77
+ <div class="wf-live-traffic-filter-detail">
78
+ <div>
79
+ <div data-bind="foreach: filters">
80
+ <div class="wf-live-traffic-filter-item">
81
+ <div class="wf-live-traffic-filter-item-parameters">
82
+ <div>
83
+ <select name="param[]" class="wf-lt-advanced-filters-param" data-bind="options: filterParamOptions, optionsText: filterParamOptionsText, value: selectedFilterParamOptionValue, optionsCaption: 'Filter...'"></select>
84
+ </div>
85
+ <div data-bind="visible: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() != 'bool'">
86
+ <select name="operator[]" class="wf-lt-advanced-filters-operator" data-bind="options: filterOperatorOptions, optionsText: filterOperatorOptionsText, value: selectedFilterOperatorOptionValue"></select>
87
+ </div>
88
+ <div data-bind="attr: {colSpan: (selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'bool' ? 2 : 1)}" class="wf-lt-advanced-filters-value-cell">
89
+ <span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'enum'">
90
+ <select data-bind="options: selectedFilterParamOptionValue().values, optionsText: selectedFilterParamOptionValue().optionsText, value: value"></select>
 
 
 
 
 
 
 
 
 
 
 
91
  </span>
92
 
93
+ <span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'text'">
94
+ <input data-bind="value: value" type="text">
 
95
  </span>
96
 
97
+ <span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'bool'">
98
+ <label>Yes <input data-bind="checked: value" type="radio" value="1"></label>
99
+ <label>No <input data-bind="checked: value" type="radio" value="0"></label>
 
 
 
100
  </span>
101
+ </div>
102
+ </div>
103
+ <div>
104
+ <!--<button data-bind="click: $root.removeFilter" type="button" class="wf-btn wf-btn-default">Remove</button> -->
105
+ <a href="#" data-bind="click: $root.removeFilter" class="wf-live-traffic-filter-remove"><i class="wf-ion-trash-a"></i></a>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ <div>
110
+ <tr>
111
+ <td colspan="3">
112
+ <div class="wf-pad-small">
113
+ <button type="button" class="wf-btn wf-btn-default" data-bind="click: addFilter">
114
+ Add Filter
115
+ </button>
116
+ </div>
117
+ </td>
118
+ </tr>
119
+ </div>
120
+ </div>
121
+ <div class="wf-form wf-form-horizontal">
122
+ <div class="wf-form-group">
123
+ <label for="wf-live-traffic-from" class="wf-col-sm-2">From:&nbsp;</label>
124
+ <div class="wf-col-sm-10">
125
+ <input placeholder="Start date" id="wf-live-traffic-from" type="text" class="wf-datetime" data-bind="value: startDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
126
+ <button data-bind="click: startDate('')" class="wf-btn wf-btn-default wf-btn-sm" type="button">Clear</button>
127
+ </div>
128
+ </div>
129
+ <div class="wf-form-group">
130
+ <label for="wf-live-traffic-to" class="wf-col-sm-2">To:&nbsp;</label>
131
+ <div class="wf-col-sm-10">
132
+ <input placeholder="End date" id="wf-live-traffic-to" type="text" class="wf-datetime" data-bind="value: endDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
133
+ <button data-bind="click: endDate('')" class="wf-btn wf-btn-default wf-btn-sm" type="button">Clear</button>
134
+ </div>
135
+ </div>
136
+ <div class="wf-form-group">
137
+ <label for="wf-live-traffic-group-by" class="wf-col-sm-2">Group&nbsp;By:&nbsp;</label>
138
+ <div class="wf-col-sm-10">
139
+ <select id="wf-live-traffic-group-by" name="groupby" class="wf-lt-advanced-filters-groupby" data-bind="options: filterGroupByOptions, optionsText: filterGroupByOptionsText, value: groupBy, optionsCaption: 'None'"></select>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  </div>
145
  </form>
146
 
147
+ <div data-bind="if: groupBy()" border="0" style="width: 100%">
148
+ <div class="wf-filtered-traffic" data-bind="foreach: listings">
149
+ <div>
 
150
  <div data-bind="if: loc()">
151
  <img data-bind="attr: { src: '<?php echo wfUtils::getBaseURL() . 'images/flags/'; ?>' + loc().countryCode.toLowerCase() + '.png',
152
  alt: loc().countryName, title: loc().countryName }" width="16" height="11"
182
  data-bind="attr: { 'data-timestamp': ctime, text: 'Last hit was ' + ctime() + ' ago.' }"
183
  class="wfTimeAgo wfTimeAgo-timestamp"></span>
184
  </div>
185
+ </div>
186
+ <div>
187
+ <!--<td style="font-size: 28px; color: #999;"> -->
188
+ <span class="wf-filtered-traffic-hits" data-bind="text: hitCount"></span> hits
189
+ </div>
190
+ </div>
191
+ </div>
192
 
193
  <div data-bind="if: !groupBy()">
194
  <div id="wf-lt-listings" data-bind="foreach: listings">
195
  <div data-bind="attr: { id: ('wfActEvent_' + id()), 'class': cssClasses }">
196
+ <div>
 
 
197
  <span data-bind="if: action() != 'loginOK' && user()">
198
  <span data-bind="html: user.avatar" class="wfAvatar"></span>
199
  <a data-bind="attr: { href: user.editLink }, text: user().display_name"
219
  <span data-bind="if: extReferer()">
220
  arrived from <a data-bind="text: referer, attr: { href: referer }"
221
  target="_blank"
222
+ style="color: #A00; font-weight: bold;" class="wf-split-word-xs"></a> and
223
  </span>
224
  <span data-bind="if: !extReferer()">
225
  left <a data-bind="text: referer, attr: { href: referer }"
226
  target="_blank"
227
+ style="color: #999; font-weight: normal;" class="wf-split-word-xs"></a> and
228
  </span>
229
  </span>
230
  <span data-bind="if: statusCode() == 404">
257
  <span data-bind="if: action() == 'user:passwordReset'">
258
  changed their password.
259
  </span>
260
+ <a class="wf-lt-url wf-split-word-xs"
261
  data-bind="text: displayURL, attr: { href: URL, title: URL }"
262
  target="_blank"></a>
263
+ </div>
264
+ <div>
265
+ <span data-bind="text: timeAgo, attr: { 'data-timestamp': ctime }"
 
266
  class="wfTimeAgo wfTimeAgo-timestamp"></span>&nbsp;&nbsp;
267
  <strong>IP:</strong> <a
268
  data-bind="attr: { href: WFAD.makeIPTrafLink(IP()) }, text: IP"
281
  <span data-bind="text: IP"
282
  style="display:none;"></span>
283
  </span>
284
+ </div>
 
285
 
286
+ <div data-bind="if: browser() && browser().browser != 'Default Browser'">
 
287
  <strong>Browser:</strong>
288
  <span data-bind="text: browser().browser +
289
  (browser().version ? ' version ' + browser().version : '') +
290
  (browser().platform && browser().platform != 'unknown' ? ' running on ' + browser().platform : '')
291
  ">
292
  </span>
293
+ </div>
294
+ <div data-bind="text: UA" style="color: #AAA;"></div>
295
+ <div>
 
 
 
 
296
  <span data-bind="if: blocked()">
297
  <a href="#" class="wf-btn wf-btn-default wf-btn-sm"
298
  data-bind="click: $root.unblockIP">
334
  </a>
335
  <?php endif ?>
336
  </span>
337
+ </div>
 
 
338
  </div>
339
  </div>
340
  </div>
lib/menu_blocking_advancedBlocking.php CHANGED
@@ -1,32 +1,60 @@
1
  <div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div>
2
  <div>
3
  <div class="wordfenceModeElem" id="wordfenceMode_rangeBlocking"></div>
4
- <p>
5
- <?php if(! wfConfig::get('firewallEnabled')){ ?><div style="color: #F00; font-weight: bold;">Rate limiting rules and advanced blocking are disabled. You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</div><br /><?php } ?>
6
- <table class="wfConfigForm">
7
- <tr><th>IP address range:</th><td><input id="ipRange" type="text" size="30" maxlength="255" value="<?php
 
 
 
 
8
  if( isset( $_GET['wfBlockRange'] ) && preg_match('/^[\da-f\.\s\t\-:]+$/i', $_GET['wfBlockRange']) ){ echo wp_kses($_GET['wfBlockRange'], array()); }
9
- ?>" onkeyup="WFAD.calcRangeTotal();">&nbsp;<span id="wfShowRangeTotal"></span></td></tr>
10
- <tr><td></td><td style="padding-bottom: 15px;"><strong>Examples:</strong> 192.168.200.200 - 192.168.200.220</td></tr>
11
- <tr><th>Hostname:</th><td><input id="hostname" type="text" size="30" maxlength="255" value="<?php
 
 
 
 
 
 
12
  if( isset( $_GET['wfBlockHostname'] ) ){ echo esc_attr($_GET['wfBlockHostname']); }
13
- ?>" onkeyup="WFAD.calcRangeTotal();">&nbsp;<span id="wfShowRangeTotal"></span></td></tr>
14
- <tr><td><em class="small">
15
- Using this setting will make a DNS query<br>
16
- per unique IP address (per visitor),<br>
17
- and can add additional load. High traffic<br> sites may not want to use this feature.</em>
18
- </td><td style="padding-bottom: 15px;vertical-align: top;"><strong>Examples:</strong> *.amazonaws.com, *.linode.com</td></tr>
19
- <tr><th>User-Agent (browser) that matches:</th><td><input id="uaRange" type="text" size="30" maxlength="255" >&nbsp;(Case insensitive)</td></tr>
20
- <tr><td></td><td style="padding-bottom: 15px;"><strong>Examples:</strong> *badRobot*, AnotherBadRobot*, *someBrowserSuffix</td></tr>
21
- <tr><th>Referer (website visitor arrived from) that matches:</th><td><input id="wfreferer" type="text" size="30" maxlength="255" >&nbsp;(Case insensitive)</td></tr>
22
- <tr><td></td><td style="padding-bottom: 15px;"><strong>Examples:</strong> *badWebsite*, AnotherBadWebsite*, *someWebsiteSuffix</td></tr>
23
- <tr><th>Enter a reason you're blocking this visitor pattern:</th><td><input id="wfReason" type="text" size="30" maxlength="255"></td></tr>
24
- <tr><td></td><td style="padding-bottom: 15px;"><strong>Why a reason:</strong> The reason you specify above is for your own record keeping.</td></tr>
25
- <tr><td colspan="2" style="padding-top: 15px;">
26
- <input type="button" name="but3" class="wf-btn wf-btn-primary" value="Block Visitors Matching this Pattern" onclick="WFAD.blockIPUARange(jQuery('#ipRange').val(), jQuery('#hostname').val(), jQuery('#uaRange').val(), jQuery('#wfreferer').val(), jQuery('#wfReason').val()); return false;" />
27
- </td></tr>
28
- </table>
29
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  <p>
31
  <h2>Current list of ranges and patterns you've blocked</h2>
32
  <div id="currentBlocks"></div>
@@ -45,16 +73,16 @@
45
  <div style="color: #AAA;">
46
  {{/if}}
47
  <div>
48
- <strong>IP Range:</strong>&nbsp;${ipPattern}
49
  </div>
50
  <div>
51
- <strong>Hostname:</strong>&nbsp;${hostnamePattern}
52
  </div>
53
  <div>
54
- <strong>Browser Pattern:</strong>&nbsp;${browserPattern}
55
  </div>
56
  <div>
57
- <strong>Source website:</strong>&nbsp;${refererPattern}
58
  </div>
59
  <div>
60
  <strong>Reason:</strong>&nbsp;${reason}
1
  <div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div>
2
  <div>
3
  <div class="wordfenceModeElem" id="wordfenceMode_rangeBlocking"></div>
4
+ <?php if (!wfConfig::get('firewallEnabled')) { ?>
5
+ <div class="wf-notice"><p><strong>Rate limiting rules and advanced blocking are disabled.</strong> You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</p></div>
6
+ <?php } ?>
7
+ <div class="wf-form wf-form-horizontal wf-add-top">
8
+ <div class="wf-form-group">
9
+ <label for="ipRange" class="wf-col-sm-2 wf-control-label">IP address range</label>
10
+ <div class="wf-col-sm-6">
11
+ <input type="text" id="ipRange" name="ipRange" class="wf-form-control" value="<?php
12
  if( isset( $_GET['wfBlockRange'] ) && preg_match('/^[\da-f\.\s\t\-:]+$/i', $_GET['wfBlockRange']) ){ echo wp_kses($_GET['wfBlockRange'], array()); }
13
+ ?>" onkeyup="WFAD.calcRangeTotal();">
14
+ <span class="wf-help-block" id="wfShowRangeTotal"></span>
15
+ <span class="wf-help-block">Examples: 192.168.200.200 - 192.168.200.220</span>
16
+ </div>
17
+ </div>
18
+ <div class="wf-form-group">
19
+ <label for="hostname" class="wf-col-sm-2 wf-control-label">Hostname</label>
20
+ <div class="wf-col-sm-6">
21
+ <input type="text" id="hostname" name="hostname" class="wf-form-control" value="<?php
22
  if( isset( $_GET['wfBlockHostname'] ) ){ echo esc_attr($_GET['wfBlockHostname']); }
23
+ ?>">
24
+ <span class="wf-help-block">Examples: *.amazonaws.com, *.linode.com</span>
25
+ <span class="wf-help-block">Using this setting will make a DNS query per unique IP address (per visitor), and can add additional load. High traffic<br> sites may not want to use this feature.</span>
26
+ </div>
27
+ </div>
28
+ <div class="wf-form-group">
29
+ <label for="uaRange" class="wf-col-sm-2 wf-control-label">User-Agent (browser) that matches</label>
30
+ <div class="wf-col-sm-6">
31
+ <input type="text" id="uaRange" name="uaRange" class="wf-form-control">
32
+ <span class="wf-help-block">(Case insensitive)</span>
33
+ <span class="wf-help-block">Examples: *badRobot*, AnotherBadRobot*, *someBrowserSuffix</span>
34
+ </div>
35
+ </div>
36
+ <div class="wf-form-group">
37
+ <label for="wfreferer" class="wf-col-sm-2 wf-control-label">Referer (website visitor arrived from) that matches</label>
38
+ <div class="wf-col-sm-6">
39
+ <input type="text" id="wfreferer" name="wfreferer" class="wf-form-control">
40
+ <span class="wf-help-block">(Case insensitive)</span>
41
+ <span class="wf-help-block">Examples: *badWebsite*, AnotherBadWebsite*, *someWebsiteSuffix</span>
42
+ </div>
43
+ </div>
44
+ <div class="wf-form-group">
45
+ <label for="wfReason" class="wf-col-sm-2 wf-control-label">Enter a reason you're blocking this visitor pattern</label>
46
+ <div class="wf-col-sm-6">
47
+ <input type="text" id="wfReason" name="wfReason" class="wf-form-control">
48
+ <span class="wf-help-block">(Case insensitive)</span>
49
+ <span class="wf-help-block">Why a reason: The reason you specify above is for your own record keeping.</span>
50
+ </div>
51
+ </div>
52
+ <div class="wf-form-group">
53
+ <div class="wf-col-sm-6 wf-col-sm-offset-2">
54
+ <a class="wf-btn wf-btn-primary" href="#" onclick="WFAD.blockIPUARange(jQuery('#ipRange').val(), jQuery('#hostname').val(), jQuery('#uaRange').val(), jQuery('#wfreferer').val(), jQuery('#wfReason').val()); return false;">Block Visitors Matching this Pattern</a>
55
+ </div>
56
+ </div>
57
+ </div>
58
  <p>
59
  <h2>Current list of ranges and patterns you've blocked</h2>
60
  <div id="currentBlocks"></div>
73
  <div style="color: #AAA;">
74
  {{/if}}
75
  <div>
76
+ <strong>IP Range:</strong>&nbsp;<span class="wf-split-word-xs">${ipPattern}</span>
77
  </div>
78
  <div>
79
+ <strong>Hostname:</strong>&nbsp;<span class="wf-split-word-xs">${hostnamePattern}</span>
80
  </div>
81
  <div>
82
+ <strong>Browser Pattern:</strong>&nbsp;<span class="wf-split-word-xs">${browserPattern}</span>
83
  </div>
84
  <div>
85
+ <strong>Source website:</strong>&nbsp;<span class="wf-split-word-xs">${refererPattern}</span>
86
  </div>
87
  <div>
88
  <strong>Reason:</strong>&nbsp;${reason}
lib/menu_blocking_blockedIPs.php CHANGED
@@ -2,7 +2,7 @@
2
  <div>
3
  <div class="wordfenceModeElem" id="wordfenceMode_blockedIPs"></div>
4
  <?php if(! wfConfig::get('firewallEnabled')){ ?><div style="color: #F00; font-weight: bold;">Rate limiting rules and advanced blocking are disabled. You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</div><?php } ?>
5
- <p><a href="#" onclick="WFAD.clearAllBlocked('blocked'); return false;">Clear all blocked IP addresses</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="WFAD.clearAllBlocked('locked'); return false;">Clear all locked out IP addresses</a></p>
6
  <div class="wf-form-inline">
7
  <div class="wf-form-group">
8
  <label class="wf-plain" for="wfManualBlock">You can manually (and permanently) block an IP by entering the address here:</label>
@@ -12,9 +12,9 @@
12
  </div>
13
  <div class="wf-add-top">
14
  <div id="wfTabs">
15
- <a href="#" class="wfTab1 wfTabSwitch selected" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_blockedIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs blocked from accessing the site</a>
16
- <a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_lockedOutIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs locked out from login</a>
17
- <a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_throttledIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs throttled for accessing the site too frequently</a>
18
  </div>
19
  <div class="wfTabsContainer">
20
  <div id="wfActivity_blockedIPs" class="wfDataPanel"><div class="wfLoadingWhite32"></div></div>
@@ -65,7 +65,7 @@
65
 
66
  <script type="text/x-jquery-template" id="wfLockedOutIPsWrapperTmpl">
67
  <div>
68
- <p><a class="wf-btn wf-btn-default" href="#" onclick="WFAD.permanentlyBlockAllIPs('lockedOut'); return false;">Permanently block all locked out IP addresses</a></p>
69
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
70
  <table border="0" style="width: 100%" id="wfLockedOutIPsWrapper">
71
  </table>
@@ -115,7 +115,7 @@
115
 
116
  <script type="text/x-jquery-template" id="wfBlockedIPsWrapperTmpl">
117
  <div>
118
- <p><a class="wf-btn wf-btn-default" href="#" onclick="WFAD.permanentlyBlockAllIPs('blocked'); return false;">Permanently block all temporarily blocked IP addresses</a></p>
119
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
120
  <table border="0" style="width: 100%" id="wfBlockedIPsWrapper">
121
  </table>
2
  <div>
3
  <div class="wordfenceModeElem" id="wordfenceMode_blockedIPs"></div>
4
  <?php if(! wfConfig::get('firewallEnabled')){ ?><div style="color: #F00; font-weight: bold;">Rate limiting rules and advanced blocking are disabled. You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</div><?php } ?>
5
+ <p><a href="#" onclick="WFAD.clearAllBlocked('blocked'); return false;">Clear all blocked<span class="wf-hidden-xs"> IP addresses</span></a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="WFAD.clearAllBlocked('locked'); return false;">Clear all locked out<span class="wf-hidden-xs"> IP addresses</span></a></p>
6
  <div class="wf-form-inline">
7
  <div class="wf-form-group">
8
  <label class="wf-plain" for="wfManualBlock">You can manually (and permanently) block an IP by entering the address here:</label>
12
  </div>
13
  <div class="wf-add-top">
14
  <div id="wfTabs">
15
+ <a href="#" class="wfTab1 wfTabSwitch selected" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_blockedIPs', function(){ WFAD.staticTabChanged(); }); return false;"><span class="wf-visible-xs">Blocked</span><span class="wf-hidden-xs">IPs blocked from accessing the site</span></a>
16
+ <a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_lockedOutIPs', function(){ WFAD.staticTabChanged(); }); return false;"><span class="wf-visible-xs">Locked Out</span><span class="wf-hidden-xs">IPs locked out from login</span></a>
17
+ <a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_throttledIPs', function(){ WFAD.staticTabChanged(); }); return false;"><span class="wf-visible-xs">Throttled</span><span class="wf-hidden-xs">IPs throttled for accessing the site too frequently</span></a>
18
  </div>
19
  <div class="wfTabsContainer">
20
  <div id="wfActivity_blockedIPs" class="wfDataPanel"><div class="wfLoadingWhite32"></div></div>
65
 
66
  <script type="text/x-jquery-template" id="wfLockedOutIPsWrapperTmpl">
67
  <div>
68
+ <p><a class="wf-btn wf-btn-default" href="#" onclick="WFAD.permanentlyBlockAllIPs('lockedOut'); return false;"><span class="wf-visible-xs">Block All Temporary</span><span class="wf-hidden-xs">Permanently block all locked out IP addresses</span></a></p>
69
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
70
  <table border="0" style="width: 100%" id="wfLockedOutIPsWrapper">
71
  </table>
115
 
116
  <script type="text/x-jquery-template" id="wfBlockedIPsWrapperTmpl">
117
  <div>
118
+ <p><a class="wf-btn wf-btn-default" href="#" onclick="WFAD.permanentlyBlockAllIPs('blocked'); return false;"><span class="wf-visible-xs">Block All Temporary</span><span class="wf-hidden-xs">Permanently block all temporarily blocked IP addresses</span></a></p>
119
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
120
  <table border="0" style="width: 100%" id="wfBlockedIPsWrapper">
121
  </table>
lib/menu_blocking_countryBlocking.php CHANGED
@@ -23,59 +23,123 @@ WFAD.countryMap = <?php echo json_encode($wfBulkCountries); ?>;
23
  <p class="center"><a class="wf-btn wf-btn-primary wf-btn-callout" href="https://www.wordfence.com/gnl1countryBlock1/wordfence-signup/" target="_blank">Get Premium</a></p>
24
  </div>
25
  <?php } ?>
26
- <table class="wfConfigForm">
27
- <tr><td colspan="2"><h2>Country Blocking Options</h2></td></tr>
28
- <?php if(! wfConfig::get('firewallEnabled')){ ?><tr><td colspan="2"><div style="color: #F00; font-weight: bold;">Rate limiting rules and advanced blocking are disabled. You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</div></td></tr><?php } ?>
29
- <tr><th>What to do when we block someone:</th><td>
30
- <select id="wfBlockAction">
31
- <option value="block"<?php if(wfConfig::get('cbl_action') == 'block'){ echo ' selected'; } ?>>Show the standard Wordfence blocked message</option>
32
- <option value="redir"<?php if(wfConfig::get('cbl_action') == 'redir'){ echo ' selected'; } ?>>Redirect to the URL below</option>
33
- </select>
34
- </td></tr>
35
- <tr><th>URL to redirect blocked users to:</th><td><input type="text" id="wfRedirURL" size="40" value="<?php if(wfConfig::get('cbl_redirURL')){ echo esc_attr(wfConfig::get('cbl_redirURL')); } ?>" />
36
- <br />
37
- <span style="color: #999;">Must start with http:// for example http://yoursite.com/blocked/</span></td></tr>
38
- <tr><th>Block countries even if they are logged in:</th><td><input type="checkbox" id="wfLoggedInBlocked" value="1" <?php if(wfConfig::get('cbl_loggedInBlocked')){ echo 'checked'; } ?> /></td></tr>
39
- <tr><th>Block access to the login form:</th><td><input type="checkbox" id="wfLoginFormBlocked" value="1" <?php if(wfConfig::get('cbl_loginFormBlocked')){ echo 'checked'; } ?> /></td></tr>
40
- <tr><th>Block access to the rest of the site (outside the login form):</th><td><input type="checkbox" id="wfRestOfSiteBlocked" value="1" <?php if(wfConfig::get('cbl_restOfSiteBlocked')){ echo 'checked'; } ?> /><br><span style="color: #999;">If you use Google Adwords, this is not recommended. <a href="https://docs.wordfence.com/en/Country_blocking#Google_Adwords_says_I_can.27t_block_countries._How_do_I_work_around_that.3F" target="_blank">Learn More</a></span></td></tr>
41
- <tr><td colspan="2"><h2>Advanced Country Blocking Options</h2></td></tr>
42
- <tr><th colspan="2">
43
- If user hits the URL
44
- <input type="text" id="wfBypassRedirURL" value="<?php echo esc_attr(wfConfig::get('cbl_bypassRedirURL'), array()); ?>" size="20" />
45
- then redirect that user to
46
- <input type="text" id="wfBypassRedirDest" value="<?php echo esc_attr(wfConfig::get('cbl_bypassRedirDest'), array()); ?>" size="20" /> and set a cookie that will bypass all country blocking.
47
- </th></tr>
48
- <tr><th colspan="2">
49
- If user who is allowed to access the site views the URL
50
- <input type="text" id="wfBypassViewURL" value="<?php echo esc_attr(wfConfig::get('cbl_bypassViewURL', ""), array()); ?>" size="20" />
51
- then set a cookie that will bypass country blocking in future in case that user hits the site from a blocked country.
52
- </th></tr>
53
-
54
- </table>
55
- <h2>Select which countries to block</h2>
56
- <div id="wfBulkBlockingContainer" style="margin-bottom: 10px;">
57
- <a href="#" onclick="jQuery('.wfCountryCheckbox').prop('checked', true); return false;">Select All</a>&nbsp;&nbsp;
58
- <a href="#" onclick="jQuery('.wfCountryCheckbox').prop('checked', false); return false;">Deselect All</a>&nbsp;&nbsp;
59
- <table border="0" cellpadding="0" cellspacing="0">
60
- <tr>
61
- <?php
62
- $counter = 0;
63
- asort($wfBulkCountries);
64
- foreach($wfBulkCountries as $code => $name){
65
- echo '<td style=""><input class="wfCountryCheckbox" id="wfCountryCheckbox_' . $code . '" type="checkbox" value="' . $code . '" />&nbsp;' . $name . '&nbsp;&nbsp;&nbsp;</td>';
66
- $counter++;
67
- if($counter % 5 == 0){
68
- echo "</tr><tr>\n";
69
- }
70
- }
71
- ?>
72
- </tr>
73
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  </div>
75
- <table border="0" cellpadding="0" cellspacing="0"><tr>
76
- <td><input type="button" name="but4" class="wf-btn wf-btn-primary" value="Save blocking options and country list" onclick="WFAD.saveCountryBlocking();" /></td>
77
- <td style="height: 24px;"><div class="wfAjax24"></div><span class="wfSavedMsg">&nbsp;Your changes have been saved!</span></td></tr>
78
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  <span style="font-size: 10px;">Note that we use an IP to country database that is 99.5% accurate to identify which country a visitor is from.</span>
80
  </div>
81
  <script type="text/javascript">
@@ -87,6 +151,88 @@ jQuery(function(){ WFAD.loadBlockedCountries('<?php echo wfConfig::get('cbl_coun
87
  <?php
88
  }
89
  ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  </script>
91
  <script type="text/x-jquery-template" id="wfWelcomeContentCntBlk">
92
  <div>
23
  <p class="center"><a class="wf-btn wf-btn-primary wf-btn-callout" href="https://www.wordfence.com/gnl1countryBlock1/wordfence-signup/" target="_blank">Get Premium</a></p>
24
  </div>
25
  <?php } ?>
26
+ <?php if (!wfConfig::get('firewallEnabled')) { ?>
27
+ <div class="wf-notice"><p><strong>Rate limiting rules and advanced blocking are disabled.</strong> You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</p></div>
28
+ <?php } ?>
29
+
30
+ <h3>Country Blocking Options</h3>
31
+ <div class="wf-form wf-form-horizontal wf-add-top wf-add-bottom">
32
+ <div class="wf-form-group">
33
+ <label for="wfBlockAction" class="wf-col-sm-2 wf-control-label">What to do when we block someone</label>
34
+ <div class="wf-col-sm-6">
35
+ <select id="wfBlockAction" class="wf-form-control">
36
+ <option value="block"<?php if(wfConfig::get('cbl_action') == 'block'){ echo ' selected'; } ?>>Show the standard Wordfence blocked message</option>
37
+ <option value="redir"<?php if(wfConfig::get('cbl_action') == 'redir'){ echo ' selected'; } ?>>Redirect to the URL below</option>
38
+ </select>
39
+ </div>
40
+ </div>
41
+ <div class="wf-form-group">
42
+ <label for="wfRedirURL" class="wf-col-sm-2 wf-control-label">URL to redirect blocked users to</label>
43
+ <div class="wf-col-sm-6">
44
+ <input type="text" id="wfRedirURL" name="wfRedirURL" class="wf-form-control" value="<?php if(wfConfig::get('cbl_redirURL')){ echo esc_attr(wfConfig::get('cbl_redirURL')); } ?>">
45
+ <span class="wf-help-block">Must start with http:// for example http://example.com/blocked/</span>
46
+ </div>
47
+ </div>
48
+ <div class="wf-form-group">
49
+ <label for="wfLoggedInBlocked" class="wf-col-sm-2 wf-control-label">Block countries even if they are logged in</label>
50
+ <div class="wf-col-sm-6">
51
+ <div class="wf-checkbox"><input type="checkbox" id="wfLoggedInBlocked" name="wfLoggedInBlocked" value="1" <?php if(wfConfig::get('cbl_loggedInBlocked')){ echo 'checked'; } ?>></div>
52
+ </div>
53
+ </div>
54
+ <div class="wf-form-group">
55
+ <label for="wfLoginFormBlocked" class="wf-col-sm-2 wf-control-label">Block access to the login form</label>
56
+ <div class="wf-col-sm-6">
57
+ <div class="wf-checkbox"><input type="checkbox" id="wfLoginFormBlocked" name="wfLoginFormBlocked" value="1" <?php if(wfConfig::get('cbl_loginFormBlocked')){ echo 'checked'; } ?>></div>
58
+ </div>
59
+ </div>
60
+ <div class="wf-form-group">
61
+ <label for="wfRestOfSiteBlocked" class="wf-col-sm-2 wf-control-label">Block access to the rest of the site (outside the login form)</label>
62
+ <div class="wf-col-sm-6">
63
+ <div class="wf-checkbox"><input type="checkbox" id="wfRestOfSiteBlocked" name="wfRestOfSiteBlocked" value="1" <?php if(wfConfig::get('cbl_restOfSiteBlocked')){ echo 'checked'; } ?>></div>
64
+ <span class="wf-help-block">If you use Google Adwords, this is not recommended. <a href="https://docs.wordfence.com/en/Country_blocking#Google_Adwords_says_I_can.27t_block_countries._How_do_I_work_around_that.3F" target="_blank">Learn More</a></span>
65
+ </div>
66
+ </div>
67
+ </div>
68
+
69
+ <h3>Advanced Country Blocking Options</h3>
70
+ <div class="wf-form wf-form-horizontal wf-add-top wf-add-bottom">
71
+ <div class="wf-form-group">
72
+ <label for="wfBypassRedirURL" class="wf-col-sm-2 wf-control-label">Bypass Redirect</label>
73
+ <div class="wf-col-sm-6">
74
+ <span class="wf-help-block">If user hits the URL</span>
75
+ <input type="text" id="wfBypassRedirURL" name="wfBypassRedirURL" class="wf-form-control" value="<?php echo esc_attr(wfConfig::get('cbl_bypassRedirURL'), array()); ?>">
76
+ <span class="wf-help-block">then redirect that user to</span>
77
+ <input type="text" id="wfBypassRedirDest" name="wfBypassRedirDest" class="wf-form-control" value="<?php echo esc_attr(wfConfig::get('cbl_bypassRedirDest'), array()); ?>">
78
+ <span class="wf-help-block">and set a cookie that will bypass all country blocking.</span>
79
+ </div>
80
+ </div>
81
+ <div class="wf-form-group">
82
+ <label for="wfBypassViewURL" class="wf-col-sm-2 wf-control-label">Bypass Cookie</label>
83
+ <div class="wf-col-sm-6">
84
+ <span class="wf-help-block">If user who is allowed to access the site views the URL</span>
85
+ <input type="text" id="wfBypassViewURL" name="wfBypassViewURL" class="wf-form-control" value="<?php echo esc_attr(wfConfig::get('cbl_bypassViewURL', ""), array()); ?>">
86
+ <span class="wf-help-block">then set a cookie that will bypass country blocking in future in case that user hits the site from a blocked country.</span>
87
+ </div>
88
+ </div>
89
  </div>
90
+
91
+ <h3>Select which countries to block</h3>
92
+ <div class="wf-add-bottom"><button type="button" class="wf-btn wf-btn-primary wf-countries-shortcut" data-shortcut="select">Block All</button> <button type="button" class="wf-btn wf-btn-default wf-countries-shortcut" data-shortcut="deselect">Unblock All</button></div>
93
+ <?php
94
+ asort($wfBulkCountries);
95
+ $letters = '';
96
+ foreach ($wfBulkCountries as $name) {
97
+ $l = strtoupper(substr($name, 0, 1));
98
+ $test = strtoupper(substr($letters, -1));
99
+ if ($l != $test) {
100
+ $letters .= $l;
101
+ }
102
+ }
103
+ $letters = str_split($letters);
104
+ ?>
105
+ <?php
106
+ $current = '';
107
+ foreach ($wfBulkCountries as $code => $name) {
108
+ $test = strtoupper(substr($name, 0, 1));
109
+ if ($test != $current) {
110
+ if ($current != '') {
111
+ echo '</ul>';
112
+ }
113
+ $current = $test;
114
+ ?>
115
+ <div class="wf-blocked-countries-section wf-add-top wf-add-bottom-small">
116
+ <div class="wf-blocked-countries-section-title" data-letter="<?php echo $current; ?>"><?php echo $current; ?></div>
117
+ <div class="wf-blocked-countries-section-spacer wf-hidden-xs"></div>
118
+ <ul class="wf-blocked-countries-section-options wf-hidden-xs">
119
+ <?php
120
+ foreach ($letters as $l) {
121
+ echo "<li><a href='#' data-letter='{$l}'" . ($l == $current ? " class='active-section'" : '') . ">{$l}</a></li>";
122
+ }
123
+ ?>
124
+ </ul>
125
+ </div>
126
+ <ul class="wf-blocked-countries">
127
+ <?php
128
+ }
129
+
130
+ echo '<li id="wfCountryCheckbox_' . esc_attr($code) . '" data-country="' . esc_attr($code) . '"><a href="#">' . esc_html($name) . '</a></li>';
131
+ }
132
+
133
+ if ($current != '') {
134
+ echo '</ul>';
135
+ }
136
+ ?>
137
+
138
+ <p>
139
+ <input type="button" name="but4" class="wf-btn wf-btn-primary" value="Save blocking options and country list" onclick="WFAD.saveCountryBlocking();"><br>
140
+ <div class="wfAjax24"></div><span class="wfSavedMsg">&nbsp;Your changes have been saved!</span>
141
+ </p>
142
+
143
  <span style="font-size: 10px;">Note that we use an IP to country database that is 99.5% accurate to identify which country a visitor is from.</span>
144
  </div>
145
  <script type="text/javascript">
151
  <?php
152
  }
153
  ?>
154
+
155
+ (function($) {
156
+ function WFScanScheduleSave() {
157
+ var schedMode = $('.wf-card.active').data('mode');
158
+
159
+ var schedule = [];
160
+ $('.schedule-day').each(function() {
161
+ var hours = [];
162
+ $(this).find('.time').each(function() {
163
+ hours[$(this).data('hour')] = $(this).hasClass('active') ? '1' : '0';
164
+ });
165
+ schedule[$(this).data('day')] = hours.join(',');
166
+ });
167
+ var schedTxt = schedule.join('|');
168
+
169
+ $('.wf-card-subtitle').html('');
170
+ $('.wf-card.active .wf-card-subtitle').html('Updating scan schedule...');
171
+
172
+ WFAD.ajax('wordfence_saveScanSchedule', {
173
+ schedMode: schedMode,
174
+ schedTxt: schedTxt
175
+ }, function(res) {
176
+ if (res.ok) {
177
+ $('.wf-card.active .wf-card-subtitle').html(res.nextStart);
178
+ }
179
+ });
180
+ }
181
+
182
+ $('.wf-blocked-countries a').on('click', function(e) {
183
+ e.preventDefault();
184
+ e.stopPropagation();
185
+
186
+ var selected = $(this).closest('li').hasClass('active');
187
+ if (selected) {
188
+ $(this).closest('li').removeClass('active');
189
+ }
190
+ else {
191
+ $(this).closest('li').addClass('active');
192
+ }
193
+
194
+ //WFScanScheduleSave();
195
+ });
196
+
197
+ $('.wf-blocked-countries li').on('click', function(e) {
198
+ e.preventDefault();
199
+ e.stopPropagation();
200
+
201
+ var selected = $(this).hasClass('active');
202
+ if (selected) {
203
+ $(this).removeClass('active');
204
+ }
205
+ else {
206
+ $(this).addClass('active');
207
+ }
208
+
209
+ //WFScanScheduleSave();
210
+ });
211
+
212
+ $('.wf-countries-shortcut').on('click', function(e) {
213
+ e.preventDefault();
214
+ e.stopPropagation();
215
+
216
+ var mode = $(this).data('shortcut');
217
+ if (mode == 'select') {
218
+ $('.wf-blocked-countries li').addClass('active');
219
+ } else if (mode == 'deselect') {
220
+ $('.wf-blocked-countries li').removeClass('active');
221
+ }
222
+
223
+ //WFScanScheduleSave();
224
+ });
225
+
226
+ $('.wf-blocked-countries-section-options a').on('click', function(e) {
227
+ e.preventDefault();
228
+ e.stopPropagation();
229
+
230
+ var letter = $(this).data('letter');
231
+ $('html, body').animate({
232
+ scrollTop: $('.wf-blocked-countries-section-title[data-letter=' + letter + ']').offset().top - 100
233
+ }, 1000);
234
+ });
235
+ })(jQuery);
236
  </script>
237
  <script type="text/x-jquery-template" id="wfWelcomeContentCntBlk">
238
  <div>
lib/menu_dashboard.php CHANGED
@@ -52,24 +52,22 @@ $d = new wfDashboard();
52
  </div>
53
  <div class="wf-dashboard-item-extra">
54
  <ul class="wf-dashboard-item-list">
55
- <?php for ($g = 0; $g < ceil(count($d->features) / 5); $g++): ?>
56
  <li>
57
- <ul class="wf-dashboard-item-list wf-dashboard-item-list-horizontal">
58
- <?php for ($f = $g * 5; $f < min(($g + 1) * 5, count($d->features)); $f++): ?>
59
  <li>
60
- <div class="wf-dashboard-item-list-title"><a href="<?php echo esc_html($d->features[$f]['link']); ?>"><?php echo esc_html($d->features[$f]['name']); ?></a></div>
61
- <?php if ($d->features[$f]['state'] == wfDashboard::FEATURE_ENABLED): ?>
62
- <div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-enabled"><i class="fa fa-circle" aria-hidden="true"></i> Enabled</div>
63
- <?php elseif ($d->features[$f]['state'] == wfDashboard::FEATURE_DISABLED): ?>
64
- <div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-disabled"><i class="fa fa-circle" aria-hidden="true"></i> Disabled</div>
65
- <?php elseif ($d->features[$f]['state'] == wfDashboard::FEATURE_PREMIUM): ?>
66
- <div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-premium"><i class="fa fa-circle" aria-hidden="true"></i> Premium</div>
67
  <?php endif; ?>
68
  </li>
69
- <?php endfor; ?>
70
  </ul>
71
  </li>
72
- <?php endfor; ?>
73
  </ul>
74
  </div>
75
  </div>
52
  </div>
53
  <div class="wf-dashboard-item-extra">
54
  <ul class="wf-dashboard-item-list">
 
55
  <li>
56
+ <ul class="wf-dashboard-item-list wf-dashboard-item-list-horizontal wf-dashboard-item-list-equal">
57
+ <?php foreach ($d->features as $f): ?>
58
  <li>
59
+ <div class="wf-dashboard-item-list-title"><a href="<?php echo esc_html($f['link']); ?>"><?php echo esc_html($f['name']); ?></a></div>
60
+ <?php if ($f['state'] == wfDashboard::FEATURE_ENABLED): ?>
61
+ <div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-enabled"><i class="fa fa-circle" aria-hidden="true"></i><span class="wf-hidden-lg"><br></span> Enabled</div>
62
+ <?php elseif ($f['state'] == wfDashboard::FEATURE_DISABLED): ?>
63
+ <div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-disabled"><i class="fa fa-circle" aria-hidden="true"></i><span class="wf-hidden-lg"><br></span> Disabled</div>
64
+ <?php elseif ($f['state'] == wfDashboard::FEATURE_PREMIUM): ?>
65
+ <div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-premium"><i class="fa fa-circle" aria-hidden="true"></i><span class="wf-hidden-lg"><br></span> Premium</div>
66
  <?php endif; ?>
67
  </li>
68
+ <?php endforeach; ?>
69
  </ul>
70
  </li>
 
71
  </ul>
72
  </div>
73
  </div>
lib/menu_firewall_waf.php CHANGED
@@ -93,7 +93,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
93
  <div class="wf-col-sm-7 wf-col-md-5">
94
  <?php if (!WFWAF_AUTO_PREPEND): ?>
95
  <p class="wf-form-control-static wf-notice-text">Basic WordPress Protection</p>
96
- <p class="wf-form-control-static"><a class="wf-btn wf-btn-primary wf-btn-callout" href="<?php echo $wafConfigURL ?>">Optimize the Wordfence Firewall</a></p>
97
  <?php else: ?>
98
  <p class="wf-form-control-static wf-success-text">Extended Protection</p>
99
  <?php endif ?>
@@ -224,8 +224,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
224
  </div>
225
  <br>
226
 
227
- </div>
228
- <br>
229
 
230
  <h2>Advanced Configuration</h2>
231
  <div id="waf-advanced-options" class="wf-form-horizontal">
@@ -236,6 +235,9 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
236
  <div class="wf-col-xs-12">
237
  <label class="wf-checkbox-inline"><input type="checkbox" id="waf-disable-ip-blocking" name="waf-disable-ip-blocking" value="1"<?php echo $config->getConfig('disableWAFIPBlocking') ? ' checked' : ''; ?>>Delay IP and Country blocking until after WordPress and plugins have loaded (only process firewall rules early) <a href="https://docs.wordfence.com/en/WAF#Advanced_Configuration" target="_blank" class="wfhelp"></a></label>
238
  </div>
 
 
 
239
  </div>
240
  </div>
241
 
@@ -306,117 +308,119 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
306
  $bulkActionForm = ob_get_clean();
307
  echo $bulkActionForm;
308
  ?>
309
- <table class="wf-striped-table whitelist-table">
310
- <thead>
311
- <tr>
312
- <th style="width: 2%;text-align: center"><input type="checkbox" class="wf-whitelist-table-bulk-action"></th>
313
- <th style="width: 5%;">Enabled</th>
314
- <th>URL</th>
315
- <th>Param</th>
316
- <th>Created</th>
317
- <th>Source</th>
318
- <th>User</th>
319
- <th>IP</th>
320
- <th>Action</th>
321
- </tr>
322
- </thead>
323
- {{if whitelistedURLParams.length > 5}}
324
- <tfoot>
325
- <tr>
326
- <th><input type="checkbox" class="wf-whitelist-table-bulk-action"></th>
327
- <th style="width: 5%;">Enabled</th>
328
- <th>URL</th>
329
- <th>Param</th>
330
- <th>Created</th>
331
- <th>Source</th>
332
- <th>User</th>
333
- <th>IP</th>
334
- <th>Action</th>
335
- </tr>
336
- {{/if}}
337
- </tfoot>
338
- <tbody>
339
- <tr class="wf-table-filters">
340
- <td colspan="2"></td>
341
- <td><input data-column-index="2" placeholder="Filter URL" type="text"></td>
342
- <td><input data-column-index="3" placeholder="Filter Param" type="text"></td>
343
- <td><input data-column-index="4" placeholder="Filter Created" type="text"></td>
344
- <td><input data-column-index="5" placeholder="Filter Source" type="text"></td>
345
- <td><input style="max-width:100px;" data-column-index="6" placeholder="Filter User" type="text"></td>
346
- <td><input style="max-width:100px;" data-column-index="7" placeholder="Filter IP" type="text"></td>
347
- <td></td>
348
- </tr>
349
- {{each(idx, whitelistedURLParam) whitelistedURLParams}}
350
- <tr data-index="${idx}">
351
- <td style="text-align: center;"><input type="checkbox" class="wf-whitelist-table-bulk-checkbox"></td>
352
- <td style="text-align: center;">
353
- <input name="replaceWhitelistedEnabled" type="hidden" value="${whitelistedURLParam.data.disabled}">
354
- <input name="whitelistedEnabled" type="checkbox" value="1"
355
- {{if (!whitelistedURLParam.data.disabled)}} checked{{/if}}>
356
- </td>
357
- <td>
358
- <input name="replaceWhitelistedPath" type="hidden" value="${whitelistedURLParam.path}">
359
- <span class="whitelist-display">${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.path))}</span>
360
- <input name="whitelistedPath" class="whitelist-edit whitelist-path" type="text"
361
- value="${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.path))}">
362
- </td>
363
- <td>
364
- <input name="replaceWhitelistedParam" type="hidden" value="${whitelistedURLParam.paramKey}">
365
- <span class="whitelist-display">${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.paramKey))}</span>
366
- <input name="whitelistedParam" class="whitelist-edit whitelist-param-key"
367
- type="text" value="${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.paramKey))}">
368
- </td>
369
- <td>
370
- {{if (whitelistedURLParam.data.timestamp)}}
371
- ${WFAD.dateFormat((new Date(whitelistedURLParam.data.timestamp * 1000)))}
372
- {{else}}
373
- -
374
- {{/if}}
375
- </td>
376
- <td>
377
- {{if (whitelistedURLParam.data.description)}}
378
- ${whitelistedURLParam.data.description}
379
- {{else}}
380
- -
381
- {{/if}}
382
- </td>
383
- <td>
384
- {{if (whitelistedURLParam.data.userID)}}
385
- {{if (whitelistedURLParam.data.username)}}
386
- ${whitelistedURLParam.data.username}
387
- {{else}}
388
- ${whitelistedURLParam.data.userID}
389
- {{/if}}
390
- {{else}}
391
- -
392
- {{/if}}
393
- </td>
394
- <td>
395
- {{if (whitelistedURLParam.data.ip)}}
396
- ${whitelistedURLParam.data.ip}
397
- {{else}}
398
- -
399
- {{/if}}
400
- </td>
401
- <td>
402
- <span class="whitelist-display" style="white-space: nowrap">
403
- <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-edit">Edit</button>
404
- <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-delete">Delete</button>
405
- </span>
406
- <span class="whitelist-edit" style="white-space: nowrap">
407
- <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-save">Save</button>
408
- <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-cancel">Cancel</button>
409
- </span>
410
- </td>
411
- </tr>
412
- {{/each}}
413
- {{if (whitelistedURLParams.length == 0)}}
414
- <tr>
415
- <td colspan="9">No whitelisted URLs currently set.</td>
416
- </tr>
417
- {{/if}}
418
- </tbody>
419
- </table>
 
 
420
  <?php echo $bulkActionForm ?>
421
 
422
  </script>
@@ -440,7 +444,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
440
  whitelistedPath: url,
441
  whitelistedParam: param + '[' + paramName + ']'
442
  }, function() {
443
- WFAD.colorbox('400px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
444
  'whitelist was saved successfully.');
445
  }, false);
446
  }
@@ -541,12 +545,12 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
541
  var select = $(this).find('select[name=wf-bulk-action]');
542
  var bulkActionCallback = function(res) {
543
  if (typeof res === 'object' && res.success) {
544
- WFAD.colorbox('400px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
545
  'whitelist was saved successfully.');
546
  WFAD.wafData = res.data;
547
  WFAD.wafConfigPageRender();
548
  } else {
549
- WFAD.colorbox('400px', 'Error saving Firewall configuration', 'There was an error saving the ' +
550
  'Web Application Firewall whitelist.');
551
  }
552
  };
@@ -653,7 +657,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
653
  deletedWhitelistedPath: path,
654
  deletedWhitelistedParam: param
655
  }, function() {
656
- WFAD.colorbox('400px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
657
  'whitelist was saved successfully.');
658
  }, false);
659
  }
@@ -678,7 +682,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
678
  newWhitelistedParam: newWhitelistedParam.val(),
679
  newWhitelistedEnabled: newWhitelistedEnabled.val()
680
  }, function() {
681
- WFAD.colorbox('400px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
682
  'whitelist was saved successfully.');
683
  }, false);
684
  });
@@ -698,7 +702,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
698
  whitelistedParam: oldWhitelistedParam.val(),
699
  whitelistedEnabled: enabled
700
  }, function() {
701
- WFAD.colorbox('400px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
702
  'whitelist was saved successfully.');
703
  }, false);
704
  });
@@ -726,6 +730,11 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
726
  var disabled = this.checked ? 1 : 0;
727
  WFAD.updateConfig('disableWAFIPBlocking', disabled);
728
  })
 
 
 
 
 
729
  })(jQuery);
730
  </script>
731
 
93
  <div class="wf-col-sm-7 wf-col-md-5">
94
  <?php if (!WFWAF_AUTO_PREPEND): ?>
95
  <p class="wf-form-control-static wf-notice-text">Basic WordPress Protection</p>
96
+ <p class="wf-form-control-static"><a class="wf-btn wf-btn-primary" href="<?php echo $wafConfigURL ?>">Optimize the Wordfence Firewall</a></p>
97
  <?php else: ?>
98
  <p class="wf-form-control-static wf-success-text">Extended Protection</p>
99
  <?php endif ?>
224
  </div>
225
  <br>
226
 
227
+ </div>
 
228
 
229
  <h2>Advanced Configuration</h2>
230
  <div id="waf-advanced-options" class="wf-form-horizontal">
235
  <div class="wf-col-xs-12">
236
  <label class="wf-checkbox-inline"><input type="checkbox" id="waf-disable-ip-blocking" name="waf-disable-ip-blocking" value="1"<?php echo $config->getConfig('disableWAFIPBlocking') ? ' checked' : ''; ?>>Delay IP and Country blocking until after WordPress and plugins have loaded (only process firewall rules early) <a href="https://docs.wordfence.com/en/WAF#Advanced_Configuration" target="_blank" class="wfhelp"></a></label>
237
  </div>
238
+ <div class="wf-col-xs-12">
239
+ <label class="wf-checkbox-inline"><input type="checkbox" id="waf-disable-blacklist-blocking" name="waf-disable-blacklist-blocking" value="1"<?php echo !$config->getConfig('disableWAFBlacklistBlocking') ? ' checked' : ''; ?>>Preemptively block malicious IP addresses <span style="color: #F00;">Premium Feature</span> <a href="https://docs.wordfence.com/en/WAF#Advanced_Configuration" target="_blank" class="wfhelp"></a></label>
240
+ </div>
241
  </div>
242
  </div>
243
 
308
  $bulkActionForm = ob_get_clean();
309
  echo $bulkActionForm;
310
  ?>
311
+ <div class="whitelist-table-container">
312
+ <table class="wf-striped-table whitelist-table">
313
+ <thead>
314
+ <tr>
315
+ <th style="width: 2%;text-align: center"><input type="checkbox" class="wf-whitelist-table-bulk-action"></th>
316
+ <th style="width: 5%;">Enabled</th>
317
+ <th>URL</th>
318
+ <th>Param</th>
319
+ <th>Created</th>
320
+ <th>Source</th>
321
+ <th>User</th>
322
+ <th>IP</th>
323
+ <th>Action</th>
324
+ </tr>
325
+ </thead>
326
+ {{if whitelistedURLParams.length > 5}}
327
+ <tfoot>
328
+ <tr>
329
+ <th><input type="checkbox" class="wf-whitelist-table-bulk-action"></th>
330
+ <th style="width: 5%;">Enabled</th>
331
+ <th>URL</th>
332
+ <th>Param</th>
333
+ <th>Created</th>
334
+ <th>Source</th>
335
+ <th>User</th>
336
+ <th>IP</th>
337
+ <th>Action</th>
338
+ </tr>
339
+ {{/if}}
340
+ </tfoot>
341
+ <tbody>
342
+ <tr class="wf-table-filters">
343
+ <td colspan="2"></td>
344
+ <td><input data-column-index="2" placeholder="Filter URL" type="text"></td>
345
+ <td><input data-column-index="3" placeholder="Filter Param" type="text"></td>
346
+ <td><input data-column-index="4" placeholder="Filter Created" type="text"></td>
347
+ <td><input data-column-index="5" placeholder="Filter Source" type="text"></td>
348
+ <td><input style="max-width:100px;" data-column-index="6" placeholder="Filter User" type="text"></td>
349
+ <td><input style="max-width:100px;" data-column-index="7" placeholder="Filter IP" type="text"></td>
350
+ <td></td>
351
+ </tr>
352
+ {{each(idx, whitelistedURLParam) whitelistedURLParams}}
353
+ <tr data-index="${idx}">
354
+ <td style="text-align: center;"><input type="checkbox" class="wf-whitelist-table-bulk-checkbox"></td>
355
+ <td style="text-align: center;">
356
+ <input name="replaceWhitelistedEnabled" type="hidden" value="${whitelistedURLParam.data.disabled}">
357
+ <input name="whitelistedEnabled" type="checkbox" value="1"
358
+ {{if (!whitelistedURLParam.data.disabled)}} checked{{/if}}>
359
+ </td>
360
+ <td>
361
+ <input name="replaceWhitelistedPath" type="hidden" value="${whitelistedURLParam.path}">
362
+ <span class="whitelist-display">${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.path))}</span>
363
+ <input name="whitelistedPath" class="whitelist-edit whitelist-path" type="text"
364
+ value="${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.path))}">
365
+ </td>
366
+ <td>
367
+ <input name="replaceWhitelistedParam" type="hidden" value="${whitelistedURLParam.paramKey}">
368
+ <span class="whitelist-display">${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.paramKey))}</span>
369
+ <input name="whitelistedParam" class="whitelist-edit whitelist-param-key"
370
+ type="text" value="${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.paramKey))}">
371
+ </td>
372
+ <td>
373
+ {{if (whitelistedURLParam.data.timestamp)}}
374
+ ${WFAD.dateFormat((new Date(whitelistedURLParam.data.timestamp * 1000)))}
375
+ {{else}}
376
+ -
377
+ {{/if}}
378
+ </td>
379
+ <td>
380
+ {{if (whitelistedURLParam.data.description)}}
381
+ ${whitelistedURLParam.data.description}
382
+ {{else}}
383
+ -
384
+ {{/if}}
385
+ </td>
386
+ <td>
387
+ {{if (whitelistedURLParam.data.userID)}}
388
+ {{if (whitelistedURLParam.data.username)}}
389
+ ${whitelistedURLParam.data.username}
390
+ {{else}}
391
+ ${whitelistedURLParam.data.userID}
392
+ {{/if}}
393
+ {{else}}
394
+ -
395
+ {{/if}}
396
+ </td>
397
+ <td>
398
+ {{if (whitelistedURLParam.data.ip)}}
399
+ ${whitelistedURLParam.data.ip}
400
+ {{else}}
401
+ -
402
+ {{/if}}
403
+ </td>
404
+ <td>
405
+ <span class="whitelist-display" style="white-space: nowrap">
406
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-edit">Edit</button>
407
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-delete">Delete</button>
408
+ </span>
409
+ <span class="whitelist-edit" style="white-space: nowrap">
410
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-save">Save</button>
411
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-cancel">Cancel</button>
412
+ </span>
413
+ </td>
414
+ </tr>
415
+ {{/each}}
416
+ {{if (whitelistedURLParams.length == 0)}}
417
+ <tr>
418
+ <td colspan="9">No whitelisted URLs currently set.</td>
419
+ </tr>
420
+ {{/if}}
421
+ </tbody>
422
+ </table>
423
+ </div>
424
  <?php echo $bulkActionForm ?>
425
 
426
  </script>
444
  whitelistedPath: url,
445
  whitelistedParam: param + '[' + paramName + ']'
446
  }, function() {
447
+ WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
448
  'whitelist was saved successfully.');
449
  }, false);
450
  }
545
  var select = $(this).find('select[name=wf-bulk-action]');
546
  var bulkActionCallback = function(res) {
547
  if (typeof res === 'object' && res.success) {
548
+ WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
549
  'whitelist was saved successfully.');
550
  WFAD.wafData = res.data;
551
  WFAD.wafConfigPageRender();
552
  } else {
553
+ WFAD.colorbox('300px', 'Error saving Firewall configuration', 'There was an error saving the ' +
554
  'Web Application Firewall whitelist.');
555
  }
556
  };
657
  deletedWhitelistedPath: path,
658
  deletedWhitelistedParam: param
659
  }, function() {
660
+ WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
661
  'whitelist was saved successfully.');
662
  }, false);
663
  }
682
  newWhitelistedParam: newWhitelistedParam.val(),
683
  newWhitelistedEnabled: newWhitelistedEnabled.val()
684
  }, function() {
685
+ WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
686
  'whitelist was saved successfully.');
687
  }, false);
688
  });
702
  whitelistedParam: oldWhitelistedParam.val(),
703
  whitelistedEnabled: enabled
704
  }, function() {
705
+ WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
706
  'whitelist was saved successfully.');
707
  }, false);
708
  });
730
  var disabled = this.checked ? 1 : 0;
731
  WFAD.updateConfig('disableWAFIPBlocking', disabled);
732
  })
733
+
734
+ $('#waf-disable-blacklist-blocking').on('click', function() {
735
+ var disabled = this.checked ? 0 : 1;
736
+ WFAD.wafConfigSave('disableWAFBlacklistBlocking', {disableWAFBlacklistBlocking: disabled});
737
+ })
738
  })(jQuery);
739
  </script>
740
 
lib/menu_scan.php CHANGED
@@ -76,27 +76,35 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
76
  {{html longMsg}}
77
  </p>
78
  <div class="wfIssueOptions">
79
- <strong>Tools:</strong>
80
- {{if data.fileExists}}
81
- <a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file</a>
82
- {{/if}}
83
- <a href="#" onclick="WFAD.hideFile('${id}', 'delete'); return false;">Hide this file in <em>.htaccess</em></a>
 
 
 
 
 
84
  {{if data.canDelete}}
85
- <a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone).</a>
86
  <p>
87
  <label><input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete</label>
88
  </p>
89
  {{/if}}
90
  </div>
91
  <div class="wfIssueOptions">
92
- {{if status == 'new'}}
93
- <strong>Resolve:</strong>
94
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
95
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
96
- {{/if}}
97
- {{if status == 'ignoreC' || status == 'ignoreP'}}
98
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
99
- {{/if}}
 
 
 
 
100
  </div>
101
  </div>
102
  </div>
@@ -125,13 +133,17 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
125
  {{html longMsg}}
126
  </p>
127
  <div class="wfIssueOptions">
128
- <strong>Tools:</strong>
129
- {{if data.fileExists}}
130
- <a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file</a>
131
- {{/if}}
132
- <a href="#" onclick="WFAD.hideFile('${id}', 'delete'); return false;">Hide this file in <em>.htaccess</em></a>
 
 
 
 
 
133
  {{if data.canDelete}}
134
- <a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone).</a>
135
  <p>
136
  <label><input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete</label>
137
  </p>
@@ -139,12 +151,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
139
  </div>
140
  <div class="wfIssueOptions">
141
  {{if status == 'new'}}
142
- <strong>Resolve:</strong>
143
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
144
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
 
 
145
  {{/if}}
146
  {{if status == 'ignoreC' || status == 'ignoreP'}}
147
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
 
 
148
  {{/if}}
149
  </div>
150
  </div>
@@ -169,25 +185,27 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
169
  </p>
170
  <div class="wfIssueOptions">
171
  {{if (status == 'new')}}
172
- <strong>Resolve:</strong>
 
173
  <?php if (!wfUtils::isNginx()): ?>
174
- <a href="#" onclick="WFAD.fixFPD('${id}'); return false;">Fix this issue</a>
175
  <?php endif ?>
176
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
177
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
178
  {{/if}}
179
  {{if status == 'ignoreC' || status == 'ignoreP'}}
180
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
181
  {{/if}}
 
182
  </div>
183
  {{if (status == 'new')}}
184
  <div class="wfIssueOptions">
185
- <strong style="width: auto;">Manual Fix:</strong>
186
- &nbsp;
187
- Set <code>display_errors</code> to <code>Off</code> in your php.ini file.
 
188
  </div>
189
  {{/if}}
190
-
191
  </div>
192
  </div>
193
  </script>
@@ -211,23 +229,28 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
211
 
212
  <div class="wfIssueOptions">
213
  {{if (status == 'new')}}
214
- <strong>Resolve:</strong>
 
215
  <?php if (!wfUtils::isNginx()): ?>
216
- <a href="#" onclick="WFAD.disableDirectoryListing('${id}'); return false;">Fix this issue</a>
217
  <?php endif ?>
218
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
219
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
 
220
  {{/if}}
221
  {{if status == 'ignoreC' || status == 'ignoreP'}}
222
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
 
 
223
  {{/if}}
224
  </div>
225
  <?php if (!wfUtils::isNginx()): ?>
226
  {{if (status == 'new')}}
227
  <div class="wfIssueOptions">
228
- <strong style="width: auto;">Manual Fix:</strong>
229
- &nbsp;
230
- Add <code>Options -Indexes</code> to your .htaccess file.
 
231
  </div>
232
  {{/if}}
233
  <?php endif ?>
@@ -241,10 +264,10 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
241
  <h2>${shortMsg}</h2>
242
  <p>
243
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
244
- <tr><th>Theme Name:</th><td>${data.name}</td></tr>
245
- <tr><th>Current Theme Version:</th><td>${data.version}</td></tr>
246
- <tr><th>New Theme Version:</th><td>${data.newVersion}</td></tr>
247
- <tr><th>Theme URL:</th><td><a href="${data.URL}" target="_blank">${data.URL}</a></td></tr>
248
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
249
  <tr><th>Status</th><td>
250
  {{if status == 'new' }}New{{/if}}
@@ -258,13 +281,17 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
258
  <a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
259
  </p>
260
  <div class="wfIssueOptions">
261
- {{if (status == 'new')}}
262
- <strong>Resolve:</strong>
263
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
264
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
 
 
265
  {{/if}}
266
  {{if status == 'ignoreC' || status == 'ignoreP'}}
267
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
 
 
268
  {{/if}}
269
  </div>
270
  </div>
@@ -277,11 +304,11 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
277
  <h2>${shortMsg}</h2>
278
  <p>
279
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
280
- <tr><th>Plugin Name:</th><td>${data.Name}</td></tr>
281
- {{if data.PluginURI}}<tr><th>Plugin Website:</th><td><a href="${data.PluginURI}" target="_blank">${data.PluginURI}</a></td></tr>{{/if}}
282
- <tr><th>Changelog:</th><td><a href="${data.wpURL}/changelog" target="_blank">${data.wpURL}/changelog</a></td></tr>
283
- <tr><th>Current Plugin Version:</th><td>${data.Version}</td></tr>
284
- <tr><th>New Plugin Version:</th><td>${data.newVersion}</td></tr>
285
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
286
  <tr><th>Status</th><td>
287
  {{if status == 'new' }}New{{/if}}
@@ -296,12 +323,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
296
  </p>
297
  <div class="wfIssueOptions">
298
  {{if status == 'new'}}
299
- <strong>Resolve:</strong>
300
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
301
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
 
 
302
  {{/if}}
303
  {{if status == 'ignoreC' || status == 'ignoreP'}}
304
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
 
 
305
  {{/if}}
306
  </div>
307
  </div>
@@ -314,8 +345,8 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
314
  <h2>${shortMsg}</h2>
315
  <p>
316
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
317
- <tr><th>Current WordPress Version:</th><td>${data.currentVersion}</td></tr>
318
- <tr><th>New WordPress Version:</th><td>${data.newVersion}</td></tr>
319
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
320
  <tr><th>Status</th><td>
321
  {{if status == 'new' }}New{{/if}}
@@ -328,15 +359,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
328
  <a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
329
  </p>
330
  <div class="wfIssueOptions">
331
- {{if (status == 'new')}}
332
- <strong>Resolve:</strong>
333
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
334
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
335
- {{/if}}
336
- {{if status == 'ignoreC' || status == 'ignoreP'}}
337
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
338
- {{/if}}
339
- </div>
 
 
 
 
340
  </div>
341
  </script>
342
 
@@ -346,8 +381,8 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
346
  <h2>${shortMsg}</h2>
347
  <p>
348
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
349
- <tr><th>Old DNS records:</th><td>${data.oldDNS}</td></tr>
350
- <tr><th>New DNS records:</th><td>${data.newDNS}</td></tr>
351
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
352
  <tr><th>Status</th><td>
353
  {{if status == 'new' }}New{{/if}}
@@ -367,40 +402,6 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
367
  </div>
368
  </div>
369
  </script>
370
- <script type="text/x-jquery-template" id="issueTmpl_badOption">
371
- <div>
372
- <div class="wfIssue">
373
- <h2>${shortMsg}</h2>
374
- <p>
375
- <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
376
- <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
377
- {{if data.isMultisite}}
378
- <tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
379
- <tr><th>Multisite Blog Domain:</th><td>${data.domain}</td></tr>
380
- <tr><th>Multisite Blog Path:</th><td>${data.path}</td></tr>
381
- {{/if}}
382
- <tr><th>Status</th><td>
383
- {{if status == 'new' }}New{{/if}}
384
- {{if status == 'ignoreP' || status == 'ignoreC' }}Ignoring all alerts related to this option{{/if}}
385
- </td></tr>
386
- </table>
387
- </p>
388
- <p>
389
- {{html longMsg}}
390
- </p>
391
- <div class="wfIssueOptions">
392
- {{if (status == 'new')}}
393
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
394
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore issues related to this option</a>
395
- {{/if}}
396
- {{if status == 'ignoreP' || status == 'ignoreC'}}
397
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring issues related to this option</a>
398
- {{/if}}
399
- </div>
400
- </div>
401
- </div>
402
- </script>
403
-
404
 
405
  <script type="text/x-jquery-template" id="issueTmpl_diskSpace">
406
  <div>
@@ -420,13 +421,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
420
  {{html longMsg}}
421
  </p>
422
  <div class="wfIssueOptions">
423
- {{if (status == 'new')}}
424
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
425
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore disk space alerts</a>
426
- {{/if}}
427
- {{if status == 'ignoreP' || status == 'ignoreC'}}
428
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring disk space alerts</a>
429
- {{/if}}
 
 
 
 
 
430
  </div>
431
  </div>
432
  </div>
@@ -438,15 +444,15 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
438
  <h2>${shortMsg}</h2>
439
  <p>
440
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
441
- <tr><th>Issue first detected:</th><td>${timeAgo} ago.</td></tr>
442
- <tr><th>Login name:</th><td>${data.user_login}</td></tr>
443
- <tr><th>User email:</th><td>${data.user_email}</td></tr>
444
- <tr><th>Full name:</th><td>${data.first_name} ${data.last_name}</td></tr>
445
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
446
  <tr><th>Status</th><td>
447
  {{if status == 'new' }}New{{/if}}
448
  {{if status == 'ignoreC' }}Ignored until user changes password{{/if}}
449
- {{if status == 'ignoreP' }}Ignoring this user's weak passwords{{/if}}
450
  </td></tr>
451
  </table>
452
  </p>
@@ -454,19 +460,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
454
  {{html longMsg}}
455
  </p>
456
  <div class="wfIssueOptions">
457
- <strong>Tools:</strong>
458
- <a target="_blank" href="${data.editUserLink}">Edit this user</a>
 
 
459
  </div>
460
  <div class="wfIssueOptions">
461
- {{if status == 'new'}}
462
- <strong>Resolve:</strong>
463
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
464
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this weak password</a>
465
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all this user's weak passwords</a>
466
- {{/if}}
467
- {{if status == 'ignoreC' || status == 'ignoreP'}}
468
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
469
- {{/if}}
 
 
 
 
470
  </div>
471
  </div>
472
  </div>
@@ -479,7 +491,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
479
  <p>
480
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
481
  <tr><th>Author</th><td>${data.author}</td></tr>
482
- <tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
483
  <tr><th>Posted on:</th><td>${data.commentDate}</td></tr>
484
  {{if data.isMultisite}}
485
  <tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
@@ -497,19 +509,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
497
  {{html longMsg}}
498
  </p>
499
  <div class="WfIssueOptions">
500
- <strong>Tools:</strong>
501
- <a target="_blank" href="${data.editCommentLink}">Edit this ${data.type}</a>
 
 
502
  </div>
503
  <div class="wfIssueOptions">
504
- {{if status == 'new'}}
505
- <strong>Resolve:</strong>
506
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
507
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this ${data.type}</a>
508
- {{/if}}
509
- {{if status == 'ignoreC' || status == 'ignoreP'}}
510
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this ${data.type}</a>
511
- {{/if}}
512
- </div>
 
 
 
 
513
  </div>
514
  </script>
515
  <script type="text/x-jquery-template" id="issueTmpl_postBadTitle">
@@ -537,19 +555,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
537
  {{html longMsg}}
538
  </p>
539
  <div class="wfIssueOptions">
540
- <strong>Tools:</strong>
541
- <a target="_blank" href="${data.editPostLink}">Edit this ${data.type}</a>
 
 
542
  </div>
543
  <div class="wfIssueOptions">
544
- {{if status == 'new'}}
545
- <strong>Resolve:</strong>
546
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
547
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this title in this ${data.type}</a>
548
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all dangerous titles in this ${data.type}</a>
549
- {{/if}}
550
- {{if status == 'ignoreP' || status == 'ignoreC'}}
551
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
552
- {{/if}}
 
 
 
 
553
  </div>
554
  </div>
555
  </div>
@@ -566,7 +590,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
566
  {{else}}
567
  <tr><th>Title:</th><td><a href="${data.permalink}" target="_blank">${data.postTitle}</a></td></tr>
568
  {{/if}}
569
- <tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
570
  <tr><th>Posted on:</th><td>${data.postDate}</td></tr>
571
  {{if data.isMultisite}}
572
  <tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
@@ -585,19 +609,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
585
  {{html longMsg}}
586
  </p>
587
  <div class="wfIssueOptions">
588
- <strong>Tools:</strong>
589
- <a target="_blank" href="${data.editPostLink}">Edit this ${data.type}</a>
 
 
590
  </div>
591
  <div class="wfIssueOptions">
592
- {{if status == 'new'}}
593
- <strong>Resolve:</strong>
594
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
595
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this bad URL in this ${data.type}</a>
596
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all bad URL's in this ${data.type}</a>
597
- {{/if}}
598
- {{if status == 'ignoreP' || status == 'ignoreC'}}
599
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
600
- {{/if}}
 
 
 
 
601
  </div>
602
  </div>
603
  </div>
@@ -613,10 +643,10 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
613
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
614
  <tr><th>Filename:</th><td>${data.file}</td></tr>
615
  {{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
616
- <tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
617
  {{/if}}
618
- <tr><th>File type:</th><td>{{if data.cType}}${WFAD.ucfirst(data.cType)}{{else}}Not a core, theme or plugin file.{{/if}}</td></tr>
619
- <tr><th>Issue first detected:</th><td>${timeAgo} ago.</td></tr>
620
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
621
  <tr><th>Status</th><td>
622
  {{if status == 'new' }}New{{/if}}
@@ -629,40 +659,47 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
629
  {{html longMsg}}
630
  </p>
631
  <div class="wfIssueOptions">
632
- <strong>Tools:</strong>
633
- {{if data.fileExists}}
634
- <a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file.</a>
635
- {{/if}}
636
- {{if data.canFix}}
637
- <a href="#" onclick="WFAD.restoreFile('${id}'); return false;">Restore the original version of this file.</a>
638
- {{/if}}
639
- {{if data.canDelete}}
640
- <a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone).</a>
641
- {{/if}}
642
- {{if data.canDiff}}
643
- <a href="${WFAD.makeDiffLink(data)}" target="_blank">See how the file has changed.</a>
644
- {{/if}}
 
 
 
645
  {{if data.canFix}}
646
  <br />&nbsp;<input type="checkbox" class="wfrepairCheckbox" value="${id}" />&nbsp;Select for bulk repair
647
  {{/if}}
648
  {{if data.canDelete}}
649
  <br />&nbsp;<input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete
650
  {{/if}}
 
651
  </div>
652
  <div class="wfIssueOptions">
653
  {{if status == 'new'}}
654
- <strong>Resolve:</strong>
655
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
 
656
  {{if data.fileExists}}
657
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the file changes.</a>
658
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this file.</a>
659
  {{else}}
660
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore missing file</a>
661
  {{/if}}
662
-
663
  {{/if}}
664
  {{if status == 'ignoreC' || status == 'ignoreP'}}
665
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue.</a>
 
 
666
  {{/if}}
667
  </div>
668
  </div>
@@ -675,7 +712,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
675
  <h2>${shortMsg}</h2>
676
  <p>
677
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
678
- <tr><th>Issue first detected:</th><td>${timeAgo} ago.</td></tr>
679
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
680
  <tr><th>Status</th><td>
681
  {{if status == 'new' }}New{{/if}}
@@ -689,12 +726,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
689
  </p>
690
  <div class="wfIssueOptions">
691
  {{if status == 'new'}}
692
- <strong>Resolve:</strong>
693
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the version changes.</a>
694
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this version.</a>
 
 
695
  {{/if}}
696
  {{if status == 'ignoreC' || status == 'ignoreP'}}
697
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue.</a>
 
 
698
  {{/if}}
699
  </div>
700
  </div>
@@ -707,11 +748,11 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
707
  <h2>${shortMsg}</h2>
708
  <p>
709
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
710
- <tr><th>Option Name:</th><td>${data.option_name}</td></tr>
711
  {{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
712
- <tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
713
  {{/if}}
714
- <tr><th>Issue first detected:</th><td>${timeAgo} ago.</td></tr>
715
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
716
  <tr><th>Status</th><td>
717
  {{if status == 'new' }}New{{/if}}
@@ -724,29 +765,35 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
724
  {{html longMsg}}
725
  </p>
726
  <div class="wfIssueOptions">
727
- <strong>Tools:</strong>
728
- {{if data.optionExists}}
729
- <a target="_blank" href="${WFAD.makeViewOptionLink(data.option_name, data.site_id)}">View this option.</a>
730
- {{/if}}
 
 
 
 
 
731
  {{if data.canDelete}}
732
- <a href="#" onclick="WFAD.deleteDatabaseOption('${id}'); return false;">Delete this option from the database (can't be undone).</a>
733
  <br />&nbsp;<input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete
734
  {{/if}}
735
  </div>
736
  <div class="wfIssueOptions">
737
  {{if status == 'new'}}
738
- <strong>Resolve:</strong>
739
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
740
  {{if data.optionExists}}
741
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the option changes.</a>
742
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this option.</a>
743
  {{else}}
744
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore missing option.</a>
745
  {{/if}}
746
-
747
  {{/if}}
748
  {{if status == 'ignoreC' || status == 'ignoreP'}}
749
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue.</a>
 
 
750
  {{/if}}
751
  </div>
752
  </div>
@@ -770,15 +817,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
770
  {{html longMsg}}
771
  </p>
772
  <div class="wfIssueOptions">
773
- {{if status == 'new'}}
774
- <strong>Resolve:</strong>
775
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
776
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore these URLs until they change.</a>
777
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore these URLs permanently</a>
778
- {{/if}}
779
- {{if status == 'ignoreP' || status == 'ignoreC'}}
780
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
781
- {{/if}}
 
 
 
 
782
  </div>
783
  </div>
784
  </div>
@@ -803,15 +854,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
803
  {{html longMsg}}
804
  </p>
805
  <div class="wfIssueOptions">
806
- {{if status == 'new'}}
807
- <strong>Resolve:</strong>
808
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
809
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this redirect until it changes</a>
810
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore any redirect like this permanently</a>
811
- {{/if}}
812
- {{if status == 'ignoreP' || status == 'ignoreC'}}
813
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
814
- {{/if}}
 
 
 
 
815
  </div>
816
  </div>
817
  </div>
@@ -835,14 +890,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
835
  {{html longMsg}}
836
  </p>
837
  <div class="wfIssueOptions">
838
- {{if status == 'new'}}
839
- <strong>Resolve:</strong>
840
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
841
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a>
842
- {{/if}}
843
- {{if status == 'ignoreP' || status == 'ignoreC'}}
844
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
845
- {{/if}}
 
 
 
 
846
  </div>
847
  </div>
848
  </div>
@@ -865,14 +924,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
865
  {{html longMsg}}
866
  </p>
867
  <div class="wfIssueOptions">
868
- {{if status == 'new'}}
869
- <strong>Resolve:</strong>
870
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
871
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a>
872
- {{/if}}
873
- {{if status == 'ignoreP' || status == 'ignoreC'}}
874
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
875
- {{/if}}
 
 
 
 
876
  </div>
877
  </div>
878
  </div>
@@ -884,9 +947,9 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
884
  <p>
885
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
886
  {{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
887
- <tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
888
  {{/if}}
889
- <tr><th>Issue first detected:</th><td>${timeAgo} ago.</td></tr>
890
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
891
  <tr><th>Status</th><td>
892
  {{if status == 'new' }}New{{/if}}
@@ -900,12 +963,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
900
  </p>
901
  <div class="wfIssueOptions">
902
  {{if status == 'new'}}
903
- <strong>Resolve:</strong>
904
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
905
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a>
 
 
906
  {{/if}}
907
- {{if status == 'ignoreP' || status == 'ignoreC'}}
908
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
 
 
909
  {{/if}}
910
  </div>
911
  </div>
@@ -917,7 +984,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
917
  <h2>${shortMsg}</h2>
918
  <p>
919
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
920
- <tr><th>Issue first detected:</th><td>${timeAgo} ago.</td></tr>
921
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
922
  <tr><th>Status</th><td>
923
  {{if status == 'new' }}New{{/if}}
@@ -931,15 +998,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
931
  </p>
932
  <div class="wfIssueOptions">
933
  {{if status == 'new'}}
934
- <strong>Resolve:</strong>
935
- {{if ((typeof data.recommendation !== 'undefined') && data.recommendation)}}
936
- <a href="#" onclick="WFAD.useRecommendedHowGetIPs('${id}'); return false;">Use recommended value</a>
937
- {{/if}}
938
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
939
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a>
 
 
940
  {{/if}}
941
- {{if status == 'ignoreP' || status == 'ignoreC'}}
942
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
 
 
943
  {{/if}}
944
  </div>
945
  </div>
@@ -964,14 +1035,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
964
  {{html longMsg}}
965
  </p>
966
  <div class="wfIssueOptions">
967
- {{if status == 'new'}}
968
- <strong>Resolve:</strong>
969
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
970
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a>
971
- {{/if}}
972
- {{if status == 'ignoreP' || status == 'ignoreC'}}
973
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
974
- {{/if}}
 
 
 
 
975
  </div>
976
  </div>
977
  </div>
@@ -995,16 +1070,20 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
995
  {{html longMsg}}
996
  </p>
997
  <div class="wfIssueOptions">
998
- {{if status == 'new'}}
999
- <strong>Resolve:</strong>
1000
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
1001
- <a href="#" onclick="WFAD.deleteAdminUser('${id}'); return false;">Delete this user</a>
1002
- <a href="#" onclick="WFAD.revokeAdminUser('${id}'); return false;">Revoke all capabilities from this user</a>
1003
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a>
1004
- {{/if}}
1005
- {{if status == 'ignoreP' || status == 'ignoreC'}}
1006
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
1007
- {{/if}}
 
 
 
 
1008
  </div>
1009
  </div>
1010
  </div>
@@ -1029,12 +1108,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
1029
  </p>
1030
  <div class="wfIssueOptions">
1031
  {{if status == 'new'}}
1032
- <strong>Resolve:</strong>
1033
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
1034
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a>
 
 
1035
  {{/if}}
1036
- {{if status == 'ignoreP' || status == 'ignoreC'}}
1037
- <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
 
 
1038
  {{/if}}
1039
  </div>
1040
  </div>
76
  {{html longMsg}}
77
  </p>
78
  <div class="wfIssueOptions">
79
+ <ul>
80
+ <li><h3>Tools:</h3></li>
81
+ {{if data.fileExists}}
82
+ <li><a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file</a></li>
83
+ {{/if}}
84
+ <li><a href="#" onclick="WFAD.hideFile('${id}', 'delete'); return false;">Hide this file in <em>.htaccess</em></a></li>
85
+ {{if data.canDelete}}
86
+ <li><a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone)</a></li>
87
+ {{/if}}
88
+ </ul>
89
  {{if data.canDelete}}
 
90
  <p>
91
  <label><input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete</label>
92
  </p>
93
  {{/if}}
94
  </div>
95
  <div class="wfIssueOptions">
96
+ {{if status == 'new'}}
97
+ <ul>
98
+ <li><h3>Resolve:</h3></li>
99
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
100
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
101
+ </ul>
102
+ {{/if}}
103
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
104
+ <ul>
105
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
106
+ </ul>
107
+ {{/if}}
108
  </div>
109
  </div>
110
  </div>
133
  {{html longMsg}}
134
  </p>
135
  <div class="wfIssueOptions">
136
+ <ul>
137
+ <li><h3>Tools:</h3></li>
138
+ {{if data.fileExists}}
139
+ <li><a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file</a></li>
140
+ {{/if}}
141
+ <li><a href="#" onclick="WFAD.hideFile('${id}', 'delete'); return false;">Hide this file in <em>.htaccess</em></a></li>
142
+ {{if data.canDelete}}
143
+ <li><a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone)</a></li>
144
+ {{/if}}
145
+ </ul>
146
  {{if data.canDelete}}
 
147
  <p>
148
  <label><input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete</label>
149
  </p>
151
  </div>
152
  <div class="wfIssueOptions">
153
  {{if status == 'new'}}
154
+ <ul>
155
+ <li><h3>Resolve:</h3></li>
156
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
157
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
158
+ </ul>
159
  {{/if}}
160
  {{if status == 'ignoreC' || status == 'ignoreP'}}
161
+ <ul>
162
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
163
+ </ul>
164
  {{/if}}
165
  </div>
166
  </div>
185
  </p>
186
  <div class="wfIssueOptions">
187
  {{if (status == 'new')}}
188
+ <ul>
189
+ <li><h3>Resolve:</h3></li>
190
  <?php if (!wfUtils::isNginx()): ?>
191
+ <li><a href="#" onclick="WFAD.fixFPD('${id}'); return false;">Fix this issue</a></li>
192
  <?php endif ?>
193
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
194
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
195
  {{/if}}
196
  {{if status == 'ignoreC' || status == 'ignoreP'}}
197
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
198
  {{/if}}
199
+ </ul>
200
  </div>
201
  {{if (status == 'new')}}
202
  <div class="wfIssueOptions">
203
+ <ul>
204
+ <li><h3>Manual Fix:</h3></li>
205
+ <li>Set <code>display_errors</code> to <code>Off</code> in your php.ini file.</li>
206
+ </ul>
207
  </div>
208
  {{/if}}
 
209
  </div>
210
  </div>
211
  </script>
229
 
230
  <div class="wfIssueOptions">
231
  {{if (status == 'new')}}
232
+ <ul>
233
+ <li><h3>Resolve:</h3></li>
234
  <?php if (!wfUtils::isNginx()): ?>
235
+ <li><a href="#" onclick="WFAD.disableDirectoryListing('${id}'); return false;">Fix this issue</a></li>
236
  <?php endif ?>
237
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
238
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
239
+ </ul>
240
  {{/if}}
241
  {{if status == 'ignoreC' || status == 'ignoreP'}}
242
+ <ul>
243
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
244
+ </ul>
245
  {{/if}}
246
  </div>
247
  <?php if (!wfUtils::isNginx()): ?>
248
  {{if (status == 'new')}}
249
  <div class="wfIssueOptions">
250
+ <ul>
251
+ <li><h3>Manual Fix:</h3></li>
252
+ <li>Add <code>Options -Indexes</code> to your .htaccess file.</li>
253
+ </ul>
254
  </div>
255
  {{/if}}
256
  <?php endif ?>
264
  <h2>${shortMsg}</h2>
265
  <p>
266
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
267
+ <tr><th><span class="wf-hidden-xs">Theme </span>Name:</th><td>${data.name}</td></tr>
268
+ <tr><th>Current <span class="wf-hidden-xs">Theme </span>Version:</th><td>${data.version}</td></tr>
269
+ <tr><th>New <span class="wf-hidden-xs">Theme </span>Version:</th><td>${data.newVersion}</td></tr>
270
+ <tr><th><span class="wf-hidden-xs">Theme </span>URL:</th><td><a href="${data.URL}" target="_blank"><span class="wf-hidden-xs wf-split-word">${data.URL}</span><span class="wf-visible-xs">View</span></a></td></tr>
271
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
272
  <tr><th>Status</th><td>
273
  {{if status == 'new' }}New{{/if}}
281
  <a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
282
  </p>
283
  <div class="wfIssueOptions">
284
+ {{if status == 'new'}}
285
+ <ul>
286
+ <li><h3>Resolve:</h3></li>
287
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
288
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
289
+ </ul>
290
  {{/if}}
291
  {{if status == 'ignoreC' || status == 'ignoreP'}}
292
+ <ul>
293
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
294
+ </ul>
295
  {{/if}}
296
  </div>
297
  </div>
304
  <h2>${shortMsg}</h2>
305
  <p>
306
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
307
+ <tr><th><span class="wf-hidden-xs">Plugin </span>Name:</th><td>${data.Name}</td></tr>
308
+ {{if data.PluginURI}}<tr><th><span class="wf-hidden-xs">Plugin </span>Website:</th><td><a href="${data.PluginURI}" target="_blank"><span class="wf-hidden-xs wf-split-word">${data.PluginURI}</span><span class="wf-visible-xs">View</span></a></td></tr>{{/if}}
309
+ <tr><th>Changelog:</th><td><a href="${data.wpURL}/changelog" target="_blank"><span class="wf-hidden-xs wf-split-word">${data.wpURL}/changelog</span><span class="wf-visible-xs">View</span></a></td></tr>
310
+ <tr><th>Current <span class="wf-hidden-xs">Plugin </span>Version:</th><td>${data.Version}</td></tr>
311
+ <tr><th>New <span class="wf-hidden-xs">Plugin </span>Version:</th><td>${data.newVersion}</td></tr>
312
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
313
  <tr><th>Status</th><td>
314
  {{if status == 'new' }}New{{/if}}
323
  </p>
324
  <div class="wfIssueOptions">
325
  {{if status == 'new'}}
326
+ <ul>
327
+ <li><h3>Resolve:</h3></li>
328
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
329
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
330
+ </ul>
331
  {{/if}}
332
  {{if status == 'ignoreC' || status == 'ignoreP'}}
333
+ <ul>
334
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
335
+ </ul>
336
  {{/if}}
337
  </div>
338
  </div>
345
  <h2>${shortMsg}</h2>
346
  <p>
347
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
348
+ <tr><th>Current <span class="wf-hidden-xs">WordPress </span>Version:</th><td>${data.currentVersion}</td></tr>
349
+ <tr><th>New <span class="wf-hidden-xs">WordPress </span>Version:</th><td>${data.newVersion}</td></tr>
350
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
351
  <tr><th>Status</th><td>
352
  {{if status == 'new' }}New{{/if}}
359
  <a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
360
  </p>
361
  <div class="wfIssueOptions">
362
+ {{if status == 'new'}}
363
+ <ul>
364
+ <li><h3>Resolve:</h3></li>
365
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
366
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
367
+ </ul>
368
+ {{/if}}
369
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
370
+ <ul>
371
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
372
+ </ul>
373
+ {{/if}}
374
+ </div>
375
  </div>
376
  </script>
377
 
381
  <h2>${shortMsg}</h2>
382
  <p>
383
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
384
+ <tr><th>Old<span class="wf-hidden-xs"> DNS records</span>:</th><td>${data.oldDNS}</td></tr>
385
+ <tr><th>New<span class="wf-hidden-xs"> DNS records</span>:</th><td>${data.newDNS}</td></tr>
386
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
387
  <tr><th>Status</th><td>
388
  {{if status == 'new' }}New{{/if}}
402
  </div>
403
  </div>
404
  </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405
 
406
  <script type="text/x-jquery-template" id="issueTmpl_diskSpace">
407
  <div>
421
  {{html longMsg}}
422
  </p>
423
  <div class="wfIssueOptions">
424
+ {{if status == 'new'}}
425
+ <ul>
426
+ <li><h3>Resolve:</h3></li>
427
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
428
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore disk space alerts</a></li>
429
+ </ul>
430
+ {{/if}}
431
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
432
+ <ul>
433
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring disk space alerts</a></li>
434
+ </ul>
435
+ {{/if}}
436
  </div>
437
  </div>
438
  </div>
444
  <h2>${shortMsg}</h2>
445
  <p>
446
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
447
+ <tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
448
+ <tr><th>Login<span class="wf-hidden-xs"> Name</span>:</th><td>${data.user_login}</td></tr>
449
+ <tr><th><span class="wf-hidden-xs">User </span>Email:</th><td>${data.user_email}</td></tr>
450
+ <tr><th><span class="wf-hidden-xs">Full </span>Name:</th><td>${data.first_name} ${data.last_name}</td></tr>
451
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
452
  <tr><th>Status</th><td>
453
  {{if status == 'new' }}New{{/if}}
454
  {{if status == 'ignoreC' }}Ignored until user changes password{{/if}}
455
+ {{if status == 'ignoreP' }}Ignoring all for this user{{/if}}
456
  </td></tr>
457
  </table>
458
  </p>
460
  {{html longMsg}}
461
  </p>
462
  <div class="wfIssueOptions">
463
+ <ul>
464
+ <li><h3>Tools:</h3></li>
465
+ <li><a target="_blank" href="${data.editUserLink}">Edit this user</a></li>
466
+ </ul>
467
  </div>
468
  <div class="wfIssueOptions">
469
+ {{if status == 'new'}}
470
+ <ul>
471
+ <li><h3>Resolve:</h3></li>
472
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
473
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this weak password</a></li>
474
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all for this user</a></li>
475
+ </ul>
476
+ {{/if}}
477
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
478
+ <ul>
479
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
480
+ </ul>
481
+ {{/if}}
482
  </div>
483
  </div>
484
  </div>
491
  <p>
492
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
493
  <tr><th>Author</th><td>${data.author}</td></tr>
494
+ <tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
495
  <tr><th>Posted on:</th><td>${data.commentDate}</td></tr>
496
  {{if data.isMultisite}}
497
  <tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
509
  {{html longMsg}}
510
  </p>
511
  <div class="WfIssueOptions">
512
+ <ul>
513
+ <li><h3>Tools:</h3></li>
514
+ <li><a target="_blank" href="${data.editCommentLink}">Edit this ${data.type}</a></li>
515
+ </ul>
516
  </div>
517
  <div class="wfIssueOptions">
518
+ {{if status == 'new'}}
519
+ <ul>
520
+ <li><h3>Resolve:</h3></li>
521
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
522
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this ${data.type}</a></li>
523
+ </ul>
524
+ {{/if}}
525
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
526
+ <ul>
527
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this ${data.type}</a></li>
528
+ </ul>
529
+ {{/if}}
530
+ </div>
531
  </div>
532
  </script>
533
  <script type="text/x-jquery-template" id="issueTmpl_postBadTitle">
555
  {{html longMsg}}
556
  </p>
557
  <div class="wfIssueOptions">
558
+ <ul>
559
+ <li><h3>Tools:</h3></li>
560
+ <li><a target="_blank" href="${data.editPostLink}">Edit this ${data.type}</a></li>
561
+ </ul>
562
  </div>
563
  <div class="wfIssueOptions">
564
+ {{if status == 'new'}}
565
+ <ul>
566
+ <li><h3>Resolve:</h3></li>
567
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
568
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this title in this ${data.type}</a></li>
569
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all dangerous titles in this ${data.type}</a></li>
570
+ </ul>
571
+ {{/if}}
572
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
573
+ <ul>
574
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
575
+ </ul>
576
+ {{/if}}
577
  </div>
578
  </div>
579
  </div>
590
  {{else}}
591
  <tr><th>Title:</th><td><a href="${data.permalink}" target="_blank">${data.postTitle}</a></td></tr>
592
  {{/if}}
593
+ <tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
594
  <tr><th>Posted on:</th><td>${data.postDate}</td></tr>
595
  {{if data.isMultisite}}
596
  <tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
609
  {{html longMsg}}
610
  </p>
611
  <div class="wfIssueOptions">
612
+ <ul>
613
+ <li><h3>Tools:</h3></li>
614
+ <li><a target="_blank" href="${data.editPostLink}">Edit this ${data.type}</a></li>
615
+ </ul>
616
  </div>
617
  <div class="wfIssueOptions">
618
+ {{if status == 'new'}}
619
+ <ul>
620
+ <li><h3>Resolve:</h3></li>
621
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
622
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this bad URL in this ${data.type}</a></li>
623
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all bad URLs in this ${data.type}</a></li>
624
+ </ul>
625
+ {{/if}}
626
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
627
+ <ul>
628
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
629
+ </ul>
630
+ {{/if}}
631
  </div>
632
  </div>
633
  </div>
643
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
644
  <tr><th>Filename:</th><td>${data.file}</td></tr>
645
  {{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
646
+ <tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
647
  {{/if}}
648
+ <tr><th><span class="wf-hidden-xs">File </span>Type:</th><td>{{if data.cType}}${WFAD.ucfirst(data.cType)}{{else}}Not a core, theme or plugin file.{{/if}}</td></tr>
649
+ <tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
650
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
651
  <tr><th>Status</th><td>
652
  {{if status == 'new' }}New{{/if}}
659
  {{html longMsg}}
660
  </p>
661
  <div class="wfIssueOptions">
662
+ {{if status == 'new'}}
663
+ <ul>
664
+ <li><h3>Tools:</h3></li>
665
+ {{if data.fileExists}}
666
+ <li><a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file.</a></li>
667
+ {{/if}}
668
+ {{if data.canFix}}
669
+ <li><a href="#" onclick="WFAD.restoreFile('${id}'); return false;">Restore the original version of this file.</a></li>
670
+ {{/if}}
671
+ {{if data.canDelete}}
672
+ <li><a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone)</a></li>
673
+ {{/if}}
674
+ {{if data.canDiff}}
675
+ <li><a href="${WFAD.makeDiffLink(data)}" target="_blank">See how the file has changed.</a></li>
676
+ {{/if}}
677
+ </ul>
678
  {{if data.canFix}}
679
  <br />&nbsp;<input type="checkbox" class="wfrepairCheckbox" value="${id}" />&nbsp;Select for bulk repair
680
  {{/if}}
681
  {{if data.canDelete}}
682
  <br />&nbsp;<input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete
683
  {{/if}}
684
+ {{/if}}
685
  </div>
686
  <div class="wfIssueOptions">
687
  {{if status == 'new'}}
688
+ <ul>
689
+ <li><h3>Resolve:</h3></li>
690
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
691
  {{if data.fileExists}}
692
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the file changes.</a></li>
693
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this file.</a></li>
694
  {{else}}
695
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore missing file</a></li>
696
  {{/if}}
697
+ </ul>
698
  {{/if}}
699
  {{if status == 'ignoreC' || status == 'ignoreP'}}
700
+ <ul>
701
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
702
+ </ul>
703
  {{/if}}
704
  </div>
705
  </div>
712
  <h2>${shortMsg}</h2>
713
  <p>
714
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
715
+ <tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
716
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
717
  <tr><th>Status</th><td>
718
  {{if status == 'new' }}New{{/if}}
726
  </p>
727
  <div class="wfIssueOptions">
728
  {{if status == 'new'}}
729
+ <ul>
730
+ <li><h3>Resolve:</h3></li>
731
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the version changes</a></li>
732
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this version</a></li>
733
+ </ul>
734
  {{/if}}
735
  {{if status == 'ignoreC' || status == 'ignoreP'}}
736
+ <ul>
737
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
738
+ </ul>
739
  {{/if}}
740
  </div>
741
  </div>
748
  <h2>${shortMsg}</h2>
749
  <p>
750
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
751
+ <tr><th>Option<span class="wf-hidden-xs"> Name</span>:</th><td>${data.option_name}</td></tr>
752
  {{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
753
+ <tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
754
  {{/if}}
755
+ <tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
756
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
757
  <tr><th>Status</th><td>
758
  {{if status == 'new' }}New{{/if}}
765
  {{html longMsg}}
766
  </p>
767
  <div class="wfIssueOptions">
768
+ <ul>
769
+ <li><h3>Tools:</h3></li>
770
+ {{if data.optionExists}}
771
+ <li><a target="_blank" href="${WFAD.makeViewOptionLink(data.option_name, data.site_id)}">View this option.</a></li>
772
+ {{/if}}
773
+ {{if data.canDelete}}
774
+ <li><a href="#" onclick="WFAD.deleteDatabaseOption('${id}'); return false;">Delete this option from the database (can't be undone)</a></li>
775
+ {{/if}}
776
+ </ul>
777
  {{if data.canDelete}}
 
778
  <br />&nbsp;<input type="checkbox" class="wfdelCheckbox" value="${id}" />&nbsp;Select for bulk delete
779
  {{/if}}
780
  </div>
781
  <div class="wfIssueOptions">
782
  {{if status == 'new'}}
783
+ <ul>
784
+ <li><h3>Resolve:</h3></li>
785
  {{if data.optionExists}}
786
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the option changes.</a></li>
787
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this option.</a></li>
788
  {{else}}
789
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore missing option.</a></li>
790
  {{/if}}
791
+ </ul>
792
  {{/if}}
793
  {{if status == 'ignoreC' || status == 'ignoreP'}}
794
+ <ul>
795
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
796
+ </ul>
797
  {{/if}}
798
  </div>
799
  </div>
817
  {{html longMsg}}
818
  </p>
819
  <div class="wfIssueOptions">
820
+ {{if status == 'new'}}
821
+ <ul>
822
+ <li><h3>Resolve:</h3></li>
823
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
824
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore these URLs until they change.</a></li>
825
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore these URLs permanently</a></li>
826
+ </ul>
827
+ {{/if}}
828
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
829
+ <ul>
830
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
831
+ </ul>
832
+ {{/if}}
833
  </div>
834
  </div>
835
  </div>
854
  {{html longMsg}}
855
  </p>
856
  <div class="wfIssueOptions">
857
+ {{if status == 'new'}}
858
+ <ul>
859
+ <li><h3>Resolve:</h3></li>
860
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
861
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this redirect until it changes.</a></li>
862
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore any redirect like this permanently</a></li>
863
+ </ul>
864
+ {{/if}}
865
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
866
+ <ul>
867
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
868
+ </ul>
869
+ {{/if}}
870
  </div>
871
  </div>
872
  </div>
890
  {{html longMsg}}
891
  </p>
892
  <div class="wfIssueOptions">
893
+ {{if status == 'new'}}
894
+ <ul>
895
+ <li><h3>Resolve:</h3></li>
896
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
897
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
898
+ </ul>
899
+ {{/if}}
900
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
901
+ <ul>
902
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
903
+ </ul>
904
+ {{/if}}
905
  </div>
906
  </div>
907
  </div>
924
  {{html longMsg}}
925
  </p>
926
  <div class="wfIssueOptions">
927
+ {{if status == 'new'}}
928
+ <ul>
929
+ <li><h3>Resolve:</h3></li>
930
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
931
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
932
+ </ul>
933
+ {{/if}}
934
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
935
+ <ul>
936
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
937
+ </ul>
938
+ {{/if}}
939
  </div>
940
  </div>
941
  </div>
947
  <p>
948
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
949
  {{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
950
+ <tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
951
  {{/if}}
952
+ <tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
953
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
954
  <tr><th>Status</th><td>
955
  {{if status == 'new' }}New{{/if}}
963
  </p>
964
  <div class="wfIssueOptions">
965
  {{if status == 'new'}}
966
+ <ul>
967
+ <li><h3>Resolve:</h3></li>
968
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
969
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
970
+ </ul>
971
  {{/if}}
972
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
973
+ <ul>
974
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
975
+ </ul>
976
  {{/if}}
977
  </div>
978
  </div>
984
  <h2>${shortMsg}</h2>
985
  <p>
986
  <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
987
+ <tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
988
  <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
989
  <tr><th>Status</th><td>
990
  {{if status == 'new' }}New{{/if}}
998
  </p>
999
  <div class="wfIssueOptions">
1000
  {{if status == 'new'}}
1001
+ <ul>
1002
+ <li><h3>Resolve:</h3></li>
1003
+ {{if ((typeof data.recommendation !== 'undefined') && data.recommendation)}}
1004
+ <li><a href="#" onclick="WFAD.useRecommendedHowGetIPs('${id}'); return false;">Use recommended value</a></li>
1005
+ {{/if}}
1006
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
1007
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
1008
+ </ul>
1009
  {{/if}}
1010
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
1011
+ <ul>
1012
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
1013
+ </ul>
1014
  {{/if}}
1015
  </div>
1016
  </div>
1035
  {{html longMsg}}
1036
  </p>
1037
  <div class="wfIssueOptions">
1038
+ {{if status == 'new'}}
1039
+ <ul>
1040
+ <li><h3>Resolve:</h3></li>
1041
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
1042
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
1043
+ </ul>
1044
+ {{/if}}
1045
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
1046
+ <ul>
1047
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
1048
+ </ul>
1049
+ {{/if}}
1050
  </div>
1051
  </div>
1052
  </div>
1070
  {{html longMsg}}
1071
  </p>
1072
  <div class="wfIssueOptions">
1073
+ {{if status == 'new'}}
1074
+ <ul>
1075
+ <li><h3>Resolve:</h3></li>
1076
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
1077
+ <li><a href="#" onclick="WFAD.deleteAdminUser('${id}'); return false;">Delete this user</a></li>
1078
+ <li><a href="#" onclick="WFAD.revokeAdminUser('${id}'); return false;">Revoke all capabilities from this user</a></li>
1079
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
1080
+ </ul>
1081
+ {{/if}}
1082
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
1083
+ <ul>
1084
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
1085
+ </ul>
1086
+ {{/if}}
1087
  </div>
1088
  </div>
1089
  </div>
1108
  </p>
1109
  <div class="wfIssueOptions">
1110
  {{if status == 'new'}}
1111
+ <ul>
1112
+ <li><h3>Resolve:</h3></li>
1113
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
1114
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
1115
+ </ul>
1116
  {{/if}}
1117
+ {{if status == 'ignoreC' || status == 'ignoreP'}}
1118
+ <ul>
1119
+ <li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
1120
+ </ul>
1121
  {{/if}}
1122
  </div>
1123
  </div>
lib/menu_scan_scan.php CHANGED
@@ -53,7 +53,7 @@
53
 
54
  <div class="consoleHead" style="margin-top: 20px;">
55
  <h3 class="consoleHeadText">Scan Detailed Activity</h3>
56
- <a href="#" class="wfALogMailLink" onclick="WFAD.emailActivityLog(); return false;">Email activity log</a>
57
  </div>
58
  <div class="bevelDiv1 consoleOuter"><div class="bevelDiv2"><div class="bevelDiv3 consoleInner" id="consoleActivity">
59
  <?php
53
 
54
  <div class="consoleHead" style="margin-top: 20px;">
55
  <h3 class="consoleHeadText">Scan Detailed Activity</h3>
56
+ <a href="#" class="wfALogMailLink" onclick="WFAD.emailActivityLog(); return false;">Email<span class="wf-hidden-xs"> activity log</span></a>
57
  </div>
58
  <div class="bevelDiv1 consoleOuter"><div class="bevelDiv2"><div class="bevelDiv3 consoleInner" id="consoleActivity">
59
  <?php
lib/menu_scan_schedule.php CHANGED
@@ -57,8 +57,11 @@
57
  </div>
58
  <div class="wf-card-extra">
59
  <table class="scan-schedule">
60
- <tr>
61
  <th>Shortcuts</th>
 
 
 
62
  <td>
63
  <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="onceDaily">Once per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="twiceDaily">Twice per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="weekends">Weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="oddDaysWE">Odd days and weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="every6hours">Every 6 hours</button>
64
  </td>
@@ -77,29 +80,38 @@
77
  foreach ($daysOfWeek as $d) :
78
  list($dayNumber, $dayName) = $d;
79
  ?>
80
- <tr class="schedule-day" data-day="<?php echo $dayNumber; ?>">
81
  <th><?php echo $dayName; ?></th>
 
 
 
82
  <td>
83
- <ul class="schedule-times">
84
- <li class="text-only">AM</li>
85
- <?php
86
- for ($h = 0; $h < 12; $h++) {
87
- $active = (isset($sched[$dayNumber]) && $sched[$dayNumber][$h] ? ' active' : '');
88
- echo '<li class="time' . $active . '" data-hour="' . $h . '"><a href="#">' . str_pad($h, 2, '0', STR_PAD_LEFT) . '</a></li>';
89
- }
90
- ?>
91
- </ul>
92
- <ul class="schedule-times">
93
- <li class="text-only">PM</li>
94
- <?php
95
- for ($i = 0; $i < 12; $i++) {
96
- $h = $i;
97
- if ($h == 0) { $h = 12; }
98
- $active = (isset($sched[$dayNumber]) && $sched[$dayNumber][$i + 12] ? ' active' : '');
99
- echo '<li class="time' . $active . '" data-hour="' . ($i + 12) . '"><a href="#">' . str_pad($h, 2, '0', STR_PAD_LEFT) . '</a></li>';
100
- }
101
- ?>
102
- </ul>
 
 
 
 
 
 
103
  </td>
104
  </tr>
105
  <?php endforeach; ?>
57
  </div>
58
  <div class="wf-card-extra">
59
  <table class="scan-schedule">
60
+ <tr class="wf-visible-xs">
61
  <th>Shortcuts</th>
62
+ </tr>
63
+ <tr>
64
+ <th class="wf-hidden-xs">Shortcuts</th>
65
  <td>
66
  <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="onceDaily">Once per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="twiceDaily">Twice per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="weekends">Weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="oddDaysWE">Odd days and weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="every6hours">Every 6 hours</button>
67
  </td>
80
  foreach ($daysOfWeek as $d) :
81
  list($dayNumber, $dayName) = $d;
82
  ?>
83
+ <tr class="wf-visible-xs">
84
  <th><?php echo $dayName; ?></th>
85
+ </tr>
86
+ <tr class="schedule-day" data-day="<?php echo $dayNumber; ?>">
87
+ <th class="wf-hidden-xs"><?php echo $dayName; ?></th>
88
  <td>
89
+ <div class="schedule-times-wrapper">
90
+ <div class="wf-visible-xs wf-center">AM</div>
91
+ <ul class="schedule-times">
92
+ <li class="text-only wf-hidden-xs">AM</li>
93
+ <?php
94
+ for ($h = 0; $h < 12; $h++) {
95
+ $active = (isset($sched[$dayNumber]) && $sched[$dayNumber][$h] ? ' active' : '');
96
+ echo '<li class="time' . $active . '" data-hour="' . $h . '"><a href="#">' . str_pad($h, 2, '0', STR_PAD_LEFT) . '</a></li>';
97
+ }
98
+ ?>
99
+ </ul>
100
+ </div>
101
+ <div class="schedule-times-wrapper">
102
+ <div class="wf-visible-xs wf-center">PM</div>
103
+ <ul class="schedule-times">
104
+ <li class="text-only wf-hidden-xs">PM</li>
105
+ <?php
106
+ for ($i = 0; $i < 12; $i++) {
107
+ $h = $i;
108
+ if ($h == 0) { $h = 12; }
109
+ $active = (isset($sched[$dayNumber]) && $sched[$dayNumber][$i + 12] ? ' active' : '');
110
+ echo '<li class="time' . $active . '" data-hour="' . ($i + 12) . '"><a href="#">' . str_pad($h, 2, '0', STR_PAD_LEFT) . '</a></li>';
111
+ }
112
+ ?>
113
+ </ul>
114
+ </div>
115
  </td>
116
  </tr>
117
  <?php endforeach; ?>
lib/menu_tools_diagnostic.php CHANGED
@@ -13,7 +13,7 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
13
  ?>
14
 
15
  <div>
16
- <form id="wfConfigForm">
17
  <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>>
18
  <?php foreach ($diagnostic->getResults() as $title => $tests): ?>
19
  <tbody class="thead">
13
  ?>
14
 
15
  <div>
16
+ <form id="wfConfigForm" style="overflow-x: auto;">
17
  <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>>
18
  <?php foreach ($diagnostic->getResults() as $title => $tests): ?>
19
  <tbody class="thead">
lib/menu_tools_twoFactor.php CHANGED
@@ -34,16 +34,31 @@
34
 
35
  <h2>Enable Cellphone Sign-in</h2>
36
  <p><em>Our Cellphone Sign-in uses a technique called "Two Factor Authentication" which is used by banks, government agencies and military world-wide as one of the most secure forms of remote system authentication. We recommend you enable Cellphone Sign-in for all Administrator level accounts.</em></p>
37
- <table class="wfConfigForm">
38
- <tr><td>Username to enable Cellphone Sign-in for:</td><td><input type="text" id="wfUsername" value="" size="20" /></td></tr>
39
- <tr><td class="align-top">Code generation mode:</td><td>
40
- <table class="wfConfigForm">
41
- <tr><td><input type="radio" name="wf2faMode" value="authenticator" checked></td><td>Use authenticator app</td></tr>
42
- <tr><td><input type="radio" name="wf2faMode" value="phone"></td><td>Send code to a phone number: <input type="text" id="wfPhone" value="" size="20" disabled><br><em>Format: +1-123-555-5034</em></td></tr>
43
- </table>
44
- </td></tr>
45
- <tr><td colspan="2"><input type="button" class="wf-btn wf-btn-primary" value="Enable Cellphone Sign-in" onclick="WFAD.addTwoFactor(jQuery('#wfUsername').val(), jQuery('#wfPhone').val(), jQuery('input[name=wf2faMode]:checked').val());" /></td></tr>
46
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  <div style="height: 20px;">
48
  <div id="wfTwoFacMsg" style="color: #F00;">
49
  &nbsp;
@@ -86,19 +101,19 @@
86
  </div>
87
 
88
  <script type="text/x-jquery-template" id="wfTwoFacUserTmpl">
89
- <table class="wf-striped-table">
90
  <thead>
91
  <tr>
92
- <th style="width: 80px;"></th>
93
- <th style="width: 100px;">User</th>
94
- <th style="width: 180px;">Mode</th>
95
  <th>Status</th>
96
  </tr>
97
  </thead>
98
  <tbody>
99
  {{each(idx, user) users}}
100
  <tr id="twoFactorUser-${user.userID}">
101
- <td style="white-space: nowrap; text-align: center;"><a href="#" class="wf-btn wf-btn-default" onclick="WFAD.delTwoFac('${user.userID}'); return false;">Delete</a></td>
102
  <td style="white-space: nowrap;">${user.username}</td>
103
  {{if user.mode == 'phone'}}
104
  <td style="white-space: nowrap;">Phone (${user.phone})</td>
@@ -111,7 +126,7 @@
111
  {{else}}
112
  <div class="wf-form-inline">
113
  <div class="wf-form-group">
114
- <label class="wf-plain" style="margin: 0;" for="wfActivate-${user.userID}">Enter activation code:</label> <input class="wf-form-control" type="text" id="wfActivate-${user.userID}" size="6">
115
  </div>
116
  <input class="wf-btn wf-btn-default" type="button" value="Activate" onclick="WFAD.twoFacActivate('${user.userID}', jQuery('#wfActivate-${user.userID}').val());">
117
  </div>
34
 
35
  <h2>Enable Cellphone Sign-in</h2>
36
  <p><em>Our Cellphone Sign-in uses a technique called "Two Factor Authentication" which is used by banks, government agencies and military world-wide as one of the most secure forms of remote system authentication. We recommend you enable Cellphone Sign-in for all Administrator level accounts.</em></p>
37
+ <div class="wf-form wf-form-twofactor">
38
+ <div class="wf-form-group">
39
+ <label for="wfUsername">Username<span class="wf-hidden-xs"> to enable Cellphone Sign-in for</span></label>
40
+ <input type="text" id="wfUsername" class="wf-form-control" value="" size="20">
41
+ </div>
42
+ <div class="wf-form-group">
43
+ <label for="wf2faMode"><span class="wf-visible-xs">Mode</span><span class="wf-hidden-xs">Code generation mode</span></label>
44
+ </div>
45
+ <div class="wf-radio">
46
+ <label>
47
+ <input type="radio" name="wf2faMode" id="wf2faMode-authenticator" value="authenticator" checked>
48
+ Use authenticator app
49
+ </label>
50
+ </div>
51
+ <div class="wf-radio">
52
+ <label>
53
+ <input type="radio" name="wf2faMode" id="wf2faMode-phone" value="phone">
54
+ Send code to a phone number:
55
+ </label>
56
+ <div class="wf-radio-offset"><input type="text" id="wfPhone" value="" size="20" disabled><br><em>Format: +1-123-555-5034</em></div>
57
+ </div>
58
+ <div class="wf-form-group">
59
+ <input type="button" class="wf-btn wf-btn-primary" value="Enable Cellphone Sign-in" onclick="WFAD.addTwoFactor(jQuery('#wfUsername').val(), jQuery('#wfPhone').val(), jQuery('input[name=wf2faMode]:checked').val());">
60
+ </div>
61
+ </div>
62
  <div style="height: 20px;">
63
  <div id="wfTwoFacMsg" style="color: #F00;">
64
  &nbsp;
101
  </div>
102
 
103
  <script type="text/x-jquery-template" id="wfTwoFacUserTmpl">
104
+ <table class="wf-table wf-table-striped wf-table-bordered wf-table-twofactor">
105
  <thead>
106
  <tr>
107
+ <th></th>
108
+ <th>User</th>
109
+ <th>Mode</th>
110
  <th>Status</th>
111
  </tr>
112
  </thead>
113
  <tbody>
114
  {{each(idx, user) users}}
115
  <tr id="twoFactorUser-${user.userID}">
116
+ <td style="white-space: nowrap; text-align: center;" class="wf-twofactor-delete"><a href="#" onclick="WFAD.delTwoFac('${user.userID}'); return false;"><i class="wf-ion-trash-a"></i></a></td>
117
  <td style="white-space: nowrap;">${user.username}</td>
118
  {{if user.mode == 'phone'}}
119
  <td style="white-space: nowrap;">Phone (${user.phone})</td>
126
  {{else}}
127
  <div class="wf-form-inline">
128
  <div class="wf-form-group">
129
+ <label class="wf-plain wf-hidden-xs" style="margin: 0;" for="wfActivate-${user.userID}">Enter activation code:</label> <input class="wf-form-control" type="text" id="wfActivate-${user.userID}" size="6" placeholder="Code">
130
  </div>
131
  <input class="wf-btn wf-btn-default" type="button" value="Activate" onclick="WFAD.twoFacActivate('${user.userID}', jQuery('#wfActivate-${user.userID}').val());">
132
  </div>
lib/menu_tools_whois.php CHANGED
@@ -16,8 +16,8 @@ if (!function_exists('fsockopen')) {
16
  } else {
17
  ?>
18
  </p>
19
- <p>
20
- <input type="text" name="whois" id="wfwhois" value="" size="60" maxlength="255" onkeydown="if(event.keyCode == 13){ WFAD.whois(jQuery('#wfwhois').val()); }" />&nbsp;<input type="button" name="whoisbutton" id="whoisbutton" class="wf-btn wf-btn-primary" value="Look up IP or Domain" onclick="WFAD.whois(jQuery('#wfwhois').val());">
21
  </p>
22
  <?php if(isset($_GET['wfnetworkblock']) && $_GET['wfnetworkblock']) { ?>
23
  <h2>How to block a network</h2>
16
  } else {
17
  ?>
18
  </p>
19
+ <p class="wf-form">
20
+ <input type="text" class="wf-form-control" name="whois" id="wfwhois" value="" maxlength="255" onkeydown="if(event.keyCode == 13){ WFAD.whois(jQuery('#wfwhois').val()); }" />&nbsp;<input type="button" name="whoisbutton" id="whoisbutton" class="wf-btn wf-btn-primary" value="Look up IP or Domain" onclick="WFAD.whois(jQuery('#wfwhois').val());">
21
  </p>
22
  <?php if(isset($_GET['wfnetworkblock']) && $_GET['wfnetworkblock']) { ?>
23
  <h2>How to block a network</h2>
lib/pageTitle.php CHANGED
@@ -1,15 +1,29 @@
1
  <div class="wf-row">
2
  <div class="wf-col-xs-12">
3
- <div class="wordfence-lock-icon wordfence-icon32"><br /></div><h2 id="wfHeading"><?php echo $pageTitle; ?></h2>
 
 
 
4
  </div>
5
  <?php if (isset($wantsLiveActivity) && $wantsLiveActivity): ?><div class="wf-col-xs-12"><?php include('live_activity.php'); ?></div><?php endif; ?>
6
  <div class="wf-col-xs-12">
7
  <?php if (isset($options)): ?>
8
- <h2 class="nav-tab-wrapper<?php if (count($options) <= 1 || (isset($hideBar) && $hideBar)) { echo ' wf-hidden'; } ?>" id="wordfenceTopTabs">
9
  <?php foreach ($options as $info): ?>
10
  <a class="nav-tab" id="<?php echo esc_html($info['a']); ?>-tab" href="#top#<?php echo esc_html($info['a']); ?>"><?php echo esc_html($info['t']); ?></a>
11
  <?php endforeach; ?>
12
  </h2>
 
 
 
 
 
 
 
 
 
 
 
13
  <?php endif; ?>
14
  <?php if (isset($helpLink)): ?><div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div><?php endif; ?>
15
  </div>
1
  <div class="wf-row">
2
  <div class="wf-col-xs-12">
3
+ <div class="wf-page-title">
4
+ <div class="wordfence-lock-icon wordfence-icon32"></div><h2 id="wfHeading"><?php echo $pageTitle; ?></h2>
5
+ </div>
6
+ <div class="wp-header-end"></div>
7
  </div>
8
  <?php if (isset($wantsLiveActivity) && $wantsLiveActivity): ?><div class="wf-col-xs-12"><?php include('live_activity.php'); ?></div><?php endif; ?>
9
  <div class="wf-col-xs-12">
10
  <?php if (isset($options)): ?>
11
+ <h2 class="wf-hidden-xs nav-tab-wrapper<?php if (count($options) <= 1 || (isset($hideBar) && $hideBar)) { echo ' wf-hidden'; } ?>" id="wordfenceTopTabs">
12
  <?php foreach ($options as $info): ?>
13
  <a class="nav-tab" id="<?php echo esc_html($info['a']); ?>-tab" href="#top#<?php echo esc_html($info['a']); ?>"><?php echo esc_html($info['t']); ?></a>
14
  <?php endforeach; ?>
15
  </h2>
16
+ <ul class="wf-nav wf-nav-pills wf-visible-xs">
17
+ <li class="wf-navbar-brand">Go:</li>
18
+ <li class="wf-dropdown">
19
+ <a href="#" id="wordfenceTopTabsMobile" class="wf-dropdown-toggle wf-mobile-dropdown" data-toggle="wf-dropdown"><span id="wordfenceTopTabsMobileTitle">Go to</span> <span class="wf-caret"></span></a>
20
+ <ul class="wf-dropdown-menu">
21
+ <?php foreach ($options as $info): ?>
22
+ <li><a id="<?php echo esc_html($info['a']); ?>-tab-mobile" href="#top#<?php echo esc_html($info['a']); ?>"><?php echo esc_html($info['t']); ?></a></li>
23
+ <?php endforeach; ?>
24
+ </ul>
25
+ </li>
26
+ </ul>
27
  <?php endif; ?>
28
  <?php if (isset($helpLink)): ?><div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div><?php endif; ?>
29
  </div>
lib/wfDB.php CHANGED
@@ -1,6 +1,10 @@
1
  <?php
2
  class wfDB {
3
  public $errorMsg = false;
 
 
 
 
4
  public function __construct(){
5
  }
6
  public function querySingle(){
1
  <?php
2
  class wfDB {
3
  public $errorMsg = false;
4
+ public static function networkPrefix() {
5
+ global $wpdb;
6
+ return $wpdb->get_blog_prefix(0);
7
+ }
8
  public function __construct(){
9
  }
10
  public function querySingle(){
lib/wfDashboard.php CHANGED
@@ -18,6 +18,8 @@ class wfDashboard {
18
 
19
  public $features = array();
20
 
 
 
21
  public $tdfCommunity;
22
  public $tdfPremium;
23
 
@@ -108,8 +110,31 @@ class wfDashboard {
108
  array('name' => 'Spam Blacklist Check', 'link' => network_admin_url('admin.php?page=WordfenceSecOpt#focus-checkSpamIP'), 'state' => !wfConfig::get('isPaid') ? self::FEATURE_PREMIUM : (wfConfig::get('checkSpamIP') ? self::FEATURE_ENABLED : self::FEATURE_DISABLED)),
109
  );
110
 
111
- // TDF
112
  $data = wfConfig::get_ser('dashboardData');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  if (is_array($data) && isset($data['tdf']) && isset($data['tdf']['community'])) {
114
  $this->tdfCommunity = (int) $data['tdf']['community'];
115
  $this->tdfPremium = (int) $data['tdf']['premium'];
18
 
19
  public $features = array();
20
 
21
+ public $lastGenerated;
22
+
23
  public $tdfCommunity;
24
  public $tdfPremium;
25
 
110
  array('name' => 'Spam Blacklist Check', 'link' => network_admin_url('admin.php?page=WordfenceSecOpt#focus-checkSpamIP'), 'state' => !wfConfig::get('isPaid') ? self::FEATURE_PREMIUM : (wfConfig::get('checkSpamIP') ? self::FEATURE_ENABLED : self::FEATURE_DISABLED)),
111
  );
112
 
 
113
  $data = wfConfig::get_ser('dashboardData');
114
+ $lastChecked = wfConfig::get('lastDashboardCheck', 0);
115
+ if ((!is_array($data) || (isset($data['generated']) && $data['generated'] + 3600 < time())) && $lastChecked + 3600 < time()) {
116
+ $wp_version = wfUtils::getWPVersion();
117
+ $apiKey = wfConfig::get('apiKey');
118
+ $api = new wfAPI($apiKey, $wp_version);
119
+ wfConfig::set('lastDashboardCheck', time());
120
+ try {
121
+ $json = $api->getStaticURL('/stats.json');
122
+ $data = @json_decode($json, true);
123
+ if ($json && is_array($data)) {
124
+ self::processDashboardResponse($data);
125
+ }
126
+ }
127
+ catch (Exception $e) {
128
+ //Do nothing
129
+ }
130
+ }
131
+
132
+ // Last Generated
133
+ if (is_array($data) && isset($data['generated'])) {
134
+ $this->lastGenerated = $data['generated'];
135
+ }
136
+
137
+ // TDF
138
  if (is_array($data) && isset($data['tdf']) && isset($data['tdf']['community'])) {
139
  $this->tdfCommunity = (int) $data['tdf']['community'];
140
  $this->tdfPremium = (int) $data['tdf']['premium'];
lib/wfNotification.php CHANGED
@@ -13,7 +13,8 @@ class wfNotification {
13
 
14
  public static function notifications($since = 0) {
15
  global $wpdb;
16
- $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wfNotifications WHERE `new` = 1 AND `ctime` > %d ORDER BY `priority` ASC, `ctime` DESC", $since), ARRAY_A);
 
17
  $notifications = array();
18
  foreach ($rawNotifications as $raw) {
19
  $notifications[] = new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
@@ -23,7 +24,8 @@ class wfNotification {
23
 
24
  public static function getNotificationForID($id) {
25
  global $wpdb;
26
- $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wfNotifications WHERE `id` = %s ORDER BY `priority` ASC, `ctime` DESC", $id), ARRAY_A);
 
27
  if (count($rawNotifications) == 1) {
28
  $raw = $rawNotifications[0];
29
  return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
@@ -33,7 +35,8 @@ class wfNotification {
33
 
34
  public static function getNotificationForCategory($category, $requireNew = true) {
35
  global $wpdb;
36
- $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wfNotifications WHERE " . ($requireNew ? '`new` = 1 AND ' : '') . "`category` = %s ORDER BY `priority` ASC, `ctime` DESC LIMIT 1", $category), ARRAY_A);
 
37
  if (count($rawNotifications) == 1) {
38
  $raw = $rawNotifications[0];
39
  return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
13
 
14
  public static function notifications($since = 0) {
15
  global $wpdb;
16
+ $prefix = wfDB::networkPrefix();
17
+ $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$prefix}wfNotifications WHERE `new` = 1 AND `ctime` > %d ORDER BY `priority` ASC, `ctime` DESC", $since), ARRAY_A);
18
  $notifications = array();
19
  foreach ($rawNotifications as $raw) {
20
  $notifications[] = new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
24
 
25
  public static function getNotificationForID($id) {
26
  global $wpdb;
27
+ $prefix = wfDB::networkPrefix();
28
+ $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$prefix}wfNotifications WHERE `id` = %s ORDER BY `priority` ASC, `ctime` DESC", $id), ARRAY_A);
29
  if (count($rawNotifications) == 1) {
30
  $raw = $rawNotifications[0];
31
  return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
35
 
36
  public static function getNotificationForCategory($category, $requireNew = true) {
37
  global $wpdb;
38
+ $prefix = wfDB::networkPrefix();
39
+ $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$prefix}wfNotifications WHERE " . ($requireNew ? '`new` = 1 AND ' : '') . "`category` = %s ORDER BY `priority` ASC, `ctime` DESC LIMIT 1", $category), ARRAY_A);
40
  if (count($rawNotifications) == 1) {
41
  $raw = $rawNotifications[0];
42
  return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
lib/wfScanEngine.php CHANGED
@@ -206,7 +206,7 @@ class wfScanEngine {
206
  $this->status(1, 'info', '-------------------');
207
  $this->status(1, 'info', "Scan interrupted. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
208
  if($this->i->totalIssues > 0){
209
- $this->status(10, 'info', "SUM_FINAL:Scan interrupted. You have " . $this->i->totalIssues . " new issues to fix. See below.");
210
  } else {
211
  $this->status(10, 'info', "SUM_FINAL:Scan interrupted. No problems found prior to stopping.");
212
  }
@@ -266,7 +266,7 @@ class wfScanEngine {
266
  $this->status(1, 'info', '-------------------');
267
  $this->status(1, 'info', "Scan Complete. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
268
  if($this->i->totalIssues > 0){
269
- $this->status(10, 'info', "SUM_FINAL:Scan complete. You have " . $this->i->totalIssues . " new issues to fix. See below.");
270
  } else {
271
  $this->status(10, 'info', "SUM_FINAL:Scan complete. Congratulations, no problems found.");
272
  }
206
  $this->status(1, 'info', '-------------------');
207
  $this->status(1, 'info', "Scan interrupted. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
208
  if($this->i->totalIssues > 0){
209
+ $this->status(10, 'info', "SUM_FINAL:Scan interrupted. You have " . $this->i->totalIssues . " new issue" . ($this->i->totalIssues == 1 ? "" : "s") . " to fix. See below.");
210
  } else {
211
  $this->status(10, 'info', "SUM_FINAL:Scan interrupted. No problems found prior to stopping.");
212
  }
266
  $this->status(1, 'info', '-------------------');
267
  $this->status(1, 'info', "Scan Complete. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
268
  if($this->i->totalIssues > 0){
269
+ $this->status(10, 'info', "SUM_FINAL:Scan complete. You have " . $this->i->totalIssues . " new issue" . ($this->i->totalIssues == 1 ? "" : "s") . " to fix. See below.");
270
  } else {
271
  $this->status(10, 'info', "SUM_FINAL:Scan complete. Congratulations, no problems found.");
272
  }
lib/wfStyle.php CHANGED
@@ -7,7 +7,7 @@ class wfStyle {
7
  */
8
  public static function contentClasses() {
9
  if (wfConfig::get('isPaid')) {
10
- return 'wf-col-xs-12 wf-col-sm-9';
11
  }
12
  return 'wf-col-xs-12 wf-col-sm-9 wf-col-sm-pull-3';
13
  }
7
  */
8
  public static function contentClasses() {
9
  if (wfConfig::get('isPaid')) {
10
+ return 'wf-col-xs-12';
11
  }
12
  return 'wf-col-xs-12 wf-col-sm-9 wf-col-sm-pull-3';
13
  }
lib/wordfenceClass.php CHANGED
@@ -216,6 +216,7 @@ class wordfence {
216
  }
217
  }
218
  if (isset($keyData['dashboard'])) {
 
219
  wfDashboard::processDashboardResponse($keyData['dashboard']);
220
  }
221
  }
@@ -808,6 +809,7 @@ SQL
808
  if (wfConfig::get('loginSec_disableAuthorScan')) {
809
  add_filter('oembed_response_data', 'wordfence::oembedAuthorFilter', 99, 4);
810
  add_filter('rest_request_before_callbacks', 'wordfence::jsonAPIAuthorFilter', 99, 3);
 
811
  }
812
 
813
  // Change GoDaddy's limit login mu-plugin since it can interfere with the two factor auth message.
@@ -1236,12 +1238,13 @@ SQL
1236
  // Sync the WAF data with the database.
1237
  if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) {
1238
  $homeurl = wfUtils::wpHomeURL();
 
1239
 
1240
  try {
1241
  $configDefaults = array(
1242
  'apiKey' => wfConfig::get('apiKey'),
1243
  'isPaid' => wfConfig::get('isPaid'),
1244
- 'siteURL' => site_url(),
1245
  'homeURL' => $homeurl,
1246
  'whitelistedIPs' => (string) wfConfig::get('whitelisted'),
1247
  'howGetIPs' => (string) wfConfig::get('howGetIPs'),
@@ -1426,17 +1429,26 @@ SQL
1426
  if (preg_match('~' . preg_quote($urlBase, '~') . '/*$~i', $route)) {
1427
  $error = new WP_Error('rest_user_cannot_view', __('Sorry, you are not allowed to list users.'), array('status' => rest_authorization_required_code()));
1428
  $response = rest_ensure_response($error);
 
1429
  }
1430
  else if (preg_match('~' . preg_quote($urlBase, '~') . '/+(\d+)/*$~i', $route, $matches)) {
1431
  $id = (int) $matches[1];
1432
  if (get_current_user_id() !== $id) {
1433
  $error = new WP_Error('rest_user_invalid_id', __('Invalid user ID.'), array('status' => 404));
1434
  $response = rest_ensure_response($error);
 
1435
  }
1436
  }
1437
  }
1438
  return $response;
1439
  }
 
 
 
 
 
 
 
1440
  public static function showTwoFactorField() {
1441
  $existingContents = ob_get_contents();
1442
  if (!preg_match('/wftwofactornonce:([0-9]+)\/(.+?)\s/', $existingContents, $matches)) {
@@ -2622,6 +2634,9 @@ SQL
2622
  //When downgrading we must disable all two factor authentication because it can lock an admin out if we don't.
2623
  wfConfig::set_ser('twoFactorUsers', array());
2624
  self::licenseStatusChanged();
 
 
 
2625
  } else {
2626
  throw new Exception("Could not understand the response we received from the Wordfence servers when applying for a free API key.");
2627
  }
@@ -2935,6 +2950,7 @@ SQL
2935
  try {
2936
  $keyData = $api->call('ping_api_key', array(), array());
2937
  if (isset($keyData['dashboard'])) {
 
2938
  wfDashboard::processDashboardResponse($keyData['dashboard']);
2939
  }
2940
  }
@@ -4584,6 +4600,7 @@ HTML;
4584
  wp_enqueue_style('wp-pointer');
4585
  wp_enqueue_script('wp-pointer');
4586
  wp_enqueue_style('wordfence-main-style', wfUtils::getBaseURL() . 'css/main.css', '', WORDFENCE_VERSION);
 
4587
  wp_enqueue_style('wordfence-colorbox-style', wfUtils::getBaseURL() . 'css/colorbox.css', '', WORDFENCE_VERSION);
4588
  wp_enqueue_style('wordfence-dttable-style', wfUtils::getBaseURL() . 'css/dt_table.css', '', WORDFENCE_VERSION);
4589
 
@@ -4595,6 +4612,7 @@ HTML;
4595
  //wp_enqueue_script('jquery.tools', wfUtils::getBaseURL() . 'js/jquery.tools.min.js', array('jquery'));
4596
  wp_enqueue_script('wordfenceAdminjs', wfUtils::getBaseURL() . 'js/admin.js', array('jquery'), WORDFENCE_VERSION);
4597
  wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . 'js/tourTip.js', array('jquery'), WORDFENCE_VERSION);
 
4598
  self::setupAdminVars();
4599
  } else {
4600
  wp_enqueue_style('wp-pointer');
@@ -6305,6 +6323,15 @@ to your httpd.conf if using Apache, or find documentation on how to disable dire
6305
  wfWAF::getInstance()->getStorageEngine()->setConfig('disabledRules', $disabledRules);
6306
  }
6307
  break;
 
 
 
 
 
 
 
 
 
6308
  }
6309
  }
6310
 
@@ -6931,6 +6958,11 @@ LIMIT %d", $lastSendTime, $limit));
6931
  $actionData['ssl'] = $ssl;
6932
  $actionData['fullRequest'] = base64_encode($requestString);
6933
  }
 
 
 
 
 
6934
  }
6935
 
6936
  $hit->actionData = wfRequestModel::serializeActionData($actionData);
216
  }
217
  }
218
  if (isset($keyData['dashboard'])) {
219
+ wfConfig::set('lastDashboardCheck', time());
220
  wfDashboard::processDashboardResponse($keyData['dashboard']);
221
  }
222
  }
809
  if (wfConfig::get('loginSec_disableAuthorScan')) {
810
  add_filter('oembed_response_data', 'wordfence::oembedAuthorFilter', 99, 4);
811
  add_filter('rest_request_before_callbacks', 'wordfence::jsonAPIAuthorFilter', 99, 3);
812
+ add_filter('rest_post_dispatch', 'wordfence::jsonAPIAdjustHeaders', 99, 3);
813
  }
814
 
815
  // Change GoDaddy's limit login mu-plugin since it can interfere with the two factor auth message.
1238
  // Sync the WAF data with the database.
1239
  if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) {
1240
  $homeurl = wfUtils::wpHomeURL();
1241
+ $siteurl = wfUtils::wpSiteURL();
1242
 
1243
  try {
1244
  $configDefaults = array(
1245
  'apiKey' => wfConfig::get('apiKey'),
1246
  'isPaid' => wfConfig::get('isPaid'),
1247
+ 'siteURL' => $siteurl,
1248
  'homeURL' => $homeurl,
1249
  'whitelistedIPs' => (string) wfConfig::get('whitelisted'),
1250
  'howGetIPs' => (string) wfConfig::get('howGetIPs'),
1429
  if (preg_match('~' . preg_quote($urlBase, '~') . '/*$~i', $route)) {
1430
  $error = new WP_Error('rest_user_cannot_view', __('Sorry, you are not allowed to list users.'), array('status' => rest_authorization_required_code()));
1431
  $response = rest_ensure_response($error);
1432
+ define('WORDFENCE_REST_API_SUPPRESSED', true);
1433
  }
1434
  else if (preg_match('~' . preg_quote($urlBase, '~') . '/+(\d+)/*$~i', $route, $matches)) {
1435
  $id = (int) $matches[1];
1436
  if (get_current_user_id() !== $id) {
1437
  $error = new WP_Error('rest_user_invalid_id', __('Invalid user ID.'), array('status' => 404));
1438
  $response = rest_ensure_response($error);
1439
+ define('WORDFENCE_REST_API_SUPPRESSED', true);
1440
  }
1441
  }
1442
  }
1443
  return $response;
1444
  }
1445
+ public static function jsonAPIAdjustHeaders($response, $server, $request) {
1446
+ if (defined('WORDFENCE_REST_API_SUPPRESSED')) {
1447
+ $response->header('Allow', 'GET');
1448
+ }
1449
+
1450
+ return $response;
1451
+ }
1452
  public static function showTwoFactorField() {
1453
  $existingContents = ob_get_contents();
1454
  if (!preg_match('/wftwofactornonce:([0-9]+)\/(.+?)\s/', $existingContents, $matches)) {
2634
  //When downgrading we must disable all two factor authentication because it can lock an admin out if we don't.
2635
  wfConfig::set_ser('twoFactorUsers', array());
2636
  self::licenseStatusChanged();
2637
+ if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) {
2638
+ wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
2639
+ }
2640
  } else {
2641
  throw new Exception("Could not understand the response we received from the Wordfence servers when applying for a free API key.");
2642
  }
2950
  try {
2951
  $keyData = $api->call('ping_api_key', array(), array());
2952
  if (isset($keyData['dashboard'])) {
2953
+ wfConfig::set('lastDashboardCheck', time());
2954
  wfDashboard::processDashboardResponse($keyData['dashboard']);
2955
  }
2956
  }
4600
  wp_enqueue_style('wp-pointer');
4601
  wp_enqueue_script('wp-pointer');
4602
  wp_enqueue_style('wordfence-main-style', wfUtils::getBaseURL() . 'css/main.css', '', WORDFENCE_VERSION);
4603
+ wp_enqueue_style('wordfence-ionicons-style', wfUtils::getBaseURL() . 'css/wf-ionicons.css', '', WORDFENCE_VERSION);
4604
  wp_enqueue_style('wordfence-colorbox-style', wfUtils::getBaseURL() . 'css/colorbox.css', '', WORDFENCE_VERSION);
4605
  wp_enqueue_style('wordfence-dttable-style', wfUtils::getBaseURL() . 'css/dt_table.css', '', WORDFENCE_VERSION);
4606
 
4612
  //wp_enqueue_script('jquery.tools', wfUtils::getBaseURL() . 'js/jquery.tools.min.js', array('jquery'));
4613
  wp_enqueue_script('wordfenceAdminjs', wfUtils::getBaseURL() . 'js/admin.js', array('jquery'), WORDFENCE_VERSION);
4614
  wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . 'js/tourTip.js', array('jquery'), WORDFENCE_VERSION);
4615
+ wp_enqueue_script('wordfenceDropdownjs', wfUtils::getBaseURL() . 'js/wfdropdown.js', array('jquery'), WORDFENCE_VERSION);
4616
  self::setupAdminVars();
4617
  } else {
4618
  wp_enqueue_style('wp-pointer');
6323
  wfWAF::getInstance()->getStorageEngine()->setConfig('disabledRules', $disabledRules);
6324
  }
6325
  break;
6326
+ case 'disableWAFBlacklistBlocking':
6327
+ if (isset($_POST['disableWAFBlacklistBlocking'])) {
6328
+ $disableWAFBlacklistBlocking = (int) $_POST['disableWAFBlacklistBlocking'];
6329
+ wfWAF::getInstance()->getStorageEngine()->setConfig('disableWAFBlacklistBlocking', $disableWAFBlacklistBlocking);
6330
+ if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) {
6331
+ wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
6332
+ }
6333
+ }
6334
+ break;
6335
  }
6336
  }
6337
 
6958
  $actionData['ssl'] = $ssl;
6959
  $actionData['fullRequest'] = base64_encode($requestString);
6960
  }
6961
+ else if ($ruleIDs[0] == 'blocked') {
6962
+ $actionData['category'] = 'blocked';
6963
+ $actionData['ssl'] = $ssl;
6964
+ $actionData['fullRequest'] = base64_encode($requestString);
6965
+ }
6966
  }
6967
 
6968
  $hit->actionData = wfRequestModel::serializeActionData($actionData);
lib/wordfenceScanner.php CHANGED
@@ -322,7 +322,7 @@ class wordfenceScanner {
322
  'ignoreP' => $this->path . $file,
323
  'ignoreC' => $fileSum,
324
  'shortMsg' => "File appears to be malicious: " . esc_html($file),
325
- 'longMsg' => "This file appears to be installed by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans. The text we found in this file that matches a known malicious file is: <strong style=\"color: #F00;\">\"" . wfUtils::potentialBinaryStringToHTML((strlen($matchString) > 200 ? substr($matchString, 0, 200) . '...' : $matchString)) . "\"</strong>. The infection type is: <strong>" . esc_html($rule[3]) . '</strong>.' . $extraMsg,
326
  'data' => array_merge(array(
327
  'file' => $file,
328
  ), $dataForFile),
@@ -354,7 +354,7 @@ class wordfenceScanner {
354
  'ignoreP' => $this->path . $file,
355
  'ignoreC' => $fileSum,
356
  'shortMsg' => "This file may contain malicious executable code: " . esc_html($this->path . $file),
357
- 'longMsg' => "This file is a PHP executable file and contains the word 'eval' (without quotes) and the word '" . esc_html($badStringFound) . "' (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.",
358
  'data' => array_merge(array(
359
  'file' => $file,
360
  ), $dataForFile),
322
  'ignoreP' => $this->path . $file,
323
  'ignoreC' => $fileSum,
324
  'shortMsg' => "File appears to be malicious: " . esc_html($file),
325
+ 'longMsg' => "This file appears to be installed by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans. The text we found in this file that matches a known malicious file is: <strong style=\"color: #F00;\" class=\"wf-split-word\">\"" . wfUtils::potentialBinaryStringToHTML((strlen($matchString) > 200 ? substr($matchString, 0, 200) . '...' : $matchString)) . "\"</strong>. The infection type is: <strong>" . esc_html($rule[3]) . '</strong>.' . $extraMsg,
326
  'data' => array_merge(array(
327
  'file' => $file,
328
  ), $dataForFile),
354
  'ignoreP' => $this->path . $file,
355
  'ignoreC' => $fileSum,
356
  'shortMsg' => "This file may contain malicious executable code: " . esc_html($this->path . $file),
357
+ 'longMsg' => "This file is a PHP executable file and contains the word 'eval' (without quotes) and the word '<span class=\"wf-split-word\">" . esc_html($badStringFound) . "</span>' (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.",
358
  'data' => array_merge(array(
359
  'file' => $file,
360
  ), $dataForFile),
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: mmaunder
3
  Tags: security, secure, security plugin, wordpress security, login security, firewall, malware, antivirus, web application firewall, block hackers, country blocking
4
  Requires at least: 3.9
5
- Tested up to: 4.7.2
6
- Stable tag: 6.3.2
7
 
8
  Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
9
 
@@ -161,6 +161,16 @@ Secure your website with Wordfence.
161
 
162
  == Changelog ==
163
 
 
 
 
 
 
 
 
 
 
 
164
  = 6.3.2 =
165
  * Improvement: Improved the WAF's ability to inspect POST bodies.
166
  * Improvement: Dashboard now shows up to 100 each of failed/successful logins.
2
  Contributors: mmaunder
3
  Tags: security, secure, security plugin, wordpress security, login security, firewall, malware, antivirus, web application firewall, block hackers, country blocking
4
  Requires at least: 3.9
5
+ Tested up to: 4.7.3
6
+ Stable tag: 6.3.3
7
 
8
  Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
9
 
161
 
162
  == Changelog ==
163
 
164
+ = 6.3.3 =
165
+ * New: Malicious IPs are now preemptively blocked by a regularly-updated blacklist. [Premium Feature]
166
+ * Improvement: Better layout and display for mobile screen sizes.
167
+ * Improvement: Dashboard chart data is now updated more frequently.
168
+ * Fix: Fixed database errors on notifications page on multisite installations.
169
+ * Fix: Fixed site URL detection for multisite installations.
170
+ * Fix: Fixed tour popup positioning on multisite.
171
+ * Fix: Increased the z-index of the AJAX error watcher alert.
172
+ * Fix: Addressed an additional way to enumerate authors with the REST JSON API.
173
+
174
  = 6.3.2 =
175
  * Improvement: Improved the WAF's ability to inspect POST bodies.
176
  * Improvement: Dashboard now shows up to 100 each of failed/successful logins.
vendor/wordfence/wf-waf/src/init.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- define('WFWAF_VERSION', '1.0.2');
4
  define('WFWAF_PATH', dirname(__FILE__) . '/');
5
  define('WFWAF_LIB_PATH', WFWAF_PATH . 'lib/');
6
  define('WFWAF_VIEW_PATH', WFWAF_PATH . 'views/');
1
  <?php
2
 
3
+ define('WFWAF_VERSION', '1.0.3');
4
  define('WFWAF_PATH', dirname(__FILE__) . '/');
5
  define('WFWAF_LIB_PATH', WFWAF_PATH . 'lib/');
6
  define('WFWAF_VIEW_PATH', WFWAF_PATH . 'views/');
vendor/wordfence/wf-waf/src/lib/request.php CHANGED
@@ -464,8 +464,11 @@ class wfWAFRequest implements wfWAFRequestInterface {
464
  $nestedCookies = $this->getCookieString($cookieValue, $resolvedName);
465
  $cookieString .= $nestedCookies;
466
  }
467
- else
468
- {
 
 
 
469
  $cookieString .= $resolvedName . '=' . urlencode($cookieValue) . '; ';
470
  }
471
  }
464
  $nestedCookies = $this->getCookieString($cookieValue, $resolvedName);
465
  $cookieString .= $nestedCookies;
466
  }
467
+ else {
468
+ if (strpos($resolvedName, 'wordpress_') === 0) {
469
+ $cookieValue = '<redacted>';
470
+ }
471
+
472
  $cookieString .= $resolvedName . '=' . urlencode($cookieValue) . '; ';
473
  }
474
  }
vendor/wordfence/wf-waf/src/lib/storage.php CHANGED
@@ -1,6 +1,10 @@
1
  <?php
2
 
3
  interface wfWAFStorageInterface {
 
 
 
 
4
  public function hasPreviousAttackData($olderThan);
5
 
6
  public function hasNewerAttackData($newerThan);
@@ -42,6 +46,8 @@ interface wfWAFStorageInterface {
42
  public function blockIP($timestamp, $ip);
43
 
44
  public function isIPBlocked($ip);
 
 
45
 
46
  public function getConfig($key, $default = null);
47
 
1
  <?php
2
 
3
  interface wfWAFStorageInterface {
4
+ const IP_BLOCKS_ALL = PHP_INT_MAX;
5
+ const IP_BLOCKS_SINGLE = 1; //1 << 0
6
+ const IP_BLOCKS_BLACKLIST = 2; //1 << 1
7
+
8
  public function hasPreviousAttackData($olderThan);
9
 
10
  public function hasNewerAttackData($newerThan);
46
  public function blockIP($timestamp, $ip);
47
 
48
  public function isIPBlocked($ip);
49
+
50
+ public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL);
51
 
52
  public function getConfig($key, $default = null);
53
 
vendor/wordfence/wf-waf/src/lib/storage/file.php CHANGED
@@ -3,6 +3,7 @@
3
  class wfWAFStorageFile implements wfWAFStorageInterface {
4
 
5
  const LOG_FILE_HEADER = "<?php exit('Access denied'); __halt_compiler(); ?>\n";
 
6
 
7
  public static function atomicFilePutContents($file, $content, $prefix = 'config') {
8
  $tmpFile = @tempnam(dirname($file), $prefix . '.tmp.');
@@ -291,12 +292,12 @@ class wfWAFStorageFile implements wfWAFStorageInterface {
291
  * @return mixed|void
292
  * @throws wfWAFStorageFileException
293
  */
294
- public function blockIP($timestamp, $ip) {
295
  $this->open();
296
  if (!$this->isIPBlocked($ip)) {
297
  self::lock($this->ipCacheFileHandle, LOCK_EX);
298
  fseek($this->ipCacheFileHandle, 0, SEEK_END);
299
- fwrite($this->ipCacheFileHandle, wfWAFUtils::inet_pton($ip) . pack('V', $timestamp));
300
  fflush($this->ipCacheFileHandle);
301
  self::lock($this->ipCacheFileHandle, LOCK_UN);
302
  }
@@ -312,11 +313,15 @@ class wfWAFStorageFile implements wfWAFStorageInterface {
312
  fseek($this->ipCacheFileHandle, wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET);
313
  self::lock($this->ipCacheFileHandle, LOCK_SH);
314
  while (!feof($this->ipCacheFileHandle)) {
315
- $ipStr = fread($this->ipCacheFileHandle, 20);
316
  $ip2 = wfWAFUtils::substr($ipStr, 0, 16);
317
- if ($ipBin === $ip2 && unpack('V', wfWAFUtils::substr($ipStr, 16, 4)) >= time()) {
318
- self::lock($this->ipCacheFileHandle, LOCK_UN);
319
- return true;
 
 
 
 
320
  }
321
  }
322
  self::lock($this->ipCacheFileHandle, LOCK_UN);
@@ -384,19 +389,54 @@ class wfWAFStorageFile implements wfWAFStorageInterface {
384
  $writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
385
  fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
386
  self::lock($this->ipCacheFileHandle, LOCK_EX);
 
387
  while (!feof($this->ipCacheFileHandle)) {
388
- $ipCacheRow = fread($this->ipCacheFileHandle, 20);
389
- $expires = unpack('V', wfWAFUtils::substr($ipCacheRow, 16, 4));
390
- if ($expires >= time()) {
391
- fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET);
392
- fwrite($this->ipCacheFileHandle, $ipCacheRow);
393
- $writePointer += 20;
394
- fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
 
395
  }
396
- $readPointer += 20;
397
  fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  }
399
  ftruncate($this->ipCacheFileHandle, $writePointer);
 
400
  self::lock($this->ipCacheFileHandle, LOCK_UN);
401
  }
402
 
3
  class wfWAFStorageFile implements wfWAFStorageInterface {
4
 
5
  const LOG_FILE_HEADER = "<?php exit('Access denied'); __halt_compiler(); ?>\n";
6
+ const IP_BLOCK_RECORD_SIZE = 24;
7
 
8
  public static function atomicFilePutContents($file, $content, $prefix = 'config') {
9
  $tmpFile = @tempnam(dirname($file), $prefix . '.tmp.');
292
  * @return mixed|void
293
  * @throws wfWAFStorageFileException
294
  */
295
+ public function blockIP($timestamp, $ip, $type = wfWAFStorageInterface::IP_BLOCKS_SINGLE) {
296
  $this->open();
297
  if (!$this->isIPBlocked($ip)) {
298
  self::lock($this->ipCacheFileHandle, LOCK_EX);
299
  fseek($this->ipCacheFileHandle, 0, SEEK_END);
300
+ fwrite($this->ipCacheFileHandle, wfWAFUtils::inet_pton($ip) . pack('V', $timestamp) . pack('V', $type));
301
  fflush($this->ipCacheFileHandle);
302
  self::lock($this->ipCacheFileHandle, LOCK_UN);
303
  }
313
  fseek($this->ipCacheFileHandle, wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET);
314
  self::lock($this->ipCacheFileHandle, LOCK_SH);
315
  while (!feof($this->ipCacheFileHandle)) {
316
+ $ipStr = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
317
  $ip2 = wfWAFUtils::substr($ipStr, 0, 16);
318
+ $unpacked = @unpack('V', wfWAFUtils::substr($ipStr, 16, 4));
319
+ if (is_array($unpacked)) {
320
+ $t = array_shift($unpacked);
321
+ if ($ipBin === $ip2 && $t >= time()) {
322
+ self::lock($this->ipCacheFileHandle, LOCK_UN);
323
+ return true;
324
+ }
325
  }
326
  }
327
  self::lock($this->ipCacheFileHandle, LOCK_UN);
389
  $writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
390
  fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
391
  self::lock($this->ipCacheFileHandle, LOCK_EX);
392
+ $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
393
  while (!feof($this->ipCacheFileHandle)) {
394
+ $unpacked = @unpack('V', wfWAFUtils::substr($ipCacheRow, 16, 4));
395
+ if (is_array($unpacked)) {
396
+ $expires = array_shift($unpacked);
397
+ if ($expires >= time()) {
398
+ fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET);
399
+ fwrite($this->ipCacheFileHandle, $ipCacheRow);
400
+ $writePointer += self::IP_BLOCK_RECORD_SIZE;
401
+ }
402
  }
403
+ $readPointer += self::IP_BLOCK_RECORD_SIZE;
404
  fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
405
+ $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
406
+ }
407
+ ftruncate($this->ipCacheFileHandle, $writePointer);
408
+ fflush($this->ipCacheFileHandle);
409
+ self::lock($this->ipCacheFileHandle, LOCK_UN);
410
+ }
411
+
412
+ /**
413
+ * Remove all existing IP blocks.
414
+ */
415
+ public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL) {
416
+ $this->open();
417
+ $readPointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
418
+ $writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
419
+ fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
420
+ self::lock($this->ipCacheFileHandle, LOCK_EX);
421
+ if ($types !== wfWAFStorageInterface::IP_BLOCKS_ALL) {
422
+ $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
423
+ while (!feof($this->ipCacheFileHandle)) {
424
+ $unpacked = @unpack('Vexpires/Vtype', wfWAFUtils::substr($ipCacheRow, 16, 8));
425
+ if (is_array($unpacked)) {
426
+ $type = $unpacked['type'];
427
+ if (($type & $types) == 0) {
428
+ fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET);
429
+ fwrite($this->ipCacheFileHandle, $ipCacheRow);
430
+ $writePointer += self::IP_BLOCK_RECORD_SIZE;
431
+ }
432
+ }
433
+ $readPointer += self::IP_BLOCK_RECORD_SIZE;
434
+ fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
435
+ $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
436
+ }
437
  }
438
  ftruncate($this->ipCacheFileHandle, $writePointer);
439
+ fflush($this->ipCacheFileHandle);
440
  self::lock($this->ipCacheFileHandle, LOCK_UN);
441
  }
442
 
vendor/wordfence/wf-waf/src/lib/waf.php CHANGED
@@ -165,6 +165,8 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
165
  if ($this->isIPBlocked($ip)) {
166
  $this->eventBus->prevBlocked($ip);
167
  $e = new wfWAFBlockException();
 
 
168
  $this->blockAction($e);
169
  }
170
 
@@ -311,6 +313,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
311
  new wfWAFCronFetchRulesEvent(time() +
312
  (86400 * ($this->getStorageEngine()->getConfig('isPaid') ? .5 : 7))),
313
  new wfWAFCronFetchIPListEvent(time() + 86400),
 
314
  );
315
  $this->getStorageEngine()->setConfig('cron', $cron);
316
  }
@@ -330,6 +333,20 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
330
  $event->fire();
331
  }
332
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
333
  $this->getStorageEngine()->setConfig('version', WFWAF_VERSION);
334
  }
335
  }
@@ -436,7 +453,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
436
 
437
  $authKey = $this->getStorageEngine()->getConfig('authKey');
438
  $encoded = base64_decode($encoded);
439
- $paddedKey = substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded));
440
  $json = $encoded ^ $paddedKey;
441
  $signatures = wfWAFUtils::json_decode($json, true);
442
  if (!is_array($signatures)) {
@@ -462,7 +479,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
462
 
463
  $authKey = $this->getStorageEngine()->getConfig('authKey');
464
  $json = wfWAFUtils::json_encode($signatures);
465
- $paddedKey = substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json));
466
  $payload = $json ^ $paddedKey;
467
  $this->getStorageEngine()->setConfig('filePatterns', base64_encode($payload));
468
 
@@ -791,7 +808,6 @@ HTML
791
  */
792
  public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
793
  $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata());
794
- $this->getStorageEngine()->blockIP($this->getRequest()->getTimestamp(), $this->getRequest()->getIP());
795
 
796
  if ($redirect) {
797
  wfWAFUtils::redirect($redirect); // exits
@@ -1553,7 +1569,7 @@ class wfWAFCronFetchIPListEvent extends wfWAFCronEvent {
1553
  }
1554
  $guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
1555
  try {
1556
-
1557
  $request = new wfWAFHTTP();
1558
  $request->setHeaders(array(
1559
  'Content-Type' => 'application/json',
@@ -1590,6 +1606,47 @@ class wfWAFCronFetchIPListEvent extends wfWAFCronEvent {
1590
  }
1591
  }
1592
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1593
  class wfWAFEventBus implements wfWAFObserver {
1594
 
1595
  private $observers = array();
165
  if ($this->isIPBlocked($ip)) {
166
  $this->eventBus->prevBlocked($ip);
167
  $e = new wfWAFBlockException();
168
+ $e->setRequest($this->getRequest());
169
+ $e->setFailedRules(array('blocked'));
170
  $this->blockAction($e);
171
  }
172
 
313
  new wfWAFCronFetchRulesEvent(time() +
314
  (86400 * ($this->getStorageEngine()->getConfig('isPaid') ? .5 : 7))),
315
  new wfWAFCronFetchIPListEvent(time() + 86400),
316
+ new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200),
317
  );
318
  $this->getStorageEngine()->setConfig('cron', $cron);
319
  }
333
  $event->fire();
334
  }
335
 
336
+ if (version_compare($currentVersion, '1.0.3') === -1) {
337
+ $this->getStorageEngine()->purgeIPBlocks();
338
+
339
+ $cron = $this->getStorageEngine()->getConfig('cron');
340
+ if (is_array($cron)) {
341
+ $cron[] = new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200);
342
+ }
343
+ $this->getStorageEngine()->setConfig('cron', $cron);
344
+
345
+ $event = new wfWAFCronFetchBlacklistPrefixesEvent(time() - 2);
346
+ $event->setWaf($this);
347
+ $event->fire();
348
+ }
349
+
350
  $this->getStorageEngine()->setConfig('version', WFWAF_VERSION);
351
  }
352
  }
453
 
454
  $authKey = $this->getStorageEngine()->getConfig('authKey');
455
  $encoded = base64_decode($encoded);
456
+ $paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded));
457
  $json = $encoded ^ $paddedKey;
458
  $signatures = wfWAFUtils::json_decode($json, true);
459
  if (!is_array($signatures)) {
479
 
480
  $authKey = $this->getStorageEngine()->getConfig('authKey');
481
  $json = wfWAFUtils::json_encode($signatures);
482
+ $paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json));
483
  $payload = $json ^ $paddedKey;
484
  $this->getStorageEngine()->setConfig('filePatterns', base64_encode($payload));
485
 
808
  */
809
  public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
810
  $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata());
 
811
 
812
  if ($redirect) {
813
  wfWAFUtils::redirect($redirect); // exits
1569
  }
1570
  $guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
1571
  try {
1572
+ //Watch List
1573
  $request = new wfWAFHTTP();
1574
  $request->setHeaders(array(
1575
  'Content-Type' => 'application/json',
1606
  }
1607
  }
1608
 
1609
+ class wfWAFCronFetchBlacklistPrefixesEvent extends wfWAFCronEvent {
1610
+
1611
+ public function fire() {
1612
+ $waf = $this->getWaf();
1613
+ if (!$waf) {
1614
+ return;
1615
+ }
1616
+ $guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
1617
+ try {
1618
+ if ($waf->getStorageEngine()->getConfig('isPaid')) {
1619
+ $request = new wfWAFHTTP();
1620
+ $response = wfWAFHTTP::get(WFWAF_API_URL_SEC . 'blacklist-prefixes.bin' . "?" . http_build_query(array(
1621
+ 'k' => $waf->getStorageEngine()->getConfig('apiKey'),
1622
+ 's' => $waf->getStorageEngine()->getConfig('siteURL') ? $waf->getStorageEngine()->getConfig('siteURL') : $guessSiteURL,
1623
+ 'h' => $waf->getStorageEngine()->getConfig('homeURL') ? $waf->getStorageEngine()->getConfig('homeURL') : $guessSiteURL,
1624
+ 't' => microtime(true),
1625
+ ), null, '&'), $request);
1626
+
1627
+ if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
1628
+ $waf->getStorageEngine()->setConfig('blockedPrefixes', base64_encode($response->getBody()));
1629
+ $waf->getStorageEngine()->setConfig('blacklistAllowedCache', '');
1630
+ }
1631
+ }
1632
+ } catch (wfWAFHTTPTransportException $e) {
1633
+ error_log($e->getMessage());
1634
+ }
1635
+ }
1636
+
1637
+ /**
1638
+ * @return wfWAFCronEvent|bool
1639
+ */
1640
+ public function reschedule() {
1641
+ $waf = $this->getWaf();
1642
+ if (!$waf) {
1643
+ return false;
1644
+ }
1645
+ $newEvent = new self(time() + 7200);
1646
+ return $newEvent;
1647
+ }
1648
+ }
1649
+
1650
  class wfWAFEventBus implements wfWAFObserver {
1651
 
1652
  private $observers = array();
waf/bootstrap.php CHANGED
@@ -180,7 +180,7 @@ class wfWAFWordPressObserver extends wfWAFBaseObserver {
180
  foreach ($whitelistedURLs as $whitelistedURL) {
181
  $whitelistPattern .= preg_replace('/\\\\\*/', '.*?', preg_quote($whitelistedURL, '/')) . '|';
182
  }
183
- $whitelistPattern = '/^(?:' . substr($whitelistPattern, 0, -1) . ')$/i';
184
 
185
  wfWAFRule::create(wfWAF::getInstance(), 0x8000000, 'rule', 'whitelist', 0, 'User Supplied Whitelisted URL', 'allow',
186
  new wfWAFRuleComparisonGroup(
@@ -214,6 +214,56 @@ class wfWAFWordPressObserver extends wfWAFBaseObserver {
214
 
215
  public function afterRunRules()
216
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
  //wfWAFLogException
218
  $watchedIPs = wfWAF::getInstance()->getStorageEngine()->getConfig('watchedIPs');
219
  if ($watchedIPs) {
@@ -234,6 +284,34 @@ class wfWAFWordPressObserver extends wfWAFBaseObserver {
234
  throw $e;
235
  }
236
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
  }
238
 
239
  /**
@@ -249,14 +327,18 @@ class wfWAFWordPress extends wfWAF {
249
  * @param int $httpCode
250
  */
251
  public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
252
- if ($this->isInLearningMode() && !$e->getRequest()->getMetadata('finalAction')) {
 
 
 
 
 
253
  register_shutdown_function(array(
254
  $this, 'whitelistFailedRulesIfNot404',
255
  ));
256
  $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest());
257
  $this->setLearningModeAttackException($e);
258
  } else {
259
- $failedRules = $e->getFailedRules();
260
  if (empty($failedRules)) {
261
  $finalAction = $e->getRequest()->getMetadata('finalAction');
262
  if (is_array($finalAction)) {
@@ -343,17 +425,29 @@ class wfWAFWordPress extends wfWAF {
343
  $cron = $this->getStorageEngine()->getConfig('cron');
344
  if (is_array($cron)) {
345
  /** @var wfWAFCronEvent $event */
 
346
  foreach ($cron as $index => $event) {
347
  $event->setWaf($this);
348
  if ($event->isInPast()) {
349
  $event->fire();
350
  $newEvent = $event->reschedule();
351
- if ($newEvent instanceof wfWAFCronEvent && $newEvent !== $event) {
 
352
  $cron[$index] = $newEvent;
 
353
  } else {
354
  unset($cron[$index]);
355
  }
356
  }
 
 
 
 
 
 
 
 
 
357
  }
358
  }
359
  $this->getStorageEngine()->setConfig('cron', $cron);
@@ -379,7 +473,7 @@ class wfWAFWordPress extends wfWAF {
379
  * @return mixed
380
  */
381
  public function isIPBlocked($ip) {
382
- return false;
383
  }
384
 
385
  /**
180
  foreach ($whitelistedURLs as $whitelistedURL) {
181
  $whitelistPattern .= preg_replace('/\\\\\*/', '.*?', preg_quote($whitelistedURL, '/')) . '|';
182
  }
183
+ $whitelistPattern = '/^(?:' . wfWAFUtils::substr($whitelistPattern, 0, -1) . ')$/i';
184
 
185
  wfWAFRule::create(wfWAF::getInstance(), 0x8000000, 'rule', 'whitelist', 0, 'User Supplied Whitelisted URL', 'allow',
186
  new wfWAFRuleComparisonGroup(
214
 
215
  public function afterRunRules()
216
  {
217
+ //Blacklist
218
+ if (!wfWAF::getInstance()->getStorageEngine()->getConfig('disableWAFBlacklistBlocking')) {
219
+ $blockedPrefixes = wfWAF::getInstance()->getStorageEngine()->getConfig('blockedPrefixes');
220
+ if ($blockedPrefixes && wfWAF::getInstance()->getStorageEngine()->getConfig('isPaid')) {
221
+ $blockedPrefixes = base64_decode($blockedPrefixes);
222
+ if ($this->_prefixListContainsIP($blockedPrefixes, wfWAF::getInstance()->getRequest()->getIP()) !== false) {
223
+ $allowedCacheJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('blacklistAllowedCache', '');
224
+ $allowedCache = @json_decode($allowedCacheJSON, true);
225
+ if (!is_array($allowedCache)) {
226
+ $allowedCache = array();
227
+ }
228
+
229
+ $cacheTest = base64_encode(wfWAFUtils::inet_pton(wfWAF::getInstance()->getRequest()->getIP()));
230
+ if (!in_array($cacheTest, $allowedCache)) {
231
+ $guessSiteURL = sprintf('%s://%s/', wfWAF::getInstance()->getRequest()->getProtocol(), wfWAF::getInstance()->getRequest()->getHost());
232
+ try {
233
+ $request = new wfWAFHTTP();
234
+ $response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query(array(
235
+ 'action' => 'is_ip_blacklisted',
236
+ 'ip' => wfWAF::getInstance()->getRequest()->getIP(),
237
+ 'k' => wfWAF::getInstance()->getStorageEngine()->getConfig('apiKey'),
238
+ 's' => wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL') ? wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL') : $guessSiteURL,
239
+ 'h' => wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL') ? wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL') : $guessSiteURL,
240
+ 't' => microtime(true),
241
+ ), null, '&'), $request);
242
+
243
+ if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
244
+ $jsonData = wfWAFUtils::json_decode($response->getBody(), true);
245
+ if (array_key_exists('data', $jsonData)) {
246
+ if (preg_match('/^block:(\d+)$/i', $jsonData['data'], $matches)) {
247
+ wfWAF::getInstance()->getStorageEngine()->blockIP((int)$matches[1] + time(), wfWAF::getInstance()->getRequest()->getIP(), wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
248
+ $e = new wfWAFBlockException();
249
+ $e->setFailedRules(array('blocked'));
250
+ $e->setRequest(wfWAF::getInstance()->getRequest());
251
+ throw $e;
252
+ }
253
+ else { //Allowed, cache until the next prefix list refresh
254
+ $allowedCache[] = $cacheTest;
255
+ wfWAF::getInstance()->getStorageEngine()->setConfig('blacklistAllowedCache', json_encode($allowedCache));
256
+ }
257
+ }
258
+ }
259
+ } catch (wfWAFHTTPTransportException $e) {
260
+ error_log($e->getMessage());
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+
267
  //wfWAFLogException
268
  $watchedIPs = wfWAF::getInstance()->getStorageEngine()->getConfig('watchedIPs');
269
  if ($watchedIPs) {
284
  throw $e;
285
  }
286
  }
287
+
288
+ private function _prefixListContainsIP($prefixList, $ip) {
289
+ $size = ord(wfWAFUtils::substr($prefixList, 0, 1));
290
+
291
+ $sha256 = hash('sha256', wfWAFUtils::inet_pton($ip), true);
292
+ $p = wfWAFUtils::substr($sha256, 0, $size);
293
+
294
+ $count = ceil((wfWAFUtils::strlen($prefixList) - 1) / $size);
295
+ $low = 0;
296
+ $high = $count - 1;
297
+
298
+ while ($low <= $high) {
299
+ $mid = (int) (($high + $low) / 2);
300
+ $val = wfWAFUtils::substr($prefixList, 1 + $mid * $size, $size);
301
+ $cmp = strcmp($val, $p);
302
+ if ($cmp < 0) {
303
+ $low = $mid + 1;
304
+ }
305
+ else if ($cmp > 0) {
306
+ $high = $mid - 1;
307
+ }
308
+ else {
309
+ return $mid;
310
+ }
311
+ }
312
+
313
+ return false;
314
+ }
315
  }
316
 
317
  /**
327
  * @param int $httpCode
328
  */
329
  public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
330
+ $failedRules = $e->getFailedRules();
331
+ if (!is_array($failedRules)) {
332
+ $failedRules = array();
333
+ }
334
+
335
+ if ($this->isInLearningMode() && !$e->getRequest()->getMetadata('finalAction') && !in_array('blocked', $failedRules)) {
336
  register_shutdown_function(array(
337
  $this, 'whitelistFailedRulesIfNot404',
338
  ));
339
  $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest());
340
  $this->setLearningModeAttackException($e);
341
  } else {
 
342
  if (empty($failedRules)) {
343
  $finalAction = $e->getRequest()->getMetadata('finalAction');
344
  if (is_array($finalAction)) {
425
  $cron = $this->getStorageEngine()->getConfig('cron');
426
  if (is_array($cron)) {
427
  /** @var wfWAFCronEvent $event */
428
+ $cronDeduplication = array();
429
  foreach ($cron as $index => $event) {
430
  $event->setWaf($this);
431
  if ($event->isInPast()) {
432
  $event->fire();
433
  $newEvent = $event->reschedule();
434
+ $className = get_class($newEvent);
435
+ if ($newEvent instanceof wfWAFCronEvent && $newEvent !== $event && !in_array($className, $cronDeduplication)) {
436
  $cron[$index] = $newEvent;
437
+ $cronDeduplication[] = $className;
438
  } else {
439
  unset($cron[$index]);
440
  }
441
  }
442
+ else {
443
+ $className = get_class($event);
444
+ if (in_array($className, $cronDeduplication)) {
445
+ unset($cron[$index]);
446
+ }
447
+ else {
448
+ $cronDeduplication[] = $className;
449
+ }
450
+ }
451
  }
452
  }
453
  $this->getStorageEngine()->setConfig('cron', $cron);
473
  * @return mixed
474
  */
475
  public function isIPBlocked($ip) {
476
+ return parent::isIPBlocked($ip);
477
  }
478
 
479
  /**
wordfence.php CHANGED
@@ -4,14 +4,14 @@ Plugin Name: Wordfence Security
4
  Plugin URI: http://www.wordfence.com/
5
  Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
6
  Author: Wordfence
7
- Version: 6.3.2
8
  Author URI: http://www.wordfence.com/
9
  Network: true
10
  */
11
  if(defined('WP_INSTALLING') && WP_INSTALLING){
12
  return;
13
  }
14
- define('WORDFENCE_VERSION', '6.3.2');
15
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
16
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
17
 
4
  Plugin URI: http://www.wordfence.com/
5
  Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
6
  Author: Wordfence
7
+ Version: 6.3.3
8
  Author URI: http://www.wordfence.com/
9
  Network: true
10
  */
11
  if(defined('WP_INSTALLING') && WP_INSTALLING){
12
  return;
13
  }
14
+ define('WORDFENCE_VERSION', '6.3.3');
15
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
16
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
17