From 68f1be6a98387da54f81f1e35d6c02e739f6a0c0 Mon Sep 17 00:00:00 2001 From: FDonati Date: Fri, 3 Apr 2020 08:33:21 +0200 Subject: [PATCH] fixed version naming and refreshed documentation --- docs/_build/doctrees/authors.doctree | Bin 3474 -> 3493 bytes docs/_build/doctrees/contributing.doctree | Bin 19399 -> 19447 bytes docs/_build/doctrees/environment.pickle | Bin 132325 -> 129141 bytes docs/_build/doctrees/history.doctree | Bin 2852 -> 2871 bytes docs/_build/doctrees/index.doctree | Bin 4335 -> 4412 bytes docs/_build/doctrees/installation.doctree | Bin 7114 -> 7181 bytes docs/_build/doctrees/modules.doctree | Bin 2541 -> 2560 bytes docs/_build/doctrees/pycirk.doctree | Bin 253690 -> 257035 bytes docs/_build/doctrees/readme.doctree | Bin 36330 -> 37531 bytes docs/_build/doctrees/usage.doctree | Bin 2558 -> 2577 bytes docs/_build/html/.buildinfo | 2 +- docs/_build/html/_modules/index.html | 15 +- .../pycirk/fundamental_operations.html | 45 +- docs/_build/html/_modules/pycirk/labels.html | 64 +- .../html/_modules/pycirk/make_scenarios.html | 157 +- .../_modules/pycirk/make_secondary_flows.html | 28 +- .../html/_modules/pycirk/organize_io.html | 42 +- .../html/_modules/pycirk/positions.html | 29 +- docs/_build/html/_modules/pycirk/pycirk.html | 15 +- .../html/_modules/pycirk/pycirk_settings.html | 47 +- docs/_build/html/_modules/pycirk/results.html | 90 +- .../html/_modules/pycirk/save_utils.html | 15 +- .../pycirk/transformation_methods.html | 44 +- docs/_build/html/_sources/pycirk.rst.txt | 78 +- docs/_build/html/_static/ajax-loader.gif | Bin 673 -> 0 bytes docs/_build/html/_static/basic.css | 92 +- docs/_build/html/_static/comment-bright.png | Bin 756 -> 0 bytes docs/_build/html/_static/comment-close.png | Bin 829 -> 0 bytes docs/_build/html/_static/comment.png | Bin 641 -> 0 bytes docs/_build/html/_static/doctools.js | 7 +- .../html/_static/documentation_options.js | 290 +--- docs/_build/html/_static/down-pressed.png | Bin 222 -> 0 bytes docs/_build/html/_static/down.png | Bin 202 -> 0 bytes .../{jquery-3.2.1.js => jquery-3.4.1.js} | 1339 +++++++++++------ docs/_build/html/_static/jquery.js | 6 +- docs/_build/html/_static/language_data.js | 297 ++++ docs/_build/html/_static/searchtools.js | 54 +- docs/_build/html/_static/up-pressed.png | Bin 214 -> 0 bytes docs/_build/html/_static/up.png | Bin 203 -> 0 bytes docs/_build/html/_static/websupport.js | 808 ---------- docs/_build/html/authors.html | 17 +- docs/_build/html/contributing.html | 55 +- docs/_build/html/genindex.html | 23 +- docs/_build/html/history.html | 17 +- docs/_build/html/index.html | 21 +- docs/_build/html/installation.html | 15 +- docs/_build/html/modules.html | 15 +- docs/_build/html/objects.inv | Bin 1135 -> 1127 bytes docs/_build/html/py-modindex.html | 15 +- docs/_build/html/pycirk.html | 532 ++++--- docs/_build/html/readme.html | 199 +-- docs/_build/html/search.html | 17 +- docs/_build/html/searchindex.js | 2 +- docs/_build/html/usage.html | 15 +- docs/pycirk.rst | 78 +- pycirk/__init__.py | 2 +- setup.cfg | 2 +- 57 files changed, 2034 insertions(+), 2555 deletions(-) delete mode 100644 docs/_build/html/_static/ajax-loader.gif delete mode 100644 docs/_build/html/_static/comment-bright.png delete mode 100644 docs/_build/html/_static/comment-close.png delete mode 100644 docs/_build/html/_static/comment.png delete mode 100644 docs/_build/html/_static/down-pressed.png delete mode 100644 docs/_build/html/_static/down.png rename docs/_build/html/_static/{jquery-3.2.1.js => jquery-3.4.1.js} (89%) create mode 100644 docs/_build/html/_static/language_data.js delete mode 100644 docs/_build/html/_static/up-pressed.png delete mode 100644 docs/_build/html/_static/up.png delete mode 100644 docs/_build/html/_static/websupport.js diff --git a/docs/_build/doctrees/authors.doctree b/docs/_build/doctrees/authors.doctree index dec391ea84d6b009115ccc9f10343e4501556478..d73ed4efb4611cda61edf3ba596b60867997a750 100644 GIT binary patch delta 79 zcmbOvy;Pc|fo1BfjVyA^tYH~a86lG&u*ht7X4YZW_0iAB&rQ`&D@x2u&ewOzPcF?( e%_}L^H;nhmPfpAM(g7JR@i}0&#pX^nPIdtJ*BP+@ delta 60 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 literal 132325 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 HJH`D6CO22w diff --git a/docs/_build/doctrees/modules.doctree b/docs/_build/doctrees/modules.doctree index f8b1a225944afa30471d97aef975e26a8d0c79ae..2b10164f4cb53d90b310d20ad7f498679e11891f 100644 GIT binary patch delta 64 zcmaDW+#tfzz%upgMivc5T_637{M=Oiw4%hk%>U@4mIVI+fq| z`7?CYt9R}_=iGDe|J-x$J@?Kzubp+wtYh$htrLc7#qnmj(&($!hTO(fYXLqOb*s&( z*G#Q^(bOGNJ*|cH!r?}3yk2ytTF1Z}#ZtL4RClXWw@#IgY0YoA#b&uymG774mgbe_ z-#XO;KhABIn-y34sdd8GWU*X7=!_ML2MZ(a6ut>B&e`iuV3mR2@0nsuK%pnK=8YAg z+U8VgNoiJTc59wsYG-RsrCfEVc8(7gTDd~ASuYQcH$fO=es+1N0gSfh7b}HE10KTX zxz)lb|FmFed`x{A1fJ^dFupV1n%^vp;7?Pf6H58gBCN5rtabhBQf<^-JzOtTi?!8T zgsvK^*A8s26$=&kdqZi1-NC3I@Nfjbh8Fn?Bgu%ES-spC@lx+OJ{>}&w+pE!oTz3--RGq zX(f~BV*YyRBH&`KPSDCVRILRf_dV4LTd34Sh51G5(PTQ2E2FPiDLY&?63z09l5iW; za&0;Zw`dYB7$0mcZj6=6)rr2s(2y|px#jARJE55;x7<+OwdRBQ)yvFwdcgk5)e*4n z*2$VkJzS=hQ>_#Er&a35snWci&8Y&mz>Oe|;ICC^$EJj7fj0ZbCi~ICfWhjBQyX^l ziqE`$*7%?+1?#bK*Afk|3JO~#n#PswZ)u%^Zc~0U0F6hP!TEx_;qmGa^s;KRP`PEG zHs;m~IG8kirg2{IZOhBjT3Sg<&zG9%Z0a`6rj~$&`>C&{v7Az|bwRX1%8Jf2tw>Xs zrU0K|2_{=Fod(0QR~Tk%_P24M1M`Dnej$wDg^_w;tfY0i){4z_x6pKloLbe{4}W&n z4mspir2Bp_QFPloTw?6bB6-Mxkkt#$1d zm*WcblYVD2!kW{pInZ^6YxPlQ&%V7*p*rMj+qKte0!%gVspwSre6Uaf?1CYJR61?t zDZM`kjK3?D-b?QU8<}mD_mVwD7#I4T9pIo;0O&^?a3G4~l|tQdi?wQPbkZ5CRmw#e zmYs6d*}8Sxu1zFcCR!!Ohk&6Eq?co^RgNpJDvUQvwR-PK;Li8{j8{hp}L+?l#=|A(y#tKZH`A z@m7Qu8XRrTINq>#<1IG9tbRwgxF3BLlAIp$V}VDuZ9 zfGJAwg=1Rt%2hTEQhFA&r?wW{%%@7XPMK_<2TbU$KRSD@;}4bH!$lZuS3z+HrwYEw zgSUcl?wxI+)n9GR2R@sVV`#lp;uOp!-Ql6yXrWx4YRzsmho)MK;E6jih68wW>OS^D zvrr##n^Ua|2DtM>lcv=n?nP@Zlu;g9dtf5p;fAG5gm)`|zNS7+r|Dyl<|-_`x&Tw&ey5*R(Er@ppa+xn=d%9Q zQ#!RZU;M7jLOm+wy#pvdoA+|jy|dtf^g|ZgO2vRcrQ8HJzM|P^YaXweIyQYZt+8xr zpPtqnX78sqNNP|RcRpJCU{dfM{gV-D5DjP;$EQ;5%p%EQAhhKR6e<@h?IE;wF8 zjob|rH#pn&ZgO@M>IdDX(ev`4${V{=asFW_{X`!-4l|w5h!JDq&is zWl5r1IDP9*cgWvQvbxagl>^d;^Sk73bZ;aCY0ev#Yr4|1gHtP%9w!VSC;AC`&^p27 zP$12Z%>AskCh8{Vg}3|8|QTFt!e3`iG`&JDZ;yoI@tkHO1+7t-s4hhcu> zH!K7OLQ4qtHo&U}L_ZB5OrygXFjvz(kdU4Cz8c3h_Z_`$_#PlV_Z+oW@H>y*d*My# zKZ|?3M#NMJ;(ilqSBrbtk{Px!4HKClOF5+>P5)1>RIYiJ!Tn40RTtx3Bz?b(Y z{Lf4AKiELtz4)J#kO}1xcJF}2pbMKeiC5SQ?+LH)82sq-3R@G`x>cMSu;8TT3z9#V zYrx`~be-z%7=(qL;d*UU_*nFw+sMHRpHpsL*l014g@|O za1-kgMx%+x?bFS`lXt!`DGPF7_bx--2fpC+B~a=vtd)uN+)s5 zk2yiymxNFuEK1PoM9xR}yx;D)+TcVj(|VmjXj_>ybkwXzeWbiLBI`7>b$G6=DRP7LO0e3=)$_3=#GP;1=wP0T0 zJCRS}1wIQt3olR^LC_1-LWXNqD5R)|LJF|0U?R84+2|Z_E`oXcp&lGmdL~x#Q3YlQ z87O6c@ctSZ&3k_(`Hh?IpoAERx&bM8AnJpHII2%!d+q}V4C=D!Mhouxw#~HWQP`SA zBIiRulLxowar}YcBn~9(nfEo|q&2@<X|~ytB*dU z1eVhx<<+rB35D```mC#cNcr!H&6dV=zWn3;ND_7}QVLaiC1922js~cqQoL%^uP``- zqu_r7WmJzPjR_R|eZtoT3MvJAzXQsSq2TGWgHlAI;HegZu0g@8!%^_0IKJ&DsM;Zb zf=@uZC=}%1+DE~)$frQTr?BODEJPVWBnqChxlq9^Ca{YXLjADL)?k~`V1)udHgN}_ z7z+}-sZj13U<#0D3;tpJBt^OJGuvfz@lAp_s?TUBXOle~<-D&zMJ$lweHA|uxOrcP zZ{7e@?R^72*$|Dh*bbsS4ML&WF>Ot%*%BcQKF*U=lHxvWc;RHXMeA=wb$9* z>+G;jwPHfOKI^u+ag6IU_WLdIAVZ(Qg8qYhwN{}ac+lf)e-^7u0V+j zviZ06A^TUzr-1A#d=`+c%)kQK5vLqzo@Xm6+#I73@Z>q+2q<79^L%c5cI-|`MU(DlMP`#zIdnHPCIM6Z(zF!8aJ6+Mq`!$;0q*S*UsXE0*zT5UjdY7 zLi}5ONJud-DeF*j2Dd_r|g{?^F z`ig}>ABB$SQrPZr==z5^zU|PZ+93d4Z-EjObn$QPL)X6}p8~qx4xa^dDI<0Q;ff z#aV0zy!vF4=uu0DXV#ZH^V)DDGv&|rSRL3Mu2^f1u!q)|i zDaCqMqK-QSW4Bt^iiEKP7J?%NVEh2W6BC5acuSGLQ$?}S%3^rVZb38*p@luj>4%H8WU2}$&LX9TE(c}vil3|wiWe_{6H$clDw)gY$>n>7Ezd9g1O`#da{Pe{jZTYlBDOYz=vigR!%G zo+@Zm?iCN4v0=Gl#s(jyv9cN4HHj^i25JFkS4+aKow1QVO*~tq>B}-}3;YaYfbq=K z-%X%~sE$fn6Y#b#;p+n4l#;!@sP9g}Tf@RuB)pAT2#y%M`Dbs??x7pup9zqOBVE#yaOh{U%^EefgaKg0xo#?C}z3YXjAV#Wh@1WsmI z5Qz!cPJSdGyeZe?_Koxzl#V-EZm`{sa%2Ay%?;WVPy!UpgzoawDE0Kbu@mmCO zR43Qa*w$8A(fDtm>QFT1EVhHj8zyFIMmcfx%_xE8I4C~Z2gMUTH(4X5v!E<7nVj&U z?^hFBCgF%c-+z>ZT|1c+8Z^OIY|S+0k>1O+MNz+h@)QUf)%8d(0$;zE@O6Q&N{!yX zphi1|uYa_#6^XCEw-6jLeDzNsC&JRvpz2Tn<1DrVU>hd}wr!fs4r1$4?fz$#g#+1Jx^xLpupI|x zr}@E*sdmx|XmdrG9Mr@&X|!xwd2?cmr2$+3+kQ#dItn!E12^8=4RCACl0yJ|GL=*X zS)+O-sYYO%m+*CgZAz0~8I{^8Y`fRORwTCFV<9+V*mjD|?!)ozt~lQ9_@>$-fN#%& z5*5DjZ|&pTJCIK?ecTJ51->amh{U%GZQ;=g2#?|s?rqL0XVXfElTMZi+!DVp?ce(d zG6h+?ByUNlW_yr=BijcAaa14DkjVl` ztlf94T(Mk>A{k!hljG0O`Uzx29Dt0713UI?PLWOS(!^-1mG8q_N*hVpZ=%lIEwyvZ zY__MAGP~TbgsD-*;d_V0pk2c3azB?;t+#cddtm69!Gn=yZjtdj2Ych0?9B}Fk6l2+ zOk7tcToaJ5wB*ggGCBoROQCT8P!S1KCtC=P7*K_ob7-VBr zzh#6f%09OmnG`tn6WLodI|$;`H0CP48fw?)RYqdNmNi##hU{~@EDez^``q=G5)4B$ z($5-WvT+7V1yqy701Rf1xkeeO!2;@Ri0fq3@0XCV_R`&{=AXzb)WHgOCPv-Q`5 z@Sboho`D}>wyozTZe7Q2l5h@}n;G6#Spv$kP(8S;{F_RuTN~hK2PE` zlJICzsV{)Ag?XpG00Msq%h0p7_yP#;0eSr%jgAYX9uYuzFyZSWfS|PLy&DzVDZlJ9 z7Pcb&vQJtFbg>oQ%|J3ZeP5wAT0ox(^~^pI$G_b(Q|%G(%w7&9D$k66%jlVT4Dne~ zxW|!C;hen+K8qlNGKQdYrX__FL4mq^+jzO|;%#lt=y;`BhFd$}NN0|+!b$5+{Jz4w zUm#O3&62#u%{&C&d9OqY9z^(wAdc!s==O*Na5g<8pRJpzadHc7K?H^i%LI$A#GVGDi{AiOgkDfrSf0pzi9PExi~a*?tTkF*MV+C4!XT@{M$iSwMPJSPlFN_ z=<;vvgKh))6rh`j&jNInF+_rHg3NNFA0>EG0qwoWNZxyiZ6o`Dn`Xzv!pQGHbd zTAS?Qy~rOHH-YvYP<1d`FMyV_*cQ-kNwo$&jX(>|)6ojFz&eg?Q9yfM2+(d(Tb^&T zqHGjgd^E8Q)5t8s)E}0FU5~Otx8~$hA=+)0S*HJ2m~QHi@pkAdr7+9|He~ zdJ0{e`M+O&M+jocPk!oE?@M1GsfM4pyR_6YB!90SKC_$SpSt@opB z92}1q#8JIU14o-yvV!BqP<1Fcau(YH$8;&`rV$+dDeI1+S!jaPb$Z$cO=*4h6n0)O zrT`H$D1Q#Ss}ox;4eSCEuatyc4~gyPvQxr(yHM^>Ev_6R`ThoD3Sb^KfV zP*8LM7Vn(~>;TxEihokgu>J~p=U{h|Adc!a8ra#S z&I)#Gpz2Vt<1DrXc6*Lg_;JtC8-4`VvxXn{sPLn8k*_ri3KvtYJ-)@GYZIF=jo@Oc zwOJB&J>Ch`hD9Iw5?dP!a0fsYQN5TnC$R6vgs%(iQ;PQXq0T#neN78nk=S>eg`n%O zZ%=siu^Pv}9s5*!1h8)-l&G+ee`_E6UXFZ@&tsU@|O$p#J=O zUrTJlgaZOWzbpy69zm^n_!df?rQIR(6i6P`X-QE6Fu%uMHvyVvp`umjs~lk1r1TeA z>Iokbh%Euks{Oow!KUmKFfTeTsI5p~USJ{UI$(}S`8PL?e>*U%_6Pv;7omL=F!OKi z1M_*vrvTgZuU)_)0}HP)ygl>W(64<$BIF&MLBt#wJ&dTSS- zTtO`}kT6cQ=E!@)pSh2rKa%~JA=*7s(l~#az)Cn9N=4p_v5ZcE)f=I3{~!?wRhN6&-2)ATlXnss^70Oer%6!qhY#Y5kn6 zk;~edBduRU83)Y`>gkTOe%VrjVTa*ITE7FND$t+wNb9G7iXUmk2I5Crzky7sBduLO zm@(e~TQ~-Q*@@Pl!Fyun{%QOOzKC(6b(eOcb#J{;Z4B4yqdeUso@pH}7t3&Fr@@Z4 zPNX>4I_>4kA=%8~beEyPKFzV+y6S*@9}9&f!W+nFEmcSc$APdMFrSq68e&wt{F zM1jMtZ|`as0Xau-j@pNOfz{*cySitucHYMx$@po+d7u381P&>ki=~qAC{eDt6mYzu zHcK$0HES=qX7EXNf98?(g6w|e(Q$+PFcHh>VXvF941HfSd4TfR)@{D}`m@v*KFJ~W zL`*}qq<0}UYNy=9y%s4V-Na{E2y`_o{GEX#wt8+l<-J4C4RsWE#<6dA6jgHs9K|J2 zqH+}Zw~UUW#~cuL!gdt-6u#og@LBkZ$`*pYqISYoUqF{>o#6yx)2%kjO__Ht?lsxL zyt|NvymzPMByM0r-tqQ=laPY165Jt(qdF=2T;e>fP3rLOC42p=w zc2)_l%C?iaZEW@LV?KJYHNiIK5NzF^09&KBG=DI$3DbxyChqT(gx!vYks=aYe{3P> zHgJvDul<8K_U+)Rnj-+Ne-0%oaOL0H2iG|#C~$o*)F8lB*+LLp^*~HNU$57f@ENw! z;yzDdfvfj>`3nBcxP0Ki`oXQ_y|z@M9Vj}`@_70hk z!-1K9y*!b_d)5ONt;fEnc)gJGdVW@3=YXJ!*YK{cc@Vay4JVBDAg%(wLp=zt&bB;= zY}?Y?_8|P5(vKbwBEg>Yv+c9<%v;j;C$?R}8{sFR9McxwU6a*K|aMq`3Cqb zuw2>a;2C`Baff$esK z4d*a>y^$a=4T*xorvaM)ha2!usu}9Hm{GH3?aKvmRAXb6Q3Dj$+pzie+wj!Z!%0kd>P#3Yg`_JOo zw?mz3jsVmZphN|A{9F4__kQG4K;0007Eq^bArk7A;_hy7>Pj7}lG_NvepV3nIjl18 zeMZ)tbVgT13O=Lzq#%y!BpQU-q|6Fo--W6}A&j#K5Efp##+Gf*VmP5co@(sc{)v^V zY1y@XeX&p}j#uE2-9QoUVJH+~D}VWRcPP!wQ|)=WD)FADkZOH1&oukF^(==WrT5q{ zt#w+++vLlI{w}Sa?Wj3+33awOlcxb*z~6rhbB8@%4|m}nuTbqUWGTVMtd%dCx?`%R zG#Au>3!=;M%h~YZ9Qb!G{1by3i7kLiiR~>x)pZJ}94OpBl0*X4atnbj$BgdTS)oPc z!&)MA`%XSi5<6z8mI+|i@4!|SX7O(sF^l$jZ$KsmVEsXM1DD*5nh zZiu-FSPY`Vw2Z$`8*(en!oW@0#@jWC$6HZN==j=tQx^_Bl4%?pqIQ<*mq(C7Zz@!p z*71J6ES7KIkl)Smd<+^r*({s}HZh)8Bw_a})r{xOL7iD9GwM0aXZROWS9fC{_MKzU zhfLCtn9{s3;p+k^ltR51pl&;b6mPY#6^RsYvJmKE&nQxyq#*@acqlTwK8|xcGN_ga zAj2?}sE~nwYZDnhf=mizD8pwll~FceL5A0mGtxT1cj7zEnj?V|PNohIyLGo(bYTyQ zb5rgnh~W*FtA&a)_aziP?>!hpp)s*`HqY14LA@O%oY4g*iYVmnbm0iY8z1E3Q}BY*lHx-0MP~flWO7aSEw%z(a#aY2_f31 z>F}=V4=$-4m%NUM>fEM}Fe{UhOO z^KQ2}UavM_`gjPg-*lb9Ntjd~Di4*bBlvl(gR@AOLXN_$vWXAN)nWFmTBtgQ3YBrU zK_1|=lqEa6_b(_+-usS}Dd{}%ex%?a^ld@xH&)&Dw0WXUe_283w@`H`2yqtM0ili1 zT;<`(ZM#x!s#H+4E-@6zib4U2H%wGOQ{R>$%j>zR*V%6kX)cuSkZoyCq=oP)#z|!I zapvKJgPbI6y`>BBRMP+(#r1_Lh*^T>1a?-n6)W#$vq2kTwsezk@_G&k9MumyCS$6#yfd-kI)!Z4TBL|Xwk;L{eRP@8nCU4RvMB=! zjhb$X)`rF_?y5*6m};HJe_u5` zUL7jnecgr1s@j-aXE}iyt9T((E(u2O_i67BsP`T5eu0+Jv27QY@})&W`ilU%m%#E^ zjw0XO1@0*=rU$K41jm)apj&BBiDKNd|0qGjdn?*d-g~n&r8wL`22TKrH%N*S@_0J% zm^B^GQd58)t`kVIbBfs{TtFZ0Dn42x(*Rt&j=r(U{-Ij20jE8|$AgfB!65`(ub*X{ z5zTL|yRgY-$f;GGMxp6E6THE7S2*j|tX)r#9rcQ8j=$l}@lmPVB+UV<0W&MR*8GMV z)^2ed#d>+HS*}(4o$Y9ku-Y;L4l}#izTrUfEN9QYy$$9vgR>@`$s6BDT zj>oth-^?n<+%P$=xT-MTEY<4$*FXldV$Io7!`Vyjs&ci_EH}qlb8UCaLvGdCS1kin zVqz3$^A1R!z`dvJ1t{r$z@__sR_W%O(q$cN&SqxWaC(ZBLIWpyX5Yq9$LQ>R{Qb~T zhj-8@Z+`(Vfwrfm%|1HsWJ3A4u|PP9Ec@uOlB!jmpRc% z*hJ=3$$wI*e+TxVr1nn10+?THgwy6xb8^F`uV&@vrmfr)K{adrXUy_%qBGJ>azOXa z4ZH=rF&5n1sEyZ)?ybJr#d=`SKY5At%P+MMOqXB2bb!NjV>NH+)fMK5Ott3L-Qn`k zly^Q<9_n?kjpNMjbt_GC`%s>o_eU6El-JF_S-kG!4YQo`_CN!a=6NjR6mm>n_MhZ{ zrP)-_%hr=(EWH}`88rHxem2JRKesmMxy9ylndSFDv(6X4t5#Kyz={W2rXJXD7u5;@L@W zLnc&q(wQIZ*tslhvY4IYY}3a5@E&@P(8>e&5tftMaGZM!V`G)c0p8!VH5mRtjK?a- zb&g^2;^#iS3?Ir7i{M{AZ)QQn#}z}A#|cqr3iJd$XkE-lb%UyhALQ$GxHfv7!bG{T zag8;?cATjMjt%BRv-AA9Xgr!onn`~3PC$_xfe`POgk7LgV{N6i)UGf-Y8jEQ);#{I z9ALy(Q%4^MQT-rg(~O9){WW{tR}XJHS&#T?*7L|T)WdB<)+4@}^*olP9)(L35ulkq z8HNbyDZ}tS0u^;Er1uMp6p^mO&nyIbGpb=ceUi&K*P(T?rDKP$Q2l!xt9D;PsXpLK zybVfJz6Af4(3g1atYZL^;eX8k;eJK#6y;aE1B&J-uQhnkuh0^7Y~BRJec5e@5e@e~ z7M!6%voKtTNK_7u7IsUlaW-D*Y^x5r6ZB*)J}K5Jf6F}1Vmqr-m*N)Hfog4_HayU% z;g%SPip1mfN-JL5$_mHryJr};?cBxT_qn2*+o*f^pl`+PQ)~n@irasbHp`}&yAm5L z4c7w4ua|_a?oqLc=ko+wVhkq(tPX;NQC*P~BH;Tu311g*r}XFDimGHY^$yIGpKoC+ z67D7~1TzMA%Od(gIP4vYW7!USstE$Hw-riMu*bh8ggp)IUWCO;6T+xVmsukaI>NP?&{gJdghGpMQY;-hq z3oQHJlCX88Rp&!6ZJOyrFzpuzsL_1XRLD<3uBc8#Y7hwauL)ll2&S~={TLP4DFmB; zYEX(u1e;?am@x!9F<{@}xHT(|Q9Eua#RqWfe?dbi+~VKT3xd3JOP=JC6X$_*jbrn~hp$G)Q}7)BvZX6}Dc} zi>vdf#b#sU-uk#}1*8)LnkH+u{36Yl!IPWVc4=G|@Klh5tuE2IiBjh#P$tuo@4VQ_ z7CO?V^*2+W6QGu;u1s1K=+u{1ZP47O5E^?(oo}q`31aH#QFF3=_yvm{P)kR)RU?;c~NtkIHo{ z5`M;w{>>Wf?t`MntIgmflX^=RaU?sc_hr;<-unls;H2}=Takj#Lmv^u#ul%;wl$r) zI3xj^-1tIsUtgbdxKu8d9Ed=Vj#rB%cc|B?)|#OCF?bs`6Ez_GjQfn7!SSY3Zsrcx z>IWN6?I7C{R;?ZGb8e`(uxgGC*MOZ!b*N<+@>SK?4m@Z>obL~h!|4o{6mMna$vYpK zNmi7`ALknXc2JU{+ZZk z+sB;~TCDaJ6Yib8V1~W30Aq2!*;!&p_YwB&7^uQxj@9{E?0c6wLg2ZyO6GVSx0FWN zxIuuhSU6q_Bw?#7)M>h1^SGv%5=^&7{{@2s;zd&{XM=Dl+^1y;Ul(qSQk|DaEq2O{ z*6}hdVKs#BpnPVwCm+PRy}TqH<#RxAacTZsbciF>~RwaAH(b z2b~yg9rvZ1w1_qwBY^$3O>{R7mtgC7b8^f@XM>M>PN5Em5MA6vU4mCCu*H1H9doOA zATbAMil~U=1ybN=9u`BNM@}wyiA^jU(3zJt23ud77t@D4KE>+dCzeo#Z$ol%k=IKM$*GR${4{2DWW#D9-sBClT z_+bz)s@IV=L}=ongs%&1Rm$@oL_Ky2TR&@ID-v5jWg(a`Y^4xEuzf?fUjJPjzjkz0 z`VXM%%b`StuKZhibo~zUCD8R%@L8a%YV1gK-DX=i=2KRfj-q;kb9sNbz+5n%#uDZD z;r$W?%X|MJu$B&#INyGgPj_0#B`O&z`nOdzGNXcqWa2fygXwP zx_yRcyM}~8_*f_v#N;<;XTBd{f~Gw&RdXpw7-id}5P>6W622~QMCs34jjHSvj_kCs z6^SF)TL@+hM@|abd-(k9x;Rel2%&yTY3Z;LB0fnj})qq=RfV5=*8AGQG01^45^TN5>Kl4*$a*tU6o|GnaDnh(u7ugg+r_?SV! zFVIREi`N4cbquWrEmB0H)qsUy#?a~n;mJ`?4TYy$;<&WKlhS$so|Zs~3ZD44^zigN zNE9P8(D+yiVE4F%-|ORzZtax@m%CdJXhLBR9|Y&L{l6|ix_g`8-U?9?{yp~@EnuWoNI$byoCCP5#tp}+9>o3DUsg8Yol$kg?_OVV78{0V7=mP^w8US*Q)oVk} z1pm_uxvt?6IN|UF{!5)WJ)x3jE0<<-R%tL#pOPlL=WCve%@o23qdk}B0NoxnKLq;*aitk zgfnuRB%JX@H(eSIU&fw|#oQ5*YGPV2BL(q3$Gsq43ZLV}>~+)U&{p$AP(piRw!-VO z)E3@-si_3wtETeq##Up#TL)4Myx$^4B;x<2g5Rn~sQ*uvMjXX54 zWG_J4zxQ2aJMTR%xlcNcA4Lj2jsKP)j_R=*7}_)y-kYMq@HbF(C>U}U0Sv=S*VwWp zSPUohvt^|Fo}0IE#Zp8s^P6H%NP20?|GJ8|elVlAnID$&ZAWJC#_ZS;8N8Q^;6J*Z zw+zq~SN>Gqv_yb!1z(bu)ru=E@0|o{O72f$w(rG~f@S-5K%T6t(`RYIYGSCY-)EXx zzfEy{ZjIurb$A+tB0G|GEvB7W{G= zN)o**+tyo$?U47@$mU2mY8+YZXa;1=LasIPh3|F??4F&mTBTf^6u0THSSlC<938?< z@N9oOgk0ING1*Z_nbTIDQurpW@Mok|xOXK|@Z92Lq=xJ%vxEy*DkYVYV;7fWM^-s7 zx42b~e#$NGL?jo7EBx^6Qb>03c8X9E-pVDsIje-2UtE(g>+rS;9EfsppfEIqp=WR; z_-IC36wR>%vW-)k8}o-gSxWeT_o5>-;OV@@P3M+KIeH-2T%ar4ODa1!UH;&cpSpC| z&$8XwbnbMDY48>~(V@d2B)6ri&lV^52)G{BW<5*b!4l zt5P~Jb^M}5ipZ(s=PU%%HFZ48pU2(ok}9A3tAL5nDdVT(IJ8e0mB#&kx;G9bswpG? zW|=acYV|A4yza<3%^N4+vzRw3!w=3I^(gTvn}&uO}8CXS@0diA_^L3G*;EN~%`ZsMT~aa!QdjZs?C>7iDhN4N{!Av5W9jI2lS0-YzU7 z=wzH=wxZ43m<_KGkL*Uw|)pSz|^W_qSoJJpYXnh zwdKA4B`b{^a>!lUfE3(a`bR-*xJ&CHgVAVV5;7sM>_p|!LLIMgQw%zANgbp%Diq5V zxaDmUJ|NqD#CK+TCENG7Y~Rf)8!m)vvK`Y}JOno_LE0+da{y1cPQ7M|?nZ%u8%DIA z(lM=5d@l`@o9?LgW@~f7@FR1OIC&hmH9Ex-BvWQ;amH$(DqJ5aH{n-yuMy^DF5o-W z5jV%Qgtg59g&L)wV3tnm^gmWw`UBU}@8D0=xQ;&EZ}8P+o@jdX27kqh<9EdU37=<0?QY&$qcRsiW}T-Z*;HclCKP=Rez6+CPYL+nAf z>9803C{+y)^M_dkl}-v?DC<*xjdwHG+f50SU|Iw&Y3*ZF(H3!Kd$JMp?G~dfrNSll z;w9EC1;rhSCm~DWnn`0RSV5Sj>;|{J9|1N8A20_T3>eH-RQ7&cYc~)W@TG|B@Mt^b zMgv!V%2h~K3d=tLan?a(0aZgvR}Yl>UdGjTZvtJI26G|^_+myCZ7|nOmy9IE^cASI z@Mf-sH^ys0HzHKQ>*7hsh`6@W7!g*Wj3}D&CpauACrDyH23gekjNVP)m}rqP8hRQm zV^$p!Z>?^W3OwJI3}vSyQd<2u*XqacPpX)j0Q6Hec@plNuzBR+dW(x;eFHcTjbU*n z+lgVVV|i5FI%f48FI1AnvFLDy8H(;Riwcirz2r#6viuCjt&?4567=BG_P}tt0+B8D zv0CeO;9wxnWJu>UIuz>q_rw;ghq`_wsajp7bu-*`f~jX3W&Mw3uV!Jd-%HWr=AaZ6 z5n(T-6YqCeMlkGkexinEZ2H#T7D`GILVIHJf86runFVnz*5Veh*NwQ{-XRp09fvT3M??;az4Q9?CSU7NGi6F$IGJBpZ`)%rRRle^U- zMPy9wfQ4YjV{-ooI%H@}Zhsty_L!W~cpxVC1XQPDa{ODym>hCWF}bI3SYh6VHo`>5 z0fb4KNK%1o5=_}sJiO^jjF!5;@L?Wd|Z-aNNETXT{nT7;0TX4+qw+U`_6`3W>l1$>evb z9p<}yHG!OBsw?{% zOp)QamFe^aMz+>Y@#LLvS^MOjZ$&M`N2OZs}N2r!XS?W4-31|ZHPXbg6tu*{OQjlvgE9^gGmk; zJ&sX%-vfnE)U~xpW0I;fo|(3ER)UI!En#g5ZRzYJ+5roSeNQs$t;O2&-s*UMb$h`W zYi~RW*$Y=_8hgQJu-VHq_*@c<1`$iBgQXHLG~mR`SfwxtM#Hj`JB^YH7i{5=H?QDt zuDI1UCXqKC>0IwfAgwtf9S0(8V^pRk%?8fNg4k!-7;NafIYC9jazb|S(X%wXJrTOENro0A2GDOG7?U|5tG9v^;r zcf^M!pK)R0r`t6KkzqDlA85GE21Ja<2OAr&DO4H|JucS9Ci&+MMT=*hoz%MZXz?Fq zpJ;Vs8<;`kQ>|L3@gw9{ISepgWJy{rc_M_Y6y+_(GAtqFM6J)bHABdeq1F{pSyb?V zVvQnZd=`7%j2Xk->#zri*(B*oe`G3X^)%F{>|WNVJu>UtI1Tlwz9s9^9+~xBpQXO= zk(<;nLcLZi=|HI0wMY>e>K(KY%y_8xBw!*m)H@Kzp*_^AG#&``{szW273$^RGKPAQ za|-qTUJjYsNDv+BeaOse1ovgu4)de4ED`|83o&~k?ye9C5M&&Z{M zXM3-P_5mmDRrn{Bhxa>dOdg1Sxgdt{S8Sm9ypSLdG#^}->DJw9k+xu(G31EI&Vy)U zgN0I5{(CW@5?o`9>m7{BoKP8295IPAo=L?qO#D!Sip2yAYl8_E)*lxoJXuVzbd`{S zS$~sEd7sBx^4@3T`C^kTO&gzzC!xs}S6ukWu0@lz3f{&lFjpO5%0u|t4-uPUGY5C4 zHeshOzZn<1ncQmyzZBhi6}viieVP|RC&g{hu*nxDQaL!StnGqEU(&uiZ;8KR(r@qw zrQD~ua-U3~Dbw08dhuN@eq?xf_w-9oa&@9;rI}xI&HO4}GrHMf%;i7gNyzND2Gf`w z>K)Av2R8ri&l37o5IP*J)hfAd!w%jTk2}H-!^XUx{+3JBZQ zhuP-Tx>(;tr7>aM={E-}r>5awq%zsSa-x%VM8mCT$1^H(M4N*G%Bt8Gv#PTbR3*kR zEI;8Gc5??+O44++4yhz>9ZC%eOXBsU8}||*Srt!0#?6~9jd5dxhZ*^~!ehYN(yOHyW=`ynnXXR^I7+*cGft=|}^Te!s%1MLC2^9D5<=np~ zEBDL8xLp~^_=&6%pC2aid19H1C-b1lj9l&F4hA)0vX>Rtzu;W|JS*2L4X&f%Vc#rq0S11Sfv9TvD~VQ2FLU)G0P~(@ubazIa$}^3NXqY~YHn!1 zChY)*s7rfd*7ltCYfH3Srjn(e@X?vnEtZ|ER?&fFr3WjOb&Oi#j1oJ*YoMZ{+IvnS~ zAH^MQn;D zh?iS8OVsY!@g!uHydlzAl&|wIJ<3&o^sVBC&!?t1K zEkliFt!`hp)*Prfm+Gnn(wjpgE}=c0QTc|(=zZlo6I3KD5=&2Lk(XxC8JS=*$xrslFqD z%%-K`hU`g3<+HSC5WYV_MZ(gs^n{jnNd{$+p=F{~cJ?;pGVi@5UM}6vPQoetf6Ew!L(VZ+^*w;;A7RI57_W^1(NVbDcGX7;)$;A) zraKn43fTsV***9^ZuF69t6n2Vd${qGoeX3_!f>|m%J*@@M+!8^P~H)!S@t*Yh0vs+ zusiTiDyQg&sA3)uyj>6{i3g7GF;wDdKWqo94iy@GTOgDNS0atNxlR0vV4UtU=+*MA zumjh=;GunUt{A_K#Hr`R)=dL?f;W{4r??7V4Sy2G8inpKvBoPHRdgnYEz_Y95^Z`4 zQ_?@krGHnv^lXlziT*%53C&Tsmcoa4Ei9;2a6i|rkyB(t*pUF4ZKme1y%D3hDFpks zurKTUH{zVYrxHjfX1#)COg-=k&ax5lGtLBvu#WLeHU@K?zLKC~F$>1pU`B@Z$AzMM z#7<4vP$IJOgy@OvEIEN>-+L1I$$Q_6mq52A)Z2IBNywJCiqqH8OQv}?shOB0lC^5u;ClJ{*Fx;a4dq(98t3(Izjyo@Y zU=s#~r6)9~b?J3Qrj>p^pty>Al;M^yy zPLoeRL7GkYw&MF`obP+H@|`#Mjy55&nb0;53MY(a)8A^M}kZia?qHr;*{jux#Z8xDmh;9Wt05bn`a$!3>*(;O$otW+U>>eTBR?wdKofl zfjYQVfL9Hv(pY+kCO@^>EWzzfVn^bT3qDGfU&+!V0mU6!+3OsJ;s?0`!E&0lCKM^C zc*)IL4)O_hM-j71(gzfugAR&?wf#fLPKyfTD?3t4jD|y=KsGsF_kyo(@QOvQJu>2 z4{*zWc2>)uYgm4KPL!t&!5$zjr)*9?19rIFEQ$CY7&A+?Ee*3eVht-qI4YwcQn>1$l&{o z${cy;GC9Zw#5dVOY?l1%1eFQ%#u^fu_cPj59kJYYIZ{|}!3E45=fR&CSkuiBH9I?= zgv^mQLK<_#3Y0lUQ;N_sxyqs~{GsJ#fk3D{Pc6d|k?$y-^>CeCfPb<~X)q%Nahq_{ zrEO*yu9di;=O*AhH0a5Z5rUqo{GQgCpsewVyUH4yoNArPpR+B7tK?>oRh($bEu90o z;?KQRzQ;FI%J(o!AQV1TD2X{V&WGW!L1__JZ|NeK2RbnM%h3%2&_~&g#*67eOTQ)V z7DzY>8!Cq2@YO8?(AOd1p{PN)S!Rfp-Zfv9&7HL9ytgxzL7-oFy`*3=_JEB0NhB^~ zXimP?e3%;5@fHWX+PP?OspJF!DPPJC>Pi8}!8t_Gz6_2gEr!Bf{*4Q^T**{b( z;?#^MqBP9Re0K_C0!AR<(B`@elYh(v;p~8a&m6BfYcF@!Ue>>MP5;^r&bl>gugGn2 z8^wBg4DSwwSOMk@pTxTM?Ayz*soKERZOE75!o5h4ClBYi(ui>56OS!$V=7m3+ji}x z!T3m3FAdbIq7}iF0MeM^BD>hX;QV9vw5Qe;jHX?+2U1%1dUz7hGzwGS3w#_S~}|A?&3*5XI~W@uR6rH zCY{YYwv)h}Dqd;key*AOvT6pmg=w0}I>_}y5T^!r2fH}J4M4YySW+{G4H)`*BSw`z zf5G8{;8Yh3f);k;mfSA#OW1Q`ud}b$xvAHI)!?ClS{*aU%UBFNBVl)dn8q>iyOgQpIhQrJE<%9gQ=pwmBPl2=Cn{G&I%|kc^}6zg6njr zhqXN8&A(`OBXKF|7yRcdAw^Hg+CzEy~;EZmj0uv6>zAk)9!UucumbVP9lp$kXHa zv@b&{y$6;d-v!mFWk~+bvJAN_0{Eu9J+PWon&<6>Ka78L4!;L*{SXw+=U>`561^Dt z18cH*c7y=JMHmnrtCu0s9?OZrJ?h$cb8K8LNx35t>o0GBz%?LGuS>Lp%I zUygBrW3G|q-fdu7bh}f}ata!G<_4-^!}`x#tbD&)8Rur zE{KS2b++yvP8b(qssrc22oswDEc3WIw6m>_=jfATMVeWFnWK*e5|6?@MgNy03qaq-u4ovQ1C_1b=&Qx7Pny zc5*fmdV>@*rI)Yt{18(GJEo?=) zk)N^<93eOIO~6X18~Jx}eA?YerT2gv`9dgBxsm)^TW%!sPj2L0@L9N#%21=-$UV9f z2QDADbLA1Z7lH(;)?b_1sT(&;9dEkb9+i!r68}Q@yO?&#CD=veN*Rqcr zE{BhsckJBT@2p+320riEyLCH$z69Uiy>$nE#@9D(-^V^E!4fy`x&c40 zT??Og?YsuxS&OurckP6l)?T`STD+@xQf+X253`g-_$QS!Ei46HJZl@|$qM$sj+9!x zaiO%6ep1PqzE{9bw3if*%Q%l`WaSaF%UF4Q@g`v>mu|>yB0E`&ADMAnb_IOoc5?Zp z@R8fe<@l7F$$IuKvy%0fz*BA{>o0?k+(y=~M>1w2>#+)MAy*)oFp#zDNE_Y3jMDl_ zuJsGEY8}_kmDa<3c+L5@4btI+anAqMzU7hGyi zvc?;^;Eap05ev?F5mc#(6brWul-YH6xR5O(nrHZ4(cX})-HI$H@9j!u1-PcXT~e?$ zxti2LkFJ7Uo7w;W+oon1d zXFaSK_pjT~zwQ!TE?!S9nB-O2lwJ)r5BIsq21p40M@lQ2u^7I_T4S+%moRV#4-8hD zxW&GSS4!|(BpZc8uvSU>%0Q{q_X4iI=ciSl_dKLH^LpGbPo`$b6SE$SBT4#IWIvUX zqs8TTSynl471=6BKdmA=zGY;6q1cIBDQ>3-CE=U6gm1_y;Q~{_ti#hq)XnSG01*8O zqZX|G((W%1aR)`6vGR zYiAt;I)ML$?&l&2M3}@XK?lMl|78&;GEDL-3&C`SNtXFn+sIU)3#&!8e*g|bqa*(j z$DTbpqSVbTO*y~b2cbk29pT?B(UFsa-P~MTL$)a>@?rQaf+EU3gF%r{W6@l9TTzO8 z|C(-`>)yB0=DIU9TISbGPb;IV;$g)^=zs7IJgi|wpX}cro6jwIQRFkP_l)B1XT_b7Ljh^?X8&{Z9kQg z<1m+FJgXe&Xj|pDf*kD#KReRR&R&3$?jA1P-C3o>Eti^fS)FXY?IJ zTjC#h%_$o)O;ff9;Io*rsUadbW$V$dz23R4=@i-7B+O~Y{?F1ZfFH*I15<857*%Fd z#-(cGc6hOuEeH49)*CWtG~LC@{^4zab^xzoJ^o2N>A{QC-j2%QtJjwbVmL(n(`72` z17L-qXC5qmTn>l)Mk@fy@zJqKe(i0qGgzxtSV9kY3cE!iJ+-Dc)J;LE3vyR8c%5_x z-Ab(rsZU05vnX7*QGlJJ6R=TGYy`lZH+bla-@w-AKpvHywJO}B)qteUEF&K7A8^WW zuD=YoxYb=qdx}k$li5{ZH-g3n+dT@0dPZCmD)YGW(sH$F(JYOYVLzMf97w>9I1r6I2%CsYKk-pC`J=IQNqI-F0J3?# zQEacgcQC$%*%5GIZ8*Is#gotxaBi64IEv={3m7ldV1nknl~rI48lRCqOxuG7l!V)i z!v=?3(!oKb&%qHXFgWDY;D8rk;shXMY>;x1aV=C&WNWdp;l2cVH^&ByOx?qkX=MEf z>-=JL3j5h)=k*EL5n}`LkZ^2xd&05dNHrq0QrGh-8_RnbwV(I?Jifj3o{m?rJs3|y zJ)N6bnx2lvxfNLhpTnPfhPzW4bAnlSqw=5F~kqcU+h=GMz^B&bOADl9!=uUe12DueRK+B4Hj zEqXsfZsF3^c=>cIL@hoUPeNA66`sZlv4SuwyxEv%Mwy|E@@T2@(Z4KAUpWp@kMa*vfC#KOiFz<60%y}9BHf;D^OM&O(_!P&B z*IM%dc`<4Al(zx4j#ap9(a0nS6iO`OSg!cBeX@mAaciWkKOn4Ca>$yY*nNa>E54JifqiVGqw_fhne zo9<|@*tI>a`#%3Gu{r9YpRyU~93JJT~Y=~pd9z;>f4g^tt0^L^yQTVs?K@?<~f+#=_rgj7L_8c^Rv)exM&$)$?7BHPxZ+N*cnBt}ZkC532*UQ>5kAnRV`8Tx ztQxVKaAc&UW97>p<5fTdfXW{JNd@UYLv`_R$cP|L5)N5~!vw@ZAd4j=sB}3VFs0y1 z8SXu-)M^JYa0Dwg)_6wjK=VRu)WJgJi9z9G3nB0j_VXB(&&LKXX-J!mpQYZ|aQpHE z6$u|3O9xL5>x+w1oD-`SVkyC!l40)w5j7p;nxYpUsLMO;C|AEG#{tVQrsI zEfV+BTc}in_Z^fg@BMSUCUkRM1SJ0yPeSI(nxF@|TGM(1dz~6>M(b2< z`bXZTe-QdBiDT4}BemYTOF;Rg&4klO8>ol3THN$;XAveN^T5v_j7&x5UBg zRpbjaf=9wb&t^v+2*+dA5eLFgp(!WZ+Tc44ZvRoW;Q62cXoPd|PhxKY_cS_^f*l3F z3V6(V3UjF`fI0_$itija6VNw-R(!NZregvv_J`Q-?BR??AOFUzOFL_a;EEn2?b7Ac zRrTZFq3@~&x|%o8RZ`svSGQ(X8=65F`>oC~4u0=q`Ox7u-VsOMk40)p@TOAAv$#@r zrB#Zz6Djy1Z!#Q%-x)sSJ;3F-HLDzW$lEGM_A}bTU&>y9YNb&w-NCHV;o_GjUDn~{ z?Cpi|Ds1iRDOTVR6nc@ycms#J%|Wt{zaKiz@D3Q2HmSf%=oxk4UZkOoYkFZjEZ?BU zFK*j-O`+0od*QC~L+-#(xz2J~PHsfp?{x|zBe2Dr-B-PFZLc$2uDIeCI8WE)q!exY zk=%hZj|)e=iN4ClVD9cK61N1!)qV&~@G?o&s?N{|E1Q7DB-L5+6O5LVhX(zRO{w21 z`HveqN$TGjQhRT~0$2de$n`Xj?1bmSrmtq@?@e2|Cjxj%>stLKebd!V9WyUxMZRd@ z0;-KnOg%6q{sc%IHCd&g?;8rRhKr_#UWE1%dfD zOAz>Y0|(4=?Z`1jfL{uq`LsqGM580XORt7mccb6wXMo!OTpp!*F0;-axXEk2_+15f z)FXh6>p&&?M9Mo$PY<}*R;pLhUzx`%q~1VZ&7QE&qWB)Ki908c9h;nLEf||z#rTKo zY2j*Gy7UTzbtCW+@cArD3HqyMn;RQ6p9`dF17~Y4ugJe;6L)wXF4U`2_jxaYD!na0 z<-HU?VFP*h;-~${1n{&Rd0KV^yo>8+i6+zM`2KMMjS064-Ui%?`1n@*$O1-M+~@2Y zSl_u2F64!9ro$aF+&jsUQ?3D=!{39vh00{34CjiksnqiYlQ`fas#i>9f#GMdQQ$f`z9)l3F>Fv%%ZY}`?xi{ zG_5swFF^`E?^P`npTpu|Zo1-3AZ$xzx0G$$r7jO+8YTqRD+xOKFUb6fw4ckRS@g#6rp7L5|`oT_gGAt2E^FNl2#zvoC$G4bo^jQjx_6x34V+C>!s*ntee=)0?y(WI36XOq-pLG0r zaW}LY$=w~yNWFVYLFdq3r^KsXA4PFj<%x_$8%0mC*(J%nRQnMeOEOzEN%79(oUBO4 z37)_XaB{rS7l;MlQ>BA-yyi9OYDP2XHAfFPVr=3)BKlQxY{Cj~Y~p^rIX>+&gFj+- zi;UFbpuxu5mYSN1* zA++R5Ph*i-fwIVGO0gAzoOz*t|5k+4v=Ab9;(6jZ(q`!IN>{Jsx_UYONxVRe(`DfT zECZp4OYmi1zg!&~28(97VpV#E^Uzad+aG$^e!EpX*$w2zyL1C3zTs;h5Q$0lvXbNh zF3H>Cn^14{<-q@&8Hr}cXQ1~tSXS)yY~8oY*}ZGOWG>3(=!u!c%?P6SLB9Ca6>lmsnH6;j%vSIwwhwMAcHI z-j7j7dGCkuTGhMi3LyD@JP8fZyvd{ckm)j@p?s26V7d!?a210lF=aeN%^ZRzP8npf z&2c`_V6VapxC^4eLsH_uJSw(&HNIhY8RpRx@Dr4op=(mOx_@AEE6k0%jC{% zG-ZVA5RVIG3ZD)L-Xcj;Q|N@(iSA{&1>y?WqUG`0PPl|B>ro$wxzAK)D#%`{eG!}yupvBk%5rZrmK!a#M1Rk0!#K6L(EY5)Dqs)b^fHm3T z3K0$CvKf1;=vE7LxaAbrB&8);P3btjT51UMp;RjyUq72bLFV{+DMWpbG;jEcOb&8drvC-Z@;Wz#6avd9m@S z>Nhejl>>hrIt$KpwOKB{JXXNtfK9lpfDO|uzDMo|>r%v&wMQLKzZ$E~zNfNW|E7Pft*-=ucQz!v1vEk#83gy&G7OD)%l%9p=52@mkmW z@&+KeAfAN!GB=9o9%;HUXiBqL1*RL*z{P)lLvp_}cCeCD-ywUL*{P^^KvGHg0U|)S z{Kg_b>M&o89SO*ZekmeBZ0uECk~N$!iSR;MFEy+7L~57yqiYlB$;75BLHNyFcw>oe zHV91BvCn2j`w~I?_%|umFWnKw&0N!}K)^y9?2qeXL60&^W zjA<+%8-F&k#`bra*8ePWs`{NRFh_+O^hVtrJ%c^_7z`b9n8$?;C03{5k?aaS=gW!} zuyu}22dG)(cd0vO*Dp?>1=FrKgJ^d$Dia?TN@1u1wu zp+xMcO$T<~|HjfqBX{2ar-eY5L+yf2pT;(B=Y8v>ptVhzyRzlhY1j}H$EkfMzS4YP zC;nHUM70y2e@nO%pYQPAi#xoRTmo|#k<<2TP$D;Tt(l`Y<3Ahrl49CfBYwd{VZ|CO z6&9N;{YqKxw17z)Bnbu>W($kCt0|&PvoG3_L8#HW3S<}e&IcX9_h7U(ZM-qCZP&oy zc)2pvh=)vqQUR=@>xUK?4xsnWFn~s|7zd{-;-s{L>lqPMa;S}XL)tO}-eO`yCd3lJ zJ0J;LU8e9hU|0#|-G=gY3Wi?rs%BsWC2!bDlTk8$8(!L}G`B0pnpS5#jZbsa%d4-v2~(<-Na@T8leU zPFQ|3QgAGPSP=XBfNs)2M%VM$S|}?5ei5n;ML^DCI|$gTFB`>!-Z{2uWS?F}D9&-U zN9ABxFZ!)sTn~m}2C6lYPl5YR18A18A;-w9V9w{vl`pZc-+U-dgaONU6WfOmSiUU@ zThE(eB-a%M8E$ZwpgyH*t%z41>!rTD0mtcN)Q!!DrtW?LDv0VDq%n~{;HT_$U;Y4F z%TnE^SbsEm_)``h!aF6gEatnak-eW_dv^+G&$u+G$w;7GY9Y`^rH;;bPquW}aBMv} zj#WFhD%A(D^_$QX3S0TN^w_!%`4ZUr7&b1O@oDWG#8!Qu&w)K~c7RWJDI^MOB4YWj zR)+&lZ1J&N9p=mU^b+hFDOYo2<>EouwF|pQ=tYb|i}8)@zmrwSUgTX1dH|r@iht5f zdXMz5$4-P_Ex1myQTj45zOlU-?EI_RTCsLj6}C31Rc3q@cVO6echaE9N}|>>A1eLc z%Jq9Q{D~SY(T@;o0DF+)%HUn#3+~?0P4PH=Tb5+Uc&ON^a&{{5?6Am&-~|&r zl^KcVU!D=FHDV&-4aL#(IY+mr;|R6GISL=mQKw>i7*}NUt72VMQ~zGZlew}4SNt}| z#+$+!5$7S{if&^MF@FcM6PJs4l)6x#)U!*X!@X_SURs~U0bxkRgX~6kvZY?qv-LNn z;Wu#&zad`3J`=>d6Q;Nhf+nb0!p`ZHpTwH(VwFbT%QfJg2A5QXH1i_-#iPUo&I;v5IhZVjPE+=Yh6-p~dKl;k=nJd|4> z`J6F_d(Z%!-~b7d3d62dE0c1ml<)1q_Ymy{-~*LmY@z7}R+I&NiCe%ULfeVcbqFnA zk0(D#_lCy3UHbUY#0fIf79<;Ol<^!h9K?a0)qH+~ze?1}$-{~)pDdn7sEt=(Nt!no z9)@NvLLY2yU|XoDpUh;HN`v3x8hk9P2JytI(qR0C_B$jfTQ-x?Z+N1EAJ|YksT?@d z1Z(}^d7+af7Z~Ig7T6ge%v$bb;URf^U33xa^8X1`Yr`;f|6{2#HskyW=qsHgfTs^fw?;9HTIFDM8!pg~z z+^Kb#IhO}r{>XKhSr&pBTZcIug%;P(sO#jm=>NXmfnl98D?we;T3WxMeOZJYNm0G~U8=dJCPkVoTc&gj~ax zz$mVY%Lc|fFlysunO*4#`_I&sY%p<$#qxR?wwY5q9$6+-tN#z)>JJJHCtpku-2v0P zlD^~CeZ(xw29x3K8a>PUB=8+J%MzdkjUQe*j&Xu5TOR*#LO)v~Lp|RF{$(py?3y8Q zdz~t{r)9r^j4ljX#b<88d)~|oh3HDQ$V=X?g5{owOWw{hCW*HU$OQ?0MH-pza^tnY zThg{#vE{){jj8MojqRT#1-ldOIuI%AJo@YqLDc1N%emyD4a5d|DY0+5tT<~;PTO=@ zRtA;#57mm0B@eGQgQ3RGeDu9>`yq;WjXUV9TVvcCw}F~gzc()QUD?3iAFwU*-tT0S za3?$VYQ`h2AI*%61<;F(o83GB-nl zReOrHF}EL6NV^r-BR#?v4mX$Um@cdCYz0uNjZR|tc?!nHJq3mWG_HTcLA5~ysXmUbV8FZ>o9eZFvLdK?Q(LAfOD}SV_F}T5jtjxnB?PT zs->RN6ZD`}pfb|lId|cO9ldex+QjW6Vl$;5Lc?s9RIR&?*l4Xa3yW{6Tj=C1uI#=S z*~0RWLg??(d|5>DMk!_7&`i4douM0V9~QuZR>r+_3&<8|2vHAA28PlyKzGxr_R)AS zHjD4)+k6sVeVEh?nMl5Prn-nuj4$eeDeobWH!A2r;Xx76th3jB5l!>rg7i1jy|{fI zPGmdv<))I27hXsWZTZF2z^mJ@-FN?-P`U4^S?dGs*Q(t?Cu-E5n6^=tOn; zBeTB0%~Ie0ZSPB<YLqftMk34b+`}QCNf(?N{7Ge`Wo5lEj z|6kj!d+RQ}OnZFZ(>c0R_jWCR{q=8E_19l!j*)OS-pOjSa5nxsj$XvBQGe4>pj~U! zXSi>r(~@>ZUr#p*C?XHVe=P|__qwz}d1zhwD%5D!rNx_LUE03T+JNmHq>IiLd3-dU zKv%2N*B~udr;SjLU!898p1OHkRg0pNvvW_~ag7mxJvi5P=l7I-o*rFuXhpsX=Ls-N6bVX z5`*7l=hOce?pM2xNi=rdL2dP1EvR%UnYmob_B~1ny?j%OhNQ0%)s7WtYR~D5>OTjQ z;?^{2Bc#Y_NWDNHAo^J{(9FORH8gD<<|00C{8lbUlc2X!h3V5#(Wh!-eWEirp+2>E zGn(vHi?x`Zy-xJ(HI4O*2wC(j+TJ6*B2N<$RVD~?wdv>Mlxw(@?Xvj)?^o+9EaXY{ z`;td2Abr+g&>j#twSqq;-iYww6irF_L-nVXKXc(h^bJ21t*+dlEm~5g3 zNH&ShVOu`U+56Rgos7hQxS(s~p5RgeVApYc|a6c$u_oUriGa0|DiNh)ih z21Aj(=p4{;N^&3lTuGQ*n_NU`OM&!w;*~BkQd?33h9cujN_Pci%uD?9YO4?5k@u%b zY)1ZWa5W%swUz!fGUZ|86;nDoAf%v#E&D9queMM0WN-2i`bWJN@bBRwKD@@r`*bN7C=axyjpA~FMnPH-t(MEY)1lcVbU zqDPU89H91cN_HnwF%69ncFW(=j?a45%5be3a|doXMcA-66T~sNzYT;qux5DgkCog58U+9TTLCFt#dhN zqVnJzEOyWH3`YTLGYU5~j8>;7^D~Xd15dr@SwACzaH9|EoR$Q?dqdQWM`%OzH;{;C zLsYyqx*_WEMjP*mZYKcciJhmVu!UYTR1m)>`kx4hJvNe`sE&<}A&Q#0n^=Y9QnAqJ zG`6~khFryw6Z>0;p+Z~_aip$?AT3b1v8$l>0 z{6Vl%S+09Bhf85m!Gyj8)|C9q&%6(e(Wl zqVF$jw(ng)oauYKK_s2=U5puBFzAeLhh#qnxWi`z*upr~6T?FXL|QbO^2aGSepWN` zY#2?!Hl7PcQyAtXqe=U_N~0-QL!ZX63Rq#eCQ9=tSW1bpsGl{tv-R|*)U+P3p5CYn z&LQh5j0-k*EN{vs8mo*c+a)pZBjQx}zSx+1KM)W!c>MN@!k2V_e0R$1@;J3YulE39 zdbZ5AzjS~VYqovLQNZ7A<0RBcvn@36k$!BSNP^#Owwdt=nQgB_jmB&fZ!MT@-y#5| z+4cscg%ghlZaSvZd2X!Bnkano%Xyfv#;=WmbEsshATwCdHu z(9MeQMOkroV?#RilEj4wHl^(rqBZI}=E5?B6XGO&>YK|s%Da~!PI94NF@gI>P1&qK z*MmIL8Oll_$mNH%x?p{7qr8R12h&IIJnHUjX|c;uc~CUOYOzZk1v;}qWD86VJYXrwiWmb;14G1%De3she>3O(SEknFKp$DFA z8cS)l<0>j4wBs$ZaF7N36z$WFt`TWgJN_Y>j+}D}5Zj?0RbZIxC_?4UigvVGcur`? z0K^SzN2`3icC@kvwWIx`rfk-Z_opW7fOfo37o1Dl(eA2HXa31$V@va`7xBE3!hJtr0yl}wr%n)5;FgdLzd?n26aD^D6k(W#3-D0ZXoBv_`o0jFN znvjeLB=NZq4e@ z-=OJ89V$RRLCtE&c!-Wi0@+0wjMIlzk5yxScG{1T`$ns=>}{G;ciTa%!6Yg{u5A&t8j zH5!d8-dfPOHxqzT<8~u0HLe-^SdF^@8kZQHqwQyc+uw@a6LM+t_KE~Rujgqvl0*PO zPO&MMPzj-}4$H!EEaKBvu0A)bt?ok8k=jat*owBgibbgmJ(r!#m2>0aE1%>1vMx@g zwCn~Vb(a{LxT`Tww|T{`*FCFRdOLAt_fJ-=PcE-#%AVvW+jt zRhf-VsZ1BW4^nSuOR#?$l?Qn*RF_doit zC-A>Q6sYyZ@T@AsJ8S0U=*w_@`^41vP`;d16T-#>=Y>gvGgx~IQqvgN!AjjCb7e4_ zl9%BhY+>1TrJ{x;EgKM)3v|Ky+vb3<4ELW!Tl0%grhnc#>gsGs%5zb9Lz40=M}f{u z%Jo`OhAp|)27nVw?$z_te zQf8OSBnGkG>j=lQr6V46fE8;^zt2&?-|fyUldN;IMzkIM?j*3?3c?ISNI?`)qp_pK zTMG)}GX$Vi5GACgf-r;cP!Q%K+k@B1%L--O`QaSht6b4OW>O?k#5>$kT-qOR<8~tKPz=>Uh=+9o$d9$s{5QIf(T2rCNn`L#G1^PWZ^h| z^i3{Y_-$5e{sK)$X-x@YD{C@a)r6w)?e|2@X;nS9HD>_SB+Yq>77tcI_XMZM%A@tA z{Z-Q|uLI4yN-<~>u_`Sf*MXkaR6Zy4rQJuNWSXDXn9g}C2tl)@v(7-}K~9g=S*JM) zJexYpMtkI>W_=RaZk=U@A*8dO1o;`ACEi-lSz8G}sk45gDcd*ru{vuz*7n6AGXD`b zwH2;#BrcB@`|IYko8r=z>d-vx?MFwTgZ9y%hE87nntCmC(Dkx#kTU&*=F>qgd^M|s zM$vSn4iX@?qJsu1`D%9Wje2dXp^fa#NlROS%A@trTj#(GE(C0nCOXe(q5u+Udv+r` zkl@xs=hpU$P;26FcIdk%WL8eMrKaM5a+=l!>vI;@_H?etLLv)=Kv4C>-R`%b({U`T za3rU3b28}-GLGM0pXx5wo@&9oFP5)@!^!e|E1yNAYcwv_Lu9KDEDzMpUu@XN%` zOc;F@q0NWUQ^t=b0q$16W*|c9w}Kjt`W0_2sNb&>fKvS)MOsc7&G5&n-kY(bRE@N(i<6h%6i@1AJ=Rh39ACfmACe4Mg2(>prodpkFC-L z>-WqN^FrX3#dq^lG1D*aEb8KHX@iSVd608rwZVms0-e_et3m`Atp+wFLF`roW&}cN zU>RyOYCycTpayOr0HqpOjOH7n_g04qw;NpTU_fls})bS23M z`zD!&wVJ zX;fR2l*YWMOb@;LsI#*rxZjV;8xq{_aTMsh;5N=H4*H8+NPAZj>~0Zm#v&xbr%|I3 z;o_|Y5&jnhpcLV+Mp}w+LjevEZZ?0mVIfW3H|$?Z(*`-%g@#f=qZG@w zP=n@d@2doOulHpQe-d+3kI5Q;6_pUy_!nj2AZhw3&8MSWxN25M{R^6o(oqt`R;=*> z9R@2~EoH|_4JoO_MYKTW(Hd$lEbN4UO;S(22jzu5{ehzH4V@K%T#Cv=-!<*>B;uLW zgd3Pd{8ks76YFN7-m?yAelB6U=k;7Oiz;aYDi88~>|CPPQNS-KI=!+KM0}(^Iynh& zw>~lh5zEQS)AnD2eLirPi+_8FrUALYIi) zqT`WVc^cjm)qHsj=RDzMF`Tb(z@OYC&QHKan7k@X;KX7MD{Td?Rjs*keP+px7PM)- zO=0EP1;SwYB?8MgH;d&HF+@%*->hR%(kWR+O(i#;&uC_1PZk;bHFMw?k3!Ts`8t--?aFOC0Uqn6QwGB=IEXl zfpKIGB3g~U{75&^6wGBu98kV35A}@@;y~E2A`!E5YSK^1)v@usz7lv2L1gehCGcNq z7XNf{myo}H+t)tB+@&<43&t;#KLEHR4RayH zVVFnP?gPtpKWTKqAXp3eUdb8noAUwCpE#l7tJqHss^`A?2JEU#74s1;Su^zwViijM zz6sn~1*ugwiDEN(by7xU>=*g?&!MA8GHb!|N3;N8A?mf>;MP7Xu2{rJBp zKa|;WdFH}x16wW|xa8u@mJ2VsT&cHIdCeewM-0-pG|E%X(L0R~A6Zza*}N-X87_}a z(r)E|q)-yLlld|QEQUW(WvW;uX)DC8LQ})#49fmlpzOzuqRe}gN}RTjEFVQ!R$n$9 zM6i(j0ET!ZUn~-BkmBAsRvw-z=E|AfP&uXXY0}!eckjJX^`ya4rXRl&{dla|ek_dY z$DV6)Q`JJLJg^5=|8Oa@t26P*k)?cf>0GtKs#E-UqoV6!_FTgEU=$W{yGDTJCVXCnNXdSj9fG$N;q3@bHcy{GK5hKjdHtN!~3oQm0lKksJ3RdaTbq!~?UAmUr za4Dn(Kik-PVe9Q`*Rgn4vRhhjX^~(d)id>K_h_P-cA^bxg?Q<*<|LB!^G-NHv9qvI zz0<>=&I*0PS*@;@R^XR3oPYU@-HV!|7qJVAcR33938ixo)q3G+ zNXz{z!}{U%LSNwQ5$s>#BvOUl%7n}paYe1eOk@q43H0&e@nSa&KY0sDj@K7Q5wQek zn8dQ(NWL;wMif$oU&&FOX-pHK_X$ErulF&Hl_W_@c%)siQ>lblo_t6ajuUFWS*~jY zqM0%{%k5GtlX9Z_6*L~6ezQHKfNW)7>=KM1;wT)=vj(6GZ$!Yf1iR>5n;iQiYKgXt z?(Cdp6bW0BZ3Nli#*K7)#$oDgxpb`U=FmTW^oTB1pDW0<4Wg4H(5ZA_Qq62L@Z3Pa|DjgpgE zZ%Y{jCDup~YWX@Exj5BGKM_18*yr>Uf zzrI7D;L0uq4Bgum0!Qbx%qrLVpf#rpMjCKJZp583xWL!E(5w5i z#K2fank~cW1F1>DZ#ez2E>*8~&?@!em@N@&@u=G%Pcf4JlV$?8h(4h^(4a+RdhUIk z>Ihpzr^k<6QGci(JLxSv z+R5LqOYlzqi_wQ>H_Lj%;G50-Q|!%r)5UlXP*Yt9)2cf6F=kJ#aCTxr3%x-cZnXpv)LZfJTm8SRiDT?OF_LB5kCl(cIB7U{8^CjKSB&n~AZMht65aj(m z)e)Y2E#%Q;Xzb~a?+5I=$~POVAEL?zCRzWGGP|58IANcKiNaG3uwo|)PdEy+YogE_ z+&VU*XGZTHe+2+U&J`X{g3dixFxU=S#ootIqnRs+H^*FIRfzxX4P=5^O&30iw45#& zx^zqz%mK*VJ4Wb+5ICw+AWQNGgvid9;g>De1;V6qnf?ABh} zdTS{Z`+cpqlG4lVy{)&jL^G(8?!GTJ_CC~1Ytb@Q4Xrd-oJ2Vb2Fn*5y@)kfKJO^d zQG+E903r>R&m}?UHdqX{Lk7z})MyMA@z#XFLQpG%Wk1r=U@-zGY_Rxum@lJ{4Oro* z=-uQoJ{L=;`i_p3rYgm0WxK$IEhGY(Ev_lv`!9mI*Lz%po+M<|lF_rRSoX~W*uRuu zPYrqhernKPw9k9o_pN@t+OHqTOkx*5SLxpcrHy5dah%TcxefYG_?0FI{dwB>Hx7i| zQV%@kuUyN0soC|r#x$$*uHEr^fGoEsQ7_#7PC!=Je01hu0hjWAw88YSzB1ScCD+0~ z*dVM+0m46_CE2co1PJar%`}hBkm5F$_r^vrs6cJ3knV>_F+m6jR|mf3Ix~$*bQ9l5WTVp@I>@P4J4=Sh7P7^NRk=Vo|4SAw}3hY zY)f_MPI{vRHT*V``{^e_!e%bHh$2FP_(q738kk3*VS)*!wItvOFXMm+N5+P$B=hhG z=jSMNfluhEDf8IGC;~JLVLHa1HuC0(OrLM=Y)zdv(%kucCxNE0CSQ{RDK=sDpr?Px zrEJN#fV!myTfFE|V;*=*il!uKQvE4O^F_0RPt}pxs$QeUdyx9t>%Bi2JAQ(uQFu>s z5k=5qz#1WFY9NZBhvfVlBn`7E1G!04aGbTL*Zg6)*ok!?eG|KK7t4qn#i#_%?IRzR z6uzXc_(=%hD!fk3MAQteG+>96qm9Ido9W8PCYO28cg38AEELW`xh!imdKkFf63cohRVA$-o9w@ttOWEw!ZThd8_J6XQJ&>YV z$yn4@O2)cHVPLlKt~xgR4QX_F!_pBdy#+W*OJ_TCiDO8%g>Qu4>aSwOtP=B(7Mk>b6NdWqRUGG6># zKx6T)dXn%pimjC6oi1Snw_6Q>YZvOPWih0aP|b znaPQ1W}jy*1$L=A723@QjVq?x&!p(JO}D3`E1%+0wp?GTfI@s<)vEQ)ZupBS8kUqx zt)-;gzJ`zncaii3H2B^R2p*W}$vyDX*cmAD-Q*&Q#srERp)nd5Lu2tJV@#U(f;Y|M zzPolAq6;RuK6hOgy`>-AGwG{GJKWZ#pYbNz&Dg|##$gBOXkX-5A87I)j`4v$NBRNi zP=_2T@@3iaJfac7A4E6_E51;HbnM*0%$nlrX>0HG)&iC3{W{1`dbKXWe$uzJ;3uul z!AEq<_)MQ|`%Js@2Ye?Cob@-f!Jok0W|S|rJ9pTx`W#2Jw9I9hi?$48wrm^7TynYP zS)DSsrUUO%8mnIKVm)MOH_GM|#(YF)`7&Q``CMmiq9`1Se`sa{#fRX%rAdxzIh-p} zXtHXak7v?}*xkpg`H2eMG_2UHeHEG^*d>PG+D3=K+d(CSC$}PHtM~oVlRGK|n{wv{ z7W^UD8ZBme@FZ^)KHOUl zsVLN$K91bUX52KK^^cf1@~ktI7VtT6yQNRRt};?m3h@xRl()^VuSFWMnUkT%eE5=e`Npq0&#s9cIj<5GV>i4 zxOlN)dI&Hz;Hvg#DYHxWCnw;u;QsVQ2UxN0PhW5pXqWrbxj}zzHys<_?e_tgNLQ%O zCqe3Vg)*2An)Tjs)M#9x#GAtvO2#IRkeRk0H}ycdMZFSf=@w;JCf+S--L=@As0?HV zSON~*B7$$DOo%_;M* z4|7VNS4BPb`IFN#^{&b3O(Ifs-cL#7IC5A_<$h0C8p=f;c(rMuz662cMoQxdKR)C2 zpm7s^t}a7T*Owwo{`e%FI;+my%^8m6$`dnpd#^{6-eYLcdjq9tfV>)|7Em_;(*}a+ z)VZk+*x8FlH6gw?Px?8$r+>Ni`9vtaHNP;OW0r=$s8Ad4k9`{uJEhoae2_*iIFMz zU`}tMw~11*ba*-g_l~J?4vOE6umVTmAW|vd`XOxLvo?k9HeYNp_1hy7sg%qO}{X{NGx~BV5c8J)8UhDtR@tQt(-AVeptvINRns%;y#JM&m;*ZR zZ*;->a|6vSs65kG?_1RE*;08wLFGZg5UcVYaTM@Nl8&mplOt#~TI2mN34FK4Gs6+m zc%MOyM&pUM)-~SK1gF$^pG8_~JVOhy8t*_08t)M4K^*Zey3}3!E7r2XTfLWc-Aek? z$n4JhYr>Dvbv?3hkfi+->eF>D%r>j*o{y#@b)5hax-PnQA6TxXp6G(Xy=m)St!+-I zR?~#uaj#aoT}^e1$|hU&Y?3=&;SK9_o5iu4*SExPUa#2C7k06e73o{0h(g~Dxm{1B zf}7YR#VB+{FC!5<(suJsU4plp$6DBKmiMS+%)WAuwXYnoGfd0%p*GkV*(`40t7fwi zTgKtN;SJcj+*CwxdECvJ8$OadEUv+pCX~W?LM}4`c`*XR8lNeR+m3bKH`sp8?W+ey zslGyv8lC@P@-sKg$)5~m#*#UR$uN3dUJ|iMA{*DyJrBnP&wBZc`b7;x_@cTKg$QK| zogXI+>x;xKA2Wpuh`{I7mk&>s>8jPN{61J;roP}-t^CYjy-WG}&eT`oCN}m`>4%>p z^?d}Y_eJD3UzvH^j9f}tK3HEOjzd*TWt68gOO+kZuvS@F5<1H zS{lv{fz;^N3Rd<3R~c)SKX_2qnpJfivz!%c4D z@JxNlRCRRI)=iZ$q))Sd%;w8wTy#}{r$8}Z2A&C2oYAVU5MI>2S{8CGxCb%tOP~tx z17N-Sa#62=Vc|`O_H5dU_U#`6h3hM+4;3J)02CF`ryGF;6b9m8E} zOrk5YBV!c`n2nA|C>JY+C|poqhR)zNHoBOtG=WNcWVY-mTn8&N%%J&6_yv#V!AiKr z6nU0S;tSnHoF&?>XA0HoWMyFU=3~c>K>)+YYNEeXKD>D(e{?f)RyNNd5++JejZ`9w zyPbjMDzMsx@0-rK@DiY9d3h8!3Run17t_pXs+nr3RIK!m<*TFIOrbhnL=#I86&x%u zQZ3Bv>#A=6L5<@!HOX7LUW99-;k~=Qj-f%IpM05m4vHfjjewAsmUGASD;RHOWg0iR z9?urW4i}2}4>Da)ED?n-t01aSHGAt6*tdd`YxrHfiixqn;D%wWx#VzUye!xXBS!Kk zOEHP2CIQTH$R6B?2lNPbzZ*nS8fHgm&Ht-OB2=b^?0hTp<3qR?rBa>7Xi?~R)V6lG zSjrvABIMCnF^e!_@V_PjP^+JqpEx=L%dOreBmr0tR5Ugr&MaibavhKPDm0|;=mUj} zR%UL4tg^mR#BBbI+D7%uBD{=^@b|^^QKb94JHVgbZKNM}6s{^v6pncJuf~_R;!*fs z;d|bn(#{h<2InKik4GrQkK&0)@guVUDSkXaDSn*05Gj8AIi>h<#UiBm@dZlp;|~@i z#gAW5iXZoOA;piAmmtND4^xUCTf33s$Hyqek1LlV#gD(E6hFq7A;piCJxKB6zf+1I z`bZ=l;X$TtB~TyLc$k6mh~dFgdR`RH-5Zl4O0Br zeG*dq_!_17@zS+O@nilvr1)_!rTB5m$w={IhEn`kc?wee_#~zHab!JG{J8#Hq;}I| ziooE<w zkK&a`@#9HK@uPATQv6tk`{zA=OjC*c(Wm0aTSeM<3zf--yjSb>?5 zw~QVXd`&zks)@&sYxW{_B|T_+Up#1y+v5k#{XKphrz}%=Ox2eVKUb$Gnd=2d4;FR| z7A6Lnmj?^qt1$=Hn0sr?xi#k68gp!oxwXceT4OG)F^ATeJ8R6DHRj41b7YOVvBsQO zV=k;Q2iBPTYRq{x=DHelT#dP{#++7TE~_zz)tI|#%vm+&sv2`tjk&4j5jzbs7uA@9 zYRo+~=A0UHO^rDQP=RG?%qcbI60{5Es4;icm@{e~vBn^CM2)!tcmO-pmGIiIOvTID$HIK-8kg2)Glw4yf#&?i$jj0zH z2IUSi>DHKHYfP;*rqmi!X^kng#?)D3%EWkqAOS5ui5h_)kY0_cu*MWv^N0ioneu8( zbv33q)C^J@WJ;?smDM~Vvq7dVq(M|QrmC7pWHmTdIODdNKA{zsLMuGKaHO!S;1%HN zBDapT;k{67Y8uA~PtPFK#n$zOV--wZW@@zj@Gqzzmt60XbBDvUsDkJRtZr`g?jy1J zb7WCFq=DKwL#hUDl?~h{8h|Q$RA{k>=AjAJVu!RA`x&KJi`{x6Qmn%Q;N0NwTqBqE%s$fu@<{|F;c9>en~0TVsGn0inZ8=B}lOr`#7aoi(RF)*rzGQ zT5PA*Vqc*YYq2uvGuC43v=;j?rC5s{T#giLu^&*1wb)^;#ePpI)?!7i#h#=TYq2+z zK4UG`O@qK%?2jnbMT#VDOejN|G4ZH6F)ZH0loUhHT5|pxG{Rc)zfp>{ze6e3 zk~z|stR=g^@bH9tR+`a=XQ~5i|Zj}NYz8C zPWEs!B}ETe3%`n5Vl8|n>0{QyKZ5`gTKH+w$E<}nKoAKn{0q{@tc5>G`k1xwJ_2<& zBvUNBlpz(oRGozP2qgu)tmQvQEwPrr>pY}b%ill^Uvz##>y#l?>r|a=y+}#XI$IGB zQ%h_`Y^CPblZg;FLX;s@n^c`_^JYqlHrYyfkXm9ZWs>X_wo)D^dxfo(41w@YFfl_P*{Vmx;Yz2Ln!1@r`Lvc8w z45?tF>LhGWQBuIhrq)ifx7f-$VE`$%vffB3wzAf0E9*W=v6a=Mt*m!wD{FzavdY@Z zdYV#fWlfX4#a7lTZDrlAt*qZtimj}VQ-}AE2^H6C%8;tpRGsYgHz_H4&88gP#VV{g zx&=*GadaDpu;M7Hs<#vxHWm)bkO~eJ3mrS`Wjmn+?y^gjhr#IH6qZ%=?m?cUEIp9BhQa}281zsRkY zw2eV3S6Ua;7tpi`>zoI7zi9UhchiC=-$y;ebznJ(R-^YVAj9=e(ZqkEZYd?G8PMed zn6IzFkG9D=OT+Wg1ccD~It|Z9IG=aF53Y8M$NxxZJ}@2x1;%3=44#I@!}~K7G-E;K z)mSX@jm4MoU5*81!B{Nni!ZMlOOuegOsdtr=dS^+amJ^Vna9?uZ zK0;PBB1!H@Xg)9&1O>+8*H|uSMUqf?#SngtdhZ!pl2DdTYt(loAVZDCA34Ti`Hd7i zPg|Nwr3OFSobbVf1_RiqcH4~oQ+%8d#{Mat3ZSlst@68Ha}fDDEEUpR2z1}XI0gysWdK~P{U)?=x%6)8mJl@#*Nu|ACN(ypg0 zot|T@yCI!zxrX!E+IWSq>qBBF^xc+2XD2inz(2LzX8f=A@j@8?t2@aHS0^At@xm1j z{I`J@_9rwS7z=^|WARfg*0;h7R9^9d-?o3{S(+CpOQdZ-OV&{#0U2s6@{Y0Su{5$$ z$bqjm9~@0+E`WP#wavI+mZ5AI7qhQj@uoVagzec`{5zt+pBW>tk`h zzLU8Biv(mS+&}EVeH&!Z-z7937z=^|WARaJ6Sg9QsJxOv%Y0+8?Hp7u_5>&kWYDrs zj>V4?kfFxnM~<;*!Y+L*p}7F=sns^)-ajV@`Z7bfO~4S&A30=CxgPc zKe>}K=oJabP`H1o1NUv$TA8~9*lLi2&KASf^vuixAnA5eM42VK6g*p2T}A5a$XL02co;`s^4P<+tG`D{K| zy?oYy$x%3zfDAPXf8ZE}(CVn%KL~xd@jsN% zWB~uva+~pgc`W`f?aNh=P@bQG^17kr@U@Q(^(%M*1dDmE6i|=wQC`+fu;;RYB zP-F2W$5=GM2R}$?E`WP#wavKq&kn-4@96B{sRU#w+&|&KeH-{-(T(v&Szs&(3XH|) z;6~qyOrr9N5B$5Bn~WDdWdR>_)Km0%3CK`maXRO-t)eFQU~@uq0o+roZN_~MdZfH` z!?^G1q%M9z0x}ftuXEtO4Sew8gysWdK~P{UuHM=jA5eK0AN(FiMx;KVES=_qN&+&} zSWG&`q6t2@GoiTv?x|Ja{&zUM+=>jM@(TBheSEMFM{^|ZDGPAFxRZSFKmsxp?%&xS z-2X{Ja{=5_tHAw}I8f9I?y0=OyexeL{c9Zbs7X&Lk%3CK`m@vn}tXhH`4E}^*q?y1!_ n6UIGuZu0fjI*N`u;>1U(mg>(O1f_d~0{h4qI5dJ&L;e33vjCh$ literal 253690 zcmeFa3!EHBaX)UM_sW)JTbA+3vc|Hp*YfEk`K_}Bk|oOsOP0~Y!ZzmE+nu}J(cbQP zcTc(l91O;Q!}2}|FB32!e-aYjkU)4D2=EI5LP8Pvm_SyQ`|J`&(7rU474@*DN??!72E^_R3PdIMJ$9n*+6a$!|`#m*Imk zzt)<5_4Fmro4$KG-(KD*oNU%78byD)eG0r$ELW{Jd2O3Qv`rMlyH!)n!aiNls%B$#mJ9l_uc&uKU zr~+wBDrXswlpwYOJp-Jco6F}S*X8xVYIy@l@_hL30{HI<@ZZJ2M)?v({-yl&@+P2S zv0k8^YpPZYR6O)lt8BTF1yvSiDX;N#Iv2)3v0CvsZ^WAA7scT|XywLi9PZILTsAS> zUez2gS89_3g;Ggq_ToydFS*Fu zNNEdcZ-&Y?i+=EBXIr|WpesnFU+yls~aZoP7F z>owkGTen?Bqd(27vd_z}h4C|;zBgY5^Yq*a2xw)!1cG`ssZjgIJwAsA7y*OcZiFJQ zRrg>}jMN)r-r=K1yh5$y?K^nHYc&eBCO#Fz1)mQWs)bq+20zJf#_Cf-emfBUwoF1U zKL`r3(8}-Shl?=c2fYJeR8#?+M?C=j;zYI3@cd%ERv(-4#_QEe5oTAfQuA)OVc)@B z#9K#Y6(8>hg5H~*kHuC#uGv|bXqD@Y!M)Hc#k#kL!G3OMrPc(?1`H?Y&i#I+k7@rK{@8z+2bg?%4td4$)}e(qe%-iFxG zY6JnF%H;wk5*oT>@Rt|2&r9w>5|-;VQ;5GzC&co9m4AU&(_>0v<^N`OE>OIjQ5+(- z{9Uq_wZ1pn4pxA_ld1V&IhK%prYKlcuT`fsSqbw1ggNflN-)(8O@a>*ec_b$l1h#F zDN4?w>{;z)cW__k&S{hE3xNpTTt}O&ecFkNf3gTO>t?9#_;ev;@CO?i<-rC^S^d@a zQlPUnHIAxEHBN)G=Yw-IR;bjb+Y6hm(sX+TJn<*Takg$v-_KrX6&j;{Yr1{W5Vv8- z(b*DXIJ6f-9hK5_`Md2Utp4IOICIPq#K94)=M?w3C|(3~G^X2&%B`^~EBJU;kOmf? zIFv11{<`#N@S|{J+KWdj=#bstULs84_WDG12Zxc(5inb|myJwRtK2R8E-LA_K}EjF z6-%iIA69^KE!~eMmoKl`1#7P_fKNK;4YCFXpIILcz?*(18(;bIS?#6bccm8UQMoU; z9oc7&DQ7)64<1OPW0kE|^w_JF7Fgp|O-BPCYeHB2to9O4glZDBv@fW@3t>&nw-+&8 zZ$EB)3g^2i@Gro!nf7%x!~Pw`+WUf{r4Id7O(TWGb#)9{P&}fI;2Mcu3=ZM%Km}(T zl?|1dbd}hW8W`-t_i+%MEHrA<_e(`wHy%Zhk)P40yO3)DcE?(<@Y~U{E$IMX#>F9gIGLw$#tNyp_pNKPi4_~fuFsR31&5Lh5x_O5t0o_M_d(9;8R!!Yxx|lW!_N+GK)tSMBW1Qjk5&*5nc}CZ!iE43vK{vy%4qmgLlH4(hL;ege4f<0>9lK zJQeK7w%%%ZA*^fppb2%Pwe(K4)L>UWvaJpM>x1GU{R{4e=7ZnhKQF+4un&U! z;2&wP1~0-#Xw(HShJSQ>Zk|j^42!V)(%5vH;5}i}oq``jHeGx2M!$wuJPR6XmK<4Q zxh5=BNyDe%k3($M8)?+XgoQ-!`OO@xmU)%d#Z7OtUS~E`xp2Z~wjS7UCm_02@*p7T z0bn#ByhYCcvu2urNA7ujS`y^s9bAsG=?k_A5fM-(FNvXTGM{up>)=l9lkL0mmw2fI zZ_I?@W*@}sU>N|{WC!ftd&oi=fIzLjvK0{VAk+Ki0r(?*EWDLqDxGVZN&~y{mD-7+ zQl$XFn@hOiWLggkWON!nN#$df!>y?`FJw6!k_G3N+>W--U_mxq;{g@%8`TO#OH|OR zom0Z%a{d7MG=lb7%*1dRC( zO3LvNd=Lrk3*Im3b$KSpAx494#u7Xl^d3<-X-r{%9tDF5+Oo+;3#W!Qm$a8qpqRz~ zmO|W+hm)6ZWPy+%P9*GE@Haq7dugrCH({W0R{jR-hCU7;L^du=bc})5&lUz=KhH4` z=*xkRl&=eXQ_>860VR8eZ)+Duxk$vfGc5(?4Zd9;k8i78bldSw^+N>T zz6JfF@Qr`#9^bYgodVw;!Jg*<38e&y_;&v8LKXLBz?Mmfq{Et3lkL-j1pxfm!X0p8 z;HP*~;nyA@3NYn*{KM!;i(lViy33s9CyByIV@AU-8}IS>6?_pIViAqt%lL_4EBFe0 z3+{xbgTIAOHmu?#c7s*dLOil_wAz}mCwdIB`L0ae#jm~!f)&Mj`e#t^m~W; zy#rQ{$q{dDrq&9Y5(Q$^Wx@7~=7YD%WXl{012axDBqUr)12-1jMxzQo$x*{x$`=BU zNg7Wg5h(F|_PU8m3y#U!kA-TVo`KqLkhR|ss{O$ksQr+v{ZOd(_sl@;2W0IBLbZRq zliK6w7wRT~&PsEG=Rrd~L+7tqxJX3jzqb^aGju*9I@`qK^WVBCx8t+wi3mOiP@}?U z{;hj_{u$CK@VN?~1wJb^u;6pTmVR>AY*odpV=~;Gz9=5<1V(i1mhJBx=(2?-VcX@r z4ow1mF1IYK{~$XyU*$sqNx8#x!T!)JmWQ59XK>L3C7|^}S#W+hV?tVnGsaibRD#bgU!9N$kcE+J0!Z z&;iWKd5sQ0p9>uxAF_@Pv5>QU(JFW!S{fo^7dE8-Ahj~mlqx{tEwbSJ00|*910*0Y z&6e`mNHzT;{TJNpDqfU>mHA&E0v?kF8i_>sU++u#x&S35!Qj0p%wB=g-&n{>1f?%p z3h498oUTG0iU*~?a?x!ECDjiRPmHPTgmel}dH_BPP*O^e2ukN^QM$r# zvtETG&RV#RP|5Y0)b!xjNJ3xmD@jROSb7td;IQ#k(20Z14ibD_yiUXz>&W9Km66ivvzA!S~#-V8{u=+2L!#X)O;YX>JZ2ld9 zuIgX>VBy#lB^ zEMz4D)YB{l<_w@tk0^XRLLGGxZbvB95fOyC5NcEi#lLlrP%WfWAk@Y1Ss;|sf<%Pc zvb#`}3rQA;!t(`iJOs8Zmi#d|uR#+)=5lf{1otD6eZh+)t!XjrA}ql%>;d9f!D=yL&B*tNPn!L@2HfC`0Yb$bZB zKAc(?X_gkA)dyw4`Qcd!nVHx{4ij?UfoJvCz+=)lBasNt>hmdI7r>+e*(>1s zzJ;tr;QAL!fjI-NaJcXGc-;E7i*7q^seXvy*1MrbgNq*LJ5`{1*{Eu{pB zxV7;Jqy?yY;|)l@RBUebjMY7S=1g zEchrjlX+QtQmZA+$^xi%%7XL5%Oc^KNVP%}j>Xf8{0yVpcxDRg81S4l1W7~!xDKa$ zT>zJoXmALH+biI@%R*KnaMdgY<_x&P9vAd`?9TM#F2e1|r8**lT!T=fLN5NTd*u3E zq*EZ*4)`pPOKCwOa!qM5L2bJprie2(@)>Sd?tqWy@7a+qdFEdnlV@AnvH0+9xx7Cx zI$)Ia{IN=tZ4Q(>+~<%2IY5KoN5S<44@mi?^#ZTM5*%mWAPOf9at&u~ebp(>{y8)q zi?f`>Zg6({;{^4Ob+eaHPtyhU6yGZJZmf-qVAs$OKpNi7fhWUhAAe;DJxVh7IkvC z65phTGFR}n)apsIwScUnvS53@i7y0Od>k9F)m|V6H+(WBQU%76#v92&pjJ8M>jJfu z*n&}%V6RZ?g%+|BQR`kyfjL91H8v%WN3MHZwA+zO^+g1^4nmCzx%jv4k?Z%7PT}$$ zg3kiElp-V|*TuGAme!qmDwg1w z^=?r(X$)zYWs^gvnDs?yIu^4yiGW%0wQFSAlKaFL3~#U(ISl!6vTsM0D<9oArX~Mw-lH&REpEx*iht37xi{rQoRwur5{4?C|u&-I>aSPX|@@O6rl8D zIW#mqh=S4#=CR!gt?TZQku9%n&0}k(G`k5a;3I?byqbgJfTa_%r8L`Tsll#<)|6() zptv=q*>&&(PicmIkUFK=Je#!GX>IIA2ePsRC8O}3uoHIRM{tbwbhYg#vugvqla*GP zlEWTm$zd@a>_F}oSg7?TJ@#i`tuz7mqD*-#M@zk0AD!|b1@Xk#IJ=Wb=)}xbD77jW zN6Pzxnqa_|D6TLLl-(?pUwNJMs3Cw53AAsI0PvVQ42g7!3t z$=2BoBS=uT$L8AyPlNmf6o(EcCVO>i%?#NAFP8=9rTjvU{T^mDh8%nT5SDZo>L3CygU0 zM#t1`a!Bt*n^{?wEVnuLY{p+FNbDvcy(?P=F->{91u@7xWt;(-uOKEeWF>j`7sr6u z_4z&h7^dQhHb=qaOb~si25rNY)p+*I#{9E^MT1PqsoUVn>0#21OB*JNmbY)^3 zrFc_8=nIgLzTo+ip0p5p7M9=;`dm>sX{>4xYU4eA6omuPCWJl!O-JM70zx^7T|wxc zOzXKb2%%sW{Z>FI(1{aS5`>wulP?c`t9JR`Xd5ve+)G$aO2;)2e-$NP62Lz3ZDhIDP>3mw*lkYEG;p0Gq(qp zgKyPSQs1RgQfDnDM?|nP$6)VN{F7-b)1M%39QKxr!bzh_gFTy6I)%N9q3KxI<0N(k zd)bnl%^>WBlb+32&oM>vGd+obCZPd)60~3wW}gs_P&fs`2p9P31Wk>`uS9&yoVy@Su z#s_DvU@&$%{>kJOy%%ZcFt$<@P8u~DjM=#E6vq0Y=~x)!Bz6U3hvzC7c=)#@7zlKB z8Vo$Ff`Qh>wDtn1T)0PvL+duXQ|l{D*TOw|k}NpCkW9!iE*8j_vbtF4x)u0N8lNO4 zfog|RzAjKrNi}#X3bl1?C;99gdF$1}^&TsHXZOf@<5LMulqpTlc7T zKhh~s?K=1@P)#XABC74$2Y2-}#(YRt14%)RSm3@Io@~^1lr&jto1=Poa8!i{XP_p9 zjc-Oq`hqt}e$u*l*J25djjtDllg6HgjW*eJij98;O~+y*C$TGR%$A*P23@>xwzm1| z;-$#ic0r7bcRTJiVY!>^Ufy3|h9!ZG;S6qHO0BOn=?iT9D_L-UVWTyZ+j1$Otb0tp z4QwV2N0N$w!iU-GCiIf$D7t{Y%Bh1nl8<)MPW)gevIOL+&I-PP{njhUU3zL%T8WUm z$Wmb5L2g3QxCJiy?U1YbBLcaff&NjD%fEFGxgOFfAop{q0nB~VlpzsvH|dbeF%>iL zG=>m;0bKXMe>nf-#ry-|k}O5!NC>V3G66&{$3K}I%+E5dW(PC2io!{wRs&I+G~&lq z@@|uxq3Ku<c?9=h9lb)P*Ffdr86gpwUS%mTXUG(zx3MP(UhX2^4oj*tBCu3}8Wk+@ zZymxC9m9MV5-Bk0ID8hEq|_jaNi%p1^C8(H=QZ;&%)iD8__(ki!~7ERH*9X)&UOs* zuPim#bjI14DAI+$clnbauhS;=^|h>3>5k_ zPjV44hK=lXGsd9r>m_4No<6!O)ZP`Hv={Gu5P2fjpt>zMAA7J@7TwJjE)p%en=A!% zG0*CvwVu>W8QL&RV{N)8yU4fObgDZdHeC*CR5l&|)}c)oFhhc!3LQl{g;{qRd=_S% z(uJs5r=1Gb7o%lbUpPqD@@vgXOXe_hy(R}(@EjzeFL;)u#O0tM?U1@4I2B9qxco^` zIBAe-zPpX<_~8@w-OU3muYsncAq569L}E8_`JJ8Z1Z;kUz1{_EexZ~0 z;>SIaCty?cTkv6Ix>vCIJqs6!u=$9kz=HE&cVb9hsA}tdy3ZcIjtKyrF9W7 zx>C{_Kh!nbz}B_#1(R)qL1;SGHsIpy$~Ne1TXxsBL3mU4Jhcr{?8)9>_ozGGlKs@w zib~)jjDiEQ;Jh*lda)zB2&`tX3Wid?E>KztGI$2cv{xv7w}q@klzx__zK&(5rw$~JZy%S03 z3;sw_lGeH1hb1`J{-G$GG-xycvvJ)ifPDs}_I`i$HR^Ax~< zOjk(Qw&U!`?tvqY&De=<+c#1xYY4>tQ5Kw6AST3U#)DNnw(HHBEKqdg)<@hI)SNV5L zsrkk*Q8;NZX+UR_MyEh`Gc+9wbezPlfUdLM)m;N!cyIMQ1-cYlt8K{`0O)SdAGKy4 zO4?EFr`A!LxrLKfkOk)zzF9X^FF4A^vl&el4>1$%(a@6PN#HGM+>s~*h&5BbEzw2+kuVlT54m~SAKu)FysF7oXlrn(~nVs}7|3dH!g?m_I2kxl_(&w$SY z#FQ>1g4kNz-7L-%sRKiDxjyb^1x}y9Ci{Yq$(GZ4VRvE)?uC6s6iyl>8aUaw>=c~7 z22IC;6DJYCDZX}%EZa7|_=4f+rm<`J`&O!EWY_Xd#X_|>QHA4ULq$lnUns&>_R6#T zQWkGf?Hbydde=})vmtLW%YJ4(bzV&Ec^iPW&yIPUthCtQrPi~ZE58z2n|W`~f6IdH z-<#`QQn8|7FfsyLn=X0Y^xf0>@?zi_*CN;BmksdYeE9DI_)pAW1Y!b}6puk}bq`Ug z4=N8&8;PiNwxxj1$E*lWuXIsvpYv5uMCSZwLXB$9=ij=V^WTF+iaEaspM^)Fbigv_znaX9_U(L2 zy4R|E5)$En<;aNN@M}dMHg?Uj{ zpmB0`pb>7kH&&&TpD|x1cA(G&jryHYe5RPp?+117_w4sU3p9k94Ro9gg{OX=T0sd8 z1Umjq7My27G|_RXkP#C@-i+EU!rw?f{EHmG%*k7JdM1Qi#9lYr2x@rCqS(e6zI}Ra zC)LM~XzCyVz^a3Sh0svX0CI_%i|sz#@7HUs3M4_Ok0|`b0R{N0{}zVd-Zdb{Zg3}v z0KoSS{F7`{~#2j8cO!YRSmCh7R08jk;&KIsW)Iu?96iQRzj)p&>aC0;(QgQ)_3 z{b`E~Kojwxd+%KPql`Ki;I7t8b0#qXAx5fzg{&$*zq8L$2^oOAG_?lO;wN|`veqka@SRY3c*G`x(K{>!<_wHhnkp9$L~nOdZ3iON3lSi?7iv^M z#J_b3M4v$-1rWUuJ_}D!^?xD|?LOqUCK|OSxO^wzRz%+$o&rbkM5R=zjpFBR9(sP@ z_Kkrj*usaE+6a4AE7ZIbh3bUgB-?IA>XIWn_&PGv7yP5-DXnjJAC}NkdtgO23 zX}+CJex1V0zeCfp@WM~eRcU4BF_8rW$2T_5{WvM|%HWUjryknA%e(T#GWPSPD z`n_Y;nB#K!4(XQmL~00k9?l?@cd18c?q4Jew(p;7q}14DQ?|Y)1VKd*lR(9)wpbLr zcpnQSwL3YydD-&cmY>IP5GOgweo*6?M_dOv4`QsHd@Me(Q3J> zHQ&B)tX`U^`kND{{pt3F{P)cx6SYzS?@TUKH`mAg21`}b+{`PP_K7iie?WVGNWJfg z_Y1UwjeWbk+*e*9xZeagy&6v8Q;P+66 z`hwR;RdRs@61Wmdyh@fRBaM#-8aquKv({uF&t(GXVAhyj!Wj&KtfHfRBr8hs3J1og z221r~6Am4Ya{4YyQep&LsSH4SZq#vHX?4l45S( z(TfRBiiHKH{zt;hN>g~GK;g$yEtvDMDl?0Zfifr-gOykTGjEM}*AnVGuEq4#YZP6AtzxQ5E%AB63y!YOM#g(uh$N7 zv~6zT9lfQ>?1}02;)Xv`DNP3(pz&Da`BE2UcH>z|nhybGkOjX0Jy*sv|7J0sPczhV zIyej+P+k(SL`X<68Ox8!VWa6()L7OtI;_1O*7KW#-XNP$2A^3U4*X*4nN0KZ(5*|w z@2XeTBhccfL+jj%Az`;THdC|gQ}@DqX!}7=-i9Ax0jCQax4$qxUY#1^ zV@g}~;19%{tAbDG8(J-X9?xSG;};9byA&*Ex7vT%_I{NJ|}(7UmlxS9+2+h*uI3pe2sjy$j~=ir*Bo7H$kI zc%?$CFw%f1P!4q!HXLmAc0AGBS1b9G^kf@8Db}kKV>Rg#&q!TzSOjMSV*pZT;h#*q z3|@y);0SkyD4aA^sMuU!lVAKGOAZ%qg{Gt7LWXDS0#0H#%RpD){>`CUeW*S%)U4yK z5{O&40r(Ot0Nd({2jcNw0k0pL+?C ztN;u)VWC}Za+vvwNhM=& z^|z@tj3#UWS6`9^+p{XC5J+jRVF;wOUm%2KcN)J3Oe75t;#q*ycT&DCKuU=y_%=$b zS0MEp3t5RE^(#vOW1?RQk13TAQRa9=ddx+r9g&paBZ%~Qs8Jyj|CSw*9)FfXq%S~?0+CcNCnA!! zyI!qAfK~cfBaQl)?q$)ib-ySFbFdjm0>ro!|73EG{tD^mh>;hClZJ$b7&gv3MU1`B zbSz?U61zc+Z8#@#a8C^!7sUdHQBgd8jP)8nLUg!bWQR8LjG}qz-=p(bWy>M`xYCUx zYc+QqX-xQ5s5w0%R#IKdFH%<-@Z6bNQE3tuz;l}{*q#dkoA`4<3du2%gib=8X(>md zv;JlZZyaQhG)PHg0=KH{brT;~n%zr{haa2m{!SnvO( z;^k{B1!fH|A0Ibr<6-kvE_&^-spKDl&BIWmf=&J{J8Zre=@O3It?*gErt0h{Z0gID z_wS};I^cpA{k2&77?vwdpNhv=h^OhCgv3EoP|BlrB_Y?7iR z{#7pVzwK1wnA~4UJbu2^Y%kmJi7%KOn0^%Kj7nuJgqF9V(bVFjRvD6{}gbD)cUCedM`RL1t1dT1!)^Ys3@q z3X|#-S+G6(vNH{;C0s0wW7A;Ke?f;{yl9HxY~Un=VRUB7*M)(ibGg>lQS(Gw zIDOGBExrtU=3xtJ3k`{rW!O56!4xzj_>ATi8gRVM$9=_Rc%=$ktV{m5U&EtzIlxK8 zJDeP_1b*hBEVO2%+rVpVVcmecysmNB4eFO@vY0pY$PpS0fq(((?!-TtVido^-r$zW z?V@nfDA#b(){mXy5T)nl&C?XZbV`WcWXbT-KwB%dvn*))e zWZg6M&IiUO+0!F$(;%??BGr*$=F3y-VhA%|A`A953}Io7!H#h-u*>;cHC6*kKpEgP@}?4 z{w+Ih{yowqaP!6RS-AD8vlDT1pKX1XyP4oZqIjbIci6=@7iMR$MmbpoKSsv-f*(r$ zTsAgJ1XpBVge5q3eNPll8fzMM*<{%%b}c+R0lPSf-C)lS;r4;~bD=I_rg|P2pvoB@4Dkd+DJX z>_o9*xs(QD)^xH$KZ2j7Ju&6b59}lQZ*2Vk@IS%o3^?D3-VlGTb)FT)V<*;jv6nNBY#oPYlJ!frG;w>NA6z9olOcC? zRPfM-_-0*vfW2Q#QZ#AH@8&Fh#^XtaGS1Q~Wx-jLnYqYtUb0vi=jMiu;FAl1U4ATY z!GX}})F%K(8D{76+3Tj=eVWlrB>K=(vjZ;czSUE8WuQjQhi02QJ83h1HX!^KIHWWq z@Svfd;n3|CE)sF*n5Dq1;m}H9kkPP=1)d`=D(%3dq#gmDWl*C69{w#m@HCMw0X!?< zvj85|#TMXE3F^1r(x?}GSlEDV8QRHWwnu|K@Yp&k?CB8OIY^JQ7nHglyco&s3tlLx zb)p4xn%Q1Wr7_fQ^ar!;A9T`o`~*Yd5zwquCipBg)H7&a za89(>5~2Cm4z_!G%#Lqr?kAwc54BHQLSRyYo5-GuFWuzLYEDEN?$Yl}G)U zXIan}iFz8=K@( zG(@^wfYPdnw?%robYoE9vP0;IyHD{}niF<&T4A#VR*z2Y>p)I6|K!Wzf6#2_KX)S(W zQojf+SN#$^8@q^EWj#1M{|*ZmiCF%2OMzK)vuSBf*QQt;f6zs#9mkdABRF1!8WoQ7 zZ`pDDA*4&-_y~L!IIg-misRZ2#%qvwb~u9eDT@7vID+uXH^gk*kH~FQHO0^ z|AT)(vipLsO6t?P-aeM#p#2q5IBCRcFlUog{Afysxt~JQu`tI;1elAjT_eku$S=NN zm@FeZ^#59^Vi|?kg;g;hlZ}{?if-n;A58#lCLN{p%!vt~F`05g!sqoO6psew(}(C{ zqj2VD3fSXY(U+uVwOzIK1-U*NGHH|!lS40+C0KH35BTYHVfZ|aS&a>qB>G%4Nwmps z$Y4=)wM$tSCd`WCl17_vMUzKgpe2vq+o*Uq*H3ttUFmJRY;fDDZsi?h#T-0zS8y@0`Nk-jG6^g^7oWsMNa){}uH4ZzSxHf}nP$>=-N+k>ggNeZB zDca;`P85)wni8^@KMcrP;-|9OY)oZ3AubnewIn(Zq2B^sn_X7Pq$%Zph*=uHaX-sW zW-i#t)IBUr{W2z(Zpu>aIT4(>M}N5#74fb;G1+~gB-}NzlV>A5PQ`I>AJ!3#H!o)0 z#3%^4fD2?a89tfxybkJ0G9`%$5lWtBuba-_;|lWLQ~YSw|A(E_A8!c~Il|qu3Z)0` z-X|?wB)WSavlN&qckjG#j&F1Psa)SL1|nkJypOmjw7Ypq;$ho57=s#>o5#Od+`O}_ zwxF5w8!0DWZyY`gUr#B1)YsEvwrh5kN=-63!fU7YAEnj?k79d$!B1qfu7Qe#;`(SE zOK>OchoZ1yBdjWTgP4wOd}^T3XcVSsu82HWwEU9O@>r*|ECEKWw44s1>p_oG11I)0 zYAnAfdX}$avRR6MGDV$*Y?c}H#1C`LQ?zw|e8I4%xQqh#)4^BZQn6qoP#$$*nV~=( z*iEEX;Op2#wUy3Zup1IuHSq>ReHIM{WXOH1cpryB#yuE_U^Mi5$Kg)#oaFPk z|^nitnL{sPumIAYG3Oxmgh&6?N&qbl#6jBn8m_l2i zMr8`|ZylOKNI988m%(RY3aLSyYzm!u3y;54YAwHU0&|trYowyq-{hDG{t8>`3qCI! zbxk>B2yMd>+z|RpQP?nqu7+GYV}&U=+0XLmRK^MoyroMK=)pZ?kc6jDtW@D5uPOL| zWDgMC9hX51sOc3(gvEr?gj<;C>xQump4t;knM~S5MOg8ZdFgjFvB-(q0pK zX{gfj$Fw)wy9G`UI$U(YDJ|5zp~qGFzast->HrIIVL4+ zZ4n66sC}hbJBc&=SV`$WxRibdf0E{PwAOx#udWM3*Q1^H6IKf7$SJNhUb$4X6`IRC zV3t_usI201$+=9^7r`F~pUlwLm|Wm468wfsk;@}~K1V73C?du0Gbsi?hCifF?H$Kk zgWd=ng>2AlwzT@Mh1(06FhiyA-gOZ^KRoI?X#Uti0#UA%t9(!?s zQm^pPe4Iv5?IhskvOQ(j1c$lYo|-}krbgfb(*ag0StFj<9dAT@x78?3DRGX6-5l$h zg6s~ti;$*p$z;(KY#>fk4uRP|hya^|516eCCJd%4DmOf?d>aT1_)^4Ganzkkvx%!U zl^Uegge4n*IO`;`jG7^#s|QMa&*$R1Cxt9bg*hDtT0cWDIST7nX6Dq;niFU zuXIa6S0WU_%iKjsiMX_~C=oWGlqk96cX3)$Mv%mQ44?S&O z8O!+TH!%O?M4_54LPf_L%pmiCSygx)JkgFBK|BZOQLuOJ{W5 zQsO~Ruj}e%+DZ|?vuCl~JOl0UU0NhBN)Tp>>)KA*iJ!WuA4Rmys(n3(wjH%_kr-_| zWGOJ~(YF7D0T~-@JLsa&9&J++k3`$P4$Y}(8~@f}v<)ezXxqa$tuQ-6n_-fpZO0D# z;{|ZUU`rE^#z6YYDN1pv1#1jb8xv{r)1F|3k9m+Ivyf|!`$e?VMOjkyp4BhMPVju_ z9}!Me@+R8TeRf)=qK`KUU&-6Bo}L;Ey9z zL?JOD7hH;cEi0AmzYKQCAf&bGrV7RBpK?y$>E@LAD1uGgcl8c;5%N*EMB=AiEhwhR z@zq?8MmXeZfugXijh?O?K%@+wKQQWT+_n*es2l0w(6)`N%R^cr5m+FZ{4S-#Y?uF& zf=}VZ3gR&?`j@N}#zonUv+BSQMNA7vkwny%H03{6{m8{{J7CQQWIgvkh^P}t6a^UL+?jodLT-aIk3%kgs zUt12CyEk$oadBZ}1oH2}nLn85aq?k7HM&VJq*st#gBCZ#c{Y}vmvutP0ilanso-lM z5Q?d`S7`1wHD^3C^=WO2hJ`+1Yf7J%yYy*88VP|GIp3262bUlPeZj?UnsuGQDC&jo zBBV21s9AIdyTYb3PvQ3!AqBVQ%ycTSu#1&4wP_(xPFlo1%g$g^;NcVv3GKn!mG-P~Y0qUHiVGC# zs?01ovvr6L6L&H2z-F~Qrg_P*e)ZhG`iUj;?p>@Gr`&IOdE(^0Iv)00byfb1($faA;H9jKMe^s+c7 zrNwP;-lgvi#9i-br+}YQEY=(BTn8*UGh3TGD)19IJYb6JM!1LeId%U`SF1Yj|M1TH z9RBIVZ8<}eN6Of*%|DFqB3JD95uiLa_RCGUZeqXN&EVXSUmJzHf76A4DLZFk2w2n@ z9|?Ze97KX8QLcdSb$0PU44Ap2N-o>e9+~Z3IRovffh6109+~a! z?xel=Ihn*Sg1S~M=|NEUP74=_LEYOe1!g^{n*$b)4|hn2lmas1$iYMGx@^Mj zM{J*7)5i;v!D8a(>3|2@Az=qs6;G@{)N(>)8^XkY-1g$Jg%gG9gx`eW4~y!m5m60| zp5GR7<;V_x7y1XxuNUK=Ot#z4urqnc`94t?d;(`k`NEh`4s;*h{oU|uMcPJbMvD{T zHxHnW4HwEu$=rpzB&fzn*6Ud*(_J!RHNr(Ro=L$mOnhgGhK2itt%3U_+F#~!pUxES zlP(rgGV5=Wu;Am^QeW^cM)=>xbWg=KAjD;g ztsLCe*@7Ln{4Q1;YI4sM{8IEAH5~3Z{K@Nqfr{IiVY4o{NjW$vtnFq-$#64%h3|+`bVHuOr8u-6vt|J3|HTOv6i+7QbkgPP7@m zxLogG+w(9xn_2}Mn5;G@tvmJ>VdK;_{EHMOn_QNAS!XreLbjNdGH10#$e?VBeKDIl zJ4I7s9>e<8Jhs|3kKNHju@Xl;Z9@tw*o2%zb`ZC$bOm1xMV{a;LJH2iFN=a>r^hMy zbI_P41+Rn^9Die0jW^P$ z5tq_^_@@(N`y610=rgwZo;3Ng1JkAd4Yv*FvDKC()Jnlnur+HOT{9aD+yE~jzGvCsT;zRPQR9Kf!7KSf@0fA4l_(Mka@n$;M+<%(^e~6IFE<3~mXdjQHug9>wby zIj>*nl-CR5c)i}A9EZb|gC6_agwq^MnFhT41l+I;5Ddo+;h=}ttc;E0*)h!d&JSRc zv%>@4u#`3vRVj|Y!8!hVryM^aj^hi(Vir%kK~WmHrp1j6>cVs{E2@9Qss2HyR9|9H zoeU4+It5z{E54v>;puVbCoDX1$GMw@r)$`%ks14MrdxN~WX%*aV5=~G*=cH4mYwW0 zxmKNEqXMLL49kY+^cCCL#DN5UHi0i>_h`N89MFSw7J?XBkf>D3JsgV;#}OCU(`mcGQIRwcf>yPIH~foyU0)8cPa6(rSlTY`TiQ zZZ0;-jgBJjD8HMcd2;tHX$LAqTiO$|wOhMyE!B>fQYY=i&$}dUvAAT_iXJR3{f>o; z#Kom&TMEqj;?gD{B6e|U(nXbaYtLqHP^q<^CD89nQA3v*Vi#l4T{TXY(jI19L78LjW za~Mvvy8WbWv`-z^T;(z#1=88!P^%hBh)jmeU#1X&sf@Tj_zTXLvA^4KK4AGqx7G_~ z#M+fII@bet&wvO?CugKCrJCmg(;%)sH}AS?qJ+n*~+rrNc(&z&P z#qHrJU3K>7Bm}$hiXrVZ6I;h&+bQw>oo1`vu&+{UhLp>+x+VqprdHx&*%ho*Xo^hU zC%!jDLqaRDcBPfhed1SiA~#aQ&I&8NyA5gW3y!(D)AbHzc*I?V^p1-=i{4=aaeB9l zJCOpFArNFoW$_jUf>6Mk5n`PMQyJJ3DR?%u4L4Wc#Y%;=Eg6vSP0^6hHmqG~+e#N8 zU*3VhNZC3nt90$PNNHa%?dDC_HI(2h-9<>(xUjS68aAMGExDvv-XIfF%H3Sv$cKy` zw%4Kn`=Cbn9&~9Il3>#pP}2Mmm*xlXPo`xMVRf7dY!e?T_lw)SgLrwl!ggN<%47G7 zb0WJ5+x4^XNzFf*E>vf~;Dd+ippy9T+}P}e=NKKXklbd;H^gJW3-e1uVvEo0Wd!+t zYNga8agWGS?YR)D8GTzuVx%#u9>_7sqHI5xRJ(jpil>Mz-HP4dKe3Kzl|q#Kzn9xG1#8+mys3@wSJdITdf?-#U!9 zA>|mB`ZfUYw{YMy^w#EpTNkLq&@jcY)T=5X*i4@7NCmR(usLF_`Ynk zfN9%ZGe>)}@jRRiSwRwSws^|-Wy41bC&-}P9JDOQTW}J(6a+Sbe=?an|BNE$k-vs0 zoF?)&%I8oCo`bNht5zyB2lhbF4z3m&^K-lS^|irLZH?p)jF+qpg^~jbx_h zJKLrSJ;j?!gl#Uu--SOZql!Xym=fcKtWUJL$d4cyCRYiz6C9=F9`=836$Y=6TTZtTGEE%eLk-6rh&|8NTKgik9- z#$*8>2oO>7CtVv2ELYP-9?jod5T+CVY2^&CtvPJB68rd9bbxQl)eFuM{ksN`_m`|DBZz1x}K~bc-%@Pi{h~uy&FR)sb#padk?>vaBGkQ{$1L58 z4XEx-E-9j7WM0WZWk$u;Ljq8+knrj5S@+sNe}c$UWNQ_rBE1s7DsxB}=vEN{D83@l;)GG(gRVavU;a z`602{~!ZRCS8; zJ)HCFJLMcN*0OQ_wA~Qag@e4TD@F<%V13m1MJRa*D1PaZe(xkyKggX-_oh(FE%vay}9<< z671p8a=qsClUgS$t+I&Tfikl+*itcTqt<{yf}!FAPf3Of#$`ohKulnmw6MTRneith zpy>{BHd8b#;!)TdxXz+|XKu(%>7_;XPnIG|EnbLp^#w0*bHV}?n*5&UE?V47Z}c?-bqMe3sYbKfP#BwDS)2G*+_dC(i!2=ewChG zPR_;p7=}#oXM1{-1nc&}6v8o85;Hu$nRDDt-2FW%8Wt*vttpi}-4!Aooh4C|KF?Zv zYA}2nCDIo>ehtR&q`M}zr=iwz$_{*@B| z{=x_;0v5wyz}OsvV*%UR0Kmb)&f1nd`x-zBH|tv|*f-T3(++%tl`?1G#f%Tq0r5@t z5c8HFP0^T8acn`UxHBuole!cik==DYlHuT#ifqEfJ|ny><=@5ye<;%lqaBNh$8VFB{Pr9>^%I_iF<=NB#7FSnC-lG(%u$wq+Ssy+9<=p)+MW*SLSg$v2@X{~eF(-o zq$?CH2$RbUq|&?QtFpV(R^1ou&7=@$Bkq{}2@ffkhd5q1d*Io*4QUh;Vz{{13 z29=6`!Bd{|f5~)vBmZP}q$z<=3|Z0G9`7uMY*s%oJ~ddX7ttr4-nOf}ZC4I%+d8;yyLZ{vZP(=X_|0OYGLBbuLXZHHcTZtk zhmRg%U{q`3qBW$m@Zqu|NN0!6t<)IY)5L=cTyrY5+`fZHXy%=(=A||UBd9Wvn_p^< zE2N8q2@WyNQRit&ZuH~k!;pH)XT1Y)Dz^n%} z&sa)HZGua!nN?~*152EH6MCmK5DY$U-C3AumFtZ`*ws}l*1bJ-jH%>y;`S{Tbbz0{ zU5x+^PCy=>o9eimKerQ7E7H=>;C>&^<#|VIU{*CCiZ$i!KCqt{?p5_lGWT-HJg-y9 z;Px&}GM!FegAl5z!@ayd&Rs(=1{0RV%sB!kwf=-DWFTB|{Pgy`*`D4kw7HhdHig;A z-`ejT?e}i$_h9L^G*oY3&UXA8T|*NnEzsAL;s9w}@=H>0n5F#o)JmhTr@d8{YR?ym zo9k<M1L^l@d3%1Yf`3#9{%#Y$;9_z?6!>@wnN7oGNHL?!pgGU6MdIkk+)zgdy0)t}g!atc}6%U{) z@uk=&io%BB`#WMD^>(mbZsT<@T``%SSSTc=X-@E*;Ih{teLq?!P>d}@!-av(fp8(A zJyQ^0htkY^9+nRFw`oeaK8dg!yd*-F;Lf> zD3-kftc&AqJ+LOoOfvYVmgAvTd`H-9gx)==TaM}AN60N)m@Jug4QmlA4W_UJH-5e= z3LD1Hx?6-zd<(=}CSXU|#c0Pc14wQzTOWSsk$YaRy``x91*h`ool?07ShQ04lHEhc z4j$Yy=v{erZuihFNB7?XAGhPj{kskide>YDA8%wIw_gPxcOSU<$e_1v>sI)D_{a_W z@$=>Q_MsaN;Aeb&*Z!mIGgi3&_9IZ?wyjv>?t{1B=WW~I^TC_<;yc^0?Cyg%LrdGP z*iJn@uV_+zusF{&Wg-5_WF`wuLF3KZ2YsXkhhd*cz0tf_>d7F98W>i@He;Ropio^8kKff=xUIc~mo4zS7Mq0=uyRPk z>7b;N)d?=ER#sUBO)PQlO}Iy$l*r)6u{w)$MD{h^a4E&d3pgLo@01T*)3x$3NNc)Y zXi-;Rw)GO%ZM&&Lari3E;VU}jaGA+rrxVX68q*DH(1w16`3TlxY5h=pIzXQru~QKr zu1Ud>RkD)2JuY%)bbgm%U+ZsD&dm3Je`+D?QIL1bQtfhYCsSRBEWD7@68*H7OX<)Q zp*=Af{gfoxHAm87l31ivyao?p9Wxl@_$t(wA;|GJDPI>s4lCh32y*X@Zep zJ!)bn*tdz6HJYRemi5`9FQiKv+DjSxyPS1`D?t!|M3>{A)Xp^;&s${)W;|chh4D<% zQEVvF`E1j4mal}+N>S6kJ?mUA>x?s-@EW>VHB7|iE~Cs@9ssZ|j_4;}B_ zJY=E5wSKvqt+{E0=V3!9-0uZh|CmzT0K^_>b$(R2} zE{dKW5f53omS3b^Fq8iGQ!9mT(!WubYR|rS%|*=BVSy6s(H~6C-z9l)P3R#TUojv2 zDb^9S@wa8}Q{JWKvgdMH3$dgD6_$Yfl)S6U2*_wJ{w)Um&TRT1yTp z2)2QefMKu&|D^U<@TRceL*ej+<9<;XPSiSY3VT>ihj9G7QfmP!PK=FD@f%zFz2SPj z%CcO*Q`mwDS(!Dtp==6LT#&MvVd<1N>{shG$OkftJ22t?hyrZKoP^zXVhtV>!Qg=? ze#O{;2gyZl#{1{tB=2~EC4j@Fd#?fq-79cSS;L1+pV)OdnQ{a+0%&BgEt#gPxfNJWUtC z$FSc(lYm{T%?@Ay&~ufLrzUU#t?9R{$ZR?)LiNpuQhsdweLRIE%<+c_O+La(nfUCu z+VQVbG$ckA)~-g@YFFx+t8rv?AVAXij>}6)2H!%8;dW6skGdwJB>%}>gfx*0J&Pt{ z196&ohv9Q3siF+;Xqn>C)+|h7ia2hO7RzC(-;R^7}jQBu{Js!qx|I2Tw4q4l{X zpldG5`D}L)(p=spSu__LP@0=uQe==Jk4^Rtp4U)b>|Qg2jB)9KUx2;O%9n+GzTj(+ zQwD1`BF`cEud*j*s5;dX*YTbh#6O*Qt&azhkqq?oFX4qxRAzAk$rcQVm$hrf^e9js z-KxmK^W<80a{}qQa5!}c&Iv-Uf#WRcfHP1JOLxUeO?~1Mt$*7`^j01+J{JT zh461o7Ln3$5x6HSzL#PAYHEGf!}w)csy)Z@He>qh6D3TOgX1kZ<{8R8Te6xl+OK33 zJPYfHM*H(=dt3l^^>OOs!1pkJz>I?o=ip(`PqL49!U&0bRg#Qy!I86w@s!ev5SX^TGUWr#p(Tv}t z6QH8?R>$3#S;Z`5Jd?6vps}z&dA3C(Pq;=xA{gZS4M+r}VT8?Ahr{Zm0MQ>z5>8J+ zf^eF!UDY>BTu#&eq)=H_X%jm$Td5R9a3P2RM7z-~4P8I6H#WG7kORd#E*?X$yG6)Z z>+WCi?lv;Q&bt8A&Jx;aHdLSM0VrLWFA2RjZRiE-X>d8LH~ zq_{5_a`UKbAxiS;?jodxTW5c`ipCv(W!nGT?GuC;%W1YAMcxUtt~5u+FJ^Uomn*86+3s3q&XX zViLD%bF%wDB#AtdE7je+D)$+07_5&&@x z50}SB8ig@=%NDy+4bGbQlPv0i`I=jm5eRj#y>vA5)6H69=OV27u&Z8VJfvs!%MlZl zpl1MYhw)D)u>L-Ziw8Z1MBy|+kIgtuK(qr=Jwg^opHKcwD7eyvdkL%c`f&^o!AgrY zYT=w{PCArLi&F?D@YHjYl?qwVKqXCS3-Pm*8=G$LOVN<9ps{wa(L{SoUD1g1ouVPK zQoJdN4qk^;^aZbV)6MK&O**f37a_Zs3o?E})#3(P1LLd#bF13ze7Xm1f$OkyyC72} zzdNajOQjIwMJ<7StbR+K;L7Fkj-_$Gh=Z*}I|X<>uo@>$BHAxcA~+Fl2Yr>|V}1UC z6oL@$ncxoh{=A2CX9U3(0yor)?6cX>r&2T|lnZND%C*9!T>EEIlElHxRw_ji{5|s4 z7yO-D8oJ7^fFgh6EF^L$7FCxM6F6)Nu?= zs#tMo_cqh*9PHTQd$DT}R&NpvL2_G|P-}HhqD=jAs1QE(LR#dMHZVn?3dDTs*=xSVnGq28Y7d@RWvU3Gug54s@@pn zy>X3{t;_pElNT>|=^g7@R~tK`&NohDA7p94;ZoUAPhRarGDz{JlE6MLfg7_*AlQo~ z_{nQh34`8QK6!nN^KrCOKJetVm5sBH^ASIok93$OUgu4;5FpOe7N|hv}0>OY+B`8$oQROJN6c; zO}`(m+&63b3 za{NKyIKz&t_p;Z`AYUk_IahFM*Z!kP!>7Ba;Y`a&BoeH@nG}4bdkRi7hCQ_%dTO@% zt?pZ0E@u~NQF~&x_GtI5<#mI)KIf*gyy)ibAoJLm?kX2$_L#1cbR?#GH#DbWy8N3ZrhA%!1Lm=Fq?iJ_ z&xOw-psObF%n<$4tj$OJqMr315VFm+L?#jtCou2RUlA30@&CIBGLV!;5K3DqZq~F}G28 z325ABsX>2LZK-T8<~13+Dvv?&(5}khUZ^>^4t@w;fS<4rg8Pu9C4z_GMfiLd{_|q^ z=YAw-J$wKcq{kM-O$$V~=y*Tn-D-M~_=r zxT%q&qYT@h&)xC3e~A*1Se4{Xz>RY8K^C`&ChJ;Eh!oj@p-HrqQ0U%`>Aa``N{dtt|7WoyeX*; z-j8JT1@Cne&VsFiT-;9gE>=XF2?smZ3?jXoDilu-ah^VrjVFxWM|j%NmBtcVUDl#F z`!eV3i`h6sW#*j4o4z;%euKFpNbi$h6?=TO(ee^Tlet#+Ni(7Wa|}yC1EE;H?9H~K zye8EVeK97<*qg%U(Ja^ z1r|4|u;d{V*6?iTxf~0xz^*QJT^P%U6_xVAL zlznjORyKNa@W+8Q`b>)Z8ke#n+Dy8}rklj~TJ1-$CP{UbPZ0ERN*QDe&WWvIY%8dqdH<2ij247#KGqv zG)PYt;5ar+IVbCl@YG$bYrtX)kQkGD=3njUZOSd1j1E^3g{41A;-k}QfwC>!(R4*xn1CFEk4K%dY<%+q#66WlGS}&R`=qc)Qh-y-c6VS>wqbu z64c}6>(xPC&}x>HRi#3>5G_WwMIq1j#%<;aW*{%!727G<3}3~7FiX0Z6(_IdoJ_mB zQ1A8iK>sUQ5lxTJK`U^$qR7kNaCEbG=-@F)T*4cQqCemiJ(!K64U(c{6?qwmS`)tP z5>OGh7x)5<@e2D4mYiT89yr{1kuuJDFyZmtQ&TV%f^*IsagqFoCHkutihgN;_asa6 z2ix}WrCiA$DZs1<+xNJi4oLu8WtdUXlgC?7pb>D|#|y>dg;C!+buL1}NPqbkDNr^| ze#|Y+&@_1gNa@3@lsQc%tpVEqERtrVoS0wZrbRYG8?lmcj9&~nwDY> z{u$-e7d-5itUg>fLXoe#i_j#^yFGavnWh6O%ZFG4rrB^9mnq1hso>FOW*D^4eUQm6 zC%C4wSK$TR)6nE0D)BFml5N?7Z`e(TMfel-5dR`&#`OPxQgCm^HZB5|{)@Ae&9hjx z&1u?Fb|S1_Y5fyiTEBN@BuH|asp_PpgLS|WG zJeY|2daD)4sToh99(C5Q#2$10c%%7 zqu)9-bf^1?-N~3l)onFWut5PCfX$X}mi4i4DHM4+E20@zr=tOA^goen`9)Ds=M;=( zqX4^>Q;j3yH+4gjW;=6ZvpF|UEEVzKocp;=gmS6EQHG94yZm#UD(Q4i!HiP zp%Gk8V{aAxTA=|Ked5BT)Fi7aovJrW9brC{Vr6seM^XsLoMW#5u0O;|nRD!^5YCk> z%BGEnX49Wf(X^O#u{|~GUT&RrH3i-?69Og{W~MU9dhiY81?*lo_qsA)4n_XKU4)dG zcTg5(#%@*0oLsUiW8}@W2+Wpu!4mN&i++`Dg3N&>GVH@-3Jbx)#ztS0{Lqnl71oD6 z$WM(=)!317svOwvFksO0)x2JOdAxu}`C4#s0Gp~=%#X|xrnE$qbyS^3zZxsjp{KHk z*|<98GPkvDj;lfFfM2m5Hpf*?$%j-@e`GehGDWjuOkrDUOl^0Ksprpq-w^xrffOnB z;Cv7{blnEG%AYPqq_|J*4DWXGc{#C=0bzCTs?{e8Lb*uJ7N|%kL9Vz5w zj-@98^V?Y|b1W?chN(IB*=*>h6b*^dgSD&Cv%@udh9$Rn)~hE{Ccb8)DJiz#87K#^ z%-xdHwSNZ`xy@aKw4Zln7VSp`K<&4gW=|ypYtY*RJ}X>YH|FQ)8SKi(AZf{C))#h^ zSiOcvayWzxF)L<38bjt9P`AkMQg%$YpOr!irf%;B)=scerfx5n%utis6SL75r)X5@ zIku$q{Cbz34|Xm`qPm+ZB%8q-k#4a6-JI%rxeJQC)?I}3l6ONEy~NH_dYN1@!OH6R zgx#f@tBFZ!cnFh{8uJ4XV!sz0nlVq&h(jC$S{0!KG_-UCn?Of|{914u5Oj#=m8;4B?AoDJ_kU=Eih1N=i=70ohCIKe6kg<@pnBwFT&dJ4{ zaim&vGq`=*!FQ~Iu_eFiQQmZzrOV2 zhBJBNJWqWh2AW<+EP`>dCuK*t+EQH}!zV+vy2y0Et)d}ROW0gv_aNTT*ODhEDXKsu!a%Yd$mu^#kBHX&jJv zMEcHuVXucy_S?FV+FoP*(WK$$ozM_J0*PedwyGWt9>LD-6{@bfA}Yy5R6W&FK%ato z>b9O~8J+P!y4*#o9Y~evBS88E=n4g-{9AS)%_Cg`NWX}k%N#eYpQAvkZ_K&7jUJU+ZoE=F4qI+v+Xuafp<*$ak^c9x2|0>_ z9Uuol#cT0T7ThGWfC6BjfvbF%;63(Kq5HmfklO4*K5@&xp>KU-Qar&ZA0*Z>M%C9%m-4G20X+y z;1fdHsWWN_Dc^+WG)eYGd^R|!&krqheVMc%b!W4JCy(LC4D5a8o(ujeQ6~r10zX>F zva{l;f%-%h7KwRx;qhf=4-CMT1Gc$|#>s3psU-MiF2OH$DnUG7swC*f@4F=^Tef-8 zZ+Py4AFEJ%oIE&v1gr00W}!tT7X{?T5?HGjYAyGd@Gv^QE{2G8L4GB*+B6hB{8);N z`I3)-ys{YrcrNgtSt)aQUf;7NoLK#l+3dfiXjUxHV_R}MxygB`^O+=tUdf)+y!Q=B zkp&B{1R3-N3*e8Vvvh#Kn~r~-LeRn};hmZVAW#*)!BxT7f_2h5^O`#$wE>}}jUM%D zJ{@P zfE(iC94B}#VmQ19Xf7u|3PyV8^CQf(A>`j6iHc0Px{N5J&QlMh#MuaVdJ5T@?xF_* zc^WHaj(`=!ns#p1cxE;nq-a=-0c=f;feo%PP@4ns!!hyMZdQsjxEtlu7d+c7QGMiK zKTf)f(8%Fko@L}<18U?XmrQUnk_(E3d|MPPzF_h~{yRV@af=;d{h-rD{H-*K$#HQn zc09qh&ut)FPwaw6yV}#`01>_-b|BF_x`hwZJOon=%e?R%deFX#0=S`)G^_QCsV~Lq zO7sk-FixXC$g#rayieeGNfmFTn7ml4{|i}gF2rgq(YM#53c#9_U0`h54=u7R6(tA~ zljQ@ir^^RbF5w`B zxP(h0WPn*gN4N}nyL@2sPrB6g@r*a+kR^oUB$DR`()9((afuQ z=o+)ci_vz1zm#w>+Ifci_w*sT?7*)TBh_7RycT&&>Q>uXUtjQ*OnQgP_9a<@-J|y8 zF1EREh+#xssJ5PSF8V-hZI>K}9AQOSd!#c*Sk??J4VLOfNKuD3gu%RGr!@JlwPO$v z-0Kf}mu)rfTH8+jsNb~~`>yQG;AbfKzTl@){@kK=-d#AW!q61NSisz5+`e|0ucw96 z9dIF&c(N2xQaa^oCZ%6zl~VA(Sb}G^Cq*(i*nGHHANL0_X|rF2-OHnF;cs`PfeEP^ z-VFdZ^|2`o``&QFzJtU>#!`xpm7I@L@lPgCLGXe1v03@({5myZ^>LB7WVV1E;8TSEuTxx~r+GCW%W1 zL6JhsMWxl5QFq42x{mr2bp~f<9mjE27hN15JL@{kvg)AVYklMD$PCW^`_Ah=&b{Z> zGnwCRe!tv4_ttrQ=R4o)eCM3+uJ~uNMJ{SVqxNj4C za#G(7n3m?aOCh(Uxx7sZ6Z0Y1-xB(p5_0 zEA5%7g5&VHmDRd%`235OUL?AjzhEiQDOd9u_M6*xOqcam+!$b}i(&z9tVlkW9P1W7KzcwfP# zf;)a3p^0~)aGqsvRiG|VtRI1^z5$YdPc-7dKPcQ5evwz zvqYH=>8%#zeB5#=mkMqc{Qq~74Hf3|%z4&5Vj&5%3WN40fz#%04tP(Brlbs_`i%@) z>6Ago$2DM*sg4g|3~xS4$Q<(v^0fb{A3f zDF&q(`lO-E5@=A?E~7Zfh-h{1!1f%D-XECC;^yysshX{ov+S;o9P-gi3VM;+1g^f^ zzO6{-9JaR++G$`EU*mN>UT=>D&~-HEOttVGQ-eK*=gD#S5Q`geKWkcM74~aMH14gI zYLQu<2zpi*JihQ8I4guM5;9W8%Qju|7L0(Gx^+6{WK&@F)_=&h=LITn$8Z1hQ0NOY?Q^R$PnOqG!DEH66WT1_4v}Sb^i^~klN*sw+x3zFI zjas2no;g6#0w^aU1{}bh7gX;=5nH{-%H_&9M-3HWyZg9Z6-z^{dmV?6Y4PLj0Menh zuBAUs%`tyUBP7-fx5>g`cJgxv`LyM(YTMYxtJ(0b>R{CCSEA|YW^YzMYdrxXP0L%> zsAGlv*gQt)4E{q zHEK-HgbMU;kZVq(nl5?wQSZ8?QQv~f!y+J2qdsIQ;FlS_)~GS~kKG~EaKUfasAfDO z8r4IMMx%2n)FlFX;Sw{_gDRk; z3foCBMAYSGbOZ`HkqzNKDJ)nYf@xP#iBh+E>)~();q-D-DnbcWnmLps1zySL#t}#m ze-K1lmg}3&;o@;rJEiX#_h#^=lCRBF=-YV`281ExTc&D9rg0_tRJDf6a9*OXR>@6O zDeS1)D9@q0am!|zV-)5PwnNF7pZ}Zc_*1X`{SI_p%TMpGiBbl=ztRLF$kchN!z)n< zVG?{&77lD7x_*01oJgftGiM=nmKi;qa-ji3K-nP-79GIbxktpCLBNxp&f1=O^*d4D zQ?GuPt47oJFNwZ?vDLmW0^&^HIb>tZ_=3si(02iMtT`lxrvv6t{xDs~lGTjd z4Ra{m#&Ks3MFDh~L;7gPuuwGN8iq7NRZOM8#(Zh`gi9%z75B5IZMKV^Pfge%yXZH% z;IXocq8(>L#%~uj7HbqTT7tXpLq9@<_`U?uv|@AAl<`|83ORDGe}BsCG60CdrMDC% zyJnDGXaOtHARDq2@OS&z7-W%wk2T27b-`~p$jo>|46-0L6b}??P_Y%bI?9zJIuxk*zGtrz6>Zm} znZ8~tg@eei#&_rg}#Ckuz?4t~n>=}Q~lTGf{oG##ri1&HnF%WcAh&5Ce( zS#i^EQ`+)Umpk6pLcFegZLgj2cJN%9(l|M7WX!7Z!PGRYq`!2+ z->(ZcjwAfG;et0E^4?B;>z2ddKcVt4(m>fw~}0}c6zr9db@Tq zqY=?g_n=0joy1!k+Uc(eK&hSXLt45E3=Je|r-PU@3xtp}T!pWax0_4f0S=3BkZ+2s zTPuzs9-rs2~ zrJW<+OC^Nf`-&_aW&uA%`}Ce|L|WB*KStBBdQX7Z3B9MoL{1dDm?*)IssLObrEKTXXF|AnwGwBt>(aF|j2bnnxSwsC7!J9=n3Ryzt1 z+tH3!l*&1HPsR0(O=-pTuGyf!=6G#*cduuGL9kp}aILnl{pE%TVOGcJQhzqZ4Z)9^ zG+E=_o0={|8twHtn?9$h1 zQ06^E*z1-~{fGsuM4kE}O98)Z>5WcZZKd`2OUTip-Uel z0HrQ{71DAJX~sTLm#%{@C2r>XSR%{JinkrPG`X!o<)k6ZrcJ$EIEH~u@JUgAk&bDe(>gbYG>L}PitX2|3lN7uE z^dPSU>$OjgR$02JsL1-8rX5xkOSUQkb`g#elF}u(P#0{x=9nnkAacaL2myV8{xz{F z*Yw9*LtX2Z6h9x8hZ!wViod{8p!ZVzv?R)m7v^WXfVT^CGZ+zJJ{L6_VJ_a<5a!ns zfKr&xLs|-RLjo3I9=FZgCnIfDwJIa`1FSe1DMd=Fn?E;C%}nmkSF&n4*PL*?$R!-Z zwYMP|jl~?U)Gij6hqEb}82uqA5D#l2Xi^~7biu}}do2*7on`Um-#E~mG&G&@UPt}v zmNa}DDsM^}K5Qw_dug~vOT!4}V|_$#5|F?3^WQju|HYmbY1n0=8Ip)hETd{86UAE_ zGVu|DRLaCVk(M&i5JGD*(NK`VGb}*;@=#gr(zWr+l-Z?g!(h>SmJr%4HL&XHXfG0t;^meC z{%-fiwQ;hY58}j^+9`oBpd&c1Em;9Erh!}{vE zy)Tqk(8{|;#&R`mRj=w@T9W_QlVkq~@9fHza2K{XhE~RHA(exD6Umenw zx-~C(+tG3OQMS>aru_NeV7}luh+AagB!2YG5p4KvRUf__O~>g&Pk`8tALU9lLC7|} z%wUHV8L~XPgo_29`%73s+EjcS3Rfi9ks)xlowmIXaShB4;Gy{8|BH(ds zM)$#G%~G$)OJAfC!b|_>vT&F({epN-%Sbg}%kJExy--bg z=r_8YP@&4>HOxJ|o^?eabLp7#jE)Imj8;b1^R5hBSZkepEsL}!!goZzYpP|n^P|)x z8&W&p*99BL2V#R$u>JtXnB7CSW;j=sPuLb!6Mkk?2$55-e+EJjmZ&t>cZs~dAXvr` z((l1R7-*%XcxG3C$w{6WDepNNv~H=@Axke3)#|yH0)7PdW|HSK?1D@eKg~PK1-M_0)O7D@ z<`ACly;v4bsgP}Wj_1+jL$GBu9jlN9i0vrkOGsDH+3}_{@lYB~Otr?UU_tgtp2t-I z4JbgA!aH!1bdlX44iAS zVa|ZrP-hdmE29~e__h5M6vV&KBq>HZJ{Ctv5dTCMJbv&Rm}@k*@@~50&AFzFB6$TW zZ%QN&SPJxBB%6I87GjI_bS-hgZWqpGEF!}B`=B}_oW)xk!ubLMPzvY&qY2ta0T$tG z)?KcGr%PS$?)P9i?t{%l>~ODi3pX zqW%ARO98(K=(X!7jQChh^MDI*yQVP%5z#bx)Mzw~cxyw`yq^G+nx=rXoCcWTk7^o! zz`XVQRE#;{0KzoXgvg^nb0XSZ^$3E}O)6Gwu8`(a?~?@Ip!XLVOqXd$9iwHF15`pN zluyXQfiP`%BP^dfT&OkYIQy`22kDAO+$%qxLwp$oX3JNKILe5v3uAeN-^C5|xoI3E zK(s&Fs$e4Zm2z-}6#`DNkWWlG#1vMJEf5CFUl3S+tW_+Zh#|6K`8FN=kPd<}YO1+O z#8*@##M?t;VD?P@aIspe^4<_1R&i1Wct$9o@{|sBs1Vq-`VDTrE^za;R&lc+4mS@H zZa`J}4cu>{EBH)dm`#;y^qIp+1_+G9N)XX%^ySC3>GlMZTL^KO-0`*hz_Q&C9bYgE)_e|)KI?rIt8?C<6{;^?4xO?# zte%G&>#*!GQ_9EebDC|e6P_da`v!1p4Ww4xAd1cA)&1rwC%)IL1na2P5qQy&_urT0pnnNn5CRmYfL4V9e_gn&@aqd%!9 zc0^j|=n@R&&49912i_^6E({5@oIl%G9UK7J$IuMOK+?FiS?`;y5d$+aULM2kb|fkg zxHSk7PN40Y6Rw5HrI%zjU3BpkN|&X|YewV- zF(NxOep6aTUG2PYzyo;LxFcU3s}!ecp>Raf9*NTFe1&4)ssKrlqe7r6oHSj|;O7>B zpS{iE$9oBtIBgf%G>T*bec7-VkuLHh7|-#1sYHZ8D*3u%Wo)LDt7NW+GAU0UA$@%P z^*i^do-|p?^kYo)BiCv_=EwEphHG*&wL-Zvas!O9v2tcdc?#B8-!&9Xx>%dxp}Hwg zp|LZ!OyN?AO0`%!lDTg8P3trJZprM(mnLeNeK+q`9qd$frssExo|jwgIo%oU8^Kn^ z&ZZ(J09o9TF@xBKm8=v6oekh61f$r@Efg)mW6PmC@At>lLEVI9!^aM(p^*dClJ6xx>VyBAk_;j zNw2n|QFTA&*B}z!qr2l0_aUE^!Grg1sw3hyYMd+fLn#p)Gn@=rL5`Y2})?vok_!ljTF{v5>C-?ZPZ-j9{MKkF;)x3oa;i|Uzr4fg08t+W$w1S`bL zePC81Su@9MR}*%ncY5^G*^y5;w6y3IRc!Vd%fE6q*o$9VdXeZ1{H3LUpMctN2A+}? zLcA(H>>HK&*qC3*PZY;zz4xK@Sa;vgU7*?BeFoLx`Gof%YBcUX@n&)N4FtvLthaX# z_Eko3ANBG1Vla&@s=QZA2zU|5GH|K~4jJF1_i*WO zsShTdys9F{KEVlu+rVKS;c6StR}r;&Tp4?c(0kLECP44pYk`hI?`-;$dMZOM#WxTh zg-bCb3nvLR-^|oD0`W{4o|!IETkPcI^lCI7U8Q16M*-Q+D%GVJ!AdcISDrNh-HIaO zcsVSd7X-<1IHs0(n`f#^Hcu=dE~^KEz>Wx^D2W%cmGYsE8#=e7rcA$~^I~19aZE57 zG<8mi!JT6I*xxmuvduTHJJqDQW3b_kQ5{ip=VbdRGJwt6H+P|lBvGK$th8?`oIPmY zEK=m8Fl0UiQS#dM+ft^5G-=dpu${NG(oVckQz(#@hIM?pU}=2V(u+h(b;Q!xg&K{eA>Nv`Gzes6X^bK*Ee*qUQA@+Wnt0#dJO$;d<=4Xt zUn-F|o}B4eT_ejunqs_hMeHQ^JK8gPUpW~b0o$aSnVA~LjUg zGsahsqhE^SUe_Z~aAT7KhOTXjfTQ`)dxG#e=zU$I)g=XKAjnkNO(le>@;_wZfDdbw zgkNSWP<@2&1;al5Qoc`#Ap8KmMu3rLOXEsnQs9|Gy(&+(!eFPXHJJFWz{Jz7VqzZ9 zXfP2krhG=5jhN#Lx{S6Hu1hf5#Bc@HIfmk#+RBr^LGng)6(Po%pSXHJe))vegEi8) zqZP>8v+xa;s-YExQ++vt8T24Fl4=?B`hlVJ205)Q^yw13w(wH)p;af}U=)0_yl`r8 zd4adlG7dtT% z5rFfO$V$SPT1BAkC$x$%T`m>J=w3<)V_Htwu0(B1Wlf)6B>Hq?t9_zX1#6#1)T%-z zVOb$#T~|5@ZV4_g&1m*vKJ`kbdNp9k_&CZ-fdG`M2#N#7HK#t!+KC~uDXP(xf|XGuC?c`_qz9kpj;~5R^8RV`UAk1` zm?1DYm0oQ{nZiTNuR&Bis5|8n-fEgAkGL6Zcy+2HI*p#sL&wkrC$zpF;0cy*L9pI| zDw~)#zddDkImNWX-i0aVqZY6dr}8HbP}q`?KEw0AgpEkGP<-&oT|R zBeTqD)M#dz;>|M4ToGaRpi7&eRuj!C(sH6{=rTId^trUJ-#$(Ox3S%gVocHA0|?`M z1-rY%dHTk6IEkfv^BWruTc6)NhsL8$X;z?XJpp7pPU-bb$08~ipGi*Eo~K7>Y1m&utkM)% zPda|Q*LN4NkYSB3Hk(e_(OxyXKd`zXDG=S8mqM0g^4 zq6U)FdVHAFmZxY)k{Z=+NNur;)Hb()J_T@Fb?A2eTs%9kyC4i$d|c@d{+lit2)xrIyEA^cTvv{d3Yk4to}4b_Yk3%`bOkTvrlY@b zX70~tri)_-OZo9(9L<@?&6H}HyK1(5lDISW>0hKk zQjoY$LeC%NQbFQgO)@*uT}2%+zv^*jf`2RpFp}U20z>etTm=8pZed;ZuX_z>6nXzZ zeIE4w-i;+cE3871uepmTRuDtm3@Z>p7*AQp6Dc ztcQ@P{I@9vBgk@VfZ^x3RFLKRO#fBW{!hVX`)_bh9VBy6TY6}Ao$6w)I}{c$-xg=0 zJB)kPx$ZZlQRZcUE};E%H`e^jMkBS>T|_aP7}R8z2~JX}fnN(!2+Ru(k*S}BZ$zDJ z6m!l1ix_Hg%oWr;VY)OUg2O2Hiw^&xc*v@BR$F0FgBbIx#ys=LmJ~P)^2ljG%#~cK z4IX(>ie@E`P+Nva*1C9PZx@iSFxr*6^>}!%q@H4S;Kq%g6KFhM>Mo))6o=+GZ_s!6X8hDI+r#20jJ zR{k8&61SKiUO*XY#BYyn$X&r3XlY{uZ<&p5SB~E~oVa6|cKasmSUy+o0MMb5czeg~ z*~vU&9$+Vk*m|dULmk%-<_>4p6xT>w`=IyVi8fOoGo)S3U)CjfSMwch>}pnL@?yGW zb~v9C+~I7`AKEox;B3^I-AQ0?Aa3WgJ$G~$^tqO3E1AnP7jGKLY`SVBbLkap}N^P6IRO{Zx-n+9k4MhaMj}1$G|a7}z15xrNU9D$bz!3)C9I`jw|S-ql#HM4?S; zc|Iyar*p19T+2^Y>Cy+qK%J}5;Cs#s8Q;Hc7T@0UR6^{#Rzw=;{jl739T&nyZN3H; z{2^SLEoOSMO!TCm{-l-#bdE>%gmzn7d$L9Ewocq`oxI<=y-G|k*NI-PZMB!Q>gnrc zt2?eY?Nh-8GeaEHi>B*VZJ^}4Z@aZ!)C}t?V`ZR_1xY){mg!1{=;j8s8|=F}F3JJ{ ztzs$lsu9dK;?=3Kt9E@o1GJ9lQjOm|7P8upK;9y5qQR)GdNG(+*l=YFVrjSTuS-TN zEK#f&gC*}Ks(?3&1vafM)?=vP@_h+{@QP+ZP}|k4Q1~zSXv`Bge?+bgHs4`LiDG zv1m~p$&9eL8@WTo;JkwwY6yh8Q2uUW#+XlF(vRyFMPCEKXd26GwR#0il9ZVBK1CIX z?WPMv+omNJv7e^??GN5QG2~TIM`P~vk=e$g=_4CNu*kfhif9|p0WllY>yRj{Jq|=Z@7to0bA2g|ldQTA?*q$%JQ9(e1G~yp&;tv>b#|!Fxcx=_I+71*?AD-U3 zZ+mw4-s>iPcNf?to>BR7W&tbf@!xPbyIZX#zPj zRQN~rp)sgQH&oPqvB5wX4?=8(KWjQ=@iqTO!82|mRq9^ulb@pt9+!A+<3=6RGjA1j zk`22qSSDwq^04Mev`jLV0)8=K6oq#cWO+bKY^D!EEy2Ina+L%5+H9j)%cOB?9C5~9 zdA804zujIj;}Nk}o`Z-r_KJ9G(OwZslEa~GAvk3?wCA-D_Yp(XWbrASy`){Rv^AbN zEdK08)YlTW3*`~+f9KTr40c2w*+6eocqvp+=TVU|x+X798V@XLsvDzj5!2s2)n{k{u)yDl@s5z%Fb zP@~ah;;nsM_U8nr)Mc+iT28+WEhOr)o7>Q3`$)s#pmfQm$U0xK76jhkQa1;^$8~Q7 zs-4p>?+BF;TI}<(aG0e16zbDrHq5rF#hyXav06-k7>NC3J8>eFtIgk%9<0C}7tdOu zVh6nCj*E0Fgeva&hM=C=AlH_ni@)g>UK1CB??_$k7Dwb4XNx6ex&E3Di(h^b#cH}bX&Ioj$-W0mYxzd%M`i9Z(tQu;B@ZVS_ z$AeDKFkzW{T;xxN<`M}QWMWvjA;UUvkeJ1#FK6Pw-Py04Rlg{lN3Vl9QBW(>-rOWP z*H|Fpa?chnAWbr-F)%h$p$pBj^809GsrrH&F7mUZ4Z1y@Z>^batiTm0yq9AbyZWf_ z<4~%%(q{AO?8CFt*D)~KSS$_`)yfr=r(@RnYArW8jh7{&nJnr)h}S;(I#Vg(t-n?t z%kBqV(XUlF&H+~iZr7C)<#G*oW95B6?wZr+$5m}LoaV?Lrkg}&@nrzhvEpmnOFN+}$$MV#v*?MDuuVBsQap}f5a?Lgt z&(tP1T)ClIMEbPgkJ)^sf=ed~SamPuE5I{>iW5$aWn$m4ua@~-3vL?<{SvCe%Yn}t z1EO97!~9$J-LT*H-RJgI6`cMU;3P4c_eVT3bmvU1FW*`KB@o~J*%}>oXR#mWw zUP0um{50qT%^-#u@UQ^PGJ$RaBgOG7&NfdJ4?~hQ1`u!sH=^oKjk!e-RsT3<(fSr7 zLM(rvqdgT|6hjp*<1bp<{K!o}b*0Naoer5wt}iVNu)au~IpA zFpH2t#Znewwy;~71VFuUVt(qbS=eNaMM4sQ^*}|%DY45xD_m?m<}1*UzApz9GEtp9 z3RxBSN}+7|GisaAFAMNe9Ov%~>7z&wd7HtX-j$>bw->H1Ocf4#53R(P1|Eec3Qu?+ zg5OU(Zkme}KfXyRet0J$#gEhHA;phBpcFsOnU54d9-$OJMiwB&kIzwxAA1%e#gFe% ziXRUyLW&=&79+)v4^oOBm-ZpWk4GrQkE@m-#gETYiXX+LNb#euA1Qvkhf@4_;Q&(n z_$sCN@rq?g@#7bi;>R7!k>bY>DaDW1tU!t%zoisE<_#h>haSHo9P;CBtB~Ty){~Ip z$LA@T|&#gF?>Mv5QHPeFUN^BgK!$al4)Od3qeB%>4M=CZzbW=Mtp&@i?XU z@#tkp@#Dr1&ZlqtoJ zCn?2`16L!(k8e|oA9v#dagQH#6T8QcJnlsF__2_pQ_Z6XU8f-)6zI?Ls z;AG-Kfj~Gmi1*x$Nd1}~w0bTc~AD8Sz>LNU58jFdaYe%M;>jg)T7PgNT zrbd~UM+;BXnS<-hy>;f?I&*EEIkwK+T4zqJGndwxL+i|)b>_@Eb7h@5vd-LCXHKj$ z7orr{u+H39XU?lL*VUQh>db9*=CnFdY~9=9W5hN}ai+&Ky!_?x-_o)IDO2QRav`b3>guq0U@TXAY<{_1Bs5 z>mHH*C{ui$slDzIxsNiH*F7ThQKs%XQ+A!Hy6zEKk1{m_dmv|E4+MG2F!reP(KK1l&K48kQds*m%2w}H9Au`@)UI0I7$PtPD!1dGP}Vil8@**f_<-i!KimE;aNcQ`=q671?{b#tfp z1`?a^Ll(7!8LFK#q-x+!*}$7c15jm82`%=~IcS2l*h{n)dzw=@(q+?ExB52$v0Dqwd8=-l7C7m){;fim#ifhQs=fnG9>npGNkGuRVRCR z9wkK&SqoRGCDy{1kv?WE{7urwtc8C``k1xw>NAmIE&LSeW7fhSIR`1$!q*X~TOpYe z;iU|z;HBy$yknFU@UoVFH?_oC{^)r~v6kOK4WEC$qjk!Vs&%SPwmwct(K=fZk5Ef& zMO;M9tsoO2NiI-^RBcjqvduk|6m7DV@(yZ=t&{@UD{Q6wfb12vQcfih9wU1t2@cAT z3J$7H!f^#91srSz-A66474-Nfq}U3&MO#5%p%hy|pCo&TtsuH7*jq=YMiOk4Ar)+V z@i2QLy&t1y2^*VQSCPHNR@Sp*Z?Tm%J%SWlS-+taTUqyOD{GFnvW`-Ut*nLG%BpEA z>nTdHl{KlYtnX8bt*m>smGu)!<;m1KNDsEM=rStrL^7t5`cD~B^`Gyy68*mpHOv09 zDM$CH2`i57IT2PIMIH4%e}kiS%8;sc6$Kpo@h?ElvUN5UDeA4T5-Gx*uoB6G?)~aU zN9&X!RqJX;JX-$=YL>0DDN5Tug%wI0DufkE%Ta8FvNPJ-xYGd#Wk>~w@i2SqP)5Kp z)9Ckm4tO%#j}41r_b4W~;tP3qR6a3l_J1K?27iVBU~+%Cq@5A`@ubj4oqKVh#>J{t zF0?XGKOA+H8hHj+hwGBRoX}VV-;>TZfE#JxvcaUi3bz(jI0Q>;pn9YVe~kKUT%FS5 z@`v+VbITN5P9lOFc_ZLALF{3;E%e>+2|2W9oEN~izbLv48(Oo%PQyX(YR(5Z`%84q zXs(pq568+uADE5RH^aGti3zUq?c1RLDSv&;uR&;D?0`ls!tX&o2^0vo3{~rQax0g% zF-WDSbzWm0O`G87+Fs@^P%w|C@>xu!{BLZJiG%aXvTudtFc(% z8;j53yBrJ3g0Z0Zfjt|Gw>glZ#^Pbl7aWWJJu|iGnVRGa#S@{gL0)*Dqqz|7snrhS z{-i|QpVUj-f7*czh5Ns>;66t3$W8h&zXr$RZyn8t#)6>0So|-T`|a=nl~;T)-!~RV z*J(bWEZ~Fr*0J#IG2DDDN$U)|#1WDVCzNTC3QIYeTxLI3SPo`L^liqqW?He#V2ue& zD>bcC+NvXn&+j?#sfP1uN4~~! zCQ0V)N~d(^aK5%B$x26aA?l@8J50SR5~+8Em3q6RQ8ze{p-Arn3+`iNMKh9Qv!nUY zSP&E#i=V+=(2gXb@`@q+8uk7&v?QS{z1FC=I*_5pVy|T^2KG?IIc;ewl^XsWlsn^& z21D4Vb~}vyQ+=Ee#Xg0!>X{U}$AJum{ktvL4_Pjf143VexPPOgxe)HD)ehr+C=vHV zy~OpW#fmfAlR{KpNg@9n>;3pH?Rv`6>p9j}9mr5) z@g>VxEE9HpL<~i~2YKO}jwVC+rjSfS>KLErt*px{I-4NY|RUlCDyj@l67>p0~u;8GMq1Lnff)dQpo)QJsmm= zeX*mt5bmkf4j}M}_r}(Ws)5kYCkfCtD(~A41{R=O5G#A1>wc26auSvxHnqK05 z#(@ll`-%nk9gsnz`u{V6^f6vh21 zy_7*~b|)K!3il^-zMvh{0X{g-(R^qu2nvkF_=WB90hPD$!4L6W>I2HsYd*NvfebYk z+bm)Yc4 zDsSV1>;}yTl%>~vFzY~u8jCk`zMxEMfe+r}XfA|%YPG|-U*_Y3DDLSpnV#9CpK>5W z;r>5caNhwwc-+x^Xe+v5W&ulQh*Z!EUryVM7i1$?lmmt*ma0~u;8zHJ$c zmAgfNX3GW@+fPBS-LsB{L!&_LcX$-ePaK8wdpQcrM$=hHOF3Uq8b!RLa-J6X9>o7T zN0TA^Q_CI3{}qY&zoM7;ztVvW#RZpH@ZW+qxWUm}2=~+~aQ_%Kw6^1+pz=xr`DbP) zV^ge@K$NA|nmFe`hQj^tSa9C~ZBTYJ9~ujS0%NiB()PxJ%G<``N_>}NL0Nh|7O!_8 zLyg4)ma%Ao4}Qm0(7$&y9~ujS z0%P$h9BXQ4EU3I13%@Ro+~e6>UHr!mWT>%tzhx|1kU@XuXfA|%YPG|-_pjVUagUXo id}F1KqN9#D@lmQJ`ZEVX=^LlOJ~9RlansEH;eQ46Vio@Y diff --git a/docs/_build/doctrees/readme.doctree b/docs/_build/doctrees/readme.doctree index 0a970019335efec118b29c03a7807d1abfbb07b8..b1ffdbdd7267e72272f2a61f852cef817202e2fd 100644 GIT binary patch delta 8615 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 delta 7864 zcmb7}d2|$27RISgx>K*4B@0W^2_a-5dpban5FjKF6OuqfScI?ylF(2oAbTUL31W~X zD0l;-B90&^9FY;?3?m>2jv7>y;D&I_;BsWd{TxRIQJnkUrK`ImTKLaPb-nxh?)Toi z^{OhheUIVFc7w6eck9159W=gcFexU*stksJ@QBu@e1=Mv>2*#eUMa+rW1-zI8G0E9 zMd#u#iy|pLN~n^cgxQ^CN?!cxmQ^iriV=Cg*)7UASZKTuP`s)|nW@xj67z(_8dJjU zNwk~3y(zIllURuolcZdTmPZXq%c&}NE_PJbm)2KQRc1se_4UA$tF__O4g>`fTN;5(rJFrsD!YE!?a5!*&4-Q>mT z8nKiJJAwvi8gq+7U}vuk@9{?Ac+p4iXn7maE!udu@DuLwrohtPr{vufwTq9}n2Jue zz~&;Lb>t+y@V=+K! zaDpiljmZ2k(!>|zsswx@mxg8gcS<)xq`Mq8m?e=wf&o4bNaD5AGnSumI~%R#Thn(9 z8%g2ADPImINq6UqHHds`!iO0?m*8kv5?l$N&1MlYL(AYl%{#+b*xc`asRn{0#<3a- zt|R>d)UPtY>cNrL#nhpCp|}I8mGEJNLs|!;`j@bE6tsb8+&tB_x^!UVv+POYb`m!Z zxgCOIT2>rbJdBG_d*F`AXMR*ARz}%F<-3H*Up}P9uN=hR;Pl4~#m}*hr9UorN{_WK97Ac(b zfrFu;@SQD|eM=o*yNN4;U>X6X>5=SB3OgBoj{nI9u$e^bM0_4eaD0Z|KJBr7;u7wyQzZP!4`Z7mE%JWFEj4MKF zy00|HGy5zpJ725MM-<8{D1Mn1zr@qQEa5ZX-@gxME{V(z}?j5@sMrJ?3zM-(MgeB91nCzkvB1R`jl~6c3 zT9Tl8bYCW!L}mDx03Sb$TQKNXJ~ytr_0L|ybhkE)86X8i{Fr_$m|&}bO%Ea5+vIt# zzZL!Bm_*42UyO-nHlha-4M->J()Z>h;VaDFa$;C6(PN2jK{`j5&c8D*aW?1pi&n2@ zOP#ZX>e6557O@A3 z+ax%6X|%6lz2IC=Fh3i`6U-ZV0RcbpMG-HMg?zzqRq_7$(AZV%8PeEi;zbBqIld9D z!oaKXI#Qi)DV5MMc9?Vwg7XKlV+0>3P2*IHoHa>xHA2>NtEBjlGHDi3XlnN`yXUM6<4ifB6WK;CmM0>WB2aD|)avrhy zoQ1gszS5m~Y}kZssRT+UWXL7N&J}r|#Jscg*lrWEB_~Xnm?1lfy<4!mk*(8XZ%o`J zZzk#iLG3|mgC5mu(g^czPKiqlA|^$`s!3*9oU*D<38AM^XqTSQ&y(!ZQ7D|8Cm$sf zFA8=qvM=bdepBp*bAB*wO0Im4;CBVQ58<mrLPHOOLveFh!e(1YWq+3}_G?rC|f55XYJwe5^<|3<*Jb!$nS)&?C%+K>65`i%@pI+PQXtHk*Te#u zDDs|+7r6=l@22`Q&pN%;IEo#OQaoI6EMxIRClY-M=~!L5ZGNVd1%3;LvMi!U6a6yM znYwiAf-3Vg&e0qmUobVueg797R<)P}|Am56^#mWP*o0424^*sWmE@+H;8ze{qzA)# zwLxkEws0wHBKm$o!{%~d!x~-s$AtybW01XQ410{|$0_$~nEO#Zy7k&3)xZuD_;&)^ z5IiVA*QM6>$Cnzf+kLWliI1!v#o9^jZN|5Y=+{LjUE{xdNt~*lY50UeznaPH6QVyO zFK;4!$!icF@qX|90xs9gH(X;dp|*rwBm6qyXAr-ti$~Tqn*GgMH6+)~_oxQZVO0ao zqO{*a!R}_y(!Q0SE%ilRV>Q9%G$>us6AaEoCQe$_coKUX#bSh5?9F}o7Gn61BG*$} z^Kd9#83Z9q;^9kY4=EF_JBwH*&tp}yNb)Qmj?ndYa>*4|Ox!f$+L4&2ZHWKdg#nS80IP2)}^% zfA#Rz&G&4SSfE7|mcK<5{zU}4;{Oi@N4g56!ORP!@9*7z-$P&@yxKU)ztb)D2*j

!KX!qm{enwmG!jD^f-&-rO@f26cm$_T$b^pUd zIic2J!ymb};a?@J@Jlfk_n4c_wT}6YT1REMV_r+4guCWn;IsQ*8z9&X-t1SMSamnF zud_=ZL&W-p)^wXvwb)^sKd-71KlIsLAN}fVsqoMBrwr{rtt&SaN`}uYt*1ApNm5(u zjpq3VV;N>Bg~oOLeP_3*%i)0s!yAs{DfK9CKE-bt>LuQU@+O!!5AbFqZ!YrYylC)k zQ+mIt5V%~pICQ6J*XP@Xc)(txdvA13kU zAG~Sh%}(At&YJ_gc?KJ2Gvmu#zpUC($G@wp+`3)ZwhPO4Vb?CK+ST)z&n_(5g+05l zW*4^X!jc{BV1B#sViz{-!h&6-Unf$pb1MCKGCoC$Ma++KMof; + - - + Overview: module code — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -80,13 +79,11 @@

Related Topics

@@ -107,7 +104,7 @@

Quick search

©2019, Franco Donati. | - Powered by
Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 diff --git a/docs/_build/html/_modules/pycirk/fundamental_operations.html b/docs/_build/html/_modules/pycirk/fundamental_operations.html index 0d1cfba..eb6152e 100644 --- a/docs/_build/html/_modules/pycirk/fundamental_operations.html +++ b/docs/_build/html/_modules/pycirk/fundamental_operations.html @@ -1,11 +1,9 @@ - + - - + pycirk.fundamental_operations — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -163,7 +162,7 @@

Source code for pycirk.fundamental_operations

Total requirement multipliers A = Z * D """ - return np.matmul(inter_coef, D)
+ return inter_coef @ D
[docs] def L(A): """ @@ -191,7 +190,7 @@

Source code for pycirk.fundamental_operations

Intermediates Z = inter_coef * D * diag(q) """ - return np.matmul(inter_coef, D) @ diag_q
+ return inter_coef @ D @ diag_q
[docs] class IOT: """ @@ -204,7 +203,7 @@

Source code for pycirk.fundamental_operations

""" total product output s the sum of Si and y """ - return np.sum(np.array(Z), axis=1) + np.sum(np.array(Y), axis=1)
+ return np.sum(Z, axis=1) + np.sum(Y, axis=1)
[docs] def B(R, inv_diag_x): """ @@ -223,7 +222,7 @@

Source code for pycirk.fundamental_operations

Total product ouput x = inv(I - A) * yi """ - return np.dot(L, y)
+ return L @ y
[docs] def Z(A, diag_x): """ @@ -291,7 +290,7 @@

Source code for pycirk.fundamental_operations

x = Operations.IOT.x_IAy(L, y) ver_base = Operations.verifyIOT(Z, Y, E) - + return {"A": A, "Z": Z, "L": L, @@ -311,18 +310,14 @@

Source code for pycirk.fundamental_operations

[docs] def calculate_characterized(data): - data.Cr_E = data.Cr_E_k @ np.array(data.E) - data.Cr_M = data.Cr_M_k @ np.array(data.M) - data.Cr_R = data.Cr_R_k @ np.array(data.R) - data.Cr_W = data.Cr_W_k @ np.array(data.W) - - data.Cr_EY = data.Cr_E_k @ np.array(data.EY) - data.Cr_MY = data.Cr_M_k @ np.array(data.MY) - data.Cr_RY = data.Cr_R_k @ np.array(data.RY) - - data.Cr_tot_E = data.Cr_E.sum(axis=1) + data.Cr_EY.sum(axis=1) - data.Cr_tot_M = data.Cr_M.sum(axis=1) + data.Cr_MY.sum(axis=1) - data.Cr_tot_R = data.Cr_R.sum(axis=1) + data.Cr_RY.sum(axis=1) + data.Cr_E = data.Cr_E_k @ data.E + data.Cr_M = data.Cr_M_k @ data.M + data.Cr_R = data.Cr_R_k @ data.R + data.Cr_W = data.Cr_W_k @ data.W + + data.Cr_EY = data.Cr_E_k @ data.EY + data.Cr_MY = data.Cr_M_k @ data.MY + data.Cr_RY = data.Cr_R_k @ data.RY return data
@@ -364,13 +359,11 @@

Related Topics

@@ -391,7 +384,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 diff --git a/docs/_build/html/_modules/pycirk/labels.html b/docs/_build/html/_modules/pycirk/labels.html index dccdcd8..947458d 100644 --- a/docs/_build/html/_modules/pycirk/labels.html +++ b/docs/_build/html/_modules/pycirk/labels.html @@ -1,11 +1,9 @@ - + - - + pycirk.labels — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -98,35 +97,40 @@

Source code for pycirk.labels

                 else:
                     organize[keys] = self.list_of_something(labels)
 
-        count = max(len(labels) for keys, labels in organize.items())
-        organize["count"] = count
-
+        try:
+            organize["count"] = len(organize["synonym"])
+        except KeyError:
+            organize["count"] = len(organize["characterization"])
+            
         return Munch(organize)
[docs] def organize_unique_labels(self, directory): - labels = self.load_labels(directory) - - for l, v in labels.items(): - labels[l] = Munch(v) + lbl = self.load_labels(directory) - labels = Munch(labels) - - labels.products = self.get_unique_labels(labels.prod) - labels.industries = self.get_unique_labels(labels.ind) + self.product_labels = self.get_unique_labels(lbl["prod"]) + try: + self.industry_labels = self.get_unique_labels(lbl["ind"]) + except AttributeError: + pass + + try: + self.country_labels = self.product_labels.country_code + except Exception: + pass - labels.primary = self.get_unique_labels(labels.primary) - labels.fin_dem = self.get_unique_labels(labels.fin_dem) + self.region_labels = self.product_labels.region - labels.emis = self.get_unique_labels(labels.emis, False) - labels.res = self.get_unique_labels(labels.res, False) - labels.mat = self.get_unique_labels(labels.mat, False) - labels.car_emis = self.get_unique_labels(labels.car_emis, False) - labels.car_res = self.get_unique_labels(labels.car_res, False) - labels.car_mat = self.get_unique_labels(labels.car_mat, False) - labels.car_prim = self.get_unique_labels(labels.car_prim, False) + self.W_labels = self.get_unique_labels(lbl["primary"]) + self.Y_labels = self.get_unique_labels(lbl["fin_dem"]) + self.E_labels = self.get_unique_labels(lbl["emis"], False) + self.R_labels = self.get_unique_labels(lbl["res"], False) + self.M_labels = self.get_unique_labels(lbl["mat"], False) + self.Cr_E_labels = self.get_unique_labels(lbl["car_emis"], False) + self.Cr_R_labels = self.get_unique_labels(lbl["car_res"], False) + self.Cr_M_labels = self.get_unique_labels(lbl["car_mat"], False) + self.Cr_W_labels = self.get_unique_labels(lbl["car_prim"], False)
- return labels
[docs] def load_labels(self, directory): @@ -312,7 +316,7 @@

Source code for pycirk.labels

 
             attr_name = name + name_2 + "_labels"
             row_labels = eval("self." + attr_name)
-
+        
         no_row_labs = row_labels.count
         no_reg_labs = len(reg_labels)
         no_col_labs = column_labels.count
@@ -362,13 +366,11 @@ 

Related Topics

@@ -389,7 +391,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_modules/pycirk/make_scenarios.html b/docs/_build/html/_modules/pycirk/make_scenarios.html index 7ad4263..4b976bb 100644 --- a/docs/_build/html/_modules/pycirk/make_scenarios.html +++ b/docs/_build/html/_modules/pycirk/make_scenarios.html @@ -1,11 +1,9 @@ - + - - + pycirk.make_scenarios — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -75,7 +74,7 @@

Source code for pycirk.make_scenarios

     An object contaning a mofified IO system
     """
     # set basic data and variables
-
+    print(f"Scenario {scen_no} started")
     data = deepcopy(data)
 
     x_ = ops.IOT.x(data.Z, data.Y)
@@ -99,6 +98,7 @@ 

Source code for pycirk.make_scenarios

     inv_diag_x_int = np.diag(ops.inv(ops.IOT.x(data.Z, data.Y)))
 
     A = ops.IOT.A(data.Z, inv_diag_x_int)
+
     data.A = counterfactual(scen_file, scen_no, A, "A", labels)
 
     data.Y = counterfactual(scen_file, scen_no, data.Y, "Y", labels)
@@ -106,6 +106,7 @@ 

Source code for pycirk.make_scenarios

     L = ops.IOT.L(data.A)
 
     x_new = ops.IOT.x_IAy(L, data.Y.sum(1))
+    
     diag_x_new = np.diag(x_new)
 
     diag_yj_new = np.diag(data.Y.sum(axis=0))
@@ -141,13 +142,13 @@ 

Source code for pycirk.make_scenarios

     data.E = counterfactual(scen_file, scen_no, data.E, "E", labels)
     data.R = counterfactual(scen_file, scen_no, data.R, "R", labels)
     data.M = counterfactual(scen_file, scen_no, data.M, "M", labels)
-
     # Apply policy to  final demand extension coefficient matrices
     data.EY = counterfactual(scen_file, scen_no, data.EY, "EY", labels)
     data.RY = counterfactual(scen_file, scen_no, data.RY, "RY", labels)
     data.MY = counterfactual(scen_file, scen_no, data.MY, "MY", labels)
 
-#    print((1-np.sum(x_)/np.sum(x_new))*100)
+    #print((1-np.sum(x_)/np.sum(x_new))*100)
+    print(f"Scenario {scen_no} completed")
 
     return data
@@ -181,8 +182,7 @@

Source code for pycirk.make_scenarios

     elif scen_no.startswith("scenario_"):
         pass
     else:
-        raise KeyError("only integer or explicit name (scenario_x)" +
-                       "are allowed")
+        raise KeyError("only integer or explicit name (scenario_x) are allowed")
 
 
     scenario = pd.read_excel(scen_file, sheet_name=scen_no, header=1, index=None)
@@ -373,7 +373,6 @@ 

Source code for pycirk.make_scenarios

 
         int4 = inter_sets["at2"]
         int4 = basic_add(int3, int4)
-
         M[np.ix_(i, g)] = int4
 
         if subs is True:
@@ -456,7 +455,7 @@ 

Source code for pycirk.make_scenarios

             try:
                 change_type = entry.change_type
                 ide = entry.identifier  # used during debugging
-
+    
                 # Collecting the specified coordinates for the intevention
                 # coordinates for region and category
                 # Row items (i) => Supplied category or extension category
@@ -467,11 +466,14 @@ 

Source code for pycirk.make_scenarios

                 cat_d = sing_pos(entry.cat_d, column_labels)
                 # Identify coordinates
                 orig_coor = coord(cat_o, reg_o, no_reg_labs, no_row_labs)
+                #print(f"row\n ide: {ide}, row: {entry.reg_o}, {entry.cat_o}, {orig_coor}")
                 dest_coor = coord(cat_d, reg_d, no_reg_labs, no_col_labs)
+                #print(f"columns\n ide: {ide}, column: {entry.reg_d}, {entry.cat_d}, {dest_coor}")
+                
                 # organize main changes
                 kt1 = {"kt": entry.kt1, "kp": entry.kp1}
                 kt2 = {"kt": entry.kt2, "kp": entry.kp2}
-
+    
                 intervention = {"change_type": change_type,
                                 "ide": ide,
                                 "i": orig_coor,
@@ -481,24 +483,24 @@ 

Source code for pycirk.make_scenarios

                                 "at1": entry.at1,
                                 "at2": entry.at2,
                                 }
-
+    
                 substitution = False
                 copy = False
-
+    
                 # the following is only relevant for susbtitution
                 if "x" in [entry.Sub, entry.Copy]:
-
+    
                     sub_reg_o = sing_pos(entry.reg_o_sc, reg_labels)
                     sub_cat_o = sing_pos(entry.cat_o_sc, row_labels)
-
+    
                     # Column items => Consumption / manufacturing activity
                     sub_reg_d = sing_pos(entry.reg_d_sc, reg_labels)
                     sub_cat_d = sing_pos(entry.cat_d_sc, column_labels)
-
+    
                     # Translate coordinates from str to numerical position
                     sub_orig_coor = coord(sub_cat_o, sub_reg_o, no_reg_labs, no_row_labs)
                     sub_dest_coor = coord(sub_cat_d, sub_reg_d, no_reg_labs, no_col_labs)
-
+    
                     intervention["swk"] = entry.swk
                     intervention["i1"] = sub_orig_coor
                     intervention["g1"] = sub_dest_coor
@@ -506,7 +508,7 @@ 

Source code for pycirk.make_scenarios

                     intervention["sk2"] = entry.sk2
                     intervention["sk3"] = entry.sk3
                     intervention["sk4"] = entry.sk4
-
+    
                     if entry.Copy == "x":
                         copy = True
                     elif entry.Sub == "x":
@@ -515,115 +517,8 @@ 

Source code for pycirk.make_scenarios

                 raise ValueError(f"Check in this entry for potential coordinate errors in your scenario settings:\n{entry} ")
 
             M = counterfactual_engine(M, intervention, substitution, copy)
-
+    
     return M
- -# ============================================================================= -# ============================================================================= -# # Here I put work that I started but I still need to finish -# ============================================================================= -# ============================================================================= -# ============================================================================= -# -# -# def make_counterfactuals_SUT(data, scen_no, scen_file, labels): -# """ -# Calculate all the counterfactual SUT matrices -# -# Parameters -# ---------- -# data : obj -# An object containing all necessary matrices of the SUT system -# -# scen_no : int -# the identification number of the scenario to reference in scen_file -# -# scen_file : str -# the directory where the scenarios.xlsx file is store -# -# labels : obj -# an object containing all labels for the SUT matrices -# -# Outputs -# ------- -# An object contaning a mofified SUT system -# """ -# -# met = ops.PxP_ITA_MSC -# -# w = ops.IOT.B(data.W, data.inv_diag_g) # Primary input coef -# e = ops.IOT.B(data.E, data.inv_diag_g) # emissions extension coef -# r = ops.IOT.B(data.R, data.inv_diag_g) # Resources extension coef -# m = ops.IOT.B(data.M, data.inv_diag_g) # Materials extension coef -# S = met.S(data.U, data.inv_diag_g) # industry coefficients for intermediate use table -# -# # Start first from a supply approach -# # Supply matrix counterfactual -# data.V = counterfactual(scen_file, scen_no, data.V, "V", labels) -# # new total industry output -# g1 = np.sum(data.V, axis=0) -# # industry use coefficients counterfactual -# S_ = counterfactual(scen_file, scen_no, S, "S", labels) -# -# data.U = counterfactual(scen_file, scen_no, S_ @ np.diag(g1), "U", labels) # industry use transactions counterfactual -# -# W_ = np.array(ops.IOT.R(w, np.diag(g1))) -# -# g2 = np.array(W_[:9].sum(0)) + data.U.sum(0) # recalculate total industry output -# -# g_dif = np.multiply(g2, ops.inv(g1))*100 # calculate the difference between original and new total industry input -# -# # print([round((1-l)*100,4) for l in g_dif if 1-l>.5e-3 and l!=0]) -# q2 = np.sum(data.U, axis=1) + np.sum(data.Y, axis=1) -# -# # updating the supply table to match the new total industry input -# D = met.D(data.V, np.diag(ops.inv(data.V.sum(1)))) -# data.V = D @ np.diag(q2) -# -# q1 = np.sum(data.V, axis=0) # total product output -# -# q_dif = np.multiply(q2, ops.inv(q1)) -# -# g1 = np.sum(data.V, axis=1) -# -# data.E = met.R(e, np.diag(x)) -# -# data.R = met.R(r, np.diag(x)) -# -# data.M = met.R(m, np.diag(x)) -# -# -# return(IOT) -# def balancing_operation(V, U, Y, W): -# """ -# Re-balancing of supply-use tables after data changes -# -# Parameters -# ---------- -# V (supply) : numpy.array -# -# U (use) : numpy.array -# -# Y (final_demand) : numpy.array -# -# W (primary_inputs) : numpy.array -# -# Output -# ------ -# output : dict -# -# It outputs a dictionary containing a re-balanced supply-use tables system -# where: -# V = supply table -# -# U = use table -# -# Y = final demand -# -# W = primary inputs -# -# """ -# =============================================================================
@@ -663,13 +558,11 @@

Related Topics

@@ -690,7 +583,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_modules/pycirk/make_secondary_flows.html b/docs/_build/html/_modules/pycirk/make_secondary_flows.html index 21d4778..9b71549 100644 --- a/docs/_build/html/_modules/pycirk/make_secondary_flows.html +++ b/docs/_build/html/_modules/pycirk/make_secondary_flows.html @@ -1,11 +1,9 @@ - + - - + pycirk.make_secondary_flows — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -124,6 +123,7 @@

Source code for pycirk.make_secondary_flows

     V = V.copy()
     U = U.copy()
     Y = Y.copy()
+    
 
     # position of the secondary material
     des_prod_ix_pos = prod_or + 1
@@ -132,7 +132,7 @@ 

Source code for pycirk.make_secondary_flows

     # getting the value of secondary material from the supply table
     # which is placed on the primary material row
     misplaced = V.iloc[prod_or, des_ind_col_pos]
-
+    
     # placing the misplaced value to the secondary material row
     V.iloc[des_prod_ix_pos, des_ind_col_pos] = np.array(misplaced)
 
@@ -165,17 +165,17 @@ 

Source code for pycirk.make_secondary_flows

 
     eye = np.identity(len(ratio_prim_sec))
 
-    U.iloc[prod_or] = (eye - ratio_prim_sec) @ prim_sec_use_trans
+    U.iloc[prod_or] = (eye - ratio_prim_sec) @ np.array(prim_sec_use_trans)
 
-    U.iloc[des_prod_ix_pos] = ratio_prim_sec @ prim_sec_use_trans
+    U.iloc[des_prod_ix_pos] = ratio_prim_sec @ np.array(prim_sec_use_trans)
 
-    Y.iloc[prod_or] = (eye - ratio_prim_sec) @ prim_sec_fin_dem_trans
+    Y.iloc[prod_or] = (eye - ratio_prim_sec) @ np.array(prim_sec_fin_dem_trans)
 
-    Y.iloc[des_prod_ix_pos] = ratio_prim_sec @ prim_sec_fin_dem_trans
+    Y.iloc[des_prod_ix_pos] = ratio_prim_sec @ np.array(prim_sec_fin_dem_trans)
 
     V.iloc[prod_or, des_ind_col_pos] = 0
 
-    print('splitting off secondary materials ready')
+    print('splitting off secondary materials completed')
 
     return {"V": V,
             "U": U,
@@ -219,13 +219,11 @@ 

Related Topics

@@ -246,7 +244,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_modules/pycirk/organize_io.html b/docs/_build/html/_modules/pycirk/organize_io.html index 0d2f8fa..0d21faf 100644 --- a/docs/_build/html/_modules/pycirk/organize_io.html +++ b/docs/_build/html/_modules/pycirk/organize_io.html @@ -1,11 +1,9 @@ - + - - + pycirk.organize_io — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -45,22 +44,23 @@

Source code for pycirk.organize_io

 @institution: Leiden University CML
 """
 
+import numpy as np
 
 
[docs]def organizer(data): - return {"Z": data["Z"], - "Y": data["Y"], - "W": data["W"], - "E": data["E"], - "R": data["R"], - "M": data["M"], - "EY": data["EY"], - "RY": data["RY"], - "MY": data["MY"], - "Cr_E_k": data["Cr_E_k"], - "Cr_M_k": data["Cr_M_k"], - "Cr_R_k": data["Cr_R_k"], - "Cr_W_k": data["Cr_W_k"] + return {"Z": np.array(data["Z"]), + "Y": np.array(data["Y"]), + "W": np.array(data["W"]), + "E": np.array(data["E"]), + "R": np.array(data["R"]), + "M": np.array(data["M"]), + "EY": np.array(data["EY"]), + "RY": np.array(data["RY"]), + "MY": np.array(data["MY"]), + "Cr_E_k": np.array(data["Cr_E_k"]), + "Cr_M_k": np.array(data["Cr_M_k"]), + "Cr_R_k": np.array(data["Cr_R_k"]), + "Cr_W_k": np.array(data["Cr_W_k"]) }
@@ -101,13 +101,11 @@

Related Topics

@@ -128,7 +126,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_modules/pycirk/positions.html b/docs/_build/html/_modules/pycirk/positions.html index 3e92bf0..fd8e63b 100644 --- a/docs/_build/html/_modules/pycirk/positions.html +++ b/docs/_build/html/_modules/pycirk/positions.html @@ -1,11 +1,9 @@ - + - - + pycirk.positions — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -130,24 +129,26 @@

Source code for pycirk.positions

         no_countries = 1
     else:
         pass
-
+    
     if cat_coord is None:
         s = np.array(range(no_categories * no_countries))
     else:
         n = 0
         while n in range(no_countries):
+
             g = cat_coord[0] + no_categories * n
             if "s" not in locals():
-                s = [g]
+                s = np.array([g])
             else:
-                s = np.hstack([s, g])
+                s = np.append(s, g)
             n = n+1
-
+    
     if reg_coord is None:
         return s
     else:
-        s = np.split(s, no_countries)
-        return np.take(s, reg_coord, axis=0)[0]
+ s = np.split(s, no_countries) + s = s[reg_coord[0]] + return s
[docs]def make_coord_array_for_make_sec(coordinates, no_countries, no_categories): """ @@ -222,13 +223,11 @@

Related Topics

@@ -249,7 +248,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_modules/pycirk/pycirk.html b/docs/_build/html/_modules/pycirk/pycirk.html index 2dbe3bc..b1816c1 100644 --- a/docs/_build/html/_modules/pycirk/pycirk.html +++ b/docs/_build/html/_modules/pycirk/pycirk.html @@ -1,11 +1,9 @@ - + - - + pycirk.pycirk — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -297,13 +296,11 @@

Related Topics

@@ -324,7 +321,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_modules/pycirk/pycirk_settings.html b/docs/_build/html/_modules/pycirk/pycirk_settings.html index 093a7ba..3386efd 100644 --- a/docs/_build/html/_modules/pycirk/pycirk_settings.html +++ b/docs/_build/html/_modules/pycirk/pycirk_settings.html @@ -1,11 +1,9 @@ - + - - + pycirk.pycirk_settings — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -289,7 +288,7 @@

Source code for pycirk.pycirk_settings

 
         loc = dataset_spec["loc"]
         typ = dataset_spec["type"]
-
+        
         try:
             data = self.load_dataset(loc)
         except Exception:
@@ -332,7 +331,7 @@ 

Source code for pycirk.pycirk_settings

                 IOT = data
                 del(data)
 
-        self.assign_labels_to_class()
+        self.lb.organize_unique_labels(self.directory_labels)
 
         return IOT
@@ -353,33 +352,7 @@

Source code for pycirk.pycirk_settings

                                     " check your file:\n\n" + loc)
         return Transform(data)
- -
[docs] def assign_labels_to_class(self): - """ - Assigns all labels to their respective attributes in the Labels class - These are used througout the program to find coordinates and - label results - """ - - all_labels = self.lb.organize_unique_labels(self.directory_labels) - - try: - self.lb.country_labels = all_labels.products.country_code - except Exception: - pass - - self.lb.region_labels = all_labels.products.region - self.lb.product_labels = all_labels.products - self.lb.industry_labels = all_labels.industries - self.lb.W_labels = all_labels.primary - self.lb.E_labels = all_labels.emis - self.lb.R_labels = all_labels.res - self.lb.M_labels = all_labels.mat - self.lb.Y_labels = all_labels.fin_dem - self.lb.Cr_E_labels = all_labels.car_emis - self.lb.Cr_R_labels = all_labels.car_res - self.lb.Cr_M_labels = all_labels.car_mat - self.lb.Cr_W_labels = all_labels.car_prim
+
[docs] def set_IO_scenario(self, data, scen_no): """ @@ -449,13 +422,11 @@

Related Topics

@@ -476,7 +447,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_modules/pycirk/results.html b/docs/_build/html/_modules/pycirk/results.html index d31f355..c1df33f 100644 --- a/docs/_build/html/_modules/pycirk/results.html +++ b/docs/_build/html/_modules/pycirk/results.html @@ -1,11 +1,9 @@ - + - - + pycirk.results — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -75,27 +74,13 @@

Source code for pycirk.results

     
     return results
- -
[docs]def retrieve_specified_data(data, spec_row, labels): - """ - Separate, collect and rename results for base and scenarios according - to specifications under th sheet "analysis" in scenarios.xls - - data = any IOT table - spec_row = row in the scenarios sheet specifying settings - """ - - pd.options.display.float_format = '{:,.4f}'.format - - M_name = spec_row.matrix # matrix of reference - - if "Cr" in M_name: - data = ops.calculate_characterized(data) - +
[docs]def rsd_engine(data, M_name, spec_row, labels): + + M = np.array(data[M_name]) # Call specific matrix from which to select - + spec_labels = labels.identify_labels(M_name) - + reg_labels = spec_labels["reg_labels"] row_labels = spec_labels["i_labels"] column_labels = spec_labels["g_labels"] @@ -124,14 +109,13 @@

Source code for pycirk.results

         raise ValueError(f"\nThe specified coordinates to retrieve results are wrong.\nPlease check that name and matrix in your scenarios.xlsx file are correct.\nCheck: {M_name, i_cat}")
 
 
-    if "tot" in M_name:
-        select = df([M[i].sum()])
-    else:
-        select = df([M[np.ix_(i, g)].sum()])
+
+    select = df([M[np.ix_(i, g)].sum()])
 
 
     key_names = ["matrix", "i_category", "i_region", "g_category",
-                 "g_region", "unit"]
+                 "g_region", "unit"] 
+        
 
     try:
         unit = str(row_labels.unit[cat_o].iloc[0])
@@ -141,8 +125,48 @@ 

Source code for pycirk.results

     index_label = [M_name, i_cat, i_reg, g_cat, g_reg, unit]
 
     select.index = mi.from_tuples([index_label], names=key_names)
-
+    
     return select
+ +
[docs]def retrieve_specified_data(data, spec_row, labels): + """ + Separate, collect and rename results for base and scenarios according + to specifications under th sheet "analysis" in scenarios.xls + + data = any IOT table + spec_row = row in the scenarios sheet specifying settings + """ + + pd.options.display.float_format = '{:,.4f}'.format + + M_name = spec_row.matrix # matrix of reference + + if "Cr" in M_name: + data = ops.calculate_characterized(data) + + if "tot" in M_name: + M_name_1 = M_name[-1] + M_name_2 = M_name[-1] + "Y" + + if "Cr" in M_name: + M_name_1 = "Cr_" + M_name_1 + M_name_2 = "Cr_" + M_name_2 + + + output = rsd_engine(data, M_name_1, spec_row, labels) + output = output + rsd_engine(data, M_name_2, spec_row, labels).values + index_label = [list(i) for i in output.index][0] + index_label[0] = M_name + key_names = output.index.names + output.index = mi.from_tuples([index_label], names=key_names) + else: + output = rsd_engine(data, M_name, spec_row, labels) + + return output
+ + + +
@@ -182,13 +206,11 @@

Related Topics

@@ -209,7 +231,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 diff --git a/docs/_build/html/_modules/pycirk/save_utils.html b/docs/_build/html/_modules/pycirk/save_utils.html index 6e333b8..f389bb9 100644 --- a/docs/_build/html/_modules/pycirk/save_utils.html +++ b/docs/_build/html/_modules/pycirk/save_utils.html @@ -1,11 +1,9 @@ - + - - + pycirk.save_utils — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -179,13 +178,11 @@

Related Topics

@@ -206,7 +203,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 diff --git a/docs/_build/html/_modules/pycirk/transformation_methods.html b/docs/_build/html/_modules/pycirk/transformation_methods.html index 6387d6a..d3e576f 100644 --- a/docs/_build/html/_modules/pycirk/transformation_methods.html +++ b/docs/_build/html/_modules/pycirk/transformation_methods.html @@ -1,11 +1,9 @@ - + - - + pycirk.transformation_methods — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -55,16 +54,16 @@

Source code for pycirk.transformation_methods

def __init__(self, SUTs): # Baseline monetary data - self.V = SUTs["V"] # Supply matrix - self.U = SUTs["U"] # Intermediate use - self.Y = SUTs["Y"] # Final demand - self.W = SUTs["W"] # Primary input - self.E = SUTs["E"] # emissions extension - self.EY = SUTs["YE"] # emissions extension final demand - self.R = SUTs["R"] # Resources extension - self.RY = SUTs["YR"] # Resources extension final demand - self.M = SUTs["M"] # Materials extension - self.MY = SUTs["YM"] # Materials extension final demand + self.V = np.array(SUTs["V"]) # Supply matrix + self.U = np.array(SUTs["U"]) # Intermediate use + self.Y = np.array(SUTs["Y"]) # Final demand + self.W = np.array(SUTs["W"]) # Primary input + self.E = np.array(SUTs["E"]) # emissions extension + self.EY = np.array(SUTs["YE"]) # emissions extension final demand + self.R = np.array(SUTs["R"]) # Resources extension + self.RY = np.array(SUTs["YR"]) # Resources extension final demand + self.M = np.array(SUTs["M"]) # Materials extension + self.MY = np.array(SUTs["YM"]) # Materials extension final demand self.Cr_E_k = SUTs["Cr_E_k"] # Charact coefficients emissions self.Cr_R_k = SUTs["Cr_R_k"] # Charact coefficients resources @@ -123,8 +122,6 @@

Source code for pycirk.transformation_methods

del(self.M) M = met.R(m, np.diag(x)) - x = ops.IOT.x_IAy(L, self.yi) # total product ouput - A = ops.IOT.A(Z, self.inv_diag_q) return {"Y": self.Y, @@ -155,11 +152,12 @@

Source code for pycirk.transformation_methods

S = met.S(self.U, self.inv_diag_g) # ind. interm. coef. => in EUROSTAT manual shown as S D = met.D(self.V, self.inv_diag_q) # Market shares A = met.A(S, D) # technical coefficient matrix + L = met.L(A) # leontief inverse w = met.B(self.W, D, self.inv_diag_g) # primary inputs x = ops.IOT.x_IAy(L, self.yi) W = ops.IOT.R(w, np.diag(x)) - Z = met.Z(S, D, self.diag_q) # intermediates + Z = met.Z(S, D, np.diag(x)) # intermediates ver_base = ops.verifyIOT(Z, self.Y, W) del(self.V) del(self.U) @@ -177,10 +175,6 @@

Source code for pycirk.transformation_methods

del(self.M) M = met.R(m, np.diag(x)) - x = ops.IOT.x_IAy(L, self.yi) # total product ouput - - A = ops.IOT.A(Z, self.inv_diag_q) - return {"Y": self.Y, "L": L, "Z": Z, @@ -239,13 +233,11 @@

Related Topics

@@ -266,7 +258,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12
diff --git a/docs/_build/html/_sources/pycirk.rst.txt b/docs/_build/html/_sources/pycirk.rst.txt index 3262eb4..4258a86 100644 --- a/docs/_build/html/_sources/pycirk.rst.txt +++ b/docs/_build/html/_sources/pycirk.rst.txt @@ -8,103 +8,103 @@ pycirk.cli module ----------------- .. automodule:: pycirk.cli - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.fundamental\_operations module ------------------------------------- .. automodule:: pycirk.fundamental_operations - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.labels module -------------------- .. automodule:: pycirk.labels - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.make\_scenarios module ----------------------------- .. automodule:: pycirk.make_scenarios - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.make\_secondary\_flows module ------------------------------------ .. automodule:: pycirk.make_secondary_flows - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.organize\_io module -------------------------- .. automodule:: pycirk.organize_io - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.positions module ----------------------- .. automodule:: pycirk.positions - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.pycirk module -------------------- .. automodule:: pycirk.pycirk - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.pycirk\_settings module ------------------------------ .. automodule:: pycirk.pycirk_settings - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.results module --------------------- .. automodule:: pycirk.results - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.save\_utils module ------------------------- .. automodule:: pycirk.save_utils - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.transformation\_methods module ------------------------------------- .. automodule:: pycirk.transformation_methods - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: Module contents --------------- .. automodule:: pycirk - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_build/html/_static/ajax-loader.gif b/docs/_build/html/_static/ajax-loader.gif deleted file mode 100644 index 61faf8cab23993bd3e1560bff0668bd628642330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css index 104f076..ea6972d 100644 --- a/docs/_build/html/_static/basic.css +++ b/docs/_build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -231,6 +231,16 @@ a.headerlink { visibility: hidden; } +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -279,6 +289,12 @@ img.align-center, .figure.align-center, object.align-center { margin-right: auto; } +img.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + .align-left { text-align: left; } @@ -287,6 +303,10 @@ img.align-center, .figure.align-center, object.align-center { text-align: center; } +.align-default { + text-align: center; +} + .align-right { text-align: right; } @@ -358,6 +378,11 @@ table.align-center { margin-right: auto; } +table.align-default { + margin-left: auto; + margin-right: auto; +} + table caption span.caption-number { font-style: italic; } @@ -391,6 +416,16 @@ table.citation td { border-bottom: none; } +th > p:first-child, +td > p:first-child { + margin-top: 0px; +} + +th > p:last-child, +td > p:last-child { + margin-bottom: 0px; +} + /* -- figures --------------------------------------------------------------- */ div.figure { @@ -460,11 +495,58 @@ ol.upperroman { list-style: upper-roman; } +li > p:first-child { + margin-top: 0px; +} + +li > p:last-child { + margin-bottom: 0px; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + dl { margin-bottom: 15px; } -dd p { +dd > p:first-child { margin-top: 0px; } @@ -537,6 +619,12 @@ dl.glossary dt { font-style: oblique; } +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + abbr, acronym { border-bottom: dotted 1px; cursor: help; diff --git a/docs/_build/html/_static/comment-bright.png b/docs/_build/html/_static/comment-bright.png deleted file mode 100644 index 15e27edb12ac25701ac0ac21b97b52bb4e45415e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js index ffadbec..b33f87f 100644 --- a/docs/_build/html/_static/doctools.js +++ b/docs/_build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -87,14 +87,13 @@ jQuery.fn.highlightText = function(text, className) { node.nextSibling)); node.nodeValue = val.substr(0, pos); if (isInSVG) { - var bbox = span.getBBox(); var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - rect.x.baseVal.value = bbox.x; + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute('class', className); - var parentOfText = node.parentNode.parentNode; addItems.push({ "parent": node.parentNode, "target": rect}); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js index a6b6ac6..75deb87 100644 --- a/docs/_build/html/_static/documentation_options.js +++ b/docs/_build/html/_static/documentation_options.js @@ -6,291 +6,5 @@ var DOCUMENTATION_OPTIONS = { FILE_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SEARCH_LANGUAGE_STOP_WORDS: ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"] -}; - - - -/* Non-minified version JS is _stemmer.js if file is provided */ -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - - - - - -var splitChars = (function() { - var result = {}; - var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, - 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, - 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, - 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, - 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, - 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, - 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, - 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, - 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, - 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; - var i, j, start, end; - for (i = 0; i < singles.length; i++) { - result[singles[i]] = true; - } - var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], - [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], - [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], - [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], - [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], - [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], - [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], - [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], - [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], - [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], - [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], - [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], - [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], - [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], - [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], - [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], - [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], - [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], - [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], - [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], - [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], - [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], - [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], - [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], - [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], - [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], - [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], - [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], - [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], - [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], - [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], - [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], - [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], - [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], - [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], - [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], - [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], - [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], - [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], - [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], - [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], - [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], - [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], - [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], - [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], - [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], - [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], - [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], - [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; - for (i = 0; i < ranges.length; i++) { - start = ranges[i][0]; - end = ranges[i][1]; - for (j = start; j <= end; j++) { - result[j] = true; - } - } - return result; -})(); - -function splitQuery(query) { - var result = []; - var start = -1; - for (var i = 0; i < query.length; i++) { - if (splitChars[query.charCodeAt(i)]) { - if (start !== -1) { - result.push(query.slice(start, i)); - start = -1; - } - } else if (start === -1) { - start = i; - } - } - if (start !== -1) { - result.push(query.slice(start)); - } - return result; -} - - + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/docs/_build/html/_static/down-pressed.png b/docs/_build/html/_static/down-pressed.png deleted file mode 100644 index 5756c8cad8854722893dc70b9eb4bb0400343a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl diff --git a/docs/_build/html/_static/down.png b/docs/_build/html/_static/down.png deleted file mode 100644 index 1b3bdad2ceffae91cee61b32f3295f9bbe646e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* diff --git a/docs/_build/html/_static/jquery-3.2.1.js b/docs/_build/html/_static/jquery-3.4.1.js similarity index 89% rename from docs/_build/html/_static/jquery-3.2.1.js rename to docs/_build/html/_static/jquery-3.4.1.js index d2d8ca4..773ad95 100644 --- a/docs/_build/html/_static/jquery-3.2.1.js +++ b/docs/_build/html/_static/jquery-3.4.1.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v3.2.1 + * jQuery JavaScript Library v3.4.1 * https://jquery.com/ * * Includes Sizzle.js @@ -9,7 +9,7 @@ * Released under the MIT license * https://jquery.org/license * - * Date: 2017-03-20T18:59Z + * Date: 2019-05-01T21:04Z */ ( function( global, factory ) { @@ -71,16 +71,70 @@ var ObjectFunctionString = fnToString.call( Object ); var support = {}; +var isFunction = function isFunction( obj ) { + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; - function DOMEval( code, doc ) { + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { doc = doc || document; - var script = doc.createElement( "script" ); + var i, val, + script = doc.createElement( "script" ); script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } doc.head.appendChild( script ).parentNode.removeChild( script ); } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module @@ -88,7 +142,7 @@ var support = {}; var - version = "3.2.1", + version = "3.4.1", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -100,16 +154,7 @@ var // Support: Android <=4.0 only // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; jQuery.fn = jQuery.prototype = { @@ -209,7 +254,7 @@ jQuery.extend = jQuery.fn.extend = function() { } // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } @@ -226,25 +271,28 @@ jQuery.extend = jQuery.fn.extend = function() { // Extend the base object for ( name in options ) { - src = target[ name ]; copy = options[ name ]; + // Prevent Object.prototype pollution // Prevent never-ending loop - if ( target === copy ) { + if ( name === "__proto__" || target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; + clone = src; } + copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); @@ -275,28 +323,6 @@ jQuery.extend( { noop: function() {}, - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - isPlainObject: function( obj ) { var proto, Ctor; @@ -319,9 +345,6 @@ jQuery.extend( { }, isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 var name; for ( name in obj ) { @@ -330,27 +353,9 @@ jQuery.extend( { return true; }, - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + globalEval: function( code, options ) { + DOMEval( code, { nonce: options && options.nonce } ); }, each: function( obj, callback ) { @@ -473,37 +478,6 @@ jQuery.extend( { // A global GUID counter for objects guid: 1, - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support @@ -526,9 +500,9 @@ function isArrayLike( obj ) { // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); + type = toType( obj ); - if ( type === "function" || jQuery.isWindow( obj ) ) { + if ( isFunction( obj ) || isWindow( obj ) ) { return false; } @@ -537,14 +511,14 @@ function isArrayLike( obj ) { } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.3.3 + * Sizzle CSS Selector Engine v2.3.4 * https://sizzlejs.com/ * - * Copyright jQuery Foundation and other contributors + * Copyright JS Foundation and other contributors * Released under the MIT license - * http://jquery.org/license + * https://js.foundation/ * - * Date: 2016-08-08 + * Date: 2019-04-08 */ (function( window ) { @@ -578,6 +552,7 @@ var i, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), + nonnativeSelectorCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; @@ -639,8 +614,7 @@ var i, rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), @@ -661,6 +635,7 @@ var i, whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, + rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, @@ -715,9 +690,9 @@ var i, setDocument(); }, - disabledAncestor = addCombinator( + inDisabledFieldset = addCombinator( function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; }, { dir: "parentNode", next: "legend" } ); @@ -830,18 +805,22 @@ function Sizzle( selector, context, results, seed ) { // Take advantage of querySelectorAll if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; + !nonnativeSelectorCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) && - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 + // Support: IE 8 only // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { + (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && rdescend.test( selector ) ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { @@ -863,17 +842,16 @@ function Sizzle( selector, context, results, seed ) { context; } - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); } } } @@ -1037,7 +1015,7 @@ function createDisabledPseudo( disabled ) { // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; + inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; @@ -1094,10 +1072,13 @@ support = Sizzle.support = {}; * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; + var namespace = elem.namespaceURI, + docElem = (elem.ownerDocument || elem).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); }; /** @@ -1519,11 +1500,8 @@ Sizzle.matchesSelector = function( elem, expr ) { setDocument( elem ); } - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && + !nonnativeSelectorCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { @@ -1537,7 +1515,9 @@ Sizzle.matchesSelector = function( elem, expr ) { elem.document && elem.document.nodeType !== 11 ) { return ret; } - } catch (e) {} + } catch (e) { + nonnativeSelectorCache( expr, true ); + } } return Sizzle( expr, document, null, [ elem ] ).length > 0; @@ -1996,7 +1976,7 @@ Expr = Sizzle.selectors = { "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; }), @@ -2135,7 +2115,11 @@ Expr = Sizzle.selectors = { }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } @@ -2848,11 +2832,9 @@ var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>| -var risSimple = /^.[^:#\[\.,]*$/; - // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { + if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); @@ -2872,16 +2854,8 @@ function winnow( elements, qualifier, not ) { } ); } - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { @@ -3002,7 +2976,7 @@ var rootjQuery, for ( match in context ) { // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { + if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes @@ -3045,7 +3019,7 @@ var rootjQuery, // HANDLE: $(function) // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { + } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : @@ -3195,18 +3169,18 @@ jQuery.each( { return siblings( elem.firstChild ); }, contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } + if ( typeof elem.contentDocument !== "undefined" ) { + return elem.contentDocument; + } - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } - return jQuery.merge( [], elem.childNodes ); + return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { @@ -3360,11 +3334,11 @@ jQuery.Callbacks = function( options ) { ( function add( args ) { jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { + if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); @@ -3479,11 +3453,11 @@ function adoptValue( value, resolve, reject, noValue ) { try { // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables @@ -3541,14 +3515,14 @@ jQuery.extend( { jQuery.each( tuples, function( i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { + if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) @@ -3602,7 +3576,7 @@ jQuery.extend( { returned.then; // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { + if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { @@ -3698,7 +3672,7 @@ jQuery.extend( { resolve( 0, newDefer, - jQuery.isFunction( onProgress ) ? + isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith @@ -3710,7 +3684,7 @@ jQuery.extend( { resolve( 0, newDefer, - jQuery.isFunction( onFulfilled ) ? + isFunction( onFulfilled ) ? onFulfilled : Identity ) @@ -3721,7 +3695,7 @@ jQuery.extend( { resolve( 0, newDefer, - jQuery.isFunction( onRejected ) ? + isFunction( onRejected ) ? onRejected : Thrower ) @@ -3761,8 +3735,15 @@ jQuery.extend( { // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock ); } @@ -3832,7 +3813,7 @@ jQuery.extend( { // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } @@ -3960,7 +3941,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { bulk = key == null; // Sets many values - if ( jQuery.type( key ) === "object" ) { + if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); @@ -3970,7 +3951,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { } else if ( value !== undefined ) { chainable = true; - if ( !jQuery.isFunction( value ) ) { + if ( !isFunction( value ) ) { raw = true; } @@ -4012,6 +3993,23 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { return len ? fn( elems[ 0 ], key ) : emptyGet; }; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} var acceptData = function( owner ) { // Accepts only: @@ -4074,14 +4072,14 @@ Data.prototype = { // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; + cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; @@ -4091,7 +4089,7 @@ Data.prototype = { this.cache( owner ) : // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { @@ -4139,9 +4137,9 @@ Data.prototype = { // If key is an array of keys... // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); + key = key.map( camelCase ); } else { - key = jQuery.camelCase( key ); + key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace @@ -4287,7 +4285,7 @@ jQuery.fn.extend( { if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); + name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } @@ -4491,6 +4489,26 @@ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; @@ -4505,7 +4523,7 @@ var isHiddenWithinTree = function( elem, el ) { // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. - jQuery.contains( elem.ownerDocument, elem ) && + isAttached( elem ) && jQuery.css( elem, "display" ) === "none"; }; @@ -4534,8 +4552,7 @@ var swap = function( elem, options, callback, args ) { function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, + var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { @@ -4548,35 +4565,39 @@ function adjustCSS( elem, prop, valueParts, tween ) { unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; - // Make sure we update the tween properties later on - valueParts = valueParts || []; - // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; + while ( maxIterations-- ) { - // Adjust and apply - initialInUnit = initialInUnit / scale; + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; } if ( valueParts ) { @@ -4692,9 +4713,9 @@ jQuery.fn.extend( { } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); @@ -4764,7 +4785,7 @@ function setGlobalEval( elems, refElements ) { var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, + var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, @@ -4776,7 +4797,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { if ( elem || elem === 0 ) { // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { + if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit @@ -4828,13 +4849,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) { continue; } - contains = jQuery.contains( elem.ownerDocument, elem ); + attached = isAttached( elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history - if ( contains ) { + if ( attached ) { setGlobalEval( tmp ); } @@ -4877,8 +4898,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) { div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; } )(); -var documentElement = document.documentElement; - var @@ -4894,8 +4913,19 @@ function returnFalse() { return false; } +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + // Support: IE <=9 only -// See #13393 for more info +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 function safeActiveElement() { try { return document.activeElement; @@ -5195,9 +5225,10 @@ jQuery.event = { while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; @@ -5286,7 +5317,7 @@ jQuery.event = { enumerable: true, configurable: true, - get: jQuery.isFunction( hook ) ? + get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); @@ -5321,39 +5352,51 @@ jQuery.event = { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, - focus: { + click: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); } + + // Return false to allow normal processing in the caller + return false; }, - delegateType: "focusout" - }, - click: { + trigger: function( data ) { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); } + + // Return non-false to allow normal event-path propagation + return true; }, - // For cross-browser consistency, don't fire native .click() on links + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack _default: function( event ) { - return nodeName( event.target, "a" ); + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); } }, @@ -5370,6 +5413,93 @@ jQuery.event = { } }; +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects @@ -5421,7 +5551,7 @@ jQuery.Event = function( src, props ) { } // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); + this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; @@ -5482,6 +5612,7 @@ jQuery.each( { shiftKey: true, view: true, "char": true, + code: true, charCode: true, key: true, keyCode: true, @@ -5528,6 +5659,33 @@ jQuery.each( { } }, jQuery.event.addProp ); +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout @@ -5620,14 +5778,13 @@ var /* eslint-enable */ - // Support: IE <=10 - 11, Edge 12 - 13 + // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows @@ -5635,7 +5792,7 @@ function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - return jQuery( ">tbody", elem )[ 0 ] || elem; + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; @@ -5647,10 +5804,8 @@ function disableScript( elem ) { return elem; } function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } @@ -5716,15 +5871,15 @@ function domManip( collection, args, callback, ignored ) { l = collection.length, iNoClone = l - 1, value = args[ 0 ], - isFunction = jQuery.isFunction( value ); + valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || + if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); - if ( isFunction ) { + if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); @@ -5778,14 +5933,16 @@ function domManip( collection, args, callback, ignored ) { !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - if ( node.src ) { + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + } ); } } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } } @@ -5807,7 +5964,7 @@ function remove( elem, selector, keepData ) { } if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + if ( keepData && isAttached( node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); @@ -5825,7 +5982,7 @@ jQuery.extend( { clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); + inPage = isAttached( elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && @@ -6065,8 +6222,6 @@ jQuery.each( { return this.pushStack( ret ); }; } ); -var rmargin = ( /^margin/ ); - var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { @@ -6083,6 +6238,8 @@ var getStyles = function( elem ) { return view.getComputedStyle( elem ); }; +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + ( function() { @@ -6096,25 +6253,35 @@ var getStyles = function( elem ) { return; } + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - // Support: Android 4.0 - 4.3 only + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; documentElement.removeChild( container ); @@ -6123,7 +6290,12 @@ var getStyles = function( elem ) { div = null; } - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); @@ -6138,26 +6310,26 @@ var getStyles = function( elem ) { div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, - pixelMarginRight: function() { + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { computeStyleTests(); - return pixelMarginRightVal; + return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; } } ); } )(); @@ -6180,7 +6352,7 @@ function curCSS( elem, name, computed ) { if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } @@ -6189,7 +6361,7 @@ function curCSS( elem, name, computed ) { // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; @@ -6236,30 +6408,13 @@ function addGetHookIf( conditionFn, hookFn ) { } -var +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property +// Return a vendor-prefixed property or undefined function vendorPropName( name ) { - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; @@ -6272,16 +6427,33 @@ function vendorPropName( name ) { } } -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; } - return ret; + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; } + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + function setPositiveNumber( elem, value, subtract ) { // Any relative (+/-) values have already been @@ -6294,87 +6466,137 @@ function setPositiveNumber( elem, value, subtract ) { value; } -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; } for ( ; i < 4; i += 2 ) { - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } - if ( isBorderBox ) { + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" } else { - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } - return val; + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; } -function getWidthOrHeight( elem, name, extra ) { +function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style - var valueIsBorderBox, - styles = getStyles( elem ), - val = curCSS( elem, name, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - // Computed unit is not pixels. Stop here and return. + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { - return val; + if ( !extra ) { + return val; + } + val = "auto"; } - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - // Fall back to offsetWidth/Height when value is "auto" + // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) - if ( val === "auto" ) { - val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + // Support: IE 9-11 only + // Also use offsetWidth/offsetHeight for when box sizing is unreliable + // We use getClientRects() to check for hidden/disconnected. + // In those cases, the computed value can be trusted to be border-box + if ( ( !support.boxSizingReliable() && isBorderBox || + val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } } - // Normalize "", auto, and prepare for extra + // Normalize "" and auto val = parseFloat( val ) || 0; - // Use the active box-sizing model to add/subtract irrelevant styles + // Adjust for the element's box model return ( val + - augmentWidthOrHeight( + boxModelAdjustment( elem, - name, + dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, - styles + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val ) ) + "px"; } @@ -6404,6 +6626,13 @@ jQuery.extend( { "flexGrow": true, "flexShrink": true, "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, "lineHeight": true, "opacity": true, "order": true, @@ -6415,9 +6644,7 @@ jQuery.extend( { // Add in properties whose names you wish to fix before // setting or getting the value - cssProps: { - "float": "cssFloat" - }, + cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { @@ -6429,7 +6656,7 @@ jQuery.extend( { // Make sure that we're working with the right name var ret, type, hooks, - origName = jQuery.camelCase( name ), + origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; @@ -6461,7 +6688,9 @@ jQuery.extend( { } // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } @@ -6497,7 +6726,7 @@ jQuery.extend( { css: function( elem, name, extra, styles ) { var val, num, hooks, - origName = jQuery.camelCase( name ), + origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't @@ -6535,8 +6764,8 @@ jQuery.extend( { } } ); -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { +jQuery.each( [ "height", "width" ], function( i, dimension ) { + jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { @@ -6552,29 +6781,52 @@ jQuery.each( [ "height", "width" ], function( i, name ) { // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); + return getWidthOrHeight( elem, dimension, extra ); } ) : - getWidthOrHeight( elem, name, extra ); + getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 ); + } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { - elem.style[ name ] = value; - value = jQuery.css( elem, name ); + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); @@ -6618,7 +6870,7 @@ jQuery.each( { } }; - if ( !rmargin.test( prefix ) ) { + if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); @@ -6728,9 +6980,9 @@ Tween.propHooks = { // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; @@ -6789,7 +7041,7 @@ function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); - return ( fxNow = jQuery.now() ); + return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation @@ -6893,9 +7145,10 @@ function defaultPrefilter( elem, props, opts ) { // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { - // Support: IE <=9 - 11, Edge 12 - 13 + // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade @@ -7003,7 +7256,7 @@ function propFilter( props, specialEasing ) { // camelCase, specialEasing and expand cssHook pass for ( index in props ) { - name = jQuery.camelCase( index ); + name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { @@ -7128,9 +7381,9 @@ function Animation( elem, properties, options ) { for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { + if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); + result.stop.bind( result ); } return result; } @@ -7138,7 +7391,7 @@ function Animation( elem, properties, options ) { jQuery.map( props, createTween, animation ); - if ( jQuery.isFunction( animation.opts.start ) ) { + if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } @@ -7171,7 +7424,7 @@ jQuery.Animation = jQuery.extend( Animation, { }, tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { + if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { @@ -7203,9 +7456,9 @@ jQuery.Animation = jQuery.extend( Animation, { jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, + isFunction( speed ) && speed, duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off @@ -7232,7 +7485,7 @@ jQuery.speed = function( speed, easing, fn ) { opt.old = opt.complete; opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { + if ( isFunction( opt.old ) ) { opt.old.call( this ); } @@ -7396,7 +7649,7 @@ jQuery.fx.tick = function() { i = 0, timers = jQuery.timers; - fxNow = jQuery.now(); + fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; @@ -7749,7 +8002,7 @@ jQuery.each( [ // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); @@ -7760,20 +8013,30 @@ function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; - if ( jQuery.isFunction( value ) ) { + if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; + classes = classesToArray( value ); + if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); @@ -7802,7 +8065,7 @@ jQuery.fn.extend( { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; - if ( jQuery.isFunction( value ) ) { + if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); @@ -7812,9 +8075,9 @@ jQuery.fn.extend( { return this.attr( "class", "" ); } - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; + classes = classesToArray( value ); + if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); @@ -7844,13 +8107,14 @@ jQuery.fn.extend( { }, toggleClass: function( value, stateVal ) { - var type = typeof value; + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); - if ( typeof stateVal === "boolean" && type === "string" ) { + if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } - if ( jQuery.isFunction( value ) ) { + if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), @@ -7862,12 +8126,12 @@ jQuery.fn.extend( { return this.each( function() { var className, i, self, classNames; - if ( type === "string" ) { + if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; + classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { @@ -7926,7 +8190,7 @@ var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { - var hooks, ret, isFunction, + var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { @@ -7955,7 +8219,7 @@ jQuery.fn.extend( { return; } - isFunction = jQuery.isFunction( value ); + valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; @@ -7964,7 +8228,7 @@ jQuery.fn.extend( { return; } - if ( isFunction ) { + if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; @@ -8106,18 +8370,24 @@ jQuery.each( [ "radio", "checkbox" ], function() { // Return jQuery for attributes-only inclusion -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { - var i, cur, tmp, bubbleType, ontype, handle, special, + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - cur = tmp = elem = elem || document; + cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { @@ -8169,7 +8439,7 @@ jQuery.extend( jQuery.event, { // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { @@ -8189,7 +8459,7 @@ jQuery.extend( jQuery.event, { // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - + lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; @@ -8221,7 +8491,7 @@ jQuery.extend( jQuery.event, { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; @@ -8232,7 +8502,17 @@ jQuery.extend( jQuery.event, { // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + jQuery.event.triggered = undefined; if ( tmp ) { @@ -8278,31 +8558,6 @@ jQuery.fn.extend( { } ); -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 @@ -8346,7 +8601,7 @@ if ( !support.focusin ) { } var location = window.location; -var nonce = jQuery.now(); +var nonce = Date.now(); var rquery = ( /\?/ ); @@ -8404,7 +8659,7 @@ function buildParams( prefix, obj, traditional, add ) { } } ); - } else if ( !traditional && jQuery.type( obj ) === "object" ) { + } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { @@ -8426,7 +8681,7 @@ jQuery.param = function( a, traditional ) { add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? + var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; @@ -8434,6 +8689,10 @@ jQuery.param = function( a, traditional ) { encodeURIComponent( value == null ? "" : value ); }; + if ( a == null ) { + return ""; + } + // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { @@ -8544,7 +8803,7 @@ function addToPrefiltersOrTransports( structure ) { i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - if ( jQuery.isFunction( func ) ) { + if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { @@ -8936,12 +9195,14 @@ jQuery.extend( { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); } } - match = responseHeaders[ key.toLowerCase() ]; + match = responseHeaders[ key.toLowerCase() + " " ]; } - return match == null ? null : match; + return match == null ? null : match.join( ", " ); }, // Raw string @@ -9016,7 +9277,7 @@ jQuery.extend( { if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); - // Support: IE <=8 - 11, Edge 12 - 13 + // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { @@ -9074,8 +9335,8 @@ jQuery.extend( { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); - // If data is available, append data to url - if ( s.data ) { + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry @@ -9312,7 +9573,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { + if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; @@ -9330,7 +9591,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) { } ); -jQuery._evalUrl = function( url ) { +jQuery._evalUrl = function( url, options ) { return jQuery.ajax( { url: url, @@ -9340,7 +9601,16 @@ jQuery._evalUrl = function( url ) { cache: true, async: false, global: false, - "throws": true + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options ); + } } ); }; @@ -9350,7 +9620,7 @@ jQuery.fn.extend( { var wrap; if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { + if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } @@ -9376,7 +9646,7 @@ jQuery.fn.extend( { }, wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { + if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); @@ -9396,10 +9666,10 @@ jQuery.fn.extend( { }, wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); + var htmlIsFunction = isFunction( html ); return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, @@ -9491,7 +9761,8 @@ jQuery.ajaxTransport( function( options ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); @@ -9531,7 +9802,7 @@ jQuery.ajaxTransport( function( options ) { // Listen to events xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort @@ -9622,24 +9893,21 @@ jQuery.ajaxPrefilter( "script", function( s ) { // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { - // This transport only deals with cross domain requests - if ( s.crossDomain ) { + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { var script, callback; return { send: function( _, complete ) { - script = jQuery( " + @@ -38,7 +37,7 @@

Credits

Development Lead

@@ -89,13 +88,11 @@

Related Topics

@@ -116,7 +113,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/contributing.html b/docs/_build/html/contributing.html index 9f66ae8..03c339f 100644 --- a/docs/_build/html/contributing.html +++ b/docs/_build/html/contributing.html @@ -1,11 +1,9 @@ - + - - + Contributing — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -45,9 +44,9 @@

Report Bugshttps://github.com/FDonati/pycirk/issues.

If you are reporting a bug, please include:

    -
  • Your operating system name and version.
  • -
  • Any details about your local setup that might be helpful in troubleshooting.
  • -
  • Detailed steps to reproduce the bug.
  • +
  • Your operating system name and version.

  • +
  • Any details about your local setup that might be helpful in troubleshooting.

  • +
  • Detailed steps to reproduce the bug.

@@ -71,10 +70,10 @@

Submit Feedbackhttps://github.com/FDonati/pycirk/issues.

If you are proposing a feature:

    -
  • Explain in detail how it would work.
  • -
  • Keep the scope as narrow as possible, to make it easier to implement.
  • -
  • Remember that this is a volunteer-driven project, and that contributions -are welcome :)
  • +
  • Explain in detail how it would work.

  • +
  • Keep the scope as narrow as possible, to make it easier to implement.

  • +
  • Remember that this is a volunteer-driven project, and that contributions +are welcome :)

@@ -82,27 +81,26 @@

Submit Feedback

Ready to contribute? Here’s how to set up pycirk for local development.

    -
  1. Fork the pycirk repo on GitHub.

    -
  2. -
  3. Clone your fork locally:

    +
  4. Fork the pycirk repo on GitHub.

  5. +
  6. Clone your fork locally:

    $ git clone git@github.com:your_name_here/pycirk.git
     
  7. -
  8. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:

    +
  9. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:

    $ mkvirtualenv pycirk
     $ cd pycirk/
     $ python setup.py develop
     
  10. -
  11. Create a branch for local development:

    +
  12. Create a branch for local development:

    $ git checkout -b name-of-your-bugfix-or-feature
     

    Now you can make your changes locally.

  13. -
  14. When you’re done making changes, check that your changes pass flake8 and the +

  15. When you’re done making changes, check that your changes pass flake8 and the tests, including testing other Python versions with tox:

Pull Request Guidelines

Before you submit a pull request, check that it meets these guidelines:

    -
  1. The pull request should include tests.
  2. -
  3. If the pull request adds functionality, the docs should be updated. Put +
  4. The pull request should include tests.

  5. +
  6. If the pull request adds functionality, the docs should be updated. Put your new functionality into a function with a docstring, and add the -feature to the list in README.rst.

  7. -
  8. The pull request should work for Python 2.7, 3.4, 3.5 and 3.6, and for PyPy. Check +feature to the list in README.rst.

  9. +
  10. The pull request should work for Python 2.7, 3.4, 3.5 and 3.6, and for PyPy. Check https://travis-ci.org/FDonati/pycirk/pull_requests -and make sure that the tests pass for all supported Python versions.

  11. +and make sure that the tests pass for all supported Python versions.

@@ -201,13 +198,11 @@

Related Topics

@@ -228,7 +223,7 @@

Quick search

©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index dc18352..35c6135 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -1,12 +1,10 @@ - + - - + Index — pycirk 1.5.0 documentation @@ -14,6 +12,7 @@ + @@ -73,8 +72,6 @@

A

  • allocate_sec_mat() (in module pycirk.make_secondary_flows)
  • apply_labels() (pycirk.labels.Labels method) -
  • -
  • assign_labels_to_class() (pycirk.pycirk_settings.Settings method)
  • @@ -294,13 +291,15 @@

    R

  • (pycirk.fundamental_operations.Operations.PxP_ITA_TC method)
  • - - + @@ -451,7 +448,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 diff --git a/docs/_build/html/history.html b/docs/_build/html/history.html index b71fdf6..f7ce3aa 100644 --- a/docs/_build/html/history.html +++ b/docs/_build/html/history.html @@ -1,11 +1,9 @@ - + - - + History — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -37,7 +36,7 @@

    History

    0.1.0 (2018-05-11)

      -
    • First release on PyPI.
    • +
    • First release on PyPI.

    @@ -82,13 +81,11 @@

    Related Topics

    @@ -109,7 +106,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index ac2daec..89d5b5b 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -1,11 +1,9 @@ - + - - + Welcome to pycirk’s documentation! — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -78,9 +77,9 @@

    Welcome to pycirk’s documentation!

    Indices and tables

    @@ -121,13 +120,11 @@

    Related Topics

    @@ -148,7 +145,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/installation.html b/docs/_build/html/installation.html index 2adaad5..34cd9b0 100644 --- a/docs/_build/html/installation.html +++ b/docs/_build/html/installation.html @@ -1,11 +1,9 @@ - + - - + Installation — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -105,13 +104,11 @@

    Related Topics

    @@ -132,7 +129,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/modules.html b/docs/_build/html/modules.html index 085ec6d..decafbe 100644 --- a/docs/_build/html/modules.html +++ b/docs/_build/html/modules.html @@ -1,11 +1,9 @@ - + - - + pycirk — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -99,13 +98,11 @@

    Related Topics

    @@ -126,7 +123,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index abfd61f304ad52cd1c16da3065aad2cce3e52e17..80b3251e6270b40604b508ad39b55afa92dc48bd 100644 GIT binary patch delta 892 zcmV-?1B3kU2JDvI_((B#>uWyLKI62`8Bt_=+vdSNoFB-xx+NcW z@3Umlh?gsy#>jX1k$>e!-sMMr%#YmV14n+%lSly~3BSPez&S`q$(NIJ0YQH^4~r3k zqw~-~ivdztw{i=lrhM`9wK-CS8M$^N40OL23yIUj(kDm<1XaScYx)SpGEmeAosuh4 zVY#PPFhY4($}o>v$k(}#?bWrHZjqd6udtFHu%3D~fHT?~BCN z@2wNgccKIUFpV|XwB#W5_w;{wn955krDox@!yBZgZuv}}8Rvm6*(`LzN=B;7wVC(8 zMq82k(cq#PB1aoes4=uneC98Da?pkh`<4o`SbQar!7x*v`hlkZcSjL@nsMSz#)t4C z1}v71S+#B|#s&v4G8+R=LVHWL_hj#dcIf)vVp8 z%C3fVWhGDSJ42PlIjpe-cjjPeT($XtRft?R=C*!*VXvBH>02vSloDqP_4?!Xh z0%BeyLM%^e%u*XMG*8op>bi9m3YNq(&+^+1B=-8As{2owN zgL%f;@Dd_?#%<2cE`B$w=LBE^vU-6?J>D?3u#UgwniV&1ir#)}ekdBOQLqh{n-jj@hFl)8ds7_scl@!r;`&h|(r1ti zUylo?`*r^O?}sgLobNuJgw6T`0oGxA6c6GF=V~7&cC~CUHh!~`ro9<%M9qg7S8+`- zo+g{yo8sU&$=*1t<543o6+`Dp*&{u|22WOwOB@Z3mI=`UHP|&yrW$Q=*e>3G2taS~ S@0iya;GkQQ+aZ={39A~{w!`by_rdoF#6yXr!^=?CD9ES>V#HyHK4qou$ZLQ7H=k~6h^td zuX1t9+irE>PMWVpy~~H{SC|KOmk;$hBkF5D*0+49ea2~>Gor}$w#|ckI6shWbxS_& z-e<|85ieIZjgjy2BR}Lv-sMMr&X3&X14n+#lSly~2|vK|z&S`q$=8!}0YQJ?9u^}6 zN9Un~76YWPZsit8P5I*IYjdOuGji=l80da4780k4rB9F!2&#l>*YpvHWuT}LIwe=8 z!g5coV1)9nlwlsTkgsze+pB9Y-6A>DUSTCYU_JFzWa+%X~{wAAL)PbFqM~7O3lJ)hc`$~-SU|{GtL8DvRUYam5fxEYcubG zjkY57qrpWpM2jbj1S>O z3|K51vufQ`j13N8WHtt#g!Yzf@5$Z^$rqryn!9)+L(--b(67#+pKO2fj$f4JZiJY% z`M*j_REeYNPn~ddMNs-Wu1IzQ_DDE&)P|NORFOUkS0druP{j!s2AI>PU57Lfs+;z% z@eb2X@>nU>0xuzP5E51ayKbo8#`T~+LP>+~F7-MGD_`%yJZn9c!WyH$qdSRhfUP6t z+xZZ;SW^bzYS!*cWmkVgx=NKN_MM^1;t5lSgrB#*ae-iP2H4<6fl#mKTjXA8yQ+)3g)A&LfT6l}xg=7g`lAty)d-V{fDj6XJ4 zTt8|=`U@n(H|N6Xex3jS`=2dvobSG>gw1+|0PC=GiU;b1bF~i>yIM9F8^2je)7}g> zqUKYKtGK2ZPm@5+?M-oToMi9S@u-oPilM2b?2#T}gC``%C5{G1%Y + - - + Python Module Index — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -149,13 +148,11 @@

    Related Topics

    @@ -176,7 +173,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 diff --git a/docs/_build/html/pycirk.html b/docs/_build/html/pycirk.html index f403053..1b33f9e 100644 --- a/docs/_build/html/pycirk.html +++ b/docs/_build/html/pycirk.html @@ -1,11 +1,9 @@ - + - - + pycirk package — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -50,7 +49,7 @@

    Submodules
    -class pycirk.fundamental_operations.Operations[source]
    +class pycirk.fundamental_operations.Operations[source]

    Bases: object

    Contains all basic operations to transform SUTs into IOTs and verify them It contains two subclasses defining two different trasformation methods @@ -58,58 +57,58 @@

    Submodules
    -class IOT[source]
    +class IOT[source]

    Bases: object

    General IOT operations subclass some methods repeat from other subclasses but it’s good to have them divided for clarity

    -A(inv_diag_x)[source]
    +A(inv_diag_x)[source]

    Technical coefficient matrix A = Z * inv(diag(x))

    -B(inv_diag_x)[source]
    +B(inv_diag_x)[source]

    Calculates extensions intensities

    -IOT(Y, W, E, R, M)[source]
    +IOT(Y, W, E, R, M)[source]
    -L()[source]
    +L()[source]

    Leontief inverse L = (I-A)^-1

    -R(diag_x)[source]
    +R(diag_x)[source]

    Calculates absolute extensions

    -RY(diag_yj)[source]
    +RY(diag_yj)[source]

    Caclculates absolute extensions in final demand

    -Z(diag_x)[source]
    +Z(diag_x)[source]

    Total product ouput Z = A * diag_x

    -bY(inv_diag_yj)[source]
    +bY(inv_diag_yj)[source]

    Calculates intensities of extensions in final demand Method for transformation matrix of bY (e.g. final demand emissions)

    @@ -117,13 +116,13 @@

    Submodules
    -x(Y)[source]
    +x(Y)[source]

    total product output s the sum of Si and y

    -x_IAy(y)[source]
    +x_IAy(y)[source]

    Total product ouput x = inv(I - A) * yi

    @@ -132,46 +131,46 @@

    Submodules
    -class PxP_ITA_MSC[source]
    +class PxP_ITA_MSC[source]

    Bases: object

    Model with Market Share Coef. Prod x Prod Industry Technology assumption

    -A(D)[source]
    +A(D)[source]

    Total requirement multipliers A = Z * D

    -B(D, inv_diag_g)[source]
    +B(D, inv_diag_g)[source]

    Calculates extensions intensities

    -D(inv_diag_q)[source]
    +D(inv_diag_q)[source]

    Market share coefficients D = V * inv(diag(q))

    -L()[source]
    +L()[source]

    Leontief inverse L = (I-A)^-1

    -R(diag_q)[source]
    +R(diag_q)[source]

    Calculates absolute extensions

    -S(inv_diag_g)[source]
    +S(inv_diag_g)[source]

    Intermediate coefficients Input requirements Z = U * inv(diag(g))

    @@ -179,7 +178,7 @@

    Submodules
    -Z(D, diag_q)[source]
    +Z(D, diag_q)[source]

    Intermediates Z = inter_coef * D * diag(q)

    @@ -188,19 +187,19 @@

    Submodules
    -class PxP_ITA_TC[source]
    +class PxP_ITA_TC[source]

    Bases: object

    Model with Transformation Coefficients ProdxProd Industry Technology assumption

    -B(T, inv_diag_q)[source]
    +B(T, inv_diag_q)[source]

    Calculates extension intensity

    -L(T, inv_diag_q)[source]
    +L(T, inv_diag_q)[source]

    Input coefficients intermediates A = U * T * inv[diag (q)]

    Multiplier matrix @@ -209,20 +208,20 @@

    Submodules
    -R(diag_q)[source]
    +R(diag_q)[source]

    Calculates absolute extensions

    -T(inv_diag_g)[source]
    +T(inv_diag_g)[source]

    Transformation matrix T = inv(diag(g)) * V

    -Z(U)[source]
    +Z(U)[source]

    Intemediates Z = U * T

    @@ -231,12 +230,12 @@

    Submodules
    -calculate_characterized()[source]
    +calculate_characterized()[source]
    -delta_Y(Yalt)[source]
    +delta_Y(Yalt)[source]

    method to calculate difference in Y Y = final demand baseline Yalt = final demand scenario

    @@ -244,7 +243,7 @@

    Submodules
    -delta_x(Lalt, y)[source]
    +delta_x(Lalt, y)[source]

    method to calculate difference in q L = Leontief of baseline Lalt = Leontief of scenario

    @@ -252,13 +251,13 @@

    Submodules
    -inv()[source]
    +inv()[source]

    Returns inverse by dividing by 1 and eliminating inf and nan values

    -verifyIOT(Y, W)[source]
    +verifyIOT(Y, W)[source]

    @@ -273,11 +272,11 @@

    Submodules
    -class pycirk.labels.Labels[source]
    +class pycirk.labels.Labels[source]

    Bases: object

    -apply_labels(matrix, labels, axis=0)[source]
    +apply_labels(matrix, labels, axis=0)[source]

    Applies labels to a dataframe axis = 0 => Index axis = 1 => columns

    @@ -285,20 +284,20 @@

    Submodules
    -calc_no_of_something(labels)[source]
    +calc_no_of_something(labels)[source]

    A general method to calculate the number of unique entries contained in a series

    -get_labels(matrix)[source]
    +get_labels(matrix)[source]

    Collects labels from a dataframe

    -get_unique_labels(dataframe_of_labels, for_units=True)[source]
    +get_unique_labels(dataframe_of_labels, for_units=True)[source]

    Calculates all unique entries (labels) contained in a dataframe and puts them together with their units and total count of unique entries

    It returns an object… which is munched, not a pretty solution but it @@ -307,43 +306,43 @@

    Submodules
    -identify_labels(M_name)[source]
    +identify_labels(M_name)[source]

    A method to understand what type of labels are being handled depending on the name of the matrix in dataframe type that is being passed

    -list_of_something(labels)[source]
    +list_of_something(labels)[source]

    A general method to return a list of unique entries contained in a series

    -load_labels(directory)[source]
    +load_labels(directory)[source]
    -organize_unique_labels(directory)[source]
    +organize_unique_labels(directory)[source]
    -relabel(M, column_labels, index_labels)[source]
    +relabel(M, column_labels, index_labels)[source]

    Processes apply_labels and apply _names together

    -relabel_to_save(data, trans_method, labels_directory)[source]
    +relabel_to_save(data, trans_method, labels_directory)[source]

    This function makes sure that everything is labeled in IOT tables

    trans_method = 0 is prod x prod , 1 is ind x ind

    -save_labels(data, directory)[source]
    +save_labels(data, directory)[source]

    saves the labels of the database in the labels directory

    @@ -359,7 +358,7 @@

    Submodules
    -pycirk.make_scenarios.basic_add(a, at)[source]
    +pycirk.make_scenarios.basic_add(a, at)[source]

    Adds values together

    a : numpy.array

    at : numpy array

    @@ -367,39 +366,39 @@

    Submodules
    -pycirk.make_scenarios.basic_mult(ide, a, kt, kp)[source]
    +pycirk.make_scenarios.basic_mult(ide, a, kt, kp)[source]

    Policy intervention

    It may be a primary intervention or an acillary action.

    -
    -
    a: numpy.array
    -
    a supply chain or a point in it subject to a change
    -
    kt: float
    -
    technical coefficient (max achievable technically)
    -
    kp: float
    -
    penetration coefficient (level of market penet. of the policy)
    -
    ide: int
    -
    identification number of the intervention in case of missing information
    +
    +
    a: numpy.array

    a supply chain or a point in it subject to a change

    +
    +
    kt: float

    technical coefficient (max achievable technically)

    +
    +
    kp: float

    penetration coefficient (level of market penet. of the policy)

    +
    +
    ide: int

    identification number of the intervention in case of missing information

    +

    A a numpy.array of the same order/shape of a

    -pycirk.make_scenarios.counterfactual(scen_file, scen_no, M, M_name, labels)[source]
    +pycirk.make_scenarios.counterfactual(scen_file, scen_no, M, M_name, labels)[source]

    Separates changes by matrix subject to intervention and apply them on a specific matrix

    -
    -
    scen_file: str
    -
    directory of the file in which the scenarios are specified
    -
    scen_no : int
    -
    specific scenario e.g “1” or “scenario_1”
    -
    M : numpy.array
    -
    matrix affected by the policies
    -
    M_name : str
    -
    matrix name as diplayed under sheet_name[“matrix”]
    -
    labels : obj
    -
    matrix labels
    +
    +
    scen_file: str

    directory of the file in which the scenarios are specified

    +
    +
    scen_noint

    specific scenario e.g “1” or “scenario_1”

    +
    +
    Mnumpy.array

    matrix affected by the policies

    +
    +
    M_namestr

    matrix name as diplayed under sheet_name[“matrix”]

    +
    +
    labelsobj

    matrix labels

    +

    A numpy array modified according to the specified changes in the scenario file

    @@ -407,22 +406,22 @@

    Submodules
    -pycirk.make_scenarios.counterfactual_engine(M, inter_sets, subs=False, copy=False)[source]
    +pycirk.make_scenarios.counterfactual_engine(M, inter_sets, subs=False, copy=False)[source]

    This function allows for the proccessing of the specified interventions onto a selected matrix. It calls various functions to modify the values in a specified matrix.

    -
    -
    M : numpy.array
    -
    matrix of reference
    -
    inter_sets: dict
    -
    contains all specfication concerning the changes to be applied -(intervention sets)
    -
    subs : bool
    -
    If True it will call the subsitution function according to -specifications in scenarios.xlsx
    -
    copy : bool
    -
    if True it will copy value from one part of the matrix to another -according to specifications in scenarios.xlsx
    +
    +
    Mnumpy.array

    matrix of reference

    +
    +
    inter_sets: dict

    contains all specfication concerning the changes to be applied +(intervention sets)

    +
    +
    subsbool

    If True it will call the subsitution function according to +specifications in scenarios.xlsx

    +
    +
    copybool

    if True it will copy value from one part of the matrix to another +according to specifications in scenarios.xlsx

    +

    i : index coordinate

    g : column coordinate

    @@ -436,35 +435,35 @@

    Submodules
    -pycirk.make_scenarios.make_counterfactuals(data, scen_no, scen_file, labels)[source]
    +pycirk.make_scenarios.make_counterfactuals(data, scen_no, scen_file, labels)[source]

    Calculate all the counterfactual IO matrices

    -
    -
    data : obj
    -
    An object containing all necessary matrices of the IO system
    -
    scen_no : int
    -
    the identification number of the scenario to reference in scen_file
    -
    scen_file : str
    -
    the directory where the scenarios.xlsx file is store
    -
    labels : obj
    -
    an object containing all labels for the IO matrices
    +
    +
    dataobj

    An object containing all necessary matrices of the IO system

    +
    +
    scen_noint

    the identification number of the scenario to reference in scen_file

    +
    +
    scen_filestr

    the directory where the scenarios.xlsx file is store

    +
    +
    labelsobj

    an object containing all labels for the IO matrices

    +

    An object contaning a mofified IO system

    -pycirk.make_scenarios.make_new(filtered_changes, M, M_name, labels)[source]
    +pycirk.make_scenarios.make_new(filtered_changes, M, M_name, labels)[source]

    Organizes the data concerning the changes and calls the functions to modified matrices based on specied scenarios

    -
    -
    filterd_changes: pandas.DataFrame
    -
    A table filtered by matrix name containing all changes to be applied
    -
    M : numpy.array
    -
    matrix on which to implement the changes
    -
    M_name : str
    -
    nomenclature referring to the matrix to be changed
    -
    labels: obj
    -
    object containing all matrix labels
    +
    +
    filterd_changes: pandas.DataFrame

    A table filtered by matrix name containing all changes to be applied

    +
    +
    Mnumpy.array

    matrix on which to implement the changes

    +
    +
    M_namestr

    nomenclature referring to the matrix to be changed

    +
    +
    labels: obj

    object containing all matrix labels

    +

    g is any column in the matrix

    i is any row row in the matrix

    @@ -473,7 +472,7 @@

    Submodules
    -pycirk.make_scenarios.substitution(d, s, fx_kp)[source]
    +pycirk.make_scenarios.substitution(d, s, fx_kp)[source]

    Moves the value from one or multiple cells (in the same row or column)

    Substitution: Material subsitution or certain types of rebound effects

    If the size of the array of the original value is different from that @@ -481,14 +480,14 @@

    Submodules -
    d : numpy.array
    -
    transaction with which we are substituting
    -
    s : numpy.array
    -
    original transaction that was subject to changes -(the transactions from which the value is coming from)
    -
    fx_kp : float
    -
    relative size of c that is added on the transaction to expand d
    +
    +
    dnumpy.array

    transaction with which we are substituting

    +
    +
    snumpy.array

    original transaction that was subject to changes +(the transactions from which the value is coming from)

    +
    +
    fx_kpfloat

    relative size of c that is added on the transaction to expand d

    +

    A numpy.array of modified d

    @@ -505,7 +504,7 @@

    Submodules
    -pycirk.make_secondary_flows.allocate_sec_mat(V, U, Y, prod_or, ind_or)[source]
    +pycirk.make_secondary_flows.allocate_sec_mat(V, U, Y, prod_or, ind_or)[source]

    This function allows to move the primary material output from the secondary material industries to the secondary material output. This allows for the presence of secondary materials in the IOT @@ -516,7 +515,7 @@

    Submodules
    -pycirk.make_secondary_flows.make_secondary(data)[source]
    +pycirk.make_secondary_flows.make_secondary(data)[source]

    This allows to allign secondary flow in such a way that they then appear in the IOT

    Primary Products’ positions

    @@ -557,7 +556,7 @@

    Submodules
    -pycirk.organize_io.organizer(data)[source]
    +pycirk.organize_io.organizer(data)[source]

    @@ -570,53 +569,53 @@

    Submodules
    -pycirk.positions.make_coord_array(cat_coord, reg_coord, no_countries, no_categories)[source]
    +pycirk.positions.make_coord_array(cat_coord, reg_coord, no_countries, no_categories)[source]

    It creates an an array of coordinates based on the specification of the users.

    -
    -
    cat_coord : int, numpy.array, bool
    -
    the numerical coordinate of a specific category belonging to a matrix +
    +
    cat_coordint, numpy.array, bool

    the numerical coordinate of a specific category belonging to a matrix in the IO or SUT system. If None is passed then it will return an -array of all coordinates in range no_categories.

    -
    reg_coord : int, numpy.array, bool
    -
    the numerical coordinate of a specific region in the IO or SUT system. +array of all coordinates in range no_categories.

    +
    +
    reg_coordint, numpy.array, bool

    the numerical coordinate of a specific region in the IO or SUT system. If None is passed then it will return an array of all coordinates in -range no_countries.

    -
    no_countries : int
    -
    the total number of countries or regions in the dataset
    -
    no_categories : int
    -
    the total number of categories referring one axis in the chosen matrix
    +range no_countries.

    +
    +
    no_countriesint

    the total number of countries or regions in the dataset

    +
    +
    no_categoriesint

    the total number of categories referring one axis in the chosen matrix

    +

    A numpy.array referring to each coordinate point specified by the user

    -pycirk.positions.make_coord_array_for_make_sec(coordinates, no_countries, no_categories)[source]
    +pycirk.positions.make_coord_array_for_make_sec(coordinates, no_countries, no_categories)[source]

    It creates an an array of coordinates based on the total location of secondary materials and processing categories

    -
    -
    coordinates : int, numpy.array
    -
    the numerical coordinate of secondary categories belonging to the SUT system
    -
    no_countries : int
    -
    the total number of countries or regions in the dataset
    -
    no_categories : int
    -
    the total number of categories referring one axis in the chosen matrix
    +
    +
    coordinatesint, numpy.array

    the numerical coordinate of secondary categories belonging to the SUT system

    +
    +
    no_countriesint

    the total number of countries or regions in the dataset

    +
    +
    no_categoriesint

    the total number of categories referring one axis in the chosen matrix

    +

    A numpy.array referring to each coordinate point

    -pycirk.positions.single_position(item, labels)[source]
    +pycirk.positions.single_position(item, labels)[source]

    Takes a dataframe of the multiindex and identifies the position of the specified values

    -
    -
    item : str
    -
    The label the user is looking for
    -
    labels : obj
    -
    An object cointaining a set of labels -(as specified in the labels.py module)
    +
    +
    itemstr

    The label the user is looking for

    +
    +
    labelsobj

    An object cointaining a set of labels +(as specified in the labels.py module)

    +

    An numpy.array containing the coordinate of a specific label or None in case of there is no specified label

    @@ -632,62 +631,59 @@

    Submodules
    -class pycirk.pycirk.Launch(method=0, make_secondary=False, save_directory=None, aggregation=1, file=None, test=False)[source]
    +class pycirk.pycirk.Launch(method=0, make_secondary=False, save_directory=None, aggregation=1, file=None, test=False)[source]

    Bases: object

    Pycirk’s main class and methods

    Initialize the pycirk programme to make EEIO scenarios and analysis. From here, you can launch all the analysis specifications listed under scenarios.xlsx

    -
    -
    method : int
    -

    SUTs to IO transformation methods

    +
    +
    methodint

    SUTs to IO transformation methods

    0 = Prod X Prod Ind-Tech Assumption Technical Coeff method

    -

    1 = Prod X Prod Ind-Tech Assumption Market Share Coeff method

    +

    1 = Prod X Prod Ind-Tech Assumption Market Share Coeff method

    -
    make_secondary : bool
    -

    modifies SUT so that secondary technologies which process scrap +

    make_secondarybool

    modifies SUT so that secondary technologies which process scrap materials into primary materials are also available in the IO tables

    False = Don’t modify

    -

    True = Modify

    +

    True = Modify

    +
    +
    save_directorystr

    directory in which you want to work and save your results

    -
    save_directory : str
    -
    directory in which you want to work and save your results

    aggregation : int, bool

    0 = None (multi-regional 49 regions)

    1 = bi-regional (EU- ROW)

    -
    -
    file : bool, str
    -
    allows you to specify where the dataset is placed. None will use the -default location within the installed package
    -
    test : bool
    -
    if set to true it will run the test settings under under pycirk//tests
    +
    +
    filebool, str

    allows you to specify where the dataset is placed. None will use the +default location within the installed package

    +
    +
    testbool

    if set to true it will run the test settings under under pycirk//tests

    +
    -
    -
    scenario_results : int
    -

    Allows to calculate the results for a given specified scenario

    -

    0 = baseline data

    -
    -
    all_results :
    -
    Retrieves all results for all specified scenarios and baseline
    -
    save_results : int and bool
    -
    save all specified analytical results from all scenario and baseline
    +
    +
    scenario_resultsint

    Allows to calculate the results for a given specified scenario

    +

    0 = baseline data

    +
    +
    all_results :

    Retrieves all results for all specified scenarios and baseline

    +
    +
    save_resultsint and bool

    save all specified analytical results from all scenario and baseline

    +
    -
    -
    analysis.xlsx : excel file
    -
    to be found under the default folder on the specified directory -it allows to specify the parameters for your scenario and analysis
    -
    IO tables : pkl
    -
    IO tables of the specified scenarios, these are located in the output -folder in the save directory
    -
    results : DataFrame
    -
    results gathered from the processed scenarios and baseline
    +
    +
    analysis.xlsxexcel file

    to be found under the default folder on the specified directory +it allows to specify the parameters for your scenario and analysis

    +
    +
    IO tablespkl

    IO tables of the specified scenarios, these are located in the output +folder in the save directory

    +
    +
    resultsDataFrame

    results gathered from the processed scenarios and baseline

    +
    -all_results()[source]
    +all_results()[source]

    Process all scenarios and collects their results together with Baseline analysis results

    It outputs a pandas.DataFrame with all results

    @@ -695,52 +691,51 @@

    Submodules
    -delete_previous_IO_builds()[source]
    +delete_previous_IO_builds()[source]

    Call this method if you want to elinate all previous IO databases created by pycirk. SUTs database is not affected.

    -save_results(scen_no=None, output_dataset=False)[source]
    +save_results(scen_no=None, output_dataset=False)[source]

    Saves all results in excel format for info and results or in pickle format for the dataset

    -
    -
    scen_no: int
    -

    0 = baseline

    -

    1-n = specified scenarios

    -
    -
    output_datase: bool
    -
    If true it will output a dictionary containing all IOT tables in -pd.DataFrames
    +
    +
    scen_no: int

    0 = baseline

    +

    1-n = specified scenarios

    +
    +
    output_datase: bool

    If true it will output a dictionary containing all IOT tables in +pd.DataFrames

    +

    Default values will save all results from the all_results method and they will output only scenario.xlsx and info_and_results.xlsx

    Output_dataset is only possible when scen_no is specified in which case it would save also a data.pkl file

    -
    -
    scenarios.xlsx : excel file
    -
    scenario settings excel file used for the analysis in the same -output directory with the results
    -
    info_and_results.xlsx : excel file
    -
    excel file containing general info about project plus the -results from the analysis
    -
    data.pkl : pickle file
    -
    new modified IO dataset in pickle format -This is only possible if outputting single scenario (scen_no != None)
    +
    +
    scenarios.xlsxexcel file

    scenario settings excel file used for the analysis in the same +output directory with the results

    +
    +
    info_and_results.xlsxexcel file

    excel file containing general info about project plus the +results from the analysis

    +
    +
    data.pklpickle file

    new modified IO dataset in pickle format +This is only possible if outputting single scenario (scen_no != None)

    +
    -scenario_results(scen_no, output_dataset=False)[source]
    +scenario_results(scen_no, output_dataset=False)[source]

    Run to output results of a specified scenario

    -
    -
    scen_no: int
    -
    0 = baseline -1-n = specified scenarios
    -
    output_datase: bool
    -
    If true it will output a dictionary containing all IOT tables in pd.DataFrames
    +
    +
    scen_no: int

    0 = baseline +1-n = specified scenarios

    +
    +
    output_datase: bool

    If true it will output a dictionary containing all IOT tables in pd.DataFrames

    +

    specified results in DataFrame form or a dictionary containing results and a dictionary of dataframes containing IO matrices

    @@ -758,47 +753,37 @@

    Submodules
    -class pycirk.pycirk_settings.Settings(method=0, make_secondary=False, save_directory='', aggregation=1, file=None, test=False)[source]
    +class pycirk.pycirk_settings.Settings(method=0, make_secondary=False, save_directory='', aggregation=1, file=None, test=False)[source]

    Bases: object

    This class allows for to specify the settings for pycirk.

    -
    -
    method : int
    -

    SUTs to IO transformation methods

    +
    +
    methodint

    SUTs to IO transformation methods

    0 = Prod X Prod Ind-Tech Assumption Technical Coeff method

    -

    1 = Prod X Prod Ind-Tech Assumption Market Share Coeff method

    +

    1 = Prod X Prod Ind-Tech Assumption Market Share Coeff method

    -
    make_secondary : bool
    -

    modifies SUT so that secondary technologies which process scrap +

    make_secondarybool

    modifies SUT so that secondary technologies which process scrap materials into primary materials are also available in the IO tables

    False = Don’t modify

    -

    True = Modify

    +

    True = Modify

    +
    +
    save_directorystr

    directory in which you want to work and save your results

    -
    save_directory : str
    -
    directory in which you want to work and save your results

    aggregation : int, bool

    0 = None (multi-regional 49 regions)

    1 = bi-regional (EU- ROW)

    -
    -
    file : bool, str
    -
    allows you to specify where the dataset is placed. None will use the -default location within the installed package
    -
    test : bool
    -
    if set to true it will run the test settings under under pycirk//tests
    +
    +
    filebool, str

    allows you to specify where the dataset is placed. None will use the +default location within the installed package

    +
    +
    testbool

    if set to true it will run the test settings under under pycirk//tests

    +
    -
    -
    -assign_labels_to_class()[source]
    -

    Assigns all labels to their respective attributes in the Labels class -These are used througout the program to find coordinates and -label results

    -
    -
    -check_dataset_location()[source]
    +check_dataset_location()[source]

    It identifies where the baseline dataset is located and whether it is present in the directory. If an IO database was already created in the past then it will just return it’s location and type instead of @@ -808,74 +793,74 @@

    Submodules
    -check_expand_directory(directory)[source]
    +check_expand_directory(directory)[source]

    Checking that we are using the right directory for the right OS

    -create_output_folder()[source]
    +create_output_folder()[source]

    It creates an output folder where to save analytical results This is placed in the user’s working directory

    -create_scenario_file()[source]
    +create_scenario_file()[source]

    It creates a new scenario file by copying the original from pycirk directory to the new working directory specified by the user

    -load_dataset(data)[source]
    +load_dataset(data)[source]

    It loads the baseline dataset

    -load_results_params()[source]
    +load_results_params()[source]
    -number_scenarios()[source]
    +number_scenarios()[source]
    -project_specs(test=False)[source]
    +project_specs(test=False)[source]

    General specifications for the project, they are also used to mark the output files

    -scenario_file()[source]
    +scenario_file()[source]

    It returns where the working scenarios.xlsx file is located

    -set_IO_scenario(data, scen_no)[source]
    +set_IO_scenario(data, scen_no)[source]

    Class the functions to modify the IO database according to your scenario specifications

    -set_SUTs()[source]
    +set_SUTs()[source]
    -set_save_directory()[source]
    +set_save_directory()[source]

    It specifies where the scenario file for input is located

    -transform_to_io()[source]
    +transform_to_io()[source]

    Transforms the SUT dataset into an IO system

    If the user specified to make secondary material processing apparent then it will launch the function to modify the database

    @@ -899,20 +884,25 @@

    Submodules
    -pycirk.results.iter_thru_for_results(data, analysis_specs, scen_no, labels)[source]
    +pycirk.results.iter_thru_for_results(data, analysis_specs, scen_no, labels)[source]

    It uses your analytical specification on scenarios.xlxl to return a dataframe of the desired results

    -pycirk.results.retrieve_specified_data(data, spec_row, labels)[source]
    +pycirk.results.retrieve_specified_data(data, spec_row, labels)[source]

    Separate, collect and rename results for base and scenarios according to specifications under th sheet “analysis” in scenarios.xls

    data = any IOT table spec_row = row in the scenarios sheet specifying settings

    +
    +
    +pycirk.results.rsd_engine(data, M_name, spec_row, labels)[source]
    +
    +

    pycirk.save_utils module

    @@ -923,34 +913,34 @@

    Submodules
    -pycirk.save_utils.add_date_to_gen_specs(specs)[source]
    +pycirk.save_utils.add_date_to_gen_specs(specs)[source]

    Adds timemark to general specifications e.g. authors, institution etc

    -pycirk.save_utils.save_outputs(results, directory, specs, scen_no, data=None)[source]
    +pycirk.save_utils.save_outputs(results, directory, specs, scen_no, data=None)[source]

    It saves results into a previously specified directory

    -
    -
    results : pandas.DataFrame
    -
    a dataframe containing only selected results
    -
    directory : str
    -
    the general location specified for your scenarios.xlsx file
    -
    specs : dict
    -
    a dictionary containing general info about the project (e.g. author, institution, etc)
    -
    scen_no : int or None
    -
    an integer specifying the scenario number or enter None to save all results
    -
    data : dict of pd.DataFrames
    -
    a completely new dataset to be pickled. Default value is None otherwise -pass the dataset
    +
    +
    resultspandas.DataFrame

    a dataframe containing only selected results

    +
    +
    directorystr

    the general location specified for your scenarios.xlsx file

    +
    +
    specsdict

    a dictionary containing general info about the project (e.g. author, institution, etc)

    +
    +
    scen_noint or None

    an integer specifying the scenario number or enter None to save all results

    +
    +
    datadict of pd.DataFrames

    a completely new dataset to be pickled. Default value is None otherwise +pass the dataset

    +
    -
    -
    scenarios.xlsx : excel file
    -
    scenario settings excel file used for the analysis in the same output directory with the results
    -
    info_and_results.xlsx : excel file
    -
    excel file containing general info about project plus the results from the analysis
    -
    data.pkl : pickle file
    -
    new modified IO dataset in pickle format
    +
    +
    scenarios.xlsxexcel file

    scenario settings excel file used for the analysis in the same output directory with the results

    +
    +
    info_and_results.xlsxexcel file

    excel file containing general info about project plus the results from the analysis

    +
    +
    data.pklpickle file

    new modified IO dataset in pickle format

    +
    @@ -964,19 +954,19 @@

    Submodules
    -class pycirk.transformation_methods.Transform(SUTs)[source]
    +class pycirk.transformation_methods.Transform(SUTs)[source]

    Bases: object

    Transforms SUTs to IOT an calcualate extensions

    -IOTpxpSTA_MSCm()[source]
    +IOTpxpSTA_MSCm()[source]

    IOT prod x prod Single tech Industry-technology assumption Market share coef method

    -IOTpxpSTA_TCm()[source]
    +IOTpxpSTA_TCm()[source]

    IOT prod x prod Single tech Industry-technology assumption Technical coef method

    @@ -1033,13 +1023,11 @@

    Related Topics

    @@ -1060,7 +1048,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/readme.html b/docs/_build/html/readme.html index 81bdb33..b55d322 100644 --- a/docs/_build/html/readme.html +++ b/docs/_build/html/readme.html @@ -1,11 +1,9 @@ - + - - + pycirk — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -40,25 +39,31 @@

    pycirkhttps://img.shields.io/badge/License-GPL%20v3-blue.svg https://img.shields.io/badge/contributions-welcome-brightgreen.svg

    10.5281/zenodo.1492957

    +

    To cite the use of the software in your research please use the following publication:

    +

    “Modeling the circular economy in environmentally extended input-output tables: Methods, software and case study”

    +

    https://doi.org/10.1016/j.resconrec.2019.104508

    1. Installation

    1.1. Stable release

    Run in your terminal:0

    -
    $ pip install pycirk
    +

    $ pip install pycirk

    +

    1.2. From source

    Clone repository:

    -
    +

    Once you have a copy of the source, you can install it with:

    -
    $ python setup.py install
    +

    $ python setup.py install

    +

    1.3 Data

    @@ -73,36 +78,41 @@

    2. Usage

    2.1. Import package

    -
    import pycirk
    +

    import pycirk

    +

    2.2. Initialize

    -
    my_work = pycirk.Launch(method, directory, aggregation)
    +

    my_work = pycirk.Launch(method, directory, aggregation)

    +

    2.3. set your scenarios and analysis

      -
    1. Open scenarios.xls in the directory that was specified
    2. -
    3. From there you can specify interventions and parameters for the analysis
    4. -
    5. save and continue to the following steps
    6. +
    7. Open scenarios.xls in the directory that was specified

    8. +
    9. From there you can specify interventions and parameters for the analysis

    10. +
    11. save and continue to the following steps

    2.4. Run scenarios

    Run one specific scenario

    -
    my_work.scenario_results(scen_no, output_dataset) -(0 = baseline)
    +

    my_work.scenario_results(scen_no, output_dataset) +(0 = baseline)

    +

    Run all scenarios

    -
    my_work.all_results()
    +

    my_work.all_results()

    +

    3. Features

    Examples of policies that can be modelled through the software:

      -
    • sharing
    • -
    • recycling
    • -
    • life extension
    • -
    • rebound effects
    • -
    • substituion
    • -
    • market and value added changes
    • -
    • efficiency
    • +
    • sharing

    • +
    • recycling

    • +
    • life extension

    • +
    • rebound effects

    • +
    • substituion

    • +
    • market and value added changes

    • +
    • efficiency

    The tables in which it is possible to apply changes:

      -
    • total requirement matrix (A)
    • -
    • intermediate transactions (Z)
    • -
    • final demand (Y)
    • -
    • primary inputs (W)
    • -
    • emission intermediate extentions (E)
    • -
    • material intermediate extensions (M)
    • -
    • resource intermediate extensions (R)
    • -
    • emission final demand extension (EY)
    • -
    • material final demand extension (MY)
    • -
    • resource final demand extensions (RY)
    • -
    • primary inputs coefficients (w)
    • -
    • emission intermediate extentions coefficients (e)
    • -
    • material intermediate extensions coefficients (m)
    • -
    • resource intermediate extensions coefficients (r)
    • -
    • emission final demand extension coefficients (eY)
    • -
    • material final demand extension coefficients (mY)
    • -
    • resource final demand extensions coefficients (rY)
    • +
    • total requirement matrix (A)

    • +
    • intermediate transactions (Z)

    • +
    • final demand (Y)

    • +
    • primary inputs (W)

    • +
    • emission intermediate extentions (E)

    • +
    • material intermediate extensions (M)

    • +
    • resource intermediate extensions (R)

    • +
    • emission final demand extension (EY)

    • +
    • material final demand extension (MY)

    • +
    • resource final demand extensions (RY)

    • +
    • primary inputs coefficients (w)

    • +
    • emission intermediate extentions coefficients (e)

    • +
    • material intermediate extensions coefficients (m)

    • +
    • resource intermediate extensions coefficients (r)

    • +
    • emission final demand extension coefficients (eY)

    • +
    • material final demand extension coefficients (mY)

    • +
    • resource final demand extensions coefficients (rY)

    It is possible to specify:

      -
    • region of the intervention
    • -
    • whether the intervention affects domestic, import transactions or both
    • +
    • region of the intervention

    • +
    • whether the intervention affects domestic, import transactions or both

    @@ -194,36 +205,36 @@

    4. Important modules

    From this .xls file it is possible to set different types of interventions and the analysis to perform:

      -
    • matrix = specifies in which matrix of IOT the changes are applied
    • -
    • change_type = Primary and ancillary are only used to specify the type of intervention from a conceptual level
    • -
    • reg_o or reg_d = Regional coordinates (o=origin or row, d=destination or column)
    • -
    • cat_o or cat_d = category (e.g. products or extensions ) coordinates (o=origin or row, d=destination or column)
    • -
    • kt = technical coefficient (max achievable technically); a negative value means reduction; unit = %
    • -
    • ka = absolute values for addition
    • -
    • kp = penetration coefficient (level of market penetration of the policy); unit = %
    • -
    • copy = allows you to copy a specific transation to a different point in the matrices (useful for proxy creation)
    • -
    • substitution = tells the software whether it needs to substitute values among specified categories
    • -
    • sk = which intervention should be substituted
    • -
    • swk = Substitution weighing factor (how much of the original transaction should be substituted); allows to simulate difference in prices and physical properties between categories; unit = %
    • +
    • matrix = specifies in which matrix of IOT the changes are applied

    • +
    • change_type = Primary and ancillary are only used to specify the type of intervention from a conceptual level

    • +
    • reg_o or reg_d = Regional coordinates (o=origin or row, d=destination or column)

    • +
    • cat_o or cat_d = category (e.g. products or extensions ) coordinates (o=origin or row, d=destination or column)

    • +
    • kt = technical coefficient (max achievable technically); a negative value means reduction; unit = %

    • +
    • ka = absolute values for addition

    • +
    • kp = penetration coefficient (level of market penetration of the policy); unit = %

    • +
    • copy = allows you to copy a specific transation to a different point in the matrices (useful for proxy creation)

    • +
    • substitution = tells the software whether it needs to substitute values among specified categories

    • +
    • sk = which intervention should be substituted

    • +
    • swk = Substitution weighing factor (how much of the original transaction should be substituted); allows to simulate difference in prices and physical properties between categories; unit = %

    These can be set for:

      -
    • product category e.g. C_STEL (basic iron), C_PULP (pulp), etc.
    • -
    • final demand category e.g. F_HOUS (households), F_GOVE (government), etc.
    • -
    • primary input category e.g. E_HRHS (employment highly skilled), T_TLSA (taxes less subsidies), etc.
    • -
    • emissions extensions e.g. E_CO2_c (CO2 - combustion)
    • -
    • material extensions e.g. NI.02 (Nature Inputs: Coking Coal)
    • -
    • resource extension e.g. L_1.1 (Land use - Arable Land - Rice)
    • +
    • product category e.g. C_STEL (basic iron), C_PULP (pulp), etc.

    • +
    • final demand category e.g. F_HOUS (households), F_GOVE (government), etc.

    • +
    • primary input category e.g. E_HRHS (employment highly skilled), T_TLSA (taxes less subsidies), etc.

    • +
    • emissions extensions e.g. E_CO2_c (CO2 - combustion)

    • +
    • material extensions e.g. NI.02 (Nature Inputs: Coking Coal)

    • +
    • resource extension e.g. L_1.1 (Land use - Arable Land - Rice)

    Furthemore, from the analysis sheet you can set the following variables to be compared in the analysis:

      -
    • product categories
    • -
    • primary input categories
    • -
    • emissions extensions
    • -
    • material extensions
    • -
    • resource extensions
    • -
    • region of interest
    • -
    • impact categories # Please see the data_validation_list sheet in the scenarios.xls file for the comprehensive list
    • +
    • product categories

    • +
    • primary input categories

    • +
    • emissions extensions

    • +
    • material extensions

    • +
    • resource extensions

    • +
    • region of interest

    • +
    • impact categories # Please see the data_validation_list sheet in the scenarios.xls file for the comprehensive list

    @@ -281,13 +292,11 @@

    Related Topics

    @@ -308,7 +317,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index f3aeacb..99a5cee 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -1,11 +1,9 @@ - + - - + Search — pycirk 1.5.0 documentation @@ -14,14 +12,11 @@ + - - - + @@ -55,7 +50,7 @@

    Search

    containing fewer words won't appear in the result list.

    - +
    @@ -114,7 +109,7 @@

    Related Topics

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index ebf188b..a048e1c 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["authors","contributing","history","index","installation","modules","pycirk","readme","usage"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:55},filenames:["authors.rst","contributing.rst","history.rst","index.rst","installation.rst","modules.rst","pycirk.rst","readme.rst","usage.rst"],objects:{"":{pycirk:[6,0,0,"-"]},"pycirk.fundamental_operations":{Operations:[6,1,1,""]},"pycirk.fundamental_operations.Operations":{IOT:[6,1,1,""],PxP_ITA_MSC:[6,1,1,""],PxP_ITA_TC:[6,1,1,""],calculate_characterized:[6,2,1,""],delta_Y:[6,2,1,""],delta_x:[6,2,1,""],inv:[6,2,1,""],verifyIOT:[6,2,1,""]},"pycirk.fundamental_operations.Operations.IOT":{A:[6,2,1,""],B:[6,2,1,""],IOT:[6,2,1,""],L:[6,2,1,""],R:[6,2,1,""],RY:[6,2,1,""],Z:[6,2,1,""],bY:[6,2,1,""],x:[6,2,1,""],x_IAy:[6,2,1,""]},"pycirk.fundamental_operations.Operations.PxP_ITA_MSC":{A:[6,2,1,""],B:[6,2,1,""],D:[6,2,1,""],L:[6,2,1,""],R:[6,2,1,""],S:[6,2,1,""],Z:[6,2,1,""]},"pycirk.fundamental_operations.Operations.PxP_ITA_TC":{B:[6,2,1,""],L:[6,2,1,""],R:[6,2,1,""],T:[6,2,1,""],Z:[6,2,1,""]},"pycirk.labels":{Labels:[6,1,1,""]},"pycirk.labels.Labels":{apply_labels:[6,2,1,""],calc_no_of_something:[6,2,1,""],get_labels:[6,2,1,""],get_unique_labels:[6,2,1,""],identify_labels:[6,2,1,""],list_of_something:[6,2,1,""],load_labels:[6,2,1,""],organize_unique_labels:[6,2,1,""],relabel:[6,2,1,""],relabel_to_save:[6,2,1,""],save_labels:[6,2,1,""]},"pycirk.make_scenarios":{basic_add:[6,3,1,""],basic_mult:[6,3,1,""],counterfactual:[6,3,1,""],counterfactual_engine:[6,3,1,""],make_counterfactuals:[6,3,1,""],make_new:[6,3,1,""],substitution:[6,3,1,""]},"pycirk.make_secondary_flows":{allocate_sec_mat:[6,3,1,""],make_secondary:[6,3,1,""]},"pycirk.organize_io":{organizer:[6,3,1,""]},"pycirk.positions":{make_coord_array:[6,3,1,""],make_coord_array_for_make_sec:[6,3,1,""],single_position:[6,3,1,""]},"pycirk.pycirk":{Launch:[6,1,1,""]},"pycirk.pycirk.Launch":{all_results:[6,2,1,""],delete_previous_IO_builds:[6,2,1,""],save_results:[6,2,1,""],scenario_results:[6,2,1,""]},"pycirk.pycirk_settings":{Settings:[6,1,1,""]},"pycirk.pycirk_settings.Settings":{assign_labels_to_class:[6,2,1,""],check_dataset_location:[6,2,1,""],check_expand_directory:[6,2,1,""],create_output_folder:[6,2,1,""],create_scenario_file:[6,2,1,""],load_dataset:[6,2,1,""],load_results_params:[6,2,1,""],number_scenarios:[6,2,1,""],project_specs:[6,2,1,""],scenario_file:[6,2,1,""],set_IO_scenario:[6,2,1,""],set_SUTs:[6,2,1,""],set_save_directory:[6,2,1,""],transform_to_io:[6,2,1,""]},"pycirk.results":{iter_thru_for_results:[6,3,1,""],retrieve_specified_data:[6,3,1,""]},"pycirk.save_utils":{add_date_to_gen_specs:[6,3,1,""],save_outputs:[6,3,1,""]},"pycirk.transformation_methods":{Transform:[6,1,1,""]},"pycirk.transformation_methods.Transform":{IOTpxpSTA_MSCm:[6,2,1,""],IOTpxpSTA_TCm:[6,2,1,""]},pycirk:{cli:[6,0,0,"-"],fundamental_operations:[6,0,0,"-"],labels:[6,0,0,"-"],make_scenarios:[6,0,0,"-"],make_secondary_flows:[6,0,0,"-"],organize_io:[6,0,0,"-"],positions:[6,0,0,"-"],pycirk:[6,0,0,"-"],pycirk_settings:[6,0,0,"-"],results:[6,0,0,"-"],save_utils:[6,0,0,"-"],transformation_methods:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"case":6,"class":6,"default":[6,7],"final":[6,7],"float":6,"function":[1,6],"import":[3,8],"int":6,"new":[1,6],"public":4,"return":6,"true":[6,7],The:[1,4,6,7],Then:1,These:[6,7],Use:7,Uses:6,_name:6,a_alum:6,a_cmnt:6,a_con:6,a_copp:6,a_gla:6,a_lztp:6,a_onfm:6,a_pla:6,a_prem:6,a_pulp:6,a_stel:6,a_wood:6,about:[1,6],absolut:[6,7],accept:7,accord:6,achiev:[6,7],acillari:6,action:6,add:[1,6],add_date_to_gen_spec:6,added:[6,7],addit:7,affect:[6,7],aggreg:[6,7],all:[1,6,7],all_result:[6,7],allign:6,allocate_sec_mat:6,allow:[6,7],alreadi:6,also:6,alwai:[1,4],among:7,analysi:6,analysis_spec:6,analyt:6,ancillari:7,anew:6,ani:[1,6],anoth:6,anyth:1,appar:6,appear:6,appli:[6,7],applic:6,apply_label:6,appreci:1,arabl:7,arjan:[6,7],arnold:7,arrai:6,articl:1,assign:6,assign_labels_to_class:6,assum:1,assumpt:6,attribut:6,audreyr:7,auguilar:7,author:6,avail:6,axi:6,balanc:6,base:6,baselin:[6,7],basic:[6,7],basic_add:6,basic_mult:6,befor:1,begin:6,being:6,belong:6,best:1,between:7,biregion:7,bit:1,bitbucket:7,black:7,blog:1,bool:6,both:7,branch:1,bugfix:1,bumpvers:1,c_alum:6,c_cmnt:6,c_con:6,c_copp:6,c_gla:6,c_lztp:6,c_onfm:6,c_pla:6,c_prem:6,c_pulp:[6,7],c_stel:[6,7],c_wood:6,caclcul:6,calc_no_of_someth:6,calcual:6,calcul:6,calculate_character:6,call:6,can:[1,4,6,7],cat_coord:6,cat_d:7,cat_o:7,categori:[6,7],cell:6,certain:6,chain:6,chang:[1,6,7],change_typ:7,check:[1,6],check_dataset_loc:6,check_expand_directori:6,checkout:1,chosen:6,circular:[6,7],clariti:6,cli:5,clone:[1,4,7],cml:[0,6,7],cmlplatform:7,co2:7,coal:7,coef:6,coeff:6,coeffici:[6,7],coeffient:6,cointain:6,coke:7,collect:6,colum:6,column:[6,7],column_label:6,com:[1,4,7],combust:7,come:6,command:[4,7],commit:1,compar:7,complet:6,comprehens:7,conceptu:7,concern:6,consid:6,consol:7,contain:6,contan:6,content:[3,5],continu:7,contribut:3,contributor:[3,6],cookiecutt:7,coordin:[6,7],copi:[1,4,6,7],could:1,count:6,counterfactu:6,counterfactual_engin:6,countri:6,creat:[1,6,7],create_output_fold:6,create_scenario_fil:6,creation:7,credit:[1,3],curl:4,data:6,data_validation_list:7,databas:[6,7],datafram:6,dataframe_of_label:6,dataset:6,defin:6,delete_previous_io_build:6,delft:6,delta_i:6,delta_x:6,demand:[6,7],depend:6,deploi:3,descript:[1,6],desir:6,destin:[6,7],detail:1,develop:[1,3],dia:7,diag:6,diag_q:6,diag_x:6,diag_yj:6,dict:6,dictionari:6,differ:[6,7],diplai:6,directori:[6,7],distribut:6,divid:6,doc:1,docstr:1,document:7,domest:7,don:[4,6],donati:[0,6],done:[1,6],download:[4,7],driven:1,e_co2_c:7,e_hrh:7,each:6,easier:1,economi:[6,7],eeio:6,eeioa:6,effect:[6,7],effici:7,either:4,element:6,elimin:6,elin:6,emiss:[6,7],employ:7,enhanc:1,ensur:6,enter:6,entri:[1,6],environment:7,equal:6,essenti:6,etc:[6,7],even:1,everi:1,everyth:6,exampl:7,excel:6,exiobas:7,exist:6,exit:7,expan:6,expand:6,expans:6,explain:1,extend:7,extens:[6,7],extent:7,f_gove:7,f_hou:7,factor:7,fals:[6,7],fdonati:[1,4,7],fdonaticml:7,featur:3,feb:6,file:[1,6,7],filter:6,filterd_chang:6,filtered_chang:6,find:6,first:[0,2],flake8:1,flow:6,folder:6,follow:7,for_unit:6,fork:1,form:6,format:6,found:6,franco:[0,6],fri:6,from:[3,6],fundament:6,fundamental_oper:5,furthemor:7,futur:6,fx_kp:6,gather:6,gener:6,get:3,get_label:6,get_unique_label:6,git:[1,4,7],github:[1,4,7],given:[1,6],glenn:7,good:6,govern:7,greatli:1,guid:4,guidelin:3,handl:6,have:[1,4,6,7],help:[1,7],here:[1,6],hernandez:7,highli:7,histori:[1,3],home:7,household:7,how:[1,7],http:[1,4,7],ide:6,identif:6,identifi:6,identify_label:6,impact:7,implement:6,includ:1,ind:6,ind_or:6,index:[3,6],index_label:6,industri:6,inf:6,info:6,info_and_result:6,inform:6,initi:6,input:[6,7],insid:7,instal:[1,3,6],instead:6,institut:6,integ:6,intemedi:6,intens:6,inter_coef:6,inter_set:6,interest:7,intermedi:[6,7],intervent:[6,7],inv:6,inv_diag_g:6,inv_diag_q:6,inv_diag_x:6,inv_diag_yj:6,invers:6,iot:[6,7],iotpxpsta_mscm:6,iotpxpsta_tcm:6,iron:7,issu:1,ita:6,ita_msc:7,ita_tc:7,item:6,iter_thru_for_result:6,jan:6,joao:7,jul:6,just:[1,6],keep:1,knowledg:7,kone:[6,7],l_1:7,label:5,labels_directori:6,lalt:6,land:7,launch:[6,7],lead:3,left:7,leiden:6,leidenuniv:0,leontief:6,less:7,level:[6,7],lib:7,life:7,line:7,link:7,list:[1,6,7],list_of_someth:6,littl:1,load:6,load_dataset:6,load_label:6,load_results_param:6,loc:6,local:[1,7],locat:6,look:[1,6],m_name:6,mai:6,main:6,maintain:1,major:1,make:[1,6],make_coord_arrai:6,make_coord_array_for_make_sec:6,make_counterfactu:6,make_new:6,make_scenario:5,make_secondari:6,make_secondary_flow:5,mani:1,mar:6,mark:6,market:[6,7],master:4,materi:[6,7],matric:[6,7],matrix:[6,7],max:[6,7],mean:7,meet:1,messag:7,method:[4,6,7],might:1,minor:1,miss:6,mkvirtualenv:1,model:[6,7],modifi:6,modul:[3,5],mofifi:6,mon:6,more:1,most:4,move:6,msc:7,much:7,multi:6,multiindex:6,multipl:6,multipli:6,multiregion:7,munch:6,my_work:7,name:[1,6],nan:6,narrow:1,natur:7,necessari:6,need:7,neg:7,no_categori:6,no_countri:6,nomenclatur:6,none:[0,6,7],note:6,nov:6,now:[1,6],number:6,number_scenario:6,numer:6,numpi:6,obj:6,object:6,obtain:6,oepbzjqgdicsan1:7,offici:1,onc:[4,6,7],one:[6,7],onli:[6,7],onto:6,open:[1,7],oper:[1,6],option:7,order:6,org:[1,7],organ:6,organize_io:5,organize_unique_label:6,origin:[1,6,7],other:[1,6],otherwis:6,ouput:6,output:[6,7],output_datas:6,output_dataset:[6,7],packag:[3,5],page:3,panda:6,paramet:[6,7],part:[1,6],pass:[1,6],past:6,patch:1,penet:6,penetr:[6,7],perform:[6,7],physic:7,pickl:6,pip:[1,4,7],pkl:6,place:[6,7],pleas:[1,6,7],plu:6,point:[6,7],polici:[6,7],pos:6,posit:5,possibl:[1,6,7],post:1,pre:6,prefer:4,presenc:6,present:6,pretti:6,previou:6,previous:6,price:7,primari:[6,7],proccess:6,process:[4,6],prod:6,prod_or:6,product:[6,7],prodxprod:6,program:6,programm:6,project:[1,6,7,8],project_spec:6,properti:7,propos:1,proxi:7,pull:3,pull_request:1,pulp:7,push:1,put:[1,6],pxp:[6,7],pxp_ita_msc:6,pxp_ita_tc:6,pycirk:[1,4,8],pycirk_set:5,pypackag:7,pypi:[1,2],python3:7,python:[1,4,7],rang:6,read:6,readi:1,readm:1,rebound:[6,7],recent:4,recycl:7,reduct:7,refactor:6,refer:6,reg_coord:6,reg_d:7,reg_o:7,region:[6,7],rel:6,relabel:6,relabel_to_sav:6,releas:[2,3],rememb:1,remind:1,renam:6,repeat:6,repo:[1,4],repositori:[4,7],reproduc:1,request:3,requir:[6,7],resourc:7,respect:6,result:[5,7],retriev:6,retrieve_specified_data:6,rice:7,right:6,rodriguez:7,row:[6,7],rst:1,run:[1,4,6],same:6,sat:6,save:6,save_directori:6,save_label:6,save_output:6,save_result:[6,7],save_util:5,scen_fil:6,scen_no:[6,7],scenario:6,scenario_1:6,scenario_fil:6,scenario_result:[6,7],scope:[1,6],scrap:6,script:7,search:3,secondari:6,sector:6,see:7,select:6,send:1,separ:6,seri:6,set:[1,6],set_io_scenario:6,set_save_directori:6,set_sut:6,setup:[1,4,7],shape:6,share:[6,7],sheet:[6,7],sheet_nam:6,should:[1,6,7],show:7,simpl:6,simul:7,singl:6,single_posit:6,site:7,size:6,skill:7,softwar:7,solut:6,some:6,sourc:[3,6],spead:6,spec:6,spec_row:6,specfic:6,speci:6,specif:[6,7],specifi:[6,7],stabl:3,stackstorag:7,start:[3,7],step:[1,7],store:6,str:6,sub:6,subclass:6,subject:6,submodul:5,subset:1,subsidi:7,subsitut:6,substituion:7,substitut:[6,7],sum:6,supervis:7,suppli:6,support:[1,7],sure:[1,6],sut:[6,7],sutop:6,swk:7,system:[1,6],t_tlsa:7,tabl:[6,7],tag:1,take:6,tarbal:4,tax:7,tech:6,technic:[6,7],technolog:[6,7],tell:7,templat:7,termin:[4,7],test:[1,6,7],test_pycirk:1,text:7,thank:7,thei:[1,6],them:[1,6],thi:[1,4,6,7],through:[1,4,7],througout:6,time:6,timemark:6,tip:3,togeth:6,top:6,tot:6,total:[6,7],tox:1,tpm:6,trans_method:6,transact:[6,7],transat:7,transf_method:7,transform:6,transform_to_io:6,transformation_method:5,trasform:6,travi:1,troubleshoot:1,tue:6,tukker:7,two:6,type:[3,6,7],under:6,understand:6,uniqu:6,unit:[6,7],univers:6,updat:1,usag:3,use:[1,6,7,8],used:[6,7],useful:7,user:6,usernam:7,uses:6,using:6,valu:[6,7],variabl:7,variou:6,verifi:6,verifyiot:6,version:1,virtualenv:1,virtualenvwrapp:1,volunt:1,wai:[1,6],want:[1,6],web:1,websit:1,wed:6,weigh:7,welcom:1,what:6,when:[1,6],where:6,whether:[1,6,7],which:[6,7],whoever:1,why:0,within:6,work:[1,6],would:[1,6],x_iai:6,xls:6,xlsx:6,xlxl:6,yalt:6,yes:7,yet:0,you:[1,4,6,7],your:[1,4,6],your_name_her:1,zenodo:7},titles:["Credits","Contributing","History","Welcome to pycirk\u2019s documentation!","Installation","pycirk","pycirk package","pycirk","Usage"],titleterms:{"import":7,analysi:7,bug:1,cli:6,content:6,contribut:1,contributor:0,credit:[0,7],data:7,deploi:1,develop:0,document:[1,3],featur:[1,7],feedback:1,fix:1,from:[4,7],fundamental_oper:6,get:1,guidelin:1,histori:2,implement:1,indic:3,initi:7,instal:[4,7],label:6,lead:0,make_scenario:6,make_secondary_flow:6,modul:[6,7],organize_io:6,packag:[6,7],posit:6,pull:1,pycirk:[3,5,6,7],pycirk_set:6,releas:[4,7],report:1,request:1,result:6,run:7,save:7,save_util:6,scenario:7,set:7,sourc:[4,7],stabl:[4,7],start:1,submit:1,submodul:6,tabl:3,tip:1,transformation_method:6,type:1,usag:[7,8],welcom:3,write:1,xls:7,your:7}}) \ No newline at end of file +Search.setIndex({docnames:["authors","contributing","history","index","installation","modules","pycirk","readme","usage"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["authors.rst","contributing.rst","history.rst","index.rst","installation.rst","modules.rst","pycirk.rst","readme.rst","usage.rst"],objects:{"":{pycirk:[6,0,0,"-"]},"pycirk.fundamental_operations":{Operations:[6,1,1,""]},"pycirk.fundamental_operations.Operations":{IOT:[6,1,1,""],PxP_ITA_MSC:[6,1,1,""],PxP_ITA_TC:[6,1,1,""],calculate_characterized:[6,2,1,""],delta_Y:[6,2,1,""],delta_x:[6,2,1,""],inv:[6,2,1,""],verifyIOT:[6,2,1,""]},"pycirk.fundamental_operations.Operations.IOT":{A:[6,2,1,""],B:[6,2,1,""],IOT:[6,2,1,""],L:[6,2,1,""],R:[6,2,1,""],RY:[6,2,1,""],Z:[6,2,1,""],bY:[6,2,1,""],x:[6,2,1,""],x_IAy:[6,2,1,""]},"pycirk.fundamental_operations.Operations.PxP_ITA_MSC":{A:[6,2,1,""],B:[6,2,1,""],D:[6,2,1,""],L:[6,2,1,""],R:[6,2,1,""],S:[6,2,1,""],Z:[6,2,1,""]},"pycirk.fundamental_operations.Operations.PxP_ITA_TC":{B:[6,2,1,""],L:[6,2,1,""],R:[6,2,1,""],T:[6,2,1,""],Z:[6,2,1,""]},"pycirk.labels":{Labels:[6,1,1,""]},"pycirk.labels.Labels":{apply_labels:[6,2,1,""],calc_no_of_something:[6,2,1,""],get_labels:[6,2,1,""],get_unique_labels:[6,2,1,""],identify_labels:[6,2,1,""],list_of_something:[6,2,1,""],load_labels:[6,2,1,""],organize_unique_labels:[6,2,1,""],relabel:[6,2,1,""],relabel_to_save:[6,2,1,""],save_labels:[6,2,1,""]},"pycirk.make_scenarios":{basic_add:[6,3,1,""],basic_mult:[6,3,1,""],counterfactual:[6,3,1,""],counterfactual_engine:[6,3,1,""],make_counterfactuals:[6,3,1,""],make_new:[6,3,1,""],substitution:[6,3,1,""]},"pycirk.make_secondary_flows":{allocate_sec_mat:[6,3,1,""],make_secondary:[6,3,1,""]},"pycirk.organize_io":{organizer:[6,3,1,""]},"pycirk.positions":{make_coord_array:[6,3,1,""],make_coord_array_for_make_sec:[6,3,1,""],single_position:[6,3,1,""]},"pycirk.pycirk":{Launch:[6,1,1,""]},"pycirk.pycirk.Launch":{all_results:[6,2,1,""],delete_previous_IO_builds:[6,2,1,""],save_results:[6,2,1,""],scenario_results:[6,2,1,""]},"pycirk.pycirk_settings":{Settings:[6,1,1,""]},"pycirk.pycirk_settings.Settings":{check_dataset_location:[6,2,1,""],check_expand_directory:[6,2,1,""],create_output_folder:[6,2,1,""],create_scenario_file:[6,2,1,""],load_dataset:[6,2,1,""],load_results_params:[6,2,1,""],number_scenarios:[6,2,1,""],project_specs:[6,2,1,""],scenario_file:[6,2,1,""],set_IO_scenario:[6,2,1,""],set_SUTs:[6,2,1,""],set_save_directory:[6,2,1,""],transform_to_io:[6,2,1,""]},"pycirk.results":{iter_thru_for_results:[6,3,1,""],retrieve_specified_data:[6,3,1,""],rsd_engine:[6,3,1,""]},"pycirk.save_utils":{add_date_to_gen_specs:[6,3,1,""],save_outputs:[6,3,1,""]},"pycirk.transformation_methods":{Transform:[6,1,1,""]},"pycirk.transformation_methods.Transform":{IOTpxpSTA_MSCm:[6,2,1,""],IOTpxpSTA_TCm:[6,2,1,""]},pycirk:{cli:[6,0,0,"-"],fundamental_operations:[6,0,0,"-"],labels:[6,0,0,"-"],make_scenarios:[6,0,0,"-"],make_secondary_flows:[6,0,0,"-"],organize_io:[6,0,0,"-"],positions:[6,0,0,"-"],pycirk:[6,0,0,"-"],pycirk_settings:[6,0,0,"-"],results:[6,0,0,"-"],save_utils:[6,0,0,"-"],transformation_methods:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"case":[6,7],"class":6,"default":[6,7],"final":[6,7],"float":6,"function":[1,6],"import":[3,8],"int":6,"new":[1,6],"public":[4,7],"return":6,"true":[6,7],The:[1,4,6,7],Then:1,These:7,Use:7,Uses:6,_name:6,a_alum:6,a_cmnt:6,a_con:6,a_copp:6,a_gla:6,a_lztp:6,a_onfm:6,a_pla:6,a_prem:6,a_pulp:6,a_stel:6,a_wood:6,about:[1,6],absolut:[6,7],accept:7,accord:6,achiev:[6,7],acillari:6,action:6,add:[1,6],add_date_to_gen_spec:6,added:[6,7],addit:7,affect:[6,7],aggreg:[6,7],all:[1,6,7],all_result:[6,7],allign:6,allocate_sec_mat:6,allow:[6,7],alreadi:6,also:6,alwai:[1,4],among:7,analysi:6,analysis_spec:6,analyt:6,ancillari:7,anew:6,ani:[1,6],anoth:6,anyth:1,appar:6,appear:6,appli:[6,7],applic:6,apply_label:6,appreci:1,arabl:7,arjan:[6,7],arnold:7,arrai:6,articl:1,assum:1,assumpt:6,audreyr:7,auguilar:7,author:6,avail:6,axi:6,balanc:6,base:6,baselin:[6,7],basic:[6,7],basic_add:6,basic_mult:6,befor:1,begin:6,being:6,belong:6,best:1,between:7,biregion:7,bit:1,bitbucket:7,black:7,blog:1,bool:6,both:7,branch:1,bugfix:1,bumpvers:1,c_alum:6,c_cmnt:6,c_con:6,c_copp:6,c_gla:6,c_lztp:6,c_onfm:6,c_pla:6,c_prem:6,c_pulp:[6,7],c_stel:[6,7],c_wood:6,caclcul:6,calc_no_of_someth:6,calcual:6,calcul:6,calculate_character:6,call:6,can:[1,4,6,7],cat_coord:6,cat_d:7,cat_o:7,categori:[6,7],cell:6,certain:6,chain:6,chang:[1,6,7],change_typ:7,check:[1,6],check_dataset_loc:6,check_expand_directori:6,checkout:1,chosen:6,circular:[6,7],cite:7,clariti:6,cli:5,clone:[1,4,7],cml:[0,6,7],co2:7,coal:7,coef:6,coeff:6,coeffici:[6,7],coeffient:6,cointain:6,coke:7,collect:6,colum:6,column:[6,7],column_label:6,com:[1,4,7],combust:7,come:6,command:[4,7],commit:1,compar:7,complet:6,comprehens:7,conceptu:7,concern:6,consid:6,consol:7,contain:6,contan:6,content:[3,5],continu:7,contribut:3,contributor:[3,6],cookiecutt:7,coordin:[6,7],copi:[1,4,6,7],could:1,count:6,counterfactu:6,counterfactual_engin:6,countri:6,creat:[1,6,7],create_output_fold:6,create_scenario_fil:6,creation:7,credit:[1,3],curl:4,data:6,data_validation_list:7,databas:[6,7],datafram:6,dataframe_of_label:6,dataset:6,defin:6,delete_previous_io_build:6,delft:6,delta_i:6,delta_x:6,demand:[6,7],depend:6,deploi:3,descript:[1,6],desir:6,destin:[6,7],detail:1,develop:[1,3],dia:7,diag:6,diag_q:6,diag_x:6,diag_yj:6,dict:6,dictionari:6,differ:[6,7],diplai:6,directori:[6,7],distribut:6,divid:6,doc:1,docstr:1,document:7,doi:7,domest:7,don:[4,6],donati:[0,6],done:[1,6],download:[4,7],driven:1,e_co2_c:7,e_hrh:7,each:6,easier:1,economi:[6,7],eeio:6,eeioa:6,effect:[6,7],effici:7,either:4,element:6,elimin:6,elin:6,emiss:[6,7],employ:7,enhanc:1,ensur:6,enter:6,entri:[1,6],environment:7,equal:6,essenti:6,etc:[6,7],even:1,everi:1,everyth:6,exampl:7,excel:6,exiobas:7,exist:6,exit:7,expan:6,expand:6,expans:6,explain:1,extend:7,extens:[6,7],extent:7,f_gove:7,f_hou:7,factor:7,fals:[6,7],fdonati:[1,4,7],fdonaticml:7,featur:3,feb:6,file:[1,6,7],filter:6,filterd_chang:6,filtered_chang:6,find:6,first:[0,2],flake8:1,flow:6,folder:6,follow:7,for_unit:6,fork:1,form:6,format:6,found:6,franco:[0,6],fri:6,from:[3,6],fundament:6,fundamental_oper:5,furthemor:7,futur:6,fx_kp:6,gather:6,gener:6,get:3,get_label:6,get_unique_label:6,git:[1,4,7],github:[1,4],given:[1,6],glenn:7,good:6,govern:7,greatli:1,guid:4,guidelin:3,handl:6,have:[1,4,6,7],help:[1,7],here:[1,6],hernandez:7,highli:7,histori:[1,3],home:7,household:7,how:[1,7],html:7,http:[1,4,7],ide:6,identif:6,identifi:6,identify_label:6,impact:7,implement:6,includ:1,ind:6,ind_or:6,index:[3,6],index_label:6,industri:6,inf:6,info:6,info_and_result:6,inform:6,initi:6,input:[6,7],insid:7,instal:[1,3,6],instead:6,institut:6,integ:6,intemedi:6,intens:6,inter_coef:6,inter_set:6,interest:7,intermedi:[6,7],intervent:[6,7],inv:6,inv_diag_g:6,inv_diag_q:6,inv_diag_x:6,inv_diag_yj:6,invers:6,iot:[6,7],iotpxpsta_mscm:6,iotpxpsta_tcm:6,iron:7,issu:1,ita:6,ita_msc:7,ita_tc:7,item:6,iter_thru_for_result:6,jan:6,joao:7,jul:6,just:[1,6],keep:1,knowledg:7,kone:[6,7],l_1:7,label:5,labels_directori:6,lalt:6,land:7,latest:7,launch:[6,7],lead:3,left:7,leiden:6,leidenuniv:0,leontief:6,less:7,level:[6,7],lib:7,life:7,line:7,link:7,list:[1,6,7],list_of_someth:6,littl:1,load:6,load_dataset:6,load_label:6,load_results_param:6,loc:6,local:[1,7],locat:6,look:[1,6],m_name:6,mai:6,main:6,maintain:1,major:1,make:[1,6],make_coord_arrai:6,make_coord_array_for_make_sec:6,make_counterfactu:6,make_new:6,make_scenario:5,make_secondari:6,make_secondary_flow:5,mani:1,mar:6,mark:6,market:[6,7],master:4,materi:[6,7],matric:[6,7],matrix:[6,7],max:[6,7],mean:7,meet:1,messag:7,method:[4,6,7],might:1,minor:1,miss:6,mkvirtualenv:1,model:[6,7],modifi:6,modul:[3,5],mofifi:6,mon:6,more:1,most:4,move:6,msc:7,much:7,multi:6,multiindex:6,multipl:6,multipli:6,multiregion:7,munch:6,my_work:7,name:[1,6],nan:6,narrow:1,natur:7,necessari:6,need:7,neg:7,no_categori:6,no_countri:6,nomenclatur:6,none:[0,6,7],note:6,nov:6,now:[1,6],number:6,number_scenario:6,numer:6,numpi:6,obj:6,object:6,obtain:6,oepbzjqgdicsan1:7,offici:1,onc:[4,6,7],one:[6,7],onli:[6,7],onto:6,open:[1,7],oper:[1,6],option:7,order:6,org:[1,7],organ:6,organize_io:5,organize_unique_label:6,origin:[1,6,7],other:[1,6],otherwis:6,ouput:6,output:[6,7],output_datas:6,output_dataset:[6,7],packag:[3,5],page:3,panda:6,paramet:[6,7],part:[1,6],pass:[1,6],past:6,patch:1,penet:6,penetr:[6,7],perform:[6,7],physic:7,pickl:6,pip:[1,4,7],pkl:6,place:[6,7],pleas:[1,6,7],plu:6,point:[6,7],polici:[6,7],pos:6,posit:5,possibl:[1,6,7],post:1,pre:6,prefer:4,presenc:6,present:6,pretti:6,previou:6,previous:6,price:7,primari:[6,7],proccess:6,process:[4,6],prod:6,prod_or:6,product:[6,7],prodxprod:6,programm:6,project:[1,6,7,8],project_spec:6,properti:7,propos:1,proxi:7,pull:3,pull_request:1,pulp:7,push:1,put:[1,6],pxp:[6,7],pxp_ita_msc:6,pxp_ita_tc:6,pycirk:[1,4,8],pycirk_set:5,pypackag:7,pypi:[1,2],python3:7,python:[1,4,7],rang:6,read:6,readi:1,readm:[1,7],readthedoc:7,rebound:[6,7],recent:4,recycl:7,reduct:7,refactor:6,refer:6,reg_coord:6,reg_d:7,reg_o:7,region:[6,7],rel:6,relabel:6,relabel_to_sav:6,releas:[2,3],rememb:1,remind:1,renam:6,repeat:6,repo:[1,4],repositori:[4,7],reproduc:1,request:3,requir:[6,7],resconrec:7,research:7,resourc:7,result:[5,7],retriev:6,retrieve_specified_data:6,rice:7,right:6,rodriguez:7,row:[6,7],rsd_engin:6,rst:1,run:[1,4,6],same:6,sat:6,save:6,save_directori:6,save_label:6,save_output:6,save_result:[6,7],save_util:5,scen_fil:6,scen_no:[6,7],scenario:6,scenario_1:6,scenario_fil:6,scenario_result:[6,7],scope:[1,6],scrap:6,script:7,search:3,secondari:6,sector:6,see:7,select:6,send:1,separ:6,seri:6,set:[1,6],set_io_scenario:6,set_save_directori:6,set_sut:6,setup:[1,4,7],shape:6,share:[6,7],sheet:[6,7],sheet_nam:6,should:[1,6,7],show:7,simpl:6,simul:7,singl:6,single_posit:6,site:7,size:6,skill:7,softwar:7,solut:6,some:6,sourc:[3,6],spead:6,spec:6,spec_row:6,specfic:6,speci:6,specif:[6,7],specifi:[6,7],stabl:3,stackstorag:7,start:[3,7],step:[1,7],store:6,str:6,studi:7,sub:6,subclass:6,subject:6,submodul:5,subset:1,subsidi:7,subsitut:6,substituion:7,substitut:[6,7],sum:6,supervis:7,suppli:6,support:[1,7],sure:[1,6],sut:[6,7],sutop:6,swk:7,system:[1,6],t_tlsa:7,tabl:[6,7],tag:1,take:6,tarbal:4,tax:7,tech:6,technic:[6,7],technolog:[6,7],tell:7,templat:7,termin:[4,7],test:[1,6,7],test_pycirk:1,text:7,thank:7,thei:[1,6],them:[1,6],thi:[1,4,6,7],through:[1,4,7],time:6,timemark:6,tip:3,togeth:6,top:6,tot:6,total:[6,7],tox:1,tpm:6,trans_method:6,transact:[6,7],transat:7,transf_method:7,transform:6,transform_to_io:6,transformation_method:5,trasform:6,travi:1,troubleshoot:1,tue:6,tukker:7,two:6,type:[3,6,7],under:6,understand:6,uniqu:6,unit:[6,7],univers:6,updat:1,usag:3,use:[1,6,7,8],used:[6,7],useful:7,user:6,usernam:7,uses:6,using:6,valu:[6,7],variabl:7,variou:6,verifi:6,verifyiot:6,version:1,virtualenv:1,virtualenvwrapp:1,volunt:1,wai:[1,6],want:[1,6],web:1,websit:1,wed:6,weigh:7,welcom:1,what:6,when:[1,6],where:6,whether:[1,6,7],which:[6,7],whoever:1,why:0,within:6,work:[1,6],would:[1,6],x_iai:6,xls:6,xlsx:6,xlxl:6,yalt:6,yes:7,yet:0,you:[1,4,6,7],your:[1,4,6],your_name_her:1,zenodo:7},titles:["Credits","Contributing","History","Welcome to pycirk\u2019s documentation!","Installation","pycirk","pycirk package","pycirk","Usage"],titleterms:{"import":7,analysi:7,bug:1,cli:6,content:6,contribut:1,contributor:0,credit:[0,7],data:7,deploi:1,develop:0,document:[1,3],featur:[1,7],feedback:1,fix:1,from:[4,7],fundamental_oper:6,get:1,guidelin:1,histori:2,implement:1,indic:3,initi:7,instal:[4,7],label:6,lead:0,make_scenario:6,make_secondary_flow:6,modul:[6,7],organize_io:6,packag:[6,7],posit:6,pull:1,pycirk:[3,5,6,7],pycirk_set:6,releas:[4,7],report:1,request:1,result:6,run:7,save:7,save_util:6,scenario:7,set:7,sourc:[4,7],stabl:[4,7],start:1,submit:1,submodul:6,tabl:3,tip:1,transformation_method:6,type:1,usag:[7,8],welcom:3,write:1,xls:7,your:7}}) \ No newline at end of file diff --git a/docs/_build/html/usage.html b/docs/_build/html/usage.html index b27e54d..3342033 100644 --- a/docs/_build/html/usage.html +++ b/docs/_build/html/usage.html @@ -1,11 +1,9 @@ - + - - + Usage — pycirk 1.5.0 documentation @@ -13,6 +11,7 @@ + @@ -79,13 +78,11 @@

    Related Topics

    @@ -106,7 +103,7 @@

    Quick search

    ©2019, Franco Donati. | - Powered by Sphinx 1.8.2 + Powered by Sphinx 2.2.0 & Alabaster 0.7.12 | diff --git a/docs/pycirk.rst b/docs/pycirk.rst index 3262eb4..4258a86 100644 --- a/docs/pycirk.rst +++ b/docs/pycirk.rst @@ -8,103 +8,103 @@ pycirk.cli module ----------------- .. automodule:: pycirk.cli - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.fundamental\_operations module ------------------------------------- .. automodule:: pycirk.fundamental_operations - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.labels module -------------------- .. automodule:: pycirk.labels - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.make\_scenarios module ----------------------------- .. automodule:: pycirk.make_scenarios - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.make\_secondary\_flows module ------------------------------------ .. automodule:: pycirk.make_secondary_flows - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.organize\_io module -------------------------- .. automodule:: pycirk.organize_io - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.positions module ----------------------- .. automodule:: pycirk.positions - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.pycirk module -------------------- .. automodule:: pycirk.pycirk - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.pycirk\_settings module ------------------------------ .. automodule:: pycirk.pycirk_settings - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.results module --------------------- .. automodule:: pycirk.results - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.save\_utils module ------------------------- .. automodule:: pycirk.save_utils - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: pycirk.transformation\_methods module ------------------------------------- .. automodule:: pycirk.transformation_methods - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: Module contents --------------- .. automodule:: pycirk - :members: - :undoc-members: - :show-inheritance: + :members: + :undoc-members: + :show-inheritance: diff --git a/pycirk/__init__.py b/pycirk/__init__.py index 7c98474..ce62d6d 100644 --- a/pycirk/__init__.py +++ b/pycirk/__init__.py @@ -4,6 +4,6 @@ __author__ = """Franco Donati""" __email__ = 'f.donati@cml.leidenuniv.nl' -__version__ = '1.5.0' +__version__ = '1.5.5' from pycirk.pycirk import Launch \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index ba2f433..d7e8652 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.5.0 +current_version = 1.5.5 commit = True tag = True