From 9d8cb87554b94aa131a42f188c1510795b98fb68 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Sat, 5 Dec 2020 22:43:17 +0800 Subject: [PATCH] add 1000 --- root/package/firmware/ipq-wifi/Makefile | 2 + .../ipq-wifi/board-pangu_l1000.qca4019 | Bin 0 -> 631600 bytes .../wireless-regdb/patches/501-CN-regd.patch | 24 ++ .../mac80211/files/lib/wifi/mac80211.sh | 127 ++++++ .../ipq40xx/base-files/etc/board.d/01_leds | 6 + .../ipq40xx/base-files/etc/board.d/02_network | 1 + .../etc/hotplug.d/firmware/11-ath10k-caldata | 8 + .../base-files/lib/upgrade/platform.sh | 1 + .../arch/arm/boot/dts/qcom-ipq4019-l1000.dts | 388 ++++++++++++++++++ root/target/linux/ipq40xx/image/Makefile | 14 + .../901-arm-boot-add-dts-files.patch | 3 +- 11 files changed, 573 insertions(+), 1 deletion(-) create mode 100755 root/package/firmware/ipq-wifi/board-pangu_l1000.qca4019 create mode 100644 root/package/firmware/wireless-regdb/patches/501-CN-regd.patch create mode 100644 root/package/kernel/mac80211/files/lib/wifi/mac80211.sh create mode 100644 root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-l1000.dts diff --git a/root/package/firmware/ipq-wifi/Makefile b/root/package/firmware/ipq-wifi/Makefile index 8bf3b414..ec01e76b 100644 --- a/root/package/firmware/ipq-wifi/Makefile +++ b/root/package/firmware/ipq-wifi/Makefile @@ -37,6 +37,7 @@ ALLWIFIBOARDS:= \ ezviz_cs-w3-wd1200g-eup \ glinet_gl-s1300 \ linksys_ea8300 \ + pangu_l1000 \ p2w_r619ac \ mobipromo_cm520-79f \ qxwlan_e2600ac @@ -114,6 +115,7 @@ $(eval $(call generate-ipq-wifi-package,glinet_gl-s1300,GL.iNet GL-S1300)) $(eval $(call generate-ipq-wifi-package,linksys_ea8300,Linksys EA8300)) $(eval $(call generate-ipq-wifi-package,mobipromo_cm520-79f,MobiPromo CM520-79F)) $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC)) +$(eval $(call generate-ipq-wifi-package,pangu_l1000,PANGU L1000)) $(eval $(call generate-ipq-wifi-package,p2w_r619ac,P&W R619AC)) $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) diff --git a/root/package/firmware/ipq-wifi/board-pangu_l1000.qca4019 b/root/package/firmware/ipq-wifi/board-pangu_l1000.qca4019 new file mode 100755 index 0000000000000000000000000000000000000000..f61f4f52bbd612e8fe3b2e200cdb4a139d506c01 GIT binary patch literal 631600 zcmeFa3se+Wx;9)Oh!>1>a}l9w+UD8>T0q5Ci69~YB+8(opfRYZ(261mf=xzaOhnQu z5o5TuphLXdL)2wrqTp!EWM(D3GPBNFGwb~8b7q}6XTE=B{t0t3NhWK~nfSlEs;j%Y zsiLcIQgrVPyXviX-=EqIRkfdf>L<&Wr7T;UpO(5ZC1>@rl3b#uriOs9VJ_MdL>$De z4fQWygW(uOi7~>?t}uQ2bI;jTfF-k>#Wx3x0rb^Nu2c`1Z^tL*^zmQV!}l8CPdZnQLSC|_KV3`LJNZ!6D*Y!`dl zpy*0f;?Rwr)6KQzC8|_ofdtF`**I#3U?YoVGA>|=2m6sHpu|41iRJyIf7h#p>eTgN zS=Z0iw=S%VTNknN{?&b5dB+m#!YjJ2ZR}cfOjaMflq)Gn%{*#R%;BtFYMgC_;iW5U(V`JbqPCjQ&jC_tjNW8>PjMR_V>`t-?@sistlxEQ%S8V*7NzW?FJA49>Se8?FU7~t#Y_b)Q555ZQR zs>OZV+UsyV0@c?ZI(Z#M)Ka1`#K)o_mqmre$I9h0sU#vCEXRFNGA1SlRRpyf>vP7( zhKfik5-pQ16QxPhM70eE4;?*zvZHgfL1Y@kJ-ZCCRIC(#E*3>dBa{(ELDC>mxHLza zqs;j{M^q>+R2CLxOS47!(sXIMGX3*((PHUh<>I1LX{tyiHFZLFf!#FqDKpd5D{PKB zKYSnwmIi+vEQ*vyDkF=QOP7DWT(nZUQn|8do^;;V^F&LeOO#8BsFT3ll1)+2yM2r1 zZtZd1b!LonGMN9fuv=`O7e{@ba7~KGz~}5^lrTyh2;ix~0gQ#)D^apQ03TokFaj6> zi~vReBjCjd%u1gniWa|^{-S8LcwzcNQI>cL9f*>xr!U-m#N5)i{`T!hw=tCtE^EV! zPaz(fc$0vtC z_Ai_?(8KuYtE&LZ7Z@0z^die1g!5MLuB=+Ku}&#(m-x5s^t` z`ehR$;@6K9hY2E$h!Fvg3Wzsy;PcQi6Z|>;iZ62l6u*Ip_GAq56A=N2{biRS{mGYK z5x@K0SL7bqDB|F`2s|AO4Dt1?gcS&a@bUGV@-Bq)5aFIh zxY+TG)XE*TR!6PQ6&0`Du&JW5O51*>v$ucX^7X;nAKw4P<6nJYe*$A2&%P_y36q;3 z*FlTKt@KJLxdvL4(@L*`lIx#E>8Qw|C{voL%q*JkvioautM*u7 z>0u(NI4?anh{2)^YwV;vMnAopXnh$l=yTT=fMbI1TX><6@iM1@=}UlFBS*QphjUQ zzrKPhKVydPH&po@JLoziBH)_JFTmk8CID^>IZT&_nI}UodVjEKFN}JVuTicI%6DX>o?8~UBPV(kkfeTL)u-MV#}6#Ylqv+BD1Tva+0 z=+Nw@3!LjpP!N#qguYf=qRtq3&(NW7(r!>^>W8&G>izjE62r+BcBwZ~UD9=hV&w3Lx_8JfMWZgA>rR9gIt{Puw`rEL{I!)~ud;Lh=umsg~vNM=uduXXpP zh3Rvmo}04&Y~E4DzKE@Xc@GA*pLjtNvvXG2!;Yr%td#iBaQ|EHwCpO(NuL`TeyYFp zWZFTQdgiK6uk1dZeK@XW_U6yJtBV&V#Lps#p}vE=^Oq}AqM|;$yzgxG5k;MN-J`43 z9a)ECc872Nq_4grCnHW09(eD)-8=L1rShO)ZO^JV()Ne0pRwZZm93{2ACm0~-FRQO zdsA_4a;(Vj_Jzi}75VbS(1^CK)o;#k3@;1Jzjf`EcT`8BYeF~Q?%cnvU}ei(VNjrmAUc9`wd&$w5x{%G6PStMBT@oXagmk}MxqU@pa(ZaQiIeMJov)T}6ldSO zTHm|sMB;()?Or=^@W3$w9)N(eY8wH}z=B7AYi+)&sXQ}1F)l6^enDwN7Bgp#d`_vq zVAM87bKhxt{S=q2&5v$_rq@q(SsN_yV;4riF$DOMJ6xU5vEF)2Da@}2?z3%xm*RzuA!LLvllPLXqAEaLo^nxrpI?At?5ro_I>ro%c!CGusTo&nk4{Y=6XOrJ( zpzF&bCXoRobHN3Qxqj#y4Ie(G({1nJyAW_UV2)v6Go$SqEOShUVCk8-M`P*N8?N6t z-qX~)uHg9_{XHj}tIJn|raXs!J&_3d^@f3=vpo&XKPk@u>3OO^5|@5GkqG+rP@toy zvAMKB0R`R$t@<^pR4)B`LIIQ*dx9q{4C68IIpcPt#HUiB=ec-&S8w)lMN{~W$L}BP zFFKjrEU9MGuRk}i<80QE#D-a0KfAFGtqWI&Y-H1~KRK|eWAW<=jp3Ca-Dv4u@M=tL z*cPl`FZ5Z!zkl|vs3CftWq_8()UWS9T#+sN?A79Qsdwwwzjw+9fI`oq;Fr2+v3Zhe z@0ha`gANE=NN00`&+zm#>$OmcNx%M|cI(&AgclB&%YSDo&(Q^!x!L&j@#cWU>OpHB z9LSJLBu2|QpVU-egsDCUd~6_K{d(#S`kwhl+6zrS&q_RxUk`VYV+OX*i=#ffF92}? zK2T$nFiIQ<;Hkj@jD;JcWB~`qf%{S7Xc)UO0vG{|07d{KfD!OI1V(e;F~8pHCV`g? z`0t~FKmhP^zP>GfJv^C)hu%md-e^fB;R5rK&*o*uXYz7sL>Sp+)Mo+s(1HQNPa0vg zq!I9*WfX+r6Ue8Kvl|TkdL&6H0sVS%5Bl}w9_iJ`BdvOfvBo{Jje7Mom;N`vsV5_6 zLpZ_f5WxEN=*`nuzuvq^XqScg^>)F9GfxBr_^cT-dGuWNL>Q|heZ>6w@xM&4mtVig zf?wbDU!(NvVMw7bBBnM$fOsd#uO|;!HZg0g`SpR;{Cd83loqwic<9$7(|5ktq5kc zvu30~VP}z1+2x}=v;*tc(@0qE-MT{()l>X> zF!(MHLF&LkR!x6GDzg{X5QH^A7Wu&@gUKF>gx{rbm4pkEIKTC~;b9Cgm{O(;-B7U0mY|8yAX*LUkH zb%ojtZ3bx-XcuS~aOv0oav15?_v&}(R+0tI>R-|2YL!|gmwx>(A7K4@+aCu{xFN!0 zuzj8h0;4oRQR35WoX49G&|g@0eDT3}b;Qe8&X*ip(h^%etBg&*e&GD-V+)()RkJoe zx}xsLeLd}fq>@d){!*W&BmcFOy%8HfxU{)F^EJi(u$S5N>j(StURCUxRXQ`T_d@B3 z`3EK2L~Ggf>p$v!@t~qAtYqf0W4iSxQVvLV&M0KluYc5A)S|4Oy=G=kYtM!gsZG+V z8HH^6^#k2|PAsU4sT3C;>@Lw}9!ad9UCE|j|9)@N$wiHEJAzl%oXu}VDhsn-!TR;y z^vS?u^#%k2rcR$RQxqIJYj$K*G|Ts(Ewwd9A2H?Yjj!~!fUR9!oJ^2v8(6Dl@s^!ZNd(IXvtX7rcQy!sdhr{0QJkNEURuO7wU2z{Kmf1?q=`t@;ZLWs=;)|^Jv8_LwaN_b#(Q1#m<;^J zBjav>nUiVHBwmv(BbMd*8QJx4fou$@kF;&xXYnJ_n+tGQ(@gEk2pgEZZ!ce2pc=Z> z)6ra0zP2ETOTYf{FG0T^MCjX^x0V+aWDE`Vw1eP%aluk9{rbnBfqwna`#mS1g_jBz z4gDMnsL28sp^~cdm7tY>qvtee+Lx$O(eqs>fc5KbP9sbKunCceWEgmB%YjAP6G|m3 zA9mCo%BxYn5}L!NUw^S}OT(hA@oS47u)B>Q6IkQ z<%1kX38Tb;0G=8gz*x93N)~W%90(94j-FySMgSv#5x@vw1TX?#hXB^E_qtQ=^#dLy zU;lT3Kw_jT*z678d^Rf*Rt8)AdSyy-axy&WmPv(aLFbZ^662wN0=1xf#{LP?64q=S z-J5JeLYrkY)pQ=b!OACZGOGfQoo+$xd%+1yyNG?3F070pT8>sFfhrz#r&_a9`rmzxj~yP1wKrM<1do z)|a??-IuubH(%n54<`{{XZjH{@B0y1FZdIp&`JJmxpAyq{Q9|bl}Z%R zx&nGaE+;UqAE^^y>}x^yjpVQ161_LH*CPE$XteOfLQU;fK&A5Qgv3y{4^E zuNZz`e?iv!6VSGhcTSi9n|j7 ztTKEIooiATm(AtUum8nE(64`TYq(2SuidQ4HGHV=*4Aq_sSCOE>wobW>({gWS-13g zmw4f(#HGB*ACD}y`x^G?Se4B63nb-l~* zU7hb4Vj#q(Z1U?#DH(VGo=6(X1%7_gqS$?wb>gFmfB@F7$NKf=1w6r7m|rir zQ-V9>ECPJijJY`VOuw`J5NdhMuOI&_2YdPTDhq!7wX;_G_2htP{dx&OOh^2BKaOE4 z6viZmem!uRv*_rke!Yw!KDBO=onLRA%lg%&*CyC+F?yI<>lhn z&$iUBCn!3<5BWt_5VH641JFOTgA0znCcuo&>eo+)U>d{(H^$PhH(bAQyr-#oUBUA= z`g=}-9Q|t0l)u_@tgWv4Cm>OO4Xpa=l7ajfb=|7Ac;%A zo=61!dMMD*)7V^Epnw8zgI4_-Rq7Cjem$YU`t`OaoBP+QJ)s5LI0`?<#p}CzvyUs9 z!goA=|6qU7$>e59HJg6@xq%&LvyLP-%-Z_djddr}4$7)SHnQp0pB&iKvH10b#_-CI zZnX5GH-m?5!TR;Wp9g$(_?_eE-AP z`t|1W-yGO5%VAJi2OV)*b{TGE2ORN{<}4Ft@u zr|!@1nQzm*(B$*1#Pj&|R{vf`9kP919QAp^H7OngpRk(~+r`y7A8Zy|mO@i%nj+b+)M`3PYBdaPe>ULdsF!u)!>A;SfPjsTxE zVzbw~}$n~dw=z38fk$OOPA!{-!^f;rkU=fx%l;F zp?OrF3-s%`yTzVjL*L%L`t>cL?V%4s{}}o=lY;#p?b5IxGzIp-S$g4IGlFHBJx5-- zY>NlYXNm|AB|hE8c`yPP0gS-2K%l6iQrrIJzx^Jy_4}uTaIN&w(-4U0hi-rW)10S< zrxj195x0qc_@TozV({r%h^3JCB7l&OhSHz^?z`{)_=i8B2H_3| zd`Q1OA|m3ilzx2xNQ^<=3aUKhHI|3GrIZh4rhDMJJsZCs>(`U_p!divY|MsODpra= z7mFgK5z2_7ASrrEmm|$l=6s$bDwGx~3yZR)*`j=Dx-?yx{&~7+v2?L=aZ#!?Riu(q zeD0GSow^I`CYl$AA;KtT-O)W4_wsd`gcj{dIhqUNZ&p==|UemxYx`t`QX zF(JTv1KcH>XALr7lrTyh2ncX$aP$eu@VM!%kASlERT@Mr{V^6O2j z^EO~`bv_%-d3v%fe*N<(pqIABl2#(f*UPZab1)G8{B~ZyUWWDSg@2k^dWiMwv3@@M%=eBHi^6TfNTJYy(z!LMsRR2!HhJ2 zp5EJ8@l*(Q78#XYKFUKovP1eqzO?*`0iDEaf9={eUiqj@FdrGgj)GQM1-Ph+yJU5a zSP#7tB~~P`6C;2Tzz8^r0Mf4q-FiyD9t=L!xrJZf-bnN7gQghy@n-${|NZJejr@Ab zhxqkV|MA~Uetml*&99%~OY`e@l$-eVa82d%z{amfDm}(P3eL#oaD*(W#HfpdbZMOM zAw?jnz6hfQ>O1!P*ucR0_0%2uJ@bva7n*#Ym5e{Xo^Ad*<15;rX53kfHf`1Y0>?B}Wy{Kzja<-K&~Xb)Gs8+B(uwu3oEN%f+vMJcPP5 zs5_`BQ7=<38@{7Gq25_mSXQY2Slgv;%+F7Z9R5)Ej;5w8M-`3OERTm0p@l(Ri?&*w zqs|$=2?eUi0`Kek)HV6bRC5g<>n~`V)$3IesKBSgig;qATVJUw)MjWiNUK1*K)Yc0 z1M>R_D^&`^9eua9PQ5xm78UsAup*Hd>DBMhtt1Pa)xV<4)he}0!(IJ(fI3?xeR6BK zS9d_YJbyM>-~o)mp5T=?6L`>krU*s}qr`!L`=j)iuOB$S`q;uIdDX0qkFKaYa$iq7AgN^I*I(+>bmYI5vNvMm2bVUtXTGM` zANDdEzkaYU?^VUFS*0`cdM}ion14{RO|+JcU;k0>iw6}|VI?z{9n-Bpk#az?b4FoX z*XlRtH-?u5=HI&Z$~&qf(KVr)AN3ZsD640$nVHktv*AQ)leB6^;qAVT}-98@L+d|HuFeg{p`w1UDd5i80ohTcS5HTVZavbhN80tIe!bAg ziTgJi0nD$*{Ce{Op5QFZuNT}Y!5wlI0X}QSOddU#?QB1UT3-14`mppckyMR;GWwKaKbO?Aq)s_NR5>dF^V z$)l}%x71al!}QeT#w~T#TlVaK;ic_$TXt2ayi_u8o(1QA-;cnTnsi7!zZBJ+)DN2q zf|wRSY1#uR`nfSR?GZ*TIkTG-(torJb zf(7Vt?Bic55{RK2J#Ecf%L^cJu&2Gby1ckx>ChFF4SXsn@K)P_@}hzzWP#5Tl8B-A zdrm+LFBL2r`Z*L(lLan9B~|4sRf$mD>E_z<5>=|PK!RoeY#h0NDHpe3;}np|0z`>V zw}qZ(;H@nO7Hv-`m8^W&QFkb>M)^u;&i$+Vy7G=C)`eGeUEA2T=$NcNc+17MEe(sd z#;=JgxYxd?Wkq%J#?YmoUTJ=J^)Y3A)V7bV9q4-LEm+gtar;D7)6(sVQqiK1Az!Xq zxiNU@rHj>_`EAc1h^)GMqp@%9q3GJ+3ZdhI`^S!eT`E@S53W^!T1f&q(8+y$eb9E& zB>1;H*%$&YAKs8ksaVCv#=vi!e9oL0`5d{t)DNpzv7ZvRdN*t+Sw-pB|KlIujQsc` zx&mTw?nnOp&rBcU+(!il`1<+%3-Zl`B^7h|zyJN~zfgJI+F_`ijdP!93KTV7E=^2y zsUTpyu`#^ z;&U=FN*E;$1n|`00LH?NQL=yoA7BJ90vG{|07d{KfDsrI0nE7{6CRxCfe6^tv>&fA z^Cg<_%{N}-aIjrloO@+Ta&mG~VysLmOba@fge3Q6Qh{2~J!Ag_X*oD;o>{SMLPP}r zS#g-;*aJT&9tcpeMvgt&w~NyVxm+TFwN+g7~RcJu@J1LoP=Ear%AzDv8?Tu*3{nW$!{b4}osz zLkQ0JiZ*Pj()Qo}71ur?-o2c9TlG_Kqo&?JO}%ltsCey$O%;_@+V(S@z5N51uMgh- z@cu6z|LP0-6BzHNHZQ_?l!ZC>9(6kLU=RX)){MD$_DsL0qKP^8^nb_k+uO^zPqWFn zpY}&9oqLjV9~wZ75g1HkbMDLB#<{;`jdHv3J`_;L_azx?ID001t|eP-tTREo#{OpJ?Oswh29>!-M*tXf*AwTsrr^cnCW8pk&{rtJiMU@V2pX%-C7O}eZ%I4nmH>C~Yt!z5?E!WnaOKFX0 zd~VCt!2>_bKAG4utBOtM{*$|!tE+nwUJI+yzu$0SNt?V;{0f`S{Y8CsU+yVcgQ()l zwR&CV8}fZYWo$b4R|a?X=ber{7_y`D>Yj61ZShSZTiA5&yRU5NTK3kQdhzBn7puE7 z-;Ajb-h_4Tz4vp1NA8&jIIF;6OXq&DwL%rds&h{WMu7u!?mcsE<56)VV3TvtlRdzf zWxzWhcbB~)#TMrto>ij|A1f8E1#gRm$MdLv!m~`eI&xuJ!k^@6M7)t}KLCo8v4Ieu zBZzDwjhHr|I84S*%zKhI@9Sse%@aPkz}Zh)6uXaIFW*ll{PBBl4@sSS;KXm}y!_Z5 zoOpL5%f+>){kAyq?oP*?d-L+30~Y4oI{+FkB5VZstQj-8^<1{FN9lO)Fz4Rg|21vb zUptq|g9O@n=-j7em^k;#N?%IJD=Ao8p0l?pWq#`X)Eac#DTDfCb0h!Xv9#{t>z#9u z*8LRtVG9byJn9aX(z+*HrFAbOd_J{q&x&_%oy>6z7thAP#k;4|sXaUY{f-@)^He?4 zOx4N=>c`|T8X;C%_txp?*dDEWI9H(NZ;ruWqbM;(*x41PPk#>XIGhXIynE;BwYT(G zTK7*b-)L)7R~M9LJ-N}-+FS{$_lvl+?r+`!t^2R9-gu*JSM^Kf*-x(Zya|H!MFp8$ zTK6~afY$xj127g98`~H%7?<4vqu&qr}lLc4GuE0vG{|07d{K;B^RK-o4kI zay($6BH(Jizfi}?(Jx!Pdw5a}�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
  • h@PR5m2 z%TTW)LzrvtNHlR>&jSKFX?vYx(rd1-O-JW5>4v+VTI1U5o_PzgC&C!O=Ng{vJP;wC z$H=S$b3@?R^?w~*OmOL=fkPh+teSq1?TnlU8z@kwL40n%q>5s*;dC1e#Ywiv> z`uZY|OyJ}%SrvKM*DDD)_H#wXo0rJlUjME<_p3uSwP(KUFEPYhu< z8pg9o=q4`$HAjsa=bpf2&6q3KzMmX3^@3;fshL8(#MykKp-ka~x&%}OY`!6QOuoHb zduR{-@KJjhC;Uk>+*5HbL+kGDhHTUxY5?DGPsB0TJ~3`rd0G6fLnW1a;>-5DoUGTl zH|5%&2{qBRC%N_py7mhQU3)f@NW|3LD5Y!f;V4~uXz#vhn|A8j&!IW*Q_;0I?ThvE zxrlC;m1}RJYY&h0KtOkvfgyCqDpy0_6Zl*NGTaD~z2T};(sFWQom!KQ2f_zTdr2O;|A`dy%5zhZ2pv!%YQC_iT{o38!iFG1IS z?0V;EXki2B<$nYP6l4JwU3(~ib?vQAsF|=b?)))Wh4DGa(0{6=cGcdP!jSb3S}Tub zl_$LJpTVSSf4RA&deyGz&7nD?Ee9LcmBnrMU(2Lxf9rH<-P*m9Lf)!RAz!8_8c#XQ?ps-+W+t5zkI{4 zYrhbdL-pl<_~E;6sk~0@FjUT@Yfn5=rp@&j_C(L9UNK?Am1|EvoiWrbCmw_BIDi`iwaL7$hnan;%=?KqL--)4iIw`RbV5heuiR;hc!(Ia9K0v%C(=S zAvm>Jd%5;b?UYgFm}_sswNF|RS5s11R&wyj%LLax#X#47-ES;$?cwdEt8(o*z8zYq z)0cl9x%T%k*Pi2bwww)f?e+NByo8Gj=)q(6To5Jp&OSdWm}~$1Tq{@TDdyU{!c};7 zeb95||N7VOCk=V^VbF=^l4~DHeobu%L2q|GkLk)XaP8H7lx(?P*Z#^?bX7yyu+E`x z+eURxtJcoz9OrWFyRXsKW7TcDLR&kt+p8U*M$^OW(!+Ej!QP;W_iV7UIy*Dgi~vT!-4VcC zdv~7!?l*oN#a`#Q2nLvIue$XWLcqDNgKvcV%Ji5(Slp7>=t%6%L=0TyRmj>6%(Z8Q z1}97r0nD}c!W)WW z&`0;7-dOOgaqZ-ckjGzP!)uS>9ecg?WT- z{{&wmWs}XFYgO0YsJ>KN8!#$Oo(Kd2L~OJL1Oy;rqs_+i`CxQWdyit)f@y+Y!PkQO z{-S{VfX09keJ@!{7$*#C%{a<-W+XLf!{--F>vO>cR@^1ii^O#9mMAd+fnyi}i~vSp zrXXOMYyUrg{P#cn{`bFw!Ad1j5uii@1pJ@=`#=Bn+i(8^Vr;thGFeI@nH4>K`sY76 zUhAGo*PdKkpm#33+Q2k#7`XN{p<2(iZ*9|QPmIzxgPa`aa_#A^JRA1=Om20Wi5o#VdeNW6?M|17-ww1!7;k~bn?=bXdOs^Ni*pnOM7t}S%Liy4scgH)`4a%Kz z>G*B+Mde|6mNaVohNfSoRLG?v#J8}F-j9hzP@q*^t=uY4m>AKVQyo$i$fcTF>RyFH zzEK)C{;~SJvRs}a6%hsQJ%BICBC{!!h04N-Pc&VsYQ<*xO3f##i;BwZOldL{XjLAd z3yeL8k)VlDO}DBB>RmoQqWM78ppeUDnsHU9;z;(o*g&#{{fg~Wm&PAJmnQCNI@NEf z$`$LzuWS0$%}{uw=2KO>q9!{#HhBDw`aQBsVMLeiKa7?aFHTdZ}dM zwx&Z>so0bqNfh|(fdo*xIo__WQteb`PTYaSD&-DEE_Cw}V3{TrLTZ<~R`E*qVzR(v z7=tb5mNyf4&|IbnMhTAV;UA8JaRGX z9m(OKUGuW;_wPOZvNGb0Me<8Gj$FxTUD^~}ePd*wI``a5zX(2bwzu$1(ovCO;l|Gg z51dbHj4EHeQ#G=+M|v)-fv;#9+}V|UTv*NDb!Xu4#k992mHe#_hss)08zT+`?ra#| z+8y5%RI{LDXr%Uov@@{{i%M0U8{bVj;{WRWb$17MonL)SwBLXGqr1wXO`S1s1(a*9 zSNE-H7T54!Z*JdoJf$X3J}>*`@aykM-wrGH-+5V6){}WwRLv_M9IjH!-W4DAmEY>A zJo8FJTzNpjmmlSximP9|&-c~AkvDp?&PN^<>}wl3*qz!OT_-5H(q7iIwtC4Me(Ns} z9O_u}PDG_(XUAYkd-|#HD*nz3m&-b2$0MrzcAP%*>YFJF@pgXNjiIWpji+O41NXY^ z#K8l{2+RNkrmDOFYk_)Wz+YB*!$lF{;o|T@GzY#k(IpIX?OozB z;7&Y41auU8onz8C*Vm?_^O>1y|mi&$RiVU@t3TMJnZY0gnSz3ii|fek?W7&eS1i7;k`h2 zep}nXV-HWSIq!pA0;3VR12&ZyU5~SldE0gnOA)_fJH|vuMNa4DD|9B;zJF+Fs1L4| zTCMJ)tg~}qaBy(IVgiv9l$|<=>q;0|Lcd5iWv`>Xy}c7m_l4M(2L{MWSrb4riuh*l z_dtP4XJm^UFz-+;0xQY zT#?Dx{EHVazE4c+-d>rE&9_h2UVW*jr{@D|f06k6rZ(JDaV{h6>;_0>)c)f8@S>L) z?y309=h`1xO8v*qgu|}ts+UVjcg5{0FN@z@T2>KXw&!INu6^=y9oIfRFDpHMf^NOm-2Q5fxvy zY}t?BfA1j^%tOFCNTs(~0{fmoi4eL^H$~t6nsV<$!00^eM|cCRHB;_A(MKX_p)vO! zdC#8h?Z$Qe&DN{q1JAVvTqfDw2G z2z+?f1I_Uuo>9RsIM1L-#wLndYKpdO$;*_zvdq2rfj6g6zL+Zi z=lP!6^0IwJg;Wd$!Fwr(8x!|FMrYBHgo(v5F{Bq38mjf|iV;FDx{8DlsN7 zF!!FilO5IH(7K_^z?vS$SAa&zGs@dQ;kiTd;hWeBoM-1k-suItZ7im6{{7i z*|_%)J|(#KAFEF&OXcbE^vOX@t!j&6nPM3m_x|B1aPOboRKKO%uE7wlq2NkWEzf7tP*~7%W zztW>@&3-HXP|)^|uk37*y(Kvk@EQ~MexxVsP09X6g$uK~`U+2{91Ypc+rq@X|D@|@ zM=kn-^v@b#6PISSKu(&!;IE|s1xF&x0Xy#ya$f~nhQtrjlf_2@|Pb;W8>aC zX!P^Ylb;IE`k#tD{`sff=>Po*sJhrJAYhGq4^O(`akUt}-c{>`g#@}%jCyho{R`E4 zVZn=BDMmi(2mC^VwO&}TzbnNoObr)F0`9#pLJ_cuffpo(V;F2Q;NE9=Oa2MA-)Oh5 z;rKP7i$C`rNn<9YFIgo{r?yBqMjj?M7a0`p1_uO4?!71G-aCt*?_BOZxsEiGchkzf zpUJ@Du}vQWT-J=aaPOyY1kP>QKJLA9`(#`@hkvXrS*DFL#L^$OaD|q8PcXE(aPJfK z-21`}@mU2qTZ%Fc)y1z|zAUkv7&FDYzvc^^saeNB_MT{WNiXswH1Fs7z?)4l;_WBF zyPpF;OeT>mqu`@>_eds~jsEs;XH)47c=vXh2zh*NTF{htZ<@}0&d$3h`eMr_1~6F7W80dg7Ji!UyKPy0^I z*m?I;tJl`j6=$v*JasiL{bb-;bF-o>rzrKwwa%vcJw@wtR*emHo@lNt`+3fav0?D4 z$_jFp6VGRF+?K?k?}o0u+q}PQLs8n3;m+grrA2u;vavxTTTxDq6bhVbu7%hdszA&V z^j-h8hWc$qt8?O@=sWehi!veG<<4d(x?UPPcCGV#eMM1$G*Me1#<+i0&TL+t#RaS& zN+!<)l(>x3)$=^+-T!8;BJtIL)T`Z9O)K|AZ4Fv~Z|HD))`{54z~c7d?d_{hh^qWb z?skrLrf2D~unNCoSH}hSj~M|Yl`Dp&HsWur-Wcm3 zN#sB&_w@82_OoVrd&6h(DDxR;sVmO@^6mUsL1bhE{6>kx!$IjvEH3nN8I>!>QO(d` zOG`}+#gTvU#o4o|LF#$;0-wM9jnb^wYu<;>^YQfZ`a7A`12L6%HdIW!`&g}MS@NRL z0MPt_^@ot4K=25Ihy8ZMpkPEq1W^&So$w;7GR9RZi$i+0{8?YfDyn5U<5D%7y&m% z0Bhd6@x{kOcP#|Cl1;egbFI-??Tt0wJv^y~N7cfR#e#?k5%usJJlBcAx8_p)3nU%l zVYA17_^jz!3ynFrfpdB9O-P-{gF5=nz{-rLH%PvXS8 z&%0=%cTe)}{k7r_@Rl-y;N25~_e}4IA~u`z?ty-gN^kb^?xC&wrtLYJcTe<@XhUe! z5HtT>&!;!aY<8m0$ANcmRGPV6TX^?6oqJmEo<0)a3qWl1=FPKZd*KCV^6t|Fy@Idp z{8R=39M-$nP9L{iVa9_t`s0C5Faj6>jDQ;=P+UxF)ARYh^C-E>yj)>!LT+A~FpZZj zOco|5B>y^@w_3P5VRc@jFp(z}QatZ7t!?T)W*5=z$z-|~u}gzu6C_-oq0Btq{Z#et zCr?fs(B!F;R3Vd16ZYKoPsvlmacPrReqqm*SYX4AXx?jZE;&rZ~7wkead1(W9{j%td)dq`bVm6Mk&^$%v!yC1oDRIw>jBIeKTZ$ES}e@lEyu$W2j{>s^kU72elLP7)` z=l1Mfmm8PtAB6Sp@e2kcFtZStstSiSz5Cv#ifn0Jkt{hjDk>6wL4iXQ5gslMFZ6a9 z6%Ne1pILJnkH!HAaOJf-I-di&{ybNKdH2AHcOqxsl{ofHeR1`;T2+(7UC;D6A(`;)B*`S(KQ#c#^*|WU8X3>Vw?VoI=h|fiIyR3Tm z`bNQH=G_}*v34R52oSN+2A|hO#73Kq=kvknqV^uy_3kO&{e6E?Kz=}Dz=*z=9Ge2( zJ!#ys!)GiEj9VF|TsAL-;sQ)Cn#M3nrid_|+l&%ZB{+r=zzARjW(oq^wiRp?i^E_z zfBozClZM*%MC^b5`0s!C{qKJVo?h?%r~m%XfBp8`|A5#+jP!SxO>R z=hLTu{u330><%*~z56(0TM`?s4Y-)c1OnE(r=D$$>K}2qq08kN3g+FLzJ8wE7{8#d zQ5MRVKDj&Iscum2luOxo_oMfLAPxmu)z!+a@`Q;I%{kQ}MS)z(#=F1w0C@LgHifcK zSvc{Drb|_=*eqYk#=9ST0KEH&QBAk12I^ftKBDmxXzx_Nr7Bmf z8^5mUQ#V85jcmO8`wxM44@2$IoK;t=ilIwt^}DLWN;w0gLYqb9cbe*B5zY0&joGs>s6>AD`gi8*W}A*B`(8_K@V= zd+kBn+6EpwLyz9s$kMv@Y)5;z@{TM+@$M--tVE#{RI&2%w`|){yr)#va-prOw}0U3 z$gMl~K70JDuWV01{aU+WU>}X#82QNdgb!`DsAph^&*zKzdHg0?fh?JyEKbf#ZlaaO zNZm0wU#(RhvmHd%5~y8k2H@VfdQEffDr>@GttA^+Tzo=&9BTq=RjdiDRk0>?*=!(K zY@@L@VPie+klj!0$M@p}3xgAa^OlL1@t5(|2-hU6$y+8|_T3t-&xLod*4brPPo&M* z57k+8g3b*!_B%OP@G~@lSilbvQoQ>VaSET-xKDX1v!Hk1-TeU=wHFE_z|8lCvvevm zZRYFUA6QEL=UxQ|4!ry1L>=!wKYioRw#MfrB_<}88*=Xd?RyUo^qVjLpHF~sFG5Rt zq2gkM=K8>wCV|0QPaWre!z&wK-?(YZ>sgz&Zpy6_2dwbJ7f8vOcEn4^fP?_OI z(AW((eOuhTg<#xrx_+*TGgs-ytkmo==yK<9{fV6Iu`6R&b`BqYJLmOSS*&bqsPjZ~ zW!cYjR*VgUS5;P!vz&M;J91ePgZc;GK3-6im=YV`KUDvA!Oqx}*p#tBB3n^TjuZ-< zYOXEH%UMGfxDvAjT^(v}D%v4k5gT*$>f7%Y$P-t@E*-nv*<4>*v|buJcCGV#eMM1$ zG*Me1#-MZ7UA!D^9V3L?5+yFcxO$$>wp}OE>z0;>Y(LZfTJu`vl7k_y-y1sIo^>L& zGO)OPczgS*6QU}=64lwlH&-8AvOB2Y?Q>h-UR4#dFR<|Q!TR?%ok*w(-TldMZTp5( z@wFlQ-f8-I?aI>F9f9i`PH+Cj%0p2lfdyACm$hX#zf>DsdiPpQ&(dRI6@JC8jtlM| zGXhgxWrJGb4H2>P^z`%~_OoVrdwb8;n$JMvw!}bkl`S$d0)C^!;o+cgB^DQYxy&jX zGcq$Xs^`ozaqjKYBmm() z*(E(DY%u2@bM9rM?#a0~xUFDxnO-mU#@zBvEFLtM>4H(hD6t@brv?i!M&X%&lF@+h z2}S@TfDyn5U<5D%Zj1ot+`I9`chjMpQSN_m5g?3M3l{psHJ^nlTrtTS=N>qDadAsx zBSk{j^q_M~Km-T+=b|3*Q3a}hF6p`AoHXncp>6N?jieC)$DZKchXDa95~xsO*ob2b zKM9G&At7QDy8vnt5S)Hb&poK(B&;rbdd+F?c>n!NU>^}|Hn2}Vy>o{t_C6SqkIIG69WbUC8`qwW zJCZ+dPhD8+UN6aIhljQ9?EnoIacu;+tQm9R+`IND?eCr7sengw?lYfe^74dv33+*$ zDCKF21X)Yp%rt7e`Y{$M&hv9E`O(EE9XARD(AjPsO8*WAUOB_ zy#Pcpp>y8|4$0xR$hr4i?KI9ki_Sd@=br2>)6P2Q9_!p|aWm1ucZ|;cY^I9>v8n3Z z{}*MCSgO~CySgSOx_al$Gp55>E@LTmCalcjF<837blOZni5`pdkGv*?Hp7RasslaI zm4Egix8ra;{s#|K7wL(Hu6m;3KY60B?#x2p$-L0QdtNB@WpBjupXIIpFYNq&;ubIh z7=f9DfMw48^P_XWbZJ5Yu@P$x#8Y!Ix#}==FYYDsA-ot?2^``v%^l3Sr|wlp^|!2U z=yG{}f_3gqUq4^`gStt%TfR!_KXL2BreE$Zk);XPbnZX81A^>d-2CvIvP3S00{`$~ z^Dp<5tW67G)43nH13LGb8!DATk)0aL*Nmu|6{Xp-#1J-}duTy|KECdPUi0yL=PLKf*Ghvm_f)48#qu<12%FCR^}C>Rueq%{Sy?Jil?H!!OLb1M zH-AkcpH1f;3dEuhM}MhOlxMF_4Epen>OI99`LaYmHl6$HpJ1JP(`jjbJ`-+;@EFXm zt9b;YWR8h>#060@?<9`6Hv%g4#-^m2kllV;K5TvM7pu#|<%@EebnZ(}q*h0k1a5v& zTHm<-P+U<^-n>L6o%<8&Evlrt2!-#a!A?c<+8RlzAdgAs{z9v~F=@YO$AYwvPVTQ+ zQxaXkU%{kve_LI4a^>NOk_E4fy?3ZlS{Av@cQupFy{c=|iP%GdugzWi_|mJV;wpoR zUrb}txo_)!^<>=P;MZSFy?>?r-16G6z4O;G>D-Tew5vVwSZMkD4POjbytn+Q@QwLd zSm)loUn_X@GY^5ODsW((d;KE~OP)Ee{{`Am!LIXtHy#@9E!D)HHuGjD9+9&Uu*$jT z%Jgt_K4%U1IjPqw=N=w_gW$}P*jUm@h>I4BwH}Vm09;&unlk9z&o|b&&wW7Y+!IGO zoqN|GC+?vs0;JA8aN=p5`<51jdM}NPT>oich{${6I-ma@u;ea5Y~-h*VIp?>AE;PQ z4-p$CV|PC0^Dlsctzqor+k7L1Ridn;jpo*~9qr-CJF*Ps+_S&8<&c6o_Z&dNS)MNh zxU3mt&ON1b|GabVU-0-p$lK$o?%y84xffNtKIgtdt8>2=`pZG*K52!HbAO=h;Qp%m zs`$MnE0!%!tXXELbszjK@a|_FXUaoyATKBiLpGRbAgdsdv7Zbtf z8HgWKGu65`O()K6(Yl9gg$y@8I48Cc?FI*%?8O%sz&C46&BRkH?y%C9wCl=ft}^Ee3B=jF)QwC-=*2Ce(= z`mZ(AZ!21z69+}#so!0c36l6MTK7-@Yu#JD?k>3K?Sfsh3gdH-;Zg7YH**zrno@~8IFCu|{!w>DL)Kn#j^FBs{fFMk zJrun)AQNldKL-`^&fUV+C02o)Nug9BgT+ zsoAn6FH4GEd~vq+Lw-_8RD_t2wMPPmD>G5L0<)4}nSRK2~edk%Wmwp#i|X z2ey1jP#}2r$Dky9zZg*w)T*s-DlsN(Fz=pv+A*qs=;4MgmuDz5k9TkWAI3Ps^m?&3 z=7MiAahJGUOpFpni3I^XHCTW#3S*Rv;J_ys0gM1f03(1AzzARjEFxgeiJwE8!#MHg zZP2v)7aZ1x#X;gkjKK4N0L7ND-czpmtk>jHIjr&S;Yl?-qZWoN7DPmdsE6O+xlW9b zI4AoTNIJyBd4Vg%!ofsgfZrl;;7Ih(m0~V685ueQdi03UqgU~H9w0**(4swF&>m@> zdO{QbA0JYh_z^sWL9t63H)F4c|pRUgrGd?30{UUBO&A08N6I!ZbEKenlO!*Eld_BCnWzm znYUWFI$?EQqA-ys6;fR9Gp%jvK4uruJ&?(CeZVdaicOGkd5$vkxc7P6N>#nL?tP`d zyD;{w{qdMQIdMRfr%qCZOg2sI*Q{43t3uf{@4MPSoPDx&qFz&^PE*BCzBi%NY*%Nf zma=KytJ~p&yptUh?`qyq=c`_x?3p;JIiTLEjAzrl?`{Xpd&qWLQ=uwQteE_8qE%C; z+NO}PY2K?lh%Tuonl<~CnexcVzKOG%O4U}yS~ku5?heqrpKP1>rDnHsZFUe8ZPJt} zGqQu(H1B&lK=Xd`;zXmSSh+fT@nrkNJDNR8S@vQ!&HL^S(7c~KJ5i_ErcBNjOrD!K zswo1G$EJDTLyW-|bN)Mb+ya;DflPn~}UUIFL#6{>zTC{FO1$ix3*?IeH-bm4x`v zP$td$M?F==87rbf0_Tl>c;JofY@yiKk4f|Xp8CL!{LHvWp4Y9un#y(A;#mJ6Ce8a> zZAW(Jtc{ECn?0nismjSqmih-XY2J@qJgV4~DG~E$_qQK9n7<`HC0NX)d4J_>#jeaX z5g{Rhj&pnVuFH)}_7B3E_ip<#!2_S62uxLp!aD8n$Iv;ay+$M^-_rQyHB5&W7 zc=k+varKEl0GxV?1J5IQ^aRI#?mLpkOyJ5dStU-Vwy?uXR*~B!U#}#ROHc6WeH!P& zMjX9GB=?@++j~p?iR9o@Jp8X+ef;j+KU2;7sqo;L$~qfcnq$v)w1+S6$TFCFPcN(4 zb;R6zyI{kGTp0l_YsQ#+kGc2G{@-b-ep|Wsi8{@DYux*5z9zc&B=>%<522t=>ZoJg zd%!`@sV8A!-Rbjj;NBa30}(Ul-xlsYam5Tbtb4D&Oj!3`kA+(! z^Ly>4qvumyZG%2z-TUddaCWxIq+4$z_ufo5-_EXZE{3`H+UEhI^m74A4(8tL&~fQc z1#o$eGV{3i#!P$jGtPe$IAnCoH?ero9A*Z>C}EUX5WrJ|1sJ37OhCzKK==eBfDyn5 zU<5D%7y&m%z?>J4x%X~79q`bn69G5p@?-8j=H5@|%gtpY(AL%4KX7&A)}4EwJ^s~KwkH^9XwhqmGwg`D_cQE*;^D|- zT-J;+_a1Za?fswYh;kKL-TO4CjDzld(h42-e%-;J?LAmlT@}A> znO?w2r+(;R5PhV5{gIjfu21Lc%|&#(B1HX|mK2!q?m=I}+uM7VfgxlI@7^C8Fx&#* z+;B5(-`e>?Fl%|9mvl?K`?0H?r|S0>tTw9cvvxY42Wy}&Z zcD?g7w6Gy()!0W+KtUF`43(4?t(V3^b?56ViVCEO+5#~)p*j;5jPV$_TymRH;!>%r z=jlIHQoCwzOkv3S2d$OIvdR-)_s_UDbhth1L~LbXar^N0_EjfDRemLxn@g%!?TX$U znlsvRuwh+U+;;!9pAXi*zv)CmRp{~%7Y2Dhrl0x39Pa$8XB4NAV z+AEjK+OnHpstqo^d#$Et>9Md1zhYO%1^15`0VCeMISukB;%}@agIX=~?i;ry27dWw zezGt!G6H_1#NpwfbR`xSdby0s6*Dq3GrDbC!A7w-3E-oz$hQz=$@Jxa_~E;6sl3iciivlhU}$kmVxuF;fXjJI*zklrUb--y zmn2N$>7?b&9o@6BQTmYsCkONHbueMxJq3lGdt&ZZoK#;m+@hvv4F6(`LQJn0dt)}g z0mKEkK#fttD6t@brv?i!Mq!MS5gaTh&PR!*VI0N?U<5D%7y*m`M!@Y5z`T36yX0;^ z;2+G)MIgbvd)2M45CZ;v9eh>fSEfhTeCCaN<*3yN7kL%3c7xEk_xncDh(O~$8u&TU z0)!$#%u);+actoyA+b0lL~LRgAZ{KNi+8j}B3YaV`tcA#!0Go$OF<}h4iCwY%&T}d z4|)1~&fNh=Uqby9+l)ql6e;lWQStZN}z;QqZZ!eZcW`%ok0A!M0%FLxU6{wCD}{k}!}&Xk}v z=%d!Wg*yH_8}D8SgVbB9fZ)IT%%0`#rDMP&bo(cG18$RX;N2V5=K#LHKp;TGMq5BY z03tTpY&@S2Mi;gBC}u5~Cg>G>Ex7M53dj#=3>eY(lC^|!!m!qiqiknJR2Um(k7<3* zUpvJum}1U!j!|Ml1;;P~7y*ocJ0YOw%`@@t|L2eY{)gZH{&xTf#l0*m(CcSxO?s<$wD0&wp|}7a#NPwRfAN^j)VV2lMWA=wRMG1%;h^;_sp%=brGV zNV|{9+g1t-i1)rSzQfR;5p7zsCpX3~sB4sk@}*Dij(4gXlso0p@!RT)%ER(3Y1H@) zO}|R1kV`{|&x(!SkBLQ4pjBP1+$v9)7}11aDHifcKSvc{Drb|_=*eqYE`9yV5QJI}7O@;!k$^&$Pu?H~{G%>2_R@Feg z%g0AFAE+7>a=A=1uIf}A$zB&5NVc$Fv7PGD_yg$D#9d9N`YlztV%_+4O`p0M3UAbW zs%lr%WM{_)kKa+hM|LTU=+ga%u@VGB?a`c7SF4JlOKSDIs>4dT=DNB^QJ$SHT{`ip zrcYI`cvTui6_7*|V>quqs@kXA2#MXQIz_&GDRiV=SuI~Ll}y~$bf_v7o3bN`0-rsQ z07^H<+tpR7oyyFKJCInV+@Z*YZe9W`)1*R3?NZk&Uddie7I+L}u*LA*2N$$3N*E;; z1n|^g0mdk7GfGCK@d-u%wcR*)CG|plQ*g~C&1;>RXJZ-`A3Sm~>mAAApk4E_?)UFK z{jxIRjYaZHH;!D%XkFSATzz9?pE~#4OTP#{bhfwfOwv)2V&TTm2M?T2Ym6#iyi+x@ zwMTj`tbwm+8r<2Hd|X(~-*so;@Wr&ZC6)ZG4~NQHQyU`=1nz7Y-r61C6jZaIWN4)J zgS0cT4U0-uog3dxI^zH8{B?H+cb#8-OtjyB`=h(cp-r7JZv~WVu2=W1X%^S;UvF;T zbUdXdP(CmF=J4z9N#71D_uqM0Q`VDtR#eR^9vrSx%ia|q_Lbl2sXX&aLtJ@4!IvN9 zo{FnqywCU5!I3w5v(85z73^ypI@q1s99<_Uxzb+Nw6=Q58-D9A4;<=P^G-yiU}wi* zNqhRK@GAb!3zy3}WXB__{C1o^^Xi)^3h{P++Kr*Au8pT-YXkSNV@)f*YoZBL3J{69&8H`N&_DL+j7H=R*i>S4 zJz04lNynB04!)06=0nEF%e0ebM-dX=G zxz~F{t9PFXML6i)CnxE6_Z#;fd1G%$W&EbfU1jn4m51Ut7pz~ANZe9Vn)kl{#mv2L zBs&KRqOQul=Xh7_IPQIxf`o+Q4s-7bpu}i43tm&@-v1Y6k65bLhP%2ZCc1j(&C_#X z2+wjEOQ|+5hvEX3;H1+qN;DFdjy9uYsWQi=@tP3Y3?GiF4)jD<{@H`vj>GZzA3RW9 zq$e7>>WPN`rA5pV+pW(xN{MQ_Oo z330Kpkq{ugXff^C6H5dm>WhxldeM>Msl=G36gSQLt7zFRt?8V_T5H!i-Dc)o?)^)2 zpKc9516QQ8UY#d$n%iT8b?ME9Qa$=oU0j}{kY9w*MtvOux$gt+`_-$%miOU=U9!A4 z?{p_=hH+x_GF(XfikKS4`J@Fnq1|Yxet;?5U z?!C;M-~R$_s9@Lmz8en>_m=qvY^eg)g z2=P2_%{nkQ1dd&sl#8u4i!)3+0wnj|6LasK#m{#x_dfpCt!0B?qXs4eUuJtkXb5Sc zW^Y7oPxw%4W>v8!5TEuS%&f$;a_?;iaoS6afEmn%QF1caeg$2#1ncy9775e@WtgJ2 zH_m0vcw^zteP=FqU)J0n|ANh5l0?7qWiosGA<|-A3JD1Yqh5Qq`$S=?EP(|53TE>S zU*&9h?Bm`qA^r-=wEHWhZ@4E@L&-mHmiL!06JwzEeSLc0FdmQ`z!UPblCyXl`74rF z@YeE+I*1>7^!lUeKX{G=Zqs7V{M=UVeIjS>{mnTZ9%$AvkiI7dwWJqz#R$#yfiG7A z0}*x0+dx0! z6ctDlwFP2~`)B3M1=oOam#kbfGTHekap?v3Jo*<9_cBw@*?+2}cGcdP!jSb3S}Tub zl_$LJpK)*KaC_E?*vi1-_TlaAt4@fj{7No2msGFX6}>q$XSC&D!@9D#?fz>&AFO|W z(}{$t(A}R5*S2ps6<-^&@7C$ky0v>Hg}hatLcUBz!gjy4S1y;eWjDW68(ez#T20T= zV__A3#Z&J&u3iB3IiYBO~B9N*o>z zYFA=$p_j`jT}=n>)77SB?*0Ex{>wL%ZoOXjK6IXsrym<3AXzKk74r{~h zE*u`P-3VCa-rHUC6bl-&7T7D}nvcB(mrTLj`)9%1$J~2+Cx05~*86=UX+)rN9}WDR zFd#rh0u@RO8*yymCn2#oBt&dt7a(pP6^nPYMk1Ni1O0dip$k4dkF*qoV(0LX49UDm z-oC%5Rx_VmbhNkIxZHDq0Kx6|1a5!DNmyNWg04QB-aQ?67N?$Tz0T*}Gt#XI61Z&% z4y0QXoLa*43{GLcSSf{A%jdNKuX5-r% k#+M|~AG9F2_qO{pjC(&o^6f3|Ewk>aR6~xvdvfppe{lF&o&W#< literal 0 HcmV?d00001 diff --git a/root/package/firmware/wireless-regdb/patches/501-CN-regd.patch b/root/package/firmware/wireless-regdb/patches/501-CN-regd.patch new file mode 100644 index 00000000..198d1978 --- /dev/null +++ b/root/package/firmware/wireless-regdb/patches/501-CN-regd.patch @@ -0,0 +1,24 @@ +diff -uprN a/db.txt b/db.txt +--- a/db.txt 2020-01-06 19:33:27.707188000 +0800 ++++ b/db.txt 2020-01-06 19:39:28.663199594 +0800 +@@ -291,15 +291,15 @@ country CL: DFS-JP + (5735 - 5835 @ 80), (20) + + country CN: DFS-FCC +- (2402 - 2482 @ 40), (20) +- (5170 - 5250 @ 80), (23), AUTO-BW +- (5250 - 5330 @ 80), (23), DFS, AUTO-BW ++ (2402 - 2482 @ 40), (30) ++ (5170 - 5250 @ 80), (30), AUTO-BW ++ (5250 - 5330 @ 80), (30), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + # 60 GHz band channels 1,4: 28dBm, channels 2,3: 44dBm + # ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf +- (57240 - 59400 @ 2160), (28) ++ (57240 - 59400 @ 2160), (30) + (59400 - 63720 @ 2160), (44) +- (63720 - 65880 @ 2160), (28) ++ (63720 - 65880 @ 2160), (30) + + country CO: DFS-FCC + (2402 - 2482 @ 40), (20) diff --git a/root/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/root/package/kernel/mac80211/files/lib/wifi/mac80211.sh new file mode 100644 index 00000000..bf1dddd5 --- /dev/null +++ b/root/package/kernel/mac80211/files/lib/wifi/mac80211.sh @@ -0,0 +1,127 @@ +#!/bin/sh +. /lib/netifd/mac80211.sh + +append DRIVERS "mac80211" + +lookup_phy() { + [ -n "$phy" ] && { + [ -d /sys/class/ieee80211/$phy ] && return + } + + local devpath + config_get devpath "$device" path + [ -n "$devpath" ] && { + phy="$(mac80211_path_to_phy "$devpath")" + [ -n "$phy" ] && return + } + + local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')" + [ -n "$macaddr" ] && { + for _phy in /sys/class/ieee80211/*; do + [ -e "$_phy" ] || continue + + [ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue + phy="${_phy##*/}" + return + done + } + phy= + return +} + +find_mac80211_phy() { + local device="$1" + + config_get phy "$device" phy + lookup_phy + [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || { + echo "PHY for wifi device $1 not found" + return 1 + } + config_set "$device" phy "$phy" + + config_get macaddr "$device" macaddr + [ -z "$macaddr" ] && { + config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)" + } + + return 0 +} + +check_mac80211_device() { + config_get phy "$1" phy + [ -z "$phy" ] && { + find_mac80211_phy "$1" >/dev/null || return 0 + config_get phy "$1" phy + } + [ "$phy" = "$dev" ] && found=1 +} + +detect_mac80211() { + devidx=0 + config_load wireless + while :; do + config_get type "radio$devidx" type + [ -n "$type" ] || break + devidx=$(($devidx + 1)) + done + + for _dev in /sys/class/ieee80211/*; do + [ -e "$_dev" ] || continue + + dev="${_dev##*/}" + + found=0 + config_foreach check_mac80211_device wifi-device + [ "$found" -gt 0 ] && continue + + mode_band="g" + channel="13" + htmode="" + ht_capab="" + + iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT40 + + iw phy "$dev" info | grep -q '\* 5... MHz \[' && { + mode_band="a" + channel=$(iw phy "$dev" info | grep '\* 5... MHz \[' | grep '(disabled)' -v -m 1 | sed 's/[^[]*\[\|\].*//g') + iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80" + } + + [ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode" + + path="$(mac80211_phy_to_path "$dev")" + if [ -n "$path" ]; then + dev_id="set wireless.radio${devidx}.path='$path'" + else + dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)" + fi + if [ x$mode_band == x"a" ]; then + ssid_5ghz="-5G" + else + ssid_5ghz="-2.4G" + fi + + uci -q batch <<-EOF + set wireless.radio${devidx}=wifi-device + set wireless.radio${devidx}.type=mac80211 + set wireless.radio${devidx}.channel=${channel} + set wireless.radio${devidx}.hwmode=11${mode_band} + set wireless.radio${devidx}.txpower=22 + set wireless.radio${devidx}.country=CN + ${dev_id} + ${ht_capab} + set wireless.radio${devidx}.disabled=0 + + set wireless.default_radio${devidx}=wifi-iface + set wireless.default_radio${devidx}.device=radio${devidx} + set wireless.default_radio${devidx}.network=lan + set wireless.default_radio${devidx}.mode=ap + set wireless.default_radio${devidx}.ssid=OpenWrt${ssid_5ghz}-$(cat /sys/class/ieee80211/${dev}/macaddress | awk -F ":" '{print $4""$5""$6 }'| tr a-z A-Z) + set wireless.default_radio${devidx}.encryption=none +EOF + uci -q commit wireless + + devidx=$(($devidx + 1)) + done +} diff --git a/root/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/root/target/linux/ipq40xx/base-files/etc/board.d/01_leds index 4aeeba46..5a9a05cd 100644 --- a/root/target/linux/ipq40xx/base-files/etc/board.d/01_leds +++ b/root/target/linux/ipq40xx/base-files/etc/board.d/01_leds @@ -53,6 +53,12 @@ engenius,ens620ext) ucidef_set_led_netdev "lan1" "LAN1" "${boardname}:green:lan1" "eth0" ucidef_set_led_netdev "lan2" "LAN2" "${boardname}:green:lan2" "eth1" ;; +pangu,l1000) +ucidef_set_led_default "power" "POWER" "${boardname}:blue:power" "1" +ucidef_set_led_wlan "wlan2g" "WLAN2G" "${boardname}:blue:wlan2g" "phy0tpt" +ucidef_set_led_wlan "wlan5g" "WLAN5G" "${boardname}:blue:wlan5g" "phy1tpt" +ucidef_set_led_switch "wan" "WAN" "${boardname}:blue:wan" "switch0" "0x20" + ;; mobipromo,cm520-79f) ucidef_set_led_netdev "wan" "WAN" "${boardname}:blue:wan" "eth1" ucidef_set_led_switch "lan1" "LAN1" "${boardname}:blue:lan1" "switch0" "0x10" diff --git a/root/target/linux/ipq40xx/base-files/etc/board.d/02_network b/root/target/linux/ipq40xx/base-files/etc/board.d/02_network index 0ac8b59a..f49f224e 100755 --- a/root/target/linux/ipq40xx/base-files/etc/board.d/02_network +++ b/root/target/linux/ipq40xx/base-files/etc/board.d/02_network @@ -52,6 +52,7 @@ ipq40xx_setup_interfaces() ;; avm,fritzbox-4040|\ linksys,ea6350v3|\ + pangu,l1000|\ linksys,ea8300) ucidef_set_interfaces_lan_wan "eth0" "eth1" ucidef_add_switch "switch0" \ diff --git a/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata index 4b69c79f..22fbf2db 100644 --- a/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -124,6 +124,10 @@ case "$FIRMWARE" in caldata_extract "ART" 0x1000 0x2f20 ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 2) ;; + pangu,l1000) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 2) + ;; meraki,mr33) caldata_extract_ubi "ART" 0x1000 0x2f20 caldata_valid "202f" || caldata_extract "ART" 0x1000 0x2f20 @@ -219,6 +223,10 @@ case "$FIRMWARE" in caldata_extract "ART" 0x5000 0x2f20 ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 3) ;; + pangu,l1000) + caldata_extract "ART" 0x5000 0x2f20 + th10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 3) + ;; meraki,mr33) caldata_extract_ubi "ART" 0x5000 0x2f20 caldata_valid "202f" || caldata_extract "ART" 0x5000 0x2f20 diff --git a/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh index 9daa7768..66fd2c50 100644 --- a/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh +++ b/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh @@ -170,6 +170,7 @@ zyxel_do_upgrade() { platform_do_upgrade() { case "$(board_name)" in + pangu,l1000 |\ 8dev,jalapeno |\ aruba,ap-303 |\ aruba,ap-303h |\ diff --git a/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-l1000.dts b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-l1000.dts new file mode 100644 index 00000000..1dfdf582 --- /dev/null +++ b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-l1000.dts @@ -0,0 +1,388 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later OR MIT + * + * Copyright (c) 2018 Peng Zhang + * + */ + +#include "qcom-ipq4019.dtsi" +#include +#include +#include + +/ { + + model = "PANGU L1000"; + compatible = "pangu,l1000", "qcom,ipq4019"; + + + memory { + device_type = "memory"; + reg = <0x80000000 0x20000000>; /* 512MB */ + }; + + aliases { + sdhc1 = &sdhci; + led-boot = &power; + led-failsafe = &power; + led-running = &power; + led-upgrade = &power; + }; + + chosen { + bootargs-append = " root=/dev/ubiblock0_1 rootfstype=squashfs"; + }; + + soc { + rng@22000 { + status = "okay"; + }; + + mdio@90000 { + status = "okay"; + pinctrl-0 = <&mdio_pins>; + pinctrl-names = "default"; + reset-gpios = <&tlmm 47 GPIO_ACTIVE_LOW>; + reset-delay-us = <2000>; + }; + + ess-psgmii@98000 { + status = "okay"; + }; + + tcsr@1949000 { + compatible = "qcom,tcsr"; + reg = <0x1949000 0x100>; + qcom,wifi_glb_cfg = ; + }; + + tcsr@194b000 { + /* select hostmode */ + compatible = "qcom,tcsr"; + reg = <0x194b000 0x100>; + qcom,usb-hsphy-mode-select = ; + status = "okay"; + }; + + ess_tcsr@1953000 { + compatible = "qcom,tcsr"; + reg = <0x1953000 0x1000>; + qcom,ess-interface-select = ; + }; + + tcsr@1957000 { + compatible = "qcom,tcsr"; + reg = <0x1957000 0x100>; + qcom,wifi_noc_memtype_m0_m2 = ; + }; + + usb2@60f8800 { + status = "okay"; + }; + + usb3@8af8800 { + status = "okay"; + }; + + crypto@8e3a000 { + status = "okay"; + }; + + watchdog@b017000 { + status = "okay"; + }; + + ess-switch@c000000 { + status = "okay"; + switch_lan_bmp = <0x18>; + switch_wan_bmp = <0x20>; + }; + + i2c@78b7000 { /* BLSP1 QUP2 */ + pinctrl-0 = <&i2c_0_pins>; + pinctrl-names = "default"; + + status = "okay"; + }; + + edma@c080000 { + status = "okay"; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&tlmm 18 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; + + leds { + compatible = "gpio-leds"; + + power: status { + label = "l1000:blue:status"; + gpios = <&tlmm 3 GPIO_ACTIVE_LOW>; + }; + + wlan2g { + label = "l1000:blue:wlan2g"; + gpios = <&tlmm 1 GPIO_ACTIVE_LOW>; + }; + + wlan5g { + label = "l1000:bule:wlan5g"; + gpios = <&tlmm 2 GPIO_ACTIVE_LOW>; + }; + + wan: wan { + label = "l1000:bule:usb"; + gpios = <&tlmm 4 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&vqmmc { + status = "okay"; +}; + +&sdhci { + status = "okay"; + pinctrl-0 = <&sd_pins>; + pinctrl-names = "default"; + cd-gpios = <&tlmm 22 GPIO_ACTIVE_LOW>; + vqmmc-supply = <&vqmmc>; +}; + +&blsp_dma { + status = "okay"; +}; + +&cryptobam { + status = "okay"; +}; + +&blsp1_spi1 { + pinctrl-0 = <&spi_0_pins>; + pinctrl-names = "default"; + status = "okay"; + cs-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <24000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + SBL1@0 { + label = "SBL1"; + reg = <0x0 0x40000>; + read-only; + }; + + MIBIB@40000 { + label = "MIBIB"; + reg = <0x40000 0x20000>; + }; + + QSEE@60000 { + label = "QSEE"; + reg = <0x60000 0x60000>; + read-only; + }; + + CDT@c0000 { + label = "CDT"; + reg = <0xc0000 0x10000>; + read-only; + }; + + DDRPARAMS@d0000 { + label = "DDRPARAMS"; + reg = <0xd0000 0x10000>; + read-only; + }; + + APPSBLENV@e0000 { + label = "APPSBLENV"; + reg = <0xe0000 0x10000>; + }; + + APPSBL@f0000 { + label = "APPSBL"; + reg = <0xf0000 0x80000>; + }; + + ART@170000 { + label = "ART"; + reg = <0x170000 0x10000>; + }; + }; + }; +}; + +&nand { + pinctrl-0 = <&nand_pins>; + pinctrl-names = "default"; + status = "okay"; + + nand@0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + rootfs@0 { + label = "rootfs"; + reg = <0x0 0x8000000>; + }; + }; + }; +}; + +&qpic_bam { + status = "okay"; +}; + +&blsp1_uart1 { + pinctrl-0 = <&serial_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&blsp1_uart2 { + pinctrl-0 = <&serial_1_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&tlmm { + serial_pins: serial_pinmux { + mux { + pins = "gpio16", "gpio17"; + function = "blsp_uart0"; + bias-disable; + }; + }; + + mdio_pins: mdio_pinmux { + mux_1 { + pins = "gpio6"; + function = "mdio"; + bias-pull-up; + }; + mux_2 { + pins = "gpio7"; + function = "mdc"; + bias-pull-up; + }; + }; + + serial_1_pins: serial1_pinmux { + mux { + pins = "gpio8", "gpio9", + "gpio10", "gpio11"; + function = "blsp_uart1"; + bias-disable; + }; + }; + + i2c_0_pins: i2c-0-pinmux { + mux { + pins = "gpio20", "gpio21"; + function = "blsp_i2c0"; + bias-disable; + }; + }; + + spi_0_pins: spi_0_pinmux { + pinmux { + function = "blsp_spi0"; + pins = "gpio13", "gpio14", "gpio15"; + }; + pinmux_cs { + function = "gpio"; + pins = "gpio12"; + }; + pinconf { + pins = "gpio13", "gpio14", "gpio15"; + drive-strength = <12>; + bias-disable; + }; + pinconf_cs { + pins = "gpio12"; + drive-strength = <2>; + bias-disable; + output-high; + }; + }; + + nand_pins: nand_pins { + pullups { + pins = "gpio52", "gpio53", "gpio58", + "gpio59"; + function = "qpic"; + bias-pull-up; + }; + + pulldowns { + pins = "gpio54", "gpio55", "gpio56", + "gpio57", "gpio60", "gpio61", + "gpio62", "gpio63", "gpio64", + "gpio65", "gpio66", "gpio67", + "gpio68", "gpio69"; + function = "qpic"; + bias-pull-down; + }; + }; + + sd_pins: sd_pins { + pinmux { + function = "sdio"; + pins = "gpio23", "gpio24", "gpio25", "gpio26", + "gpio28", "gpio29", "gpio30", "gpio31"; + drive-strength = <10>; + }; + + pinmux_sd_clk { + function = "sdio"; + pins = "gpio27"; + drive-strength = <16>; + }; + + pinmux_sd7 { + function = "sdio"; + pins = "gpio32"; + drive-strength = <10>; + bias-disable; + }; + }; +}; + +&usb2_hs_phy { + status = "okay"; +}; + +&usb3_hs_phy { + status = "okay"; +}; + +&usb3_ss_phy { + status = "okay"; +}; + +&wifi0 { + status = "okay"; + qcom,ath10k-calibration-variant = "PANGU-L1000"; +}; + +&wifi1 { + status = "okay"; + qcom,ath10k-calibration-variant = "PANGU-L1000"; +}; diff --git a/root/target/linux/ipq40xx/image/Makefile b/root/target/linux/ipq40xx/image/Makefile index 44b6da6d..9074aeef 100644 --- a/root/target/linux/ipq40xx/image/Makefile +++ b/root/target/linux/ipq40xx/image/Makefile @@ -627,6 +627,20 @@ define Device/qcom_ap-dk04.1-c1 endef TARGET_DEVICES += qcom_ap-dk04.1-c1 + $(call Device/FitImage) + $(call Device/UbiFit) + DEVICE_VENDOR := PANGU + DEVICE_MODEL := L1000 + SOC := qcom-ipq4019 + DEVICE_DTS := qcom-ipq4019-l1000 + KERNEL_INSTALL := 1 + BLOCKSIZE := 128k + PAGESIZE := 2048 + BOARD_NAME := l1000 + DEVICE_PACKAGES := ipq-wifi-pangu_l1000 ++endef ++TARGET_DEVICES += pangu_l1000 + define Device/p2w_r619ac $(call Device/FitzImage) $(call Device/UbiFit) diff --git a/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch b/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch index ade7a675..5aa9be3b 100644 --- a/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch +++ b/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch @@ -10,7 +10,7 @@ Signed-off-by: John Crispin --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile -@@ -837,11 +837,52 @@ dtb-$(CONFIG_ARCH_QCOM) += \ +@@ -837,11 +837,53 @@ dtb-$(CONFIG_ARCH_QCOM) += \ qcom-apq8074-dragonboard.dtb \ qcom-apq8084-ifc6540.dtb \ qcom-apq8084-mtp.dtb \ @@ -44,6 +44,7 @@ Signed-off-by: John Crispin + qcom-ipq4019-fritzrepeater-1200.dtb \ + qcom-ipq4019-fritzrepeater-3000.dtb \ + qcom-ipq4019-r619ac.dtb \ ++ qcom-ipq4019-l1000.dtb \ + qcom-ipq4019-r619ac-128m.dtb \ + qcom-ipq4019-map-ac2200.dtb \ + qcom-ipq4019-e2600ac-c1.dtb \