@(+PWDnDqV%p-QPk_)HG1(QeS@r8Eg?1BSTPVv>t{p&3J-1cFKkG^To($V
ztQ%VQw5t{mXux2rn?=aX<41$Gitx>IU(wbBoANI%gs~(P8ZqFL1kl%+oovdl
zckg|DPi?C^KdH%T$R*ZVRgypfEI=k|ydN*?X@}ll8Y9?*z58)Qj~uRGV>ldbC90cA
ziw0}2JzVYY*r>;pnj~b*D}Yw^gS8eZXC6XrWt3~$zC
z0$@n+L$ugS=&|TChpjH-ZD|QmREuctbZo!fCUw<*1mc&EeEez1U&?WLwZb=?nj*F8qtR@R2A
zMH;c#77?AR9+;~5A-xeSFDRE`#w`CXojl!Ps=nyow)v~TAwqw7y=?*2MZ{cgh
zyf-|oCKQYZEllddR~Ft;&sjy5n(O%W8DVztfvfsuAj_Lk*VKkExWEA@e&ZpE?3^x$
zbzmFf)mj`7`bEqAa4?<+J5Ht#gD8RLyB>7!&rp+quVSai9h|q}cK!G~WS1sz$`-eG
zoFt|i^mXhgAmND;$MEd{k^#Q(&4F6+o43Y)Bx?6Eox3~_t9|qp-Nv^uSv&1+snJfF
z#_;rGmn{~s(&nyk6018N9$w#Pp)kO)0qp-J8|Fj@4!A^Nl)?=MDRk=?d@6rtp$L54
z``vEZ(N6U(dtJPFp^fa1u-cBfV8s{9XnUP~(ff_gqFeE=>)_yf>;CWco@p7M+V-Z0
zvcI+*%W5Zt60nGrI#240W~oU1fMFPYWP_aOUD`9hYsmfcrbp5B$@m1Wr!+pyLzeo1
z6@^4fkmc;}W$JfjklWb0CdXaCB}1_cZGZfioL_akRmG{6!db+nkb}5B@*HA+Y#QxB
z&YFfC-*rM|(fh&~4}*0R36tb(?yVZh8x>4;g*V(tGQ=vV@viITUbl5QhlNn14@iuA
zF(C9%XZAo_zxy_czZIT3p+qBASK2vHEQ}1{k-wxkeVl_OvCP~zCzkt)Qr4U3=$PJ3
zQ%{c@jWZ_f)X1BKbDy8AiN(&Q5&%65pv3a%sIdPSh-Ck2YU%vhTocs~#AGZ|0WSZK
zZGw@+X;fS#-#==vb81K@`_wcoD`z(Sct&c2^N5=nAWMG6O=y8goW|X;W4j3X;b!GE
z`3X2~9Jb)ZA#r^ik=SV}m>LYx6*l}&zuBiWoq}$3K~6>cQOz>*Yj1|SWt`eV{AqgS
zUMv_;(Y1^zL)EpBnKoM=mNp4J#Qej&qDXaJUMU)T#3~?U;g~ixa
z@~s=3NRA#Cv0l{_uz_yh)7BX`#x$;P?+rg8!Q*L_f-zH%jJqL5(Y`@!5^iCI0xJ
zj)X$=_O)>JcO4S85c?@oU&KcUT2G8hTIx_7=Z}68{Yhfw**Wv9tn_C^g?8e{bYeWXWA&VN>~54#EEi==bgZ$IR}R1CX1Wre$Iiw3&p@961c
zQ3g@H)x+Uo4g8YZqy@u`mmZMn((L%IE~CSU@RNuae)_?M6cBJ&S~w6B+uy;O3iy;?U6Pk%n>D$)w~d+<2|3s@{EabV<63;g+9ue3(s?_H-~R6C
zewQ+&)wm`OvPGDj)iJu){Itc>thk>}yYTx-;oG?FBCAr)wC|q&?dfyUB-1eFwWD3s
z6GOhvCUN&uQYqB0Zg{`DA`&D}v6hkFt@TPV+;g^XL9u^oXgnZixN048p03IHT`hFt
zLWc!*Yp0wp*a!
zv~ScWA8Ty_z-JErMi1P~D@x8hi>f}h=bsN`$Mm7T%>xdTFyd-P^FLg9aHu7kHFA>
z$Q_#cRzMEUxV$E>7mgY@j#I`?cV_J$}3TW!qklagUapfG!De;iS+&>C$tuo9Be@
zTpbM2p;O<;@_bkl%U=0Fs-WjzX>QDa9yn_`MlmP%&RP)zGb~m`0uH53gxZ)jl&BCA
zlpM*;FfhDVo07+8^7p5I9~-Ayz{Efe#Cs3MCoqA22j!uvz{Bc{7IhuQ6O^Alia61Y
zh8RPs8bPvA1P^_3hLS||9wLG}tX~QaD1DoTX<`oCB{D^?TJl3-8+L!c^fYF>FGX3I
zcuQLR`hL`v_4<^@$;CxYCatlob8>X_a*yNNv3HB>H?yEdv-MBq!IZ0f$=khIwyu|V
z=Y`TL_61@4K?%{&eZAJQBrCA7k#F8Rp;>kg^70@K`V^{t?3V$ID1rW|dJ1q_bS+tx
z0txAc5;!B&1c7P-qsN1Z)v5!WfECV4E@L)b@RLr}3!Buk*Ky5>f9D;xWxrkeY!$bn%vaung#=!v
zO6P*W@++5$_$CFm){DjN`+#w2Yq;bo2@uG;;cx1DoHymcT%|R;Mk+(l0k|(
zEOzf~xL(NJ7u7#K0$po_M!|TQ`f5aCD6G=O%ZQX4+d^V*hq=1r<+j^5mvbjQs^~=c
zTO@X*QGkoqbDt$23I%q?xAa&jKGPWKrb6}IF5Guu?)2T)Re3um#}gDWx4#>+E;GHn
z*JDUkQtT|8w>F#67_31K7tu}6CE;Tm=4iq!?Phzf{|T1r#7l^GD#OywSAc(hPGzNd
zmKbMV%@CRLsAhqXldz0;!1^smK|0$AO-e3f3$>A3Z}$&-cU!Ow4d*{
zyWpHWaiASDtIN`@kIyA*H|$5;V;D-3W83}U;Zf(|*M;RjyJ%DBdJ5d-zGvZ7t8@R*
zZ^8c7fDj@}fFEcUcNTi6c93a4dfAPqdgk2a9jZ!U9yVYy>GC2Y}+7Ym7-?Ivlr
zJse;$CyByowsShatI7#`^b#vGlO}(C08O^(|EH>m5RJfQkVOuZ7?X|Mr;wE<$RB%G
z>5=r_3>Y~4`LVsf0-XUR91cNJ$tTrK%$0^hXvOP7i699-KxW;{IP&eTpZ7RGCHS{&
zg*@A5Lq-T{V?6p=qa^u6rC0(e^?Lw}eq~|Jd&Pn3ar+q;3qVc^RDsK*I|lG*t+_u&
zdF)NVHNqmhg+`X=|Ac8e+$1@4KEBk6+oJU@v#>WUq!R%C>$oa=SKOg1-xe5xV1m-2
zgtGjI*Wk#UdK(m$UPH?vmY92z`36$kGq%blp5@Ue3X7*b4qrBUQtab>&I-&K>d*=io6?cmA&7-dA>fB$Wr5)
zMUnH{s1kdiF>C8P@4Y;F`$)urOI;oJ5B?DnoBgjgIa8G3E?pS3PF9ymJM)&SM!~^f
z7golTQV#FeZzr@+P_1l;FGx6h^Xw2JQN{zlYj9pp&*=ooU4a#^uk}B(=wizl%Sef6
z8lmB0a-vxz2Ilb{u?tL!B_^Di-d?XO)~Gb{FhFvMG?#8t7{TyDh6B5`)1-3Mt9Pk}
zjh3(q1Wf;&^OvjYlc
z=3@~5Q`;MBC@j@aVE9V%f6qhei6ov^Xhrl<17%o<@_}#hbY-x
zThjYKFF?3@@pUpY%1_WaQ=@l4*-EDJhlH0~H`R5GAV#Q#bZ^*NQMIr4>(2xs;<<4u
zZ+e}B-@7hc?Z#o^`t`@J>9k?y5q{f-&{madrufv8_MtZ`J~rNQd4Hz3&G_DYqb?=U
zab9zIg5x7-i=es6K_5Q^g}jPrCf?fQvv`(pbw!sK3$>o*t80HSPYW~>SEMSq_Yof=
z=-2$~R4!+tQ;~v#C)d3CP)!^tq4AGtS)ibxsAwv-xMje;zYxzN
zK4KZ;00OCv6AxWdev)jrZC(
FX+e=n*uhkyMKD#3zXT6#Nicwg;ApM
zprF)-M&g@a?uV6PH(L#>qcD%BJvA7ajnCpz}E
z^xA0W>CO$i)iBYU!oZ?t*Fi$<%&x76L#y}bm{?O6Q79-Q7@zNE?GvlOf*bcJjXQy=
zl~x}-Z~yZ-KU9OL5MZ}=&mUFK0iMzVS@tW792~I5O9#rKoa|~$h~rS
zEMvaVux3Rd^8NfJ7Qhje8-=yI1gg#S9}HnMJMw15q4Vhie`&&Woq_AL_OQtwpMLdr
zYL<|Zds2u1s_~2zK<;pHPMq!gCekm%G{U813KmQ^T#Ey5{5Zhnr(+v77l`rDp7L>S
zP2VX&hxn*UC>)WB4(qx&utj_O#X_c$s%KH5E&M)~nQoc+uyIn7S9iX-Btb%UfP|o~
z5Ke(BC5_k;o|cvqkBIyvn{EDX%BQ__9fNdXC{nc5Ln(rUcJWDhs33Mrf+c*I|6-8L
zNeBhN@?MsO5l)C>=5($0!e!Y9B!Vxm?61}-Fz|!_)fG>SQpZIk}F-Si4|wvaj2KYqD+`QV$!p_rt0B>l0lG
z5$&R|VKW88RiRBCGCIf{D8ZD+lq)f}@1y3Q3bujcydV3K2&NAuQ>CE~#fY8Uf?lx|pA3mh)2kX_t`lsAVkth;7B8_Fmc+
zCn+SI8BbOaQn~m%+$Je0sgsaUO8>Ep+^tJ+v|YqqiMw)sX^%qevk7o@>NE)GLlSj)
zidOjWP+aEd>BU7~fV1Z%mA>7qz&9EfD~m^f0Ew%@PsAf>i%JPD5yzRIAN$!EVQ}bxS`Z-+5lPqAY}X+M8y<{MD^c&Oga!Q
zQ3QuDo6W>BsG1Sh!nEQ+81Ya}SbzjA5TztemOvLJIX1~8Dw)6vMNb#Su5m_E(s6%l
zuS3A)>p(h0@PG%B%anxadDL>PMef_e$xRIA;iZmx)tdbK
ze-6|v(U6^OA42LqD`gM+GMChSJ?2{vD_Zp!8L4S&9LMy@W@ClVr|mTtY)4Wn8|C8p
zi%V1u9S9We1;q{N2{o-A-c_0dsc93w`zYY-rJJ<{?&Nday7yUdXycQCoCirv>q-?T
zsKzHS(%hYU{na)6>`pqA9|E1RpU}Scht+SCU*Qju6eT?h50d0IJ>QC5MDZ1mb|5c%
z2d=r^k0obRy=%(kRahy{1*E#Mn2Us;DjIK2
z-%jXVQ^veabq;7RH)_HpoS96+Ui$NtAxMYo;68k|D@XVA;SrDVc0sFUPV|0+xhjLp
z)oRDMZbGWT+C77n?`g_O-wrjM5srh|RG
z5S0!KfYnR=&k*OkmhU{qBzQQjlCY`z6S)JAsF$(noo_Xf3)&wLNTy}8U3M)F22!usZ!!Mc{X*%m
zu)N@SU-DMZdEWe^%wkH&1xN02Ju(UbM|X
zAOI%P5T{v3%78%IH<8O8t8X^vIqi7flyc;krEW3z_*Vql#}kYs?M%^3qzbt9)EGBK
z<-QFRZQTNvr?P!aI>Pj0SM{H*0l^EzTO0Y|}
zn0QPIUWdk1cfZm5qN(<}CIl~eo~9kVjpK@@$hH!N(_$K1n(`AtS4HZgXY|Yjj|y<@
z-4PN8^$+u58@ihByXHf-VkbJO#U2M4d}O7(%n)OBV|V6D$I`Hd|3kDiv<&I@7xC)t@jlfl%0k!qq+Acu47BG|bsD+VM;&Xg6~ar)FBX{Lgxo~o_Q$qW
zmvIg878_N|)Q~ks00~K^_XuCis#WJJu!3dm5^WG3aq*H|9!WyYbS4_GSLL7UDI$n!
z^JsnH2H9a!?uYkL{e=`dUP<3+6YqQG|2=D%9*g!mncYQu_Px~fTbF^sn9ZdItY^_~
zmJb~fPAsZ46`V$%ADrfZo-FhF?-egeCiR5@p>k?EwpoqR{G5uj7gJLL8xMn)O)sgx
zsDUV0=VTwS{Tf|4FgYZL_%go{2G{2yJj#it$^Xi(X&i$AZ;NeBO5%vthUG62@H?A8!_?0!YEN
z>)BBc5ey&J{c@^}@Uk<$fyO|0ztQ-{TLt;ASnbCA45)N*jgjWpNd=VUDU_1xQ3$eM
z6Y?mKYbxw19EeUY^POb3xG
z^V79W7qq{r9m;t;)i#jii3bs&13vc!&h$QdTMrNlvg$?1Y5acso#v0HPmhl7r+Y$e
zgL}!Ok=1_O*NfMaYZNo6jpX~64}(h4_Bnl-+{kYo6;D6XoC24;1
zx8LDQMaO)g6fh>47WGR(@@0)-g-VK`5!ng-TG~0phID`sv7=|V;a&V1O#X?Qq}ELu
z9gq}!6a72I^=_;XLkdJQPS`=sj^8Hub@}tk@{%0PwmqkS3fUN{#ApEeHCs!etCAu9udq&
z?84sQo+&>*E-$PmT?S1X^>>+W*b0Km)=sg95&v~^dfs@tE6vC@?`=C#{UTA9o6Y#t
zvHiEW7|N8<+tOjh1i#yr!FQVP+;_2FIE?=prJ_N6l`^ntk=l8&H#r%OJqm+ubh05?
z7yKPoHNro3F`i)avhNh7MgW(Yzsa4SL3{OqUC#DMYtH|R#2Yd<8mO;vfFZa}pf@_xV3nOzS
zyFhtG)nTxpV=6NSJ+8>Z9INZI@o%vRr!=3CR6-*br6_2*&xL$*$$@*unet6jyYR
zAtDoG)<8!>*c^xq2D67qcX95t-1o;qX~}VDq!yVrM^7ZH87p-CaK+U*
zp9yNV2Gh%iACjBFNt4P?Z$>YkPIZN#M!o;Ukq~DxT5z_-Y0~_Z&~z&0I-NCd8GUt
z7a3D-6D6GZA%ZO0Q-&D!55265MTD5m%x_#INGF6Y;ymU)Y`gFe8_-NU)=Gz(>=yS1
zcZawrs*DnFMq)vNdAzc+@IQ6l%M^|T3Y#>$kxt>!`L>?M**e?@sEPo}pu6AYu(4L;
zcL#_Krb7E9bkB280UAUc)CVtr!uI}YzyBObhc=?ja9%1vpulLuToLMsC5G1%+1efW
zyaF?!V7GQZ*bO!MTX*OdmgI70db3R5lD9F5Cl?zYQg?JpNPwR3WP
zJs(M5J;*U4ecv+ttUwOVNivK&?91)9vCD>KdB!XN|UG
z<~e9xd-y)?)yCLTf*bc=`~eC$l85Ev97=2+mA?CnJTog}!Pz#?Ok|q#WalPY>X*J@
zx%PV&1_l=7yD71^S65-N<7j9AM^kh;Mq6yy4Q@}$Ex(ab=yBiponWw9XwAKtGH|DG
z!zEg}-S?PYB_UT+J}mG8^R0ClW>P=d%+z{FkMCTNPP2LOCn*)$T*!TSPVL?|#v+aM
z@7esk6q97Z@H|_MjF0tWrC1`%%SZOj`uaBgYSd|bm}qA)Avqmq7q)H5AAeeArEAzb
zpi~N9-z8Am+sCzHto-l}pJK0QxzH0jZP>V+>`wpwSArZjQVCe5W?LCHm=Sz4kGosx
zs!;feS3pc)h?3L<(U|)#$h=UsQ;|R0#VmP7xDWr&Twk=A*c*YlBCmc+9|jf8@(`ro
zV?1RN<$$Jw0=Ef)A?jpt7C2|jTzF4;b?42Yn8rcfBA2uM-0Lb3MM&_a2Xv%UG&HZPAszJC%7Np4`jm?L#o7QFVH?7kukFz0>E66&cruY%AU-fE>x?|5q(4w$A$
zP&;#c4rGl~`J>7AszMxNlW6fqJg<%J3q!G*6G
z#)2PSgEcu^q?k5HHXDmR>9Owc|D06~@|5aQ7$rW~c^p4%iWFxJbGR#oeS1?7bms4-
zkF&%fK}nyVl>E2rFR}J}gEsYdHfFf%$0d_pS2@g8okdf%1kt{pTW8Jm(6}alpR4H*
ztZ<4b7Kj|!Tio73dJO`Gnp8BnvOEV(o?hqhZOF~evAqxbUAq7>ep`Ioyj0)2s~-np
zyLDu&bKEiX_&X_^QpPlVG%RnkUzMxZO6g*K4-k1(^f#>Goh19vSawW93qtJu3XIk#
z#1+p`iuR-N?W?N7u*`DD-U9nW(p=vy`o3J|*nVnVq!l63fGJ)))(b^EO%A433Hi6^DrvAW+3&K!B74I&BFYj!Y*c#sQ7+#4=Mg=?Mj?!Z3AY;TSf|
zCEP$@M576^ZtOQ?LQJ|)o3M$UkPQ*{pXT)Mg1+|g+C<)xTi70}Pj=h|9G(E#=&{Wd
z@olnHzby=Z&zCZAyJ*ED?9JCf9v#jP%hfa9bv`y$OyRR3V=OR}0*&@Cf^KhC)RkV>
z4;>U0T3O=Rurb+#4b+Nc8Jm&Rc8Eem<<{~@Tp*oH=@azFud93i^aCJ@6o=&!0PRYk
zznY8F2N^)~TTc~^fP;Iqu+$Yk*HiDWy7|RX!oM|;y5GD5*OgOIsa*;jzE{S95EhS}BV(cO
zH7Iyfv`l!KcjwPNBR*2rZgrvL6G8$jB-*JrKe2+wQh6M&8=F&FancF-EpCS$ODm7h
zWvHCT?NsG|7@LT8oZku-VqEzKtqx-&5Jek@JpW$&y}M%k)x|X5P{z}wOzUy3g|~(4
zNIBhjFCJ}yJ~%xLj5X+FsQpGi78@;{S%aUQNT#^?=&ksNxHhnN%^@!?LL&!UO@bjooM=
z$ReKT=z^ZPAW(&9kG0y35tYT}*)5eQ7YJk_ZESCIWI648>EwgOIdo{jIfKqEE2LR8F*z8KOPmPN{r|`xIr@{n2D${(-d6YZ>e@J
zBR}i@`(JFd>|f+u*MItMZ8n7tV^DrNTC56WSNy3IoxMm2ROm(ug
zpS|Zs`qUR%t{Z+}FH*Lp_g`N-)!LGKI47*Gk;zzPAmvqL+wVE%9{N#PQT!W4vNk0e
zk$gpQum9Ev)o0p=dyg?Nx1(fGWh3Rl&VX-s5&^PG1JZBMKV=q-eU3>nXi=8?W(W{#
z^rj1gk2jK?YD`?XAjL!inV=~Y+uGc5yix05Kb?P4yGTt*MKMeCam4nMw*6Wkh{2D0
zUFrwA9mjN!LgLjH+K~o>Q(mmsUI+dJ|DKaAk6N!uSuj=_^ays5r=NNjtXFo{mfB~4?_E?#xfbU<=UUEiXzL-4$8T1mmgCh
z8dl%(;BN}gvwWztD*prFgpt@_&OwzDq!QHP2sz^zw5`53N_+_vW9bur)t6O)
zLIgT%Xa*8k&qLd4zu0ww5*MXWgG|LT
z6~;6L$jAISc8eM#w6)5&k!@iw#qu9Q2)?$X(1p)8f{GZD{A48`RZRFpv#V*Hg#6-l
zZh*@F&GwkoXCY<%$b63r!8Ku=)M$2)m%T>uxY^9h^@5>ycl8M`*=-gwOZkVBhuI@>
zG;;2rXDLaj>`Ynpk9*A@zb=`}++_}?@+^LI?)LtAa+pzu9@w}eNEIyLeR!>a5R%rf
z{vJ$P=YbVIFq6pWU~qf6!c@xsD@YQEtP-1e!Hr4%`%u4!K`egpdWt=8l|K$$uz93=
zwUO+x`O<-4q98^mtPeY2a#DtCymLByxjnZjjX$3ib9dbvuM)o|Am?dEMp=qPc;uAag+?wZu(h7X!IO#u!({rS>*Uv?}g_)$bdYkb*qr#UB$JP^7g?`Z~}VBdYk8XJc#i1GAC_A_}>5DT@h4B
z(8qYr{-U`^ZmmIasQ+4{#ZBw@M&YMq>KN4@FU6D(p~H+4GzU#suUrR&O$%)gS!cUl
zDO4t1$y-38?Aw7wbaX$Cp6?wKdd!(FgVTD9;J!icwo>$ZMbhe)lP1?kL7ZRg)yX}>)--WD7~ayp~ARqQy-~6`{VKRvR&l4+MpoNJLl^y#U;s1F7Jb#GdFRyH%^_VPuYG3>MF6Rq+
zMr$baV|d`Ne!o0Bz`vk_<^l1kt*kwZ%EKK7wa~k>{z*#rA3vS{yt%jo+ePJ(u>H;n
zM+Hiif^lPl1H`Fi&WMtgLtN+^x!%{VhpL^W4YMo!zuL~Jxw0-=!`VqXHahHB9ox>1
zZQK50+eyc^Z5thS+#P$zwz+e1an4UT*K4k-xvEx;Iq<&EG#pu`G-G<8#i_Ji8Nx&E
zLW;jnX%~TJGJ#z(@EJ+&_sS@Hm2doqY*Ci~{{E=#SLEt5zd;0)V^8$~@!SUrbal&W
zAy^uKwE!L3Y1ZLWUdiFd?5n
z+oMF~xXlZ8`RwapwB=kedXQ!0l^=kd?bhq;@BcEPb{{-c_98_&Fsd8Dhcj}Y4O4cl
z&!aB5lX2FbH?AufzO4oQd?F`Z$X?P*xBoc-=A4LF5P!_jrf5yu%H?rAZ?v58v>f%F
zMg5yW9~~Je9FpjmDgV%HfG@4iF7(5OM{I~}*ms88tbZbZ;;2xv!DYw)qO!H8&ufah
zi&&l32Bz>gn5Vjy^<)?m#R-Cjz09J`WTXt}I$d`pM^T@5nO
z`l_!xz+2Quv}FA{h
zQOOvJ6GrByjAEe?T_k7`&@+}hI7{`bxA*F@`-&0A&{@LA$ES^tBM(+4p-6_Ya~J2+
z`()EXr8t#^v>__fXCbJ&wrPSk7L&=h_E>NDJLZHK
z9E|tJ&D0O|6?}n10UMQGWso+-dZ+igyJbeAy)9MtJ$+W%nW=+%s-)Q5Md(;|y19K)wAHf2wq5
z?z`T8v5dEJf!@|y43tJ*7T0v!F)738u+|GR$A~&-BQ*3zO|glUV41}f(1$PIQuW>6
z-@j8`SV|Ptmrd=WooBk9ioGtBI{)3!q(>RM9IhuN|B~<%r!r=thMjTNCw%tnJwct
zh5Yt+-dNcJVG0sEknCiDnjhy&?G`i2G!r@vHa#Q#R(K*TQo#q9C~Kv?BqbcvlHk9_
zO~|zf-vJ&g7BL}@A5%3v^9fji&K~s+_t+2cp@Ot(t8HQsYt#!H0zVWwbs*b-&lA=2
z@jQomBGbej`JPjMg&F3#_AL+M(EP$7kMvWls?wkK2;?>6h4V=0<1EEr6|pZB+!FH}
zPDx!)fwCUM%&a@l?ibm%<%c^UT^bhC}n&zf>XnL!K=bl|B$cKLvD?0wj}8OxW~
zdJcqdQeK8M|H*r64l?FZ)58BD!CA=h;L|vH^6Ci+10=qnn$9bw6qEI=O(YvXR4Z)Y
zhKCnr)$-SiU{$N34z#d()c3mc?ibY4G%+@_-KOH>w`hXzm#E8nVi&d+g8u!9y3hS@
z*uUD}O1qS%sp(E1P-R-YpHbZBJ-p+Ch{~#@c7R>BGZZEA&kaQvW$&436Y$lKGUmbtY^>Kzr;D7jf?5DQSHC#fnbXDm1Jh&CM9%oBA&kG{JGTrvz
z3I|`6={OdMl*xl19vi2DA0Evr5}90EsDWHtFJm|c`QlZ`tDKI`=R!h8C4k
zZSXqOVB*QPp7nJ1=fSvj4cf8^I_g4s_{3@ceD^#>iY(`(SyVG4E)CbY#|gTtJnspQ
zlp?1sKvgzG3}q3!Jh>%r5o#n1XE-@?QBTd%8mjeu^iJ!fdOUFI1O3y%Y;x%D;4-B6
zvow}tsIdKGDO$$A5-44Vn?x~`jpW*I8st+KO(cUb=#FpGeu}-%X-n`yK{v$MSu*zT2OdZHr^e=fqhIaFHZRGu_2*@2duQ927_ZH>^R+i{5YT&7
zX!%aDN>%gK4*O2m{IqJG9q;RE4{>B^W3@|0i}oGuWjGn-^Iju=y9G&@OuA$C$VD)=
zO(|bI_SEEbyID7@4%G+t^D{iwmO_D}w(u
zF$BxKESxRTH)s0?NP@++j||_Ytd%!GArMxmd3sDy=)p?1QdX%S2R!zjN~goE-Zq1qk-sP#R;+)EC_el-9|*}y#{Q#T
z2*y)*8l(_9`sbd6@qOoWk)s*
z45W+n$xglDBN`%b1U7PucuaOyk#uX5ZjG)`^52F}%88Om(6JL;i>t>W2Ew7Qdfu1<
z{GKU`I3X&3^*>OGKuV;nHXji-oTcTjxe7o_p`js?2FPJ*{_CYQ2ABx!;UI0%~KBI&m_5I9*f
z;G%jo!>eeLVw8Ckyx#wDLaazFJ;&Y;qM=hs`dzpezvA`ruoMzzefk}Pq>u%wJjegp
zJ%2TH-X91%8g(UOf2_y;2jNJb8oF4$K!+hSpn2u?r_2+vqnY`4&UYwv&
za(r#95ri~}#Y}Y5?LXX&uD!)U>tW-SZ3+fkjkX-DZes7_Ou7KqkAVa{Wa+&(Xr)T`
zPQ@$CIzqXB@C0EJgvlbtSpWWrniaddT$@`hpDCP7zS-@tg@i!)Ts({v_xl$}b#^(%
zs;$F9v~T%=^1(M|D(6Zj+52uJ5CwIAE!(xP*mP@|lyF~M7$YemfJ&k?kf^y%YfjmA
zO@+uSeL2&&Wz@I&`Y>!&!SL%x#ds%$M>#KZp&D}~e_zUlgq+7Ig{stO?-T*7STryK
zVz5-9ti=tj4mggX=Mp@jzHrJobMTnsq>PnAh58b
zl14R%h3T0EANONW`QNWp3NbT~m5Pa?UXEX&Sc_Ovf7fzpn@`Gfq1B-=hBhxdt$eQx
z9@u7)ymEtL5JH^=>hAa`}iphSJl+H$_3hm?;k=DxH#|e^ZtG`wtIW{CBLlnwlBtsXa<#qtfU&pdNbLjc+5Ps|d(zh_ji%fsI89Cb
z+PC@9ca+1cUVd6xUe?OtrEa47dn+!`6M1$YY5km5wzO;KFEj0K)w#d*`d1Jfhkn}n
zJkJOFwrc_iPhqJaoj)taU-YaAdgu)LMHMmlJ{AeP$l3dNw}c>R+if@hn-1KIY>{n+
z(Llqa)cvhd%IvcgD%@(VRRw8a+*MPD?Popvdk!O5?fDM
zv4gd+dq6*^L=bwIoo>)%wd3jrRaG~Lr`jAbP)DG5pr*uvwV1!wn&kPXfvyIb@#9g^
z9~=V$Xq-YFJ{AxKMvN&|$x7_H5krfZn`^cwRyi=K|9Gs7gZjnI_G{pEY}WALGq&Xy
zc6$@AiykN35WONcaG_&xfHZ>sd61IWqfe{(yXCN%XKO!r(>|WR`8Sn8QTSqM3rx0X
z-Ce=RJjiv>_N%i+nsUvG1CxjhML>1Wmj8Txf3jDYSiiQmn}g&2+eAJ8mA1OnWWTzy
zoX%;`Mpngd3NdL~2z=8j^!%?r1M@+SJ$|$4=R!)c8tu&~g{hrab3A!ccw{U~xUAaP
zkaiu~vf^-NoejrID^3pwXIvewDH5CTLH>4!pYF>HdxO^_X;=jWsJ^(Pf
z^i59cLKQtrL6kBlI0l>{4vU?~Q+88Yc4PfI`74`HOULs@8`Lk!E3*Fo?#(icn~(Xz0hQQIlhdFT;y>RZ`B0fcD)g8
zrO1?4!No?LNb)S9Khgc&5oD2RSu}MxJTQg;L`C`xRe#U_Z&!I3-RN=6_QRGaR$T<0
zl>f?*NxRotR!{RVha4rmHW~p_F!hZy<H1
z(A`w>*27GInuuHO-wZ5aifBJ)iwX(}?YzZF`Li)N_wIyAC}r&93f{YmDzXQE53VPk
z@Zg{S_!HgTkhPLAZq+}ms@|pWWqxbuikF?{{SMZV=dw9P0F*#tRG4M6Aqhi~-Embx
zl#*8ifi2Cm`Y+9f=#atckGR^VYMWQ(O=Wb|DasB+Ri|{tqm&T!NPKdTBv6#tENQ(i
zf8Vne1e_*P#)pEpO>Gml?`a@CmE%BzI<-o5eBLpL5YPyO8Q4NK<8
z=pHIIa$mj&i!v-gwII%P(&CmH4Pk%K^4XPkNd6+MDm`bXA2V=oB
z5qz2(O)!^$vkZdt3M_!xpV+>JOz>p6gFv?aGpP>OphUD)%d>IBFD!Rk^S=PSRH=sYJ9Qp~K}0+CZ3chNXjAs?>1rB6
zkwPb_0SFZ6lr^!dp(Y&6asW_2;SWXDD34Q))K7wM%6^KLvsi(V1>%9EkQgeIjDT%u
ztfOm#8yO`Ctr1KS9%!{4nSTxmfAY{%uDTmjw8xhG8L;^;Quu!g@tTCO{$Ws^uc2
zOJ`z<$SJT@ktJ53d6_`|sw&4Rj9f(%Tfo#4j>1!=LVm;^SYr`{kBS5^1Sh|pLPkkp
z@z_FPn*@(RBr8ipUT=LfjfXZa~J`Fre(GF>uMx|qZ&MLAReRy9)$sF53gtS{m+x1m@8?%#z$PAZ_U~5b{`Ws
zeZ(uShM#R9{ilFrDtX_388n|32Su~K)3!gU@dj&V(8snw
z|Hu7E`sQ;vfe7=|vi`@%VOg0zHVMj2x-$p9z|HWQV!$QA2NXu=>W%$-YrP(~zaF9|
zG4_Da%kXLQ=Yc3rne$7Ytl%ec49-lz86Su^L+*1X?@I6SfgDA@iHT8ZBRw5c(REqG8&ALgC_i=+1QuNGWs?MU_9Rec
zQab-@6HLd>CnkhI`YfFREUs)DuPaGTLT6j6s!o}S4a0Jsi%YCRiVu`vOf%GCCK>Y*
zszIC_7PQ)9G*c3>V-*02%NA=Zqy+xpkpIBF?(cey|KdRSQLQIQNhHm-wzfE4Y^?DL
znvYf_w+6B1(U7I3Ib8^5D%?Af!7&upx@DE7C@WAQqXDp}U7kb%CM#9>tZwg7^?Vab
zbFzg3+47Lo#83D`B8;GPnNmQ?jCTUdFD6vBdLLhbMZ*lWLDIN~SN(os(>^YI7E&@=
z+L99W47hK=;eKw{pLH|$i;LBm@d2^$&7%IkF57y)wTzgUu@RI=Fyyo5{CA_tlSQhu
z&Y}Jr2=0`IYBRL{<{5w`#?p4WeE&Mh*o6DCPsm=j67Z~&Vm5fCn4v<QkF&PZg)l}wsW%)fU)tS3{HcbqY+c`
zQ2fqC7TrYW=a2UtCX5xi*Kl;e>L;W@9S%#G=VPa1Y-3Awpgeq89PRsugQ5dMg)qQ0
zxD=LNr^SpaB?Bvo&tZggjOdOQn@j?if^Ko`rjfd@eG5Ej-wt}ny?P%Gmo~8#{;}6g
z4F21lPM`P9IXpz*1~@S(M5RP(LFNR>noKSKzP)Oh1P55cH$6T_1t)XkqKMk|;>0PQ
z9hAA0n(Q|6Xz_5iSnsvf%>?O@-fo4!8DW#gks78)WZ!`MonAZ*R>y-(hHNGG;g#U?S~EZA6ytoV|VR
zSFkB!=`e$ayM5`gTk9|{2>5RRn@2(l-m4g2)6=U7OT_$B95E}4wFrZpWx37|Jf^wz
z-?}}jMH9nBp59Gsz2JEbYEGs?5L!x$lLt&?Xd9Ubo`nS57oRYXq=AgpbZxa
z8ic|XRt4T_U5=D>5<=pyDP*D_N2!wwrc%-JI@gH*@da22G(RE^az}iDvr7
zn5VMI%w|ifd5<3RJu_GiF$N=2Ya{N$kGON2zd^JWZo0yfI5~HdpSj&?B(O}h&DERtYjkdGN
z_i^zt3tRkz%p*NLMkBv$a;@pd)*k*x3Iw~tq-nw
z%44zbkE;2O#`<{F|2+T0L+Em6jDzcA+b5qoTUo`5qUzIWhf8Oa>*)6K-39cel3_ny
z!7?fcxTY5B#MmZ*(}oHr)hex_4T%OS{U;UVc~?yQamyje*bEcJoQS|C8pZtzg#HEu
zn4|dp6Bp`xUp52}j_IQZybk3ClVnP<5CkXE!mB2Zowafn;cqu1C2~
zUrlN%0%+O^EDZX_n4f>)s_1u-e%^k2nep(yeqai~Fqc?Se)L}3{BpOY>wCXEEQ4$q
zSWnIum;Kri#N;c@XpzK-sZ4Bc=iL8bg+>7fD^=G{*J)dF+hahtnb&HB0m#HlZ2p9AF{6hFr*ypE8tQvo
z$VZt~vmpF=e?e5_I~aC5^X9bc@cT1$*6`D;EbZ`c2vrEe%;cR3F!Cqgc_K3k=pvZ^
z1?4cEeLL1hf+c|)1d_oMkpCC)u3~G?ns|R51$5S;CbdF?9tWzFNSTKbCque=Jh^*Z
zAtl=fKAR|%T7^K!w+lCwQVWkna7A&S}-2l^D0v
zYVQrOtgEgrPY4MglzR#43q%e}jk^Qdk^D53+jmAnH2Fv4JVFD~hvSdkKUKN%<>V8=
zGH`oaGEh^gR~E!SM`uMKb{uu06egv`O_nOl$|-L>YX^C+i%Al@p^+ebTeZydiu+lJ
zX4=y4A*o7Bc@v~XD!i|c%bpC+Z?$=sT^x)$xWdVnif@4sWGWc!j4n?pt~a}nIAC1%
zbDc9NbM6F-_S&{g<}Iqp{^xw)Xy_79?AYl+4ls=EtRJkBBgk3V_^C^?ue$nG%{QFn
z8@yyEEBa0!V^sj}7m{c3P{JbdUVi^D&iFeQPjCPkT5BEco4F*Dx>^BUI6YdjOQL_b
zf%y5b_&Hi(uFj$_sX5#BWw0IGix+@AjYJwU)8R`RZ!5@XucTi{VbI=S@&-Oe$qWJJ
zX!}!WN5XM6c-c5{q*BHsX);iB+wO}L!L}UQO)k&xmY*OoMFCi{MX5rs{I`#*0E3~J
zX>7*lXUa3qdxRQcadIYc6AhCi7!bHE`ST@Tk@zOjqyH!voVyib(({dNIQ&uKq9J&Rr2jfN+og3kV4irwVS|H=NJ890MYNRA#fZu2^9Op||iE|Ryvterq(*A_;tsGx9RmAmne-%Hf}biYhGxmlIEq};uP
zy1ksLy}V3eLLoOLmz9Oh+{8l1MCX@>1rP&fu;%ZI;*uwY
z{9;lW22vNyYq{@=lIj;jCvSkc#Y}Ry?;^FiqsT6#1;eD$r>xxg-%XN`PTpIW8`!5Q
zvuysPaY%PBa<|DG_T$D9fg$Suv;b+TDN=6kj~6TdIIMS{(Q(un>%5CoWbqF@dom!1
z@!N7W%ef@Lxu;{9r|xHfznqMGZfpB>c|FG6kDaljD=eQucs3d@fQ01;Lw+
zJx#))DV5Ub8nMFvDiIiES=O3*k9L{-yUWLtgQ`-hZlomnUvW9Xjb^Qn!;nZLERh8j
zE#>qt^XeeU;<~mD{?5ZZH4{J;ey+;BeCh-_OIpMpZC>Z;v+RYg3CuqcSfL(FaRB>OCQtjVu
zQX+%eu~JQeZG)n(04=2k_kKO3n3nw1^(OyC%8$U{wkV-D4>HP7t!(JzNt|A>qq3R^
zmCt0(hG$!4PDako!jPAbDzjV3Vdw>|W$ADS^cNfWHFztl->^uUl)@z;HCG@7G|YkN
zig;Vf$N2qZhE(%Yedi--wYRE!qiE$s$aKVnDkVa7#br)KTd~^gBqZ!@6(F&de;8b_
z+1c18Z2zONB&Z->UdkD#s^tjXPK?N}7#^AQH6ZUabd7{lt_~=;pV!$eGGTg|*n^N=
zJ=4S%Klx94%hmeNx21_Rwbzr0E&eY2XX|7^Ig{0PS$OQmvVL=k&0oZGRwUQTcR%G|xUo;T<;zk%ejU!7brI87>5~;e~
zbZM%zQrIxx2%~KHXa&R!4~9zpV9qQ~q={J=Y3L|0aQcYcobkm>G?C8c=Y?KYl1j2u
zksb&F5guI)7hkm-afQlieTgU`E>b*n7}`w&K~6Leowa*{|Ej5lTP|FN7H&cN}dN0ZPuP9X2Y{2rFm
zs}f(+MU9l|+_0WRTXB6vf)V*H$4Q#I*$YX`1!FYh>T#vUz#6gM{-AdGUy6nNlpXg*
zzz(5_B;mkX1hH2VjZ)Mp^$8LMmSS*)a}0|;apWRCHVjg>FPfG~AbsR-XvS2_RFwsb
zV~%q_MhK(idn|N1w7??PCK^tg-Bfm@KWNQigJQ#h^!8f)sWe9Ja)8Dtgl`z?93gxj
zk4FgGkbu#G{{8`t&=o5!Uf{1p!#P|F7`D>+@vBcz{bkQn5VJ7}0ItC5?eX$R!=7_o
zi4@2zXPnS=Ja32+LREZPO#&an_ogY>MkQsTPG%|^Y|QHPtEIB?05kvfHb@o+#yBZ*
zPatjl{&7SBO)B(vf6px{s?cNTB}M~Xx;W3?VM
zo-4NoV%j(!t^Ufl=KMDa(sWRR(_P#pfPmAh$nGq(y?3vNQr03GQEjI;-Y;u$wl>CN
zx@a#(@Wsu--(fMl?_HsgeQ13EDf6Tk4lauB@TO8R02AW?#w8?dFnPAd+CF=mj3W3j
zJ}2NN8e1|_$xxv4I(9F~F(~drGJTc!HOsE32An5c3pvKLFOE{$h&U7`+RD(iB
zMRsTdtdIRW5J)gVB-LoJOm-VKNXYFq>Rx$)L>-?upBv9^8XKS66OT^GJ*u3)IhH{k
ztv;{>hEr#wu>@@no0(EAyjML`;15Hg?$6!TEs<}iLbsl_wh@8A=qMl>Xf^|jBoV23
z)ojbloc#qNT)5)0F_+zAvPS8LTM7jW$#g=nmgGLypuV!)+!Y%ZC<914qK&M
zMT$9jk;FE}Nt$Key5NRmOn@i@27rZ)({AH-ST(yR5q}10;50QwzCw@;v(DEJ`L}TF
ze{QHfv>S0&8(<8XaO~aG3$ge*bD$DIxO^~8Ci6%n%&qrTNOdes!3r2-frgN!fMQhe
z=H6R9SjQA2P}$JR+TMf{t-Rv&Uc;hu)m|P6VDOwMsmX@NsT6;B7-y0~u)MIbtZC(N
z+3^InG?_BYz{jba3=O*5wSRqa+q7NsNI%bBB9|q*Z5%2N-x)?m+WvYyR#c16*rb|F
zCBc|aYa5o>zioJ!3dz%a2jh9X#@_*RKqsQd8`{?SU`dN7?>{jBnoD3Bck@KK2=mKj
z-S4eSx4`hs8wzDxRcFh90J6>ZzeCllBvgj*Lx%$@5K+D>Txgp2ZIxvj$@$;qh1IH?TK%!AZ%hp==^8FWpN=!afWR1
zjj(ELr1q4WSR*T6Q&h2cNZObspkN8?K#ezh#BbXzco!20m~f(i5PJ%TnVg@*JfD70
zVfM^PDoHvw2RAf{%@Y2|29yF20
zRb&}DBL*^PWFVHpgJ13a=I_skvVsBNe6VLk%u1q~#V`_|SGsd6!gQHRGF80L?jKaw
zU$Znvg~pt@I;=h_w2QmGE=aO9hUgk(tm@xbvfcWI1D>?`%OUHgINmO1`O@Nzzqw|#HzTjqV;HP)q2veF_K
zG?wCHImzZsRww>}AY?_JD}6+qnfDFxBLlAyWCAXSUoO{6q0L8fLJ#s|tt}<9LQfwa
zn|_9BXajIP=E>6*meW~o8#l0x03+*~jRHmo-^$|T-D=vP91mzyiR%CEiqJ`wPr^j#
zvC{vYlU;d#zHIi!<>dLkqZ9KVxr$0Lk@6G_RxAB-Tq%x^inghAtbDSWLbGsFW8{U+
z`0P8s1#NkHNJY7ly)@JH=?OR(ylShE*#)1{I;*?YZ4Z#NEnNz@h6sDn*K=y{J
ze^eRlNZap!R66o(YA;LbHrqlAIHLfK7
z!hM$HEuu~AlVrH9EjX$rM^SBe#nCB{HhALULFh~vi}-R99G?Q^4$aDe&5Z&cO>8nD
zHECj@G_ApI-*^`m)P$($Eq)jXIoxtvp70gKaNf&aH*{Os6(#L@n~6Z|gIMfzv6#wZ
zOXbnN+iKZrPL3CIx04u$cEN)z@&RR={&EpvIbu_zsk7Fgy!rYvGIiKnXj3GBojrsa
z>_$qaOpF2Mkb)p3@Vud8JC8pq%Xo;J3`Bs6p#I4)TA+CVFI`oXJ~R)|aiR{^Bki}C
z*7@?gDb^4WqJ>d9ACMJucj@?eS1N=DSt-tk>l_?DJNF4(CiisDq7cAp`Ww`ll-7wz
zivpp(5Kf$SGsuVezPmg(K`hEIT<7ur?hlW(0+777kq0g~7f*Y10nKi*3aiAG30B{5?lz+n;zJE^{sOczw2}5^JhB_D*?yEh-O7E*+51JEecD>!As6O|Eee6w!EF
zEYe=7iHoSfKsx;tl{r9eIV`pj&nXC0#W$849D4Or;m$A%GEOfgoKN#}6RH#+k|;VW&^)
zjW;p$KNHEJbA57vqJz(1zkNym(#Hgb;G}d8^Mki299Rh+o{(&Yoy2BJ-`e}nesRTk
z3x8g`H&_3M3l<~x4p4`vN>DJL`8-}#zv6!NS;5BLe}i@Zuka@dZRDL}zU`%
z)1mlYWB{IXNLP@5yUjE&0qz+O9Cs!>mFq9I!m7~Gj1H9RD_OvTkI-L3y>|bQ#!-BQ
z@_7dNOjoMkqod}p=B->#+Rk|CB15ROrE+K=0=QDdQT%u3E)q46<7Q;J3a#kXCy3|+?8P+y7z3GYL5^ge%s-0<|p+osjcu$Hc
zE9W;fIH>>5rR7Vd6aiusXb|rR=N#nt>F)?bzl6Cj4{nG>&3DNnsjc*+gGk?z{!MC0
zLmL4|WFT*$8BGtznr5pJSZMX(;M6a-F9SO6!c{XD+q)%&
z8MCJd(OfuXI_RQ=gl3upYP^PF<`X^?@KSX)N=dkiv|^Da6h<6*IMlWTpBRskiegw9)DBLLH@v&`M~1ht>GE
z$ZOuPfA?>%;6aZas#h^iN<#D<0)p@`8B_GP$S3^r!><#i<0NkE^$ix-!{Kh?bNDdU
z>;3tSZNbZQjJJySuerehgQ_{or-m=5QJTJ5z37+w=G!=B^~Ne}!^
zdhF3vBh%-5)FsZCdvj2jB3ODJNwoRmVejhSWTt%9B=g*}h2o$RQ+0oo{_1u8)Hy#L
zH+=5=jAnmd>3<(eqLh7Pxemjv6n|{GGHi6eFe>8VIUe>Q4&-!ybM(8yiD1nCRCE+F
zuW@kE1H8>$F_b{tU7Vkt7Sa$eTgG()zFF-Z*3BBe|3JUX$LaIxJ;dWdg9JDa%l*{$r%PBwlna4
z{)g3wOXgnkoADJ>QZ$OAOqd4h4?QAX&gfV?KKn7cQGwdeK{~eWsMkm&oPj9bE_@ut
zu^)X4F_so45+zv`7PfU+%Cp8~*%wCgBvR;=(XdzM!DYh~RbcAn&G+-y+;Ouaa$7}h
zr~79od40aN&zCsKX!#2df$MXp`b|Mo8%gC{j9Hy+IC|{|hm2IZ-e=lkoB-q%hr~#rs(KmNY#v}FbnWL7>bmrxdw#a
zXf#!EQ;$=Yi3Nv4$P$AWlCAV}JPiYO+I%#rl1}Vsx$Ra7)n{;=z6L*8SX>dV!^V?P
z58YeT=m*X(KE%GGG1(lpHma)g^>y9S2><|3jo&pygR6IaF3DpaE~e66wA?
zyW|BwI!#j(x|m7Yk_DLvn3kS;JmL^}A8Y^D;d*k9tlQ<-`4Ts;;Jtais%mS{@1P0_
zQLGaqE1aOybUZu1LQn$n~D|`JiY#Q)pM1|k=-^0avZ#&i?h%jMiWCYU`G@-BK!U@
zHMPi1p@6o%Bgx{NDQ7adWUpAarAGryre>GlbbS5Pzlmu*>sm$5@wnt8QJ!ki5d++I
z5;*iM`?MSFr>57tNAQR{htg(cVWeZ9u?vk^Db$KC?6ZqIS<=XOn>d*bS4Ak#b_+%nR!9Yh>&6{XE5dyhA
zeJIwhrCHljb_judmw!oT9z;yl9=-ZFDb}pr7t{Gq5(2jzJi#ZDMC(?A(Esv8MjlB}
z3xcJJ;{6W0)weis?(~WIKK)dAvrgNJmN#@iZ}t`aZurLK9#3r@cpo1mgW$+@)4n=UgJ$HUl-W~BjEmU>qtu1U$3iZ5aq4r%78*GV~_Z&=93-(t&P2_{r
zu1B8w_7*CWS&IoFYNY)>C575E;lpS=j+1Wos2Kasz++wA9^uBPOob3EZzVkOf$;rne;NiTzopXD`ltNVF`3^fYnP8)1
z4w;_+Q1_==+w?vxy(tKu{Nat@qQsaBZPMm${Rp|@p@d_FRIl7}=rqC9Wvx8HM0*}c
zBwi+x%Vz;>H8#FA*xCea1wmqfa^!|NoU0&31F^OTc7Ic}?pY+tuy5z-EdL1o9dyUL
zaze=qe967Ds8`9}dQzRMGQPyW9o
zX=%S9#T1BWS)3{F|87lfxxBQdA3Sgxx7j}C)MV|-LtsYoF7yzV)>
z>OehFb5wLv8Iw(?SnZBi3*=$>Fql3-@9(#lRWzD6Gy6S=CkzeEFwJmraq*EWP`bUd
z(q!dR0rA!1Vu;rs+tslPboDsHWsZWV_g)P8x>82gmnD1roXfsw>GG%Ap5zcPI1>)$
z@8Mw?w+Swfrb~`GWps4aMBB?aHCOZiGA6d0<*XF|DY`p~C8@H6#iBhMj-?Vo
zeLdeVlAm?H5A1~S%IRYjw@KvooQ`p
zTFQ7E3n|gocrdUCO!}fEWk_o=@`X975{wr2WSpPD}v_>#4cC@Zl?ASp@
zj}$$bAVZv9oUn}2s;YA85_~VPa&UOujR~uB5xQ>6OdbQslmH@%iYU78hDd!H!jO+3
z)Xx!#fI*pTWnC3knB$Vf0jHtGsI}+ly-;DY0rzKmGt=2iPFukrHdisiw5cj2aKW{@
zZL?YYq*SOIjkRNIXrXeCOrV^OXd=SJuq}1#>aOlQ6HSXbWzOWoL#m?~jieALaaV}Y
zq8M)&gs7E8?z^~BhDW$@ub;Sck@?zyhvV$
zq9R}ieO^zv(n^)vS)G4AedO!E&VxWsv!=yn|Ak_as6aXYMcY@(XEu}qYPZ6rCTNMs
zyq&_8V(=U5xfms%wcmr>Cx?JvRI#_SGw^;&Y-w>kFIG1*Te`m0GK;xMFhZr;9kFBI
zI<5wW*!x@dr4038TbZkit?mb=!S8Okt!|on+NR|Ty;K=!Wc(_r%2iZ$g#%A?G@heV
zJmfHhMpZY8B^Wf7O3OO8rH!9;+;FA3SDt}1(34rn>unBatTI^b&_tEiD&87M6)|6A
zU96oC+@S)PZ7Il`6IA`@T4T<93e$s_eBS!Y?X2TRpC$fBpk-oFJ7K_|cgj1V&r)LQ
zY~6tOYJyqsr|ep8QyYsn6Lu*zwPuIO0cyd|{$xwJl?Er<--Z1F*8*33VShrP)z8UO
z`B+0kP%}J^#Hxw)I&I$Ka;N22W6#=9fg>9O;Q`<=>|&t`YIi#km95wg@J!*^{yZM6ubv!P;WoI|%<_d61!F|<*I(>Eq
z0<#&yY1dig=^rm?5pS(0n1-()_#X_q?N0|TI)AVYJf7zs)0BmQqshIWJJjE=gs5$w
z0Q@42=xRkpg`xN^mjV8|V>@QB4H5~gs(EZULz3aRlge{(Z-gvqZ
zxD6dWSU$0nY`Uh9afXDfuv6|Sq-SRrpPR@5oCy>MD7t-~yB))4@!E&5-TD5fouH4)
z+0m8P?wVlnMPldUCOvUALho(=^O$Td
z55ZO&eaAY(_W|uIKUpgCGbX{v$at8Nl~Rl=ZT_qc}|Y^d1#cRzX|yWd9j*)
z{qf?fMt|RHJc91XeFJCP+BfOI1fKAye}0HHe0}wB>D(~Tg@{@&5284|3uDwgHic0Y
z#$x^kZ7Wyd#tMZHe47%5$vPe!b)GieiJT2{dO-y&p(O^Vx0lMJkga$7EZ3~E`+cDV
z=GRMB%Kr)17JJH7*PSife=Okiee@E499G#nkPVsAM&9gxaVI*95V7JaoqLRNDI+^7
zF~<@sdo^I*?y|eP?TvI)Di7t7vjneHb=zI>v&r)F`K^2K7k-htxx4ut%-I5qzal%&
z&hgNt&$YHXmy_sQO{OXd(G)&g+TDL#7-&b4{2A>IX93_aWXODL1qN;Ic#_k_h05|c
zVDF^I<)0A0F3Qa;q$p4JVDyJzDS>()f5|+4Rj14I54i9rKmfVYV+oq&d-JSdznhCD
zmNhN*OrC)G={`zi@M$`*GB}4;M4t3YQ}E99--{XAR4!jLLo(!UnqTWfz<&jvU`r->
z&Q{e0m#sI&Tu%G7Ex;R@XSIa#MxTHt5U3=zfmgM_o*k*9%QkM-M3n-y+vC}^qdMD1
zGF%B{_IULyYA8d57H)+LovqX9@AZ+i)m`8H*4$=yhBccB-5zU;@t4tMNBsD4o#_2Q
zJ|0HI#KiW$-~D~|atI^`Ti?a(Y{ihWOF0=IAZ&_8WK_jc3y@R@U&FK9>dEF-S06?u
z{TaRmY_Px*1#C2-MX6+Gu()zQZLy5~K(B^O$8P((W-S;ijW~AuL4(6MhP6{1a7V;9
zSL9SkWPA+d8toob60!D5k0xb7pgiCujey+mvUTkHXnRX%(7kWtBF>khc>K1C@6tSa
zZ@ze8wmVP~`3s{o3LbZlfN0Wl6m8Ua)sRCcx?#Dmue$ndZZcpQ)Vx>gDCqPO6!Ta>
z(eyfT3cH>=dmKUhpY5>g*}+^ssA&jtRn1$^*4xloE}+utX%c&~w_MmNvB>66X&5z=
z%uoLZf%k);RaP=Gu8A%cbz>;y?+k7&e(=p?Ek~%26V>c*bW)i-3HPbWX(zHj_&%wk
zcirmM%1M1%rq!qoz*Oe5n$nfEIw9Car1fUj+_=crG+)B-IidW51r}Q^=Iih*$0|s`Tp_
OgtWK
-
-
-
-
-
-
- Salary Bank Payslip Report
-
-
- ---
-
-
-
-
-
-
-
-
-
-
- | Employee Number |
- Employee Name |
- Account # |
- Bank |
- Amount |
- Legal # |
- Basic Salary |
- Housing Allowance |
- Other Earnings |
- Deduction |
-
-
-
- |
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/templates/employee_cost_template.xml b/odex30_base/exp_payroll_custom/templates/employee_cost_template.xml
deleted file mode 100644
index e8461f6..0000000
--- a/odex30_base/exp_payroll_custom/templates/employee_cost_template.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- | Employee Cost Report - |
-
-
- | # |
- Department |
- Employee ID |
- Employee Name |
- Employee Basic Wage |
- House Allowance |
- Other Benefits |
- Employee GOSI |
- Employer GOSI |
- Daily Wage |
- Total |
- Annual Cost |
-
-
-
-
-
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
-
- hr.contract
- Employee Cost Report
- qweb-pdf
- exp_payroll_custom.employee_cost_report
- exp_payroll_custom.employee_cost_report
-
-
- hr.contract
- Employee Cost Report
- xlsx
- exp_payroll_custom.employee_cost_report_xlsx
- exp_payroll_custom.employee_cost_report_xlsx
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/templates/hr_payslip_run_template.xml b/odex30_base/exp_payroll_custom/templates/hr_payslip_run_template.xml
deleted file mode 100644
index b62f1f6..0000000
--- a/odex30_base/exp_payroll_custom/templates/hr_payslip_run_template.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
-
-
- paperformat.payslips.batches.recap.report
-
- A3
- 0
- 0
- Portrait
- 30
- 5
- 10
- 5
-
- 20
- 90
-
-
-
-
-
-
-
-
-
- |
- #
- |
-
- Employee No
- |
-
- Employee
- |
-
- Total Allowance
- |
-
- Total Deduction
- |
-
- Total Net
- |
-
-
-
-
-
-
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hr.payslip.run
- Payslips Batches Report
- qweb-pdf
- exp_payroll_custom.hr_payslip_run_report_pdf_template
- exp_payroll_custom.hr_payslip_run_report_pdf_template
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/templates/payroll_bank_text.xml b/odex30_base/exp_payroll_custom/templates/payroll_bank_text.xml
deleted file mode 100644
index bcb5fc7..0000000
--- a/odex30_base/exp_payroll_custom/templates/payroll_bank_text.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-IFH,IFILE,CSV,ABCD5953001,SASABBGSA003888815,00,,,P,1.0,
-BATHDR,ACH-CR,,,,,,Salary,,@1ST@,,00,,,,,,,,,,,,,,,00
-SECPTY,,,,,,,,,,,,,,N,N,,,,,,@SACH@,,,,,,salary of
-
-SECPTY,,,,,,,,,,,,,,N,N,,,,,,@SACH@,,,,,,salary of
-
-SECPTY,,,,,,,,,,,,,,N,N,,,,,,@SACH@,,,,,,salary of
-
-
-
diff --git a/odex30_base/exp_payroll_custom/templates/payslip_monthly_report.xml b/odex30_base/exp_payroll_custom/templates/payslip_monthly_report.xml
deleted file mode 100644
index b10a8b4..0000000
--- a/odex30_base/exp_payroll_custom/templates/payslip_monthly_report.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
- |
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
-
-
-
-
-
-
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- |
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/templates/report_payslip.xml b/odex30_base/exp_payroll_custom/templates/report_payslip.xml
deleted file mode 100644
index 00178c7..0000000
--- a/odex30_base/exp_payroll_custom/templates/report_payslip.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- |
- Total Allowances
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
- |
- Total Deductions
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
- |
- Total Loans
- |
-
-
-
-
- |
-
-
-
-
-
- |
-
-
-
- |
- NET
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/templates/report_payslip_details.xml b/odex30_base/exp_payroll_custom/templates/report_payslip_details.xml
deleted file mode 100644
index f91dedf..0000000
--- a/odex30_base/exp_payroll_custom/templates/report_payslip_details.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
- |
- NET
- |
-
-
-
-
- |
-
-
-
-
-
- | NET |
-
-
-
- |
-
-
-
- |
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/bank_pdf_report.xml b/odex30_base/exp_payroll_custom/views/bank_pdf_report.xml
deleted file mode 100644
index 38668a7..0000000
--- a/odex30_base/exp_payroll_custom/views/bank_pdf_report.xml
+++ /dev/null
@@ -1,612 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- مسير البنك للرواتب
- مسير البنك للحوافز
- مسير البنك للعمل الإضافي
- مسير البنك للتدريب
- مسير البنك لمهام العمل
-
-
- ---
-
-
-
- بنك :
-
-
-
-
-
- |
- رقم الموظف
- |
-
- إسم الموظف
- |
-
- رقم الحساب
- |
-
- البنك
- |
-
- المبلغ
- |
-
- الهوية
- |
-
- الراتب الأساسي
- |
-
- بدل السكن
- |
-
- بدلات أخرى
- |
-
- الخصم
- |
-
-
-
- |
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
- |
- Bank
- |
-
- Account Number
- |
-
- Total Salary
- |
-
- Transaction Reference
- |
-
- Employee Name
- |
-
- National ID/Iqama ID
- |
-
- Employee Address
- |
-
- Basic Salary
- |
-
- Housing Allowance
- |
-
- Other Earnings
- |
-
- Deductions
- |
-
-
-
- |
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
- |
- SN
- |
-
- هوية المستفيد/ المرجع
- |
-
- المستفيد / اسم الموظف
- |
-
- رقم الحساب
- |
-
- رمز البنك
- |
-
- إجمالي المبلغ
- |
-
- الراتب الأساسي
- |
-
- بدل السكن
- |
-
- دخل آخر
- |
-
- الخصومات
- |
-
- العنوان
- |
-
- العملة
- |
-
- الحالة
- |
-
- وصف الدفع
- |
-
- مرجع الدفع
- |
-
-
-
- |
-
-
- |
-
-
- |
-
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- مسير البنك للرواتب
- مسير البنك للحوافز
- مسير البنك للعمل الإضافي
- مسير البنك للتدريب
- مسير البنك لمهام العمل
-
-
- ---
-
-
-
- بنك :
-
-
-
-
-
- |
- رقم الموظف
- |
-
- إسم الموظف
- |
-
- رقم الحساب
- |
-
- البنك
- |
-
- المبلغ
- |
-
- الهوية
- |
-
- الراتب الأساسي
- |
-
- بدل السكن
- |
-
- بدلات أخرى
- |
-
- الخصم
- |
-
-
-
- |
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
- |
- Bank
- |
-
- Account Number
- |
-
- Total Salary
- |
-
- Transaction Reference
- |
-
- Employee Name
- |
-
- National ID/Iqama ID
- |
-
- Employee Address
- |
-
- Basic Salary
- |
-
- Housing Allowance
- |
-
- Other Earnings
- |
-
- Deductions
- |
-
-
-
- |
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
- |
- SN
- |
-
- هوية المستفيد/ المرجع
- |
-
- المستفيد / اسم الموظف
- |
-
- رقم الحساب
- |
-
- رمز البنك
- |
-
- إجمالي المبلغ
- |
-
- الراتب الأساسي
- |
-
- بدل السكن
- |
-
- دخل آخر
- |
-
- الخصومات
- |
-
- العنوان
- |
-
- العملة
- |
-
- الحالة
- |
-
- وصف الدفع
- |
-
- مرجع الدفع
- |
-
-
-
- |
-
-
- |
-
-
- |
-
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/company_custom.xml b/odex30_base/exp_payroll_custom/views/company_custom.xml
deleted file mode 100644
index 792ae79..0000000
--- a/odex30_base/exp_payroll_custom/views/company_custom.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- res.company.form.inherit
- res.company
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/contract_advantage.xml b/odex30_base/exp_payroll_custom/views/contract_advantage.xml
deleted file mode 100644
index 1488146..0000000
--- a/odex30_base/exp_payroll_custom/views/contract_advantage.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
-
- Employee Allowances and Deductions
- contract.advantage
- list,form
-
-
-
-
- Employee Allowances and Deductions
- contract.advantage
-
-
-
-
-
-
-
- Employee Allowances and Deductions
- contract.advantage
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Employee Allowances and Deductions
- contract.advantage
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/employee_promotions_view.xml b/odex30_base/exp_payroll_custom/views/employee_promotions_view.xml
deleted file mode 100644
index 401d063..0000000
--- a/odex30_base/exp_payroll_custom/views/employee_promotions_view.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
- Employee promotions
- ir.actions.act_window
- employee.promotions
- list,form
-
-
- Create Requests.
-
-
-
-
-
- employee.promotions.form
- employee.promotions
-
-
-
-
-
-
- employee.promotions.tree
- employee.promotions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Promotions Action
- employee.promotions
- list,form
- {'search_default_employee_id': active_id, 'default_employee_id':
- active_id}
- [('state','=','approved'), ('employee_id','=',active_id)]
-
-
- Click to add a Promotions...
-
-
-
-
-
- hr.employee
- hr.employee
-
- 14
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/employee_reward_view.xml b/odex30_base/exp_payroll_custom/views/employee_reward_view.xml
deleted file mode 100644
index f1dfa9a..0000000
--- a/odex30_base/exp_payroll_custom/views/employee_reward_view.xml
+++ /dev/null
@@ -1,171 +0,0 @@
-
-
-
-
- Employee Reward and Allowances
- hr.employee.reward
- list,form
-
-
-
-
- Employee Reward and Allowances
- hr.employee.reward
-
-
-
-
-
-
-
- Employee Reward and Allowances
- hr.employee.reward
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/hr_contract.xml b/odex30_base/exp_payroll_custom/views/hr_contract.xml
deleted file mode 100644
index 4995683..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_contract.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-
-
- hr.contract.salary.form.inherit
- hr.contract
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/hr_employee.xml b/odex30_base/exp_payroll_custom/views/hr_employee.xml
deleted file mode 100644
index dd2980e..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_employee.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
- inheriting hr_employee form view
-
- hr.employee.form.view
- hr.employee
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/hr_recontract.xml b/odex30_base/exp_payroll_custom/views/hr_recontract.xml
deleted file mode 100644
index 63c1a7d..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_recontract.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
- hr.re.contract.inherited.form.view
- hr.re.contract
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/hr_salary_menus.xml b/odex30_base/exp_payroll_custom/views/hr_salary_menus.xml
deleted file mode 100644
index 79c851a..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_salary_menus.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/hr_salary_rules.xml b/odex30_base/exp_payroll_custom/views/hr_salary_rules.xml
deleted file mode 100644
index 6e11786..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_salary_rules.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-
-
-
-
- hr.salary.rule.form.inherit
- hr.salary.rule
-
-
-
- 1
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hr.salary.rule.category.inherited.form
- hr.salary.rule.category
-
-
-
-
-
-
-
-
-
-
- hr.salary.rule.list
- hr.salary.rule
-
-
-
- 1
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/hr_salary_scale.xml b/odex30_base/exp_payroll_custom/views/hr_salary_scale.xml
deleted file mode 100644
index 0555d0d..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_salary_scale.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
- salary.scale.filter.view
- hr.payroll.structure
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Salary Scale
- ir.actions.act_window
- hr.payroll.structure
- list,form
- [('type','=','scale')]
- {'default_type':'scale', 'search_default_scale': 1}
-
-
-
-
-
- Salary Scale
- hr.payroll.structure
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/hr_salary_scale_level.xml b/odex30_base/exp_payroll_custom/views/hr_salary_scale_level.xml
deleted file mode 100644
index 47c3a59..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_salary_scale_level.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- Salary Scale Level
- ir.actions.act_window
- hr.payroll.structure
- list,form
- [('type','=','level')]
- {'default_type':'level', 'search_default_level': 1}
-
-
-
-
- Salary Scale Level
- hr.payroll.structure
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/hr_salary_scale_level_degree.xml b/odex30_base/exp_payroll_custom/views/hr_salary_scale_level_degree.xml
deleted file mode 100644
index 2fd6e99..0000000
--- a/odex30_base/exp_payroll_custom/views/hr_salary_scale_level_degree.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
- Salary Scale Level Degree
- ir.actions.act_window
- hr.payroll.structure
- tree,form
- [('type','=','degree')]
- {'default_type':'degree', 'search_default_degree': 1}
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/menu_security_cus.xml b/odex30_base/exp_payroll_custom/views/menu_security_cus.xml
deleted file mode 100644
index 5761274..0000000
--- a/odex30_base/exp_payroll_custom/views/menu_security_cus.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/payroll_menus.xml b/odex30_base/exp_payroll_custom/views/payroll_menus.xml
deleted file mode 100644
index e47d7b0..0000000
--- a/odex30_base/exp_payroll_custom/views/payroll_menus.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/payroll_report.xml b/odex30_base/exp_payroll_custom/views/payroll_report.xml
deleted file mode 100644
index 87d8ce8..0000000
--- a/odex30_base/exp_payroll_custom/views/payroll_report.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
- hr.payslip
- Payslip PDF Report
- qweb-pdf
- exp_payroll_custom.payslip_monthly_report
- exp_payroll_custom.payslip_monthly_report
-
-
-
- hr.payslip
- Payslip Xlsx Report
- xlsx
- exp_payroll_custom.payslip_monthly_report_xlsx
- exp_payroll_custom.payslip_monthly_report_xlsx
-
-
-
- hr.payslip
- Payslip PDF Report
- qweb-pdf
- exp_payroll_custom.payslip_monthly_report
- exp_payroll_custom.payslip_monthly_report
-
-
-
-
-
- hr.payslip
- Payslip Xlsx Report
- xlsx
- exp_payroll_custom.payslip_monthly_report_xlsx
- exp_payroll_custom.payslip_monthly_report_xlsx
-
-
-
- payroll.bank.wiz
- Payroll Bank Report
- xlsx
- exp_payroll_custom.report_payroll_bank_xlsx
- Payroll Bank Report
- False
-
-
-
- payroll.bank.wiz
- Payroll Bank Report
- qweb-pdf
- exp_payroll_custom.report_payroll_bank_pdf
- False
-
-
- payroll.bank.wiz
- Print Text
- qweb-text
- exp_payroll_custom.report_payroll_bank_pdf_docx
- report
- False
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/payslip_view.xml b/odex30_base/exp_payroll_custom/views/payslip_view.xml
deleted file mode 100644
index 582d878..0000000
--- a/odex30_base/exp_payroll_custom/views/payslip_view.xml
+++ /dev/null
@@ -1,339 +0,0 @@
-
-
-
- hr.payslip.form
- hr.payslip
-
-
-
-
-
-
-
- 0
- 0
- 0
-
-
-
- 1
-
-
-
-
-
- -
-
-
-
-
-
-
-
- 1
-
-
- 1
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hr.payslip.run.inherit.form
- hr.payslip.run
-
-
-
-
-
-
- 1
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- 1
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hr.payslip.run.tree
- hr.payslip.run
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hr.payslip.line.form.inherited
- hr.payslip.line
-
-
-
-
-
-
-
-
-
- hr.payslip.line.tree.inherited
- hr.payslip.line
-
-
-
- 1
-
-
- 0
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
-
-
-
- hr.payslip.tree
- hr.payslip
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- hr.payslip.kanban
- hr.payslip
-
-
-
- 0
- 0
- 0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
- hr.payslip.select
- hr.payslip
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/views/salary_advance.xml b/odex30_base/exp_payroll_custom/views/salary_advance.xml
deleted file mode 100644
index 9b72617..0000000
--- a/odex30_base/exp_payroll_custom/views/salary_advance.xml
+++ /dev/null
@@ -1,165 +0,0 @@
-
-
-
-
-
- salary.advance.form
- salary.advance
-
-
-
-
-
-
- salary.advance.tree
- salary.advance
-
-
-
-
-
-
-
-
-
-
-
- salary.advance.select
- salary.advance
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Salary Advance
- ir.actions.act_window
- salary.advance
-
- tree,form
-
- {'search_default_my_requests_filter':1}
- [('employee_id.user_id', '=', uid)]
-
-
- Create Requests.
-
-
-
-
-
- Salary Advance
- ir.actions.act_window
- salary.advance
-
- tree,form
-
- {'search_default_approved':1}
- [('employee_id.user_id', '=', uid)]
-
-
- Create Requests.
-
-
-
-
-
- Salary Advance
- ir.actions.act_window
- salary.advance
-
- tree,form
-
- {'search_default_submitted': 1}
-
-
-
- Create Requests.
-
-
-
-
-
- Salary Advance Request
- salary.advance.seq
- SAR
- 4
- 1
- 1
-
-
-
-
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/salary_scale_level_group.xml b/odex30_base/exp_payroll_custom/views/salary_scale_level_group.xml
deleted file mode 100644
index 1a5c16d..0000000
--- a/odex30_base/exp_payroll_custom/views/salary_scale_level_group.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- Salary Scale Group
- ir.actions.act_window
- hr.payroll.structure
- tree,form
- [('type','=','group')]
- {'default_type':'group', 'search_default_group': 1}
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/views/salary_structure.xml b/odex30_base/exp_payroll_custom/views/salary_structure.xml
deleted file mode 100644
index 2f0bf85..0000000
--- a/odex30_base/exp_payroll_custom/views/salary_structure.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/odex30_base/exp_payroll_custom/wizard/__init__.py b/odex30_base/exp_payroll_custom/wizard/__init__.py
deleted file mode 100644
index 0e51dac..0000000
--- a/odex30_base/exp_payroll_custom/wizard/__init__.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# LCT, Life Connection Technology
-# Copyright (C) 2019-2020 LCT
-#
-##############################################################################
-
-from . import payslip_monthly_report
-from . import payroll_bank_report
-from . import employee_selection_wizard
diff --git a/odex30_base/exp_payroll_custom/wizard/employee_selection_wizard.py b/odex30_base/exp_payroll_custom/wizard/employee_selection_wizard.py
deleted file mode 100644
index 2fc4fa4..0000000
--- a/odex30_base/exp_payroll_custom/wizard/employee_selection_wizard.py
+++ /dev/null
@@ -1,82 +0,0 @@
-from odoo import api, fields, models, _
-from odoo.exceptions import ValidationError
-
-
-class EmployeeSelectionWizard(models.TransientModel):
- _name = 'employee.selection.wizard'
- _description = 'Employee Selection Wizard'
-
-
- employee_ids = fields.Many2many(
- 'hr.employee',
- string='Employees',
- required=True,
- )
-
- employee_reward_id = fields.Many2one(comodel_name='hr.employee.reward',string='Employee_reward_id')
-
- @api.onchange('employee_ids')
- def _onchange_employee_ids(self):
- return {
- 'domain': {
- 'employee_ids': [
- ('id', 'not in', self.employee_ids.ids),
- ('state','=','open'),
- ('active', '=', True)
- ]
- }
- }
-
- def _get_active_employee_reward(self):
- reward_id = self.env.context.get('default_employee_reward_id')
- if not reward_id and self.env.context.get('active_model') == 'hr.employee.reward':
- reward_id = self.env.context.get('active_id')
- return reward_id
-
- def action_confirm(self):
- """
- Action to add employees to current employee reward record
- """
- self.ensure_one()
-
- # Get the current reward record or create a new one
- reward = self.env['hr.employee.reward'].browse(self._get_active_employee_reward())
-
- if not reward.exists():
- # Get values from context
- reward_vals = self.env.context.get('default_reward_vals', {})
- reward = self.env['hr.employee.reward'].create(reward_vals)
-
- print('percentage >>>>>>', self.env.context.get('default_reward_vals', {}))
-
- # Prepare values for reward lines
- vals_list = [
- {
- 'employee_id': employee.id,
- 'employee_reward_id': reward.id,
- }
- for employee in self.employee_ids
- ]
- existing_employees = reward.line_ids_reward.mapped('employee_id').ids
- duplicate_employees = set(self.employee_ids.ids) & set(existing_employees)
-
- if duplicate_employees:
- duplicate_names = self.env['hr.employee'].browse(list(duplicate_employees)).mapped('name')
- raise ValidationError(_(
- "The following employees are already in reward lines: %s" % ', '.join(duplicate_names)
- ))
-
- # Create all records in a single operation
- reward.write({
- 'line_ids_reward': [(0, 0, vals) for vals in vals_list]
- })
- for line in reward.line_ids_reward:
- fields = ['percentage', 'account_id', 'journal_id']
- default_values = line.sudo().default_get(fields)
-
- # Apply the default values to the line
- line.write(default_values)
- line.sudo().get_percentage_appraisal()
- line.sudo()._compute_calculate_amount()
-
- return {'type': 'ir.actions.act_window_close'}
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/wizard/employee_selection_wizard.xml b/odex30_base/exp_payroll_custom/wizard/employee_selection_wizard.xml
deleted file mode 100644
index 8306f06..0000000
--- a/odex30_base/exp_payroll_custom/wizard/employee_selection_wizard.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
- employee.selection.wizard.form
- employee.selection.wizard
-
-
-
-
-
-
-
- Select Employees
- ir.actions.act_window
- employee.selection.wizard
- form
- new
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/wizard/payroll_bank_report.py b/odex30_base/exp_payroll_custom/wizard/payroll_bank_report.py
deleted file mode 100644
index 6e12d01..0000000
--- a/odex30_base/exp_payroll_custom/wizard/payroll_bank_report.py
+++ /dev/null
@@ -1,195 +0,0 @@
-# -*- coding:utf-8 -*-
-
-from datetime import date, datetime
-from dateutil.relativedelta import relativedelta
-from odoo import models, fields, api, _
-from zoneinfo import ZoneInfo
-import datetime
-import random
-
-class BankPayslipReport(models.TransientModel):
- _name = 'payroll.bank.wiz'
- _description = "Bank Payslips Report"
-
- date_from = fields.Date(string='Date From',required=True,
- default=lambda self: date(date.today().year, date.today().month, 1))
- date_to = fields.Date(string='Date To', required=True,
- default=lambda self: date(date.today().year, date.today().month, 1)+relativedelta(months=1,days=-1))
- pay_date = fields.Date(
- string='Pay Date',
- required=False)
- salary_type= fields.Char(
- string='',
- required=False)
-
- bank_ids = fields.Many2many('res.bank', string='Banks',required=True)
- salary_ids = fields.Many2many('hr.payroll.structure', 'hrpayroll_rel', 'salary_id', 'colum2_id',string='Salary Structures')
- level_ids = fields.Many2many('hr.payroll.structure','hrpayroll_rel_str', 'col1', 'col2', string='Salary Levels')
- group_ids = fields.Many2many('hr.payroll.structure','hrpayroll_rel3', 'col11', 'colid2', string='Salary Degrees')
- degree_ids = fields.Many2many('hr.payroll.structure','hrpayroll_rel4', 'colid1', 'col22' ,string='Salary Basice')
- company_id = fields.Many2one('res.company', string="Company", default=lambda self:self.env.company.id)
- employee_ids = fields.Many2many('hr.employee', string='Employees')
- no_details = fields.Boolean('No Details' ,default=False)
- report_type = fields.Selection(
- [('salary', 'Salary'),
- ('overtime', 'Overtime'),
- ('mission', 'Mission'),
- ('training', 'Training'),
- ('allowance', 'Allowance'),
- ],default='salary', string='Report Type')
- entry_type = fields.Selection(
- [('all', 'ALL'),
- ('posted', 'Post'),
- ('unposted', 'Un Post'),
- ], default='all', string='Entry Type')
- bank_type = fields.Selection(
- [('rajhi', 'Al-Rajhi Bank'),
- ('alahli', 'Al-Ahli Bank'),
- ('riyadh', 'Al-Riyadh Bank'),
- ], default='rajhi', string='Select Bank')
-
- @api.onchange('date_from')
- def onchange_date_from(self):
- if self.date_from :
- self.date_to = fields.Date.from_string(self.date_from)+relativedelta(months=+1, day=1, days=-1)
-
-
-
- def print_pdf_report(self):
- self.ensure_one()
- [data] = self.read()
- date_from = self.date_from
- date_to = self.date_to
- employees = self.env['hr.employee'].search([('id', 'in', self.employee_ids.ids)])
- banks = self.env['res.bank'].search([('id', 'in', self.bank_ids.ids)])
- salary = self.env['hr.payroll.structure'].search([('id', 'in', self.salary_ids.ids)])
- no_details =self.no_details
- report_type = self.report_type
- entry_type = self.entry_type
- bank_type = self.bank_type
- company_id = self.env['res.company'].search([('id', '=', self.company_id.id)])
-
-
-
-
-
- datas = {
- 'employees': employees.ids,
- 'banks': banks.ids,
- 'salary': salary.ids,
- 'form': data,
- 'date_from': date_from,
- 'date_to': date_to,
- 'no_details': no_details,
- 'report_type': report_type,
- 'entry_type': entry_type,
- 'bank_type': bank_type,
- 'company_id': company_id,
- }
-
- return self.env.ref('exp_payroll_custom.bank_payslip_report').report_action(self, data=datas)
-
-
-
- def print_report(self):
- [data] = self.read()
- date_from = self.date_from
- date_to = self.date_to
- no_details=self.no_details
- report_type=self.report_type
- entry_type=self.entry_type
- bank_type=self.bank_type
- employees = self.env['hr.employee'].search([('id', 'in', self.employee_ids.ids)])
- banks = self.env['res.bank'].search([('id', 'in', self.bank_ids.ids)])
- salary = self.env['hr.payroll.structure'].search([('id', 'in', self.salary_ids.ids)])
- company_id = self.env['res.company'].search([('id', '=', self.company_id.id)])
-
-
- datas = {
- 'employees': employees.ids,
- 'banks': banks.ids,
- 'salary': salary.ids,
- 'form': data,
- 'date_from': date_from,
- 'date_to': date_to,
- 'no_details': no_details,
- 'report_type': report_type,
- 'entry_type': entry_type,
- 'bank_type': bank_type,
- 'company_id': company_id.id,
- }
-
- return self.env.ref('exp_payroll_custom.report_payroll_bank_xlsx').report_action(self,data=datas)
-
- def print_report_text(self):
- self.ensure_one()
- [data] = self.read()
- date_from = self.date_from.strftime("%B")
- date_from = self.date_from
- date_to = self.date_to
- pay_slip = self.date_from.strftime("%B %Y")
- employees = self.env['hr.employee'].search([('id', 'in', self.employee_ids.ids)])
- banks = self.env['res.bank'].search([('id', 'in', self.bank_ids.ids)])
- salary = self.env['hr.payroll.structure'].search([('id', 'in', self.salary_ids.ids)])
- no_details = self.no_details
- report_type = self.report_type
- entry_type = self.entry_type
- bank_type = self.bank_type
- company_id = self.env['res.company'].search([('id', '=', self.company_id.id)])
- company_hr_no = self.env['res.company'].search([('id', '=', self.company_id.id)]).company_hr_no
- phone = self.env['res.company'].search([('id', '=', self.company_id.id)]).phone
- company_pay_no = self.env['res.company'].search([('id', '=', self.company_id.id)]).company_pay_no
- company_registry = self.env['res.company'].search([('id', '=', self.company_id.id)]).company_registry
- datestamp = datetime.datetime.now().strftime("%Y/%m/%d")
- timestamp = datetime.datetime.now().strftime("%H:%M:%S")
- currency = self.env['res.company'].search([('id', '=', self.company_id.id)]).currency_id.name
- if self.pay_date:
- pay_date = self.pay_date
- else:
- pay_date = self.date_to
- if report_type == 'salary':
- self.salary_type = 'S'
- elif report_type=='overtime':
- self.salary_type = 'O'
- else:
- self.salary_type='B'
- salary_type = self.salary_type
- ## Ranom vlaues in report
- length_of_string = 5
- length_of_string2 = 4
- sample = "ABCDEFGHIJKLMNOPQURSTYWXZ0123456789"
- generated_string1 = ''.join(random.choice(sample) for _ in range(length_of_string))
- generated_string2 = ''.join(random.choice(sample) for _ in range(length_of_string2))
- random_char = str(generated_string1)
- random_char2 = str(generated_string2)
-
- datas = {
- 'employees': employees.ids,
- 'banks': banks.ids,
- 'salary': salary.ids,
- 'form': data,
- 'date_from':date_from,
- 'date_to': date_to,
- 'no_details': no_details,
- 'report_type': report_type,
- 'entry_type': entry_type,
- 'bank_type': bank_type,
- 'company_id': company_id.english_name,
- 'timestamp': timestamp,
- 'datestamp': datestamp,
- 'currency': currency,
- 'pay_date': pay_date,
- 'salary_type': salary_type,
- 'company_hr_no': company_hr_no,
- 'phone': phone,
- 'company_pay_no': company_pay_no,
- 'company_registry': company_registry,
- 'pay_slip': pay_slip,
- 'random_char': random_char,
- 'random_char2': random_char2,
-
- }
- return self.env.ref('exp_payroll_custom.payroll_bank_wiz_report_docx').report_action(self, data=datas)
-
-
-
diff --git a/odex30_base/exp_payroll_custom/wizard/payroll_bank_report_view.xml b/odex30_base/exp_payroll_custom/wizard/payroll_bank_report_view.xml
deleted file mode 100644
index b7e1e1c..0000000
--- a/odex30_base/exp_payroll_custom/wizard/payroll_bank_report_view.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
-
-
-
- payroll.bank.wiz.form
- payroll.bank.wiz
-
-
-
-
-
-
-
- Bank Payslip Report
- ir.actions.act_window
- payroll.bank.wiz
- form
-
- new
-
-
-
-
-
-
\ No newline at end of file
diff --git a/odex30_base/exp_payroll_custom/wizard/payslip_monthly_report.py b/odex30_base/exp_payroll_custom/wizard/payslip_monthly_report.py
deleted file mode 100644
index 447d5db..0000000
--- a/odex30_base/exp_payroll_custom/wizard/payslip_monthly_report.py
+++ /dev/null
@@ -1,118 +0,0 @@
-## -*- coding: utf-8 -*-
-##############################################################################
-#
-# LCT, Life Connection Technology
-# Copyright (C) 2019-2020 LCT
-#
-##############################################################################
-from datetime import date
-
-from dateutil.relativedelta import relativedelta
-
-from odoo import models, fields, api, _
-from odoo.exceptions import ValidationError, UserError
-
-
-class PayslipMonthlyReport(models.TransientModel):
- _name = 'payslip.monthly.report'
- _description = "Payslips Monthly Report"
-
- date_from = fields.Date(string='Date From', required=True,
- default=lambda self: date(date.today().year, date.today().month, 1))
- date_to = fields.Date(string='Date To', required=True,
- default=lambda self: date(date.today().year, date.today().month, 1) + relativedelta(months=1,
- days=-1))
- detailed = fields.Boolean('Detail By Employees', default=False)
- listed = fields.Boolean('List By Rules', default=False)
- salary_ids = fields.Many2many('hr.payroll.structure', 'wiz_sal_rel', 'w_id', 'sal_id', string='Salary Structures')
- level_ids = fields.Many2many('hr.payroll.structure', 'wiz_lvl_rel', 'w_id', 'lvl_id', string='Salary Levels')
- group_ids = fields.Many2many('hr.payroll.structure', 'wiz_grp_rel', 'w_id', 'grp_id', string='Salary Groups')
- degree_ids = fields.Many2many('hr.payroll.structure', 'wiz_dgr_rel', 'w_id', 'dgr_id', string='Salary Degrees')
- rule_ids = fields.Many2many('hr.salary.rule', string='Rules')
- allow = fields.Boolean('Allowances')
- deduct = fields.Boolean('Deductions')
- employee_ids = fields.Many2many('hr.employee', string='Employees')
- no_rule = fields.Boolean('No Rules', default=False)
-
- @api.onchange('date_from')
- def onchange_date_from(self):
- if self.date_from:
- self.date_to = fields.Date.from_string(self.date_from) + relativedelta(months=+1, day=1, days=-1)
-
- @api.onchange('allow', 'deduct')
- def get_rule(self):
- domain = (self.allow and self.deduct) and [('category_id.rule_type', 'in', ('allowance', 'deduction')), ] or \
- self.allow and [('category_id.rule_type', '=', 'allowance'), ] or \
- self.deduct and [('category_id.rule_type', '=', 'deduction'), ] or []
- domain += [('appears_on_payslip', '=', True), ('active', '=', True)]
- return {'domain': {'rule_ids': [('id', 'in', self.env['hr.salary.rule'].search(domain).ids)]}}
-
- def get_payslip_line(self):
- domain = [('slip_id.date_from', '>=', self.date_from), ('slip_id.date_to', '<=', self.date_to),
- ('slip_id.state', '!=', 'cancel'), ('appears_on_payslip', '=', True), ]
- if self.rule_ids:
- domain += [('salary_rule_id', 'in', self.rule_ids.ids)]
- if self.allow and self.deduct:
- domain += [('category_id.rule_type', 'in', ('allowance', 'deduction'))]
- elif self.deduct:
- domain += [('salary_rule_id.category_id.rule_type', '=', 'deduction')]
- elif self.allow:
- domain += [('salary_rule_id.category_id.rule_type', '=', 'allowance')]
- if self.employee_ids:
- domain += [('employee_id', 'in', self.employee_ids.ids)]
- if self.salary_ids:
- domain += [('slip_id.struct_id', 'in', self.salary_ids.ids)]
- if self.level_ids:
- domain += [('slip_id.level_id', 'in', self.level_ids.ids)]
- if self.group_ids:
- domain += [('slip_id.group_id', 'in', self.group_ids.ids)]
- if self.degree_ids:
- domain += [('slip_id.degree_id', 'in', self.degree_ids.ids)]
- return self.env['hr.payslip.line'].search(domain)
-
- def check_data(self):
- landscape = False
- if self.date_from > self.date_to:
- raise UserError(_('Date From must be less than or equal Date To'))
- payslip_lines = self.get_payslip_line()
- if not payslip_lines:
- raise ValidationError(_('Sorry No Data To Be Printed'))
- rule_ids = self.no_rule and [0, ] or self.rule_ids and self.rule_ids.ids or \
- self.env['hr.salary.rule'].search([('appears_on_payslip', '=', True), ('active', '=', True)]).ids
- rule_ids = list(set(rule_ids) and set([r.id for r in payslip_lines.mapped('salary_rule_id')]))
- datas = {
- 'ids': rule_ids,
- 'model': 'hr.salary.rule',
- 'payslip_line_ids': [pl.id for pl in payslip_lines],
- 'form': (self.read()[0]),
- 'rule_ids': rule_ids,
- }
- ctx = self.env.context.copy()
- ctx.update({'active_model': 'hr.salary.rule', 'active_ids': rule_ids, })
- if self.detailed and self.listed:
- delist = 'tt'
- emp_ids = self.employee_ids and self.employee_ids.ids or \
- list(set(r['employee_id'][0] for r in self.env['hr.payslip'].search_read([
- ('date_from', '>=', self.date_from), ('date_to', '<=', self.date_to),
- ('state', '!=', 'cancel')], ['employee_id', ])))
- emp_ids = list(set(emp_ids) and set([emp.id for emp in payslip_lines.mapped('employee_id')]))
- datas['ids'] = emp_ids
- datas['model'] = 'hr.employee'
- ctx.update({'active_model': 'hr.employee', 'active_ids': emp_ids, })
- landscape = True
- elif self.detailed and not self.listed:
- delist = 'tf'
- else:
- delist = 'ff'
- datas['delist'] = delist
- return datas, ctx, landscape
-
- def print_report(self):
- datas, ctx, lndkp = self.check_data()
- return self.env.ref('exp_payroll_custom.act_payslip_monthly_report').with_context(
- ctx, landscape=lndkp).report_action(self, data=datas)
-
- def print_report_xlsx(self):
- datas, ctx, lndkp = self.check_data()
- return self.env.ref('exp_payroll_custom.payslip_monthly_report_xlsx').with_context(
- ctx).report_action(self, data=datas)
diff --git a/odex30_base/exp_payroll_custom/wizard/payslip_monthly_report_view.xml b/odex30_base/exp_payroll_custom/wizard/payslip_monthly_report_view.xml
deleted file mode 100644
index 841302c..0000000
--- a/odex30_base/exp_payroll_custom/wizard/payslip_monthly_report_view.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-
-
-
- payslip.monthly.report.form
- payslip.monthly.report
-
-
-
-
-
-
- Payslips Report
- ir.actions.act_window
- payslip.monthly.report
- form
- new
-
-
-
-
-
-
-
-
\ No newline at end of file
|