From 4cbda7aa9ea6def25de16fa4188453b54edd4b2e Mon Sep 17 00:00:00 2001 From: Felix Gateru Date: Fri, 25 Jul 2025 12:20:10 +0300 Subject: [PATCH 1/4] docs: add mgate blog Signed-off-by: Felix Gateru --- blog/mgate/mgate-cluster.png | Bin 0 -> 38523 bytes blog/mgate/mgate-features.png | Bin 0 -> 48326 bytes blog/mgate/mgate-test-flow.png | Bin 0 -> 27435 bytes blog/mgate/mgate.md | 424 +++++++++++++++++++++++++++++++++ blog/mgate/mgate.png | Bin 0 -> 43198 bytes 5 files changed, 424 insertions(+) create mode 100644 blog/mgate/mgate-cluster.png create mode 100644 blog/mgate/mgate-features.png create mode 100644 blog/mgate/mgate-test-flow.png create mode 100644 blog/mgate/mgate.md create mode 100644 blog/mgate/mgate.png diff --git a/blog/mgate/mgate-cluster.png b/blog/mgate/mgate-cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2957fd743108d7b4e119c15f8ef8d5e35760bd GIT binary patch literal 38523 zcmaI7WmuGfwl)kS9U?6-gdkm_#L&&q-JMdB(nw3g&><~DcXvvMbV*Bh2@(?T!`|my z*ZKZ@e@0YhW<9Idz3vsRtO&)%AjLpHK){xfmQY1N0KpIt5G~M9fPb;DuoeLRK>Vx< z6+@^P1MedsP$9@jh^l)S9%Z6xs}Icg8?{QAMUe(CcoQ@JUG2k*jxeZZW-40n7OjQ{ z8W0eAJNOeG8C0cf=k}vS(EcUuJdJ9;Cte7)I9>7G@w|{&SM;`YyKb}`<4rhPYIIoZ z3MMp0)<*n>A>a!R&sl#pIeZ(2>2ZI>oYkF>usDYc?(S_j!s<*dv zX9_>+{?$45+AE63wL_Zsvi7z5*@Vgxh8$ zVHcgZ=FOda&5ZR$TbVlI-8<}GWD&7Gp;eAq4)NtN8&@3G7@t1fT$$wS4Sp(Q{rlMQ z?&}e{YavVO_f7z$DWZfCdu1^k<+;#dVHWS@ zcz6gKBR9CYihDbIW1^<&k1*wZCvbVR%DS_c);*c188+|(BQ*}>a{qU|TQCZ|V^5>y9>@`@y+{EK` znLjV12<-8vZrzW9dbx#|$qXXcKuImg-1Gc3r)DXQt*_4>%LgsaSP%hWCJVZcrw2?b zp*WJ;t=}&fBE&Pn$xMr{ZfjEYHNA@+@Fw-*vRh%y11$KLd5 z$)QG+ZAL6Ah%W+Y%wV+k6j}JpRM$aq_I#N<4jjpBdI9|IC%*@#(l!a&Fu zv`l9uU9NjG)poh##X=Kho_cl8)-X3agLri%uO^GqmsXG7YVg^4w+ZKgVmo0OAGS9S zwZFE+dv7-f<2L8>xJ&>1X*ogNZ({on+wKr@$s*7)N4_lb59m^f`LJF9n4-%HWAMQk zEMy9HJAT>!MVJ!8%e#JcIG@Vnhpt(v6Ei}rL}S)Z$u$<8^TB=9w8`%@=Izg??Ge9N zZadvPg>*WZtJh%HcxJ==ub1;YkjH+&<@*TTt3&_{Y0Ww2}#GnLUJUX$x4btqZvXZYK6DPKNqp3lUYb?X3Jpv(`~VQt~PHu6=%_{rxLQh30hJlvlzUg z7|%K;Mq)8~UHej%41HGXc(*Iy9TvF|3Z>8&iG!KqceCCgQqCew4a~L2hwppBj;~eo zq+tzq`tRo55r2%652*D)7thk6HY@_NTRKGWXL}am)FauirOyF3yt$!H3$g_ust|LY@_^OJ%}> zInSt7u{oF__iYtm75MWxws~Fg4JTK^f>7Ns!w$9<@wF-pd&137MKyn9G-GZaY}Z1( z*}y#^F@5#SmiXY)2@|ukap5Q9b7~_*X#R+LFXj9gjmClcpivHiVf&Z22RIab7~{Fw zX16uS9*-NyOqwOpKgnKfiWVbbm^)ow8wKR7=t(@p!Rc~j@GaF#w1wt87Tx#g)~(~` zU%%SZC{cwX&;^*?MsOi#xE(H{?~Xxp^5syMZ)iY~#Own|m5fcVom53$MIRrhH)=N- zD`G(!tXDvPVM)jnb@sEM`HF{t11_@lyZS$SzeZk+VISl|ug6ST08zW9X#bpT4XH(u z90vE8cq4JvThEhlm1q!BWllge=o4eJXl0Z8%E?mBHe*PtJ|0W8c|M@Dd$~sEhZfv5 zG;mjE!JBVy$0U-52}Qk4SMU2wALAd(^|+t`V)@lB)szQw<-xRa$(UhpjbFwz6**R>eHNSoQqL0{S%|ksEpZf{I>Ch&UV=0k_<2@Jjjmzmt zL^!_G<|KT8L3I>SiTbqn-+R$35-|2(?jG`QsUR#ET?3T>ShFjGU;+ttb->ftgUZvZ z-mi4l|7Vwdo!>p=rrBetM!WSRNriqh%wj~7nuSyQ{&BW+ol;U(MSsW z&Hb(1XsG+p)Had?A(J{45o9X#%X&#ZgVvl%ov0>XVCf`0qy#xwz|$FBE_ZF2q{yJP zpdWsy?-^k_KNbyCU)?&jaxb6DlNEA}QuVKyK9Ul`&BUMYb&8$suN!`C&MTV=HRkLgO*$kH^@;Tytwo{yKo_{nE2$NLZwyUX)IdZe5dfJ~}nS6(f z%}Li3sgUs6wB4M!xu3F@DIwuq3fvYNbU15hqel`j5@3QqSpKAim8uoUGcMlToYUy* z`w}NJ&gNoZxV&w)iW8=0(-*5Ph~{t~i}FDD_6Ck!VJH*?*e3F0+T*H}Hd^sh$?QQN z#+JwRU-J9=j~l;(piPeFc*(cyuUy~SZmo1y^!uAV-g{1dH*+^JNx-OIxoni$U=VP4 z-1tG-YQOSPzzZDCxVjl!e=@rNSvvbod(p+!p_WtLmkS97K z+%^R!c4A7KvEJ!oDBzg4R%t|rz~8Eh&KB9ipnH*S3*^Xy+4A5=3Ln$i@uXHXx6?)N zw0)m!{rbsC$iXaAB>dx$X@Tz0xC5>j4taM2t8HK9(3-Z7!yT^bmZ<{Y)y@K#)&oyZ`@hMKgF7G-zeY9ZR!#B=HR}# zj!#x;^g7`AGQ*G>#h1D1WIXohMeZzmlE*^dJ!z5romgRW7_gm7!;eMP2b+S^%4YMH z!dS37^^~QL$SnGZyzA1?B=Z&Bra?-~o!cDUdM1yj--6tB%OTa9^d>852)LIbly|M} z4n#TCZYy-S2(@&MB*Q7}m`h+}(RIo0m*OEXB52!|7IdI^t9GHGJhG@z_pP$W`F${2 z(d!RhsW%@)btZFzIUGegwa2F?ohPX!zs78StKC&;RW$qUAS0sr-INszyr88`HS}YL z*Xk|NXf`YC8@;De4DU`}1LKXw*pW5I`a*+(9AZ{as3!&{jm|$($P>(Vek>fW#TSyr z?bGm@Mlx0HSGzY3oww3JM>~HoW$sf=67{!NWzE|4rp1n!+U*}- za69~>_`J+k|Gn6^-K*ZL#q;_^@PNlEqTV){Myn!&dLmChm^AE*3qK0jK$ly*!D?gwZ!Fc5(3IRyL2k6PLf#6biFWTB=F+ZmWVByy3U{%d z4lgndWE{$s2%ww(INGlyY$1^{Mt*km>$CD>KTYW0oD@AjeV{EO=jTSl-1ZL;ciPw@ zIY*SHO#4uvgoitK&{b{NuDdrmO-_KEMJ&66BLIuS6LP*Z zIXu!=>LPuJ7V0_`_6XY=NKnVI z4!J!O+XRCy63KE~wd}bdDix+Wsp*1$VNQ4p3FA!UJ*B!gKwsRQ(@lfi8!PE~9={C% z6H&8-rR~TFMcdoIKth|$N)@za0=h6pP(0^x!Uds?jes+^MI_BJVg%ZFGAkLI0fcZ< zO0<*yX)zRs5}i^91ZAwB65bh)A;6rI z6Ax=ZW&XuXR6H^8;xV}sAR|^9Jc;|KWQaM6B+qa3MGjl{SGksNkyXF>0!Dx3Hx`e{ zs>dn5*^fPu>#0_q?EUwMSmji&;pCM+)Tn@=e)gMMsB*4Eb?OzJ2lJ*f`pJXWfUH73 z5@af+)nY^o{mEiH;Gs8#PPWkH;Vye)Kg&f3mPE>aj^l8;ns zSL;g1f94QG#zKaXe0Ye!KGZVZF5y~ebE7mff^=1_)3oO3#ku%i0M-4OIN$F^ zx&2}W)_5eC`M$$U93LLP;Lf=k`4m(+wcF#e>{kZQ9K zOw2nLN~5pjd`xAHi~jHePK_5RFYy!=&6y3_oa-G7}!~K7I-R*Xy-CI7>*X3 zWttMLrXmllW!-77KhmK&M9+sO*HGg6@RpD5Mq0i<|f zBOyQkz~E!Y^B*$5$5h(#@GA^>>8FTsA#8dL82oO?Z*Dp>@=9vhbx8eL_1uh4vz}HM zE0G|oU8#w8C0@}eduyFIxzyQI4CW4_xE?7L_6!Cs5>adKbh@OXzcH}DkzlSiv%MSn zBa)`xLy|P#>vT)3lU6&QsQ7&nZM?5fg(p%COKoO{IpQB5u6+<;s>)#G_(|Lk%}rJ> zU};n8#ep=p#10EhlKP)Sg3DSGNh8We5-VpXCxv#T^%4x(SpDWxPa?V}1J_bLY=9VG z2IkHK=HAWe6i^7#fV)FhSNS-?@77e_KjUaGSDBr^709GW`qSJpk7aB#`?J`8+v6hi zyLS?Iiln)s&6mjKRPE%l4pX8OMqgV^VkU|-iKUIB-ZS8@#}`)9WlGT`ciR0+hzPV9 zS+5?;L&d~RmpSlcO9^?(8il=n9?q(uTd2CD_(=It}42YnJWB~nuHiD(iwRM*R6(2 zd(5T_L0-rMPpd3L197ktbTAI3PzXuw4)ycUTWjn6Tbv<)hTM*bNmU9=Jn*wsChp0F zO!3;jg2S1?#A&(J67^{0i&BIUyx;>0)?Va540WGIEHj8Gd@Z4`+I-0L_169y--0^% z&3^CAnIUCF7*IaKH-F{Jy^uJ=L%w|rc&nOATg5(HeF-i?qp)AEevPXG-sfeECc33k zCE(w7P3npR?e94U9BPgCji$pA^N-L}y-Tc11W=>HcuVMblFFCddYkBq{wht#egmmb zClt$xOBoSy=C_(U&g}BPX#9y$1wv=aVTF_wq~#p$l0NNFm%W@b+>%I+&kqm^+Y|Q( zZ!-?3%Ze3Ss$Ugso`uFxY>prPuCDkEr+Hta{uRkivRrpol910dHrgjfQVXOV{o|H?HJ`|G>xe&vt+$Urc#wQ z(pKKRZ@uUzb4Ioa0JOF<{8!D!j`wS-Z%Go>HO~R)<@~$EJmJom9@h2gL!7ze{lCW- zP73gYhhUeV7 z@s%PnWk!u+$FqJjA>3YXlXoP6)<1otcVb=oZbI<4`S08>IqK@&aa0Mg{1;l4#O`kR z^4#__2x^7$5)Gd^d%Ye;kfE|OLQeNqEJnC!vRT3|X9!M(yxVc=^^o{vRdp^zty!j| zceXnOaal61<&***XtLiVZgnw<1}izrlbQBZmR#oBGcHw}ra7%;D+#ZECY+QN79Du| zt)Uv2zv3xL>x$}c`1liLVc{d{_Rw4Zg7h5D{9-|T{l0u2RT6-LX$ zPua!P17`Y;UmotFrP}d;+`9WBAjoX1Xuwqmky%TG%u&E)&#FuvKk?@7n&?JzH4p$?y#1X%fy=!L&=ZF?~eR? z?wEgr>Bo9(J5?+#^WqpeS#S`)kB3!4e2|a;6!tnQC#T(mlsuYZg+J2!Te0#TZi{Cy zY~oXm<-onC5UA>8<)0qdM9`Cz6)&OF^PlG1C(ZVi;Pq1bhqYd8CiP`Olpvv^JpOhW z{tFWLpl%K1T^NI1C6JKdL! z4q{MofBfS4&Sg*p5tcaCSFYubh*AwRkX{kJZ+Z4CoM%fhk~b1 z=Hbp2&&Prc1jZ--8iKl~efg(woa3;>mR~=HP`MBxh~^X%DCQG7h<06Zq*|``bjqdb z`7r72$qoZ%7VRp6bZ!TH<3weqm$RZaveu$RBsC2aKiQD1{|9A?MEYf3{+e^p;6`sU znk>70TPOBZBGTKFGTkHlcQ6njp z;iWio$t*AcC;_H$vcZy#BKH2zdqqvQ|GFQ936Tf>T~nGqt!A1EB$du}PrP}dTw;#? zyHfH{b~2X$u~fzk9c=keUc7t}yYDJCk6p*8KkDko?<&C!OtEygOcl7U#(5vLeFVOp z;j02Hm`l&3gMwbT@wesX&(l5+qa$LS5NH9X1Hge_k zXPQ+~yf|necHJ(g6u)?;WCiWv?&^o|Q`-+%rYMKjmCp^3MijnZl5=Jm@blzGtz72> z+RPrp-A_->yQ=lBg{&5;gly)@LXuhe(K@SMk}rmJq1}-gAkyDLN?r`)>Lwl5aIo$n&pJNoNFCE^eiP)N%4Z-&5_yp z4f_m^0HE~4OJ=~Ygi*21Ge7-3Wa?&rAq@u0%se!`tqER~4+oNMohpFzFn_yw1Ng0S zp?}4C5h)mc@F(@zM<2QJ>(FAF7`~JMKo4eD)0b_gKsN{64pAf+y%LyU{ueo~^D}N5 z-W-%tW^YcO_phc@vy`62N7eJc7>yVgZ734#Ks8?3c@EaEqoMHz5XLXVN z*%8a$*G0;t_$|A96@78{Ic!E95jL|-n_EL4Hd51fGC0hnaJyyD6Y)XN2<7}+Rc{LHv=)0qMA_W@EkEM%q(7?m-|nxs_|cFYc2mt z9wCCDvjp^uZHo%z;QDVbgnKada)CaTt;C5OP}M6825cC5{>H@HW*b?|2)--u9tE>T z@Y9s1ZV(N*hHb*LI|;s73a+FklnoR(d#W__KHtc9Tv%)N3Az#FZN!Jf2iJR`LzOqo z0pw=G!3B$zJilZt#ux?*VAf<|2Vv|f9>l@v*9)VBa}Aa>sR<)h*QMvibNk5OeE~Xb zc-%R1yT#Qt znlN062&zDupeLeyMu9uJxm?Ao2o|P-*$&ayN}QWIx}TCeF!y0YCU&-et`|ki-bc|g z0sU%t>F{S$WUM^@hIQ%KH~DE{WE$mnpMem|W5f-!mbH%ipoNS3P39f6d4gf$qr&?8 zxDGM0NSgeG3A$(dlk+zaigLT3EE6*FG0>vx)Sw9|QQ#123Sa!r6M07EBc-QuB_q%% zp%>z%28GpUOOdutd4GraZpB+%7V2&BYs|-37V`$xZBi;661q6VL$IoTswm%ZsMgu& zW15)~L2LR|yT;D(3z3fEjo{`^Zyob&HwEr+a8>5U#;!!5rv%3D-HzUVrNF`)*i%&j zyd@{p8A-KRJ-)ZGr$1 z0s?V6cjse7*;o1<83_Mq0bs4SSk=ssJ-#+^A_nDP=g2}k;12Az@ zs>}vZIPDg7->S|1ElTT(Q$2~II3)Z$U(EzjHA4D5Z8=IL%4pQ_MKV8P`<>^-&1>6I zz?*P4EskWv+v4(6+FR<^clp&Mh6a8<6w8=t0J9^#@YLU9UAR&BcDy1hGkokX|X(=L#)!T19@Gx3$_c`K>8hLE)tK=e74I=V?w7@B6z0BVq$! zVyGuwW@9!ML5^}|j%ir85@E!eBMjIKKEuDc($WjMvOa?44VtGl))VK)l(-^7YeY(S z&N%<3DZf;{GnF=qcnywjCtbW6UoXm3yeD8bZozmRiQuZN=O|u~MjrFKMW&nb zwYr6+kR{qX0n?enm$)=Oi@+w|Se700D?!f#tQyOake}(GxDS>uqyIF!>_XWyIc=*Ovk%35PNx1G)Ank^*Duz&PK{8ej-@2c)skPufq{Sn=kKQmA{ zyN(D8R&W9Pv1yE4CIM8}LlAUv&ZTUnFq?iVUyk0{T-SE;KRW!?5FOdSoLgzw2^;z? z!wXT$t3OlzP%U~9XpTeE2_i#Ubh<+1v7io(rj)N2)cFX&D7qe-p$yX!LlWj;T z`J^=qV!}xw=*2SiQ6YPYAigqI z(P_3Rmp-m@{X-hPxkz3Iweu_CVe9iDpExw1Nezd%Qp>;1NO6vj@UM-xa60U#{cYR& z--Q^RVW5w~I>h&0I{Jz$z^r7Zxc4fE_(u$;$nny+T2y#WV)vx(TDQk)nSUHX)kjCp z_^svgaE2TlNA;8*=h(tlKtFvE#L<8!BdHF*ai%!~3jh>}qbmCqDI`=oLLMI1qY0F8 zqc)@!NktwkmG9|(gK0Mh+ce5-Y6_lg=-{BB#@;Q;e7-`ZkiHRYQeyBmB^JJjRB#1( zJFuJRk0C2|68iSRQmXw z3QjoOgf%7BX_UytD!xjfB>+z8ZQ84FZQ&}ii2PWjo1fe7M5`1hX6J`)CkZkjEp!>@ z>L!)Eo<3In&kAZ8SV2XmXdBt6;X_m#5EQQPYasDYkN_sasWAU<^7UhF<)xpQ$i=2>#h&LhD(@8dQ0#6&IC2a)|@rHo5JNoa2WbLOFg_(99R zdvcUGHng%9bcXrTq?{=Fw`i~m&TfPGd z0gtyKFUc8HhkrPOiM*(f9p2=j zFDVI0kOz_1cjdqJ3ZY@?kE|E{Da~enMs>$9-a%~WGi?sQ$2Rw;jKk5=;mwS8FNvpB zME+xb+7<0Q#zqF@tfHN>Jh<+~Lv15FtNqV!!hYdRs2x(#B^zO>fx=*L>AJEu8V1p5 z%;#O2DgYnAWvKDKrik`rt4AJiCbTi0>gAwzuvsp$0W#Uo&_K~T!~r$>@vt1CeLk7M z_ZRTII=Qr+LJXKol>ESK9{!4tVk3{rBxgku^L){9%#{0NH9PXLG@{hhOWN!)48mbk zk*AKF9Lkir%-*;ghfXdeWV~|SYW172sWiLQ8o`|i)#ArH>~s$I6HuJ);kNKoj^YYk zk!mwFgL_%QU1Hgq_k{=NLwVepEo~(Iig>5%q2dw$s|Y*2ISgB~RyTvMv?+@pBjNjP zg=f+mj9t4QlbaY{gX{HX3zgt;v~nMv%#&usI!q{qeItnb(q`OlJS_;7Nx@v(Re21{ zU!5aMcFyYRhhU&!*~q0YXd!4=%v!}kKHhFQURO+F2#g1*)LTQlb`9e*sqD0A7y34s zu!MHYF#mM)O{ws8OjqbEfSy@r#552M06Wz0P$hRnbMv2{o$H8`1uy7lI6IsCw|K1} z$*4#h-D^Ci_piA2<&zB*9=4g4@d8SdF^be!3C>sQ^(gZcGchbO!Do62QhSr7l*z1_ zF+EUNWO|I%QQb#O;!)9RQ%Td=!Yk|jDGGpC0jH~qJ_`h_W0CyztuF1sO>B@BFaK^g=MZ4UCyU)tq`Y-21>OOjPuh2_LWUc#v0xh=Y%X;pNVOKiw-8A{>vAN8TVOlSLQJU$5GdZjhEISc&i(C$>9?mZxC=Rq zKO^00YfcIif!e1z{l!v=F>26;k#?D9?VFXbGYa&$euMsb+=KxHg+)7bbg=sg7Lnos z?(YG~3a()iDC{sX_v`(_UNS+Ae(ZKIENu{v!+8DO?^;fCN541>s6hlyi&;9Xf3F~8 zJ%<%UGy+lo0nWBA(y1lQ7}n@n;OObYo%=7M9Vx zn+xbbZFTLkn3;2`p2a{f!GNKP;h2mRoOYulh2r88SC9GygneaIFUpag|8CQ+j0{y^ z6biv6XXvU{&A-SMBCHYNw%>|M<0`>$Ow4#3`kn>rFlzJo&ha2UTar|to=PYTz;K5f zwM+38!{1~DQJ`u%=oF~T#v#v9-e?8Dbwj6-Q|=y0nZdxajz+B@`<>me#7wy!b8;WY zcLGYMQ@v#00)5xZQ#~HGe$u1cGfeaX%1Qf=bN>i};8zvx_2U`clZ);M2fnY2*jE1Iccvs_n`jC zQQbjub3WAd6jv@&FbJMs!7?66_|6}6-(8eB7#^@0cw4K|DXNA$8qchyhzk)fR-mR_ zAwv9Mty+k<-8r4OA$~`eFS@^&4}YDA6z}3*9i&F6d=RThz7(-}F6fN|j3f&C(7YwK zy7Wv}p*|w$p}u<-SJ(Prt3TkGE}C6$yC;zhitt`QWmRgJ9LWn5uDf@~jbeo!aHvly zkZZvJ@>jmplB?2#vbWNjzDPhh@<2@Gc;yu*%+3ax8rQ1O$5)xXe(Z<=*8TkvC3MVm zl6v$?S@O$yleJLd%Utqd9FSF*<7L ze)QAnnZ7??(?N_>1+c5>EOY+oTcw@_S}uQ;ep%!*C}!w7a`o zs5@@*FbG!4Q(^GQ^uzk^s%H}FZ(dSGn8jqf9`RqN83nP5K41mlqW^F@AM=`bG^o!Q znZ*#XhFePTfqv4=Mh1>B9uVMutm+;;zTRp05+K65!c$rPL3AI}{$S|<$TpP@ zIrQb#Iu$}Y!)SC`#51K=WUhaj9%d!@cIW_NTEyQeRHqqD$tj7P$0-n>pV>W0pcOvQ zi}6}J;B7xzZxkB?1WE2b<-5s)?$N2$I@jh2792r`G^J8MCiu?|otFf;yF_bHpy(rP z?8^4yu;<-KUpqq)f{zKcRb733-;di44%QD4CWiMseHhwskhzXd3k$+-&p5o)mTbX% zyq}23b{UO`)AFwC3-}fZv2>0`=R*B8zYWqSJ3E)O-`Dd4&R;{JIgz%{tlB(kt@nwb zsnt%$eI~KLU(x5InuOZ1U?IBLC!vH@j>v;|9zypZ3aC^Bj*RR}`w{dXKiy{cF%bxd zXRRHyrWl6G_Qj(xM3;jjwM-w$Nv&xTR~7RHjoqI)$juZqCiV zLiN9vE4Z~=$sU8&l=~~b`m0-GC(X&G|FwEx2*!=44MKXmIJ0SqRoQiY6^{2W-tYzN zUQU)fDocDK*F=hT53?j)ycd=WhSr`+<2uzn2{$)c*F+Xz4cG+LxeL_0LmIQVf zeXsY5MkhN){hk^E%A@V)I(s##tF88X59qf~@4S49D$+0SFk_mi{QY60jMpWibB;!@ zfrrm^f`@n+HRkP&jhATo8=5WZ&XRyViK{_n2+Um=Z;KE_U+RpyAtQH>TgDr91${xM zVKWppSLY<<9?2a5anrxYX5Z|Ir5|3@#ZHdcz z+QxmJu~1cWr}UqfXV-}pMZ{m7{-Q#=ZRv8lsFPyiNFGc;l|5K>7TE;QQ9d2gAQQ7* zev2`|X1#v-?~=Pg?3VJAGnFj~G+48{Ee$YT<<-XIbE}y}*wpa}@lm@LOW6Ep$Y^ln zM(C){h3t-38Ca{KFiB_nzeO@nnH_XfszuDFS(1Ri10=J1l2u{v2-Ax8*rn!T znQ`cTHwT2Nyol(Sf@M_UK(g}cYJ;C6%T>^L7@IN(;I{2vSe;a z$(_yj9t2-}3g7({O^!u&~H2K@o(WQ!v$qOct z{G$(Rx%JkC_QprI<%VT0H4+N2LVR?U1Z4~BE>rQ zerrMI>sn`aUXcy(*RNdNP%*`f{+i>~cg{EdZ<}d7E-Aw+qDi$^h`*AFE`7bKe!Mfr z*H^Fz?OiV_%UUL7er1FxG|sbc;4}kgc7`NFDH6G-cn5_SI`O9igA9~o@@B%bPeKF=!y)&n&IQA_+Yo{n%P`f_J%6`D2$7|WfnQxhJ9#*95d&oufVLZuH9zo z7pXXF#S6bZXd>5nE<aEI zFMNy$jsX|`@bT2_2~9+FirH2PZiP;Jlj=t42cKLoE;MXD3r;z?_S7h9Zg&8k(YJpYmd^#f%wHM! zvh(O1Hg}rBB^iAlTQ4yQ{Yq_YZ)mHwZ`D@+t942%jmcRo*j(Ko&x&D&oHO*6A3qsC zK<)cX35*@(Js3AB)a2r(GvJe^hM)+AE$@nfUyk-Soq8YhT1(6KVZiv%*FeD2`=2k{ z2fDJI$Ap)Sts4XQ4Q2a-C z1OO$M!-ON>%x1{Bci#rQsjxLd?K|gJ%wvr12#1m|f@R zeG^~xpU6{c4#@BVi+<97->xN+y?%2Y6fB(_)wViX$+G+fN6E;yci|*h!R8D&CJ0<^ zzWX+ldMTJ{Tj{XA75Vw@M5^-miR2NDzF|$Qr@|su&_SyG?^XMG@0)Qt1#Zq^L+E++ zI|vgSKvwy$2^eye9NRuS&^f1k3is>ueV>VL%NrlC$z$@@gP1j&d(@0kwV>Mwmsz>0 z3)16aMcuya>rD(bg63$CVcguE662F-Oog6P-%)1pd!f7fRi<4IW6XQ}J0}zp^84EV z>yT;ry&jm5IFZc!Kjk@*V1fs-!#e%4c>3{^teT<=OAI`#hueEcBKt%Ci}@IZMp;KJ zA5T)Qh{pFJTSUKh%Znm!?#9(npyXOSzkvI*!Ge+hUZ9n#0oYPoGB855&5fu-N7fk} zEPyh+KT!W%hNGT4|H?kI=Zg7$cJe)BSdRn+>Urm6_gpm0fP($g>^x5y6$Sc7n_Z2P zHVEEE2;3wUQqF$_3wSXs;L`=< zVeVOHP!g_q=JtF9W^K49YnHBKog=+@OKDmqSlum~lnngSXXHJEsg?3-Dy`Y!eS6rC z=o%0P0}vMeVJM#hSz#yydX)zIJLyF;u~FDC*`Gby$H0@zd7h*I4jokieClKhmCOqu zQ^f1vSD`%jO?KETU2zJ=7wWrOhT0XAC0F2 zvW#j2CitT(@chEAMqXYY2v;=>0s4xTT2FmIjvRMDwkx*kTyh{)9& zLjK#vo@W&S6bC>>B*05~N--=M5OVk(WOzEpw)Qy{KXcm*BL{$&LyHnPKxzN4Pkabp zjG=^XoNo@$aS+*(el0I&1xAT7>tP}ut!GhG|5qLvf4J()P^nknx+l?cNA}~XIDk=S zx2H$)!*5(-fD=p3&HZbObHvqEnd<$;kY9a#clY-w|3QkCmV*gAEskWsU;9-J8+}Q@ zuG7)BeZY9$H5o-5+&vjZ6yxu-k;k}qu!sVzydvV3Qf?pp*!opO0tdn(wO)~25xnsh zn`}}McR8KwgS^-VeE@n8=iOOSb>uu^u;FJ7UH6RuCWf;T`0Ft&zj#J%m);b>uJsP*oZbkkjK-^$#h? z>&v&bXIJ0MV;`IFZ!zS*orD^F-r9iM-l`tdBcnjuhf6&+v0xE$Hc8meQS9~{#ry5t zIwa}!R>2CkDOHs4)mhDo7c~N29z4c)@^^0%`FOEq{cyfgyVi{c#p|W`7JNxMi79C# zNDCEKlF5RD);nj%U+ukHpzRX_oJlF9H=6yv|HYs;hYN5Pf5e)=&u^#czalx{uNPqq zT%NupZ|xZxLR4!TIOL4+dwSqOF?O{P8Ig^jb^15A@OiF=PxvDO5I5LVHGu{|+%Oan z@>qngTMcfTJ96eN@?8R~WYtCh<`wIgZ)kGgB?aif1EfQ>yW^7px_W=RtME$w%H3Uj ztwXTy190SqdARnMywwTd@w>Pk`@aeLx7iaK1KfF$n`?|FeLy`rmfKuuy|yXOo`LZ> zegV$UoOc;RdP4tpO@5ajO*QQF4RSr?`7XEnGL_TQOQ7^%EVDaRzyd`v8!M7423W<> zP;cNFw);jG4Kn1(rMxWFWD|vfJ99lp{#G#?;FW^rO}Ygr6IplB+^@TV`}&2(d|=x`)QN-sE7S?U&1q-mJCattMyuf$ z{qmj;9(4e-6lW}#2hKHy_pFY~fpoEi_*^NbZI92+&{)o|Ln~ua7JcjLA-=a4$Z{za zT?br;PWKA|9(LH|+$c}?e{hJ{FZ!PEAYHyi+-xp-{!YKPg^BI0t`OqWNA<&@F)Def zFR~<7MUB^W%hsxp|NTAbT53F1E|>CAFH>fdS$_>~BYq(ey4g>OOX{l5GhnymZZgMW z1aPHI_v<*-Vf!A~5}r6DJoeL@iw$M4RD zIEhYp@%iXiJ3knFbk(BO!+=LXqgy94Ly(T{ITptt4P-fl3M({N#gL3F|QToLP>tK49Xn2kUoV0CswmVLmw%(c zIoqoTPF?VlVTUuJXlr8*aHa(U$58wV1@4ipo2qtR~P?*)4LOcf}cdetQC){{y09Vk-Z| z$)l@=zu8Jl{Y1Gf{dps$Urpb3WMM3iLssg!QHu-VGcP&YcE&|2f`HNStm`CI2spVx z;b}Y>OyR+~yCg4~^CEK>|DOYLCo#wN4pkS2<+QHz@$~C=ruPD1J}-*XRX>r(Hr|O+ z+s_`C_Ce-D@w5yZ<((%q?+-{y)bF$9!cR&L4S}-Ze!MYvnRyV|_c_`4^jrJjH-6}7 zcD96&s9h-E-tS3rik?m~)|1taNM5y_jpgvq9#4;g7(|R=CnqZ^jg!~LBUyG{8#9yB z8*5u?N~f8s`;(oh$zu<`s^S&Ob@O=--0rvFnKGjfa}!y@-T}WKLTCOX_#Y!BfuPp0K_OAS^Xx_(mVfKCH|a3pyCUu`$5Sfz9op#hH|&`yR1g?B4?5v+ zN^q;UgNo(CS@lMfp21h12ZPL*O@IL=Rv{o+?LO{ivXY3QBaMnf5^k;5{?4cWQ*_*> zQy+b#+1_`Wg$9fAo9TcTCa<|oS;n#jnV#=+7CAn@job{mVpf?O5*6TgoBpBDQ z=RAGHp&CVFq=V?=zwwYvxItU@%R_!}aD;EDqHC~z$YO&{ z4aF}kl?zW5C@_ogvO&E5A6ai56;&6ujZ2p(NW%b1BPAuHfG7$>OQ(c%!;sP-(lB(F zFmwt^cehAO!w>=zf^>eH=Xu`W`+e)T7Jsl7hnao$zRw-kb>G)Hq-SWRij7*3P& zM?P|7XKRojsuy&`=~aahg&YNs$LvW6OC!^`p@TgYB^TjGRAyc;@ar4eLO|8ePzAFtidqh`E z+LuD_H{M{w))I6^5-1^L@ha2ZfONJPGwX35N#ObQ>B|p;f^~R~lF7hv7*w5(-(9oO zsIV(6(P$=o`gAitoFOLpqZHfuX>XP&n|@Z_4AL@maCc^iko9f)tKE0cl)jn@F5_&p zI5le%3*@e31yOKm2L^;)fzZF$n<7XsQ)3k{f(&GE-Wr$2?or7fM(s4X*1GK6U+qgL zD8{(L+UUZ9eQfoS}x{A|Ds%+fQgj}+Gg-FbcBl{4C&i;*EAMuNt# zdOO3}9zb9ShU*Vnm8MHON-YX~>->!d5U=;IuVC8?0ysi;i?9#}Zp|$r>hxKmw$4J? zeYOL3@*yhrk_dm%=h6`Mc^m>H~QFLa^fQ~68lRF7`3kZ zFVh2^{~QfapdliP1^jyKUB|61uT~`bFDFO$!-HFH@fplg4p z;RGGK@NjD{LZr_6iG%%==F-oq;Wwo0aX1~=^`XB$9@BNmEx!DO#Wm?%W1$<_x(YciLEkKGB z&uvsY>_z~MVa>Ub$QzxC|C)^s3Pub1et>91Vc|3^mn_lxZ?ae`bf!?-G+GyY|(3@xmRar<Fho-zP@% z`CYT!v31nePOa6P$8mmW?`PGp=O(4!;uZv)+ls{@foka@Ee}29!3`asJ9pXDej>E1 z_Tq%`@b@$|GROrq%S7m6`Eaz8<_nCHwZIIGcmPS zHC=S%czz2W3M?PuA&`=9-z;r8x3gAC8||q4egb8&Av`)eoNsV_bwm5YQ}Z(Oy1``& zGsE)~6Ymb*`NpD~gEvn5)>?n)&9Afj*b{!)dAu~JGRsOR7^On8aJMG^)%fDma}tiB z{79_VP=N~z^!rAmk0tO>29dJIAU(u*R)?;vZilxMIrZ*foPQhp=HnPtobSQu}J<&)HwI4;St|TOv+x*%|}iK6rsBQabZg z9U_OVxv{oxSrNx+7mF~6M85D46SWBin(2*!mw_Xa&-ZXf@kp#*1|VS zJqi`pTB9X<`W)$4nM)6|Kg7#oROF46Vy36BAZ{uK;l@YfVM#ZF{YwRD^+ijy@CixI zlqSmgb7zSQ+Z`jnl||QU$$@(Ajh$(lorbE{{c-H@>v6ZcdqU_KlE)eXMcOH}7tqHw z-_On2LtqonUFFp+8&_DM-6^fJXz6r#z(;YcECE{f{XjNB zb4f~6ug)HepLMXaYG4Xfjb^J{Nfe@@?yYrNmtz#q$a^r_aCmc0h&(%l6#o$F8octd zA-LL&ELL3>K^(;Wm+sSGK=@71)mHg)vQv8FcimpNF{r+=I{CMb?M!WO3Oek-S@g$% zq;K=O9)C+>ng!<~K7v93?H0olDSLSaoea%Mp6)LC_;P~Q^(X;V0Ctvt8~sx7oBkJ92EbB)#uH-SI+k_JU)an z%@b(wyu@pG&`q!U04y!(O&dz&`z_AcH2IX(-t%ay>WktinRi+GOct0dt!Rz>RHR*+ zQ433XU^*5d;E!Er6qS#2nONEhM!bo=cav&KQg=V?PL`5r*9lBfLD<_<$~Yi=#&@=+ ziW$rB1SH?vkLx<4cXR932V-wgY9maP#@K)Wl0LoBIKUtRw-TmUL47G$Wo<9Ok8@Ki zYoV|tWfX}(biZ2+z`ZvelqzJ01dVt}PrT!55s|yOE{`<`L5JkSJn5wm1~=TKJbI+Y zrI4j(cPSVZLR;#NsC*5(LR&lLcN&-$eZT9*x~R%eeEfK9&{ZS|^*p5n>KSY?PWNf~ zUcSMiE&{GpcN33<#Q?}4Wizxfyh1*Zn4d-SM?UDME+fQ-by(Q+i2?#ZM|S{J8#9zm z)pdTzA_L6mzw10`y1>&-nrw>^h3YnZG%90avKMhfeTH`DU1S6i(ldUvD*&oSOq`Jz zIEP^te1))yBBQKU>iXqe*S%|dXB+x~x5|rQgG&WX?M1DWL`0u?A822Ylla5{aw$S? z6A$n!+Jt{;3Bc}D{jcq0+;4fvklRVLsp8%T@@>7HbTHiO1Q zVV7M=z@8Z~=cV&Ha)Yh^2rB-gdfTE1ekcof)mHSkEMFz+_*_3^GJPdez1H|gWWd|= ze}R4(ReJB2!oXEmjY*H);)|x9sOmkS%aP{n@B1|$O*=rZ|Al* zU3+i#Tbp&ifPQp=F;=KDbry`GQOS1QTp^ST8Wi7EG&wD+cSLr4L(&)0zp5ZT=!p z;O*vvnJu8l1cQi*Dqy@&xoxBmEtUoGDo;)lfiC(csomzNaA5dw1HTAQ~-|HDKnljpipGl0}MQoAfLBdH-#m^}4s3X)khfwC6 zw1l_7M^;?*w)d@n0l)v_Uy{ILL$s6t0J=|+ims1KjYk=e?>XWu%M0BqN`r3!?*wy| z{T&YwgwX$rQ!2>Old8*P#&+vL~7Jp<}KUF>u!ht*0eAA->>tg$NU8!wK->mNBRGm5K6E8=bK3Wf8X>PS>bOW!1dH0 z`AQEv)VY1BASq6Lo(S0A8c1mSzcJa-j!y!<#J>RBb`;Dve2&IH6G$-xJrG@LBO-tg z{0F$_0@ud_FLdkcXs97Ao@XBcikW3YL(w#7b)4pQ`gb^0^P7E{!cGsZK9CEsKSNop z_U;!e>`-OLY<@&ux9}>hej~*-!Yy^)d|eLMHo4U*tDtcUpGgz*cd!V6qc?KJ-Et5a zq5s{&YyXviu*4_s;S@j!BIl@)ZQ2EZAK%r+*`nAER{+3 z;)RM5kWCvr()Im4bwfIJGEt~PGF^G~k${4Gc`SbzfYr|()(8FcMC%QfQ6||DyvU#| zuLgC+DkvBS!G+;?0O>Vsfd7j7U7me$8FE0&0;*iC^Ik-Hjh8qUV|i_J(__m^iYyDK zOkv2hBRekx{T-A>atcgqbKP!(~k|LP~!Wy6hw_6i3pivT%AzJ@gXG#HmUAx|?HA0MGX|F~3 z9rK6PA9Sk&i4+7B=SEvj^zXuS7O$MYUDYRict1U{KnmVS#Ks=t+xrp91&bu-(0ZXfve%TD(HbRghO2EVwQ zy7sG1R^d_w^iA9gJ`p;M&=gC|s`?{9(sdTUta|}s^4MsK4qyyx&i^wDqmL_~P29jt zpLpc$ZWjbgqv##YSe`;BXu2jQtrWt3f(N9JL=nzbE&8+?#V(AX3m5|kdvpNMRzmnK zatVN7&D}Ve&(TmS`rBqF4)xDiHDJUJs3UiN0zsGOxgF)G7kTC%j-y_ zuHKiv(QR}BGesgJxCl`XkI(V4j%ewsz0bEsix_w3njaL;*IrQ?!b^uxQj?N0f8;}& zhq3?z*zx$vF8qJVNkNWS%qh-gI$7UCkn*eO8u>?Z0MbM%mL+1u>sxyV}ZbtkJHhBY8#F^TB6eCW46o@_Vv4!WQ0I@#^Y1STkO}!l!J_3WoNZ zXhbuZs;q=2aBAK47ZL6JaJ(z(3twr1Zy6Viw88tG#GwD8x7b>*jaP_D@pQh$b=STAkk4A47Kb}?QlpX z^92MSuq^gc4AU*OwtdlDiS>lAx0;@ZKZBA|GkmlFih6XNdQ0hk&Y!=jmDPO3=Ats;MH5CA+KTYLW z7|PL1mWKdkeg` z&&i4}S0#kKt{KoVDYFs4Dw?zm1dX7Sr9Q8ntr3%w)lh0nSGKA9{zwOHZAaPL8^~-M z>1>0enCv_+PWUD7Iw#hQzMEYFVx=>_1*|;0E{DN4N9mY2#{Ty;C4=$|vZhQNPm zf-4gshGZNkjDrBRWyx~&TAIUN&i(6pOPAc5e-xsaRUzfmcUqmcW;yA<6q7QhL{w*( z+&k{t0aei-4e!yvuy*Mgw}uO}Pyl~+R+`L?NCMHf$Q%oCQ2%6jCJ!Bvqo-((>$0<8 z@@2#F?>pWx>MGEGCSWnw`8d09Q(iz%eBXO{$H4>|FMs@O(lI;Sm{e=<9=v3C zF9j3fIBtK}1sjsta1i@K1dD2=mo5hOs(LC`*3q{M1C};eUMbL+8dpPbs5m>x(qOK3Fu-Y~fqv}5{N5;5{(ckl z9Mk-QI5Xc?p>N~f7mD0osCh!ZQX=vBZ{2e>a5q5os9^?pbf znBxC}Ig6zEWxYwD8{#g6Ov@QVKzvf^F=n0WhK#t3`R?3j@_HxB(i37LNZ>YM*FpU6 zWdnUlUs~qn>Z%Ij&-rTNwmS=~hc75pc3bDlD8q}Hbs+L?u3hv%J@X$bUtP$4-1aG$ zDcCfQew&;UiDV9zdr~*ynTRy3a*j^J9lgFvKHbXM9%Bu!1vo5(dsKk z1^$Y#Ap1QYV>t{b1?3Vl>n9j$D`+eT6}^y}&t!Q6 zztl0y$`q4w5DNju_1k|9^F(}M zNSI$ssC?vB zxf+T9*)In4cz0gsB@ipR4r{qSCx~TzD`{@d*51*9CB;$&ydV~je)F5j60KNm!G*u& z`Yn82qK^RcX0n!>lNQo)ox*Wk<$X@WS5uPRdW(Fu@y2zG zybEh?Rbm(Y#1pL?0T(XuMaO6Q#!4_z6olc2)*H(hgf5zFMk0v?!@zQ4neK_^L_B~N z0TC@<)k0+nO}d*#I7XBE@f%}fCO#mAsjsgO1hDW-1`@i0i5Y)1x;ZL2&sN(cJ++}; zA4;V#f?po*&~zhc!zPL~Rse?&)SJYx38|SfSYHy}y^E>!%yO!Xke)u1av)zI0Z8Bm zdvA(SvjST_>0)i&|BaI#S)4C-@)|T%)4!#$2)R%D{1YfWgO?~Bxw+-!nwROovkNiaWQb zzruHB1WVr4DGO|EZQ%S@DXJ==0;)PXI$rP4y>Qv4^hbuYv?#e}Fkj0$*ULoPnkVyl(N){co1?ydn_Euy zII!Dat4d&`=D`Q;Q8A+Y7|BnJBV%bm@8oMVq&9?*$$qd7FV<9PJ-G%@-r&5exwgM)F=0%9T=nMqkRAyE6z1+qIiZ!`5? znnyE8JhA@yWZ&a?VBS+fEn$FSeDgPUVmy0h`>p{hU8?vbT(%(tXj5~;-m*$RGoc4w zQ2nj#&>WdT@6!`9Rm01>2usy*WB9u-258lGi}&p8?3Rs^_|3j2&DbqAV`(w<$(Y;O z@gT~?e6GWJjk=cr)TBs=uoy3h{(!inTopBpDpbk;R27X+Yh*T@p*yao5qAf+xvP8L zveoi;wU4oWd#>*5gNs4S*&k$(zVea23Qn93O1ED>cm?C(E8SFXO!clHwVtn9Nhx{x z4olr;76DH6tL1wDfZjpGb7)A0k#qehQsao@)KbQ5DBxJlm-4v)(xdpKY!5vt)!L$c zD>N$%DW5wP6evWGh+Y2iKTV#YePZCNo~n#@J0Qi5>wArK*jo_Yx0_fbeyLurM=NMK z{=?Eb(9?W*$vJSFyU(i>T0sP2xRq|Ct-n^2A&w=Pd4V%+-TnF@YmOScuoAo7DZ5>48Pk;SD_Uqox%mS$+2Wxgj9x%x9~)*aYvjEypm+eyaM@ z9YJG0UoXgZe)ea%qc@rn#%VwI&4PqQKIIcgpz({dV`F1+6w=rbc|Mo>uo1dk z%u(Yb6?DiZR5XjBjd92y9c#nvBdoGjid=@V$=j%&+1`4*Dz73atHLL7xAYq}Y%|#X zGHRbqDW~?;I_Wo&yP#Ch1u1_o`KrR8qF?WZ`RaAc@pnvx{H>dn%xJDG<3i(P>u4`& zViwsDqDl$DgbEhnN5=Uj(v>E%G?gaoF(vFe-tWcZBrD@fV@yo1Z}!r64+pPBTs?LV z>dF%-On0B1q@A32m@N#0UoJE$=^kriE|zMowbGee@pVO`lC0NHcURa9<3&AO#>@5f zwSL5~zNO0z?|uL4dpa>0S+2;hpZRa;O|nAWdp}aLvpTQ^?FA#P_xX)`iA;{Zjq{97 zxA^$1i6mnu1_<&E>6UDBa_0X}FMuZRV5-o4kTl5uP|zymYJY69CK4^{_Vl3D4+Cu; zPy0BZ1Ri(X_f?{m6ek_i+%6N@vSm1w!{_Nt@5@d5hH9B75m0SK_Bw4K6a8f)OFF zaz}HY6usqH^KeMJxVr!5E+l-Yp;_tpiDzk#toc}jeyGaC@0OX5SOXdcGhecBOO;5p zz8b^3f{{BIwy!YQ5#%qce={rJ&k|gx2vL;b?3STMGlep6xm4oe zFG7B+ol4qs53@<0TF?6BjxD|!dK{T;Jb!+Ag<@_z6sMVsW+uoR)bVwC^a$Gco_2R2 z7H0?hZu>>CI#O~iNQtKeo19zUj~Ljyz3c}&or7oALcc0XOf`Kze`mj;4wJ6XVCd=lk#USN#M~2q5*{9 zjN-_dIx^QqH`YndIx6`FmlG>^cxq>Km=PPorMBFE659rqNRN-A58t>aa?VHaRWI6QL z59$1(gX`1l&naX2X^@zsQ-<$rej83>l@k zrsO@XUG)nY+r^utGEUkvzNf3DWMe{?dKCK!WlpYTHeMWRbQW_z>qC}!ROW^2qBHB( zWC5anqL@8hF+Yn!!IO4a(E78d&CYuHkDLKnbLA5}IZEgq3CkCLI0wHvqIpoA`{Qc>qV-@T|E_1OwnZRRMx~Ul5MBhu_PE{k^9Ym4tM{WjX@*s#u;P%}-|p<9 zD;u-@(vH8_RVL>3J?UcgX>&ZSPE+mPZ-*yS9v{el0J0S(McVhAi`>tC(flZa*$syv zo3d%rCX;wk8#hJxR_BmE4MkiQ350CPM`22|&Z>(t$Ug!VEefPCVL2u6oHvin|3O$* zxst+Uy|ZVJ8Lop@)`~UayLf%x)rU6|@5C!fYe5`)c4}6B1UmP+P3iXIZ{_};WZaJK z|4=09+*sp4c8~som^qZR+pnrP_VA{mBU-cKJ@VjapWlpwz+_x)UUW8qV_5p!Iq9^a zqx|>Z945>`B3Q%w>U`*oZ;Td-O*fXy9VB#IZc|kxT_g8yPa)1uT&R&Z5M}O9U-{Jh zqZo>9NW^KI5<5K8H{Ijp5qU*{afU?BWN>RYKOpwklTYwX<5^4lV1N4rq$kw`R!z&n z&^%9$zNSZv>n?7kc^Rn-gp7#(d>>IF%>>N546SMtq%eQwzT}A{cEr}P$bpRbSBgHU zG-O9WLLM%6-RwLjP<8l&5VbLw`Ng`51`ohh2-`ucmJ8!Ns0?FC%C2J!v|C=SUa zXSA$e->#+_J$T?UU};&UK??i2_i%EL8U3A_Jp53(nRT;x8dcCNFDXeoB$CE}a7oQx z4>lStaT>@2O_WGz%Gp?ubFA+Pu01?_%5e9q_>eXHn`Qqn9;)`xf7*PZo+R*u9uaf@ zg>iAoO7M!$a+HU7#(?0(KK>Bi=l22ZT}u1_N*#~FeY#7Sy3UDC3Nz~(_%WHng;3{; zf`5c2aOmJm5G1?|lN=(9$Rdtcf~>G`MH()Z6E*c1A_WM+r=)IqVK^`=;( z^YIwWGp>&EdQ7{)F|1U4#`ZQiRW92guMG|f8POIQav<%2z8PZF{^<~^P57{j*LG1U zIpgVt+nj(MHHpGcVOusnv;J^H!jvRM;bJB3;zyHZJyj_hqML}bo%ZU4_ig1?rvW4BCXQmabSr5O6@~flV;t}C=U0@P;fzxY zvQsAh5|nOL!)$CW($26G`LobaaIybfqe~EOCT?hC#Ey7{Ums-V7 z_dIdemYBaM#7!WHyZA3YnrlhXJrQjj@}aIhv1{LY`Z|wLZRXeTyCSf=9Pj`Aq~(J+ zXg9i8X1LC)9cBwv{?)y){4b?%Sxv@y_1B6ZUgNI6zkI{N`(OhPKag9=u6tSUltF2c z1D#pQ%Y)85#I+D;lSOTGMR#{DCtCcD{jH8lB((BP(wx&Rff5lIFTaR9ZqdT9&RQrn zLvKuDRq$~?5KbDYB*tIxX(_(AxTs(}z3P2r+~>$6^KB;_{jH#bvk!?Yf)VlRZVg$g zuVbf@zHbu);^2|wg6V328TC~kF0s@zZpcr9&TdrsSF=m@ZbzxsG0gS7nK0}%nMbbc za=U9pG+}dVj~O)TWOjFqsKMih4VrHB5T@6adC)C_FSA`r4vHC7@g1c)yBh;{5?Ih4 zJVbl&hxsM^uEUF79-C=IPsva`JK`LD+Z3*vp9kcqZMCmAk;9`*FVVq|3*+sTZw9^n z?{hA+@o2ot2%d zosBX40RNSOJk8z2iD=&*Jk5P&f=I?{i4%6jQ(S*f8J$}DEcTY(+Z8~fpj!=b7P%&> zItQ|!lq4}$D{%Q2)s3}bn!I?J{=OJ5h_Eqa9j3sEFh5wY_D7j>>$g~HP_Xr~MU4zU zSB6~SzY1l2rUmf|P|D#I5lL%LQqEz=IkzQE0Q0kpHp7|xyKk{Vk@AKmFMbywaH%FZ zLy<3HK)k_6HYa@*z>B(r7xl6qlMV5-|DN;eNbiY;3giguCp)U3KU?JZVUXvYWmX@r z3Nwq_J$&ewb9?0gJ`zR;9LSEookVJILekZ`$atv=PsV!ien%9Koww763Zu|ZH?A9Z z>Q8n)mS%dTqn=G&*9F!`SiM(Vd{l7KIo9vS%gbwi?#U>k(!x6Qzq$ zDq_|8Ge@GmNOOmsP<>lSsU@HNpx6L`w_yC z{JZ$E_4K~M$b*fALf8ZNT)iVfU<6%wR1{I;kH-*4^1;qg36A}qTrm_3@~cS*M+_3t zDK=HkxHYA34^;66GoI4B?F|)=3wh2dzH4&Fy7IW!J~ou8+E0PcW$b?Vkr~k(!$#vg zKu;`j#>g0&7Wh>3u<`boe8J|Up*wDDlEPAPzH2;`pfq-3k0MkrCF*fq@S-7+eEZ6O z{jK2@tNv1k$Vqo3wAyBjPA#+GlaQqRtDi=ZMkt+fqxHF(3Y!igsL%4dMkx2C0bO3B zs1lXhU^>Tr?B+@OI*0W)Ep!<1xP5U)D)N?$j_ZTw$8rQt*0WtPy~$jN2l~&(qdQlb zDh%2_qIJzZc+!Y_dsa*g4=*~kFS67ZJxiKL7YN0=MjlmAR1g(LU7fBjZuP2YkAYWj zt%TQ&?YA|^lI~xujZ4c>ov1fLCrk7QB6P$eZoIDi#m`6AWZ878FkQUrctW7Ivvp*S z`8`~_QN+Fe(The0KP~o&sm0vxntu1tabu}`+59o#jY1@pB|%(`Xkz5e(M2<3NZcFQ z_WrP2v%Z68&h!#Kj?10YrJT~OI-3(3d@0tmcsBC8$~I3>gS@8z#fJP?MXlNsF8%e3 z`_*F;xLh6I+7AzdNK68QP&M4Hgd=@c;vO%YW7N>pqWa8Z#;E3-oBdASZz1M>Ea06g zKkhHCG)>bdPqHqCN;&&p>((I?HG1$tH3+SN9pSF`uo zcYqohpNyEc$TV?JTqp1I=hX7rLW=5&LPd*|ggP&BFB{xe67m=|x|Fy{gGGvd6~}CF z{NFz)Io#z@zar^k9k>J^@RfX8ws0w!RMi~5DqYCcSDL-wHYVR+!BwPDBEYyBR z@QZk%zNwNjPg#>{(9H^suJDj8?|agx8dHU?+?I*#p|2b z9}*{jesSP;SR1t2+Q~61n$dVVp=5ZLQWC1(lJBicCZ#5T;gv9eHt^&D24{UO}<~rXIN)DExFpXcYSIe;cWy}NPiKKtnw>``c)HZ!*0bh z(?i7VAm>1&xIRWZ@0$eMn0v;=qSe00twVd_|MDTqy!%KiUl2T7llJ#cA1i?HkcsH( z?l+TVo89mI<~VYI1>cx8sulgab4_|5^mBz6$)u}NNc6Ggp4%-3C^Zki#U>-=Q9x%} zazmdiF9NCP=R2RF*jOH06!E{_fOkygi?pzn(~mnQfpYlmEcLg7FohkU(9+bcS#628 z&Ycu6tZsdfZ~kK#uNumN^RPm$|7N0zwr+`KgS`WrQrh=#vgD|-E|USS-{%lUA37#_ zv1rM&@nfKKPW8Y*ICy1Y&t+wT7z2K`WwKf?Owk>g6dc1WLp3V)m7@X)W!e4u{5hA( zY@F0r{*OnozBPD%Tx(QT?B1<@WI-rM*qJu0QM7~$P%}r2stX4rlLrUOX7NxP1HKO| zTqM7E1E(K{3#>-S0R*2|XqW&%cU9bks-njtZUdi73N();`rzm5hjz51Fhs7jFJ_~p zZ=fJ3K}k9|5PqPZzC`p!}5>%YH-g$_GHy!%W1Fr``vF+V;+ zbj!CsXGC||;OQE{u45P*t9-7$C!VxgpB)aZF2?)x^E2|!cGRI?lzkYq$V)vlOYQH_ z#{I{BU)JhC%-+4N2X;fvWSX)-+VZ_pK0;)w!1mhOI2Ni_8kslSsbqd?d&Godqt_hl z74=%xO1U*e5%JddjE_ls9{$P=ztczO#ph+-{R%z~n}|RaJm9q~SM>Vy?}bvW(!f4m zAreGL4A=S1{<-n5&~yA8Io`halQ@)KN(Q$9l9gzw$ddJqv=0r4?NpX!uXMjW+}^5aNMtSEq7iYBm(e_Pa5 z9zIU?&MROjBQIf633Alc%YiCTj){i#$?^=W?2B<5j<4@%!v8$k?MonZt29v~cismE zEtTF{hSv0_cWH{qK?8xwI%8~;$Gc2`)_ij$v^tbQIMg5arYCewaj8r=qHy+6l{pE_ zW5E8;$VDG4old|=unOM~C@a%mlEK7YmzDF9$EyovCyLS!4a$erubh||8^eF*mHu?& z!&eI<7mqzKx#Aum0Y~l|$?{gbl$^^@*ZkHj&!@cb4|9ipXQu|ii8SO>t3_d^~Taf^v74| zzx>GnHdf~Wk>8vn%Isak@qKcU*&hiu0`*FyFk}d}V&QB$tXwziK2`Zj*6i8 z_|dR4dm|UbR#+5ouGO$kIR5=l+1exR-KxFXx5xha-6x#B-UL!REzw-y@bHRqVk=H7=OCEuZ)8$Ttqy&>$*)M1QHrHq>5~c1|kMi}$`=AS9 zb|Mj*4Td|@1)b>}WAZ4mA=tkN>1-Ke!XzCA>AJE&>RHEzfM1Sx@tNAHm-8sk$kbe| zssJB?Q}lOQ(&mm+X>O&G7O)Lm_C6(Rmi2=(n{HeDq65Lb4@ z&3F(CQtYIAy?Y^YFq4QNJKU^djNIvsG{|_E4j!&XG`2 z$TL*IO>-`k#n^m;k^G$Tmp&mW>;}5e`QT5GZ=!};u_qhi+Bj5pnD>GT7K-G55QIv4 zqOkQ9VLP1>gxUzdh$?l$M&m}Hu_3QY*~Y8z!*lJ!MN!4D5<-{(QKtDXd^Oq{DEp_1aV>e*{)$omu_M~jTW znW_E@863_V{{1ct z#4+nfC&61;A6iY8piS6(g7)JgIX@A@?@q?ib@6`w!uo8Q4pmTo-!$H(qu(+VsWsi^ zF5Q}nSqo)Jt__2_Y>rAqHzp-f0%8oPorkw2>U)QPxnXt&stx$>Nv?PGPIz?=Yxv*H zWB!Vrt&-fO;=@dRY9kH?jz)5%NmK#((h*2VP+;4Hf*N+>-lc!>?u=wGB8DA-7Lbmj zyu%%8bmz;5$9Pe`thkDhF(TNa-2hKCXn9e@{2#pISwasOG{_9&pHfJohA5HSX zLl#}rVf)aCi0&#YGswuIXlnDz+!<%ch`NRGx?Ek+L%t!~4 zxzu3s{(zQU223ZV$cHB`yK{xT=3h;R9#+l(u1VGZ`f%(m2NFR{OpL}H)PgEdfQ3Ej zr&pt-2egxKnb~9?2p`7mhy^m3S26}^1mxo(RU;$R-R(@}#rnAfg#B4xri!k!!fG2{ zZ_(;via}!eR_u!OzUUzl;L<;W!jN6CS8Am* zgd|$b$6Mr}m$6?eC!BM^W3Q>-{IgWnc{sA<1-aJtd_#@0`c~ZvLYNfK>rWfbem_S! zo4$U7OR2J%WpNxh|5CZEfy4S4a-Xknyb`~q@i-J*dx0LG)5pft+HaJOjqef=`0E;v z)I^fPd>At>-2l>hR`;F<#-9l%g>z~*6Y?3?tLQ(dbQ1CF-LYFT-z>}kv(%am#sqWG zys183Q~d9C7s((#ldKK-S#ovDfhYdANAo?27X#G5oj)s#_BW7`42xH1cck_1_*@+& zR%%K};(-@cmdoibHoB3#4!YL`M531(ppuffYa+x_i^y00*gybXsN#G?@Pw!UnYO~IxGylr?`+79M;OZmS z#`FDWCrY>5DdAmF%p!ox65{+ zr!ShXwIjMjTTb@OgypXsJ6M)XBca&35M925ob|_D(a5P3Z%t;EU{pbRjxAio>--y^ zL#@|^i^+@@Q#t5F-#AkX{iy#HeYsBhS~h@S!K z`nC@s&WzyVa1&|0jHIi4DA^wZ>0cH`vFTj)x;(FR*WRMo++J*HambMKA84meUguUX zp#*&pLEtT$EE`RnwQe_8C($pw&QHq|Ikg^moa_2IkAELCMHRTF=erPv$U1b6KogEbir`*`@^H+wX6E}{BU;JUInd{Y zzer&#NC|NHIJmrtQ8FD z(4{1-6v~)iRAqKwHm3Dv4~uQxj z$%f`u&rs%U3NQ`w*5SM9SKoGJp3|g!u8kE!&xcYc9gz`@tYo1ldl-J!^ZV&56C z$ybKVlPeXUugIN^$@YMt%#Ltpw6k%$jjaXYNFZ?BS7@oAW;INg@Qn+t_{h2KBUbOpM}I|5Djw8EAGXrTyXhfS;@Pbo+$$|o4Ggfe(llX4 z)aiWFsoOk=8UODwOa?4y$z=)hZ9eClto%GiQuEy*Mx*PRjEF!WUBi594N86B$Q4HG zz!?sE$LB!L143A%UshtKRkGKnc8#nKPrmB&{AbTPZ}&_ZF6T$v#p|2nuwqwmr+!!^ zwzTT}T0hrIGH5tiBmA zGbq^vhydAoeebxPDij%b2fG6IA3Hg}eV)f3A^gfaM;7D~n9v^B)1c}50YCR*RV_fB z{+0^;-9QJfE#UFL<^V;if^rblvV~1H1|V*}GA}{E_(i|=Mf)Le2K}%9HRjxZ4(7k_ zz02?r8Chu(iJKEH5*QSu!-p;n7hv-xS9|@>BVq||nTZ`SGhM+1KCcba^TbOv(+>nn zet8CV1UAl()vZQW1f1h#Ep6m}$nEnT2Ye#!?bjzswYuKG>cTm5c(uW`EZ9Fj6*Ylt ziP#a{tR!HIRQ_j+42aRbGL6cjJ^*>ayVNge^=)RuTFL?bn0115yvW-a$t4pPH#X*2 zTj?QDf;t|%sunAM&kknw0eb~knHcMS+fh>Zb^oj;lTqLAV#P00*zsN!$M~xrI^qr9 zFF^-KnUOc)g)0l48R;JOpoxpr?F%l09-@`x?UYjUVxb!A_RMj_!QRG(`JBtF&Hj<| z_B65MLK^Z?jDrdm? z2I!328E@CfA1C7gP%W80km8I!kjn{w6BrnXEt0!K1`mJkOuklJCHdxqk<;cM&fTF{ zf(93#NCZ!$WWJ01kCtCyg@M-nv-C^nM>Lc_S!-!(R3H&#J!-P*$gVK1A9Wh}r>8tA zRk(i_wR~AhsX0&|j%&V}YyZ{~nXP9BxMYa+^w;-2>$H^5>`AdBsDmYkXqbD`wb!iP z_s_Aj=~P(9q`9x<`mt$?C_Ik^ozL^ZLOt>wjV5~xR@EgNBW0|QUnryLUbqNe!b0c4 zjohQreAG4aGN~jKU_#pHTiGdGI@L?RV#QX9hxEG$a>V#Ho#57^^qR)=MZeAvECPyD3ID;c1 zBr;#Ae6ifo02F1{$^?hu?qSx?dL#OjmQ#E_W2s0NfP&U8&-0qLi!`2$XoHtM9IwRl zx>?(S%BAga>7On7YsRzGx`3hCNV~iILt%Y|6XOj0e*?;?8qNO?mFNR#{C|m~N^< zgy{le;!};j>%9I^E&n>+J39HU(P97``=|-&$pFoGZiG8ZYpZ%b}uvLTvx7`e^(fvNtT?O^Wn$aewrQ&{H!q4FB2OS zksLDpH<9C}ncqVlGF|hI3bat|S%u#1AF2DLNjm7mgMDI^`4TegN)v(;M&8NM)Di!8 z(z}_KB)=(W$jU4^gAf82aOqU)40RAvyv7VFIvk^}6jef(V$zso<#wor|^^};z&OS7IBb>c67 zRoc~gmz?DueO6G*6ebIBR8oSvZpAsI`|IziUMG}u_`tfnbVbL@2X08DR$Ex-V#Vk! zNv}yjbM8~G&WbjbiFjhkXX2F_?GuaDj}J~pSZThTBAxrqR~ZF6MoNtwKh@ZNPIEmP zZrPvGpR&JhmryOI@srJOR=%G1=}m=RcHpg1fWM|mo+xnf8ovy}ME(5i#V=>>qbh?W0b$7pDM`Cm){v^eI{(kJ!Zn zBsM}l1AeF*U+&tuAF)gl$NsnPE9)b#z{9+(e5fT%_J4vdM4=TIE{Er*rZRCI4!yqa zF^MZZhfq%zm&x(|8t}N^d~qFIDLNcMQ}e~-%6d(!>v8d9mDUs3BLX{Z0Wb6w zSY!AC1}o6PzuVuUQ9fHFB39=%&uKi6B9VNM5Wu@tke|%nR%p2bgGfLUIknM~sds-g ziOx8g$G(L4oNZDFcw|4TKivHIlvexyly>FeP_Av9u~jGxQjO(Mj$JfqY#juiM4WIhrg<1CRg`@;KH`CS65-Ju+eU5pTp<9MBJ z(ktG_R;jxvYE$bR`ya&=k%{jnDM+k^KgXw0Ju(rVZGznIrt>_Ver(J0HTiu9Eq@{P zzpw!X1G&P5+!1mQ2+ZB~I!#h|4h){`%9j?B_|D*XNTIP)4^(QQ)Bk>dbhJqBxH&9b z9{f#Rrq($`|LZB`o#_iT&=^o_s2 zUWj<^^@^YylU}1YkR3IceWq&dqBgCi2Z+NY0@Z_8ulFp-IRssl^xhMBB?nK;D?rF~ zEGZ$rQ<$4CC_kz;GL|<1KGFP#Pr%JAH^m5`EJ^{Pjji5mA8dk^pA2a1Qi6BoO{O^r zm4GHLBrLImj?404f5#Xepkan-DAIlTV>J-pjk*A+{x{4+WNI8ICBOX$F%hB@HKvaA zF$2?I_3|j?IK(2Qg^@iUp&}E6?zI1D3@E068}ziduOFM@Zcn0y_kK8i$NUgRI27vbRH)!m2l|EEv=3;#EcfbmoNK9PTNIr`}U zaNqvlH2_U!pwld(Vk$7;C_uWZyT~081}B-dKI7CDi_X=pnYgLoyFc2z(qxyC5i0?N z2lpy)`m0>`_DI@ia0}1Ee5=FD+btM0lEwD(A_W)DN$Br_a?4+!{2>r78Q{j;!~dVAFX0hBH4!UIPI^3;Q($;p zMK!=av4NdsAeWgQ6aq`tT*f0jqnqj8nG>gbCm5)Gg+7{0ET!r z$qjHRm=Qf>7yi35F2=if#InZ3)_le2uXtRq^_#+e-$=qdS+c;v$*-)mgfj6`+S8)x zHLiP>2fFfFdxcYp^j==igqvU!<(}V%4Y4wQ z!HQy@kT7WE#y!)bmqlt=G~wlu$q&7JQvIC^spc?F6KLwG;u)#C#i+#?G7zw_#Y0i&2aHz-5|rp_J5h$H92!O$8{MFSZsz3(uxb9ypdw zuLJtP7uHcJS)yUNAdp!()#VN8!5~e{{_N?Zw-ftdFaw>}{S-4; z$=CNq$@l?~8bd&k@%E^4m|}da0v@<``N5^!W*Ext_p$1>4ncNdsN(AN-8?E7?E* zs#6=S=zI%vqoo$+0Ov1{{3U3Bedb z6@X|&%?2S-@KOY?Xb$bsc88QJgSA1>q03Pt@7i({uB=Pl30!m55>$;_C+bias)r?f z&ObpbtL?lI0ZMuMdJLoY%2ech02-OSxxQ#WynU~)!~jU;g$)Clj({J68VQfiy;wDl zs0|fng?r+uDN@dxaUYFIZT?KT2u04_Js>eJ#S-J20v}#(izWJnwEQTk2z_fUfS7Q& zQ)tCG5h7{_0nsScg$%4<$2QN^sPuR3{_39U`vc9U55;Inw_a3mu& zIKjM?u)dWrT7Be{6MEy>Ba6EIQ8G4T+_bqFaZ+a%)~$^GsT#k5O!g6-6karvAt#KVbo|A>V5*Jc?5++1Xjo7 zb7S&h4LQo;`wv*_`nD+etX2zj*UN6#U*mIlO=!JcG7zXLA~&f{>SWP$Jy(CmAL#gQFvNHQb$N~P#>r3lap?>manxe+D7v_#z@8LkZ(0e-`yMj8ll7^At_U)p1#!tgd5b z)OwtHAI?7w)Ibl2Z}qIkZIpIrJ?cEM=$TOnm>->SUeq@UO>gm?(Z)-n$^zF0=&As& ztkX<~@9ucJ6*ag83GFKN#KAv=B~Drus@dL^p0!1QL3~uIpcp8j@s09#YR`-MMehMGts z4+Lmhp~>$>8F|W68)N^FqfSK%OGy_?AH0s2E-4{(fWu~VPjO!;gKAQiMiVRm2dtvAMEVF~I%>z1EIIPe}>fz!eF3^Y9&%O4=Gt)_GPw-2PFqU=yr#aj&ErKfGIReHwh#=ihP95_w@ literal 0 HcmV?d00001 diff --git a/blog/mgate/mgate-features.png b/blog/mgate/mgate-features.png new file mode 100644 index 0000000000000000000000000000000000000000..22f0f2af650f79b210d99e17c100985d33e6f59b GIT binary patch literal 48326 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 OO-@=ts#rqb@Bah&jDqt3 literal 0 HcmV?d00001 diff --git a/blog/mgate/mgate.md b/blog/mgate/mgate.md new file mode 100644 index 00000000..70d53360 --- /dev/null +++ b/blog/mgate/mgate.md @@ -0,0 +1,424 @@ +# mGate + +## Summary + +This blog post introduces mGate, a lightweight, scalable, and customizable IoT API gateway designed to streamline communication across multiple protocols like MQTT, HTTP, and WebSocket. We'll explore mGate's key features, including its real-time packet manipulation, pluggable authentication mechanisms, and comprehensive observability tools. A practical demo showcases mGate's power in a real-world scenario, demonstrating how it integrates with an MQTT broker to provide protocol-agnostic authentication and authorization, ultimately simplifying IoT architecture and enhancing security. + +## Introduction + +Imagine having a single point of entry for all client requests to backend services and being able to handle authentication, authorization and request transformation over multiple protocols. This can help you in your quest to build scalable, high performance and fault tolerant architecture. Enter mGate! + +mGate is a lightweight, scalable, and customizable IoT API gateway designed to support seamless communication across multiple protocols. It enables real-time packet manipulation, features pluggable authentication mechanisms, and offers observability for monitoring and troubleshooting. Built for flexibility, mGate can be deployed as a sidecar or standalone service and can also function as a library for easy integration into applications. + +The extensible nature of mGate allows developers to customize it to fit various IoT ecosystems, ensuring optimal performance and security. + +## Features + +Some of the key features of mGate are highlighted below: + +![mGate features](/blog/mgate/mgate-features.png "mGate features") + +### Multi-Protocol Support + +mGate is built to interface with a wide range of IoT protocols, including: + +- MQTT +- HTTP +- WebSocket + +It is easily extendable to support additional protocols with progress on way to support the CoAP protocol. + +### On-the-Fly Packet Manipulation + +With mGate you are able to perform real-time packet transformation and processing. Custom logic or package interceptors can be injected for modifying incoming and outgoing messages. + +### Authentication and Authorization + +Mgate also features a pluggable authentication system supporting different providers like OAuth, JWT, API Keys, and more. It also provides access control for fine-grained resource authorization. There are easily replaceable auth modules for integration with custom or enterprise identity systems. + +### Observability + +mGate provides real-time metrics for monitoring system health and performance. It offers logging and tracing to facilitate troubleshooting and optimization and options to easily integrate with Prometheus, Grafana, and OpenTelemetry for detailed tracing and visualization. + +### Scalable Architecture + +mGate is designed to scale horizontally, ensuring it can handle high-throughput environments. + +### Pluggable and Extensible + +The Core components of mGate are modular, making it easy to plug in custom modules or replace existing ones. It is extendable to add new IoT protocols, middleware, and features as needed. + +### Customizable + +mGate is highly configurable, allowing adjustment of protocol-specific behaviors, observability, and performance optimizations. Minimal configuration is required for default deployment but supports deep customization. + +### Lightweight + +Built with Go programming language, mGate is optimized for low resource usage, making it suitable for both high-performance data centers and resource-constrained IoT edge devices. + +### Deployment Flexibility + +mGate can be deployed as a sidecar to enhance existing microservices or as a standalone service for direct IoT device interaction. It is available as a library for integration into existing applications. + +## Architecture + +mGate starts protocol servers, offering connections to devices. Upon the connection, it establishes a session with a remote protocol server. It then pipes packets from devices to the protocol server, inspecting or modifying them as they flow through the proxy. + +The can be procedurally described as: + +1. The Device connects to mGate's server +2. mGate accepts the inbound (IN) connection and establishes a new session with the remote server (e.g. it dials out to the MQTT broker only once it accepts a new connection from a device. This way one device-mGate connection corresponds to one mGate-MQTT broker connection.) +3. mGate then spawns 2 goroutines: one that will read incoming packets from the device-mGate socket (INBOUND or UPLINK), inspect them (calling event handlers) and write them to mGate-server socket (forwarding them towards the server) and other that will be reading server responses from mGate-server socket and writing them towards device, in device-mGate socket (OUTBOUND or DOWNLINK). + +The process flow is shown in the image below: + +![mGate process flow](/blog/mgate/mgate.png "mGate process flow") + +mGate can parse and understand protocol packages, and upon their detection, it calls external event handlers. mGate specifies the interface for the Event handler as follows: + +```golang +// Handler is an interface for mGate hooks +type Handler interface { + // Authorization on client `CONNECT` + // Each of the params are passed by reference, so that it can be changed + AuthConnect(ctx context.Context) error + + // Authorization on client `PUBLISH` + // Topic is passed by reference, so that it can be modified + AuthPublish(ctx context.Context, topic *string, payload *[]byte) error + + // Authorization on client `SUBSCRIBE` + // Topics are passed by reference, so that they can be modified + AuthSubscribe(ctx context.Context, topics *[]string) error + + // After client successfully connected + Connect(ctx context.Context) + + // After client successfully published + Publish(ctx context.Context, topic *string, payload *[]byte) + + // After client successfully subscribed + Subscribe(ctx context.Context, topics *[]string) + + // After client unsubscribed + Unsubscribe(ctx context.Context, topics *[]string) + + // Disconnect on connection with client lost + Disconnect(ctx context.Context) +} +``` + +The Handler interface is inspired by MQTT protocol control packets; if the underlying protocol does not support some of these actions, the implementation can simply omit them. An example of implementation is given [here](https://github.com/absmach/mgate/blob/main/examples/simple/simple.go), alongside with it's main() function + +## Use case + +What better way to demonstrate the power of mGate than to run a demo for a real world use case for this. The demo is based on how [SuperMQ](https://github.com/absmach/supermq) uses mGate for authorization and authentication. SuperMQ is a distributed, highly scalable, and secure open-source cloud platform for messaging and event-driven architecture (EDA). The platform has its own authentication and authorization system which it uses for clients connecting to it through all supported protocols. To achieve this auth has to be done protocol-agnostic. This is where mGate shines. To show how this works we will walk through a demo using a simple MQTT broker, mGate running in standalone mode and two simple MQTT clients. +The diagram below shows the test setup: + +![mGate test setupt](/blog/mgate/mgate-test-flow.png "mGate test setup") + +### Requirements + +To build this demo we will require the following tools: + +- [Golang](https://go.dev/) =>v1.23.0 +- [Mosquitto MQTT Server](https://mosquitto.org/download/) +- [Mosquitto Publisher and Subscriber Client](https://mosquitto.org/download/) + +### Setting up the broker + +We will use the Mosquitto broker as our MQTT broker. For that we can write a simple conf file as below and save it as mgate-test.conf: + +```nano= +# mgate-test.conf + +# Listen on the default 1883 MQTT port. +listener 1883 + +# Allow anonymous clients (no username/password required) +# We will use mGate for Auth functionality +allow_anonymous true +``` + +We can now run the broker with: + +```bash= +mosquitto -c mgate-test.conf +``` + +Where we expect the output to be: + +```bash= +$ mosquitto -c mgate-test.conf +1753385733: mosquitto version 2.0.20 starting +1753385733: Config loaded from mgate-test.conf. +1753385733: Opening ipv4 listen socket on port 1883. +1753385733: Opening ipv6 listen socket on port 1883. +1753385733: mosquitto version 2.0.20 running +``` + +Our broker is successfully set up + +### Setting up our MQTT Clients + +We will use Mosquitto publish and subscribe tools for this, you can download these tools from [https://mosquitto.org/download/](https://mosquitto.org/download/) + +### Setting up our handler + +We will set up mGate to run on port 1884 and proxy traffic to our broker on port 1883. +As stated above mGate enable us to customize the handler interface. We will do so to perform authentication for our MQTT clients before messages reach our broker. To do this we will modify the [simple.go](https://github.com/absmach/mgate/blob/main/examples/simple/simple.go) file provided with mGate. + +The changes to the file are as follows: + +```golang +// Copyright (c) Abstract Machines +// SPDX-License-Identifier: Apache-2.0 + +package simple + +import ( + "context" + "errors" + "fmt" + "log/slog" + + "github.com/absmach/mgate/pkg/session" +) + +// Create a simple in memory lookup for user credentials +var authKeys = map[string]string{ + "user1": "1234", + "user2": "1234", +} + +// example authorize function to perform authorization +func authorize(ctx context.Context) error { + _, ok := session.FromContext(ctx) + if !ok { + // Return error if session info not in context + return fmt.Errorf("Client not initialized") + } + return nil +} + +var errSessionMissing = errors.New("session is missing") + +var _ session.Handler = (*Handler)(nil) + +// Handler implements mqtt.Handler interface. +type Handler struct { + logger *slog.Logger +} + +// New creates new Event entity. +func New(logger *slog.Logger) *Handler { + return &Handler{ + logger: logger, + } +} + +// prior forwarding to the MQTT broker. +func (h *Handler) AuthConnect(ctx context.Context) error { + // Extract the session holding client username and password from context + s, ok := session.FromContext(ctx) + if !ok { + // Return error if session info not in context + return fmt.Errorf("Client not initialized") + } + // Retrieve pasword for the username + pass, ok := authKeys[s.Username] + if !ok { + // If user not in lookup return error + return fmt.Errorf("Auth error: user not found.") + } + //Check if saved password for user is same as one from look up table. + if string(s.Password) != pass { + // Return error if passwords do not much + return fmt.Errorf("Auth error: user password does not match") + } + // Log success and proceed + return h.logAction(ctx, "AuthConnect", nil, nil) +} + +// prior forwarding to the MQTT broker. +func (h *Handler) AuthPublish(ctx context.Context, topic *string, payload *[]byte) error { + if err := authorize(ctx); err != nil { + return fmt.Errorf("Auth error: failed to authorize") + } + return h.logAction(ctx, "AuthPublish", &[]string{*topic}, payload) +} + +// prior forwarding to the MQTT broker. +func (h *Handler) AuthSubscribe(ctx context.Context, topics *[]string) error { + if err := authorize(ctx); err != nil { + return fmt.Errorf("Auth error: failed to authorize") + } + return h.logAction(ctx, "AuthSubscribe", topics, nil) +} + +// Connect - after client successfully connected. +func (h *Handler) Connect(ctx context.Context) error { + return h.logAction(ctx, "Connect", nil, nil) +} + +// Publish - after client successfully published. +func (h *Handler) Publish(ctx context.Context, topic *string, payload *[]byte) error { + return h.logAction(ctx, "Publish", &[]string{*topic}, payload) +} + +// Subscribe - after client successfully subscribed. +func (h *Handler) Subscribe(ctx context.Context, topics *[]string) error { + return h.logAction(ctx, "Subscribe", topics, nil) +} + +// Unsubscribe - after client unsubscribed. +func (h *Handler) Unsubscribe(ctx context.Context, topics *[]string) error { + return h.logAction(ctx, "Unsubscribe", topics, nil) +} + +// Disconnect on connection lost. +func (h *Handler) Disconnect(ctx context.Context) error { + return h.logAction(ctx, "Disconnect", nil, nil) +} + +func (h *Handler) logAction(ctx context.Context, action string, topics *[]string, payload *[]byte) error { + s, ok := session.FromContext(ctx) + args := []interface{}{ + slog.Group("session", slog.String("id", s.ID), slog.String("username", s.Username)), + } + if s.Cert.Subject.CommonName != "" { + args = append(args, slog.Group("cert", slog.String("cn", s.Cert.Subject.CommonName))) + } + if topics != nil { + args = append(args, slog.Any("topics", *topics)) + } + if payload != nil { + args = append(args, slog.Any("payload", *payload)) + } + if !ok { + args = append(args, slog.Any("error", errSessionMissing)) + h.logger.Error(action+"() failed to complete", args...) + return errSessionMissing + } + h.logger.Info(action+"() completed successfully", args...) + + return nil +} +``` + +The code above: + +- creates a simple look up comprising of two users and their hard coded passwords. +- creates an example authorization function that runs on AUthPublish and AuthSubscribe +- creates authentication logic that runs on AuthConnect + +With the above we can now securely access the broker through the mGate gateway. +We can test this by saving the changes in the simple.go file and running mGate as below: + +```bash= + $ go run ./cmd/main.go +{"time":"2025-07-24T23:29:32.061974246+03:00","level":"INFO","msg":"MQTT proxy server started at localhost:1884 with no TLS"} +{"time":"2025-07-24T23:29:32.062420567+03:00","level":"INFO","msg":"MQTT proxy server started at localhost:8883 with TLS"} +{"time":"2025-07-24T23:29:32.062899579+03:00","level":"INFO","msg":"MQTT websocket proxy server started at localhost:8083/mgate-ws with no TLS"} +{"time":"2025-07-24T23:29:32.062952288+03:00","level":"INFO","msg":"MQTT proxy server started at localhost:8884 with TLS and RequireAndVerifyClientCert"} +{"time":"2025-07-24T23:29:32.063343226+03:00","level":"INFO","msg":"MQTT websocket proxy server started at localhost:8084/mgate-ws with TLS"} +{"time":"2025-07-24T23:29:32.063956067+03:00","level":"INFO","msg":"MQTT websocket proxy server started at localhost:8085/mgate-ws with TLS and RequireAndVerifyClientCert"} +{"time":"2025-07-24T23:29:32.064003756+03:00","level":"INFO","msg":"HTTP proxy server started at :8086/mgate-http with no TLS"} +{"time":"2025-07-24T23:29:32.064583115+03:00","level":"INFO","msg":"HTTP proxy server started at :8087/mgate-http with TLS"} +{"time":"2025-07-24T23:29:32.065298037+03:00","level":"INFO","msg":"HTTP proxy server started at :8088/mgate-http with TLS and RequireAndVerifyClientCert"} +``` + +### Testing + +To test our setup we will test four scenarios: + +#### Succesful publish + +We send a message with a known client with the right password like so: + +```bash= +$ mosquitto_pub -t /mgate-test -p 1884 -m "Hello, world" -i test-client -u user1 -P 1234 -d +Client test-client sending CONNECT +Client test-client received CONNACK (0) +Client test-client sending PUBLISH (d0, q0, r0, m1, '/mgate-test', ... (12 bytes)) +Client test-client sending DISCONNECT +``` + +and the logs from mGate will show: + +```bash= +{"time":"2025-07-24T23:41:18.757565969+03:00","level":"INFO","msg":"Accepted new client"} +{"time":"2025-07-24T23:41:18.757917374+03:00","level":"INFO","msg":"AuthConnect() completed successfully","session":{"id":"test-client","username":"user1"}} +{"time":"2025-07-24T23:41:18.757965694+03:00","level":"INFO","msg":"Connect() completed successfully","session":{"id":"test-client","username":"user1"}} +{"time":"2025-07-24T23:41:18.758157962+03:00","level":"INFO","msg":"AuthPublish() completed successfully","session":{"id":"test-client","username":"user1"},"topics":["/mgate-test"],"payload":"SGVsbG8sIHdvcmxk"} +{"time":"2025-07-24T23:41:18.758185353+03:00","level":"INFO","msg":"Publish() completed successfully","session":{"id":"test-client","username":"user1"},"topics":["/mgate-test"],"payload":"SGVsbG8sIHdvcmxk"} +{"time":"2025-07-24T23:41:18.758224175+03:00","level":"INFO","msg":"Disconnect() completed successfully","session":{"id":"test-client","username":"user1"}} +{"time":"2025-07-24T23:41:18.758229345+03:00","level":"WARN","msg":"EOF"} +``` + +#### Successful Subscribe + +We subscribe to a topic with a known client with the right password like so: + +```bash= +$ mosquitto_sub -t /mgate-test -p 1884 -i test-client -u user1 -P 1234 -d +Client test-client sending CONNECT +Client test-client received CONNACK (0) +Client test-client sending SUBSCRIBE (Mid: 1, Topic: /mgate-test, QoS: 0, Options: 0x00) +Client test-client received SUBACK +Subscribed (mid: 1): 0 +``` + +and the logs from mGate will show: + +```bash= +{"time":"2025-07-24T23:43:55.821727225+03:00","level":"INFO","msg":"Accepted new client"} +{"time":"2025-07-24T23:43:55.822041811+03:00","level":"INFO","msg":"AuthConnect() completed successfully","session":{"id":"test-client","username":"user1"}} +{"time":"2025-07-24T23:43:55.822102123+03:00","level":"INFO","msg":"Connect() completed successfully","session":{"id":"test-client","username":"user1"}} +{"time":"2025-07-24T23:43:55.822231494+03:00","level":"INFO","msg":"AuthSubscribe() completed successfully","session":{"id":"test-client","username":"user1"},"topics":["/mgate-test"]} +{"time":"2025-07-24T23:43:55.82225628+03:00","level":"INFO","msg":"Subscribe() completed successfully","session":{"id":"test-client","username":"user1"},"topics":["/mgate-test"]} +``` + +#### Publish with unknown user + +We will try to publish with an unkown user, like so: + +```bash= +$ mosquitto_pub -t /mgate-test -p 1884 -m "Hello, world" -i test-client -u user3 -P 1234 -d +Client test-client sending CONNECT +Error: The connection was lost. +``` + +and the logs from mGate will show: + +```bash= +{"time":"2025-07-24T23:46:32.11466641+03:00","level":"INFO","msg":"Accepted new client"} +{"time":"2025-07-24T23:46:32.115206297+03:00","level":"INFO","msg":"Disconnect() completed successfully","session":{"id":"test-client","username":"user3"}} +{"time":"2025-07-24T23:46:32.115220844+03:00","level":"WARN","msg":"failed to proxy from MQTT broker to client with id test-client with error: Auth error: user not found."} +``` + +We are able to successfully carry out authentication + +#### Publish with invalid password + +We will try to publish with a password that does not match the one from the look up, like so: + +```bash= +$ mosquitto_pub -t /mgate-test -p 1884 -m "Hello, world" -i test-client -u user1 -P 4567 -d +Client test-client sending CONNECT +Error: The connection was lost. +``` + +and the logs from mGate will show: + +```bash= +{"time":"2025-07-24T23:49:21.673540769+03:00","level":"INFO","msg":"Accepted new client"} +{"time":"2025-07-24T23:49:21.673859253+03:00","level":"INFO","msg":"Disconnect() completed successfully","session":{"id":"test-client","username":"user1"}} +{"time":"2025-07-24T23:49:21.673867979+03:00","level":"WARN","msg":"failed to proxy from MQTT broker to client with id test-client with error: Auth error: user password does not match"} +``` + +We are able to successfully carry out authentication + +## Conclusion + +mGate offers a powerful and flexible solution for managing IoT communication. Its ability to act as a single entry point for diverse protocols, coupled with real-time packet manipulation, pluggable authentication, and comprehensive observability, makes it an ideal choice for building scalable, high-performance, and fault-tolerant IoT architectures. The demonstration clearly illustrates how mGate can seamlessly integrate into existing systems, providing robust authentication and authorization capabilities that are protocol-agnostic. By centralizing these critical functions, mGate simplifies development, enhances security, and ensures efficient operation across various IoT ecosystems. diff --git a/blog/mgate/mgate.png b/blog/mgate/mgate.png new file mode 100644 index 0000000000000000000000000000000000000000..1f11433ce1efdd49ce02a8a47950c92caa77bf81 GIT binary patch literal 43198 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 _Y@c{YsNp_2 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 literal 0 HcmV?d00001 From 11b58b685f8c57fa9712f2d0be790529eb3ddbc9 Mon Sep 17 00:00:00 2001 From: Felix Gateru Date: Fri, 25 Jul 2025 14:06:31 +0300 Subject: [PATCH 2/4] fix: fix image links Signed-off-by: Felix Gateru --- blog/mgate/mgate.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blog/mgate/mgate.md b/blog/mgate/mgate.md index 70d53360..9fd8cd8e 100644 --- a/blog/mgate/mgate.md +++ b/blog/mgate/mgate.md @@ -16,7 +16,7 @@ The extensible nature of mGate allows developers to customize it to fit various Some of the key features of mGate are highlighted below: -![mGate features](/blog/mgate/mgate-features.png "mGate features") +![mGate features](./mgate-features.png "mGate features") ### Multi-Protocol Support @@ -72,7 +72,7 @@ The can be procedurally described as: The process flow is shown in the image below: -![mGate process flow](/blog/mgate/mgate.png "mGate process flow") +![mGate process flow](./mgate.png "mGate process flow") mGate can parse and understand protocol packages, and upon their detection, it calls external event handlers. mGate specifies the interface for the Event handler as follows: @@ -115,7 +115,7 @@ The Handler interface is inspired by MQTT protocol control packets; if the under What better way to demonstrate the power of mGate than to run a demo for a real world use case for this. The demo is based on how [SuperMQ](https://github.com/absmach/supermq) uses mGate for authorization and authentication. SuperMQ is a distributed, highly scalable, and secure open-source cloud platform for messaging and event-driven architecture (EDA). The platform has its own authentication and authorization system which it uses for clients connecting to it through all supported protocols. To achieve this auth has to be done protocol-agnostic. This is where mGate shines. To show how this works we will walk through a demo using a simple MQTT broker, mGate running in standalone mode and two simple MQTT clients. The diagram below shows the test setup: -![mGate test setupt](/blog/mgate/mgate-test-flow.png "mGate test setup") +![mGate test setupt](./mgate-test-flow.png "mGate test setup") ### Requirements From 6faea636668cef3f7b787d98cefcd9a7fea836a7 Mon Sep 17 00:00:00 2001 From: Felix Gateru Date: Mon, 28 Jul 2025 12:10:25 +0300 Subject: [PATCH 3/4] feat: add blog slug Signed-off-by: Felix Gateru --- blog/authors.yml | 38 ++++++++++++++++++++++---------------- blog/mgate/mgate.md | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/blog/authors.yml b/blog/authors.yml index 622bacd3..d8168471 100644 --- a/blog/authors.yml +++ b/blog/authors.yml @@ -1,23 +1,29 @@ borovcanin: - name: 'Dusan borovcanin' - title: 'Software Engineer' - url: 'https://github.com/dborovcanin' + name: "Dusan borovcanin" + title: "Software Engineer" + url: "https://github.com/dborovcanin" draskovic: - name: 'Drasko Draskovic' - title: 'Software Engineer' - url: 'https://github.com/drasko' - email: 'drasko.draskovic@gmail.com' + name: "Drasko Draskovic" + title: "Software Engineer" + url: "https://github.com/drasko" + email: "drasko.draskovic@gmail.com" osodo: - name: 'Rodney Osodo' - title: 'Software Engineer' - url: 'http://rodneyosodo.com/' + name: "Rodney Osodo" + title: "Software Engineer" + url: "http://rodneyosodo.com/" socials: - twitter: 'https://twitter.com/b1ackd0t' + twitter: "https://twitter.com/b1ackd0t" -musilah: - name: 'Nataly Musilah' - title: 'Software Engineer' - url: 'https://github.com/Musilah' - email: 'nataleigh.nk@gmail.com' +musilah: + name: "Nataly Musilah" + title: "Software Engineer" + url: "https://github.com/Musilah" + email: "nataleigh.nk@gmail.com" + +gateru: + name: "Felix Gateru" + title: "Software Engineer" + url: "https://github.com/felixgateru" + email: "felix.gateru@gmail.com" diff --git a/blog/mgate/mgate.md b/blog/mgate/mgate.md index 9fd8cd8e..46337cda 100644 --- a/blog/mgate/mgate.md +++ b/blog/mgate/mgate.md @@ -1,3 +1,21 @@ +--- +slug: mgate-iot-api-gateway +title: "mGate: Lightweight IoT API Gateway with Auth and Multi-Protocol Support" +authors: gateru +description: Introduction to mGate, a lightweight IoT API gateway with multi-protocol support, real-time packet handling, and built-in auth. +tags: [ + iot + api gateway + MQTT + HTTP + WebSocket + authentication + authorization + open-source + scalability +] +--- + # mGate ## Summary From c59c64e3dfbed363242628ce7bca58202d0f01cf Mon Sep 17 00:00:00 2001 From: Felix Gateru Date: Mon, 28 Jul 2025 15:42:18 +0300 Subject: [PATCH 4/4] fix(mgate.md): add missing commas in tags Signed-off-by: Felix Gateru --- blog/mgate/mgate.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/blog/mgate/mgate.md b/blog/mgate/mgate.md index 46337cda..a3219503 100644 --- a/blog/mgate/mgate.md +++ b/blog/mgate/mgate.md @@ -4,15 +4,15 @@ title: "mGate: Lightweight IoT API Gateway with Auth and Multi-Protocol Support" authors: gateru description: Introduction to mGate, a lightweight IoT API gateway with multi-protocol support, real-time packet handling, and built-in auth. tags: [ - iot - api gateway - MQTT - HTTP - WebSocket - authentication - authorization - open-source - scalability + iot, + api-gateway, + MQTT, + HTTP, + webSocket, + authentication, + authorization, + open-source, + scalability, ] ---