`%dE)%QkB(&NG9Pw*8NZ_Hf5!oimU;8yp7H=!PMkroe_wW>|D0$0
zvAz{U*a_vs2Kpw%r$qG!{Ga&Jz`oMKQStskfpKxs{nPFj9^l^xU}bapJXQZU$Y+Z*
z=A2A+&RktA{DTKWFVeNeel=HT^|w4fpr7whPVwgWhZEvm9?j{G3wcn#Dg)yKBZAVo
zeR*#Lz%d=#o3*LnXFsmTG1L`&u)+zxI-F@0D)v?{faU-%D|lbTB|HH776drYqfCMW
z6JnCm;eY$$F>c5sV)_tT+PfsuXZ8u%binz{nMPMAkY;(Vj}OpKdw1x1>%d^d*j
zLZbSFNXG_6$A$NG!Gc4|w0s7G59f$dtp{IiBwuY5s|A+qms;MOxGm3f<#~euKXY(<
zo;QZ)B?CT@z~!8v3gE-p6jyM>DZuZPa957N=JVS$+=C-V&-dfo8v}`Si65(+Z^v$*
zZ>k4hz2Hh*#onJkYyhsty#-nDPfPX-@gQmMu`uq7`{_=)*-N8_4(;Ox;UNNp9y}Nz
zGkWk)fXw7>0~Rf?N{Ygh1O^-MXgmgw#pCdJJONL{#{y(FK*|6z2Ox6+QVx&`fXoAk
zW&@rqut1b}Dn1^cfTsy80HW1W@Ztmk0GSVv1pry7rJ(Fx|1K~Vjx5AW;Q2OQgipue
z-Ns^oECER6YP=MmfzJfUQh=-j$a>amQDIy;=CKy9z~|u_T#G|lRRF06$Vz~;00c(E
zzWWV)AzsNzT!b&ip{#0v)Bt4JYJ4ePg+pRFKxzR}$K9b=vr$#%tm)zoHY%Q@`t&}5!;8Olu-~Wf)A$nn
z41Sh3SQkLLq0Io&1CUkg@TJ&x`~rRv-V<6z1kktTL%ik45bA}uaUrzbL+l`rd
zY1ESH98G%<9Bq*WUs<+3$oHB(os&M
zoD?3cRrN662bf2XfYGA-Q9Ha>z#qf0hwpf%3Fim`@u%<^Pa%BFGYlYbje_Ie|MCX^
zk-v3AHnYyPCkFkD!|V7B_%Hac_$&N3{CE5{{s;bsy;5&741bINh5wEJBVh1X0t?PZ
zp^f(dWG_Hj*etSrmtS3=P&0V$T!p(ke@*CM3IBA47x13&{=I^~?I0LI*D5IZ6+m{t
zD*e|kgds5$HcS{11BpR|F)^4hAxw!O0NDqS{Qx-tkb?j@1dzi3IRcQQ8wfLj1z|y0
z62pk$@TzeqK#su)f{p-Y=tzJ%0JM_3c7!)E6QG>~C*_qE7W)=wXR>CS*J$8Dq;E+{
zUP)uOg&0M+5^jV$;X!x;03GBf3a4Y0%tpFgO1LXbhB{v#&&6GAl0!-r~W?Nt6+D*or0#bQLj|o!exk(Fv;{<`FO&T?5EWF$a
zvw09yXa$?zY>qY%D_L!`Biab#y0+Qg=L6dk&Ct3Nu%m($>?lC)a`wN+NrF>|=z!OQ
zL_8c2t+TGHJ;W;RaploE6Lw^$SdUoE%|acW&}pbgtR>c^ORTtZ1D#7Hz}IA}i1i$d
zXIs5v_j%h!Vl%vpCN=@&VGpqdAdlFcdlaF>4g$uu9s+vyH$B8IfIQYJ5+XD63i_(;
zB@PMF1*FgT&R`PXq@4`(}aoo`7!_2q^VefV|??G?+cfU~q%)3s(8O{pkCG
z_ucwu;uoD;1LSXjyzcjD-3Yzroca&q4e_Ujcngp}0P+SPe*)y~f4sWiiTgb3L-*|C
ze&~|DT$0dvAw1vse|TZQJ2y<1c;sf6MrTb4DlVKBmt9ggqj+LAH+5_aGN)ya$twuR
zD~31Qg~erK@=BtzvnK^)Pb@AgDjg$Z3kex3ZV?gWKsaLLAb<*4^Oj*=q$z0uUs{ku
z$f2YeX%0{npcp_!03EP~v?PaN+es^c>H!ocebE4gZ-A2{vU5tu=4H=fYg-1ha}JQI
zl(@Xy$vmsqg-AORzJgdo+LI2XBPj={K0tAR5&$LFaG{KJ5m@NL7fP|WTeOzs7(rKe
zzXy>j(i?gxsRk(1L;3(z%s-+a1K=YHGLQ@cs05$`-z6DjC>a4?M37-*I6$QUg?~np
zQ2;drC_I_r9#ITq|7tY}Clkr!|KL){aR7zJfG0Gvciph^Su~qp*ZcaDPG)inWdIaD
zFWCu4i~ahbnH8Bs=6>*Mft*6-bGWGh9oj=q11P)`hOa-!>73%lWC=i_frq`P_)N0w
zKMKtu=K|CMpq8BCJKBbrYsm%wfh;5!0dzP(tvJZjwjprY`EU5_)4Q5n_Rf&Y0czd*
zB$%w{G+IHj0JQymahPFYMGT!
zLH7svjU;>ov4-44ZYH;oTLJ0_Q0N~{0CiqNZYOt;JIPM~ssLyxKxY7SCYR7yviG(a
zvt3=2efN{cV1`5$h+i2m>iP#$os^6fT{qhhHK4g@;?0MF-LI!!pGOi
zF~xCQ-$(XP!2nI_p`aHg!!b9OMpDrn
z7b=$0LqWyHaoq3(YAnZ11ZZjxl?2f7y<^uq5>zTRfh!*m&HhekWCwMAV
z2$yIopPEL&3Yh@S0_eomR1r0uDhB8zfaU>oD%Yj8YpkWSsWNH~HJ2)zO1A)ds<>>P+@^C
zL8LmUPPlL3=v7ol?{7e;ZmNeJw{ECtHMNRb%_gsN)2xM3*HP;Q+o%ojXB=C{MaB0$
z%7O35;xY?zv;7Na6qF`Ies)1_DKt%yt}mOY%@E8dtMF;rDr$=$>pl7^KY-gPXhLZ9
zg1%w<1P)uwRcal4fpwJn6riQJPS_r5FDqSR1ohfS?PtYnhN16b8?Naa+C$V?f%RtU
zFm;4FN*$w)QzxjC)G6vT^%->rptArv8=z$XodZy~P?Q6-0-*B%ssX4LpkOniq|U>+
zae;yxMCuZC89t{~QrEcXH=mmp3jn&1U&j{#_;j|B<1gVt?BLK{1v_z}hI-WZ&JHH2
z)VI3lWPCnEegA&R5APE{>WID${7n4{onE(iQ?CHJw0F&+USl4ssXwSU)Sm#Y0_ZY;
z*1cPJsK04}!1RMfoEFjuK&t^-!+G-CjaC-49!-3>*w7>myR{sk@I+X~sy3Nh&{Epy
zKbV0u3{3R^g(t%@cFv}ueYU2D&?Dg1kRD2#(dM)TZAlNKhtn|KX#nU-fI{Om0kj#Q
zEdXr=Xxj#Qq`-o1gyZO5fC0Bz@t+5ym?0s0%jocNqZt4M`A!-UMNh|H|)eCX+r
zil1CKD=KqlUT!AL%_gwkD^~p9d&QK<05{zxsMn&jCk;=CHqxW%F|-%0q*b(<_NIMk
zxUO{qv{M_?HcJ2I+PBh!@0p;&uhqqNfP}6pfHv{
z0O(^D9+n!=NpuPvH#!-h8+vG%6>a2p3juT*odMap-2x3G&8Gf!fu2N9hEa&lrgP|A
zfNlop7JzPDP3K`dX_x_RM);u45Hi9(x%~;r3-zX
zzNOnCnA2a;H~Ad`TsJNO^zs_|Hhl-%PTvLS6@bF+He9uD!Z)f5TkIU@M>O}+oc@M>
zOn*y%2hghkh3U?9fPVS0J-}R(zM=bte#QCWuK@k(U9N3FzoFl9Y#2Lk_0WF-^fs4T
zYZw7cWEmj?0|gu|^Go;0A}{_jZ-`)@tI&Igb8KB7?`Sk574J@*?9)wuLjWP|Ci_Y`R|8*
z|NoP(_quv7mPylj_lx(vTcbO&ExGnF_x|88hRJ>JFb0J`s(W`B!{kGMXFQ?J`gfpA
z5d&YW_j(&s0?=RjMsp@NnzNYM0EG_vO7q@u&SmEPXQ1BSIrRfqdAYRJvZa;6rbzw^7K*8u%v4O7poU|0q&QEvc7831f3z|7v?CXwv9Eu;OI
zR;CB;m6$fBo#|jYnJ%Uqz@K8EZvhG?&))$32cZA1V^%S%xfFp}$E*jK0AM(u6ksG2
z&4zUEk~2G)Px=#OW*5NVbyB~UdzgLDNX%YD3LkLz+KuZEF5Ob@J9(~
z3jC9S7lifz!`@Ao)699;Ls)W#ISUhLu2cjt7*|pullzDHf@A9b#q`*^Z9_AeYs^=0
z|3r<4r8i(s&DYXjt;6@D;rjc2RMjmA%suA8yM8;}{0c$ni{r+U+Jv4<`#mw0e_w+)w6i^ssE8Z&*DREyRBO{&@Z
zT{arAzZmYzHj4wqf#M)>usB2^D6@b2mFG=AhAsB#(%cKAG&i8bmc^Gp152*503qO_<@Edal3efc>h
z_=@7Jdm4UOtC<8YG
zPlGWAN`pXy5Q8v-2!l+6i3ZsQIR=vrrWnjJm}5|GpfLaj3k+%uY7OcQ*eHVy2Ad4F
z7;H7zZm`qfh{17#lLns|oHaOaaLwR`!A*nP20t16Z1AhWD}&z+{xB37>KhV-bZa3U%xXW<2;a^pgb`)L7)gu_jEsy184WfvH5zJUZe(dR+-QW6wUMon
zosol)+{oF;#mLpj-N@6(%SdhHYZPDBrGY*D$6Fz7Rxrvj$z7S
zp~J$5MGlJ|c4gSTVGo8q8uoa2&hV1qGltI^UN-y>E0L9+6>ddZRa-S%wOX}Xb&jwa
z;XJ}+gzE_R5$7}`Zj87&;`WHIM@|_zYh>BTxg#sAF>9%{sr686b8AcM;nw!nj@C}r
z3hPnUZq_l@v#b|cZ?)cIea!l}_2%tsh!{WBsl56YHnezgWMr{@wZy>p!jkvN5(%
z+eFxu+EmyqwyCvgw^?hm-e#lCW}B@xdu;aE9I!cLbHwJD%{iNEHk!LO&uo6R`OW6F
z%^RDywwUbzTYX!?ma=7RWwtT4X|{`PYi-+Y*V*o}J!E^t_L%Jn+f%j|Z7={w70Yq>Pq{Wm1`;Y^cm!W+@vk8zHlnImwi=AX&U@yev(YA#NOK8$zEYU%HGZ1!`{c<&pyCD$UekA%s$>e!+whWEPJi}eEWs=
zi|s4z>+MaA(mmIG+UUU4?
z@his%j?Wxl%LQ^oj>!ke_2p8zp?sj+SZ*R8A|D}_%e~|Q@*sJLJWL)TPn0LgQ{<`g
z3G#ILWcduaMqVRdDQ}Xu$lK%{@^$hJ@=fwB@@?`R^8ND9~iMdwS-H=Q3kKXZPq
z5GW7@rWl~mS4b5`3S)(dVyMDgVWUteyc8jdSVg=dQK3mvq$si!*^0@EDT--|Ld9&w
zB1NsDU9ncNUa?WJS+P~IN3maVNO44QTyauyL2*;@Q1PSUwc?H9t>SORzb^VNqzmIB
zaWQlm=wj|->!NT`yZE{UxCFa|xkR|6xTLyFaLI7_+~uarH!k0~Jau{Q@{`LiE`N^_
zj6z2Z7=>#_QKOhqqetbAY8>_1sNY->SCOl}E9uI(N?b>{I>O(dySaM0dbx(UM!Lqh
z#=9oFrn;uNX1W%-&Uansy4`i3>tWaPu9sY|x_;?;+x4#N1J`d{AG^MA{oPIEM!A`|
z*}B=g$=wugu5KP~W87435pL0Lac+rj$!@7`X>J*Ank=^pw`R9pZeO@PbvJhRagTJ5
za*uY8bx(6och7LoaxZi*a-Z&A;;wZE?(^Ljy4Sm}aA)0Dx_7#Fxvz5H?7q+asQYR6
zFWj%VUw6OZ{>1%f_gC((-T!p|+au4T*hAy7*kh?jjYq9VqeqKJyGNHtkH-d&?H<=X
zUV8lPIlvRwcv7B>=MYa@PkT?fr^3_K)5CL&XRv3OXQXG0XT0ZF&lJy8PpxOW=Sk0}
zqs610MthDPJz6)~nI0#jD+`%WIX_TCWXWo4vMq?ezN8Yp>S<
zuftx)yiR(3=5@~Ng4ZRlt6pDv-SoQSbD@~PVN=v1c(po7~Iw+l#E=o70r_xKQR{AOfl)=g{Wu!7j8Lu3x
zOi_+krYp0Q*~-bvsmcQ7bY-b>mU51=La9|QP%c(3Rn{nLl`E7hmCedFWv8-7xkkBO
zxk;nks@$R6rQD<3uRNqYsyv}QtvsvzT=|9ait@VhE9GtFUF8GiH_GpnPnFM=KPi7v
z{-*px`BwRlN~pqAdMZLit0XEz)gYCLYN*OWHC#1PWvjAR$yExKtI9()Mx|2usQgty
zs!&ygDq0n%N>nAQQdMcHOw}Y+u1YgSHBD8dDpAc;m8r^A8r6K&B2}fTTD4qNuWC>=
zsajPXs&3V4)jHKi)fUxu)hDXms(q@1sw1l7s#B^ns`ILgs>`ZtsvD|Xs;^b|RgYBP
zs=inKp!!kuv+9-VwdzmR-)eyxRS!_(YDz6u8>k1W2djsu&DF!yBh)q;wVm2g?W`W9
zc2|#9E7jg=KXsrwL>;bIv!$^+a`!I!~RiE>st*XQ*eZ=c?zafqJ2O
ziMmR?OkJmD)s5;Fb-TJty-K}Sy+OTMy-mGS{i%Ad`hfbd`k4Bp`ZM)8^#%1M^;Pwk
z>YM62>U-*k>c?u$3-wEH1MeZ;=HBk!-rj!Rp#PP
zop>snQhAs)+
z82U-*?$BGIk3zo<(+iV?8HUNiT*BPKqQa8G#)T~is|l+OTOYO~Y?mhNeAu9}+$y+$KCaJUKiyyfnNbTpQjKzA1cb_>=IL;lDj*3i*%!r&AsfnzNtd86gxjS-S7mlW^jx;CO9T6CO4)irX;2@rYmMu%;z!JW4?+N#uBk~tV^s{tU5L)
zwlKChwjs77wmbG5Wr@u|LMXj{P&vD$XI!DQ;Zc#JHTe#c{Q9E8-4m;!ek%je8mQ
zCho8JVexkHj`8vFeORP&go%luKmBfF>>WwAFdW`iM>pwPk
zY|+?~v7KYrkKHu(%Gldu?P@=3}}nvygvX=PGpQcu#Uq>D+HlYUM5
zE9u{4%Vb%yLvl=VO7i&Rt;u_m_b0zi!BX^6LQ~>W5>pydI#Rk*Zl*j;c|6W$ob$L*
z<7STo;}(uPIPTQAGpR(XVd|jN)YM6-xv3jdKS|x4`Y82>)E~!>81FdVd3@gZV$Jv&
z+&a%wXSY?gNnwXW7#b&iqsSSPqsr0bROVFYoXxqCb3NBKSCQ+QJ1bY4yCC;K?#bNGChJd@PBxmH
zHF@gf0?p*3lh026JkK=GD$hDEFRwUnM&7Bsi+Pu)&{GCYF`1G%Wy+LkQ}$0eG3E4B
zdg`F5CQ~z}=1t9?dU)z*Q_tla<(uVO=FiO6DPpMNd?#x%=mvS|*}7EG&|Ry*z9
zv?tS^6}T687x)z{E~qV7QSh+fS;31!=fcs2%0jlVy|AlDgBDRm;-bQ$*+p}UJ}pOJ6ffI?HI*lvyRSX3jb`>)fmhvyEn(&9+n5_Ii$B4mu}kPR5*xb6V%Dp0jSwH*=oP`Dw2GT-UiCa|`CqnmcFi
zCvy+ZJu>%oxu6^^_bB%%_b)FipI^SH{8ahH^2-&&E9@)e6$KTuD&|xiuh5*YxH!*X
z-jI3b^QO(4Ij?Nqxp`OTeW{UXOf*9^@tX0Pbj=#gR?QC0A6lUn(}ro|wPUp#;Frff
z)&2wY00CmbI4}Wh06W2_;IH|j`TFzY=Z~MCK7afCee(}4&|4r`V7Q=Q!K?*y7F=F%
zYr)qGofdj7^jcWGuwh}-!lw&=(JcIJQP863MRAK(ENWZSx#-HG+l%flHe5V(vBl!C
zi_;fpE$&*pVe#h0PZqyi{Oc0iC5k1kOVXC)E}61q!;+m#K3(#r5~&vOs~wZ
zoK{&-SyWk5*;3hF*;To!a&6^?$~~1QD=$|*tbAPgr1Dwii^`XkzgGTU`DQ7xlwK-c
zs*x@=T57!1bg9`=i>1StIxO{A8nZNaY5CInr5l%?SbDR{q{_0&rbY$sPpY0(y{P)LT3C%$>s1rg(rTk><7(6D
zq1A!aCDmQk8>+WgAF4iAeYyHt^^NLV)eow_(Nup|{j~ar>Q~jjSN~Om*GOs%YX;Sr
z)L7P7)mYcaYV2!VYdmTKYGP}WYf@{{YBFmk*G#P`sF_|
z$?7yNb))Olb#Zlxby;;&>k8_M>PqU$>z33lt*fqER##iMqHbl~s=76G>*_YvPpmJh
z2lWf`@^zpH*v{l5Bx^@r<^)*r9GT>ol?+lrYh)~-0S
z;+qx!uqNzq)`qoX9a$$<$wsmM19%O%D|7mb+@M%bC$Z05RC~wd-%x_rKP}xx3u)LwZp`l@Y!={F<4ci+&Y1rMc
zui;?Bk%nUpCmJp`eAn=5CAo6YN{5xvD<`g;xpK+M_LX~9URim4<&BlMR(`$mx0U}i
ziW)W2M%PB4M!&|u#*oJF#*D_2#`%pa8+SH-+PJszK;z-YV~xKwzHP#q^qPn!x=GSx
z&}7kM*W}zZs>!`+bW?a!LQ_f8?53usHBIZAHZ^T++TZk9)48S#O_!R!ZhG4Eyy>T=
zUz+}Hrka^%X|rMT&}NrrkLJkcvCW`)ar4gR^P1+1&6k?5HeYYP+x(#Uo91tue{31t
zV%8Ge64NrXWo}DP%eI!CEuXgRZ8^|#sO53X&n>T7Ubp<&@^{O>tyrtHb#UvDR`b?j
zt+uW9t@2hyt7~gU>+IIL)|S@x)~?o`)@`kaTaUG#Z2heDTd5Yx+%dJIprfdxtfRi8y<=U+u8u<;M>|e*obEW=ai!y0$Bm9#9d|nJcD(Hz-09Vs
z&^e(qtuv!@T4zybN$1SYvd+1kwVlnK9i82st2@_q?&{pvd9d?H=gH2`I?r`p=)B$e
zqVxC8f4itIX_v;R%eZT3mqpj`u900%U7lTmT_IiJT~S@JUGZJHU8P+!x@LCG?poAU
z*;U=OysN&8?ONZpqic89zOI8^N4h@my4-cG>qgg|u6tb%yB>G_*!8*_>&CmOZgIC!
zw{f>=w^_GSw`X@)cT)Gb?g`x)-4naBy9>HYx@UHmb(eQ9)pRfKuJ3N>Zs~6C?&@CE
zy}El#_x|o9-N(C6b^m`g+4*};R|3Fs%Sh>j5PLDAG@Y2(#WI#o+O#2-33+6wR0ziQ
zL~Uc|MI@C{OQM#Rdhb0qcYp8l-h0lu=bU@54r*^L9ctfN+bBa(YMnmQXMXv9{)q2^
z=;7#*=<(>;=#A*T=!58^=#%JkE`h7VC2~nzGS`Uf$-U1_=hkwcb26uK24{0FhdIja
z;|_9Pb4R)3+zIYG?lgCod&xK8Gx!O73BR7N;CpZt`~)6?#}V)pyb!7j
z^@Jp$zK|@m7P<>Pg+B}Zgue*y2=564g~7sKh2g>^VX9Cp%n)V^bA<)MVj&_d7gh>o
z0v66!)v0>DYH-z}s*0+3)uF1Ns$PmU#9Cr)@%LgqF-7bkb{4ydJ;dH(A8~*-uMsh2;r`%s2CKpBIDe^3NfxJR4l~>8D<*2O4mJH=kJ|kb2pDW2q
zTcxAYN6AvMm0V@CGFF+U%u(hk3zZV3O!-JzuT(1A6idO%A?2jVv2hiYV&I!9fnexU~HG4-bUSWDDW
zwC-B2Hc?xwm1<>LxmKZ7YMZnjT2up?uEjJ3sjbbUWZn4bR
z%-G796WbfR7`qw!*{EYA8c9a7(b#Bav@rf)v@zNlJ&oQ*U!%W~X=EAMMvgJW$Tfx=
z6OE?C1I>JMlv!XFnnmUWbEY}pTx2damz%51
z)#h4rgSpZC(mZ9}HGeUmnJ=yCRz0hgm14EEQmr&A-Rfj@wKAU|+U>uEd*AGMrvcrjzAlJCT9TSf|*T>nv~HeYb(z(H-Vab?3PY-6ifa
zx5O=Vx4NRMxVme)ao2VCyT{yUZ$7jWqUc^5HHuu^TvAPy}x^ty{TTYH^ZCd
zm3y9d&U;E;B`rxBNhh61SCT<`k$1@eGKdT%!$=+(ONz-X@((hfEFsHC2`MENHvM&1p;8n!Zlopns$pv1}$K-lq>)4c3&s7GbSe3Tw+!SsF`comf|v!E)FTmdo;3J{!dfSRpH76WAm+
zh0SFP*kTr8D_AM3V3lkm+r+jqkts}PCi56$JK0fooSk47*k$$uyUp&hd+Z5&?zi&W
z`26d{xZMBFZ0X&HU2t(gJ0=y^0)YozstYu
zKMd*yErZTMRxmP{6O;$hKnc_!7N7tJG}s;N3HAj?gJZ$Jg7d+J;Bs&$xEDMK9tBT=
zXJM@{F-!`R!^UB=@Qtv2*dgp3W`w=MK4JfGP?#I$y&dL^xm6-iU^8|1rV`dyBiTyuz*W1!cpwK
zYwU@dn8etP-85q_i6ybVvwLF6&;R?rQS*8BneX$=GtWHp%XsN5}XnIEVwH8Rq%)4p5T$-ncyG6Yat@kuRd<0
zt`{~7TZHXGt*~3TQn*&QPPj?9S-4%eL%2t{S9m~pQ24d*8{xOY?}R@JPYTZn&k8RJ
ze->U9UK9Qz{8e~M_^0rm@V@Y|@QLu5@VW4%@Rjf#B0w-i55W-vVGuE5gcu{Hh#Ars
z>4(S>C&U?XL0l0x!79W9@l+#&kN_kQ2||LA5F``{Lz0kWBn3%DMk3ir4l)WEjpQO@
zkg>=Vq!^isOhe`&rO14w45>zzBP>#bv?E%i1L;IIA)Apc$X4V4au7L$97cXbP9i@c
zr;w}2HRL*S1G$IXM;;k(bCT)B8d1C%rRz
z=ka|CADCK=&9&m(HqfQ9K-c+eY_8Dj$7b;@qV}^ZiV;9t#KRN7PrIg
zaT)G`d*WWWH|~dr;}Liy9)(BaF?cLK7$1VC;~DrUd^DbmkHHJ^$#@Yy4WEfu;Fb7d
zd1#0Vmb7)fLkIYd5DKok;_iCM&KHBm-X5{ro{qK2p?8i^)i
zh2Rv?MsyOZh}Fb;Vl%Ow*g@5H1=K=n5!Fd`QQg!^Y8ADbT0^a+
z)=}%J4b(!A>PDjvjbPAnH52we`dGvU?n4U^c
zqi56e=!NuBx`u9|+vzTPAANv6NPkTqqrannpnsyz)0gPW^i%p7{hWS5|3m*vzocK$
zujx1RTlyU%U{FS%!5NAXGrbsd#)ffXoEdK>TFt~Tu}mBj&m=I3OcImKq%i4BCNqi|
z%}itpnaRvlW}4tPW+pS2Q8T5?d}blDh*`=kXBwDBrj1#{tYy|Q>zU2W5$0>=8|El;
zj5*GH%Y4V2XD%=onV*^K%q`|F^N{(AdCt6KUNP^)0{UMleE<
zCD<(3GAuqNDt~nDjKu8XaUFuKf}BqoI@ET-4t9&!9Nj6{#r`DrG20{9J0w0OsHiBr
zq(iVrkfTHG6YOU#C8o-Kf&+q_;qfV2=D7w!ndZ6*+6r~jk
zp6V3!(fEH<^c*TeJ}UZG@KRvk-mdZJG4YMyU5{p=Koj_0vk--vg_tIY(@f12tkG%i
zr*UCd8Tu3ND+<&2vkwg?lRd@Ouz0-mL$NI^-tzI$9zOmf^)v5juLIX!-r>R#!kGg5
zO%ii9!Dt{`X*3Xrv~ZSiwr~!6!pJ>dvq-aC)1+CUS*cm8*{Ip7*{Rv9IiNYBIi@+G
z`B8IPb6#^vb4_zo^PA>R%{|Q{&2!C5&0DUGLtw9@3o-;lg-sfP##ob@C7H=;ZL-(|
zJ9|>t#`6YeN%DAJd@mECi)W>0Nve5PmIcLL>g6e1!%`+S!i}uf}mOX1#?+SSz!o!sF~Fvqs?$Y*e2z;c51#KDERJ9zHQkGW!Gkl6ha^
z3eV2ZlFWI}mJ>I5R$-Q863=>MN}0Nj`?NiO@PMK$$=naB#C2@9TH
zm?fFdtG{9ABC|wn1@>Kt71AHEMr{no7-L&5|y}4zWjMh=XRSW|^i+Q_Ws;n!|3k
zw~=`v3J&j$3_u1VJ{ne2qp8)@bsxB&pSBCrX#bzh@FGXg;G<^}tAg&KYlD@BbUwwLCN<}AdXV;?!&%gj-$
zFJk+n)(~r}xuCfSu|KnmT6KS0MH(>*r#xR-%Kxhz&pk`Nmz>
z+<@5q8V{SG1LIx{Ol@$5WhYtH-Ji$a7gt=ChVrB1zateLhQiT-j?nzB`2)(|Vl!Rkve9VX7wa02PJq}+n%kN?5PO&1
z2(eSp8DGSfpfe$Mw&uR(0mMFJ-?_@%=AjD(_T9Q{ftG*B7mqbdy3s{w1;j5#muQ}7
z{(=&JYo4*`ZuW*OT7%YR#HYAUDK5&(AFFxFR=HgrQI9rcNyPCfaZ`)4b0+4d@MWE7
zJ=!S9Nsmv_J!j1Fav$L1Y~}vJi7lx1i^g`Kov`w5%?r&xu(I?##BM>i
zLhN?UE6r<&eZyLK$Q<{g2fv6tgdT?2uQl%goV2TeP{5OF*a(ga$w;0zw=JiEi`?
zdKJBfUPo^LAqj-0Kqv#qFn|naDX+&;^iT8-SMzNkq_pT=Af(yqHgg5~5Pi~tK0+S@
zAp?Z4>fSxo{f#~sNITG{=rbS`1EHh?eS!W1goZ#U&iNlfv_MKQfmVhM!p%V~7Pq=hq$yf@O3WTme=mv!D
zY@5&M^x<4(nLy~FaqkfxiH#N5uf(#k9BdRe8q3AT0HG%kdI6y~5Doysfk5c95*vr*
zVdMEflYmeGkRbp`@A;dd@nG*L9N2k^Jl0Uzj~%A4Q|p{D4Sll7P}mQfj?KVIu$kB_
zY&JFrn~SM24F<4zSSdCiE5pjM1=vDt5mtd!VvDgQ*ivj6R)tk#%P|(K!D_KOtR8E?
z8nGs<8Ee5>u@zVw){beh4y+UF!n(1Q*eYx_wgy{^t;5!18?cSoCR=PXwguaYZNs)>
zJFuPDE^Ifp2iuE%h3&)kV+XK<*dgrjwix9~VLT8jflvj6zCh>)g#JJ{2nYj!Fc1iX
zfG`*cVb_ELVHgmG17QRZMgn0J5Jm%G3=qZwVI1HzBmg0Fd=d~QZ(HCC-$jMJ&j?5q
z<}1Ahn57;MvNz!9W=Qu7uyE$+6`H46lHS6gqEX}WieVQ|Ey|rTdv;1_Omad(YLBoM
z3XBVo^TJ(_ZVIsG=~a;aCcu@a*FySbfEQ11fb@Vs9ey*U#|A2R{x(Rj3iRaZosj+|
z(2A$`@N_S>Ul7SZ?}N`CLC!pV5Yo9pems2y(rbe3c={-$F9hlA_*V0Dd9aTCJ!HEC
z>r6Tc=~2NEJp44Iw+0X3>2r{N6s+Xwi;#8?>BrNTAq_(Mu!SKw|9p*qw&CfUkX|2R
zO>jQ@jq{lUyD6kM`#7W*UwjJ|)1flH_zqWW&q_i~*&(4)zW6>Yo*derryudOsU%@Y
zd{}aihyQ}iuS0cBcn0amq2{h!RsV3h%!Hx2g%b-(CgtWA&z>C>pOP9B8=I9Flp5J1
z{tAlthI#Y)-$HtN81GnpA*9>FY&o;^F;0~&D-1Vce+lEQ);EB~Z^JA(F?|BkcHw-V
z>C=!N63+WpUjk_m&O21!2-3U4`F_zif%Luicr!@%jd0=hSU@^C!jY#fAzd2b#M9Q0
zCL{Z>ry@lBvmJcC8NoYO-+?dVovZJ}nc0tJB73t5kt7$R`mP+Sw=gy@e*&CtXU`5!
ziw}(r%Zg113jN?geGjN(VWiGBZ%FTpIXu4
zL6i<30_h!54m>^_(tkwR$8ttQaYh(@G$J-MD?TABF)HkRALz$&0F#e^sQ9SVtmK5W
z)TsCmm;|VBXtd5z$&g+aZQ;l%Pvc~bKguQ~!exgS0S)k6HZ@
zke0>hnw<^lVKIGq(?>&E6T=6TKDR>I5HpD9kB9W%F}g091nD8MR+9LjxUiI-W)$*F
zUH?si^uk!3FQ!3ycdQ-XAtnFmki_J$*r@oJtnk>Nh!2WpLjf{Q7l{d&N0$A+0};
z6E^$U)*(U3@lo*+S+Sv?iI+i<$~avE7IJmR=^9xH>HBf~K-OOhX~%eeSm{?oIyqj(
zH?juOAYRw!^^o2W&*vQdCP@DouWL^$qU}{
z(%&ZQdgKzMUnlFTzY1xW6kQg%0qLw1-KhE%(o0f8c%6Sh`serbZAjas>caXSq~lX{
z`X54ieyXlFpFnzBs;-xxLi%c|PUj0q6KOg-UqU)4O&2Y1Af2DqhpWp#0O_hUKGnm0
zho|i6G!LGy&(p?izrp-)F~H$-$Y4G)3@AuX8O-Z75JP(HVBSXtQb=EWkLd+zdWep1
z3hBTheBB1-ke)Pz_lrS4NNb1iZ7}H1(|y?oLkPZpTVAF&Ym&}zU1cESx~e~0IHV67
zl}_>yIfM*PPveVSxZ(iz$uMj7dU}7J<^Cy4pY_Zz=h7o62F+WZ$7>e0L7S84l?ahk?K{9I-b{E7JE_u^q6
z#RG;}@fst0?6YU9hV|uHF&sh
zmuy{-RzR)SvaQ*<*?ht?Si(VcwtSOq$UCQshwxL00sFqa0XaGY>NvQZw{u|*pKc5q
zA*3xQl((;iEB0d#jkaKKjM8JpqjXYj9NY5~Hfb0YoE((c`2JsDo>(W;6)}joG!M
z_-ts<%~$Ws>t4+%848s+u^ywnc-A_O6%1JlcGYN|#6~Ewe{>*UyoD?FKPN&j-J2q@{z
z(vx)NyyjS`kfmaOm?UB+PtqxS$G10ylM*2uglmWn;+9YHY(0)0^xh2Kb0QHh<%IrB>75bn-9HSWW+l&zV@PmrR-&&AuPlkB5u{Mtd3@&Qh>G1F~$Lk4qj
zt}Au5wNK|4nxYJj&5f!aHpvQS=z4lM)M7OwnwQSvVCnB+R_wBAdhE^_{QNG;;fm5e
zE9zTf%1h<`ZxJZrr+?8n-o&9iYyt;MVh_)9WxZ$eZ>*wxj^)jzb!2n)v-7J1NBbo!{4$SiB9jt*gI-B1U
z5S2nYWVVVot(+6{V?E~Buas%4OdhPdHv?5@Zt?z`8-|uhPk>pYUb1^cs00MmjYIBEN`Bbs5amw
zwY=sip6-J5W_2uY?eTFB?5TM;ds5w>t<~_ENwk5J
zh~Om5LK0$Q!}!7a!EKwl(on9HjRO1vNwf_r$^;2~)jRpB1B_F`V#Bkz*UO%PyoUz`
zuo3fgeY6igXU$9HZ9K^7jDkAN**Wv9*;n&)8S4ngPXEBRm`|};rF@PT9p#ErJ}Wv_
z$}dwz-*QEXpA_jl|263
z8^==etdr%sV7dh*{x0X=21Iut?Y)41+YsG{^!NqAyuTiCV!`aB1#%@cc
z5Ihth(*ZIAASD_PZc}UWvVN?8P=s*w|o-fW(XOsoNGWEhi
zez>!MujkKekeZL@?vXgYMaQgTv$xJR{^UjgzEfAw0FUICQ21B6r>34WckU*`RMWl`
zen?l)^7)+w6C6LPD_8;Li{N3tIgX#uaoX86RYwwk#Ni3;YWyVr6MhOmji15K;^*-5
z0O*sdYXPzjAnO5I2EBxIZTqS^
zOc>p37Iz@&KF8T=md8MMNGg1M=FHJ~@UEb(1J-nkSKamDi~)ay|HE1G7=MEQh5wB|
z#h>BN@fR$pHgmwn3oP+h_-p(P{uYrDa0I8rL5J)Bs5wCU1GEGVNOV3tVF;`-W34u<
zR1bq8keZzno1K$8@qKg=B+*M?zlNX)nqUYqAt4M2DPcqy17s&ab^&BJK=uG+FF?Km
z@H7b750C?EU}bR3b4MD4IblKcCHiqg{~%Yn?quUWKoNk#8<`{*d6JZI1=B-wbJ*b<
zw@3*&0h582fQjIcmT&>cVb*e!M-<^fcyVk`fE>{h-T?Vpmra}`_G+;8A0Vw^zwzn3M5JYqcb(L{ip0SG)82go^S8GrV4WzIz#c9}!(UgwD-
z0wx8bn3zgTBc>BGh!Si(JF+f?{sSNv0rDq6F2F{yhw2og<_OwW5_1VPp&0Ua_%$Zh8~>m$%$|fk*?66
z8h1W}kcH%A_F;n)Mi#-b_pm{Z>)6HQR5r0uhLO`CJF(GT-4jGJ$eAA^nw$kti=LR7
z%f*bE)Bvhe
z*OJ^7GO~`WCmYB{fLa682B0vs?7GNivW09VR{+!=ph|#_0q9uvs08mGO$^q&GQ0JB8267|3UL+&8kXr%j0#I*w=LOEq0|Dy8
z7Vh5Gi~Ne*4;SI&K7hJv$pZj|w+@WhwvIlAN62rWqsXrT>aHb^0@Q=eUTKm>enbnl~`0Tdg`d+DTzJqK1-hesQv;#;oStIp0Z0MybHr!
z!eGNYE!Ee_n;((C095e_@^|vqM_ahsG(8t<$-Cq;f&E(Y9(kX9Kt3cNk&nqI^13@&NNcK{9LLKcNH
zIQ;(*fWkE_oG-Z54LXclQP{FKyLw4O3MNj>E}W7(I-;mxYT*>_qzkgypSs=(U3qFn
zmznPwih}P$e^WHPO_H3QKQ=d{U}}CbK;bbZocbs+CCQQ)eprR`lO>!pIw?a+%I;Xx
z-{&l4EFh^~lnK?FGW~EV3MvaKhS#NXrWWT;0Vo{wg8|xewoRGCm$Qc}O&t1C{o$I0
z>PJ~pRsf9xXf!}$Iw@<)hJuk53(zEhrf@y&yvp8CPB~G|lndobxl!(v2j$6*TIE3{
z0yJI%^I{x86WI1u7TE(SnA#{G!Ecl+T)Pk9u0RC4!?BsDYmbWZg>2}Vf}##e1up7miCQE}58njtZwDs7RGJr-E`>W
z*xdZF#p3{)uCre;=ntX`c4PKb1?3g;7nx
zkvm*VLA{v(;m4Pml$uE8!=R=n0d$0xDgbB}9ALc-r%+QlE{v0rT51|VvpH_SObXs#
z)lx8D>?I$BH32WYOwV`vOK{~wb#Wn6AiB716=
zO-}}-DyTYv{W_|WT1+jWmQu^8Dyo`VPO(%CRSQsPV;(@q19SpFCjt~&mk&^AT_Hdx
z1GETURizpPmQ)kfj7_3isTEvyp|o61nZgYcX!lfZ!Gc25r|WXf3~t<*Mr~`^hYQuz
z=ANroFq>1`bejcyYNvL7TC(TUhkd$-p2i-e;L7R!qJ%mE(3$U3ICT_#(n%eoj#J+P
z6uN3IK*7g6PJK_E6!iJ*G92|2bqb)f0Xl~p3X?Y&u`cT+mehIb=g%`Zb&0wRP&Gg`
z9B%mfewNe?>ev5ZexrT|DC~ez4%4{aBL6=N-X81kQh&qOD(W6}pL#$&q#jX^sVCH5
z04)dT0)Q?A=pukt0JIXIivhZ1HTSATJ*Qq!|4{!z>ec&Xv=n}G2GAOSp5(lK?)|G)
z3)|(9`C$zcRFs>Y5f?f@x8QzXKW#wc(0jB9pjBF$0BAM0q*K!joc?Gr4ad`RfU+Om
zMjO#4pSSe0>90qtIot7H-Rq)l$$HwJhLaVHH#pbT!PQND7wt&P
zX(!qlpbY@s0?@Ajx(`lvBZFyAS_x-5+Kcw42ham)A6fxWI8inMv>Bi+0Br^6ij}mA
z_NDz089fMrirWCX8lY>qu-v4nf-{{N`&etkj_K&j4(RY;_wKfaUz6}dhmNG9Ka5a1
z2B7Vq*c(qLa=uCcs8&nEl-a@0fpi+34(C8>J~v8p;Xs8X4HEz)J2gEM6P-!tz_!AY
zEP5n2aA9c|K)c}xhD`1c4U+<7>i(`|_wBLprYFz^a9f9(2TS3w8_k!l>eS(Tpm1yt
z3n?loEG|glUZhy%UMn>{oi6#Axwzj9cX?T72|L?r6{&Zrex6oVZZP<8v2fdTqDG*rFdjYx?pxXetouAit0u=5q
z^vvsfVEX8ps^RQxh@`%sdFeyk%nQ&RpUtr}-11Fej=fdQ_1{HBJtto4Q@`L
zPjGX>?vHZ<4R?2Y<^=i_edePd&H{ArCw{mo$
zvfl?5W6Q`sPd?No#*t6hXP|3s0+$AUy5eSB82A6cKh51eN(V3jaC?dwIE3+G6pWHl
zF}{o+-OLzfEHjSDV<6-=fc^nc2)P5$
zdmmmCspm{S+$BNb>;kt$E=xr3-}0Cue#-^DrQ34(H2u6sP_vjBoMaAwuj3!yB$-*d
z_rU18eDg04|LjFjw{OH~beQ{Jg6Otjm@;k)2B2_%~2TKYd+f
zmciFWW-xT`l%#+rk#u;Y5#ajJg(~r5tTz(%Z7!Bav
z{+>wTmto8eE>dnXzc9ZtzcIf9%m82_fZ+fm07m{_k@Dp@`7}1t|Igrf9~(U?Uhv_7
z=?2VyBIbX?K_g(VZA~_1%J@BW^da8{u|DhrF*IDtMr^b46q8~JoQjG4Vp_})2e_>^
z%oxDW5RivmVneYMn(RbFq@!Hp6sV
z40A_*n!v>V;=s@0q(B@D;0_uF7h5(k;muq489rPb2@MiQ0L=R1=AK#{CyxJY&J`z#
zQy@;apC(QPnBDs=xz*7KX0O3arA_C#h1cbpK1ZW`65I5ldH&3$+b?CjShs
z_y46{!7t(c=>YgGd*E~6LFa7{)ZqJM;6x1XlZG9vipdT+)Ie!ZRuKTywNvf)SS
z4NNz)8h(Plf!V}tVSa?4oL^$DFxTM6=C8$K7{PY%t8z!NTLdm4-_Un+#hG+YCDly9`$vZZh0zxZQB4;rE6=
z8vbN>%J7WgIVmnRk(x=(rTwHh2>>3Qiz=_To9=~d}<
z={@N~>0{~N(r3~aMgk+$NYBW?$ik?fk(E(@BO4<-BTu6VMw5&Rj3ygRF`8;L-KfN9
zmeCx_NNog+N{z~l78osJ3lE#AFB@Gox^8sS=vSlPjcys;Ho9wc-{_&yW23)}o*F$j
z`p4*{(QBi(#sXu+7&F#478w)9lrdv0F_s!z8uvH0F}5@AFy3Um#dw?Xj$ZwHx%P7J
z<=M--*SEdS_qy2YQm-o}nI_{+CYt1%6!w<)_UWzc?c3YG_x|1|djHV-Wbad^iE7hK
z(=5|$(@~~ZP4AfAGkswC$ZUey46~VLv(4uA(d#4aW8BB2k7=LEJ`H`E`n2>}Vcy@|
z)!g0O)7;y9oB1L0Bj(?jAF~LzNU=z>7-ErO@tws5i=QnnTU_m%*>`;3iGB0?7WVz6
z@58>2`~KDUX}>xBD*7$%x3piCWnW9VrL(20rP|$cqvcnY`z;Sz9<~~3HOZ>LYO>W7
zt7rX@{#bwg{-XXB{pD{NWYR@)V}t8I7K9?Yck*v+$>Z&z-&(5}LcwX3zOw`;U(
zwrjOpX}8&KuibIGQ+8+U&e>hC``PXnyWi~ou=~^Qj@>~GlLwpZV^zi-
zWLjCLtXsBGwp(^sc2agxc1dEQk3HSD)fjx!vAW2Iw*qt>z0vD$uPHsN+e;i;llLK5%^G_{8yV$7hajEz%fcXD=eb#iy|
zbngZFSo2wBPBV
z(_yEtosK#kcRJ;C&FN34r%rF2-Z=}M)u^+cGvh3AmO2|dn>d>~_jh)39^f489Os}=PGk`bahg@
zdbloJp*U7HMuG3sgTxYq?cU|gQ@7m?M%5|;l2G`B5TU`&j
z9(MiO^_ZKdTYy`%Tbx^>TZ-FYw+y$@Ze!iXyG?Q{berNf)vev_q}v;J7x&@rdF~V4
z3*3v`r@BvfuXL|*Z**^QZ*%W(-{ijCeV4m>ulqswBko7tzjeRhe#e9MF!8YTu=Vip
z80ew&@bd`r2=$2Yi1vu_NcG6{nCLOZL*uc`W4TAIM}tSR#|jUvN0-MokDVTSJob4U
z^f=;i)Z@6vcOJicyz}hiIlwc~bFSwq&+VQ&Ja>BT_B`r&%=5VCcb*qKFM9s$dD-(%
z&)c4N)SmY||MC3S^QGr&FFh}PFWgJ&W$9(_QnM@W#DOyluSgy&b)sz1_S$
zy$5&)dxv>PddGOjdnb9PdJp!V?cLyg(EE=8dIQw*0bV{+e5U!7_{{cE`^@tx^I7Oq
z>9f?Q+NZ{+-lxf@)u-L3(`Tj68lUw(n|!wV?C{y`^Oes5pTj=i_#F2+;q#-5e&Q-!&rpQ69Q
zRv}Z!)e0AdyTVH`P@z=#DFPJ1iZDf_B1RFfNK&LKhA4(AG8H2gqZDHld5VdO0!5Kx
zs$zy>mSU~~DCR2`C@K_76jcgVQKx8Bv?$sX9g1$nYQ;LmM#UDzcEv8mUd4XJA;s5<
zV~Xz-KPY}uoKc)t{H(a5xUTp`@w?(rh5D}If#R{^Z^d)Pzlzt2cS=O5rxYnkC8IP{
z8Y_D%`zZS=t&}!Od!?h&S?Q+qR1Q!ol)lPA${=N^GC~=xj8i5mQ%5vo*idd(t$ZDQoqWT5<9!o-
zr}?UVfp44dYTvcK=X|gE-tc4mdi$CA1^7k!Mf=V5TcGw^wbUw-SOA+
zXZ$7p3jZMg5dT^J^Zm>HSNU)D-|BzL|C0X||JQ@`1{n5^Uk&cY`ItX2Isc%HZJO(BS;w>A@wz+TgXp>x0h(UkSbzq8}m-F$@_P5)cv;
zGA?9t$dr)kkfxB9kgr0%2{{(>d&q;3N1>8XvrzNU0ilCJ1J$A9LMMk#39SuX5!xPl
zDD=C~??a!3z6}$ExrHghRAIxza>K@kRfg4s)rIX2I~?|P*rl*v!+sBY6RsaF3ik+C
zh5Lo4hG&Lng-;7thlB9;@HOG&5tUN+7)#u>PXa$sM}F@qv>dqXwzs#bWn6i^yKK7(X*r5qt`^Q
zi~c_PT=a$LzoTDAzm0K=QN*ZXM#kjDOo(ZT>5f?y^JC0~n4e>wsbk*83Sw6ZS`yqB@NL3h39k~~Bw8h^9TS}rBNLMnQxc~p&P~)Lu1nmWxHIu$;?2Zg6aPsPCZS1+
zq@bjbq{5_hsihX~HyRT5wuu+JdyIwB>0R({85yI@oNm^tu^
zL&Anc44E^ee8|EfhliXP@@
z%we;K?HP7t*f+zT4|_LUI6QoK!tkWwb;H|+YlmMM{`>G-nY}XmWm;tp%^a1Po7s}t
zow+LWT;{dR8zU@7IE;{w$Qw~KqIkrb5nD%WAMs?w%Mq`$yt4eV24yv8b!Dy0x|j7d
z>$!TQ=Sbg?{v&6NoIkRB4`jc}!E*F-hUSdQ
z$<0}vvn6L+&fT29bDoXz85KAxcvRJ>#!=0q?vHvl>c!~r(FvoIM%RpP9o;ti;pi8m
z|IHnk8;~26yC`>gZcXmZ+&j7V#(0hK8#8E3*_fqcs>Y~)8FP2c{jok{1IGrBZ5XQ^
z+d1~$*r#Kkj|&_ZH7;gc$GCOlHjI0nrlS(I*P5NQd`AHY^`>6A6^6l~`oBU%1c!9LQxFDk-r(kqJN5Q&+
z4F%5&-W3W90}G=HV+!jF+Y37i9~b^x_-b;}{F~Pt}bpWZYln&_*L9pt5<9k&)7TTU5TiKD9I?vDH&a|y<~sM!IGCV(V2QP
z{bq*EjF`E2X6?-SnKx$Mo_Tkc`z+-w-&sp$)v0GS%=&fKy;%=td(ZZt9Wc9MHaoj^
z_O;o!X5XIUHOFtxpgBwD)X!<0^T(Wra~{u)nVULy@Z9xtcg)?TCe%jiUg}(RzPeC-
zME$+`M@>JCOyj7@(-dinHLKw7C2fVjIrBvGH;@A_FaQ*RSzr#>1CD@iz`yg5dDuMH
zc|P;h%6Zf0Y39wFcYNNdd8g-{n|EQ}jd|}%^-Jwb{Ys-sqf28-<4W^NrG9GNr9YOQDm`0zq4dwvyQTL_AC^8TeOmgW^kwPm(s%Rm
z`Ns2I=7-MDn4dqte16;f9rK^he^Z8)F=ggu)@62O4(c+eGS9LBWr{N2GXJu|vdXfq
zvJGXs%f2c*PqU_&t>+;0%+2v*Bi_06!
zSC(%m-(0?}d}sOo@Ol*_7DO(HSrESHPlc+&zap?Aq$0c`sv@SMu%fo&V8xw^zbal6Mcz3o45$r&i9WoK-oeQd3!4SzfuQa&cv&y0W>lwX%J2z~b1&
z@rx4|r!4+y@zurG7vEg`+mhTRMN5j8Oj}a2t$rS(gjmRT%w
zT;{aQWtsc3yUSiwiK@sdrpmC&xT<$mpQ^r9R#hHV-c>$Tsw)4gfU4lC(5mpN$f_Y#
zv#R!0y{UGtj;|hHT~^&%tzKEZu6kqjmg;TQhpJCkpR2xDeYyHt_08(vs&7@_seW1g
zruyA-WVzmQ(Qu=4Pryta5jT2Vl`|%+rjQ;udt8Um+BgW8lr}-k<=K~^s4c%
ziLQyONvuh!8C;WIlUXyqW^zq&&Ged?HK1mG&4QYWnk6-RYEIYOsrjqsSsQym&Zf@3&auw3E}$-|ZbaSWI!zs0x2bMx-Hy85bzjvTsC!)Z
zZ@qp!UQgAF>!tO*>P_qW)XVBU>lO9B^@Hkz>J#fT>Sxr?sc)%YQ@_4`Q~lQZuj;?8
z|GxfY{ptFP^}pBuS%0_wLH*)0o#dv9X|Wa^uX#
z`HjmOS2b>L+~0Vp@$1H8jo&q%X*}0>vGH=_)yC_Muba%8{F>65Ml@wLWjEzFO>Qb~
zn%*?CX?9apQ)^Rule)8MWz(9bbxjAGzHR!k=~UC%rVCBKHQjEy*YvRI@22NX|2DmD
z)@x>(&6};7ZJO7
zyIWVcu4~=hdbIU;>xtGMTGfBF-fq3y`k?hu>p!ipTHme^tiV@ztx&AUSutTn^@_R`
z`&N9n;)fMKtvIvd{ECY!Zm#%a#qAaMRy*X!wL&eXHP8}TS}W07Yu&V-
z+5uXH)>rGVjn)p)4%cRBbF^c%V@$`mj%6J?I)3SR*=gIE(mB4fqO-H}T<5jUyPXd@pLY>m
zhFx}D?p^*};aw?RgS#@ihIi$5jqRG+HLq(?*W#{aUCX-~yIQ*1x;oTd-CY~H4s{*x
zy4rQS>sdG2O?ETghTTTpCf#P;R^49Rf!&eaG2QXqL%OrNM|V%|p548$yP|tZcU|}9
z?p@s{y03Kq+I_G4ukKgfZ&wOeVk^y7TCa3m>AKQqWy;E-E2pijT>1ahWdC1XRtEsb
z5z5rkC?`cjP14lDL?yJ8gTuul(HY5s!Y`A;F|}#hrqlEz1jBT2Kp2@{5WjuybMNOq
z_ul8;=RWtj&wXYoP7aM?N0$z5<#egj)WLCMGtHf|&VG5n{)qSPD2TGCh=$SjXlL|v
z^j!2p^kVczv?tmdjobzC;9f8Q+z*C;$H4@U4yJ%i@En*9UIc}p7?glTU$!t%_I?tHt8h$5yv>4fcb>;3Sv}7s93Rr*Iiu1K);g
z;bvF?t6(jxgAH&e+yz@;3=-%-7b>XXQP=@HVHZ3BKZEDtC3pp1gT3&d@ZazoGz2|@
zMx*g44NXKDXexRhWue(F2!ZI952V~BDexq;TpUZ*WzaU0p5-G
z;{Es_ZpUZwH}(K~nEj~zeS3sG${uZxwKMFg_Vad@oo(mXKeTi0h4u=2lfB38wEtn>
zA#o&u^d|$!10-B9=d`OOx4$?`w$O-Z%a*q6m_NN2s1N1@qFdary=@>eWK24vY=`@SZ
zq_b!)&7-qvF)g8s=o0z{T}s!`U(#REcW8uG&^p>co9O#=C*4gU#gtM`CH3j=>G23{
zrycYZy-Kgs9(t4Z(OdKmi(?6_KO4wKuu*I@8_S+z6IeQ%!ZO)3Hl1a$T$ac3*{f^;
zTg*z?a`q;Bi&e5JR>SI9BWq@R**>cXPoo2^Ncge$#7;nbDVijfm7%dJ0;E{XNmK=Q|6RA%baSb$q`Pw^QCj0$MYoq
z6wl=)d^O*|-{BFyg}=vt!+*=0`3HPIKft4$a>fP!h_~_Myn}c0Px)#71^+Am8^6S_
z@IHQ<-xcxVJ~1dF28%>7T%?LIVw{*D(!~^!DY8Yrcv;LBMPh+iEJ{V0SS_l>7O_p#
zi3ZUm-WNN?9?>d<@Prmd92Q5!G0`qQ7MvPN!|wQ{H2BU|MG$>i_kN3u;GmnY>pc|l&3m%TToGDV`{j1Ts@(lR0V38s#M!looY~x
zs#Q_Nl~lem>aaSZj;WLCls2KFQ)X71wPwB9Xev#$*l2zurMqR
pOTzN-&2Uw?CR`V82seclVPm)>Z28~PkBg80&Ieb1=l>hF{ujngq6Po}
diff --git a/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLAlertView.swift b/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLAlertView.swift
index 714f41e..c7ae83d 100644
--- a/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLAlertView.swift
+++ b/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLAlertView.swift
@@ -9,30 +9,30 @@
import Foundation
import UIKit
fileprivate func < (lhs: T?, rhs: T?) -> Bool {
- switch (lhs, rhs) {
- case let (l?, r?):
- return l < r
- case (nil, _?):
- return true
- default:
- return false
- }
+ switch (lhs, rhs) {
+ case let (l?, r?):
+ return l < r
+ case (nil, _?):
+ return true
+ default:
+ return false
+ }
}
fileprivate func > (lhs: T?, rhs: T?) -> Bool {
- switch (lhs, rhs) {
- case let (l?, r?):
- return l > r
- default:
- return rhs < lhs
- }
+ switch (lhs, rhs) {
+ case let (l?, r?):
+ return l > r
+ default:
+ return rhs < lhs
+ }
}
// Pop Up Styles
public enum SCLAlertViewStyle {
- case success, error, notice, warning, info, edit, wait
-
+ case success, error, notice, warning, info, edit, wait, question
+
var defaultColorInt: UInt {
switch self {
case .success:
@@ -49,8 +49,10 @@ public enum SCLAlertViewStyle {
return 0xA429FF
case .wait:
return 0xD62DA5
+ case .question:
+ return 0x727375
}
-
+
}
}
@@ -74,16 +76,26 @@ open class SCLButton: UIButton {
var customBackgroundColor:UIColor?
var customTextColor:UIColor?
var initialTitle:String!
- var showDurationStatus:Bool=false
-
+ var showTimeout:ShowTimeoutConfiguration?
+
+ public struct ShowTimeoutConfiguration {
+ let prefix: String
+ let suffix: String
+
+ public init(prefix: String = "", suffix: String = "") {
+ self.prefix = prefix
+ self.suffix = suffix
+ }
+ }
+
public init() {
super.init(frame: CGRect.zero)
}
-
+
required public init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
}
-
+
override public init(frame:CGRect) {
super.init(frame:frame)
}
@@ -93,36 +105,38 @@ open class SCLButton: UIButton {
// Example: SCLAlertView().showSuccess(self, title: "Test", subTitle: "Value").close()
open class SCLAlertViewResponder {
let alertview: SCLAlertView
-
+
// Initialisation and Title/Subtitle/Close functions
public init(alertview: SCLAlertView) {
self.alertview = alertview
}
-
+
open func setTitle(_ title: String) {
self.alertview.labelTitle.text = title
}
-
+
open func setSubTitle(_ subTitle: String) {
self.alertview.viewText.text = subTitle
}
-
+
open func close() {
self.alertview.hideView()
}
-
+
open func setDismissBlock(_ dismissBlock: @escaping DismissBlock) {
self.alertview.dismissBlock = dismissBlock
}
}
let kCircleHeightBackground: CGFloat = 62.0
+let uniqueTag: Int = Int(arc4random())
+let uniqueAccessibilityIdentifier: String = "SCLAlertView"
public typealias DismissBlock = () -> Void
// The Main Class
open class SCLAlertView: UIViewController {
-
+
public struct SCLAppearance {
let kDefaultShadowOpacity: CGFloat
let kCircleTopPosition: CGFloat
@@ -131,34 +145,38 @@ open class SCLAlertView: UIViewController {
let kCircleIconHeight: CGFloat
let kTitleTop:CGFloat
let kTitleHeight:CGFloat
+ let kTitleMinimumScaleFactor: CGFloat
let kWindowWidth: CGFloat
var kWindowHeight: CGFloat
var kTextHeight: CGFloat
let kTextFieldHeight: CGFloat
let kTextViewdHeight: CGFloat
let kButtonHeight: CGFloat
+ let circleBackgroundColor: UIColor
let contentViewColor: UIColor
let contentViewBorderColor: UIColor
let titleColor: UIColor
-
+
// Fonts
let kTitleFont: UIFont
let kTextFont: UIFont
let kButtonFont: UIFont
-
+
// UI Options
+ var disableTapGesture: Bool
var showCloseButton: Bool
var showCircularIcon: Bool
var shouldAutoDismiss: Bool // Set this false to 'Disable' Auto hideView when SCLButton is tapped
var contentViewCornerRadius : CGFloat
var fieldCornerRadius : CGFloat
var buttonCornerRadius : CGFloat
-
+ var dynamicAnimatorActive : Bool
+
// Actions
var hideWhenBackgroundViewIsTapped: Bool
-
- public init(kDefaultShadowOpacity: CGFloat = 0.7, kCircleTopPosition: CGFloat = -12.0, kCircleBackgroundTopPosition: CGFloat = -15.0, kCircleHeight: CGFloat = 56.0, kCircleIconHeight: CGFloat = 20.0, kTitleTop:CGFloat = 30.0, kTitleHeight:CGFloat = 25.0, kWindowWidth: CGFloat = 240.0, kWindowHeight: CGFloat = 178.0, kTextHeight: CGFloat = 90.0, kTextFieldHeight: CGFloat = 45.0, kTextViewdHeight: CGFloat = 80.0, kButtonHeight: CGFloat = 45.0, kTitleFont: UIFont = UIFont.systemFont(ofSize: 20), kTextFont: UIFont = UIFont.systemFont(ofSize: 14), kButtonFont: UIFont = UIFont.boldSystemFont(ofSize: 14), showCloseButton: Bool = true, showCircularIcon: Bool = true, shouldAutoDismiss: Bool = true, contentViewCornerRadius: CGFloat = 5.0, fieldCornerRadius: CGFloat = 3.0, buttonCornerRadius: CGFloat = 3.0, hideWhenBackgroundViewIsTapped: Bool = false, contentViewColor: UIColor = UIColorFromRGB(0xFFFFFF), contentViewBorderColor: UIColor = UIColorFromRGB(0xCCCCCC), titleColor: UIColor = UIColorFromRGB(0x4D4D4D)) {
-
+
+ public init(kDefaultShadowOpacity: CGFloat = 0.7, kCircleTopPosition: CGFloat = 0.0, kCircleBackgroundTopPosition: CGFloat = 6.0, kCircleHeight: CGFloat = 56.0, kCircleIconHeight: CGFloat = 20.0, kTitleTop:CGFloat = 30.0, kTitleHeight:CGFloat = 25.0, kWindowWidth: CGFloat = 240.0, kWindowHeight: CGFloat = 178.0, kTextHeight: CGFloat = 90.0, kTextFieldHeight: CGFloat = 45.0, kTextViewdHeight: CGFloat = 80.0, kButtonHeight: CGFloat = 45.0, kTitleFont: UIFont = UIFont.systemFont(ofSize: 20), kTitleMinimumScaleFactor: CGFloat = 1.0, kTextFont: UIFont = UIFont.systemFont(ofSize: 14), kButtonFont: UIFont = UIFont.boldSystemFont(ofSize: 14), showCloseButton: Bool = true, showCircularIcon: Bool = true, shouldAutoDismiss: Bool = true, contentViewCornerRadius: CGFloat = 5.0, fieldCornerRadius: CGFloat = 3.0, buttonCornerRadius: CGFloat = 3.0, hideWhenBackgroundViewIsTapped: Bool = false, circleBackgroundColor: UIColor = UIColor.white, contentViewColor: UIColor = UIColorFromRGB(0xFFFFFF), contentViewBorderColor: UIColor = UIColorFromRGB(0xCCCCCC), titleColor: UIColor = UIColorFromRGB(0x4D4D4D), dynamicAnimatorActive: Bool = false, disableTapGesture: Bool = false ) {
+
self.kDefaultShadowOpacity = kDefaultShadowOpacity
self.kCircleTopPosition = kCircleTopPosition
self.kCircleBackgroundTopPosition = kCircleBackgroundTopPosition
@@ -172,44 +190,64 @@ open class SCLAlertView: UIViewController {
self.kTextFieldHeight = kTextFieldHeight
self.kTextViewdHeight = kTextViewdHeight
self.kButtonHeight = kButtonHeight
+ self.circleBackgroundColor = circleBackgroundColor
self.contentViewColor = contentViewColor
self.contentViewBorderColor = contentViewBorderColor
self.titleColor = titleColor
-
+
self.kTitleFont = kTitleFont
+ self.kTitleMinimumScaleFactor = kTitleMinimumScaleFactor
self.kTextFont = kTextFont
self.kButtonFont = kButtonFont
-
+
+ self.disableTapGesture = disableTapGesture
self.showCloseButton = showCloseButton
self.showCircularIcon = showCircularIcon
self.shouldAutoDismiss = shouldAutoDismiss
self.contentViewCornerRadius = contentViewCornerRadius
self.fieldCornerRadius = fieldCornerRadius
self.buttonCornerRadius = buttonCornerRadius
-
+
self.hideWhenBackgroundViewIsTapped = hideWhenBackgroundViewIsTapped
+ self.dynamicAnimatorActive = dynamicAnimatorActive
}
-
+
mutating func setkWindowHeight(_ kWindowHeight:CGFloat) {
self.kWindowHeight = kWindowHeight
}
-
+
mutating func setkTextHeight(_ kTextHeight:CGFloat) {
self.kTextHeight = kTextHeight
}
}
-
+
+ public struct SCLTimeoutConfiguration {
+
+ public typealias ActionType = () -> Void
+
+ var value: TimeInterval
+ let action: ActionType
+
+ mutating func increaseValue(by: Double) {
+ self.value = value + by
+ }
+
+ public init(timeoutValue: TimeInterval, timeoutAction: @escaping ActionType) {
+ self.value = timeoutValue
+ self.action = timeoutAction
+ }
+
+ }
+
var appearance: SCLAppearance!
-
+
// UI Colour
var viewColor = UIColor()
-
+
// UI Options
open var iconTintColor: UIColor?
open var customSubview : UIView?
-
-
// Members declaration
var baseView = UIView()
var labelTitle = UILabel()
@@ -218,36 +256,36 @@ open class SCLAlertView: UIViewController {
var circleBG = UIView(frame:CGRect(x:0, y:0, width:kCircleHeightBackground, height:kCircleHeightBackground))
var circleView = UIView()
var circleIconView : UIView?
- var duration: TimeInterval!
- var durationStatusTimer: Timer!
- var durationTimer: Timer!
+ var timeout: SCLTimeoutConfiguration?
+ var showTimeoutTimer: Timer?
+ var timeoutTimer: Timer?
var dismissBlock : DismissBlock?
fileprivate var inputs = [UITextField]()
fileprivate var input = [UITextView]()
internal var buttons = [SCLButton]()
fileprivate var selfReference: SCLAlertView?
-
+
public init(appearance: SCLAppearance) {
self.appearance = appearance
super.init(nibName:nil, bundle:nil)
setup()
}
-
+
required public init?(coder aDecoder: NSCoder) {
fatalError("NSCoding not supported")
}
-
+
required public init() {
appearance = SCLAppearance()
super.init(nibName:nil, bundle:nil)
setup()
}
-
+
override public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
appearance = SCLAppearance()
super.init(nibName:nibNameOrNil, bundle:nibBundleOrNil)
}
-
+
fileprivate func setup() {
// Set up main view
view.frame = UIScreen.main.bounds
@@ -264,17 +302,21 @@ open class SCLAlertView: UIViewController {
contentView.addSubview(labelTitle)
contentView.addSubview(viewText)
// Circle View
- circleBG.backgroundColor = UIColor.white
+ circleBG.backgroundColor = appearance.circleBackgroundColor
circleBG.layer.cornerRadius = circleBG.frame.size.height / 2
baseView.addSubview(circleBG)
circleBG.addSubview(circleView)
let x = (kCircleHeightBackground - appearance.kCircleHeight) / 2
- circleView.frame = CGRect(x:x, y:x, width:appearance.kCircleHeight, height:appearance.kCircleHeight)
+ circleView.frame = CGRect(x:x, y:x+appearance.kCircleTopPosition, width:appearance.kCircleHeight, height:appearance.kCircleHeight)
circleView.layer.cornerRadius = circleView.frame.size.height / 2
// Title
- labelTitle.numberOfLines = 1
+ labelTitle.numberOfLines = 0
labelTitle.textAlignment = .center
labelTitle.font = appearance.kTitleFont
+ if(appearance.kTitleMinimumScaleFactor < 1){
+ labelTitle.minimumScaleFactor = appearance.kTitleMinimumScaleFactor
+ labelTitle.adjustsFontSizeToFitWidth = true
+ }
labelTitle.frame = CGRect(x:12, y:appearance.kTitleTop, width: appearance.kWindowWidth - 24, height:appearance.kTitleHeight)
// View text
viewText.isEditable = false
@@ -289,31 +331,43 @@ open class SCLAlertView: UIViewController {
viewText.textColor = appearance.titleColor
contentView.layer.borderColor = appearance.contentViewBorderColor.cgColor
//Gesture Recognizer for tapping outside the textinput
- let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SCLAlertView.tapped(_:)))
- tapGesture.numberOfTapsRequired = 1
- self.view.addGestureRecognizer(tapGesture)
+ if appearance.disableTapGesture == false {
+ let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SCLAlertView.tapped(_:)))
+ tapGesture.numberOfTapsRequired = 1
+ self.view.addGestureRecognizer(tapGesture)
+ }
}
-
+
override open func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let rv = UIApplication.shared.keyWindow! as UIWindow
let sz = rv.frame.size
-
+
// Set background frame
view.frame.size = sz
-
+
+ let hMargin: CGFloat = 12
+
+ // get actual height of title text
+ var titleActualHeight: CGFloat = 0
+ if let title = labelTitle.text {
+ titleActualHeight = title.heightWithConstrainedWidth(width: appearance.kWindowWidth - hMargin * 2, font: labelTitle.font) + 10
+ // get the larger height for the title text
+ titleActualHeight = (titleActualHeight > appearance.kTitleHeight ? titleActualHeight : appearance.kTitleHeight)
+ }
+
// computing the right size to use for the textView
let maxHeight = sz.height - 100 // max overall height
var consumedHeight = CGFloat(0)
- consumedHeight += appearance.kTitleTop + appearance.kTitleHeight
+ consumedHeight += (titleActualHeight > 0 ? appearance.kTitleTop + titleActualHeight : hMargin)
consumedHeight += 14
consumedHeight += appearance.kButtonHeight * CGFloat(buttons.count)
consumedHeight += appearance.kTextFieldHeight * CGFloat(inputs.count)
consumedHeight += appearance.kTextViewdHeight * CGFloat(input.count)
let maxViewTextHeight = maxHeight - consumedHeight
- let viewTextWidth = appearance.kWindowWidth - 24
+ let viewTextWidth = appearance.kWindowWidth - hMargin * 2
var viewTextHeight = appearance.kTextHeight
-
+
// Check if there is a custom subview and add it over the textview
if let customSubview = customSubview {
viewTextHeight = min(customSubview.frame.height, maxViewTextHeight)
@@ -323,7 +377,7 @@ open class SCLAlertView: UIViewController {
// computing the right size to use for the textView
let suggestedViewTextSize = viewText.sizeThatFits(CGSize(width: viewTextWidth, height: CGFloat.greatestFiniteMagnitude))
viewTextHeight = min(suggestedViewTextSize.height, maxViewTextHeight)
-
+
// scroll management
if (suggestedViewTextSize.height > maxViewTextHeight) {
viewText.isScrollEnabled = true
@@ -331,7 +385,7 @@ open class SCLAlertView: UIViewController {
viewText.isScrollEnabled = false
}
}
-
+
let windowHeight = consumedHeight + viewTextHeight
// Set frames
var x = (sz.width - appearance.kWindowWidth) / 2
@@ -340,54 +394,54 @@ open class SCLAlertView: UIViewController {
contentView.layer.cornerRadius = appearance.contentViewCornerRadius
y -= kCircleHeightBackground * 0.6
x = (sz.width - kCircleHeightBackground) / 2
- circleBG.frame = CGRect(x:x, y:y+6, width:kCircleHeightBackground, height:kCircleHeightBackground)
-
+ circleBG.frame = CGRect(x:x, y:y+appearance.kCircleBackgroundTopPosition, width:kCircleHeightBackground, height:kCircleHeightBackground)
+
//adjust Title frame based on circularIcon show/hide flag
let titleOffset : CGFloat = appearance.showCircularIcon ? 0.0 : -12.0
labelTitle.frame = labelTitle.frame.offsetBy(dx: 0, dy: titleOffset)
-
+
// Subtitle
- y = appearance.kTitleTop + appearance.kTitleHeight + titleOffset
- viewText.frame = CGRect(x:12, y:y, width: appearance.kWindowWidth - 24, height:appearance.kTextHeight)
- viewText.frame = CGRect(x:12, y:y, width: viewTextWidth, height:viewTextHeight)
+ y = titleActualHeight > 0 ? appearance.kTitleTop + titleActualHeight + titleOffset : hMargin
+ viewText.frame = CGRect(x:hMargin, y:y, width: appearance.kWindowWidth - hMargin * 2, height:appearance.kTextHeight)
+ viewText.frame = CGRect(x:hMargin, y:y, width: viewTextWidth, height:viewTextHeight)
// Text fields
y += viewTextHeight + 14.0
for txt in inputs {
- txt.frame = CGRect(x:12, y:y, width:appearance.kWindowWidth - 24, height:30)
+ txt.frame = CGRect(x:hMargin, y:y, width:appearance.kWindowWidth - hMargin * 2, height:30)
txt.layer.cornerRadius = appearance.fieldCornerRadius
y += appearance.kTextFieldHeight
}
for txt in input {
- txt.frame = CGRect(x:12, y:y, width:appearance.kWindowWidth - 24, height:70)
+ txt.frame = CGRect(x:hMargin, y:y, width:appearance.kWindowWidth - hMargin * 2, height:70)
//txt.layer.cornerRadius = fieldCornerRadius
y += appearance.kTextViewdHeight
}
// Buttons
for btn in buttons {
- btn.frame = CGRect(x:12, y:y, width:appearance.kWindowWidth - 24, height:35)
+ btn.frame = CGRect(x:hMargin, y:y, width:appearance.kWindowWidth - hMargin * 2, height:35)
btn.layer.cornerRadius = appearance.buttonCornerRadius
y += appearance.kButtonHeight
}
}
-
+
override open func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(SCLAlertView.keyboardWillShow(_:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil);
NotificationCenter.default.addObserver(self, selector: #selector(SCLAlertView.keyboardWillHide(_:)), name:NSNotification.Name.UIKeyboardWillHide, object: nil);
}
-
+
open override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
-
+
override open func touchesEnded(_ touches:Set, with event:UIEvent?) {
if event?.touches(for: view)?.count > 0 {
view.endEditing(true)
}
}
-
+
open func addTextField(_ title:String?=nil)->UITextField {
// Update view height
appearance.setkWindowHeight(appearance.kWindowHeight + appearance.kTextFieldHeight)
@@ -406,13 +460,13 @@ open class SCLAlertView: UIViewController {
inputs.append(txt)
return txt
}
-
+
open func addTextView()->UITextView {
// Update view height
appearance.setkWindowHeight(appearance.kWindowHeight + appearance.kTextViewdHeight)
// Add text view
let txt = UITextView()
- // No placeholder with UITextView but you can use KMPlaceholderTextView library
+ // No placeholder with UITextView but you can use KMPlaceholderTextView library
txt.font = appearance.kTextFont
//txt.autocapitalizationType = UITextAutocapitalizationType.Words
//txt.clearButtonMode = UITextFieldViewMode.WhileEditing
@@ -422,10 +476,10 @@ open class SCLAlertView: UIViewController {
input.append(txt)
return txt
}
-
+
@discardableResult
- open func addButton(_ title:String, backgroundColor:UIColor? = nil, textColor:UIColor? = nil, showDurationStatus:Bool=false, action:@escaping ()->Void)->SCLButton {
- let btn = addButton(title, backgroundColor: backgroundColor, textColor: textColor, showDurationStatus: showDurationStatus)
+ open func addButton(_ title:String, backgroundColor:UIColor? = nil, textColor:UIColor? = nil, showTimeout:SCLButton.ShowTimeoutConfiguration? = nil, action:@escaping ()->Void)->SCLButton {
+ let btn = addButton(title, backgroundColor: backgroundColor, textColor: textColor, showTimeout: showTimeout)
btn.actionType = SCLActionType.closure
btn.action = action
btn.addTarget(self, action:#selector(SCLAlertView.buttonTapped(_:)), for:.touchUpInside)
@@ -433,10 +487,10 @@ open class SCLAlertView: UIViewController {
btn.addTarget(self, action:#selector(SCLAlertView.buttonRelease(_:)), for:[.touchUpInside, .touchUpOutside, .touchCancel, .touchDragOutside] )
return btn
}
-
+
@discardableResult
- open func addButton(_ title:String, backgroundColor:UIColor? = nil, textColor:UIColor? = nil, showDurationStatus:Bool = false, target:AnyObject, selector:Selector)->SCLButton {
- let btn = addButton(title, backgroundColor: backgroundColor, textColor: textColor, showDurationStatus: showDurationStatus)
+ open func addButton(_ title:String, backgroundColor:UIColor? = nil, textColor:UIColor? = nil, showTimeout:SCLButton.ShowTimeoutConfiguration? = nil, target:AnyObject, selector:Selector)->SCLButton {
+ let btn = addButton(title, backgroundColor: backgroundColor, textColor: textColor, showTimeout: showTimeout)
btn.actionType = SCLActionType.selector
btn.target = target
btn.selector = selector
@@ -445,9 +499,9 @@ open class SCLAlertView: UIViewController {
btn.addTarget(self, action:#selector(SCLAlertView.buttonRelease(_:)), for:[.touchUpInside, .touchUpOutside, .touchCancel, .touchDragOutside] )
return btn
}
-
+
@discardableResult
- fileprivate func addButton(_ title:String, backgroundColor:UIColor? = nil, textColor:UIColor? = nil, showDurationStatus:Bool=false)->SCLButton {
+ fileprivate func addButton(_ title:String, backgroundColor:UIColor? = nil, textColor:UIColor? = nil, showTimeout:SCLButton.ShowTimeoutConfiguration? = nil)->SCLButton {
// Update view height
appearance.setkWindowHeight(appearance.kWindowHeight + appearance.kButtonHeight)
// Add button
@@ -458,12 +512,12 @@ open class SCLAlertView: UIViewController {
btn.customBackgroundColor = backgroundColor
btn.customTextColor = textColor
btn.initialTitle = title
- btn.showDurationStatus = showDurationStatus
+ btn.showTimeout = showTimeout
contentView.addSubview(btn)
buttons.append(btn)
return btn
}
-
+
func buttonTapped(_ btn:SCLButton) {
if btn.actionType == SCLActionType.closure {
btn.action()
@@ -473,11 +527,11 @@ open class SCLAlertView: UIViewController {
} else {
print("Unknow action type for button")
}
-
+
if(self.view.alpha != 0.0 && appearance.shouldAutoDismiss){ hideView() }
}
-
-
+
+
func buttonTapDown(_ btn:SCLButton) {
var hue : CGFloat = 0
var saturation : CGFloat = 0
@@ -488,29 +542,29 @@ open class SCLAlertView: UIViewController {
brightness = brightness * CGFloat(pressBrightnessFactor)
btn.backgroundColor = UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)
}
-
+
func buttonRelease(_ btn:SCLButton) {
btn.backgroundColor = btn.customBackgroundColor ?? viewColor
}
-
+
var tmpContentViewFrameOrigin: CGPoint?
var tmpCircleViewFrameOrigin: CGPoint?
var keyboardHasBeenShown:Bool = false
-
+
func keyboardWillShow(_ notification: Notification) {
keyboardHasBeenShown = true
-
+
guard let userInfo = (notification as NSNotification).userInfo else {return}
guard let endKeyBoardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.minY else {return}
-
+
if tmpContentViewFrameOrigin == nil {
- tmpContentViewFrameOrigin = self.contentView.frame.origin
+ tmpContentViewFrameOrigin = self.contentView.frame.origin
}
-
+
if tmpCircleViewFrameOrigin == nil {
- tmpCircleViewFrameOrigin = self.circleBG.frame.origin
+ tmpCircleViewFrameOrigin = self.circleBG.frame.origin
}
-
+
var newContentViewFrameY = self.contentView.frame.maxY - endKeyBoardFrame
if newContentViewFrameY < 0 {
newContentViewFrameY = 0
@@ -519,7 +573,7 @@ open class SCLAlertView: UIViewController {
self.contentView.frame.origin.y -= newContentViewFrameY
self.circleBG.frame.origin.y = newBallViewFrameY
}
-
+
func keyboardWillHide(_ notification: Notification) {
if(keyboardHasBeenShown){//This could happen on the simulator (keyboard will be hidden)
if(self.tmpContentViewFrameOrigin != nil){
@@ -530,97 +584,100 @@ open class SCLAlertView: UIViewController {
self.circleBG.frame.origin.y = self.tmpCircleViewFrameOrigin!.y
self.tmpCircleViewFrameOrigin = nil
}
-
+
keyboardHasBeenShown = false
}
}
-
+
//Dismiss keyboard when tapped outside textfield & close SCLAlertView when hideWhenBackgroundViewIsTapped
func tapped(_ gestureRecognizer: UITapGestureRecognizer) {
self.view.endEditing(true)
-
+
if let tappedView = gestureRecognizer.view , tappedView.hitTest(gestureRecognizer.location(in: tappedView), with: nil) == baseView && appearance.hideWhenBackgroundViewIsTapped {
-
+
hideView()
}
}
-
+
// showCustom(view, title, subTitle, UIColor, UIImage)
- open func showCustom(_ title: String, subTitle: String, color: UIColor, icon: UIImage, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt=SCLAlertViewStyle.success.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
-
-
+ @discardableResult
+ open func showCustom(_ title: String, subTitle: String, color: UIColor, icon: UIImage, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt=SCLAlertViewStyle.success.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+
+
var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0
-
+
color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
-
+
var colorAsUInt32 : UInt32 = 0
colorAsUInt32 += UInt32(red * 255.0) << 16
colorAsUInt32 += UInt32(green * 255.0) << 8
colorAsUInt32 += UInt32(blue * 255.0)
-
+
let colorAsUInt = UInt(colorAsUInt32)
-
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .success, colorStyle: colorAsUInt, colorTextButton: colorTextButton, circleIconImage: icon, animationStyle: animationStyle)
+
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .success, colorStyle: colorAsUInt, colorTextButton: colorTextButton, circleIconImage: icon, animationStyle: animationStyle)
}
-
+
// showSuccess(view, title, subTitle)
@discardableResult
- open func showSuccess(_ title: String, subTitle: String, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt=SCLAlertViewStyle.success.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .success, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showSuccess(_ title: String, subTitle: String, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt=SCLAlertViewStyle.success.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .success, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
+
// showError(view, title, subTitle)
@discardableResult
- open func showError(_ title: String, subTitle: String, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt=SCLAlertViewStyle.error.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .error, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showError(_ title: String, subTitle: String, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt=SCLAlertViewStyle.error.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .error, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
+
// showNotice(view, title, subTitle)
@discardableResult
- open func showNotice(_ title: String, subTitle: String, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt=SCLAlertViewStyle.notice.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .notice, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showNotice(_ title: String, subTitle: String, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt=SCLAlertViewStyle.notice.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .notice, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
+
// showWarning(view, title, subTitle)
@discardableResult
- open func showWarning(_ title: String, subTitle: String, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt=SCLAlertViewStyle.warning.defaultColorInt, colorTextButton: UInt=0x000000, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .warning, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showWarning(_ title: String, subTitle: String, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt=SCLAlertViewStyle.warning.defaultColorInt, colorTextButton: UInt=0x000000, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .warning, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
+
// showInfo(view, title, subTitle)
@discardableResult
- open func showInfo(_ title: String, subTitle: String, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt=SCLAlertViewStyle.info.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .info, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showInfo(_ title: String, subTitle: String, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt=SCLAlertViewStyle.info.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .info, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
+
// showWait(view, title, subTitle)
@discardableResult
- open func showWait(_ title: String, subTitle: String, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt?=SCLAlertViewStyle.wait.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .wait, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showWait(_ title: String, subTitle: String, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt?=SCLAlertViewStyle.wait.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .wait, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
+
@discardableResult
- open func showEdit(_ title: String, subTitle: String, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt=SCLAlertViewStyle.edit.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
- return showTitle(title, subTitle: subTitle, duration: duration, completeText:closeButtonTitle, style: .edit, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showEdit(_ title: String, subTitle: String, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt=SCLAlertViewStyle.edit.defaultColorInt, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ return showTitle(title, subTitle: subTitle, timeout: timeout, completeText:closeButtonTitle, style: .edit, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
+
// showTitle(view, title, subTitle, style)
@discardableResult
- open func showTitle(_ title: String, subTitle: String, style: SCLAlertViewStyle, closeButtonTitle:String?=nil, duration:TimeInterval=0.0, colorStyle: UInt?=0x000000, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
-
- return showTitle(title, subTitle: subTitle, duration:duration, completeText:closeButtonTitle, style: style, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
+ open func showTitle(_ title: String, subTitle: String, style: SCLAlertViewStyle, closeButtonTitle:String?=nil, timeout:SCLTimeoutConfiguration?=nil, colorStyle: UInt?=0x000000, colorTextButton: UInt=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+
+ return showTitle(title, subTitle: subTitle, timeout:timeout, completeText:closeButtonTitle, style: style, colorStyle: colorStyle, colorTextButton: colorTextButton, circleIconImage: circleIconImage, animationStyle: animationStyle)
}
-
- // showTitle(view, title, subTitle, duration, style)
+
+ // showTitle(view, title, subTitle, timeout, style)
@discardableResult
- open func showTitle(_ title: String, subTitle: String, duration: TimeInterval?, completeText: String?, style: SCLAlertViewStyle, colorStyle: UInt?=0x000000, colorTextButton: UInt?=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
+ open func showTitle(_ title: String, subTitle: String, timeout: SCLTimeoutConfiguration?, completeText: String?, style: SCLAlertViewStyle, colorStyle: UInt?=0x000000, colorTextButton: UInt?=0xFFFFFF, circleIconImage: UIImage? = nil, animationStyle: SCLAnimationStyle = .topToBottom) -> SCLAlertViewResponder {
selfReference = self
view.alpha = 0
+ view.tag = uniqueTag
+ view.accessibilityIdentifier = uniqueAccessibilityIdentifier
let rv = UIApplication.shared.keyWindow! as UIWindow
rv.addSubview(view)
view.frame = rv.bounds
baseView.frame = rv.bounds
-
+
// Alert colour/icon
viewColor = UIColor()
var iconImage: UIImage?
@@ -629,38 +686,43 @@ open class SCLAlertView: UIViewController {
// Icon style
switch style {
case .success:
-
+
iconImage = checkCircleIconImage(circleIconImage, defaultImage: SCLAlertViewStyleKit.imageOfCheckmark)
-
+
case .error:
-
+
iconImage = checkCircleIconImage(circleIconImage, defaultImage: SCLAlertViewStyleKit.imageOfCross)
-
+
case .notice:
-
+
iconImage = checkCircleIconImage(circleIconImage, defaultImage:SCLAlertViewStyleKit.imageOfNotice)
-
+
case .warning:
-
+
iconImage = checkCircleIconImage(circleIconImage, defaultImage:SCLAlertViewStyleKit.imageOfWarning)
-
+
case .info:
-
+
iconImage = checkCircleIconImage(circleIconImage, defaultImage:SCLAlertViewStyleKit.imageOfInfo)
-
+
case .edit:
-
+
iconImage = checkCircleIconImage(circleIconImage, defaultImage:SCLAlertViewStyleKit.imageOfEdit)
-
+
case .wait:
iconImage = nil
+
+ case .question:
+ iconImage = checkCircleIconImage(circleIconImage, defaultImage:SCLAlertViewStyleKit.imageOfQuestion)
}
-
+
// Title
if !title.isEmpty {
self.labelTitle.text = title
+ let actualHeight = title.heightWithConstrainedWidth(width: appearance.kWindowWidth - 24, font: self.labelTitle.font)
+ self.labelTitle.frame = CGRect(x:12, y:appearance.kTitleTop, width: appearance.kWindowWidth - 24, height:actualHeight)
}
-
+
// Subtitle
if !subTitle.isEmpty {
viewText.text = subTitle
@@ -675,16 +737,16 @@ open class SCLAlertView: UIViewController {
appearance.setkTextHeight(ht)
}
}
-
+
// Done button
if appearance.showCloseButton {
_ = addButton(completeText ?? "Done", target:self, selector:#selector(SCLAlertView.hideView))
}
-
+
//hidden/show circular view based on the ui option
circleView.isHidden = !appearance.showCircularIcon
circleBG.isHidden = !appearance.showCircularIcon
-
+
// Alert view colour and images
circleView.backgroundColor = viewColor
// Spinner / icon
@@ -707,15 +769,15 @@ open class SCLAlertView: UIViewController {
circleIconView!.frame = CGRect( x: x, y: x, width: appearance.kCircleIconHeight, height: appearance.kCircleIconHeight)
circleIconView?.layer.cornerRadius = circleIconView!.bounds.height / 2
circleIconView?.layer.masksToBounds = true
-
+
for txt in inputs {
txt.layer.borderColor = viewColor.cgColor
}
-
+
for txt in input {
txt.layer.borderColor = viewColor.cgColor
}
-
+
for btn in buttons {
if let customBackgroundColor = btn.customBackgroundColor {
// Custom BackgroundColor set
@@ -724,7 +786,7 @@ open class SCLAlertView: UIViewController {
// Use default BackgroundColor derived from AlertStyle
btn.backgroundColor = viewColor
}
-
+
if let customTextColor = btn.customTextColor {
// Custom TextColor set
btn.setTitleColor(customTextColor, for:UIControlState())
@@ -733,101 +795,145 @@ open class SCLAlertView: UIViewController {
btn.setTitleColor(UIColorFromRGB(colorTextButton ?? 0xFFFFFF), for:UIControlState())
}
}
-
- // Adding duration
- if duration > 0 {
- self.duration = duration
- durationTimer?.invalidate()
- durationTimer = Timer.scheduledTimer(timeInterval: self.duration, target: self, selector: #selector(SCLAlertView.hideView), userInfo: nil, repeats: false)
- durationStatusTimer?.invalidate()
- durationStatusTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(SCLAlertView.updateDurationStatus), userInfo: nil, repeats: true)
+
+ // Adding timeout
+ if let timeout = timeout {
+ self.timeout = timeout
+ timeoutTimer?.invalidate()
+ timeoutTimer = Timer.scheduledTimer(timeInterval: timeout.value, target: self, selector: #selector(SCLAlertView.hideViewTimeout), userInfo: nil, repeats: false)
+ showTimeoutTimer?.invalidate()
+ showTimeoutTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(SCLAlertView.updateShowTimeout), userInfo: nil, repeats: true)
}
-
+
// Animate in the alert view
self.showAnimation(animationStyle)
-
+
// Chainable objects
return SCLAlertViewResponder(alertview: self)
}
-
+
// Show animation in the alert view
fileprivate func showAnimation(_ animationStyle: SCLAnimationStyle = .topToBottom, animationStartOffset: CGFloat = -400.0, boundingAnimationOffset: CGFloat = 15.0, animationDuration: TimeInterval = 0.2) {
-
+
let rv = UIApplication.shared.keyWindow! as UIWindow
var animationStartOrigin = self.baseView.frame.origin
var animationCenter : CGPoint = rv.center
-
+
switch animationStyle {
case .noAnimation:
self.view.alpha = 1.0
return;
-
+
case .topToBottom:
animationStartOrigin = CGPoint(x: animationStartOrigin.x, y: self.baseView.frame.origin.y + animationStartOffset)
animationCenter = CGPoint(x: animationCenter.x, y: animationCenter.y + boundingAnimationOffset)
-
+
case .bottomToTop:
animationStartOrigin = CGPoint(x: animationStartOrigin.x, y: self.baseView.frame.origin.y - animationStartOffset)
animationCenter = CGPoint(x: animationCenter.x, y: animationCenter.y - boundingAnimationOffset)
-
+
case .leftToRight:
animationStartOrigin = CGPoint(x: self.baseView.frame.origin.x + animationStartOffset, y: animationStartOrigin.y)
animationCenter = CGPoint(x: animationCenter.x + boundingAnimationOffset, y: animationCenter.y)
-
+
case .rightToLeft:
animationStartOrigin = CGPoint(x: self.baseView.frame.origin.x - animationStartOffset, y: animationStartOrigin.y)
animationCenter = CGPoint(x: animationCenter.x - boundingAnimationOffset, y: animationCenter.y)
}
self.baseView.frame.origin = animationStartOrigin
- UIView.animate(withDuration: animationDuration, animations: {
- self.view.alpha = 1.0
- self.baseView.center = animationCenter
+
+ if self.appearance.dynamicAnimatorActive {
+ UIView.animate(withDuration: animationDuration, animations: {
+ self.view.alpha = 1.0
+ })
+ self.animate(item: self.baseView, center: rv.center)
+ } else {
+ UIView.animate(withDuration: animationDuration, animations: {
+ self.view.alpha = 1.0
+ self.baseView.center = animationCenter
}, completion: { finished in
UIView.animate(withDuration: animationDuration, animations: {
self.view.alpha = 1.0
self.baseView.center = rv.center
})
- })
+ })
+ }
+ }
+
+ // DynamicAnimator function
+ var animator : UIDynamicAnimator?
+ var snapBehavior : UISnapBehavior?
+
+ fileprivate func animate(item : UIView , center: CGPoint) {
+
+ if let snapBehavior = self.snapBehavior {
+ self.animator?.removeBehavior(snapBehavior)
+ }
+
+ self.animator = UIDynamicAnimator.init(referenceView: self.view)
+ let tempSnapBehavior = UISnapBehavior.init(item: item, snapTo: center)
+ self.animator?.addBehavior(tempSnapBehavior)
+ self.snapBehavior? = tempSnapBehavior
}
-
- open func updateDurationStatus() {
- duration = duration.advanced(by: -1)
- for btn in buttons.filter({$0.showDurationStatus}) {
- let txt = "\(btn.initialTitle) (\(duration))"
+
+ //
+ open func updateShowTimeout() {
+
+ guard let timeout = self.timeout else {
+ return
+ }
+
+ self.timeout?.value = timeout.value.advanced(by: -1)
+
+ for btn in buttons {
+ guard let showTimeout = btn.showTimeout else {
+ continue
+ }
+
+ let timeoutStr: String = showTimeout.prefix + String(Int(timeout.value)) + showTimeout.suffix
+ let txt = String(btn.initialTitle) + " " + timeoutStr
btn.setTitle(txt, for: UIControlState())
+
}
+
}
-
+
// Close SCLAlertView
open func hideView() {
UIView.animate(withDuration: 0.2, animations: {
self.view.alpha = 0
- }, completion: { finished in
-
- //Stop durationTimer so alertView does not attempt to hide itself and fire it's dimiss block a second time when close button is tapped
- self.durationTimer?.invalidate()
- // Stop StatusTimer
- self.durationStatusTimer?.invalidate()
-
- if(self.dismissBlock != nil) {
- // Call completion handler when the alert is dismissed
- self.dismissBlock!()
- }
-
- // This is necessary for SCLAlertView to be de-initialized, preventing a strong reference cycle with the viewcontroller calling SCLAlertView.
- for button in self.buttons {
- button.action = nil
- button.target = nil
- button.selector = nil
- }
-
- self.view.removeFromSuperview()
- self.selfReference = nil
+ }, completion: { finished in
+
+ // Stop timeoutTimer so alertView does not attempt to hide itself and fire it's dimiss block a second time when close button is tapped
+ self.timeoutTimer?.invalidate()
+
+ // Stop showTimeoutTimer
+ self.showTimeoutTimer?.invalidate()
+
+ if let dismissBlock = self.dismissBlock {
+ // Call completion handler when the alert is dismissed
+ dismissBlock()
+ }
+
+ // This is necessary for SCLAlertView to be de-initialized, preventing a strong reference cycle with the viewcontroller calling SCLAlertView.
+ for button in self.buttons {
+ button.action = nil
+ button.target = nil
+ button.selector = nil
+ }
+
+ self.view.removeFromSuperview()
+ self.selfReference = nil
})
}
-
+
+ open func hideViewTimeout() {
+ self.timeout?.action()
+ self.hideView()
+ }
+
func checkCircleIconImage(_ circleIconImage: UIImage?, defaultImage: UIImage) -> UIImage {
if let image = circleIconImage {
return image
@@ -835,15 +941,27 @@ open class SCLAlertView: UIViewController {
return defaultImage
}
}
+
+ //Return true if a SCLAlertView is already being shown, false otherwise
+ open func isShowing() -> Bool {
+ if let subviews = UIApplication.shared.keyWindow?.subviews {
+ for view in subviews {
+ if view.tag == uniqueTag && view.accessibilityIdentifier == uniqueAccessibilityIdentifier {
+ return true
+ }
+ }
+ }
+ return false
+ }
}
// Helper function to convert from RGB to UIColor
func UIColorFromRGB(_ rgbValue: UInt) -> UIColor {
return UIColor(
- red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
- green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
- blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
- alpha: CGFloat(1.0)
+ red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
+ green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
+ blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
+ alpha: CGFloat(1.0)
)
}
@@ -853,7 +971,7 @@ func UIColorFromRGB(_ rgbValue: UInt) -> UIColor {
// ------------------------------------
class SCLAlertViewStyleKit : NSObject {
-
+
// Cache
struct Cache {
static var imageOfCheckmark: UIImage?
@@ -868,13 +986,15 @@ class SCLAlertViewStyleKit : NSObject {
static var infoTargets: [AnyObject]?
static var imageOfEdit: UIImage?
static var editTargets: [AnyObject]?
+ static var imageOfQuestion: UIImage?
+ static var questionTargets: [AnyObject]?
}
-
+
// Initialization
/// swift 1.2 abolish func load
// override class func load() {
// }
-
+
// Drawing Methods
class func drawCheckmark() {
// Checkmark Shape Drawing
@@ -892,11 +1012,11 @@ class SCLAlertViewStyleKit : NSObject {
checkmarkShapePath.addCurve(to: CGPoint(x: 73.25, y: 14.05), controlPoint1: CGPoint(x: 75.52, y: 20.75), controlPoint2: CGPoint(x: 75.7, y: 16.65))
checkmarkShapePath.close()
checkmarkShapePath.miterLimit = 4;
-
+
UIColor.white.setFill()
checkmarkShapePath.fill()
}
-
+
class func drawCross() {
// Cross Shape Drawing
let crossShapePath = UIBezierPath()
@@ -910,7 +1030,7 @@ class SCLAlertViewStyleKit : NSObject {
crossShapePath.lineWidth = 14
crossShapePath.stroke()
}
-
+
class func drawNotice() {
// Notice Shape Drawing
let noticeShapePath = UIBezierPath()
@@ -943,15 +1063,15 @@ class SCLAlertViewStyleKit : NSObject {
noticeShapePath.addCurve(to: CGPoint(x: 72, y: 48.54), controlPoint1: CGPoint(x: 71.81, y: 51.29), controlPoint2: CGPoint(x: 72, y: 49.72))
noticeShapePath.close()
noticeShapePath.miterLimit = 4;
-
+
UIColor.white.setFill()
noticeShapePath.fill()
}
-
+
class func drawWarning() {
// Color Declarations
let greyColor = UIColor(red: 0.236, green: 0.236, blue: 0.236, alpha: 1.000)
-
+
// Warning Group
// Warning Circle Drawing
let warningCirclePath = UIBezierPath()
@@ -966,11 +1086,11 @@ class SCLAlertViewStyleKit : NSObject {
warningCirclePath.addCurve(to: CGPoint(x: 40.94, y: 63.39), controlPoint1: CGPoint(x: 44.53, y: 64.18), controlPoint2: CGPoint(x: 42.83, y: 63.39))
warningCirclePath.close()
warningCirclePath.miterLimit = 4;
-
+
greyColor.setFill()
warningCirclePath.fill()
-
-
+
+
// Warning Shape Drawing
let warningShapePath = UIBezierPath()
warningShapePath.move(to: CGPoint(x: 46.23, y: 4.26))
@@ -986,15 +1106,15 @@ class SCLAlertViewStyleKit : NSObject {
warningShapePath.addCurve(to: CGPoint(x: 46.23, y: 4.26), controlPoint1: CGPoint(x: 48.5, y: 7.01), controlPoint2: CGPoint(x: 47.74, y: 5.44))
warningShapePath.close()
warningShapePath.miterLimit = 4;
-
+
greyColor.setFill()
warningShapePath.fill()
}
-
+
class func drawInfo() {
// Color Declarations
let color0 = UIColor(red: 1.000, green: 1.000, blue: 1.000, alpha: 1.000)
-
+
// Info Shape Drawing
let infoShapePath = UIBezierPath()
infoShapePath.move(to: CGPoint(x: 45.66, y: 15.96))
@@ -1016,11 +1136,11 @@ class SCLAlertViewStyleKit : NSObject {
color0.setFill()
infoShapePath.fill()
}
-
+
class func drawEdit() {
// Color Declarations
let color = UIColor(red:1.0, green:1.0, blue:1.0, alpha:1.0)
-
+
// Edit shape Drawing
let editPathPath = UIBezierPath()
editPathPath.move(to: CGPoint(x: 71, y: 2.7))
@@ -1063,7 +1183,36 @@ class SCLAlertViewStyleKit : NSObject {
color.setFill()
editPathPath.fill()
}
-
+
+ class func drawQuestion() {
+ // Color Declarations
+ let color = UIColor(red: CGFloat(1.0), green: CGFloat(1.0), blue: CGFloat(1.0), alpha: CGFloat(1.0))
+ // Questionmark Shape Drawing
+ let questionShapePath = UIBezierPath()
+ questionShapePath.move(to: CGPoint(x: CGFloat(33.75), y: CGFloat(54.1)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(44.15), y: CGFloat(54.1)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(44.15), y: CGFloat(47.5)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(51.85), y: CGFloat(37.2)), controlPoint1: CGPoint(x: CGFloat(44.15), y: CGFloat(42.9)), controlPoint2: CGPoint(x: CGFloat(46.75), y: CGFloat(41.2)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(61.95), y: CGFloat(19.9)), controlPoint1: CGPoint(x: CGFloat(59.05), y: CGFloat(31.6)), controlPoint2: CGPoint(x: CGFloat(61.95), y: CGFloat(28.5)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(41.45), y: CGFloat(2.8)), controlPoint1: CGPoint(x: CGFloat(61.95), y: CGFloat(7.6)), controlPoint2: CGPoint(x: CGFloat(52.85), y: CGFloat(2.8)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(25.05), y: CGFloat(5.8)), controlPoint1: CGPoint(x: CGFloat(34.75), y: CGFloat(2.8)), controlPoint2: CGPoint(x: CGFloat(29.65), y: CGFloat(3.8)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(25.05), y: CGFloat(14.4)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(38.15), y: CGFloat(12.3)), controlPoint1: CGPoint(x: CGFloat(29.15), y: CGFloat(13.2)), controlPoint2: CGPoint(x: CGFloat(32.35), y: CGFloat(12.3)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(49.65), y: CGFloat(20.8)), controlPoint1: CGPoint(x: CGFloat(45.65), y: CGFloat(12.3)), controlPoint2: CGPoint(x: CGFloat(49.65), y: CGFloat(14.4)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(43.65), y: CGFloat(31.7)), controlPoint1: CGPoint(x: CGFloat(49.65), y: CGFloat(26)), controlPoint2: CGPoint(x: CGFloat(47.95), y: CGFloat(28.4)))
+ questionShapePath.addCurve(to: CGPoint(x: CGFloat(33.75), y: CGFloat(46.6)), controlPoint1: CGPoint(x: CGFloat(37.15), y: CGFloat(36.9)), controlPoint2: CGPoint(x: CGFloat(33.75), y: CGFloat(39.7)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(33.75), y: CGFloat(54.1)))
+ questionShapePath.close()
+ questionShapePath.move(to: CGPoint(x: CGFloat(33.15), y: CGFloat(75.4)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(45.35), y: CGFloat(75.4)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(45.35), y: CGFloat(63.7)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(33.15), y: CGFloat(63.7)))
+ questionShapePath.addLine(to: CGPoint(x: CGFloat(33.15), y: CGFloat(75.4)))
+ questionShapePath.close()
+ color.setFill()
+ questionShapePath.fill()
+ }
+
// Generated Images
class var imageOfCheckmark: UIImage {
if (Cache.imageOfCheckmark != nil) {
@@ -1075,7 +1224,7 @@ class SCLAlertViewStyleKit : NSObject {
UIGraphicsEndImageContext()
return Cache.imageOfCheckmark!
}
-
+
class var imageOfCross: UIImage {
if (Cache.imageOfCross != nil) {
return Cache.imageOfCross!
@@ -1086,7 +1235,7 @@ class SCLAlertViewStyleKit : NSObject {
UIGraphicsEndImageContext()
return Cache.imageOfCross!
}
-
+
class var imageOfNotice: UIImage {
if (Cache.imageOfNotice != nil) {
return Cache.imageOfNotice!
@@ -1097,7 +1246,7 @@ class SCLAlertViewStyleKit : NSObject {
UIGraphicsEndImageContext()
return Cache.imageOfNotice!
}
-
+
class var imageOfWarning: UIImage {
if (Cache.imageOfWarning != nil) {
return Cache.imageOfWarning!
@@ -1108,7 +1257,7 @@ class SCLAlertViewStyleKit : NSObject {
UIGraphicsEndImageContext()
return Cache.imageOfWarning!
}
-
+
class var imageOfInfo: UIImage {
if (Cache.imageOfInfo != nil) {
return Cache.imageOfInfo!
@@ -1119,7 +1268,7 @@ class SCLAlertViewStyleKit : NSObject {
UIGraphicsEndImageContext()
return Cache.imageOfInfo!
}
-
+
class var imageOfEdit: UIImage {
if (Cache.imageOfEdit != nil) {
return Cache.imageOfEdit!
@@ -1130,4 +1279,15 @@ class SCLAlertViewStyleKit : NSObject {
UIGraphicsEndImageContext()
return Cache.imageOfEdit!
}
-}
+
+ class var imageOfQuestion: UIImage {
+ if (Cache.imageOfQuestion != nil) {
+ return Cache.imageOfQuestion!
+ }
+ UIGraphicsBeginImageContextWithOptions(CGSize(width: 80, height: 80), false, 0)
+ SCLAlertViewStyleKit.drawQuestion()
+ Cache.imageOfQuestion = UIGraphicsGetImageFromCurrentImageContext()
+ UIGraphicsEndImageContext()
+ return Cache.imageOfQuestion!
+ }
+}
\ No newline at end of file
diff --git a/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLExtensions.swift b/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLExtensions.swift
index 58ebb95..5ace67b 100644
--- a/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLExtensions.swift
+++ b/GeneralUtils/GeneralUtils/libs/SCLAlertView/SCLExtensions.swift
@@ -9,33 +9,45 @@
import UIKit
extension Int {
-
+
func toUIColor() -> UIColor {
return UIColor(
- red: CGFloat((self & 0xFF0000) >> 16) / 255.0,
- green: CGFloat((self & 0x00FF00) >> 8) / 255.0,
- blue: CGFloat(self & 0x0000FF) / 255.0,
- alpha: CGFloat(1.0)
+ red: CGFloat((self & 0xFF0000) >> 16) / 255.0,
+ green: CGFloat((self & 0x00FF00) >> 8) / 255.0,
+ blue: CGFloat(self & 0x0000FF) / 255.0,
+ alpha: CGFloat(1.0)
)
}
-
+
func toCGColor() -> CGColor {
return self.toUIColor().cgColor
}
}
extension UInt {
-
+
func toUIColor() -> UIColor {
return UIColor(
- red: CGFloat((self & 0xFF0000) >> 16) / 255.0,
- green: CGFloat((self & 0x00FF00) >> 8) / 255.0,
- blue: CGFloat(self & 0x0000FF) / 255.0,
- alpha: CGFloat(1.0)
+ red: CGFloat((self & 0xFF0000) >> 16) / 255.0,
+ green: CGFloat((self & 0x00FF00) >> 8) / 255.0,
+ blue: CGFloat(self & 0x0000FF) / 255.0,
+ alpha: CGFloat(1.0)
)
}
-
+
func toCGColor() -> CGColor {
return self.toUIColor().cgColor
}
}
+
+extension String {
+
+ func heightWithConstrainedWidth(width: CGFloat, font: UIFont) -> CGFloat {
+ let constraintRect = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
+
+ let boundingBox = self.boundingRect(with: constraintRect, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
+
+ return boundingBox.height
+ }
+
+}
\ No newline at end of file
diff --git a/Morooka.xcworkspace/xcuserdata/ptran.xcuserdatad/UserInterfaceState.xcuserstate b/Morooka.xcworkspace/xcuserdata/ptran.xcuserdatad/UserInterfaceState.xcuserstate
index f2ff4622d56eb8a9b16627c9f9f92bf2f62d39c7..c1b45af1f47e75cf25d5737d9840390357a84420 100644
GIT binary patch
delta 10901
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