From 7de01c12b701e1a186d004c6629f1e436e9b5cd3 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Thu, 24 May 2018 09:54:49 -0300 Subject: [PATCH 01/17] adicionando diagrama de sequencia e atualizando as carteiras aceitas --- README.md | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a817d64..af724a8 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,37 @@ -## Biblioteca ainda em versão alpha. Não usar em ambiente de produção. - # ya-arquivo-remessa -Biblioteca para geração de arquivos de remessa. +### Versão 0.3 + +* Biblioteca para geração de arquivos de remessa. + | Banco | Carteira | done? | |------------- | -------------| -------------| -| Bradesco | 09 | X +| Bradesco | 09 | X | +| Banco do Brasil | 17 | X | +| SICOOB | +| CEF | + +###Sequence Diagram + +```seq +Ator->RemessaFactory: chama create() +RemessaFactory->Validator: run() +Validator-->Validator: compara dados\n obrigatorios +Validator-->Ator: throw exception dados obrigatorios +RemessaFactory-->RemessaFactory: Valida caminho\n do arquivo +RemessaFactory-->Ator: thow exception caminho\n invalido ou acesso negado +RemessaFactory-->RemessaFactory: configure() define build de\n acordo com banco +RemessaFactory-->Ator: throw exception \nbanco nao localizado +RemessaFactory-->RemessaFactory: build() chamada ao builder +RemessaFactory->(BB/CEF/BRADESCO)\nBuilder: builder() +(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: preenche dados do header +(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: preenche dados do trailler +(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: preenche dados do detalhe/transacao +(BB/CEF/BRADESCO)\nBuilder-->RemessaFactory: retorna (BB/CEF/BRADESCO)\nBuilder +RemessaFactory->(BB/CEF/BRADESCO)\nBuilder: montarArquivo() +(BB/CEF/BRADESCO)\nBuilder-->Ator: throw exception sem acesso ao arquivo +(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: monta arquivo\nde remessa +(BB/CEF/BRADESCO)\nBuilder->RemessaFactory: string caminho do arquivo; +RemessaFactory->Ator: retorna string caminho do arquivo +``` \ No newline at end of file From be415508db248b521852d4e3387f2732e03d5fc4 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Thu, 24 May 2018 10:18:08 -0300 Subject: [PATCH 02/17] imagem diagrama de sequencia --- sequenceDiagram.png | Bin 0 -> 60201 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sequenceDiagram.png diff --git a/sequenceDiagram.png b/sequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cebbc564782299a576997ee30bbc1874ba4cb3 GIT binary patch literal 60201 zcmcG01yqz>+wNG1k|QG0G7=KfCHbO5m$WoUiR91?DxJ~|N=gk%*9;BP(#_D#&M_jO?l;?pz$(CXD7S`E;GX(3vq-t2o2CjC=G#x)D-BlB#p&B;4n_z z&Qf{yUTd|U+|lBsnKEfu$@qlGs7fE-!c2@K<($8%>F&c3s%OEkyz!FslhfIurER@g zt2r{g4eftfOfd=#H$&4*iD6H=yvZ~a)-uq%|7+E|z_(x5*T=VjZzFDcN$l|?d|5E|oAJ&6#OZCGs7VxW9|q-n z^H%QFV*$Il3O1`TjV78#jAtVTvFmL&rXlhMu3x`ehb}I1yM4JXEq)$>I*riQg8BR0 zV0>?OZ?1QV=B|UpFBj~t#_Xu|MLFLz9tt-eM%|o7mBVjm$V8<+2AaPj5<4|AHePsJ z=uRbmy&olheY&J9c4j&j(Bwnwwby*H+j!H?;R72B5V;Zq&e7hScIxWtma{K+?Hy*` z=vj#h2w-XlyluxSsme01wk?3`ucLg9vZZ%&E6u}2F*AQAW}7wl_({n}p$qV2CE zc2gC#Ri)43@LIqVKW!$W@fD8R7`WaZxL&opHV3RU%{=S1P-;nCF2Ed@`d$s(Tnwe_M(MqML6?Y;DSVfDpWJM=D zcvTZ#5;a!kO!Kn^qsE68t@b)bk4@wiKFSW6@jM0>h?JDz!R78>#7u1LWPePB!0JXS zuU^}g>ebjgdMhJrK9Yb(e=U(N=W7(H>*k7)W{_xP6I2&i)oSlDnq^lOmir}s+A+_5 zUC;e*va{Dbhd74S)^p{!?>`O7O^g2&DJFo^bp6Ms!|1M?Y_vw2|_L>;{ zV2nHs)=!I+OAM$oi9P3jh(}&6`9hkN&F<~n-NXpU@H5DJz3^%nE#qm9hPOU%f(1`u zNbm!?yU!tu^!L^()TqEq;lK716gUpvy64mww*aCPiy#TTfyN@ zdY?Qhg_~O{{-Hpxb*sSaGv}>8&$vJTl?0=Ca=jdTcW;6-4;KWwKNfFErzeeOb6fM( zwO$^%In9hd8Jh4|FNCvH?C3xhwJm!Nm(ilQ94~oL-;@hV52l=URDPZ>XNriy=Wk9I zcgeWP6$sT4EW-`pJWFdkdPQLYdw{`?L066C*Z* zYp7QWm_p7AfBZg36E!3EG01~I`xyFK7isr%)~c4Iri@vR&u4`~QKsrQT`mhsb&k21>1cPm zfW5Gc;2))7o)XcknlT=F%~O3vnj}ICr!gGf4#K>rPnXR9Bz^Ik4?lM{)7g9WlRWz9 zO+9(e@zJB&`H_wNmyx>`{TU8s@4(>by@R|^o5J!5zI!CACx~G0@nf$k=Jm=k>z0}V z&byYPV&EBGGqoK==c9Szg-sry$8lqIBq!+gmKxsh!MAC~IbZV1hF_o2r6T3jB~8wr zJcqE~<*R!>MG`1fGI^S^Ka*V3jnKE6M9eq|y>Nx=ko-~!s{278F!{hhfuh3=+Rs^z zd?caCP{lLlknH(cNTaR!o8uDw&yHEA=qJ0?xzBNcxr5mq{{oqEyyt;oR!OO$(yE*{ z*Lc4}aeH}*)O$ctfU1TLd|byI^UVJCoM{zt@vy#fh3CxA@w&CoJakZ$iwEkAu7r0M z?`zAvcLDFZ9=R!Mv{gIgudBV8?tlVHmt+3P^9X@SWIp@XObb91GVG z?xK=1Wh$_9kDO-sWk>nhNuM639$eE|>us2DqVlf0R(~Hy z#w%ZEn?nh2^JVlXkK@I4;OYr7pVoF~XlSFyH8QKN@p`L~G0V<-OIP~We*VCHTCcyL zhF6#bPzQa z7-e&-tFidQ9(lY&M_z$OH; ze3FpBp+{+V-oG;J*fY+5LN!r>7v>m7cD-?f_{r&uLLHq0mg14w+Q4_OK~HTCx=VJb zZD$3mZ-zewCrJ5j*GD*)tGm@oM zy}GGiFatrvdZ|AGPafL~>JH&0`&opCxh;y#mNGT!-D(Nmp}b5eQ13YlbXT+ zawD%bn1r!Mw4IA0&w0ca3rw+#oUEhYmF>sK6Q!rM36?T+J3oJvHSrTL=d9SFlt)Gj z>}30&CRU02yiw6&fHT}%(@U{cjev*q71)t~c4SvzVw0M^;3uL|a{w+IQ}Uh4Xy3^g zjOWyV!kIe_d0@NKG*V%&OlE$z>K*Siog79X#qDzvU9%~6R3h?H6VgF8i`pm~6YGSI*}7gO zx_sUBs_*beD|bjk92bMlF7mSj$t}w&@ZJ-RXDr}~nh%MrCoQh_9pYu*_?PM%=+p?5 z`Rx(|h)!m}pq9kf)3*u@g+43_9t%u*W zDM8gadDy~u^V~4q$!EEE0%%);pj0a@ttScWaN7v9S(31~yN%<>`^YB)sF|mcbC!5y zT0yM~=g08@?T+JUYr-I1*V0TwJrQ3=N8TKs^Bc_AtQ9MseBxMO>v56AYGUc!ECpfp zm|dD7RfO4Gt(V7jZ+vCng4@Pr_i^7sg_Qx&SmnxDZdf&cVC#bY(pY=l!G098>^Zgf{j{zI^(4+D34}5X#XZYcnhRBAKd9DxP*g2ZVC8?hi55CI? z)|N0*|B`-IERkMt4Ebn+7&(A)d;90yz_-R?m5em z@VUdcU%&{Y=+h)ray|2&j!9~E+4BnA=V_3zF5)c;37%-6KFuRm4I)@Pemh&+O}$F$tL5P}tgT*jThss(kf|Dc)9pAX{pcp4Vo zFModNwVNXX3fgsxd7ny9h}oKW^cvT={a6}>+)d^6EUDk&(1$=`0@v#YN$kRv&sdn; zLVMFgdh#q&3WIH!73?f*%at~w3jearmk}5Sx}P=pJYag3d|Lcfkmh+TBX{+Mw(PW3 zNf&O|%-ZO)pUB_srw8SGf2jdBYxN7Rbe&G|Rw^hQMro38q zsO9f3?+LJRC{T)i6iwlGt(Rj|RQrkGiy?NnU`ULKLLF6XZ72<6!dX~(E8XX&kY8@N zsD)dJiWz%IRkTbQh+d}-ewm}Ich`o?np_rdM+%2+7SzzvlBhhSR%p(c4xe-KHhE_%XIN^#7f0?- z)%1^B+_Tq=+;ncG)r}3G>OKT)<$)oq9Q(UY_T8C2B0PcyEu5RD zL$!wiG=^_8ESrL~!$B_PD@wNo5QouO6zwlr_cGLhRqNB2CI;} z7dxwk;jsrKo1T#2L$i2j?q-M+c@S)tODg#SeBQa3GD@P? zfin+;H)hzP2%UW6@DCvCYFgYKeLsH)S|GYNipp>Yx*GyIBlhl zC6Qmr3~Pa9gRru4SU*hM?x^%aM_6%}L}{N*O^o z(Hrhr2LwzuxtU~iJtAF6_BiROWU+Ry9>MJjTs_DnVCG5Gr^Q}s^$UU})Th)fI}*uH zbL}{714~xYe2iSZ=*1|~r?y83J91YD3h#U0amcKnQJ5MW&wF>L($|}sqNOyl*ualz z&_oP;_=3ld_NB;$*L%^+Nej26lF_iR`$;8~17hMacf>9(>4i2eGL^$4ta<>1q$$ml z3P&Lv4~LS^?hmxpi4LqFk~uJL6aI^w%&;)&mxF6xR+(&3 z%N+3Kul~BnezEK6H#QM##X`s8*A_Vl-YS}0Pp!MQGw!vUPSl5a6tgmNEQd2Whj^oy zx}%GU<4%%!Om$H|$8;VpmoR|{B|tVQ@$(ecE5&~g@r?&DYS$%2F^$!fd(4_7ug!`Z z?>eb5Hl%UWv4RJ)NZbOyK5~s{;aU7gIy^sYqDRrO&Lz+)b6?RcKj5JC&I!5#9Z+e} z(i4bQ{7qq3z2*5TqhEDi_u2g9=Nus4RF0T++{1XINVp(F`T{F?E$I(97{Ifsdol7{ zcAYl0qV87t>KydPJZFVAe#tGP7C`dx`Pe&OT3wA%B~M{I8afo`olaJ`ThAyzWG=VM zOk$vv@%4Bj^1=LF34kE;W17I+oNSXx;|sq?G7QhtBQ=Pb5~`}<{L=j}&o`{U?Ewdq z@^25lpu6@l^VmF1GqTuylln?I~3r(LdmfIUOyc*R)9>j-{arDg{|EQ>*Pz*FBAwJ!_f1*KQ{-a=mg+1^_+|mhpA+e5@K-Syy*X=DSbUcwW>fw51c- znut8g)lLK{7pej9WsL7ncXzk09pV_^?8E>TuN;2QFL-^{73IAUKxW{vkt=}mavZB{ zQd?X}G*lWs+NnnQ?6;Fy=;QriEp0eB-zqIFDbY^g+tL9k@rn%oO{T_T`6v*m$y6p3 z`>r_2u_OWrq!5UmgCNlV_tPTKd}r}33ZQ8t#;=c~H2-!e+KKxG#{m`|wLb64UFHS9 zB>Z6Y7JgB`^aCHbE|Mk&A|iuwCK~YGdG`D=EPJW)RAR1{D;kq4@7w z=%vhkqglyC+LbjWq;VP7$nqIXtbQ_)>nC3tIw;S}9|Yx4(`VRFsLJ#V6hfTXhKXC8 zhRvNGyaS-WTr>I7;+&Yv@Mu%{GMb?1)5}@TpLfYlzA+4GET+Wpu;VlJPVZN)JkW(d z7cLenH0ioZLbg{elJP^~{$XH@7;7y~&Qb;`mm} z?jsI1Pe|6TRz&njomy@7;xo(OA0dcuzlQU+&f&7Aq*7;s5_9mlOo5V*?=x;bB~pAT zwA8SzRMB&SvK(K%rmsYwBm0UOAM#XI( zaOqrhJ-_4BAA%yE?u3#Yiitx_z3PHD|Ki!gB7^I=U;1zT-npH$Gs)7Ivh->V=(2s> z*T+PPTILLx*gub;z4+yY!O~0CVFpw>pSg@LB1hzop;GF+W*=ai!n0ic7jQ}xUd{Sx zV-WhuI^`%v= zxFsaEQ~1iGfX}i-*f?zVWi7D+vm!mMOE=JgdDGUU#qSHRIlb+k!TYi$Uafpz;6FyF z(pQcZ7WA}{#-`3nTObov-xVlTIwzlZTuJ_(&Hm(_F1dl!C9fsMvxV1l%~mO*!|vF) z&nZps_@sZF=H`{&dRkxl3TR&B9`FtbT)pypmMS)a>lh=l8tBAoElY*p>)A_wWbGDYQy2Guckmiu;O<*uiz6W2T`&=b5$fXmK+F zb4hYjf!vCxmG^PLbN{b_nRux9I!hwrC%K9AQaiHj{tJY^50za%qIUebf8%B1L>eia z=W_ivvAXGxg}6G2)H!lvF-~}au6e?m>MDf+-0UlvL}pzKmu+A~{F9LOV7AW96sg&1 zA49DYW9q%2GVr}R zuB_zinYuw)f+h$|LiduANTk^)N0!cL$}61T8}?V_NynH?7Rv*@5d8l2@xrgJXUEfm zHX(J~{bn%}$|EG~zI*q5_bv|y8uvRW%h`b<)O?$Ss{b1!e=~9l=uB7PNb&*Iz=OQF z18-V)pcZ9BOE2liwG2c-KX0W!z0;W&Gk_ttn*=$0&Uy?poaulkmAih9S=_xw@A|Cr zF#Vu$lTz2HwCh@2T%^5Tpfx~xxj$LKj>r#>y=PiZIK0f91a1L1`#03Ht6=_F+0{yg#fvwB}0Jpf&>@rP48v3`c| zwX}n+)bY+AVxL+Bi(?JnTc|hML0HCXnirp$K%k&bC5%6emG$T@7|g|b#2nJ&!`KO! zl?g-%kisYmF4Sn93aMD7`IF~-m}fK1y&eO&+Tav6jRdP-J5oc=lF?6QVUGzwprHFe zxiC-H>GlAzYUuq6ZHL=h#9$t4`473lG8*yRY_YRe^op^gX5JN}K*h!wC@T6DBoSYJ zx0$%IQ7=lKpyUX6oIZBWS#$^F_dEy)m-k07SEovEW}S(UYhS^??(+k$o#}6b{dvs{ z*8(;#;9W5l?)E0kmMBn`W{UVJ3vfxA2w=HAaf`gFZs!v+^S9dB!X)`IRSYSGlYHoj zF#_!>_Yn=C0}JQ9#dsh;l2A{{wOP+D1@WTG^h606DAaQ*NmkgWZu00(Ygf@6Op5IL zbk_PzoAa$Ai&3;iLkUp5zK06tlY5HQ!r1vSzA1sI;)oL(VEtz-(!^QYzPYl6(VUMOjUyMFl~ zVAPwU|N8r9#)n%;ADx|#wo&Qo; zXs&-xgn(Z_0Dy4=19cBUe$s(O10XfT(UANbKk15whK37$UUBi8&7xA4TmV{?_HL%* zgZ2uH0fXjcdItuAjGqS5ttH7k0%fRU(Mu3MIT(~d@%K+={5R88(coM28$ccavQN?* zPj?2&$U!*D71+7|e+_rcyKaF5#cs|^Z_bA^ubqw#FE1M`Q{)OTbDnmtsVgfh@U1!b zwe-QB;e2Hi7b#E@DNu{{TOzsJ+&|FM)1#qbrhPJHRk~x#Lq(XH_sa8Rdp&peq7->v z7P_DsSI+ajG3K1t^RPh4j9tDZB%kAo@SpXYbGs6QLqx5<9*Pvd72P&Xw46 zM|P&G>*1+@E7}XkmemDo%h<|o>Mg$^%Eta(3y`8sb{jPC0$XJlB+MO%SpOD{iKe*I zG>Gl|zt`b21ie#(BAEr3TAZ>~Nx;!8knzU=44aS`JAy)4Dg#KQ;AQ~!5@su8`>FWm zq2*aE1o9E0R%bl_F2O80Ayqv)A{zc^Am%eqhyOx2MnyVsAs~af#)(I?wvVPxPEXAq z0AXw+Cqr;0?`h&Ro(=-x-=kkBlttKw%+`}s?fY|Aa{16pcLiCn6F@l$89MWgKUN1* z7x@l-FB!e{XI~yXUbmYvq7uDCmOVeFK`LoBT*$IMeAB~`-e9RA{M9T;J-ctCFj`h) z+?kK_;eax!O5%M3Ipf?q!zdLM|hXGpv0D$A65 zvN89$TJ3EaDSAW&FYlUjnyW3pJ;U=yE^()|=?UppB+(mZPnaOByc3_vYd#0pSauN8>5(Fc13`1{%3ax9 zkIiab)bz{JI$EPHs40Ot&-JNc#zrwr_jeE!2TAnOq^W<#x*J<_VnH&}u3{_wQ@XI6>|wLpY=0v?n$dz4t150}kW ze}!Z{hi`>A_6N&o0pPwd-v<@E&^nDPV6RS*t0;|N&(3l49r?BUl#+nlMUlb+m5wV&)o+Du-QV(2qs!G%uw$Zi9Bb2#Lvodwy#mHO1F$c|6g)RqB+*c zrEvpK8^F*1MxNJ(;OjEzqiOn9l?$~D+*gjr4GjS$3LuQB1f_kzP9>~+;FKo>HFfb( z$i=Dl*ARl-G_g5nnqHL+?WFS>n8%W<6(6J!062eO5+s;e3}o1(n2!a3ns^=p5o&%} zRZc@=)cNVj9luE+7J>X)hb$xB;_azpy^mWSZ*()_0Av#?J?BKN)BhKBMWvh#+Vngc za~st80P78##D_KxuotZj@OVw!}s!eCvnpdJYIC_ zNHu=**$6y3|uXg3G{U!HB#ywzDNME`EchLbw zrhKOfh8=Xl+QLGQoyzez)u_43(xK1pvhVSv6oh0Kk0tp-Ll2ci_UND6p2`}jPr4D? z4L%TgBjdh%+acDhgqi_v+JBYO?nIPDNFQCv_U(QBntW@aaew9V^Cg%c$?TbS{0K!ON zsUJ$;rrV~n5cOW*T=+lEIqpXa=L)gsp-ml@;2OQ;k1IEwbWh_hR6g|#fI5k=^SGdm z3bk|iqR>eh!IJ&M2yVv(*{pZ?S}6+N;FgWw5gvY>ws9d94-MEX(2|UcqXmPH^~Xup z(!kMh9NB#zWp8EZ|DL&yOINTg#xmh`&lg|YOQkJwS^AMol-T62i$^NQHiX1jd7#u8fdRS_4_~YmF5Loby&YQrtxp&7$;?R_$iPIcEUtT6sbB}7yeZ3EV1H&jK~1~ z8e~6H2fvtZyqaz{`r|zNMVBRa&T|(5fW)Qx?Z26?TcF4RWuJpspv|4@aJP#S8wdqM zOJSi>x)7g^&(-;{z?_?jvomQckQR|(<74OAOsylW@8$kgkFktP=NMGjy|MYf(r!N?^y zSA&_Ww>@`g>;aT(?sh^Bny-;%E@#scu7T-{D{+9q200Et61Xq4ZkY^DB&_mQVpC>p$7UQ80Kk z+Su*8#Y6U41vM1FB;t0|aHjwK;F%@F>#qfXTJH@!^YD%rvKEA{Wr%Dw1k3Br$7wL* zIv@fBPmQd;7YWbhmi|3Bpr3wTMJKp4bcEw9P$JA1%{3>(4)wrIFg7Y5ulC# zRFRdEGD1|QqEZ+PAl(js4H z=7cwa0-LA$*HnMPYPCv7b|7@YxWw9>O@l_Iovq0wY8}1OcIIUNGabj2H_316Gnv?# zY!<0NFcci+8Wn-g4Ge! z05W3Zjh2!=K;G(pc-iuI2NvwN`bPm(0bX@go>QZvyQMAAgY**Ml3JIu-j?plW1!ZL z*-Soj1Udpx?SN`#F?V$T`oF0i>}z~%+-(8D!)TvM2w+hud{tFG+-d;%k@5aaB_K?&-$DZtm&5$h8FIpLK>T8e^uTHmbQ)nk zu!WYA5>d~L8LJu(*r(M2y}HU@d^39WWer%B#VYXJ4Zv=JF#&!I&2e&15v6Wx zpYVA9%b}SAtN~Y32bV+bx|BfwYhYW8Lo=u2F5YH7UYA&%jiHe5RsX8}2+ZefYW>IB zhmDqqddjUW%2wgT#MJ>*+LRkszyN4vfV;QQmGJ?C4?Zi?;ogRLTdcerm1=+4V;Eq3t_^B>t2WLxJd zwjsaCDBvQW#?A7VOffo>gO8mb$1gTaGhKgUfGocLsqZ*b;m-S_eq*+Bsw=Q?w1U+H zjcT0ZyA%GAbe61`k*4}FVr+WUdVuAhL7BpdUk828vl7>S{e1P#fN%eT$bJd`QUnb2 zcC~ZJwpA9K4U%tmE^@IgQO_p%#)Fb)E>_Q{*fCpRr8>a-g&{aZa@jv4Vw*xiRb#2Y2qUlF$)sLD4WRpCzY z%-^lcIQ_t>`j12vnK_i?zcl@kIM-Pks3APn8ah-^P2P2b&4OWcg3tRgBRsie;6Y4S z^ZL3*#xjCTFr2acb`+Vc-bThbe;5vm5eSUCo*nlrpa_@NtOgS2CZ(iO;f3q>+76OwY*$S-5M6ha%&*ICuboeMCskKWijH+JA>1 zep2y_ab!;q?{t5^+oc-o2?oDR7QrYC^QOght~6y(G$+MBzN3AHV==@U;G7ctRQA7$ zF?tX5y7gLnD#4_+C?cv_@47?#b1y*>N*<;z=|;(Zf>Pcg5wBH7*4rSrz;p`2pmO*p zO-)Up=utu>ez{k>mXYfGl9NQybb@8W!F4Pk?Jc5^lDl|6V2PirL}(}=s2Rc3-NVtC zmbWo&*LbxU2GpLPeEaWtIFq-+ufjs0j?C%koi6C|wJ76<6>}X#~GejC``!i?&_7_2Y5hLrv2&5 zf8>OmDW_~)u_r1>U-Y_-wYArAk)iiSZsMHRVW0N+YbbO`R*osznG^)tD}JRd3kFD9 zpbD`pD4~@(kS^?cvOO8X#TB`v<_T8O(71RKd9I}QVfq9e0I-^k0HzK}6+K1L{G9X- z;)E@HFdQaa;KDdJEeXZlCcL7Gd_uElWB(#(4}hRwf`Nj`^}*fXwbzIvCUT^zjfIahcCouKp>?W65hO1EJVLKvAa1Ll%}0+l#{CkXlFaR zH7``lpoj|zS;}fgvS>~mhJy;x;9GtlHGYS`ewUb$eFpaULTDaFEq5!(hfo@i=#*bD z?#*eu;Tb99e8up3#qj3XP(1F9+emfu_g$+gb6Q735?{V3Up!>3twC?GTHTx;L zZG%(nrXXNL5Yg@~kle(i7i&BCERgvab3Vn#`7-OiPp^(UkOCC=F+hP|Py)l;5=&IR zoc1D#;r_gz(w|Wa$YNS2tT@gCAdA=5)-3c1fw67k*)e5k2QLG3EkGyC(=)b5s~Bw8 z#qzm7#GWl*T4uza0wuk~GP?iw`V3(StSD#53saBs2B-iR1A`iS2|4o4{Q|Z8lb5|^ z+X&3u^Q`uENfaikQ5|@8Hb7i+j=DBp%V-KH6BBde>dTk~J+m0ZOw)MMd?~;ZF#0zQDIq^3Gz#&tlnnu=&g1j6UZm8FKI5 zbQR`hgYN^IHNXtNe0-q(09f`-@G{;T_E-Ti>0zQcB5dc=&#>Dg^(V=%zlS$_GK%Pb-IP8>i7O(Igd|$G$YZI zDq{94gPN{JEg^>!tL5xKH7t@W2GRs3v7JAX)R_wlwMpPJCrV9phQF$&7}S+d8vqxCyK069(boTin;LS8bvXY96yegK07Q|F z5dPlTQ@q|$y2Y!eG~dMt(5XtP@U42rXpN^UvpLuL;2PN4O5w0`Z|Wvua52c$?$J1h zq~0dd?!FYMo24*9%eP+DXRe|!#Qpld!AJbUJdN5>DcCQ&dVP(JZ`L}at1gs*1r#rR z8Vj}GZ7OMrnMvp!Lxr%?D+fS&74EkBO4d=v0`M1+cYyJUHu+mLY6XNKg|ImSJ*9uq zAf)mx|91tcVg{?QoZc7k1B;w%V{eYIM3hbG01LR-5NW3lS%?E zr;26en`>$yX^%7wPtCA6k#o)oD~>UK^e!!!eC}D5M#@gT8IV;faRXVs{Riu58p5F1 zv8O&p43_ZEU&*w)zI2;I5w`Ty!c~aMUR#Mp%PEykbPE0e2Hve&xiB44i89Bg0 z^Q=40WS=pZjyv@qiOu?i@6T-HI~W!|R{c8m@xly1MD5?vkAUHQ0u1kW%ao3)9Zr0v z;w7c|V@WE2v2*(z{9~M&i(L?_jZ{kQdK22V-IOgN2V|?GvT0FhH7_^Uf00!FTDaxv zA^2Yq#vTDs+*AhG1HYx_?Iw$r)G31WK@9^Qg*PgKuW>C;YxndEQe9MSmrlMZgbxWk z6=)rEP@=7m2`p%{3=P|d_|C3y+r46t9EiF1pg1kIBNasf_?CxyX+^Qj0rP#r83IIovv zpz1trST$blKL7MH7k2vqqt}B>puiRf6w3lO2sR^we;fs@1i_nY!Ew|ZEc*(~HJoWL z_6eRBhx|A?TfYyi+uM%U z+^Zm+2jSsS4q5;3fno8zaT1Q^TXHwhs2IoH`0Rq&9FBE#@}NQ#uTI2B_8^ADd3+?3 zmif+g)&%`Ma=x1gy6L^x3DVaOhsO{Kp)%YM@UnXiEG;yNR=T)ISRQJkzxC|F8P_Jj zg}BoCP^d)$j(z27WugC|2 z7Gxiu@U1=Hl05M_T^qrzeef@t(%)R5Q_BR8PDgZk+6Du5){@(! zoqg4uAHfX}9=mgheC15Q0|agTEr=YIDcQ~U z83(p32xqbb1ArX@pa2n#NR8LoL7mmDI_Ir10FPExSBnzeT-|BFMSr*@$fepXGBB=x z4|rrq^QeU%i6gf%APE2o^8LiVYo%4@S9U6IQ!QutfGaEmMgIm=?+5^*6!>WV+eY+J zU_1;yajl;0OdCIiU$U-wSy}Zs&sOUJF|LX7v#<^*vi<2{V&i2lo4iRcAZP6sgKq)C z9vAF>cegLtyWjgtdBK!(M*u&C0CriyMcgTYnb8iMiaY}3s#`$QK|G6C*LHETQ&RF0 zg}Ff9Twm<2?HsyRSlifO%O_2LYoc@R6VX)Ic-H7M$FE^^9%9O&fGTzFYB*OuvAfJG zj1PEbgT$_@YK4w2-DzEqAh}dvS}|bHKmK0;DuU`{Ej%DY#aX4GdR*IOc3_tzZvfO%Ewk{5`vv?xWrQ)kC5nI9Pq<@Y|Rb+`_V# zil$^DURUtS!Ut*Pc5{7o<@(FM-y4<5B*~oHNc0{8KoW*sM^)ab3FmQOVGV|T0ZYs+ zUt3P<#=%BS=jw{wY*-J0tD2HAbBvPuLB_|2;wf)&;vo>LPN97U3k5;rK@POxA8)XG z3{OWcS^O6|Zs#UMJ7W@yXh)0rT(xp;Ea3ph`#=^0e9V$Z1=RGsZNZjH2U7NC(}9DM z4P3yFrw>%`A~X5BX}Hp?NgO!3AgDu;@#9#JGN{@{XJ4s!;-_$m?0S*zwfjbaEGKIu zHO7N|81f5f9W44Td`o8I)Y8-KVo*tuqUJLX`wVAl6we#di^%!IN3l}C_VjKtiIjkh zEg8D2ik+=CS8C=QG7gUsS#^9UuQ{B=%yPXpGHxg=)iT;zEA#B^0XU6o;k0XUe%wZY z1Kl_S$Ybpj`jkFl6A0+h(Z+Cf{q{*d*#N3WJhjhU7^QdN*Kc_B{-UeDKlUQi;Cz13 zg2+X~oXav0;?DhL^m+ zQKB0!%cUVE)O7_w z4a*R{cCcF7)KWGtXF7aP^^Zq6E-iNCii@Z9nPbFXDX*1!AG=uq_nvJ|ogE6GcSW=? z4NU_`&jy}p_shP{RLXIrN15YIY~P_)2={|QFXX{omrY8E}n_mIlDmJC_%?d4SkD>T9Om!AAm*O_Kao&ny^pVkMgC@+S%E0 zCcAAvg{bxn4YHPU-+a*FPkUdL)y%SZtE;DQVg)**SlCOw>GH^DJyPH9_sQ%s6PUIx z`opFWC3HaFOv7fhr$RwbsVz-V*-fi5CHPD-eFAc{IL5p+LYMW+GA@(!duuTCZIw4^ zS9T!DFL~J~4Zgrs*D~>HYF!w-oy%q7mo!x+8!Nztfp+IVS;ozPn2(KN>yO6 z3@(uO^dFgNMm35$)QraJI91A7!rHQ7*rIS56L~H^DlCaZ$h!X+9Z6SE^_w^C?$^yskDGQl5Ps#kBKM`G!?P2!(qliec( zzxp&Vo%JhYml$)$f~}`3itw(aL(2qpXfX{z^r-%3y#$v|Rzc`6^N-CsmNa%n3dLoq zU)y2DY6&u~?kPlp`a@CMT1{Q^);PDLPa6(+rm>ukbqO&F5)i2;c1j)*fo1h zz4n0Jfa(DL+ta42ka3{9*};myM3oZ)^kZB+w$g5ok%S}CEj72K3|hxgHgy+fuVcH0 z0|YAHh5^~Z2PUox`W(7f!r~AntJH~vPo@fieDc$b&cVUI3B0d~4sIs~`_sz2H*j-H zRb*65onVOzhY3(43SWxw$IIrm6yghZ)v%TlaGa)^-N}j(`kyD!ttiO?}&;m|7+j6CU!7*SK7`IgG2(THZoNuisy5BB$W_ zf`tY&fYtx2!I0-ZAF}$_84hRZ`bWc+45JxEA#EpT|Cd12_NzwESo7<;5;z@ij(TFy zqTc66fb>|;^<{p#&1)66)}&Wk@MUYyqxC_c<_b4#^ueHKoyTumv;kqTsL*3?zIml5 zaU9rcQKAbpRa=fg?6~h?*1DtxS-u)2N@8A>5!Dv1MCOLP2A`o zSNt<#0FE0~VqP$xgnYI1eZ)gh@O&{cxTAML#dB{UkFdtDF!tR8mxW?%xc1&1q<(3u zs^ygC8b_5GUevMJ90=TQFNKiy3^gHTI+lTYLuPAaZjb*j+TJ=Y>h)V2X4{HLw}6aD zcQ;!d1f(Q}4(XEawvYy4=v0~k25A^lx{;Rd?rwPRVej*M_V1kYJm-1e&*$|Y9r^O@ zx!1L>b**bTra7D!4?;@=ePm7-Fjq7B=AP&IJLp1_fL4z-;mO**y%IvuKj4I1M>+mZ z$h20uLhn|MQjeT09zV!D#-CVbHn7#9BN#fKk`o1~?V|t?Yc`xZ6yj5VP6Q z8ZW=pba1}m?Uai@g&SnMB5ov>+!g{`7x=j6YGkgSCuVJbo~EN*Sy+Fu#ABaGFa5H| zF)c!8oVi(jFyjLgklbJ$bth~V*5M}Hr;{vtgBm&h*l^<9!w9Y^!4KS$O@pgZEFGR8 zI2q?8jk1K#30N;;X#E*qyBp;WTAH>Ot6ePCX8XBMG&~kRZrF@G~=*MV26TGP&FDa9Tb# zR(caWv?@9WBY*`+!lW`%R7g{OgUX~P)j4IO9_omY8Z@_4^cDBELr>`9X(e~u^h z3R-`ZKG=@4H|OW*XyR|0Ye7LnO-HHH@J2jbJ(cJF&k}+1G6^VDX-q~(<8wH!{VeAg z1OgdTWeE(ZCk~2v7yv1>ywJ+(wVdcEmJ|ljBCFFAHYic;<5oN9lZ{+SEcVluYpkx? zh#%n4o+!v_^?2TB7-M3k%ZJa=EmZ>R$I^fX_c_-2@f)D>cfMS&9{d9sFsaE$>yzub>cnLe9pY;C+OCBkQDG<>8Q}AQsV0 zFObme%bKjeDdP?Dd<9i0QD45tTK$B<&B)9V()*f=`gk_}>qlH%Gs|3?`9gerMUuRY zy*Ww02}-TkR{P&ODsys~JL!SwZ{k2p)h@62qT<2vNBH3$Y!21+820Q#Lj_mud1nKH zNx0we!(Q!9)56jmtd(E)vG7xfG*rc6FO(K9&`5k-Bei5uW2YLwDSdu@`Co5S#1S_G zavoaHKWwR5#*H0ND&6oxB9GIJ?2HzOqCuOA%GMqFye0C`kM18-WG{yo_e!W9>x1f7tV3moIZrUG^)rsKtD9fYP&1_`|J9~CfYI;a zAJfW1gY=zS`=eU?C7_1E1&snG(6qBc(<{9;vCQg&#!ct?^q8~1c-4n2 zq*WZ%hYHyblcWRwTH9Y5X3}`HCHa~-8z?nb$VNjGUxA!gvY$5eEuy-Jl>m|&5%{6kZOj$iTh!O8Hy_)1uHk0wV5$e zin(>y{+EJJTbh{x_VZ+j-=KGz8tivazxsMc6NIi4qqhgx{coKRWW$b z&Y^ZQ2MB{O#rUL@zMN-0&;nD=N-2cs_3^yCEOj5&MvF5k>VQnxebb zRt2Pb)1MOnmR&=B_%FHUBt6fe%4xUo$V$6&oas7##bk<#>;J0&F$wZc{y~sRT8F`4 z>n($Z{<)h0<_k(Ko5+xH+GQYGHWwi*HZ@K&aLgkV7Siz=vHU?k{l^^ToSb5DB> z1&yH4Yshryd)lB}}Tw z$07bpQGWD2d-i9?HS$o9x4BPxgx?HyO~Mb`I%BgGHXj|2B_K)P*0|yUOnAcmOjG%tquQ&BsmsGMUC^oX=NZU@H%%B8F7uIV zc(_X*-g8w8b#*7dC#c!1{@U~9K^^sDo{jM_^);CM@DBEjCGy~Pf6cywx`j6&0~*kM zJXNaQUB*R@!+)yg>r^{$O#%g$_g?%|gpqpG!ex~U8RO@pu2hLoa3(fDb5-fQg{&mv ze`+;Zr4AeXbQhZySTk&DytkS_IWBc4Zfscg>H%L5PV;BN;zG&2A`zXfd( z=neim;sE{Q5~ck~llT3LEmYoBo@a-f!{mHck_>yoV$Pf6ADU4}?~?^$$msZZ(A@Dx zG$`_H)1qq-D`4~UofazRS|GuYVmLBsnE=}YFF1F|={Lr`2dEQmPD6yJf_5cxs>}vp&Om1 zgML!5ps(OxuNim?ZS?t_(bR&Mx_FP{(B6Yji@&m17v&C9d`V*kr@gW-s}=vi=*C%R zxRKz6$Po&|dO6E3beVib9Bplym@Pw=xl93h5K#WGusi3*B^mxB$GlIAQY-d-4Oe=J zaK?Qj=vO`vDOzNrK)}8Q_EP1FVtXnNYB2l2f&dCN&eHduT>K)Q>F<{%pGHnBHH`|1 z2uUuDGi4U8CAktH_z+*5!In}CgF>Bh_0hUXV&XP^duvGwT<1U|SqhtcWoX9zisZBp z^W$B2q>Zy?#YHX)DIxuY&ziDZfLs!qJ+^T0eM4Gk(0{8lI`7NG1ypFre+#J6_EQS^ zprye^aF^#i*#NfFJ^8JzxVfBKdSbxG<&CHUE?&)XyHfQL0b@#ebknzB^BaR#Kj;tDeEz^lPzQ^rb>k5Lk9OVKgjZuat>CP)f6$&dOOW5Xht6K8C|+e*m74VT(!ED#A1s8M;G8?0_C8z)^bqY777>>o%E%xPe2 z&Dg8Oqz+Q-P%lYReR9i$YN6qh!MD%br$O(r-%L?2|clul#MzV#fvQn z(Bd=0o)FSMLy&EF_}kgQTdBiCerZpbSsc6}^lf4GW52H)2}`BUsmwLKvRy8Q`U?@L zbEy|1x&kICYyb5HhfDQ0E8qFZLFz0wGEdo7Zl77 zW=85h?-DUoTv@rMTZDBy?I_%4P&8d8j<*0tPdaBM=r-tK$+q3ekEr%?TBd6Od|5#! z%jjsbVyHdcX2M$w*Hni=qpDzv=9nOmhr^Cv%Ma^$jYMw7l!IdrFfHnQbQYXG1=XcS@tU^kW0lR`8;O4u97cA~PpH8-vySR= z`!2-obbkea8@1zq(RAqwM_W^LDS3H$d`biMNf*V{7cM5w3-Y`@-gZ|!nd2v$&5IJc z!jl)L8!hpgx}u^ev8p&4DZk~PpYE=)-ZBQXV5s-`Q(Q}H>-}1EO$t?V+SG3JiHF1_A__Pgw!D^ z)bpn&>d=psC3`XsMsQ*0!5L-=yDKa`i%%g)<`ckFTgtS*^Y6c^_4TePwq1c+dyj$xdK|T- z2Zz=iulOlkbMdTRyAx=3eLg3L>Q~Bn;#soRc==&h(GvDnyam;-lRU8=%+vkU;K1a` zsn{+`FDJ9PR59yoDnGRL#Kj(v;yqDZQ-C)=*Lr8Eb-q6Hj@SKsVKBH$oOCSN6L9+d z8zb<1WYSdC;lg3j$h)OXYb$Vw{Uu-PODc=oRb5-kKgZ57Lhge`aUX9s22qdWUq=`6 zVi)^Zu#&y`ojH?0>@i)>s*|6C`AOi0*<0em!K)6=IMX*YdBelqa&9)W@(Odj;;L=& z1l+yOQnAWou<_y_mP=!yM+dRa6=K-N9jxH%(H5;q<+0x+-$Sur5`CCnmDqw!B|0LY zKhVuLEc#muSpb-HY@{cbH|(G&A8EDj-n8$LVU6_s;rv8s%FDxR4}MlO(p}U7jteRS zi6)^`UT1CTt^(*g`8NO5H(7i9_;_q&eFq$8UAA&>ex{+N=h5SzMb=2mcV4I{hxchN z2s8}FPpZQDS5=meyLQksjBw*^jDwaLi!FpxLlf7}h-#)Bir_+5Xq!J1WDG~~9m(X67hIncZj zJI(?+EDzFH!YDhKt=(l61s`!iodlBkk2xQw0@n#=8Kg8fBT(HYVX{8sBP0F>+A;3e zD&2BXedrnyWFBqxTp_l$#Xj0-js&JkrJuAjVo!{5m2+ zD>R_abFT8BPh$i5En;TYrwD+5^y1;{Q}Ts_fdn_UpnWa5O+#AP?`Hq}peb0$jMTZp z@BJrEK|Y{U9%5dYG7LC_-9=&u#BQ#YG$1W$u|K_OS^Pth_c!vULbgIVb;!hmnJCF& zue1ck*1ZLAEbr1VXYl!A1&is?KzAj`%Fr%&3At)}@P&Cf;6ku?8hTg*d?q!L)2 zi&}{f7tJH!sYIKGLPY^;Hb*57Seil_ggqz1M6w zE?@+Arw~OjTm1_|K0V=av!0=(B1Ow!oYrqn8Y-}uPDX)^~y%LslF-VyhjFOht z&>c0?jlhzr&L8Av?U77oamY$gZFvv>0CWQQdl|{$Afw)n();fzWpoF=>f4|S&od{I zFHBeM0#l=-cG|+jph2hm-gxf~8|LPi+VcfABXu%^($Z3uLtE{#t+O&sVsxVTIqlvy z-Wk_ypgU;EzdT**>XN;#M0ei-dwqJbrhA0~`RPp1F;JzB*Lb>vI``2<4cdSF%=PS? zf(4|5Xgb1%_c}iXvD9*m(n|I9g6kzHMfbpGK{LAZmBUJ3dLi?aelSQAt$}aT8kYtf z#{=XSf2dfv^Mt!u)GhxhbV9@4Gi&%9D!cTZYEd1+yNksQ`j zyEqS}jd-5^P8VvH;|DM%%?GfPdaORDLMYT=QBWc33n(cwRF}tg8@o()1)j0-p*a>k z$$jqsHiKv`+J@hA=8B-f zl=qy*$>(c*u_IeQWQQNuK85oLNIW{RMJ5gcK*~iIlK7pRc?Aj6S>CEmZgg;LNrCL$ z#)a!8Rd`OwKs&ouwFU}^VZzoALUI3{EEh26$F=-ow$2X0drlUJ+*F|z`FGM?Bs5_D zUs+mWVzLEz3#(dew)Xt>&o&8+gQAAtR!r|DKF{O6PaUmY9x-kzD|~OFc%?+_fH}*c zzhxpzmd{mhdpx*B!|cqSc-w8{t-rMFJdS|v?9!F^zuUID#TdF2T~$F~=mhlH=wxf` zsjp_9(^iK9T;Gn3U$jhgNk+bMK~sdG`L^aDkg=duMNPv^exy7M_PLhaxQ#W8Mds`P zCiYcDE6n4CZNJQ9Yj496*0-9@Myw~Y^M4(7!MTfQZ-0&-MjG(zpsyQeg;q+aEO!m{ zAcGr83n7J0su^_|`gguDR?jru^P7S0OT(k9Y5QJ=@enkN##;xhnvFUe{wLkiwcv(7 z=PQA3G`V<6XyP})p}9LogHJn5_?NAP~W=HikWZ``K=WQO0TL{O1Cp z3}iG`<=Wm4b4(M-$K9W!WpxH&Ki$vYT7hM`=zmvO+)5S2<**nyf5DCOpTfic9SQlL z)kY0UcJI&4x18RA$MIhKx6(D!_+J@DTSC~0aF%M#ugygL)%Wh{g8tbkP{jKaln4z+ zYnx?WuKFE2(xUfKcH6nQF2@#*f;e9%7IkCqMVg+f{Y@QxEj6Ds{YP@}mzqTbie7pq zvdD<@Yp+57B%fu(Gf3aRBsdMT)2y+C zAwWqCP(>w58^P)tOc0^8=i~k!zlMTf-wL1T-0Aov6MbuCUL~~vP+ioI`kSisDzY-s z#l$a9hXgzGX+`*k!h~yK1h|4=g z0?%RShSUzdraEb5Ld?U!PV#ssn#F~SUo?-N=9J7NkmnIszO_m?P4J5$F4tm^<>n3E zErK|ZgxzZ|&4&mK9n2fS*6kphw6MiTj_%8jz5gsTwq=o?apD*Ta|U5@zQ)ILG^kH` z`0Oc~xe`}(Wb)QBJ3|;LC>(#pg+Et-mgc$Vpfa5M^mRg`%RJ$N61k2vLPQGVXO8ix zpw_n00%;MsA=3u_vS!ml&;A{Hc@a68V^>PcZePk;FK`)Z*ynOP_hck1j_K2;HAo>j zXAq{*pX@8;eHybJ-3dht60e|9t)^X{e{Vd|j?Nm6ld5?4l=@cx>KpFa1Q9+`+%SrG z?)+2#^0{&?_%ldO32um*6ZOiyF$>vB*hcTD+6;53Z_L;F{n2YyYitz-g}OCqNGQlY zj$+=*d0UY6zd(71lAcdlSfrCPimQ6) z(_3Y3)&Vu0t2<>c)Jll4B8OC34dx-*Eehgh`9X1CkO34Bi2e(k>dG9cG+J>jKN$YK z?%1S(-5fM#XJC!LT8jsMd!@QH}wkYSlw}N`&IU%wu-C`lX}4?6wEy2PLEYVv?Z) zhT{2PQJ(Jt3eCS?&zn*^_x`47y2`p}!jfUQgh-qhZcC>MXg zc_C=~boR}vZDHd@AyWdY6Nz(w8zw7@{7%93`cT5p7vD9cee-|B>i^#s<9|p$!883I z3q1Wv1ZOq6&exNUwzB)7>Hb15jKwTRkGyqHQ0Vg?s#4k1nElDS0+5 zkUYtU*Tu6B2HvR_)vGIlm(*2VB|2BS9#wfEUre(j~( zH%|)-i=(0lyDQaUM}I&2np)dQySLLG>ziMR`TpATmD@B&+V-eP$E&iK~ z7vxY0xM1cI=u-n(Lo}PNjx)=jWuPu+ztnwrSi0m2q`%Y3LgK2);G~k4Dil|N<=E8k z-)hd+UUyq1{gDJqU(x6tL+(?548hW(YcEOB<_qu{V^S%T@2^^^+yAC!`oAfujxxAy zan+gafe}ZOAlW%u3nu4Fi*QW>yxS&_MGV)T?_%OwT3I#Qo*zoz2815|wO$u&4yHDR zR_d0OmZn9V70p?JZNc0p5nRwc7c{39wJ?SRkZKwWczE!KZ=C_J*pp54?OwjTI6FJ* zB=0EXZU&`3v?uQ4mNG3mbY=!TgKg5LE;gNOwx~>n$6s_*f!D^Sc{+p$eTn}pEb?;Z+amj4}$_gpst`@qkERvXt|gKD{lpeMv%;kD<*!LUmj1Y`}Q<);sA^dl5qlZG8H zJoaJ)gjYiZTEJiC{-&UIMMY+``u;3k!z;1<2|XR8zsajFR#j_uV?}?{(E4!ZxhEvS zf#1s{_K=%xeLE|A-{tpj{5))o>50#1QM-6E%ph^@AhA8oHeixE<(pr}leH?wY3t%D zu6o(kfNgt4jQ7zENszj+Z)4mxXkk#G9DbMc-Rg;npP*m`qf@Yb3zsf2o4(iWLrz$& zZsiz@q-T&50dhmg>j~EU%$H0#|B~>Ui;e^4Xq|DHy;l>&VRW}mg6`9`E*gcz zu0hqwT#!%G@d>nbn`+R4T!+a|oo||Io*sJyr>Q@NZwCG%Ou(d*99yuZ9CW?P)_^q^ z#$Jnx8xR*tIdP5A9^Rqg`hGDBZEZdYfh7#|Y}t-x%X#?PvsRarIUV6&CwoL4hsGSC z+q2vb{LUfOa7>JCD^Lq|!SteV!*?DSwTOk-{R)DYBy}^dwpkG>_yMdU)TWuc`=&2x$mNujWNaud|;E zCR;czd4|v%FgEu=WMy*+4}x5=d=-m9;E_A>LMaU5#Ag_ac~!3_J7&1NaL+5JgJjKZw~*0E0GQq|+WVqJioM-LfvySE;8dWw7N>Jp zeKw{V_=^>6B(`iUv(mt~7KJiU2s`=c*T&v6USmZIft1eB6)=4!SpRJSlD)ufAwa*( zodI%KbLTE?nwFJ_6ew5C(TV4A{6wktM+L!Sy%j*NOKN+uTmQOs(3 z2Kz@1ZJamtpM+%0)4p_`X1wGr%GDa?QSaXqpATLPku@)BelgD7JvAvD3cm;c6Q<5X zR*32dIHY1*KHudW=ePR;$)>@>j0(Psc6kPNn0IZQt-d)GjaGP9l{k8SZ&>G4GP(VfEvm#N`UE z{Pc{T!X4n0iqqEvBeCW<@W2uI_)iSB_=gJAF}^@BLdNB`>kO^?^QGwM8AD6_G0v|+ zZ9k07Dp&txMOFE04Lg1eSkhkMf)EkGOgsLxqk9K^OmT2dy+~xaA)nn+f$uE$qogXe zYL#=c`H_Llt3+lLVJ3#E72wE zt>|}hqg}dK6a${yLn^m1-XGmT$Gn*Y0J;8-fk@Gt2{8aTB?|eXyOT}82IwgIPia-v z#}j;fTTj56PNMCZS~z?BfQrhMNq!JWq4^1I05Fi=M{B4y=595XT}3hlEBc@kod4KFH2=$dtmI z=?Go`It)2n_NbW|9U1e9tx08>0na9gG)oH!e#s#1j+57Aa%klR!<&uO*NHRzsRNDzhZ*}nx#j1GAiq`(3x5(^GlP)UkiX&$6q+_DykN_~d+xD1EB=W4wffFg zk+WDqn8Ar>op4}aJOKZoA>11dxkDC+O2j@$aY7<;11ACnxXh3h@Z zllRM?INlxqg0eDFjY8g%q=aE~{h{y2{?;!hkiWuD=(k!z!wW6zH( zcGItR9YcPGFsohu?6?fplqbx_?-*A?#0!WGKW25`6x&QvQkK!|y2-|9p7ILJiY0q) zEApLyGuj;-LiX{8w~svGo0bh;GLetxvU8^x4)5d=b=>o();Bo{!!X}hU2L035%Z7vjm zYZ9#IKwT&kKKfAR6$Xa$?Pl5$3JbP^Q4bdv7eC$4zGr9~LX6F9^dOHu?v35>Y_W?> zggIZt^4TSvPF_dV5ySe{xF-k|81MhfDfXa~(eVJwF%;6-UKeBYKKk6>YlfjUtKe2| zYs_q-x&1t-!v6M5Lkj((_Px3_^lN}&!-O`RRvA91!X(Xkkw_YL9OvGq?K3t~)_W{H z5cYHbxnq3BRA-ou;v;V3<}SXnhDxC5`(HQYcs1^~VceWLD#Hwc5KKN_m|tb-dtRGNcuek?LT`|Bme7a1oB&8i0I6XrhfEk&u7ZK( zcubril|$t;f)Mx&wBAsPjBPB}FSm8IU(W4*DGetzDBNrubn#Sb4*A}`u0hpL4sZP^ zB{KA63z1t?H(=OJ0*7(6T7}$D@wcE);6Q3TSJ7Qjp9ya)H!p9C2+&=T%xUC;#d1mM zYb6d0MTDg?1#zesHF)%iD?vk$+r73y-A?BAT~4w-98FSFG0*2K(2kfG#~N`|ne_pC z!fbdF#~Hx(dfvqB`=eb>OxY;+FNsXgS>sS7^s$zAZsWqjjP8^qD$71qtlW_mA{CDd zE$RyjEM!*7e3XE+HI2V%7mhGPsIh5xbol!%x0t2-`eb#yVbS74_+>qm;nLS(j6($l z^(88EtI&n446A4jLXOnKJSSOLJvtcne`Kv?u-*``uP#p-DSsSe%#ENci2tDXg-~Hr z=%$^$!Z5@!?gRe3syvKT&58DIMOM!5tU{{LRVj)Fmcbuc64&k7%u1QC922te?HMMHDs7IWux2};+$!5x*<4L;ZYY|Y>)$(caCV$Y z*=h*BoK+civ>taHEA`b3yl8=Ux7^m+XBQp^M|xapDI_c=B0}Xv6>`KEO|0T1XUroy zsZ%rFHnO=|-`*|dzUxp?R($EOHGRBp7pfY%bKdtVM<{c{#`{8%I8_v>d>$a-=H=wZ zD;NTA*cjY&(3x1KUjiOshC(4?B9c zKj=O=erk}*DlW?z*66}VGI&qninGXt(`ta*FyNK)Y+$`otapJL(MLbY@Z$r$Tohj8 zf-N7ODhz_~qw(rh4$oSNyJWOC1oC8Q4H&+xd9IIXxl;j~j}l*^Cc(`fdCupBx%7&% z1D)@*Fsa*i(=56xXb^D(eEw}z4t_8vO?9Gzu6*9Fh_)KZAknDrmg&N+K3M_6STdJ|%|Uw^2wFnr z7u;ILG>CvP1r6mcSKJlIkNiomMNaF_BwI3mR_@&~4z>@nagCmFcm+oAUPy`?YEoCI z!&HruzLWwdDZHgBB(1!9NX~SE6qA?N31t4}MMq_g#PuR?WwfYiCmMY5BP$y>n>ekr zup}qv*#s}cVU-Lw)Dc$$u}bripkHOLE-)Z23pYC_=hYjT*!Jg8XrZ2&_;QocOXa1T zJ=VRZU1+5QHn{?P04t5hXx;ZVPZ4=e zY5M#J{74=J?ax+kOrySYH`Vd3|H$$uS<*_e_#j{Km07u%>1}pX0x}_VJ{tVUGiAGONc%G>-luJ{ka+wyxdeV$)AsO2 z<+5M(G%<;xhIDf8$Vjxp4TWHL3i7+m5qG5C-P4^5Z#?+MoBCS`$^G{930A~_3QYzo z-I&=qzT$fa{wI4@CZ|qIB_i>WPE(nH=td_l_W2#^Cgh87+(ybk8TA?>vW5T90_e*W zC_W3y#|m$kOZe^h&0dQ4h1K%J3@4Y&jc3jTw6GwohCP#1{6y0yt!f}spwy(cak{7y3tV6#0ppd+X$3lm)OX5ZWR$wY1zw z4Hb3UnQa1Nuz0r6ZZD!|>qTJB)fu3R(JnAm79WIW!9*0ShHbdKC>YJ)ya;+S&wvC4 z_?xAsK9!A+EwkG7ylR8f`TF`sC#$^Ehu_uE(ZV#qaK42GW&Z&d&;i#K7`||fCwz9l zWsNp{C?^~%wH&J{eNz}d8YjVnk$;WiFsuL;0hmo0#h6upU2=SeJ%n}Gn1=;)AsG&~S= z44OFbdv|v^4S;Pd5D7VSP>FghqgW?1?;U{-Av7%U-k0!paB_08cRe!joX9^E@i^Yz zMOcU}+_hOkqsTgu1GF9Q)kf__Sr6#*7~LHlgh5uDA653?lf3zShMoli@XFPG@?}4I z9x_y6{_Jw0D#mDJpaZ11QsH2CLl9G~0d?)#8&wI0GbA3GvA?T~|$KrJ#>}EDNA@2katFb6Q zud_1mGhoM4?$lC&Tx$!bx>%L~2f7z%<9!YHM9@P;ysx&dJdY~k5&C0?UD;g#Z&6a> zfm`Seepz$)V2uU;ZPGPROggQeIunuYXJxy_OlWwf?a{bSRPM`;wx;;c@XtydjpATc z9^{*Z05hXu6nM;~B3q0YI!wTS3Ebb;QAYAf!r2J(NuP1)V4N5SQEar138O6BD0b`2 z`i)}le~-3uN{zl*=-7^l@D;QTd|OBTx-*!Ly^XLr0=xmnq)kay{8(9(1KXkut(%YK z+dJ0>^Kg`X$Jw>RtliHI8%)f4=jUf9ufRO4C;;!0e53RX`Q46|0~x0yNO>oB@7Ita zt(45rMwV%_&_H6{5KKJGsOe#0udM3-8H91M4Z50|aT>@BC6<%rTett_P>$7JGjKD& zQ)ka^A)D8ZbR>$2>jWUp{LV<%PB)`1mJe4mjHz{%NrXu&oJ19iuR^83PloG!gv~&S zw;mB9n<0dx=E`t$@7*B?{W0 zn!j5>ThaL!4U~m5I?ivN4>)NM`R7C` zS$K^!#d)zHwb;BmFuldlFD}M-dv4jhWJkzwI_8L7Fs*;3OYygn5LWwGX?2p}3@VaB zXrtp)e+PSe_Un2Xr@JBTel$&o6j5KK_!3GC`Dy7OQoTH^h=8oub27F!HI1M$dvIna zLI^~|$wSj9oF=}s8BqvnPt6*r`j9ROm9ZDek*a6UG1noraZ%kKM?h zris!eC)KSUTKMtLB|ND@+*>Me=tzgvV>YsobQ|@>ehV*u+s}#2G^TgE=LhLN7WxXWPmZ`oA)eDfqKJkT<$)(pSF+fk>gkR90W( zM7K;xYQg-oAmPX2N>V8q7Nlmff3h$X%KTPSE-uH&k78gOQb>*1`>>Qw*hTV3|2ueQO}w%!pAu9x?*~fb zzkr=aez;#8=V8OgxRGGknBs1oe|uaO>kB@5?v6Kc`ftgd)CQnI_N=`nb(v}*ad&mJ zcn6gIi5<#fo;C2s_nw#`2KMmUic4}Nl6XAGwZ=HA&ARGfV5s zSEDo{PDc-@8KtPwZkE_6vq}|`N?GBJBuF~VHk!RqiUQcghluuPuq@sGFKFif4#8M( zsBu`9*uc6f1;veDb+K{GY1GMJkCrAnV-=T{qHRR0U3O;k$|mESSumi`WY5D9v^Oir zsnDGGWJw*x&SvG-7rkSUSpl*`2n5pQ3((#KY*2f9!!o)$HTh0zuIAg|4Gk}~hv_im zf6sr2A|9?MsiXLhajO5uVU!b29gUS%d#uI!(J*D(u90rC{`HQ;9z;EUFN9{mK-OYh z^X%^Q=HE@H|4ukSQc%cbVb|S@EpP8hA7K6DWjToslAY?>!`>&+-U1{K*)?xZlcD!o zUaQ0KbhI>Y4TV7Hj^a&sqjT!_?yJ_9i`JJdSI1O*T(b?n*#4#_CK521_Ar&O3%hzr zQBlM1l4P1Y<$w8iCY?61d2u+>b98V*R#iMfhibIy%pvzUUkqBgdo+-Ib&{N%lw|ep zotEZg>BfAS+Gq~);!n)FMD&m~jH77g4g~_)u0V`G%fX-pjH98QogHFbk6uqFZ7>$` zYFGENW9njJO1oyR3Wd@bKFCb=8uio$E}-@SHu-;}iA?X)On49Q7*&tD@V(lm0^|2C zH+NYUODzLamKV!$!Ys$AJhneDcjT8TzOO(JngLfCdUYI%#u}Ap<36?7q15e#=RfaK z;V48IDG-3l{S$`z3-pjK^d+3PC7Z@Mx%wm5_!?4}J8HJj9nr%XFK&*zUSA~!M*rVZ z1BdJAh`~;Q#&LCd$2FnR)(xKjVsp^9=lHqU-!RhZSpYKJosSWyMrV>x~k`q^&9JBrsvOATi>33b34FNif5RV-gP5g9_<)%mI%XBm|^IA zt&_gRI8gHKc$ak(J$D8?TxoL!zNtQ>c-#Q$yH~t+mDyikPZTY0?4nB)63kRzl~d-0 zLMt-qqb#x$+Kg#HRx|uY08XMR%SM5HbI8@yf)h?dyXK_KJx8%B_jV1D(psp0XJnZ+ zv-QqURspY-jBFw{O50}efdrmP=7-7#+sBa8dAL0INij$pz{ohLgM-8V zYfZ=66=y&cy3TB$oZeuuT2C&q97___)zummevGD2@D5axDU*^ClM=B*OQYPFH1B3M zl!^$A>#XDpi&%{vI#}n`me;s@OqMplt6KsCLyvkSgtS(j_=QK*H&`sG$}HVcl|z~y zRnB0OC5bVn>h!!+G_CT1h-!->8QVAWj9eNsr!o^9R#NKf9hVTrEg{r72Dy^VYdmd=!p6XOYo||q_*yQ z-ewXw^&v&?3s=?CO$~3ewNX-0S5%+o-Nwu865>jxB^b50UmH3~Aex3qTA)Y2pGYw0{ngbD~LjXEVqHw;*_ z_15n$UbdasxD=L6Zsm!IS&xwp=UDb6=d)Q;lnz&_eM=8sqBF_NG~w!=*|%`3DVx-s z6cw}{J6yN1s3>W(*_QQ9E8@ie<7xl&{ zE!kLdHyl}f?~-3!Hvc?MUYog`o17g|a7Pt!2K)gMi;cE^R;GvGWVL8==Qh$O=PpV` zCbX*uTwI(yJlrOeHj%7a`<~^!y5p;;&EQJ#z-=rFu8ybeR7f_(Hnsnvz+UuhpYQK` z{PyIZoYK-!1E)H8?Baf6M`u!*gUKXB2M)3@*>~Ds{b{bqY$Z*oc~6==Z!@8^;o?AA zJLt4ramVE-5!_+zfjGxBVh$t)`gJQqvuZ*Dqv~5nypKk6q-^ypx84oxEQ7IKI+lPI z+u?W8mJJ9brZXKye@%LhsE*E<;w#T2GNUikx_jh$UJ3CFfOn=;Xi{hM#k=9Qm7Sdt zo1uf#Lih<{yAnOXw+zw&L|#fNHr*{$qy~-*=HdP{&7`=FMTXw7>K>f-DQ2w%!C8&O zKAD_X`UT9laKmVVORL_fek>Q>d^L-B4J8a~WQ%)^$D`e^YZTHs-sUBhW1b=vT!Mo& z%zBt^v$|;Pr$2onMJpLaD30)tiw(A*rcqCF=n{yA!r-&C94DVX%w0+TFlwOqoFuvu zEvY=K_)}{U4>t_Qu_3a}KeD`Y4e&*MO-?+vqE5QjCWVQfQ?gbPc7gxtH7FW+XOPP4OWaxEhKNKecj=Cx=y;yUx_9q-FSN zi*>%%4@lwcwPb5tz^7{i7b44(p3f#0oB!Z%zJKcscu}?%u8;1%iWodLfZgxTH@e|( zU%H%j5R=so;eJNDmqZx_Z-S|3AO%ycY3&g?J9~D2Vb5nQL3=f%fl}5+>W#d$qkke0 zfhJq8s5*X?DpJnBP!>(Cn(DomTkT?@LDz6lN>*IuIei2GPFd^i`KNxT6YJ zzp7}*!kFKnuZbb;RYYWCxr33=s}uw+)~kN0ntjRm0iK(B&tNR=kU)w96Y z1Rj@R)-05zC?;9^ErVK-MYH<`TOJuC>=c->y%(izHGp*KQUcPYgd&6%K`cP%(mQPFH6Rd5s7jMAH9+VHNbkMf zC+u_I@0|CZd*1u~zTeG1N>)~1>v_f;W6U{O@Hqk~Pq?;*@N<)A`*blZ=&KmorttwJ zT8T0JefUTKpauJbX6*z;o!w0wy3CtGD&cLZ4-;sE(4P#df zV%N_7w1Ih|KI~6kMeNMeD*Ge22f`rO!1CgaoG}@$TAirxX9eBIO3DYx6mi9k7;hmb zHILyij?4lobgp{_?aiPz4VwAlRh`Tl4lU{#xS(>CA(!f#rv4UlWo(6j#p5M<6*jzD zb_}}hK{KMxW%_-q8Rxag(Qw-NfJgV*4bgcDw{r~1?tJg7V9BwwYW$klfi*Pp5HRZb zSO%}_+MPgQFqlxO!{1GT)b=$ygVi<{?lB!MmvoPN9j(ZP-t`22?-H`Ta05{_f7zhM}POO;pxIWtBCtwvrQPjD-Lpm7P{b* z*)VEJp!UAP^>GNTB;ln?lf>tcx*{sazBLT!!ETTZtJ2*aNTnle^luy(WTv|dv^;{kcja3U!Lr#_ybLHx(RVo{lgR`v(~aSD z>D@^oV4)69_v)nAo=#%%mW``Ec+o8Bi=!a53j!%@*sI;ES@T>&0#y~gPvHBck4mJg z;z$9$e+s>G=T0#fs0usz?PDtkXpT!UW%v(Z%X>P_`{}l5%n_*K12Azhmurq=s{X!S z?nO6dfGz9Wg;H}XJLX|m>dTGay{qF={JT_4dpijUiGTJHcl7GkC9l6OuiokKyy86! zHOsXdtd6c-?C(h`Wo@HBef1QGhNBhB)^4pFOsT9+6r7+zR=mJ<+hudp%cjXYk~PNo|EGw*GC(xp0p6b_1<3}?fX zznb4_YgH4`rRkfwl}wC&@YTn$Jj}|g;Gp}R3N-YtWW4MBiBy0RY6dzBFinQ` z?nkeOk{MU*^0{`Ys5}Dm?jTzl${6n2f!5IxpSp#(X4(VArq5twXZ-Lz^0|}ta zf%r#_D;Lo@tT|omYMq*!-fZsc#LUiSG&N-m6r7Zx3;Rx1c4nKr?2W-jysDj?z0%?% zlAZGB2`~{HSyqKDs`iw46xdQ_a{@qdSrT@h0MEY9 z$bXwZ3O#C94ed@Y+>1#`HdrjHTX#F#bg}Hl9o6j2&z}QN-u%^Mj0U|O&n}M(h)r9^ z=Vp=!$Jl~bBx=XE#0+BQui|Z%#N_~9AA>D%OO4lgP^!3SQvu|f#vM`~BPWN@0c|n} zk$}+by}jLCL*yffJqX#o*;nP&4gL$bt}Kk}y>s;3+pmWEu^~gL<(^ENS!R@uDgcj1NGR63%`t1FDji7*u(Hq{v3`Qf~-y+JA}`{egqH5i}MX19%=!QScS zsdbOEs+k9Xu;6JJv-C#V_Be3)vX9)sD2ob`YiT?4*nQY{GtoPRhXWJwG1@^X zSMz(*2XC48TUZJ5$UdN7)m1kOwm%>{5fB(cu{bibh=+{zxR_H!V@+G3;Zu6*Z%>G~ z&4c)@-YlI3hQbaMYGlQ*%JgP3W}I3A4$g6311(8y)W|g~692g0Si03<7B_&Qku1oz zR!GX4-I0Yjti4(ltUr0+DCHq$^tYNUZ8#uQd>b0EJa|pb$w#%e{f2$<>JAgxOpN+f z)82}nU(Yle(To-k_+`}M{<;$?rJeB^Z9y%sO_6~&R7+!>QHi{a-3Zsxisu)M1}PG< zsbtW$St&X-VT09>a(h|bzhIX%Od@KLOU6<^+5GCwn3%#IU`UlRs}+>ABkkq`$cO`! zNFv%?+{@=BerA)p|MtjPzEaB`df5Gay$|a`xk^SVyi*v@#{pkc2qOn*JVI_BY24Ip zvedf})@)gQU$lrK5t$sF`Q?ow-&_x=j4FvBVuaiUkFD z5Qs=PQf$a%1 z83E{0O^sZb34y>QcyP+AGv_`PN*|_Dln~7U81S;8=AAOfJe&_`lJGo8&_6rp945}` zNdcJ&T??rsH8sCm`Gg~G(CwzfVlIdB4as8DQ7qIKU%}A2jkxV0 z9-u+x{I$o53Z4BtR6@#zrVk;MsbNk0ChgIr@b7Iz0aVoKM=2}`ZRFCZXe`oTL=BT_9z1X)sT}^?2 zQTkizh5fozro@8(!fRP(=VzrhfXUt*61-U`aOFKe?NxMc{LJM(h<9Z-q;E8Wmb)fO zk=&u1*!6B9m^H9Do!zR~)|+fqHi1NAi9=Hhr-LJJ>dJpE%}J${1AbyPe|vDZx#Ts8 z=ux1)Um7nVaK{jaed!Thqt!i+lhf(Vk-@&sS-TB$QOnXG?(IXxygOAedqJI~6*MfN z-qEYN98*?3q<>Ej%t%sR9u6Y~G=OZWI57I2u`=V*925;04@K${RV*zx^#d++zI~{R zBplt*+GSl>j@=>==Oj|ZS;pQZ5y2ktfS}%{YLqT%9IyrDG4|0_Ka~ZoyF+(HTI7cH z4GgPFVfbW*Ra<9HYO3?&kc;U$T;G0G>SFw*uA;aWWvQ@6+EV{djvi?!O0v^Qrgg<*f{uy$--5hD)HWn{I^I5uRJq-c* z(+%|Lu4a!VwP>ym^j;MX-lz@)rscmy?tg2c^R7x;@4rgTg8uCisSN=n;@>?2URK+N zD^V_Xpf0IB`WZ_)@j8A)X(Pb?s|ncJ9e{*K*@3ktv>P}EySh{Y8)KYsn_I&Ll~XOX zA-c5?2!YS6A7lF3vo;F?ZcZf=0p>;7t88^g60}b!a_kR=2fjdo*S3vzCSZznV4z6= z5Rf-TdG0W!TL0Cax%4{G(ep)Z@(d^%k^~scNtJ_XQ=MoQ`Ebzrp!V$Q`(J(`n;dwZ zFt~4cfZwjV z#G(9oaq7cF6pBJ7!$71VU1UYyjypGAEJki3mdgng4@5T>3dmWkR=}R=X+`voEuUV= zy9#kDAp{|-0`l1XAtkB7sMnbo)@g!*lx81%8}SUT35_pw`>5{hsPN#n#SY?Vtk!Hw z)XNI%Q_enVvr8~W@Sdpx*NPJ9Fo*=++$o%gBTQ28;DL$m42h^(J zv$p58hMYJWPjJB6)!}2fj+=Rv%hyFNzwN9&Jpg(Qb>05u3-vMXpj}_J&0qg>G_D(c zQ2Xu?FB*+@c}4*#-}_IBm=(DAlfk|qs5W|v+u>>_CLzfR0gWXg=Rt4z2ST3X-tA;i zMCmfjFwvDzi=y!QKO1@ezQcqE=-;}2|MOyR+!L(<>Ej0JjkceUUi2NF(Eh z(Y}J0xBY+g*3g5eYWy}~gpm_M!0I+-5oD~JzVaLQPFQ>6(vchWkw%CT*1fUOZElrD z_{0xb-JjZ*yhZ;2uXu;zR8GKbrEexjaXt;`BvOXv5QssDG6dh!_P5MUlqb`1W?S6U zpj;evxTvT>sT-}u$wiks+BdeWQ(4Haq5xiZ(`*6L@J6%FRgrwth=mZFA3-^3##J1| z8cmy?erz9K3(&_Q157HT+v03xKP)np3daeef2&Ns9#!#w=o+=Tmb6e`ZTGs9+&lmT?ZfsrhZdXDgcjoT&Kyc;9jL z&08G*;-OWuwvp2COzA^uZZkqGfQM)$RXzs=!ym0Z1F z?-QG)Ydc@3Sm57KWx=wT{ND_eMe6!#G^wHWuH3QjxT(>aT5;&BA^@q!fx5Vmt@PnC zCQ@KI;dAjlN17g4?T0r^1w2oXXaW6I7H=N{1$TD zRJU5xE4Z9M%`CoL|m(mnGgxU2^)1cD^^`Co9ivIiNgA=mvL! zk-ekEI|3mQ52<|N#X1u73lHWmLne0s4dpEwZK2P#F`90Tf>ODu!H2FS4CsZY%W7t1 zC&>1*@OQDKW(J)URq)R}*OWER94hN#6Kd&cTR)_K-Ri)_zWYJx_P{}XsPx)kd+z8j zM|ELk81#wQ>;v(RqMbLB%^2gQUPWTR_F|UCs0&cF8w)1)$RV%12rp>x1FI)=3sHrR z{y8cfSFOxCLsY{p;wa(*D4qV59xc35FA;R3QzWXr-K=kLNzwH$xvGJyR@oNlwu(7Q z0|v>gAO9=0MCnesnXhU1=X|vni3l;JzJbLy4gb`K90NZsEC39`%{{@FZK25mij0}He;k_#qo;6b zV^>5>y2(Cv9OQ0-#;ptt3|8?XUYkIig;mv63b-9V5=IMM5nyGk1$A^TKg@j zZUK|u9w85nkVTS-jw-zu2-XWM`Lm&M-u^|jIVkQ2HN3QMO;}}e^%>#6=SG6+N-$sp zyQ0_{$7IMp(B0XXJod(1>i|*NSrv`^)u$?5b1Y2Igq&fPH#OQX*j*;1hn#J_J0y^2R3HOWg@^wM;#U_IwK`&o69mUMFI+{Yl^j(~L- zUD$toehys%%1+}CAaBb7PA3fR=ja3c`)`H&|G2oG0th?%gdCc8JB6nMfM5f24%;z+ z{}gpw;&oeudjaxnz_y)0_dmkE{t2;svWGEq@UPL;KKRG90@>dMPJ?nKXy&5DEmE~P zhvCjSgKp6*d9Hzg%cSSh{v7P~Xcxng_$A1`HaPmX?Tgsjv<5q67%nZen4vjX0B1cp zsL6Ii{(P?!w`epz*=t0M_!=E^Aj~>JIzv3c??;fjMMp3hgqm_A2zLHn240LEXV*dZ#I7hWhxWvYY0GPtJuaZ z8OuYJX{&tOKpKd(M@}r}5wI)V#0d&3_i1)IL<9hnqic!LY;C3(yH=R#vpVjDImi$Z=3Ew8>Kfd+L8Pk1)h#RpayFW-^>URWw8AR$ zs}_Rs$I7(gz8od!d*U4N8`F4(qyF!UTznY2IACkc?n|IvJ><7|pV68qAKpl5I=a*^ z=pvKkSB7>NJQ)^q6rSzQWH*)55t}KtATjtz>!_?rTnZ*U(hL!e(L_|hPnXmWZSO@+ z^X{dxV%*CQ6_+kRDs=vpOMP$ut+h+R{^S5?=(~VstBG3q*f+I)yuV;wSm!Qgi|l=F@7px1-BKN6zV19%;$S z5qw|NcyIGogfSjaviUnPA|!qwU|x|nTrL1KH3)H+3#FxP@Gfo@n10GWV$~GFlC`AH zp<`eLFgA8yTCaxVr$Ctd?qIrj!IfZ??e}_luH7MxIjV@sPa8(=#`|pwy&z(%dc&$-jb=h;0_h_ z<gB!W*CBV;3T3>fcULn!U@kcXTawo zZIJUTAa7*4`CE}BULSZab}H(MoqEf_;o%~BdUn-gd}NV$y=CduT^FyS%6@$Va3u7J zstXIpzxIFGikWWpjSY-1j*IQx++%c=w^vZ7$BDlo@YG-{fXEJg(=*!~!(hj~8_l>T zAuaLfPK=PmP=&#i!E~QM!ZU0-w5uDnaM>jzxk}J`G(bojnlc!@4q|7 z4u`TR27%FImAgQCOkAw?rO3>8SkCP7_A=rA9}Ktlba~X3JMw|cieKG+yFK-KZNtQM z8+U3;#k=Em?0ldt{}r6u8sbRooz$Uophv9$OOq%tp4W4OV5eF;h(G6ug;Y%t`;48x z3k0yFsdI^nGjqk?6ZEdBE5q9QQoDN91!2!P`wV``vo6dHv~(^i9E0o^5fjP3azQ$%5m)X{EbX?(QBFMmc2~n2hx?Tu zdwll2^5A{ODOH59c!!Pkr|fsM`foLFmPc4f4Cuut$^dKWzJ$-iD`l(zu0~VG2&-*b zw@791sgJUh>54d%PMB0zok%QwhYf1_TXH0}#!p?+9eABk?6Q$d`*3@igp zu$4e*a2hT>Ra{#+S-+Z39PCD9DcLUjv$SdA)$O!MAoVpMo4*j(u6`@*92-dxuu+%4 zP~Tr%{=EkL&bp%gObm^*w9zgIWV8E3kc=c#TQLf*0@b{v@;sDrYiMWF7e!+kgUk)T z_q=U5!N{X8G&|RqGcnURQFK72DErgvisRx>V!bH!hjxjSsZ#A1AGjtJMV{y8sOIJX zXF$vR+U&ez{!KXN>=PcS)-S79n`%+zQoB|@Vc8sZa#m`>^D^my^~9TT)T`6CHE=gS zMQLIl26DM*E<{^$?Qv(lNGqn&3VTp1HS4TkFozIs{T%U{jTClV$Be0XgbAQ6Q)_V~ zlk>4i*en2zPAiOn6-J+xz+O&AuQBx720lnm(7YA);}724TliPd^f(WO%j`H|m12u^ z=i39=oUx(NUpW)-@xQqRQemI@OTpx_j=vPcRxE_WEE2eG9V-d-Ykpn3wdvbAl!$uB zc&@=W8-C_2%Lxh1ucrSKTVV_$I z5w7!=-<;VxoW_z&O{3ZCrSpt+xiq*Q!v8Bdhp9PZnA%QV0VX=%KVm-PRp!3ZAl*vNjx;v6Yh@;V?3>}sW*=c5My7=M3YH(*eBnUckN(x zxtg)+%zv0?_ypoDZZlq9ho|ahA9p;bG>O2_H1+GCsB9&ZJb%@to88b$z}5|0hbbFf zJEtlWkS#NmgkkiTaa}{F%;H?bsDnpQP3`E~$=U8IudMwtn(>ScZcI$!rb7KYk?D7$ zPgHZwUo(bW{L?1YWQ#P8q-SqxO=jZhZoX4&!@TMjz& z3SsOnS)<3d2nv22_7RM+LlgVm;iRU%LKLGdt2j~P;lYR1b(~oZCJNjtIsc85P7H2O z*K-@%{=Je&5qwElPba#ioC`fJCMq3E%LOySyDUwO6mVKn&0PWORQAoIL#W0o94#Ey zh7;uX*okq?M+`SDsH1s8cEv|4kTcW0$IEV}GbeUNo=dyfDThtZ0Gsxh=sC-)B_&Qy zS=|QMH+Ehw&S}5D;HAD6?L_6xt90M8xbkuMpovIy)sBAq8ypmrE=-Y@6s76t>gwb* ztnhGjEZLNovu$DX*!n*0Rs)W~;IW{`CkvdFpn-nv8w+DQzF2Y3)$ef!aT_cCd7?aA zUERbM7Svs^N*7~eoM%7+V@t=bKG&LlH`4crB9w9zbb@`J<=Ze7S;EoN+uOSY3T5r$ z?WMOm1pCmJUxkYB?~KB4xNbhM6tjpQ;=57DooMPZun*c(D}?_7jav!%IHfihJPu}K zj68P+qM|4phCJbaK+41ibyC`k-%j~ZXA(NlLh7$0lp>}dGS{wuCo)$k zehBD^1}kddp5;?+S%rI<>l)U+rM*C!xkM=41<0AEZ?FD@veXoBWx`15ii@O75D`-}U-?hXOXun}xW9Qx3+Fkr| zPwA5Q#6j0@zcgEF$wv46b;i!u(^IOIa^s&ajtGwl9;lrRpMrC^NP0qGlO|4AChj`i zWYjRtLbfsdMDHC3d(>AxL7u99Er)?#wX6`aAS-EgL3%r>qqj!w=btLpT5vcGQw~7L zUu*2yn~ZL1YN{bG52+vbTuE}PuXRzDcx8l4SpVzj@!P7q7DnWv$jGA+`x3cfG;o02 zHLtomC-HVa)Iw-uJ!_QN{`-ZM_|>@M{Zre}&F$n>cGo|v# zOtxEUqSA>iWCnJ2nf4z7FPL;@L|2xJ8C!{PsNh6intg;s={ugZR;LeV>)5qQ86chWZ)8C<|54)WR zjqHuUoez<1wZel&+$-)IVw%_3Iuq<`4@RB3lO&P57@T2(3-@|t{liBsH)LBch^3qE zEpPoUivr2+JvD^dpb$Rp79RGHd*_Xgl*ag#1DMmQ#a0M)c_Av5I5bWN*#w~rWbTl{_SBlcoJwmKd_cne43>ZMCIDKYwcN>x&nI^>~ekB z_W^<-=$U-qwhy&o_R`_TYNk#uvKk2yllc3WR`@cmb~G~o5!zpg*{ws@*$8g(hEq#p zM4Vm`)Kvp~@muHIrK~b1W1l#lgZ^ETmfMGfOEz95RZ_Vi6Ov=2{=7lCeYE^0jQnYN zga^eTmcvmQbRt{YIQ2dn!GeY_tu08JDyYpgy%%MEW^H)_{e5V;9y&P=Cw{KL{j93;uXz> zJ>6Z*Ga*zQT3P0CNPu#3S*A@OdY!ATCjz^qMQIgfbM&Bix{u^M^WlY3-`m+J9af1` z3CqgpdrV)f-ZVSFf=T(uKBsHSai}UT$R&UCkDY7$GR(U0aPt;dcUTbWlU17`M%>=} zmy5cVKeO%xyUbGu%n`Btf*FEV|HC1Ag@(ExlV&F;!Y8Ri{WO3FY(*x-4Ep`XGo(Xo zv_K!?Wf+wt>3~%(SNEJ}+^-IQCJjE5-THuf>G& zn*@E`;7vQr)(*S<#>trH!CEBKG&IqkM^Rtewy)g%HjB)dV~$nvl03cynsi{SF48Eh zJReZ@<_>jY@ZNaXZ4;Z#!O%V93N&9yY6&!c&&5PQJ$K2cY=D?G{kOt^J%&74{rCBP zBlkoULOy?pv=)80GEz3<*J|TAg%5kPS*D>3vq-LG3(M(eFiN&d$bCL4`6L|miS;Gk zZq@S$BC%}f`U;mT>G?5!#@ald+DfI&Mu6$tBaKdNagTx0Afm>`th?tnw=dP@YHvQx z#>44ZwB-6l;~1lR9e3Y#5}EerWiA}nE_qBR3Nopi)6d%P^silW_MF(W?MDuk%g|7+ zfnIB{=ZyvRU#g&0!&VI$u(paDpgQ?Cgjq)uoKZ z9Q(j~KjK#Co(HH(p1*Z1@>t!~lK!xu>zu30T%p9*UdFF1VhZm(F_rr|aD|TgX}qyb zRbYM%E<+B=lJu~bL+;IeA#v6g*zXY+*SQ%Ny-!R|LOdNsecKzJ0r4?Vj}aU0<8^kcxbNcYm7?2#&(`U3>d8QDwpeSh@7U*iX<0W$l3+M?fkC=G^LgHRv(?TJu7Cr-|OnmIl9FUM#x@8s16h-IaXiVBCBQj4AptiH=`%y#}|TP`JsBb`slX zxb)ANDKR;gi}4h_4ka$7NoY_^1SD$+jg{VAspVwGfBxXagAnJSBvmtFLw~v6Rr!-! znz3M9G|qA%+zI@yY|t;_+TU;VcRqSzKR@IXMe;{>>}d)JxCLf5Mo#01qi9qC_#0di z`B7+wfhydxmRfO;xf%$C_Q%K%4jY@v z%d&Lv@g=Yn?B?f-CqM9^s8;A}zGfn43LRa)nAIKOsM*hen}nt>&?R6b^ly{mZVht| zs3ovvY@4diLzSGKg;L9-QAC5Hy75#9wwkBHU!OFJWr?U3r>cK%)r-;#dQP;7UB9K` zne`Zin+W7%>8bSd(kEh(Ldwd0`Ad>x-pCwn{`(?Eb4=;4pwJriG5t8^eU!sit%mhp z6s*~Y=A<99nA96F(^Q$1TWeFbA)s#`U>x*S68Wy2c)N2aD0?AFJ^jFaZc|`4DAa+! z_Lyr_h@@0xgDcnxzO`A>_}B%=_kE%IjvMJ|7{{z@QX0vW(KO z?!VRgY0}BC2d)m+U=zW+avGp?#WnN;MU|5(r%#dd>Nh*mheuTLLOz8N*7{SKGGn_- z2M=Dx{9=5l65xqo*<_`GTjrZFA?4KhpkBqIsqYY)A=($2`INoZM zr()NZhA^Y)tEh_GA4sW#M*1;{MRdwDL1Od$c_B2^iKIKqRII{S3e|In<1MG+p}Xo5 z#vWTrW*nCm^30-HCLfo~LlfcBb}S)T6#61`vqSyMeHwC${$VSs*M4JFIJPpgpd~Lj zi@O=0g^X^!hQ2_TaMsW84xBtm$;&+Y)<-egZ4F!kajR^#Ke+FI>K|3ADAPoIEOJx- z|7paL8lCBes9yYg*l7D06n=3%^85jUc(N7&>sZq)LJ@hK1|K0p74d=V6DA|YfRTC8n@<00+& zUErCPazTZQurskQpKgErHVKU0!@{19j$tU!i&EO&e}-m{{kuP4Y(TU1e*2R_d(Sz+ z6#p5qkeL;C$DJ{qMedT-OKgaJt9@h=(g69TY= z+=kCJp_ej2;uk+*iw+cCQ`BBlI$pCnUdt_Bwj(|ehy(;2jCa~Pumc<_8XfkwNbPEXi;vV~poqV0R3`DhXnFQqqBe&; zgIIxL#5dZQOzH~kdfV8M2FS}JwEdpSM5sdh=iV16exsdv>N=gv%)}v?Q}y0v5zCsf z%3@AB3^wsaS8W&!=CUCvknW8+NdmbV82{n2_?+YjNXDAkaGB~|!R zfMJE&-PeJLDfcaW8|ct6dZQ>j@>c%aVEnK}f~K`2v-NIXR`9LNgMs_fo)E&F5c@O1 z?a9(FI4*}{vXYvrW-ca2Fm^9c#7Ru8Fd*DVOT&D%WN&Z@pBiqgD+*6~ok9JJfi$Pz zk!&soUfAXxHLSzB+=VgS+$>weci6sV%g$Cd5T#bjz}DKUrx72QGOWyS%9v&%#`?c% z*P6*tP$Bvv?WlcqtDLG%?wFfeBKm}Ua59EMwFbv_T4gGO&M?XV6HPN6x9ExA@?$%> z0i|u2lQ))gHX1mUSfgAtcXe&9Y@zoO=foQ#QtjNe#YXFk?VST5JJ=2`}b z+aQ9p5YQUEx1$O?*-R$mQv`+sGn8!Z+)|SM`NLYQbp^T$g}M{1lB)%UCr8IKR?@Mt z7CdyeaJA3jE>_=S)|rQnUfUAb5)N0ksr}k^$1-!| zGI0w_I}6Jyji|i}9-mjs(6yBN%1z5}d?k!CAbm*fa(P6q0)6YD3Om_{yv_^BmOw_z z`1~PCw=3~yA1$fq@y|FsvXt#7gAQPvN!1cEFjFIMCOl$=xHM+=##kZsgz78we^yxC zeGQ-1rJEP$EweK*P^z#DbCe2U4nlc=s*MlH-Z<&9?xF`V;xRuFt^S9Px0Kl{EX2Ij zIY-*yi6sRrO*Hrb>7ds-M)am8>S88|_A9oUnd&fJp-PPR=Tr@AIdxlcG83okJQ=T` z{hR~W@0YcO#s3z^lxTdl2T%B=7~feLbG$ue>wX1RCC5wuC_`kbUWJJPm)&ci7GYj6 zJ2L%Z2LLyM&4d0g8$F9A_W_sOR#@BUJ?W0iJ^r6qWs?Y~BCqC~Pdi-Fw_nHVv!;>a z*oF+gEGM9G%xh}e4yWaZh<^t{%Mg*-U*(VN^N3qCO8j`-y*%%BAme0-lwFC?j+Fwr1uvv z0M=hPpAHwn+?d#to%NY?X(V$j;UzH(9A_JT5ALz3MeBQ@kBly&PgD7jzu=GMApVe= z5m&oLOPDv|q_Ry_{dMz29!4E+R-}kNsPFWb%iR9e;S$Us-?N)9ay=ZIW=Q!&$j)c# zu>{F+^$G}TFI!nw4(@t&{7Vplr2Ed*ZLE7cDj+*=n(wIj^@W`F+BWctRy__5zy5L4 zp*8Syc=_>#=@S&tPbw}--=ux#wZSzj-+~pM;$6e} zSsK9^rXEG3`R~`Pzl5%7P^d)4atKxYtm&m0bF8egYcG-Kx1^`oE0CLgKO;Fge+9xe zoHOMhwnF#X%4%T;l#d0TffV<-I4j&Ae?qtC66~e+Mx6k6uWy0DupaU6XzEap& z{CvnYb6vT^()Pz?97ZKoFEa+y#;hkb?dDRpTT+a?4rX$MQ$WraZO93N~|W%Bay5MQ|a zdEOoB3<~^$`5X|B`#Gwf)^tW35LH4)y^qh?`-GBW2@MC5J-{yZ{0KfZHga&ajN!B3 z70o&~4yplQ<;JJ3FtG>tBtY;I{syq=A3*DWk2w1ucr~yXi48X?)D$i7bk!IIu2x9> z%(~EnCRTyqzmmIZIVXyyUDmdH$$NQ2vGJbUah*Ha!>(QouSZ)MU3h)kG3=f<_iXNg z)g)p8TJx66)__T4JY93C$upM><3D@-npJAf9{JWK++9vl$^dOERKL|CwA`@JHqT*+)Oob2-Lk#6m>0=7%ss zIYPZ8?TzzBg}p#`?}PauN2>~}8gb8E#57&}S;eQIV3)%En)CSQ@+sk>{M~tZS=Lx)V<{!}&d2Aa&GKZ#P)~8M+f;&S+ zq{}3V08S#0Us#b0hvo*+KLeX2kEf)t?rurX&LhWt1{B*iQ}=DVC(x+EU_h}gst4Y2 zL>9gWt|M{0ZG-~19kkOJC~FY!B;S^LHt7R-CJ*pB@4-xV78l~;d;-h0aoV^+Ki9&< zyB#TYj;^L+21b=wA@O&{?xte&XoJKQ$vO!T7B7`|b$9X@>KWo`?DEI4ZXSGkCbPW~ zx2Oua3eg4V0{c-h!Dn0Z_UK!F4Z&49)K|A+R&V+>h{sS}$tujxCjs9M+?k)dqKLz} z#t6Ku_HZ?oc(;385Ip7Jwsh=v0?XhricPAj0Q-vJ?dV;OTgtlwp8b`>xZ&ZgcJSYk zoea>H3Act0T}=EkOw?Yb=LNUob6q`5+L?0job6rscH9&-wTNl@cI=~X16HkYS^9q5 zv5=RCcj2ce#@Qz)WW+Ubx(=QnpGr5Ep*{n#s9hp0mqDdC{VIOfJzlrMVQclUxp{2K z(&DP6UH%%9uN>#*dA^si;Hl=tP9h>fp?3>i4i#VDIC>R1OwBDeJD9=`+Ip9lD-&$Q z2leY5EnHSdg9n1AvK^8G{eL;hTsh6QU{OJwD3@g)1U(@)R?DpUH&C6HTy!&q$=&_zjvxB6@4R+9@ zuX=X)11i>n?kR?w)ar>Lb?vvDHO&^WwJMdBhadk1yPamN#y&2RkOQsAGue>?F8y;> zIR{~Rj(~Z5YU#2UJ;KB(Ed2(d(iqIgD`>?0FJ$Hn-PO$b=S3f26N@XSu)-IA$^d9)zg z_I8gY!(%68=JYSZ=$#)QQ3F;1=4#(-*dkUjvL?%ISOvs8=b7L9E z|1NiFMrBL?eif2a#(ZBSW>WozY}))!pWFJg&y}~6M&htXV6aejuzG2zS$3iwrq8I6 zrCC>SqMqRVitTfVjiwbkyR~@m4csx?1DwyREH*aw@dlq*jNm|UPG*jvEAqqbM8Sd5 zgu2~aD_Uy5#UN`k96MB#ePB?FbQt+j9#`5Cu$8-_8BrBk`Q$Wt&6Pa<9%h*FdCkZj zgNo5X)90R1SLAmv{Rjf?w*mC50UW>SXZ`ErfZN1Jc9yIH75T-1-`|*6FX`Z!%<-kA zf=~8*?B&{8@hZZIIQPR()0MaL$E?rFKFaj(ow&{9;*TCiI2e?)7E5$S&W;@O0k8?F zw^KDy7c$VN_>xk7^4pk5!!gpnCFI5HCzjnd&h>I`cs= zwYK$p`uG^N9DGqvCHHm^cy(Bo_(Vz zv&6`M?q}G^y_V|8c@sC~&UYC5e+>P;oDZ*K$&KmHJt8fmZ`}G8%a_)rQt~G=Q>V+$ z2rl@qX_s(0y;-Zo>&&l%(w`H@U3Zq=kg>adKYh;PJ0>I7Rca~EPd8sHXxvQ^Vac#UDZ0&pSngF3n(deq=vq`0CW4W{Y{>?DN@T zXk?YiW({E&!Y{}}RJh3hJNp^dr$2=PmoE6TFW9fQM^FB;YPCyI70S ztALCPJv|T5#|Kc+E0)Rb79$vXZmk#vn#12Fb}8aak>(5xF&osODQ&oA9_^f+p}qfx z8t)!;O`5qaWW4G_h_*D`chRD!{$5&o zgeJfl2cZy<3;Iu}Pi(=Mu5~mlh`*D&lqIx7?o8YM$%VP zx|s=UB5y$539UApoFB|C#-gl#^xjLSgl0o95#C2wP9j6GBO+zmZoYLt6TNPpB6V zW%zD3@Qo%@JMPeii~~{B|C}vfPWFse&$PmVjEd9a1AvSP=atG(l`eLkfdJt{v z1Z_^25^_iY{S<=u8_Kc&qw3b*+}Zyrq$?(o_;o01H@Xkf5zao}IT$Rjm4T)ljm}Gf zI-*j)GQCc4?_k$9KHqsSw*)%m0@d9WT)~eAyXAGtgxvmj8`SUkSM=@<5%E^96WZwZ zp{K8}gZvAxRi_m3;<2$BWDM#QRER%JIbBEzu?Tf?a;gJG%suvJ36@=R-QE4gN7_K3 zJ@rA=uKV!5-N`dba^aSnvh

^jg7r!AG>}$rt(^#NNj4NNaG#?n(RUu+7l;exhWxiya~QL zI|cV;dt>0DhFSdF=H_N;o;O=>!!A2n&nvzP&?K$Fe*XRmIHFlX{dv`@8?novmf0Dh z2A5J*K-L7I7}&{x(aAt*p4<1g%chJ+E5Km@_J~5j_6T`3Yw)qqcgHiy^O7STuL8zB z_r@j;k|yF@DAz9`FUfDnf!eA@AawAX=z4Z|h^q@pce5o_Sr8{?Yt>i-4hyO9>5qq% zDMyuAYrl@c4cSSKmkwAKBf?yalx0m9N7^tEmTH)gmovb zrYch-t3o5lqRf4gCjM0r{})=7&-Q3psHc8&a)#nJ(8RdtW9MTzpMJ34nKCvsJ$d0GV*gHu=CfOdM>SBNmdI`4%eHU z)}8nA=mrMe{~D;ZlG$r4bm$6mYFvg*URtGc zlslK}SUN+YWQp6(YV(kXzN{X@(B2}mbxFEF7amTwreH#pP++|%QH*UA88d))B}%?? zLdex9n~(viXZF`GR`b3x<+zGSaqSl&BETeQoK?d>iBX3~c~q|}i8D}+P$nDuVzzsW zt?-XYxZCJGw;>TN!*+5xek=SGUHowonW)iZ7B2ug3dB=>!@2@ z2Ho)@tM=Nlfv@svd(X`Vf2YNT@xH;mWBuh!kfBzFuWfIdT z6UzdaO%nM<#=}=H*(I7Io<*xbp@?W9i`auGs}`Bq;Aam>N&PzmK7D?|Bi?XrdL(3f zLw5F4ye142pWvP;qSvh$-qjw-6b_@hgbC}<5!4G#u!|3y(ZRfV!267M_6h9LNVdB1 zQBF=JcIAP~tPM1N{<>tx@o3W9&yc%x1S7)aPb^cb54^SDy3s-1l{=4izNlVmlYcr> zTY?qP$%Nk?kjc5(5{BQqmze$>7CfF-+rcp=BKK`^tj=Y>;sfKskHT4j0Jf{SwcO$P zR9H0Jjz#`4zU0%CdoilSWnzqf?5ml6)DiC!D2r|PDidyZCO;b=f=YN2Ef${5yA^)3 zWkfA{&O*k7DD`o7)D)HuFBPMo%)M0ox}|PdFYfM(`}NNV!>jkRynuiuY_+KI=~L~{ zQQg|rqJGC_obq1E043omAw}de-xph18WVlnS~jI!jL6t)fA3}Q>#&uK$}ZeQJ_)mk zPPI1p*4CLPyP|)(AI@8IUcj}o1rI!ub;iC z85d-!;%7c*o6x>Gn|Zl#2y3m}D9fqoo-y2`y>6o3*DU!aK6y7|y;ne>peH)8gR~#x z{<|rOK{lD+Pks#z3G+||FlR2A=$I*)nJ&DOw{%1wr5`sti?|=@3)~h1>IVpHYvmBiVNf7 z1f8h``Y^<$6ZCO+9_P8KF5SJI9cXE34!WARsN0!}8GC0HY2g)Zd)W1G!AYL!ZoX8r= zDpZ+f2%Z^xoASzZFa-frX`$JylgYX26!`eGW*H*NWE?eatMYE_MbuP9S^{%)b zKlG=Sjh@mamU$0 z{7f4J)_#P(C5pgGCG`RRjd>@qZa+|Z`N zpzFTGCCzW26c{8LRXEQ(YVO5#zx72)ogH*bhXhM|f`(M5fhZ}E40N}sV~jJ)a*nrP zIkCcPrsLJ>_sw)(^v;sv$37h$5XaxKyh5b2x|&=EqVe5hkgbk{8uOhp!k^saCc%nCi8=5iMGVg%tW;9VUNniq{U;u#C;q6 z-rKa~+FauLPSE!B8$9TgOx0-2^X;0!qZ&6jVyk?Xs07a$n`9*M4qm+g*bNJ+!h)68 zLj_w-f==^ihiBr_;zL`aH6GwZmk;!p^6+*4S8L}P)kM0+aa>oipj43}vLeFLg+PLY zvLd1&;DTak0a=77p+jg2qI3YlU=C?Fa?#dA0y z%4C(A99<1zrnm)t^X00u5jkI5SG=iimVCV#>wrL34sVlUb21 zV@3ztR)ag>ixVi?JKmQ>&mT@P>9Y-Auvau`3qpU6Mn|v1qvaEx%Vcx$mrq-iTj<=) zUwfg@+{N256HQngp+Gb*VwKdsCwl2;@`u6okHQGo8?46=)iP3$a#_5BvcaoE$R~#B z;f{Iu9Yc*?m-VtxXz0%jbyf4AJBF4B`I(wCj9gIic z1g1woXZM9dwmHMLW(Mq%Kw7`$FH(8i7|}EeNZOfjO3Rx{J**t?KHNCAG}!Aox8*x3 z6**5Z1PO{|LXFfBLZL@ASQ%DoQOn0UcefwSSk!OW5CBH=IwZw+;kRM@AhV-FFb$_k z!gTku4bH{IaWwqem{y2Wi6;Q;|6D?1GT)qFuuwAx$UpkjmD;E9AI7v<+DncN=unuD$ zZBzuxYu{87#1~$}9p=8!p>(BRzZ*AV5UMkNW*?0&< z*ZINz$kxIjSj-P%XB?IW9%McXCtF+T#Qek0$i@8ZT87p!vZMX6E~lz;D0r^Wm8xCc zSRLe&gRPjdLsbZuBG!UJARo>=eG!P&1PR0rc7sv7`9;ZN;)i3w9eDFgS2-MwE<^+Q zn^{SYCV?+hMvgbIdBPs>&-@C$X=nlra1Zn|eC(-I4QF*ifsTh%%UG;#S4-u$y%{)K~y6adIj~T05+M zM1ce+H^yJ=*Mg!$Dt?h6OO_xC2++%>bM1I4(EMVKt37rQJX+*kqNy@(5gHBt4afZx zqKPGm&R`}bGdLC)&`^;D^)AfPd;rE!*I-r7h7AQ`56;`2zlyR&?@c19%Q&}&q%Da3 zVKaM6VXJren3?}nkH?cTFmDbdpqLXm*JIF~8cI4c?rTNrNXa+67aoe^3zJQt^LJGr z*H!A_qyu6+hEi-BGkaj#>drAQAh7iC@xe#yh-}7DwqpTr|H&~A=5t-1M<04+Tjdfu zD+_uA4EH%l4Z@v1tjSRviC$~DU@EDVa2PCfDq%IuarWoSNooDgmOubwyikZ<@<{M} zzvJ=X6#6Wz$IGR9KPEL%2E}Q5+Oh6~wV3DLWR#J4@lzQ}HzXzHHR?{(!_`^TWFB}U z$D?j#pm8Z#*8c!)BuHSRQo4$@rbJ<7F=YJdeRRyUe7S^*o&+?g)Km_Ge3hy7Sio-$ zp?XR>>vP%SoCO_Ira?KPW&1vr9DP?^>I^W4bSQS&s+SKgZO9QKsedl&CJN4`2{+M&ru zT=7Z=&-y9?N6|BV0OaB|On0Mz9`O>XqxZ`fuLZr3*bW~5`$7a|Tgh>y)KAB%*Lfn! z^l-DjqeAL!p@Z)Win8xlRQt)tG7TQj4d z84#8N=AyMo4(7r@VG|6aRIpi}i0m|`Er8%;5e_^jCm$$u{hsJucaLQ)$ z9a6?PPW>|MsP_(5tC#PSLOiqly-Y7j(a@ksr!9_~(=LWOSG!5_nhXMgi4mI{a4f88 zm#+gMaSJ58@hr0|jVj%9Yo{+t_DkyN`V2#&((vbg1gzPoH}^`F>C_ADnn(@#W@0&O z(zuYh9qE#X?o^B~bWBeq8eU-^(8!k2qV))1K{GmnOl!Y`{4<}&Epu0f)O7j?x}{fd z?rVz@#{{PDiLEg(1;*5Ryo&gAjgzFwadE7zrRd7QGps*Fp-grS)7Py09{8Em+~iNE zADZQD#;f^V+IK<=CQMebrY}f~<_e#;o4u$S<<>q^br4BYl+k+!xwI$dx*1zisq;?4 z--u4LkK&h=n|Q;_#utU!n6Xa;9_Jz=RPwB^d+JQcWsgshi}r&!N_jX9r#!- zHV1jhiN!6v1feIHqfJ$s8CAL;54{U>^Vf4XE;d)63S@u#YbeTIzan%O-iUw0s4Eg% zw-r1&!gOJM@78bL@=$h4g}2KoXfc*gfauEBvBf8XS=O|tzE>{};e4DWCR$uPbl(yOat5@g zGawS|!=lr!6`=x^3I5ftpCVF(d2cLg;Ba_v6Y4t8In$;N;CTAfX%St9_iwzG&qp43 z>-#x*8;xx*()srq?(DT?zwX0uc{JQQx=!^1?6DP2Cvc!TgvKuL+3X2y-#x+hewt~o ziCJ<9kkA$fzEUDg?_~{H<&M-g;-}Ob-wmP1ZKkQ8FtNFbr9p2$Y%M}2X7zWM2nkYb z@r3;fzC*ue2uP;}f>?`ZS&F;Nc~pJNPG~4MZHB~>_FJ?dI*P&f))mcth$xz5_=Typ zH`^Yl+w+r!DA(T#cK48uY*^mJ#|b9Q*MxZ~j!CRo3H83&rB*Gn8{+YR(r8~>u^62b zu2?*}H&xLA%+iaHw;2y|&mleh^`bq!LN;l@)yWlH4KmZ%B zFJ5>P#!#o5UkYL&yaSloPl65$3Ra(o;X5>83iKQPjW_*id0E!AUO_YVg}XDvc8u%) zSDIULVFlXYeRq?_ZR)wXLJPUbot9X3DI#nObg9wap;3S~EtOpg{#3WxCV6?hV*}8w zhUE~tTKMY2%j3Jwbbwq6>>y8TmTLtKADcl+1;$7=o+L7y?|^PK+-^5txwS+f!3x|Y zW^stzjoK$=L*~`n#9RzMoixx`G{p09d%?J&Q1Ks$x@S-*l)>j0{CYi#fVpjEO@Xm^ z6e?AJr}pV5{MG!G;zL~SmAa2B)d9x)!wdYMz!w0${|%dM8@x@=nME~;zUCg( Date: Thu, 24 May 2018 10:20:05 -0300 Subject: [PATCH 03/17] imagem diagrama de sequencia --- README.md | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index af724a8..1abd718 100644 --- a/README.md +++ b/README.md @@ -12,26 +12,6 @@ | SICOOB | | CEF | -###Sequence Diagram - -```seq -Ator->RemessaFactory: chama create() -RemessaFactory->Validator: run() -Validator-->Validator: compara dados\n obrigatorios -Validator-->Ator: throw exception dados obrigatorios -RemessaFactory-->RemessaFactory: Valida caminho\n do arquivo -RemessaFactory-->Ator: thow exception caminho\n invalido ou acesso negado -RemessaFactory-->RemessaFactory: configure() define build de\n acordo com banco -RemessaFactory-->Ator: throw exception \nbanco nao localizado -RemessaFactory-->RemessaFactory: build() chamada ao builder -RemessaFactory->(BB/CEF/BRADESCO)\nBuilder: builder() -(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: preenche dados do header -(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: preenche dados do trailler -(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: preenche dados do detalhe/transacao -(BB/CEF/BRADESCO)\nBuilder-->RemessaFactory: retorna (BB/CEF/BRADESCO)\nBuilder -RemessaFactory->(BB/CEF/BRADESCO)\nBuilder: montarArquivo() -(BB/CEF/BRADESCO)\nBuilder-->Ator: throw exception sem acesso ao arquivo -(BB/CEF/BRADESCO)\nBuilder-->(BB/CEF/BRADESCO)\nBuilder: monta arquivo\nde remessa -(BB/CEF/BRADESCO)\nBuilder->RemessaFactory: string caminho do arquivo; -RemessaFactory->Ator: retorna string caminho do arquivo -``` \ No newline at end of file + +![](https://pandao.github.io/editor.md/examples/images/4.jpg) +> Diagrama de sequencia \ No newline at end of file From 55c5d0ae575442f0b6854f45f8bf89403601b4f3 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Thu, 24 May 2018 10:21:03 -0300 Subject: [PATCH 04/17] imagem diagrama de sequencia --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1abd718..7b10372 100644 --- a/README.md +++ b/README.md @@ -13,5 +13,5 @@ | CEF | -![](https://pandao.github.io/editor.md/examples/images/4.jpg) +![](https://raw.githubusercontent.com/r4faelaugusto/ya-arquivo-remessa/remessa-bancodobrasil/sequenceDiagram.png) > Diagrama de sequencia \ No newline at end of file From ccce9afccf051974690090fc5965355822b5a418 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Thu, 24 May 2018 11:42:05 -0300 Subject: [PATCH 05/17] adicionando require-dev o code sniffer --- composer.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/composer.json b/composer.json index 65f6416..4623f05 100644 --- a/composer.json +++ b/composer.json @@ -31,5 +31,9 @@ "respect/validation": "^1.1", "phpunit/phpunit": "^6.1", "symfony/yaml": "^3.4" + }, + "require-dev": { + "squizlabs/php_codesniffer": "3.*", + "phpmd/phpmd" : "@stable" } } From eb1f789a6741863be1fe45df769bdfc36fc313aa Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Thu, 24 May 2018 11:44:35 -0300 Subject: [PATCH 06/17] fix psr --- src/Builder/BBCnab400Builder.php | 9 +- src/Builder/BradescoCnab400Builder.php | 24 +++- src/Builder/Builder.php | 14 ++- src/Builder/CEFCnab400Builder.php | 16 +-- src/Builder/SicoobCnab400Builder.php | 18 +-- src/Cnab/Cnab400/BB/Detalhe.php | 117 ++++++++++--------- src/Cnab/Cnab400/BB/Header.php | 112 +++++++++++++++--- src/Cnab/Cnab400/BB/Trailler.php | 9 +- src/Cnab/Cnab400/Bradesco/Header.php | 13 ++- src/Cnab/Cnab400/Bradesco/Trailler.php | 6 +- src/Cnab/Cnab400/Bradesco/Transacao.php | 5 +- src/Cnab/Cnab400/SICOOB/Detalhe.php | 147 +++++++++++++++++++----- src/Cnab/Cnab400/SICOOB/Header.php | 33 ++++-- src/Cnab/Cnab400/SICOOB/Trailler.php | 9 +- src/Enum/BancoEnum.php | 1 - src/RemessaFactory.php | 12 +- src/Validator/Validator.php | 4 +- 17 files changed, 390 insertions(+), 159 deletions(-) diff --git a/src/Builder/BBCnab400Builder.php b/src/Builder/BBCnab400Builder.php index c145024..85c5c15 100755 --- a/src/Builder/BBCnab400Builder.php +++ b/src/Builder/BBCnab400Builder.php @@ -2,7 +2,6 @@ namespace Umbrella\Ya\RemessaBoleto\Builder; -use \DateTime; use Umbrella\Ya\RemessaBoleto\Enum\BancoEnum; use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\BB\Detalhe; use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\BB\Header; @@ -54,13 +53,14 @@ protected function detalhes() $documentosArrecadacao = $this->detalhesBoleto['transacoes'][$seqConvenio]; $arrDetalhes = []; - $sequencial = 2; foreach ($documentosArrecadacao['dam'] as $key => $documento) { $detalhe = new Detalhe; $detalhe->setIdentificacaoRegistro(7); - $detalhe->setTipoInscricaoCedente(strlen($convenioBancario['orgao']['pessoa']['cpfCnpj']) > 11 ? "02" : "01"); + $detalhe->setTipoInscricaoCedente( + strlen($convenioBancario['orgao']['pessoa']['cpfCnpj']) > 11 ? "02" : "01" + ); $detalhe->setNumeroCPFCNPJCedente($convenioBancario['orgao']['pessoa']['cpfCnpj']); $detalhe->setPrefixoAgencia($convenioBancario['agencia']); $detalhe->setPrefixoAgenciaDV($convenioBancario['digitoAgencia']); @@ -203,7 +203,4 @@ public function montarArquivo(string $path) fclose($file); return $fullpath; } - - - } diff --git a/src/Builder/BradescoCnab400Builder.php b/src/Builder/BradescoCnab400Builder.php index 90726c6..176f433 100755 --- a/src/Builder/BradescoCnab400Builder.php +++ b/src/Builder/BradescoCnab400Builder.php @@ -2,7 +2,6 @@ namespace Umbrella\Ya\RemessaBoleto\Builder; -use \DateTime; use Umbrella\Ya\RemessaBoleto\Enum\BancoEnum; use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\Transacao; use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\Header; @@ -68,7 +67,15 @@ protected function transacao() ); $transacao->setIdentificacaoTituloBanco($this->parseInteger(substr($documento['nossoNumero'], 2, 12))); - $transacao->setDigitoAutoConferencia(mb_substr($documento['nossoNumero'], strlen($documento['nossoNumero']) - 1)); + $transacao->setDigitoAutoConferencia( + mb_substr( + $documento['nossoNumero'], + strlen( + $documento['nossoNumero'] + ) - 1 + ) + ); + $transacao->setNumeroDocumento($documento['numeroDocumento']); $transacao->setValorTitulo(str_replace(['.', ','], '', $documento['valor'])); $transacao->setNumeroInscricaoPagador($documento['pessoa']['cpfCnpj']); @@ -128,7 +135,15 @@ protected function header() $seqConvenio = $this->getSeqConvenio($this->detalhesBoleto['convenios']); $header = new Header(); - $header->setRazaoSocial(mb_strtoupper(mb_substr($this->detalhesBoleto['convenios'][$seqConvenio]['orgao']['descricao'], 0, 30))); + $header->setRazaoSocial( + mb_strtoupper( + mb_substr( + $this->detalhesBoleto['convenios'][$seqConvenio]['orgao']['descricao'], + 0, + 30 + ) + ) + ); $header->setCodigoEmpresa($this->detalhesBoleto['convenios'][$seqConvenio]['convenio']); $header->setDataGeracao((new \DateTime())->format('dmy')); $header->setSequencialRegistro(1); @@ -188,7 +203,4 @@ public function montarArquivo(string $path) return $fullpath; } - - - } diff --git a/src/Builder/Builder.php b/src/Builder/Builder.php index efe4757..256a15a 100755 --- a/src/Builder/Builder.php +++ b/src/Builder/Builder.php @@ -64,7 +64,9 @@ protected function concatenarDados() $args = func_get_args(); $output = ''; - foreach ($args as $key => $dado) { $output .= "{$dado}"; } + foreach ($args as $dado) { + $output .= "{$dado}"; + } return isset($output) ? $output : ""; } @@ -90,7 +92,11 @@ protected function removerAcentos($string) // muda pra locale que trabalha os acentos setlocale(LC_CTYPE, 'pt_BR.utf-8'); // retira os acentos. - $acentosRemovidos = preg_replace('#[`^~\'´"]#', null, iconv(mb_detect_encoding($string), 'ASCII//TRANSLIT', $string)); + $acentosRemovidos = preg_replace( + '#[`^~\'´"]#', + null, + iconv(mb_detect_encoding($string), 'ASCII//TRANSLIT', $string) + ); // retorna a locale para a que era anterior a manipulação da string. setlocale(LC_CTYPE, $locale); return $acentosRemovidos; @@ -102,7 +108,9 @@ protected function removerAcentos($string) */ protected function getSeqConvenio($arrConvenio) { - foreach($arrConvenio as $key => $value) return $key; + foreach ($arrConvenio as $key => $value) { + return $key; + }; } diff --git a/src/Builder/CEFCnab400Builder.php b/src/Builder/CEFCnab400Builder.php index a4ea460..ec78346 100755 --- a/src/Builder/CEFCnab400Builder.php +++ b/src/Builder/CEFCnab400Builder.php @@ -2,12 +2,11 @@ namespace Umbrella\Ya\RemessaBoleto\Builder; -use \DateTime; use Umbrella\Ya\RemessaBoleto\Enum\BancoEnum; -use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\Transacao; -use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\Header; -use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\File; -use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\Bradesco\Trailler; +use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\CEF\Detalhe; +use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\CEF\Header; +use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\CEF\File; +use Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\CEF\Trailler; class CEFCnab400Builder extends Builder { @@ -52,7 +51,7 @@ public function build() protected function transacao() { $seqConvenio = $this->getSeqConvenio($this->detalhesBoleto['convenios']); - $convenioBancario = $this->detalhesBoleto['convenios'][$seqConvenio]; +// $convenioBancario = $this->detalhesBoleto['convenios'][$seqConvenio]; $documentosArrecadacao = $this->detalhesBoleto['transacoes'][$seqConvenio]; $arrTransacoes = []; @@ -73,7 +72,7 @@ protected function transacao() */ protected function header() { - $seqConvenio = $this->getSeqConvenio($this->detalhesBoleto['convenios']); +// $seqConvenio = $this->getSeqConvenio($this->detalhesBoleto['convenios']); $header = new Header(); @@ -136,7 +135,4 @@ public function montarArquivo(string $path) return $fullpath; } - - - } diff --git a/src/Builder/SicoobCnab400Builder.php b/src/Builder/SicoobCnab400Builder.php index 4cafab0..8bcec6c 100755 --- a/src/Builder/SicoobCnab400Builder.php +++ b/src/Builder/SicoobCnab400Builder.php @@ -36,7 +36,7 @@ public function __construct(array $detalhesDoBoleto) * funcao para geracao do arquivo de remessa do cnab400 do boleto sicoob * @return string [caminho completo do arquivo de remessa] */ - public function build($path) + public function build() { return $this ->detalhe() @@ -66,9 +66,10 @@ protected function detalhe() $detalhe->setDataEmissao((new \DateTime($documento['dataEmissao']))->format('dmy')); /** dados do convenio */ - $detalhe->setTipoInscricaoBeneficiario(strlen($convenioBancario['orgao']['pessoa']['cpfCnpj']) > 11 ? "02" : "01"); + $detalhe->setTipoInscricaoBeneficiario( + strlen($convenioBancario['orgao']['pessoa']['cpfCnpj']) > 11 ? "02" : "01" + ); $detalhe->setCpfcnpjBeneficiario($convenioBancario['orgao']['pessoa']['cpfCnpj']); - $detalhe->setPrefixoCooperativa($convenioBancario['agencia']); $detalhe->setDigitoVerificadorPrefixoCooperativa($convenioBancario['digitoAgencia']); $detalhe->setContaCorrente($convenioBancario['conta']); @@ -107,8 +108,8 @@ protected function header() $header = new Header(); - $header->setCodigoCliente(substr($convenioBancario['cedente'],0,-1)); - $header->setDigitoVerificadorCodigo(substr($convenioBancario['cedente'],-1)); + $header->setCodigoCliente(substr($convenioBancario['cedente'], 0, -1)); + $header->setDigitoVerificadorCodigo(substr($convenioBancario['cedente'], -1)); $header->setSequencialRegistro(1); $header->setPrefixoCooperativa($convenioBancario['agencia']); @@ -116,7 +117,11 @@ protected function header() $header->setConvenioLider($convenioBancario['convenio']); - $header->setNomeBeneficiario(mb_strtoupper(mb_substr($this->detalhesBoleto['convenios'][$seqConvenio]['orgao']['descricao'], 0, 30))); + $header->setNomeBeneficiario( + mb_strtoupper( + mb_substr($this->detalhesBoleto['convenios'][$seqConvenio]['orgao']['descricao'], 0, 30) + ) + ); $header->setSequencialRemessa($this->detalhesBoleto['totalRemessas']); $header->setDataGeracao((new \DateTime())->format('dmy')); @@ -172,5 +177,4 @@ public function montarArquivo($path) return $fullpath; } - } diff --git a/src/Cnab/Cnab400/BB/Detalhe.php b/src/Cnab/Cnab400/BB/Detalhe.php index 0f08d4f..5422820 100755 --- a/src/Cnab/Cnab400/BB/Detalhe.php +++ b/src/Cnab/Cnab400/BB/Detalhe.php @@ -62,7 +62,12 @@ class Detalhe */ public function getIdentificacaoRegistro(): string { - return str_pad(substr($this->identificacaoRegistro,0,1),1,' ',STR_PAD_LEFT); + return str_pad( + substr($this->identificacaoRegistro, 0, 1), + 1, + ' ', + STR_PAD_LEFT + ); } /** @@ -70,7 +75,7 @@ public function getIdentificacaoRegistro(): string */ public function setIdentificacaoRegistro(string $identificacaoRegistro) { - $this->identificacaoRegistro = substr($identificacaoRegistro,0,1); + $this->identificacaoRegistro = substr($identificacaoRegistro, 0, 1); } /** @@ -86,7 +91,7 @@ public function getNumeroPrestacao(): string */ public function setNumeroPrestacao(string $numeroPrestacao) { - $this->numeroPrestacao = str_pad($numeroPrestacao,2,'0',STR_PAD_LEFT); + $this->numeroPrestacao = str_pad($numeroPrestacao, 2, '0', STR_PAD_LEFT); } /** @@ -102,7 +107,7 @@ public function getGrupoValor(): string */ public function setGrupoValor(string $grupoValor) { - $this->grupoValor = str_pad($grupoValor,2,'0',STR_PAD_LEFT); + $this->grupoValor = str_pad($grupoValor, 2, '0', STR_PAD_LEFT); } /** @@ -118,7 +123,7 @@ public function getNumBanco(): string */ public function setNumBanco(string $numBanco) { - $this->numBanco = str_pad($numBanco,3,'0',STR_PAD_LEFT); + $this->numBanco = str_pad($numBanco, 3, '0', STR_PAD_LEFT); } /** @@ -134,7 +139,7 @@ public function getPrefixoAgenciaCobradora(): string */ public function setPrefixoAgenciaCobradora(string $prefixoAgenciaCobradora) { - $this->prefixoAgenciaCobradora = str_pad($prefixoAgenciaCobradora,4,' ',STR_PAD_LEFT); + $this->prefixoAgenciaCobradora = str_pad($prefixoAgenciaCobradora, 4, ' ', STR_PAD_LEFT); } /** @@ -150,7 +155,7 @@ public function getPrefixoAgenciaDVCobranca(): string */ public function setPrefixoAgenciaDVCobranca(string $prefixoAgenciaDVCobranca) { - $this->prefixoAgenciaDVCobranca = str_pad($prefixoAgenciaDVCobranca,1,' ',STR_PAD_LEFT); + $this->prefixoAgenciaDVCobranca = str_pad($prefixoAgenciaDVCobranca, 1, ' ', STR_PAD_LEFT); } /** @@ -166,7 +171,7 @@ public function getComplementoRegistroBranco1(): string */ public function setComplementoRegistroBranco1(string $complementoRegistroBranco1) { - $this->complementoRegistroBranco1 = str_pad($complementoRegistroBranco1,3,' ',STR_PAD_LEFT); + $this->complementoRegistroBranco1 = str_pad($complementoRegistroBranco1, 3, ' ', STR_PAD_LEFT); } /** @@ -182,7 +187,7 @@ public function getComplementoRegistroBranco2(): string */ public function setComplementoRegistroBranco2(string $complementoRegistroBranco2) { - $this->complementoRegistroBranco2 = str_pad($complementoRegistroBranco2,3,' ',STR_PAD_LEFT); + $this->complementoRegistroBranco2 = str_pad($complementoRegistroBranco2, 3, ' ', STR_PAD_LEFT); } /** @@ -198,7 +203,7 @@ public function getComplementoRegistroBranco3(): string */ public function setComplementoRegistroBranco3(string $complementoRegistroBranco3) { - $this->complementoRegistroBranco3 = str_pad($complementoRegistroBranco3,1,' ',STR_PAD_LEFT); + $this->complementoRegistroBranco3 = str_pad($complementoRegistroBranco3, 1, ' ', STR_PAD_LEFT); } /** @@ -214,7 +219,7 @@ public function getTipoInscricaoCedente() */ public function setTipoInscricaoCedente($tipoInscricaoCedente) { - $this->tipoInscricaoCedente = str_pad($tipoInscricaoCedente,2,'0',STR_PAD_LEFT); + $this->tipoInscricaoCedente = str_pad($tipoInscricaoCedente, 2, '0', STR_PAD_LEFT); } /** @@ -230,7 +235,7 @@ public function getNumeroCPFCNPJCedente() */ public function setNumeroCPFCNPJCedente($numeroCPFCNPJCedente) { - $this->numeroCPFCNPJCedente = str_pad($numeroCPFCNPJCedente,14,'0',STR_PAD_LEFT); + $this->numeroCPFCNPJCedente = str_pad($numeroCPFCNPJCedente, 14, '0', STR_PAD_LEFT); } /** @@ -246,7 +251,7 @@ public function getPrefixoAgencia() */ public function setPrefixoAgencia($prefixoAgencia) { - $this->prefixoAgencia = str_pad($prefixoAgencia,4,'0',STR_PAD_LEFT); + $this->prefixoAgencia = str_pad($prefixoAgencia, 4, '0', STR_PAD_LEFT); } /** @@ -262,7 +267,7 @@ public function getPrefixoAgenciaDV() */ public function setPrefixoAgenciaDV($prefixoAgenciaDV) { - $this->prefixoAgenciaDV = str_pad($prefixoAgenciaDV,1,'0',STR_PAD_LEFT); + $this->prefixoAgenciaDV = str_pad($prefixoAgenciaDV, 1, '0', STR_PAD_LEFT); } /** @@ -278,7 +283,7 @@ public function getContaCorrenteCedente() */ public function setContaCorrenteCedente($contaCorrenteCedente) { - $this->contaCorrenteCedente = str_pad($contaCorrenteCedente,8,'0',STR_PAD_LEFT); + $this->contaCorrenteCedente = str_pad($contaCorrenteCedente, 8, '0', STR_PAD_LEFT); } /** @@ -294,7 +299,7 @@ public function getContaCorrenteDVCedente() */ public function setContaCorrenteDVCedente($contaCorrenteDVCedente) { - $this->contaCorrenteDVCedente = str_pad($contaCorrenteDVCedente,1,'0',STR_PAD_LEFT); + $this->contaCorrenteDVCedente = str_pad($contaCorrenteDVCedente, 1, '0', STR_PAD_LEFT); } /** @@ -310,7 +315,7 @@ public function getConvenioCobrancaCedente() */ public function setConvenioCobrancaCedente($convenioCobrancaCedente) { - $this->convenioCobrancaCedente = str_pad($convenioCobrancaCedente,7,'0',STR_PAD_LEFT); + $this->convenioCobrancaCedente = str_pad($convenioCobrancaCedente, 7, '0', STR_PAD_LEFT); } /** @@ -342,7 +347,7 @@ public function getNossoNumero() */ public function setNossoNumero($nossoNumero) { - $this->nossoNumero = str_pad($nossoNumero,17,'0',STR_PAD_LEFT); + $this->nossoNumero = str_pad($nossoNumero, 17, '0', STR_PAD_LEFT); } /** @@ -358,7 +363,7 @@ public function getMsgSacadorAvalista() */ public function setMsgSacadorAvalista($msgSacadorAvalista) { - $this->msgSacadorAvalista = str_pad($msgSacadorAvalista,1,' ',STR_PAD_LEFT); + $this->msgSacadorAvalista = str_pad($msgSacadorAvalista, 1, ' ', STR_PAD_LEFT); } /** @@ -374,7 +379,7 @@ public function getPrefixoTitulo() */ public function setPrefixoTitulo($prefixoTitulo) { - $this->prefixoTitulo = str_pad($prefixoTitulo,3,'0',STR_PAD_LEFT); + $this->prefixoTitulo = str_pad($prefixoTitulo, 3, '0', STR_PAD_LEFT); } /** @@ -390,7 +395,7 @@ public function getVariacaoCarteira() */ public function setVariacaoCarteira($variacaoCarteira) { - $this->variacaoCarteira = str_pad($variacaoCarteira,3,'0',STR_PAD_LEFT); + $this->variacaoCarteira = str_pad($variacaoCarteira, 3, '0', STR_PAD_LEFT); } /** @@ -406,7 +411,7 @@ public function getContaCaucao() */ public function setContaCaucao($contaCaucao) { - $this->contaCaucao = str_pad($contaCaucao,1,'0',STR_PAD_LEFT); + $this->contaCaucao = str_pad($contaCaucao, 1, '0', STR_PAD_LEFT); } /** @@ -422,7 +427,7 @@ public function getNumeroBordero() */ public function setNumeroBordero($numeroBordero) { - $this->numeroBordero = str_pad($numeroBordero,6,'0',STR_PAD_LEFT); + $this->numeroBordero = str_pad($numeroBordero, 6, '0', STR_PAD_LEFT); } /** @@ -438,7 +443,7 @@ public function getTipoCobranca() */ public function setTipoCobranca($tipoCobranca) { - $this->tipoCobranca = str_pad($tipoCobranca,5,' ',STR_PAD_LEFT); + $this->tipoCobranca = str_pad($tipoCobranca, 5, ' ', STR_PAD_LEFT); } /** @@ -454,7 +459,7 @@ public function getCarteiraCobranca() */ public function setCarteiraCobranca($carteiraCobranca) { - $this->carteiraCobranca = str_pad($carteiraCobranca,2,'0',STR_PAD_LEFT); + $this->carteiraCobranca = str_pad($carteiraCobranca, 2, '0', STR_PAD_LEFT); } /** @@ -470,7 +475,7 @@ public function getComando() */ public function setComando($comando) { - $this->comando = str_pad($comando,2,'0',STR_PAD_LEFT); + $this->comando = str_pad($comando, 2, '0', STR_PAD_LEFT); } /** @@ -486,7 +491,7 @@ public function getNumTituloCedente() */ public function setNumTituloCedente($numTituloCedente) { - $this->numTituloCedente = str_pad($numTituloCedente,10,' ',STR_PAD_LEFT); + $this->numTituloCedente = str_pad($numTituloCedente, 10, ' ', STR_PAD_LEFT); } /** @@ -502,7 +507,7 @@ public function getDtVencimento() */ public function setDtVencimento($dtVencimento) { - $this->dtVencimento = str_pad($dtVencimento,6,'0',STR_PAD_LEFT); + $this->dtVencimento = str_pad($dtVencimento, 6, '0', STR_PAD_LEFT); } /** @@ -518,7 +523,7 @@ public function getVlTitulo() */ public function setVlTitulo($vlTitulo) { - $this->vlTitulo = str_pad($vlTitulo,13,' ',STR_PAD_LEFT); + $this->vlTitulo = str_pad($vlTitulo, 13, ' ', STR_PAD_LEFT); } /** @@ -534,7 +539,7 @@ public function getEspecieTitulo() */ public function setEspecieTitulo($especieTitulo) { - $this->especieTitulo = str_pad(substr($especieTitulo,0,2),2,' ',STR_PAD_LEFT); + $this->especieTitulo = str_pad(substr($especieTitulo, 0, 2), 2, ' ', STR_PAD_LEFT); } /** @@ -550,7 +555,7 @@ public function getAceiteTitulo() */ public function setAceiteTitulo($aceiteTitulo) { - $this->aceiteTitulo = str_pad(substr($aceiteTitulo,0,1),1,' ',STR_PAD_LEFT); + $this->aceiteTitulo = str_pad(substr($aceiteTitulo, 0, 1), 1, ' ', STR_PAD_LEFT); } /** @@ -566,7 +571,7 @@ public function getDtEmissaoTitulo() */ public function setDtEmissaoTitulo($dtEmissaoTitulo) { - $this->dtEmissaoTitulo = str_pad($dtEmissaoTitulo,6,' ',STR_PAD_LEFT); + $this->dtEmissaoTitulo = str_pad($dtEmissaoTitulo, 6, ' ', STR_PAD_LEFT); } /** @@ -582,7 +587,7 @@ public function getInstrucaoCodificada1() */ public function setInstrucaoCodificada1($instrucaoCodificada1) { - $this->instrucaoCodificada1 = str_pad($instrucaoCodificada1,2,' ',STR_PAD_LEFT); + $this->instrucaoCodificada1 = str_pad($instrucaoCodificada1, 2, ' ', STR_PAD_LEFT); } /** @@ -598,7 +603,7 @@ public function getInstrucaoCodificada2() */ public function setInstrucaoCodificada2($instrucaoCodificada2) { - $this->instrucaoCodificada2 = str_pad($instrucaoCodificada2,2,' ',STR_PAD_LEFT); + $this->instrucaoCodificada2 = str_pad($instrucaoCodificada2, 2, ' ', STR_PAD_LEFT); } /** @@ -614,7 +619,7 @@ public function getJurisMoraDia() */ public function setJurisMoraDia($jurisMoraDia) { - $this->jurisMoraDia = str_pad($jurisMoraDia,13,' ',STR_PAD_LEFT); + $this->jurisMoraDia = str_pad($jurisMoraDia, 13, ' ', STR_PAD_LEFT); } /** @@ -630,7 +635,7 @@ public function getDtLimiteConcessaoDesconto() */ public function setDtLimiteConcessaoDesconto($dtLimiteConcessaoDesconto) { - $this->dtLimiteConcessaoDesconto = str_pad($dtLimiteConcessaoDesconto,6,' ',STR_PAD_LEFT); + $this->dtLimiteConcessaoDesconto = str_pad($dtLimiteConcessaoDesconto, 6, ' ', STR_PAD_LEFT); } /** @@ -646,7 +651,7 @@ public function getVlDesconto() */ public function setVlDesconto($vlDesconto) { - $this->vlDesconto = str_pad($vlDesconto,13,'0',STR_PAD_LEFT); + $this->vlDesconto = str_pad($vlDesconto, 13, '0', STR_PAD_LEFT); } /** @@ -662,7 +667,7 @@ public function getVlIOF() */ public function setVlIOF($vlIOF) { - $this->vlIOF = str_pad($vlIOF,13,'0',STR_PAD_LEFT); + $this->vlIOF = str_pad($vlIOF, 13, '0', STR_PAD_LEFT); } /** @@ -678,7 +683,7 @@ public function getVlAbatimento() */ public function setVlAbatimento($vlAbatimento) { - $this->vlAbatimento = str_pad($vlAbatimento,13,'0',STR_PAD_LEFT); + $this->vlAbatimento = str_pad($vlAbatimento, 13, '0', STR_PAD_LEFT); } /** @@ -694,7 +699,7 @@ public function getTipoOperacaoSacado() */ public function setTipoOperacaoSacado($tipoOperacaoSacado) { - $this->tipoOperacaoSacado = str_pad($tipoOperacaoSacado,2,' ',STR_PAD_LEFT); + $this->tipoOperacaoSacado = str_pad($tipoOperacaoSacado, 2, ' ', STR_PAD_LEFT); } /** @@ -710,7 +715,7 @@ public function getCpfCnpjSacado() */ public function setCpfCnpjSacado($cpfCnpjSacado) { - $this->cpfCnpjSacado = str_pad($cpfCnpjSacado,14,' ',STR_PAD_LEFT); + $this->cpfCnpjSacado = str_pad($cpfCnpjSacado, 14, ' ', STR_PAD_LEFT); } /** @@ -726,7 +731,7 @@ public function getNomeSacado() */ public function setNomeSacado($nomeSacado) { - $this->nomeSacado = str_pad(substr($nomeSacado,0,37),37,' ',STR_PAD_LEFT); + $this->nomeSacado = str_pad(substr($nomeSacado, 0, 37), 37, ' ', STR_PAD_LEFT); } /** @@ -742,7 +747,7 @@ public function getEnderecoSacado() */ public function setEnderecoSacado($enderecoSacado) { - $this->enderecoSacado = str_pad(substr($enderecoSacado,0,40),40,' ',STR_PAD_LEFT); + $this->enderecoSacado = str_pad(substr($enderecoSacado, 0, 40), 40, ' ', STR_PAD_LEFT); } /** @@ -758,7 +763,7 @@ public function getBairroSacado() */ public function setBairroSacado($bairroSacado) { - $this->bairroSacado = str_pad(substr($bairroSacado,0,12),12,' ',STR_PAD_LEFT); + $this->bairroSacado = str_pad(substr($bairroSacado, 0, 12), 12, ' ', STR_PAD_LEFT); } /** @@ -774,7 +779,7 @@ public function getCepSacado() */ public function setCepSacado($cepSacado) { - $this->cepSacado = str_pad(substr($cepSacado,0,8),8,' ',STR_PAD_LEFT); + $this->cepSacado = str_pad(substr($cepSacado, 0, 8), 8, ' ', STR_PAD_LEFT); } /** @@ -790,7 +795,7 @@ public function getCidadeSacado() */ public function setCidadeSacado($cidadeSacado) { - $this->cidadeSacado = str_pad(substr($cidadeSacado,0,15),15,' ',STR_PAD_LEFT); + $this->cidadeSacado = str_pad(substr($cidadeSacado, 0, 15), 15, ' ', STR_PAD_LEFT); } /** @@ -806,7 +811,7 @@ public function getUfCidadeSacado() */ public function setUfCidadeSacado($ufCidadeSacado) { - $this->ufCidadeSacado = str_pad(substr($ufCidadeSacado,0,2),2,' ',STR_PAD_LEFT); + $this->ufCidadeSacado = str_pad(substr($ufCidadeSacado, 0, 2), 2, ' ', STR_PAD_LEFT); } /** @@ -822,7 +827,12 @@ public function getObsMensagemSacadorAvalista() */ public function setObsMensagemSacadorAvalista($obsMensagemSacadorAvalista) { - $this->obsMensagemSacadorAvalista = str_pad(substr($obsMensagemSacadorAvalista,0,40),40,' ',STR_PAD_LEFT); + $this->obsMensagemSacadorAvalista = str_pad( + substr($obsMensagemSacadorAvalista, 0, 40), + 40, + ' ', + STR_PAD_LEFT + ); } /** @@ -838,7 +848,7 @@ public function getNumDiasProtesto() */ public function setNumDiasProtesto($numDiasProtesto) { - $this->numDiasProtesto = str_pad($numDiasProtesto,2,' ',STR_PAD_LEFT); + $this->numDiasProtesto = str_pad($numDiasProtesto, 2, ' ', STR_PAD_LEFT); } /** @@ -854,7 +864,7 @@ public function getSequencialRegistro() */ public function setSequencialRegistro($sequencialRegistro) { - $this->sequencialRegistro = str_pad(substr($sequencialRegistro,0,6),6,'0',STR_PAD_LEFT); + $this->sequencialRegistro = str_pad(substr($sequencialRegistro, 0, 6), 6, '0', STR_PAD_LEFT); } /** @@ -916,11 +926,12 @@ public function getDetalhesToString() ; if (mb_strlen($string) != 400) { - throw new \Exception("Erro ao gerar 'detalhes' da remessa, tamanho da string invalida (length: " . mb_strlen($string) . ")"); + throw new \Exception( + "Erro ao gerar 'detalhes' da remessa, tamanho da string invalida (length: " + . mb_strlen($string) . ")" + ); } return $string; - } - } diff --git a/src/Cnab/Cnab400/BB/Header.php b/src/Cnab/Cnab400/BB/Header.php index d33c6df..648362b 100755 --- a/src/Cnab/Cnab400/BB/Header.php +++ b/src/Cnab/Cnab400/BB/Header.php @@ -129,7 +129,13 @@ public function getComplementoRegistroBranco() */ public function setComplementoRegistroBranco($complementoRegistroBranco) { - $this->complementoRegistroBranco = str_pad(mb_substr($complementoRegistroBranco,0,7), 7, " ", STR_PAD_LEFT); + $this->complementoRegistroBranco = str_pad( + mb_substr($complementoRegistroBranco, 0, 7), + 7, + " ", + STR_PAD_LEFT + ); + return $this; } @@ -147,7 +153,13 @@ public function getPrefixoAgencia() */ public function setPrefixoAgencia($prefixoAgencia) { - $this->prefixoAgencia = str_pad(mb_substr($prefixoAgencia,0,4), 4, '0', STR_PAD_LEFT); + $this->prefixoAgencia = str_pad( + mb_substr($prefixoAgencia, 0, 4), + 4, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -165,7 +177,13 @@ public function getPrefixoAgenciaDV() */ public function setPrefixoAgenciaDV($prefixoAgenciaDV) { - $this->prefixoAgenciaDV = str_pad(mb_substr($prefixoAgenciaDV,0,1), 1, '0', STR_PAD_LEFT); + $this->prefixoAgenciaDV = str_pad( + mb_substr($prefixoAgenciaDV, 0, 1), + 1, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -183,7 +201,13 @@ public function getContaCorrente() */ public function setContaCorrente($contaCorrente) { - $this->contaCorrente = str_pad(mb_substr($contaCorrente,0,8), 8, '0', STR_PAD_LEFT); + $this->contaCorrente = str_pad( + mb_substr($contaCorrente, 0, 8), + 8, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -201,7 +225,13 @@ public function getContaCorrenteDV() */ public function setContaCorrenteDV($contaCorrenteDV) { - $this->contaCorrenteDV = str_pad(mb_substr($contaCorrenteDV,0,1), 1, '0', STR_PAD_LEFT);; + $this->contaCorrenteDV = str_pad( + mb_substr($contaCorrenteDV, 0, 1), + 1, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -219,7 +249,13 @@ public function getComplementoRegistro() */ public function setComplementoRegistro($complementoRegistro) { - $this->complementoRegistro = str_pad(mb_substr($complementoRegistro,0,6), 6, '0', STR_PAD_LEFT); + $this->complementoRegistro = str_pad( + mb_substr($complementoRegistro, 0, 6), + 6, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -237,7 +273,12 @@ public function getNomeCedente() */ public function setNomeCedente($nomeCedente) { - $this->nomeCedente = str_pad(mb_substr($nomeCedente,0,30), 30, ' ', STR_PAD_LEFT); + $this->nomeCedente = str_pad( + mb_substr($nomeCedente, 0, 30), + 30, + ' ', + STR_PAD_LEFT + ); return $this; } @@ -255,7 +296,13 @@ public function getIdBanco(): string */ public function setIdBanco(string $idBanco): Header { - $this->idBanco = str_pad(mb_substr($idBanco,0,18), 18, ' ', STR_PAD_LEFT); + $this->idBanco = str_pad( + mb_substr($idBanco, 0, 18), + 18, + ' ', + STR_PAD_LEFT + ); + return $this; } @@ -273,7 +320,13 @@ public function getDtGravacao() */ public function setDtGravacao($dtGravacao) { - $this->dtGravacao = str_pad(mb_substr($dtGravacao,0,6), 6, '0', STR_PAD_LEFT); + $this->dtGravacao = str_pad( + mb_substr($dtGravacao, 0, 6), + 6, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -291,7 +344,13 @@ public function getSequencialRemessa() */ public function setSequencialRemessa($sequencialRemessa) { - $this->sequencialRemessa = str_pad(mb_substr($sequencialRemessa,0,7), 7, '0', STR_PAD_LEFT); + $this->sequencialRemessa = str_pad( + mb_substr($sequencialRemessa, 0, 7), + 7, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -309,7 +368,13 @@ public function getComplementoRegistroBranco2() */ public function setComplementoRegistroBranco2($complementoRegistroBranco2) { - $this->complementoRegistroBranco2 = str_pad(mb_substr($complementoRegistroBranco2,0,22), 22, " ", STR_PAD_LEFT); + $this->complementoRegistroBranco2 = str_pad( + mb_substr($complementoRegistroBranco2, 0, 22), + 22, + " ", + STR_PAD_LEFT + ); + return $this; } @@ -327,7 +392,13 @@ public function getNumeroConvenioLider() */ public function setNumeroConvenioLider($numeroConvenioLider) { - $this->numeroConvenioLider = str_pad(mb_substr($numeroConvenioLider,0,7), 7, '0', STR_PAD_LEFT); + $this->numeroConvenioLider = str_pad( + mb_substr($numeroConvenioLider, 0, 7), + 7, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -345,7 +416,13 @@ public function getComplementoRegistroBranco3() */ public function setComplementoRegistroBranco3($complementoRegistroBranco3) { - $this->complementoRegistroBranco3 = str_pad(mb_substr($complementoRegistroBranco3,0,258), 258, " ", STR_PAD_LEFT); + $this->complementoRegistroBranco3 = str_pad( + mb_substr($complementoRegistroBranco3, 0, 258), + 258, + " ", + STR_PAD_LEFT + ); + return $this; } @@ -363,7 +440,13 @@ public function getSequencialRegistro() */ public function setSequencialRegistro($sequencialRegistro) { - $this->sequencialRegistro = str_pad(mb_substr($sequencialRegistro,0,6), 6, '0', STR_PAD_LEFT); + $this->sequencialRegistro = str_pad( + mb_substr($sequencialRegistro, 0, 6), + 6, + '0', + STR_PAD_LEFT + ); + return $this; } @@ -393,5 +476,4 @@ public function getHeaderToString() . $this->getSequencialRegistro() ; } - } diff --git a/src/Cnab/Cnab400/BB/Trailler.php b/src/Cnab/Cnab400/BB/Trailler.php index fcb7087..a098765 100755 --- a/src/Cnab/Cnab400/BB/Trailler.php +++ b/src/Cnab/Cnab400/BB/Trailler.php @@ -32,14 +32,15 @@ public function getTraillerToString() { $stringTrailler = $this->identificacaoRegistro . str_pad('', 393, ' ', STR_PAD_LEFT) - . str_pad(mb_substr($this->getSequencialRegistro(),0,6), 6, 0, STR_PAD_LEFT) - ; + . str_pad(mb_substr($this->getSequencialRegistro(), 0, 6), 6, 0, STR_PAD_LEFT); if (mb_strlen($stringTrailler) != 400) { - throw new \Exception("Erro ao gerar trailler da remessa, tamanho da string invalida (length: " . mb_strlen($stringTrailler) . ")"); + throw new \Exception( + "Erro ao gerar trailler da remessa, tamanho da string invalida (length: " + . mb_strlen($stringTrailler) . ")" + ); } return $stringTrailler; } - } diff --git a/src/Cnab/Cnab400/Bradesco/Header.php b/src/Cnab/Cnab400/Bradesco/Header.php index 2868d7c..3a79e69 100755 --- a/src/Cnab/Cnab400/Bradesco/Header.php +++ b/src/Cnab/Cnab400/Bradesco/Header.php @@ -195,7 +195,13 @@ public function getSequencialRemessa() */ public function setSequencialRemessa($sequencialRemessa) { - $this->sequencialRemessa = str_pad(substr($sequencialRemessa,0,7), 7, 0, STR_PAD_LEFT); + $this->sequencialRemessa = + str_pad( + substr($sequencialRemessa, 0, 7), + 7, + 0, + STR_PAD_LEFT + ); } /** @@ -233,7 +239,10 @@ public function getHeaderToString() . $this->getSequencialRegistro(); if (mb_strlen($headerString) != 400) { - throw new \Exception("Erro ao gerar header da remessa, tamanho da string invalida (length: " . mb_strlen($headerString) . ")"); + throw new \Exception( + "Erro ao gerar header da remessa, tamanho da string invalida (length: " + . mb_strlen($headerString) . ")" + ); } return $headerString; diff --git a/src/Cnab/Cnab400/Bradesco/Trailler.php b/src/Cnab/Cnab400/Bradesco/Trailler.php index d8bf6e1..ec05792 100755 --- a/src/Cnab/Cnab400/Bradesco/Trailler.php +++ b/src/Cnab/Cnab400/Bradesco/Trailler.php @@ -55,10 +55,12 @@ public function getTraillerToString() ; if (mb_strlen($stringTrailler) != 400) { - throw new \Exception("Erro ao gerar trailler da remessa, tamanho da string invalida (length: " . mb_strlen($stringTrailler) . ")"); + throw new \Exception( + "Erro ao gerar trailler da remessa, tamanho da string invalida (length: " + . mb_strlen($stringTrailler) . ")" + ); } return $stringTrailler; } - } diff --git a/src/Cnab/Cnab400/Bradesco/Transacao.php b/src/Cnab/Cnab400/Bradesco/Transacao.php index 3776ccb..4c9e9e0 100755 --- a/src/Cnab/Cnab400/Bradesco/Transacao.php +++ b/src/Cnab/Cnab400/Bradesco/Transacao.php @@ -995,7 +995,10 @@ public function getTransacaoToString() ; if (mb_strlen($stringTransacao) != 400) { - throw new \Exception("Erro ao gerar transacoes da remessa, tamanho da string invalida (length: " . mb_strlen($stringTransacao) . ")"); + throw new \Exception( + "Erro ao gerar transacoes da remessa, tamanho da string invalida (length: " + . mb_strlen($stringTransacao) . ")" + ); } return $stringTransacao; diff --git a/src/Cnab/Cnab400/SICOOB/Detalhe.php b/src/Cnab/Cnab400/SICOOB/Detalhe.php index 95972c1..153ca17 100644 --- a/src/Cnab/Cnab400/SICOOB/Detalhe.php +++ b/src/Cnab/Cnab400/SICOOB/Detalhe.php @@ -5,11 +5,6 @@ class Detalhe { - - /** - * @todo : validação do numero da carteira do convenio com orgao - */ - private $identificacaoRegistro = "1"; private $numeroConvenioCobranca = "000000"; private $numeroParcela = "01"; @@ -323,7 +318,12 @@ public function getDataVencimento() */ public function setDataVencimento($dataVencimento) { - $this->dataVencimento = str_pad(substr($dataVencimento,0,6), 6, '0', STR_PAD_LEFT); + $this->dataVencimento = str_pad( + substr($dataVencimento, 0, 6), + 6, + '0', + STR_PAD_LEFT + ); return $this; } @@ -343,7 +343,12 @@ public function getDataEmissao() */ public function setDataEmissao($dataEmissao) { - $this->dataEmissao = str_pad(substr($dataEmissao,0,6), 6, '0', STR_PAD_LEFT); + $this->dataEmissao = str_pad( + substr($dataEmissao, 0, 6), + 6, + '0', + STR_PAD_LEFT + ); return $this; } @@ -363,7 +368,12 @@ public function getSequencialRegistro() */ public function setSequencialRegistro($sequencialRegistro) { - $this->sequencialRegistro = str_pad(substr($sequencialRegistro,0,6), 6, '0', STR_PAD_LEFT); + $this->sequencialRegistro = str_pad( + substr($sequencialRegistro, 0, 6), + 6, + '0', + STR_PAD_LEFT + ); return $this; } @@ -383,7 +393,12 @@ public function getDigitoVerificadorPrefixoCooperativa() */ public function setDigitoVerificadorPrefixoCooperativa($digitoVerificadorPrefixoCooperativa) { - $this->digitoVerificadorPrefixoCooperativa = str_pad(substr($digitoVerificadorPrefixoCooperativa,0,1), 1, '0', STR_PAD_LEFT); + $this->digitoVerificadorPrefixoCooperativa = str_pad( + substr($digitoVerificadorPrefixoCooperativa, 0, 1), + 1, + '0', + STR_PAD_LEFT + ); return $this; } @@ -403,7 +418,12 @@ public function getTipoInscricaoBeneficiario() */ public function setTipoInscricaoBeneficiario($tipoInscricaoBeneficiario) { - $this->tipoInscricaoBeneficiario = str_pad(substr($tipoInscricaoBeneficiario,0,2), 2, '0', STR_PAD_LEFT); + $this->tipoInscricaoBeneficiario = str_pad( + substr($tipoInscricaoBeneficiario, 0, 2), + 2, + '0', + STR_PAD_LEFT + ); return $this; } @@ -423,7 +443,12 @@ public function getCpfcnpjBeneficiario() */ public function setCpfcnpjBeneficiario($cpfcnpjBeneficiario) { - $this->cpfcnpjBeneficiario = str_pad(substr($cpfcnpjBeneficiario,0,14), 14, '0', STR_PAD_LEFT); + $this->cpfcnpjBeneficiario = str_pad( + substr($cpfcnpjBeneficiario, 0, 14), + 14, + '0', + STR_PAD_LEFT + ); return $this; } @@ -443,7 +468,12 @@ public function getPrefixoCooperativa() */ public function setPrefixoCooperativa($prefixoCooperativa) { - $this->prefixoCooperativa = str_pad(substr($prefixoCooperativa,0,4), 4, '0', STR_PAD_LEFT); + $this->prefixoCooperativa = str_pad( + substr($prefixoCooperativa, 0, 4), + 4, + '0', + STR_PAD_LEFT + ); return $this; } @@ -463,7 +493,12 @@ public function getContaCorrente() */ public function setContaCorrente($contaCorrente) { - $this->contaCorrente = str_pad(substr($contaCorrente,0,8), 8, '0', STR_PAD_LEFT); + $this->contaCorrente = str_pad( + substr($contaCorrente, 0, 8), + 8, + '0', + STR_PAD_LEFT + ); return $this; } @@ -483,7 +518,12 @@ public function getDigitoVerificadorConta() */ public function setDigitoVerificadorConta($digitoVerificadorConta) { - $this->digitoVerificadorConta = str_pad(substr($digitoVerificadorConta,0,1), 1, '0', STR_PAD_LEFT); + $this->digitoVerificadorConta = str_pad( + substr($digitoVerificadorConta, 0, 1), + 1, + '0', + STR_PAD_LEFT + ); return $this; } @@ -503,7 +543,12 @@ public function getNossoNumero() */ public function setNossoNumero($nossoNumero) { - $this->nossoNumero = str_pad(substr($nossoNumero,0,12), 12, '0', STR_PAD_LEFT); + $this->nossoNumero = str_pad( + substr($nossoNumero, 0, 12), + 12, + '0', + STR_PAD_LEFT + ); return $this; } @@ -523,7 +568,12 @@ public function getNumeroBoleto() */ public function setNumeroBoleto($numeroBoleto) { - $this->numeroBoleto = str_pad(substr($numeroBoleto,0,10), 10, '0', STR_PAD_LEFT); + $this->numeroBoleto = str_pad( + substr($numeroBoleto, 0, 10), + 10, + '0', + STR_PAD_LEFT + ); return $this; } @@ -543,7 +593,12 @@ public function getValorTitulo() */ public function setValorTitulo($valorTitulo) { - $this->valorTitulo = str_pad(substr(number_format($valorTitulo, 2, '', ''),0,13), 13, '0', STR_PAD_LEFT); + $this->valorTitulo = str_pad( + substr(number_format($valorTitulo, 2, '', ''), 0, 13), + 13, + '0', + STR_PAD_LEFT + ); return $this; } @@ -563,7 +618,12 @@ public function getTipoInscricaoPagador() */ public function setTipoInscricaoPagador($tipoInscricaoPagador) { - $this->tipoInscricaoPagador = str_pad(substr($tipoInscricaoPagador,0,2), 2, '0', STR_PAD_LEFT); + $this->tipoInscricaoPagador = str_pad( + substr($tipoInscricaoPagador, 0, 2), + 2, + '0', + STR_PAD_LEFT + ); return $this; } @@ -583,7 +643,12 @@ public function getClienteCpfCnpj() */ public function setClienteCpfCnpj($clienteCpfCnpj) { - $this->clienteCpfCnpj = str_pad(substr($clienteCpfCnpj,0,14), 14, '0', STR_PAD_LEFT); + $this->clienteCpfCnpj = str_pad( + substr($clienteCpfCnpj, 0, 14), + 14, + '0', + STR_PAD_LEFT + ); return $this; } @@ -603,7 +668,12 @@ public function getClienteNome() */ public function setClienteNome($clienteNome) { - $this->clienteNome = str_pad(substr($clienteNome,0,40), 40, ' ', STR_PAD_RIGHT); + $this->clienteNome = str_pad( + substr($clienteNome, 0, 40), + 40, + ' ', + STR_PAD_RIGHT + ); return $this; } @@ -623,7 +693,12 @@ public function getClienteEndereco() */ public function setClienteEndereco($clienteEndereco) { - $this->clienteEndereco = str_pad(substr($clienteEndereco,0,37), 37, ' ', STR_PAD_RIGHT); + $this->clienteEndereco = str_pad( + substr($clienteEndereco, 0, 37), + 37, + ' ', + STR_PAD_RIGHT + ); return $this; } @@ -643,7 +718,12 @@ public function getClienteBairro() */ public function setClienteBairro($clienteBairro) { - $this->clienteBairro = str_pad(substr($clienteBairro,0,15), 15, ' ', STR_PAD_RIGHT); + $this->clienteBairro = str_pad( + substr($clienteBairro, 0, 15), + 15, + ' ', + STR_PAD_RIGHT + ); return $this; } @@ -663,7 +743,12 @@ public function getClienteCep() */ public function setClienteCep($clienteCep) { - $this->clienteCep = str_pad(substr($clienteCep,0,8), 8, ' ', STR_PAD_LEFT); + $this->clienteCep = str_pad( + substr($clienteCep, 0, 8), + 8, + ' ', + STR_PAD_LEFT + ); return $this; } @@ -683,7 +768,12 @@ public function getClienteCidade() */ public function setClienteCidade($clienteCidade) { - $this->clienteCidade = str_pad(substr($clienteCidade,0,15), 15, ' ', STR_PAD_RIGHT); + $this->clienteCidade = str_pad( + substr($clienteCidade, 0, 15), + 15, + ' ', + STR_PAD_RIGHT + ); return $this; } @@ -703,7 +793,12 @@ public function getClienteUF() */ public function setClienteUF($clienteUF) { - $this->clienteUF = str_pad(substr($clienteUF,0,2), 2, ' ', STR_PAD_RIGHT); + $this->clienteUF = str_pad( + substr($clienteUF, 0, 2), + 2, + ' ', + STR_PAD_RIGHT + ); return $this; } @@ -766,6 +861,4 @@ public function getDetalheToString() . $this->getSequencialRegistro() ; } - - } diff --git a/src/Cnab/Cnab400/SICOOB/Header.php b/src/Cnab/Cnab400/SICOOB/Header.php index 30192b4..9fc3209 100755 --- a/src/Cnab/Cnab400/SICOOB/Header.php +++ b/src/Cnab/Cnab400/SICOOB/Header.php @@ -97,7 +97,7 @@ public function getPrefixoCooperativa() */ public function setPrefixoCooperativa($prefixoCooperativa) { - $this->prefixoCooperativa = substr(str_pad($prefixoCooperativa, 4, '0', STR_PAD_LEFT),0,4); + $this->prefixoCooperativa = substr(str_pad($prefixoCooperativa, 4, '0', STR_PAD_LEFT), 0, 4); } /** @@ -241,7 +241,11 @@ public function setComplementoRegistro($complementoRegistro) */ public function setCodigoCliente($codigoCliente) { - $this->codigoCliente = substr(str_pad($codigoCliente, 8, '0', STR_PAD_LEFT),0,8); + $this->codigoCliente = substr( + str_pad($codigoCliente, 8, '0', STR_PAD_LEFT), + 0, + 8 + ); } /** @@ -249,7 +253,7 @@ public function setCodigoCliente($codigoCliente) */ public function setDigitoVerificadorCodigo($digitoVerificadorCodigo) { - $this->digitoVerificadorCodigo = substr(str_pad($digitoVerificadorCodigo, 1, '0', STR_PAD_LEFT),0,1); + $this->digitoVerificadorCodigo = substr(str_pad($digitoVerificadorCodigo, 1, '0', STR_PAD_LEFT), 0, 1); } /** @@ -265,7 +269,7 @@ public function setConvenioLider($convenioLider) */ public function setNomeBeneficiario($nomeBeneficiario) { - $this->nomeBeneficiario = mb_strtoupper(str_pad($nomeBeneficiario, 30, ' ', STR_PAD_RIGHT));; + $this->nomeBeneficiario = mb_strtoupper(str_pad($nomeBeneficiario, 30, ' ', STR_PAD_RIGHT)); } /** @@ -290,7 +294,11 @@ public function getDigitoVerificadorCooperativa() public function setDigitoVerificadorCooperativa($digitoVerificadorCooperativa) { - $this->digitoVerificadorCooperativa = substr(str_pad($digitoVerificadorCooperativa, 1, '0', STR_PAD_LEFT),0,1); + $this->digitoVerificadorCooperativa = substr( + str_pad($digitoVerificadorCooperativa, 1, '0', STR_PAD_LEFT), + 0, + 1 + ); } public function setSequencialRegistro($sequencialRegistro) @@ -300,7 +308,12 @@ public function setSequencialRegistro($sequencialRegistro) public function setSequencialRemessa($sequencialRemessa) { - $this->sequencialRemessa = str_pad(substr($sequencialRemessa,0,7), 7, 0, STR_PAD_LEFT); + $this->sequencialRemessa = str_pad( + substr($sequencialRemessa, 0, 7), + 7, + 0, + STR_PAD_LEFT + ); } public function getHeaderToString() @@ -310,19 +323,18 @@ public function getHeaderToString() . $this->getLiteralRemessa() #7 . $this->getCodigoServico() #2 . $this->getLiteralServico() #8 - . str_pad(substr($this->getComplementoRegistro(),0,7), 7, ' ', STR_PAD_LEFT) #7 + . str_pad(substr($this->getComplementoRegistro(), 0, 7), 7, ' ', STR_PAD_LEFT) #7 . $this->getPrefixoCooperativa() #4 . $this->getDigitoVerificadorCooperativa() #1 . $this->getCodigoCliente() #8 . $this->getDigitoVerificadorCodigo() #1 - . str_pad(substr($this->getConvenioLider(),0,6), 6, 0, STR_PAD_LEFT) #6 + . str_pad(substr($this->getConvenioLider(), 0, 6), 6, 0, STR_PAD_LEFT) #6 . $this->getNomeBeneficiario() #30 . str_pad($this->getIdentificacaoBanco(), 18, ' ', STR_PAD_RIGHT) #18 . $this->dataGeracao #6 . $this->sequencialRemessa #7 . str_pad($this->getComplementoRegistro(), 287, ' ', STR_PAD_RIGHT) #287 - . str_pad($this->sequencialRegistro, 6, 0, STR_PAD_LEFT) #6 - ; + . str_pad($this->sequencialRegistro, 6, 0, STR_PAD_LEFT); #6 if (mb_strlen($headerString) != 400) { throw new \Exception("Erro ao gerar header da remessa, tamanho da string invalida"); @@ -330,5 +342,4 @@ public function getHeaderToString() return $headerString; } - } diff --git a/src/Cnab/Cnab400/SICOOB/Trailler.php b/src/Cnab/Cnab400/SICOOB/Trailler.php index e80cb70..50b3ede 100644 --- a/src/Cnab/Cnab400/SICOOB/Trailler.php +++ b/src/Cnab/Cnab400/SICOOB/Trailler.php @@ -58,14 +58,15 @@ public function getTraillerToString() $stringTrailler = $this->getIdentificacaoRegistro() . str_pad('', 193, ' ', STR_PAD_LEFT) . str_pad('', 200, ' ', STR_PAD_LEFT) - . str_pad($this->getSequencialRegistro(), 6, 0, STR_PAD_LEFT) - ; + . str_pad($this->getSequencialRegistro(), 6, 0, STR_PAD_LEFT); if (mb_strlen($stringTrailler) != 400) { - throw new \Exception("Erro ao gerar trailler da remessa, tamanho da string invalida (length: " . mb_strlen($stringTrailler) . ")"); + throw new \Exception( + "Erro ao gerar trailler da remessa, tamanho da string invalida (length: " + . mb_strlen($stringTrailler) . ")" + ); } return $stringTrailler; } - } diff --git a/src/Enum/BancoEnum.php b/src/Enum/BancoEnum.php index 8978d26..d3f3b47 100644 --- a/src/Enum/BancoEnum.php +++ b/src/Enum/BancoEnum.php @@ -34,5 +34,4 @@ public function getNomeBanco($codigoBanco) break; } } - } diff --git a/src/RemessaFactory.php b/src/RemessaFactory.php index dad71b8..961a695 100755 --- a/src/RemessaFactory.php +++ b/src/RemessaFactory.php @@ -37,7 +37,6 @@ class RemessaFactory public function create(string $path, int $bancoIdentificador, array $dadosArrecadacao) { try { - return $this ->validarDadosBoleto($bancoIdentificador, $dadosArrecadacao) ->path($path) @@ -46,7 +45,6 @@ public function create(string $path, int $bancoIdentificador, array $dadosArreca ->createFile() ->remessaFile ; - } catch (\Exception $e) { var_dump($e); exit; @@ -65,7 +63,10 @@ public function create(string $path, int $bancoIdentificador, array $dadosArreca private function path(string $path) { if (!is_dir($path) || !is_writable($path)) { - throw new \Exception("Local especificado para gravar o arquivo é invalido ou não é permitido gravar o arquivo na pasta {$path}"); + throw new \Exception( + "Local especificado para gravar o arquivo é invalido" + . "ou não é permitido gravar o arquivo na pasta {$path}" + ); } $this->path = rtrim($path, "/"); return $this; @@ -112,8 +113,11 @@ private function configure(int $bancoIdentificador, array $dadosArrecadacao) */ private function build() { - if (empty($this->cnabBuilder)) throw new \Exception("Builder nao configurado!"); + if (empty($this->cnabBuilder)) { + throw new \Exception("Builder nao configurado!"); + } $this->cnabBuilder->build($this->path); + return $this; } diff --git a/src/Validator/Validator.php b/src/Validator/Validator.php index 5a827c0..ce726d5 100644 --- a/src/Validator/Validator.php +++ b/src/Validator/Validator.php @@ -4,7 +4,6 @@ use Symfony\Component\Yaml\Yaml; use Umbrella\Ya\RemessaBoleto\Enum\BancoEnum; -use \Exception; class Validator { @@ -77,7 +76,7 @@ public function run($data) $this->compareArray($this->dataValidator, $data); if (count($this->emptyFields)) { - throw new \Exception("Faltando dados: " . print_r($this->emptyFields,1)); + throw new \Exception("Faltando dados: " . print_r($this->emptyFields, 1)); } } @@ -101,5 +100,4 @@ private function compareArray($dataValidator, $data, $emptyFields = null) } } } - } From 9eadcea91314b4dcb5bfa2857b1f4bc7f6b28a99 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Fri, 25 May 2018 08:30:26 -0300 Subject: [PATCH 07/17] import project --- .gitignore | 3 +- index.php | 92 ++++++++++++++++++++++++++++++++++++++-- src/config/validator.yml | 33 +++++++++++++- 3 files changed, 123 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 27fc9c8..8708354 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ vendor bin build composer.lock -coverage.clover \ No newline at end of file +coverage.clover +.idea diff --git a/index.php b/index.php index e0199f7..ae0cabd 100755 --- a/index.php +++ b/index.php @@ -13,12 +13,16 @@ use \Exception; use \Throwable; -use Umbrella\Ya\RemessaBoleto\Cnab\RemessaFactory; +use Umbrella\Ya\RemessaBoleto\RemessaFactory; use Umbrella\Ya\RemessaBoleto\Enum\BancoEnum; echo "Bradesco"; echo "
"; echo "SICOOB"; +echo "
"; +echo "Caixa Economica Federal"; +echo "
"; +echo "Banco do Brasil"; echo "


"; if (!$_GET['banco']) {return;} @@ -72,9 +76,9 @@ "digitoConta" => 2, "carteira" => [ "carteira" => 23, - "banco" => 237, + "banco" => 104, "nome" => "09", - "arquivo" => "Bradesco (Com Registro)" + "arquivo" => "CAIXA (Com Registro)" ] ] ], @@ -162,6 +166,88 @@ "tipoPessoa" => null, "passaporte" => null, ] + ], + 1 => [ + "dam" => 1201076, + "tipoDocumento" => 2, + "tipoOrigem" => 2, + "taxa" => [ + "taxa" => 273, + "convenioBancario" => [ + "convenioBancario" => 229, + "cedente" => "0000002", + "orgao" => 1707, + "carteira" => 23, + "convenio" => "492XX31", + "agencia" => "3XX9", + "digitoAgencia" => 7, + "conta" => 16065, + "digitoConta" => 2 + ], + "valorFixo" => false, + ], + "isPago" => false, + "nossoNumero" => "00000000668", + "numeroDocumento" => 668, + "linhaDigitavel" => "29993739019000000006868001606505874730000020000", + "representacaoNumerica" => null, + "valor" => "200.00", + "desconto" => "0.00", + "multa" => null, + "juros" => null, + "correcaoMonetaria" => "0.00", + "dataEmissao" => "2018-02-22 00:00:00", + "dataVencimento" => "2018-03-24", + "baixa" => false, + "pessoa" => [ + "pessoa" => 3723770, + "municipio" => [ + "nome" => "", + "uf" => [ "sigla" => "PB" ] + ], + "nome" => "SERG DE OLIVE", + "cpfCnpj" => "59123788768", + "identidade" => "038123234", + "orgaoEmissor" => "SSP", + "ufEmissor" => 100133, + "dtEmissao" => null, + "dtNascimento" => "1959-01-28", + "sexo" => "M", + "mae" => null, + "pai" => null, + "nacionalidade" => 105, + "endereco" => "AVENIDA DAS AMERICAS", + "numero" => "700", + "complemento" => "BLOCO 4", + "bairro" => "BARRA DA TIJUCA", + "distrito" => null, + "cep" => "22640100", + "email" => "WAASNCAR@ASasdASDS.COM.BR", + "dddTelefone" => "11", + "telefone" => "33051172", + "dddFax" => null, + "fax" => null, + "dtCadastro" => "2018-02-22 09:18:48", + "tipoLogradouro" => null, + "pais" => null, + "estadoCivil" => null, + "pessoaJunta" => null, + "municipioNaturalidade" => null, + "ufNaturalidade" => null, + "emancipado" => null, + "motivoEmancipacao" => null, + "caixaPostal" => null, + "ddiTelefone" => null, + "ddiFax" => null, + "nire" => null, + "registroCartorio" => null, + "anoRegistroCartorio" => null, + "cartorio" => null, + "nomeComarca" => null, + "tipoDocumento" => null, + "tipoPessoa" => null, + "passaporte" => null, + ] ] ] ] diff --git a/src/config/validator.yml b/src/config/validator.yml index 3b235e8..992557b 100644 --- a/src/config/validator.yml +++ b/src/config/validator.yml @@ -64,4 +64,35 @@ sicoob: uf: sigla: cef: -bb: \ No newline at end of file +bb: + totalRemessas: + convenios: + SEQ: + agencia: + digitoAgencia: + cedente: + convenio: + conta: + orgao: + pessoa: + cpfCnpj: + descricao: + transacoes: + SEQ: + dam: + SEQ: + dataVencimento: + dataEmissao: + nossoNumero: + numeroDocumento: + valor: + pessoa: + cpfCnpj: + nome: + endereco: + bairro: + cep: + municipio: + nome: + uf: + sigla: From 096a66d4a876e228b74aaac52efeb6e9866177ae Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Fri, 1 Jun 2018 15:24:03 -0300 Subject: [PATCH 08/17] alterando index do documento do orgao --- src/config/validator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/validator.yml b/src/config/validator.yml index 992557b..05d3ed5 100644 --- a/src/config/validator.yml +++ b/src/config/validator.yml @@ -75,7 +75,7 @@ bb: conta: orgao: pessoa: - cpfCnpj: + cnpj: descricao: transacoes: SEQ: From de1227a3aa69e3bf38b7cda17ebec1b03cf483ad Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Fri, 1 Jun 2018 15:25:02 -0300 Subject: [PATCH 09/17] UPDATE parse file --- src/Validator/Validator.php | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Validator/Validator.php b/src/Validator/Validator.php index ce726d5..b4db90b 100644 --- a/src/Validator/Validator.php +++ b/src/Validator/Validator.php @@ -10,7 +10,7 @@ class Validator /** * arquivo que contem os dados da geracao do boleto */ - const CONFIG_FILE = "src/config/validator.yml"; + const CONFIG_FILE = "/../config/validator.yml"; /** * @var array @@ -29,8 +29,9 @@ class Validator */ public function __construct(int $bancoIdentificador) { - if (!file_exists(self::CONFIG_FILE)) { - throw new \Exception("Arquivo de configuração nao localizado: " . self::CONFIG_FILE); + $fileValidator = dirname(__FILE__) . self::CONFIG_FILE; + if (!file_exists($fileValidator )) { + throw new \Exception("Arquivo de configuração nao localizado: " . $fileValidator); } $this->loadDataValidator($bancoIdentificador); @@ -44,24 +45,25 @@ public function __construct(int $bancoIdentificador) */ private function loadDataValidator(int $bancoIdentificador) { + $fileValidator = dirname(__FILE__) . self::CONFIG_FILE; switch ($bancoIdentificador) { case BancoEnum::BRADESCO: - $this->dataValidator = Yaml::parseFile(self::CONFIG_FILE)['bradesco']; + $this->dataValidator = Yaml::parseFile($fileValidator)['bradesco']; break; case BancoEnum::SICOOB: - $this->dataValidator = Yaml::parseFile(self::CONFIG_FILE)['sicoob']; + $this->dataValidator = Yaml::parseFile($fileValidator)['sicoob']; break; case BancoEnum::CEF: - $this->dataValidator = Yaml::parseFile(self::CONFIG_FILE)['cef']; + $this->dataValidator = Yaml::parseFile($fileValidator)['cef']; break; case BancoEnum::BANCO_DO_BRASIL: - $this->dataValidator = Yaml::parseFile(self::CONFIG_FILE)['bb']; + $this->dataValidator = Yaml::parseFile($fileValidator)['bb']; break; default: - throw new \Exception("Objeto de validação do banco não localizado " . self::CONFIG_FILE); + throw new \Exception("Objeto de validação do banco não localizado " . $fileValidator); break; } } @@ -76,7 +78,7 @@ public function run($data) $this->compareArray($this->dataValidator, $data); if (count($this->emptyFields)) { - throw new \Exception("Faltando dados: " . print_r($this->emptyFields, 1)); + throw new \Exception("Faltando dados: " . print_r([$this->emptyFields, 'data' => $data], 1)); } } From d72d9eb5e3128a49818dd943a1ad6fab1c7d1e2f Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Fri, 1 Jun 2018 15:25:30 -0300 Subject: [PATCH 10/17] update trailler --- src/Cnab/Cnab400/BB/Trailler.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Cnab/Cnab400/BB/Trailler.php b/src/Cnab/Cnab400/BB/Trailler.php index a098765..8f48331 100755 --- a/src/Cnab/Cnab400/BB/Trailler.php +++ b/src/Cnab/Cnab400/BB/Trailler.php @@ -21,7 +21,7 @@ public function getSequencialRegistro(): string */ public function setSequencialRegistro($sequencialRegistro) { - $this->sequencialRegistro = (string) $sequencialRegistro; + $this->sequencialRegistro = $sequencialRegistro; } /** @@ -30,9 +30,10 @@ public function setSequencialRegistro($sequencialRegistro) */ public function getTraillerToString() { - $stringTrailler = $this->identificacaoRegistro - . str_pad('', 393, ' ', STR_PAD_LEFT) - . str_pad(mb_substr($this->getSequencialRegistro(), 0, 6), 6, 0, STR_PAD_LEFT); + $stringTrailler = + $this->identificacaoRegistro . + str_pad('', 393, ' ', STR_PAD_LEFT) . + str_pad($this->getSequencialRegistro(), 6, '0', STR_PAD_LEFT); if (mb_strlen($stringTrailler) != 400) { throw new \Exception( From 92a3c805e972fd4c8b81c3b0fbf5c42293b492e8 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Fri, 1 Jun 2018 15:25:56 -0300 Subject: [PATCH 11/17] update header --- src/Cnab/Cnab400/BB/Header.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Cnab/Cnab400/BB/Header.php b/src/Cnab/Cnab400/BB/Header.php index 648362b..0bc7672 100755 --- a/src/Cnab/Cnab400/BB/Header.php +++ b/src/Cnab/Cnab400/BB/Header.php @@ -133,7 +133,7 @@ public function setComplementoRegistroBranco($complementoRegistroBranco) mb_substr($complementoRegistroBranco, 0, 7), 7, " ", - STR_PAD_LEFT + STR_PAD_RIGHT ); return $this; @@ -277,7 +277,7 @@ public function setNomeCedente($nomeCedente) mb_substr($nomeCedente, 0, 30), 30, ' ', - STR_PAD_LEFT + STR_PAD_RIGHT ); return $this; } @@ -300,7 +300,7 @@ public function setIdBanco(string $idBanco): Header mb_substr($idBanco, 0, 18), 18, ' ', - STR_PAD_LEFT + STR_PAD_RIGHT ); return $this; @@ -372,7 +372,7 @@ public function setComplementoRegistroBranco2($complementoRegistroBranco2) mb_substr($complementoRegistroBranco2, 0, 22), 22, " ", - STR_PAD_LEFT + STR_PAD_RIGHT ); return $this; @@ -420,7 +420,7 @@ public function setComplementoRegistroBranco3($complementoRegistroBranco3) mb_substr($complementoRegistroBranco3, 0, 258), 258, " ", - STR_PAD_LEFT + STR_PAD_RIGHT ); return $this; From d7970c79a23582a267459b641630be2e926a98b3 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Fri, 1 Jun 2018 15:26:13 -0300 Subject: [PATCH 12/17] parse files --- src/Builder/Builder.php | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Builder/Builder.php b/src/Builder/Builder.php index 256a15a..b6f12cb 100755 --- a/src/Builder/Builder.php +++ b/src/Builder/Builder.php @@ -11,7 +11,7 @@ class Builder /** * arquivo que contem os dados da geracao do boleto */ - const CONFIG_FILE = "src/config/params.yml"; + const CONFIG_FILE = "/../config/params.yml"; /** * Builder constructor. @@ -20,8 +20,9 @@ class Builder */ public function __construct(int $bancoIdentificador) { - if (!file_exists(self::CONFIG_FILE)) { - throw new \Exception('Arquivo de configuração nao localizado: {self::CONFIG_FILE}'); + $fileValidator = dirname(__FILE__) . self::CONFIG_FILE; + if (!file_exists($fileValidator)) { + throw new \Exception("Arquivo de configuração nao localizado: {$fileValidator}"); } $this->carregarDadosBoletoBanco($bancoIdentificador); @@ -33,25 +34,26 @@ public function __construct(int $bancoIdentificador) */ private function carregarDadosBoletoBanco(int $bancoIdentificador) { + $fileValidator = dirname(__FILE__) . self::CONFIG_FILE; switch ($bancoIdentificador) { case BancoEnum::BRADESCO: - $this->dadosBoleto = Yaml::parseFile(self::CONFIG_FILE)['cnab400']['bradesco']; + $this->dadosBoleto = Yaml::parseFile($fileValidator)['cnab400']['bradesco']; break; case BancoEnum::SICOOB: - $this->dadosBoleto = Yaml::parseFile(self::CONFIG_FILE)['cnab400']['sicoob']; + $this->dadosBoleto = Yaml::parseFile($fileValidator)['cnab400']['sicoob']; break; case BancoEnum::BANCO_DO_BRASIL: - $this->dadosBoleto = Yaml::parseFile(self::CONFIG_FILE)['cnab400']['bb']; + $this->dadosBoleto = Yaml::parseFile($fileValidator)['cnab400']['bb']; break; case BancoEnum::CEF: - $this->dadosBoleto = Yaml::parseFile(self::CONFIG_FILE)['cnab400']['cef']; + $this->dadosBoleto = Yaml::parseFile($fileValidator)['cnab400']['cef']; break; default: - throw new \Exception("Dados de boleto do banco não localizado {self::CONFIG_FILE}"); + throw new \Exception("Dados de boleto do banco não localizado {$fileValidator}"); break; } } @@ -99,7 +101,7 @@ protected function removerAcentos($string) ); // retorna a locale para a que era anterior a manipulação da string. setlocale(LC_CTYPE, $locale); - return $acentosRemovidos; + return strtoupper($acentosRemovidos); } /** From fbbebb9210631ec95e0653bfa4366a09923f4e85 Mon Sep 17 00:00:00 2001 From: "Rafael Augusto (POKER)" Date: Fri, 1 Jun 2018 15:28:15 -0300 Subject: [PATCH 13/17] update detalhe lines --- src/Cnab/Cnab400/BB/Detalhe.php | 104 +++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 35 deletions(-) diff --git a/src/Cnab/Cnab400/BB/Detalhe.php b/src/Cnab/Cnab400/BB/Detalhe.php index 5422820..32c439c 100755 --- a/src/Cnab/Cnab400/BB/Detalhe.php +++ b/src/Cnab/Cnab400/BB/Detalhe.php @@ -2,6 +2,8 @@ namespace Umbrella\Ya\RemessaBoleto\Cnab\Cnab400\BB; +use Zend_Controller_Front; + class Detalhe { @@ -75,7 +77,7 @@ public function getIdentificacaoRegistro(): string */ public function setIdentificacaoRegistro(string $identificacaoRegistro) { - $this->identificacaoRegistro = substr($identificacaoRegistro, 0, 1); + $this->identificacaoRegistro = str_pad(substr($identificacaoRegistro, 0, 1), 1, ' ', STR_PAD_LEFT); } /** @@ -91,7 +93,7 @@ public function getNumeroPrestacao(): string */ public function setNumeroPrestacao(string $numeroPrestacao) { - $this->numeroPrestacao = str_pad($numeroPrestacao, 2, '0', STR_PAD_LEFT); + $this->numeroPrestacao = str_pad(substr($numeroPrestacao, 0, 2), 2, '0', STR_PAD_LEFT); } /** @@ -107,7 +109,7 @@ public function getGrupoValor(): string */ public function setGrupoValor(string $grupoValor) { - $this->grupoValor = str_pad($grupoValor, 2, '0', STR_PAD_LEFT); + $this->grupoValor = str_pad(substr($grupoValor, 0, 2), 2, '0', STR_PAD_LEFT); } /** @@ -123,7 +125,7 @@ public function getNumBanco(): string */ public function setNumBanco(string $numBanco) { - $this->numBanco = str_pad($numBanco, 3, '0', STR_PAD_LEFT); + $this->numBanco = str_pad(substr($numBanco, 0, 3), 3, '0', STR_PAD_LEFT); } /** @@ -139,7 +141,7 @@ public function getPrefixoAgenciaCobradora(): string */ public function setPrefixoAgenciaCobradora(string $prefixoAgenciaCobradora) { - $this->prefixoAgenciaCobradora = str_pad($prefixoAgenciaCobradora, 4, ' ', STR_PAD_LEFT); + $this->prefixoAgenciaCobradora = str_pad(substr($prefixoAgenciaCobradora, 0, 4), 4, ' ', STR_PAD_LEFT); } /** @@ -155,7 +157,7 @@ public function getPrefixoAgenciaDVCobranca(): string */ public function setPrefixoAgenciaDVCobranca(string $prefixoAgenciaDVCobranca) { - $this->prefixoAgenciaDVCobranca = str_pad($prefixoAgenciaDVCobranca, 1, ' ', STR_PAD_LEFT); + $this->prefixoAgenciaDVCobranca = str_pad(substr($prefixoAgenciaDVCobranca, 0, 1), 1, ' ', STR_PAD_LEFT); } /** @@ -171,7 +173,7 @@ public function getComplementoRegistroBranco1(): string */ public function setComplementoRegistroBranco1(string $complementoRegistroBranco1) { - $this->complementoRegistroBranco1 = str_pad($complementoRegistroBranco1, 3, ' ', STR_PAD_LEFT); + $this->complementoRegistroBranco1 = str_pad(substr($complementoRegistroBranco1,0, 3), 3, ' ', STR_PAD_LEFT); } /** @@ -187,7 +189,7 @@ public function getComplementoRegistroBranco2(): string */ public function setComplementoRegistroBranco2(string $complementoRegistroBranco2) { - $this->complementoRegistroBranco2 = str_pad($complementoRegistroBranco2, 3, ' ', STR_PAD_LEFT); + $this->complementoRegistroBranco2 = str_pad(substr($complementoRegistroBranco2, 0, 3), 3, ' ', STR_PAD_LEFT); } /** @@ -203,7 +205,7 @@ public function getComplementoRegistroBranco3(): string */ public function setComplementoRegistroBranco3(string $complementoRegistroBranco3) { - $this->complementoRegistroBranco3 = str_pad($complementoRegistroBranco3, 1, ' ', STR_PAD_LEFT); + $this->complementoRegistroBranco3 = str_pad(substr($complementoRegistroBranco3, 0, 1), 1, ' ', STR_PAD_LEFT); } /** @@ -219,7 +221,7 @@ public function getTipoInscricaoCedente() */ public function setTipoInscricaoCedente($tipoInscricaoCedente) { - $this->tipoInscricaoCedente = str_pad($tipoInscricaoCedente, 2, '0', STR_PAD_LEFT); + $this->tipoInscricaoCedente = str_pad(substr($tipoInscricaoCedente, 0, 2), 2, '0', STR_PAD_LEFT); } /** @@ -251,7 +253,7 @@ public function getPrefixoAgencia() */ public function setPrefixoAgencia($prefixoAgencia) { - $this->prefixoAgencia = str_pad($prefixoAgencia, 4, '0', STR_PAD_LEFT); + $this->prefixoAgencia = str_pad(substr($prefixoAgencia, 0, 4), 4, '0', STR_PAD_LEFT); } /** @@ -267,7 +269,7 @@ public function getPrefixoAgenciaDV() */ public function setPrefixoAgenciaDV($prefixoAgenciaDV) { - $this->prefixoAgenciaDV = str_pad($prefixoAgenciaDV, 1, '0', STR_PAD_LEFT); + $this->prefixoAgenciaDV = str_pad(substr($prefixoAgenciaDV, 0, 1), 1, '0', STR_PAD_LEFT); } /** @@ -283,7 +285,7 @@ public function getContaCorrenteCedente() */ public function setContaCorrenteCedente($contaCorrenteCedente) { - $this->contaCorrenteCedente = str_pad($contaCorrenteCedente, 8, '0', STR_PAD_LEFT); + $this->contaCorrenteCedente = str_pad(substr($contaCorrenteCedente, 0, 8), 8, '0', STR_PAD_LEFT); } /** @@ -299,7 +301,7 @@ public function getContaCorrenteDVCedente() */ public function setContaCorrenteDVCedente($contaCorrenteDVCedente) { - $this->contaCorrenteDVCedente = str_pad($contaCorrenteDVCedente, 1, '0', STR_PAD_LEFT); + $this->contaCorrenteDVCedente = str_pad(substr($contaCorrenteDVCedente, 0, 1), 1, '0', STR_PAD_LEFT); } /** @@ -315,7 +317,7 @@ public function getConvenioCobrancaCedente() */ public function setConvenioCobrancaCedente($convenioCobrancaCedente) { - $this->convenioCobrancaCedente = str_pad($convenioCobrancaCedente, 7, '0', STR_PAD_LEFT); + $this->convenioCobrancaCedente = str_pad(substr($convenioCobrancaCedente, 0, 7), 7, '0', STR_PAD_LEFT); } /** @@ -331,7 +333,7 @@ public function getCodigoControleEmpresa() */ public function setCodigoControleEmpresa($codigoControleEmpresa) { - $this->codigoControleEmpresa = str_pad($codigoControleEmpresa, 25, ' ', STR_PAD_RIGHT); + $this->codigoControleEmpresa = str_pad(substr($codigoControleEmpresa, 0, 25), 25, ' ', STR_PAD_RIGHT); } /** @@ -347,7 +349,7 @@ public function getNossoNumero() */ public function setNossoNumero($nossoNumero) { - $this->nossoNumero = str_pad($nossoNumero, 17, '0', STR_PAD_LEFT); + $this->nossoNumero = str_pad(substr($nossoNumero, 0, 17), 17, '0', STR_PAD_LEFT); } /** @@ -363,7 +365,7 @@ public function getMsgSacadorAvalista() */ public function setMsgSacadorAvalista($msgSacadorAvalista) { - $this->msgSacadorAvalista = str_pad($msgSacadorAvalista, 1, ' ', STR_PAD_LEFT); + $this->msgSacadorAvalista = str_pad(substr($msgSacadorAvalista, 0,1), 1, ' ', STR_PAD_LEFT); } /** @@ -379,7 +381,7 @@ public function getPrefixoTitulo() */ public function setPrefixoTitulo($prefixoTitulo) { - $this->prefixoTitulo = str_pad($prefixoTitulo, 3, '0', STR_PAD_LEFT); + $this->prefixoTitulo = str_pad(substr($prefixoTitulo, 0, 3), 3, ' ', STR_PAD_LEFT); } /** @@ -395,7 +397,7 @@ public function getVariacaoCarteira() */ public function setVariacaoCarteira($variacaoCarteira) { - $this->variacaoCarteira = str_pad($variacaoCarteira, 3, '0', STR_PAD_LEFT); + $this->variacaoCarteira = str_pad(substr($variacaoCarteira, 0, 3), 3, '0', STR_PAD_LEFT); } /** @@ -411,7 +413,7 @@ public function getContaCaucao() */ public function setContaCaucao($contaCaucao) { - $this->contaCaucao = str_pad($contaCaucao, 1, '0', STR_PAD_LEFT); + $this->contaCaucao = str_pad(substr($contaCaucao, 0, 1), 1, '0', STR_PAD_LEFT); } /** @@ -427,7 +429,7 @@ public function getNumeroBordero() */ public function setNumeroBordero($numeroBordero) { - $this->numeroBordero = str_pad($numeroBordero, 6, '0', STR_PAD_LEFT); + $this->numeroBordero = str_pad(substr($numeroBordero, 0, 6), 6, '0', STR_PAD_LEFT); } /** @@ -443,7 +445,7 @@ public function getTipoCobranca() */ public function setTipoCobranca($tipoCobranca) { - $this->tipoCobranca = str_pad($tipoCobranca, 5, ' ', STR_PAD_LEFT); + $this->tipoCobranca = str_pad(substr($tipoCobranca, 0, 5), 5, ' ', STR_PAD_LEFT); } /** @@ -459,7 +461,7 @@ public function getCarteiraCobranca() */ public function setCarteiraCobranca($carteiraCobranca) { - $this->carteiraCobranca = str_pad($carteiraCobranca, 2, '0', STR_PAD_LEFT); + $this->carteiraCobranca = str_pad(substr($carteiraCobranca, 0, 2), 2, '0', STR_PAD_LEFT); } /** @@ -475,7 +477,7 @@ public function getComando() */ public function setComando($comando) { - $this->comando = str_pad($comando, 2, '0', STR_PAD_LEFT); + $this->comando = str_pad(substr($comando, 0, 2), 2, '0', STR_PAD_LEFT); } /** @@ -491,7 +493,7 @@ public function getNumTituloCedente() */ public function setNumTituloCedente($numTituloCedente) { - $this->numTituloCedente = str_pad($numTituloCedente, 10, ' ', STR_PAD_LEFT); + $this->numTituloCedente = str_pad(substr($numTituloCedente, 0, 10), 10, ' ', STR_PAD_LEFT); } /** @@ -507,7 +509,7 @@ public function getDtVencimento() */ public function setDtVencimento($dtVencimento) { - $this->dtVencimento = str_pad($dtVencimento, 6, '0', STR_PAD_LEFT); + $this->dtVencimento = str_pad(substr($dtVencimento, 0, 6), 6, '0', STR_PAD_LEFT); } /** @@ -523,7 +525,9 @@ public function getVlTitulo() */ public function setVlTitulo($vlTitulo) { - $this->vlTitulo = str_pad($vlTitulo, 13, ' ', STR_PAD_LEFT); + $vlTitulo = str_replace($vlTitulo, '.', ''); + + $this->vlTitulo = str_pad(substr($vlTitulo, 0, 13), 13, '0', STR_PAD_LEFT); } /** @@ -571,7 +575,7 @@ public function getDtEmissaoTitulo() */ public function setDtEmissaoTitulo($dtEmissaoTitulo) { - $this->dtEmissaoTitulo = str_pad($dtEmissaoTitulo, 6, ' ', STR_PAD_LEFT); + $this->dtEmissaoTitulo = str_pad(substr($dtEmissaoTitulo, 0, 6), 6, ' ', STR_PAD_LEFT); } /** @@ -587,7 +591,7 @@ public function getInstrucaoCodificada1() */ public function setInstrucaoCodificada1($instrucaoCodificada1) { - $this->instrucaoCodificada1 = str_pad($instrucaoCodificada1, 2, ' ', STR_PAD_LEFT); + $this->instrucaoCodificada1 = str_pad(substr($instrucaoCodificada1, 0, 2), 2, ' ', STR_PAD_LEFT); } /** @@ -603,7 +607,7 @@ public function getInstrucaoCodificada2() */ public function setInstrucaoCodificada2($instrucaoCodificada2) { - $this->instrucaoCodificada2 = str_pad($instrucaoCodificada2, 2, ' ', STR_PAD_LEFT); + $this->instrucaoCodificada2 = str_pad(substr($instrucaoCodificada2, 0, 2), 2, ' ', STR_PAD_LEFT); } /** @@ -911,7 +915,7 @@ public function getDetalhesToString() . $this->getVlIOF() . $this->getVlAbatimento() . $this->getTipoOperacaoSacado() - . $this->getNumeroCPFCNPJCedente() + . $this->getCpfCnpjSacado() . $this->getNomeSacado() . $this->getComplementoRegistroBranco2() . $this->getEnderecoSacado() @@ -924,14 +928,44 @@ public function getDetalhesToString() . $this->getComplementoRegistroBranco3() . $this->getSequencialRegistro() ; - + echo "