linux-wpan.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions
@ 2022-09-05 20:43 Miquel Raynal
  2022-09-05 20:43 ` [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status Miquel Raynal
  2022-09-05 23:33 ` [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Alexander Aring
  0 siblings, 2 replies; 7+ messages in thread
From: Miquel Raynal @ 2022-09-05 20:43 UTC (permalink / raw)
  To: werner
  Cc: Stefan Schmidt, Alexander Aring, Thomas Petazzoni, linux-wpan,
	Miquel Raynal

Those instructions do not work anymore for several reaons:
- Two out of the three files to download return a 404 error:
      * The binutils version does not exist, it was 2.21.1 or 2.21.1a
        instead of just 2.21.
      * The avr-libc is no longer hosted on the pointed website, I've
        found an alternate.
- The binutils version mentioned is not able to compile the firmware on
  a recent distribution, the Internet advised to update its version and
  it worked.
- Most of these compilations will throw warnings if you use a recent
  gcc. Sometimes -Werror is set and it fails the build. To avoid that,
  just use --disable-werror in the ./configure options.
- I had issues building the gcc doc but those issues are trivial to
  fix inline.

Update the instructions for building the toolchain and while at it,
start the file by mentioning that this is maybe not useful anymore, and
provide the packets to install.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
 atusb/fw/README | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/atusb/fw/README b/atusb/fw/README
index 99ceb22..44f65f5 100644
--- a/atusb/fw/README
+++ b/atusb/fw/README
@@ -1,4 +1,6 @@
-Requires a very recent toolchain, because ATmega32U2 is relatively new.
+- Toolchain:
+
+  apt install avr-gcc libc-avr
 
 - Building:
 
@@ -64,12 +66,13 @@ apt-get install libmpfr-dev libmpc-dev
 
 # binutils
 
-wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.tar.bz2
-tar xfj binutils-2.21.tar.bz2 
-cd binutils-2.21
-./configure --target=avr --disable-nls
+wget https://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2
+tar xfj binutils-2.27.tar.bz2
+cd binutils-2.27
+./configure --target=avr --disable-nls --disable-werror
 make
 make install
+ln -s /usr/local/bin/avr-as /usr/bin/avr-as
 
 # gcc
 
@@ -85,9 +88,8 @@ cd obj-avr
 make
 make install
 
-wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-1.7.1.tar.bz2
-tar xfj avr-libc-1.7.1.tar.bz2 
-cd avr-libc-1.7.1
+wget https://android.googlesource.com/toolchain/avr-libc/+archive/master/avr-libc-1.7.1.tar.gz
+tar xf avr-libc-1.7.1.tar.gz
 ./bootstrap	# the automake at the end takes a while
 ./configure --build=`./config.guess` --host=avr
 make
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status
  2022-09-05 20:43 [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Miquel Raynal
@ 2022-09-05 20:43 ` Miquel Raynal
  2022-09-06  0:16   ` Alexander Aring
  2022-09-05 23:33 ` [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Alexander Aring
  1 sibling, 1 reply; 7+ messages in thread
From: Miquel Raynal @ 2022-09-05 20:43 UTC (permalink / raw)
  To: werner
  Cc: Stefan Schmidt, Alexander Aring, Thomas Petazzoni, linux-wpan,
	Alexander Aring, Miquel Raynal

From: Alexander Aring <aahringo@redhat.com>

Upon Tx done condition, returning the sequence number is useful but we
might also return the TRAC value which is needed to ensure that the
packet we sent got ACKed. The TRAC register just needs to be read when
the TRX_END interrupt fires.

We then need to send this information as part of the status
message. First byte remains the sequence number for ensuring backward
compatibility and a second byte is added to forward the TRAC register
status.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
[Miquel Raynal: Moved the data array out of the stack, wrote commit log]
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
 atusb/fw/.version      |   1 +
 atusb/fw/app-atu2.d    |   8 ++
 atusb/fw/atusb.bin     | Bin 0 -> 6536 bytes
 atusb/fw/atusb.d       |  13 +++
 atusb/fw/atusb.dfu     | Bin 0 -> 6552 bytes
 atusb/fw/atusb.elf     | Bin 0 -> 52324 bytes
 atusb/fw/board.d       |  12 ++
 atusb/fw/board_app.d   |  13 +++
 atusb/fw/board_atusb.d |  13 +++
 atusb/fw/boot-atu2.d   |   8 ++
 atusb/fw/boot.d        |  14 +++
 atusb/fw/boot.elf      | Bin 0 -> 36816 bytes
 atusb/fw/boot.hex      | 259 +++++++++++++++++++++++++++++++++++++++++
 atusb/fw/descr.d       |  12 ++
 atusb/fw/dfu.d         |  11 ++
 atusb/fw/dfu_common.d  |  13 +++
 atusb/fw/ep0.d         |  20 ++++
 atusb/fw/flash.d       |  11 ++
 atusb/fw/mac.c         |  13 ++-
 atusb/fw/mac.d         |  13 +++
 atusb/fw/sernum.d      |  11 ++
 atusb/fw/spi.d         |   8 ++
 atusb/fw/usb.d         |   8 ++
 atusb/fw/version.c     |   4 +
 atusb/fw/version.d     |   5 +
 25 files changed, 466 insertions(+), 4 deletions(-)
 create mode 100644 atusb/fw/.version
 create mode 100644 atusb/fw/app-atu2.d
 create mode 100755 atusb/fw/atusb.bin
 create mode 100644 atusb/fw/atusb.d
 create mode 100755 atusb/fw/atusb.dfu
 create mode 100755 atusb/fw/atusb.elf
 create mode 100644 atusb/fw/board.d
 create mode 100644 atusb/fw/board_app.d
 create mode 100644 atusb/fw/board_atusb.d
 create mode 100644 atusb/fw/boot-atu2.d
 create mode 100644 atusb/fw/boot.d
 create mode 100755 atusb/fw/boot.elf
 create mode 100644 atusb/fw/boot.hex
 create mode 100644 atusb/fw/descr.d
 create mode 100644 atusb/fw/dfu.d
 create mode 100644 atusb/fw/dfu_common.d
 create mode 100644 atusb/fw/ep0.d
 create mode 100644 atusb/fw/flash.d
 create mode 100644 atusb/fw/mac.d
 create mode 100644 atusb/fw/sernum.d
 create mode 100644 atusb/fw/spi.d
 create mode 100644 atusb/fw/usb.d
 create mode 100644 atusb/fw/version.c
 create mode 100644 atusb/fw/version.d

diff --git a/atusb/fw/.version b/atusb/fw/.version
new file mode 100644
index 0000000..6f4247a
--- /dev/null
+++ b/atusb/fw/.version
@@ -0,0 +1 @@
+26
diff --git a/atusb/fw/app-atu2.d b/atusb/fw/app-atu2.d
new file mode 100644
index 0000000..6a248fd
--- /dev/null
+++ b/atusb/fw/app-atu2.d
@@ -0,0 +1,8 @@
+app-atu2.o: usb/atu2.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h
+
+usb/atu2.c:
+usb/usb.h:
+board.h:
+include/atusb/atusb.h:
+board_atusb.h:
+
diff --git a/atusb/fw/atusb.bin b/atusb/fw/atusb.bin
new file mode 100755
index 0000000000000000000000000000000000000000..5f3c76c20b9a71076a3c5b5dd27254d50e143fa7
GIT binary patch
literal 6536
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

literal 0
HcmV?d00001

diff --git a/atusb/fw/atusb.d b/atusb/fw/atusb.d
new file mode 100644
index 0000000..8ccacd3
--- /dev/null
+++ b/atusb/fw/atusb.d
@@ -0,0 +1,13 @@
+atusb.o: atusb.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h \
+ sernum.h spi.h include/atusb/ep0.h
+
+atusb.c:
+usb/usb.h:
+board.h:
+include/atusb/atusb.h:
+board_atusb.h:
+
+sernum.h:
+spi.h:
+include/atusb/ep0.h:
+
diff --git a/atusb/fw/atusb.dfu b/atusb/fw/atusb.dfu
new file mode 100755
index 0000000000000000000000000000000000000000..77e203029cac8a291de0377dc6ba5333e47f9877
GIT binary patch
literal 6552
zcma)A3v^Rex;{ImBxy^MVxcV$lRhjhg(T&nP<a$obQWR?j1L@~wCbSv7&_}Zm(jbf
zoSj3PraXF{NgI%&cTn+q#oVPrRp<%htfkJ9;*2`>F0bsg$P_H}6pj=bwD;d9q%CuG
z4edH7XaE1+|Ni&C|Hrp?wtN?pEq{r!<qh!r&z|F!Y&pmJ<NeNE!}xzDf0Un7;yT<l
z@G1GK^W)AOvWLV;|JjR4lbXSg7hhWtw{#EXlGjef2~wwtFV2fwl0$a+3DDr_>};7~
z?DC>4yZj<NVP<QONO)<UnU&_6?eeog`*nt0{vE=kp>yKl-^ttoT+4MfDcpe_o4L-5
zUAYJI4o*He@nHVJDF;hqOJXH4ySzH<j@Aa!>WwLbLwCfQ;cb^UW?7Y{;vCHrvnrle
zt8!5;>-P~)tm&*ozC)GK!66jw9`dwa-5%&-2~U>xTt<r{)zW>;31Js1a?EkjryEU(
z{L;Hx3DiH}bLuq@B6aNpdulrU>!g{1CH{f>(?BIaJ@r60qV#?VMVfs=#)lWI3QO#A
zI|CXKR;q>Ha2(fLm6@@bpqWc_h>o`%Vophm)GqCpIwcln<%Q?b9$`0nLuf}R^1`(E
zG*$wt1XKyAQakDt_6zMoi{RiLhaJ3&&sR2!En>U4U+fgS#N*<CI4n9OmsCjJ*qN)A
zzI$y__wc*W8~pP~<#(fFd^@V=w=gW<z`W7+WtW0pLbarxP#ZBxyZlPlIZv<WQ_mkg
zZ+oJieD6L_*(@KaCN(78%L?m$CCgjBxO`>#y7DK=pDCYSjw@p2F2NxT^8@^GzKieV
z_w((13%{ASDo&AQFxUt)th5pAMD;%|bx98K;{#tEnD$Q4_l(B*IyCIFX-ic(?pDNN
zxkBzx;$m^6Lg~0(jb5QeJ6a7|YllsZU7^J~b{e#u9bwKcugoH6h6we9Fb?|Gf?N!8
z6FL{ah*+*6j=3%I@oJ;dYJyfMK28lAt*y{%jt4oD%7TYu;^4c4;{siiRl#KYyJPn>
zy$fDxiR708(ne{sl-}n7X;>mcu}Kq3OulG=W&@8+>a1{wnHTOfGtsz?4ZmT9Ip&rC
z`xq<DF^5jb<RRFDTYG;_3W@owlbkIXF0so;Glqo$A?*{Jg^fZ$@C!=>ub~&U^{Ag*
zLfwe-wdw1N3$!|4SRbc0_XtGbSZ)i+fHkGQn|roNm{8xn@<>M+R``Gk4PWkJg`==L
zYazDQ7k6t;@hDU3y^L(C5BN6&-v|6kiP8&e_6^n5G&+Q7Zs1J^o*Q_Vk(;wBO!OIT
z%PAWFw?O<?nOnY5Msk5u+<>e~^Ead1v6%ui5;h?0%hBy}A82wJt-{sBjeVq~VqQhz
z?8=NnupKK=8FslL19n8R%a3L`iB(N{HA3$F!Ovp5yximputJe3Kko&|8Ge%sb}+qT
zUEq2Bs13vVF^sDys0j8jbMq}WeNCdL2hF{~V%3(b=abAr7tqeCToNtJw`h6~VSs1T
z|Dv8FXs*jrqcaP0GHm)L@Dv7m*t7?aJg1Ums@EUX!IT7T^^qfLBT(rKro_o4o#B36
zzal@WHl%pk;v*MS0-De{bak-Dm|vT7<dPcfHRS6bC3<?%!W%3X^>0&LeSM;#hiZ4f
z-U}2u5+!ty0h()*j@*=BdsFj1n@EBT;A>e&UQP_2FnZ`m6ZixIy<l{Tt3Q{}Qao)a
z@lJyMIyL%8BKdV{bbsQrga<FdCBDiGtM+wbTW`v1mz`Wi{+eKg805E|=yo!L_=ruV
zyU~H{az!@#Aj|y;Ev-2Ld&ETBhA4;YVL7&km0m(lvB*>_w4!>U4Y{eO-n-j>8Qsj?
z=nZ;#@^{qd_|E0StG$81oZ|3M$&~VdTPiX=<gF(=a64|yi(0IDd!mL^-}_5{S|dI|
zJ!rU#)*`!Hnk6J?UnXkPn}O30d1w!s3^W!bg?;%N&EQ2QyPSvI!0|~hplazwR3rTd
zs+E3^>ZQGiYRXG5qx1~br&kd-_}DKD$sAM!tG+HV3qOum;BA;WodYq>qNZY-zG}oy
zub^UbE6m@Geg^LWW;whc&Dw_9C#laiWBR84T9u|hMk%z)z#H_UyiS$wK;gtn@V%0R
zdp_L>cY-}h`EJnLuhNwU4SjMG!TF$<<}~E7J!7R6nW!9|1oI?IzE)U6ZORY}<O$kK
zz4t4B6Xyu1-eZJD5>HU%gS>7FHsXn{+Zz~bi7(V`_<4+t*}4r4_n|u-Yh6p{uY&oH
zsnsW{K|dDs3wn11sIBSfI>>m-z>XQGCy)+xCSHUKjrAN%tpUnJO5z(TwNpy7ZHASG
zORQHky@-sc=g!NHSx&<vta$~N@KBARMS3=FzE#_<Hp71JL11st!?2+Co`DSP@?H~b
z%#qrI)Ev~>G)L1hY43ST9lPp6vTn?%a}Y%?OM!l^8dCXVrFrl?&~PWLuRpU&y&DHG
zZ9NI?aapsCd8xgq-+AzLUr!vV5EScB6f}x|sPE^i>}kQM*mpwZ1~ipDcCIqQkkJ~G
zu6W0Vu93Qus?s!DQeRfdG4PFxs7`1>N0D8AD7!F{@(bz}yUwRaUY*-pPSQNT04zA)
zOwk44H`De$O1l|oH<?GX@?}(s-Grt7SRqxE5IkG7VC_bNt3->S6&t^&^z;gDKe>vO
zlJRQLs0B{(S7`jmzWfY$g;%W(69m4J#wJk9XBTLYl}uJ;>q&uJLbO7L!Fnu5>*9}L
ztx>FU7y1Qy99>2%79g7xYUO}9_A=#INAcjE;9r7Af=BG1O#LkQe$W}RaOWD6jqiiC
zc34KS1g+U)@sU+Y;W;`7b1a33zC<~ZT|!QjB{KydDXUme(Lmh3`H<hS+CU27EB9M`
zh2lwIgYu+Ka{*)<mHuYy1&Lz%t4&O}phq!`$<`+)+%<Emi;e7UOI)95BJTNA>VK+D
zq!7Ng=#2&?Tfd|>k|LmF>nqhzY9>unFR9H&Kb!t7d{O>fJ$!|mRQIb}4NWSwZ3fS#
z{Z&n>Zebbn5%;>qe(C|IP7IO{)Jc);!Y&~%O0$$r>r%~s%YiJj5b)6=z(+Z-JA0WR
z^yZ~S;3o^sPHBmmkrtcn0hj*?bwXsDV3+^Z5{IuRg$dE?p?!UHQe?a^6=Y&xfffW5
zWKnkj`q{}fbFAP2470x2ro~kDM4Gk?g}EG+2y@MvFwg9R%CJ>^9o-!W_;({OAb*P5
zsJ+ABlQg4PbsLw7r{M3{Yths(K4;n_b=)<s%K__hN=spl)n=!78$7qdvmBn=&D7_q
z2UUS3ZwE_aG9j{3SO+U!mbb<d{<czGif{9E>kr|2l521#Mjy%httG5K43u<VN?EEC
zVLq&O0j#zSP-%{eBGveWV{lqe-g!&%LKaw~3i!7Gzg+tm*_7)5+tAnnj0yi~G&~H5
zJ~^OKT!tkt3$>nl=!byGSfP($4IJ6aP+Z#!7%q*wXe%AR^eo{f*(dWxa@c5e0*1tu
zxCnf7gT8HzT>bFrf9tc$1=*~03UI2%;96GFK(13f#e@kfeZx3KsOP<`bO!imm>}@!
z*I5J6wm=UJdMpB4E;O?zSZSG=BFOYu+{a2kJ({~R`c4>qhcS93<gC$?-A|!^R!B13
za5mWUCa~wt)Vsjma5lDt23RS{{1m1i#qwk35SNI4F(7UfH~;84@TYX3`GlUX%A)i%
zU(4&vUA^ynZX=(1UM+dIWK&7yz#7l2fn}bZe_P<W8(C#MRhSwYDD(UQWzICIiV{*X
z<(?sS_`JFYEKPTo8?I76hs-opyg_7zb4(MQjA^8@!XOidC>vy&Asg0Nc5z#c-`(7H
z<F_@`!qF^f8Al^30TC7Y{xfwnifr1^k?fuFjIp&zg`Ry(aCn7!!N|JU$QirUTF{`>
z>mysRf|ubnc*_(ei(;8<omVp<RtDiTQYd|nu8&-n&Po%abu|}I5KDMH#gKR&rhRRi
ztmXurK?|!jkXgQHrS>^0Fmlu6s7?7JdIIV#^}Q|YcKYe*?Eh=`w4ogy&H(MGq-qf&
zz=(qTz*aQN<y^^fOVnJ*Q@POzk(rRQCP99m6b(*k&9mxZZ>x7a^qvqoBV2~KE)?9-
zAd}WxsA&U@FQ5nx=jCX0ju&#{<{UT&!5OuWRamKyNzcSYlX{*ZB|qwm#<kJ4I6+U1
z*|C{ML#A2-TBh`6g>M-4AsR(i`Gu+RsaqlIeqisuK_vSo#mzSD;?Z%c8+tG5^1(aY
zRTiP%L^Hup`EWXt$JV&b{6;>&`}rljcg%T}oYkP>Lp*crnJ7VUVz(-(DoFkIagLtm
zAI%D1LC25dMlVIC6g8!@QL2BcW{&h8gPAGKZwlj7?i$<sF)t<?fV<b$@|z8~r803o
z2s^#qmhPF(S``1V!gLcal$l!d5*knH`cgj8j}rI%uRnE?FT<Wd`UL+v%04rBB(JeT
zsi~<rp|L_aAo$lzbe6p~R{Aefy8m6LSCb-Q8#Bf!mYULdilT+l97?rmF(h!q8^FhJ
z1bmvhRVXU19CQmaOiXm2?!Lx(G9kOOQmM%;m5=E4y2&ZtXu3sZAQtGF>DpWK+6E2$
zJ?8w7@6Dey73#F#bR&3H8JrKUwo9FNW8f&<aM|Tm#*XDfexSWj<Y6PGmOwtI($jY$
z^u+&(4U?<a?SdQz9x-rypfLK$Ahk8!uSQ>v)>s)I3X(^RJ+sUCnTCERjq{B#)3hT%
zztXn?y$^mr=2l?l$gMy)X_w!#(Q_EJ1GQxZ?9mKU7^J>uYc#kieduk&CpLOtLht(w
zf4FKT(_xL2&qOz9P01MGmJ*OuY)b7_N|H@=iX~v(ViRY`r*@`zGwo?HR1Ie(UayvB
znrfwrk@L~Yp4G&BYSg3t5zVHhQhC&KoZ@tN%HS!7X9heKrY+<#*t_kZVeVmal13d{
z2T_+~xg>4%v79q#mphEAIvZ-;hw!yFc28_gY*lP^Yk$8+Xx?G_S?MFDDalG7GPF&t
zHXG_8E6g^-oh<C&>a4YJ^GWxD>!&-g1y-7hSla6gBh!4rgx}(x3m*!<6|4;(vc1Xt
z@IBl+eZjPBVkPK7djWDteYO01>Wdhei!k(*-owy3YE@`$-T*sC@8ulSON?q)8+E*W
zQU0paarom-2CB_kwVbQsR&eXMr?}_17Opi!ddQS=Tm`4}b@+x!?`Z{%lN+ZrPHo)b
zZJQqYo>zDUEA4)>O7DhmbKT==R{lIRE3`P|58c0YhWZieK#a$%u6Jy5HM!bcnev~9
zHiVuHZ4K=T{SW#Onbo(Imz5|~&(m}qUX1<t{)SO$nLwo{oZnZxRk1y^JG4J^aBF!(
zRl|ygbq!B7JlD|D&>F6djIM!ZT6+I@&vd4Q9X6@s?Dx6o+;tOwlToNeU><s(qIlU^
zR^`<x?@n2jw5YGT-gUi{cfjJ*UYc?si)#6RvTulmmA!{P29y^4yUk-M%{;d0d-Jic
zkB>XXxF_rNN}aOVZ&fY~rPgm%zC?e5bIx~dKXi>#&mBr0x)`gBFmH|*m)6u&AB0R@
z>ZLsK5C#s4GH;qDEzn%=xDQd?FU7u#IS$j?`Qfe^*D=@lXTHv6o`4wBFvC<Ia92-6
zFb*M`sfaNlhRwB^p$R<3l7UUt3}Z7xhaV8Ut}`)@FpP<@6*`88t6>audh)lw_PBlX
z-2d{c`lmha*}mDcp;cAstMd8Wx8A<y=gcNFnej2z6A!o<bkFkJoX-D#WySvi!E9|3

literal 0
HcmV?d00001

diff --git a/atusb/fw/atusb.elf b/atusb/fw/atusb.elf
new file mode 100755
index 0000000000000000000000000000000000000000..ac18ae42dcc789b79c904d18670114beaf2cecf1
GIT binary patch
literal 52324
zcmeFad3;sXxi`Mn8Fof9FwY4PX2=90B1!@Yf&vL)5Uur)5uzc9833(U&q<g?NpccE
zv_hS#)~a}|;!r(sy{)w^THAWndhG$J7p>J`Q?XtvzwdYLwfEU4iuJYn`MrO<JK6gg
z*0Y}VthJss?7i1I`-Z}W^Q4r*I$UC@u&8NZ*8D<<(SXxLx^Ro}qOV9%;hk0l!1o53
zrx&;jC*%7E6Y;CC+ko;k$kOMqA>bjLCy&Pv(F#xOTqqJd-;jx&)qwx({9{aFXKL&h
z%YFD2;{P-Kk?_=vv}a!Y;CJCSpZ)c-sp0+M1L61H|M;jY<ZU~v<AHMz#JqN@U-*G{
z4uoZBc*h-QABZ`6Dyj1-SkRQ1h~i4>JU=0+^A4Qb#Er)~!fnB`J^tV{Pg3W#;MIDQ
zIycBbc+<1}pV`pa`gmYf>$6+CS|7jphSq04ezD)dfd_{i?0<03!J!Ao?w!3iV{cMt
zNy3GDHih?O?d>{w>cYL-aZT#1ONi~-Iy$vGb8l={=APKDk2}Y|mmSXByY>BG`0p}j
z_sLUo_iLvz_e9elyyy?Nh4YVnDlgcT7raCqZ@*2BN}ig=^EKIL*A-bMUB3FuvQv7B
zzbiwRUbesZ*`mvXlYO&`KB#{e+%UNBT=tqI|Gl8xwLQDt`-_iayZqs#&V2$Fh5f-*
zfZGlP>SMbm@0|?G(mIkmk{?U%NX^(8+!uT(_-xRRRNLCWFZZ|KE+1~+C*`gm3_md3
z9|SiDZV=qyKKX3>L+$(8ceW?DB|nqgmew|?>xPb<9s4>S>Ug%}#g0FAe9&>aBRQBB
z92tK2)_$R}PklA5``d1l54U|^hT3kIFSYHH^=%u4zipFv_?9<b?2`A$RpI(D%Saqe
z>by7M!_2obf0y~6nU7`e&K#6=U*`BJ+2Oo!aoCcIMZWJ%$eM7$ghdlBpK#TLYbK1F
z5SX-gLRx!r`{}k1+Wy$~V%xKA54G)U+u3$QTWnWKhhGFxMgidu)}fqe{~v=d29rB}
z{rH=Y4}Y>H`<m|7>?gVd*>T<Zq0R&8T^*x4Cv`s2b)aMPu1Q@_^bPISyxmXiQM^4*
z#D(^1-rgr}RlHlD*w&iVxhNt0ms4SS!nQz5_NCApfZjtrtp`4q{?<(g0<9YloE6%v
zsI8#3956!L6m=u0?FU*~T_Ha_JP=N9d$IkG?aWhbS0H@TQ_ecIY9T8)J6II-1?z%0
z1g(1hAb2_$ZXfOHZqIOK?;hM82ai44<8Qyv)7C!UBX%F?2`Inuw@>x#^!eBLgHt_Q
zj(3L3PzQ70S{5D|_Pn1Gem~=MMpEYy@9Fjr+AW{Bp}nr%*Iv{<yFE+U#j=k0$tUtP
z*_wSzPu1wb-KE*vdW_KaW9{MgR)6cpuornU@$JWU1Os9Eu0DfDgunfHvE}rqFZ$b$
zpmr`r+o~G<T6apv5ivIFQyCY^M))}h&qjDoko=Lw_nj&&-kjV%JRM=<5SEUxPi1;*
zY?s)5P4~uk*#6H$`=9CA`R6XXFG%UAma$#i{~QT*_7t$Fy;=scQ+tv+Pr#B-<&r>N
zI6aUZ&X{!eq>;Hf-jOIfe~>zoIyZSyBf+H3)d?x#*wE3e?r?a;XGQ)%Qs+EZn$O=p
z$~9=<571{6xzbRBR*k&~&wEea5<va~h&O5Qq?Ti1+Mt-Yo~4J59h1{W#Kd;b3;p$|
zn3V?J`=QpOa@L@j?w(^|fv~uq--bR6%V}vb#XVwHsyD7@Jv>D~BCh+php!KXkD5~d
z5jtsV=q@>YIJ6mDrr<jC_EDy=vZqJuKN{L(hIL<X_@hu5mN1Q;(8*&e{qCuUKMA$G
zrS$i_aOl`ua@L5Lk9+=RhW1n)+H{Q8t?YRV9LAJ~dY}WAcMmu`{gD4HGu>+s9fb~r
zcPAYF;h~eql|;{xLxJNGb|JPI+H?J(ZZoX=)S)L2`Tu0bK78otpUl|r9s2#D%)snG
zMs|)jw);<qcD!YJ?VPulg#YW1zkM(Iw_9alcw#s^92a73JRy@hCnfs7>u>#~%r8EU
zIug5YImM9HWBykEF@NwLnbI-JwW@uOtZ%<Xrqfeb++OslJg0R`R!de}_<!Yz<iDq7
z2THPhzNw?Poyr(G!IvH!<todn58oWv7uY;-cT8;0zC*>~ycJgzSr)Y&q6eLRkz-L(
z=h%eyLzES}<9fCu<URC5`{fYu{Lr*5dr&uf@KLU$&Ve!=A=$wn$h_bkvN(9BTot@a
z)(7vFw6rbwLusXu_wJH#I(+OqN^>hlgxH?T4^0VN8MrvGBOu;QMH~0at)t_5me}QV
zuN)noi}YWU3vm5F%)@nc!j6EyhCaJJz$^WAro~@F4o4YWVHd-m4Y3AB_RoRuWgJSM
z!J0@v<bRvt>9D&f#GJM$d-@$}nE|`HQ<OgcF{idsF6wCuw+sx%4C)?P%rX_>81xgA
z3axmvXlrY-FO>CCm@TO-EO$LW@U@tLYER5}md{xduZDI6z8?sv)Lv5--Y4fLUz(Ob
zV+qoKDU^3S5BB+CUrW}_K9)6Om!ij;gL3q~+b8@)Xma5Ez(|#!gJvEuOqd!U4zZj}
z%XX+zI-L=#E&W)kR^R&9&g3a6$|GV24vyJ&s#sZJrPewlw)>{gcGUNNiSmXWssy{A
zRx^X7&bwWHm4;adW*RJQ_R)-EdC%IAGuI=-mpfv8h*p#qGq~rgT1fp)ZJB|yVd1UF
z-+S>hLyH5x0I3?#MnbMim*qvj%M7^x)ZZQ<IM?AUC^G+{?+*(3-)&bT_I!-om`x=*
z(;6QZ;m8<cjd*`-f6*RS%u$-XC4D&*ehI$uu`F%hDUZmc&a%XjyG*~JSKRhjD`s@x
zzVmJN^XH-jXLvZf!2Hd1(+Tp<0dKk|(kp)|a{}pMKmBo1a8gD%klPUx=pGXe%<PD1
z?;fq-J3Uqo3g2E59veO@)S||Ml#WVymR&Ck5H>O@cY&~kuUK;vjODq5yU{DTV!Lj9
zyFL7g<OsP9rRQ(uxcEhLt;k$uq5O`#QhqA^fp+vJBfBSH#&Nfp5a^KyTK2d6w&ifk
z;iTUT`+duEEh$@KT0h);bn|m4t(#*aa|w>w&iPSnmpPwf8sa5$M)ZbE-E~`g>TZ8{
za(i}o{G@XyZ3?Gn&p`hk2yF_F1lI3w0nN!g6i}R+9`*(3Z9;^JJ%bO8ChYEiC=C*$
z5ht-{$f5M&sd=MS?;Urj@1d>X^cmFpqtMpyNMIX#HY-kI&nKbH;Zfiu_ACl*F;nX9
z4t)~ZuH@o+{sxTU(|We)(4(P;LN_W)a=Le@u(<C33LOolx6hH;;q=QdD53|vbNpoZ
z`Ott}H?`l^K5#dCskrVJL!SRhMK3c8^P}@IKT1XI+$~xl-4;9_elp9G5}fT3!3#V|
zzO<sNLVb4aXiw@~7jpnuO?#i+eL?r#Jz&>a?ZcomkUhA&1+$=-(9M|r+}gUm)!&|p
zIZV~)xbD3n|8a{qM{a9P4TamMdAi%r_GDvZxH0sgT<r4|-7d2*^XIIM<-H9)$sQ%P
zC$2R<Ff{OY|5vdz`K;981471E%vUn<l@iQH9`igY9R)b&;+%)G&_kc62hBuD7NR5r
z;Xb<-wO@`L&l$KhX4~I#LivG$?ALnA0`=j3Dy0AJih<2B+j`2uv1G}~?+LfhKyJ@P
zZg0V?G&Ll5<pqu>pB#Q{;9p~oew2XHn2GT75I&*%*D|iljkyim4(6Envu4AmF{3~F
zK{w}Rfnb&&V?90e7nqaz+fN9;nn%7RIIn#Rb2w|>MapWwyq8E1C%!$<?!zLj6LZKw
zPGA&#w7O@<($2i{cfWTcsdI3mKll#jsof&5${*~8-jt4a#I~?M_-B#Qf${t;fAB8|
z|BGlrII;KDjCLm^x*>5s%5s*+f7~CO<KYa_iW@lL51u)8tByS%u`g7y7opFJ+}WLJ
z_U~^$Dq2q`qCBUgJkOzbp}cW#9JA#EfAFX{)0{psmv^MmF}tIv!`D&Qal;qh2cF3W
z_9wi%8o!%&^Q+o=#KO0p%Pa{0F7y73r!v-O<b1F+bIJ#EGH?B#b2Asq*v`PP_F-E-
z7@zqcGJdiv)YY}6E57sCDgWuehW4YRS+lLDXNF!u&or!KM2ElqL$MWi#%!tn_LE{8
zTG>gl9lc>`%x$eVDtLSAO$zSWva^-FV2r^QbqFnL%Rhb}inOA*?jv^ZZF+`tYzjg0
zglIW^ap)t}>jqSxaeHVLEEt=W9o`t|3d{*C4Qw3RmB6`7VozHr9&P0$?nXuiUy*%x
zeHwf}*k^ZX@kg>H5DZjt4jDK*K-swN&QNMgN=uBtdsBEy_U@eSSL9&THx1bx*Y%(B
zDvY=Ey^WXOTEx4v&s*1|tP7m>!a8co>p%-ot>6-r6??f<-OJ4m^+P|^Z+D+vlhJ1l
zK>t2qcgxT{17mx(W$np23(|dd{iXd=wCj=W>A{o2vb(+b7Fhg|+!fe1FtwX${Gi_f
zPb%(%aF2Sz-{lXU5LQZJ_tBn#O3R?#*}D&PNAi*aJG;frH?TFthl*jPX|KQi&%$5E
zRutR$gJB1T-H2ZI`J~rIbcF94aKIDS{qYealn&|hU(CjJ+l%9O(VN&4oXLl+mh2qk
zZfL7(^R*SV&2Gzb+^>e;@5YFa_T1|K%kHqm9eZq-ISSHmuWaSr{OW{ldUkweU~?8{
zrkpidy^$$zj+wT!W6n%ok!xGP?7N)OYqA32YJ}b$xAW@iz|NdQe{Dfc-xOy_TD=zM
zKmPV{uD15^t~~<}b+?5}PnbUOo;<Ytzl+Q}`SF2FpLGZSpiKPB5W8RVw~uvg9et?V
z-#!5|_y=4}<?c9t@W(Doe&M?%;Zfl@N1T+7u`X*q#o0on52ZCbm4?>S)$s8#n4g+Y
z6-JHDIho!*(Is}@*OUGg(}_p#?hlT2r3WY2c0K4y=@{cWFC@?wm}lmF&%j$ws`<C$
z{$WtopaH`$P8Yexz_Z5V{vf(sO0(*GNAQFzsdI^{u|en`C?$85t2Q+o{W-N;&qR2~
z|C_i#I6B{H=)>R<AN=uyk-L9$l4Z^M+MJ!*y*cN=sg`hss<WidLGjAIx7Gbk`()S6
zK4R8Wfw#W<564r1$@Wu$ZAX(jpN`{w7|VfWISF+%(X|a)pN`wCLQQ-4wBa{#d|txm
zeaauAaxxBiWVqN}-M#hbUd&rEplP(rtSeJfTqva@1Eo9K)vENfoH^gLJZ-Pc!@W{l
zPhN1cYgKTPeSfs*SV`FPPQ;^n&t@&H)JM-r=@^G|JkAL?C*qvs+8ADgy1NM$_IoD$
zHd~#)6s_*4zx61o6aLnemZZ)n)To+^vF;bZF5SC)@6x?X_Ll5<@4fCY`yKy#{@@E@
z>rsF37lJfPEf?dVzdhH3XR@fll7vg~<db#L`W|awBXVlCSW3OBdYV_owx6_KzwM{n
ze$ujP+fU;j6`%bB&z)WsJJ<Vzkf0Q14kotq-%Kp5dakhGUHUP>aWuAzV{<iXj?d+i
z=_P8kTeUm+v5!07d^Y)+Uq34_+FTl%&^ojA;?~Ps*S22Yy0dl9mhiFg&<TN=xJ$o0
zFk-;d-Ges|**tXfu+2AT-7;>=Kiaz5x&mGMiaa4c8!kv&p0>T~<x^9(T(G5R%gP%k
zhF*|QNRjCYRVA-a+nRPuT72irr>eJHyXD3$w{3Y{{z7^}k9Ga9Yd1#EcNs5mL7*tG
za#KWGJh;5Wxogr-Cf&5<_AL)>Ie6oQO*1!Lyy@~yYd2lLY3HUr+g9z0<bgdcpFb`i
zCo=q}T_Gdsk~F4W+W%_r$nIT8htE^GviwtGyY3(Q)X*hIV?y_*J(YIPz{g`!y6+kK
zcml1wtn0p0e&p<F`D@J5cK>f&X3W_5m)8Ho^U|OGXuKrShxF8Um3G}w6x;RDDKr1E
zU2n)=;y&l^w|w@Z5&H0_M}PY9-ke?H(X%@8i;MFPqNg64#juW_1`r~5i$`4p&h1Wn
zGX1Bt{gb_a-<$jlpU$6taiUwj{`d+Pk2}uOM+(<zA@Uwi&+D(=q{ukeDB+UA-!IOC
zmn#SpG2VbHPlz}V1U{3vxLu-xFJ|IKCZ9f?C&&^t&9#~7*=MIWR@OIVrsrno=7O4;
zlRYy#JAH29(q&@393m(v#81VexDtmJ@iNX-oPL}<hT_Z+Qx!fQ*NqA@F9mpOWE}<K
zY~j&FftW60ZTuXOXyY^RcF8;n#JQrMjn5Q##iWh`ah@1v<FiD%jh_!Y%%ebDfHzeZ
zK3hz-@jQ`j<N3CA1!9hvVe{vTSvFoE@@%|N6xjGYG2g~76bo&9z9_cw1!9?vUnExA
z_{HLK8(%0^+4v$=z9b98VzI{N7l|4hFBbJSzC<+Hc!}6x<4eVLHoi>wZG5?1Hw9va
z*lP1H5j$*rrD(J9OGT%RUnch0_;(!m<qrJ24*UuS?sMR)9C)b%FLU7K4!pvFS32-2
z2fo^YuW{hj4*W_7ew72Sao}qmc&!7kbKvz3{Avf@;J_Olc#{KfcHrwA_<9Gv!GT}n
zz^`@S-*e#CIq-jT;MY6w8yvXbfd?FTivw?U;2RzICI`ORfp2l(TOIf|2fp2b-{`=1
zIPjYs_{|P{rvq<u;O!2)!+{4Kc&7vJa^Slh_-+Tj$ARDC!1p@vTOIgq4*dHL{B{Sv
z&w=lE;6HHScR27n9r#@i{B8$+j|2aq1HadS-{-*Zci=yA;14+PA3N{|9r!~I{9y-v
zz=1#F!2jLG*&nmt$j6x>LTc<_H&P(}gFqdW@o2n2ylTfS5U+{7Hve_Cet=|wcthN7
z^Z#4yxA8xUJ8V2dzF^~H<PqTPiz{&E4l?0JjRQdE`HFAiP2w)dnD{yezFyp8^RE&2
z+W55&{Cnbln}3~nz{dYgJZR(Bi-&Fe2JwiE`^BR+9uSY&c#Ak_<E`RJ8{a6Nw((8k
z85`d$LN>ld9JcWr#dE-!Z>t>GzekrtmZKc9mAqLFx#DNGo_q&BM?7!y=ZP0=e4+T2
zjV~5QY<!7$$;MZRmu>tK@jDw|DPFPh%f+iUUMgO<@iOs-jhBlzZM;H+ZM;$(v+*i%
z+{Ranw{83?ae{bO)7tv1^73`HQx{xWnAs@S)m2x_Y|1%5NBDf}D$ASd8X9NL%MqEG
zS@wT<LsL%HYF;y!LaMB^!dG3}RN2tbT;D`ltuklMj0>04L!}+Drn;;=Yi)I7c~)g*
zLxr!brmp-dsL=A4thl7Au=-5$&Gm?IO;aW0IS0a$85|yUeFax*-a>{M{zqVDIA)IG
zF$U<v46j6>8U8%NZ#ESw2{U|btQEcjV$-e2fM$4AoE5$U;U%97pORpOzlre4T;QV*
zGk!)ND?A>O9abQq8UA5^EBrQuk9EwI&G1A_KTZ1&Cke6AM3ojZ+(@^=hx8R<)#u^|
z##!Ol4iJK6XdPz!Cnj3q#RG*nW(5L*)aB1IuEn{ww3<MOML1o8?9E6p69wB)*;v`+
zYp4=$gQ%&j5Peb7^`*7d<>J@CRwJ;nvZ1zlt!PAyvbs_@hGtM9`$3mrT^&O3ep_LA
zeY5z9qUe1MSBoPc8f)r(O%38LpqBIca%PB+K{r*et!(f$RF+nVxk%O|t81&9#7bIG
zUtK2#AORx2@|w!h+U9yO35<vy@gPW~MC+<c&3Wl)WgR^w4{2Nj$~4`_Y*kb?mN$SU
z)CAil=rDf*#p!KheYFos1~pn)TOsb%ctd6RI<skjA;e6aE^%?ZSp|23s;FF7U0!Lb
zudYV}73}cK>uRg2S39|2s#_G7pevq&15We`QCXjj){1=dn1$0N=!r*=xnH6rDyo{1
z!KUVVUwPfywRN?^jQ}#&UZXSgl*v%>*Q@yS)FDtk5b>KE%b2lppleEND{3lDZQ>WG
z!DbYWCja0d&Ca8$w7gRM#bVp#XJ$}ByNa#6NhMvUl4c|L1d(n;di1l>ii!r@aGG{h
zA`>uTb)|R%98fCXCxJ(5HAgH$ej;?P$Wu0y!B?PAybh|ezELH4fl89?>U%Ll?1oKi
zOUr!?8^nKTv}uFrgJM=(6?+ZjNYO!g@aht5d7ZH01boJHcxBi>K+-Sjs;WdE1S=n5
zO^wq;S><Xpvst8&)$*FF)`}${RFPAz3WTYzv|eYHiDs%q`=dGE1&rQT)?8gv;j1WZ
zs#NzsCW$6kR%!ZcqyyLpoBoCvK3{3$nwpAg^Je!CN+T}9BY6WTuVW7cguMuRTOKZH
z<N=^`ak=&!TwOAjMd)#PF<c0jD<+3bkN4jch?z_f>)oJ049ZA&UE~=O+Jzh@8QDs~
z-H|S0<UQc<jHR4;`7tqO63Mw@0lcn%SJx+SjiX$AUtC;2{3WhZdR<$3vqTGQMlFG_
zv-c8EW{+9pVDaC;o!RqzLH69S5cFKfd*ZK>(|wd%E!{f+4L)&jtu6#Ayv&b#qjW#T
zfWZiGZzLL%N^~=2VqT@l7IIOV9xPfF-ge?kq?<Kms$0UW3-6zCasNiT;}P9pV(#BW
z)cuw+rn=uLb+KzIHwd{xj)Szi7$b<SP`Xe87eYQxhH#bXlBIJ2PF4*&`*<ck5lAjh
zIc*QF2`9ipixPQ>R=`<*1?f%ti~&Eo|Ngw>!@#US_lGGjg49Pc6;6Yi8B}<#Lz%_=
zLS<H<R@P5zOO+grWWJ=$7vZGciD*K7(Cf*3Vsee;L~(L6qRET!hapW1bNuSdGF%7-
z4_R~_SP8cPMJAu0({B*4{%m#QaV9;a_{DSQ4`>9&NZEkyyHorCbZ#8U)K{ewkxL@F
z5-q0Ew-izleaY0v@LHT&Uo}`f;w0Ozyj;?1Ixn-i0v<lFv3j+TSFkFt$2qWCNFNEh
z&Y*P=Y{8iZ!NHG%Bg+_eH%<{BkAPh`IU39ISrADX3iKcYlNtB`&c_&7p#t7wfEYpr
zRS+J^HZegAdlSH$M^mI6PC|}Qgx4*kAJ5(p;1Xw{Ky@p;92(gQnF&tGW>CQFOWbB(
z;x@Y+IvBbfwhg!La@ZK%*U<vE+243hl5;&v$?Z{HkK62eJRHg0fffeDn!OO7>!M+8
zeGn|;I^e=!w<wL<$Tv>o>J~8z01`YqlL2DyLBHc^+XhM3Xc1S|TqQj13~-Hh#c`<j
zbeNPUwloovK{dvYHe$y>#?v`kNyfyMkm?$#s5lYtqEvz;oyZG{Cf>y-p-EQXF$YAl
z*>@~NxJY8(;YHtZH3QgpcsCMFVc+51Oqmq+9o{YEq8wD;k=lW|hU}6o=9h5NUs%(9
zXpdC(BmonB<wInQk`#IsCk6Y-Ml#1s8cXJzI-oB!A|O+eaolG9iOjPl8JVbQs^~9Y
zAoD!Q$px9+I)L-G0n-_F{uKxs3v6Ib-FhJ}U}6O%*H)uNEAkSMFmVmVmrAPONM!2&
zgv?bk84NNX(E+6U{9c7o;g!JpP>ozgax1Vw71a%zyoaIZ*`d!d6f*{dvTCtjP7G#s
zTmhZ*dAWW_5y+X~54Cv1E(50woMDwfHZ#fuM-=Y^LzvkI!RO&NN3*{24lw0TNvjXy
zWS08M*U7wHlEJ1y=5YG!#bAsOX`I1$?#u%rWxC4v$is+X^t(#2;$15NM{WlzCZCy=
zaunz8GHoaLUN<)?jAoffDT-2&!N~Gf71`^a>hWW8364wjK!a|;Q;-!lU|Ps~rd60L
zIfqf#nTAo<R~|<7gdr9w$r19u9Eq_=NXKkVW*EDI=O7h3U5S#ERk55~$r0>}jEbPF
z3`*5NWm+RSWkFdU#7hWkT5%jquj^f0&1nU7oW_}8_HT()<Iej4SBZra0K-rqD$p&?
z8qAaiP65a3o`~X&O9UDfMI1#Gm$(ZBrOR&);;{T!cD$#Y7W2=`@2ku`<R!`&NgJvA
zcAPA(AZTM9%w)jFkim@W3W}ynirk^aV&!}?$4N417vrijWX~tZ5giCGFfgo+qpBhh
zB2HD6l5>d}UOSU5(8Wwr5zjg3OPx+4&*UWXD?3ROl5n{Tb|4kwHkxj5=IpX+R*eRC
zA~2Q}nJVJg1YLuF0z!J-nW(IImW&ePotF|DDdM(M?Cdv8u{?@B30(Y@UM>zqa#)G%
zTRG&d|FgYv_%F;R-5k6;0rs3O=iuet%KZG3!OOeTgV<{D^0r-16?*XUwllyQyu2MI
zWe#56AZyg62QP2uASG!IUf!+&isIl!sRT(nkry?1#RG{s55*Jf-NO+m_7qCSdyA=1
z#BM^7dH0%>jD474w-&0zT(KdPwf8oY^29EH4)6C($`IZ#+{R@Lyca5sX;31J8^Dpq
z<51x;F2U7psAgr9g6}n6!4=WcA?h-wpJKFHXcPwTm!*-Q_^%>Gw}Him!edl}<27m-
z%{Yx~jBya0SmS+M<BTPU8!wV@(~RIHe7q356)dAfXDqI%ZlN%i>WqO}WK%9s^KHtl
z>cUuNN_t{nf+}OVNqI%GM7Ir&?vLVKYeA$iG}RTKdM9Q3BdZ~4Tnpfr#$_-fEDSFU
zPB#wW8WP6quo!vi0_BPsQUF2YFfPKFjjJ?%iL1-F3_>Z!BalfoUIgC9;IPuy$cDmx
z#s+Zu8#jS7z}Sy#y73QiMjHPE3q~0nU`87rTr-S);Eypb!Zq9YFK}{<|G_oan1Jh4
zV;!`?qK6QCNEi!{+DpP11n?WAXiagx3(>v;HKcEk`dGI|I~ZWz9ue)wDUNx2)bCZ~
z$GwGI%;MA(r~l1JL{5>C9Sombu*c$jb3kp=8U|bd*$s>^a5^O9OerZfUP}&|KxVp>
ztB^%9nI)>=tbg!z=#>#joW%j(H-M&$fI&n0LJ)TxlyA~;@(?&wO|A0TFrG)0VVH`~
zWkrS=fA}~Qj4V=#G15Jlo-wh%F``PWh-t;+9M({IwUA2+5vznG9_<QQ!d~nJl2B`U
z9kh)24mfgI4Z^MknZ|-Gf#y{>Ws*$45;Proq{ST73{EvTqx?W_05Y2H!r&`t(cS4w
zK<);g$B;xI@?1${-(WBdW@|EYdM<PN03>MAc`WSb7%xNq90iK<k&MEwk<rH7iJ*%S
zcdQu4d5rhYJP;CdOcwtd;EBw?n6MpJ@7>KR5KRLxL2h9%6A%;LWAHtlI{15lriLdd
z!qPS`iewLmid&5YCiDgB{o${4yuE-EhQV6zeV5T#IZn0nwd^&doG=@~vHkw8g--*f
zcp$8Al_#7+l-T}*z>zYgkXCWp6qnEBr5r;r6M++1WiBy^v)O4EF)??U^ox{<K$Vcs
z5(<b(YLGp<NJ;I7)MVaM$m!JOb&qoSqf0HSl%mQcDx+U9i%}Vh%8Pgb-ry3kyc3cO
znY~oB3l4j%S3c4HA)e|u2lj7Z_NQ*t+*|h`m47nUxp)2@LaKjtw>1K_#yWR91FW&m
z-C<JZSm%x!>)f4Zq3&Fx&9Tnim7u7|SVuaM7d6&#VrY(a?mfIyS7V(!YOHfdjdkv*
zvCbVe*13C)b)JFWhsytxv2G*W#pM|l2Y*Z|x)^bv0z(>-GfLwmaJO+TaE~zuSFaI=
zt6_}7HO45%HP-k8Wa5mwag8?);F@6k7S}}M6I{<S-o`b__)lDug*mQzrgN<N2FBH7
z)!sZyo?uhrxax@-S3ObVszsUOszsUOswZk(_1NR8J)ZsyDVXD_EJ2=Sp=6qL-|KO*
zYx)>;AJqjH68#v~px5|}@%o}dQsrdE`>u+|ICOi)V`tk(-G_Xa%`_WQebjx3A{UcX
zcOu`VU=2ytrmvtgc7jAAAtch5j$R9qexg5nM)#fNAf)WiBJ!+dflJw!DeM7%06Udf
zF>oiWl$rN|<8@!fUS%uLsQ7~zU!Jexd)<|g5d*w%3^6s%Zq2vD47O%wiSM5t!Clq=
zYt1MSbR=r#`gK}!lH84Am6N4>4DOR$iP3v9u@pW~l9Sm_C9Cd!GCd(hImHy#Zwj9r
z$tmoRQq){xit2dcUG$LDLAYQn_R=4CNl~tMu8OGK&O~dO_PK=+HofmW^)OT=GK;dP
zU-dve-o>{Q%CGvdE29e}C7Pbi_dflbz<e6Y`d<&^IFW5Y5|M}goj~%4>;tlt$o)XB
z0wM;;W*V?UnMi$fE4G$j!9NG8R<?p@D})ElM}%jPR-YEe*-lFbqqKGq`CkYO#>C<#
zj{9_3F@$FJJ4=WQaLRH)hiAIqL!h!`ClT6qCy=4ER@weIDdt8Dc^cQt5&Hx+)N;1l
zpRXBz$%uT;^#PGz194;OGR%@3{ysPZ!5RK{Agh6lpefH-ik2udegwWU<5?n1{kKF|
zdLIK(7AWfyQPMb+j`yHrI!Z`3D;<*&q;%vFVOEv_iDYFBDU}s;9xucEzU-mWSg*%G
zrHhfg%XR<Y0}$vmI6WW98(Q}rk`qOflcwAWbh;R2b~v2cN;z89StjsA)(~O>b>DrS
z3XFG+08EgJ7_6pZBRLgw-*cG`&IdF#@HWjc6;mWV9VWA4NA?Bk{$YoXw+c{OeYavc
zt$sYhi83{VrpYnNG_QN6$1gHyjU212@w#V_!*t|0m5$dv4V*DDgL6JPK~3Pj?&;vg
zyLjs-KElN%Vo<z#p7VQn<Vpn4efj2n7~ZZrd&Vz%7p7hoxxexQ3^mX3e3f~QCo<3R
zM9p(NQS%&6)I7%%HP7)x&2v0od7k5m%yT?Z^BhmqJjW9?&+$afb3FDu$9~3r1H4v0
z<7Q7KQto93P$c;*UR_dEPqBpFZFN{F?^CASlz9OGeb}>>6H8UyTczsW%-%977u|<k
zFXd;J;QEN*H55$sP~ut@$9}}lXPf#FJJD405j#yxeH9n)7ILlo&%R+AlqDHVH+fa}
zbgLlKPd(Dkq4w+GRHFY=l${|d^PZOD+wK9XpP#{g-dGcq)p#;FP)?v_vnAz*VL)c@
z$(P}S4pYZ$>fA}41Le=jm?tSzpatK6;9wTaJm&X7$_<etsqk@0nP;@zKp98o>ynI7
zDP}4|(CmlyQ0W^?<rT(G`h@gmDfx!I4<7z)X6qluB(|y|RgcfNQGWOgs(cuR^(S&d
zQm=u=!yM$Hg_*kFrR+P<-4ETnB0dE%f{AZLgf$42AEb=~nUaW3YAfiG*`Q{C8aWfl
zl|V)n0`a3!j^>Mtk5VxzfRK0o73{SC2J43q%CPt&KLqDF#{VB6e*uD9useYkAmY7D
zaCaK)OM4WoG<3=7A@D{%18NB<7)OU~gK_i%xih^RU~C(Bt{u4G7$^_0nEoo6UG^8u
z^1V<wjt-at#vq*Xqwxu-AF%ziGc4wW0bsopGjXID@=3us4lY)x_kpxVkQK@dAtvoX
zVh5pMaxoAorkL*pn3BY6nJo5ip8I~M$avR(0%lV}PF50L_biWJL<x!Yu-hdzLci|$
z{*KCE&&OPFO;I_{Gryp7T}$_OzMykCU(iLrm5X{6_if(c@dbwUH1o`Nc$7+zpTEOP
za(Pk<Q0QOz$r~c1e+SiPbYq~G#?vTFm+@D4ncHx&V2!&lukadwL8~x~!H|hD>cNjS
z9snoKC`5_J8z&%>V5EYdXskorvkU{0Nyg;}O*V$%nqu4nnN;H#_<f9ZoU0gDfj`g)
zL(d@NGsGQYoJQzSqYeCF#v;fJH(rCb5ysoNrWw=0NjD}Ubfi%Ye3UT<-OOmC3ZWUs
z1<*6bXaPRfSOI*T(E)tCaR;swj7M;tXdK3Ml2L`w$;L{gHN{wiYo-wdC(D=ve7bQX
zG@ma}EUP%ZGwwlh!uSLN(%1k2moW?ihVdjgu|_klaYh1Ul8qOTg;XOQ*FMH5Bs9Rd
z7W~1+ze9eQaSZ(7#tXnl7;!K=jY+irgGp?G5@GxZ0xsjXh~hRD1NRt@0XGcxHnGN8
zh!|)58j=HyG(;cF=sz8S9>cf^!gx{)+oUl=DR~&UTO_+Y!{ud^SOROL@w~FWT&eyp
z)WsSf;hJLH08YBG1j&Siu^U2uDN@cw8n_K`b4gsPnxd;2zewpvUH>NKZUmS&g*VU_
z`>MMFznUxcI}f_#9LZLA5l;3eT;0{bp%U-==TQ7wq&c83O;)7J!oYm0K3l!GWwZ@C
zD)-iyQO{=7{fIh9MLmb)zk?M0_Mu?#+XswthmMxRXtkAiJ9{PNex~HUPs>UqWwNmh
zgO*(ixxvc%Wkg@2T)fK%bO_@O{4ZL$TmA+NMj4N#W{gI9FjrN{TPSuC(T1|H9)Zjt
z$jFC=S?F*+uk@fmhu;Wf6p*2;mL5pPQnGEtYLGniE7pGZGtHk%ruB$UZ<5y<aevNM
zKNDI86;tdN3lXt|B%ejd7ii5Ekh}r;C5gQtM86v;TPdmTpjNrmR#{1v&ndaZEXk`S
zWnR^CTxVtu_E%Hx4alhsJcIC;amuDNX25WdbNL0Hlc&p<S(67<nNdk1x?z?XSE=>q
z+LnW3U{Vj$8!1n-N^r11DY#Gza~<0#HK0rN_>MD$(T#k(ER~CJMliaj657o0t3l%d
zZU8<l6TyNS4gpMe3`d@+(5D~Zy6+s%qQV1QCOUyHqP_i=DptHJ4{!|2tq#b<$v|A{
z>KBtPVzx$H3clC<kjrn1wOL}<i%Gf2l1%d}fhiD}bOmFiQ=8X4nT!i*-bg0vb&ny#
zpu{MXF_sKY7363$3if=8NmCd_GbWP37GN>3b5~4yjzy>?9t1;~KOTdlGF*yDY7s%k
zAaK0y2N+`uRZK7w8BfNYbPvs7HL3^QRyj>(3CW?VguL$22o`PVxLo2jl(`;y*CFd1
zdRgXNuDfXn1f-D%mU8ZI;Nhyvoq8A4edVFe>vE?*1<U{6&=xhcp;+!e!D7K}46du`
zv&Q|nx{O<KbsHOT^%zg!>c#u^zX8e|$$H(Z+f$4Tk~v?JahJ_3B6G1M<A}}tGnx64
zj5lrOF*4I789g@hH8NL8G78{8Y`8IUC7I2V40;urvA-a1#143%*PZL}TQ^x^KeFQz
z7h$TaeKH9dq)##?&j+!rRQse}3F<aiZ+T)-9<J*Oso*Ot3gtT%>An`ycpbk-`h~$J
zA!0T$zPTpR%NH%ubGs?C7cwzyZ5&%+;~fzj=flREaMC_*k4Ya+8`S#L$eOYX5mPTM
zv!<(Ah~v6xDFgI+vP^Pru2dYgG{Cc&oc8tPm`ls_Bo^ze#v{lb>rMyoG*j%ysxzno
z8tb}4ZQwC@9|(Lt;^UcO%ygP=ksiEQaos21L0DX)aQ#R!r*Snk!u5cx0V?A2lvbrF
zK~4uDAC)S|$|>uT&w~>2sP|D7av!7;%SZ*G;kTg9YDVA_l47`BNh(__<dgCmP;WC3
zWBXIe1lNwZ<R?*pNhrXSK}_p8$%j{e2a5R%txToL)XPZAR5>Q8Z-P5%Xi_THjHVb+
zo*@zvE&vOqGC;VKW+t4Mu%Iu>M)NT!dXphSo{=eLCz>MT5*PHPiahk5G5sY;35i&*
zpkUls1>&dK3TG$ILht@{4ak&Ms_6+##_-yTk$fZ-7y!{&=7AQO!f}~0Vzp^Ab;J*s
zIVuY)6E0OsvDP4`?=a*CZ;mL2VxC40hL|LUASl@x2_?=bE|g-bN<$|cNuv+!RLli^
zU5MS6u}kD~!%DJW0tn0usGe#DI0Y~RL(Z(|2pweFMdJrY^2~Tcq%_Na=tvZN7AzhX
z5ipB>xRXI+zN{`#>F$VMc$|LW^`I^i5?I8lCdQ*ChG9&N=^Mq5J<G148AvP+q|OP+
zc*~;_=sMJsXgbbW3_yAJuJB}Mg{MTaqDtQKjp%aMp3LIu>-1Yw3iCoIGvdtso!(-x
zY2koKs?^!LZX7j@(81Auf)xyA1rN1c3-x1ihFeuPVkGJ$4T<P-GOI1Uzn~`zF*1_8
z88RxuV0Df@TQ#|i2zPekKda`i*5)0p$5|dRkt$(%pygYg2a~mW04sM1mSZM54P>8y
zM&^w8Wp4Rp_MWNQ*i|^%P>i$IEmuIN@kKpEoaLoo*QPTy6{}EUtwM>5lz~}m@n#45
zO(*<~woxdHjdTRbbX4?+rs1g`842psyEWrUzE$ODhmpLaC)A?eafy-Ej2ED)3cct>
z+43^Y*tQIM#z-`$iw@T5=!ioic0`m9jo3ov>^B|mGCUH+sdz-hW=2YLw018hGFEFJ
zX|;B=RkO8^c1WV1%doxCk(n`;dyHj|FfL+{+3v?jM%xJyGt97wmP1X7#A0il91;9i
z`h+w2^Ec{N7*Jw4pd?58m*rT_rs}K`4z<oM-zvm@EJO^jR;`)^HNYw;cH>qw6x1N6
z;Q#eS<tz(xuETLsyRVv^Sb2*YC#{K5pGe*@Mw$(`U#6ZF<;8Q*>u<U80B2gxavvC7
z?wF%2HyD#M6h}iE;&gn5quu2I46~XD<|k$o8R3*f+p;P$ofY|oqo7X4tl80#=JC0)
zaE#eU{a@XyMmn5GjoOp)lt`#miK)&?bj&w7>#=9e&I)6H>!=v3$Hjy>(kZgXb+n3s
z&dQHS4RT1K7i4eiP&~x$+icaS^@z2-dRsgrjMs_cK{0*6nkd5uEH6ZnaJ~#LFnwiI
zJP^L_i|SYDUKy5Ojd7}C$XFE_ZGBv{qhT?rIsHek3IzT5M1??dlI4Swt!`sVq!3NF
z%QRgpE0RBxpY0U<XC2D_@6&GQsGY0{FAL4#c&1yXM(Q3<!y~zd+eLEBNw)2S5x+sF
z;&c?Jv!Qa~Y^Lu;ZZT;AduGce>1>fy=tx7%-fL)dm3~3zV)i<wL!oBVou2J%B_r(s
zjLgn}Q99##PBB{NMU!7|K-W|JFCWgW%)@HOaQ?4N@}2c<*mrVY)No@R#SaVqSr;04
zco2Q_7|~)HZdg<7n14Ru{j%0!&p?#78v1S%mBPEt7=16Q$=HGB+*FBLH>L=~ZK=M|
zRYby>JOH<<%6%b4*W>*QyFHRf437$I5~0afKV;ps>R72dzptSzU80&LDnI&LJgySm
z86NyKmWiz9#)d5XPDg1?7Jj`0zxq+0Rl2SrYg*>nnYoc)1i>$SkXv0_UejEGXJDmG
zh?`jsCET5!i8b}uv))vJZQsE0Xb#VFT(97otzmz_*Fh7$so^oe0ifRp90d5G=6|I5
zp8yU7|1-^J8l+ts^5F@x!o5u{@pFYcGxxPJ_H`m<H8)k`nVi~~uZskXtcuE-(rfVB
zDUH?TX8BOe<n}5r<im`-2ARO&bunwxG-Q_hfo9QhSv?^);SdhdkQ>iPj{szmrfYhX
zh8dba9*{*n5zyme3c19jyG#O~rntGlW|-V7$(;q9x-S4^Ttd=wG@J*>G%o@itRcg>
z{n_Kn0ai>*Vx1}Q6^fe$><VJ;MZi{>;SXXZh1bOu4j$JOVBG6$3N)AkPbmQs6kG?$
z^fqX^1(50P0(3W1Vy_O_510n}9xcJ$%WgdL^tv7cmJS#KOa=TIAay<u2-nKMs}+~p
zruPlCn}5~4eE8jmGrAbsfwKwP?J~;mAcWtmfCJ*_<#f#SeLC|j$RnT$xr)Ypqbhr%
zWWAyx7e>-22+8LzRl+wlpOAD|!($pA*Wn*&dKk>29Crg#Ujg6{z<Gdu0WZ?w3pH#2
zq|b3LA>(mxEg=^)l7BNG<Nr?cxjmSA3E7@{H2)LL=ZbE|=esn@B>|F70i-@I1Rxx*
z`CN0v@LbL37J1U#Fhe*`^NTgj-M2%*=gwe{%Z+6_aCG7_16UI<YQGkcv9H&VKT|<#
z)%tBf?r>swo96G*^j;131G=xG?z@1o3EiVZxR;puBBX}LG&~461~gZQlK;Mj+|$dH
z1zx0*&sCs=eKed5NQ=4A7wzOFTwUhstf=wj>$p3dSp8a%>E^aW!%=#<E7P6|8@R5M
zwq2oZTBBjT<~IQ{FV|_>ui-|(1n{>4vUlLRQRZm}Ao3KC6kUQZG@{%7*UVFW_2)Ch
zo}Q^q(vYdQfo5*@Xn323w*#^U2`RT<^SLFLd_u;%M~C09>4!Ds!Z3zEqv2sd)#CwT
z3y14@K=ypU(va)KDE}rPO5hq*!{6i#!me2~J@rFMX8B-ef;l>}aCG9wahv24BTymH
zRbkCWG|W<y63$1y-lXR1)T|!+@taF$?3Pi0Q9UqdJMRor(<ihyGv`25Hq6YJMX|23
zp|QHI_H&(fY15494OO{Qv!hGQ{bLvV02Ur=@R)}0Yxs$Vc>An82{TP4ht~(H&m?3#
z+=D2HTUOz&phjX0nFYueHAmA0fb_}v8mirrd#-1cg<7;&i!Rf!43Hgr1t8^W0I8y0
zhjSk!JIoeMb3Z5D^J&a>ne_93lz#<~?*AqrO$%#y9FY3CPl@~<4L<_x1Nu`yrYo>!
zgYjblDVL<-2o1T)gL-BGGQ9%LU#95_K-zVshTLL7JxzcdfUXB*ysetPS%-IMxJSd=
zG<;gaBY@QVIw0eB12W&AX~-4I43F0^36SXy&~TWBqjWfb!HnUV8ge-<X|C#{ofiQz
zoe~XK>hLRc_?4R9py4_lew~J!HSExE51{)_HD|aDXd_hL3&^6pACN`=G$4}<0n(J;
z0WwQmut@%g8h)(9Kh@9^r?U#ksv8AJ`CJXTjFI|gX*fs2c^WPQq#Y{&X$OC`jjq<9
z!#4m@-}Rc_sNoJkrnd`_Rk2s|_iK2MhWBguh=xyV_$xr>?<GyYqT!nw9tU*$Xc3ot
zo&)$1AT9kEkbExsq-F7d%;69~T9l#r(*S81x9nn;@rG)F+`Fr%*~DZ30#(3h$~r(Q
z>Hu^vWfHr9aYC>Ma0Vc^_qxBY6g>!(+7ALU(sO{c?q`6E`Z6G`Q@ep%RTo5*q9-)$
z(eP6ZWAS!^;oNeEzCA__xm-^X-OqpR9$o#eo%u6&=$@h7?szfi*z@D4A%~`13X}S2
z(`EoN*Yg2c){8Ztn{P<hYPvzwO@PXK09nM`704{MXt-6w4h{EcxL3p50Fiz3_bOI@
zgGIsYp1BM-+A`^Uz>qfO1wd7?ntoNoH#9u1;Ry}j)9^zLxy9>j=;LBt7QuUfyxkLc
z@8ZTiA*R>BSXkV-<;MLYTp1W;vo+*`ThiRuwGePVAd8**uS^|Pz^J1ZkdjS+tT43%
z7O+M0w`=|$K*~R$>Bn^VK@GWe%Y6lHIifkQYse+WOo2PZE&=2QE%%eEkNZ>y#p2~L
zMN%{zreTJLlQrbNE~=OXXePE8*b;D-0n)rGKx(=YkgaTk=5z5F`C9>*&Fz4k#kK)*
zVA}&Y74R-V%5mYDyPDZ~5ZGkEhXGlH+?N7Rn~UjyOFaM0dD_1)jl#?)*L2dzjLCk2
zf+qWg%{L;7X%K|y%FNqb4OvRhgJx;`PDAdsVHpsTAJ*_)4Y|LD;ao$@@Q*d@g9T5d
zxmcFrgrvFLi*Sa9Ts+$Xnvi_1LL*$PVTpz-H7o;UtzW5OJs|Dgpu?{RWO^Gly<NjL
z4R>j{ACP+P)$l<LAJgGa15z({_E29~)5mrA2@QKR{7A!3G~^cysGqxc7{39K`dT!f
zn{?cB>1|tyttGYtSPCHb$hh;#*#qn%z}o<?27Hhq-&YOk5uhxnCjptzVFnd4(h<%1
zotAiA!($r0tKo-$jQN>{eXxy(8Z!YG08R&FIJft>OQ?CimM8;cX08Kdlk)>oa)%CY
z({Qhb_W<%H`(Z${iTw)LY;b<3C0^I?O+adTTSM+Wa%0gjItuJe;xN$<kXB9xWZJoa
zj4@L~?qE6xbb$_^ulW}NGG4KUYcy=q;oJtr`Q1j%->%^ufQ!L@5YT;>D*8u(4hQQ=
zz$*c{U5Rx}$RxP!2(yYFH5uTRC6BxVZ0<rpH!?zXBU?V#jac_+Uw;he<EnBtYrFO1
z9?2ZM(b{|61KH2E*bC6K6@c9CsR~!aX&TPbFi%6ZnF3E8(F=n^SGY`vlxes|!&)8A
z4H0>e+o<`SfULH?npT@7)V<S#;85d}I^+cnU()bh9sZ%FKhe;GT@18+godL4nF9Ap
zuno-uq~19?e4eH+)ASV@mT6d{;Z{KExmnX48s4V)`!#(BAidxoK$Z+QUAUJKdrV6_
z4M<JTY5I8$j{q{}F-^a(;fH{f=l%@$KIMAcrm+F6et^vEAV3ac+@LWL5br$|KNpZL
zIvtQIF3@leAWfPFI1F$x;0VAH9lipPdN0?oO2aEP+yKZ{cP$|Gv;b27W({{}*rwqw
zK<c|4kge-3P2aB}cY(N1sD?t6qK|2K5Rj%3lFv;ZZu7zR%Rs*a)+>PQ6J7;esv$++
z08My8!}m4(2$0r(rfIwkQ*yC@bPewMC;=Rx`NIGypRVZ)4QFYX2gnY44j}E|Ru5Jr
zA=6)`;YtlJ*RVpvdO)VT0g&l%X*+s|F=(wW^%L6BvwN$D_&W0j{ZP>7cpYW;5})rJ
z*eB4KLJeu;b)cE4%^Ge8B)<cY#&>GCM~8DsKI@N=@ov}f4h`=DWPCz~-=pEZ8s4wr
z0~$UE$aEgl^wXL?tl`fz{FM$@EB{rGLX0WAqT%ZrzM-Mo4)7hiGcnqHOoyD%@O=$G
z)R0>P=0T2-nm+?%UOZU(O*&q~6hPWMMAI3X&eU**=3fBF_;WPPT?V8H8UG^9U#uZl
zuESAkadn9+6#g&2&=c0fv*;lN_k#2Wo#Nvv#e&bJXn)rL2wslz-6${s{Ai0J^=#E5
z)N4>nulrFq3%^Qdt_F~qzfRLzHN68+Ihy8kojv=MR{%MoKLN;iTzgMA0+5x#%?v0k
z^-ZbMIPklbH)JHHyY52PaHFM;S8$z$6H_7aMKT%S_ksLmK*k|`fsSv{e62U$5zg0d
zD?pz~=LUrFO%k5gD4nGF+Q>=sbrBxG+2L>YqK|{V$Pv!hLWdnRU*j-++DQF;ZS#nO
z=4%e8e!k}528uJ;JQ?Znb;9&7k--hC`t3~2j#Rp&Z$}*b+cY1-e_45VA`TzRQiisZ
z=Hph}UDz}qvW{}le3&}XLG#IIE>0^xpU}{5i{>+zOweb_>mZaJA96J5IHdWIV#Jrk
z;cGWO9ca*TNb~NVKRs}!bo>b8ZP)-Ehcs`uFzPE?N%J-<+d=bo%JMaa^Y-alM>ua=
zDjYO#Lykj^d8a(5s?>iboBF{IhCs$jlQbuNEHCOH%_*H#-lRE&yV()WiPy&tnsb!x
z4w?hL<$H|Jfj-?4&QX1ugHA*N<vD1Mvb5(+d3Y5%If$j}IHWlkq1sg*NOSP9@<5tH
z1@$qHq&Xnq-=^8&7dvQn(3Cxs4VS}**>xU+Of%Me%<we{-<-O-8oXPsuEpdWpMmK0
zfrpy9+STdm(p-z*C9kclNar^KY@&QkX@j_M@$&S!>1yeT$XZjkwlZsNL+LfOSejB+
zSvzGtJ}P3q7RjnwFCq%5$Nb)i&)3{2@D&R#yr`+GtM}m>Hx4S-qSiu+pMPksX^MQl
zq@u35tftal#^Lkv#}(B(M}825-!IX+kcQ)<CO&*eqnSB@89CEg5Wc4B@~fBvlBumO
zqf)G{sVOThze<0WWQ|x;y?PA_tMMuoZ~8RE!{;l^4~nq(1isx+s#7=L`8z&n!jGJ&
zFHRH|`xX=|EEIqxE1jP%(ceh{f7#0DPoAicUikQN6{OeL#4kix->-0dL8ZQ~ff+GB
z55!Wm(HY9%skty%eNzQVEM1nraN*~_i_+NCP+jZ%UWqR|@@lubwgMj>XsE2OxrU#?
zzzrThhT-@!iuyK2o#OHb)$xqhSKm<ARObVxsOqLFlViU<{QL(}BC#4!MfgC>7kpY}
z{Q_l*{neD}rOIxmQLuPnQGS7M>7|S3iu`5Em(KCcSw7EqNy&m`h58E{`jZ-F;L?)(
zMLINp*^KEW^YCWQS5kPP&7+2;#S2V2H(Kw4g#|i|WeXM+mWYCR%Y7FXE<@QOVbm4h
zFGg%ADa@z1GZD>V8W$EXDDur+SeU<fd9jWZF=PFT(wgQ<rGI%b^QR>iSV&3X(!yn$
zNo%P%rx%?o%GQ=tUfo>T*tG1L`bvaarm%z@rW7t;0OwW=eqYA=_KW~wettz2^PJ^N
zFV!iS5zI111Drn1SrUb;l|}iB7tF&~Jk9cBIhpljc020RHs&i-q@XNpR4V2!EYXE&
z7GrVI!iByCi<wi)c1HzLZT_61l4Z)*v?4nN#|Ld322oTs$BH^1e(=DzzM&ee3ryY4
z(2ffVm*vl$uk6vN<4Y~ti!2Ax1yaKDWQ{<Pc1V?omR^V^ULwkLWw2cN=@|4yl?_$=
z;EoofYdWe0y@JDV-zE7Amg!VX`DOe{YOjJ((Gkn^8nfdurRiK|Xq~UJ63uk2&b#A_
zKBi&#=8_qOF3OMG;4?&4;jUj;S-Tp)&Wj`pOG=7L9O*}z9m>#=`;wKuMMVY5D^wYy
zXRd0lEpNih^3oc!H#I*mgin{vTTrs-lKhfF0enT_;sPW9Y*~H@S{X6bixn0WU#uuJ
zBNe{5XjwtgVijrm;)@p-U9y<6rh5V@Hnq%KfKHfXNzsLTG?j%s=+7&m*&<*?VabAd
zmnvUiGf>}+0=uvzf2oQ%cYfjAi+zeLP*P^m=r1%uGQXezUa%D3*HUE^_2nhIvYk1G
z75q#Sjp4I0Sb^@I<xQ4udzH1N7@W*cDv=8j48#1K5~Jyd@uoNiob`1L71V;yAyw6s
zu5PqG|Ae1=s;R7U4j0bxB9~Fr*N^Cz>g!El;5$kfd$66EuCt)9u+Ya0VxVc*;H#*s
zt?b30s_2#Z^L=xdl`O<KvJ5qEwq{>3nsL!$#hJUPz_+-lSP9Qvx+vc_r%;#~(k+mw
z&7GU?TQ(ns=~O~}Mf2v_T0rLKqeh^Zapo;stWs7)@%&4DB}<p$3%C&@*nx2fCW}@$
zjM8Q@fyJU}O?4xx;cBI5>3sArX2!Ec(*_KdiVa^`x}a#WZ}IX)VnN9gH1Cx@_^X+A
z{$eyd6o6`SD1%EEtKr-1OI7xY7B9n~kD??sCx6)@od=o?e(@zGPQ#U1D73i?FLttZ
ze#}BJL#b}*yaL~f{DsR4m0>K&!UCUa9}K0ji}IIVEY_(JhAbuuk%fgT3Kt3vCM+B_
zS(Pi@A5(CyHX8+jVY;rlNtv%IacLnmm^qHnIiIr@U0TxyALdx51JM}d-nX#m5;_$%
zqFaXFMOi^9Z3R(Q+j0#0b1$}>o4-Iq`&Je$of~n1NX;W~p^8>8ce&G~r3(uSO-Edz
zvIn<SdK`5QXRlnXJ4(vXbtpzdn85N96~keoGQ?^GQ6+$iMc1~>^4H>gI2QefjkmUP
zLzC0AVrO$v^)E0?Hdj`lbntP#(sCutikeqcGS{prXWO7{q|N8@oIIjbBN{l%#XPRE
zdR?Wjs-YBfu1IMyk5;>)S*j_p6x3(?P)+=uAgdx&HNd3C>T7%V2c|dV!_x~EtT0Q-
z?n82W(bIa-XZNC~_oB}+8`K8H##|%P-ZWvhEM`h~MywW_>=l~p%)M$=x~ii6Fse_9
z6us_7SRzOcj*9sRQ=|A?_~YDsRa*Ir7SP9W=N0ALg^P-pU24?~I~`>t>J=tLbXm1i
z_&G~;WjXng`qO=evIebYuGx2*Z3(53zj*0_W$4A6X<8nNI%Pd82Oy$!m<64qCj4r+
zFz>uD-kYNbI;cfvf#)omf30<Aq<0}i0%tIg_YVBVUW7f3><F0~P3BCuVlicW`Vk&i
zq1ui;aH((cQLp)lKGQfA8qvx|5qa8JUfR%5UD=4wHm<F&soaoWRZ~~mB$h8-(8LLI
z<a2ukmo(R6z7qL{YVT)_`pF|7H5Ocgo2usWCegU2x(Xi%<c+6K=_@eRe*UJp33uff
z1FLJ*&JH}foMP_ms4Kg23U_qqbL!bT89eDXpDnn=+59GhI!56-7N?V!2f6^KN5r3S
z+mhs5gwrizpSPKOw6N@RqU3OSZIoy|7<+L__0>@zLaf4Bh0`UnZH-?bwh<zH4kJY+
z!48~mv8i|;5k9{GA6IoSf&Dm<2*DjV-QworeMIiU=|~(D66O;f{S%yI;CK?}37m=I
zvY`A<P+lIC-^CAf>f;%}v7jUtdFbOXV1{C?v{*Ahs&8hAHGCk-wewOfqE-Tt&?<($
zp+Z>>y+SJ@p%u>1%T$Ci0&L?zHMNNJeZ;t}LW(j1yrI$o#9GV%f;KxKqP@(i{R9LI
zu_`D_Be~|r3yK@+xu}0OO*WtG@;Rx0wiVx!gXg>yv(J(;sopZCu1^XqDT{W>-Hvpk
zV>6V`w@{pXtU1a=`BW|2L~{Z75YAEFprA#u2>6&6UpF`cpbo0bz-c)GacVI{ZBW()
zCGo`$8mKy~cv4g`$_$(+e1bd^#nnFejND3qMzhUXv?avWwaURKUae@;5TNR)!S!mK
zz2i54w+<(p6X9l@Qj`*OnkcU7*oEu8I4uptpTW~ZL(~N2+MxUh_&s<MZPAYcKj@&9
z5?mg}8LQ%%{*n&-X$MU`(^2M@Kg|HnMf?`c1^V$yuNj}qkJmWpt-wt?qWv+}g=)lU
z+0Q54Llj*Vl&gc1_;^RSWiJ~%<FdCSq?{BL1lO4;OM$<GEyXGVW&mh~wwonO`#0c}
z!biX?0A()tydNk5GXm5~m%oR34Cf$Weu&KcK$&T)+50f`ZJfitK*D{G^b7Sf!IXFx
zXL^*B`z{rZd`BcH^*+uFEs5U(rw)7;?Te%-$u}=!#6}3=OKD#&Ze@#0x>-eL(|vx9
zlfMD{=m8{38eh`1q$znl&ZyDic`#nbY1ObL{F3IgCK!G~$(UYC{9^}g#UV_=Y3U+f
zu4uDetpR?eg9fUOCS1RV6J5#m04*kpt2!c~RSfOGiJrg=GvC25t|832wnQxY^KzzV
zMC9}*>nuUQiAta8FU0E=y)q~-jr7!Dsdo&9FujXCBl`<Ok7f+F4u)Cw5HC=)Io=Up
zj?*PJz%L@lRG{ePA`Gj`if*6`ufS=DD}vG&F^^r;&5CbkgZLITuv{6GR|VxA!0&U=
z+|S1kofyIl=j$n-gWe1L9S8j$@C3A3OCIXg@d)^Qon-atl;ch@izfc5gLcL<^_%uG
z9vh40O2kb)W_U!8Nn3h0ARo+|bEfm<yj*)m6p@SYLb_aBV!OfeNmn*S*MUO@q2}S>
zp_I(yW$5DI?h-p(Zv(!s@f5^jd6Q2kU|AFA4!S-#iSsqsSdCly-izpv4js~=LppRw
zhYrLvk5P8ok(uF{csY=Di;i>`k&AFzqs!-&MGBD0tca2bbL!}^i$T(0XN7$^FUPL1
zh+HH+1IF~h>1aD_!ZQ_X4M7o3OiSJZP{(Dsn!S?gO2k`mS}v=Ea2bU{n~Kvh;dvBf
zt{RtCSW;wh8tTjsE9zxbp4B(J2mE6PZN;_Z67a_Myb<nM9={m1&k~MeS~0GJ7H(~H
ziJX0e+i}7^f?YU0Vk>5>#2&(Fh}aXIGTkn|Y2fiS{}*arjDQlH&_+<B&}xDv6SYjp
z14-d{ah<1AUgzqR!}gKhsKnN62B2k*QfonV$AcA>?uTHoOrn@p8k-SgKTb!#zZk{N
z^#-4xwPInYGd1ckS@xKb4c6>vsl_0dMzgK}NndbS{xHawa9Yzfpz0Wp3Z8+}A$mW^
z115{$GliB~5xBa8tlo-}kjX(ft!~ef@2B~05qEkY1vrzkA`|a)&{m`j@G@~atYYJ1
ztD$!iu2R9J1Z^g2McxDQR-C;pxg9)KMQ=W5UO#j2`K1KTqI%1H2p&5ni_cDNyo0vV
zr(7TKQRM_9apLD3_-n&f42LsN*rk-1lK|q3VdzPj6~&^hL<o5wapviwQ!)$!b5x5(
zFFK-FwHAx+@(j)du|pa+i}@Mz$Bwa^+Yki6P8@&4IT@$*-k-d2I9)1)EyfvIs3p~#
zaf*INiB`h-4?&b&nx$x=#+4}jmjUWU^LkCF*W}wk;0=QL>iR*GFkh$u*OqX%TOK_0
zOD!?8#NA(iLPV!16`hOIB`%IP7dbdXqq5WpF~01Hyp3k$TU6vJSTS=7UHTa#*FcP!
zRQckZ&d%4JCSm4l1acDns_bfTn5y;a>|RZqg>uTI1iuif7DiffG!`8iPM65QICJF7
zDvQFlJ$p>Tw5RXq?5XNy4?k8%`)Ci|$#L#sk(FYlNkOC8Yq`XSSQ5kgp)(fL|A{RT
zwTVN8;AYovOl>}NyM&RB34hF&`0kmlrEO+g2>`I$JELtBh5bmc|3vetl+{-3ro=Yl
z5>Fs_Bg&h1O8VjAWk9V5jr1}7a4-n;a}N%0XSnrP@f}5&&m)1V=6L~mI625z2Tl2B
z{Dqb<AlJ%O;AG#)4v`aWPNc2lFv2+Ru%-)~ON1e39sewxgEA-XoM>}!wvIFLk3c_v
z!UDx7YH(V|nfO+C6qJ5Ny3wsV4>y(KxXliC7zDmsJ!MiN>f*-G;5^*u_??HFTa+CK
zZh##W^`QrI9B#D|EW&W3Lw6o-wX!S1!Kcb21TeQ+jTm9!Ll@$=jx2h_Nvt(B=OCuk
zNq$yD`GZCG1#-Sg;Ck}(FdHXw^7MFIBPvgxKHCxgZRn5K!a3JBZ+`%p;jD-?<HFwp
zK-NDxALP@GjeU{h+en`cexjXT^yBMqBRxLVu#Rs-|8<sfz;8o;3-ns+a9LmM8ONg;
zjshgTAJAH7OZq<09H5eP_#=SUx?F}YN8Rs7`BN|J`yl91nC$^5`dPp-gtI4*_&W?}
zt=nb%mqA;{w~=4Y+4v<;_7qJ2_cTl&-$r_Wvy=mV8~Q(mUTbYJ%P$`JvDOxo9`G&a
zZy5Aj>xh{i-}PAQh)HLGw$>4oo(0-kM@$+U8U?=s0)W#k76RdCLM$5F5(Phi(hA7%
zO98EQ#Ef4GnjbR(P~mkz_@xqy?t>wN-yw17@M{rZtxIP7&7iGy%%s~v^J^(q{M|tK
zDHMy|4}>2+vFL|@SnHk{|0kgN`4ubtr$G39mK${X&w=LMj}^|(Xj;d&;U9m1{#;Ka
zy+41;>HV#jeh!e+2U$79hIdrN1rB-`=wb&wkrky6md6axHIDH4ps#Sym-Uk8XUz9H
z!Z(2KaM0U8?{Uz4NM{{P?+(!KI>Hb13g`Xtb5;b@_sgIUJLo_4l4o(uw!{DR`N0R!
zZ}pMsNdJF9TkFsJfcBzewe~cS9st@YKMM3TkJ%nl(VnJ*K8TZ(U&`kLe-lO<nw}4u
zKg`re(?y`Ib^DZG!MF(L_)eNX>*Y-EO3?dHBM?Ul$~Vv}{3g)TJrR5MfL@`?KLz^k
z2E9kcW_--?LEq~L{}t#w^yi}>lZsaLCg}GZ;eP_{wC5yfYp(?D{Ril~AfJx-q*IU)
zOP=YagWfvWG=TPJJHlE1{J5&M$AIw*KwEnVNb^gumOje!!(THzk^I*53g;`bJ!Wz$
zzx*jKXZ$YE*1jX^-`^|z0nm~BpFI5xXs5mxK$jqW9x14Q{<xJ>e;Bl?Ocj3e^r>Fq
zZZG;1lot<{4}UVr+9N@G@H5l)ei+i6OFRep49Jr{545!}hctgM$=cgOn!l1{?QJ2w
z60~JM%g+b88$O?+^<4?tY5zLVd!<#rQnZ4;0REh)<+t>b5B8$>^`h?wZSAF@J$$qK
zBy{m${{I7XrSz-zLjU_YXls8E<&S_CBESpeJ>n0bt-U@BKMp!m`c?a4{EtBY%u&9v
zXoyoiX8+Ch+LsMeA54EZXluU~^<{!~md8xceUN|NT{C<xXzP9~1?epYZSA{ZIDhVW
z59~n^tM;@Cv~{rjuLeESV}-lLb)c_z*t-?9GyNdwi;zC=bEyB8Ug39xegth0K!ra7
zgbzCpYx<|4UqXD|PcZ(^DM%m1!S?tTXv;rX9w$Ltdx9v>U$=7F!(X?$%Z#q-Zy@MM
zdAP-B(61nT7EZ?JuU<LhPX%r5F=F_6psgbv_RQ-gzoZv^IptBlcvPXvw;Hsy=ZyN+
zG2D?qek9%63&!xfK|Af?2UYnpip9e4CwqnetQY-qFZxZ;);=r7KLOfVo*(t1`BilF
zEoh|2{PI_~;FfC7A>${5j+Cbq3t(7@#}6UX|M{z2)*dX%r-L5tiulub(9Zl#?M2T9
zJ<H=)Yg*VIxRv^Z_CNaPT!cIQaXx4iI4{ay_%Pj)r@xf;(!aJBeGO=9FC*>U3fkH;
zM!LP1{P#h#etEEc@h85HBl(L!Q~oiAJL>n>q#gDh2kp#1md7pSsz4u+V&8lVS*Q?f
z3&9i3)e671vY}2BYE2#%$=M4Bfty>J*5L6eH*kURg`1Mp{v-8l6B6cDo6qf|;Ie%_
z(Ns(5%}}hR2coyJIJbOMW4}_boe+#`{}9y|?@{>T_4bY>`sRY$$f99;;cV0zcYDdN
zUiEA)4ApCE0o3yP=;gYa;u2Bk5^BB4fJ>mw)#>)?^+<HJUf5h%Z7tPxF7KpDT_1X>
zrrOu#SY;VmFzH*{T(hQnYGxfO-9*(Mz6jNLRdqeL7U;mr4b|9m&|FcyZf#w~n(ApP
zVuZwQ2FN;SZV1E{z9?~<!Yb+2)E&jZenAJrOpjNUQezYL7h<o=YOHY<zVe#N(gt5y
zV<W;cQ64tUXW-aN7tK?qSewSnk&51Em&+7O8`soSR8KXZn5!K!dK*YY44d%2V2h<4
zj#acZ*kjRPE~c%s7BsWyxtGqCo66)0@|Wdf_s)gfa<H&)@rBFG)}}3*I?YVV^m1o;
zA}T6>ZGBx$b!{a!HK=U*u>Yr_!dF()P`ci?c4}^OF4n)+R#iK<0SaGb6PKjhX5>zb
z;5jr&>!`z8ep81JKLUjvkKEMM&|J@`+#U({05>W}(<AGL*$&hKT|1qrIc8qC5yjp!
z6G?jN*}$Dyiqbqade5g-VN;`Qu?nH0sji_>TLzzqwsC4U;&5^MnM*yFrkHMSH6Lpo
zbkxot7FBaS%KMt8N?la;K1RH|iOzlw{adljUa?o`)aWgZHCO>{mt4*{4*c8*evVos
zZTW`N?diQL5POhlrP>t60=0JmRaCC4F0XWMS+a7|kTXMP23-$&+y<=3w$p6XeR*Vm
zu^r^gJqJ4vm_S1nn94<%q~4<7*lA~HtfI22l$(H6b29sON0X0eKHJ`4Y_$vcLw&W`
z&TBCcm_=%CV^Ah=hb;!L1s5*HhPRT!FR1Hs<s_!dIM$QfwoPTBvrOyiG4^mfFq#3J
z$&8^kTHCVI>^1K`-<rzO`e=`H)EG8y)|H}#nggQhV>q&@4QW2#@}-3(Ut%+x6x>Sh
z5wjD|<xUp1PYe_`Glwp071s0!o_ns@9kGzWHCu|+Zp<Pv+Z}l2SDAZ^eU&Qvk>&TS
z(WumBI1-qSA)LFwtJi^vT{tC0-1>Ni{w>GZ_h5f=uT9ACCAIS3&PoomqCCs8S?4i_
zCd@+tenDEx3RiM_<rz%K#k=^-#%tC#m6icEHJEUXg{iD(sva{F)lU&qu(S*!7+5OH
znpgWu8@O)|p(a`1Tvm&%H#S{eTg7q76fG-js9a}J?7c1A+^(a=9Ln)^2ulQtx!=H6
ztdr$*?kgUAsmYlsrq625=*M%0+lcGKoV8*J1Zd)%<MZgmY2D+K#*|ha<8bA4lKMCY
zA2vjY$E-l`EPcEev~ZwG?gS!wN#Nl0l=sWIIF)UHJUpZEI~OLZu9lATKv_5g4nofF
zU|1;Uz!pxq8Dl`}xiD!fjPGzPocwbq;2j!`)`t~V1=_+Hv<?d}JGe$jA66LO(O5Wx
zVpj|C2Yme2I;=217#7a3;~S9=hkX`$la}Mk5grxWaF2@L<FF3u;K}<ar@m=e3^9NY
zF7#oA{eN2w<ipq?DKFq8%QvKehskY5Q|GW2=ogqIk{l=qkhC+bI00N@0u+M*m=+L?
olsp(bfNMw!fSQGX;vlz!{0nj}Xs!g=ydC?2V=$nE1_dzl0BW!lF8}}l

literal 0
HcmV?d00001

diff --git a/atusb/fw/board.d b/atusb/fw/board.d
new file mode 100644
index 0000000..aa2f13f
--- /dev/null
+++ b/atusb/fw/board.d
@@ -0,0 +1,12 @@
+board.o: board.c usb/usb.h include/at86rf230.h board.h \
+ include/atusb/atusb.h board_atusb.h spi.h
+
+board.c:
+usb/usb.h:
+include/at86rf230.h:
+board.h:
+
+include/atusb/atusb.h:
+board_atusb.h:
+spi.h:
+
diff --git a/atusb/fw/board_app.d b/atusb/fw/board_app.d
new file mode 100644
index 0000000..c1659bc
--- /dev/null
+++ b/atusb/fw/board_app.d
@@ -0,0 +1,13 @@
+board_app.o: board_app.c usb/usb.h include/at86rf230.h spi.h mac.h \
+ board.h include/atusb/atusb.h board_atusb.h
+
+board_app.c:
+usb/usb.h:
+include/at86rf230.h:
+spi.h:
+mac.h:
+
+board.h:
+include/atusb/atusb.h:
+board_atusb.h:
+
diff --git a/atusb/fw/board_atusb.d b/atusb/fw/board_atusb.d
new file mode 100644
index 0000000..7ab1254
--- /dev/null
+++ b/atusb/fw/board_atusb.d
@@ -0,0 +1,13 @@
+board_atusb.o: board_atusb.c usb/usb.h include/at86rf230.h board.h \
+ include/atusb/atusb.h board_atusb.h spi.h usb/usb.h
+
+board_atusb.c:
+usb/usb.h:
+include/at86rf230.h:
+board.h:
+
+include/atusb/atusb.h:
+board_atusb.h:
+spi.h:
+usb/usb.h:
+
diff --git a/atusb/fw/boot-atu2.d b/atusb/fw/boot-atu2.d
new file mode 100644
index 0000000..ed90f78
--- /dev/null
+++ b/atusb/fw/boot-atu2.d
@@ -0,0 +1,8 @@
+boot-atu2.o: usb/atu2.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h
+
+usb/atu2.c:
+usb/usb.h:
+board.h:
+include/atusb/atusb.h:
+board_atusb.h:
+
diff --git a/atusb/fw/boot.d b/atusb/fw/boot.d
new file mode 100644
index 0000000..23c9a7f
--- /dev/null
+++ b/atusb/fw/boot.d
@@ -0,0 +1,14 @@
+boot.o: boot.c usb/usb.h usb/dfu.h usb/usb.h board.h \
+ include/atusb/atusb.h board_atusb.h spi.h include/atusb/ep0.h
+
+boot.c:
+usb/usb.h:
+usb/dfu.h:
+usb/usb.h:
+board.h:
+
+include/atusb/atusb.h:
+board_atusb.h:
+spi.h:
+include/atusb/ep0.h:
+
diff --git a/atusb/fw/boot.elf b/atusb/fw/boot.elf
new file mode 100755
index 0000000000000000000000000000000000000000..ebf39f512d97d832b7c8076a06c0d5b08d02b1fd
GIT binary patch
literal 36816
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
IuUq>5C+-q^GXMYp

literal 0
HcmV?d00001

diff --git a/atusb/fw/boot.hex b/atusb/fw/boot.hex
new file mode 100644
index 0000000..10fa523
--- /dev/null
+++ b/atusb/fw/boot.hex
@@ -0,0 +1,259 @@
+:107000000C944C380C9469380C9469380C94693899
+:107010000C9469380C9469380C9469380C9469386C
+:107020000C9469380C9469380C9469380C94DB3DE5
+:107030000C940D3E0C9469380C9469380C946938A2
+:107040000C9469380C9469380C9469380C9469383C
+:107050000C9469380C9469380C9469380C9469382C
+:107060000C9469380C9469380C9469380C9469381C
+:107070000C9469380C9469380C9469380C9469380C
+:107080000C9469380C9469380C9469380C946938FC
+:107090000C9469380C94693811241FBECFEFD4E0EA
+:1070A000DEBFCDBF11E0A0E0B1E0E6E9FFE702C03E
+:1070B00005900D92A037B107D9F711E0A0E7B1E034
+:1070C00001C01D92AE3CB107E1F70E946B380C94F1
+:1070D000C93F0C940038DF93CF9300D0CDB7DEB713
+:1070E0001A8219820E944C3F0E94AB380E94893F4D
+:1070F0000E948D3B81E085BF82E085BF789481E06E
+:107100000E94C1382091620180E090E0A0E0B0E0F0
+:107110000FC080E090E0A0E0B0E002C02230D1F4E7
+:10712000E981FA81E491EF3FA1F30196A11DB11D20
+:107130008C3737EC93073CE0A30730E0B30771F7D7
+:1071400080E00E94C138F8940E94423FE0E0F0E005
+:107150000995FFCFFFCF14B817B81AB815B818B8EB
+:107160001BB8269A3F9A249A0E94613F479885E06F
+:10717000982F9A95F1F7479A8A95F1F70E947E3FEA
+:107180000895882311F02E9A08952E980895F89462
+:1071900028EC30E02E9A88EE93E0F9013197F1F770
+:1071A0000197D9F72E9888EE93E0F9013197F1F71E
+:1071B0000197D9F7EFCF80E090E041E2FC013E96E5
+:1071C00040935700E4919C01220F331F220F331F7D
+:1071D000D90112965E2F52955F705A3010F4505DAF
+:1071E00001C0595AA050BF4F5C932C5F3F4FEF70C6
+:1071F000EA3010F4E05D01C0E95AD901A050BF4F58
+:10720000EC9301968A309105C9F60895FA01D901E7
+:10721000833099F4662319F0613089F406C08AE25C
+:1072200091E09183808384E005C080E091E09183C8
+:1072300080838AE28C9381E0089580E0089580E065
+:1072400008958093CE008091C80087FFFCCF809185
+:10725000CE000895599A08956623D9F01092CE0071
+:10726000262FFC0109C03091C80037FFFCCF3091B8
+:10727000CE0031931092CE002150A9F76150860FB5
+:10728000911D2091C80027FFFCCF2091CE00FC016A
+:107290002083089510927001109271011092720172
+:1072A0001092730108959C0140E050E080917001BC
+:1072B00090917101A0917201B0917301280F391F53
+:1072C0004A1F5B1F81E0213090E7390790E04907B2
+:1072D00090E0590708F080E008952F923F924F9276
+:1072E0005F926F927F928F929F92AF92BF92CF9256
+:1072F000DF92EF92FF920F931F93CF93DF93EB01F7
+:10730000A0907001B0907101C0907201D090730193
+:1073100090907401860175010894E11CF11C011D17
+:10732000111DA6019501DC013C01660E771E93E05C
+:10733000892E5524539485E0482E44C0CA01B901D2
+:107340006F7770708070907061157105810591057F
+:1073500039F4F90180925700E89507B600FCFDCF9B
+:10736000C901817090706C91009769F0892D90E04F
+:10737000362E222482299329F9010C0150925700BC
+:10738000E895112401C0962EC801B7016F7770707F
+:1073900080709070611571058105910549F4F701C0
+:1073A000E058F04040925700E89507B600FCFDCF4A
+:1073B00011960894E11CF11C011D111D2F5F3F4F18
+:1073C0004F4F5F4FA615B70509F0B8CFCE01A0E02B
+:1073D000B0E08A0D9B1DAC1DBD1D80937001909384
+:1073E0007101A0937201B093730190927401DF91C7
+:1073F000CF911F910F91FF90EF90DF90CF90BF90B2
+:10740000AF909F908F907F906F905F904F903F9044
+:107410002F9008958091700190917101A091720157
+:10742000B09173019C01AD012F77307040705070A6
+:10743000211531054105510549F0807825E0FC0111
+:1074400020935700E89507B600FCFDCF81E18093BB
+:107450005700E8950895EF92FF920F931F93CF93F3
+:10746000DF93DC01E0907001F090710100917201F6
+:1074700010917301A801970108C0E491ED93615048
+:1074800070402F5F3F4F4F4F5F4FF901E901CE1919
+:10749000DF096115710541F0203080E8380780E090
+:1074A000480780E0580749F7209370013093710135
+:1074B0004093720150937301CE01DF91CF911F91E0
+:1074C0000F91FF90EF900895E0912E01F0912F0120
+:1074D000DC016D917C910480F581E02D88E791E0DD
+:1074E000099508950895EF92FF920F931F93CF93FC
+:1074F000DF93EC01398120E0888190E0822B932B8F
+:1075000021E081329207A1F0E1E082329E072CF463
+:107510008132910509F0F3C0F6C0F2E0813A9F078D
+:1075200009F47CC026E08132920709F0E8C0E1C08E
+:1075300080916201823079F48A819B8190937601F7
+:1075400080937501E0912E01F0912F010190F0815F
+:10755000E02D099503C0853009F0D7C08091620104
+:10756000823059F0809175019091760101972A81BE
+:107570003B812817390709F4C6C02A813B818091D5
+:107580007501909176012817390709F074C00E80B3
+:10759000DF81C02DE0912E01F0912F01209759F449
+:1075A0000680F781E02D099582E08093620181E0F9
+:1075B00080937701ABC00280F381E02DCE01099565
+:1075C000882311F488E004C0C134D10528F08EE08E
+:1075D00080935E0180E014C0D093B901C093B801DC
+:1075E00083EC91E061E070E048E751E02C2F04E685
+:1075F0001AE338EBE32E31E0F32E0E94E93B81E001
+:1076000020917501309176012F5F3F4F30937601C5
+:107610002093750195E09093620178C0809162019A
+:10762000823079F48A819B819093760180937501F1
+:10763000E0912E01F0912F010190F081E02D09954C
+:1076400003C0893009F061C080916201823051F03D
+:10765000809175019091760101972A813B812817CD
+:10766000390749F02A813B8180917501909176011B
+:107670002817390739F08AE0809362018EE0809301
+:107680005E0141C00E80DF81C02DC134D10520F0E4
+:107690008EE080935E0120C0E0912E01F0912F01D9
+:1076A0000084F185E02D88E791E0BE0109959C01F9
+:1076B0008C179D0720F482E08093620101C09E0137
+:1076C00083EC91E062E070E048E751E000E010E018
+:1076D000EE24FF240E94E93B809175019091760190
+:1076E0000196909376018093750189E08093620101
+:1076F0000AC082E08093620110925E0104C0CE0154
+:107700000E94A03B03C081E001C080E0DF91CF91E7
+:107710001F910F91FF90EF90089583E79AE3909364
+:10772000C2018093C1018AED9BE39093BC018093D9
+:10773000BB0182E79AE39093BE018093BD01089557
+:10774000EF92FF920F931F93FC01318120E0808123
+:1077500090E0822B932B24E08132920781F025E088
+:10776000813A920791F023E0813A9207E9F483ECA1
+:1077700091E062E070E04EE551E026E00DC082E06D
+:107780008093620110925E010DC083EC91E062E093
+:1077900070E042E651E021E000E010E0EE24FF243A
+:1077A0000E94E93B81E001C080E01F910F91FF90B2
+:1077B000EF900895813219F00E940639089584E609
+:1077C00091E0FA019183808389E0F901808381E06F
+:1077D00008958F929F92AF92BF92CF92DF92EF92D5
+:1077E000FF920F931F93DF93CF930F92CDB7DEB726
+:1077F0004C015B016A01FC0180819181009721F0BD
+:1078000029830E94C7382981F401B182A082D382E2
+:10781000C282C20ED11CD582C48210870783F28631
+:10782000E186C4010E94A93D0F90CF91DF911F9185
+:107830000F91FF90EF90DF90CF90BF90AF909F900F
+:107840008F900895FF920F931F93DF93CF9300D0F3
+:107850000F92CDB7DEB7DC0111969C91119780E0B5
+:107860002C9130E0282B392B85E02030380709F4A3
+:1078700081C085E02130380714F581E020303807D9
+:1078800009F42EC181E0213038076CF4203831052D
+:1078900009F451C0203831050CF419C123383105E1
+:1078A0000CF015C11FC181E0233038070CF41AC158
+:1078B000205033402330310508F009C113C188E05E
+:1078C0002038380709F4ABC088E02138380784F441
+:1078D00086E0203838070CF4FAC086E022383807F2
+:1078E0000CF44DC087E02030380709F0F0C0FAC032
+:1078F0008AE02138380709F4F5C08AE022383807D1
+:1079000034F489E02030380709F0E1C0AFC08BE0E3
+:107910002130380731F08CE02238380709F0D7C021
+:10792000E1C020914E0130E0245B3E4F80E090E0CA
+:10793000E5E5F1E0C8C016968D919C9117978230CD
+:10794000910509F0CFC00DE611E08091C30190913F
+:10795000C401009711F00E94C73882E090E0909334
+:10796000C4018093C3011093C6010093C5010E5F4B
+:107970001F4F6BC012968C910E94913DB1C0129620
+:107980006C91129713968C91139716960D911C91EA
+:107990001797813019F0823099F407C08AE391E09B
+:1079A0009B838A8380913A0109C0662309F09AC0BB
+:1079B0008CE491E09B838A8380914E01898311C07E
+:1079C000E091BB01F091BC01309709F48BC0AE018E
+:1079D0004E5F5F4F9E012F5F3F4F0995882309F44B
+:1079E00081C0898190E00817190708F409830A818A
+:1079F0001B81F9808091C3019091C401009711F01F
+:107A00000E94C73882E090E09093C4018093C30144
+:107A10001093C6010093C5010F0D111D16C00FE68E
+:107A200011E08091C3019091C401009711F00E9470
+:107A3000C73882E090E09093C4018093C301109313
+:107A4000C6010093C5010F5F1F4F1093C80100933B
+:107A5000C7011092CB011092CA011092CD01109271
+:107A6000CC0183EC91E00E94A93D3AC020915101E4
+:107A700030E081E012964D915C91139742175307C5
+:107A800089F531C041814430D9F4628170E01496A7
+:107A90004D915C9115976417750789F4638170E0C7
+:107AA00012964D915C9113976417750741F4E0911C
+:107AB000BF01F091C001309799F0099511C001966E
+:107AC0004081E40FF11DE217F307E1F60BC0E091EE
+:107AD000C101F091C201309729F0CD01099503C091
+:107AE00081E001C080E00F900F900F90CF91DF9167
+:107AF0001F910F91FF900895E1EFF0E02081308118
+:107B0000932F80E030E0282B392BC9010895809114
+:107B1000E80080FFFCCF8091E30080688093E30061
+:107B20000895EF92FF920F931F938093E30083ECED
+:107B300091E062E070E040E050E020E007E81DE303
+:107B4000EE24FF240E94E93B1F910F91FF90EF90DC
+:107B50000895FC01208131812230310569F4835C74
+:107B6000914063EA7BE80E94B73F8093E9008091EF
+:107B7000F00081608093F00008951092E90089E0A0
+:107B80008093EB001092EC0080E38093ED008091F5
+:107B9000ED0082608093ED008091EE0087FFFCCFC6
+:107BA0008FE08093F0001092C4011092C30180E432
+:107BB0008093C90108951F920F920FB60F9211245E
+:107BC0002F933F934F935F936F937F938F939F93E5
+:107BD000AF93BF93EF93FF938091E10083FF0CC0BD
+:107BE000E091BD01F091BE01309709F009950E9426
+:107BF000BD3D87EF8093E100FF91EF91BF91AF9181
+:107C00009F918F917F916F915F914F913F912F91B4
+:107C10000F900FBE0F901F9018951F920F920FB6E6
+:107C20000F921124EF92FF920F931F932F933F9384
+:107C30004F935F936F937F938F939F93AF93BF9374
+:107C4000EF93FF93DF93CF93CDB7DEB72897DEBFD7
+:107C5000CDBF8091F40080FFFBC01092E9008091BD
+:107C6000E80083FF3BC01092C4011092C3018091D1
+:107C7000F200883010F40E94C7388091F1008983A7
+:107C80008091F1008A830E947C3D9C838B830E94BB
+:107C90007C3D9E838D830E947C3D98878F83CE019F
+:107CA00001960E94223C882309F4BDC0898187FD8A
+:107CB000C7C08091C3019091C401009709F0C0C072
+:107CC00083EC91E062E070E040E050E020E000E012
+:107CD00010E0EE24FF240E94E93BB2C08091E8004E
+:107CE00082FF4EC08091C3019091C4018130910503
+:107CF00009F099C06091F200262F30E08091C70111
+:107D00009091C8014091C5015091C601841B950B0B
+:107D1000821793070CF487C008C08091F10081930B
+:107D2000F093C601E093C5016150E091C501F09167
+:107D3000C601662391F78091C7019091C801E817A9
+:107D4000F90709F081C01092C4011092C301E091BB
+:107D5000CA01F091CB01309729F08091CC0190912C
+:107D6000CD01099583EC91E062E070E040E050E0E5
+:107D700020E000E010E0EE24FF240E94E93B64C014
+:107D80008091E80081FF07C01092C4011092C301E6
+:107D90008DEF8093E8008091E80080FF59C08091CA
+:107DA000C3019091C40182309105B9F58091C7015A
+:107DB0002091C5019091C901821B981708F4892F61
+:107DC000982F0CC0E091C501F091C601219120933C
+:107DD000F100F093C601E093C5019150992391F70A
+:107DE0009091C901891721F01092C4011092C3012A
+:107DF0008EEF8093E8008091C3019091C4010097B9
+:107E000039F5E091CA01F091CB01309709F18091E9
+:107E1000CC019091CD0109951BC08091F0008E7F1F
+:107E20008093F00015C081EF8093E8001092C401A8
+:107E30001092C3018091EB0080628093EB0008C038
+:107E400087EF8093E8004ACF8BE78093E80098CFD4
+:107E50002896DEBFCDBFCF91DF91FF91EF91BF910B
+:107E6000AF919F918F917F916F915F914F913F91D2
+:107E70002F911F910F91FF90EF900F900FBE0F90D9
+:107E80001F901895E0EEF0E080818160808380EDA6
+:107E900097E00197F1F7089514BEE0E6F0E08081E5
+:107EA0008061808380E18083E1E6F0E080E8808388
+:107EB00010820E94DB3808951092BA011092C90016
+:107EC0000895599A559A539A519A5298ECECF0E0C9
+:107ED0001182108280EC8093CA0088E18093C900EF
+:107EE0001182108281E08093BA0108958091BA01D5
+:107EF000882311F40E94613F599808950E94763FAB
+:107F000083EC0E94213984E00E9421390E942A39A1
+:107F100008958091D80080628093D80089B5837ECF
+:107F200089BD89B5826089BD09B400FEFDCF80910D
+:107F3000D8008F778093D8008091D8008068809394
+:107F4000D8008091D8008F7D8093D8008091E00088
+:107F50008E7F8093E00088E08093E2000E94BD3D28
+:107F6000089583E08093690081E08DBB08955527D3
+:107F7000002480FF02C0060E571F660F771F611591
+:107F8000710521F096958795009799F7952F802D8B
+:067F90000895F894FFCFF4
+:107F96002A030000000000000000000000000000AE
+:107FA60000000000000000000000000000000000CB
+:107FB6000000000000000000000004030904300176
+:107FC6004A3953396D390A3A2B3A12010001FE003B
+:107FD6000040B7204015010000000101090212000F
+:107FE60001010080140904000000FE010200006483
+:107FF6000000020009210FFFFF4000010100000000
+:040000030000700089
+:00000001FF
diff --git a/atusb/fw/descr.d b/atusb/fw/descr.d
new file mode 100644
index 0000000..cccf24c
--- /dev/null
+++ b/atusb/fw/descr.d
@@ -0,0 +1,12 @@
+descr.o: descr.c usb/usb.h usb/dfu.h usb/usb.h board.h \
+ include/atusb/atusb.h board_atusb.h
+
+descr.c:
+usb/usb.h:
+usb/dfu.h:
+usb/usb.h:
+board.h:
+
+include/atusb/atusb.h:
+board_atusb.h:
+
diff --git a/atusb/fw/dfu.d b/atusb/fw/dfu.d
new file mode 100644
index 0000000..6e0954e
--- /dev/null
+++ b/atusb/fw/dfu.d
@@ -0,0 +1,11 @@
+dfu.o: usb/dfu.c usb/usb.h usb/dfu.h board.h include/atusb/atusb.h \
+ board_atusb.h
+
+usb/dfu.c:
+usb/usb.h:
+usb/dfu.h:
+board.h:
+include/atusb/atusb.h:
+
+board_atusb.h:
+
diff --git a/atusb/fw/dfu_common.d b/atusb/fw/dfu_common.d
new file mode 100644
index 0000000..b3d986f
--- /dev/null
+++ b/atusb/fw/dfu_common.d
@@ -0,0 +1,13 @@
+dfu_common.o: usb/dfu_common.c usb/usb.h usb/dfu.h board.h \
+ include/atusb/atusb.h board_atusb.h usb/../sernum.h usb/../board.h
+
+usb/dfu_common.c:
+usb/usb.h:
+usb/dfu.h:
+board.h:
+
+include/atusb/atusb.h:
+board_atusb.h:
+usb/../sernum.h:
+usb/../board.h:
+
diff --git a/atusb/fw/ep0.d b/atusb/fw/ep0.d
new file mode 100644
index 0000000..3c719ec
--- /dev/null
+++ b/atusb/fw/ep0.d
@@ -0,0 +1,20 @@
+ep0.o: ep0.c usb/usb.h usb/dfu.h usb/usb.h include/at86rf230.h \
+ include/atusb/ep0.h include/atusb/atusb.h version.h board.h \
+ board_atusb.h sernum.h spi.h mac.h
+
+ep0.c:
+usb/usb.h:
+usb/dfu.h:
+usb/usb.h:
+include/at86rf230.h:
+
+include/atusb/ep0.h:
+include/atusb/atusb.h:
+version.h:
+board.h:
+
+board_atusb.h:
+sernum.h:
+spi.h:
+mac.h:
+
diff --git a/atusb/fw/flash.d b/atusb/fw/flash.d
new file mode 100644
index 0000000..d8e5a90
--- /dev/null
+++ b/atusb/fw/flash.d
@@ -0,0 +1,11 @@
+flash.o: flash.c usb/dfu.h usb/usb.h board.h include/atusb/atusb.h \
+ board_atusb.h
+
+flash.c:
+usb/dfu.h:
+usb/usb.h:
+board.h:
+include/atusb/atusb.h:
+
+board_atusb.h:
+
diff --git a/atusb/fw/mac.c b/atusb/fw/mac.c
index 835002c..a520887 100644
--- a/atusb/fw/mac.c
+++ b/atusb/fw/mac.c
@@ -32,8 +32,8 @@ static uint8_t tx_buf[MAX_PSDU];
 static uint8_t tx_size = 0;
 static bool txing = 0;
 static bool queued_tx_ack = 0;
-static uint8_t next_seq, this_seq, queued_seq;
-
+static uint8_t next_seq, this_seq, queued_seq, queued_tx_trac;
+static uint8_t data[2];
 
 /* ----- Receive buffer management ----------------------------------------- */
 
@@ -65,7 +65,9 @@ static void usb_next(void)
 	}
 
 	if (queued_tx_ack) {
-		usb_send(&eps[1], &queued_seq, 1, tx_ack_done, NULL);
+		data[0] = queued_seq;
+		data[1] = reg_read(REG_TRX_STATE);
+		usb_send(&eps[1], data, 2, tx_ack_done, NULL);
 		queued_tx_ack = 0;	
 	}
 }
@@ -124,10 +126,13 @@ static bool handle_irq(void)
 
 	if (txing) {
 		if (eps[1].state == EP_IDLE) {
-			usb_send(&eps[1], &this_seq, 1, tx_ack_done, NULL);
+			data[0] = this_seq;
+			data[1] = reg_read(REG_TRX_STATE);
+			usb_send(&eps[1], data, 2, tx_ack_done, NULL);
 		} else {
 			queued_tx_ack = 1;
 			queued_seq = this_seq;
+			queued_tx_trac = reg_read(REG_TRX_STATE);
 		}
 		txing = 0;
 		return 1;
diff --git a/atusb/fw/mac.d b/atusb/fw/mac.d
new file mode 100644
index 0000000..aa43423
--- /dev/null
+++ b/atusb/fw/mac.d
@@ -0,0 +1,13 @@
+mac.o: mac.c usb/usb.h include/at86rf230.h spi.h board.h \
+ include/atusb/atusb.h board_atusb.h mac.h
+
+mac.c:
+usb/usb.h:
+include/at86rf230.h:
+spi.h:
+board.h:
+
+include/atusb/atusb.h:
+board_atusb.h:
+mac.h:
+
diff --git a/atusb/fw/sernum.d b/atusb/fw/sernum.d
new file mode 100644
index 0000000..8c04153
--- /dev/null
+++ b/atusb/fw/sernum.d
@@ -0,0 +1,11 @@
+sernum.o: sernum.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h \
+ sernum.h
+
+sernum.c:
+usb/usb.h:
+board.h:
+include/atusb/atusb.h:
+board_atusb.h:
+
+sernum.h:
+
diff --git a/atusb/fw/spi.d b/atusb/fw/spi.d
new file mode 100644
index 0000000..fa0b3ef
--- /dev/null
+++ b/atusb/fw/spi.d
@@ -0,0 +1,8 @@
+spi.o: spi.c board.h include/atusb/atusb.h board_atusb.h spi.h
+
+spi.c:
+board.h:
+include/atusb/atusb.h:
+board_atusb.h:
+spi.h:
+
diff --git a/atusb/fw/usb.d b/atusb/fw/usb.d
new file mode 100644
index 0000000..e420d8e
--- /dev/null
+++ b/atusb/fw/usb.d
@@ -0,0 +1,8 @@
+usb.o: usb/usb.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h
+
+usb/usb.c:
+usb/usb.h:
+board.h:
+include/atusb/atusb.h:
+board_atusb.h:
+
diff --git a/atusb/fw/version.c b/atusb/fw/version.c
new file mode 100644
index 0000000..f58413c
--- /dev/null
+++ b/atusb/fw/version.c
@@ -0,0 +1,4 @@
+/* MACHINE-GENERATED. DO NOT EDIT ! */
+#include "version.h"
+const char *build_date = "lun. 05 sept. 2022 05:10:00 CEST";
+const uint16_t build_number = 26;
diff --git a/atusb/fw/version.d b/atusb/fw/version.d
new file mode 100644
index 0000000..aafbf8c
--- /dev/null
+++ b/atusb/fw/version.d
@@ -0,0 +1,5 @@
+version.o: version.c version.h
+
+version.c:
+version.h:
+
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions
  2022-09-05 20:43 [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Miquel Raynal
  2022-09-05 20:43 ` [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status Miquel Raynal
@ 2022-09-05 23:33 ` Alexander Aring
  2022-09-06  7:56   ` Miquel Raynal
  1 sibling, 1 reply; 7+ messages in thread
From: Alexander Aring @ 2022-09-05 23:33 UTC (permalink / raw)
  To: Miquel Raynal
  Cc: werner, Stefan Schmidt, Alexander Aring, Thomas Petazzoni,
	linux-wpan - ML

Hi,

On Mon, Sep 5, 2022 at 4:43 PM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
>
> Those instructions do not work anymore for several reaons:
> - Two out of the three files to download return a 404 error:
>       * The binutils version does not exist, it was 2.21.1 or 2.21.1a
>         instead of just 2.21.
>       * The avr-libc is no longer hosted on the pointed website, I've
>         found an alternate.
> - The binutils version mentioned is not able to compile the firmware on
>   a recent distribution, the Internet advised to update its version and
>   it worked.
> - Most of these compilations will throw warnings if you use a recent
>   gcc. Sometimes -Werror is set and it fails the build. To avoid that,
>   just use --disable-werror in the ./configure options.
> - I had issues building the gcc doc but those issues are trivial to
>   fix inline.
>
> Update the instructions for building the toolchain and while at it,
> start the file by mentioning that this is maybe not useful anymore, and
> provide the packets to install.
>
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> ---
>  atusb/fw/README | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/atusb/fw/README b/atusb/fw/README
> index 99ceb22..44f65f5 100644
> --- a/atusb/fw/README
> +++ b/atusb/fw/README
> @@ -1,4 +1,6 @@
> -Requires a very recent toolchain, because ATmega32U2 is relatively new.
> +- Toolchain:
> +
> +  apt install avr-gcc libc-avr
>

grml, it's just the other name around... but I think an important
notice is here "use the debian packages".

gcc-avr avr-libc

I know it was swapped and was not checking it... it was a 50/50 chance.

- Alex


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status
  2022-09-05 20:43 ` [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status Miquel Raynal
@ 2022-09-06  0:16   ` Alexander Aring
  2022-09-06  0:19     ` Alexander Aring
  0 siblings, 1 reply; 7+ messages in thread
From: Alexander Aring @ 2022-09-06  0:16 UTC (permalink / raw)
  To: Miquel Raynal
  Cc: werner, Stefan Schmidt, Alexander Aring, Thomas Petazzoni,
	linux-wpan - ML

Hi,

On Mon, Sep 5, 2022 at 4:43 PM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
>
> From: Alexander Aring <aahringo@redhat.com>
>
> Upon Tx done condition, returning the sequence number is useful but we
> might also return the TRAC value which is needed to ensure that the
> packet we sent got ACKed. The TRAC register just needs to be read when
> the TRX_END interrupt fires.
>
> We then need to send this information as part of the status
> message. First byte remains the sequence number for ensuring backward
> compatibility and a second byte is added to forward the TRAC register
> status.
>
> Signed-off-by: Alexander Aring <aahringo@redhat.com>
> [Miquel Raynal: Moved the data array out of the stack, wrote commit log]
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>

I sent another patch v2, it should also fix a race see commit msg
regarding RX_AACK_ON. May you can fast test it and feel welcome to
resubmit it as a patch.
This patch has a lot of generated/compiled files added and I think it
was an accident.

- Alex


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status
  2022-09-06  0:16   ` Alexander Aring
@ 2022-09-06  0:19     ` Alexander Aring
  2022-09-06  8:08       ` Miquel Raynal
  0 siblings, 1 reply; 7+ messages in thread
From: Alexander Aring @ 2022-09-06  0:19 UTC (permalink / raw)
  To: Miquel Raynal
  Cc: werner, Stefan Schmidt, Alexander Aring, Thomas Petazzoni,
	linux-wpan - ML

Hi,

On Mon, Sep 5, 2022 at 8:16 PM Alexander Aring <aahringo@redhat.com> wrote:
>
> Hi,
>
> On Mon, Sep 5, 2022 at 4:43 PM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> >
> > From: Alexander Aring <aahringo@redhat.com>
> >
> > Upon Tx done condition, returning the sequence number is useful but we
> > might also return the TRAC value which is needed to ensure that the
> > packet we sent got ACKed. The TRAC register just needs to be read when
> > the TRX_END interrupt fires.
> >
> > We then need to send this information as part of the status
> > message. First byte remains the sequence number for ensuring backward
> > compatibility and a second byte is added to forward the TRAC register
> > status.
> >
> > Signed-off-by: Alexander Aring <aahringo@redhat.com>
> > [Miquel Raynal: Moved the data array out of the stack, wrote commit log]
> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
>
> I sent another patch v2, it should also fix a race see commit msg
> regarding RX_AACK_ON. May you can fast test it and feel welcome to
> resubmit it as a patch.
> This patch has a lot of generated/compiled files added and I think it
> was an accident.

there are files which need to be added to ".gitignore". Just a hint,
run "git add -u ." instead of "git add ." which will not add new
files.

- Alex


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions
  2022-09-05 23:33 ` [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Alexander Aring
@ 2022-09-06  7:56   ` Miquel Raynal
  0 siblings, 0 replies; 7+ messages in thread
From: Miquel Raynal @ 2022-09-06  7:56 UTC (permalink / raw)
  To: Alexander Aring
  Cc: werner, Stefan Schmidt, Alexander Aring, Thomas Petazzoni,
	linux-wpan - ML

Hi Alexander,

aahringo@redhat.com wrote on Mon, 5 Sep 2022 19:33:47 -0400:

> Hi,
> 
> On Mon, Sep 5, 2022 at 4:43 PM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> >
> > Those instructions do not work anymore for several reaons:
> > - Two out of the three files to download return a 404 error:
> >       * The binutils version does not exist, it was 2.21.1 or 2.21.1a
> >         instead of just 2.21.
> >       * The avr-libc is no longer hosted on the pointed website, I've
> >         found an alternate.
> > - The binutils version mentioned is not able to compile the firmware on
> >   a recent distribution, the Internet advised to update its version and
> >   it worked.
> > - Most of these compilations will throw warnings if you use a recent
> >   gcc. Sometimes -Werror is set and it fails the build. To avoid that,
> >   just use --disable-werror in the ./configure options.
> > - I had issues building the gcc doc but those issues are trivial to
> >   fix inline.
> >
> > Update the instructions for building the toolchain and while at it,
> > start the file by mentioning that this is maybe not useful anymore, and
> > provide the packets to install.
> >
> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> > ---
> >  atusb/fw/README | 18 ++++++++++--------
> >  1 file changed, 10 insertions(+), 8 deletions(-)
> >
> > diff --git a/atusb/fw/README b/atusb/fw/README
> > index 99ceb22..44f65f5 100644
> > --- a/atusb/fw/README
> > +++ b/atusb/fw/README
> > @@ -1,4 +1,6 @@
> > -Requires a very recent toolchain, because ATmega32U2 is relatively new.
> > +- Toolchain:
> > +
> > +  apt install avr-gcc libc-avr
> >  
> 
> grml, it's just the other name around... but I think an important
> notice is here "use the debian packages".
> 
> gcc-avr avr-libc
> 
> I know it was swapped and was not checking it... it was a 50/50 chance.

Haha I blindly trusted you, I should have double checked.

Thanks,
Miquèl

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status
  2022-09-06  0:19     ` Alexander Aring
@ 2022-09-06  8:08       ` Miquel Raynal
  0 siblings, 0 replies; 7+ messages in thread
From: Miquel Raynal @ 2022-09-06  8:08 UTC (permalink / raw)
  To: Alexander Aring
  Cc: werner, Stefan Schmidt, Alexander Aring, Thomas Petazzoni,
	linux-wpan - ML

Hi Alexander,

aahringo@redhat.com wrote on Mon, 5 Sep 2022 20:19:28 -0400:

> Hi,
> 
> On Mon, Sep 5, 2022 at 8:16 PM Alexander Aring <aahringo@redhat.com> wrote:
> >
> > Hi,
> >
> > On Mon, Sep 5, 2022 at 4:43 PM Miquel Raynal <miquel.raynal@bootlin.com> wrote:  
> > >
> > > From: Alexander Aring <aahringo@redhat.com>
> > >
> > > Upon Tx done condition, returning the sequence number is useful but we
> > > might also return the TRAC value which is needed to ensure that the
> > > packet we sent got ACKed. The TRAC register just needs to be read when
> > > the TRX_END interrupt fires.
> > >
> > > We then need to send this information as part of the status
> > > message. First byte remains the sequence number for ensuring backward
> > > compatibility and a second byte is added to forward the TRAC register
> > > status.
> > >
> > > Signed-off-by: Alexander Aring <aahringo@redhat.com>
> > > [Miquel Raynal: Moved the data array out of the stack, wrote commit log]
> > > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>  
> >
> > I sent another patch v2, it should also fix a race see commit msg
> > regarding RX_AACK_ON. May you can fast test it and feel welcome to
> > resubmit it as a patch.
> > This patch has a lot of generated/compiled files added and I think it
> > was an accident.  

Crap.

> there are files which need to be added to ".gitignore". Just a hint,
> run "git add -u ." instead of "git add ." which will not add new
> files.

I didn't know about -u, I should probably get used to it because I too
often send generated files by mistake...

I initially wanted to add a .gitignore, and then forgot. I'll do it.

Thanks,
Miquèl

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-09-06  8:09 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-05 20:43 [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Miquel Raynal
2022-09-05 20:43 ` [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status Miquel Raynal
2022-09-06  0:16   ` Alexander Aring
2022-09-06  0:19     ` Alexander Aring
2022-09-06  8:08       ` Miquel Raynal
2022-09-05 23:33 ` [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Alexander Aring
2022-09-06  7:56   ` Miquel Raynal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).