|
什么是传染病动力学?numpy和matplotlib用python实现传染病模型SI模型SIS模型SIR模型SEIR模型 什么是传染病动力学?最近,在报道疫情的众多新闻中,相信大家也看到过一些来预测新型冠状病毒会导致感染肺炎的人数。你一定好奇,这个人数要怎么预测呢?预测人数又有什么用呢? 事实上,从学科方向来说,这类研究属于传染病动力学,就是用数学模型去描述传染病在人群中传播的规律,从而预测患病人数,进而指导政府制定措施和政策去控制传染病的传播。
2 B# x6 _) _+ `0 B% G8 s3 u这类研究最早可追溯到18世纪Daniel Bernoulli对天花的研究,而我们今天所要介绍的SIR模型是1927年Kermack与McKendrick在为了研究伦敦黑死病而提出的,是传染病动力学中最基础的模型。 介绍了传染病模型的背景信息,不知道现在你对传染病模型更有兴趣,还是执着地对python更有兴趣呢?不论哪种,这篇文章会满足你所有的好奇心。 numpy和matplotlib首先,安装一下这节课我们需要使用的两个python包,numpy和matplotlib。
: ]" f% U0 U" i7 ]! [9 p5 }9 H* Ynumpy-是python进行科学和矩阵运算最常用的包。 用numpy建立一维数组,存储和计算每天传染病人数的数据。
4 A- u S: H& z3 |8 ?) R$ q/ Z+ ximport numpy as np import matplotlib.pyplot as plt 用matplotlib绘制传染病人数随天数变化的曲线,给出模型预测人数变化的直观认识。 好啦,下面开始用python实现传染病模型吧。 用python实现传染病模型为了让大家能够更好地理解,我们先不直接说SIR模型,我们从最简单的开始。 SI模型首先想象这样一个场景,一个城市有 个人,假设没有人出生和死亡,忽然有一天有 个人感染了病毒成为了患者,如果每天每个患者能够有效传染 个人,那么第二天患病人数是多少呢?最简单的答案是: ,也就是说每天都会新增 个患者。那这样以来,在无限远的将来会有无穷多的人被感染,显然这是不合理的,那错在哪里?仔细思考,你一定发现了,已经患病的人就不能再被传染了,所以我们有必要把人群分为两类,易感者(S-susceptiable)和感染者(I-infective)(你猜的没错,这就是SIR中S和I的含义,R的含义之后介绍再讲)。为了之后方便计算我们记易感者和感染者在人群中的比例为 ,那么 。我们重新考虑上面的问题,顺便来个示意图: Image Name这样的话,每天新增的患者数为 ,也就是总传染人数乘以易感者所占的人群比例。
& V% s9 N; [" o- T那么每天的感染者比例的增加量就是 。我们假设城市有一千万(N=10的7次方)人,每个患者每天接触感染每天0.8人(lamda=0.8),初始感染人数为45人(i0 = 45/N),我们来模拟70天(T=70)的情况。 # population# `9 F7 z- f/ g. n9 V" u1 |' _( M
N = 1e7
; |1 L4 e) v5 ^ c# simuation Time / Day
6 h7 ^% @ B% V9 c6 W+ yT = 70
" b( i3 O( ~# `" A4 w# susceptiable ratio1 N b: L0 f, e# h8 {( E
s = np.zeros([T])5 m- l1 \: P4 K
# infective ratio5 A& k3 }1 Z: f3 K& D$ O$ O
i = np.zeros([T]): G* Z$ I5 L. a3 ]
# contact rate
+ d! l: q+ R' Zlamda = 0.8% z$ k9 q8 G7 i
, H$ }/ }0 ^' v( D4 X: m, V7 Q# initial infective people' x0 [' }5 K; B7 B* j7 b. l. n
i[0] = 45.0 / N
' h t0 k! L, ]4 l" ?) I% m
7 l0 y, D3 n7 o) I7 zfor t in range(T-1):; u% r$ M& j. r8 d% H
i[t + 1] = i[t] + i[t] * lamda * (1.0 - i[t])
1 G9 R6 O& m0 b! |) z# t( a
- F% B x, e& E- C
' x- R5 K! E/ d7 X3 p6 C
8 V3 Q! c. E/ h8 B1 i% b$ k相信其他语句大家都明白,新知识是这两行:- v) `0 a ?% r- |7 H9 P3 s! G) t
% V/ A" [1 l* n
9 l7 s+ k9 {" j i s+ _( ks = np.zeros([T])
. Z( E( M+ j* n/ wi = np.zeros([T])" t8 j6 T! }$ G% |, T! M/ H
; v6 h+ h$ F1 ^4 W+ n6 _8 X; S* z+ c
这两句话的意思是一样的,就是利用numpy(已被我们重新命名为np)的函数(zeros())来建立一个所有元素都是零的数组,而给的参数决定了这个数组的维度。比如:( X4 |3 z* N; i" q- U! z# I
1 z3 N& y f9 ?" E
a = np.zeros([2,3])
2 A' }5 Q L3 ^( Z) Ba
/ j9 \( V" T* f" m. W: w) E" k% k9 h6 c
array([[0., 0., 0.],; J9 z& G9 _5 w8 z# u D
[0., 0., 0.]])
* z! }, Y7 r7 G0 E
0 z. M4 X/ a8 y2 r; z$ N3 f& ?& O9 j0 T5 m3 Y, L
array([0., 0., 0., 0., 0.])
# C% j$ o& m- d0 J( ~4 d* u2 E3 a6 B! X
4 |( p6 x% n# E8 H! R
类似的还有产生元素全部是1的数组的函数np.ones():) g) [1 ~6 ^+ z; c Z, m% I! w! w. @4 m+ M
1 ^& ]6 G) V0 z# @
a = np.ones([5])
, U* s" D0 Z0 z% Pa" o4 D8 D4 G4 ~8 F6 o q i7 P
7 @1 N' c, C' @' X& Iarray([1., 1., 1., 1., 1.])+ r' [7 K2 \: B
8 h( {6 Q! r E
& v+ R! b0 m3 V. s% r7 L) Z2 Ra = np.ones([2,3])
8 r3 X8 h, }% Qa
& i+ ]1 Y% d! V& a; | J$ E+ B4 O
1 r3 e @, e; J6 ]" ?; m `array([[1., 1., 1.],
% H' y) A0 _: G; q; _+ q) G; v: P [1., 1., 1.]])
7 o+ g' d+ S* [/ @. B- m0 U* v C5 B) p4 \. K
+ l! O; @$ o+ p: ]# j/ n5 Q' Mplt.plot(i)
/ p' ?4 Y. L2 `: ]+ B! Y$ l# E0 y2 f. ~# G# G, {* R, R
7 G4 Z) m4 B, n; n* u
[<matplotlib.lines.Line2D at 0x7f0c2768d6d8>]) p* w4 }& ?* ? [( a; W! f0 `2 P
/ A7 u7 K5 Q8 _& D9 `( m* m- K. f4 I0 l O9 D
![]()
& M1 Y; ~7 Z6 ?" G$ n/ U9 _; @& e6 Z9 e3 i
% `# q2 t3 [* t j0 m/ k
实现SI模型的核心代码是第三个cell的第11,12行:
5 U* \+ w! d4 E5 [7 w: w1 _
9 S6 j7 U0 c6 n( l& }for t in range(T-1):4 ` y5 g4 y. G3 y! u( R4 g
i[t + 1] = i[t] + i[t] * lamda * (1.0 - i[t])
$ ]( X% z$ J6 n7 d# P+ W
" l6 U# z+ }. X8 M: h! a' A& k就是我们建立的数学模型,利用python的for循环语句累加迭代的方式把每天的增加量叠加到感染者比例上。 运行代码完成计算,我们利用matplotlib的pyplot来画出感染者的随天数的变化曲线: ( |( M5 M+ d/ J9 X l/ {! P
fig, ax = plt.subplots(figsize=(8,4))
: K3 F5 ?1 b0 k, p9 p5 f% cax.plot(i, c='r', lw=2)
6 Y9 L) }# ~1 c% [ax.set_xlabel('Day',fontsize=20)
3 F$ |$ j) N8 eax.set_ylabel('Infective Ratio', fontsize=20)
4 L n4 l% B* \( oax.grid(1)
9 C& R: Q: }# u6 ~plt.xticks(fontsize=20)) H! p, q& b2 G. }, J P- m+ r* q
plt.yticks(fontsize=20);* n# [* D5 u- m6 D2 v6 |5 |. \
Y% _ @* u6 D, A5 q
! D1 {% j( P; k![]()
; z9 S1 Z( x: U7 p: z! G. V& \4 W! q1 V7 p; H
从这个结果看到,大约在25天左右,全部人群都会变成感染者,感染率 。" j; N4 {, E+ b$ J# _2 Z
在程序中我们假设每天每个患者传染0.8个人,你可以改变lamda的值,观察全部人群感染的天数的变化。( b" f; R9 F1 \' V0 c
认真思考你会知道,lamda的现实意义就是该城市的卫生水平,衡量的是消毒,隔离这些措施执行得怎么样。回到传染病模型,按照SI模型计算的结果,我们全人类都会患病,这好可怕!原因是我们忽略了一个很重要的因素,那就是我们有奋斗在一线的医护人员,我们会被治愈!所以SI模型只适合研究具有高传染风险又不能被治愈的病(比如HIV)。 但是对于其他病,我们是可以靠医疗和自身免疫系统康复的,那么紧接着的一个问题就是,被治愈后还会再被传染上嘛?根据这个问题的回答不同,我们有了两个不同的模型,SIR 和 SIS。现在可以揭晓,SIR的R的含义了,就是移出者(Removed),现实含义就是指被治愈后不会再被感染的人。而SIS表示治愈后仍然还是易感者。下面我们用python来分别实现这两个模型。 SIS模型为了实现这个模型,我们需要引入新的一个参数,治愈率 。好啦,先上我们的新示意图: Image Name和SI模型做比较,区别就是计算感染者的增加数时要减去被治愈的人数。
+ g9 p! z ~% v" f" v; v所以这时候每天的增加的感染者为: ,
# V0 j* ]) ^; g8 w. a增加的感染率为: 。( |5 R5 o3 h; R8 R' A
模型完成啦,修改python代码:
7 R. z( L. {% |& z. y# susceptiable ratio( U5 P! N y% W% r$ X1 i
s = np.zeros([T])3 F- M- f1 D6 R6 Y
# infective ratio
! g$ `- o! c3 \2 ~i = np.zeros([T])* b6 z% A7 o) |" X
- x Y; x Q% ?, t% z3 |- }7 c# contact rate
& f( } E7 }/ q( J( Olamda = 1.0
' G7 R4 H8 |( O7 q5 v2 Z# recover rate
6 p- R0 @7 q+ }6 U3 Lgamma = 0.5 6 ~" S* c6 I( K9 V& w4 U. i: z
: i+ j' {7 G6 [; X5 S6 g# initial infective people
/ [6 \2 E3 d9 ]: I8 z Mi[0] = 45.0 / N7 s2 X6 h4 n- j8 L' x @% r9 O
* o1 I$ D. J" s0 w; Z9 rfor t in range(T-1):" P3 c9 A- ]7 K+ N0 Q9 t
i[t + 1] = i[t] + i[t] * lamda * (1.0 - i[t]) - gamma*i[t]
/ }' y5 p, F: T8 U7 \; }2 Z0 \. U1 ?& h
+ r }+ G' W% b" [
$ w8 |) f1 Q; H" Y j: o0 }运行代码,我们画出曲线(代码和SI模型的画图完全一样):# f0 U g# R( G5 E) ^7 `$ N
9 l, p% i# z. ^6 ]0 c+ j/ M& Tfig, ax = plt.subplots(figsize=(8,4))
0 B3 m" M/ @# l- Max.plot(i, c='r', lw=2)" r- E8 S# H2 |6 y$ Y& Y9 `
ax.set_xlabel('Day',fontsize=20)# W3 f$ s0 d3 L- |; c2 j3 P% [: a
ax.set_ylabel('Infective Ratio', fontsize=20)5 Y! I5 |' }0 B2 v5 V" S$ @; f9 b
ax.grid(1)
5 H6 Q7 z5 c) Z$ V' _plt.xticks(fontsize=20)+ h2 \1 Q8 h( |. B
plt.yticks(fontsize=20);
" K: i* T! A6 l( Q
- S2 Z# t) S& E ) g5 a( d3 F* V$ m @% F+ @0 V
5 ? r# o+ {& y( a5 g
s( l% H9 G% L行代码,我们画出曲线(代码和SI模型的画图完全一样); ^% w; A) |7 W: V7 K2 r. J5 Z$ Y
可以看到,达到最大感染率的时间退后10天左右,最后感染和治愈达到动态平衡,人群中有始终有一半的人感染着。所以,SIS模型适合研究具有传染性和反复性的流行病,比如常见流感。同样的,感兴趣的话,改变lamda和gamma的值,观察曲线的变化。和lamda不同的是,gamma的现实意义就是对这种疾病的治疗水平。 SIR模型加入了移出者,被治愈的病人不会再被传染,先上我们的新示意图: Image NameSIR 模型- w1 S7 r4 Y0 Y" \4 e
注意到这里,人群被分成了三类,不再只有I和S,所以相比于之前的模型,我们需要找到新的约束关系。现在我们需要分别计算三种人每天的增加量了: $ d2 o9 d; R7 l( I
- 易感者:每天都在被传染,所以一直在减少,减少量为被传染的人数:
- 感染者:增加了被感染的人,减少了治愈的人:
- 移出者:增加了治愈的人: ; Z$ A7 h: L& R6 S
建模完成,修改python代码,并且假设人群普遍易感,新型疾病,初始没有移出者。 - \# V9 w: Z8 f; l
# population
( s' V$ E" e' z) zN = 1e7 + 10 + 5
; d5 [5 P- [; Z o& x* d# simuation Time / Day
9 w7 j# C8 m( L7 i+ xT = 170+ R$ E! A; q: i, e( P d
# susceptiable ratio
) k0 X2 V1 K3 t+ @6 ps = np.zeros([T])% f2 D& n a8 C9 [
# infective ratio
5 b8 ~! n! p) b1 Oi = np.zeros([T])4 e; b, y: F8 \1 F& ?6 Z$ i
# remove ratio
( K: w1 E3 I6 R/ Xr = np.zeros([T])
5 ]" I' ]: o. a( d8 T# r# T: z- ]- |- ` _
# contact rate
4 a! I$ D% Z7 J+ v+ J" ?/ Wlamda = 0.2586# j, d( H( }1 ~+ I
# recover rate X) s9 S7 L+ t8 U1 I
gamma = 0.08214 j4 ~+ o' \' u& h+ k
, k% u5 g2 ~/ _' M! u& ^
# initial infective people" g$ [, S0 `! ?/ [2 f9 m5 s
i[0] = 10.0 / N
, C- _# g% H$ `5 S% ys[0] = 1e7 / N8 d, H J8 ~/ u+ R% ?
for t in range(T-1):: ?; i' N1 F/ d" S5 D( C. I# {
i[t + 1] = i[t] + i[t] * lamda * s[t] - gamma*i[t]
: I$ C/ L" h7 `' p7 E# Y; R- J s[t + 1] = s[t] - lamda * s[t] * i[t]
& h! L, }5 K1 N" n r[t + 1] = r[t] + gamma*i[t]5 K2 J7 \+ @& ?
0 O; S( r8 T& C
fig, ax = plt.subplots(figsize=(10,6))( Z B) p; t8 C) m3 }2 ^
ax.plot(s, c='b', lw=2, label='S')
n( i) Z7 L( f- J0 e; pax.plot(i, c='r', lw=2, label='I')
! Q* n6 K, x. {8 Pax.plot(r, c='g', lw=2, label='R'): I/ r8 v E3 R6 c) v
ax.set_xlabel('Day',fontsize=20)
( b) G# e4 M0 W# x4 q" J. rax.set_ylabel('Infective Ratio', fontsize=20)! X# s8 g% J% O2 z2 b
ax.grid(1) m+ y! g. N2 y8 w0 ?) M
plt.xticks(fontsize=20)0 s+ r. `1 n6 d6 j) j7 _% W; X
plt.yticks(fontsize=20)
1 s$ M) d2 z) `% d% S% _plt.legend();
/ U1 ]3 A+ Y# i: w( p4 v
, a' @/ h/ C/ Y4 I) @) ^" z5 Y3 g4 L7 j) m2 ~0 l' H4 H: F& _
* n4 `) o; t5 N0 p" q/ p3 K
2 d/ R3 _& \, u. S$ ?
感染人数峰值发生在一个月左右,最大感染人数不到人群的20%, 但是最终人群的80%都会得此病(就是最终的移出者的比例)。SIR模型适合研究没有潜伏期的急性传染病,治疗后能够痊愈并具有抗病性。 到这里,虽然不准确,我们也可以先用SIR模型来分析一下此次疫情,武汉新型冠状病毒的传染病动力学! 模型有了,其实就是确定参数的问题。一开始就有人做了这个工作: Image Name于教授给的参数是参考了非典的, ,初始易感人数为一千万, 初始感染10人,初始移出者5人,那么我们的城市总人数 , 带入我们的模型得到结果:重现于教授的模型
- U1 [! n+ `; T) |) [% L+ z. d高峰和尾声日期的推测基本相符。 3 k; m {1 r8 r7 X6 P' V( B% K
# susceptiable ratio7 Q. \& f s V3 x
s = np.zeros([T])
9 x/ M- T: W1 E! g- |# infective ratio
1 R" R0 s9 h8 a. Ki = np.zeros([T])$ C- h/ ?+ a" ? G0 z% L, X
# removed ratio8 L6 s4 F6 a9 [ F! d7 w& v
r = np.zeros([T])
" f/ N; @3 { C, X2 }/ d) U" u$ O+ `& f: @
# birth ratio
+ X# {% ?- y# f: Gb = 20.0 / N1 C! ]- T n# ]
# death ratio
9 g, v6 f# @, o U) m2 ]% h; Md = 10.0 / N, b3 _6 a5 p' k; z+ A% M
& c! o* x5 G, T, z
# contact rate
4 S$ _3 p) i7 W2 l9 F) Hy = 1.5+ B) w# v4 L8 e# k
# recover rate
- z* O! L$ v7 o' m' `7 s5 ku = 0.8 # 1 / infective_period
6 ]4 O* y3 m1 l4 g' P. @0 n% l- @/ X. n' z& @, L8 n% Z% u P
# sigma = y / u z7 S3 Q+ d r+ s4 T: e# t
" L+ k3 q; d; _" F
# initial infective people, D( [! o4 q6 h: b& x: f* D$ L' K
i[0] = 45.0 / N
" z9 a+ u+ a1 P0 [% us[0] = 1 - i[0]$ [% e5 [& I& }# ]9 _
for t in range(T-1):
) D7 V3 ~" D* s) s i[t+1] = i[t] + i[t] * y * s[t] - u*i[t] - d*i[t]
$ K, ]; W9 j8 f, ^# { s[t+1] = s[t] - y * s[t] * i[t] + b - d*s[t]
% Q! m( b3 y2 H8 x r[t+1] = r[t] + u*i[t] - d*r[t]) `: V9 z( {. J: E* s6 \3 o" }$ D
" C% l: c5 v' f( E
plt.plot(i)3 a! U9 B6 P5 f: S3 M
plt.plot(s)) O* g4 {& e8 R* ^% l
plt.plot(r)
: G k4 P, `3 Z; Xplt.plot(np.diff(i),ls='--')
i4 L( z, e0 Z0 \( Q0 J ]! u
1 D. M. v5 t! o% \
+ j5 ]& K- ^, P1 d" M8 j[<matplotlib.lines.Line2D at 0x7f77796e8518>]
) B1 \3 M- I; t/ r& d% N/ k d3 N8 C( v/ Z5 u
![]()
, L/ a( F+ a+ D$ e- \1 V
: V: N* x/ X% U! YSEIR模型但是,SIR模型和实际情况的出入会比较大,因为忽略了太多因素了,比如说潜伏期,比如说政策调控,药物,出生死亡等等。下面我们可以和前面一样,把潜伏期考虑进去,新增一个人群,叫潜伏者E(exposed): Image NameSEIR模型+ V7 u0 [. Z: \: x4 k5 X) t
同样的我们需要计算各人群每天的增加量: S:每天减少: 0 `1 f, W8 E: v+ x% q! I0 B7 \$ ^
E:每天增加传染,减少发病:
$ O$ a& Z# |6 I6 H. g2 ?" oI:每天增加发病,减少治愈:
5 N4 `5 r& ?2 K& T8 uR:每天增加治愈:
) y0 Q* u5 l! ~2 x建模完成,修改我们的python程序,这里的 可以理解为潜伏期的倒数。给的4天。新型冠状病毒给目前临床的潜伏期是3-14天。
* o2 x! d2 }1 Z* P' A( H# population
- ?$ O2 k! ~ P% X' \ kN = 1e7 + 10 + 5
Z! r. s1 d9 \# simuation Time / Day' D. ]. H# A$ |" L' l$ ?* a2 a* C
T = 170! l! L: h7 V: Q" y6 S- Y8 I5 e
# susceptiable ratio
3 E3 q8 Z# G# c M9 p5 v$ f8 }s = np.zeros([T])5 y+ u3 Z1 e8 r- x# E1 E6 }
# exposed ratio
) o3 H- {" {0 g3 E% |! c0 we = np.zeros([T])' U/ n3 |! M* n* e/ j& e
# infective ratio
! f9 S4 ]( p. s! ~/ S: `5 ji = np.zeros([T])
, m, Y/ w7 e/ `# remove ratio
# x: k( u; k4 u& F" kr = np.zeros([T])4 e6 t, @/ @- L8 b
: o# ]& k, V% Z& ^/ V0 ]# contact rate
x, D. Z: d2 X* a: N7 t- Z9 U+ N+ ~) llamda = 0.5
% b7 u1 n9 s4 R% N \# recover rate5 c* t# s' i% q
gamma = 0.08218 o6 Z0 s( i: l/ Z3 o
# exposed period
* U) l1 V* \" p) N9 i5 lsigma = 1 / 44 ?% N: q/ n/ T8 e
9 B& Z! F* S' ` `# initial infective people
1 B3 o. t6 t6 T# ~! V4 Q, A6 w+ Ti[0] = 10.0 / N: `( \& u* j/ U5 w
s[0] = 1e7 / N
- |7 i1 ?& i4 [1 U3 y- Le[0] = 40.0 / N
" k, l& Y# e3 X3 E' ]. z/ {for t in range(T-1):2 p( r/ d% j7 t# }- }5 y" T0 O
s[t + 1] = s[t] - lamda * s[t] * i[t]
4 ?( [- T# c4 Q- L$ Q e[t + 1] = e[t] + lamda * s[t] * i[t] - sigma * e[t]: ^8 U8 A0 ^+ d
i[t + 1] = i[t] + sigma * e[t] - gamma * i[t]
1 |, p) V7 s' G- u+ T2 J r[t + 1] = r[t] + gamma * i[t]
, n2 O! Q( i' }
4 k2 p) E7 Q! v8 P# B5 H" p
4 f/ p) O! N0 o6 U% Z0 n2 afig, ax = plt.subplots(figsize=(10,6))' ^0 c7 Q1 v% e. a- K4 k0 } T! k
ax.plot(s, c='b', lw=2, label='S')
: `& V ~) c: z# Eax.plot(e, c='orange', lw=2, label='E')2 b6 `/ g3 D# s {
ax.plot(i, c='r', lw=2, label='I')
! Z4 R0 B2 U* I% w3 sax.plot(r, c='g', lw=2, label='R'); @* N9 z/ [" B* h. I
ax.set_xlabel('Day',fontsize=20)
( q5 a2 l7 d) nax.set_ylabel('Infective Ratio', fontsize=20)3 `- v9 @0 {9 y' O! k" I5 g
ax.grid(1)( |, @6 s& _+ o4 J
plt.xticks(fontsize=20)1 }; }! r6 `" N" g+ |
plt.yticks(fontsize=20)
( f) ]3 y- `2 R1 |0 c& bplt.legend();$ h9 \7 T( O8 G4 B+ B. w
$ ^+ f* P0 J) C: r' J$ t' t4 z* x/ _3 e3 g6 _; B/ O
V$ l8 k! Z' @7 W0 x) h, {& u
0 ]3 N! P0 P7 v, o
按照模型的结果,此次疫情可能真的要持续到 三四月份。这个接触率 真的非常影响表现,模型给的是个常数,但是由于政府措施的原因,这应该是个变化的值。3 { a9 g! a+ z" b& ~. s8 @" Z
还有治愈率 也是。没有完美的模型,但是随着考虑因素的增多,就会越来越接近实际情况,从而指导政府的疫情方针政策的制定。6 S6 P/ A/ b) C2 k/ [6 |
. ?2 z& J( R4 q# Q9 @0 V) L' U
1 C% V. ]3 J) H0 i1 O$ l) ?" D; d& W* B7 [
: ]: Q) u5 ?. V
|