summaryrefslogtreecommitdiff
path: root/Documentation/process/debugging/driver_development_debugging_guide.rst
blob: aca08f457793e8a398159bb203003ea8576e19b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
.. SPDX-License-Identifier: GPL-2.0

========================================
Debugging advice for driver development
========================================

This document serves as a general starting point and lookup for debugging
device drivers.
While this guide focuses on debugging that requires re-compiling the
module/kernel, the :doc:`userspace debugging guide
</process/debugging/userspace_debugging_guide>` will guide
you through tools like dynamic debug, ftrace and other tools useful for
debugging issues and behavior.
For general debugging advice, see the :doc:`general advice document
</process/debugging/index>`.

.. contents::
    :depth: 3

The following sections show you the available tools.

printk() & friends
------------------

These are derivatives of printf() with varying destinations and support for
being dynamically turned on or off, or lack thereof.

Simple printk()
~~~~~~~~~~~~~~~

The classic, can be used to great effect for quick and dirty development
of new modules or to extract arbitrary necessary data for troubleshooting.

Prerequisite: ``CONFIG_PRINTK`` (usually enabled by default)

**Pros**:

- No need to learn anything, simple to use
- Easy to modify exactly to your needs (formatting of the data (See:
  :doc:`/core-api/printk-formats`), visibility in the log)
- Can cause delays in the execution of the code (beneficial to confirm whether
  timing is a factor)

**Cons**:

- Requires rebuilding the kernel/module
- Can cause delays in the execution of the code (which can cause issues to be
  not reproducible)

For the full documentation see :doc:`/core-api/printk-basics`

Trace_printk
~~~~~~~~~~~~

Prerequisite: ``CONFIG_DYNAMIC_FTRACE`` & ``#include <linux/ftrace.h>``

It is a tiny bit less comfortable to use than printk(), because you will have
to read the messages from the trace file (See: :ref:`read_ftrace_log`
instead of from the kernel log, but very useful when printk() adds unwanted
delays into the code execution, causing issues to be flaky or hidden.)

If the processing of this still causes timing issues then you can try
trace_puts().

For the full Documentation see trace_printk()

dev_dbg
~~~~~~~

Print statement, which can be targeted by
:ref:`process/debugging/userspace_debugging_guide:dynamic debug` that contains
additional information about the device used within the context.

**When is it appropriate to leave a debug print in the code?**

Permanent debug statements have to be useful for a developer to troubleshoot
driver misbehavior. Judging that is a bit more of an art than a science, but
some guidelines are in the :ref:`Coding style guidelines
<process/coding-style:13) printing kernel messages>`. In almost all cases the
debug statements shouldn't be upstreamed, as a working driver is supposed to be
silent.

Custom printk
~~~~~~~~~~~~~

Example::

  #define core_dbg(fmt, arg...) do { \
	  if (core_debug) \
		  printk(KERN_DEBUG pr_fmt("core: " fmt), ## arg); \
	  } while (0)

**When should you do this?**

It is better to just use a pr_debug(), which can later be turned on/off with
dynamic debug. Additionally, a lot of drivers activate these prints via a
variable like ``core_debug`` set by a module parameter. However, Module
parameters `are not recommended anymore
<https://lore.kernel.org/all/2024032757-surcharge-grime-d3dd@gregkh>`_.

Ftrace
------

Creating a custom Ftrace tracepoint
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A tracepoint adds a hook into your code that will be called and logged when the
tracepoint is enabled. This can be used, for example, to trace hitting a
conditional branch or to dump the internal state at specific points of the code
flow during a debugging session.

Here is a basic description of :ref:`how to implement new tracepoints
<trace/tracepoints:usage>`.

For the full event tracing documentation see :doc:`/trace/events`

For the full Ftrace documentation see :doc:`/trace/ftrace`

DebugFS
-------

Prerequisite: ``CONFIG_DEBUG_FS` & `#include <linux/debugfs.h>``

DebugFS differs from the other approaches of debugging, as it doesn't write
messages to the kernel log nor add traces to the code. Instead it allows the
developer to handle a set of files.
With these files you can either store values of variables or make
register/memory dumps or you can make these files writable and modify
values/settings in the driver.

Possible use-cases among others:

- Store register values
- Keep track of variables
- Store errors
- Store settings
- Toggle a setting like debug on/off
- Error injection

This is especially useful, when the size of a data dump would be hard to digest
as part of the general kernel log (for example when dumping raw bitstream data)
or when you are not interested in all the values all the time, but with the
possibility to inspect them.

The general idea is:

- Create a directory during probe (``struct dentry *parent =
  debugfs_create_dir("my_driver", NULL);``)
- Create a file (``debugfs_create_u32("my_value", 444, parent, &my_variable);``)

  - In this example the file is found in
    ``/sys/kernel/debug/my_driver/my_value`` (with read permissions for
    user/group/all)
  - any read of the file will return the current contents of the variable
    ``my_variable``

- Clean up the directory when removing the device
  (``debugfs_remove(parent);``)

For the full documentation see :doc:`/filesystems/debugfs`.

KASAN, UBSAN, lockdep and other error checkers
----------------------------------------------

KASAN (Kernel Address Sanitizer)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Prerequisite: ``CONFIG_KASAN``

KASAN is a dynamic memory error detector that helps to find use-after-free and
out-of-bounds bugs. It uses compile-time instrumentation to check every memory
access.

For the full documentation see :doc:`/dev-tools/kasan`.

UBSAN (Undefined Behavior Sanitizer)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Prerequisite: ``CONFIG_UBSAN``

UBSAN relies on compiler instrumentation and runtime checks to detect undefined
behavior. It is designed to find a variety of issues, including signed integer
overflow, array index out of bounds, and more.

For the full documentation see :doc:`/dev-tools/ubsan`

lockdep (Lock Dependency Validator)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Prerequisite: ``CONFIG_DEBUG_LOCKDEP``

lockdep is a runtime lock dependency validator that detects potential deadlocks
and other locking-related issues in the kernel.
It tracks lock acquisitions and releases, building a dependency graph that is
analyzed for potential deadlocks.
lockdep is especially useful for validating the correctness of lock ordering in
the kernel.

PSI (Pressure stall information tracking)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Prerequisite: ``CONFIG_PSI``

PSI is a measurement tool to identify excessive overcommits on hardware
resources, that can cause performance disruptions or even OOM kills.

device coredump
---------------

Prerequisite: ``CONFIG_DEV_COREDUMP`` & ``#include <linux/devcoredump.h>``

Provides the infrastructure for a driver to provide arbitrary data to userland.
It is most often used in conjunction with udev or similar userland application
to listen for kernel uevents, which indicate that the dump is ready. Udev has
rules to copy that file somewhere for long-term storage and analysis, as by
default, the data for the dump is automatically cleaned up after a default
5 minutes. That data is analyzed with driver-specific tools or GDB.

A device coredump can be created with a vmalloc area, with read/free
methods, or as a scatter/gather list.

You can find an example implementation at:
`drivers/media/platform/qcom/venus/core.c
<https://elixir.bootlin.com/linux/v6.11.6/source/drivers/media/platform/qcom/venus/core.c#L30>`__,
in the Bluetooth HCI layer, in several wireless drivers, and in several
DRM drivers.

devcoredump interfaces
~~~~~~~~~~~~~~~~~~~~~~

.. kernel-doc:: include/linux/devcoredump.h

.. kernel-doc:: drivers/base/devcoredump.c

**Copyright** ©2024 : Collabora
8   ̓;z:WNH_e;i:1'Po 2*S),T9ȱ$]{},,p}zaQuZq#3{#@0gݻ^. m̿w5OCYɖTjo+-z<1`Hx7Ng: „QTgG Uc {X+DrU"4 H@~h[o0o=BQW9&=q#n "57sg6V&I¯~k>OrH (s5 tt&Á+W:%@9xL2̈́ 1J\ܢln j; {QY|,5v6`ݏ}sG@0A%{%z^>nR foFC4!f{]WFRpo).*;6ؒXb[M׍('qDAJPDm V]mi`b̩ˡezu&vZ'>Jb5Mi/>/yG/9L>YlBB4<- W-RHF} j}=;,5k~{57u>m兹G1 6 s]>"@"{ҊE H2$$cTy99t" oX.ŕڏs[M4pDLEC/p]z ? ʴb€=%D 8!AT lg]T0M86*Jž-暤",r#GxE`݋;\$V$!9[%T/}}h;}$htl5S"{勇Y--}l`dɲt+ qf]V{Uڐe#a Pkk_mKes^nn@b{4F<6@@H%'y"/BAn37} ɯV_u_Nd6aIۻ@nY:Hmcnw VН{p$&ۜCQ(q^g04LØ h .Eϋ0[0WV() ]>f M#\xXLZ\볃`4V!O;2#2(R٭w]2;eoGqL7n}N7Gf /? N @b9` 6>Cf'ZWiE= d@p+%ׇ3I(P oK(4ͣrB3s]Ct מ="H(N@ x Ȇ8wZ#T_3DXTX|GSDA`$2p]]'ܾ=U=ؒplҠuξsFroA}(ٚ3U͉D ׽vpAo$XxهoQ-il-Q/˄qp`8. 19Z'.L@#G n%[:PWmtˢS'Y]7&'s9v\6LR5YӬ@h [/|Nmqf#gRDG s>Ԣ;=oL.o Y CdUÙP*Ò_yAQ瘽_GQNN 3+q\=uH?>G<.N/Cw-07B>롎 ۡP\k f:0D!*l:ytG޴ʧr(>[vZs??ǔ#mye0Ohr5Syv>T4AAmܭO=6$/7g% ?1޺Bq}s$ B~6n|U1`qy5.?p"fݱa83  EH F?3\Uk *٬b-DXp ‘Bjw"=hO5iX4mcB{ժԾ&^#dL ^a0͕Yڈ.28Dmp cc%$XU) A(N H/- 1h~lH?_ߍ~:=7EK¥ZPmGa(*q" c\QM^ qTB@tľ`j^{yXÕA;v{t4E00Im /Ɔ: *V,2(]f(dG>@\Yv9QC.d/)$A\~_s!lgDQw)Sc& ub.r(Rn1CY~?Kj2r55`A5!qЮ똌RcLĈEHTѧ@D~/ԏ!ŠR&a>l`]4aO!7e[/ai6Oᅳf*'H\0.{c\@D1W(c~#~EKQS8Wc:kW铂v.7_ݣxnm]F۶@m3F5}ɝGV}׾{H6?60]Ts{= CұvY+B5Cpd^gӮs#6a4!2FoSNl}忣 n5i.{ Y(>5nDL~p=x #>tfteۏkrK%Kْ(_vx߶n,xki<ʻڮrL;O JdRSc+ ;mI^~.Rؽ~f?KXhゞ\/NpIp P4߯g\1`D-{8B)A(M[w0۪GDfp/]ȀXl sàO$np7DS,kC놈jU1Q<sG} !}_pLӸȸ-T| .H,ЗIJl 8CMd{g/{`,/kDV03I=hBxiai,gGvLC<"QS~T Z#K=W=>=Uѧe[~ﱶlKCbCT9RN۶N6r8-,#)Mڡ֛o=A/au)>ec~bHHB2]G87Z@rϞ7ǼFґ X" דOEU@ 2=$DUqhq^xJeрZ[iPr6:q[T>>r@g_Mg#5%QPI"bZK(q 6e- ЍŦ{8Gɘ˚ˆYU\zs5Z)N.lJmKܢǭd]W R0 +zjL)eǭGPqFLu5E Efomo iYvl25:c{wM]ТD|fnۥ6 lcP4d5rdԦ "M#c!(4[mQTC@Tl)WjtOaFk8Ka@#HZakֿ9>6ʠx6́ | ud>xhyB6)Uf @`nQefңe`RW}~ _,5: NdjTW ,{ ݀N~Kf p)IxCh aduy!9/ö}^ū6%   g2`T ڂޣrYK?je]bFFK=^:q}Q'~.]{*]N!ځ.Z,9Y.wQ]󇅔1|Cs_!{It +^CΊe#*Y,s9?>Ө!ГC]d1Zh>)?M}QS POC@v@9;Ȳ>׍X]kF-X͆sJ3\ۅUaU(zɘ@WA4ȁ-|" $s#3Sp$2lϟ Cn>dO3أAGF$` Or{uqʙ߁AMs0gLXhZ LO4Fhh!(׎p82^tj8~Jl,΂w_@b3zzjĈ|-~q1:#GFށ?CF>&Y])^4\L,;Y:VڠYzA0Z+4gc뇨:Pe+,HNA3(!XFnϓrLݜ}8}Gr&xhY G?|{92rJhwm>·,Y{p]3bȯq6[4u>;"lWcdg޾ӾX~Q~؞7tb _eh-ód{]7//; jVSX.K'ӞOCYn:JF-|x>'FRÊXad`B#lu꾋_7yO"a48B vDv,|+~vG,b4.b"_q=mH;G l)|#|P뿍K%n>YRyٙ \XLmpvJ (q}OCz3 <"*Uvh =5&D'#MWxET[1>%BgUCq)iqп?"zaB%*n{S`rM,KnK\ w\9/?:c'{clB- !(ϚnNTT{xzs@]ڣz{~QkoM6+ gs9MdWM7~mdLCN!,`laqd&e# 7b]6=\F)̝na愓O]v?t`uAΑJ6ckFQ0Jl(`yp!~Ogn?&T(ʂP]{!I~O  t!;~q7A8t߆ .Q؋E/t&~Xd !T_Sˎ &C42;2} *{$5>`ʣ!H`m8/TMbw}jeI'j+u, xեę6faP魟 p3P~u(D|C) 6 ܚ_W󵃠=ѵ/ddg6vN 6Z>,Uc2: rw_%4`fA@xy^Zйȸ]G>Ha촕‹eN۪KqFАFf%/[C{W+  Ϸ/EoH)5I!+NqT j\g)6 &Gn@ܑ}B _vԷ`} 92!;J z!r3Q*^qT:6 yN*"" ;vQg^.]A htRzz_5[Qih54V80/!(g\9g٩]`vЪNa>T 8ռ])%q`K HXixHB"^vfF~ƖtmeVzt 6a#6l k~bqCt,![v9X+"\䔯m\CBPqfXj2\t&C2*ܢptRHZ끀=-7XP;IW:4ދ%;(\bnTU9++FZ@0LXd1fFI^,eñ.ښV{U[^>O4O@_yӈߣ T~3Ps?<Ѿ崁AFz|oP2"B/;S+_SM˕ZdvicJ} i@chBD"ɂ{A<q.`?cnqڰ!HT4DDswO(UE\$}. j*Cg-p,=! 3\ ]Iʠk4aOQ,g\^sP F5_{xspi*EJN3,T}~꽡* \wV7͸؆ 0=hX, @z?y!x $DQ>˞ <Iū8t-gLkx6`|I O|L/uYt>쨝ΖK2Y];)\)iX?yymYלoO-)X>7}056i4[]t$-LB^)<W:[5emv1xi{ׇV71Fe7Y/9 Bjft<dO,NOPM̷i7)qA󻩀 "_-iӪi;{gצ@b/'fMmC?e zL87R_d^GgOay5wnw]}zvV?c4JncDz^P Spe/@Ŭb\#uB_cvf6[v5Zn ݈kGK:'{.jS`=ם>ш ;r*E s.$ey9zTԈN<{ZYߗ<bd|4m|SeQU_^Rfn!FP0*g [(J:"DN< Ok:By4T 5 k%I;7kXʉS%L!3a0;T#~ 8 )=9<6 t)YWmtGIXv l5&#Q~F"=linF?l63cn!E4{s2[e,ir~DRȎY_4 ശjmGQm~: C AEilj(2n;޶ܵzp]p~ 8c 15J2@TVr H\\~ HM6̌r+Y:UhQJEHˏp}ήlx}QĂB!V.)BZ`.qzSͣLmt^;C@վˇ/#j2daS\eﻈzEt<~лdpPKhJ hdRPc~oߐY 8 ߪ|@Bqp0  v:i\wH› v.߳<:xc |dI1;dĒ{I;Ӊ 20VB[oedy "%&f 5$"@{X8)?n>7w>]Iy[[ &)! ki ҈tp D )TYN4Eh_4dAIOpp[! ]`"A6( -L撂Qi1(Kp"Y؊5{!UVç_wA(ƾm||WzHjv:aEtM͹u9̇471Iړ 憐sӪdphy c 'Z`L26e&w]4-R~vHoZML'\ f\>?uɃ_WRJfżzC_W{>eh79(fS=YA~=Q@nUÀ-arFY wWDG>CT-Mc)jw"dOB"=#1#VW"zWvphc-_w|kGuYl6Q3KXU>gvm JN 7k[r$ξErs!V80> GH&~=0}d`Qگ*BࠤBߪ^JSGCS8 TCu;~?&ϮjS- rB. ~P@6_(U_G߸cr[MWr:j Lꭏ >mGV u/(U=6ߩ8q{.lVǁ{lM؈҈\?j=O gLF#4nO8p%k /@ɉ(%y=(Ȓ0Ɛ&I)eC3r/\ QCカdG:832!Aÿ z@Z) Y/="逪+#4  #,:N8+g._X0DpU|̳ "S ;#A'*]T *$˝e/Ɩx"9Քs%g@{Du:˄GU`K̍'/5w)8LAkp g'F: .>aۑqWA1%_ͱ[E X0Dԫm:Ǯ- j^zswO1ug/spфP9QX OKd˵RX)9~eu:p+^S߭Y}ew˲ONl_x|SALPA d~]khNT|K?0lCܻ7*c3÷)[poQKg`ƜUTTP .}oF>_$!/[l+ZR(`  2@XRHL c{C4帤f&Cre魤Qyz:c:R`t&=;cz{ǚφB@m_a7w"=S8-ZP[k&E]գJ?3~}'+N_V.4jF~y+|'! CDsY *"j 4礧VΠ9&,:;矪t(iw]z 3{r)qD$0/HeuU ,Plv@An:u9a*ˆo5[PqȊ:Iɢ** Zk#FYl{rٳn a`hUoQv |lS[p!mQ(;8RDgAGkl Hᢸj1 [1 h_#QZzɏe"7Ԩ)DxڃtQD$GGK=3;zo@P'<ξ\Ӊ!u?rؔS_>.s|.m8D%9dF՞p!gpK(#l%O`:wS>9z^=C8+ڄ0}C i yMì$V:X!Dw9;~馯n9xvV0<8a&*Oppk!+pRSU{ )y [2qi:Ї%@6CsNZ{ 3_d=HQ PA /xP*$&CU˷먄|c*HP&[ \΄+%ˆ^0`"8+!)SGI1U''OÌLp%6~A ˑ (Z;2kZSe}tw\h^ e_ZZ5=hC6DY4PZbelq~M Jz>hTywXBS#0ݬqؑ!j#mlcqu078҇B[mm@&V9Ku&eXHah4o[|@UopHM!/c{ۣcwNn<&̫q!~ #eY.{Cگaɲ8ˢdNsp.Ťqz_E8p B%(7IAAB+ꓟK7O7z!F`e!BsIcsv2FGz|,@` P^Ӈ6Z+fAn.2ɶWm ӶL$ٕ'[ԛ|m s F>ص{Oact3#ۯ_\jK/bfF0Doۉ{BL/q]EG%=SBs"bm堨|'HHI@Mw&#r;)ݧ7$L7 < FA>= &dSr cZl8xJ ^o{^X!#^r󹀀P>3Ap@b?t:0,7l_P޹=HypJ`}L@]i_" 6/ѥp.0% G|a^ aOc 'O%.{0!+<΁'$[ŋm}rxqIn9l9xj_ӆsƧ1,>h| 7:&^* Eqc{uo/?9G}zu'?KC3G&.焞k JhU3d@ުoNٌCM(K 4px榟`o~ UΫ*w-J 7^)/$QcYHukſz7mLۺr~bDH`xwr#ﻱ꒨dSoC yH_̠<@ }fXLX >&ط72 hXD;˱M4[EcB;f'x;VCL5κa 4EMy[j:KWUP,l4ZGu!' \ݔ狡f)+1 Ntqy8yY gҬb%KT[A(Dh Җyl5p3ը;zQ3x8L8#)>; HHā30 _lτ9` :+pשOښUV)]b!(nyԛhi@/N`M:* =f6PbgdK "0|VW!6+ S# oEvaW\!ښ3Uh־^sZZ> DJ !߅sP^05:aaDž;qUBBH"L6F<7^zyUx ۔%Uo%iSFU0kADlUPis|4ojHh֞[ $.#q&5X},rer6⮟28SPӵR ; KFk"S`Ij"̯]TZY?fxC[>Ԕ"el $C$-r>=}z[v7f|ΛUDi Fy! 6ҥ;%˕O0\RêTҔ)+qyHvS +25ŽT`8f-&7wK$V

>\ܗ^3"c{|9YPyBf9UJZho%;N+"֎ W-W^Lzֻd.y{ X( vpSo=+ȣ=*g8 Y.#qowD}N*FCJItH8"`J-Q$c*(J4Ṫ/w9ퟃB1 f[c.%aÙxHo,N I*,a.02$z)ScSw/ZfuA߰WuN0dNZIY!oi9T a%?NfaF|$<9\jqY5W&BkrÑK_Z9GʃqMdTD40N,wo&ճ _F! ~]=I`6w^v>Ɯ@YƢ!0u&&ok@AeG[dԣ1` (GGvɱ[_zk4 D뤟ï ql-hfoH&dv%"3pܠL@ D dG 3yבM_JH*}f[alxju@xxv#Bbٹ=DFCm|pޏζ \I%bTjgO<95;͐Gm\Wex%^&C~5 [`a%.>.G}K s͢->oF]ʜvp̦$JZ 3ڃ,Xuؘ]}HCpvG#n%{+ܩX`խoy.FC!CvX#ذN rt]%q]VKNQ\JLCIOw-wH-IDT=d'#h"Bznfa{$5\֐Q%`9PTPTF9 #^eIߢvPf歙ɠ B)Muc'I`S~2<.ShpWA" 0pL|-d s q̽7J` vl٥r+)r]KTwಛy~+0 '+A6s^HkWϖGGH!CzxM9kձ_z:!yhP8?2uv.;R NZh ԙƣ7|j!`CC.NTC b4A w5%Č%[ıA4wa>Pd㘲PĐJbYne ` Ρ طƂ]ޥ87a}C|[Xp[{4/I0,td(|q"3Ǔ!KRwU~̡(&Y Q 5 i(?{D* "G DAgQ!`m/hlrLfhD%T 0{Y;ӽe$8w㪂2;ɓ嶆'vr3K A>}%w@&Nr"O3ty|{xx?x(Б p?›F h[ܸ(/ C6*_=@@QYFiy)A - C/xG/a۲JN{V]LJAޫ yq~!-jvwV0ܧ;q@@J.w=ψT[_*Qc3`@n$!ENE84a !Yă31_ăeH7̳hk"48($ߐ)Z?L$:h~;(fL.^#ٖUb::PiÜVr2d@e2LDj0TqrHMG\ቅZ.XAi}q*/S gN8cE)Q↡Emo@eq-@ޔ7 ߛ\g:ywAHp0)cCgKӳG ҊzDb;с(/eH MF:ISg 2XF}D 2;V+Yhe4_[q,XI5$nu5J@`x\lAF G/e$u-e+};I_@.e1tK| 9GCoU~"=W" &!ۨ4c ,P.9z<)>\[Tu[-NW2XވF#So}bMPl0X M%GD1zP rP#%GgS3~dQ{.A@8o5QVo=8c/y.I:*#6hz۞ܜ|DŶ ow]/ t0Q-%ޔD=d?kqK S$@~9ȿ4wɠi_![(- KCL!z Akl(48f]Giy(r.խE",)v3dW~Ze/8 يf@Р * g[Vo77 $ ke3( ]*PӇӌ Dza6BX\lhzl,e5u\yRz\XVe`pʤ*9{IH+b?QO:(# S`LaXFS"ȁe3W@s%`QwNWqRq( ){,9p锍>8/&&pVyņ._gOY|\a1e6UnI dM'@Sx [ۺ5'N!> Is'n?!};_:'ʖu:gwzKuJm]=Q5X 07Ǐb4ei0v D=K{2'L M_CY!9>b/v8 FRsƁaO? k}]0[tRB^bg+5}I)y-@zIBzYDx@0 ._`\H !4UBVSoLw|z?Gt7z|Ahz! n/ᬊN y^ec o].&OQe-^Ì+:WE@0$S]FNnÞ wz`F ;$AGϨ¬ŬU$1&@قI5j5'_p(Iq{/gno>? ^ f/ o?j|5}![DWm 9&`m&\$ p1fv|{D6WYDK2'/}Lr|kf B TQР^4G=KL#e`k;%hR@^s` KBb8^p sd3:G2x樺8NS(MW1z1e}B"w^_\+ OCÏ1!\#=C/K=``rZ>cowS{ct<,t}vjLNLבDnXNQ¾Ydql x3^׆!T藍Zݺmo~y'y^~(2 7eH3Р@mBGK_3`'_, ɘ oWv彳GH!搻ixa @%` 9EKl%J8w ]sׇůGLBL!p}>1|! _DcLh1͒yaY$,)‡"x˪9O2G !!$:!QΦv<<G\@ DAGoTͷT v$_fd FxBܼۤ !0C|Xv /d%ġ =7bW''B69T񐃈\VEg/k*1\+ɑ9[8curm΋_9>xvٮuU@!~8U)8 e, \!qjOΎln r eqa“A`*ހ~D4ɕ6/.}u Bhd8zRpŢ@)o;έqТ'E=@Qj910"?<; F84y yȭ- IjAZu3q р`RУ ynk#cW-'RρY^5∴C?9OIM.a ~ _kW7y6:& l;t.&* ֧CTTw)%<` F&ch P7аږsǢ9%tKCWmځg{8ƥUJ4LKsN z$ Q#U);q[;,k7NcUj8 % _P[dzGzwP'ĬAd@t_ΰmU4fR}}H,v|P/~[O0DH祩c1@pG /3Q}`F"4y!m&ɒKye8- ~dcp-g^;vu!<8NO2GYϑ7%%n,Ml8)J#dž dj`W>q-Hgar;ٸ`d P)EZM* $os߂Ϙ>tpxwFxpC3H * >G[P oT ۾wQ5BpZ3>I8yƁs".}k.m ֫=ϊ m HD@a V9҂wcε9tpYLN8-5|Xt?Vf䏬7#\淌̇z ʗC8w&-:xVHgbV{GX{`Dy;h`7.] g U?ViE ԄNb }5tYlZ" l6#-8r )"_oAPr.17mb0Y!8<*?44'V!ǁpz8@26,}u/끡 ^#aۍXqU Ʀ@D2X H^E5HKI`#*PS5`m[Zd @FJJmG6xxz. c$v[RT5UUPTxVli&Y /s:\>dQnvTdH|D}?rD VZT&PhIcNlZÝ9Fsy4vSK?uܴ x/_eu4 yP!O撴0nH]#vj!@ &j̡d93mXw9  A3or$qk5>gm7jp"HvKeK㚚6pnA۞c! s?hbvAHUPR,F}M4 @P0p(PuL@+_+B&|U>>*GuZy_F dbWsT&,8J'Sg LDR  (#6Ј33!m_FМNlIoX292WPMZ+|7CrY0Z}e wQJXPU-lH"12&)scwˇ\!90NE*M ]p,4U1y?@=8 K$%R # _@FA M'50 o8,Bj:o{$9j+0DKne+Ru5RV=Ga;:e<8_ǁ¸cȝwI3g"& - N&cꀱb&qB,m5(BP`]<&ulp5);a[69:?:; OUua*Ɨ!^.]p? P94U2R\QzBG;7* yi!;`${7 (eU$QFX'?5ƮPhx454r sP!aغ>|&T9Df\`kҿEv۳~T񴼻;M4Xa4-z]/(y^OVq3^܄J#=X,iI>} )U3]B~ƕK{E; ڲ:y5 [ܱ ٠ⲣX+ %`6KƯԩZ!XUنZ]^h"ښ7bm&hsT]Xc=41#\Y؜WL+&(kZώD 1XVnjÎuU4W܊A6G9ave4t|37_)n/)GI5aGImAܡRb [ LHZ~Yd2Eo)U/VQ1ן60"U%6@2^:j«90[Zkrzsբ@ *_Gm-5*C&(a3`-ƻ{y#`nXnXC]Pޡ*Cɱ20 yElsh/a?)yUOg=!9oPD?F:(QlA4:R@Ip#ʪ ޵rჾ)tkrllR[_ r \kP`_h!B:O}U5ayg"~.`I`r'VЯٱBN zZ@RD}0Jg',U2%:/1ТFKc';!X) t*k2}x_Wqz0gsfYbƉ;CBnۺ;8s 4rh33󳼴(gq-` >Hy"?l~T=F{[q]9?(80T.ayt) ?g1ΐöbqޚ`5a#{L}OEz * 82j$%KW  `>a?5gZgu>K0@qf)y EXJ^SċMշ؉DڜXo`(kcP+4M5Tt@KmroJcQ6ځx-=oR-1ʜIА ʝٖ/`lΰi;[)F t5Ƨu{K4QÁ!awtU :#=REC(n*dG$M߶GE&?I qЁNŊ,9U'"`3n&e>nkT [0 Z]K|7XU3sP@t[V..G>NPɻwӴvl} W ~uOs:VΨ:3tg.ףEţѧ,i2g^rJNY _m Q9%_I_r)J('I <,@QLxc4!Q +5<$9%* i#FU QGh*$[K/9vQ:Z 6l0@bXg ~za/6HJ D ڞof`If7J*c+H / xt} Kň8=3TU8䐽"Ղ{Q4t08D>1gV}.-oABCc/J 9J\5tRbրB<ҟ/ =쌖\5qfqϊ0GQ0q(:ρ wYu~~bf9|5 ̀* ,P~ymOL1 $? lE$iHC0!n!H`p 'ӻ`G7M̮KTO?Dz1hc~ϚGc) (_G 7s?Qqu9WPխy8!'5!i9_ Ci]7jê¡w+9ř$}7 ވq H"6[/).x}/kN y5}n}S"PAG {_ e;nc??y`'; <:cc 1٧]+<*X o]>뿬p}=x݅s.|' )Ã|j`~/Ǧ,<~$@CXl͉Xz Ã8swM/F/M/1SUXtq\X;.?tVjX+1V$-wG8{^#-eemgoSnGӦȮ>XtH0!(E8!S*u Ľl%sDFgeyu<e_ 3a3dnWH _a!)WY0 R?NNqseBw{6.g?~\|م'[y4Qa֟2[A(Z7񪞰B zء䡒7 rp`ȋ\?rxVX{,5>߲߭Wc28kHRüBa'([ aEl5aN|Ѯdt@ < ?yD|w56F?osuvO0[hQD,9gKo-/mC,}`˷ܗ9n3:׆ u*2BacnYF]oTz z6[= 0,(yWk~4>L/+cc'^N6~6yG1?3[Cw O 5U1zJz˺# npvgz:{4|yѵ.̲Go=r¬0qā3SL=O'lj03ج#0 I#1q}L: Ad54Ro Rec.};ݕNRm}T<T|^o6THOP[pssC_LPIL[G^6u| y,RJ>ag2=F"}\?ǷgëӁ閝݄;r? <@I)VIc54M4ELEiH"hpT0vh")mR㔸γٮdb 1LA3@aJ"SB˃$1GI:Tr7vO;$lϻN8_dv;4G_ c@b_פ H6n$cb"M=O'8_c^/D_tyGWqQwl `eߩFoəoӞd}A1ȉnVWS W~zv y/ _-| b ",w͆]~Z,N&;UUv6& 7ǟsngV&g !'?<$>!jtww|_wAK{Iñ߾.> L9mj0_vG K, i ;"hWO0;+nm/~JVwy'3߉۳mVoc P)&aa!t'O\ 7d-[{Jo,. +QNz{=02yͩU Z"Y}TBC]$6tS,Tg$, ?=7=]IsN@e;u ;2 ,"kW|)UiM78Cl't]|RG8",'Ư9$"P"$hW(ùeo!5 XQu֗ptF/g,P2iTs>QAZ {`~qH&l,D祖Eaصxa$5=!831!M~!D諮LLM~mZ pZ"xm,t/ii)*Hd 1qnw*B0Wp‹m[cX򡆓~hh ~d%1},8n#e^+:Gѐ21޾Cvׄ8}*~86jB$(Cq[\?_'eͅ6vnst7ч=!e5ª,%j7RI"{^:nsF)>4S#bж-رtd>n+ktuJ5P}[f#EG1qv**BٴUf *ilQaVuUn H8go;+HEE)c7z+2׏`A%FI+x~X"PrH}*k"H)2b e__8G_ex"eg52RڶdאHG%*Yg4@gYlZJF^B"V|c8"}3g 1wt`uREAV:x qrpG#@ί0}ycvXNr%Żheϲ9/ h^I{dU\>$%X<_tf_]tOna]v?ڢܶh/s_kR?YӉU! T^ YQIc`c9r|*ß_!Ry*Tg(g3y)0H0w&Ǔ?őO@vVjUks3 COpbWdW!=8tT:Sg74GCJ*c$H & fy?J#߮SQA%l}^oC|lyYX@yD!@AP֨>!|O}bZ:ZVSӋ*kSlM6A XFglkڻMw@h?PzÜU/_sI|v=+5KeM֩œimɭa!.<vA|T)V=U><ǛO1!a_76SrNO=0TY$Z)|] k\%:$]-u!sԑx$4U8Ľf9:8{v}#[sr4i7?+jy"֟^u;Q\5 (tdۇd#L.֨@kSb<\˕(7f2`B@q{D1dUЇP 6ѱ3pO:i3kfItO\D⹦;Y4vD׍)CmNR5a,W`H( $lrFi IǡQ%W~A^玵. 8;sċzN)̣<7O&@hT%Bi'_='#0!%ttY[~wx9|#1uiǩa 9MM32F^gܪ;@,qVFlD:CNwDg7S{"oqOF ')!njf3` :r5c*ZH[s&(PB"V!Yw|^$i+,0KgJxJ6ʩ0NCÏ\,0-QT 9*QQKk`2l@]LECo[~[]`9;=߭,/Fm%Ȃ-O 's9bKZJr×Z?S~瀬2uf)% @m繩0~ N5кOFq; _'\sS\5=@dA@ n˃ 8>' UQ@ ^՝K=W Y 'Vu瓨3{0fp L3&~ z GgPoיyp4!v2o'< [ Fy"j5H_`yMۅs7)#4-˄=2MQlݗ|o1t\LahCwk gq~d @"ADi+6{Tmt_aU@(jN; z7n}p۔WIfxks Ewr!J.g_Hp6 sŶU'=/jy,s͍( Cа\b- RIneۙ>`6tN !_b/'B6('u|TG\맫=W޻ ezWgtOH& E_ZL"!3![ZR)b!d %T|# c^rs4D!su[ApD&7G͝7T- t@%)7fy3 tvB[e kyQ}b0if@N?d%Pq?Ԯ 4#QvgmX)pW9:&~gQ1$-34E q6 @t!\с}Wǧl cPnzf|mV KYI/&=ƜYodbV#lAL>LzEAVoroU `"ǢZ?Ne$<xBL\Kׅ, Cp(ZFNp.$X.t0%?BGp;oC\BΠtH1 5OEHX Ao/MC`W )00C-ZӲѫAMf7deR[@Z[Frݰ[Kp_-ȥmȀ󆨓٠ a5"}AaA[kjd(1:PITQDTQDTQHQE QE QEUPPR5M5E5M5EQE-LUUDE*v\is3'W"f;mXHtkGY{JHR'ֈ @ӣﭛ!$hUyQ̑$NC0W a=aLňy/d/)h+fi0}gsA02{M zGj 顙<=!on &x[6[棟)nQ@a6HPR U"3 %@TEUUM P#0DH % APP M5{JF &I"I Z&"b"V~ ,Z&ih )"CQPQ!@R!@RTHJDQ14PDDO6nۏmN 8o51WDaףj탂I҄)PRJٲtmȱn3aj`L<ù΄cv @kQ on$_xf FP_,pACyI-0wnr+gzoŃ P kڐ+0k" W"e:d gyu.Pʌk>zJr$˳n"Зd.y-W~̎Fc u֙_x#Ð5p,zȁڸ0@e4 XJBxyP-8RDDkE/O6 hI8![,}X9w'kopƧC8LkT>"p`O&H}ޝDbn4T~)nڐRr6A6}zdM.ú2$%3.CwA +Ǎu1&_Gf~܂Cvsӯ[|!>({/ x>ycy;m!V*'܏$'! /7.|^yByY!pi:]w#)(Dml@-!NL3E. ZtC8A",Wd3 .xt$=M^N6\ [1OvZ 𵎋۳3]֮dH,_M ^ժ!Cθul/"O** D RDIBG-Ҕ(Pr&A24!MshPJN0^!J!M?$i*A¨fUUUEERD U҄EU&uI }Ԧ,MMP-PЎU(1 2H|g0@BE3Z]Cr7>ݞ@|fbJ  "U=v+y22Bܽ$54>6[ӗa$/!u#@gUG` Ϧ7OtT4Km'=< s;'/vg,y.I&9'H H*N/35ZAgs\b-Cڗ^WF5hؚpP5D&ˆnZ0'&+rMqHeCiSom% r߈e:*|H>kBpmUc{Tpq{|yϿgDD@xF+IÜ^L.ˆxL{j0`ߟ!M@QnlOֱElr6z5NzptX  `Hd=f(&c [\ A1 6ΔJ6. C[{")*@G_}3%zL}Z~𢍼r8w=B(Yk\Z&W8}kcjr\5J-BeIBVW_НaRd?9d/'MG"dXЂ''[VwBTKR2(*:.>;VTaC7Yo-$Odqƭu4ck`5n p0:^sOz_uE(EZհQ+wSԗt/Vg Ͽx҈'QQUqT:}s/k$HAI =DVp3\zSN@H } K/B=jfwDhֽI{ڍtg&J?Q=/r*_AfE@(UŎn cD!%ghI!Nqb@'N6$ VgX1$Xf|7Cꈅ K jJıأ+0K]P Jo͉A H2#ynewW~Ǭauˣ/0!tV(*?k=:}5g$.5[?o^Uo6 ڗ0[ـTjc+!2c@s{wo.<Js40sQWnh;G?}?I~۝z~/|5mP ^$ !k4P2E2֔]g=sb"!ۈ"7Pf[4M~UґTB vmc #at'<&6m۟  JR>{ZJd)N2RPMua֥Qw ^Y׻Xyu_zڞEOx5_"67,x{2g}*CB0)yO`[ !zـQ>IN<.L&WR_͐QtCpX^i裃FQ{z(qxA\GS* (.&[x8b`s!&hR,t'Db~?d y/#0@s>W=ٻaF%f OE7=7.UWT#Xn"P %}QX{jeǧxWYЈBωȧB%M?_?Vddl#8[sUօٍCL;@>nZEoZ%$JE U_.\LNdZup6p#izv mk&+g@p^T(=x;Fwo>p\8M~@d4)jƾ큓T@=yռq%84mwq$I0x,w˝3$@A"IPH6^,x ]ag.btֆ6m.mX:bO{)bSP>fpA":5gkto=1)C 4"@p7A~iql_$ G=ZOpY