From d132c01e73b6bce5bafd2c129a51da19fe028195 Mon Sep 17 00:00:00 2001 From: Alvaro Date: Thu, 3 Dec 2020 14:19:24 +0100 Subject: [PATCH 01/15] Limit zoom to 11 (#17) --- components/map/map/component.js | 1 + 1 file changed, 1 insertion(+) diff --git a/components/map/map/component.js b/components/map/map/component.js index d81a13d..3d5f2cf 100644 --- a/components/map/map/component.js +++ b/components/map/map/component.js @@ -162,6 +162,7 @@ const Comp = ( height="100%" mapStyle={mapStyle} asyncRender + maxZoom={11} {...internalViewport} {...(isStatic ? {} From ee7844157de745f6af626ca43c291bb0eb53c1ff Mon Sep 17 00:00:00 2001 From: Tiago Santos Date: Thu, 3 Dec 2020 20:01:46 +0100 Subject: [PATCH 02/15] API only adds caching headers for calls with a zoom level smaller than 5 --- api/tiles/soc-experimental-timeseries.js | 4 +++- api/tiles/soc-stock-future-period.js | 4 +++- api/tiles/soc-stock-historic-period.js | 4 +++- api/tiles/soc-stock-recent-timeseries.js | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/api/tiles/soc-experimental-timeseries.js b/api/tiles/soc-experimental-timeseries.js index be9a8ac..5dd9813 100644 --- a/api/tiles/soc-experimental-timeseries.js +++ b/api/tiles/soc-experimental-timeseries.js @@ -65,7 +65,9 @@ module.exports = ({ params: { type, depth, year, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } return res.send(Buffer.from(serverResponse.data)); }); }); diff --git a/api/tiles/soc-stock-future-period.js b/api/tiles/soc-stock-future-period.js index 13f1664..99468b8 100644 --- a/api/tiles/soc-stock-future-period.js +++ b/api/tiles/soc-stock-future-period.js @@ -55,7 +55,9 @@ module.exports = ({ params: { scenario, year, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } return res.send(Buffer.from(serverResponse.data)); }); }); diff --git a/api/tiles/soc-stock-historic-period.js b/api/tiles/soc-stock-historic-period.js index 546b2a4..3a60407 100644 --- a/api/tiles/soc-stock-historic-period.js +++ b/api/tiles/soc-stock-historic-period.js @@ -69,7 +69,9 @@ module.exports = ({ params: { depth, period, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } return res.send(Buffer.from(serverResponse.data)); }); }); diff --git a/api/tiles/soc-stock-recent-timeseries.js b/api/tiles/soc-stock-recent-timeseries.js index 2d5f6f0..ce85141 100644 --- a/api/tiles/soc-stock-recent-timeseries.js +++ b/api/tiles/soc-stock-recent-timeseries.js @@ -34,7 +34,9 @@ module.exports = ({ params: { year, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } return res.send(Buffer.from(serverResponse.data)); }); }); From 17e380b37fe5c49e1773dbc39e2fc83673046f43 Mon Sep 17 00:00:00 2001 From: Tiago Santos Date: Fri, 4 Dec 2020 09:16:23 +0100 Subject: [PATCH 03/15] Removed the caching for API requests to 'change endpoints' --- api/tiles/soc-experimental-change.js | 1 - api/tiles/soc-stock-future-change.js | 1 - api/tiles/soc-stock-historic-change.js | 1 - api/tiles/soc-stock-recent-change.js | 1 - 4 files changed, 4 deletions(-) diff --git a/api/tiles/soc-experimental-change.js b/api/tiles/soc-experimental-change.js index cffd128..42f3401 100644 --- a/api/tiles/soc-experimental-change.js +++ b/api/tiles/soc-experimental-change.js @@ -74,7 +74,6 @@ module.exports = ({ params: { type, depth, year1, year2, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); return res.send(Buffer.from(serverResponse.data)); }); }); diff --git a/api/tiles/soc-stock-future-change.js b/api/tiles/soc-stock-future-change.js index 5a8d1fe..938dd21 100644 --- a/api/tiles/soc-stock-future-change.js +++ b/api/tiles/soc-stock-future-change.js @@ -75,7 +75,6 @@ module.exports = ({ params: { scenario, year, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); return res.send(Buffer.from(serverResponse.data)); }); }); diff --git a/api/tiles/soc-stock-historic-change.js b/api/tiles/soc-stock-historic-change.js index 721e087..45ce9be 100644 --- a/api/tiles/soc-stock-historic-change.js +++ b/api/tiles/soc-stock-historic-change.js @@ -78,7 +78,6 @@ module.exports = ({ params: { depth, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); return res.send(Buffer.from(serverResponse.data)); }); }); diff --git a/api/tiles/soc-stock-recent-change.js b/api/tiles/soc-stock-recent-change.js index 53cef12..42998a2 100644 --- a/api/tiles/soc-stock-recent-change.js +++ b/api/tiles/soc-stock-recent-change.js @@ -35,7 +35,6 @@ module.exports = ({ params: { year1, year2, x, y, z } }, res) => { }); await serverPromise.then(serverResponse => { res.set('Content-Type', 'image/png'); - res.set('Cache-Control', 'public,max-age=604800'); return res.send(Buffer.from(serverResponse.data)); }); }); From ddabb8ecacc765e704ed11200bfad0ab6f999b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Mon, 7 Dec 2020 13:40:40 +0100 Subject: [PATCH 04/15] Update the favicon --- public/android-icon-144x144.png | Bin 2681 -> 4529 bytes public/android-icon-192x192.png | Bin 4182 -> 5888 bytes public/android-icon-36x36.png | Bin 1497 -> 1502 bytes public/android-icon-48x48.png | Bin 1732 -> 1691 bytes public/android-icon-72x72.png | Bin 2094 -> 2167 bytes public/android-icon-96x96.png | Bin 2962 -> 2989 bytes public/apple-icon-114x114.png | Bin 2083 -> 3535 bytes public/apple-icon-120x120.png | Bin 2189 -> 3651 bytes public/apple-icon-144x144.png | Bin 2731 -> 4529 bytes public/apple-icon-152x152.png | Bin 2964 -> 4874 bytes public/apple-icon-180x180.png | Bin 3840 -> 6007 bytes public/apple-icon-57x57.png | Bin 1070 -> 1884 bytes public/apple-icon-60x60.png | Bin 1107 -> 1933 bytes public/apple-icon-72x72.png | Bin 1314 -> 2167 bytes public/apple-icon-76x76.png | Bin 1352 -> 2224 bytes public/apple-icon-precomposed.png | Bin 4200 -> 6462 bytes public/apple-icon.png | Bin 4200 -> 6462 bytes public/favicon-16x16.png | Bin 385 -> 1061 bytes public/favicon-32x32.png | Bin 682 -> 1417 bytes public/favicon-96x96.png | Bin 1703 -> 2989 bytes public/favicon.ico | Bin 1150 -> 1150 bytes public/ms-icon-144x144.png | Bin 2731 -> 4529 bytes public/ms-icon-150x150.png | Bin 2888 -> 4776 bytes public/ms-icon-310x310.png | Bin 8052 -> 11438 bytes public/ms-icon-70x70.png | Bin 1264 -> 2105 bytes 25 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/android-icon-144x144.png b/public/android-icon-144x144.png index e49ae6f99dff16951e90e690556b519b594fd000..0758a5dbff50bf4bac43bf38e273ba871cbe77cb 100644 GIT binary patch literal 4529 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 literal 2681 zcmV-<3WoKGP)P|sq)@mQ)6%9rQ);-Yc7sJYNpwHgv8Jn_tj0GRDq7|37< zS0e0nAZ7x46OxgvxzM`LuQ6=Cgt$?7E^q>R%9dIVeS8-_2d}C{ty3-=r1P_)oJy`G z>j|D6kY08T1Y$+EJE-2!;F=h)Hz^qmpu;&fT8kKBRR3wM6nkSbW3kxNo`b5?O2g!& zgw#XXK6fdRknBNyixM5CHw^6h&j_0OKW(qh^KgvD&YK0dJ`!pFkECS#$xutyBkjca z5%->S4Y2pda0uLR-8C57%V+|d!UQ&fO-*1^6W9bcHGxe{VE@@S3pBfJC<@0QTV{Mb z5N768bRXSFx|c4e%rH!k88YsXl~I`EslWMrA2a;AbR?YsU{8*uD@jP4>{^l@U`d`P zt_on^e*G2jFkMGg6jfC;g`<1dCF?a~EeBM15vrPrCSJ=V$!UdoLxv*X-onCh0 z5I0$>JS;peC&1o94_<}z=9Z#(rCvU>;=}==dOAa&GjIj47mde5YFk0QTsgZMuPzym zg8-S+3|9aHEwS8DAp{Y!df`m%!Wk4P(y9DmD}cSaJnAsP$~!CY>zB^eFP%r6lq6PC z=C21YfC*!S4#5eXT;s}x#+CDy@8!3FD}V`O*kswOlvZzDtzSAzD8)Uw|J#J*`t0mz zs|dF={=XnQoFrfZTcT(x8h~^6ZwB=$5avqj;!EZ6&$C7Ld~M@+GM`{&~ zEoQS}yEkaHTN~T0&7D!VmtSC_7%>C)%$*y{*Dq;CRt01lcux(Qt+gM1-Tv(_{4bne zrbC4L96p-xxklGUP+>)iBIA+yWHRXwN4>#hFqjTU@G$KDV7 zCKz18nKpjzDmp@t2uW4^7-W(ml68E$o@XiLcO>1 z``>Hd|J>bc;v=|M6^-*38;Qujb{s5Uy$C7N3OruReH1z2K(q09_ph~$pMFPrKs$xE zDwK|_vYI3_L92Xr1xMs<b-v@?VE^BBpz3VzA~$4-ssP3< zWrItgLQm>f%jj<`-_=c%P)#L7&=TPkP409w8nim_r-QYv{z3CaR0Xi(3zA%lR0z=x ziYklRrf!-4v3DQYk=!sCfB}%z(L1M=%D^hT3!($f>lC@FC9NRgXl zij^M%f_XoU5F#OXU6<3B=J@2_5n$;99}Ypa;%y%|{O_-ybv!C#2CKC0Po@#fTDtaG zPKO*}LpXEfDMJ!Etg5n(1#{UPk8!^X12e+y!GHez;o?8MB(((Q^>sWon>(6&-2s=3 zZ~RBonppO_>1d3~c8>-At6*;&DYJ4$QYw$AY)UwHiO^BTlbx0uB7beCvnfK!$AaBj zhzJ>v65h%yo<7SJaOdRODSqvyE-(UoF0gx&k zW=(K}3rDNQts9ji!Zf~>5rCs1=yfY(t&IY!=FBYDsGKiyPWQKLs$`MsCu7{}r!fiwY&+O3Q>C({-b4$|f8wsPTz!Yg`~7sHn>+%$ z16ECyO11EmE^?)-1e8w(7dREx;gAXoN_G>hD!7Jd(P+)l(wD9>MLx8uBFovNRIv+D z@}Pm;az8M4v{X6oW*$8ey{}xM8Y7tC>88%D^f)Wh(dJ3-9Kc5H;66l=1|a8C>dBKckx%x)G3(} zx(t?Wu=K6WFQP3mp^M^`UM6|zyu7KfC(5d0TVD_0w!R<1Wdqy37CKZ6EFb-CSU@#X1R`S n)Kl(rAN7>)eMUXSezL0{dDrV=jv}+R00000NkvXXu0mjfTVeik diff --git a/public/android-icon-192x192.png b/public/android-icon-192x192.png index 0fb3a7280062ffedbfe12fde1aab0374d4e68d5b..4d548effd0ce2a701685ead97b83721886a0b99e 100644 GIT binary patch literal 5888 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 literal 4182 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 delta 1026 zcmV+d1pWKo3)u^hZ2`ZLZWw>5CUq1&a&yuu;|OK=gO_;%C6|k zuj$RO)vJlss)*F7h}5Zv*R71&vy$Dpn&H5q>CLg~&$8mdquR5R*RPJ&tc%vHirBA? z*|L({wwB(yo8Z2nKor-aj}hR&dW z(4v6RrGwO|hSaErmP<34Pd1)bJ*8nsuyR(tg=ff@chRJRhBF<8G98989Emp}k3lM` zX->X}Xwaj9hcq6FIU=B1K*5Y{)2M}wJtnJbPtBfvwtHQiR63YWHkwg5q+dm}cw5Mp zcG9MV&YymVGaZ{!IlF&?WW|wksAfu$Lo1+LL8fC!qh3UpOf!l&BArz`wRv2^jc&b$ zXQyOIk3cDlIU|fbC5SX0hBF?6G97#`8+tAqcr6-vE*pR`9E36*hBO|1FdS?s7iAM3jGLN)-SA z010qNS#tmY07w7;07w8v$!k6U00D+cL_t(I%VS^|-hhz_4DhO9W?^MxXXoH#=Hg~R zC}m>c;pO8O5EOsnW&nu_i-?K=fvB*!grpQ3pEOW~3@?kUq@28hqJp@RvWlvjI)err zXliPRYH91}>gg*P06B&bF`%dsk|GV5C`29!Fc_PdYM6MsRU+F%5eYcMX5AJA9yuK)})0&tD9xM8ht? zIxr|WBs47CTq6QWkw>IQRJ6O88PJfJ*fKkb=)s;3jHCHiI!9a6WOKV$x1B#NI_70FC2t^=u&6Ta4U8OMNa!R{CISEe z05MmcNB6Y)lkNi<7%(|4GcZ&!HaapeIy5jVFfckWFkp!(JCh#-85l4*Ei*7wF*Z6f zFgi3aD=;uRFfb9+k%yB|1o{gxG&nLiG%(NaAvcp%1xr3KIW03VFJ(0|VK8N8HDfbl wG&N&oW;8f9WMO4BWM(ihIb}CtVlHW8Z!U0dXJgOjd;kCd07*qoM6N<$f_*!-F#rGn diff --git a/public/android-icon-48x48.png b/public/android-icon-48x48.png index 9900845496abed3bf3ed3aebcbb2b2edf10589d8..b1abb8a42dd7f030b1a46d5b55ab1f2b7269bc86 100644 GIT binary patch delta 1283 zcmV+e1^oKN4Vw*+ZGRk4OjJec&$H^#wCc~a;=!ZgzoFp0pWnQl-n*RMx|`p-o#n-- z=gO_<%&_UsvgysS=*zF?$*kqZspQ0_CLdzsD{(1hSR5o)TxNp ztcuvLj@q-6;=-in$ExVduHCqq*|L(?u8r2Kiq)!!)TxKmsDFpmtBKaEi`cM`+Ov|} zwwL0-qSL2@)24*gs)^UFjM}u6+_#tAxtiCnj?<`x&7XeGpnuS!fzhOcmrFC4O*NZR zIiFcSrejF4bXUHIXvmg!(x!xlGaZI99f&m_i#a2ZK`NL|HM)Xi%bI%9rG$qx9*Q_3 zlSVG4Vn@M@ZGX|Df`>C5jXfrzTtdQ*ZqlWL(4&FRp@7q-g^xfft!+`woqWKHY_4!q zqFh3pQ#zSXHknU1omD)jWlFn(WXqa)(WHWiHXqELe6x32j5{TYIU=K9M7Mokz=~_L zcUhoYK#o5ss%cKnpMJQ0V2L*%i8mpOJ0y`rETUaQwSReB!HaCfka56@YOirrh&CXL zIwOZQABQs@g)<(2F&um^8+$JscP$!pD;aYu8FnlhdM+D&FdTs~9fUF+hBF?0FB@wo z7i1(AVj~n`BNSjF6k#G1Vj~r2B^HA+9fmX>Um_H5DHwz^9fdO;XeJhaF&u(29d0QY zVTUNfiWC^FdS(n7HlUMa48sSCKhHT7Gon7|NsA}u4WSe0004E zOGiYr+HL=S00009a7bBm000XU000XU0RWnu7ytkP>q$gGR7l5TU>F5M6EGr}OiWl+ zFfjrFLW-G%m5rSP2sl}pxwv_F(Ny#C3kV7c3xA6UigJsIgC!*-rC>lpT1HlmLta6V z4=lqgCd#a&tfH!>uA!l>rm3Z(t)t7X#~_6Q^bMpW42`snO-xNqV--NVz%!Q01| z2!AaMeh}d5=IS317!*uU3rqu8Q%Go7xQir;yt#yVL}XM{a5T)p$Qu0oLR@2F0`VNo%<2B4Ob zQfIJXQf1{{6|M+z*UH?gELThoey;A-HGj2r^$m^5d9IkUSTukPYpM!uZgIsXhgAaz zwBiuQslji!YG`ZkVCd}X?(XU7?(OTJFmVzA^^>PeoyIVI1_aEUHFfrsp2>4?E1%mn z6{wD31`?PzW7h2X9Sg9lU)VEi2D%0?n6{{AaT})kB}-?{z^(xZmQ7i{WG;&G1%E4M zL*=k)0QzXC3HntbSY$EbY(hiZ)9m^c>ppnGB7PMGA%GMR53II|fTWF)}SMF)uhVH#lWuHexg~Hf1s} tIASnlHeqBoG-PCAFf%tWVKXjiV{a~SZfESy($@e0002ovPDHLkV1mudG8O;; delta 1299 zcmV+u1?>8p4a5zQZGRdvz1&avpsujk3F=Eth!#;D}Pr{u(@=gF++%C70nvFXmT)2N2i zr-jp}gw&{p)TxNptcusKj@q-6wwB$vnboU_&YynIp?}b$ zfzqXe)TxG+OEQ;DG@4O3o>x7jVMeiZSHFpB$(VQ3riF$x9fmR;hB6$7G#-jMB9B2S zm`yaigk{T{dwYbO_DBo$&K6k#J2U?LP@A{1gH6=Wn8XC)SWFdT$39bY08W+fJGDHwn;9ELL< zcr6-(GJhR~GaY#?8f7FEZ73IkF&$_o7H%jPZz&jVC>U%f7ilIIVASfg(A}S^#EG{7^ zDFqUdmH`4;Sy><{C$FHW#Hp;JD#;I0Ev2Tep{b>R!U+Hi>D)Zja0G_*6c!&vP^DDUX(V(9Ma?d$LB zn=o8Su%5YVr>$GRe#6F1i#7v&M^FP;69k}$;njc*jA|fC!xj<&!&VXj0Ei^D zup=7eMF0Q*C3HntbYx+4WjbSWWs|!E2^cUrEi*7wF*Z6fFgi3aD=;uRFfd?=DLa$g z1Q{4GIW03VR53O>GB7$cFe@-HIxsL1)RBji4F&oOF*GC5mWo9%uHe_LCHDqQmFgay6VPY<6V{a~SZf9f9=X?MF002ov JPDHLkV1fybJ$e8D diff --git a/public/android-icon-72x72.png b/public/android-icon-72x72.png index 142898f3cd14e2a3ab1a7c8636c8c95087f99ba4..30a6e401f350887e57f4d1bcc531ee84987b02de 100644 GIT binary patch delta 1722 zcmV;r21WU<5cd#}ZGYlWOjJec&$H^#wCKvN=gF+*$gAeZs^!M1<;JMw#i!%MrsTw@ z<;AGw$ExYfud>?4&a&yvvFOaO=*+L^%dhIswAZeU*R71!tc%sFiq)!#)vAcp zsfg66ht;cz*RGD)v60-imfpLZ;=!Wl%B||pvggXK;=!ZeynmkExR~3umD#eA*sze; zuaDTTj@Yn|+O(71xtZU*o#DTrZ!lc@? zl-IA0)2N2jsE5_8irci5-@TsUz@p>BrQyJ#-@BdJv5?lRiqD~d(W8RWrGwL`g`HMB zpI1JiTS25@Mt`bkO|WrQwtQZ`hiJu;a?G52(4&EdGaZLB9fvd?h&CXLIwX%lDV9q! zpjtq!ZBe>{WX6Kq;qXO46o;)Tf4%M=rB=SM5ty)GRLVqiuT0y{yYt5d0nNK!}Hz0~QB8xgBzKCj_RXmJ5C7Dk*sAfvEcw4)JWxj}M zy@qGEd|s(&O_)wKia8^PGaiLA9fUI-hBO|9Gah^|8*wTaYbO_JCKh-t8gwfea4HyY zDHv}k7;Y#SZ73LeE*pO^9D*_(fH53nBNbpG6n|eL6k;P3V26IY9|-}|Nl*E9dG~u00Cl4M@02S(i__V z0Dk}pa7bBm000XU000XU0RWnu7ytkR0ZBwbR9M4fU>F6XU=)mGzz7HAo594)!pg?Z z!3hRj+&nByynGD&c(n)!3JD8~2nh=EF))b2Ma9G=B&DRKWn@7>Mp{lnUO`bwnO#Lt z6-f~c2&%EEYiMd|>*(s~>1!J(8X6g!n18aU@d^Ot%rJntg_)(4n3c5+CyR(6)Zaj7 z2(#EK+1blknps$wgMfv(g@u`!gQK*Qn1Y?P1{Q;$#+jMPNa#CTySSQga=N*DD0+Iy zf&{Uu1)7M{Ah>Z3jA%1_6!g>VNJrLwA&=S#Mwego&}hu$&YXRWy0Z)M?WTEz>Mz z&Ah{L83YWh88c_0ILgmq_MEx%fboG8H}j_~Sh#5MlBLU*<2EQJDt*PuLU@9Auw2!* zdQB9DqNt*^>*fO~JO%+(m6fbtRRMInrKLs0k`3umc+}!GC?+~)65GiT2oAl1b4CoWvPbdljA5L~(hB0#LmSFRqucKyap5)8X_8>A6p z5E{61F0uQfVJ9CqWKt6WiB7TEF-n{$h#$Np9oIC#TB4LAo z;L77CPjP#3|G{SnrT7iHcIq5Hkn>?I`a+sN}!xlRgF+7%?&}FfmjyG&(UkIx#RSFfckW zFdv|`pp$O~85l7#Eif@uF*G_cIXW>gD=;uRFfeZY4IGo82Koy&I5RRcH839(Fmsco z2TMLNGA%GMFE}wbIAvotVl*-~Wil{0VlZSjVPrNmWMpD6GdD0{GcIXkZ!U0dXY9_> Q*8l(j07*qoM6N<$g1kW;)c^nh delta 1689 zcmV;K24?y95UvoAZGV?gOjJec&$H^!wCd2b=*zF?%B|dvz1&avpsu-C1O)~t)wtBTdCiPWix)TxKmsE5?3hSaKv*RGA( zv60)gmfpLZ;=!Zn%dY9pvgOCB;=-igyq?{+nA^0J*sqV+uYZo$u8!KXliRkI-ME?G zyq)2{q2t4)<;JMy$*j|-h0~{m)24*esD{?9jM=i0;J%>g&9LLbq}Z^K+O(A4y`JH~ zqT|G--@BdIu#eTNiO{2h(WHXXrGwO|hSR8poK!oVRy?3uK%`$qsb@^EaaFf{U%!ZH z$CPx*a?G52w|!uW zIUV4s8G9}p ze=!_`G97_29AYCBUm_G>A{1dF6k{V5Wh51FDHwMw8h$Vwgfks{FB@hh7Gfh6XC)ST zE*oPc6?-omVIvf0CKhum8EYpOcP$!%G976q7JqRn8FDHZWF!@CDHwJv8ig|+fH53k zA`@sXAl1ad|Ns9!8r(Yo0004EOGiZ92VjG@00009a7bBm0000;0000;07l7cJ^%m% z14%?dR9M4fU>F6XU=)mCz{ms#Kf9T z>M~l|I=XuL28KYZ8JHN1(1EduiLt4anYoSyH>)5&1KiJ+Y*unw(o&{ICP=`@$W&a! z%-Tjr1=AoX04kCY(Xi36wbQq^*SB-fc7Jp-1!=^t*2Dy-L2%=YOeG~vf$lWMuaba4 z#DhU-kh6=ck))fro1{C126=dTdHeYK`3D5LN{UNTU{DYU1c!u%g-1k2MaM|Gk!w&0 z6vPGx1;@oFBqk+GlI1SAK@ihYf>YDdGcw6A3e_MG2#(Fl&LQ0>OoKqa%*_kHX@3$h zih(KJ#7I&cC2p`81TreWpb(o;rsA$e#U-U>hpOezQ^LA`zb6QU+gn(R3R zw?QGnaZ{&d!jqM|TVd1m8NnEef`4M;X4U~oJO%+(<(3sEyMx>=E;(!VoR(lbYVjHb z4D{5w^E&4*Sh#5M61>I`G6>|Vl#r#(Gkb%B38*7z5V2s?pizS;1`Ahrp=o-ZP~bb>$+{*cPtMf(X^dgcJ1E1n_k}55pdG05tE|@dGDz5NX!BlVEeO7z8nG@BWRa4ih$J`TAo} z9XJdEnRWWi*+a|mJ8Q>*y?Y261Oofcoxgy`i>odol;SsN&+a|@51hgp^vgnaUfQ>Z zXoJAPwf6Fn9mr_{l-dp-*?({aMHyj(z-Ar4dTrIt!`H#!!i^)>HXh%#dk^Ubf&F;; zGCwdnG%zbLFgh?W zV2LR^0000bbVXQnWMOn=I&E)cX=ZrNlFlA;nV>4qkHDhIFG&nY7VP!RB jW-u^0WjA4BE@@+LE^uyVW6$S&00000NkvXXu0mjf-mwPQ diff --git a/public/android-icon-96x96.png b/public/android-icon-96x96.png index 6dcd1411eff053af7cb0fdd04f815d5789a6691a..d6c6117500954e1a4c6605743e808d5c05d637cf 100644 GIT binary patch delta 2566 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 Wnfw;}KaMan0ETEYRE5sXgnt0f_HYXT delta 2081 zcmV++2;TS48>0}A8Gix*0002L5-I=y2kJ>gK~#7F?9ed*000C4F!XODh#pcX;oKrD zcRIdN3bbm~idL;!(W+G|TD59Lt5&UO)v6V(TD5ZQlt)^{FbssPVm~g> zT(Q)*pCjs_tCt*^+v8VXBih^9YUU$m@)+_MGy(gDD-mz!bw!hyiG{_dvS!JdRYePl z5WD;)vadHdva^JuTB}xl&aKvEzri=XP;xO6X2N9UD1qP@2rQoHS3NyG@Vntt$bjjA z#q4JuT70t``+t-;5{&#*wX7r;DJ$P`;=F)Havu*Gjj|wgf_0weaj4VivqhY&!8C~W z;2V7F3_+SjNxEsYN7RCqz^5VF-QG-}Dj0zhD2piP9H7gFN8gvonB$I^Z|b;2Fhz44 z&htDB^Kd>77eR9d#|BqmdqWK|ZdeJdBQkf^(W8o(fq(TY)qNe}pj_O`TEfnfGfNI% za3qbp9{l^58Cu)HwaG1cF6l5N47B-Sieyy-{4keCKY1Anui5g zNSIib8w?M)B^{@Cbe)DvcFkhRc_awJA(mxkwuhPd33uOSuS=K3pP8B2%nWH)goYV3 zhc2_Q=YN~*>PoffJ0ywax)==)Be5R-&!+{H;5LQcp$~nV-Ku0*nag6qurjO+D+`9z zzz{oaD)+W{wJnDCgyxcAeemZ$Jy$8fLyDp#ii(VT_|ksAQlI z3+|_-Xzx>(XkV{=Zz~9R%Cc(KOje7@X3^|cvwy>`S}n3k0eU#kzT;tt_rm(~O6*{> zqkj<)k_i2p9X6}SW%qfkUYDsyStS$1RD3wr{X)N<#sjjdn4NYYc7=luzgKfu1xaEO z*0G*6D9>^|#K;vkpW7RcxFSJ|%K=@VGz&AVyHw2aylT;$p@4rl?ums|iv{`Nj~gOu!Bo8q48nZ4J>G-WtSvZ#{(p_1yWJ&T9clqAKXIs6`XER4b&Cg>klmP4Fl(TvKq&fAIRE+`;&ALJX^fPBLfI(Q01e!(H zPe_TSQLEvkiT9t4!KybJeQkJUAv`rIDbksEGXO=l#NYPe;nQ!g-`7fIT6iW^IWLM} z3fJxkcyW0|)=YvZwA&pdlS-kK|9_FleNQ6EG-`DtvFh12FfuT-GLN>NrUIjV3(53{ zhtD9=YO!<((3A7+sT0jcPC%)SMXhEN2^tB9?lRexTaAN@OE%G&@!0GH(k?AI?g)<@ z`swkDkB^>}vUyr~0qxdXVBnB-xOYGW7M>jOj|^gbK=M6w{3WqqWdHi&?SJQ|FLQ|$ zB!lBzLOWnQTnN@34SHf>o6iFkqp$HikL3WYUm3>u(5%%9=}hA7$8Rs+7E;+xXE)Gp zJ9nYnHWS1Fe0NVW1qMDS<8WW8Ov9z8=>wLzHTz()9Ywp>jlK~so_{4|CzIH@_dk6deg9!6)4a+n>()CS(|8bxYV^e!SGX%p zWz`*n8f8^hWz{IFvMQ@aS(Q~;HOi{2%Bm?~@6n{4>jE6NvMDR(H!IMr7tb;q)MyVw8CD*mR)yi(zfQ)w#Vf~Z?i zN!7Oo5u0C-bAcZ-|7GGF%erECFS71yWMOTvVr`jICdi!Am&)GW<}T_ zwhdOkEz>3^UG zgW3C`?c3m44*xz(Hps`ZdpoqF%(Qu>H7~pbP*#ltt&JSW9OTHMe&ku;fernc&s);w zvt}WL7E!mPUi39oPz}6S;`9m7vrIh?T^PB#ex#ge)-*Dswa%?mRCCvmA&fJnzsX8p zRvyz%JYkt@PJaW(wPj|RL!TnneDGipN=p!qI{0ui%IgJf~%O)uht1mVEoIDXAR zAczR$nx~RAFU45TSOa1GMY{cLl9lu?n^P*Q9?Mczjk2ChR*kYMtFmg8Rauo)qpZrR ztQuuiR%O*FtFkJqrT|3P?`ZJWrB%@Eckt!Y$DrBopc=OpH2a;OzU>du{B8|`00000 LNkvXXu0mjf;o<{r diff --git a/public/apple-icon-120x120.png b/public/apple-icon-120x120.png index a1d2b211f45205db6618f520074580903e1502d1..cc6633670a81eefb07872c4daecb09fbb4fa2ea0 100644 GIT binary patch literal 3651 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 O002ovP6b4+LSTZ?j8HTH diff --git a/public/apple-icon-144x144.png b/public/apple-icon-144x144.png index f5afde978d15f1f6752259a68aa9ff5c97d91ddf..0758a5dbff50bf4bac43bf38e273ba871cbe77cb 100644 GIT binary patch literal 4529 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 literal 2731 zcmV;c3RLxpP)#ufB_RQ z0Rtvr0tQUL1PqvtJ@Yz}8-~F!K|owr=RVwr{q825VPx}k>X-=AMv6_2x4RSgITThup( zzA?0V2iOiB>IxJoS`aOTiHVtro+ibU^HBRFUWWGVIF2C8D9`f1wR)$&zu&9Lfi0+d z4obMXt_^gNa0XFO6k$yZS%f9=G{p&-m?L9*v#qK=PC{BCt)-Sy^Q@LjE+uQuKFe_k zLR$-j0eSD-W~$X3Em)|vOfirpR8}<1dI^fO_wj9@UHaWOH<$WCORfDWkVABMoHjD0 zn37DJ)(qm_E!g>}DhQQQ=HqgFgq-JUd7h1v>dH*pg3fAv?aRIbg6tH*&uT*U5Ug5s zoX97h<=&@v;epg!UR=lw|0RUMg9~K>Lg-E`*e?q?p?rLpkB*$vQOyOes@0KrqFe5~ zi%f1i6wC`emBqj5o)$II;qGt*% zR$4izYOOF#o{f-sD7Tlpc?Ka}Lw$r&8%>WG*x4^5dWOdfDMhGrUtN~0c>ah8^DGJu%Q8L{DIm3 z3<<~>z74~qMX1wg277QJ6&}O|qE;e|d-nPm^y+Ec~B+vrux}2*PkIi<#C8 z$ISeM$>W5XnK@ZzCNsmW@=N1WrL^IkeX1+9nc|S30gmE;uP*&)q5fRgI3o@I;Y% zv_Q;oEU!qSA`6--o4R5dqOO8&oT14}h?-8&B4B@RehUMULsv!NezK${Y%O8QmLVHD zCklWEH+6_|M)o9u9XDSRsThM<$n!9Tw?@YF?Btiz?23xJXRFl*TG-^-Qb}@2h4XhK~+xPx{|+g0izN( zCyDB4IK-4=e|ddxd98j>8ukb7|L)oU8HfZkJWsVPj7X4EZ4)t@ipNO79Opqq-Z^{` zlG~{@D%*RZ1m?S1JdWbXnR_>kOp++cm{G;hd|%r=*qUA3TUvwkp#Tc!7{_qLIVX!C zXXVmbdI}YDUY5uX0T@YGV8edDRjD`2mGb6Jd26>_tA`hupNxoxdh+Jg{FU>pFs=mB z6W(WBol63oy8ZGi^@KZ%xlPE44q3N@FJHYoI?!{5xUe$P&jN)f72% z;Y|MO1xWv6+203R$oF;^R@Q%>sqL5W5yY#aiSuI{iHN_lZR9VVOPxI_85+suVEH(_0@NtgItbC$yr{)YvRGT24b6f;p+4N??8?=_)6R49{ZH z3bp|`#U!`aZlih$e>z;>ZXA{n#wWok0u~TSQi_Z-3@7l&vUpiUq6Ls%LFhO3?kmf6 z8wLX~0aDYFx3u>>Wmm}pvg_M>Q)2-Th}Lk%%DKJT#_!(Ccc25>DxR52N@<*@H@$Wi z)9ap6Vi9aq2KF8CD&RVzTJ{cP7iIw1v|9#tQn9APVqgYlF))jP8JNYuECyy^76Y>w zn1NXg%wk{$W-%~}fmwq4fn$O7;6xld`Jus#N_`T^OgtAN1(RD~aC5Rfr?_v~#KQjd zqC3l%iHI8t^@)Z|MTF(%%MQCQnna2SwJjU1yOl*`53BCP2`uO9H3)#4X<51=FDv!`1oOujbArU-mtJ2ca zR9NJ7qUTeI%<#6m{r%^!H;kX2twbxbhNoud9?yfGaegu0d!T7$mS&VFCXr z*jG*4445KSssNyDN_g%ULXQB*F*!rT6TK=$R?F6@_a5Y=0df_IAE|19yoXALCvm$ zzYN~vVkrksmzkf9 ze6NoW`uJ)tndRUngD+!wIKne5kgC(FM>a>grK?gRmw-e>_wKnh`2}+3rFIqaAqNq z?VSzm)9?a-dg<{+hxH$y^#^DK-8Z?dCG5_~`Zq7La6PY1iMXf`>-Cy1^h26~ZRM`J zNp)Jx5ZeE9diCZX1JUe?sUlG=pxs5eCfzz2*w^;k%RbouZ~d=bJ0=1UilHDF68zhs zK?c5pgkQgzJqz33Ne7sWq`(ABz<>#ufB_RQ0Rtvr0tQUL1Pqvf2^cT|6EI)`CSdA~ lN_WpxPP)GLsi3q`=?BzI3di2)RGt6;002ovPDHLkV1lAgAMXGF diff --git a/public/apple-icon-152x152.png b/public/apple-icon-152x152.png index 04cd896d635bba2f550fe4b37f9541410a7796a3..b8d4bf5c58ab854b1d180736e2bf3d453195a8d7 100644 GIT binary patch literal 4874 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ÿT+CdUTAhcYpz!{KqK|P!c@f=FfPZBr>yC3)Ei*UxHywRb1`7aD1S>-2<>YUI zg*d>B%O3#SKXmS4{7?X}x_Ux}$|~c?{2xbVCOQBo3>L-sd|6kV7uL;L*2&HXM*9$U-4XP?UqBy@H$~N)8OQ2Rka-IVvhRI@*KfmB4oLAchBsk>4u4f0z*gprd7= JS)^_o^dG2i?3e%m literal 2964 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 literal 3840 zcmZ{n^;;7TyT&(iGDS+5IEjr03CStQ=#7*TgwY|LIzU8Vba!tkf*`5XNXajPqykbR z8!{QvsFVo2p6mSZp7%QET+jV{p1S{mC*iK4&Lt*pCIA3%360V;`CFU*D?v1W+3-5U z1pr_kL~E*<1p_xHBUu0dP*2Y=Nhn?U1&S{^Jo-yO#R{z;aJ2`TPa9~@JQ|6RX8b$+ zyZi6;|7#%6)i-FgsX^A%$Og-3T2a{Xh`G+$j~wR7UhCHgSbTP6gBqMx51Yi{_ou#|9}|1OuP~nY3Xasx9sfb5wuY4MzlZ&d=F4F>E}F+-iRF zmU4SMkJl<(MRIrN@Q|O18NSPLKRoJq{-P((uV;vnI$~Q!)cCOs1E89_qBe@NLYkD& zbKl=~NK>OizvFBqRmK|wtagJh8LuBK><#u!CH|Ie1riImH;}54Hwe~)?tf1A3!2EL ztQ0kc%UkqwZ;EO09gH`k-M(EbtdwBQ-y3J#TZ$q7dByyXn^}m~@@}OqgYiP?!5pSW zqghNpO>~t*Pq#oY7azO$q5@L1Uefo6LAUh#EIBPVa z>qD?6oQ#L~V)jZQ7H+j%GyTJrNG9cgV2IMaWa4nd!~B|2Q_S4+(Yr7F1PpaT6@u35 zB;943U36-`f0mdp6@o-|zLvQLL#hU9q~-y&EvW0)62ZM`yv~cqU&hgvE|K1D?x*|q z$20?L=@ROr{>6r0o6=6$!B^U4w7v{RhI`zV^JeS+MTZ>aq6$Eqa2DddO@{$PAE(WK z7nwlho03Zd2GVYaYV6daB3fevDKlXa)pdB2#9a8K+&~nY<1=Pc$pW;=8205}a>T8S zd7PMIu}6p=Ds?tOK2Y*ImOt+D9Xc*7n>t~u@4a-B*IVxAcvU@*q?^AHg06|^t&&_k zo9%bTA`6Ywt+;~8Rf^@TCVuU+hZ|!qPg~W#BF7< zF8nGw(y3@sllg<5$b)ws2l(GDo~m7LzG$r;6mv@|hY~Tq#YMxERM5jNe^Lc%N3(!=VFJ>dRBYd`w$HJXkw_63_#}Oz@;^ zWqi*scN$9aTqyQ->exAsqynM7>gXxwr&m?j0>R)R-WT_p^O44mj|6j&FXG(=Ry4ob zDY8LXV?ZSnV>opHtFwiSl*O&r!xXX_A5cbtVSnb$Cz%uYpfqOchnLO_r<Wn>$^Ri@cpTWV%|@yX>xBR4P1uG1(l_xOE?Fey_MMZ zc2IHXzw!@V>v$mEzlHQ#zFo?r|K4oNbyD7Mdp=riF6cq=%tpnWj$m9Fj!q!7{b{6KnOXi{QE2;uRynWtMudknJns^!b!wH(!v*=DD9~r6@$Dtd`^4f*X`W> zl^EFpEa2)9w>B#SVJ>#hY1ZV&!ppGTFiVw*hOK1?aboQEurJLdg?HUXk*`J~kX2hB-JI12bS2BB0N zAtCxaqv#^b&j_dDY@7li)TXCIbBWFlVUGdxXF?N4Q)VZq^U*nSBC z<*}z#TKuTW5Dz22dWT-KmlM%7X=_P~Yw+i_2P4A;3F;r2wF;V{>)6SO7X!aa?OAUg zB<}>16Y^SinxA#~y(@phNU-_7xft5G%UW?{h0{<|-4sxt^*DA@?0y?*8S5w8dvp($ zA>75uJ8fSZ+N{0OYZ^?D7U74k+3*INij=aDC z{6(|669Dt*pE)H zfL71X*@UVBnZ{XHdp(jvPmMdkhka`YZM=U5$3t!?j>CQw3?`aGThh*q ziv3OaBDQ1ZC90isf?foMYsmz@Q|MAJ1;*<{ic*4a<%`+R#H^9lFg5o=+IDvU75sX` z(Vt8Yp*HR$v1^o(Rh8b5+Q;kepZplyRNo7FfTf zIs|I~T_hiGSlxPlbhB;48<^mD(I~ZiKmZQJqmsdr%kMi;N*_tZ%s`_fZOA0@i-O;rqDJ4MJ^3V;^8Q_dhd*dY^Hi!4l+61;N zsUoXU5EU`x|0~s))z!g*;$j%4f?@>J(y~l|*r?~8wIX2hG4y(x@Yoy4t&O_Q4hYFMxwx~y?i>4r&tlY+%|>^qqSGDr z0H}d3(zs(&z&5XCV{hyD$i-S1%}2>Hi`FzgX%gL;UDx4No~5`7s+raM$ppC2-_^BHD&~(99=q2s@s0L{&h`-? zMcy8_c|Q{?xj}yo{f^Q{jIiCa8JA4+Tmb>(D8z@JC;2jR3|rMvRphZTSv7xFe3Ao~ zj_QqdKMG>u?JY@H-?llP;ds(94*!J+QXSqtuxu@oUg!)eN(uRW{{jw7FSP&w diff --git a/public/apple-icon-57x57.png b/public/apple-icon-57x57.png index 1d0c482dc87db338ef056ae92f4f9442b18e6334..16a7a186b38a79838ae11ae5fd7d73cf18af0536 100644 GIT binary patch literal 1884 zcmZ{j2~d;Q7RRqtYHN#H2upw<0s^umUlv06unNeQC#WFsM5jo0Qph6t00BV=AuNiD zgiQhjkPsF@C>0H8Q=k+S0a-$&77pL^$? zTXf`5h{;y#tpETMdT3xI>U}osqYu!ze?-!Uy3IWQaDM>0FMjfdVT{I`B#|KjpmV}@ z9S!VRp^@PLWHy=u*xa04WdvhIjzrDgZ3SN^Qhm0E{F@!lHrzY=FTb_-!uififpXfGB^sJ9xe}4Dc zv+vthztgM?t5=4aSBKTl$2!*TbHM|xv#o`*nu58uB7H~kd}qmzy^1GyR4ap5pN_Q7sAc+V=O6Zz zKI*G{JW#hXq<->E!{V(g4|^`pw8-b$3THI=_v^DKRN0e_IS;N%r`59AR(WMOrTQ?n z=BSVAxL*sK-X)Ie%Zk?(CyrL6PBrGp$+!ZFT_M%}ysy*cAkVs(&pVQi^yhKLs!l&> z&MWqDC<`H6Wdv(;S>wvgs&KDvgB#x*m7n@$D|T@+Ux@+zV^T-@(^DZs7d zbLRrG-K79`4d-un3ixByr~A&tDWl+GnnM8@R}<+|AG^OS7+*x&B`4tuDR#L;+jP8j zs)uzZ!6wbqI>iHvxML;m*c5l{8G=nVWSdLG<&kjtWIHJd$K7qgaKOYnU>J@VmZLe_ z$(*;_BGJV%*$tb4x5**eW)W=p&K4Xe^CVZxG!JVz#g4n%{G=B%GXVmx;GIwa4m|o0Y)TlIdvv?%lgQY1ZA1zGWT^37p!d zpH!m3$Kudf2>_p%ZP+GoMQMdLXf!?0KPvQlR=kyQQ@jp1Ix5FxNJw=a9shr!NBxHMqUp^>?~Y})8>IWoY=Z(ldq`R}_nF1sipG() zvB9@_on{(uH{UJM^}R{Lxa{0aM#L#PKQ>)` zuAKt8xj`vL{+wv9!Q? zZn9O^Mux6;ogEw=H;j%N=w&ToCVrK*7LX^jqhLap!~eE?hBscdPZ9&RncqaDl*tdJ zKskLHF$GQVFL^$z2BoiP-;gx_oCP7ahyBZR{=JH>W4DT3v)U^=V*4*J-Y%rHpx%gti-fekF}m*xqlgrk=mQfWcL;(ZXs7CH)&C?2L~K4c{r@Kj- z3Bel`BqA=7#z^J>x`4ssgfn=2R-!!>?~SK<`q+~oBE=K(LaW+G5UKVF2qK0FgtW9Y zJb!~m4W;p-WZonBOH>e8Z74=1qzITW94KO?2slCnhL51A1Q1)^^%MTW{81Bz6F7Wc z0s@FWr0pO%A7w1x)A=v+cRm|Q*g$4Fc722**!PfdzJPI4!Haz4tjlpK!_xX zcmysZmCq6hC4@g8hCm~F(>N?DlR~0$NDz$)v8fC;mBMB-A+k5bAmh;tJbJzt6Vvl( O1waov6xbOMFZ~a4L=3b5 delta 1060 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 Q4_5$ze!;#S-t^r60CDph0{{R3 delta 1097 zcmV-P1h)H)57P*c8Gix*006a~P9*>U1R6<1K~#7FVtjReGk_hlOp@3JqOiLq+1?$7 zg)lR7j+3i|kC6YtBjgleX69iu2+|tMNqK@^-YUOoGwACl7~9@u6J9#v3c7->peyJK zx`M8top@o(7_(W>&kAUj<^Z%#Gpl@sPCTx_16Sxj9wM1+Dt`z*fBglcwP&1iV!Hr8hVRKuwA&{ZnM6>{CBP$Nx zd-a(z?f``qGD7EpO@M+jLCVD5l)~E<@epH@q;aH@SjLe|VxuIPMMt)C2FRC?6^E9a zA?Hj`8XOse_kUh{);pr|Rz$FjW%S4etvgrf45Cs>k)w$P)zUiZ$jYgZSPAG7_XXJA z32r*R9CS70orU1-m!8`6S*yGf&7VWag%o>4$e%y|`nRvY8+`l2`1_xyzYNy1g-TN( zAt2fbE*Lcb<@2u#qc;HKocltA!A_&zI@oI+^c%g-ZhyPUg>e5r=Ph{t;cLBZ4hREkc(kN5uUbuf65*2g&kmsQgb{ zCDr8TUw{1Mi{W=auICFGCr0b-(>Cb!UT6P?Yr9t-)O&622Slr+Tuo-vUx!D7E}+vO zbKQM+lI#9%NZfzxdS=+<=ik11^WERR{ytufKKF zszdT7tk;+?bSl^L<@DFV;G6HG#gfhefU_JuO1R?Q7#JF@$!5ozrPoqPZTL8*xlyL@P6GLVCIb%v1Oi9o2nZgWM*@-5qbOab z?&}Ubaby3VjdYfyr3b;#NAMYj9DN21;A|3@Cu*=x$!2gn9Q6N`djuj}jEAwkxnE7{}6$p3YCTnZ}ZWR@~ka(8r?>so4mm1VWAs zNdIWR$-O%E12sS`<_dOcitmT|rmS74+{LXuz1NAwBdQePG3+A?IiSH&z!l=lS>n P00000NkvXXu0mjfI<_f> diff --git a/public/apple-icon-72x72.png b/public/apple-icon-72x72.png index d485a62fb599d991f008e59758612f5e40416c0f..30a6e401f350887e57f4d1bcc531ee84987b02de 100644 GIT binary patch literal 2167 zcmZ{k3pCW*8o>V~P2$wKXS^Rxo|BmQ&y45fx-;XQ#w$W3W8TCJGmMZl7~>H_WkgMw z49Q~?v#Y0pi8ZGq+}oJ%64RG36E5dd0?c6_32g={5WfCmX^8Z%gf3nqEI>e0BfY zt9uPA!}Tk}^5vnrrNOJqgLNxI@|AlHYojgeV~X{OwzV*MWD zn$A4AUhr*W{>-(!nTFh%2Jv(~G;(IHUmsVz9%)(} zsG0A*^rEZ$dB?e@ijvuu;@Re++2+F8mZE3vr7vzu=6kCaZcCT$)GiOnr|Pn&>awP; zW=+dQ&)P~}bV*+JNf+wT$(0^sVr|M~I z@wbh6<5w~!YlM$wnN#xYs>4o~gPpI05o;;#4J>j?e9(=wh`t=wP)WjQW$HxDX%Wsa z2O2g;Vmm}W-n59g_q;bwdW3L2*1uaw8!qFIOHWPLi}DPu2=^Yj$KZls1ZK6 zAh<1Ncbo{Xqj}XtxKxLeY9d_a4DVK6aBmjl{`sWIn$vj>d!%86yG7iQiW8k_$EuH# zO5M@<`%Ohy!+b}RQg>AKQI{L35%o&c&pC(j&zFyqHIqPD*_3a_td$4#xR-lRj~DRghDGlbOWV zUd}kso*dSbN$(T0Z;6iG&x>`eECaFAfZj-WeGl8`!QI zKIde0us2QpQ*s9krnY@YK5V<%2Mj2_<2E#CW-612`w<^f1kvA1a@5UF)9Y(> zSVL=l3@e)bW_5jSEk+-yr>A?dTp@q22CR&N88@>fva<4X9U2z-V#M@3feCAywS4;Y zVQ58YNO@*P_RZ{Ui6pb8y|i3d)uF1DDIJzb9(bD+E@)_IY8{L|5PS5bO91r{&pRe8 z)x%=W%KNRV(wX)3cNiBznJkoZY$GeTwZEkjt{G%=Vq}^RDZTpnRYSZ<;yE~J#-3<_NOl{*H6{?RyoD5 z&Q9W(;@e-73a}#)rX8Mtw=Y50n3<-jk?b`*qYVy)NF$yAIq> zV%(e0liRf8^;DF1Hb?B|m5K?@Nejm5nS}3pe_I`n`1GoB|L1=iQ!+DNjx1UD#;3+_ z3@~A`pEbIZ*Tz1^pj%SjuY3+}-W_iG3?bH@pHp^U@`m4=b4vbXoo8vRt}OZS-QaJT zuQ~6YcM9hFcKVK|r=41SXJKPDsH>uU*=WxB!!HjnmHHI1I`C&#Xl@+yABw|1f5}4*geU-G2iiH{usB>cP-yC@s1 s9UTigM1eFr3eC=jMvDS*_8-#1{ViFgS?fSqJc7 z&B}v$Fc0RzJeUXbU>?ka$>0JpEPKhh%z#;~owJA-f~AijF@NA7+QcN{Jh1{R_(Nkt zOaHA<+Or6NBB9Sj4DNOpmhRao0Cx24mt74N?NPTY+cg9y1Q(LaP(+c8aw3dG7&0Lf z$E@kZ;*hFaYmG5l85Ns2wkozpqXo^_29a;-P$mR|;8G%t#0rL$w7aPf{(bYAplMM) z3AK7IH~^cB@_!=A0hKt>9HglALa+#2DHB&zrL4;(AOQ>{l&<~s2-)-^B2FPgbUJ~x zKokn4lnEiwk;o)`gkja65NR@jW0lgX0wloTYhW!M+maYa4ZvE8N|sR@wNuU+CA}RY zu+GbmV;+qC_3D$11?d=d{3!`#ecJt%Tu!(^Gn-n>+yEUY6C(p zI8XpKR@~A z(APhm{^hUv)8}^9Hn1Dx3~Cr!gN!wuJTAo8jepnP^4NoYW5Z3SE(x%_wY@k#jVir1 zzgXGcF-p7oX?{|%^WDY%%ST7AyJqmJ%L~2Ta9tY<4g`5?z*4-f{@xoOzVE6#Zjn*A zPdq@Cw|8cbpPo2$d~<2VYK^A7Gf%+aDfIRXTs{g&tOzM|MQyFEtPqkEaF~za`hR;=O68^TsmVjfmM3S8)`Zlds@QaA(x5lkH#R~O7ZHX?3+8L< zi_0rhGaHL5wMZEOs|9qs4-lB(4l)*^yML<#<5;HTe`tCz59YxtBimoCSh2$(UeF3R-~zb}4bj#x9ri zmeR%rB=-0X!~4t_EN2Xyq2Li`Il*(1M9J1#&Vh3kM4TXiVArJ7p&nO9i;tSORrp$aN?{(`;QF03cW! z03rkc@Eux;cn1K1AOLK50suK10F?dmTAhypz>bejr(LZ##+x@L?r)6WUmL7m9jILG zuUP35FZY%&_msZrDV21WNVB_jN%Gjw2Xb7jo!l}x*m-V;jo6{Fs zvX?sYmwU_B2CCM_8kaf>7F+JUx}Q1Mlr~$JJX@PITYr15F?GHv{ndjzi!Ir&+wzt= z3swiJCdDz6V!>p&V5TPFWkbsAw%m6k4R4>-EIiD5*^oL_6*pa-Fn>Su=Qh!Fb^Pnr z+@;RKm45N0SU6cBYzjQz%)j_B*yC{owNuFMN%k4I6F8iAYrH7pMY$l(NIlLN8t8b^ zp+vIgZF8Np69#ur6Y|~7#0E*MayroH9`oIbIz3G$WuTj8fxurs%R|jG zDyG{#2)^8xdVRboJn5KL1>;mpm}lW7i?kE^@g|4jjnSzVdim$goB0>|)BIzN)UzFp zS|e$r`Js*P3*#EetTK^NPi=pC`_M01*x%{q{Sy@Y5>HrCRHSrLlIISE z2&6_Jo}x!*QW&(iODk{IB$BnYwbf;%c#PA(Jg5^HjT>xu%rW?(KHKrRO-U z78jXZ``|&bsNU3uNUX>RV_-WptfvaZu)dLBp~@Pf;H)zxjS($o9b0XI7Vr7zlo3pY9U)wv(s zis&j_N}Xu*LBE=bK@DM02>9nvD@D$%J~3NmSpD)%nTnLb|0-Hnsm z@#~Apv!D0wNlefjBr42-pzRr~uHjx?onaHX-s5X!ZmvRC38@Zo=|C3~KG>2oPtMz= ztN$u%mIRwsB$X12Wk7y!g!6&9sfDP~>tRE++z%*`$D&zB=pP5Q9dnMAAvP=-jLSkP z4^rSoMZ_lg0QUI@O+Ex==Gt*y9OS+k^(Yi z6R&hqSM|20y=E}IG`N$b^`EK;N%y80*?IkJ7+HzYMMT_dH8oSLr&Mw(FFo|Rgp?ZV zc$i4y*VzwLBcD(TZ!C7w-qtPNO8;$!|H1x@ec2%B_ZO>?q>W-}&w;+H0Qv8wMrUhstf;rDN! zXX_VQZodEW{3uHy?b^(}w%_PAW?3mQ@OsNK+AJ#jx_u6AOpVta@#+?fabsChXqN@ zp9>emQ^wnLe8Z2s*-wCRLBFV(ewNGbOY7>MS{_#q3*i;ep^FL)`E~uX1RJY>I?CUi zC?do@G4Htb4biGWm6wjP`MIw1YuM+3l-#>MA?@Ek{7p&mFnrffmS`aTrIwwM92Rcm zJ=Ngcds1Fg9srKZ1fEn6dAuKbPFg(c^E^6*#~{=E8IS|;ARaWt;SE8YD~?FUnUZm! zJ_wRQP`&U$;r}FXed!$L&Hta^^M^bVN;tV)A;6c(3!?Zl06Q*)#c-goI5aP`F@}UO zF*HTvK^)N#G=i$4opHu!Hjn2=#$tnlf-szI8ZwB+`1-RJgdZS50KTp0$`0gG$z&^E zS|FFQT{>aKa4wv&SP&QlQoBA zAw=Z|#DT+Q@NW7sfIqv!`uVW_-sI-^7aa#zhyrlNps@)7PcQ=2VIcHd0sDT?Im-!V z0HCF1X0iDuwB`20);SkDfXVS@K*z^&eR$r!EG(14=g@q80!ViNohhS~N>i0YDv4Dbt28kx)k?LU?(2Z)PB#hxTp(@2ww%)jhycji zC*qTro@U*}m46y+IOo>P!$OD6rLDH@>F%*At+h&tl(t$)w4fv;~Dip;9i^tCgX8Ww=ous)yy0kdi?^f(dzf{w@o&ZLOTx zJSde&Tb~$fOpVvaM+?<5a%|sn^(~T;SJMW-1us@Bjp>Q;1M?#@Q=|m|OYMJT9*jcJ z7@jydKYxAfP;Gn^5iNBfkoiGfD3>M<@1H+&qA@wv+o}S9>)LkTV`R=sv()UVqx;XD zD%GpIswpP|Q7M7YDTMoI)P8kN%#}4nmaH=*oLI9)9eRwKKmwx{3hxb2S{^d87Drf6r z+P9-2YdSB%#vyw_E!C=1M-NUOJwPW|gaH8F@r@*kR(|{ImruW3{P7pM>HuJGmyqt4 znV=9>MuzJXqt)RC-9K<4jnVN=YjbI3<$t$7*B6%3C;@c5K0@ZThLHp?3%xK(Q*K@V z_5$huG<&2+dZb5sq(_Ru=D`3X$)*`glu5MK#v-+$&6wM7INkjgHS`2;c}X#kH*z~s z>rvWFwbB^|o;)_8j8WFfY#i6A5P%~fFaaPrN`!y|Jx9#G0*{lKEGs+dT9ncgaDRpU z-@(zgxuJ=excFE*2{MBO=h|4+!S()L&|6PQs;l2a@9NZU&F zU(J|WdcJGOyqRnP5*5oqrsahFw?frhY{s!N^t>m?d`K5^EK6RIoSyU)YYd|+aCs+D z#tM6m%!LC`Nh<-Tk=%=694o!tN`E#ZSHV3%-ZG3ilmsVj!4BhpqHQ0WYO@imwJ1p( za8HnVE!tsB+LFWqM~?82tFHT+Hd*y(8QhFjq%^bXJ+fPEfJjw!%MSu;lkZ?_Z8S5f zW{K8OYFa7TjJy0EQ)GT5BVpdCRwr`Mmb3QO&|2aay|DU{X zJkldQ(jz_6BR$e1J<|LK0#95x%mzL1&AV?6Jo0ZefqX-IR88an0000s#fgcnxV4c(pHQ;`=KO8gUAHC216bX2{9_`)8o2SVp#$ORKt-~$wU~=6c z^A}-+9Rv`vAQBb^fL2@(xND~msEt$sX*vI20Qcp$Ou0XS? z-xph7S0e!8i}}G#e!S@^s`AL-UsILr#lJ|;*U*#up;f6mjYMU)La36J%j|Znt`9sn z$4I94AEd=PI@1a1N@!ji`?^^CmCwiGeW5qw-g@48m0TL4aD1^y%byYVR-4tK0~O?& zx+~){&jIR0nrP+k@FWCMq_4gUbn`Tch}}(o+UFRURi#NwBTr1s#~Bim&}E9I4vFC? z42gK%N(YiBl|}8=oCiQ2h^4-Zi+{L#eVO#0Roc6)6#U8_uS_!Hq**Lrg+-84j|Dat z*3_o~$PfI2+mlw=b7+(7Wcg75LFsJl)5F-yDpl}~(eJHh@n#RqF|mu^ZWxaDS1zdhvCgD;z^TxzG2z$KVkeTMm&JK{{!A>|Kr~W3x-%U6;OD550S#o?R zesqE50J2_Qdsozr=sa${PUtM_Ru$N3kfun`+yi?v2x=CTD{OHhm+iZ~-mHCevclS( z!S+zTcEVfyxgU~IPZ`T9#6vOnxn)kf?(ejSOLxo!Z$*nS)l{H@=TDN@xh;{_lk%R} z>~nSDOuI|kt$6YK}AZ}?qxh2qbC1^epwOj(t4 za*1+S<$MU^Bi)3C3%jL>h6}5v)evCk2Io?>j%UB{Ly3dY1+14J4y$ zXHK_sS3d~V-R(d-E!hQwt3M07YedWbo| z=IX?ryg?=v>b%PK(A9p5ao1v*hyhUBuiP?u-;4RlTv0T6GO(L0c{3CwM2zfLJtf7 zXDdAi6LMFRtT(gqO&LfzC6ctm?F!vY%3?C@ zjHf4K6@^1>Gni_eWB5utON68BJM8nt5d5_?$+W9BeZyrPphjv>fxnuhP{~V9{_nuC zRoU%3JcpC{^joxE*5qnd*M)K28IbJYKH?cE&qql+$=(erE?>Ndm(3 zBw8D@2h2?K!dJ?CJt{Fsb?OG4o*g=sme7I)^q59&5`k;F>>Uza`^wL}B@f=)vtNAi z+7cU5$ca+)I?hLVP7;c{e`r|* z$uBmy$wz;AQ5Ey)+MmwN#?uMo(b{X5#olLHZ)={s1$>#0gP zw=Rvs9g?IcQBNwPcfV4-WyJRY`xmsv(JKm+e|v5Ia-V5EtMTTx#YDx0)U)JaHS;>O zj7Z`zV;Vk{HUYf=$~C57LEd*n$#z=FcSOM!DeG+;@ubqKpZ3wrVrTJ>Qnz%s;g0#N zz1ll}>p1L;%}J1_M9B8#=-Ui1stWS_rKU0LRFNW%GhWelM9JGWXmOXKx#d32808kH zjG@7J_LyMK-|HxKa(wCKtYuHeKGrh3=6iiPf)ay*{cfV&XPX54DkaqlF5W~}slJ;# zyE$UpTsw76l+e7-1~g3TVCmmQXGNp4uf08WBgk|01rtRW(z3GFEKOU0^*jCC?ozU~%6^24iddLHlQyN3lJ{h7LnYR)T%Bnf})=R!aT1+i$2Z z9=87Z8rn1p^X{S4HZ76Y2MhbzY!|BYj1xK#=xfEu^In3rZYwp7uiEQ`x-@g+8%Ygv zuoT-nL8KxCK=XK7JP*_DEc54H6#22SOn2bJx95rUQu=1&uDIv6K>l34Zjt%z{ym%f z1U&8jU6g^>_$L8=(a1rgFqmwWp(Lyb~ElyVjw7%?F%FF za;e?Y&*Oz;`vvpf_4VoI-p*{{9C^Cpu49Y2>i5}n%h^dTUiEyRtgulqdQRD>mR#GU zVnDc9FH%5-UWGVs;#PM&cSschV8-*++$$j1?B=i?E+yR;A9&7Xdi^(Bx${O*FJU&d zXSswM`h7Ibxn;1UloG;BH}KpK=kuuQA+2@7!7lm@-eU}rGO@!E_C+H`kDz#g0yjHj zri|sLj5~6a*cPWPzw^gEM^&6r%LKsqH!_SVZUz~LMEV+$$WF?@b9`{6seJFR^KjJ# zq>2ONExmKSf5^`n;=^b-!z<>R8FHLBXstw_pE^PNVLYPj+)c^nn2r6tyZb$U^^sp* zBWx$5w<)%**GnJNT|DSfA%72@&MN*Xv#{3H|Erat=iyEFg>68QiH86R^a0(BC2p14`EG&vzDiL)weP~B z=f6tGtfV|ERQKHE$lJ{PZ2b;cwPR<-%f(iRvu}zCJH_De&7n^%~xh>z6GV6^${Wbc|Fn(*wuY7`= z0R)@P86v}Z?+}{NqFFYBO1^`s>&Ouo0Ubx%AeWn?`yVe`*hg88=98j!reDfBKWi*E zx|>7BNGgNun&}r|x_!$^h9!T%ovD0b_yCj9gV9`<>D7$&@^k99FnG=TH%ZDj=02rj z<(uEEQX*kEEi9|rqpue!46oR9aY?!!Y;^29^{_boTyjJ)5<09sl$w@hX71+~buh|j zlTS^S6G?f9iM|sTcm;|6ME9+h+Vtky78kpm8Z>(CTci2jQ#TY1OS5*dy*^Q+8(f)w zXCa3o;b~?uxWF2q3Yi;rG7FiAnxMRTi)S=7^ejSgGvB=)*ar=@s4a@x*_SK7>) zH|6uMu~Q$8EeaK8x3|lc<|b?$8DCwG0@?rQ_WXIAUi-)XD49e$zr?0UZ|1zX@q=&wl&XL z3Nz0Ak>~p){p|r=XJ>T1mRO_9z89V4^StBwXLdxLA0lEABZdlE5}D4rp^Q`|@XncA zpIc6?@#cZRk=k=mf8fQJU5)$5t}V00wO-1~(O<_@?*|G!I!`45{4O`#ON3rP0MGrC-qg+S3Ieq`g<(R(TcKRMVO&O-IXXEz-5VnBC!}s z&8pLHM%!0M6y1`QxR9snt@g|=ab$WYW;I{rtsg0M?(@-;(1y_}(_g0JXZSGk#x3H9 z2Y9Tn-mk*e=Sg4S7kKl|ur;0^myDrB3@*TL;gX9+z(vek$;xf#I?0R8BVVoZ@!#{i ziXL-~i7q>#kZuNpxL%)_Z}CLP^J6YyiumfxFLHh3k2iyNJUrR(7&@F>X$1^3?9V$6 zD%nT<;T>PM^qATLB6p)XXRj($k1)lj?Xx7hwS~u)@N$Wo8BpyZHJYd&d9@?f*Izuq z$Q)rDJuG18LP)k8cQz4kO+4cmhl|$D&+t`lIovORw|9SEMYw;RFQQU=%$_qU*)y4d zL-`4s5)|Y5-lE8z)t|)#x3qNY}LL+TzHC`t&}!ZY8$0Ss1g&02)(OB~~U@ zCPC3?$#bO8j4>wIMJNw`S1u;e4xwFdh%!`Y-7x%;gm!f4~1g{a^=p2@-VFsayk7_0CD^pToVl2=KwJj z_SqR&ni}eD7-^|GIiKmel99FiCiGl)Nrh&n$B$PYL8$>KRxuF;N~F@@rirYXx{B5( zw$Nhf5*L9FA{u^6u6#lVU%KR?E1s52fpsUOzK9B$K%5y$L^`IFu*q33nozX7Kpdqh`?HGVuhW zRuF*nz}t6--{3KXhS5##)AHdoQ{f){`$3Q41e&4uTi?aS z29Cl4!PtF`uGax1UjPtEW=rBXFe<{Fk5mQp@_A*f^yhZ3mP=5Y)CwJCRWBD5-|v-I zKW_td{P_9w1tj$cOG1~fvo?!L-D}ipo`z0ir#DCFWVR?sRwV>m;hKmQ+#5X$wiOO4 z#HmB-7fJ@5Tt=d}b$Gyc2n&|8R^a<zo?@=?ZF+Z=VE2=-$b#i;ZGFs|93zj7u=^0kTe?nf!`Pw=m zxx<*HC)Q49HN>L3)XQsC25hMoOEtM!};zC7<~0u={42aKze#JhWa_p=L~$ z#2{KurQlH`^UvoqL=G#?#M6sDyD@=Jn6`=n`f(}F_@$(ydJy8PB0pqRp5rkHOP5<- z=3Brmve_cExFiyDdpquM?Dxgdm5CZd2gELp`EvQ*H(7274c7N%eN+M(^r+c%rMmry z!9rF)WpXKdee%aMUVUIm*?qN4JY>vH@I#0AlrmRjebk7K7jT=Tr7^xKeT-_oun#Fv z%?mlgulud84|sQE^S00AiO)7G>*V}+9-5LAVS=2Xbvqik@%l^g*&{V~6QRz)&9yF2 zBT+if7b?zgUjAd^Q(k@d;zqP%pW1T~ux3&b54^2>$oJ@bVX#^JB~$+k!u_`#4Rlty zkd!dkrxj!F`&*7C1y8|bC`2AYWV>flC*!_|bql3FKnYOidI*n|jUX~hwhas7qNr5y zICr|F56%#-wjYZ~>Xn8d7N&MXZn0`c4{zRgfP4r@)p_gs)R#f43DRQi^j2ljC z(=*{>J0MicuD$l`Ra4XFf&FoFJZWga#{{goDGMqO_3L@q_!p^*D*mea#y#rx)8D5Y zZo(AQq)vY&2tHaf^nE@?8zLCQBTug~D6uX-hr&yI>mOH$5~#^|ewl@3e{8tN+m=$Y zZj@E~vo(^K<#;i=YuZjD7ecBq5F3mLAtL{=M8eQP+uiWat2iT!m!M!|!qJ_Zz_OuQ ziKL7e>bCW&!Y#X^=F>XGy{!gcIUUT=iA>H2xQSDeQ-81FT~_oC%Tz6pg#=HY)!ntm zbT6AAA9vY|L|C_0_qV8dK7aEi5;O27AbGLRWR&2wwfTHmgC_4|lJ0Q>1-mZ~=I*W$ z=>wWs^npg><<;J08DTuec|ph9OqN1&GmoHe(4S2nXnbf<5U9k?+kJPLwb2KRdY-3P zX(l(s5P!MS@%-9aI?1S&|8r>{yBd|^KUdy{N4Ct&QNnP;@L8w_!-!Swt2_nax?GLA zA)l6~R!HIhzsI%z(~)ud4big@{45u!q7Uwz`;LdAzK6Ai2S&=u4TGxyQJ5%92reoF zgX_Y@rQr9Z;4lFgObP~L&-sw^UkIFBtg$xF{(A!FE66Pz0s4;wcNZHEZwogJpyFg< zi&3|*#acOVAcQ4_kwW)4L}74oA(#YCDu*^4!C~j&@l;Ag#M|3j82bl}D>$^Ui<|9y z*ba^%!1RZsuAQforIZxP#mdtOpYol+>q=)h92vv05(`h49| ztyb)oNB_^8=kwfi?mgdge&?K*H%d=Oje?AU3;+O7pwy8D*RkW@B>`Q(3+)$r002Z7 zg;X>O0B(=#(*gkC4g|r2Ba+2n{l|q+*LSZHqIL}sc{o-CLJT6ZfnQSx0!DI8*M+WY z`d_IFVf{}Mf&3?tga4C=u>Yq1HO2qk)JkRyFG%YM@cLb!T>OahDp`Dmc)|@4sKg>4 zQMr+Mb`11*yd%+VxIfaB_lT@#2X5I$x2z9o-i5*$gdn(HBe!`8l( zfg#?!MKaFIE*T+D-qHBx5GSL>X=ME3ZKOuN%P4g1vFYJf&&P1+YJrDQ5~LZ3qqJ0M z0n2Zz_e|<|v-<4UHizeBLoNj_!Y=yb-d3}stKU0Oq6Q_?eQ3Aich~3rd%|E*fAJGT zjBje@VIl>bl*v>y^(y32BGl%`;vX>W>SGfA6lzg(f@XYcQfsi8%(UVjcD{Sf=F>)t zYefucJ@FscY-=LcOIcPA-uAfYMXg!rZm+Xe^Pe9ae|cWrwDoA*ECIAoC|+x<|FXi5 zOIyc=NbaoWDG<*vOXr7tH-(9u9U2jtD52@ zILS_APL=B|jH=gXUbwgIE0<89xt9g9Vx4AhE!f2!jpI}13pS&ua~DfsaihkSZzhLY zMT86^;Rs?nRvNqV@;?NvH3uSNYMIlH&yHNW(-vC6O(LT0sxdk`u>G1ms@A5(FUyMd z?h?Af4xVoku8bMcd2!|XoI^(W#B`~OD7HPR^Kl1+eL8!-48e%T&HHsw9^0vNk+>FD zh^#MKjT`UhH;)S|69v{a4DvW#!@OWoP?WY^APE7tBvu$ZZ`#Ez*5t z8N-uBR!hW5WCbhsm4E&3d3){BC~avz#hQ#i3vn8M7CS&5ktFDuTFqd}pD&rDg_4Y_ zSee~WGCuxnYT>1&Mp?e};k}RC3mra{t!L>H9246GwEgZjwuKkogUKO6O)InK!|mo~ zqU7CrH9c$eGU{sUN;$$wWrJGHx0Z`;ooiaotPTB)@2MYwxN^(rs!u5*Bc9{V%dV^# zz%8^>j4xb9?+`aBxyr&J*ESjh0D}%Z8g;2^5Z#0{j1lu>ivO>$(fI-CY%lLsxxnzA!mGLP9?+!W$V1rmQTVE zFnJfF0`&Y2;X4K`GV&3cPadF*zq7!-q;L!;ZMvXTeiPVuWheD?3}lVv(IRyq_l|zR z5o(y2l)?l10^{nl2pwts+%RrEl;cS?VSD=-Cb(&Hx&cG{@Qy-kgg=sxHajxqUA9B$ zDxVp*0eUr3e?r~)^~-+3;pG!Wz(eM^gA1m)Q=uEd0&feYK*g`=aU^X*n7mNQVSotv{w1yD#{=w;k7W1yQxgQ zDB&zls@D^=qDKk~xi)06s$j>5$tT*=(|ZCl%nn+pveXvoo=I0lz!0o71j?0~289)6 z{&g(+T4#*YNdw2xlY zVJ%1ZBz(1EH|)sS2&C^i;`Rq1v*W>(S=NQsj|I%L6=A@}KOQL(Up-=dWsO z$-iZ1=tE|Wq7AV1DZkh8W?WOH!}Rw$m2AYFLq#Q{mrrFdj-3llQ01Q@shMe+nVFYI zGK7rgL2b!Fd)`0=%M!GMiOM2d`|VhGs8K{}lta!DSMr-%`D@WLYYX$=!pC|( z`E4Jk*4n)~OFnmzBd3?uvK!V2f6UEhw58o(GV`W<+Kqpz#lpks=v@`BC&6{qaIHLV zNRwzY^rv-XMr8(l^VIah?DrYvB6h*TwvrfLp@K_bE{P}|Vg$v3=M_7N|8bZ_Sqh8m;c~Z{=QOocIfFD9t72R zj5tX#+(4JAq*=V5Ke55zAtcXM{sP*&N(?A&&G}!h)LNQ4xvOJbyclh7uIv5%WiQ#t zq^mPzS{Dc;j-+l?gLJp#^K*%cjU z`4+B5Vh>&c)cIot!1s|#xlP{B3G0e=VISl&Tnj3k-ai|;`-N3^(0AJp#kuoo6X31UG!-6$Xy!*zefUYn8&%>4+e zoz$P~k64r?{EOu>gm@-mg5wl&v$?ch&K)-7AHKH|t*DiVc*(C(EEln%Ek(iMJ}5|F zsk=8$fwU|;lAgz!4U3VG7xdqdh9LZI*wEU<{r=>6-q#Rgrc(bvpX-t8wqAc^rpAXF z!dh_DK7Cu6bxU;a!Uw*&#-8&`RzZm5xTBmC@rSa@?LC8Dkh%!+p*5*5;e@5d>&eN+ z^1Qy@m%O~{gr4C_wk%-fnAQ2#)vsXg6t5`{enHm8cg6wubjxt@zMS>wS7vdBo45~!z!=uJfkA02Ka z?yuaE`xd75ofL)@^1H$SV88 zF98OoMk}x7I7%4xK7>V|az`b+{%+0-CH=y_!h&V*P8jkRWOPDJcZG-E1`6P`eT`@K z(X4SQ(m;Loh^a-R3-+JwG^&C z{n#Lt@fQSKANb&+bXAf zx2uSN5UU|34I$u1gM6h<64J0y!V7!}ck?Yu#S4zt#}7#6d(U1HArNpYDcu+2l#lQ! zoPhCZh5NTYA7uyn?$X&Xv6CP`!gdT%e@##TaDk^f_@IzgUUH*YH*BC!uwU}&-AMo; ztTF7QO3~|;vXJ}La--}w?KpY{#mM5sF~|`AGN&25)>o|Ad}{TkTv(Ga#5!E&d#-;T zUcPdYw0LiMk2UyDr7IZU0B%8}$A?Mrl#Umq<4#p(m07WQE94Kl;I|$QG zDceN(XJ9uttR%!z1Lf(|CZ08g#a6_{@DKBghXPQF{GA)v@o5+Nca;frd{pAOwTO%7 zUs*jk)w}w>o+e8RmP7iaMHn7>DXJ7*;64P+Y}NgCeG`jZwFcu8J}8*mekgTgaEEs3 zmRpA}Dn|<(*JyY9J1zt&*kj_=^2vd~D(cVH6CJ3UJl&;r8Xy$&3pGSeo90=-)21>jp^)0@>gGH!E+OYEbU zPoe!z8DI8r&c=*5YqK4?4!TF4Tr*n}zcuf}Y70o}ar(bSDtquYDbD(D+O{VhR#X_! zIlgpljKJI2DlEYNOUGMf(Lc5fVK)6SWq2?Qv1It>d+t%c|E((a(IZ2~2i4o@6E0BL z5P$*%V8P_={SCZo)^6U2Wgp!!d;@p7)BQ~~ONH?{XdN0)3F6dkkuagv_Tot711%`K zB$pfeW6*aWlZD5#H*CC@+9AI3tR<5LnLjE2WJ-b@e>>tH!HP5fRggb|aN6|hSkq{cL zSRNZAJ-GC~_2JFccO9yAYqvcPm~-2Qu>h?8RqTXRF}4z0UhLFN?Qf;rCiL(+-~FpE}+c6jygj8aCKWvN)M~ z{YVv>$v$dB;AC@yT1kNMrIUq}sfl3Va?s0}=9Gb))lfj?DkN!({Y>iUcbJ4!(g0hi zDg+X8J(JilI^4aK7>lK;ldd6i_@@4ONO#Ug9bUX6;NOO0e3o6J`LO;_UAlI8NR-s* zHJrCK^#*(6{Hz>($a~hU#d}gFSTf|Q1)m@X6O>vw2eW#IrSv1~`i0*{C^3SU4Dh3I zEW~QCM%BJYM)uvdQ1?C+hz)Y>B;kl_hyOzm_8Z6XBaTw$-D0cdHNu*FPfwrJ{qZQnC*HAC}j=SO5S3 diff --git a/public/apple-icon.png b/public/apple-icon.png index 70287ac19d48eb2f1f0078594fbd51e67445bd6f..759d113264142f87ca8f7955b46fe191f1e1bcad 100644 GIT binary patch literal 6462 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 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png index 600cd07a1e17f1efd3369a188d8b5860425f83da..def38fd0622c46ef51a143a475eb08848d7d9d45 100644 GIT binary patch literal 1061 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5lz1E9 z6XN>n{N`5|wmjH7@BW^-_jk{^zh~Z~gNvRXTlxIdx|e4+JU_Yi$&qCb_b+^~Z^6R@ ziyj|ddU<*4l@)DQR<>VT(|u!o|Bdy1*H(93UeUHZ#dA$g!1mgNW0Q+7E@`^FtmVqe zwl*V~HY3?~Q~5qS^#xH52fK65%&9)mowK(sx@HScGTX+RTAdWxhpTTI(hiNJ; zArH{KswJ)wB`Jv|saDBFsX&Us$iT=z*U(7Uz%azn#LCdp%FsaDz`)ADKz_m21t=PF z^HVa@DsgMb`^zf>)ZhlPp*TOSq&%@GmBBMNF+J5cF+DRmTft1vT+c$+Qo+c;&_vh3 z6lkkLprM&UMoCG5mA-y?dAVLDNHq`xRqN#!rQd0L3p9{H0%T%HMrm%6m6c0=a%paA zUWt`e08nW$gW>Z3yYj23 zaAs91gMpLNltp%LfKp*dQlUYf3~8A;sX*`R=jN5<(#mponCCR|p+#u0d52!;A=)O1SE?o!Oz~JfX=d#Wzp$Py~ C-F)u= delta 369 zcmV-%0gnEq2!R8T8Gix*005AYXf^-<0Z2(iK~#7Flu*@S8$l4gSrD@nW@b(ksUp}y zItX>50@6p&_-FbNGcJthykhf{j%OZ0@%K;fG+^E-Av}P^cZieQ{a;0=QuHV24~$E} zWsnKUxUX!rF=}9xLbO1yIQ<3u&wmAgF*O2X^p^hgWVN3yZ`>w)dwJRa!dW03%3i*3@SRBgq6U z!uQu#Cs_%>XyoeC2j_3!;DVPncXpQ6JM|`_mBC;vn+5_c?5hZ5C;*HNdwoP4B^)_I z_%XkLvzs)!4{GrF@dfuu07y#0fxEeV=xN&+Xn1!sN33py0nkEB@~GrN&L)c%z4lO- zdunLWU)WE^0fK@BIna_p9BA7&)>XZ4VP6=BiA&+a9}Ap@-krTMNvRb86HAGWKv8!A P00000NkvXXu0mjfi(jY1 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index 09e1700a2b5dbce986ac14f409330c101b580780..a18359c30c4c5305714b2ece90794cfc3bd89eff 100644 GIT binary patch literal 1417 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 diff --git a/public/favicon.ico b/public/favicon.ico index ef6a4cea68e916df58c1c12aefd393222f9d2d06..685fcc2851a1a63d2effc2dd2ff55843f8efe050 100644 GIT binary patch delta 323 zcmeyz@sDGIUcE3k0|N-dfQVAUf7;_jpdDZwK!Rl;4M4{!#{CyojD=$mAIZTJ|LQSn zPS#;mVNBQ@$jHWMlD+1C`ScV2t7f16A5psLzoujVe`&+k|C0JG{}s$S|C{;G1Y>cX zrvD%;q1*IdVRAQ; delta 323 zcmeyz@sDGIUcC@E0|N-dfVp$|e@ZZ)Ow4~0Z~%s4QRT${Sg}eHL|iHUzo=3i5(e@S zdM5tWW7L|g!>Ga-zd4YRjnO1$&HwW0C;nH>KK(zUbkl!L$NvA)2Ce@k^;`Zcn05R& z^PdUE;yO+LL0Ce!>A(EsZYEjoi~sZb4*k#U*!RC;@@6Jq#_N+Ane7?xO?G5fWn8g2 Iomrd_03{fMRsaA1 diff --git a/public/ms-icon-144x144.png b/public/ms-icon-144x144.png index f5afde978d15f1f6752259a68aa9ff5c97d91ddf..0758a5dbff50bf4bac43bf38e273ba871cbe77cb 100644 GIT binary patch literal 4529 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 literal 2731 zcmV;c3RLxpP)#ufB_RQ z0Rtvr0tQUL1PqvtJ@Yz}8-~F!K|owr=RVwr{q825VPx}k>X-=AMv6_2x4RSgITThup( zzA?0V2iOiB>IxJoS`aOTiHVtro+ibU^HBRFUWWGVIF2C8D9`f1wR)$&zu&9Lfi0+d z4obMXt_^gNa0XFO6k$yZS%f9=G{p&-m?L9*v#qK=PC{BCt)-Sy^Q@LjE+uQuKFe_k zLR$-j0eSD-W~$X3Em)|vOfirpR8}<1dI^fO_wj9@UHaWOH<$WCORfDWkVABMoHjD0 zn37DJ)(qm_E!g>}DhQQQ=HqgFgq-JUd7h1v>dH*pg3fAv?aRIbg6tH*&uT*U5Ug5s zoX97h<=&@v;epg!UR=lw|0RUMg9~K>Lg-E`*e?q?p?rLpkB*$vQOyOes@0KrqFe5~ zi%f1i6wC`emBqj5o)$II;qGt*% zR$4izYOOF#o{f-sD7Tlpc?Ka}Lw$r&8%>WG*x4^5dWOdfDMhGrUtN~0c>ah8^DGJu%Q8L{DIm3 z3<<~>z74~qMX1wg277QJ6&}O|qE;e|d-nPm^y+Ec~B+vrux}2*PkIi<#C8 z$ISeM$>W5XnK@ZzCNsmW@=N1WrL^IkeX1+9nc|S30gmE;uP*&)q5fRgI3o@I;Y% zv_Q;oEU!qSA`6--o4R5dqOO8&oT14}h?-8&B4B@RehUMULsv!NezK${Y%O8QmLVHD zCklWEH+6_|M)o9u9XDSRsThM<$n!9Tw?@YF?Btiz?23xJXRFl*TG-^-Qb}@2h4XhK~+xPx{|+g0izN( zCyDB4IK-4=e|ddxd98j>8ukb7|L)oU8HfZkJWsVPj7X4EZ4)t@ipNO79Opqq-Z^{` zlG~{@D%*RZ1m?S1JdWbXnR_>kOp++cm{G;hd|%r=*qUA3TUvwkp#Tc!7{_qLIVX!C zXXVmbdI}YDUY5uX0T@YGV8edDRjD`2mGb6Jd26>_tA`hupNxoxdh+Jg{FU>pFs=mB z6W(WBol63oy8ZGi^@KZ%xlPE44q3N@FJHYoI?!{5xUe$P&jN)f72% z;Y|MO1xWv6+203R$oF;^R@Q%>sqL5W5yY#aiSuI{iHN_lZR9VVOPxI_85+suVEH(_0@NtgItbC$yr{)YvRGT24b6f;p+4N??8?=_)6R49{ZH z3bp|`#U!`aZlih$e>z;>ZXA{n#wWok0u~TSQi_Z-3@7l&vUpiUq6Ls%LFhO3?kmf6 z8wLX~0aDYFx3u>>Wmm}pvg_M>Q)2-Th}Lk%%DKJT#_!(Ccc25>DxR52N@<*@H@$Wi z)9ap6Vi9aq2KF8CD&RVzTJ{cP7iIw1v|9#tQn9APVqgYlF))jP8JNYuECyy^76Y>w zn1NXg%wk{$W-%~}fmwq4fn$O7;6xld`Jus#N_`T^OgtAN1(RD~aC5Rfr?_v~#KQjd zqC3l%iHI8t^@)Z|MTF(%%MQCQnna2SwJjU1yOl*`53BCP2`uO9H3)#4X<51=FDv!`1oOujbArU-mtJ2ca zR9NJ7qUTeI%<#6m{r%^!H;kX2twbxbhNoud9?yfGaegu0d!T7$mS&VFCXr z*jG*4445KSssNyDN_g%ULXQB*F*!rT6TK=$R?F6@_a5Y=0df_IAE|19yoXALCvm$ zzYN~vVkrksmzkf9 ze6NoW`uJ)tndRUngD+!wIKne5kgC(FM>a>grK?gRmw-e>_wKnh`2}+3rFIqaAqNq z?VSzm)9?a-dg<{+hxH$y^#^DK-8Z?dCG5_~`Zq7La6PY1iMXf`>-Cy1^h26~ZRM`J zNp)Jx5ZeE9diCZX1JUe?sUlG=pxs5eCfzz2*w^;k%RbouZ~d=bJ0=1UilHDF68zhs zK?c5pgkQgzJqz33Ne7sWq`(ABz<>#ufB_RQ0Rtvr0tQUL1Pqvf2^cT|6EI)`CSdA~ lN_WpxPP)GLsi3q`=?BzI3di2)RGt6;002ovPDHLkV1lAgAMXGF diff --git a/public/ms-icon-150x150.png b/public/ms-icon-150x150.png index ae1e18d0356df52efe86e13fdbd77042ba0ce519..742a922a6c34dfc35d4fd187f689bfb62f2cf723 100644 GIT binary patch literal 4776 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 literal 8052 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 diff --git a/public/ms-icon-70x70.png b/public/ms-icon-70x70.png index 4afa9e757a595528ab7f9615389a30df01ad53a2..2f9a15314fec621225572d1f0c2174bd265cf7d4 100644 GIT binary patch literal 2105 zcmZ{k2~bm67KUF0ECeDhEJ+|C62eaMvVy@43<%AtKpI-bY>yBn5J><Q0cv*PC)Wlwub=evvNuWRPI&d+uh&B3EfGk?AK+0Duq1J$qY)-Bv` zdi$XH?Sqy#Lsu4lY`OVPP#gW#fhizl^%CWkPu}kn! zjMXW|>y;A?nUhV~Kegn~b`<{HTQS{wX6j1L#AWq(W9E3hYP=zHqES70Icw@_?o9jH z`RX=CNyBC`@wr=Vi~MNS2iWaNKMdweA6+;xUZ0V_!=aqBMSD*6 zq&EF5+qq8Yo4?)ulE7#1wDid(MN53xa7ps*yx5+Tg7(B8uEvEl9SUlS32r_d)_E+l zKkLv?@zK$m^nvV{q2eQ5#}5>KN6Fo0r*^YeGx0fFh=snC8m`y%RPO!rN#hO5(c1LW zo{lZ?oco$1MSfJZ>n0Tqr*_*^-~-n3ygQQj^<|1{`Q89`&7k2DoY4nu&4f0l0)nZ;-u$4QxyaTmif9&PV+z@riil>>wq`MQ z=CSsuct>=S3nqnZkw(EDBUy-T&A8Sk2dqu_1QV$P>WB;G1ZbH_$0a&rc-AI|?9Am( zXqh9LPcV&hK=BABkd0X~$s!fB;1Nt^PUskW^W$(oG@OEpJ?w}|a6&IHFE0f453d}1 zzTYnP>u|{M796aR`b5Y8z;NS=A%K!H6nwrv`LaDi!v_UilwLL0#7NMuZ(FR1&_sl5 zJp4HvW-lguJ>XkVo_;R7RCV51_g{Lt-3o;l`>qDvQgT<@?@Zd{Ky+~?5S*QecFp)p z^|~f{4q+SwB8i3;etT6R;ej6OCya=Pk4EfI-FjSSCjmktkp#iU5Sm1m zYPgo?;HS6R)OpAL{a%Cp53*)ww4B?4qfaAu`-dvZcLfb2Y|<|VBZbYa)o6~O>R@P@ zrBPYO{-&mV9UVr6VIL8zO;_!}zKZb7(zn=YSye)*;!Zu5RzF5183&Q$tPX5H5r#xU zzviydH!@he25Fd|nUj^LCQd~d9mcP#JbijyrKX_lY)MhY1&>b3VQ_E*t$jHM}KG}JC8VlmkV~--hE?kV)oo1Hu#RGJ@iEj95*-TyjP8QU@)!3TIjWDVb}zt zBjGm;$iRf>B6{rIE?>}}$0G~1mkJh&CU;a#y_}hGXWi&|cPyE1Nl$(!Md{G%o2@21 zFpe9u>;hM5?L!A%DHIMNbpe&@w+cQ#SX-vOL-a3U%v#|9%uuRqVKtG<_Ic4;^M`uP zn(Mg;M}zWCF7J%DF&Lc9H*={tn-(@9TzB#jiW}TTj$nzVe>HXb{z~Mzv>;-npdYdB zT4JQn-jr3T3A#C(%yKZagGTqc^PiDM7Os+~z0mOFmA#!YkzEo3S{XClCwN0r&L8{z zm)Tp({U^Wvdo7NY^6G8tOS{Q4{GYVv>H>8TgT-U|0KampbZPDn!_pU|4bV`hpZfp{ z9VkGYPm1jB;ccW`i2v|eJf}^Y>-hAs_BTaJ*K6&_*pXbsjm62_+0uU$$G8>?rXSg-@SR|Jt-x+g0u>E>GG5G5pH$==s!P>exA)Y ze#+jxQ$fMEynFUl7DU3jC%%6&A-fUup;t``s-c{w>p|rM1;iQD7w))bx4=6WU7!U3 zEY5xvviPeCz7s^bSGZirlS3>)JOn#{3Q|EA3e^Rqgi`1%%4QY?bOJ#Z2wGKjRQ*qa zBu*%fI{N<;V!t9S;RNrM3bME;c@i%k0(>Pr5fs1^i3Nx7Op+_f&1Ey53R37UAOo(7 z-%VlSqvdibi%d>RN+O9@XxLzy6c;a=Q+|L20o00OXmo;v&tkFT1PKx-R?cDt!>A0P z)Ggm2|Bd;xCW{pfiAB+JfU=ot48&)^jQKY@e=*;Sh4SbXWUOhEK8&EhK?1}QNPbib z0e^Nymd1*#zPp2{=D(J=sg-o81Nf!$F eAk7uz(MWIx3GVOx!zWX41;E!UkbTvYd+I;eb6HdX delta 1255 zcmVb<+R<1h+{9Pj~UC%bb=nE zy+ChKxJCzifDRW=@G&zpK1yOs+ODN9sawDHQSxZ?_l`W0J)`{e->f`>2S*EUu84tgmf(L`a9UZBb_#5JZB=gd%i=IVQAoBR}k}6*CZ95XU-d z$L*$SSq!ZL2Vj?L3sXCFP~Adr6KR7)2PHm^+g<)EkPHPVLvX6Hjc zCHu?M8x#D#1c=!@A#M+>#Ful!&+a~0diZ$l+4JV|N`KsHYo%S8cHxr$013YTXa-!y z+j1|Ylwp`F6^qq!xlykSHL62{rA93*SH6Li?gHi)9fLSIIx3-l!2oF5Q??R=;GY;o3Av+ zMo~Dh1AmB=P0oC&IR47Q{QGa!Mu(Cb(i1Rn7r0*fE6L5uZC{YmWTjel{)4w>-+6=6 za{G2cBBOQGY_*nFxc0VI*KGM!JTAhpP%d$mDmQ9ex=;w7di}Woc81j9Ld4;@saL=F zcwllYfUVgD){y4%>Z2RCA6~n;^xzT0s3<05{(t@$2S7v-%0ji$7#|s#pW#|ntdv2B zj+4N5qjh_=*#o35SfNs0{OH};ciFBy8QNryu_3q5Ub=PW!ph^PMr&u+{}(EhvQ)1Q zPE8CBW!V8=9U#DgF}-SV6Sbx^v;m^<$@b zqkku&G|A?RFk6R+#uyzdHa3%ZJp$uD)%eTvQ*XS&6+bNG0PtTgM5}8LuHC$O^4ya< z_t_Z$*!zmN5ms{X9?f4K_3;tjraA9LD9M=CYLovhk8j;sdiW#_v!9W&>EVtE5CjrS z8>5Xo%-H*V$)DqSB#-2gJd#K1yX2uEF@HqLkRgji6qwXeg1bZNXb}M*HAwpmhDnwp zwG!#bBoy$?>tmV%o$yf>iCGW=0l*;d_Jl(UFdfbc^5v0c9Yew3-x=u1)USdgNITQ@ZY`Y^i<$p;l z=IG?s&XBTrj*T6wl~5Ezv}iq6QyJ!2i?!?a z7b(q#LBI)FwrqKUJ4XX+&htn;Z7Ev|f<7T_tW-i`$ZT6DAq&HmjWdlca^ri6)J;f< zP!PyD$%Husw9c(dNU5!}t!Yi^wP4spx&yQ4NLe;?Tbv64$YY&7fanE@;#MbZvSD_} z_ajo)3fTD3!TH964IcR~agVfZc_feIkvx(|@<<*@=1ZkRh6E@6{53dS`U`pVWUMU! R6sG_H002ovPDHLkV1j&BSp@(9 From 5bb3c9fae708e916e897f11a34b72828130e2deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Mon, 7 Dec 2020 14:06:18 +0100 Subject: [PATCH 05/15] Update the info of the layers and about modal --- components/about-modal/component.js | 17 +++++++++-------- components/map/constants.js | 10 ++++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/components/about-modal/component.js b/components/about-modal/component.js index a29ef9c..349b82a 100644 --- a/components/about-modal/component.js +++ b/components/about-modal/component.js @@ -74,15 +74,16 @@ const AboutModal = ({ open, onClose }) => (

Methods in brief

- The historic soil organic carbon changes in agricultural lands are derived from Sanderman et - al. (2017) who used a data-driven statistical model and the HYDE v3.2 historic land-use - dataset (Klein Goldewijk et al., 2017). Recent changes in soil organic carbon stocks are - assessed using a UNCCD modified IPCC Tier 1 approach (UNCCD, 2018). Future soil organic carbon - changes are predicted using a spatial implementation of IPCC (2019) improved management + The historic soil organic carbon changes in agricultural lands are derived using a data-driven + statistical model and the HYDE historic land-use dataset. Recent changes in soil organic + carbon stocks are assessed using a UNCCD modified IPCC approach, while future soil organic + carbon changes are predicted using a spatial implementation of IPCC improved management scenarios. In addition, a novel approach was used to model recent soil organic carbon change - in Argentina as a pilot region (Heuvelink et al., 2020). This modeling uses actual soil carbon - data from national archives, and a statistical space-time method for mapping SOC stocks. A - global implementation of this approach is on-going. + in Argentina as a pilot region. This modelling uses actual soil carbon data from national + archives, and a statistical space-time method for mapping SOC stocks. A global implementation + of this approach is on-going. More detailed information about the methods with references to + the scientific literature is provided in the info buttons for each method under 'Explore + Map'.

); diff --git a/components/map/constants.js b/components/map/constants.js index b0f063e..cb259d4 100644 --- a/components/map/constants.js +++ b/components/map/constants.js @@ -826,11 +826,11 @@ exports.LAYERS = { label: 'Soil organic carbon stock', description: { historic: - 'At a global scale, you can see how much soil organic carbon was lost or gained as a result of humans’ influence on soils in the last 12,000 years. This data layer shows the amount of soil organic carbon that may have been on the landscape in the absence of agricultural land uses based on the analysis of Sanderman et al. (2017). Selecting change displays the difference between this historic map and current soil organic carbon levels. Three depth increments can be selected: 0-30, 0-100 and 0-200 cm.', + 'At a global scale, you can see how much soil organic carbon was lost or gained as a result of humans’ influence on soils in the last 12,000 years. This data layer shows the amount of soil organic carbon that may have been on the landscape in the absence of agricultural land uses based on the analysis of Sanderman et al. (2017). Selecting change displays the difference between this historic map and current soil organic carbon levels. Three depth increments can be selected: 0-30, 0-100 and 0-200 cm.\n\nPlease note that the maps are shown in Mercator projection which exaggerates and distorts areas at greater latitudes.', recent: - 'At a global scale, you can look at soil organic carbon changes for the years between 2000 and 2018. We used a method based on the IPCC Tier 1 accounting approach to map the global soil organic carbon stock between the years 2000 and 2018. The maps are at 250 m spatial resolution and show the soil organic carbon stock in the first 30 cm of the soil. You can also view maps of the change in soil organic carbon stock during a given period. These change maps show areas that experienced a soil organic carbon gain and loss.', + 'At a global scale, you can look at soil organic carbon changes for the years between 2000 and 2018. We used a method based on the IPCC Tier 1 accounting approach to map the global soil organic carbon stock between the years 2000 and 2018. The maps are at 250 m spatial resolution and show the soil organic carbon stock in the first 30 cm of the soil. You can also view maps of the change in soil organic carbon stock during a given period. These change maps show areas that experienced a soil organic carbon gain and loss.\n\nPlease note that the maps are shown in Mercator projection which exaggerates and distorts areas at greater latitudes.', future: - 'At a global scale, you can explore how our decisions about land management may affect soil organic carbon in the next 20 years. Using IPCC Tier 1 accounting approach, we developed a number of scenarios of how soil organic carbon may change over the next 20 years. You can select nine different scenarios that include restoration, improved management of croplands and grasslands, and further land degradation. For each scenario, you can view the estimated soil organic carbon stock (t C/ha) for a given year in the future or the total change (t C/ha) from 2018 to the selected future year.', + 'At a global scale, you can explore how our decisions about land management may affect soil organic carbon in the next 20 years. Using IPCC Tier 1 accounting approach, we developed a number of scenarios of how soil organic carbon may change over the next 20 years. You can select nine different scenarios that include restoration, improved management of croplands and grasslands, and further land degradation. For each scenario, you can view the estimated soil organic carbon stock (t C/ha) for a given year in the future or the total change (t C/ha) from 2018 to the selected future year.\n\nPlease note that the maps are shown in Mercator projection which exaggerates and distorts areas at greater latitudes.', }, group: 'soc', attributions: [], @@ -1068,11 +1068,13 @@ exports.LAYERS = { spatialResolution: '250 m', contentDate: '2018-2038', description: - 'These data are a spatial implementation of the IPCC (2019) Tier I bookkeeping approach to soil organic carbon stock change for a series of scenarios:\n\n### Cropland management: high organic inputs and minimum disturbance\nRepresents the combined impact of a shift from current management to cover crop, green manures or other higher residue return practices and shifting to no-till on all cropland areas.\n### Cropland management: high organic inputs\nRepresents a shift from current management to cover crop, green manures or other higher residue return practices on all cropland areas.\n### Cropland management: minimum disturbance\nRepresents a shift to no-till cropping on all cropland areas.\n### Grassland management: sustainable pastures and adaptive grazing\nOn managed pastures, this scenario represents a shift to sustainable management with light to moderate grazing together with at least one improvement to vegetative growth. On rangelands, this scenario represents a shift from current management defined by land degradation to high intensity grazing.\n### Grassland management: sustainable pastures and low or medium intensity grazing\nOn managed pastures, this scenario represents a shift to sustainable management with light to moderate grazing together with at least one improvement to vegetative growth. On rangelands, this scenario represents a shift from current management to low or medium intensity grazing, without significant management improvements.\n### Cropland and grassland restoration\nReversion of all crop and grazing land to non-degraded land under native vegetation.\n### Land degradation with no forest conversion\nAll grasslands shift from current condition to highly degraded state. All croplands shift to conventional tillage and low residue inputs.\n### Land degradation (including forest conversion to cropland)\nIn addition to further degradation of grasslands and cropland, forests are converted to conventionally managed low residue input cropping systems.\n### Land degradation (including forest conversion to pasture)\nIn addition to further degradation of grasslands and cropland, forests are converted to degraded grasslands.', + 'These data are a spatial implementation of the IPCC (2019) Tier I bookkeeping approach to soil organic carbon stock change for a series of scenarios:\n\n### Cropland management: high organic inputs and minimum disturbance\nRepresents the combined impact of a shift from current management to cover crop, green manures or other higher residue return practices and shifting to no-till on all cropland areas.\n### Cropland management: high organic inputs\nRepresents a shift from current management to cover crop, green manures or other higher residue return practices on all cropland areas.\n### Cropland management: minimum disturbance\nRepresents a shift to no-till cropping on all cropland areas.\n### Grassland management: sustainable pastures and adaptive grazing\nOn managed pastures, this scenario represents a shift to sustainable management with light to moderate grazing together with at least one improvement to vegetative growth. On rangelands, this scenario represents a shift from current management defined by land degradation to high intensity grazing.\n### Grassland management: sustainable pastures and low or medium intensity grazing\nOn managed pastures, this scenario represents a shift to sustainable management with light to moderate grazing together with at least one improvement to vegetative growth. On rangelands, this scenario represents a shift from current management to low or medium intensity grazing, without significant management improvements.\n### Cropland and grassland restoration\nReversion of all crop and grazing land to non-degraded land under native vegetation.\n### Land degradation with no forest conversion\nAll grasslands shift from current condition to highly degraded state. All croplands shift to conventional tillage and low residue inputs.\n### Land degradation (including forest conversion to cropland)\nIn addition to further degradation of grasslands and cropland, forests are converted to conventionally managed low residue input cropping systems.\n### Land degradation (including forest conversion to pasture)\nIn addition to further degradation of grasslands and cropland, forests are converted to degraded grasslands.\n\nDetailed methods and all data can be found at [https://doi.org/10.7910/DVN/HA17D3](https://doi.org/10.7910/DVN/HA17D3).', cautions: 'The IPCC Tier I accounting approach uses regional mean response functions to estimate changes in soil organic carbon due to shifts in land use, management and inputs. As such, this approach does not capture finer scale variation in soil organic carbon change that will likely be encountered based upon local soil types, local climate and local implementations of particular management strategies.\n\nThere has been no consideration of local feasibility or current adoption rates in these scenarios. As such, these maps represent a completely unconstrained technical potential for all cropland and grasslands.\n\nThis analysis assumes instantaneous adoption on all land areas. In reality, change will happen gradually over time with more and more areas coming under improved management. Current technical capacity, education and technology transfer, market signals and government policy will all influence how rapidly and to what extent a new practice is adopted.', sources: 'IPCC 2019, 2019 Refinement to the 2006 IPCC Guidelines for National Greenhouse Gas Inventories, Calvo Buendia, E., Tanabe, K., Kranjc, A., Baasansuren, J., Fukuda, M., Ngarize, S., Osako, A., Pyrozhenko, Y., Shermanau, P. and Federici, S. (eds). Published: IPCC, Switzerland.', + citation: + 'Sanderman, Jonathan; Woolf, Dominic; Lehmann, Johannes; Rivard, Charlotte; Poggio, Laura; Heuvelink, Gerard; Bossio, Deborah, 2020, "Soils Revealed soil carbon futures", [https://doi.org/10.7910/DVN/HA17D3](https://doi.org/10.7910/DVN/HA17D3), Harvard Dataverse, V1', license: 'CC BY 4.0', }, }, From 529113b4397bf820148856f1683941c4176ef21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 10:36:55 +0100 Subject: [PATCH 06/15] Add new TILES_URL env variable --- .github/workflows/production.yml | 5 +++-- .github/workflows/staging.yml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml index a53a8b5..f10f7da 100644 --- a/.github/workflows/production.yml +++ b/.github/workflows/production.yml @@ -20,12 +20,13 @@ jobs: ANALYSIS_API_URL: https://soilsrevealed.org/api/v1/analysis GEE_KEY: ${{ secrets.GEE_KEY }} GOOGLE_ANALYTICS_KEY: UA-179817360-1 + TILES_URL: https://soils-revealed.s3.amazonaws.com/tiles with: host: ${{ secrets.SSH_HOST }} key: ${{ secrets.SSH_KEY }} port: ${{ secrets.SSH_PORT }} username: ${{ secrets.SSH_USER }} - envs: NODE_PORT,MAPBOX_API_KEY,API_URL,ANALYSIS_API_URL,GEE_KEY,GOOGLE_ANALYTICS_KEY + envs: NODE_PORT,MAPBOX_API_KEY,API_URL,ANALYSIS_API_URL,GEE_KEY,GOOGLE_ANALYTICS_KEY,TILES_URL script: | echo '> Source nvm' export NVM_DIR=~/.nvm @@ -47,7 +48,7 @@ jobs: echo '> Generate a deployment key' DEPLOYMENT_KEY=`date +%s` echo '> Create .env file' - echo -e "PORT=$NODE_PORT\nMAPBOX_API_KEY=$MAPBOX_API_KEY\nAPI_URL=$API_URL\nANALYSIS_API_URL=$ANALYSIS_API_URL\nDEPLOYMENT_KEY=$DEPLOYMENT_KEY\nGOOGLE_ANALYTICS_KEY=$GOOGLE_ANALYTICS_KEY" > .env + echo -e "PORT=$NODE_PORT\nMAPBOX_API_KEY=$MAPBOX_API_KEY\nAPI_URL=$API_URL\nANALYSIS_API_URL=$ANALYSIS_API_URL\nDEPLOYMENT_KEY=$DEPLOYMENT_KEY\nGOOGLE_ANALYTICS_KEY=$GOOGLE_ANALYTICS_KEY\nTILES_URL=$TILES_URL" > .env echo '> Create gee.key.json file' echo $GEE_KEY > gee.key.json echo '> Build the app' diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 8d42a85..5b866d9 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -20,12 +20,13 @@ jobs: ANALYSIS_API_URL: https://soilsrevealed.org/api/v1/analysis GEE_KEY: ${{ secrets.GEE_KEY }} GOOGLE_ANALYTICS_KEY: + TILES_URL: https://soils-revealed.s3.amazonaws.com/tiles with: host: ${{ secrets.SSH_HOST }} key: ${{ secrets.SSH_KEY }} port: ${{ secrets.SSH_PORT }} username: ${{ secrets.SSH_USER }} - envs: NODE_PORT,MAPBOX_API_KEY,API_URL,ANALYSIS_API_URL,GEE_KEY,GOOGLE_ANALYTICS_KEY + envs: NODE_PORT,MAPBOX_API_KEY,API_URL,ANALYSIS_API_URL,GEE_KEY,GOOGLE_ANALYTICS_KEY,TILES_URL script: | echo '> Source nvm' export NVM_DIR=~/.nvm @@ -47,7 +48,7 @@ jobs: echo '> Generate a deployment key' DEPLOYMENT_KEY=`date +%s` echo '> Create .env file' - echo -e "PORT=$NODE_PORT\nMAPBOX_API_KEY=$MAPBOX_API_KEY\nAPI_URL=$API_URL\nANALYSIS_API_URL=$ANALYSIS_API_URL\nDEPLOYMENT_KEY=$DEPLOYMENT_KEY\nGOOGLE_ANALYTICS_KEY=$GOOGLE_ANALYTICS_KEY" > .env + echo -e "PORT=$NODE_PORT\nMAPBOX_API_KEY=$MAPBOX_API_KEY\nAPI_URL=$API_URL\nANALYSIS_API_URL=$ANALYSIS_API_URL\nDEPLOYMENT_KEY=$DEPLOYMENT_KEY\nGOOGLE_ANALYTICS_KEY=$GOOGLE_ANALYTICS_KEY\nTILES_URL=$TILES_URL" > .env echo '> Create gee.key.json file' echo $GEE_KEY > gee.key.json echo '> Build the app' From e1c963ab5da76ca4d56b66473bde50791024ba76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 10:37:49 +0100 Subject: [PATCH 07/15] Load land cover tiles from S3 bucket --- api/tiles/land-cover.js | 41 +++++++++++++++++++++++++--------- api/tiles/pregenerated-tile.js | 12 ++++++++++ 2 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 api/tiles/pregenerated-tile.js diff --git a/api/tiles/land-cover.js b/api/tiles/land-cover.js index 99675a2..88cc4dd 100644 --- a/api/tiles/land-cover.js +++ b/api/tiles/land-cover.js @@ -1,6 +1,8 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const getPregeneratedTile = require('./pregenerated-tile'); + const RAMP = ` @@ -45,8 +47,13 @@ const RAMP = ` `; -module.exports = ({ params: { year, x, y, z } }, res) => { - try { +const sendImage = (res, data) => { + res.set('Content-Type', 'image/png'); + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (year, x, y, z) => { + return new Promise((resolve, reject) => { const image = ee .Image( ee @@ -55,18 +62,30 @@ module.exports = ({ params: { year, x, y, z } }, res) => { .first() ) .sldStyle(RAMP); + image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { year, x, y, z } }, res) => { + try { + const image = await getPregeneratedTile(['land-cover', year, z, x, y]); + sendImage(res, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(year, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } }; diff --git a/api/tiles/pregenerated-tile.js b/api/tiles/pregenerated-tile.js new file mode 100644 index 0000000..e14e458 --- /dev/null +++ b/api/tiles/pregenerated-tile.js @@ -0,0 +1,12 @@ +const axios = require('axios').default; + +module.exports = async params => { + const url = encodeURI(`${process.env.TILES_URL}/${params.join('/')}.png`); + + const { data } = await axios.get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }); + + return data; +}; From 07df393ca3bd3ea6e4f17dafd408d2fdd49cabd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 10:37:59 +0100 Subject: [PATCH 08/15] Load recent layer tiles from bucket --- api/tiles/soc-stock-recent-change.js | 54 ++++++++++++++++----- api/tiles/soc-stock-recent-timeseries.js | 60 ++++++++++++++++++------ 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/api/tiles/soc-stock-recent-change.js b/api/tiles/soc-stock-recent-change.js index 42998a2..5a327f9 100644 --- a/api/tiles/soc-stock-recent-change.js +++ b/api/tiles/soc-stock-recent-change.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const RAMP = ` @@ -17,8 +20,13 @@ const RAMP = ` `; -module.exports = ({ params: { year1, year2, x, y, z } }, res) => { - try { +const sendImage = (res, data) => { + res.set('Content-Type', 'image/png'); + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (year1, year2, x, y, z) => { + return new Promise((resolve, reject) => { const collection = ee.ImageCollection('projects/soils-revealed/Recent/SOC_stock_nov2020'); const image = collection @@ -29,16 +37,40 @@ module.exports = ({ params: { year1, year2, x, y, z } }, res) => { image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { year1, year2, x, y, z } }, res) => { + try { + const depth = LAYERS['soc-stock'].paramsConfig.settings.type.options + .find(option => option.value === 'recent') + .settings.depth.options[0].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-stock-recent-change', + 'stock', + depth, + `${year2}-${year1}`, + z, + x, + y, + ]); + + sendImage(res, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(year1, year2, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } }; diff --git a/api/tiles/soc-stock-recent-timeseries.js b/api/tiles/soc-stock-recent-timeseries.js index ce85141..49e440c 100644 --- a/api/tiles/soc-stock-recent-timeseries.js +++ b/api/tiles/soc-stock-recent-timeseries.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const RAMP = ` @@ -15,8 +18,16 @@ const RAMP = ` `; -module.exports = ({ params: { year, x, y, z } }, res) => { - try { +const sendImage = (res, z, data) => { + res.set('Content-Type', 'image/png'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (year, x, y, z) => { + return new Promise((resolve, reject) => { const image = ee .Image( ee @@ -28,19 +39,40 @@ module.exports = ({ params: { year, x, y, z } }, res) => { image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - if (z < 5) { - res.set('Cache-Control', 'public,max-age=604800'); - } - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { year, x, y, z } }, res) => { + try { + const depth = LAYERS['soc-stock'].paramsConfig.settings.type.options + .find(option => option.value === 'recent') + .settings.depth.options[0].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-stock-recent-timeseries', + 'stock', + depth, + year, + z, + x, + y, + ]); + + sendImage(res, z, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(year, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } }; From c01d139d7948f831f5457b401a8e9e28355431ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 11:12:38 +0100 Subject: [PATCH 09/15] Load future layer tiles from bucket --- api/tiles/soc-stock-future-change.js | 55 ++++++++++++++++++++----- api/tiles/soc-stock-future-period.js | 61 +++++++++++++++++++++------- 2 files changed, 91 insertions(+), 25 deletions(-) diff --git a/api/tiles/soc-stock-future-change.js b/api/tiles/soc-stock-future-change.js index 938dd21..234fee4 100644 --- a/api/tiles/soc-stock-future-change.js +++ b/api/tiles/soc-stock-future-change.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const SCENARIOS = { '00': 'crop_MGI', '01': 'crop_I', @@ -45,8 +48,13 @@ const DEGRADATION_RAMP = ` `; -module.exports = ({ params: { scenario, year, x, y, z } }, res) => { - try { +const sendImage = (res, data) => { + res.set('Content-Type', 'image/png'); + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (scenario, year, x, y, z) => { + return new Promise((resolve, reject) => { let diff = ee.Image( ee .ImageCollection(`projects/soils-revealed/Future/scenario_${SCENARIOS[scenario]}_dSOC`) @@ -69,16 +77,41 @@ module.exports = ({ params: { scenario, year, x, y, z } }, res) => { image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { scenario, year, x, y, z } }, res) => { + try { + const depth = LAYERS['soc-stock'].paramsConfig.settings.type.options + .find(option => option.value === 'future') + .settings.depth.options[0].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-stock-future-change', + SCENARIOS[scenario], + 'stock', + depth, + `${year}-2018`, + z, + x, + y, + ]); + + sendImage(res, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(scenario, year, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } }; diff --git a/api/tiles/soc-stock-future-period.js b/api/tiles/soc-stock-future-period.js index 99468b8..925df38 100644 --- a/api/tiles/soc-stock-future-period.js +++ b/api/tiles/soc-stock-future-period.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const SCENARIOS = { '00': 'crop_MGI', '01': 'crop_I', @@ -27,8 +30,16 @@ const RAMP = ` `; -module.exports = ({ params: { scenario, year, x, y, z } }, res) => { - try { +const sendImage = (res, z, data) => { + res.set('Content-Type', 'image/png'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (scenario, year, x, y, z) => { + return new Promise((resolve, reject) => { const baseline = ee.Image( ee .ImageCollection('projects/soils-revealed/Recent/SOC_stock_nov2020') @@ -49,19 +60,41 @@ module.exports = ({ params: { scenario, year, x, y, z } }, res) => { image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - if (z < 5) { - res.set('Cache-Control', 'public,max-age=604800'); - } - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { scenario, year, x, y, z } }, res) => { + try { + const depth = LAYERS['soc-stock'].paramsConfig.settings.type.options + .find(option => option.value === 'future') + .settings.depth.options[0].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-stock-future-period', + SCENARIOS[scenario], + 'stock', + depth, + year, + z, + x, + y, + ]); + + sendImage(res, z, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(scenario, year, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } }; From 2b8f2becb897536c859f3a5091224c2197c5681d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 11:28:14 +0100 Subject: [PATCH 10/15] Load historic layer tiles from bucket --- api/tiles/soc-stock-historic-change.js | 55 ++++++++++++++++++----- api/tiles/soc-stock-historic-period.js | 61 ++++++++++++++++++++------ 2 files changed, 91 insertions(+), 25 deletions(-) diff --git a/api/tiles/soc-stock-historic-change.js b/api/tiles/soc-stock-historic-change.js index 45ce9be..5cff0ef 100644 --- a/api/tiles/soc-stock-historic-change.js +++ b/api/tiles/soc-stock-historic-change.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const IMAGE = { 0: { historic: 'projects/soils-revealed/Historic/SOCS_0_30cm_year_NoLU_10km', @@ -64,24 +67,54 @@ const RAMP = { `, }; -module.exports = ({ params: { depth, x, y, z } }, res) => { - try { +const sendImage = (res, data) => { + res.set('Content-Type', 'image/png'); + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (depth, x, y, z) => { + return new Promise((resolve, reject) => { const image = ee .Image(IMAGE[depth].recent) .subtract(ee.Image(IMAGE[depth].historic)) .sldStyle(RAMP[depth]); + image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { depth, x, y, z } }, res) => { + try { + const depthValue = LAYERS['soc-stock'].paramsConfig.settings.type.options + .find(option => option.value === 'historic') + .settings.depth.options[depth].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-stock-historic-change', + 'stock', + depthValue, + '2010-NoLU', + z, + x, + y, + ]); + + sendImage(res, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(depth, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } }; diff --git a/api/tiles/soc-stock-historic-period.js b/api/tiles/soc-stock-historic-period.js index 3a60407..f62fbde 100644 --- a/api/tiles/soc-stock-historic-period.js +++ b/api/tiles/soc-stock-historic-period.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const IMAGE = { 0: { historic: 'projects/soils-revealed/Historic/SOCS_0_30cm_year_NoLU_10km', @@ -58,24 +61,54 @@ const RAMP = { `, }; -module.exports = ({ params: { depth, period, x, y, z } }, res) => { - try { +const sendImage = (res, z, data) => { + res.set('Content-Type', 'image/png'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (depth, period, x, y, z) => { + return new Promise((resolve, reject) => { const image = ee.Image(IMAGE[depth][period]).sldStyle(RAMP[depth]); + image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - if (z < 5) { - res.set('Cache-Control', 'public,max-age=604800'); - } - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { depth, period, x, y, z } }, res) => { + try { + const depthValue = LAYERS['soc-stock'].paramsConfig.settings.type.options + .find(option => option.value === 'historic') + .settings.depth.options[depth].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-stock-historic-period', + 'stock', + depthValue, + period === 'historic' ? 'NoLU' : '2010', + z, + x, + y, + ]); + + sendImage(res, z, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(depth, period, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } }; From d2f1963b16a397aa510b182ad93a6d78c30b024b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 12:09:18 +0100 Subject: [PATCH 11/15] Load experimental tiles from bucket --- api/tiles/soc-experimental-change.js | 54 ++++++++++++++++----- api/tiles/soc-experimental-timeseries.js | 60 ++++++++++++++++++------ 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/api/tiles/soc-experimental-change.js b/api/tiles/soc-experimental-change.js index 42f3401..00426c9 100644 --- a/api/tiles/soc-experimental-change.js +++ b/api/tiles/soc-experimental-change.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const STOCK_RAMP = ` @@ -33,8 +36,13 @@ const CONCENTRATION_RAMP = ` `; -module.exports = ({ params: { type, depth, year1, year2, x, y, z } }, res) => { - try { +const sendImage = (res, data) => { + res.set('Content-Type', 'image/png'); + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (type, depth, year1, year2, x, y, z) => { + return new Promise((resolve, reject) => { let image; if (type === 'stock') { @@ -68,16 +76,40 @@ module.exports = ({ params: { type, depth, year1, year2, x, y, z } }, res) => { image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { type, depth, year1, year2, x, y, z } }, res) => { + try { + const depthValue = LAYERS['soc-experimental'].paramsConfig.settings.type.options + .find(option => option.value === type) + .settings.depth.options[depth].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-experimental-change', + type, + depthValue, + `${year2}-${year1}`, + z, + x, + y, + ]); + + sendImage(res, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(type, depth, year1, year2, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } }; diff --git a/api/tiles/soc-experimental-timeseries.js b/api/tiles/soc-experimental-timeseries.js index 5dd9813..6f23777 100644 --- a/api/tiles/soc-experimental-timeseries.js +++ b/api/tiles/soc-experimental-timeseries.js @@ -1,6 +1,9 @@ const ee = require('@google/earthengine'); const axios = require('axios').default; +const { LAYERS } = require('../../components/map/constants'); +const getPregeneratedTile = require('./pregenerated-tile'); + const STOCK_RAMP = ` @@ -29,8 +32,16 @@ const CONCENTRATION_RAMP = ` `; -module.exports = ({ params: { type, depth, year, x, y, z } }, res) => { - try { +const sendImage = (res, z, data) => { + res.set('Content-Type', 'image/png'); + if (z < 5) { + res.set('Cache-Control', 'public,max-age=604800'); + } + return res.send(Buffer.from(data)); +}; + +const getOnTheFlyTile = async (type, depth, year, x, y, z) => { + return new Promise((resolve, reject) => { let image; if (type === 'stock') { @@ -59,19 +70,40 @@ module.exports = ({ params: { type, depth, year, x, y, z } }, res) => { image.getMap({}, async ({ formatTileUrl }) => { const url = formatTileUrl(x, y, z); - const serverPromise = axios.get(url, { - headers: { Accept: 'image/*' }, - responseType: 'arraybuffer', - }); - await serverPromise.then(serverResponse => { - res.set('Content-Type', 'image/png'); - if (z < 5) { - res.set('Cache-Control', 'public,max-age=604800'); - } - return res.send(Buffer.from(serverResponse.data)); - }); + axios + .get(url, { + headers: { Accept: 'image/*' }, + responseType: 'arraybuffer', + }) + .then(({ data }) => resolve(data)) + .catch(reject); }); + }); +}; + +module.exports = async ({ params: { type, depth, year, x, y, z } }, res) => { + try { + const depthValue = LAYERS['soc-experimental'].paramsConfig.settings.type.options + .find(option => option.value === type) + .settings.depth.options[depth].label.replace(/\scm/, ''); + + const image = await getPregeneratedTile([ + 'soc-experimental-timeseries', + type, + depthValue, + year, + z, + x, + y, + ]); + + sendImage(res, z, image); } catch (e) { - res.status(404).end(); + try { + const image = await getOnTheFlyTile(type, depth, year, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } }; From 842a572b438bdc378c27614a6b49b9cf316e45d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 14:04:44 +0100 Subject: [PATCH 12/15] Update where to get tiles for experimental layers --- api/tiles/soc-experimental-change.js | 13 +++++++++---- api/tiles/soc-experimental-timeseries.js | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/api/tiles/soc-experimental-change.js b/api/tiles/soc-experimental-change.js index 00426c9..68220a5 100644 --- a/api/tiles/soc-experimental-change.js +++ b/api/tiles/soc-experimental-change.js @@ -105,11 +105,16 @@ module.exports = async ({ params: { type, depth, year1, year2, x, y, z } }, res) sendImage(res, image); } catch (e) { - try { - const image = await getOnTheFlyTile(type, depth, year1, year2, x, y, z); - sendImage(res, image); - } catch (e) { + // Until zoom 9 included, we only retrieve the tiles from the bucket + if (+z <= 9) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(type, depth, year1, year2, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } } }; diff --git a/api/tiles/soc-experimental-timeseries.js b/api/tiles/soc-experimental-timeseries.js index 6f23777..4c7e56d 100644 --- a/api/tiles/soc-experimental-timeseries.js +++ b/api/tiles/soc-experimental-timeseries.js @@ -99,11 +99,16 @@ module.exports = async ({ params: { type, depth, year, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - try { - const image = await getOnTheFlyTile(type, depth, year, x, y, z); - sendImage(res, z, image); - } catch (e) { + // Until zoom 9 included, we only retrieve the tiles from the bucket + if (+z <= 9) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(type, depth, year, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } } }; From ff4c13101c59e2cda2ccca1d00fb1c2e2406b430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 14:11:25 +0100 Subject: [PATCH 13/15] Update where to get tiles for SOC stock & land cover --- api/tiles/land-cover.js | 13 +++++++++---- api/tiles/soc-stock-future-change.js | 13 +++++++++---- api/tiles/soc-stock-future-period.js | 13 +++++++++---- api/tiles/soc-stock-historic-change.js | 13 +++++++++---- api/tiles/soc-stock-historic-period.js | 13 +++++++++---- api/tiles/soc-stock-recent-change.js | 13 +++++++++---- api/tiles/soc-stock-recent-timeseries.js | 13 +++++++++---- 7 files changed, 63 insertions(+), 28 deletions(-) diff --git a/api/tiles/land-cover.js b/api/tiles/land-cover.js index 88cc4dd..0d0d2e1 100644 --- a/api/tiles/land-cover.js +++ b/api/tiles/land-cover.js @@ -81,11 +81,16 @@ module.exports = async ({ params: { year, x, y, z } }, res) => { const image = await getPregeneratedTile(['land-cover', year, z, x, y]); sendImage(res, image); } catch (e) { - try { - const image = await getOnTheFlyTile(year, x, y, z); - sendImage(res, image); - } catch (e) { + // Until zoom 5 included, we only retrieve the tiles from the bucket + if (+z <= 5) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(year, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } } }; diff --git a/api/tiles/soc-stock-future-change.js b/api/tiles/soc-stock-future-change.js index 234fee4..631d311 100644 --- a/api/tiles/soc-stock-future-change.js +++ b/api/tiles/soc-stock-future-change.js @@ -107,11 +107,16 @@ module.exports = async ({ params: { scenario, year, x, y, z } }, res) => { sendImage(res, image); } catch (e) { - try { - const image = await getOnTheFlyTile(scenario, year, x, y, z); - sendImage(res, image); - } catch (e) { + // Until zoom 5 included, we only retrieve the tiles from the bucket + if (+z <= 5) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(scenario, year, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } } }; diff --git a/api/tiles/soc-stock-future-period.js b/api/tiles/soc-stock-future-period.js index 925df38..2158d0a 100644 --- a/api/tiles/soc-stock-future-period.js +++ b/api/tiles/soc-stock-future-period.js @@ -90,11 +90,16 @@ module.exports = async ({ params: { scenario, year, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - try { - const image = await getOnTheFlyTile(scenario, year, x, y, z); - sendImage(res, z, image); - } catch (e) { + // Until zoom 5 included, we only retrieve the tiles from the bucket + if (+z <= 5) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(scenario, year, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } } }; diff --git a/api/tiles/soc-stock-historic-change.js b/api/tiles/soc-stock-historic-change.js index 5cff0ef..fac6aee 100644 --- a/api/tiles/soc-stock-historic-change.js +++ b/api/tiles/soc-stock-historic-change.js @@ -110,11 +110,16 @@ module.exports = async ({ params: { depth, x, y, z } }, res) => { sendImage(res, image); } catch (e) { - try { - const image = await getOnTheFlyTile(depth, x, y, z); - sendImage(res, image); - } catch (e) { + // Until zoom 5 included, we only retrieve the tiles from the bucket + if (+z <= 5) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(depth, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } } }; diff --git a/api/tiles/soc-stock-historic-period.js b/api/tiles/soc-stock-historic-period.js index f62fbde..b6481ae 100644 --- a/api/tiles/soc-stock-historic-period.js +++ b/api/tiles/soc-stock-historic-period.js @@ -104,11 +104,16 @@ module.exports = async ({ params: { depth, period, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - try { - const image = await getOnTheFlyTile(depth, period, x, y, z); - sendImage(res, z, image); - } catch (e) { + // Until zoom 5 included, we only retrieve the tiles from the bucket + if (+z <= 5) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(depth, period, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } } }; diff --git a/api/tiles/soc-stock-recent-change.js b/api/tiles/soc-stock-recent-change.js index 5a327f9..6fe4d85 100644 --- a/api/tiles/soc-stock-recent-change.js +++ b/api/tiles/soc-stock-recent-change.js @@ -66,11 +66,16 @@ module.exports = async ({ params: { year1, year2, x, y, z } }, res) => { sendImage(res, image); } catch (e) { - try { - const image = await getOnTheFlyTile(year1, year2, x, y, z); - sendImage(res, image); - } catch (e) { + // Until zoom 5 included, we only retrieve the tiles from the bucket + if (+z <= 5) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(year1, year2, x, y, z); + sendImage(res, image); + } catch (e) { + res.status(404).end(); + } } } }; diff --git a/api/tiles/soc-stock-recent-timeseries.js b/api/tiles/soc-stock-recent-timeseries.js index 49e440c..d5c498b 100644 --- a/api/tiles/soc-stock-recent-timeseries.js +++ b/api/tiles/soc-stock-recent-timeseries.js @@ -68,11 +68,16 @@ module.exports = async ({ params: { year, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - try { - const image = await getOnTheFlyTile(year, x, y, z); - sendImage(res, z, image); - } catch (e) { + // Until zoom 5 included, we only retrieve the tiles from the bucket + if (+z <= 5) { res.status(404).end(); + } else { + try { + const image = await getOnTheFlyTile(year, x, y, z); + sendImage(res, z, image); + } catch (e) { + res.status(404).end(); + } } } }; From f7c680d534129588dddbbe4e91dfa356d9a87b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Wed, 9 Dec 2020 14:12:26 +0100 Subject: [PATCH 14/15] Update the Cache-Control header --- api/tiles/soc-experimental-timeseries.js | 2 +- api/tiles/soc-stock-future-period.js | 2 +- api/tiles/soc-stock-historic-period.js | 2 +- api/tiles/soc-stock-recent-timeseries.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/tiles/soc-experimental-timeseries.js b/api/tiles/soc-experimental-timeseries.js index 4c7e56d..1a4a049 100644 --- a/api/tiles/soc-experimental-timeseries.js +++ b/api/tiles/soc-experimental-timeseries.js @@ -34,7 +34,7 @@ const CONCENTRATION_RAMP = ` const sendImage = (res, z, data) => { res.set('Content-Type', 'image/png'); - if (z < 5) { + if (+z <= 5) { res.set('Cache-Control', 'public,max-age=604800'); } return res.send(Buffer.from(data)); diff --git a/api/tiles/soc-stock-future-period.js b/api/tiles/soc-stock-future-period.js index 2158d0a..98b46ae 100644 --- a/api/tiles/soc-stock-future-period.js +++ b/api/tiles/soc-stock-future-period.js @@ -32,7 +32,7 @@ const RAMP = ` const sendImage = (res, z, data) => { res.set('Content-Type', 'image/png'); - if (z < 5) { + if (+z <= 5) { res.set('Cache-Control', 'public,max-age=604800'); } return res.send(Buffer.from(data)); diff --git a/api/tiles/soc-stock-historic-period.js b/api/tiles/soc-stock-historic-period.js index b6481ae..194174d 100644 --- a/api/tiles/soc-stock-historic-period.js +++ b/api/tiles/soc-stock-historic-period.js @@ -63,7 +63,7 @@ const RAMP = { const sendImage = (res, z, data) => { res.set('Content-Type', 'image/png'); - if (z < 5) { + if (+z <= 5) { res.set('Cache-Control', 'public,max-age=604800'); } return res.send(Buffer.from(data)); diff --git a/api/tiles/soc-stock-recent-timeseries.js b/api/tiles/soc-stock-recent-timeseries.js index d5c498b..fa3048e 100644 --- a/api/tiles/soc-stock-recent-timeseries.js +++ b/api/tiles/soc-stock-recent-timeseries.js @@ -20,7 +20,7 @@ const RAMP = ` const sendImage = (res, z, data) => { res.set('Content-Type', 'image/png'); - if (z < 5) { + if (+z <= 5) { res.set('Cache-Control', 'public,max-age=604800'); } return res.send(Buffer.from(data)); From 3eb1ae9b9f017ebe9abaee69ed9d1d55334852b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Prod=27homme?= Date: Thu, 10 Dec 2020 15:08:15 +0100 Subject: [PATCH 15/15] Revert change not to load tiles from GEE --- api/tiles/land-cover.js | 13 ++++--------- api/tiles/soc-experimental-change.js | 13 ++++--------- api/tiles/soc-experimental-timeseries.js | 13 ++++--------- api/tiles/soc-stock-future-change.js | 13 ++++--------- api/tiles/soc-stock-future-period.js | 13 ++++--------- api/tiles/soc-stock-historic-change.js | 13 ++++--------- api/tiles/soc-stock-historic-period.js | 13 ++++--------- api/tiles/soc-stock-recent-change.js | 13 ++++--------- api/tiles/soc-stock-recent-timeseries.js | 13 ++++--------- 9 files changed, 36 insertions(+), 81 deletions(-) diff --git a/api/tiles/land-cover.js b/api/tiles/land-cover.js index 0d0d2e1..88cc4dd 100644 --- a/api/tiles/land-cover.js +++ b/api/tiles/land-cover.js @@ -81,16 +81,11 @@ module.exports = async ({ params: { year, x, y, z } }, res) => { const image = await getPregeneratedTile(['land-cover', year, z, x, y]); sendImage(res, image); } catch (e) { - // Until zoom 5 included, we only retrieve the tiles from the bucket - if (+z <= 5) { + try { + const image = await getOnTheFlyTile(year, x, y, z); + sendImage(res, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(year, x, y, z); - sendImage(res, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-experimental-change.js b/api/tiles/soc-experimental-change.js index 68220a5..00426c9 100644 --- a/api/tiles/soc-experimental-change.js +++ b/api/tiles/soc-experimental-change.js @@ -105,16 +105,11 @@ module.exports = async ({ params: { type, depth, year1, year2, x, y, z } }, res) sendImage(res, image); } catch (e) { - // Until zoom 9 included, we only retrieve the tiles from the bucket - if (+z <= 9) { + try { + const image = await getOnTheFlyTile(type, depth, year1, year2, x, y, z); + sendImage(res, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(type, depth, year1, year2, x, y, z); - sendImage(res, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-experimental-timeseries.js b/api/tiles/soc-experimental-timeseries.js index 1a4a049..d93b979 100644 --- a/api/tiles/soc-experimental-timeseries.js +++ b/api/tiles/soc-experimental-timeseries.js @@ -99,16 +99,11 @@ module.exports = async ({ params: { type, depth, year, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - // Until zoom 9 included, we only retrieve the tiles from the bucket - if (+z <= 9) { + try { + const image = await getOnTheFlyTile(type, depth, year, x, y, z); + sendImage(res, z, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(type, depth, year, x, y, z); - sendImage(res, z, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-stock-future-change.js b/api/tiles/soc-stock-future-change.js index 631d311..234fee4 100644 --- a/api/tiles/soc-stock-future-change.js +++ b/api/tiles/soc-stock-future-change.js @@ -107,16 +107,11 @@ module.exports = async ({ params: { scenario, year, x, y, z } }, res) => { sendImage(res, image); } catch (e) { - // Until zoom 5 included, we only retrieve the tiles from the bucket - if (+z <= 5) { + try { + const image = await getOnTheFlyTile(scenario, year, x, y, z); + sendImage(res, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(scenario, year, x, y, z); - sendImage(res, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-stock-future-period.js b/api/tiles/soc-stock-future-period.js index 98b46ae..9c033fd 100644 --- a/api/tiles/soc-stock-future-period.js +++ b/api/tiles/soc-stock-future-period.js @@ -90,16 +90,11 @@ module.exports = async ({ params: { scenario, year, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - // Until zoom 5 included, we only retrieve the tiles from the bucket - if (+z <= 5) { + try { + const image = await getOnTheFlyTile(scenario, year, x, y, z); + sendImage(res, z, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(scenario, year, x, y, z); - sendImage(res, z, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-stock-historic-change.js b/api/tiles/soc-stock-historic-change.js index fac6aee..5cff0ef 100644 --- a/api/tiles/soc-stock-historic-change.js +++ b/api/tiles/soc-stock-historic-change.js @@ -110,16 +110,11 @@ module.exports = async ({ params: { depth, x, y, z } }, res) => { sendImage(res, image); } catch (e) { - // Until zoom 5 included, we only retrieve the tiles from the bucket - if (+z <= 5) { + try { + const image = await getOnTheFlyTile(depth, x, y, z); + sendImage(res, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(depth, x, y, z); - sendImage(res, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-stock-historic-period.js b/api/tiles/soc-stock-historic-period.js index 194174d..13b71b0 100644 --- a/api/tiles/soc-stock-historic-period.js +++ b/api/tiles/soc-stock-historic-period.js @@ -104,16 +104,11 @@ module.exports = async ({ params: { depth, period, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - // Until zoom 5 included, we only retrieve the tiles from the bucket - if (+z <= 5) { + try { + const image = await getOnTheFlyTile(depth, period, x, y, z); + sendImage(res, z, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(depth, period, x, y, z); - sendImage(res, z, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-stock-recent-change.js b/api/tiles/soc-stock-recent-change.js index 6fe4d85..5a327f9 100644 --- a/api/tiles/soc-stock-recent-change.js +++ b/api/tiles/soc-stock-recent-change.js @@ -66,16 +66,11 @@ module.exports = async ({ params: { year1, year2, x, y, z } }, res) => { sendImage(res, image); } catch (e) { - // Until zoom 5 included, we only retrieve the tiles from the bucket - if (+z <= 5) { + try { + const image = await getOnTheFlyTile(year1, year2, x, y, z); + sendImage(res, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(year1, year2, x, y, z); - sendImage(res, image); - } catch (e) { - res.status(404).end(); - } } } }; diff --git a/api/tiles/soc-stock-recent-timeseries.js b/api/tiles/soc-stock-recent-timeseries.js index fa3048e..60aaffa 100644 --- a/api/tiles/soc-stock-recent-timeseries.js +++ b/api/tiles/soc-stock-recent-timeseries.js @@ -68,16 +68,11 @@ module.exports = async ({ params: { year, x, y, z } }, res) => { sendImage(res, z, image); } catch (e) { - // Until zoom 5 included, we only retrieve the tiles from the bucket - if (+z <= 5) { + try { + const image = await getOnTheFlyTile(year, x, y, z); + sendImage(res, z, image); + } catch (e) { res.status(404).end(); - } else { - try { - const image = await getOnTheFlyTile(year, x, y, z); - sendImage(res, z, image); - } catch (e) { - res.status(404).end(); - } } } };