From 63f22efd134468057eb20b0f2f8741c9ac9dfd8f Mon Sep 17 00:00:00 2001 From: DaAwesomeP Date: Fri, 27 Feb 2015 16:24:08 -0600 Subject: [PATCH] Add test for icons and fix icons --- .gitignore | 6 +++ .travis.yml | 1 + bin/package.json | 9 ++++ bin/wappalyzer-validate | 4 ++ bin/wappalyzer-validate-icons.js | 68 +++++++++++++++++++++++++ docker/Dockerfile | 4 +- src/apps.json | 2 +- src/icons/Alloy.png | Bin 267 -> 0 bytes src/icons/BlueKai.png | Bin 1385 -> 0 bytes src/icons/DAV.png | Bin 1379 -> 0 bytes src/icons/Dart.png | Bin 703 -> 0 bytes src/icons/Ecodoo.png | Bin 156 -> 0 bytes src/icons/Google Friend Connect.png | Bin 1274 -> 0 bytes src/icons/HERE.png | Bin 0 -> 461 bytes src/icons/Koken.png | Bin 0 -> 299 bytes src/icons/Lucene.png | Bin 0 -> 1585 bytes src/icons/Mono.png | Bin 647 -> 302 bytes src/icons/Nokia Maps.png | Bin 515 -> 0 bytes src/icons/PostgreSQL.png | Bin 0 -> 1021 bytes src/icons/ReallyCMS.png | Bin 781 -> 0 bytes src/icons/SiteDNK.png | Bin 1379 -> 0 bytes src/icons/Skimlinks.png | Bin 635 -> 0 bytes src/icons/Solr.png | Bin 0 -> 951 bytes src/icons/TYPOlight.png | Bin 702 -> 0 bytes src/icons/Timeline.png | Bin 1379 -> 0 bytes src/icons/Webs.png | Bin 0 -> 412 bytes src/icons/WordPress.com.png | Bin 2153 -> 0 bytes src/icons/XiTi.png | Bin 621 -> 0 bytes src/icons/{io4-CMS.png => io4 CMS.png} | Bin 29 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 bin/package.json create mode 100644 bin/wappalyzer-validate-icons.js delete mode 100755 src/icons/Alloy.png delete mode 100644 src/icons/BlueKai.png delete mode 100644 src/icons/DAV.png delete mode 100644 src/icons/Dart.png delete mode 100755 src/icons/Ecodoo.png delete mode 100644 src/icons/Google Friend Connect.png create mode 100644 src/icons/HERE.png create mode 100644 src/icons/Koken.png create mode 100644 src/icons/Lucene.png delete mode 100644 src/icons/Nokia Maps.png create mode 100644 src/icons/PostgreSQL.png delete mode 100644 src/icons/ReallyCMS.png delete mode 100644 src/icons/SiteDNK.png delete mode 100644 src/icons/Skimlinks.png create mode 100644 src/icons/Solr.png delete mode 100644 src/icons/TYPOlight.png delete mode 100644 src/icons/Timeline.png create mode 100644 src/icons/Webs.png delete mode 100644 src/icons/WordPress.com.png delete mode 100755 src/icons/XiTi.png rename src/icons/{io4-CMS.png => io4 CMS.png} (100%) diff --git a/.gitignore b/.gitignore index a5a316f22..2f0d797d8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,14 @@ npm-debug.log node_modules/* +bin/node_modules/ + +bin/npm/npm-debug.log + drivers/npm/node_modules/ drivers/npm/npm-debug.log !.gitkeep + +Thumbs.db diff --git a/.travis.yml b/.travis.yml index 717f35318..4e740fe58 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ install: - sudo apt-get install -y curl zip sudo -y --force-yes - sudo apt-get clean - npm install jsonlint -g + - ln -s bin/package.json package.json && npm install - mkdir mozilla && curl -L https://ftp.mozilla.org/pub/mozilla.org/labs/jetpack/jetpack-sdk-latest.tar.gz | tar xvzC mozilla && ln -s $WAPPALYZER_ROOT/mozilla/addon-sdk-*/bin/cfx bin/cfx - mkdir phantomjs && curl -L https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2 | tar xvjC phantomjs && ln -s $WAPPALYZER_ROOT/phantomjs/phantomjs-*-linux-x86_64/bin/phantomjs bin/phantomjs script: wappalyzer build diff --git a/bin/package.json b/bin/package.json new file mode 100644 index 000000000..052b3ccf1 --- /dev/null +++ b/bin/package.json @@ -0,0 +1,9 @@ +{ + "devDependencies": { + "async": "0.9.*", + "file-type": "2.2.*", + "fs-extra": "0.16.*", + "glob": "4.4.*", + "read-chunk": "1.0.*" + } +} diff --git a/bin/wappalyzer-validate b/bin/wappalyzer-validate index cb91bc240..deadd724b 100755 --- a/bin/wappalyzer-validate +++ b/bin/wappalyzer-validate @@ -28,3 +28,7 @@ path="$path/src" echo "Validating apps.json..." jsonlint --quiet -V $WAPPALYZER_ROOT/schema.json $path/apps.json + +echo "Validating icons..." + +node $WAPPALYZER_ROOT/bin/wappalyzer-validate-icons.js $path/apps.json $path/icons \ No newline at end of file diff --git a/bin/wappalyzer-validate-icons.js b/bin/wappalyzer-validate-icons.js new file mode 100644 index 000000000..9e984d96a --- /dev/null +++ b/bin/wappalyzer-validate-icons.js @@ -0,0 +1,68 @@ +var readChunk = require('read-chunk'); +var fileType = require('file-type'); +var path = require('path'); +var fs = require('fs-extra'); +var async = require('async'); +var glob = require('glob'); + +var appsJSON = require(process.argv[2]); +var iconsDir = process.argv[3]; + +var appsIconPaths = []; + +function arrayDiff(a1, a2) { + var o1={}, o2={}, diff=[], i, len, k; + for (i=0, len=a1.length; i 1 && arr.length) { + what = a[--L]; + while ((ax= arr.indexOf(what)) !== -1) { + arr.splice(ax, 1); + } + } + return arr; +} + +async.each(Object.keys(appsJSON.apps), function (app, callback) { + glob(iconsDir + "/" + app + ".+(png|gif|jpg|jpeg|ico|icon|icns|tiff|tif|svg|bmp|psd|pspimage|thm|yuv|ai|drw|eps|ps)", function (err, files) { + if (err) throw err; + if (files.length < 1) { + var err = new Error("There is no icon for '" + app + "'!"); + throw err; + } else if (files.length > 1) { + var err = new Error("There is more than one icon for '" + app + "'!"); + throw err; + } else { + if (files[0].split('.').pop() !== 'png') { + var err = new Error("The icon at " + files[0] + " does not have a '.png' extension!"); + throw err; + } else { + var buffer = fileType(readChunk.sync(files[0], 0, 262)); + if (buffer.mime !== 'image/png' || buffer.ext !== 'png') { + var err = new Error("The icon at " + files[0] + " has a '.png' extension, but it is not actually a PNG file! It is actually a " + buffer.mime + " which usually has an extension of '" + buffer.ext + "'."); + throw err; + } else { + appsIconPaths.push(path.basename(files[0])); + callback(); + } + } + } + }); +}, function(err) { + if (err) throw err; + fs.readdir(iconsDir, function(err, iconsList) { + if (err) throw err; + iconsList = removeA(iconsList, 'Thumbs.db'); // While Thumbs.db is excluded from git, Windows still adds it and it messes up tests + appsIconPaths.push("default.png"); + if (appsIconPaths.length < iconsList.length) { + var err = new Error("There are " + (iconsList.length - appsIconPaths.length) + " more files in the icons directory (" + iconsDir + ") than there are apps! There are " + appsIconPaths.length + " verified icons (one is the default), but there are " + iconsList.length + " total files." + "\n" + "The extra files are: " + arrayDiff(iconsList, appsIconPaths)); + throw err; + } + }); +}); \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 1067f0e6a..5d60ae6c2 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,7 +11,6 @@ RUN ln -s /usr/bin/nodejs /usr/bin/node RUN npm install jsonlint -g - # Add user RUN useradd -ms /bin/bash wappalyzer && echo "wappalyzer:wappalyzer" | chpasswd RUN echo 'wappalyzer ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers @@ -28,6 +27,9 @@ RUN cat .profile >> /tmp/profile && mv /tmp/profile .profile RUN echo "cd \$WAPPALYZER_ROOT" >> .bashrc RUN echo "wappalyzer" >> .bashrc +RUN su wappalyzer -c "\ + ln -s bin/package.json package.json && \ + npm install" # Mozilla Add-on SDK RUN su wappalyzer -c "\ diff --git a/src/apps.json b/src/apps.json index fd7df8d88..bbc9e1c09 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5638,7 +5638,7 @@ 23 ], "headers": { - "Via": "Varnish", + "Via": ".*Varnish", "X-Varnish": "", "X-Varnish-Action": "", "X-Varnish-Age": "", diff --git a/src/icons/Alloy.png b/src/icons/Alloy.png deleted file mode 100755 index 56a9952fde0f0dc05c6c570ecc7b167a94b56750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmV+m0rdWfP)Z~ z&xju~3=Rb|Lg$C~aL(%f&p1hYZh9s2)XaIi=ggi}Ip4R#a7Hyl4r|xRzOzlj-IxC} zwmA0AZLseKG7e$r=6%;y_&n<~9oA{qG&$N7JS#@C{ z(2AI?DYc2=v4`UyN6w618+Sc=ef-PF?%1O#iLtS9jX(tfrh&`>tfAI9#fAMPozWBh zJN>KuSNqrcy88zE`NDnC#@uGz=HBKQZ|iIAYwF|dYwGLlYw4ptXhIS{1OUqW^^|%h RBw_#n002ovPDHLkV1mzMfzki~ diff --git a/src/icons/BlueKai.png b/src/icons/BlueKai.png deleted file mode 100644 index b2861d007cfe1694b4ce642547fc1807bae869d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1385 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 diff --git a/src/icons/Dart.png b/src/icons/Dart.png deleted file mode 100644 index 35c6ccd1a5a07ab4fd4c0ffd2de386e1666e63e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy{{wtNT!FO5!QBkYA9^3&!?0x) zgw0U4Ph!V<$!SM`;y}c^`YywY*FZsrcSN7q?RH=f$h7|LAoAccu5D`=CT|HlvY(-74@k>~7Yv(M0JZoY+QX2uouTPC z!~SI;>sCKuDBZ`fa|Od@plQn)W^ZCxbkAhpHl)f68A9dUCuD!BE!_xS_juKbnIZ5 zevM(u7KZGD4C#j%YBw-+?a*OrdJhZ&#gZVuV1|>)0?S{-ED~c~v)G>NRCDA4_vTo? zi;bEa?rvRwu5{D%pL;F~FfcIsdAc};RK!ia@U-lZgFwSY-LOkenxWHscR$iA-Tu9P zn%?A1ljkr!|MI&wT`ls{{jTE|-)U{g-Bfh?c(K})Xv4mwix%4+Sbw{d@<_fw_4NB0 ze`+H9n*UaP&ztaK;o|T~4nKD6d|SsR<^Q(&AKSre>t8RLEwtGDuJgvlvDf7fPuU=Q z_p#FjiGsxeJ{+OhKjv-!SxnN80&Vg$pko zo-wq(EpX^NcgyXp2ltPDONE;ccc?Zx8dksMnHfG;D{Qms)dLMX-v74CQ*fFW<=kp^ zTg_NupOyO5pqU>wReH^oY%=VL`VsW#vc>_QB7!3@bu6{1-oD!My0K=;s|Egu#jjH5*!8)Ng`xu#E?vhL4;(95($bEfl zO$aiFV~T1diZD@-&$R-qY>rI=+q#Vsy22P8W$mOL?Y-~cD`92j23!kI^2;T;%f0`5 z?)@OQ+fAzX+S}VZ91aJX&$eR4kEbxLxE5I}58b*h*m?qoPn|{NepG8K9C>+gj2ow0 zTSQh?pfxM2vBP4SNs+p6;le_v(}|v*9(471F}3^*jGxtOj9lJ;udFWk{r)?yU4wtp zB>2+Obh|Fg=rNmdJ~NZITP$C+?eSLihg+lmrj~gt%>7J68HN)E3kD(=w9fLxo zTbMBnBqzgbG{QM%OcQxL9)!bT0KiiP>Oe~y?rTEnIow_0oE(IR5RZTw;JY)B&FVO^SCzL)?^mPwe+#EIe-4PbsUg-iyfs{>bjLAtwy!4UW0VrYO!<%}Px zD?spOD0XztiF-T={f3wT?_`f6;>rVM7*k@#SL*AD4-AlCj3UlY9!oX(Q|QOSmv8xf z>1660#kvOX4@Hp;MFfVhLxJP3un6eqR$_6?nU;_=fSF3TvET0 zTua|I*=S3xD<(jsj-0!K^bdA{&Hq{B%fB4a=d9gUjQDN@*mf2-X}biuQub5kng;A| z^=Wpu?!F*a?rg^NwTCfb^?tlrZo{e0-st`6_G+Y7r-D_ngh*9tfUng68LR3bebRt} zKQF1fVHkR9ZPQw?ZS0{)+tdIRvR@k9T#664=$XPsdZV(9R_%3B<;kn`Q)91Yz1zBN zR9Ig~39Y%|WGp)ZX|WY-u}x#*#zxK8uWwopR>2;cR3Sm$66pX2*SB`dH9gKW9hf_I zE}2qHkE{c?e?e$ij>|qxfJ|d1?R$M6nI3xtArK8PJeS8$$2+{55ZO;>lRei?mNd&F z=m72cjSo-*AfP&fr-Ge6~iK~jqw`+RDtibN6wouKKK)7Zy^it~bqm!@XLFxCuLz0=T&@)`2y~^NgiMnNjxA*w_`TP90#odRW z$5nT*d6dB{R-N+o`4~l%7e$jKPnp%-?DY2fb&>+>K?moHeJ z(%b4+L1(AV*yxz7&n8itc9Fn=n#4V0rR?zb@ACMRsm(lNq@c6YTz#~w zyx9Bv{hzYaOmD2s*XX*)-)M%p#nI%AqslT`pp&eJrvLx|%Sl8*RCr$P&{b~6P!NMr zJB&XwmYJFNzpN@FUnQx!f~x238~JJQ$Nb9=wspLO*~J(wcL{qBim#ZJ=p40RLXxG0 ze?!B>hcjH#i~!6NI^8v-pnL)$Yfq&HUZ3(ji`jIkMH*2y$85QUoUtL>J2|D?r&r3lFX~vo zle;;Z@*T>``f#z2w(){8uuk#Q{FRd7cV0n>W;%TXHl_z7kn-!vThA^6^j>P{2 xv||HWvakGt#OD+c5a32uz|F(JC_%3*3jmZkYL1~SQz!rc002ovPDHLkV1f-KgBAb) literal 0 HcmV?d00001 diff --git a/src/icons/Lucene.png b/src/icons/Lucene.png new file mode 100644 index 0000000000000000000000000000000000000000..0bce5f5d84da594b92f0ac8a4b35d9c52c43ad66 GIT binary patch literal 1585 zcmV-12G043P)-w1b&H&ZkCKg#qKJ{Cijt^{m#dJPu#%sno};^)rMaE3$)~fk zva`*pwa%+nUsAu@wZ!4NVsKu}>A}wI#NFK8gw_F^7Qod`}_N5bzxg+R+OHQ zrnjK1#G|^@vG(=$`S|(${QZ7~dw-F5f0KEDihO{Ne1njEg@=WOjf01ZhKr1gi;s$4 zY*~$@yFED)z$RM*45YB+S_z|aNytI;o;%t=H}_?=vZP@?d}b$y6MPX-Nyx6jpl$C;pf0d+YIb^b(eA~v!L7%|#?#i) zf|h*M*wllIe{yni*V)$B_RNHbf@^zbptYEYnS-LYnkg(OV`pK8lz@qhh;n*wS6Wr5 zwxo%bg=K7FWpQCPIW|jFN4~?nW@%)2wYjujXjz=8mt1RDl%|cb$ElB- zj6+32S!PtT$g7Z-j**d&EHEo%WMqkuhf`Nl*xc6H*V)6t!+nB#OkGD#UrB9uX``W| zPft&ysiBORhi`9h%goBT&az5MN`{+%Z+C6G!MTWth`q+Stl#uW00001bW%=J06^y0 zW&i*J-$_J4RCr#6(PMCP3lMU_nz)C zUpYKYB<5D_#Cn#^0uk4#HPhi;iA3VyDvpSVfWytxuO%R&_%lG%aI{=m8Adp;%Erd@ zuO}{<^a=0GZfX^A-zN18P?Zh*QzPWnkHoErCD^u<2JP6f%@@0q9gue((t+}m9|nFk zK3?+T@3=Lg$BwOg>}=&oW~QUBiej6fpMH&bY|6uBG#*%u#-h-N`USO%T`_R}zWex~_ zyPgM&jO?(utZPv=8Dx-9=jQ;#Upy5Z8yg*^D>~I%&PjMLs%{>LJR13$8g=pQn#dI) zR{g?xU=Tq}tLTN5K*j(+&MbHNDu^xoz}aiHk4IYR@W^6_P3a94$ZOa^2X4^ahv1v4S@&B5&$_& z@@VV$)Nq67RjCV0 jtj(3hV!7Th`QQEnjBV|=0lB(x00000NkvXXu0mjf*y~X_ literal 0 HcmV?d00001 diff --git a/src/icons/Mono.png b/src/icons/Mono.png index f2340acc8e5d11bfb915b32953e6df21a5575bf0..dd9578a86de5280ad08506873b1027d8bf0b8571 100644 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy9sxcfuK)l42Qn!KO^u$1fu@L; z1o;Isa`FmG%B$Pj`v!+b*S9X;y8ZI?$8X;U)jkjgDyj2yaSW-5TYKRq-ys7Y){B}V zQQwv}{QvJiQJ{B6ri^_{WpRm0G~+R^=mW0`e<{zHq0M0Tb%_MRc`6B7Q!pIxW^5xiE zSk}Ur8}&xL+v}0+cINqum+isAwmHVwaU3sfxxx?v9~3*aI8JIK91Ux8gZ2N+sy{m? zwT8Jsumv~-69Fv3v24DdPu(x&FO`5On8ll!etC9MZ3-&+;v}297c<5y-&@V@7&a>a zoC+$-*;I6HT87DBYYR@8#gg&h<448()eT5tI$wl?s-N@Bu-d&zt1}r-&45PX0-G@c z^xIp}TxK1uoB<~P1A;aap~_inG&UrJTnB_BAuqz!cc~pA;n~k@8wztR7iYdu;pQd5 zME{BQSD)hBkG8pB>#?A!P)a1>aluuHd({CFW{YNb01|{^or})2OP*$Ps|^0K%=vuZzL!cgM}{ zwAG!Sp0#u7=$%3q5*} h{lg2?1=T+F=TA@0mW~3>b zP}w{N>)taA-Y0ndk>r4u?hz=9>Y>pOqGM>45WzZIeD)Zx?ev8)y%+p4ivy50?M&gHA*$WQf)t|OP=o1|L;$Lp^xVF9Z5L^? za_mPhLSv~+I${xEi|s%)pC@R01D_40`EHX#=#^>OEe0fZn~u)y4?{n&h!Qmq!{{>9 zZT-kAX+XPiGC9C~^{G935JXwSu%KPlIw{-}x@>e~lLEGHqnJNt+U#qbSVgtg0@I8K z+TL*#*XYn^wtoZIgUI~HW6I{}NivHpqWxx2SR#?6egGRXx*N2PsK@{S002ovPDHLk FV1n@A@ZkUe diff --git a/src/icons/PostgreSQL.png b/src/icons/PostgreSQL.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed911796beb87919797ff75fbe3c9db4f069a73 GIT binary patch literal 1021 zcmVL5tKID6^ZDrY z`Rn%j{QmwVqRRk&y4vve0F=Z4l*Is*$N-kb0GG-DiM{}OwFZp729UxFlE4j@#T1pq z7M#ccg1kGc&_b`$O0?Hzz1ecY+j+#@e8}L2%;S&G<(1Or0CTRh-t55T@yF-!%j)ye z?ey92_W+N>-|_bVcCi4GzW|58?)dxg`26zu`}X_%0BfrNl*a&=%3HhHX~EsR;_o)7 z%msU|%l+NSE=<)!V$ez~c2#3F;)#wV3z7Cnj{txts0007vNklAbX>iTKvNAa|HXgmG#vmnw9ppx?2ac)bszTJ1Ma-lMH zCyy_uzb0Q*nNkkq)bv^a0L&j}*8m7WxUcok=E75}rAr(j(5TcYLXzy{1{5QN#CmC( zkY!*Mbj*NsX2(QCk(%u@M_Gv0%RZfgqB%eeh{?&5gwPQ9)^%A%EKKEj=Tg^;CKz(? z?3__H9ax^DYmZKu&^^UYM-|Mfz(FK2j!A4POdZE{b1KGa&UM|kT=(T<%m7ubggC@l zx9*cOUlR;5xHTJ>CWzZI;(!bqYj%wc`U;HRccYjn)z1g3&-0bfi#I?ob`*@UVyOfj z+cAVi&!m2FJMZSzEs*|LQKCt4TOArPTg3z`zEz^}b9`(N!okq%ctm2vZ3WAPc9akz zdz^HwQBuejkj$r=q7ko^j{++XHA1l0>@>S7-hnTX^Rb8s^vts9aa3YJi^OJbdH^Zj zZeW)$pe84$jj3B0v3r5Yu|2Dln z&310wm^QO1H_t#&`84x&57UtNIbgzoHQ&RLeQ0$YzJX+#M@hqL5RGpLu!21pfe>F^ zMZaCZP>>jQGC~&o4+p$ZAQTD^LNeVI3WdP)O>Pz3aXghVX?3Zh>Nlt4vR6uphg zQmeIhBC4tDtI{mhRrgVu-qwBGx$`x5w=J~}oMC1-=X(s_04Z=A1Lr(-v^nP46de}1 z+W*xl*p&7^NSJM|139d`!HvspO}NlHgz}alTy1U2xYFoew(C&NRP9tGBJz`Wj-oak zvp?`r?#qDO*7%jS)Q4!{;}MC9LCSnH8C!l@X{LDoMB~@G-KZI(t*-{mma$1gk`#)P z6o14GQQR3aaN~o?o{rJR+AjCBN_g>k7b^X9u*oNg5-zf6!IVi_DCzntaqXj+Rqdzk zXD+*v<~1Aas2pit`DB1}LzpR3TrK{nNCXnU0|cW6Evo7_ajTE=>H^K{HgC2=+kGq_ zRY9ZJ8%SnU)D4q%)CXzFy&)?9tS9bMK{mY^CS32K1uwoC>yI4I=Q0{`0;H|VNRz3i z%D?=?gZ?P|VTtE~$iMH+A;*QOHH?foIpc6xcMacTl#*1BP9n}E_AH-=Q_ig9Trfbj zgx2x6bs&R)h`}71Y05A(hO$o+tYt#NVdLa}VljU=1Juzm5|ggGn-r7CN>#&IGi3)z_(q%bA3wBd+1*75drvbLf!7ixxxRlFCd z=#lq_lP_QC)2ZN{pHe984yie47uwT7!u~SXv`NJEHaCA3B;4#UbDs@}Kvb9!Q&M3^ zh?r#fFVP}w5c=}}K!;geo ze*~phi)Q|X>6Pp}>|}S_&*I*P9^CBIal1=r*8Ya~EZb4woSFF-(UQ!EDTviO diff --git a/src/icons/SiteDNK.png b/src/icons/SiteDNK.png deleted file mode 100644 index 2e51915b09c435ad7f8b5676cedd7ee0bfb4c2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1379 zcmV-p1)TbcP)ftrN>fzNr`sKPe^w{RL%pAzHNl)Cjp2pB#wDlyKmf~_w`N>9}#fY(4hJ z{}!O%Y}!P+_B4|BkeUk$iGTtD$QTq5{|pdn-4H&YbNNAe;Ojr9EkIA+b-%X8_ee@l zKM6q;&?__jJh z$*T*%)@%te5#l1ja%2-z{eZ-S47Lu+u5)9eCwA)tlhDNmwueG7jTcK}~TmvJ3=Y5g-XfC-nu$ zwDm=Tm0QqNcfjuNymRSHXLaKkd_zW_ts5NaT}1-^P81g|+z zKIbOPy&k>!VVJ)H>Hi6aFM`(Wna-^h(i}0hb_g(-VYClcY(!V@MEZV$p6@{;-XEcm z1h>3EL7T9m3tip?*G7@Q&OqN;AOaPTOOPZmiD>&5&LEc(%!^Q)RV>y7tz3jl0IkZ3nC;;Agf_5_@C$}e zR7T1g0!W5Xm5wGu!Y`%SRS`MSD0>-$2@kOZ0krL^Ce$g605W2-Kyj!P5qP*Wex8-e zfms|1aS7i-70@d#07jgdHWBtF68yV@lWPeFNHF0>o^fQs@_)Mk4Pz*d>?&|Or{2X5 zPYLc;2<>ip6KWg)_jGv5*&?_G0it!TxG-hvXEkDpkVCsTzt+jaxC2s0#hVeP)-;IQ z>dcVae;q>+tK!M*w%4iXN` z0jd0OrG2!#Or=?k+yeijqN;-~Ah(7Jq1SRs-2iW_Sn{ab>eFIDLCeWOA(usRH3U$V zbQ}_GI;)CXnA|52w^`j{R3M7wZ9ij7M(Sg0y=Xscf4IYYukr1D+yfI<=@WHEBf zVb%-wT!LK4-6`Y9O4Dyb01l9AkCXK(IYY`AOoW2AO+>9`j%3f7GcMYT?=K@tiZ1|X zivY)`z#Llnb+;;;dWD>EE6oKFzx4>-7paJLXmO*dZ;!n)TmkQ52u#Jx42~|Mk&l)c zFX3*O0K`N@2==R&fTTF=`(!>$Z(a<%=$5zuhocT`*9qNB){9`Zv(;>OyR(!~3?{mf z&M?xv9e4y7#_;a~9H)R=w83*^O{iIkdW}PePYje&wRAv7(@tO`@H2*)3vj$&KQhrl zi}y;6DWU4*3Z&ek!Lz_p;0V(|#q^PY=bOX&R&4=?K)X=!32E>SHTE$>1ZIv)z-Ag@ lJ1KY5l25415-{=^;vX0vvI@AHok9Qr002ovPDHLkV1jBocr^e3 diff --git a/src/icons/Skimlinks.png b/src/icons/Skimlinks.png deleted file mode 100644 index e5dea4cfb53bf3d0f7c2cecd5b21581f76753c24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmV->0)+jEP)_Dsp#BWG+L^-R8KF7Civ&lofix5nP!xn_ zK?oK#+-Pd<5$OO=km4gmD0~mZXMuP+5KjW)n`rXkXbvbM(g710pxKGiJiY;bpWW~@r7CvjwHSc$#P~Oeo3sEq&VOs5OblG4Jc^M#(QyqmvW|u+X5Ay2t>np@=IqP#tg_OICdfN?0W1tYsjB`iWFr zjOGA)H2GvS`Dh}dBnG6=mDsF@rINaYrsf55qZFDWQt+6mL~49)L302LG}zJAx1V^kvZ(4!cd|1@^ps8_0lh;6&WCP+aBsk(H5L+VW3?RD%OX5S%IV+&z zH?g&dgvrQ8AV>EAu^kYbU}==B#S#jC@wExFsMrVv;Rjee=|!kzTtGz!d?vRqkVz#6 zyrrZ=A_T;rD0IMaO1ot&&@B3s49gz^u`D%v$u>aT3ay6!V6pHAw0Q?=V;T}`E&y$% VE~wsXnXmu=002ovPDHLkV1oV{2CV=9 diff --git a/src/icons/Solr.png b/src/icons/Solr.png new file mode 100644 index 0000000000000000000000000000000000000000..0df60b89b20d2b7691a5cc8cf957470890769587 GIT binary patch literal 951 zcmV;o14#UdP)#T# z`25f?6xcW%*gz!MKq%Na7}z)<&@d3#NG#Y`K;URl;CN{G*x2~!==kvP`1ttPKp^nY z%=qZ!;CN)%NHFM#c<6|H=#YHqkbvlzi0GJ%=%AGFu%z&~u<*dR@W{aM(8$mz4EWg4 z*ibb1;N1A&;NWmv*ibmwP(1kX^!WJn&@dR_U`+Vn*yymN@Ti>du&Cg0VDP}a&?pG- z$i&!KJm7$E=!kUq*wolC5a_6!*jPm1U`XhYg!t&}`0(u5NHpl6kl<)k=%AS3a9H3- zEb!3K=%|?JsG#6@VDPZ4;7~Z&NGRAa81Tr*@W8a-U{K&dB>2d@_|VAUNHE|~G|(sn z;6NzgSUlipSm>~z;8;NLn26|bT-6a>)eD;h>4Geek}X_*=S{~y+4Cr;u`KdMiuOVTild$Vb+HtMmk}B>~xT48W7FxZC zJPi_9kz7B;X?y|g;}1=i)U!ja@C)Su9ivFh^!+Xq0Tsqt2_A=)wDu1)IhBzoDq)F) zl2>@CZhQ4Rt#ya+yQ+na)e~TkF;+rduu0FTu^4H|XFkr3fG@S`c#H8BG?Oy!C7H$k zJ6p@M2x$vAO2o*hBI?Awl*1BQ2`RMR=PDMmI7p5V){eH|?ULZc+7FTSle}hc8!db11xp*_$7g*VU}V9Tx*S71XNzr z?L$%z0N~rkr3Y*!q~!eWqaOC9OCNAEoZ?O~NwstL@eM$~AXbTJz(i+nIbEpW5rDVQ zl^x5@?!3Bi0pI|0z$sN-e`;Ih{IbZ-gXxe{%C)#Vqp^Zd!ECj_dvm Z`~x)yI*9D{brb*q002ovPDHLkV1jbL<^BKw literal 0 HcmV?d00001 diff --git a/src/icons/TYPOlight.png b/src/icons/TYPOlight.png deleted file mode 100644 index fd786f02b13986a7c2dbe45b1973e137db5e88a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmV;v0zv(WP)3XqmoE_R{EiCH-=^;UMg}ra&b)w-Q5E#|7w6cz^a)|>I;MgF&AHcb%@(d~BF-Ts zMmLs71~DXx?rB`vKtxbiwNOipddp-WWhlC*DXJDKpdx7D3AdJs!y&02Lgz``p(&J% ziYg*d-&i6Wq`F2rv$!MEh$Tb?^%Z&h8ez9bh>_IjpvRsn?p!5i2&VApDU^h&2+o(-&KhC+I>{hrK_7b_6+=Z(r)Unu^160&%8-}_9BI<0s^C5;^r!hpCHE}HaU;;6{r9LzJkBMXE6UZDGS+8kf&ZmMFmks z$fS*BLdt|upD_LeGIk6hBPxh*Qrugi{NYp5&KmJxi+uMF3RS59@Fn^73SqEMj)Cka za1*l>n@gY`0LmtfzrLaBT_%->(fXh&MC40Ej#89`?%%Yyw?VAhB$T3kl4|p3vMLWq kH3oSkZaBz>e#^u92ff!1Y`#@c$N&HU07*qoM6N<$f-XKuq5uE@ diff --git a/src/icons/Timeline.png b/src/icons/Timeline.png deleted file mode 100644 index 2e51915b09c435ad7f8b5676cedd7ee0bfb4c2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1379 zcmV-p1)TbcP)ftrN>fzNr`sKPe^w{RL%pAzHNl)Cjp2pB#wDlyKmf~_w`N>9}#fY(4hJ z{}!O%Y}!P+_B4|BkeUk$iGTtD$QTq5{|pdn-4H&YbNNAe;Ojr9EkIA+b-%X8_ee@l zKM6q;&?__jJh z$*T*%)@%te5#l1ja%2-z{eZ-S47Lu+u5)9eCwA)tlhDNmwueG7jTcK}~TmvJ3=Y5g-XfC-nu$ zwDm=Tm0QqNcfjuNymRSHXLaKkd_zW_ts5NaT}1-^P81g|+z zKIbOPy&k>!VVJ)H>Hi6aFM`(Wna-^h(i}0hb_g(-VYClcY(!V@MEZV$p6@{;-XEcm z1h>3EL7T9m3tip?*G7@Q&OqN;AOaPTOOPZmiD>&5&LEc(%!^Q)RV>y7tz3jl0IkZ3nC;;Agf_5_@C$}e zR7T1g0!W5Xm5wGu!Y`%SRS`MSD0>-$2@kOZ0krL^Ce$g605W2-Kyj!P5qP*Wex8-e zfms|1aS7i-70@d#07jgdHWBtF68yV@lWPeFNHF0>o^fQs@_)Mk4Pz*d>?&|Or{2X5 zPYLc;2<>ip6KWg)_jGv5*&?_G0it!TxG-hvXEkDpkVCsTzt+jaxC2s0#hVeP)-;IQ z>dcVae;q>+tK!M*w%4iXN` z0jd0OrG2!#Or=?k+yeijqN;-~Ah(7Jq1SRs-2iW_Sn{ab>eFIDLCeWOA(usRH3U$V zbQ}_GI;)CXnA|52w^`j{R3M7wZ9ij7M(Sg0y=Xscf4IYYukr1D+yfI<=@WHEBf zVb%-wT!LK4-6`Y9O4Dyb01l9AkCXK(IYY`AOoW2AO+>9`j%3f7GcMYT?=K@tiZ1|X zivY)`z#Llnb+;;;dWD>EE6oKFzx4>-7paJLXmO*dZ;!n)TmkQ52u#Jx42~|Mk&l)c zFX3*O0K`N@2==R&fTTF=`(!>$Z(a<%=$5zuhocT`*9qNB){9`Zv(;>OyR(!~3?{mf z&M?xv9e4y7#_;a~9H)R=w83*^O{iIkdW}PePYje&wRAv7(@tO`@H2*)3vj$&KQhrl zi}y;6DWU4*3Z&ek!Lz_p;0V(|#q^PY=bOX&R&4=?K)X=!32E>SHTE$>1ZIv)z-Ag@ lJ1KY5l25415-{=^;vX0vvI@AHok9Qr002ovPDHLkV1jBocr^e3 diff --git a/src/icons/Webs.png b/src/icons/Webs.png new file mode 100644 index 0000000000000000000000000000000000000000..c022e716f22f23111b5dcd2d2ac2b5e6785163a1 GIT binary patch literal 412 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 diff --git a/src/icons/XiTi.png b/src/icons/XiTi.png deleted file mode 100755 index 6e20ea90c761813ae832f9f7ed466f93f10a7841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmV-z0+RiSP)uip{{T;k08orYV1~N9$XRTST5OG5ZjM`Sk6v+*VsepWbCG6tlxujEaDA9`fSPoG zn|6VlcY>XHgr9_rqlS&7gpR3((hyYNA08oVhPlW(cgX-$= z?d|gL@AC8V^jK?*yTsqY%HqSz(L1M{uV!XP`4@pcGt}09BAST7v*m zi~v%K08xooYK)nkv6h~;jhC~LpTv%!$O%z`xVp!;xyE;nxp9iQaf-TMezA^}sgRbd zkCv^JnXLd&ivUrJI$ML4rOcS4!lJ9ksjkASuD`3Ty{)jm08ojqvcRaTy8uv!r>eWA zs=A@2wxF)jp|8@Vu+XTp(W1sk@^$Bk!^-|fA|DB--*yMqe<&@E`{$|X*XQ1FvQTHB1Tb17a<~9A8MFb{sV??o zSz_X6@W{Y)uU0)Dx&a>pA0XK#*%MXnIBWu4qwSjx%ne@g0zEp`Xzk