WordPress Zero Spam - Version 2.0.0

Version Description

  • Added CloudFlare instructions (https://github.com/bmarshall511/wordpress-zero-spam/pull/107)
  • Added ability to integrate with any theme or plugin (https://github.com/bmarshall511/wordpress-zero-spam/issues/116)
  • Added support for Ninja Forms (https://github.com/bmarshall511/wordpress-zero-spam/issues/114)
  • Complete rewrite of plugin code & structure
  • Added plugin icon
Download this release

Release Info

Developer bmarshall511
Plugin Icon 128x128 WordPress Zero Spam
Version 2.0.0
Comparing to
See all releases

Code changes from version 1.6.1 to 2.0.0

Files changed (356) hide show
  1. Gruntfile.js +0 -9
  2. assets/icon-128x128.jpg +0 -0
  3. assets/icon-256x256.jpg +0 -0
  4. build/css/style.css +0 -4
  5. build/img/country-flags-s0dd19f424b.png +0 -0
  6. build/js/zero-spam-admin.min.js +0 -1
  7. build/js/zero-spam.js +0 -1
  8. config.rb +0 -27
  9. css/style.css +4 -0
  10. {build/fonts → fonts}/FontAwesome.otf +0 -0
  11. {build/fonts → fonts}/fontawesome-webfont.eot +0 -0
  12. {build/fonts → fonts}/fontawesome-webfont.svg +0 -0
  13. {build/fonts → fonts}/fontawesome-webfont.ttf +0 -0
  14. {build/fonts → fonts}/fontawesome-webfont.woff +0 -0
  15. {build/fonts → fonts}/index.php +0 -0
  16. grunt/aliases.yaml +0 -21
  17. grunt/compass.js +0 -14
  18. grunt/concurrent.js +0 -6
  19. grunt/copy.js +0 -12
  20. grunt/jshint.js +0 -10
  21. grunt/shell.js +0 -22
  22. grunt/uglify.js +0 -21
  23. grunt/watch.js +0 -14
  24. img/country-flags-sed4ce568d7.png +0 -0
  25. inc/admin-sidebar.tpl.php +1 -9
  26. inc/ip-block.tpl.php +2 -2
  27. inc/spammer-logs.tpl.php +152 -44
  28. build/js/charts.min.js → js/charts.js +0 -0
  29. js/zero-spam-admin.js +1 -0
  30. js/zerospam.js +1 -0
  31. lib/zero-spam.class.php +0 -1981
  32. package.json +0 -22
  33. readme.txt +41 -2
  34. src/ZeroSpam/Access.php +37 -0
  35. src/ZeroSpam/Admin.php +578 -0
  36. src/ZeroSpam/Ajax.php +253 -0
  37. src/ZeroSpam/BuddyPress.php +30 -0
  38. src/ZeroSpam/Comments.php +33 -0
  39. src/ZeroSpam/ContactForm7.php +30 -0
  40. src/ZeroSpam/GravityForms.php +21 -0
  41. src/ZeroSpam/Install.php +130 -0
  42. src/ZeroSpam/NinjaForms.php +33 -0
  43. src/ZeroSpam/Plugin.php +116 -0
  44. src/ZeroSpam/Registration.php +31 -0
  45. src/ZeroSpam/Scripts.php +32 -0
  46. src/helpers.php +558 -0
  47. src/img/country-flags/ad.png +0 -0
  48. src/img/country-flags/ae.png +0 -0
  49. src/img/country-flags/af.png +0 -0
  50. src/img/country-flags/ag.png +0 -0
  51. src/img/country-flags/ai.png +0 -0
  52. src/img/country-flags/al.png +0 -0
  53. src/img/country-flags/am.png +0 -0
  54. src/img/country-flags/an.png +0 -0
  55. src/img/country-flags/ao.png +0 -0
  56. src/img/country-flags/ar.png +0 -0
  57. src/img/country-flags/as.png +0 -0
  58. src/img/country-flags/at.png +0 -0
  59. src/img/country-flags/au.png +0 -0
  60. src/img/country-flags/aw.png +0 -0
  61. src/img/country-flags/ax.png +0 -0
  62. src/img/country-flags/az.png +0 -0
  63. src/img/country-flags/ba.png +0 -0
  64. src/img/country-flags/bb.png +0 -0
  65. src/img/country-flags/bd.png +0 -0
  66. src/img/country-flags/be.png +0 -0
  67. src/img/country-flags/bf.png +0 -0
  68. src/img/country-flags/bg.png +0 -0
  69. src/img/country-flags/bh.png +0 -0
  70. src/img/country-flags/bi.png +0 -0
  71. src/img/country-flags/bj.png +0 -0
  72. src/img/country-flags/bm.png +0 -0
  73. src/img/country-flags/bn.png +0 -0
  74. src/img/country-flags/bo.png +0 -0
  75. src/img/country-flags/br.png +0 -0
  76. src/img/country-flags/bs.png +0 -0
  77. src/img/country-flags/bt.png +0 -0
  78. src/img/country-flags/bv.png +0 -0
  79. src/img/country-flags/bw.png +0 -0
  80. src/img/country-flags/by.png +0 -0
  81. src/img/country-flags/bz.png +0 -0
  82. src/img/country-flags/ca.png +0 -0
  83. src/img/country-flags/catalonia.png +0 -0
  84. src/img/country-flags/cc.png +0 -0
  85. src/img/country-flags/cd.png +0 -0
  86. src/img/country-flags/cf.png +0 -0
  87. src/img/country-flags/cg.png +0 -0
  88. src/img/country-flags/ch.png +0 -0
  89. src/img/country-flags/ci.png +0 -0
  90. src/img/country-flags/ck.png +0 -0
  91. src/img/country-flags/cl.png +0 -0
  92. src/img/country-flags/cm.png +0 -0
  93. src/img/country-flags/cn.png +0 -0
  94. src/img/country-flags/co.png +0 -0
  95. src/img/country-flags/cr.png +0 -0
  96. src/img/country-flags/cs.png +0 -0
  97. src/img/country-flags/cu.png +0 -0
  98. src/img/country-flags/cv.png +0 -0
  99. src/img/country-flags/cx.png +0 -0
  100. src/img/country-flags/cy.png +0 -0
  101. src/img/country-flags/cz.png +0 -0
  102. src/img/country-flags/de.png +0 -0
  103. src/img/country-flags/dj.png +0 -0
  104. src/img/country-flags/dk.png +0 -0
  105. src/img/country-flags/dm.png +0 -0
  106. src/img/country-flags/do.png +0 -0
  107. src/img/country-flags/dz.png +0 -0
  108. src/img/country-flags/ec.png +0 -0
  109. src/img/country-flags/ee.png +0 -0
  110. src/img/country-flags/eg.png +0 -0
  111. src/img/country-flags/eh.png +0 -0
  112. src/img/country-flags/england.png +0 -0
  113. src/img/country-flags/er.png +0 -0
  114. src/img/country-flags/es.png +0 -0
  115. src/img/country-flags/et.png +0 -0
  116. src/img/country-flags/europeanunion.png +0 -0
  117. src/img/country-flags/fam.png +0 -0
  118. src/img/country-flags/fi.png +0 -0
  119. src/img/country-flags/fj.png +0 -0
  120. src/img/country-flags/fk.png +0 -0
  121. src/img/country-flags/fm.png +0 -0
  122. src/img/country-flags/fo.png +0 -0
  123. src/img/country-flags/fr.png +0 -0
  124. src/img/country-flags/ga.png +0 -0
  125. src/img/country-flags/gb.png +0 -0
  126. src/img/country-flags/gd.png +0 -0
  127. src/img/country-flags/ge.png +0 -0
  128. src/img/country-flags/gf.png +0 -0
  129. src/img/country-flags/gh.png +0 -0
  130. src/img/country-flags/gi.png +0 -0
  131. src/img/country-flags/gl.png +0 -0
  132. src/img/country-flags/gm.png +0 -0
  133. src/img/country-flags/gn.png +0 -0
  134. src/img/country-flags/gp.png +0 -0
  135. src/img/country-flags/gq.png +0 -0
  136. src/img/country-flags/gr.png +0 -0
  137. src/img/country-flags/gs.png +0 -0
  138. src/img/country-flags/gt.png +0 -0
  139. src/img/country-flags/gu.png +0 -0
  140. src/img/country-flags/gw.png +0 -0
  141. src/img/country-flags/gy.png +0 -0
  142. src/img/country-flags/hk.png +0 -0
  143. src/img/country-flags/hm.png +0 -0
  144. src/img/country-flags/hn.png +0 -0
  145. src/img/country-flags/hr.png +0 -0
  146. src/img/country-flags/ht.png +0 -0
  147. src/img/country-flags/hu.png +0 -0
  148. src/img/country-flags/id.png +0 -0
  149. src/img/country-flags/ie.png +0 -0
  150. src/img/country-flags/il.png +0 -0
  151. src/img/country-flags/in.png +0 -0
  152. src/img/country-flags/io.png +0 -0
  153. src/img/country-flags/iq.png +0 -0
  154. src/img/country-flags/ir.png +0 -0
  155. src/img/country-flags/is.png +0 -0
  156. src/img/country-flags/it.png +0 -0
  157. src/img/country-flags/jm.png +0 -0
  158. src/img/country-flags/jo.png +0 -0
  159. src/img/country-flags/jp.png +0 -0
  160. src/img/country-flags/ke.png +0 -0
  161. src/img/country-flags/kg.png +0 -0
  162. src/img/country-flags/kh.png +0 -0
  163. src/img/country-flags/ki.png +0 -0
  164. src/img/country-flags/km.png +0 -0
  165. src/img/country-flags/kn.png +0 -0
  166. src/img/country-flags/kp.png +0 -0
  167. src/img/country-flags/kr.png +0 -0
  168. src/img/country-flags/kw.png +0 -0
  169. src/img/country-flags/ky.png +0 -0
  170. src/img/country-flags/kz.png +0 -0
  171. src/img/country-flags/la.png +0 -0
  172. src/img/country-flags/lb.png +0 -0
  173. src/img/country-flags/lc.png +0 -0
  174. src/img/country-flags/li.png +0 -0
  175. src/img/country-flags/lk.png +0 -0
  176. src/img/country-flags/lr.png +0 -0
  177. src/img/country-flags/ls.png +0 -0
  178. src/img/country-flags/lt.png +0 -0
  179. src/img/country-flags/lu.png +0 -0
  180. src/img/country-flags/lv.png +0 -0
  181. src/img/country-flags/ly.png +0 -0
  182. src/img/country-flags/ma.png +0 -0
  183. src/img/country-flags/mc.png +0 -0
  184. src/img/country-flags/md.png +0 -0
  185. src/img/country-flags/me.png +0 -0
  186. src/img/country-flags/mg.png +0 -0
  187. src/img/country-flags/mh.png +0 -0
  188. src/img/country-flags/mk.png +0 -0
  189. src/img/country-flags/ml.png +0 -0
  190. src/img/country-flags/mm.png +0 -0
  191. src/img/country-flags/mn.png +0 -0
  192. src/img/country-flags/mo.png +0 -0
  193. src/img/country-flags/mp.png +0 -0
  194. src/img/country-flags/mq.png +0 -0
  195. src/img/country-flags/mr.png +0 -0
  196. src/img/country-flags/ms.png +0 -0
  197. src/img/country-flags/mt.png +0 -0
  198. src/img/country-flags/mu.png +0 -0
  199. src/img/country-flags/mv.png +0 -0
  200. src/img/country-flags/mw.png +0 -0
  201. src/img/country-flags/mx.png +0 -0
  202. src/img/country-flags/my.png +0 -0
  203. src/img/country-flags/mz.png +0 -0
  204. src/img/country-flags/na.png +0 -0
  205. src/img/country-flags/nc.png +0 -0
  206. src/img/country-flags/ne.png +0 -0
  207. src/img/country-flags/nf.png +0 -0
  208. src/img/country-flags/ng.png +0 -0
  209. src/img/country-flags/ni.png +0 -0
  210. src/img/country-flags/nl.png +0 -0
  211. src/img/country-flags/no.png +0 -0
  212. src/img/country-flags/np.png +0 -0
  213. src/img/country-flags/nr.png +0 -0
  214. src/img/country-flags/nu.png +0 -0
  215. src/img/country-flags/nz.png +0 -0
  216. src/img/country-flags/om.png +0 -0
  217. src/img/country-flags/pa.png +0 -0
  218. src/img/country-flags/pe.png +0 -0
  219. src/img/country-flags/pf.png +0 -0
  220. src/img/country-flags/pg.png +0 -0
  221. src/img/country-flags/ph.png +0 -0
  222. src/img/country-flags/pk.png +0 -0
  223. src/img/country-flags/pl.png +0 -0
  224. src/img/country-flags/pm.png +0 -0
  225. src/img/country-flags/pn.png +0 -0
  226. src/img/country-flags/pr.png +0 -0
  227. src/img/country-flags/ps.png +0 -0
  228. src/img/country-flags/pt.png +0 -0
  229. src/img/country-flags/pw.png +0 -0
  230. src/img/country-flags/py.png +0 -0
  231. src/img/country-flags/qa.png +0 -0
  232. src/img/country-flags/re.png +0 -0
  233. src/img/country-flags/ro.png +0 -0
  234. src/img/country-flags/rs.png +0 -0
  235. src/img/country-flags/ru.png +0 -0
  236. src/img/country-flags/rw.png +0 -0
  237. src/img/country-flags/sa.png +0 -0
  238. src/img/country-flags/sb.png +0 -0
  239. src/img/country-flags/sc.png +0 -0
  240. src/img/country-flags/scotland.png +0 -0
  241. src/img/country-flags/sd.png +0 -0
  242. src/img/country-flags/se.png +0 -0
  243. src/img/country-flags/sg.png +0 -0
  244. src/img/country-flags/sh.png +0 -0
  245. src/img/country-flags/si.png +0 -0
  246. src/img/country-flags/sj.png +0 -0
  247. src/img/country-flags/sk.png +0 -0
  248. src/img/country-flags/sl.png +0 -0
  249. src/img/country-flags/sm.png +0 -0
  250. src/img/country-flags/sn.png +0 -0
  251. src/img/country-flags/so.png +0 -0
  252. src/img/country-flags/sr.png +0 -0
  253. src/img/country-flags/st.png +0 -0
  254. src/img/country-flags/sv.png +0 -0
  255. src/img/country-flags/sy.png +0 -0
  256. src/img/country-flags/sz.png +0 -0
  257. src/img/country-flags/tc.png +0 -0
  258. src/img/country-flags/td.png +0 -0
  259. src/img/country-flags/tf.png +0 -0
  260. src/img/country-flags/tg.png +0 -0
  261. src/img/country-flags/th.png +0 -0
  262. src/img/country-flags/tj.png +0 -0
  263. src/img/country-flags/tk.png +0 -0
  264. src/img/country-flags/tl.png +0 -0
  265. src/img/country-flags/tm.png +0 -0
  266. src/img/country-flags/tn.png +0 -0
  267. src/img/country-flags/to.png +0 -0
  268. src/img/country-flags/tr.png +0 -0
  269. src/img/country-flags/tt.png +0 -0
  270. src/img/country-flags/tv.png +0 -0
  271. src/img/country-flags/tw.png +0 -0
  272. src/img/country-flags/tz.png +0 -0
  273. src/img/country-flags/ua.png +0 -0
  274. src/img/country-flags/ug.png +0 -0
  275. src/img/country-flags/um.png +0 -0
  276. src/img/country-flags/us.png +0 -0
  277. src/img/country-flags/uy.png +0 -0
  278. src/img/country-flags/uz.png +0 -0
  279. src/img/country-flags/va.png +0 -0
  280. src/img/country-flags/vc.png +0 -0
  281. src/img/country-flags/ve.png +0 -0
  282. src/img/country-flags/vg.png +0 -0
  283. src/img/country-flags/vi.png +0 -0
  284. src/img/country-flags/vn.png +0 -0
  285. src/img/country-flags/vu.png +0 -0
  286. src/img/country-flags/wales.png +0 -0
  287. src/img/country-flags/wf.png +0 -0
  288. src/img/country-flags/ws.png +0 -0
  289. src/img/country-flags/ye.png +0 -0
  290. src/img/country-flags/yt.png +0 -0
  291. src/img/country-flags/za.png +0 -0
  292. src/img/country-flags/zm.png +0 -0
  293. src/img/country-flags/zw.png +0 -0
  294. src/js/jvectormap-world-mill-en.js +0 -1
  295. src/js/jvectormap.min.js +0 -2
  296. src/js/morris.min.js +0 -7
  297. src/js/raphael.min.js +0 -10
  298. src/js/zero-spam-admin.js +0 -129
  299. src/js/zero-spam.js +0 -34
  300. src/scss/_jvectormap.scss +0 -129
  301. src/scss/_morris.scss +0 -2
  302. src/scss/font-awesome/_bordered-pulled.scss +0 -16
  303. src/scss/font-awesome/_core.scss +0 -11
  304. src/scss/font-awesome/_fixed-width.scss +0 -6
  305. src/scss/font-awesome/_font-awesome.scss +0 -17
  306. src/scss/font-awesome/_icons.scss +0 -552
  307. src/scss/font-awesome/_larger.scss +0 -13
  308. src/scss/font-awesome/_list.scss +0 -19
  309. src/scss/font-awesome/_mixins.scss +0 -25
  310. src/scss/font-awesome/_path.scss +0 -14
  311. src/scss/font-awesome/_rotated-flipped.scss +0 -20
  312. src/scss/font-awesome/_spinning.scss +0 -29
  313. src/scss/font-awesome/_stacked.scss +0 -20
  314. src/scss/font-awesome/_variables.scss +0 -561
  315. src/scss/style.scss +0 -438
  316. trunk/README.md +4 -0
  317. trunk/assets/banner-772x250.png +0 -0
  318. trunk/assets/icon-128/303\227128.jpg +0 -0
  319. trunk/assets/icon-256/303\227256.jpg +0 -0
  320. trunk/css/style.css +4 -0
  321. trunk/fonts/FontAwesome.otf +0 -0
  322. trunk/fonts/fontawesome-webfont.eot +0 -0
  323. trunk/fonts/fontawesome-webfont.svg +520 -0
  324. trunk/fonts/fontawesome-webfont.ttf +0 -0
  325. trunk/fonts/fontawesome-webfont.woff +0 -0
  326. {grunt → trunk/fonts}/index.php +0 -0
  327. trunk/img/country-flags-sed4ce568d7.png +0 -0
  328. trunk/inc/admin-sidebar.tpl.php +40 -0
  329. trunk/inc/block-ip-form.tpl.php +132 -0
  330. trunk/inc/general-settings.tpl.php +23 -0
  331. trunk/inc/index.php +1 -0
  332. trunk/inc/ip-block.tpl.php +75 -0
  333. trunk/inc/spammer-logs.tpl.php +499 -0
  334. trunk/index.php +1 -0
  335. trunk/js/charts.js +9 -0
  336. trunk/js/zero-spam-admin.js +1 -0
  337. trunk/js/zerospam.js +1 -0
  338. trunk/readme.txt +206 -0
  339. trunk/src/ZeroSpam/Access.php +37 -0
  340. trunk/src/ZeroSpam/Admin.php +578 -0
  341. trunk/src/ZeroSpam/Ajax.php +253 -0
  342. trunk/src/ZeroSpam/BuddyPress.php +30 -0
  343. trunk/src/ZeroSpam/Comments.php +33 -0
  344. trunk/src/ZeroSpam/ContactForm7.php +30 -0
  345. trunk/src/ZeroSpam/GravityForms.php +21 -0
  346. trunk/src/ZeroSpam/Install.php +130 -0
  347. trunk/src/ZeroSpam/NinjaForms.php +33 -0
  348. trunk/src/ZeroSpam/Plugin.php +116 -0
  349. trunk/src/ZeroSpam/Registration.php +31 -0
  350. trunk/src/ZeroSpam/Scripts.php +32 -0
  351. trunk/src/helpers.php +558 -0
  352. trunk/src/index.php +1 -0
  353. trunk/uninstall.php +79 -0
  354. trunk/zero-spam.php +112 -0
  355. uninstall.php +2 -0
  356. zero-spam.php +68 -10
Gruntfile.js DELETED
@@ -1,9 +0,0 @@
1
- module.exports = function(grunt) {
2
-
3
- // measures the time each task takes
4
- require('time-grunt')(grunt);
5
-
6
- // load grunt config
7
- require('load-grunt-config')(grunt);
8
-
9
- };
assets/icon-128x128.jpg ADDED
Binary file
assets/icon-256x256.jpg ADDED
Binary file
build/css/style.css DELETED
@@ -1,4 +0,0 @@
1
- /*!
2
- * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
3
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
- */@font-face{font-family:'FontAwesome';src:url("../../build/fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../../build/fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../../build/fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../../build/fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../../build/fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}.jvectormap-container{width:100%;height:100%;position:relative;overflow:hidden}.jvectormap-tip{position:absolute;display:none;border:solid 1px #CDCDCD;border-radius:3px;background:#292929;color:white;font-family:sans-serif, Verdana;font-size:smaller;padding:3px}.jvectormap-zoomin,.jvectormap-zoomout,.jvectormap-goback{position:absolute;left:10px;border-radius:3px;background:#292929;padding:3px;color:white;cursor:pointer;line-height:10px;text-align:center}.jvectormap-zoomin,.jvectormap-zoomout{width:10px;height:10px}.jvectormap-zoomin{top:10px}.jvectormap-zoomout{top:30px}.jvectormap-goback{bottom:10px;z-index:1000;padding:6px}.jvectormap-spinner{position:absolute;left:0;top:0;right:0;bottom:0;background:center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==)}.jvectormap-legend-title{font-weight:bold;font-size:14px;text-align:center}.jvectormap-legend-cnt{position:absolute}.jvectormap-legend-cnt-h{bottom:0;right:0}.jvectormap-legend-cnt-v{top:0;right:0}.jvectormap-legend{background:black;color:white;border-radius:3px}.jvectormap-legend-cnt-h .jvectormap-legend{float:left;margin:0 10px 10px 0;padding:3px 3px 1px 3px}.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick{float:left}.jvectormap-legend-cnt-v .jvectormap-legend{margin:10px 10px 0 0;padding:3px}.jvectormap-legend-cnt-h .jvectormap-legend-tick{width:40px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample{height:15px}.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample{height:20px;width:20px;display:inline-block;vertical-align:middle}.jvectormap-legend-tick-text{font-size:12px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-text{text-align:center}.jvectormap-legend-cnt-v .jvectormap-legend-tick-text{display:inline-block;vertical-align:middle;line-height:20px;padding-left:3px}.country-flags-sprite,.country-flags-ad,.country-flags-ae,.country-flags-af,.country-flags-ag,.country-flags-ai,.country-flags-al,.country-flags-am,.country-flags-an,.country-flags-ao,.country-flags-ar,.country-flags-as,.country-flags-at,.country-flags-au,.country-flags-aw,.country-flags-ax,.country-flags-az,.country-flags-ba,.country-flags-bb,.country-flags-bd,.country-flags-be,.country-flags-bf,.country-flags-bg,.country-flags-bh,.country-flags-bi,.country-flags-bj,.country-flags-bm,.country-flags-bn,.country-flags-bo,.country-flags-br,.country-flags-bs,.country-flags-bt,.country-flags-bv,.country-flags-bw,.country-flags-by,.country-flags-bz,.country-flags-ca,.country-flags-catalonia,.country-flags-cc,.country-flags-cd,.country-flags-cf,.country-flags-cg,.country-flags-ch,.country-flags-ci,.country-flags-ck,.country-flags-cl,.country-flags-cm,.country-flags-cn,.country-flags-co,.country-flags-cr,.country-flags-cs,.country-flags-cu,.country-flags-cv,.country-flags-cx,.country-flags-cy,.country-flags-cz,.country-flags-de,.country-flags-dj,.country-flags-dk,.country-flags-dm,.country-flags-do,.country-flags-dz,.country-flags-ec,.country-flags-ee,.country-flags-eg,.country-flags-eh,.country-flags-england,.country-flags-er,.country-flags-es,.country-flags-et,.country-flags-europeanunion,.country-flags-fam,.country-flags-fi,.country-flags-fj,.country-flags-fk,.country-flags-fm,.country-flags-fo,.country-flags-fr,.country-flags-ga,.country-flags-gb,.country-flags-gd,.country-flags-ge,.country-flags-gf,.country-flags-gh,.country-flags-gi,.country-flags-gl,.country-flags-gm,.country-flags-gn,.country-flags-gp,.country-flags-gq,.country-flags-gr,.country-flags-gs,.country-flags-gt,.country-flags-gu,.country-flags-gw,.country-flags-gy,.country-flags-hk,.country-flags-hm,.country-flags-hn,.country-flags-hr,.country-flags-ht,.country-flags-hu,.country-flags-id,.country-flags-ie,.country-flags-il,.country-flags-in,.country-flags-io,.country-flags-iq,.country-flags-ir,.country-flags-is,.country-flags-it,.country-flags-jm,.country-flags-jo,.country-flags-jp,.country-flags-ke,.country-flags-kg,.country-flags-kh,.country-flags-ki,.country-flags-km,.country-flags-kn,.country-flags-kp,.country-flags-kr,.country-flags-kw,.country-flags-ky,.country-flags-kz,.country-flags-la,.country-flags-lb,.country-flags-lc,.country-flags-li,.country-flags-lk,.country-flags-lr,.country-flags-ls,.country-flags-lt,.country-flags-lu,.country-flags-lv,.country-flags-ly,.country-flags-ma,.country-flags-mc,.country-flags-md,.country-flags-me,.country-flags-mg,.country-flags-mh,.country-flags-mk,.country-flags-ml,.country-flags-mm,.country-flags-mn,.country-flags-mo,.country-flags-mp,.country-flags-mq,.country-flags-mr,.country-flags-ms,.country-flags-mt,.country-flags-mu,.country-flags-mv,.country-flags-mw,.country-flags-mx,.country-flags-my,.country-flags-mz,.country-flags-na,.country-flags-nc,.country-flags-ne,.country-flags-nf,.country-flags-ng,.country-flags-ni,.country-flags-nl,.country-flags-no,.country-flags-np,.country-flags-nr,.country-flags-nu,.country-flags-nz,.country-flags-om,.country-flags-pa,.country-flags-pe,.country-flags-pf,.country-flags-pg,.country-flags-ph,.country-flags-pk,.country-flags-pl,.country-flags-pm,.country-flags-pn,.country-flags-pr,.country-flags-ps,.country-flags-pt,.country-flags-pw,.country-flags-py,.country-flags-qa,.country-flags-re,.country-flags-ro,.country-flags-rs,.country-flags-ru,.country-flags-rw,.country-flags-sa,.country-flags-sb,.country-flags-sc,.country-flags-scotland,.country-flags-sd,.country-flags-se,.country-flags-sg,.country-flags-sh,.country-flags-si,.country-flags-sj,.country-flags-sk,.country-flags-sl,.country-flags-sm,.country-flags-sn,.country-flags-so,.country-flags-sr,.country-flags-st,.country-flags-sv,.country-flags-sy,.country-flags-sz,.country-flags-tc,.country-flags-td,.country-flags-tf,.country-flags-tg,.country-flags-th,.country-flags-tj,.country-flags-tk,.country-flags-tl,.country-flags-tm,.country-flags-tn,.country-flags-to,.country-flags-tr,.country-flags-tt,.country-flags-tv,.country-flags-tw,.country-flags-tz,.country-flags-ua,.country-flags-ug,.country-flags-um,.country-flags-us,.country-flags-uy,.country-flags-uz,.country-flags-va,.country-flags-vc,.country-flags-ve,.country-flags-vg,.country-flags-vi,.country-flags-vn,.country-flags-vu,.country-flags-wales,.country-flags-wf,.country-flags-ws,.country-flags-ye,.country-flags-yt,.country-flags-za,.country-flags-zm,.country-flags-zw{background:url('../img/country-flags-s0dd19f424b.png') no-repeat}.country-flags-ad{background-position:0 -198px}.country-flags-ae{background-position:0 -2641px}.country-flags-af{background-position:0 -550px}.country-flags-ag{background-position:0 -726px}.country-flags-ai{background-position:0 -209px}.country-flags-al{background-position:0 -594px}.country-flags-am{background-position:0 -1771px}.country-flags-an{background-position:0 -1947px}.country-flags-ao{background-position:0 -2520px}.country-flags-ar{background-position:0 -1672px}.country-flags-as{background-position:0 -154px}.country-flags-at{background-position:0 -2652px}.country-flags-au{background-position:0 -22px}.country-flags-aw{background-position:0 -1419px}.country-flags-ax{background-position:0 -55px}.country-flags-az{background-position:0 -748px}.country-flags-ba{background-position:0 -649px}.country-flags-bb{background-position:0 -781px}.country-flags-bd{background-position:0 -1683px}.country-flags-be{background-position:0 -2387px}.country-flags-bf{background-position:0 -1782px}.country-flags-bg{background-position:0 -2299px}.country-flags-bh{background-position:0 -2310px}.country-flags-bi{background-position:0 -11px}.country-flags-bj{background-position:0 -1991px}.country-flags-bm{background-position:0 -495px}.country-flags-bn{background-position:0 -264px}.country-flags-bo{background-position:0 -1727px}.country-flags-br{background-position:0 -660px}.country-flags-bs{background-position:0 -1397px}.country-flags-bt{background-position:0 -319px}.country-flags-bv{background-position:0 -1551px}.country-flags-bw{background-position:0 -2421px}.country-flags-by{background-position:0 -1518px}.country-flags-bz{background-position:0 -605px}.country-flags-ca{background-position:0 -352px}.country-flags-catalonia{background-position:0 -2663px}.country-flags-cc{background-position:0 -396px}.country-flags-cd{background-position:0 -1331px}.country-flags-cf{background-position:0 -473px}.country-flags-cg{background-position:0 -1441px}.country-flags-ch{background-position:0 -2707px}.country-flags-ci{background-position:0 -2321px}.country-flags-ck{background-position:0 -770px}.country-flags-cl{background-position:0 -2365px}.country-flags-cm{background-position:0 -1408px}.country-flags-cn{background-position:0 -2189px}.country-flags-co{background-position:0 -2013px}.country-flags-cr{background-position:0 -2101px}.country-flags-cs{background-position:0 -2443px}.country-flags-cu{background-position:0 -968px}.country-flags-cv{background-position:0 -1309px}.country-flags-cx{background-position:0 -528px}.country-flags-cy{background-position:0 -2531px}.country-flags-cz{background-position:0 -2112px}.country-flags-de{background-position:0 -1111px}.country-flags-dj{background-position:0 -869px}.country-flags-dk{background-position:0 -1826px}.country-flags-dm{background-position:0 -429px}.country-flags-do{background-position:0 -1628px}.country-flags-dz{background-position:0 -814px}.country-flags-ec{background-position:0 -1738px}.country-flags-ee{background-position:0 -2509px}.country-flags-eg{background-position:0 -2255px}.country-flags-eh{background-position:0 -1639px}.country-flags-england{background-position:0 -1793px}.country-flags-er{background-position:0 -110px}.country-flags-es{background-position:0 -2222px}.country-flags-et{background-position:0 -704px}.country-flags-europeanunion{background-position:0 -2079px}.country-flags-fam{background-position:0 -1254px}.country-flags-fi{background-position:0 -1925px}.country-flags-fj{background-position:0 -506px}.country-flags-fk{background-position:0 -143px}.country-flags-fm{background-position:0 -1067px}.country-flags-fo{background-position:0 -2134px}.country-flags-fr{background-position:0 -1122px}.country-flags-ga{background-position:0 -1936px}.country-flags-gb{background-position:0 -616px}.country-flags-gd{background-position:0 -297px}.country-flags-ge{background-position:0 -638px}.country-flags-gf{background-position:0 -1133px}.country-flags-gh{background-position:0 -1914px}.country-flags-gi{background-position:0 -2288px}.country-flags-gl{background-position:0 -2211px}.country-flags-gm{background-position:0 -1859px}.country-flags-gn{background-position:0 -2068px}.country-flags-gp{background-position:0 -1958px}.country-flags-gq{background-position:0 -1188px}.country-flags-gr{background-position:0 -1969px}.country-flags-gs{background-position:0 -330px}.country-flags-gt{background-position:0 -1870px}.country-flags-gu{background-position:0 -1617px}.country-flags-gw{background-position:0 -1485px}.country-flags-gy{background-position:0 -176px}.country-flags-hk{background-position:0 -1353px}.country-flags-hm{background-position:0 -33px}.country-flags-hn{background-position:0 -1199px}.country-flags-hr{background-position:0 -1430px}.country-flags-ht{background-position:0 -1980px}.country-flags-hu{background-position:0 -2465px}.country-flags-id{background-position:0 -2498px}.country-flags-ie{background-position:0 -2046px}.country-flags-il{background-position:0 -2487px}.country-flags-in{background-position:0 -1694px}.country-flags-io{background-position:0 -66px}.country-flags-iq{background-position:0 -1496px}.country-flags-ir{background-position:0 -1562px}.country-flags-is{background-position:0 -1265px}.country-flags-it{background-position:0 -2575px}.country-flags-jm{background-position:0 -308px}.country-flags-jo{background-position:0 -2167px}.country-flags-jp{background-position:0 -2586px}.country-flags-ke{background-position:0 -924px}.country-flags-kg{background-position:0 -1595px}.country-flags-kh{background-position:0 -1100px}.country-flags-ki{background-position:0 -88px}.country-flags-km{background-position:0 -825px}.country-flags-kn{background-position:0 -561px}.country-flags-kp{background-position:0 -1012px}.country-flags-kr{background-position:0 -715px}.country-flags-kw{background-position:0 -2002px}.country-flags-ky{background-position:0 -220px}.country-flags-kz{background-position:0 -451px}.country-flags-la{background-position:0 -979px}.country-flags-lb{background-position:0 -1474px}.country-flags-lc{background-position:0 -1452px}.country-flags-li{background-position:0 -1210px}.country-flags-lk{background-position:0 -385px}.country-flags-lr{background-position:0 -2244px}.country-flags-ls{background-position:0 -363px}.country-flags-lt{background-position:0 -1650px}.country-flags-lu{background-position:0 -2057px}.country-flags-lv{background-position:0 -2266px}.country-flags-ly{background-position:0 -2619px}.country-flags-ma{background-position:0 -2476px}.country-flags-mc{background-position:0 -2685px}.country-flags-md{background-position:0 -957px}.country-flags-me{background-position:0 -2398px}.country-flags-mg{background-position:0 -2332px}.country-flags-mh{background-position:0 -374px}.country-flags-mk{background-position:0 -44px}.country-flags-ml{background-position:0 -2145px}.country-flags-mm{background-position:0 -2024px}.country-flags-mn{background-position:0 -1881px}.country-flags-mo{background-position:0 -759px}.country-flags-mp{background-position:0 -627px}.country-flags-mq{background-position:0 -99px}.country-flags-mr{background-position:0 -935px}.country-flags-ms{background-position:0 -484px}.country-flags-mt{background-position:0 -2597px}.country-flags-mu{background-position:0 -1804px}.country-flags-mv{background-position:0 -1155px}.country-flags-mw{background-position:0 -1320px}.country-flags-mx{background-position:0 -847px}.country-flags-my{background-position:0 -891px}.country-flags-mz{background-position:0 -792px}.country-flags-na{background-position:0 -165px}.country-flags-nc{background-position:0 -737px}.country-flags-ne{background-position:0 -1221px}.country-flags-nf{background-position:0 -583px}.country-flags-ng{background-position:0 -2035px}.country-flags-ni{background-position:0 -1661px}.country-flags-nl{background-position:0 -2343px}.country-flags-no{background-position:0 -1573px}.country-flags-np{background-position:0 -2432px}.country-flags-nr{background-position:0 -1364px}.country-flags-nu{background-position:0 -880px}.country-flags-nz{background-position:0 -275px}.country-flags-om{background-position:0 -2090px}.country-flags-pa{background-position:0 -1463px}.country-flags-pe{background-position:0 -2674px}.country-flags-pf{background-position:0 -1760px}.country-flags-pg{background-position:0 -671px}.country-flags-ph{background-position:0 -1177px}.country-flags-pk{background-position:0 -946px}.country-flags-pl{background-position:0 -2696px}.country-flags-pm{background-position:0 0}.country-flags-pn{background-position:0 -77px}.country-flags-pr{background-position:0 -1023px}.country-flags-ps{background-position:0 -2200px}.country-flags-pt{background-position:0 -1034px}.country-flags-pw{background-position:0 -1089px}.country-flags-py{background-position:0 -2178px}.country-flags-qa{background-position:0 -2376px}.country-flags-re{background-position:0 -1144px}.country-flags-ro{background-position:0 -1837px}.country-flags-rs{background-position:0 -2553px}.country-flags-ru{background-position:0 -2608px}.country-flags-rw{background-position:0 -1243px}.country-flags-sa{background-position:0 -1078px}.country-flags-sb{background-position:0 -407px}.country-flags-sc{background-position:0 -539px}.country-flags-scotland{background-position:0 -132px}.country-flags-sd{background-position:0 -1892px}.country-flags-se{background-position:0 -1166px}.country-flags-sg{background-position:0 -2233px}.country-flags-sh{background-position:0 -187px}.country-flags-si{background-position:0 -1606px}.country-flags-sj{background-position:0 -1584px}.country-flags-sk{background-position:0 -990px}.country-flags-sl{background-position:0 -2454px}.country-flags-sm{background-position:0 -1705px}.country-flags-sn{background-position:0 -1276px}.country-flags-so{background-position:0 -1375px}.country-flags-sr{background-position:0 -1540px}.country-flags-st{background-position:0 -803px}.country-flags-sv{background-position:0 -1716px}.country-flags-sy{background-position:0 -2564px}.country-flags-sz{background-position:0 -231px}.country-flags-tc{background-position:0 -418px}.country-flags-td{background-position:0 -913px}.country-flags-tf{background-position:0 -1386px}.country-flags-tg{background-position:0 -1001px}.country-flags-th{background-position:0 -2354px}.country-flags-tj{background-position:0 -1815px}.country-flags-tk{background-position:0 -286px}.country-flags-tl{background-position:0 -1529px}.country-flags-tm{background-position:0 -682px}.country-flags-tn{background-position:0 -1848px}.country-flags-to{background-position:0 -2542px}.country-flags-tr{background-position:0 -1903px}.country-flags-tt{background-position:0 -440px}.country-flags-tv{background-position:0 -1232px}.country-flags-tw{background-position:0 -2277px}.country-flags-tz{background-position:0 -242px}.country-flags-ua{background-position:0 -2410px}.country-flags-ug{background-position:0 -1298px}.country-flags-um{background-position:0 -902px}.country-flags-us{background-position:0 -517px}.country-flags-uy{background-position:0 -1287px}.country-flags-uz{background-position:0 -1507px}.country-flags-va{background-position:0 -1056px}.country-flags-vc{background-position:0 -836px}.country-flags-ve{background-position:0 -1342px}.country-flags-vg{background-position:0 -341px}.country-flags-vi{background-position:0 -462px}.country-flags-vn{background-position:0 -2156px}.country-flags-vu{background-position:0 -572px}.country-flags-wales{background-position:0 -121px}.country-flags-wf{background-position:0 -1045px}.country-flags-ws{background-position:0 -2123px}.country-flags-ye{background-position:0 -2630px}.country-flags-yt{background-position:0 -693px}.country-flags-za{background-position:0 -253px}.country-flags-zm{background-position:0 -1749px}.country-flags-zw{background-position:0 -858px}.country-flag{display:inline-block;vertical-align:middle}.country-flag{width:16px;height:11px}.zero-spam__text-right{text-align:right !important}.zero-spam__text-center{text-align:center !important}.zero-spam__table{width:100%;border-collapse:collapse;border-bottom:2px solid #e8edf1;margin-bottom:10px}.zero-spam__table th,.zero-spam__table td{font-size:12px;padding:10px 12px}.zero-spam__table th{text-align:left;text-transform:uppercase;font-weight:bold;line-height:1.42857143}.zero-spam__table td{border-top:1px solid #e8edf1}.zero-spam__table tr .fa-circle-o-notch,.zero-spam__table tr .fa-edit{display:none}.zero-spam__table tr.zero-spam__loading .fa-circle-o-notch{display:inline}.zero-spam__table tr.zero-spam__loading .zero-spam__block-ip{display:none}.zero-spam__table tr.zero-spam__loaded .fa-edit{display:inline}.zero-spam__table tr.zero-spam__loaded .zero-spam__block-ip{display:none}.zero-spam__table .form-table th{text-transform:none}.zero-spam__table .form-table td{border:0}.zero-spam__msg{display:block;margin:7px 0;padding:15px 20px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#529e00;color:#fff}.zero-spam__row-highlight{background:#f8f9fb}.zero-spam__widget{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;position:relative;margin:20px 0 0 0;background:#fff;overflow:hidden}.zero-spam__overlay{position:absolute;z-index:99;top:0;left:0;width:100%;height:100%;padding-top:50px;background:rgba(27,30,36,0.7);color:#fff;text-align:center}.zero-spam__overlay .fa{font-size:130px}.zero-spam__overlay h4{margin-bottom:10px;font-size:20px;font-weight:bold}.zero-spam__overlay p{margin-top:10px;font-style:italic}.zero-spam__inner{padding:20px}.zero-spam__widget h3{margin-top:0;text-transform:uppercase;font-size:10.5px;color:#1b1e24}.zero-spam__inner h3:first-child{margin-top:0}.zero-spam__inner p:last-child{margin-bottom:0}.zero-spam__widget p{margin-bottom:20px}.zero-spam__widget a{color:#ff183a;text-decoration:none;transition:all .3s}.zero-spam__widget a:hover{color:#0086c6}.wrap .zero-spam__widget h2{margin:0px 0 5px 0;padding:0;font-weight:400}.zero-spam__widget h2 a{color:#000}.zero-spam__widget .fa-star{color:#fddb5a}.zero-spam__button{display:inline-block;background:#00639e;color:#fff !important;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;padding:10px 15px;font-weight:600}.zero-spam__button:hover{background:#0086c6}.zero-spam__description{margin:0 0 20px 0}.wrap .zero-spam__widget h2.zero-spam__title{display:block;border-bottom:1px solid #ddd;padding:10px;font-size:15px;font-weight:600}.zero-spam__bg--primary{background:#ff183a;color:#fff}.zero-spam__bg--secondary{background:#00639e;color:#fff}.zero-spam__bg--trinary{background:#fddb5a;color:#1b1e24}.zero-spam__bg--gf{background:#222d3a;color:#fff}.zero-spam__bg--bpr{background:#be3631;color:#fff}.zero-spam__row{overflow:hidden}.zero-spam__row .zero-spam__cell:first-child{padding-right:10px}.zero-spam__row .zero-spam__cell:last-child{padding-left:10px}.zero-spam__cell{display:inline-block;float:left;width:50%;box-sizing:border-box}@media all and (max-width: 1640px){.zero-spam__cell{display:block;float:none;width:100%}.zero-spam__row .zero-spam__cell:first-child{padding-right:0}.zero-spam__row .zero-spam__cell:last-child{padding-left:0}}.zero-spam__row .zero-spam__stat:last-child{border-right:0}.zero-spam__cell .zero-spam__widget{margin-bottom:0}.zero-spam__stat{display:inline-block;float:left;border-right:1px solid rgba(0,0,0,0.2);margin:0 10px 10px 0;padding-right:10px;font-size:12px}.zero-spam__stat b{font-size:15px;text-align:right;display:block}.zerospam__left{padding-right:445px}.zerospam__right{width:422px;float:right}.zero-spam__label{display:inline-block;padding:3px 5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.zero-spam__fright{float:right}@media all and (max-width: 1140px){.zerospam__left{padding-right:0}.zerospam__right{width:100%;float:none}.zerospam__right .zero-spam__widget:first-child{margin-top:0}}.zero-spam__label{display:inline-block;padding:3px 5px;font-size:11px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.zero-spam__pager{display:inline-block;margin:0;padding:0;list-style-type:none;overflow:hidden;font-size:11px;font-weight:bold}.zero-spam__pager li{display:inline-block;float:left;margin:0 1px}.zero-spam__pager a{display:block;padding:6px 13px;border-radius:3px;background:#fddb5a;color:#896d02;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.zero-spam__pager a.zero-spam__page-selected{background:transparent;color:#000}.zero-spam__page-info{display:inline-block;font-size:11px;line-height:30px;margin-left:10px;vertical-align:top}.zero-spam__map{height:350px}.zero-spam__photos{display:block;margin:0;padding:0;list-style-type:none}.zero-spam__photos li{display:block;overflow:hidden}.zero-spam__photos img{max-width:100%}.zero-spam__photo{display:block;width:94px;height:94px;float:left;margin-right:10px}
build/img/country-flags-s0dd19f424b.png DELETED
Binary file
build/js/zero-spam-admin.min.js DELETED
@@ -1 +0,0 @@
1
- function closeForms(){jQuery(".zero-spam__row-highlight").remove(),jQuery("tr").removeClass("zero-spam__loading"),jQuery("tr").removeClass("zero-spam__loaded")}function clearLog(){!0===confirm("This will PERMANENTLY delete all data in the spammer log. This action cannot be undone. Are you sure you want to continue?")&&jQuery.post(ajaxurl,{action:"reset_log",security:zero_spam_admin.nonce},function(){location.reload()})}function updateRow(a){a&&jQuery.post(ajaxurl,{action:"get_blocked_ip",security:zero_spam_admin.nonce,ip:a},function(a){var b,c=jQuery.parseJSON(a),d=jQuery("tr[data-ip='"+c.ip+"']");b=!0===c.is_blocked?'<span class="zero-spam__label zero-spam__bg--primary">Blocked</span>':'<span class="zero-spam__label zero-spam__bg--trinary">Unblocked</span>',jQuery(".zero-spam__reason",d).text(c.reason),jQuery(".zero-spam__start-date",d).text(c.start_date_txt),jQuery(".zero-spam__end-date",d).text(c.end_date_txt),jQuery(".zero-spam__status",d).html(b)})}jQuery(document).ready(function(a){a.each(a("[data-ip-location]"),function(){var b=a(this),c=a(this).data("ip-location");jQuery.post(ajaxurl,{action:"get_location",security:zero_spam_admin.nonce,ip:c},function(c){var d=a.parseJSON(c),e="";d&&(d.country_name&&(e+=d.country_code),d.region_name&&(e.length&&(e+=", "),e+=d.region_name),d.city&&(e.length&&(e+=", "),e+=d.city),d.country_code&&(e='<span class="country-flag country-flags-'+d.country_code.toLowerCase()+'"></span> '+e)),e.length||(e='<div class="zero-spam__text-center"><i class="fa fa-exclamation-triangle"></i></div>'),b.html(e)})}),a(".zero-spam__block-ip, .zero-spam__trash").click(function(b){b.preventDefault(),closeForms();var c=a(this).closest("tr"),d=a("<tr class='zero-spam__row-highlight'>"),e=a(this),f=(e.parent(),e.data("ip")),g="";c.addClass("zero-spam__loading"),g=e.hasClass("zero-spam__trash")?"trash_ip_block":"block_ip_form",a.post(ajaxurl,{action:g,security:zero_spam_admin.nonce,ip:f},function(b){c.removeClass("zero-spam__loading"),e.hasClass("zero-spam__trash")?(g="trash_ip_block",c.fadeOut(function(){c.remove(),0===a(".zero-spam__table tbody tr").length&&(a("#zerospam-id-container").after("No blocked IPs found."),a("#zerospam-id-container").remove())})):(g="block_ip_form",c.addClass("zero-spam__loaded"),d.append("<td colspan='10'>"+b+"</td>"),c.before(d))})})});
build/js/zero-spam.js DELETED
@@ -1 +0,0 @@
1
- !function(a){"use strict";var b="#commentform";b+=", #registerform",b+=", .wpcf7-form",b+=", .gform_wrapper form",b+=", #buddypress #signup_form","undefined"!=typeof zerospam.key&&a(b).submit(function(){return console.log(3),a("<input>").attr("type","hidden").attr("name","zerospam_key").attr("value",zerospam.key).appendTo(b),!0})}(jQuery);
config.rb DELETED
@@ -1,27 +0,0 @@
1
- # Require any additional compass plugins here.
2
-
3
- # Set this to the root of your project when deployed:
4
- http_path = (environment == :production ? "../" : "../")
5
- css_dir = (environment == :production ? "build/css" : "build/css-dev")
6
- sass_dir = "src/scss"
7
- images_dir = (environment == :production ? "img" : "img-dev")
8
- javascripts_dir = (environment == :production ? "build/css" : "build/js-dev")
9
- generated_images_dir = (environment == :production ? "build/img" : "build/img-dev")
10
- images_path = "src/img"
11
-
12
- # You can select your preferred output style here (can be overridden via the command line):
13
- # output_style = :expanded or :nested or :compact or :compressed
14
- output_style = (environment == :production ? :compressed : :expanded)
15
-
16
- # To enable relative paths to assets via compass helper functions. Uncomment:
17
- # relative_assets = true
18
-
19
- # To disable debugging comments that display the original location of your selectors. Uncomment:
20
- # line_comments = false
21
-
22
-
23
- # If you prefer the indented syntax, you might want to regenerate this
24
- # project again passing --syntax sass, or you can uncomment this:
25
- # preferred_syntax = :sass
26
- # and then run:
27
- # sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
css/style.css ADDED
@@ -0,0 +1,4 @@
1
+ /*!
2
+ * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
3
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
+ */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}.jvectormap-container{width:100%;height:100%;position:relative;overflow:hidden}.jvectormap-tip{position:absolute;display:none;border:solid 1px #CDCDCD;border-radius:3px;background:#292929;color:white;font-family:sans-serif, Verdana;font-size:smaller;padding:3px}.jvectormap-zoomin,.jvectormap-zoomout,.jvectormap-goback{position:absolute;left:10px;border-radius:3px;background:#292929;padding:3px;color:white;cursor:pointer;line-height:10px;text-align:center}.jvectormap-zoomin,.jvectormap-zoomout{width:10px;height:10px}.jvectormap-zoomin{top:10px}.jvectormap-zoomout{top:30px}.jvectormap-goback{bottom:10px;z-index:1000;padding:6px}.jvectormap-spinner{position:absolute;left:0;top:0;right:0;bottom:0;background:center no-repeat url(data:image/gif;base64,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)}.jvectormap-legend-title{font-weight:bold;font-size:14px;text-align:center}.jvectormap-legend-cnt{position:absolute}.jvectormap-legend-cnt-h{bottom:0;right:0}.jvectormap-legend-cnt-v{top:0;right:0}.jvectormap-legend{background:black;color:white;border-radius:3px}.jvectormap-legend-cnt-h .jvectormap-legend{float:left;margin:0 10px 10px 0;padding:3px 3px 1px 3px}.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick{float:left}.jvectormap-legend-cnt-v .jvectormap-legend{margin:10px 10px 0 0;padding:3px}.jvectormap-legend-cnt-h .jvectormap-legend-tick{width:40px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample{height:15px}.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample{height:20px;width:20px;display:inline-block;vertical-align:middle}.jvectormap-legend-tick-text{font-size:12px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-text{text-align:center}.jvectormap-legend-cnt-v .jvectormap-legend-tick-text{display:inline-block;vertical-align:middle;line-height:20px;padding-left:3px}.country-flags-sprite,.country-flags-ad,.country-flags-ae,.country-flags-af,.country-flags-ag,.country-flags-ai,.country-flags-al,.country-flags-am,.country-flags-an,.country-flags-ao,.country-flags-ar,.country-flags-as,.country-flags-at,.country-flags-au,.country-flags-aw,.country-flags-ax,.country-flags-az,.country-flags-ba,.country-flags-bb,.country-flags-bd,.country-flags-be,.country-flags-bf,.country-flags-bg,.country-flags-bh,.country-flags-bi,.country-flags-bj,.country-flags-bm,.country-flags-bn,.country-flags-bo,.country-flags-br,.country-flags-bs,.country-flags-bt,.country-flags-bv,.country-flags-bw,.country-flags-by,.country-flags-bz,.country-flags-ca,.country-flags-catalonia,.country-flags-cc,.country-flags-cd,.country-flags-cf,.country-flags-cg,.country-flags-ch,.country-flags-ci,.country-flags-ck,.country-flags-cl,.country-flags-cm,.country-flags-cn,.country-flags-co,.country-flags-cr,.country-flags-cs,.country-flags-cu,.country-flags-cv,.country-flags-cx,.country-flags-cy,.country-flags-cz,.country-flags-de,.country-flags-dj,.country-flags-dk,.country-flags-dm,.country-flags-do,.country-flags-dz,.country-flags-ec,.country-flags-ee,.country-flags-eg,.country-flags-eh,.country-flags-england,.country-flags-er,.country-flags-es,.country-flags-et,.country-flags-europeanunion,.country-flags-fam,.country-flags-fi,.country-flags-fj,.country-flags-fk,.country-flags-fm,.country-flags-fo,.country-flags-fr,.country-flags-ga,.country-flags-gb,.country-flags-gd,.country-flags-ge,.country-flags-gf,.country-flags-gh,.country-flags-gi,.country-flags-gl,.country-flags-gm,.country-flags-gn,.country-flags-gp,.country-flags-gq,.country-flags-gr,.country-flags-gs,.country-flags-gt,.country-flags-gu,.country-flags-gw,.country-flags-gy,.country-flags-hk,.country-flags-hm,.country-flags-hn,.country-flags-hr,.country-flags-ht,.country-flags-hu,.country-flags-id,.country-flags-ie,.country-flags-il,.country-flags-in,.country-flags-io,.country-flags-iq,.country-flags-ir,.country-flags-is,.country-flags-it,.country-flags-jm,.country-flags-jo,.country-flags-jp,.country-flags-ke,.country-flags-kg,.country-flags-kh,.country-flags-ki,.country-flags-km,.country-flags-kn,.country-flags-kp,.country-flags-kr,.country-flags-kw,.country-flags-ky,.country-flags-kz,.country-flags-la,.country-flags-lb,.country-flags-lc,.country-flags-li,.country-flags-lk,.country-flags-lr,.country-flags-ls,.country-flags-lt,.country-flags-lu,.country-flags-lv,.country-flags-ly,.country-flags-ma,.country-flags-mc,.country-flags-md,.country-flags-me,.country-flags-mg,.country-flags-mh,.country-flags-mk,.country-flags-ml,.country-flags-mm,.country-flags-mn,.country-flags-mo,.country-flags-mp,.country-flags-mq,.country-flags-mr,.country-flags-ms,.country-flags-mt,.country-flags-mu,.country-flags-mv,.country-flags-mw,.country-flags-mx,.country-flags-my,.country-flags-mz,.country-flags-na,.country-flags-nc,.country-flags-ne,.country-flags-nf,.country-flags-ng,.country-flags-ni,.country-flags-nl,.country-flags-no,.country-flags-np,.country-flags-nr,.country-flags-nu,.country-flags-nz,.country-flags-om,.country-flags-pa,.country-flags-pe,.country-flags-pf,.country-flags-pg,.country-flags-ph,.country-flags-pk,.country-flags-pl,.country-flags-pm,.country-flags-pn,.country-flags-pr,.country-flags-ps,.country-flags-pt,.country-flags-pw,.country-flags-py,.country-flags-qa,.country-flags-re,.country-flags-ro,.country-flags-rs,.country-flags-ru,.country-flags-rw,.country-flags-sa,.country-flags-sb,.country-flags-sc,.country-flags-scotland,.country-flags-sd,.country-flags-se,.country-flags-sg,.country-flags-sh,.country-flags-si,.country-flags-sj,.country-flags-sk,.country-flags-sl,.country-flags-sm,.country-flags-sn,.country-flags-so,.country-flags-sr,.country-flags-st,.country-flags-sv,.country-flags-sy,.country-flags-sz,.country-flags-tc,.country-flags-td,.country-flags-tf,.country-flags-tg,.country-flags-th,.country-flags-tj,.country-flags-tk,.country-flags-tl,.country-flags-tm,.country-flags-tn,.country-flags-to,.country-flags-tr,.country-flags-tt,.country-flags-tv,.country-flags-tw,.country-flags-tz,.country-flags-ua,.country-flags-ug,.country-flags-um,.country-flags-us,.country-flags-uy,.country-flags-uz,.country-flags-va,.country-flags-vc,.country-flags-ve,.country-flags-vg,.country-flags-vi,.country-flags-vn,.country-flags-vu,.country-flags-wales,.country-flags-wf,.country-flags-ws,.country-flags-ye,.country-flags-yt,.country-flags-za,.country-flags-zm,.country-flags-zw{background-image:url('../img/country-flags-sed4ce568d7.png');background-repeat:no-repeat}.country-flags-ad{background-position:0 0}.country-flags-ae{background-position:0 -11px}.country-flags-af{background-position:0 -22px}.country-flags-ag{background-position:0 -33px}.country-flags-ai{background-position:0 -44px}.country-flags-al{background-position:0 -55px}.country-flags-am{background-position:0 -66px}.country-flags-an{background-position:0 -77px}.country-flags-ao{background-position:0 -88px}.country-flags-ar{background-position:0 -99px}.country-flags-as{background-position:0 -110px}.country-flags-at{background-position:0 -121px}.country-flags-au{background-position:0 -132px}.country-flags-aw{background-position:0 -143px}.country-flags-ax{background-position:0 -154px}.country-flags-az{background-position:0 -165px}.country-flags-ba{background-position:0 -176px}.country-flags-bb{background-position:0 -187px}.country-flags-bd{background-position:0 -198px}.country-flags-be{background-position:0 -209px}.country-flags-bf{background-position:0 -220px}.country-flags-bg{background-position:0 -231px}.country-flags-bh{background-position:0 -242px}.country-flags-bi{background-position:0 -253px}.country-flags-bj{background-position:0 -264px}.country-flags-bm{background-position:0 -275px}.country-flags-bn{background-position:0 -286px}.country-flags-bo{background-position:0 -297px}.country-flags-br{background-position:0 -308px}.country-flags-bs{background-position:0 -319px}.country-flags-bt{background-position:0 -330px}.country-flags-bv{background-position:0 -341px}.country-flags-bw{background-position:0 -352px}.country-flags-by{background-position:0 -363px}.country-flags-bz{background-position:0 -374px}.country-flags-ca{background-position:0 -385px}.country-flags-catalonia{background-position:0 -396px}.country-flags-cc{background-position:0 -407px}.country-flags-cd{background-position:0 -418px}.country-flags-cf{background-position:0 -429px}.country-flags-cg{background-position:0 -440px}.country-flags-ch{background-position:0 -451px}.country-flags-ci{background-position:0 -462px}.country-flags-ck{background-position:0 -473px}.country-flags-cl{background-position:0 -484px}.country-flags-cm{background-position:0 -495px}.country-flags-cn{background-position:0 -506px}.country-flags-co{background-position:0 -517px}.country-flags-cr{background-position:0 -528px}.country-flags-cs{background-position:0 -539px}.country-flags-cu{background-position:0 -550px}.country-flags-cv{background-position:0 -561px}.country-flags-cx{background-position:0 -572px}.country-flags-cy{background-position:0 -583px}.country-flags-cz{background-position:0 -594px}.country-flags-de{background-position:0 -605px}.country-flags-dj{background-position:0 -616px}.country-flags-dk{background-position:0 -627px}.country-flags-dm{background-position:0 -638px}.country-flags-do{background-position:0 -649px}.country-flags-dz{background-position:0 -660px}.country-flags-ec{background-position:0 -671px}.country-flags-ee{background-position:0 -682px}.country-flags-eg{background-position:0 -693px}.country-flags-eh{background-position:0 -704px}.country-flags-england{background-position:0 -715px}.country-flags-er{background-position:0 -726px}.country-flags-es{background-position:0 -737px}.country-flags-et{background-position:0 -748px}.country-flags-europeanunion{background-position:0 -759px}.country-flags-fam{background-position:0 -770px}.country-flags-fi{background-position:0 -781px}.country-flags-fj{background-position:0 -792px}.country-flags-fk{background-position:0 -803px}.country-flags-fm{background-position:0 -814px}.country-flags-fo{background-position:0 -825px}.country-flags-fr{background-position:0 -836px}.country-flags-ga{background-position:0 -847px}.country-flags-gb{background-position:0 -858px}.country-flags-gd{background-position:0 -869px}.country-flags-ge{background-position:0 -880px}.country-flags-gf{background-position:0 -891px}.country-flags-gh{background-position:0 -902px}.country-flags-gi{background-position:0 -913px}.country-flags-gl{background-position:0 -924px}.country-flags-gm{background-position:0 -935px}.country-flags-gn{background-position:0 -946px}.country-flags-gp{background-position:0 -957px}.country-flags-gq{background-position:0 -968px}.country-flags-gr{background-position:0 -979px}.country-flags-gs{background-position:0 -990px}.country-flags-gt{background-position:0 -1001px}.country-flags-gu{background-position:0 -1012px}.country-flags-gw{background-position:0 -1023px}.country-flags-gy{background-position:0 -1034px}.country-flags-hk{background-position:0 -1045px}.country-flags-hm{background-position:0 -1056px}.country-flags-hn{background-position:0 -1067px}.country-flags-hr{background-position:0 -1078px}.country-flags-ht{background-position:0 -1089px}.country-flags-hu{background-position:0 -1100px}.country-flags-id{background-position:0 -1111px}.country-flags-ie{background-position:0 -1122px}.country-flags-il{background-position:0 -1133px}.country-flags-in{background-position:0 -1144px}.country-flags-io{background-position:0 -1155px}.country-flags-iq{background-position:0 -1166px}.country-flags-ir{background-position:0 -1177px}.country-flags-is{background-position:0 -1188px}.country-flags-it{background-position:0 -1199px}.country-flags-jm{background-position:0 -1210px}.country-flags-jo{background-position:0 -1221px}.country-flags-jp{background-position:0 -1232px}.country-flags-ke{background-position:0 -1243px}.country-flags-kg{background-position:0 -1254px}.country-flags-kh{background-position:0 -1265px}.country-flags-ki{background-position:0 -1276px}.country-flags-km{background-position:0 -1287px}.country-flags-kn{background-position:0 -1298px}.country-flags-kp{background-position:0 -1309px}.country-flags-kr{background-position:0 -1320px}.country-flags-kw{background-position:0 -1331px}.country-flags-ky{background-position:0 -1342px}.country-flags-kz{background-position:0 -1353px}.country-flags-la{background-position:0 -1364px}.country-flags-lb{background-position:0 -1375px}.country-flags-lc{background-position:0 -1386px}.country-flags-li{background-position:0 -1397px}.country-flags-lk{background-position:0 -1408px}.country-flags-lr{background-position:0 -1419px}.country-flags-ls{background-position:0 -1430px}.country-flags-lt{background-position:0 -1441px}.country-flags-lu{background-position:0 -1452px}.country-flags-lv{background-position:0 -1463px}.country-flags-ly{background-position:0 -1474px}.country-flags-ma{background-position:0 -1485px}.country-flags-mc{background-position:0 -1496px}.country-flags-md{background-position:0 -1507px}.country-flags-me{background-position:0 -1518px}.country-flags-mg{background-position:0 -1530px}.country-flags-mh{background-position:0 -1541px}.country-flags-mk{background-position:0 -1552px}.country-flags-ml{background-position:0 -1563px}.country-flags-mm{background-position:0 -1574px}.country-flags-mn{background-position:0 -1585px}.country-flags-mo{background-position:0 -1596px}.country-flags-mp{background-position:0 -1607px}.country-flags-mq{background-position:0 -1618px}.country-flags-mr{background-position:0 -1629px}.country-flags-ms{background-position:0 -1640px}.country-flags-mt{background-position:0 -1651px}.country-flags-mu{background-position:0 -1662px}.country-flags-mv{background-position:0 -1673px}.country-flags-mw{background-position:0 -1684px}.country-flags-mx{background-position:0 -1695px}.country-flags-my{background-position:0 -1706px}.country-flags-mz{background-position:0 -1717px}.country-flags-na{background-position:0 -1728px}.country-flags-nc{background-position:0 -1739px}.country-flags-ne{background-position:0 -1750px}.country-flags-nf{background-position:0 -1761px}.country-flags-ng{background-position:0 -1772px}.country-flags-ni{background-position:0 -1783px}.country-flags-nl{background-position:0 -1794px}.country-flags-no{background-position:0 -1805px}.country-flags-np{background-position:0 -1816px}.country-flags-nr{background-position:0 -1827px}.country-flags-nu{background-position:0 -1838px}.country-flags-nz{background-position:0 -1849px}.country-flags-om{background-position:0 -1860px}.country-flags-pa{background-position:0 -1871px}.country-flags-pe{background-position:0 -1882px}.country-flags-pf{background-position:0 -1893px}.country-flags-pg{background-position:0 -1904px}.country-flags-ph{background-position:0 -1915px}.country-flags-pk{background-position:0 -1926px}.country-flags-pl{background-position:0 -1937px}.country-flags-pm{background-position:0 -1948px}.country-flags-pn{background-position:0 -1959px}.country-flags-pr{background-position:0 -1970px}.country-flags-ps{background-position:0 -1981px}.country-flags-pt{background-position:0 -1992px}.country-flags-pw{background-position:0 -2003px}.country-flags-py{background-position:0 -2014px}.country-flags-qa{background-position:0 -2025px}.country-flags-re{background-position:0 -2036px}.country-flags-ro{background-position:0 -2047px}.country-flags-rs{background-position:0 -2058px}.country-flags-ru{background-position:0 -2069px}.country-flags-rw{background-position:0 -2080px}.country-flags-sa{background-position:0 -2091px}.country-flags-sb{background-position:0 -2102px}.country-flags-sc{background-position:0 -2113px}.country-flags-scotland{background-position:0 -2124px}.country-flags-sd{background-position:0 -2135px}.country-flags-se{background-position:0 -2146px}.country-flags-sg{background-position:0 -2157px}.country-flags-sh{background-position:0 -2168px}.country-flags-si{background-position:0 -2179px}.country-flags-sj{background-position:0 -2190px}.country-flags-sk{background-position:0 -2201px}.country-flags-sl{background-position:0 -2212px}.country-flags-sm{background-position:0 -2223px}.country-flags-sn{background-position:0 -2234px}.country-flags-so{background-position:0 -2245px}.country-flags-sr{background-position:0 -2256px}.country-flags-st{background-position:0 -2267px}.country-flags-sv{background-position:0 -2278px}.country-flags-sy{background-position:0 -2289px}.country-flags-sz{background-position:0 -2300px}.country-flags-tc{background-position:0 -2311px}.country-flags-td{background-position:0 -2322px}.country-flags-tf{background-position:0 -2333px}.country-flags-tg{background-position:0 -2344px}.country-flags-th{background-position:0 -2355px}.country-flags-tj{background-position:0 -2366px}.country-flags-tk{background-position:0 -2377px}.country-flags-tl{background-position:0 -2388px}.country-flags-tm{background-position:0 -2399px}.country-flags-tn{background-position:0 -2410px}.country-flags-to{background-position:0 -2421px}.country-flags-tr{background-position:0 -2432px}.country-flags-tt{background-position:0 -2443px}.country-flags-tv{background-position:0 -2454px}.country-flags-tw{background-position:0 -2465px}.country-flags-tz{background-position:0 -2476px}.country-flags-ua{background-position:0 -2487px}.country-flags-ug{background-position:0 -2498px}.country-flags-um{background-position:0 -2509px}.country-flags-us{background-position:0 -2520px}.country-flags-uy{background-position:0 -2531px}.country-flags-uz{background-position:0 -2542px}.country-flags-va{background-position:0 -2553px}.country-flags-vc{background-position:0 -2564px}.country-flags-ve{background-position:0 -2575px}.country-flags-vg{background-position:0 -2586px}.country-flags-vi{background-position:0 -2597px}.country-flags-vn{background-position:0 -2608px}.country-flags-vu{background-position:0 -2619px}.country-flags-wales{background-position:0 -2630px}.country-flags-wf{background-position:0 -2641px}.country-flags-ws{background-position:0 -2652px}.country-flags-ye{background-position:0 -2663px}.country-flags-yt{background-position:0 -2674px}.country-flags-za{background-position:0 -2685px}.country-flags-zm{background-position:0 -2696px}.country-flags-zw{background-position:0 -2707px}.country-flag{display:inline-block;vertical-align:middle}.country-flag{width:16px;height:11px}.zero-spam__text-right{text-align:right !important}.zero-spam__text-center{text-align:center !important}.zero-spam__table{width:100%;border-collapse:collapse;border-bottom:2px solid #e8edf1;margin-bottom:10px}.zero-spam__table th,.zero-spam__table td{font-size:12px;padding:10px 12px}.zero-spam__table th{text-align:left;text-transform:uppercase;font-weight:bold;line-height:1.42857143}.zero-spam__table td{border-top:1px solid #e8edf1}.zero-spam__table tr .fa-circle-o-notch,.zero-spam__table tr .fa-edit{display:none}.zero-spam__table tr.zero-spam__loading .fa-circle-o-notch{display:inline}.zero-spam__table tr.zero-spam__loading .zero-spam__block-ip{display:none}.zero-spam__table tr.zero-spam__loaded .fa-edit{display:inline}.zero-spam__table tr.zero-spam__loaded .zero-spam__block-ip{display:none}.zero-spam__table .form-table th{text-transform:none}.zero-spam__table .form-table td{border:0}.zero-spam__msg{display:block;margin:7px 0;padding:15px 20px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#529e00;color:#fff}.zero-spam__row-highlight{background:#f8f9fb}.zero-spam__widget{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;margin:20px 0 0 0;background:#fff;overflow:hidden}.zero-spam__overlay{position:absolute;z-index:99;top:0;left:0;width:100%;height:100%;padding-top:50px;background:rgba(27,30,36,0.7);color:#fff;text-align:center}.zero-spam__overlay .fa{font-size:130px}.zero-spam__overlay h4{margin-bottom:10px;font-size:20px;font-weight:bold}.zero-spam__overlay p{margin-top:10px;font-style:italic}.zero-spam__inner{padding:20px}.zero-spam__widget h3{margin-top:0;text-transform:uppercase;font-size:10.5px;color:#1b1e24}.zero-spam__inner h3:first-child{margin-top:0}.zero-spam__inner p:last-child{margin-bottom:0}.zero-spam__widget p{margin-bottom:20px}.zero-spam__widget a{color:#ff183a;text-decoration:none;transition:all .3s}.zero-spam__widget a:hover{color:#0086c6}.wrap .zero-spam__widget h2{margin:0px 0 5px 0;padding:0;font-weight:400}.zero-spam__widget h2 a{color:#000}.zero-spam__widget .fa-star{color:#fddb5a}.zero-spam__button{display:inline-block;background:#00639e;color:#fff !important;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;padding:10px 15px;font-weight:600}.zero-spam__button:hover{background:#0086c6}.zero-spam__description{margin:0 0 20px 0}.wrap .zero-spam__widget h2.zero-spam__title{display:block;border-bottom:1px solid #ddd;padding:10px;font-size:15px;font-weight:600}.zero-spam__bg--primary{background:#ff183a;color:#fff}.zero-spam__bg--secondary{background:#00639e;color:#fff}.zero-spam__bg--trinary{background:#fddb5a;color:#1b1e24}.zero-spam__bg--gf{background:#222d3a;color:#fff}.zero-spam__bg--bpr{background:#be3631;color:#fff}.zero-spam__bg--nf{background:#ef4748;color:#fff}.zero-spam__bg--misc{background:#c2c2c2;color:#000}.zero-spam__row{overflow:hidden}.zero-spam__row .zero-spam__cell:first-child{padding-right:10px}.zero-spam__row .zero-spam__cell:last-child{padding-left:10px}.zero-spam__cell{display:inline-block;float:left;width:50%;box-sizing:border-box}@media all and (max-width: 1640px){.zero-spam__cell{display:block;float:none;width:100%}.zero-spam__row .zero-spam__cell:first-child{padding-right:0}.zero-spam__row .zero-spam__cell:last-child{padding-left:0}}.zero-spam__row .zero-spam__stat:last-child{border-right:0}.zero-spam__cell .zero-spam__widget{margin-bottom:0}.zero-spam__stat{display:inline-block;float:left;border-right:1px solid rgba(0,0,0,0.2);margin:0 10px 10px 0;padding-right:10px;font-size:12px}.zero-spam__stat b{font-size:15px;text-align:right;display:block}.zerospam__left{padding-right:445px}.zerospam__right{width:422px;float:right}.zero-spam__label{display:inline-block;padding:3px 5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.zero-spam__fright{float:right}@media all and (max-width: 1140px){.zerospam__left{padding-right:0}.zerospam__right{width:100%;float:none}.zerospam__right .zero-spam__widget:first-child{margin-top:0}}.zero-spam__label{display:inline-block;padding:3px 5px;font-size:11px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.zero-spam__pager{display:inline-block;margin:0;padding:0;list-style-type:none;overflow:hidden;font-size:11px;font-weight:bold}.zero-spam__pager li{display:inline-block;float:left;margin:0 1px}.zero-spam__pager a{display:block;padding:6px 13px;border-radius:3px;background:#fddb5a;color:#896d02;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.zero-spam__pager a.zero-spam__page-selected{background:transparent;color:#000}.zero-spam__page-info{display:inline-block;font-size:11px;line-height:30px;margin-left:10px;vertical-align:top}.zero-spam__map{height:350px}.zero-spam__photos{display:block;margin:0;padding:0;list-style-type:none}.zero-spam__photos li{display:block;overflow:hidden}.zero-spam__photos img{max-width:100%}.zero-spam__photo{display:block;width:94px;height:94px;float:left;margin-right:10px}
{build/fonts → fonts}/FontAwesome.otf RENAMED
File without changes
{build/fonts → fonts}/fontawesome-webfont.eot RENAMED
File without changes
{build/fonts → fonts}/fontawesome-webfont.svg RENAMED
File without changes
{build/fonts → fonts}/fontawesome-webfont.ttf RENAMED
File without changes
{build/fonts → fonts}/fontawesome-webfont.woff RENAMED
File without changes
{build/fonts → fonts}/index.php RENAMED
File without changes
grunt/aliases.yaml DELETED
@@ -1,21 +0,0 @@
1
- default:
2
- - 'jshint'
3
- - 'uglify:dev'
4
- - 'copy:dev'
5
- - 'concurrent:watch'
6
-
7
- prod:
8
- - 'jshint'
9
- - 'uglify:prod'
10
- - 'compass:prod'
11
- - 'copy:prod'
12
-
13
- deploy:
14
- - 'jshint'
15
- - 'uglify:prod'
16
- - 'compass:prod'
17
- - 'copy:prod'
18
- - 'shell'
19
-
20
- clean:
21
- - 'shell:clean'
grunt/compass.js DELETED
@@ -1,14 +0,0 @@
1
- module.exports = {
2
- dev: {
3
- options: {
4
- config: 'config.rb',
5
- watch: true
6
- }
7
- },
8
- prod: {
9
- options: {
10
- config: 'config.rb',
11
- environment: 'production'
12
- }
13
- }
14
- };
grunt/concurrent.js DELETED
@@ -1,6 +0,0 @@
1
- module.exports = {
2
- options: {
3
- logConcurrentOutput: true
4
- },
5
- watch: ['watch', 'compass:dev']
6
- };
grunt/copy.js DELETED
@@ -1,12 +0,0 @@
1
- module.exports = {
2
- dev: {
3
- files: [
4
- {expand: true, flatten: true, src: ['src/img/*', '!src/img/country-flags'], dest: 'build/img-dev/', filter: 'isFile'}
5
- ]
6
- },
7
- prod: {
8
- files: [
9
- {expand: true, flatten: true, src: ['src/img/*', '!src/img/country-flags'], dest: 'build/img/', filter: 'isFile'}
10
- ]
11
- }
12
- };
grunt/jshint.js DELETED
@@ -1,10 +0,0 @@
1
- module.exports = {
2
- gruntfile: ['Gruntfile.js'],
3
- src: [
4
- 'src/js/**/*.js',
5
- '!src/js/jvectormap-world-mill-en.js',
6
- '!src/js/jvectormap.min.js',
7
- '!src/js/morris.min.js',
8
- '!src/js/raphael.min.js'
9
- ]
10
- };
grunt/shell.js DELETED
@@ -1,22 +0,0 @@
1
- module.exports = {
2
- git: {
3
- command: [
4
- 'git checkout master',
5
- 'git pull origin master',
6
- 'git fetch'
7
- ].join('&&')
8
- },
9
- clean: {
10
- command: [
11
- 'rm -rf build/js-dev/*',
12
- 'rm -rf build/css-dev/*',
13
- 'rm -rf build/img-dev/*',
14
- 'rm -rf build/js/*',
15
- 'rm -rf build/css/*',
16
- 'rm -rf build/img/*'
17
- ].join('&&')
18
- },
19
- deploy: {
20
- command: './deploy.sh'
21
- },
22
- };
grunt/uglify.js DELETED
@@ -1,21 +0,0 @@
1
- module.exports = {
2
- dev: {
3
- options: {
4
- beautify: true,
5
- mangle: false,
6
- compress: false
7
- },
8
- files: {
9
- 'build/js/zero-spam.js': ['src/js/zero-spam.js'],
10
- 'build/js-dev/zero-spam-admin.js': ['src/js/zero-spam-admin.js'],
11
- 'build/js-dev/charts.js': ['src/js/raphael.min.js', 'src/js/morris.min.js', 'src/js/jvectormap.min.js', 'src/js/jvectormap-world-mill-en.js']
12
- }
13
- },
14
- prod: {
15
- files: {
16
- 'build/js/zero-spam.js': ['src/js/zero-spam.js'],
17
- 'build/js/zero-spam-admin.min.js': ['src/js/zero-spam-admin.js'],
18
- 'build/js/charts.min.js': ['src/js/raphael.min.js', 'src/js/morris.min.js', 'src/js/jvectormap.min.js', 'src/js/jvectormap-world-mill-en.js']
19
- }
20
- }
21
- };
grunt/watch.js DELETED
@@ -1,14 +0,0 @@
1
- module.exports = {
2
- gruntfile: {
3
- files: ['Gruntfile.js'],
4
- tasks: ['jshint:gruntfile']
5
- },
6
- dev: {
7
- files: ['src/js/zero-spam.js', 'src/js/zero-spam-admin.js'],
8
- tasks: ['jshint:src', 'uglify:dev']
9
- },
10
- images: {
11
- files: ['src/img/**/*.jpg', '!src/img/country-flags'],
12
- tasks: ['copy:dev']
13
- }
14
- };
img/country-flags-sed4ce568d7.png ADDED
Binary file
inc/admin-sidebar.tpl.php CHANGED
@@ -22,7 +22,7 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
22
<i class="fa fa-star"></i></a> |
23
<b>Version:</b> <?php echo $plugin['Version']; ?> | <b><?php echo __( 'Author', 'zerospam' ); ?></b> <?php echo $plugin['Author']; ?></p>
24
<p><?php echo $plugin['Description']; ?></p>
25
- <p><small>If you have suggestions for a new add-on, feel free to email me at <a href="mailto:me@benmarshall.me">me@benmarshall.me</a>. Want regular updates? Follow me on <a href="https://twitter.com/bmarshall0511" target="_blank">Twitter</a> or <a href="http://www.benmarshall.me/" target="_blank">visit my blog</a>.</small></p>
26
<p>
27
<a href="https://www.gittip.com/bmarshall511/" class="zero-spam__button" target="_blank"><?php echo __( 'Show Support &mdash; Donate!', 'zerospam' ); ?></a>
28
<a href="https://wordpress.org/support/view/plugin-reviews/zero-spam" class="zero-spam__button" target="_blank"><?php echo __( 'Spread the Love &mdash; Rate!', 'zerospam' ); ?></a>
@@ -38,11 +38,3 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
38
<p><a href="https://github.com/bmarshall511/wordpress-zero-spam/fork" target="_blank" class="button button-large button-primary"><?php echo __( 'Fork it on GitHub!', 'zerospam' ); ?></a></p>
39
</div>
40
</div>
41
-
42
- <div class="zero-spam__widget">
43
- <div class="zero-spam__inner">
44
- <h3><?php echo __( 'Follow WordPress Zero Spam on Twitter', 'zerospam' ); ?></h3>
45
- <a class="twitter-timeline" href="https://twitter.com/bmarshall0511/lists/wordpress-zero-spam" data-widget-id="525626580693815297" data-chrome="noborders noheader">Tweets from https://twitter.com/bmarshall0511/lists/wordpress-zero-spam</a>
46
- <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
47
- </div>
48
- </div>
22
<i class="fa fa-star"></i></a> |
23
<b>Version:</b> <?php echo $plugin['Version']; ?> | <b><?php echo __( 'Author', 'zerospam' ); ?></b> <?php echo $plugin['Author']; ?></p>
24
<p><?php echo $plugin['Description']; ?></p>
25
+ <p><small>If you have suggestions for a new add-on, feel free to email me at <a href="mailto:me@benmarshall.me">me@benmarshall.me</a>. Want regular updates? Follow me on <a href="https://twitter.com/bmarshall0511" target="_blank">Twitter</a> or <a href="https://benmarshall.me/" target="_blank">visit my blog</a>.</small></p>
26
<p>
27
<a href="https://www.gittip.com/bmarshall511/" class="zero-spam__button" target="_blank"><?php echo __( 'Show Support &mdash; Donate!', 'zerospam' ); ?></a>
28
<a href="https://wordpress.org/support/view/plugin-reviews/zero-spam" class="zero-spam__button" target="_blank"><?php echo __( 'Spread the Love &mdash; Rate!', 'zerospam' ); ?></a>
38
<p><a href="https://github.com/bmarshall511/wordpress-zero-spam/fork" target="_blank" class="button button-large button-primary"><?php echo __( 'Fork it on GitHub!', 'zerospam' ); ?></a></p>
39
</div>
40
</div>
inc/ip-block.tpl.php CHANGED
@@ -21,7 +21,7 @@
21
<td class="zero-spam__ip"><a href="http://ip-lookup.net/index.php?ip=<?php echo esc_attr( $data->ip ); ?>" target="_blank">
22
<?php echo $data->ip; ?> <i class="fa fa-external-link-square"></i></a></td>
23
<td class="zero-spam__status">
24
- <?php if ( $this->_is_blocked( $data->ip ) ): ?>
25
<span class="zero-spam__label zero-spam__bg--primary"><?php echo __( 'Blocked', 'zerospam' ); ?></span>
26
<?php else: ?>
27
<span class="zero-spam__label zero-spam__bg--trinary"><?php echo __( 'Unblocked', 'zerospam' ); ?></span>
@@ -65,7 +65,7 @@
65
<?php endforeach; ?>
66
</tbody>
67
</table>
68
- <?php $this->_pager( $limit, $this->_get_blocked_ip_count(), $page, $tab ); ?>
69
</div>
70
<?php else: ?>
71
<?php echo __( 'No blocked IPs found.', 'zerospam' ); ?>
21
<td class="zero-spam__ip"><a href="http://ip-lookup.net/index.php?ip=<?php echo esc_attr( $data->ip ); ?>" target="_blank">
22
<?php echo $data->ip; ?> <i class="fa fa-external-link-square"></i></a></td>
23
<td class="zero-spam__status">
24
+ <?php if ( zerospam_is_blocked( $data->ip ) ): ?>
25
<span class="zero-spam__label zero-spam__bg--primary"><?php echo __( 'Blocked', 'zerospam' ); ?></span>
26
<?php else: ?>
27
<span class="zero-spam__label zero-spam__bg--trinary"><?php echo __( 'Unblocked', 'zerospam' ); ?></span>
65
<?php endforeach; ?>
66
</tbody>
67
</table>
68
+ <?php zerospam_pager( $limit, zerospam_get_blocked_ip_count(), $page, $tab ); ?>
69
</div>
70
<?php else: ?>
71
<?php echo __( 'No blocked IPs found.', 'zerospam' ); ?>
inc/spammer-logs.tpl.php CHANGED
@@ -55,24 +55,46 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
55
<?php echo __( 'Registrations', 'zerospam' ); ?>
56
<b><?php echo number_format( $all_spam['registration_spam'], 0 ); ?></b>
57
</div>
58
- <?php if ( $this->settings['plugins']['cf7'] ): ?>
59
- <div class="zero-spam__stat">
60
- <?php echo __( 'Contact Form 7', 'zerospam' ); ?>
61
- <b><?php echo number_format( $all_spam['cf7_spam'], 0 ); ?></b>
62
- </div>
63
- <?php endif; ?>
64
- <?php if ( $this->settings['plugins']['gf'] ): ?>
65
- <div class="zero-spam__stat">
66
- <?php echo __( 'Gravity Forms', 'zerospam' ); ?>
67
- <b><?php echo number_format( $all_spam['gf_spam'], 0 ); ?></b>
68
- </div>
69
- <?php endif; ?>
70
- <?php if ( $this->settings['plugins']['bp'] ): ?>
71
- <div class="zero-spam__stat">
72
- <?php echo __( 'BP Registrations', 'zerospam' ); ?>
73
- <b><?php echo number_format( $all_spam['bp_registration_spam'], 0 ); ?></b>
74
- </div>
75
- <?php endif; ?>
76
</div>
77
</div>
78
</div>
@@ -109,7 +131,7 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
109
<script>
110
111
jQuery(function() {
112
- jQuery.post( ajaxurl, {
113
action: 'get_ip_spam',
114
security: '<?php echo $ajax_nonce; ?>',
115
}, function( data ) {
@@ -192,7 +214,7 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
192
element: 'donut',
193
data: [
194
<?php foreach( $all_spam['by_day'] as $day => $count ): ?>
195
- {value: <?php echo $this->_get_percent( $count, count( $all_spam['raw'] ) ); ?>, label: '<?php echo $day; ?>', formatted: '<?php echo $this->_get_percent( $count, count( $all_spam['raw'] ) ); ?>%'},
196
<?php endforeach; ?>
197
],
198
formatter: function (x, data) { return data.formatted; }
@@ -231,12 +253,12 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
231
<?php echo $ip; ?> <i class="fa fa-external-link-square"></i></a></td>
232
<?php if ( $ip_location_support ): ?>
233
<td>
234
- <div data-ip-location="<?php echo $ip; ?>"><i class="fa fa fa-circle-o-notch fa-spin"></i> <em><?php echo __( 'Locating...', 'zerospam' ); ?></em></div>
235
</td>
236
<?php endif; ?>
237
<td class="zero-spam__text-right"><?php echo number_format( $count, 0 ); ?></td>
238
<td class="zero-spam__status">
239
- <?php if( $this->_is_blocked( $ip ) ): ?>
240
<span class="zero-spam__label zero-spam__bg--primary"><?php echo __( 'Blocked', 'zerospam' ); ?></span>
241
<?php else: ?>
242
<span class="zero-spam__label zero-spam__bg--trinary"><?php echo __( 'Unblocked', 'zerospam' ); ?></span>
@@ -274,35 +296,116 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
274
<?php foreach( $all_spam['by_date'] as $date => $ary ): ?>
275
{
276
'date': '<?php echo $date; ?>',
277
- 'spam_comments': <?php echo $ary['comment_spam']; ?>,
278
- 'spam_registrations': <?php echo $ary['registration_spam']; ?>,
279
- <?php if ( $this->settings['plugins']['cf7'] ): ?>'spam_cf7': <?php echo $ary['cf7_spam']; ?>,<?php endif; ?>
280
- <?php if ( $this->settings['plugins']['gf'] ): ?>'spam_gf': <?php echo $ary['gf_spam']; ?><?php endif; ?>
281
- <?php if ( $this->settings['plugins']['bp'] ): ?>'bp_registrations': <?php echo $ary['bp_registration_spam']; ?><?php endif; ?>
282
},
283
<?php endforeach; ?>
284
],
285
xkey: 'date',
286
ykeys: [
287
- 'spam_comments',
288
- 'spam_registrations',
289
- <?php if ( $this->settings['plugins']['cf7'] ): ?>'spam_cf7',<?php endif; ?>
290
- <?php if ( $this->settings['plugins']['gf'] ): ?>'spam_gf',<?php endif; ?>
291
- <?php if ( $this->settings['plugins']['bp'] ): ?>'bp_registrations',<?php endif; ?>
292
],
293
labels: [
294
- '<?php echo __( 'Spam Comments', 'zerospam' ); ?>',
295
- '<?php echo __( 'Spam Registrations', 'zerospam' ); ?>',
296
- <?php if ( $this->settings['plugins']['cf7'] ): ?>'<?php echo __( 'Contact Form 7', 'zerospam' ); ?>',<?php endif; ?>
297
- <?php if ( $this->settings['plugins']['gf'] ): ?>'<?php echo __( 'Gravity Forms', 'zerospam' ); ?>',<?php endif; ?>
298
- <?php if ( $this->settings['plugins']['bp'] ): ?>'<?php echo __( 'BuddyPress', 'zerospam' ); ?>',<?php endif; ?>
299
],
300
xLabels: 'day',
301
lineColors: [
302
- '#00639e',
303
- '#ff183a',
304
- '#fddb5a',
305
- '#222d3a'
306
]
307
});
308
});
@@ -338,6 +441,11 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
338
case 5:
339
$type = '<span class="zero-spam__label zero-spam__bg--bpr">' . __( 'BP Registration', 'zerospam' ) . '</span>';
340
break;
341
}
342
?>
343
<tr data-ip="<?php echo $obj->ip; ?>" id="row-<?php echo $obj->zerospam_id; ?>">
@@ -352,7 +460,7 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
352
<td><?php echo isset( $type ) ? $type : '&mdash;'; ?></td>
353
<?php if ( $ip_location_support ): ?>
354
<td>
355
- <div data-ip-location="<?php echo $obj->ip; ?>"><i class="fa fa fa-circle-o-notch fa-spin"></i> <em><?php echo __( 'Locating...', 'zerospam' ); ?></em></div>
356
</td>
357
<?php endif; ?>
358
<td>
@@ -367,7 +475,7 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
367
<?php endif; ?>
368
</td>
369
<td class="zero-spam__status">
370
- <?php if( $this->_is_blocked( $obj->ip ) ): ?>
371
<span class="zero-spam__label zero-spam__bg--primary"><?php echo __( 'Blocked', 'zerospam' ); ?></span>
372
<?php else: ?>
373
<span class="zero-spam__label zero-spam__bg--trinary"><?php echo __( 'Unblocked', 'zerospam' ); ?></span>
@@ -383,7 +491,7 @@ defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
383
<?php endforeach; ?>
384
</tbody>
385
</table>
386
- <?php $this->_pager( $limit, $this->_get_spam_count(), $page, $tab ); ?>
387
<?php else: ?>
388
<?php echo __( 'No spammers detected yet!', 'zerospam'); ?>
389
<?php endif; ?>
55
<?php echo __( 'Registrations', 'zerospam' ); ?>
56
<b><?php echo number_format( $all_spam['registration_spam'], 0 ); ?></b>
57
</div>
58
+
59
+ <?php if (
60
+ zerospam_plugin_check( 'cf7' ) &&
61
+ ! empty( $this->settings['cf7_support'] ) && $this->settings['cf7_support']
62
+ ): ?>
63
+ <div class="zero-spam__stat">
64
+ <?php echo __( 'Contact Form 7', 'zerospam' ); ?>
65
+ <b><?php echo number_format( $all_spam['cf7_spam'], 0 ); ?></b>
66
+ </div>
67
+ <?php endif; ?>
68
+
69
+ <?php if (
70
+ zerospam_plugin_check( 'gf' ) &&
71
+ ! empty( $this->settings['gf_support'] ) && $this->settings['gf_support']
72
+ ): ?>
73
+ <div class="zero-spam__stat">
74
+ <?php echo __( 'Gravity Forms', 'zerospam' ); ?>
75
+ <b><?php echo number_format( $all_spam['gf_spam'], 0 ); ?></b>
76
+ </div>
77
+ <?php endif; ?>
78
+
79
+ <?php if (
80
+ zerospam_plugin_check( 'bp' ) &&
81
+ ! empty( $this->settings['bp_support'] ) && $this->settings['bp_support']
82
+ ): ?>
83
+ <div class="zero-spam__stat">
84
+ <?php echo __( 'BP Registrations', 'zerospam' ); ?>
85
+ <b><?php echo number_format( $all_spam['bp_registration_spam'], 0 ); ?></b>
86
+ </div>
87
+ <?php endif; ?>
88
+
89
+ <?php if (
90
+ zerospam_plugin_check( 'nf' ) &&
91
+ ! empty( $this->settings['nf_support'] ) && $this->settings['nf_support']
92
+ ): ?>
93
+ <div class="zero-spam__stat">
94
+ <?php echo __( 'Ninja Forms', 'zerospam' ); ?>
95
+ <b><?php echo number_format( $all_spam['nf_spam'], 0 ); ?></b>
96
+ </div>
97
+ <?php endif; ?>
98
</div>
99
</div>
100
</div>
131
<script>
132
133
jQuery(function() {
134
+ jQuery.post( ajaxurl, {
135
action: 'get_ip_spam',
136
security: '<?php echo $ajax_nonce; ?>',
137
}, function( data ) {
214
element: 'donut',
215
data: [
216
<?php foreach( $all_spam['by_day'] as $day => $count ): ?>
217
+ {value: <?php echo zerospam_get_percent( $count, count( $all_spam['raw'] ) ); ?>, label: '<?php echo $day; ?>', formatted: '<?php echo zerospam_get_percent( $count, count( $all_spam['raw'] ) ); ?>%'},
218
<?php endforeach; ?>
219
],
220
formatter: function (x, data) { return data.formatted; }
253
<?php echo $ip; ?> <i class="fa fa-external-link-square"></i></a></td>
254
<?php if ( $ip_location_support ): ?>
255
<td>
256
+ <div data-ip-location="<?php echo $ip; ?>"><i class="fa fa-search"></i></div>
257
</td>
258
<?php endif; ?>
259
<td class="zero-spam__text-right"><?php echo number_format( $count, 0 ); ?></td>
260
<td class="zero-spam__status">
261
+ <?php if( zerospam_is_blocked( $ip ) ): ?>
262
<span class="zero-spam__label zero-spam__bg--primary"><?php echo __( 'Blocked', 'zerospam' ); ?></span>
263
<?php else: ?>
264
<span class="zero-spam__label zero-spam__bg--trinary"><?php echo __( 'Unblocked', 'zerospam' ); ?></span>
296
<?php foreach( $all_spam['by_date'] as $date => $ary ): ?>
297
{
298
'date': '<?php echo $date; ?>',
299
+ <?php foreach ( $ary as $key => $val ):
300
+ switch ( $key ):
301
+ case 'comment_spam': ?>
302
+ 'spam_comments' : <?php echo $val; ?>,
303
+ <?php break;
304
+ case 'registration_spam': ?>
305
+ 'spam_registrations' : <?php echo $val; ?>,
306
+ <?php break;
307
+ case 'cf7_spam':
308
+ if ( zerospam_plugin_check( 'cf7' ) && ! empty( $this->settings['cf7_support'] ) && $this->settings['cf7_support'] ): ?>
309
+ 'spam_cf7' : <?php echo $val; ?>,
310
+ <?php endif; break;
311
+ case 'gf_spam':
312
+ if ( zerospam_plugin_check( 'gf' ) && ! empty( $this->settings['gf_support'] ) && $this->settings['gf_support'] ): ?>
313
+ 'spam_gf' : <?php echo $val; ?>,
314
+ <?php endif; break;
315
+ case 'bp_registration_spam':
316
+ if ( zerospam_plugin_check( 'bp' ) && ! empty( $this->settings['bp_support'] ) && $this->settings['bp_support'] ): ?>
317
+ 'bp_registrations' : <?php echo $val; ?>,
318
+ <?php endif; break;
319
+ case 'nf_spam':
320
+ if ( zerospam_plugin_check( 'nf' ) && ! empty( $this->settings['nf_support'] ) && $this->settings['nf_support'] ): ?>
321
+ 'nf_spam' : <?php echo $val; ?>,
322
+ <?php endif; break;
323
+ default: if ( $key != 'data' ): ?>
324
+ '<?php echo $key; ?>': <?php echo $val; ?>,
325
+ <?php endif; endswitch;
326
+ endforeach; ?>
327
},
328
<?php endforeach; ?>
329
],
330
xkey: 'date',
331
ykeys: [
332
+ <?php foreach ( $ary as $key => $val ):
333
+ switch ( $key ):
334
+ case 'comment_spam': ?>
335
+ 'spam_comments',
336
+ <?php break;
337
+ case 'registration_spam': ?>
338
+ 'spam_registrations',
339
+ <?php break;
340
+ case 'cf7_spam': if ( zerospam_plugin_check( 'cf7' ) && ! empty( $this->settings['cf7_support'] ) && $this->settings['cf7_support'] ): ?>
341
+ 'spam_cf7',
342
+ <?php endif; break;
343
+ case 'gf_spam': if ( zerospam_plugin_check( 'gf' ) && ! empty( $this->settings['gf_support'] ) && $this->settings['cf7_support'] ): ?>
344
+ 'spam_gf',
345
+ <?php endif; break;
346
+ case 'bp_registration_spam': if ( zerospam_plugin_check( 'bp' ) && ! empty( $this->settings['bp_support'] ) && $this->settings['cf7_support'] ): ?>
347
+ 'bp_registrations',
348
+ <?php endif; break;
349
+ case 'nf_spam': if ( zerospam_plugin_check( 'nf' ) && ! empty( $this->settings['nf_support'] ) && $this->settings['cf7_support'] ): ?>
350
+ 'nf_spam',
351
+ <?php endif; break;
352
+ default: if ( $key != 'data' ): ?>
353
+ '<?php echo $key; ?>',
354
+ <?php endif; endswitch;
355
+ endforeach; ?>
356
],
357
labels: [
358
+ <?php foreach ( $ary as $key => $val ):
359
+ switch ( $key ):
360
+ case 'comment_spam': ?>
361
+ '<?php echo __( 'Spam Comments', 'zerospam' ); ?>',
362
+ <?php break;
363
+ case 'registration_spam': ?>
364
+ '<?php echo __( 'Spam Registrations', 'zerospam' ); ?>',
365
+ <?php break;
366
+ case 'cf7_spam': if ( zerospam_plugin_check( 'cf7' ) && ! empty( $this->settings['cf7_support'] ) && $this->settings['cf7_support'] ): ?>
367
+ '<?php echo __( 'Contact Form 7', 'zerospam' ); ?>',
368
+ <?php endif; break;
369
+ case 'gf_spam': if ( zerospam_plugin_check( 'gf' ) && ! empty( $this->settings['gf_support'] ) && $this->settings['cf7_support'] ): ?>
370
+ '<?php echo __( 'Gravity Forms', 'zerospam' ); ?>',
371
+ <?php endif; break;
372
+ case 'bp_registration_spam': if ( zerospam_plugin_check( 'bp' ) && ! empty( $this->settings['bp_support'] ) && $this->settings['cf7_support'] ): ?>
373
+ '<?php echo __( 'BuddyPress', 'zerospam' ); ?>',
374
+ <?php endif; break;
375
+ case 'nf_spam': if ( zerospam_plugin_check( 'nf' ) && ! empty( $this->settings['nf_support'] ) && $this->settings['cf7_support'] ): ?>
376
+ '<?php echo __( 'Ninja Forms', 'zerospam' ); ?>',
377
+ <?php endif; break;
378
+ default: if ( $key != 'data' ): ?>
379
+ '<?php echo $key; ?>',
380
+ <?php endif; endswitch;
381
+ endforeach; ?>
382
],
383
xLabels: 'day',
384
lineColors: [
385
+ <?php foreach ( $ary as $key => $val ):
386
+ switch ( $key ):
387
+ case 'comment_spam': ?>
388
+ '#00639e',
389
+ <?php break;
390
+ case 'registration_spam': ?>
391
+ '#ff183a',
392
+ <?php break;
393
+ case 'cf7_spam': if ( zerospam_plugin_check( 'cf7' ) && ! empty( $this->settings['cf7_support'] ) && $this->settings['cf7_support'] ): ?>
394
+ '#fddb5a',
395
+ <?php endif; break;
396
+ case 'gf_spam': if ( zerospam_plugin_check( 'gf' ) && ! empty( $this->settings['gf_support'] ) && $this->settings['cf7_support'] ): ?>
397
+ '#222d3a'
398
+ <?php endif; break;
399
+ case 'bp_registration_spam': if ( zerospam_plugin_check( 'bp' ) && ! empty( $this->settings['bp_support'] ) && $this->settings['cf7_support'] ): ?>
400
+ '#a0d5f4'
401
+ <?php endif; break;
402
+ case 'nf_spam': if ( zerospam_plugin_check( 'nf' ) && ! empty( $this->settings['nf_support'] ) && $this->settings['cf7_support'] ): ?>
403
+ '#ef4748',
404
+ <?php endif; break;
405
+ default: if ( $key != 'data' ): ?>
406
+ '#c2c2c2',
407
+ <?php endif; endswitch;
408
+ endforeach; ?>
409
]
410
});
411
});
441
case 5:
442
$type = '<span class="zero-spam__label zero-spam__bg--bpr">' . __( 'BP Registration', 'zerospam' ) . '</span>';
443
break;
444
+ case 'nf':
445
+ $type = '<span class="zero-spam__label zero-spam__bg--nf">' . __( 'Ninja Forms', 'zerospam' ) . '</span>';
446
+ break;
447
+ default:
448
+ $type = '<span class="zero-spam__label zero-spam__bg--misc">' . __( $obj->type, 'zerospam' ) . '</span>';
449
}
450
?>
451
<tr data-ip="<?php echo $obj->ip; ?>" id="row-<?php echo $obj->zerospam_id; ?>">
460
<td><?php echo isset( $type ) ? $type : '&mdash;'; ?></td>
461
<?php if ( $ip_location_support ): ?>
462
<td>
463
+ <div data-ip-location="<?php echo $obj->ip; ?>"><i class="fa fa-search"></i></div>
464
</td>
465
<?php endif; ?>
466
<td>
475
<?php endif; ?>
476
</td>
477
<td class="zero-spam__status">
478
+ <?php if( zerospam_is_blocked( $obj->ip ) ): ?>
479
<span class="zero-spam__label zero-spam__bg--primary"><?php echo __( 'Blocked', 'zerospam' ); ?></span>
480
<?php else: ?>
481
<span class="zero-spam__label zero-spam__bg--trinary"><?php echo __( 'Unblocked', 'zerospam' ); ?></span>
491
<?php endforeach; ?>
492
</tbody>
493
</table>
494
+ <?php zerospam_pager( $limit, zerospam_get_spam_count(), $page, $tab ); ?>
495
<?php else: ?>
496
<?php echo __( 'No spammers detected yet!', 'zerospam'); ?>
497
<?php endif; ?>
build/js/charts.min.js → js/charts.js RENAMED
File without changes
js/zero-spam-admin.js ADDED
@@ -0,0 +1 @@
1
+ function closeForms(){jQuery(".zero-spam__row-highlight").remove(),jQuery("tr").removeClass("zero-spam__loading"),jQuery("tr").removeClass("zero-spam__loaded")}function clearLog(){!0===confirm("This will PERMANENTLY delete all data in the spammer log. This action cannot be undone. Are you sure you want to continue?")&&jQuery.post(ajaxurl,{action:"reset_log",security:zero_spam_admin.nonce},function(){location.reload()})}function updateRow(a){a&&jQuery.post(ajaxurl,{action:"get_blocked_ip",security:zero_spam_admin.nonce,ip:a},function(a){var b,c=jQuery.parseJSON(a),d=jQuery("tr[data-ip='"+c.ip+"']");b=!0===c.is_blocked?'<span class="zero-spam__label zero-spam__bg--primary">Blocked</span>':'<span class="zero-spam__label zero-spam__bg--trinary">Unblocked</span>',jQuery(".zero-spam__reason",d).text(c.reason),jQuery(".zero-spam__start-date",d).text(c.start_date_txt),jQuery(".zero-spam__end-date",d).text(c.end_date_txt),jQuery(".zero-spam__status",d).html(b)})}jQuery(document).ready(function(a){a("[data-ip-location]").click(function(){var b=a(this).data("ip-location"),c=a("[data-ip-location='"+b+"']");jQuery.post(ajaxurl,{action:"get_location",security:zero_spam_admin.nonce,ip:b},function(b){var d=a.parseJSON(b),e="";d&&(d.country_name&&(e+=d.country_code),d.region_name&&(e.length&&(e+=", "),e+=d.region_name),d.city&&(e.length&&(e+=", "),e+=d.city),d.country_code&&(e='<span class="country-flag country-flags-'+d.country_code.toLowerCase()+'"></span> '+e)),e.length||(e='<i class="fa fa-exclamation-triangle"></i>'),c.html(e)})}),a(".zero-spam__block-ip, .zero-spam__trash").click(function(b){b.preventDefault(),closeForms();var c=a(this).closest("tr"),d=a("<tr class='zero-spam__row-highlight'>"),e=a(this),f=(e.parent(),e.data("ip")),g="";c.addClass("zero-spam__loading"),g=e.hasClass("zero-spam__trash")?"trash_ip_block":"block_ip_form",a.post(ajaxurl,{action:g,security:zero_spam_admin.nonce,ip:f},function(b){c.removeClass("zero-spam__loading"),e.hasClass("zero-spam__trash")?(g="trash_ip_block",c.fadeOut(function(){c.remove(),0===a(".zero-spam__table tbody tr").length&&(a("#zerospam-id-container").after("No blocked IPs found."),a("#zerospam-id-container").remove())})):(g="block_ip_form",c.addClass("zero-spam__loaded"),d.append("<td colspan='10'>"+b+"</td>"),c.before(d))})})});
js/zerospam.js ADDED
@@ -0,0 +1 @@
1
+ !function(a){"use strict";a(function(){var b="#commentform";b+=", #registerform",b+=", .wpcf7-form",b+=", .gform_wrapper form",b+=", #buddypress #signup_form",b+=", .zerospam",b+=", .ninja-forms-form","undefined"!=typeof zerospam.key&&a(b).on("submit",function(){return a("<input>").attr("type","hidden").attr("name","zerospam_key").attr("value",zerospam.key).appendTo(b),!0})})}(jQuery);
lib/zero-spam.class.php DELETED
@@ -1,1981 +0,0 @@
1
- <?php
2
- /**
3
- * Security Note: Blocks direct access to the plugin PHP files.
4
- */
5
- defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
6
-
7
- class Zero_Spam {
8
-
9
- /**
10
- * Static property to hold our singleton instance.
11
- *
12
- * @since 1.5.1
13
- * @var (boolean|object) $instance Description.
14
- */
15
- public static $instance = false;
16
-
17
- /**
18
- * Holds all of WordPress Zero Spam settings.
19
- *
20
- * @since 1.5.0
21
- * @access private
22
- * @var array $settings {
23
- * WordPress Zero Spam settings array.
24
- *
25
- * @type array $zerospam_general_settings WordPress Zero Spam general
26
- * settings.
27
- * @type string $page settings page.
28
- * @type string $db_version Current database version.
29
- * @type string $img_dir Plugin image directory.
30
- * @type array $tabs {
31
- * Holds all of the WordPress Zero Spam setting pages.
32
- *
33
- * @type string $zerospam_general_settings General Settings page.
34
- * @type string $zerospam_ip_block Blocked IP page.
35
- * }
36
- * @type plugins $tabs {
37
- * Holds all of the supported plugins that are installed.
38
- *
39
- * @type boolean $cf7 Contact Form 7.
40
- * @type boolean $gf Gravity Forms.
41
- * }
42
- * }
43
- */
44
- private $settings = array(
45
- 'zerospam_general_settings' => array(),
46
- 'page' => 'options-general.php',
47
- 'db_version' => '0.0.2',
48
- 'img_dir' => 'img',
49
- 'tabs' => array(
50
- 'zerospam_general_settings' => 'General Settings',
51
- 'zerospam_ip_block' => 'Blocked IPs',
52
- ),
53
- 'plugins' => array(
54
- 'cf7' => false,
55
- 'gf' => false,
56
- 'bp' => false
57
- )
58
- );
59
-
60
- /**
61
- * Returns an instance.
62
- *
63
- * If an instance exists, this returns it. If not, it creates one and
64
- * retuns it.
65
- *
66
- * @since 1.5.1
67
- *
68
- * @return object
69
- */
70
- public static function get_instance() {
71
-
72
- if ( ! self::$instance ) {
73
- self::$instance = new self;
74
- }
75
-
76
- return self::$instance;
77
- }
78
-
79
- /**
80
- * Plugin initialization.
81
- *
82
- * Initializes the plugins functionality.
83
- *
84
- * @since 1.0.0
85
- *
86
- */
87
- public function __construct() {
88
-
89
- // Change pref page if network activated
90
- if ( is_plugin_active_for_network( plugin_basename( ZEROSPAM_PLUGIN ) ) ) {
91
- $this->settings['page'] = 'settings.php';
92
- }
93
-
94
- // Check for supported, installed plugins.
95
- $this->_plugin_check();
96
-
97
- // Load the plugin settings.
98
- $this->_load_settings();
99
-
100
- // Call the plugin WordPress action hooks.
101
- $this->_actions();
102
-
103
- // Call the plugin WordPress filters.
104
- $this->_filters();
105
-
106
- // Called when the plugin is activated.
107
- register_activation_hook( __FILE__, array( &$this, 'install' ) );
108
- }
109
-
110
- /**
111
- * Uses init.
112
- *
113
- * Adds WordPress actions using the plugin API.
114
- *
115
- * @since 1.5.0
116
- *
117
- * @link http://codex.wordpress.org/Plugin_API/Action_Reference/init
118
- *
119
- * @return void
120
- */
121
- public function init() {
122
- // Check is logging spam is enabled, if so add the Spammer Log page.
123
- if (
124
- isset( $this->settings['zerospam_general_settings']['log_spammers'] ) &&
125
- '1' == $this->settings['zerospam_general_settings']['log_spammers']
126
- ) {
127
- $this->settings['tabs']['zerospam_spammer_logs'] = 'Spammer Log';
128
- }
129
- }
130
-
131
- /**
132
- * Uses admin_menu.
133
- *
134
- * Used to add extra submenus and menu options to the admin panel's menu
135
- * structure.
136
- *
137
- * @since 1.5.0
138
- *
139
- * @link http://codex.wordpress.org/Plugin_API/Action_Reference/admin_menu
140
- *
141
- * @return void
142
- */
143
- public function admin_menu() {
144
-
145
- if ( is_plugin_active_for_network( plugin_basename( ZEROSPAM_PLUGIN ) ) ) {
146
- $hook_suffix = add_submenu_page(
147
- 'settings.php',
148
- __( 'Zero Spam Settings', 'zerospam' ),
149
- __( 'Zero Spam', 'zerospam' ),
150
- 'manage_network',
151
- 'zerospam',
152
- array( &$this, 'settings_page' )
153
- );
154
- } else {
155
- // Register plugin settings page.
156
- $hook_suffix = add_options_page(
157
- __( 'Zero Spam Settings', 'zerospam' ),
158
- __( 'Zero Spam', 'zerospam' ),
159
- 'manage_options',
160
- 'zerospam',
161
- array( &$this, 'settings_page' )
162
- );
163
- }
164
-
165
- // Load WordPress Zero Spam settings from the database.
166
- add_action( "load-{$hook_suffix}", array( &$this, 'load_zerospam_settings' ) );
167
- }
168
-
169
- /**
170
- * Admin Scripts
171
- *
172
- * Adds CSS and JS files to the admin pages.
173
- *
174
- * @since 1.5.0
175
- *
176
- * @return void | boolean
177
- */
178
- public function load_zerospam_settings() {
179
- if ( $this->settings['page'] !== $GLOBALS['pagenow'] ) {
180
- return false;
181
- }
182
-
183
- if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
184
- $this->settings['img_dir'] = 'img-dev';
185
-
186
- wp_enqueue_style( 'zerospam-admin', plugins_url( 'build/css-dev/style.css', ZEROSPAM_PLUGIN ) );
187
- wp_enqueue_script( 'zerospam-charts', plugins_url( 'build/js-dev/charts.js', ZEROSPAM_PLUGIN ), array( 'jquery' ) );
188
- } else {
189
- $this->settings['img_dir'] = 'img';
190
-
191
- wp_enqueue_style( 'zerospam-admin', plugins_url( 'build/css/style.css', ZEROSPAM_PLUGIN ) );
192
- wp_enqueue_script( 'zerospam-charts', plugins_url( 'build/js/charts.min.js', ZEROSPAM_PLUGIN ), array( 'jquery' ) );
193
- }
194
- }
195
-
196
- /**
197
- * Plugin options page.
198
- *
199
- * Rendering goes here, checks for active tab and replaces key with the related
200
- * settings key. Uses the _options_tabs method to render the tabs.
201
- *
202
- * @since 1.5.0
203
- */
204
- public function settings_page() {
205
- $plugin = get_plugin_data( ZEROSPAM_PLUGIN );
206
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'zerospam_general_settings';
207
- $page = isset( $_GET['p'] ) ? $_GET['p'] : 1;
208
- $action = is_plugin_active_for_network( plugin_basename( ZEROSPAM_PLUGIN ) ) ? 'edit.php?action=zerospam' : 'options.php';
209
- ?>
210
- <div class="wrap">
211
- <h2><?php echo __( 'WordPress Zero Spam', 'zerospam' ); ?></h2>
212
- <?php $this->_options_tabs(); ?>
213
- <div class="zerospam__row">
214
- <div class="zerospam__right">
215
- <?php require_once( ZEROSPAM_ROOT . 'inc/admin-sidebar.tpl.php' ); ?>
216
- </div>
217
- <div class="zerospam__left">
218
- <?php
219
- if (
220
- 'zerospam_spammer_logs' == $tab &&
221
- '1' == $this->settings['zerospam_general_settings']['log_spammers']
222
- ) {
223
- $ajax_nonce = wp_create_nonce( 'zero-spam' );
224
-
225
- $limit = 10;
226
- $args = array(
227
- 'limit' => $limit,
228
- 'offset' => ($page - 1) * $limit
229
- );
230
- $spam = $this->_get_spam( $args );
231
- $spam = $this->_parse_spam_ary( $spam );
232
- $all_spam = $this->_get_spam();
233
- $all_spam = $this->_parse_spam_ary( $all_spam );
234
-
235
- if ( count( $all_spam['raw'] ) ) {
236
- $starting_date = end( $all_spam['raw'] )->date;
237
- $num_days = $this->_num_days( $starting_date );
238
- $per_day = $num_days ? number_format( ( count( $all_spam['raw'] ) / $num_days ), 2 ) : 0;
239
- }
240
-
241
- if (
242
- isset( $this->settings['zerospam_general_settings']['ip_location_support'] ) &&
243
- '1' == $this->settings['zerospam_general_settings']['ip_location_support']
244
- ) {
245
- $ip_location_support = true;
246
- } else {
247
- $ip_location_support = false;
248
- }
249
-
250
- require_once( ZEROSPAM_ROOT . 'inc/spammer-logs.tpl.php' );
251
- } elseif ( $tab == 'zerospam_ip_block' ) {
252
- $limit = 10;
253
- $args = array(
254
- 'limit' => $limit,
255
- 'offset' => ($page - 1) * $limit
256
- );
257
- $ips = $this->_get_blocked_ips( $args );
258
-
259
- require_once( ZEROSPAM_ROOT . 'inc/ip-block.tpl.php' );
260
- } else {
261
- require_once( ZEROSPAM_ROOT . 'inc/general-settings.tpl.php' );
262
- } ?>
263
- </div>
264
-
265
- </div>
266
- </div>
267
- <?php
268
- }
269
-
270
- /**
271
- * Renders a pager.
272
- *
273
- * @since 1.5.1
274
- * @access private
275
- *
276
- * @param int $num_pages Total number of pages.
277
- * @param string $tab Current page tab.
278
- * @param int $page Current page number.
279
- * @param int $total Total number of records
280
- */
281
- private function _pager( $limit = 10, $total_num, $page, $tab ) {
282
- $max_pages = 11;
283
- $num_pages = ceil( $total_num / $limit );
284
- $cnt = 0;
285
-
286
- $start = 1;
287
- if ( $page > 5 ) {
288
- $start = ( $page - 4 );
289
- }
290
-
291
- if ( 1 != $page ) {
292
- if ( 2 != $page ) {
293
- $pre_html = '<li><a href="' . $this->_admin_url() . '?page=zerospam&tab=' . $tab . '&p=1"><i class="fa fa-angle-double-left"></i></a>';
294
- }
295
- $pre_html .= '<li><a href="' . $this->_admin_url() . '?page=zerospam&tab=' . $tab . '&p=' . ( $page - 1 ) . '"><i class="fa fa-angle-left"></i></a>';
296
- }
297
-
298
- echo '<ul class="zero-spam__pager">';
299
- if ( isset( $pre_html ) ) {
300
- echo $pre_html;
301
- }
302
- for ( $i = $start; $i <= $num_pages; $i ++ ) {
303
- $cnt ++;
304
- if ( $cnt >= $max_pages ) {
305
- break;
306
- }
307
-
308
- if ( $num_pages != $page ) {
309
- $post_html = '<li><a href="' . $this->_admin_url() . '?page=zerospam&tab=' . $tab . '&p=' . ( $page + 1 ) . '"><i class="fa fa-angle-right"></i></a>';
310
- if ( ( $page + 1 ) != $num_pages ) {
311
- $post_html .= '<li><a href="' . $this->_admin_url() . '?page=zerospam&tab=' . $tab . '&p=1"><i class="fa fa-angle-double-right"></i></a>';
312
- }
313
- }
314
-
315
- $class = '';
316
- if ( $page == $i ) {
317
- $class = ' class="zero-spam__page-selected"';
318
- }
319
- echo '<li><a href="' . $this->_admin_url() . '?page=zerospam&tab=' . $tab . '&p=' . $i . '"' . $class . '>' . $i . '</a>';
320
- }
321
-
322
- if( isset( $post_html ) ) {
323
- echo $post_html;
324
- }
325
- echo '</ul>';
326
-
327
- ?>
328
- <div class="zero-spam__page-info">
329
- <?php echo __( 'Page ', 'zerospam' ) . number_format( $page, 0 ) . ' of ' . number_format( $num_pages, 0 ); ?>
330
- (<?php echo number_format( $total_num, 0 ) . __( ' total records found', 'zerospam' ); ?>)
331
- </div>
332
- <?php
333
- }
334
-
335
- /**
336
- * Sets site's compatible plugins.
337
- *
338
- * Checks if Contact Form 7 and Gravity Forms plugins are activated.
339
- *
340
- * @since 1.5.0
341
- * @access private
342
- *
343
- * @return void
344
- */
345
- private function _plugin_check() {
346
- // Contact From 7 support
347
- if ( is_plugin_active( 'contact-form-7/wp-contact-form-7.php' ) ) {
348
- $this->settings['plugins']['cf7'] = true;
349
- }
350
-
351
- // Gravity Form support.
352
- if ( is_plugin_active( 'gravityforms/gravityforms.php' ) ) {
353
- $this->settings['plugins']['gf'] = true;
354
- }
355
-
356
- // BuddyPress support.
357
- if ( function_exists( 'bp_is_active' ) ) {
358
- $this->settings['plugins']['bp'] = true;
359
- }
360
- }
361
-
362
- /**
363
- * Returns information about the supplied IP address.
364
- *
365
- * @since 1.5.2
366
- * @see http://freegeoip.net/
367
- * @access private
368
- *
369
- * @param $ip string IP address to get info for.
370
- *
371
- * @return array An array with the IP address details.
372
- */
373
- private function _get_ip_info( $ip ) {
374
- global $wpdb;
375
-
376
- // Check DB
377
- $table_name = $wpdb->prefix . 'zerospam_ip_data';
378
- $data = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table_name WHERE ip = %s", $ip ) );
379
-
380
- // Retrieve from API
381
- if ( ! $data ) {
382
- // Ignore local hosts.
383
- if ( $ip == '127.0.0.1' ) {
384
- return false;
385
- }
386
-
387
- // @ used to suppress API usage block warning.
388
- $json = @file_get_contents( 'http://freegeoip.net/json/' . $ip );
389
-
390
- $data = json_decode( $json );
391
-
392
- if ( $data ) {
393
- $wpdb->insert( $table_name, array(
394
- 'ip' => $ip,
395
- 'country_code' => $data->country_code,
396
- 'country_name' => $data->country_name,
397
- 'region_code' => $data->region_code,
398
- 'region_name' => $data->region_name,
399
- 'city' => $data->city,
400
- 'zipcode' => $data->zipcode,
401
- 'latitude' => $data->latitude,
402
- 'longitude' => $data->longitude,
403
- 'metro_code' => $data->metro_code,
404
- 'area_code' => $data->area_code
405
- ),
406
- array(
407
- '%s',
408
- '%s',
409
- '%s',
410
- '%s',
411
- '%s',
412
- '%s',
413
- '%s',
414
- '%d',
415
- '%d',
416
- '%d',
417
- '%d'
418
- )
419
- );
420
- }
421
- }
422
-
423
- if ( FALSE != $data ) {
424
- return $data;
425
- }
426
-
427
- return false;
428
- }
429
-
430
- /**
431
- * Parses the spammer ary from the DB
432
- *
433
- * @since 1.5.0
434
- * @access private
435
- *
436
- * @return void | object
437
- */
438
- private function _parse_spam_ary( $ary ) {
439
- $return = array(
440
- 'by_date' => array(),
441
- 'by_spam_count' => array(),
442
- 'raw' => $ary,
443
- 'comment_spam' => 0,
444
- 'registration_spam' => 0,
445
- 'cf7_spam' => 0,
446
- 'gf_spam' => 0,
447
- 'bp_registration_spam' => 0,
448
- 'unique_spammers' => array(),
449
- 'by_day' => array(
450
- 'Sun' => 0,
451
- 'Mon' => 0,
452
- 'Tue' => 0,
453
- 'Wed' => 0,
454
- 'Thu' => 0,
455
- 'Fri' => 0,
456
- 'Sat' => 0
457
- ),
458
- );
459
-
460
- foreach ( $ary as $key => $obj ) {
461
- // By day
462
- $return['by_day'][ date( 'D', strtotime( $obj->date ) ) ]++;
463
-
464
- // By date
465
- if ( ! isset( $return['by_date'][ substr( $obj->date, 0, 10 ) ] ) ) {
466
- $return['by_date'][ substr( $obj->date, 0, 10 ) ] = array(
467
- 'data' => array(),
468
- 'comment_spam' => 0,
469
- 'registration_spam' => 0,
470
- 'cf7_spam' => 0,
471
- 'gf_spam' => 0,
472
- 'bp_registration_spam' => 0
473
- );
474
- }
475
-
476
- // By date
477
- $return['by_date'][ substr( $obj->date, 0, 10 ) ]['data'][] = array(
478
- 'zerospam_id' => $obj->zerospam_id,
479
- 'type' => $obj->type,
480
- 'ip' => $obj->ip,
481
- 'date' => $obj->date,
482
- );
483
-
484
- // By spam count
485
- if ( ! isset( $return['by_spam_count'][ $obj->ip ] ) ) {
486
- $return['by_spam_count'][ $obj->ip ] = 0;
487
- }
488
- $return['by_spam_count'][ $obj->ip ]++;
489
-
490
- // Spam type
491
- if ( 1 == $obj->type) {
492
-
493
- // Registration spam.
494
- $return['by_date'][ substr( $obj->date, 0, 10 ) ]['registration_spam']++;
495
- $return['registration_spam']++;
496
- } elseif ( 2 == $obj->type ) {
497
-
498
- // Comment spam.
499
- $return['by_date'][ substr( $obj->date, 0, 10 ) ]['comment_spam']++;
500
- $return['comment_spam']++;
501
- } elseif ( 3 == $obj->type ) {
502
-
503
- // Contact Form 7 spam.
504
- $return['by_date'][ substr( $obj->date, 0, 10 ) ]['cf7_spam']++;
505
- $return['cf7_spam']++;
506
- } elseif ( 4 == $obj->type ) {
507
-
508
- // Gravity Form spam.
509
- $return['by_date'][ substr( $obj->date, 0, 10 ) ]['gf_spam']++;
510
- $return['gf_spam']++;
511
- } elseif ( 5 == $obj->type ) {
512
-
513
- // BuddyPress spam.
514
- $return['by_date'][ substr( $obj->date, 0, 10 ) ]['bp_registration_spam']++;
515
- $return['bp_registration_spam']++;
516
- }
517
-
518
- // Unique spammers
519
- if ( ! in_array( $obj->ip, $return['unique_spammers'] ) ) {
520
- $return['unique_spammers'][] = $obj->ip;
521
- }
522
-
523
- }
524
-
525
- return $return;
526
- }
527
-
528
- /**
529
- * Returns the percent of 2 numbers.
530
- *
531
- * @since 1.5.1
532
- * @access private
533
- */
534
- private function _get_percent( $num1, $num2 ) {
535
- return number_format( ( $num1 / $num2 ) * 100, 2 );
536
- }
537
-
538
- /**
539
- * Uses admin_init.
540
- *
541
- * Triggered before any other hook when a user accesses the admin area.
542
- *
543
- * @since 1.5.0
544
- *
545
- * @link http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init
546
- */
547
- public function admin_init() {
548
- $this->_register_settings();
549
- }
550
-
551
- /**
552
- * WP generator meta tag option.
553
- *
554
- * Field callback, renders radio inputs, note the name and value.
555
- *
556
- * @since 1.5.0
557
- */
558
- public function field_wp_generator() {
559
- if ( ! isset( $this->settings['zerospam_general_settings']['wp_generator'] ) ) {
560
- $this->settings['zerospam_general_settings']['wp_generator'] = '0';
561
- }
562
- ?>
563
- <label for="wp_generator_remove">
564
- <input type="checkbox" id="wp_generator_remove" name="zerospam_general_settings[wp_generator]" value="1" <?php if ( isset( $this->settings['zerospam_general_settings']['wp_generator']) ): checked( $this->settings['zerospam_general_settings']['wp_generator'] ); endif; ?> /> <?php echo __( 'Hide', 'zerospam' ); ?>
565
- </label>
566
-
567
- <p class="description"><?php echo __( 'It can be considered a security risk to make your WordPress version visible and public you should hide it.', 'zerospam' ); ?></p>
568
- <?php
569
- }
570
-
571
- /**
572
- * Auto block option.
573
- *
574
- * Field callback, renders checkbox input, note the name and value.
575
- *
576
- * @since 1.5.1
577
- *
578
- * @return string HTML output for auto block tag.
579
- */
580
- public function field_auto_block() {
581
- ?>
582
- <label for="auto_block">
583
- <input type="checkbox" id="auto_block" name="zerospam_general_settings[auto_block]" value="1" <?php if ( isset( $this->settings['zerospam_general_settings']['auto_block']) ): checked( $this->settings['zerospam_general_settings']['auto_block'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
584
- </label>
585
-
586
- <p class="description"><?php echo __( 'With auto IP block enabled, users who are identified as spam will automatically be blocked from the site.', 'zerospam' ); ?></p>
587
- <?php
588
- }
589
-
590
- /**
591
- * Log spammers option.
592
- *
593
- * Field callback, renders radio inputs, note the name and value.
594
- *
595
- * @since 1.5.0
596
- */
597
- public function field_log_spammers() {
598
- ?>
599
- <label for="log_spammers">
600
- <input type="checkbox" id="log_spammers" name="zerospam_general_settings[log_spammers]" value="1" <?php if( isset( $this->settings['zerospam_general_settings']['log_spammers'] ) ) : checked( $this->settings['zerospam_general_settings']['log_spammers'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
601
- </label>
602
- <?php
603
- }
604
-
605
- /**
606
- * Spam comment message option.
607
- *
608
- * Field callback, renders a text input, note the name and value.
609
- *
610
- * @since 1.5.0
611
- */
612
- public function field_spammer_msg_comment() {
613
- ?>
614
- <label for="spammer_msg_comment">
615
- <input type="text" class="regular-text" name="zerospam_general_settings[spammer_msg_comment]" value="<?php echo esc_attr( $this->settings['zerospam_general_settings']['spammer_msg_comment'] ); ?>">
616
- <p class="description"><?php echo __( 'Enter a short message to display when a spam comment has been detected.', 'zerospam' ); ?></p>
617
- </label>
618
- <?php
619
- }
620
-
621
- /**
622
- * Blocked IP message option.
623
- *
624
- * Field callback, renders a text input, note the name and value.
625
- *
626
- * @since 1.5.1
627
- */
628
- public function field_blocked_ip_msg() {
629
- ?>
630
- <label for="blocked_ip_msg">
631
- <input type="text" class="regular-text" name="zerospam_general_settings[blocked_ip_msg]" value="<?php echo esc_attr( $this->settings['zerospam_general_settings']['blocked_ip_msg'] ); ?>">
632
- <p class="description"><?php echo __( 'Enter a short message to display when a blocked IP visits the site.', 'zerospam' ); ?></p>
633
- </label>
634
- <?php
635
- }
636
-
637
- /**
638
- * Spam registration message option.
639
- *
640
- * Field callback, renders a text input, note the name and value.
641
- *
642
- * @since 1.5.0
643
- */
644
- public function field_spammer_msg_registration() {
645
- ?>
646
- <label for="spammer_msg_registration">
647
- <input type="text" class="regular-text" name="zerospam_general_settings[spammer_msg_registration]" value="<?php echo esc_attr( $this->settings['zerospam_general_settings']['spammer_msg_registration'] ); ?>">
648
- <p class="description"><?php echo __( 'Enter a short message to display when a spam registration has been detected (HTML allowed).', 'zerospam' ); ?></p>
649
- </label>
650
- <?php
651
- }
652
-
653
- /**
654
- * Contact Form 7 spam message option.
655
- *
656
- * Field callback, renders a text input, note the name and value.
657
- *
658
- * @since 1.5.0
659
- */
660
- public function field_spammer_msg_contact_form_7() {
661
- ?>
662
- <label for="spammer_msg_contact_form_7">
663
- <input type="text" class="regular-text" name="zerospam_general_settings[spammer_msg_contact_form_7]" value="<?php echo esc_attr( $this->settings['zerospam_general_settings']['spammer_msg_contact_form_7'] ); ?>">
664
- <p class="description"><?php echo __( 'Enter a short message to display when a spam registration has been detected (HTML allowed).', 'zerospam' ); ?></p>
665
- </label>
666
- <?php
667
- }
668
-
669
- /**
670
- * Contact Form 7 support option.
671
- *
672
- * Field callback, renders a checkbox input, note the name and value.
673
- *
674
- * @since 1.5.0
675
- */
676
- public function field_cf7_support() {
677
- ?>
678
- <label for="cf7_support">
679
- <input type="checkbox" id="cf7_support" name="zerospam_general_settings[cf7_support]" value="1" <?php if( isset( $this->settings['zerospam_general_settings']['cf7_support'] ) ) : checked( $this->settings['zerospam_general_settings']['cf7_support'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
680
- </label>
681
- <?php
682
- }
683
-
684
- /**
685
- * BuddyPress spam message option.
686
- *
687
- * Field callback, renders a text input, note the name and value.
688
- *
689
- * @since 1.5.2
690
- */
691
- public function field_spammer_msg_bp() {
692
- ?>
693
- <label for="spammer_msg_bp">
694
- <input type="text" class="regular-text" name="zerospam_general_settings[spammer_msg_bp]" value="<?php echo esc_attr( $this->settings['zerospam_general_settings']['spammer_msg_bp'] ); ?>">
695
- <p class="description"><?php echo __( 'Enter a short message to display when a spam BuddyPress registration has been detected (HTML allowed).', 'zerospam' ); ?></p>
696
- </label>
697
- <?php
698
- }
699
-
700
- /**
701
- * BuddyPress support option.
702
- *
703
- * Field callback, renders a checkbox input, note the name and value.
704
- *
705
- * @since 1.5.2
706
- */
707
- public function field_bp_support() {
708
- ?>
709
- <label for="bp_support">
710
- <input type="checkbox" id="bp_support" name="zerospam_general_settings[bp_support]" value="1" <?php if( isset( $this->settings['zerospam_general_settings']['bp_support'] ) ) : checked( $this->settings['zerospam_general_settings']['bp_support'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
711
- </label>
712
- <?php
713
- }
714
-
715
- /**
716
- * Gravity Forms support option.
717
- *
718
- * Field callback, renders a checkbox input, note the name and value.
719
- *
720
- * @since 1.5.0
721
- */
722
- public function field_gf_support() {
723
- ?>
724
- <label for="gf_support">
725
- <input type="checkbox" id="gf_support" name="zerospam_general_settings[gf_support]" value="1" <?php if( isset( $this->settings['zerospam_general_settings']['gf_support'] ) ) : checked( $this->settings['zerospam_general_settings']['gf_support'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
726
- </label>
727
- <?php
728
- }
729
-
730
- /**
731
- * IP location API field.
732
- *
733
- * Field callback, renders a checkbox input, note the name and value.
734
- *
735
- * @since 1.5.2
736
- */
737
- public function field_ip_location_support() {
738
- ?>
739
- <label for="ip_location_support">
740
- <input type="checkbox" id="gf_support" name="zerospam_general_settings[ip_location_support]" value="1" <?php if( isset( $this->settings['zerospam_general_settings']['ip_location_support'] ) ) : checked( $this->settings['zerospam_general_settings']['ip_location_support'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
741
- <p class="description">
742
- <?php echo __( 'IP location data provided by', 'zerospam' ); ?> <a href="http://freegeoip.net/" target="_blank">freegeoip.net</a>. <?php echo __( 'API usage is limited to 10,000 queries per hour.', 'zerospam' ); ?><br>
743
- <?php echo __( 'Disable this option if you experience slow load times on the', 'zerospam' ); ?> <a href="<?php echo $this->_admin_url() . '?page=zerospam&tab=zerospam_spammer_logs'; ?>"><?php echo __( 'Spammer Log', 'zerospam' ); ?></a> <?php echo __( 'page', 'zerospam' ); ?>.
744
- </p>
745
- </label>
746
- <?php
747
- }
748
-
749
- /**
750
- * Comment support option.
751
- *
752
- * Field callback, renders a checkbox input, note the name and value.
753
- *
754
- * @since 1.5.0
755
- */
756
- public function field_comment_support() {
757
- ?>
758
- <label for="comment_support">
759
- <input type="checkbox" id="comment_support" name="zerospam_general_settings[comment_support]" value="1" <?php if( isset( $this->settings['zerospam_general_settings']['comment_support'] ) ) : checked( $this->settings['zerospam_general_settings']['comment_support'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
760
- </label>
761
- <?php
762
- }
763
-
764
- /**
765
- * Registration support option.
766
- *
767
- * Field callback, renders a checkbox input, note the name and value.
768
- *
769
- * @since 1.5.0
770
- */
771
- public function field_registration_support() {
772
- ?>
773
- <label for="registration_support">
774
- <input type="checkbox" id="registration_support" name="zerospam_general_settings[registration_support]" value="1" <?php if( isset( $this->settings['zerospam_general_settings']['registration_support'] ) ) : checked( $this->settings['zerospam_general_settings']['registration_support'] ); endif; ?> /> <?php echo __( 'Enabled', 'zerospam' ); ?>
775
- </label>
776
- <?php
777
- }
778
-
779
- /**
780
- * Returns spammer array from DB
781
- *
782
- * @since 1.5.0
783
- * @access private
784
- *
785
- * @param array $args Array of arguments.
786
- *
787
- * @return object
788
- */
789
- private function _get_spam( $args = array() ) {
790
- global $wpdb;
791
-
792
- $table_name = $wpdb->prefix . 'zerospam_log';
793
-
794
- $order_by = isset( $args['order_by'] ) ? ' ORDER BY ' . $args['order_by'] : ' ORDER BY date DESC';
795
-
796
- $offset = isset( $args['offset'] ) ? $args['offset'] : false;
797
- $limit = isset( $args['limit'] ) ? $args['limit'] : false;
798
- if ( $offset && $limit ) {
799
- $limit = ' LIMIT ' . $offset . ', ' . $limit;
800
- } elseif( $limit ) {
801
- $limit = ' LIMIT ' . $limit;
802
- }
803
-
804
- $query = 'SELECT * FROM ' . $table_name . $order_by . $limit;
805
- $results = $wpdb->get_results( $query );
806
-
807
- return $results;
808
- }
809
-
810
- /**
811
- * Returns the total number of spam detections.
812
- *
813
- * @since 1.5.1
814
- * @access private
815
- */
816
- private function _get_spam_count() {
817
- global $wpdb;
818
- $table_name = $wpdb->prefix . 'zerospam_log';
819
- $query = $wpdb->get_row( 'SELECT COUNT(*) AS count FROM ' . $table_name );
820
- return $query->count;
821
- }
822
-
823
- /**
824
- * Returns the total number of blocked IPs.
825
- *
826
- * @since 1.5.1
827
- * @access private
828
- */
829
- private function _get_blocked_ip_count() {
830
- global $wpdb;
831
- $table_name = $wpdb->prefix . 'zerospam_blocked_ips';
832
- $query = $wpdb->get_row( 'SELECT COUNT(*) AS count FROM ' . $table_name );
833
- return $query->count;
834
- }
835
-
836
-
837
- /**
838
- * Add setting link to plugin.
839
- *
840
- * Applied to the list of links to display on the plugins page (beside the activate/deactivate links).
841
- *
842
- * @since 1.5.0
843
- *
844
- * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/plugin_action_links_(plugin_file_name)
845
- */
846
- public function plugin_action_links( $links ) {
847
- $link = array( '<a href="' . $this->_admin_url() . '?page=zerospam">' . __( 'Settings', 'zerospam' ) . '</a>' );
848
-
849
- return array_merge( $links, $link );
850
- }
851
-
852
- /**
853
- * Uses plugins_loaded.
854
- *
855
- * This hook is called once any activated plugins have been loaded. Is
856
- * generally used for immediate filter setup, or plugin overrides.
857
- *
858
- * @since 1.5.0
859
- *
860
- * @link http://codex.wordpress.org/Plugin_API/Action_Reference/plugins_loaded
861
- */
862
- public function plugins_loaded() {
863
- if ( get_option( 'zerospam_db_version' ) != $this->settings['db_version'] ) {
864
- $this->install();
865
- }
866
-
867
- // Check if user IP has been blocked.
868
- $this->_ip_check();
869
- }
870
-
871
- /**
872
- * Installs the plugins DB tables.
873
- *
874
- * @since 1.5.0
875
- *
876
- * @link http://codex.wordpress.org/Creating_Tables_with_Plugins
877
- */
878
- public function install() {
879
- global $wpdb;
880
-
881
- $log_table_name = $wpdb->prefix . 'zerospam_log';
882
- $ip_table_name = $wpdb->prefix . 'zerospam_blocked_ips';
883
- $ip_data_table_name = $wpdb->prefix . 'zerospam_ip_data';
884
-
885
- /*
886
- * We'll set the default character set and collation for this table.
887
- * If we don't do this, some characters could end up being converted
888
- * to just ?'s when saved in our table.
889
- */
890
- $charset_collate = '';
891
-
892
- if ( ! empty( $wpdb->charset ) ) {
893
- $charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset}";
894
- }
895
-
896
- if ( ! empty( $wpdb->collate ) ) {
897
- $charset_collate .= " COLLATE {$wpdb->collate}";
898
- }
899
-
900
- $sql = false;
901
-
902
- if ( $wpdb->get_var( 'SHOW TABLES LIKE \'' . $log_table_name . '\'') != $log_table_name ) {
903
- $sql = "CREATE TABLE $log_table_name (
904
- zerospam_id mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
905
- type int(1) unsigned NOT NULL,
906
- ip varchar(15) NOT NULL,
907
- date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
908
- page varchar(255) DEFAULT NULL,
909
- PRIMARY KEY (zerospam_id),
910
- KEY type (type)
911
- ) $charset_collate;";
912
- }
913
-
914
- if ( $wpdb->get_var( 'SHOW TABLES LIKE \'' . $ip_table_name . '\'' ) != $ip_table_name ) {
915
- $sql .= "CREATE TABLE $ip_table_name (
916
- zerospam_ip_id mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
917
- ip varchar(15) NOT NULL,
918
- type enum('permanent','temporary') NOT NULL DEFAULT 'temporary',
919
- start_date datetime DEFAULT NULL,
920
- end_date datetime DEFAULT NULL,
921
- reason varchar(255) DEFAULT NULL,
922
- PRIMARY KEY (zerospam_ip_id),
923
- UNIQUE KEY ip (ip)
924
- ) $charset_collate;";
925
- }
926
-
927
- // 0.1.0 Update
928
- if ( get_option( 'zerospam_db_version' ) == '0.0.1' ) {
929
- if ( $wpdb->get_var( 'SHOW TABLES LIKE \'' . $ip_data_table_name . '\'' ) != $ip_data_table_name ) {
930
- $sql .= "CREATE TABLE $ip_data_table_name (
931
- ip_data_id int(10) unsigned NOT NULL AUTO_INCREMENT,
932
- ip varchar(15) NOT NULL,
933
- country_code varchar(2) DEFAULT NULL,
934
- country_name varchar(255) DEFAULT NULL,
935
- region_code varchar(2) DEFAULT NULL,
936
- region_name varchar(255) DEFAULT NULL,
937
- city varchar(255) DEFAULT NULL,
938
- zipcode varchar(10) DEFAULT NULL,
939
- latitude float DEFAULT NULL,
940
- longitude float DEFAULT NULL,
941
- metro_code int(11) DEFAULT NULL,
942
- area_code int(11) DEFAULT NULL,
943
- PRIMARY KEY (ip_data_id),
944
- UNIQUE KEY ip (ip)
945
- ) $charset_collate;";
946
- }
947
- }
948
-
949
- if ( $sql ) {
950
- require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
951
- dbDelta( $sql );
952
- }
953
-
954
- update_option( 'zerospam_db_version', $this->settings['db_version'] );
955
-
956
- $options = (array) $this->settings['zerospam_general_settings'];
957
- $options['registration_support'] = 1;
958
- $options['comment_support'] = 1;
959
- $options['log_spammers'] = 1;
960
- $options['wp_generator'] = 1;
961
- $options['cf7_support'] = 1;
962
- $options['gf_support'] = 1;
963
- $options['bp_support'] = 1;
964
- $options['ip_location_support'] = 1;
965
-
966
- if ( is_plugin_active_for_network( plugin_basename( ZEROSPAM_PLUGIN ) ) ) {
967
- update_site_option( 'zerospam_general_settings', $options );
968
- } else {
969
- update_option( 'zerospam_general_settings', $options );
970
- }
971
-
972
- }
973
-
974
- /**
975
- * Registers the settings.
976
- *
977
- * Appends the key to the plugin settings tabs array.
978
- *
979
- * @since 1.5.0
980
- * @access private
981
- */
982
- private function _register_settings() {
983
- register_setting( 'zerospam_general_settings', 'zerospam_general_settings' );
984
-
985
- add_settings_section( 'section_general', __( 'General Settings', 'zerospam' ), false, 'zerospam_general_settings' );
986
- add_settings_section( 'section_messages', __( 'Messages', 'zerospam' ), false, 'zerospam_general_settings' );
987
-
988
- add_settings_field( 'wp_generator', __( 'WP Generator Meta Tag', 'zerospam' ), array( &$this, 'field_wp_generator' ), 'zerospam_general_settings', 'section_general' );
989
- add_settings_field( 'log_spammers', __( 'Log Spammers', 'zerospam' ), array( &$this, 'field_log_spammers' ), 'zerospam_general_settings', 'section_general' );
990
-
991
- if ( isset( $this->settings['zerospam_general_settings']['log_spammers'] ) && ( '1' == $this->settings['zerospam_general_settings']['log_spammers'] ) ) {
992
- // IP location API support.
993
- add_settings_field( 'ip_location_support', __( 'IP Location Support', 'zerospam' ), array( &$this, 'field_ip_location_support' ), 'zerospam_general_settings', 'section_general' );
994
-
995
- // Auto IP block support.
996
- add_settings_field( 'auto_block', __( 'Auto IP Block', 'zerospam' ), array( &$this, 'field_auto_block' ), 'zerospam_general_settings', 'section_general' );
997
- }
998
-
999
- add_settings_field( 'blocked_ip_msg', __( 'Blocked IP Message', 'zerospam' ), array( &$this, 'field_blocked_ip_msg' ), 'zerospam_general_settings', 'section_messages' );
1000
-
1001
- add_settings_field( 'comment_support', __( 'Comment Support', 'zerospam' ), array( &$this, 'field_comment_support' ), 'zerospam_general_settings', 'section_general' );
1002
-
1003
- // Comment support.
1004
- if ( isset( $this->settings['zerospam_general_settings']['comment_support'] ) && ( '1' == $this->settings['zerospam_general_settings']['comment_support'] ) ) {
1005
- add_settings_field( 'spammer_msg_comment', __( 'Spam Comment Message', 'zerospam' ), array( &$this, 'field_spammer_msg_comment' ), 'zerospam_general_settings', 'section_messages' );
1006
- }
1007
-
1008
- // Registration support.
1009
- add_settings_field( 'registration_support', __( 'Registration Support', 'zerospam' ), array( &$this, 'field_registration_support' ), 'zerospam_general_settings', 'section_general' );
1010
- if ( isset( $this->settings['zerospam_general_settings']['registration_support'] ) && ( '1' == $this->settings['zerospam_general_settings']['registration_support'] ) ) {
1011
- add_settings_field( 'spammer_msg_registration', __( 'Spam Registration Message', 'zerospam' ), array( &$this, 'field_spammer_msg_registration' ), 'zerospam_general_settings', 'section_messages' );
1012
- }
1013
-
1014
- // Contact Form 7 support.
1015
- if ( $this->settings['plugins']['cf7'] ) {
1016
- add_settings_field( 'cf7_support', __( 'Contact Form 7 Support', 'zerospam' ), array( &$this, 'field_cf7_support' ), 'zerospam_general_settings', 'section_general' );
1017
-
1018
- if ( isset( $this->settings['zerospam_general_settings']['cf7_support'] ) && ( '1' == $this->settings['zerospam_general_settings']['cf7_support'] ) ) {
1019
- add_settings_field( 'spammer_msg_contact_form_7', __( 'Contact Form 7 Spam Message', 'zerospam' ), array( &$this, 'field_spammer_msg_contact_form_7' ), 'zerospam_general_settings', 'section_messages' );
1020
- }
1021
- }
1022
-
1023
- // Gravity Forms support.
1024
- if ( $this->settings['plugins']['gf'] ) {
1025
- add_settings_field( 'gf_support', __( 'Gravity Forms Support', 'zerospam' ), array( &$this, 'field_gf_support' ), 'zerospam_general_settings', 'section_general' );
1026
- }
1027
-
1028
- // BuddyPress support.
1029
- if ( $this->settings['plugins']['bp'] ) {
1030
- add_settings_field( 'bp_support', __( 'BuddyPress Support', 'zerospam' ), array( &$this, 'field_bp_support' ), 'zerospam_general_settings', 'section_general' );
1031
-
1032
- if ( isset( $this->settings['zerospam_general_settings']['bp_support'] ) && ( '1' == $this->settings['zerospam_general_settings']['bp_support'] ) ) {
1033
- add_settings_field( 'spammer_msg_bp', __( 'BuddyPress Spam Message', 'zerospam' ), array( &$this, 'field_spammer_msg_bp' ), 'zerospam_general_settings', 'section_messages' );
1034
- }
1035
- }
1036
- }
1037
-
1038
- /**
1039
- * Checks if the current IP is blocked.
1040
- *
1041
- * @since 1.5.0
1042
- * @access private
1043
- */
1044
- private function _ip_check() {
1045
- if ( $this->_is_blocked( $this->_get_ip(), false ) ) {
1046
- do_action( 'zero_spam_ip_blocked' );
1047
- die( __( $this->settings['zerospam_general_settings']['blocked_ip_msg'], 'zerospam' ) );
1048
- }
1049
- }
1050
-
1051
- /**
1052
- * Logs spam.
1053
- *
1054
- * @since 1.5.0
1055
- * @access private
1056
- *
1057
- * @param string (registration|comment) Type of spam
1058
- */
1059
- private function _log_spam( $type ) {
1060
- global $wpdb;
1061
-
1062
- $table_name = $wpdb->prefix . 'zerospam_log';
1063
- $ip = $this->_get_ip();
1064
-
1065
- switch( $type ) {
1066
- case 'registration':
1067
- $type = 1;
1068
- break;
1069
- case 'comment':
1070
- $type = 2;
1071
- break;
1072
- case 'cf7':
1073
- $type = 3;
1074
- break;
1075
- case 'gf':
1076
- $type = 4;
1077
- break;
1078
- case 'buddypress-registration':
1079
- $type = 5;
1080
- break;
1081
- }
1082
-
1083
- $wpdb->insert( $table_name, array(
1084
- 'type' => $type,
1085
- 'ip' => $ip,
1086
- 'page' => $this->_get_url(),
1087
- ),
1088
- array(
1089
- '%s',
1090
- '%s',
1091
- '%s',
1092
- )
1093
- );
1094
-
1095
- // Check auto block ip.
1096
- if ( isset( $this->settings['zerospam_general_settings']['auto_block'] ) && ( '1' == $this->settings['zerospam_general_settings']['auto_block'] ) ) {
1097
- $this->_block_ip( array(
1098
- 'ip' => $ip,
1099
- 'type' => 'permanent',
1100
- 'reason' => __( 'Auto block triggered on ', 'zerospam' ) . date( 'r' ) . '.'
1101
- ));
1102
- }
1103
- }
1104
-
1105
- /**
1106
- * Blocks an IP address.
1107
- *
1108
- * Adds an IP to the blocked list so the user can't access the site.
1109
- *
1110
- * @since 1.5.0
1111
- * @access private
1112
- *
1113
- * @param array $args Array of arguments.
1114
- */
1115
- private function _block_ip( $args ) {
1116
- global $wpdb;
1117
-
1118
- $table_name = $wpdb->prefix . 'zerospam_blocked_ips';
1119
- $ip = isset( $args['ip'] ) ? $args['ip'] : false;
1120
- $type = isset( $args['type'] ) ? $args['type'] : 'temporary';
1121
-
1122
- if ( $ip ) {
1123
- // Check is IP has already been blocked.
1124
- if ( $this->_is_blocked( $ip, false ) ) {
1125
-
1126
- // Update existing record.
1127
- $wpdb->update(
1128
- $table_name,
1129
- array(
1130
- 'type' => $type,
1131
- 'start_date' => isset( $args['start_date'] ) ? $args['start_date'] : null,
1132
- 'end_date' => isset( $args['end_date'] ) ? $args['end_date'] : null,
1133
- 'reason' => $args['reason'],
1134
- ),
1135
- array( 'ip' => $ip ),
1136
- array(
1137
- '%s',
1138
- '%s',
1139
- '%s',
1140
- '%s',
1141
- ),
1142
- array( '%s' )
1143
- );
1144
- } else {
1145
-
1146
- // Insert new record.
1147
- $insert = array(
1148
- 'ip' => $ip,
1149
- 'type' => $type,
1150
- );
1151
-
1152
- if ( 'temporary' == $type ) {
1153
- $insert['start_date'] = $args['start_date'];
1154
- $insert['end_date'] = $args['end_date'];
1155
- }
1156
-
1157
- if ( isset( $args['reason'] ) && $args['reason'] ) {
1158
- $insert['reason'] = $args['reason'];
1159
- }
1160
-
1161
- $wpdb->insert(
1162
- $table_name,
1163
- $insert,
1164
- array(
1165
- '%s',
1166
- '%s',
1167
- '%s',
1168
- '%s',
1169
- '%s',
1170
- )
1171
- );
1172
- }
1173
- }
1174
- }
1175
-
1176
- /**
1177
- * Returns the current URL.
1178
- *
1179
- * @since 1.5.0
1180
- * @access private
1181
- *
1182
- * @return string The current URL the user is on.
1183
- */
1184
- private function _get_url() {
1185
- $pageURL = 'http';
1186
-
1187
- if ( isset( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on") {
1188
- $pageURL .= "s";
1189
- }
1190
-
1191
- $pageURL .= "://";
1192
-
1193
- if ( '80' != $_SERVER["SERVER_PORT"] ) {
1194
- $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
1195
- } else {
1196
- $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
1197
- }
1198
-
1199
- return $pageURL;
1200
- }
1201
-
1202
- /**
1203
- * Returns a user's IP address
1204
- *
1205
- * @since 1.5.0
1206
- * @access private
1207
- *
1208
- * @return string The current user's IP address.
1209
- */
1210
- private function _get_ip() {
1211
- $ipaddress = '';
1212
- if ( getenv('HTTP_CLIENT_IP') ) {
1213
- $ipaddress = getenv('HTTP_CLIENT_IP');
1214
- } else if ( getenv('HTTP_X_FORWARDED_FOR') ) {
1215
- $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
1216
- } else if ( getenv('HTTP_X_FORWARDED') ) {
1217
- $ipaddress = getenv('HTTP_X_FORWARDED');
1218
- } else if ( getenv('HTTP_FORWARDED_FOR') ) {
1219
- $ipaddress = getenv('HTTP_FORWARDED_FOR');
1220
- } else if ( getenv('HTTP_FORWARDED') ) {