From 4e436da5994c7cda1b65275481a5571f46e62267 Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 10:44:22 +0100 Subject: [PATCH 01/10] Add initial code to run SOCCA. Force installation of asteroid_spinprops at the CI level. --- .github/workflows/run_test_ztf.yml | 1 + fink_science/ztf/ssoft/processor.py | 107 ++++++++++++++++++++-------- 2 files changed, 77 insertions(+), 31 deletions(-) diff --git a/.github/workflows/run_test_ztf.yml b/.github/workflows/run_test_ztf.yml index 73b9bcf2..fcbebee8 100644 --- a/.github/workflows/run_test_ztf.yml +++ b/.github/workflows/run_test_ztf.yml @@ -44,6 +44,7 @@ jobs: - name: Run test suites for ZTF run: | pip install onnxruntime==1.16.3 + pip install asteroid_spinprops --no-deps rm -f /tmp/forest_*.onnx ./run_tests.sh -s ztf curl -s https://codecov.io/bash | bash diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index 07aa7b37..4162d7de 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -29,6 +29,7 @@ from fink_utils.sso.spins import estimate_sso_params from fink_utils.sso.spins import extract_obliquity from fink_utils.sso.utils import rockify, extract_array_from_series +from fink_utils.sso.utils import compute_light_travel_correction from fink_science import __file__ from fink_science.tester import spark_unit_tests @@ -39,6 +40,8 @@ from astropy.coordinates import SkyCoord import astropy.units as u +from asteroid_spinprops.ssolib import modelfit + import logging @@ -483,7 +486,7 @@ def extract_ssoft_parameters( Use only the former on the Spark Cluster (local installation of ephemcc), otherwise use `rest` to call the ssodnet web service. model: str - Model name. Available: HG, HG1G2, SHG1G2 + Model name. Available: HG, HG1G2, SHG1G2, SOCCA Returns @@ -502,7 +505,7 @@ def extract_ssoft_parameters( [30, 1, 1, 1, 2 * np.pi, np.pi / 2], ), }, - "SSHG1G2": { + "SOCCA": { "p0": [15.0, 0.15, 0.15, np.pi, 0.0, 5.0, 1.05, 1.05, 0.0], "bounds": ( [-3, 0, 0, 0, -np.pi / 2, 2.2 / 24.0, 1, 1, -np.pi / 2], @@ -525,35 +528,64 @@ def extract_ssoft_parameters( extract_array_from_series(dobs, index, float) * extract_array_from_series(dhelio, index, float) ) - pdf = pd.DataFrame({ - "i:ssnamenr": [ssname] * len(raobs.to_numpy()[index]), - "i:magpsf": extract_array_from_series(magpsf, index, float), - "i:sigmapsf": extract_array_from_series(sigmapsf, index, float), - "i:jd": extract_array_from_series(jd, index, float), - "i:fid": extract_array_from_series(fid, index, int), - "i:ra": extract_array_from_series(raobs, index, float), - "i:dec": extract_array_from_series(decobs, index, float), - "i:raephem": extract_array_from_series(raephem, index, float), - "i:decephem": extract_array_from_series(decephem, index, float), - "i:magpsf_red": magpsf_red, - "Phase": extract_array_from_series(phase, index, float), - "Dobs": extract_array_from_series(dobs, index, float), - }) - pdf = pdf.sort_values("i:jd") - - outdic = estimate_sso_params( - pdf["i:magpsf_red"].to_numpy(), - pdf["i:sigmapsf"].to_numpy(), - np.deg2rad(pdf["Phase"].to_numpy()), - pdf["i:fid"].to_numpy(), - np.deg2rad(pdf["i:ra"].to_numpy()), - np.deg2rad(pdf["i:dec"].to_numpy()), - jd=pdf["i:jd"].to_numpy(), - p0=MODELS[model_name]["p0"], - bounds=MODELS[model_name]["bounds"], - model=model_name, - normalise_to_V=False, - ) + if model_name == "SOCCA": + # FIXME: correct jd for light travel + # FIXME: create pdf for SOCCA + jd_lt = compute_light_travel_correction( + extract_array_from_series(jd, index, float), + extract_array_from_series(dobs, index, float), + ) + pdf = pd.DataFrame({ + "cmred": magpsf_red, + "csigmapsf": extract_array_from_series(sigmapsf, index, float), + "Phase": extract_array_from_series(phase, index, float), + "cfid": extract_array_from_series(fid, index, int), + "ra": extract_array_from_series(raobs, index, float), + "dec": extract_array_from_series(decobs, index, float), + "cjd": jd_lt, + }) + pdf = pdf.sort_values("cjd") + outdic = modelfit.get_fit_params( + pdf, + flavor="SSHG1G2", + shg1g2_constrained=True, + blind_scan=True, + p0=MODELS[model_name]["p0"], + alt_spin=False, + period_in=None, + terminator=False, + ) + else: + pdf = pd.DataFrame({ + "i:ssnamenr": [ssname] * len(raobs.to_numpy()[index]), + "i:magpsf": extract_array_from_series(magpsf, index, float), + "i:sigmapsf": extract_array_from_series(sigmapsf, index, float), + "i:jd": extract_array_from_series(jd, index, float), + "i:fid": extract_array_from_series(fid, index, int), + "i:ra": extract_array_from_series(raobs, index, float), + "i:dec": extract_array_from_series(decobs, index, float), + "i:raephem": extract_array_from_series(raephem, index, float), + "i:decephem": extract_array_from_series(decephem, index, float), + "i:magpsf_red": magpsf_red, + "Phase": extract_array_from_series(phase, index, float), + "Dobs": extract_array_from_series(dobs, index, float), + }) + + pdf = pdf.sort_values("i:jd") + + outdic = estimate_sso_params( + pdf["i:magpsf_red"].to_numpy(), + pdf["i:sigmapsf"].to_numpy(), + np.deg2rad(pdf["Phase"].to_numpy()), + pdf["i:fid"].to_numpy(), + np.deg2rad(pdf["i:ra"].to_numpy()), + np.deg2rad(pdf["i:dec"].to_numpy()), + jd=pdf["i:jd"].to_numpy(), + p0=MODELS[model_name]["p0"], + bounds=MODELS[model_name]["bounds"], + model=model_name, + normalise_to_V=False, + ) # Add astrometry fink_coord = SkyCoord( @@ -674,6 +706,19 @@ def build_the_ssoft( >>> col_ssoft_shg1g2 = sorted(ssoft_shg1g2.columns) >>> expected_cols = sorted({**COLUMNS, **COLUMNS_SHG1G2}.keys()) >>> assert col_ssoft_shg1g2 == expected_cols, (col_ssoft_shg1g2, expected_cols) + + >>> ssoft_socca = build_the_ssoft( + ... aggregated_filename=aggregated_filename, + ... nparts=1, + ... nmin=50, + ... frac=None, + ... model='SOCCA', + ... version=None, + ... ephem_method="rest", + ... sb_method="fastnifty") + + >>> assert len(ssoft_socca) == 2, ssoft_socca + >>> assert "period" in ssoft_shg1g2.columns """ spark = SparkSession.builder.getOrCreate() spark.sparkContext.setLogLevel("WARN") From 4746af181459b97ddb4bf003929ede05e8d7a5ce Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 10:52:59 +0100 Subject: [PATCH 02/10] Ignore python version defined in asteroid_spinprops for the installation. --- .github/workflows/run_test_ztf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run_test_ztf.yml b/.github/workflows/run_test_ztf.yml index fcbebee8..91205398 100644 --- a/.github/workflows/run_test_ztf.yml +++ b/.github/workflows/run_test_ztf.yml @@ -44,7 +44,7 @@ jobs: - name: Run test suites for ZTF run: | pip install onnxruntime==1.16.3 - pip install asteroid_spinprops --no-deps + pip install asteroid_spinprops --no-deps --ignore-requires-python rm -f /tmp/forest_*.onnx ./run_tests.sh -s ztf curl -s https://codecov.io/bash | bash From fdfd4057864300b0591f87d83fad342f73f66577 Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 13:56:51 +0100 Subject: [PATCH 03/10] Change according to asteroid_spinprops version --- .github/workflows/run_test_ztf.yml | 2 +- fink_science/ztf/ssoft/processor.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/run_test_ztf.yml b/.github/workflows/run_test_ztf.yml index 91205398..fcbebee8 100644 --- a/.github/workflows/run_test_ztf.yml +++ b/.github/workflows/run_test_ztf.yml @@ -44,7 +44,7 @@ jobs: - name: Run test suites for ZTF run: | pip install onnxruntime==1.16.3 - pip install asteroid_spinprops --no-deps --ignore-requires-python + pip install asteroid_spinprops --no-deps rm -f /tmp/forest_*.onnx ./run_tests.sh -s ztf curl -s https://codecov.io/bash | bash diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index 4162d7de..7bf8aa66 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -529,8 +529,6 @@ def extract_ssoft_parameters( * extract_array_from_series(dhelio, index, float) ) if model_name == "SOCCA": - # FIXME: correct jd for light travel - # FIXME: create pdf for SOCCA jd_lt = compute_light_travel_correction( extract_array_from_series(jd, index, float), extract_array_from_series(dobs, index, float), @@ -545,12 +543,18 @@ def extract_ssoft_parameters( "cjd": jd_lt, }) pdf = pdf.sort_values("cjd") + + # Wrap columns inplace + pdf = pd.DataFrame({ + colname: [pdf[colname].to_numpy()] for colname in pdf.columns + }) + + # parameter estimation outdic = modelfit.get_fit_params( pdf, - flavor="SSHG1G2", + flavor=model_name, shg1g2_constrained=True, blind_scan=True, - p0=MODELS[model_name]["p0"], alt_spin=False, period_in=None, terminator=False, From e392c1eec270657940945f2ad61b71df467b899d Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 14:21:06 +0100 Subject: [PATCH 04/10] Rename fields --- fink_science/ztf/ssoft/processor.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index 7bf8aa66..868b2939 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -541,17 +541,19 @@ def extract_ssoft_parameters( "ra": extract_array_from_series(raobs, index, float), "dec": extract_array_from_series(decobs, index, float), "cjd": jd_lt, + "i:raephem": extract_array_from_series(raephem, index, float), + "i:decephem": extract_array_from_series(decephem, index, float), }) pdf = pdf.sort_values("cjd") # Wrap columns inplace - pdf = pd.DataFrame({ + pdf_transposed = pd.DataFrame({ colname: [pdf[colname].to_numpy()] for colname in pdf.columns }) # parameter estimation outdic = modelfit.get_fit_params( - pdf, + pdf_transposed, flavor=model_name, shg1g2_constrained=True, blind_scan=True, @@ -559,6 +561,16 @@ def extract_ssoft_parameters( period_in=None, terminator=False, ) + + # replace names inplace for the remaning computation + pdf = pdf.rename( + columns={ + "ra": "i:ra", + "dec": "i:dec", + "cfid": "i:fid", + "cjd": "i:jd", # FIXME: this is lighttime corrected + } + ) else: pdf = pd.DataFrame({ "i:ssnamenr": [ssname] * len(raobs.to_numpy()[index]), From b06e72df013d759a82aa9753061403982d3368b6 Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 15:06:33 +0100 Subject: [PATCH 05/10] Rename SSHG1G2 into SOCCA --- fink_science/ztf/ssoft/processor.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index 868b2939..dfc7b8b0 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -172,7 +172,7 @@ "version": {"type": "str", "description": "Version of the SSOFT YYYY.MM"}, } -COLUMNS_SSHG1G2 = { +COLUMNS_SOCCA = { "G1_1": { "type": "double", "description": "G1 phase parameter for the ZTF filter band g", @@ -414,7 +414,7 @@ def estimate_period(): """TBD - Should be done only for SSHG1G2 + Should be done only for SOCCA sb_method: str Specify the single-band lomb scargle implementation to use. @@ -430,9 +430,9 @@ def extract_ssoft_parameters_sshg1g2(): Notes ----- - For the SSHG1G2 model, the strategy is the following: + For the SOCCA model, the strategy is the following: 1. Compute parameters as if it was SHG2G1 model (incl. period estimation) - 2. Using previously computed parameters, compute parameters from SSHG1G2 + 2. Using previously computed parameters, compute parameters from SOCCA """ pass @@ -460,7 +460,7 @@ def extract_ssoft_parameters( Notes ----- Only works for HG, HG1G2, and SHG1G2. Rotation period - is not estimated here. For SSHG1G2, see + is not estimated here. For SOCCA, see Parameters ---------- @@ -735,6 +735,7 @@ def build_the_ssoft( >>> assert len(ssoft_socca) == 2, ssoft_socca >>> assert "period" in ssoft_shg1g2.columns + >>> assert ssoft_socca == {}, ssoft_socca """ spark = SparkSession.builder.getOrCreate() spark.sparkContext.setLogLevel("WARN") From 6646715e457a7f028faea8b469a0e3081e8789d9 Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 15:06:56 +0100 Subject: [PATCH 06/10] Rmeove unused functions --- fink_science/ztf/ssoft/processor.py | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index dfc7b8b0..e8a31513 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -411,32 +411,6 @@ } -def estimate_period(): - """TBD - - Should be done only for SOCCA - - sb_method: str - Specify the single-band lomb scargle implementation to use. - See https://docs.astropy.org/en/stable/api/astropy.timeseries.LombScargleMultiband.html#astropy.timeseries.LombScargleMultiband.autopower - If nifty-ls is installed, one can also specify fastnifty. Although - in this case it does not work yet for Nterms_* higher than 1. - """ - pass - - -def extract_ssoft_parameters_sshg1g2(): - """TBD - - Notes - ----- - For the SOCCA model, the strategy is the following: - 1. Compute parameters as if it was SHG2G1 model (incl. period estimation) - 2. Using previously computed parameters, compute parameters from SOCCA - """ - pass - - @pandas_udf(MapType(StringType(), FloatType()), PandasUDFType.SCALAR) @profile def extract_ssoft_parameters( From 001b5562d441925aad6a5fcfe5c3f99d945e662d Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 19:12:35 +0100 Subject: [PATCH 07/10] Test with other data --- fink_science/data/alerts/test_SOCCA.parquet | Bin 0 -> 59161 bytes fink_science/ztf/ssoft/processor.py | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 fink_science/data/alerts/test_SOCCA.parquet diff --git a/fink_science/data/alerts/test_SOCCA.parquet b/fink_science/data/alerts/test_SOCCA.parquet new file mode 100644 index 0000000000000000000000000000000000000000..c6b5e1dbaf5cfd7c3520da1d6ed560e65c293a8a GIT binary patch literal 59161 zcmeF(XIB)#wAUWqSGl)oSk|H9aAeaFqOBT!`Q3O#@Nn#)eMI;9WoFRkc zC=vveBnC1l@s{^F{}<0X_kMx9j%&$}>FKVn-c_}$yJpl(_n0aV9gi80sR<7Q4;3dB zm5d4#6&015iYn3CYCl1hiPcPvU~OPRP+|Vxn^jb-tt?cDDm+v?+&p{=_#k%tmqCz7 zCBvkq@?X31F{`QkXGeS#vjh$P$v{m*D?x=%X2WA-!o%{vPo_dgOT|P@Ma{I0j*5nr zk&1zpQJW6$`|l6^{|6O5QztD?Kdk~!IpcqwjE|Awzux3yr2enpc&TLm4_on@->GM( z*s!#l!L-!0n_p<~kJtDI-c-&=OMBah%B>;!pm@J;Ak`zYf#d!D#781N(F}~nDtZIG z#cra`+cgy1i;vS4`cik>+~xJD>3z$tVb-q!XSX}i{0~0SaO+BU3HR6SKjr+au;^5xGm9R$WI4LjYtmxtlJ3FuSCZF(rh)ch$?7VwF zLU8#Q>=Fnf&Rne3o&q+ma2Sbib4I53Hsc%O0!X17PFOxa*qdVK{F$z3TGH z6HI6;-mt&*gdqVG@lWE-POq7lp5UQru04hg9b2BzHur?(6Z@V^VS5d=GJk1%!e6ee z=o*42Xz#pNyRPU7N`b5U#<4lB%%VBN9`MWv4c^5@Gu++r&*_t!a?>9?fWcskw+1`( z`Z#f+zyoBe7lP)o)laP?TCwaj=K@=>$UKg;72^TCg0-B#LOr0EiGet9-2;|P_uQ+* z9^)v>iM;FqA8J!$?_mX^^Te)T&DNS2y|GGKeK}{bkqtJ{sSX|>(ULy>65EjCa;DDO z1LB=*W}41;K-k9zKT5IN^^!G2%X92ul)aG$uznLmNYnO}Ek>x{uX7z{BzYOY)ux`)9Mzx70{%vCZ1qM_BIQO*eOA z51`>EF$(^bqB7qebJ>e;fRavu5R>J;Dyk*a2hU@o3LrxgGnXdri$2{PTO;OQ5 z7xy?;C}Yuvx{?Z(fi0yr_o4?}kvv^ogY~+v`Ra$e2kd=msIi0{K4iWufaA_0|0YZd zYj`~EqoSV&SWG>3G{ok#JaQAR_kg;ipC*;CFMg0D_G78f9_{&OR{C3zz3UBIeM05J zSf%zD_#Na8bzPCiUf=Wvi`2@SsaVeMyo|2byx~EHkcAtzHKbxi;<`6j6@BNC#OlBD zI3kT@TM)5*iuK;=*JZ=y^yN;{@?r)0^W^?H7+(E>`->Bt+>>-#>9{j=hfz~UzH^3e zRc|X^U@i5kS3Y6=*R>Nj%bY>CUR;Bv+!@~dT3utwa|WaSONPt2&fpV%e9y}`XLzcM zhW)UN{i!KDV$Q(2%#tEW&mWg!Ok+{MrwQ?uuTfHQ!iakX-Ewu}4 zWV6z~^WXOSAG+&OouIl#c(Vk{ovf##_tFV|Jd3@liT#}@KJNa^2|hm`II zi_c=~oMMTuu)@^hXVS6bb$5Qf!}|qVyj}d~5w@wb<=7KbFWmp>TQt4y`@#u!@#_~{ z$Ii1&-r1Ju1mTLqng48l-8;Sm`zzq7(6uxt*zaa=G9beVW@)3k*k3yVO^nVHA?$aX z;Gg}H&Tv6l^W^{*RXuT~mU0HIwv(rqSuesB*PuYcj*Fnkvyu0=&I?-a3fc9vdx2l@ z{l`<-F5A38P^dFXSuDq9=`y+u(_s6lY*?Xy7!3)-31S~aTi30bI|5WpWNA5+xXRz%hUS5P7y1?il z=Bjnx0Gy^aEFMy|Q?L`o#x|wc zguS*8s8k)Hpy*NLKe?P&2aDt!p}VAj+6bE+Me;jzTL-%p@+1o4f> zd6anv(6hbBnUAIYEaj6r>j1GkU1hoZ9l$l)JtM!*0g8l#LNc-47A=iCI~?HZmFd0I z*ySa=;lwrva9*@)j>CR2?ls-l>Hy6BofD*52hbIF99PAbD*G;0RXBj~+^-EmY!4`or-He7JxObG`JOrjeJs-)YR<&dC`Jlkpm8}mcBF*kJaiB%2gP3fGm!- zVG{ObR+vU^xHG)0_S~a?&lx@zZms{b+RDo88aC0a;nY7%UM+loiQUjSFP4C{?y}*$ zjdi@n+H?#1b;p4HO|0$f`ZqVQ)j#jZZo|gk-chv_hVzSXN7p>|ZY(?P0=C?2i2m4J zXV`b($K}=lXZWS}l<}X_Ne8Fvu~{{5RBHX5!9rx#>;rb^8lp+XUYQuwO1$k1VWVPn zPq7A~x8xUZI722fXfC?$3{hrnUfI|+WhSH4OU@t?|6u%*r!#P0z8zla?hI17i3a~{ z7mpVxaCU|lU$O-_oSb2@Q+k#j`-^tynxCCB4CU=N_@@&(T3Km{>%nAxpu)l#j^3_c zEyw!QwevO~bB5Q}P6}k~&X-OXE@KzN6R)_MIYV7<$VqKeXNY@{N4Tu(40~+f2RUIG zKl3Lak#~kpSA(%K0i2)z3jc}Tp_poR<_5jI&>oPOGu0pN@ z&e&To|_v5(6hx(M6aDm&WvJHUsZNeVVhVU_VJrtgp=>f%6PFZ%WIwoO)kRZa!`jpw(YxEHnZ+U zAkXmo)eSdQpy>ueb&Jn2@NjLp(>fc^4jeH{)pt zpDRpoNk7#RcZK@j_Ybs)x*2^ib>#~hvb`iuqPG`#f;|wMD(JF=X?O1=D*BY zVQtQ4(dJzO$OYMwS6JA{Injux^F(R)gnF#mm76Y{mH_N>r`qg~1IY9nULx-WnA$qj z#E7Mu4%Vj#0{D|_yg9Lv#jU2vv;Zga9;Jw2JE#IID(7{8lJh6QY)%JI<%7@qvpO(S zm7#biKnHSlgeTnnbzo%6WSz-a2dHi3E-oL$`#rd4aE(_7*r#dVQl;(#5wnN8BXsrw zyG4X_AICnJ+tAreX5R;9i!dx1*T`hDb) zy|BgdAT!o9rwpD0HbyO&fm1vh?njaR9RNbK%lWdtg~~ zJsiDk4^A^N-|o!WLvZw;?n5p1Ao6j}{-0-DCCSp*a^cJ+DQr#0Xn6P?d$_s${Y7Ch#nQwne zHi5WLdMEp^vpIg2J+Dom-9RmWHq`{EE~|Jx!)orJ-y%IW0Z;CyJycl69nsveF~*?T zb1imcpE2AGnA=wudjLYudkU0b&5|wqh}hgaVToVe4nShWqjdLfylx=%UGwvu{qT3v zxPK6vSid-R@bP}=Ip1+f?4cv9%$VHx6zK@*y4^S9qa5M0T*X*#j3a(-;V1N9Ps?oy z{lwdUF^%{Et^?6w77P>#N83#WMj&DO%bLub68@A(sIAu})78F={6 zwmDDG++#LH+vEv0qdl2!^yUz`E2p8u(;P&U3ea?C8O}| zJW<>Ke@jOHdAQ?a{7*Oiw`BC+x8il7TKdHrn*aNn5%X;-IuQyL9k&gIno%N=Lc^jl zLZM|h5UHf&wy>$B=d(+!WDxWjsoW+KEK`Qng*BMx>fWquZvM zRdXz{dWZJnNHrVKiPo?iaNE{!7)d16aGGe0)^M2_h}LpjSlHI`oUlu(BJgDg1OH(h~AY* zZV-#m_}U;IX&}}p5oK|{Q8Lahxl!u5&(}uj#9*H(>{42Y zgFfF{NF%}Gt(s#|7h3mBrKYrM{Ve>}x_7olyiI$t`$F5kKVvCvI_rzy+7K1JL_5&& z*tP32N~X5!u@J`E_1O(2It;jv+jSW7*{62w7xW$LI3N-t(P<odM3;$1k6qVc&GFPOQ|+a(t|LG%*==UPW8Zz$NHVSamJ>^<7-h0}!R`SyspC0>9XRnT@eL8n@Y5bG5 zKfP3+O)!r`pY2`A^uF^Ego(Zjk%m&A?V^r5e729XPyg)j+;`%$V`7L@zf)?oL%(xo zT6(|Bo1%&Si@CK@1FnTV4g+qbpzPozucIul^(vi*yA{SYx|$^ zjA6g^rODyjR17jB{&c)fBLR$3nInNL#Ho=W_Wd%W!Q7Tkqal0_nWJ|EFEdj8U)BSK zwSC1?`nf^o$WYgXPHvdG*H^&U$_{@en~Swt*x?LkSD#27JCv618x4I*134yo148#` zz_4sB$HTs9U$tD`VG`>vvaBUc2QE2bOVU;ZC+%<{w1!v~g51 z%N=CtAXzRiiB9s5$lR1+k$E!X3NOt!`FZlg$E?>3;@8M^q9bbV*=uB{y|2v9i8E6? z_wUiCm13rVVx?OWk%MwnY%P((&p?qqFjB%KBt~HhvM${rvYVo(I3?dKu$$86YaOO; z%|ZG0!c}na6bGeK^5CEb@g=!YoYtj><{3FT)u{+dmbHU zy{A|ZHjhU0<#*eiqlI6qf5gt&(1M%>vCpemoYHJV*z=XY0>g-9r!R zSx0)VVQU}Xx*wrM4>>EcoA}>JY;&}bzhmNiN*Xmp-TkY= znMw`bKbgiHQ>ei-^vBwa_7>7oEZK@7ZK2B?5sbqpH_^)58-2c(n`o``uDzYbCJN`c ze^e}P1HG}o{zocv9SwgYg?pWUQ2Ldaf%lXZ)bd=_M84xD?TmyRFvWmLTPpNy4(~Gh}L_;22>Yk1U=q({8J3Ae)N5d~xnlb5PTnbTSL6Bw;Wd8uEvaul0xoASpyN{@0$=i9(~gdWAS%&UuxRd}7FxnED0 zGD}A-@=RBkLJ$?yQ@INiZ58L@v!Ot#AL|5A<85&Mk)305}XB9YxjnZoXC&QyI`nR0{b z(dPDY1i&*cc9+hWz1GqcjR*$lpD_3 zOHxkwUSL0lHJf1%4^9lZ)PRLDN(txHP6JvDF%L* zIZ9plC`z*3yYsNxr;f>pIrCA{JT#_NtoSJ(AX21KYhqSv7(p5H<8#J6AvimVdfdF{N|DazFLf z-&9Uepoo#0uI&Lj-m;S}hqZvTX8e`cSPPy>rmZi|?STi1WjyH?dmzu?oskswmr?ku zj3essb^c7eDfajfrS)#HPKU7 z-?$S5&pp#t#!B~WM2=SPgy8W6@9#&rV9RDYg&RBk$1&+cATzjY`o5Idxq-41PHqI# zZy;Iv*)ks(LdjR&o4f2CLf2B<%2o(NC?e^Pwu0&qda7n2N3f!S>9oyI_ADB(WY833 zxy1;@+js5cz}BQk-4@Pbg58TPV=UQB;GHaXzdV!$7}c&l(F|t+qTFNc{xVjO`r{w9 z=L0KTJ)$-3hMl*T(XU(H0r_sSFOU7*0ld4yIDfA0fGp6mo%q5AJPUdeJi~0@r118I zcnCWfv+flB`+yx<4sBoC_7M9;no&KH9a=>WeS7+j9n>sO*_&0egPVVTvWWx-OzcY= zcq7jN%qa&GFGg{|vGp{C{Adnvm27_F9?1!px*wS&JmQ4iKUa0zc5;JU%T-qqGajgW zvubqb!oFB1hn%V7gBy7!vg2NSP@T~F)f^iy|JnJJ zJRhvFYp0Us_~2tBkul@sFQmFC`)TpW40@QG$EI*>2JMo||MpaA7Ez7-Xw_AjMPnRE zw^Ivek>t*oKAOd|D52roK7!u@at#8X?*R))rbB77lH4<}?bH_HbBQu{Ik$zJ(*0^beWU`9X7_{J zq^QBR(dwk03^lY8cbnjka^XPx8`gmaT99I}dmo~N=gFI?c0t(q&n(9oj?sfiu~hi- z8+y3Q)Mc!nLl1c?3BNtv8Neqe&+ZyF^Z<)UsR$EDFcHe+{Fz{y)pNHl_Pmxb*WZ37 zDBNp!%V3BJv>v^2-7(Ds9_B^YJ|18ObAit}3Jgx8}{6 zg6tqS)F>;c$^n*-4sE#{=KxW{j}=2p4lr7D^N&5r0e3n3-n*RQfZLwMu`kbX0JRV? z#_KExe6`(pcKjwPT!s@|qgTJY!ltm0 zcw3A(;e(s5Y4|}-IQ#`2GADBaBPrtIj%qGQ^8Xwb1KhB+mLfZhJx#dvB=ZqB-1#D& z^6?2bv}v@ibzxVWj#csP<_1fvo$<#W!)N3_W_j4Wfo}G>h z5MYMX!)*0}E8#4_6j?%?fXtiF!P+(x_5J!W^O3v($FBp75rxwRPXUR<>wmIF*V5%wP zxjDS>gJTLU3$|vP*-fL9@{4DlN-m;Fn={J_B1M}=mb|Eo*T}SkbA|=5!x9p;zqm$m@0vm|=>}^P}v* z>qmOwkru4*gx~#@tQji|h>@bEJGa5Pi&Z~eq#3}mOzqCwWNMfibMTqDzlFrS91kkz zY#?ftZLcXsYv|f++}ohqzlcVVutqKM2OTf?8rw^~j9M6Ij}VrZkl&X-MI#dPhz020 zX$a4wT~QIlWuAF-zHssk_rg!~>vNB^?)*=bxY+8fGxQVH1_*)2bQSTvF67efy3Pj4c-Wbi*&$ZR4z{^S(D{Ggd!dBb0^BC?q*x2rhh zqd*VYp*QzIs(uf7^jLA1vC9B?@RaVA&c_4fPo1gQ0E&X z>s^&PTrW9BmV0V&qK##aykeKAwM$EUpl8hxOqCxhf{ZAU#8 zZ9?%PS@DNX)-*OCqv67V4@=|(hKu!A`d7%u3tPCa-~CJGF)C5dC9aYawQjh7*IFe< zh;#+IOs|rMcb5zX{az)L$~Iaxq&CT}ZyZvGu|^q^S@nB1$?XldpYv*Ml3RjKEwbut zlGT|@?P;;}IfqmZC~uN4{H}>9-LXl|Jzc)l!n#RjE4q0t=<6E!aBGKOquClc(8!5( z+w@=Z3i$%jb@DHH{)$=1#nHdygHq9|Viy+40vShmk6SO2^G*D(e`M?@r}eizq@nL8 z7o-eFw~c%zN9EavRUYdi8(LOFmRuKE!eQ5HALScbRk+#sqG}Rl|Bx{{(Kv&S-t`^v z?wvuIUncf8ewsmt?>GG6X5K)pX@Xo{oEvEJh*Z`w>n&7uF+h)OwG&=%k6B_8+zsTD z4O?!s!th&-@#Nb58p&_1NZIkiXLbJ`Maqq@<}5zg51ChV_vtHANX;qt_F`>HAM&DlMM@cH zDCl5+#dV!b!oGJ@u}Q=(U8hRU-=Rb?38B6dQ=m%O=pRzvz#3cSDpo2;fCqJ{h#o-# zdaQ#{fP@%?M^qO1VH4b=W;E!;z`wqwv@byzZhIlAZ7+mDsmkqlz}jxmW2+_8tnLP1 zNfnZN>`u^?+V1K2l@|z_QQ^lP4+zl5G&?l#!kfR) zb?=%0WGT=@bzc{NK=#M%wK;;IW%I7@lO{DN?6xUnc}xu->+8fuN@+mvV0h2QZhG*H ze4%F|Mi1rpxP-hfZG(}CXKW5uEFd%2r!Rhn1vn>(p|oUW%F3&p`%ih5DMGiN?8=i? zp%iWGaAP%Ap#*-rVOCMBO2OYgc{szTPKno45Il&V#|n4{5B+48gUD9}R|m1e305g; z4`twho;c}(n#})sJ@7v_-F%GydEEN99{At4{?B^g|Evf8KfWG#JV7~RVo??3Nf%xX zd{u)NpXsg}uc^Vdu=GSKaW$A`ao}2GR)fYY_D?sXRKeSEN9ZmkRZuX~rydYi1@XD? z;Xwm6(AdQ}#KNTxzxHJEF6gMjMa~xaDIIlCiuf=l)}jj1Q=j{~j;n&YS>g_dW>pAx zH&vkeq6$_(ihb;@3YpvFd&=;0ZBU){KHkS_V4maphUbT+R@+;f-l?KQ?-Wz!3t2!{ZO?;d1)BqvjeMQ>3 z8o(sbGLwH-9qO)_Wo_%$fW-;QrTwcK@M~ztB?+Vf%7oWPo&~GJvY)b=$Fdr~dE1QU@S}^vbgali8>UTf4{WfS{<&slV84mK!B9PePc&s2{0nW z{WnNi10sK$i@#9P0D%Wr*AAECZ<=!PN~VAYJkPJVa$!&d4pb-9gu2*a6MQ{M9Z&s#s6(zlon#IJ0p4AxIdYvqfcw>>=|6%r zfKbX>V2WSANqerh{gwuN4rkSo+#&!+phm<#1|r0k@V?N}C4hE+vW1d>1~6vpY?@6I z;P}M!h5|m0``Xi6_lh*YiX+BH7{@O{UrLvV>tFXqdq@WBf=srQ3ZIe`tV9Oy5rLuNpwBov=xC(ttgETxHL#G(abEE%%HU5dxSJd>Il5 zFv~v7vq?jMge{-tX?%SwyN}u5UB>mHt75+vt^vM0B+tzhBB(q)W#X1hfLjlvSfKr15O(?Q@^X% z09)tYk}WC{%%9?%7vLhoteNbd?Ku8s#ns=A>Z^fDbh+97bE+WI^p>aKH11~_^Fm(( z)gZ`ahU1m9Dp;}{ITDCpcWPYU-G2hV->mdb;+`tJ{~%IM!sC;tBep1GRt-*HGZQuC zRs+h+(8l(&DzHxEw~0Fgvmm}xM2{{4q4h{#uyZ+usQj{Eoev?o;{LwY`L zdx{FQm&&T5G!-a+*m1_2s0!m|=e`SVseng@@6qaOYH*ufmiq0WD(w8j;lU7x>s_Do zMP)-3ejACzCMT%E;{8JL!*A3ePOYT0-CZ57^ep>6)KddP>6{=BZ2nZ%Bj)$2AeR$z zI}Ka??$GF0eEnOr=O67IP=$u+moG9_)PUo6%DF8(K2_!IimfiH!GZa+Uh9=OuMFIC z4P#J)JK4XRt8ubKZ(k?x!$(T+6v74k>l0LF3LxhBZLp zOC2dJRs(-ttWc9zt_}|`Kd9W_r;6{#_$JtKeBu(+Pf$8lAZYPyQsf|RPu&2`Vw~4K z8yz&8$JBuNQ>>3Zy&CxN8|`B~qz?4N*2Uf4YS5$L;_v0F2BV7a8H#cH`>ozjnjKe# zWV!R-T=D+Glo_X}yEy(gX}@ZFszTEdPAREYbx1$EuiEm9I*g2U%;&)^Rt++ay|+RI0TgY(IU>@N|adbrWm zc!2;WObLoHp9nCavbSWmfdItP*{W~)L>LRQtkXVBgx&3LVtr|e&~2!6WDl;-1+f?T z)xJcaRtwz!>NOEQ0b=02LInO-pV+o=`8ESdl2bU}L|u>zxz$aCoAD~ zswWY;w9?Y^2Z75$361 z^$O?`AuUFiM@E(e94B|Zb(GTtwOqCF`|2bxJfkK)Q%r>0ziH=1ar}<81z!|CNP-)0 z&(5wQ5~LozGMrR^S|`UpfQ z341>$LgwiOrNPU%ALgBTDKAHa@@E2x2Ji5A|FHe!8JzEBPTv*glOsV2+I8!g1PL-q zj*FM#cI0)BcXRnkf~Bkavp4bln)&Elvs*O*+&t>OO>h#ykNtclC71vU*~A+^iin^f zZtCQ(LI4&jU?VV2(LI1|{@9)C!yrROurzb@OTMo1}M36LXO z$Kc~bB5+BW)q0&F!5<4^p56u#b`{D`Y4?-hMDP*XPsJo~sNPOrafAfBgQ|9pB@@98 zW}_~R5W)N0-J`O2f0{YlZBv4pFrU1W@sJR{9_pyuRLZ!&gq^!9gU73;=)7I=I}&`z zuer9wPJ$3#gZp9Bn(*-SHfJdu=aThPCrm3yaFt5p>&OxjRw}?2y{G{*wsoJ9;j2rxBs=N8$X<1R~@a zb5N$D@%7!TFEPXYX(3U<=A|WW{~6!1Hk@ayS*=*T{ilLue-?o zG1EI-|KfW73&ptK-24;O9N9(!saH7zw_8bYPc=F9JMMp9FP<+r9YBIc`T3dWA4u?| zn>GE_Ssdrc*_#{qdT&sRJC_S+!uzkrflYoS$R0R25QWFjM6ms9$qalR>){7{do{uR z?vYkj92dJ^t=_)NM2Hs9mpzHk6K}P6zS~k0mVd~}7BOf7ziykeoG=L@8GJwZ#*<** z{h#_B-$?j-JngI;OC*R`c)tJoMG|Za=W*G@WJ{!w?etT58q!I3DNX2lfc|@4HQ8kn-0v<~#{d zY2^{T7w7p<`WL=`O9&7^fB%f3GXVz0D(>7mj^`~Mry@yZoF@e9lZ#CWplD~aHnfWK zT?mg~auflsjl$6TPCTCs$?v>^`%PK?{FJ9+i5P>Q4a5(~zK)>jZeaE3}T=fCvdsrl~gC z3E&bmBi4uWmj!vhq!yk(I;bVS_7~&l16FPCA-w;!?IHYYw78$%GCl;oIFGXJzj9xi z1d~~edI8HMhzp@>E@UM^ULgH@iDQ}|OZ-HUwkLvIa9z(qO%fz81{}1#M}*&xHe@AU z5}~y0ti2%4Kc7@LxDn3#SGc#GF^M9A^}@lXop_#N3uTqFWgvoNNyBi}9wP8D)7O0- zC&ED8yWPieJnF!%Qo{LVD&|?G z8J_*99!S&=u=}jA4jh88tH37{OLTCZ#bWEI_WZg z&BFbH5`W<#&V$!Vk%3{k!0v>ax=i?$c-}UZ|zI>MmC(T%X@s|)m+0-cP z-4C2s-3O}{@x0}h@W*8983`KNZ!6vB#`*7pf>;TjClB~3{P4l?xzQm`=MhAL{VIVD zP53%Smi-P#;eK=5^m|wUzE9wsziz%Np$WBNn|cj6e|Ng?HJI86K>U%&I3z9+M1obr zFrJf$WMa!v8mFKR9p^vJ^a_8Pe zpd$;h)6dwV(aw~u+bKdZ=t=&>nP)PwNc{62w}q)#WIphdNooEGG8E_-sWlEjU5B4$ zF;w`W$SBT%XoFz%IW&`AUH=KnTnPlvJBer_xL2nkG8HW;_kHxYjzXu;8?#@bN=9La zmjH7GkP8^1yC2i3Pp zK7WXQ?-Y)|b}Jgy=?oCKf*+xn+V{&(e%(jm%k6sV4RPq1u`1v5ut(_7yhQHg{7a;k z&GNdgGZC$I9XOC`m4YPwR2EL1e2p4We8)rHY_!iwd|^H*1G$BvF`Dm%DA7M-u1ql* zG4`~bc*`4){22Z;yybt4(hE1AbY6Lccun&9AJavnpGPb+40c7Mn_`SFLXRb(GimBZ zHv?nPwHucjWH=JhRzuNtLz`%{teC30w<``g^LKhDGex5_8?2wSf|8M9e@DpqlQD>G z<)fIjL>vk*_S+CB$H%Yngx+a>hF)GPJfk%740(OiJNHR80TD*5f8V&Bg#==Kca*Os zptvNiFn>Q;f6Azr^z9CPUzM#mitH2y%BfX{UC;z^XRql zRQOeUTlD@tgJT8718H09DrNk(M<2CVYLJvG`di46CqZ;W_Xh|@%0Bl{AQkoWptw7_ znypKC*Xw~Oo=2{uxE_al3r8_VWYKJ;hbLieuG-rfJ?2C_?wYirnuLZ!^n z>NP(D(QLq@*Aka*q9`r9EuQ`)#9*X%_CaU@ioF^x!i`GNywwfQx1Ck!l9oC;{k{$j zP8Miv-pfKkT7x!>iFqic$>Q?txgvOK~c8-p5`K26gK zrJ|`_PnNC*y+Bm+&mwmfB%%s$A*t?fPzuOkbB}XR&#pD8>Qh{-aK4=jIDOqMHv2NPZ;gHs*vp7wsaA za^29&{wC*PKYJAI8M@IV;)u>a<+MDhbO9Y4lE0%M;ehm&(Cbk~7esv9&2k{=&%09eF-A}PBu6$1@;4}*+mVa>?mVKMi77)w zk9H|_Aqu+ER@;{LEfd{W@hP0EDMKPYLsfnQmB_>9lkl!j<;du|{NQyCTp!`*)J=zT z(Xof-LFv2OQKh-$;?z<(qLypth`yYIsQuecdNSpqpJgk?42@}MOKtJ%j_^!GxAwUu z-nI;VE=+zCc&HQI@HDp2xS5Zr>}5R%p5`LU?v%MJY2_%M?e3L53MFXuW_;X|V*y&P zi{5wcVguT*^~cEjYb&xh<{1ey{D`Dg`O*jzHE7u(KZcP<&|~;#~_~5pzl@S^BU#V^I&8+g?H@&(o6)ZCf!&YiYLM8w(~RL9?@+;su)Q1QRcNVo zNqK4y1rdr1W{X^kk;%p<-KKX1h`-|Db^IS;pv?X*jzg#4BJWGby*xrEA59ub1D$$gDZ}+ZPlnSiz2&l zxd>@BIT`7WS0L4?^CIci<%qm7-E)w&1{t_KXbsu^9^L3lP*D-dMJo=DqiewwwDR~s zg4?+Q^t^&iB+{r9?X35IdRf01ZJ;kBaouGo^rJ}|&5J@5$^XWwEchLYci*B}i!4HA zrZ*^Z(_~c9IwyU(zXJ8;XVW(A%0*hzpJWv|$`H4iwDbeBBIGJj`t`?&YP7gm613-a zC1P6r?X9C&iq!RwFm4kqM3lYE3pbqe(QY%B)0Ol^=+v<|*Q!6YDEG}JZ|ws`=qWuj zPbFOi`V_nVYWPnX`jvJ6Q0ZVU8hv;zv_0+}5-J_GQDo0Y_D6em`_(icAsv)Yrl~+m zcN=}uj@P29eI;+d64q+0Z+^0i9NLM`ffHak1oUXDg7^@9)o zl%S`P&Vb1$txx4+U1 zlY`%*9Q_M|$|3KNSE=LCS35o+pMV*+J0TxX=|zR?tk+d2DX8epz|m@SA^2<2kZA?F zzVP!ik&1#WUz|E-u~Ca0Cxmaxt5u@>=EnFLoe#)8lq=>aTOHCHr8+K^SdU6ggbogg z*CEv!zP1Cc9Y|~GP@Z3HB}$PjebAv_i3YdQinQvgP@>NZGUHSY+J9EksH(9FeOLGN zA4@7nvVtO(T9)sT!ppu*=dsD9by<_~4bi!i53^ zx?!GS)3vB#wO~g-!#gx}c+)NX#|QK^sB2_>r5dFcr0lb_c#r;?dwro-EJ3%^{V!BB zl%O=#OD)3L_2{<6$)v{*>e0;)*58_uykbasfc=;cb3TJ+&!aY;22 zzpAlT%~ydo8~7{4gz8XG9N*s?D%HrJ_x6i0N)r;SbyqXl+k&=Yi(69LYf!!XVnO)B zT6D3PG2p~P6Pgrkb>M1jN9tjw3>uV1_b5<(2W_BM zHJXr&(7!?|MNuIa$vwq|Xq55(NZpenBrG2()TU5{9=>ri=qOD?e-Y2d;#wBs9+zM{ zxB3d*xgv44%=a}CC^gO1f0ctA-_CGugr}lIS8v#tE@YzjS|O>)t*`zUdw>2;RrEH1 z|0FVH$V{0tWF{19uO&m76B$#HDRV+esHD(9Buz@@d7kIYl<62lNJWOEBx&%uPuKVT zy*}6HdH#audjIsg?zM-r&)#dVv(D|o6-(PHh=sYmowIX|#I-4# z9xc&S!uBt_-znBKLNIiYpZcO9{qJ9F0o`Z2dw{51=!RANF-bthGO3c+*Cd)$Up zNnG<>%vOA!Maa?FzTAB>gK*$9HCC-DBz|(4ndZMqC1x)RU0*3qC$@2q9(E)3689+^ zQ-5#N5r3AIdk)(d!+C7t{UBRR1XCI>k34H3o;v4C+U`gv96S^?G(^&gB5QwV!M-G7 zV!mkZ#Qs#`?5RTEU796?5Ji+7Wqm#I(D>1Eph_ii=X53^rqo1y zimW99lC)a14pkCg($a)|Y>J4tL4v_8qV+_`<@ej}X}1wQ!i&8u{T0NsbF`sgg zzGVkWU1%hTj?Vsf235rGr(6k%iS-22$gcu^rb2>XZWPp~DJNFM*jBiX6cS=}IS&`J zN{QyM-5rIRrSR`idu!gq=YwtJrJtuL;Pbd}p3-loo_PBkx$)+96SqFaNUT1rBviMv zq>Fo35Ylh`cm$ct2}bqW1P;YILbywVm*4Ug@oe^Ln`l5Y;f^QT<2CAuHa$`HorgM! z=X3&}+{>DXIt??rj`4OvnP)>vDncJw(usR2OH@;4Ji>DqIXFTF$(;pP`u+(>+7l9n%)f$=Kt zhO>;-OCs`$*7MgF%81VEjvDQCBx0oE{qrArEySgA@$2G$UJ(KfgI5`;UlBVS7^D3r zUK0n$+B@!7brGj3gfC7QbrWB6{ced7}KI zjd&C|6L+wwkx1fhU6_k)Bo>$~>+~MC5?==&H>=fD5i%R~o)cY-#L#QM{Y^VtiSs%) zG9TWpBT}|c>Svaw6Z%KCUn$+2K{VC7M>yPRA<8yBw`-nhAvBiq+TC=kiIx@5#jje0 zgbVwF8>ic9h_lxew_uBIVyx+sI=52?L3_Fhek$KY2))dyTn+Cd)bBqkr=jU0d{lMx za*y>Bq~MIT!wT&LeTTzAI@$&zJe=trUw{ve~t#q4yhIS5wpIRQAqNHV%tF(8Zq+QL~!d4?^lnd?L_h$$5z)pPZX+ASW1`azR&3AJ83v71 z<5!=wX=0t;U+zg@&rN!7vICEcJhQ<5r_DZO_uu4sUk=i&anF)%x+V3o3e3gsBh}!E zhEEeUAWQth6xoBaBNi>7sp?~EvLwpPe;#AEdD{l@_yg-{vUUqeE$yISSN=bbIi|If z<8}3te^Og!TXaF3_}YHx6`00*|4=vhC(%WR?3I|_CbErfj?H9mWmUJ5b@^e^Mz&um zy@TwpONRZupxJ#^5?M9=x5Itl&9|MV{ovNoPIIyyu_Gg7Lr#zmlE8wMH<;`ahiuOf zXgaFXM;0l{^piD`G%^_lWl~QbBg=luvyZI6`{N|C(#BT@$WBunIPeBsj@hgyYrSmR zM3&lBr)C^HPMcjzHYR0Ndjiy!;@2T-^sVfl503smOpY(@syjl~AegOr3gopl?3xDe ze}DOk>L`H6EO z+(r2d){^*mZ?|q9gr;3aa1S-Jo9a=rFw)-=X@*rlmTJB%hGkDybz9(7Ndz8{;^&9DFF|;gceW40Z79Vi3_@f~dlC*XGv3+eI)vBFW8eTC_(Sa| zS!nGaX2Khe>|Z|~0gIm4F(!KL04!z=@x|HJVU0pK`QlWb2y~3 zvGb#Vkjah-*!v5671CW;_)<#?_Ws!I;1KLx7a73b?e5)r6%C6-gzxvjn%BK8U&TP^ zrso7}DsXxBz+m&^h0(ECXf!(7-2q2XkTq@|2jNe;0yxzYP516KCqd{F{v0;3rps!B zO^%V+8f&4^-bVt?vB3`q#`D5mns|^Tu_OXI`AWelGB9MM_$mWo%3G7ODxf~qaSwQb zn!o;Tnh?IzzvM|t>pn>@^FDTUHuCP)stew=$)Zz=_+w{pc2zx%K z*M&jYbCv;~7BbgZ=)K=25j#K9SG z+54uSl0`!A$;sE8&{$>CNZyg0b0-f(_9lOi>;k`)jvK(1GF!K)1wly1=uJ&ao4I`y zwm(RxsZPnw!g54prK=HXX%CSIsA0a8WVn5640`kxwr1Fb!?e+K92)y++sGY+#x>W1l9pxTp}FfsQKYv`NSSFnoXk1p&ZrX;v!6+)dGqOT#eKL1YtJA^&b>qfAx?-vR3wLksG_tj5m zHTvpD-jzjDMe8Pn**RmiR4{%p@k~JzfgZW-QkS$2{&(PSI8|Ld0mae+L|;K~DXeLkw&f@-ET&9@sv47n*5@)1Sgc z=TT8`iGxN>K4bD&cD%s`#xjXDo#fH`(0Wy&5Y}Osk+FLS(aUd3(4iQui|OF9O5geX z`Pd_9ow~6KcLC$Ri4|uc|I?ZG@R~omAG$n-g|xX2R*B%{O&43Zm)E1N8ze*cxASXv z8rZVJY?uy;vG9<)MDX`a8{nHuo*lqm?BxV(w>sxaUN&?TE;-}NZ)ZsG;^W7r2Qpzp zPy5+nXtnR;ux0u}%eYlKhP|;5w?%q?mhDG2Dq-#(HrqdjS zA(Z9wo?{)=OgCvIG|KeJlMYp-8t7syW}I*8TCfX@KaKEu62)p&t*~%yEx#Ho+<-OTcFdoeujK1<)lydwDO&eB8uc1(bG;Tf1cI80PDPZ=QT^+0W-&zz$FGSraaY| z8Dx~pI7?Rj`OFz!@VqJCumD(Q8b2ijTE?Uu7Xg9722>Qdvzz}JF*4|d;VEGBBi+c>aHY(C1>f{4PJaVqh1$-nfm>1-&invRE$*5j>o|VLWgQ$+ zpj;rUlzGnbC&)c&HB0vE1E+biWo+E@8=&Ns2Mc7QnSU>leUmyq^$YazT>odKPW22q zcA*;n=gwcQPJbb;D=z7wfb08os`sDHE?xcPxGHq^pOlakjL$z83(V~(Auczv zK25f-c6gL5LnGw`*|A9~*DavYJ9>Ar9-_7rWalX3CdoQH=rN}T<>uBb$*S}nv?04K zYQTyH3`kVBB|E_o{D!RSzKnl1ef2uF4dOlZt@gCwTnnoW9oX+u(M9&-`KR4v&&{gq z(SxE2+Jj;rC&&2={Al9Rwj1I? z_5&ScyIJrh_0ahj#LX7F-;ll2B{4yEV_>(-Z_uxkckmCm^U%G)EpQ(V`xK0jZSStJCXWl+ z*Y!`6@5eHQCyN7MG{>70vmn~OaEfd{N7e+{#htDH9B7d2CEuU?%c}ouyCzQ}$L*U3 z|JmDZG5Q(e1;;jh8n|C=@*9lE$~Q8t)qpnw`M)=U{Dw|*Jz%`d`G1xkdG6c`ad@7} zhhg%1DDD&4&x1?TBcRUF1MkU(c3d2NPhK9FY55VPbc-^H|pZ z1}^Bl>iq$JwF}kS1SxCw>5!#q_i3eoX=V^>!iSe2*LJ?MO`yfSW1pJA+aHLtZJ>IJ zjtALa0>Q2w;G6YhGp|6S$P*vQ?zi`L%z*i3*Hhl93XsEC(X1KNrF%5p0v?Nr7$whN z%d$zm&T-}QviAup7 zPvyskAE#h;+n5FYkrb@Q`e^<(XirVcvRg3~4^I}A`-AVw#?wbaQZX~XQCDPWDyFg( z4ZK#6hOKl%GAF@WCY@jjoP~q#{@$`bJ{PB{8wJxQmtvFqmuT(gOYq4|S(*=@O7Qs~ z?wXIvi?Kl4hLH|<_v-O5#q}cmhdB|cfG#o*TP0|U@xhk|o%S&o;~zI3`$X{-<2xEt z1|=XXy>EQN2WT%C7ykjWu%D#-3GUJ5{S&TPg2ns9$~HkAf{G;JT!MeBZZb%LHaF^% zQ^4EC*%N8tsl-=2Wg{h6Xi8hBORy9_X>?cgbuGnvMo78TXG?L4d-vA9Yo$1@s=Ry| z6gJD9JsVbvMc!R5ivVNa963RKy%c-StHZ^uVdwd^%G za5IDum$U+kyOsd9G9IfBy!P2y-kqw3#yz9-^u$zfBcs}XHlHju%Y;2}r zeQ2>3-)4{hJqe0>RvFX?)#3cd8dJ?+?!#O69EI!fUC|>`$?A2um@9ua+Nd7;F!t>} zU|f&i&xIU01jeoZzV>t@1B=idyYlBrI!-9@{kWcxitQrQElj}XVM@`^`*8m(WFN^4 zPQ|H6r(*tcDh?H<%a<5U#-VGp2Wm!=F`*Y=_~k+}X6!sC_#C8RBbi;6OU6D9KT0#e z=hiP41<$77to|_P1@P2?@=)#c6ue#g={6H^PSt&2dqxW0Z0oV$26u$zO_X$|Vu|g? zB}%(e@eKR3l8EzZcu6;Z?3rI09+X)UDL60 za-)u>TRPsV5k7fve+D)y^m(lXo>d4lic-tK#aHAG#DJz(Z|hX0WZ>s9dt#W=GVrsS zMs0h}OuY5>ScD6Bt5UV2jVlwU9%{L7+nI?Ce#bmA*ph{x`BHt>)6T+*)~4dwI$5~S zzB@I$xd5+yE33-~e^4ma#kCY*2FsdV)jE~J^n_yahwF7XoXg>r??4Tn__1U%N~*!X2g~(}pH|`C7spzaK#Hp6#u}C? zED=w)<8NpMR%R={%+3e>`_h>8JrM1e!E@EF~| znm#;hT#{$SKX=r*j7~^1&0QnkT}* zhw(XQLO`m6yJH@JSB!p7Jp<_&7O(s7@5K#A=UxPYH}W3s2|d`0KP$1*M}Wqu{=agK zd$Ib{mlqE@!~672F0}&dj61j;+(LTKW>$wldz=w(9&9^}jCD9Lcz5Uoty79;D^?tl5 zJif0Jl#7Z8GU6oR4|ET?BEjNmJ%@&Ze!RGY<SI=QmDOuv&9#Jp)*4zb$axy&qpo+Ig(ot{YYP%UeV==455SHBL*_^ocpZH$Wu0yPxI#VFSqnV&{zRTA$Y_7ub(XRp z_r-_kwt~pzR;MnwFE;Yq>EC_$<%I@rP4N20y~(A;KHM;QM#-E|@**p4NwX)}nVar1ru0#-=y)pxVpLgVV`v!7lKr9& zFFU2IH6-=n{FB?yP(1I$53blfqy#NE8$H9a`Y>H8ixP89AD$g*bmc`;BDb&V)f#{Wd<>Q=A}Ly^5p&z3Tfyco+msR&h%p`!D~$W z!KPW~-pHDM{4mB|(W0dvN4&fGJqqOV+?Af=N5XD@eAwr}0h3|-?GYqANNp;&2V6ey z>F7~N!l5z=_E}(R*4u)l84@nz-y*9RIf$>=$+gw34`7P|b@B6U133IH9Tv?W!11cK zO#F?CKZh{r_GF~i$C`vMQf4(= z0Av5kcPl?2;lf>qx3#yBa5gTXv!$Ip$LsF1?h638klayD}(vY<#e1Y$x((r zr(>E;EWk>Yj+sOKy$0LTaH-sUckY2S98Bzb&bd7eAAT>m(_hy(l5hP{!Wm23(U)OO@nE`tND&klqpm3 zEj1CF{b24)lvNNoab}mz70~t7+sZUHct4|@)ji<$$sp0sV1*x5le9=GcH?o9umtxq zUA!D8or)J8M+`my%|Z=?d{t8M`R1n&51PPnniyyDy2E*rr@X@xn2MD-H!k^uzOgoG zuOm~j$6utR9F>X-)EM$C)Y9IYxKHlj_G)!C0%taJRO^x4)KNcq+_1FLfQ1a z={Tz4bhBb#I;M1ZF~eVyfzMsiP|OC^@?@XZxo6?W6@s)QU`UtCfpL#4Ol_9D>-du_ zyjpgt#s6s*&ML3F=r59k-S2si(;v^l-whJ!rz>-?^DMQ<&8i&yEk52N7A&IU+0M9@ zi}M9ir2D`kp=`A}={#Il`BI;Qx)3wmyz$<|DTw;sc-2- zl%xepoKUzjaTAnDe=-L4god2g<;=rwCPgPE+4ArrFMD)9c-TBx$!SL(rq(TA z_{ounNA5?_SOnzZt6LR4Yry@U>d%=*VY}f*!`n***p%kw?Jc_s@SUp*tu9}3u#4@T zIR{Wdn)lw&GQ2PSrc|=(e=hJTO66iMe|={qaM4=i{zXtHV{|DHJn-$A`0q2hSnqz1 z8P(PztWJ1ePXHgy&RlpZTY%kJA7&Rh<>8M8``$ft%fuYqHo^Bni9KDLLx*6V?Cocm zzc(ERzq{};Qz;z}#(#?byO9RJxZq3)1bxzd@x{}rxL?0*X2~)Y-{5yt`*1xC6TJM2 z-@!=Yz^N0eiXT{-<_ zD8Vfqea$aSi?H(3&Wu)tJS_Y4w`{{)Ha>>m4)e8V<3Bru?igLj!FR9p_FfXn$Lb`< z*Dns`;{8gRb~5JKnDF8^VFXutUU%re$-qqKINHvbXZ-K^!2b+_P~Y|c_w|UJ5B#64 z|IG*fHy`+aJRg`69r1U&Wf3-M$$!ynQG_ScTH?;`FTzHyRyJqAVUPajGT;d})z6=P z7vhG&iIyBtT7Tk1*0(}TWnq0XdZiFgQItQj1e0ziOt4NC;>Ti?8jTHwxUy6vQl+90 zPjt-bramgf%-zQe!@=B=n~Cebg}A=b+h!Pi_^c%Njd>wnV%aVG2$aBZa&u+%TqVA;)I9IrT#2^@HcO{~TSbdaoz7HYy30;8 zk3nah8~MeDA%7Fz!TJH@ZW{|-yjYFZ(v`%tBdYPiE4xZxKCH&N`>RC0f!E*c(|;sT zgE@*`(6oS6Ol;$1e?Gm+;;mDIHCS4wpMp<+Jxx|IgS?XUroSr4I8TZ?1CIL@**Sto zzaga^muhfq$nRnA7|0hzvrIlutHA-+Zx(if@tmpjw0SkSbY*`k3plLtdY2NoKYU-M zI@na0pkfD(82NqK{|d|u6x0TtF6%$x8>_(~%E#AtysN>!J(6ArL0z^_>1m&8;O}ll zSx(C}82!$$x(BkTsL~k;*W#j?i6S>p!Tg!W1<+Jhe3}U|Y#g%+H>ky) z3>tIK!P3%R*+S6r@7s-2rnUH)TP&5oRV{A2Aj6yj9%9Rwes#VUo3*U3PJ+L#Zn%gC z)#7sB&S#QfEc6N-)aI*t*Y#_0V#h8R@!CPV*4b4TU?d3_=MBvwLRebhTXFo zU{({4z6t1g{eXISeJyUi-Y%2}Y9&7VHP%v#mm<8*PJlnS`#PvvYq9iGy8YCkx3S%k zQHnbJ@N+CT1!Wyp$mlnGO;d+OTnv;a!P9f+c5LCT!~ETfQ*7V`-JZg5!8+`$&O4R^ zR(-#t8+5r2$NX~Kc^l09Oq-epF1>OvOb3Z1vmfcZ8nK$v;{G(yDtIZOZf7ITKbWVb z!`q0DXx_^{1hOrE{<)LA5sTZT&+~vMRnprd3!N_wu94e1$64aU?a;^j7?3JDipw3 z&qVdbQ^nY9&_7c8bTMAFv{he@D2C(6Hj;}h#=HJ3zW9+@jH7w}&^nhu9(~kuB@MJt z2@E(_UyRSr1-RCMbEEq=H|C15+qquh-{6Hs?q;=5#aKRJ^P@UAztEU|@lP?P{@EW| z37Y@vZo9gp1T)d+EL;PZ9<)|Bfd`qM@a8I(;A`ibf;}`!aN)j$L#w(a`0JPYS8|7; z-FdFW*1i-QEf|lS040B2c69%)1l@iqdOU541MmwvH5+5%3J}$9)D$6?p&N z%e4hIVqz?3OeLP5dUV6tfIZgWD5a*Pg$`lYd=_oh3YT%Ji4EYYpeWwpM!rW zdHT{oHO;ZU9B}{T&7DgIkpFq{?M=C1Ki2HE;B>X_$Ft1t(qsd~JR&-6A^(%~?o>Az zBB(p)W8aT`=Wmt!gFVB8Ze5U{n4Sv%+XLF{PPFU=xuQBP6r3TymGA+pfIoh+#jBx%A`vix>LITIZZ$(RAyF?^}g)E+D@$`~nMXytB90161!*1;M5)`zQBHLE0Pj6 z8q$w{+s0~6f;O(bL~&?8{+Q$~-V@o6Rko?tU61O=*vMim5@Z-7Wz^m6$7Snu54u22 z74;uU(Qw?EL2~KfVSm@jD>41}Gf90wC!rsUS3>$7%e2tH(3@@vowL zQnuhw*6c6NY&b4SURgd+{LW5iLGX&znWM7}{aAoKQqQ9q;&O*)=fF4lIa3^M{Ww%% zU4aiQ5Ty-17)`?FDwGf8?~(A|T(Jd3@C}>W7o}Jd=56@+ZFu*xIe{OEQP=J_b?aJQR;!|kJP z-v`%hd9US-kT6AV-Q8)(I~h+3XTF~z;ZnP`5A$GPmqXT;X%cR=tC*k#EfjrUbAv|a z3V-;)US@xfuV81~mHKt?Pm>A<&qoq|X5U~W0Q%>@z9ctG!i`?;341~7T~Un090^nL zMQLk;ams#$W{Z#q)`)I+@B@xh<=phtCJArlrcsy$z17Yv888gsV>%Uswu}R~SDZ=I z0c7-DNe~tsz}AO$evtqfojlGc3J>7dX{XOCgNoiQ$>+re@J34z^(AoAJ<+m6Y5=F# zjaccg4PZiy!ik_C#L8pYXJ%Oju~e9kuL}DhrV>+QRt0|>cyE6%I*8}7?~i#fUW?s( z39N`1c=ZLW(*NcZzGn~@(NoI*kR8M`;!zgK%7a*A$e$+*)Y^O(zE6D+Hz}|B5+LR4 z8`b_ggZLh25!V5uLENGc^7arIQLg@Td*C1ze$bx50%|UHHP1o5GVt9dzqc8^A-kGDH-9Jtj#man|kG=hLT# zaqPQ`Blf<-n6~-nntt>!PEnQJs~tXqU6&uF>)jc_kK>G|ydR8UH}@7_>$DMkr|~;Q zRrv_cus2g#X&k|~cBnq$Xd1yR?|19Uf^_E8ffrjxaCFa$bhdXRcu+{;S=;6a-t5T} zG1@wcSp;hD#qy706;ZDY)7_)^(Zq93LhKC=ueKE|RjAdmTp@|o;b<`)VvV_O2Tr(=ZpIlD3MH5?eit!(To0}FOwTxETrgkxo+Y%WP1HO9Xs(cqrKI?sZ zM5`FPE}V%N26OkB%@2YXE)G`i2j$PrXOO+XH@cw;<}I&(BC8NN9JruajG6rc7UoOw)Z4y^MGQ+{exr`2UrEU!0fcAJIPM?3sd~W#h9UQ`-yc>Ch9HSH27HtU77-y z^z*Yj!TGgxO|l+m3tMWyl_!o-WMu=tnwNkYJ7#0a=CVsRl1-MSZ0rLir~`KOgY9ES z9cMwQaaj+t>kl@mDB$%&PI{Q?fC_R+^9kT=IiqMZct|+Jpar}aCAzi_&TD@>yaC2M zlQXe^^8|kp;j{vSgLbFof#D|)Zxnz=SymP-aDGD$`P!3pm+Kk}0o8dNZ9jvHhT#+| z;3 z@pYDCr}`JFM}1*GB0irmxSZm2yx+SV_kI)W>;t#_RVXR8fY%c>bt9`393_wf?u_0T zNCqjUW=13p%W-V+UPtLyW!USin+6{!^m}!Q8P5N*W7rfmTo=*fu^xw@KZjY6&XGNz z@S@!hyu2?xJr=Il`0~S^2jJ%?O22Qxc3LfsmUls?6V85pHpLijbewBfjBC?XU}sDW!63D-ZCu(gQq;o z4Lfn?oR2&*(!Md$^;sUhQ#>DL&8UDAaP86j3E2Acn*#|-wlo9{Z3sVw28vBp%Vzr67D$4=#K^jRNJ`+j#QX0vo9Esq|$+%;m*kw+}V7oSqlq=0a zI^Q&uP(YloqQz@K-|isYXSz@V!hf4q5;$0M=*STGr?pCR1l)G;{LkNKp(MctUtLN! z*q=Wwl`F(q%%LV^Wqh&+>Kqi1V`0>KIjC^+PIdE11@!9p#`ywpm?3dmr&AuKbcb*Y zfO9w8!rpbrqmQxFt5cw{+{?B33*yLRP2!tu21u9D_TX-zG|EBS^m(gf z(3uZ6*AqZf%lrOM!PWrhD5Kv9&0gmCZK92k*;Z-CPdOSWbMtP6V73M#)o0~dB*TMu zEcR9IbJRd5^#e_JJ7^$g<(Jh(naXHTRcZS|nlhUGrZb;11SJ~ar=^cbifF_0to3NM z5Xu?Zph+teLQ%ymyC?buQ1a{*W`=PAq+Nf1tlU@#wMpi4{s5mjrTRIW38C;M7NsW-5 z(msJ^C42!2sPt9FcmM~K&N-A59SX{I``J5lDWcscO6k7+gwh?_#@c_?ln{?}Sl{q< zC1j_rKWcMB3H_))G5@|r6`6+||MC%Zi`t%G0gvvj+8w~U@(D`DaO<7i4LV(q+imk( z7BNUvo>K6aLukRbfjdABX`K3HY~3J_T)XcvzRH(JLL!C>_raef;(?1_WKgGu^sA_4 z8Dz&N#d`$9eJD1=Z2;rUfrKmm2DIYng-z4u9E<~;w+q?xeDrzq#YAXV|efdlYJai_a(`y@+L5W~I+-SP`iYNA6!>;jaEkYf!T8i7(D+m^TV zwVm3Fb~E13?R_MKBJ`*tu09k(8tEMBL20yTQ1WRcd;gsJfpS+o?EKR9ivfW*>2*=SoSp#CGP-aSxa z=bENbZs87il)TUBcZ={SXa^;UEe?%P>f%6*(_t`?H?>^`G?v~c#s<#nved=#L8;GX zza*8HP{J|6@sD96JsQ*RG*kws$`<4&d7*@_)Z3;@oV19BU86rKjS?+7PhDMpPKnG- z?JXG={}AtkH^T#`{}A7rlgzWG{t$VeDzCnXTqg`$HGH!})`@ZV`=47btP>k4v#Pb# zt3+_>>Gj*-ULNDzW7=P!MCbcc^_$BC909{B03{|jn*VS5igcwyd9KhiP&jF{&=NXg10LwP`hr4SQ#;M`1*Q@*ckuR zD6;)GVPUv)ebaU;nt00DXXmgLF=dAB71F0h2hagQ(K=@I_7JTAQei=U&dGJ<`&iJ) zen~dN-8<0X-t3JXQaezCy!)o(%^hfmkP1gZ9Zchg|_{45cq@S1C&=kz8Aj3<2WzUguxQ-M+`I~@-6@ifosage3O%H@(jJ35f^LeYSG z2imFD>Z9?GIXKJ+r_ zM}KV+x2~9QQGHoH{!0WGG<)t0|4Za_oVfT<_Yd)aWyFhr>u=(F zNCXOsTO+=me(N_By+&M!zjkO!Z=Fzk-KIyONP)_N+$tj8QlP&=N3z@AQK0La_uj63 zr9h(>gZSltP#`K1g-di>C{aCi`mKXBlxWMAo?69tN`!15ciw+QiB#Kv?(@F373mf( z{rq-gD>BY;VCsVY=RDS;am|<-NimW*N0@2Qdz5E=ik$}CZ+^>Rv4sv@kWZ9xwP!)Y z9U5;AEbKr$D-M`#X$K0o{+xEPp94L-u#2u^J11JRrMxc1%!vwiJ<~>9JgEAQfy!IZ zMSQI`NQ(zeyV}#&gP%@si=Ds4gV0~9x+AxFkk>(-1o3(v)Noj1@>MS<8p>NBIj(Ra z&$$}r&~YwQq)FuzQq6^)`eq&u0PlIVFk~xmqUrbg>4ox~=yqb1wI%5P@KNnsIZo96 z)Ow-7k^^n`GWR+SC52x$#`JgXXG783!;Tv6V?$M12eoXzvm(zYixN5CSW%|l#hKfZ zOz4+8oyy7x9ir2jezkp&4t4cdgnt|F!4kU3_q?a*(4GDj~Sd^pxz2=^j~=#Dq#>xD z^VUEFy;)GERyiz!xV`*Uwt-yC8@Kv;`4Ou?&fZ8}9;9th+;0U^dWBkOX!4*Z`GHc5 zV8WM#J$IFOP{xj?=T^@Ag#2DA#SRV9%tM>1B zA|J9-6!Y{?;e&ah{+!v+PUQ0>G@t<#?@XCKvx6V$I}KG*-WEi6RE=r98HG`FRArGz zgD|=~{riqoi!idUPVF$eBZ5pGUu3e66+yH=&9{15??LpFcT}$1?LiS$b;|%g&E`*%VM? z=jPSDVX2M-j06dC7+|RW=5N_0b9L5IiJ5_ z*Ex0}tCltTBJhw>fDwbhE+jHH{C*$U!FzzKxKs$0$Q}M;*8(MCw%pd++X^MEPP}(h zZ%{`JiE*upqUz{Yg|Y*eGn7Wrp?u8@YVXukrx$@zRZj#3C$$uikD1(y%NV{Vjm5O+ zU6Y6J6`I7kEAq(n`{5#oAU@0;O(WUKRHdl|au@!x*V0CD7&a zZOeT%l8BEpmG6_YJaT#YLx`148J*rL+4T!7Pm@DKeadKtk2U17uoBw!Ew%pqS4Cv% zecbEu2`CXbc6u{a6H0RmHOWfDaf~s0B%RQdN11cfh8B_12r4OghJ{Nb;k;cw2~cWs zztCL5^AZV^bku5XYr=NqH+?Jfn9DZQGU4(tnOO{d39NTia)HvK^9_Qo3~H#aLon+6 z?tN%(-o{lAET`gi$Q)2Y)s#xdmID?4_YxidNh)yD{%6`p&IkU_*8k=M|C-;E2B(ng1Cq+;p8InO`en`pJsTvyX!m?rPk80a}Ri5MAh2ko$N-R?iD97}s3H7r=ccjQcIZ zbkQlN4xWqNhRFWR{KnZ#Z)8AKo5PaljVAbrTVz#&`hAuYy^+_xV;b+l8}HXXY8>-M zYnBI|h=D`eY8gu!-smS=_WfpMZ=}H$)$&`$8_8bXIPd|?cc&N1pY%eH4-?}z!TU5f znaIvt{oONP=Y?prHaVNYi7a!KZ^d3nqUqbUuVB+d3wV;b7h>6Bcl9+$97|B$jQ2vE zJ6m=v-S9$XbTlesfnMml(f+7L(3G`0Kic05)wQHNhywZU7YYY}CcnC9&w;XPBl#!5 z==M|hQ=Ghz=eq=FkUi|Lho_zw+QO?!FJJ`kA8!PRf+9ke-jbmFuhTDN!KLSy9obCa z_!jo=5di-dNh1+cFO+ktw3O`Xe&<>_kocn{D-Y5zC$|*1d7*&aHf7DA&+UDg3!Yv` zJyCn_cW_ew*cu<4cSfn42r*FGJhf9M*bAA>-E-Ck^Iyk!2()>j)}zC-vf$GNRZ$&~ z^2E_Wve{{QNb=@6v^lb?MgWxUjYpraokOjpXw$5qbI2^EF(?Jx@rjex{o*-vCw-Th z2iSf6|7q_$prTl|y-yZ6WC1}*k~0Gc2r9j2$Vf(_0bzg%%#foI^k6^~R1_m%PN;wh zMePBzA|favh*?oYMMOm6S3QWwbJ6R0-@WI)wcfh3bbj4cyXwEYx@vcIVEWu=&3W+< zaN@O`7NXsO7*8EU$&YHGn-SxOn#hu+L%jZRi!cDt($*D6yTw;Y$`$PuVAKZRJ{UROm?si)WAU@u7JkRVb9U6NR z^h^R5vbU#^-I5tcx(IqozM6d&G4R#)Xo5*6 z+WM2W(?M~(-LZLyoszA~#uU*Z%jnU5g4G8bUPvIm&DgA*wucUmZ2O>$eRSyH&#RX@ zNC&=+w(FGMWZud!TFkT{f(9fE7CwRG;NI0!cpjB6H9Ya$6@J*ns%>Y{puZ zZU?B%(oPxt>yY3+O2bQ?I3WUN!L(_9gvzWw2tf80cU~P@mJb*uwqs3 ztwTvjM@=k#2V&~n;#qcx&SA#8j7VhI^nseIhS)={hJf6%3h8NxjJ_E6FhqqV5x18k+Pb+=zC_VLsn_7S0AlC9CBB+|G;p6U?@rL+ zcF^(`PZ}I~s#%ag8i%MlBwgs$N+rNOZiYjX*XW%NEcp-+Q5r;hPDBOcDPTI7T%GL!w< z8qu5oh+C>I4VI=nyD$;aw03{}0}UFq#p=1QMBHioMeCyq4P9UWX573s?sg=krnF7rMeP0*{;23yBrv+dt2ZG&bZzjMRuc)LO?5A=E=2-agZ9D{ zvD_r7tLj`NsD5}mpoCbvbibZ5;z331csk;%O|?E5h_03P3zs0~uCLm0<4z=$Zctj8 z+Z+jfdq2J0f@pJFxy0~EBpi~y^~egb;LyrRC0Pt8xDab?w~7JRj}P?|ybuuJm4;a4 zbv2masRJKh7a$JUhN%}KhSblMS&T?a6Th(#@u@^}!~(?7gI9{@BVK4ZXg_hGLDzf+?8oe@Pt0RLp4Y9o!-#z*BF?)L z7@)Rg&5MLs2FNBa&Z>-NfObidJ;7RyEfbD080eLchbKtW8PHm%(;@vq6uv)xr>6k}>R9&AD<+`${6)2AgCYYY^5<8sK-4;R z-q;V(RMTvy6XGfR2l`rw<0~|i6c7(_3}t7JV}RpnRjMaq%T7MIs}iW5==H)Ch*f(6 zkK~D=_}}0@F$>YjDspVHDB7;$W1Sd?3k&o!R`M~xt9ASa#rJgZb(Hs9|BMd#Rvw0{ z5GQ-2C)hNict3WIUGhCT@HhKZ#UY-9_I^$sipya_W2z9PJgype*VCcQ$#utr9`R|)Z|YnXd7s%NDn+-Osd0t1~!wmC$>t-YGFd7PtQ&orqQdefs|OzpW` zeMH97%%UpaC^(nnxcdU)+_7T37ZK}wpUxm?>)iYP3F7Vpm32IbH^g!p$9qLV(3y$~ zc|>M+U#yE;6ts3Py={kh>$Un}QF0XE@5e8?WEq8C2|U}W0?};dk*A@pOc;1m&Y6W6 zamZzU;Z-KwHq|N=JHrIaS;o1yjxph6#|00&GA6`Ctb0yDJlwsu#Tv0oZFdO4n|GQ% zH|=0Tv!SPC*bNpm^y4ip6)aGSh-gbMVL`>L3h`vbLyMvYI)7(DLWGsiIyMXLk2^W@ zT{sKQt@2Z9oWlb1NqAO{8VfFz?Ax5Fz(UuvbT->)u;9wO)lN4jMne<3s^geiG_<&s zZ#be94e`tiS%y;4pqDh`RM{6c*dL(RYPvgvwEClExb#=C*#?ef13) zye5h4w{Azrm%;0CrlJ&(GG6JLI*kJ5i;FDVk|@w&7Z?WfC?G7W+h&Ux+vOH_fk6Q^ zPYx|+76mr(ED>YrQea1{!X_DUR6f6!PjQe8ft`*p^DP-Ta&tCJct8dqsFV*v^K{Rusn40E#?H+2vd_&+=2Ifz#KB#UTdXbe=&+lrX`B|u~X z!RZFoa)^Ol4(hHS0MsaXmU9vT=$#Kg1R&0xeTcs_0iXo*P8~pmfun)f(BZsDC%W(o zqF2fSri?#;lz#B72tNSbCWi!k3c#zO={JNCdD?!r<0t{7;}_#)5OYt~clbmg1>R8o zsBRZzw`P@nn!GJYwecU}**y)^ymC~sZKr|MjBK4o>1ps`z;ojLi^p z>m&me1gAiHiGE!DQyb(@W%5(jLx-^53{DS4FI4 z&N-XKYXi`5COEUw8e;69k7Xhb9a$9G_|_VV?C({#AjY0+-8u1{HPoJV73=J`hWBT! zZ#xWF1L-CCiS!8@h&6HbY^=8d(tX{o7qU~JL~PS7Z#m@mT7yf0h~T?2a<#xz)E~-I zbp)qEZp-pd_2@a0H~C@>D!P$?n`~1pAB+I8E|&X-?g*g2-}r3VhY0w6L(iS*HzPpp z`iBUDvshZV4&qtW{hzcEFW!EVm9;Da7IdFkOizyh-7wkB(-3F%)_*BUjezo{yZ2Uw zM*tWmKk8LM^;0_wYY?-?B!|5l2!}5c_C@EO#ll&YSL+HIW8sx%@0cZFv7rCKkjg+5 zo!=plw;38QA{QTrt(BOA+ASk={-h};#Q%WKW_90f5`|Mq;9}C&%Cgluu z#lY>GYDc9$q478+quRU88B&k6u1fT9h5ZGhi|_4pgH87+L5+wVM;H0uJ?I9t_GV=r zyWM~%nH0Mfak7NqkkvXjh?U)Zmj_W;VuNh{Mpu}8H!c71G*?)W@nPEKd?#2Q7CYe- zqSsFUMoYw!Wh;xGvYntPd+pxnJLtNB_Up;_mpQ_hR@bHnh(%YrUb(DuM6UwBouHmW zgU|2X=HJVu!Cvy61zYlHa9{u2^M;Kyblx)F;x6J${UPOcl>S!ac~j*|8f;{XY%4?D zER-V^dMpmkVo#^4?ui4wp^vMk&x(V_ZR>fJz2acp68Gt2KE%RgYp+-QH)3J#le_!b zg1(Tec=YP+SYJ>xc6e|XasSlA%b7*KaA&@1!P1SsKfWF~a&o62Jkm{x>w%+F|9d^~ zzt;o*k6#Z|otmVvt4S7gJzMIjb+YhkRpT+?8Yy%isQRSMO(~cqQ{Sj|SqjR}PJ6O^ zGanpvqckh8;sb|@zN5~uJTObvTDH1%2)p)bZ3b`65O%h7;^;X&J|&{8&JkG}QZAvU!l4+w zGN_)Q!nu_cveG<6n)7TsOX)$dG^b9><-sJ&0{of=Kl3i%R(xmX<|ne+tyqoug0>gD z@33`VcYZsyxD)deUuAS`WheHe%s?f44nMr@?NOgImml;eSyr+Ty(d2^aA+2QYuA19 zc0Le*q}f+yrCJMu`617{X^5BBEnJ;#BM3)7>kY0(Y*@e7P42cJ)Ck5@;^=%68&TL0JEK)kJZ`y?!1Oa&`#9VEziJ1Vk0r`(t~G1VJ-8S@OVd zf>5~a!rNJhy27j3Dmw*0>&*6?E`|WCh$&f`Nf&^sgEMCE=?Z`~eOvIMPJXCl2_{Q^ z;D<7am#=s2;f1^vUq~{$c_F@CRE&M2G5c_;& zeq)mVAl6s6A|iaoAeJS)+FO0o09G6^uSa`-KlbREMXA)ze$3Q)V&U|=Jy`WQmyfIJ zda%7I8=KE?K4UkxnKGjg8x5pSknqo#q=7wS{h7~Lq$cgenA4xJbbXrX%-J1SRNC~d z2FC5!(yr1cn{?W-eaZJUk4Idv(=*8bSviJW=P8p z*@Dg3*3Cbr>MHIrv7k8U!BxC9P4>(}liPUcq8DSAOuvn9SR*QF4dC$xCBI_N}J2NWW@E~5{~8B;h9-2@U#cT+eYY(Mra*+AhG*j0S?M%){^t0z8> z!bz}w*4&>>;lx(N)#HeU2ais6q>wos0=#Nl$z+bjL?sGo1#qU47$;{h2hL?V8_BDF zHXNZ^BWj4R4adp%+(JKwIj1cCcb+|w=A7ae8b_3Nm~k@CQsnxJ%s7K(TA#}b%s996 zw~k+rsFx9CDK*!GBbDSUa$%+kXFku`!Qajra;8|dRmzkba&iUEsDG}}=iG~LEjF^y z=kObR5?f)a&zZ4%Z}GT|dK`w8o@vusJx;mcWyhp29nNbB^K=@b6tiyQln@<`^lYO! zMuwK=(GT_wV2YjeDonp~X|p~VSIqDuK7%DEU^i3-!=xY;X{_<1xr+c#O4 zcW&0;9MpPP+@Yz#$t%gfxK&+)W4|a_x}2%NG1j}IQi?b=*hg2Lp}^S_GpUUfFrIVD zv+xQda6BhGVSl^k1aVFSNh~RfN0d|2(D6{GSA?_AQCewTK@;Bly5@n92QSo>9T8pZ z#|vkSj?^iV#(^aI4WV4~aX@K9H#LyeF~GuG_BGG~=KgicXD zbWuqS@>&i~EkVyGcek^uME1%+cN6c>m)$a8$Wgbtk!B47@)bc$cN?(kbA2lBY6Dxf z_Vjmsu!c286>@uLSVO7(X=iQ3x6WAy_IaAa)6Q92JP`d_I5q3mpy!WmBei#-`?-?h zn-(us(*-IFLXNa!dcN?(!kQH zE{@KXfrLA2-3r&rfJ%EW`PMjD(7&0=QuC67%f-E+-rjQX`lZV2JM-lrBD%+Mg7Y}2 z%Ud&O5Izp}W_J2_B0dz0iM}>44wUybtT;3@4xUfkb|+(k0+hLJekrD;0Dfx%0=8Hw z099$08s&om9K4};>^P#ul(L(RTNR;1HDyE0B}LdsbH9*?DC{TXSJ$(Z=P=yRqHv z%i^~oZfSmXJ!4@H#u@v{t?T6gwuEYPQm1tQ^W>uqy1f~|_?HK-d%0y0yXw@t&arS1 z+c~9J*|=m7+o5IMJSKPuQ()%#GUp6o^u3EN-Mh{MG1bv7W3+i8^jbg=MVA+9ELGfu z`T4=AwphIRDnDoog`deZM#sqoyTg|vZn-b!C*>YA3a`x{C#2g-E@t-BCd({apAi zHd+W0kCuj~Aue|kQ!7^!0ZkE$3jK5uXcLcBAtQ#_sE+;8Bm&2$I4rbp5doXE#Vm<7 z5kT)LOuOzR3ceHWZ-0AG6w;TT>hG@?gGbM=itSmpx<&$Psvmo{MSw& zV){wLM2k0{9sH%ixr?2iA0!PcWE#&fgQa0{?8*FsS<=9(Y`HORwlq8q9oV{ho-}+q z;%gK!Um6-t7Cg!kl!1adOC0@$WPs1vUQk0<23Q+ ztj(^+me?|sOV-w7a@{8xpYrRm=A8j!uS-9|)Mx3x8wz-i_3rl!Fl~E-Rj%5wNvHD- zW;5}IZz_Di%8t=@X4`+j4m3n8NS@Gx30u6@SpTXYOK1pqb-BGCJulq0DPw{t>~_C( zOG-%;)PlR08DABHbE~sVln;tSakV8yu0tH!<{y3-KPV2=>G`MWhygYsRc8?;b2pNY zBgz$<=!j@YKqOE1@ukL(v8{VomEHgN4htS%pZ|2zM@)S~a*gG-kJvO0>DHo`gIG$j zSKjGmybzKdaJ5B?5AEOXRcBW6fwN9RV(1q>Xvl0dh{t*0N`A(vnG3qHx6Hw^3wiJG zXYTTEj_b7Is|F~HD;*DT@_4Nn%O^{5V}{f^s{KPOxa;}-L;9_lF ztlaBU9Pi0Kod3ZGhhs(h91E@SN%vy(I987yzimX+U+8&`iTFV+Wa0K{x}3cC$MjMW zpZT2_S7WKmIgoZMoS=Zgk*9j*=y~wRmp-00MaPj%a=rrBWuQTQ=Hr94((qnnL+K)p z1iF4i$;zD}4(rE9AJFp>hh}xFytcYAFej?2ov9-PvTxs| zlcNI|FKNs{&WS!Otz*-XrI)^7d`cF5yqZ0j-?69p4ZPjhO(A|yi|$X@qK7>v9&2`D zVjysOl4>WWn3rwYE!T;K9dDf_`>`E+d;hKuxw9QB>Z)PbwzOjxOJ0U7e9(^VxYlvQ zclsS{hmmefi_Z=G{NbB#-psgxcXnmEJMO)KGxv>O^Kt(ToYpR*k-VlFubiK5bS}3V z*H=85d40lNJhGu=&2GE9_!FO#^{&ij{6R1|rEXm_ey`5d>7c_Cd|vXMwz9w{ct+!+ zY;%R@I3-ov{fgFeTz|8D;4QHac;8$Bl|0!GxG>pAaLf1)xQ1coGVz>`c-6*z_FM8k z;)+tUFBP8b!j0b89%@6(*msrcbp8`wC=_)irRg*7cl@U8ycJ(?IpK-kZAIhhRN)OQy*mP-ucB{RKBnyp{u!rQvRc33ohe?KQBS_$F4`MR)u~%vX=o~Bzl ze1c8*v0aZg+&!2`y@!QVE1 z5>ZkCJm~5Wn_m^)nF$Bo&sGJel}0^<*%Lw5a+mmig8cn!rmmR?Qq?I-91vgZW_tFm z)P(FBFURFqG(ksZz(w<#COFBpEntt;0$zd1wU_F(pxWRqd*AkHn% zk;kqWaVlVvp)KOuP4z)L5YNy^bBho^&EwfwCSlBR%j8|Q@t7%RpsB@V0MRv|#Hi9x z6JmJF)hHI4a5v<4EJITrva%~rEJ7@d&U-&eKpoPr+$?V_RE5QHnD&_Ms$g8jewWdw z0u;$hIA5;{Bx#YXqVvZAS^KwG+EaP3n4FizCn^Vldzs565pCNx;F*Z2cNflDU?T?; z1UFVkUX_R9FHpZKZ2}xJ7V3GA|ga%sno)ju)<9xvc)U zoDV22S$79i1R*weJH<_15YDa|s~n#&1|GlMDj69d2D%>_?KEbIflRCAa(>)|^ZCHh z)tlu_ILZsxE0*ezI41@q*y64v&XQ;Iz0RF9<)Eiea^5SLbGA%2RB}P*W5?tlOm9ce z6XzZ{mihouwJ>0pSq^&6k)mNmHPij^^}vxyw}SA<=@xN4aCGW_uLu73df@+|>w${> z8WubXLJ3rQ1Upntfk#eEi%&r~At5@H9T6R`#p9-gI=ls+f&ev=5iZ9kC*(GjNDxpE zU@;OB<@k8y1W^2wCW@9+W-5qC$Y{zOdls~FMiexQ}@C12#FT|8a8XbjRCeRqe@8lCzJEpEsC zsaW+^UTsbQQX75j_{kCF$IUphWh0&cr-JQoc(otzBiizs!%AJ}X7q>k!kqUl1Ha8C z0iifL^%vXs#|ZkVX7*V=?erc(bM#B?3C+=|ztALx;g8iWyKC32P1O+OW@yN(9?GC?FZdY}t&M#Q(D zs&#G=(tg=MsQnAWPrhKkki3w#u>9a&Az2>ej)G8ZXmogJg2F!W`Ra`5@QBn9Y78rh z9i5OW`^Gm@E%=tRp&v$^}=*DWwwFFy1Ka>I!~Qj288g#JrIb5KWc)3zw`ene)QN@@{|-Ik=rVdUM^gV5MedCA2b$l~ z{|;5|+;z0*x8%P=(}z4-a5(MnP(z2B(Q;oC|6O|A=pP>univz$4azJ=SbS)F8WEFY z(?a9pV^Rngk|W|17%|aAs;RXx$(W>$0;T#_AHK^pGd4FiS6|4ZAV&7_@eHsTKC@HU zq+&vRNHjMxne2`J6QAj1@+2~aMs_5VX=FPZH;qF1Q+^7O=rC;v%-W**65&i;vE(e4aS1|=*a%{4wWz#__p z8AEf4cBO~0!&xqj6q*a$f*uy&N7y8V2c#yr*^wDkb00c2+8d>jQ@*YzQ|(+VUF_Wx zTi|UUG_H`k&k&mV+5&qVsh(HRrUKh4CBb4pW z47cOvCk6-l&`}+vAYbIKa{?ncz=9cO<`WynrgH1^_xEvfn?Ykl{)6w-G-U6Xh}v(& zFQOehxc-MlyD*6D3}&-fVNO1gVQj}lX?F)W$)99+BbBtdy@d zreSOr;loIKn}!8aEWY2yFf-S<-~bQO@cuAmg*!Q-I(+Eg+Rd4iKy1r*x=iFt)Uf?O zwkNSaP}*>N{K%h#&_EAT0NPjK_Cch;|DSesvM>#EO0{;gBl_DP?GKaoZd9nMA5H>-)A$4r0f$g3P^#^8@@zK>nk z|0VzCg$9Ht1_e^)1rPUac4&ZqLa?Lt_ig)+Hvgo*1t)}=Ig&h>KHH`Djh0=L!-vO%S#Y2$ ziW$~P+<6Go!NQG6PI9+%MaL3!y!|#Ff?3pPkJvD?N!&Wz8I$I@G2I!F-eh7{q2 zi|)j_JuyLY^|nWglhE{tY)(v%T*!84okmQP(uir5QwlLn@+M3Z(E{0VWWI%7GT=4O z#DrM&PVpnMxFW-oF7DI{l|~;zibAw4*@dt-oj2LUWHL%~u;=Cz6EW`mjR5f>CT)~h zG*{xvk-gl$+Pjb$e@PE*1DWFMjj9PJ?5*toXL=4{*2Dg}kj?)=&zW%VyX`}hQuHA< zo#Gve=3l{t>+am`b1{iDF(ER@spy+b4kEs|jY2GZ-QLhZA66JqhHMw{)!vS5KjW*u zgFCl=${+1L+%((*+@>ChJE(#vqI{5-`Pcp7{)f@9zl6xJz7vZS96;i(TPJ_Dr`frW z_-jw$7Nvf(C;GtfMh=&E;KpHY`A9;~iaFx%U)!G!Rt6*OYw^wBU-lp3m_#OV?dN?h z{}=nubhmGMo?cde>aRpk`F?*6_unX#MqyITSkY)6LCiA_Y5Nkp+R0;NenX}cdXw${XWQ!-hEAf0@#R9c`sVL&`~JB968oFNozI~K zG^n}l8$_In5gC86|0aF4w<9~u_^LnBf4>{wTq&*!5p&4Iyq9cmkL;}zzLp=+`>y|S z?YW(BWW1n|fp%RGab7t5q1jPK%Ky{$C9Iu1(A23pF)&+gdSdP1!>e5$QjjqZZ}@*j_fG7paz*~j$%0la6)&;S4c literal 0 HcmV?d00001 diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index e8a31513..04d7522b 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -698,7 +698,7 @@ def build_the_ssoft( >>> assert col_ssoft_shg1g2 == expected_cols, (col_ssoft_shg1g2, expected_cols) >>> ssoft_socca = build_the_ssoft( - ... aggregated_filename=aggregated_filename, + ... aggregated_filename=aggregated_filename_socca, ... nparts=1, ... nmin=50, ... frac=None, @@ -822,6 +822,11 @@ def build_the_ssoft( path ) ) + aggregated_filename_socca = ( + "file://{}/data/alerts/test_SOCCA.parquet".format( + path + ) + ) globs["aggregated_filename"] = aggregated_filename # Run the test suite From abe52dc2b23f276b0dad407bb3edfbba5e2fce4d Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 19:13:23 +0100 Subject: [PATCH 08/10] Run only the SSOFT --- .github/workflows/run_test_ztf.yml | 2 +- fink_science/ztf/ssoft/processor.py | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/run_test_ztf.yml b/.github/workflows/run_test_ztf.yml index fcbebee8..c7a260b0 100644 --- a/.github/workflows/run_test_ztf.yml +++ b/.github/workflows/run_test_ztf.yml @@ -46,5 +46,5 @@ jobs: pip install onnxruntime==1.16.3 pip install asteroid_spinprops --no-deps rm -f /tmp/forest_*.onnx - ./run_tests.sh -s ztf + ./run_tests.sh -s ztf --single_module fink_science/sso/processor.py curl -s https://codecov.io/bash | bash diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index 04d7522b..e2b6a035 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -822,11 +822,7 @@ def build_the_ssoft( path ) ) - aggregated_filename_socca = ( - "file://{}/data/alerts/test_SOCCA.parquet".format( - path - ) - ) + aggregated_filename_socca = "file://{}/data/alerts/test_SOCCA.parquet".format(path) globs["aggregated_filename"] = aggregated_filename # Run the test suite From 08ffdaa940796939cde69d201541cafd3468c9b6 Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Mon, 1 Dec 2025 19:16:58 +0100 Subject: [PATCH 09/10] Fix path --- .github/workflows/run_test_ztf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run_test_ztf.yml b/.github/workflows/run_test_ztf.yml index c7a260b0..c8394cac 100644 --- a/.github/workflows/run_test_ztf.yml +++ b/.github/workflows/run_test_ztf.yml @@ -46,5 +46,5 @@ jobs: pip install onnxruntime==1.16.3 pip install asteroid_spinprops --no-deps rm -f /tmp/forest_*.onnx - ./run_tests.sh -s ztf --single_module fink_science/sso/processor.py + ./run_tests.sh -s ztf --single_module fink_science/ztf/ssoft/processor.py curl -s https://codecov.io/bash | bash From a10a15693d1b5f425c34133187bc372807b9c896 Mon Sep 17 00:00:00 2001 From: JulienPeloton Date: Tue, 2 Dec 2025 16:25:53 +0100 Subject: [PATCH 10/10] Fix tests --- .github/workflows/run_test_ztf.yml | 2 +- fink_science/ztf/ssoft/processor.py | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/run_test_ztf.yml b/.github/workflows/run_test_ztf.yml index c8394cac..fcbebee8 100644 --- a/.github/workflows/run_test_ztf.yml +++ b/.github/workflows/run_test_ztf.yml @@ -46,5 +46,5 @@ jobs: pip install onnxruntime==1.16.3 pip install asteroid_spinprops --no-deps rm -f /tmp/forest_*.onnx - ./run_tests.sh -s ztf --single_module fink_science/ztf/ssoft/processor.py + ./run_tests.sh -s ztf curl -s https://codecov.io/bash | bash diff --git a/fink_science/ztf/ssoft/processor.py b/fink_science/ztf/ssoft/processor.py index e2b6a035..f8005e3a 100644 --- a/fink_science/ztf/ssoft/processor.py +++ b/fink_science/ztf/ssoft/processor.py @@ -1,4 +1,4 @@ -# Copyright 2023-2024 AstroLab Software +# Copyright 2023-2025 AstroLab Software # Author: Julien Peloton # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -530,7 +530,8 @@ def extract_ssoft_parameters( pdf_transposed, flavor=model_name, shg1g2_constrained=True, - blind_scan=True, + period_blind=True, + pole_blind=True, alt_spin=False, period_in=None, terminator=False, @@ -698,7 +699,7 @@ def build_the_ssoft( >>> assert col_ssoft_shg1g2 == expected_cols, (col_ssoft_shg1g2, expected_cols) >>> ssoft_socca = build_the_ssoft( - ... aggregated_filename=aggregated_filename_socca, + ... aggregated_filename=aggregated_filename, ... nparts=1, ... nmin=50, ... frac=None, @@ -708,8 +709,7 @@ def build_the_ssoft( ... sb_method="fastnifty") >>> assert len(ssoft_socca) == 2, ssoft_socca - >>> assert "period" in ssoft_shg1g2.columns - >>> assert ssoft_socca == {}, ssoft_socca + >>> assert "period" in ssoft_socca.columns, ssoft_socca.columns """ spark = SparkSession.builder.getOrCreate() spark.sparkContext.setLogLevel("WARN") @@ -822,7 +822,6 @@ def build_the_ssoft( path ) ) - aggregated_filename_socca = "file://{}/data/alerts/test_SOCCA.parquet".format(path) globs["aggregated_filename"] = aggregated_filename # Run the test suite