From d6ed1e1252b47b38100b757a45fa34d9ce9a4f0a Mon Sep 17 00:00:00 2001 From: tdruez Date: Thu, 18 Jun 2026 17:04:22 +0400 Subject: [PATCH 1/7] run docker tests in parallel Signed-off-by: tdruez --- .github/workflows/check-code-and-docs-validation.yml | 2 +- .github/workflows/run-unit-tests-docker.yml | 2 +- pyproject.toml | 4 ++-- uv.lock | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check-code-and-docs-validation.yml b/.github/workflows/check-code-and-docs-validation.yml index c61f398a..20221f40 100644 --- a/.github/workflows/check-code-and-docs-validation.yml +++ b/.github/workflows/check-code-and-docs-validation.yml @@ -1,4 +1,4 @@ -name: Run unit tests +name: Check code and docs validation on: workflow_dispatch: diff --git a/.github/workflows/run-unit-tests-docker.yml b/.github/workflows/run-unit-tests-docker.yml index 53de574b..5375cf7f 100644 --- a/.github/workflows/run-unit-tests-docker.yml +++ b/.github/workflows/run-unit-tests-docker.yml @@ -23,4 +23,4 @@ jobs: run: make envfile - name: Run tests - run: docker compose run web python ./manage.py test --verbosity=2 --noinput + run: docker compose run web python ./manage.py test --verbosity=2 --noinput --parallel auto diff --git a/pyproject.toml b/pyproject.toml index 97bf784e..ab1e8d76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,8 @@ dependencies = [ "django-guardian==3.3.1", "django-environ==0.13.0", "django-debug-toolbar==6.3.0", + # Parallel testing + "tblib==3.2.2", # CAPTCHA "altcha==1.0.0", "django_altcha==0.10.0", @@ -160,8 +162,6 @@ dependencies = [ dev = [ # Linter and Validation "ruff==0.15.14", - # Parallel testing - "tblib==3.2.2" ] [project.urls] diff --git a/uv.lock b/uv.lock index dc5af854..f6f9e8f6 100644 --- a/uv.lock +++ b/uv.lock @@ -11,7 +11,7 @@ supported-markers = [ ] [options] -exclude-newer = "2026-06-01T14:55:56.000049Z" +exclude-newer = "2026-06-11T12:57:13.821757Z" exclude-newer-span = "P7D" [[package]] @@ -282,6 +282,7 @@ dependencies = [ { name = "sortedcontainers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "sqlparse", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "swapper", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tblib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-inspection", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "uritemplate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -295,7 +296,6 @@ dependencies = [ [package.optional-dependencies] dev = [ { name = "ruff", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tblib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] [package.metadata] @@ -389,7 +389,7 @@ requires-dist = [ { name = "sortedcontainers", specifier = "==2.4.0" }, { name = "sqlparse", specifier = "==0.5.5" }, { name = "swapper", specifier = "==1.4.0" }, - { name = "tblib", marker = "extra == 'dev'", specifier = "==3.2.2" }, + { name = "tblib", specifier = "==3.2.2" }, { name = "typing-extensions", specifier = "==4.15.0" }, { name = "typing-inspection", specifier = "==0.4.2" }, { name = "uritemplate", specifier = "==4.2.0" }, From 1c8b2b769cc1e0026d182c168d38ee44a85d034b Mon Sep 17 00:00:00 2001 From: tdruez Date: Thu, 18 Jun 2026 17:21:34 +0400 Subject: [PATCH 2/7] re-organize Makefile Signed-off-by: tdruez --- Makefile | 85 +++++++++--------- pyproject.toml | 2 +- .../dist/bleach-6.3.0-py3-none-any.whl.ABOUT | 18 ---- ...-any.whl => bleach-6.4.0-py3-none-any.whl} | Bin 164437 -> 165109 bytes uv.lock | 8 +- 5 files changed, 49 insertions(+), 64 deletions(-) delete mode 100644 thirdparty/dist/bleach-6.3.0-py3-none-any.whl.ABOUT rename thirdparty/dist/{bleach-6.3.0-py3-none-any.whl => bleach-6.4.0-py3-none-any.whl} (72%) diff --git a/Makefile b/Makefile index cf78903b..f5572f1e 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ superuser: ${MANAGE} createsuperuser ######################################################################################## -# Utilities +# Linters / docs ######################################################################################## DOCS_LOCATION=./docs @@ -76,36 +76,12 @@ docs: uvx --from sphinx==9.1.0 --with furo==2025.12.19 sphinx-build -b html ${DOCS_LOCATION} ${DOCS_LOCATION}/_build/html/ ######################################################################################## - -VENV_LOCATION=.venv -ACTIVATE?=. ${VENV_LOCATION}/bin/activate; -#MANAGE=${VENV_LOCATION}/bin/python manage.py -# Do not depend on Python to generate the SECRET_KEY -GET_SECRET_KEY=`head -c50 /dev/urandom | base64 | head -c50` -# Customize with `$ make envfile ENV_FILE=/etc/dejacode/.env` -ENV_FILE=.env -DOCKER_COMPOSE=docker compose -f docker-compose.yml -DOCKER_EXEC=${DOCKER_COMPOSE} exec -DB_NAME=dejacode_db -DB_USERNAME=dejacode -DB_PASSWORD=dejacode -DB_CONTAINER_NAME=db -DB_INIT_FILE=./data/postgresql/initdb.sql.gz -POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8 -TIMESTAMP=$(shell date +"%Y-%m-%d_%H%M") - -conf: virtualenv - @echo "-> Install dependencies" - uv sync --frozen - @echo "-> Create the var/ directory" - @mkdir -p var - -dev: virtualenv - @echo "-> Configure and install development dependencies" - uv sync --frozen --extra dev +# Utilities +######################################################################################## outdated: @echo "-> Check for outdated packages (with 7 days cooldown)" + uv sync --frozen --quiet uv pip list --outdated \ --no-config \ --index-url https://pypi.org/simple \ @@ -119,25 +95,61 @@ upgrade: exit 1; \ fi @echo "-> Download $(PACKAGE) wheels for Linux x86_64" - pip download $(PACKAGE) \ + uvx pip download $(PACKAGE) \ --only-binary=:all: \ --platform manylinux_2_28_x86_64 \ --platform manylinux_2_17_x86_64 \ --python-version 3.14 \ --dest ./thirdparty/dist/ @echo "-> Download $(PACKAGE) wheels for macOS ARM64" - pip download $(PACKAGE) \ + uvx pip download $(PACKAGE) \ --only-binary=:all: \ --platform macosx_11_0_arm64 \ --python-version 3.14 \ --dest ./thirdparty/dist/ @echo "-> Update pyproject.toml and uv.lock" - uv add $(PACKAGE) + uvx uv add $(PACKAGE) lock: @echo "-> Regenerate uv.lock from local wheels" uv lock +clean: + @echo "-> Clean the Python env" + rm -rf .venv/ .*_cache/ *.egg-info/ build/ dist/ + find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete + +######################################################################################## +# Local venv commands (legacy) +######################################################################################## + +VENV_LOCATION=.venv +ACTIVATE?=. ${VENV_LOCATION}/bin/activate; +#MANAGE=${VENV_LOCATION}/bin/python manage.py +# Do not depend on Python to generate the SECRET_KEY +GET_SECRET_KEY=`head -c50 /dev/urandom | base64 | head -c50` +# Customize with `$ make envfile ENV_FILE=/etc/dejacode/.env` +ENV_FILE=.env +DOCKER_COMPOSE=docker compose -f docker-compose.yml +DOCKER_EXEC=${DOCKER_COMPOSE} exec +DB_NAME=dejacode_db +DB_USERNAME=dejacode +DB_PASSWORD=dejacode +DB_CONTAINER_NAME=db +DB_INIT_FILE=./data/postgresql/initdb.sql.gz +POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8 +TIMESTAMP=$(shell date +"%Y-%m-%d_%H%M") + +conf: virtualenv + @echo "-> Install dependencies" + uv sync --frozen + @echo "-> Create the var/ directory" + @mkdir -p var + +dev: virtualenv + @echo "-> Configure and install development dependencies" + uv sync --frozen --extra dev + envfile: @echo "-> Create the .env file and generate a secret key" @if test -f ${ENV_FILE}; then echo "${ENV_FILE} file exists already"; exit 1; fi @@ -148,15 +160,6 @@ envfile_dev: envfile @echo "-> Update the .env file for development" @echo DATABASE_PASSWORD=\"dejacode\" >> ${ENV_FILE} -check-deploy: - @echo "-> Check Django deployment settings" - ${MANAGE} check --deploy - -clean: - @echo "-> Clean the Python env" - rm -rf .venv/ .*_cache/ *.egg-info/ build/ dist/ - find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete - initdb: @echo "-> Stop Docker services that access the database" ${DOCKER_COMPOSE} stop web worker @@ -181,4 +184,4 @@ psql: log: ${DOCKER_COMPOSE} logs --tail="100" ${SERVICE} -.PHONY: virtualenv conf dev lock upgrade envfile envfile_dev check outdated doc8 valid check-deploy clean initdb postgresdb postgresdb_clean migrate run test docs build psql bash shell log superuser +.PHONY: virtualenv conf dev lock upgrade envfile envfile_dev check outdated doc8 valid clean initdb postgresdb postgresdb_clean migrate run test docs build psql bash shell log superuser diff --git a/pyproject.toml b/pyproject.toml index ab1e8d76..bb8931a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,7 +98,7 @@ dependencies = [ "XlsxWriter==3.2.9", # Markdown "markdown==3.10.2", - "bleach==6.3.0", + "bleach==6.4.0", "bleach_allowlist==1.0.3", "webencodings==0.5.1", # Authentication diff --git a/thirdparty/dist/bleach-6.3.0-py3-none-any.whl.ABOUT b/thirdparty/dist/bleach-6.3.0-py3-none-any.whl.ABOUT deleted file mode 100644 index 7814d78e..00000000 --- a/thirdparty/dist/bleach-6.3.0-py3-none-any.whl.ABOUT +++ /dev/null @@ -1,18 +0,0 @@ -about_resource: bleach-6.3.0-py3-none-any.whl -name: bleach -version: 6.3.0 -download_url: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl -package_url: pkg:pypi/bleach@6.3.0 -license_expression: apache-2.0 AND mit -copyright: Copyright bleach project contributors -attribute: yes -track_changes: yes -checksum_md5: 582f05dac01de36bf93c8e05b9cba11b -checksum_sha1: 74792becf1c32fb1edd3e04594acaee490969170 -licenses: - - key: apache-2.0 - name: Apache License 2.0 - file: apache-2.0.LICENSE - - key: mit - name: MIT License - file: mit.LICENSE diff --git a/thirdparty/dist/bleach-6.3.0-py3-none-any.whl b/thirdparty/dist/bleach-6.4.0-py3-none-any.whl similarity index 72% rename from thirdparty/dist/bleach-6.3.0-py3-none-any.whl rename to thirdparty/dist/bleach-6.4.0-py3-none-any.whl index 6dd8ebad88b380753f9d4ebfd0871e65fad63fca..f57d1f2d9e8b078968a611cc4ecada3c6665a4e6 100644 GIT binary patch delta 37943 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 delta 37271 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

rQ1_F%WY1a)+49&xzqZ>X?^Lm zzH(YTO8mBq#inye8}~U}BfIS|qga)o6r6vatwVdV6xv7aqGk&KB~b>JUBe zun>5`9_^e7VD?82`xGLsJf183X1@02*ROV?bXF*x#mjo>h!h8kjJD3yE=?p*#M^(M z1mWzGNrH>-w6|bhI~{pl#?GF=!E%9CWuC3wp1muN!C!ZqTVM)zZ|>Pt(b9!b`SP`L z7_#EqB8^;OS@GM-*A*4Y1gB%;w!F(*3HPpn9p&Lwx~(X7c->+2+9B*s-t8Wo1 zSq6Fp0~Z%efNy6Hzn-0(*d{=NtD*Zg(?iJy;Mw%=m&ZvS%i}kEd5p*$e~;Kr3A=?c z1`f{km)0g&eE;J0)4wfVod4te#ohKn$OL%5$`7mQkT&b8FIOMlUzz>?)K-5Vrkz~b zzm0^mFHcsxQrMNI?)C%Hsv`uN3#4vDoJLYI%lUl+9RHGU^KySm!-m7*n=&dSi!$F& zMz5*_mIQmFY~3Nrq{w1$)griPj|T*VVyZg=!*AgNqS5RFBTP6&Gp{)>7|8*=sUT38 z^4bZOf{vYP1-9FWc*9Ubf^&ZdSi%L%@HWFFkY=-i*@pU(@D*DuL?)`mVg#~$HDMyl zc)3tZj87X<;X@1>v=8Bm*-dvOx_}jo=uT6Q+|flY1qH)`6UW}xg5XLN07z8rV4$L@9q zH5^7|A#b4x^s#~8L8^ZuFGkao&QgK>spV*)76<5Bz;*XeA8z~w0g{#kVIYVqkZrb% zI(mFGXl7kD(nVi3iQx=Mai&c>0qq3%Phu8nxkqX98jkxC1=GJCY|YMb%C~rmug8I%gx*Nd{oRmPD!o;c3PM8%pxFXVyalUxp4JQ@}@QK$Qw~BAz3sHEz^l)1`6F zxy+6#iZ0cFT^oNFG{MBXbdR33Fk{tipRmt9yWU0RTH5-k1`#?M&l(8Ln1Q=TAEpj{ z*B0M_w>2D>ov+TXhw{zF=Kn(3u8Jo7mK)<@vW#To}96a zbBx!538$@fZ3#0>Poea8u+Y;M2ua1b0V5RT4(;JwH0^&a%F-0lgn^0pK@`*zk=f^< zpp9MG27<2x5H18ps}ZU@SWg&rIzxE9RgtK7Y(B@31jQ$(4ZlrAHf@6VQw)0#gHSQu zt-)ag8o8a6K5!e6)xk>$Z>ar_&H$i76e(8O}5m|KJ?5Vy)MDb=E)BtuGr_Z zuOARX3ATT7V4-p+B=4f5=7JfCD>TUfY5@Ie9-hzx23R(~;VrT%S*k9|CW0qN6EGaL^gR(~lDn{I&ppkb{Is!RX7@Q_!MQ;EL%wuSjb2iwEVRQ0c=A<07{FdY??u zEPxqnl#-Y*D?sCG8vBs%FFxMzBe-CIJL3YcJJ=1|C`JDsbOgG4$eyf_yiW3|YWF~r zIhuc1WH!;oH8N;N#S0)E$W{WoEVtL_0T$<5(n-pq(G^88{K?SF5oyX2@O{vUz|xxx zE;*PVJyJ)hUQ~yQV`SrIgV&R!91D`R=!nF5S;E<-`>;Id6JO6)%EDB#S63Av?Z5}F zj-*9TJWs%vY`fI*U0rx&5g6*JLj^q>rD}g4qMA+tMv|j-#Bt|}rienHSVT4d(R-qN zu(z)Y&FUScS;73Skb+g-ca)YGhW!Ic;PgP%=@fmUWqMoMbU$fq**`PmtAs^{tCi=h zHy7F!68QOZC60$o2b(sv+IM50uPk0ho>M%cVifvlQrl%FQv=7c-KeM4?U?2oGu+SA1Xd&U1 zqvqc6#{=>Mn+KUyt5v1K%nfbxt*PIufSMHmv5F zqh?d(R!YF(gajR1=Le0WZrEj2f%Mf<-|c6$(sH|DjV4cWGv8i(qig z-Mk51>kyHZ5&S#NiQc^$1q)o|*7yUn zft)5K*vJ$_7DC1$*EP!aUfAD)v?H%P29Zaq4bN&7mBxQeG;g4effZ0WwK;|{%l$*7 zx~nD*T_Q;>C(D*c78pOtVJ@GWa%jnnf#Rpu(fgz}24;sx9MgYs)MbYI1WZ0S_-aic zTcnAsyf>oa84#}fug>8ZIQEz$gOK{72p@gJQ#+DoiM%d7P{zl`RH2qXLf>Qx_@K88 zz_jB`9Jb6ctw2tQ^qmQ%QVj$xqR@rM2uxewtE11pk#19fR{wwydr#`%o`LhO6GOGp z@0;x%q)?R=or-^+`^UzdleH_G@GRkqmRuhTzF$Qb6EC*ti|Z&p0H+#mEVp9S#1lKR zS=h47cNp*4k(ol&?|}x#8ifNsu)>0j77(`olXb(9{f_kkdxkiI(4x@4Qr0FJYB-Q~ zT5SMPitb`&si^in@N{8+|LNPv4)0?G(XlAv(>+iDN9})sJ7QK{6MD#Rfz<<`@=~lt z7Nr``nMqVD1&yG=JVN`R+|tV0~5zz24ZlMA)1TA2d4%fYG!^)C{9_SF`9Jj;Ia%(MFJeh)OoAcxG-# z7Z@ypS;v27@%tDI&ERo&v{LtaDMX8uS-|4-GQdHsy85h{qcvtnGmZoKarH*zsQubz z##LLX{2C>CAgg{?GF+8l()I0T#)CO=JHLMl&j`dRS<9I6Ya_vOI<@LA@WNVVlcloU zd#%*h8LAKEl2lEVhDrOUd45gRA*l6HGN!4Ek2x;TTMptFc$F0^R z3!ROW+jG_lroohXA5N5tM6->rR@@RNgiptTu~GAV3pRpdis}?Y3;1qxUXFbt!4cnR zWFwL)%Cc_-(dHhUoGA;z@MZ)`xtyz#TBb_Y zfy{GcpZ1OrK*xW;JK>JT16L9G$L4*2@9+%qRdx{L|9MGQB*O~Q#Lk)=fCEy+8?CQY zOp7qX5EPJJn+BH4XidH6>rf4*>V+s+YHELQoa!==Ao$nXk+ojlwnEu*hpz_KRjY@| zzectJ8<*v~%=0#y19+Jy+?0P}yTcXgSQI;`?;cN?4Iy8d?;fW&2+f1_NUnY$7MUAP z>C_PgxpktmbaTaK4zmRA0Tou+nzb@j!Ok$OUw)D2h2@HIda=9nns;EbS>rCKgMohz z8lhXDHnSh8YK2DkJk@axH1kwoVzd=mtpXZ{WLuo!?yIrNLhe+|qJ4Q&TBXV=-3lTD zh*yeu!Z!R?C7y`K4LNn88HrUw=hWCfB=_3&fByOK=bvf*&p)5RH-(3iw}`cdqjWh) zP)^&dlOGH}`G*Vf1R)wlj2kN#)er4Let&GOMVx{)* z_Mysd99a1bjJJb1ph(Uhvq!iaHW5Ayf_=nEEobg1g;XQu{f{QOy zy(bEiY7|&@Y%lW=C~Zx8%pTsJoIHe2aItt(j@r@VJLu8DPIs7hl&QRnc0Zv(!3zlN zKf=qaWf;p z)Vm>CoXyoeHj9!7@vTBV^v-I-mRfUPq^dujCxst!Wrc|dg=LR6L_waWm~kl z^60zvDz8BMVNgbwKoxZf_XJIj<}Posnuu84r26n$MkFUp_D|t+Hq^hvq+Yy`7Qc1N ztF7`&zzyb_Vts&WYiNJ96(w(4DEd_%Psmujr=`64g(pNAc8SY0x>)~GKm)Xuy#(S6 zv_4V~6n|5w>Pn~s_Db9uOGTHm^EDWo#zw>_Cn1X3`QIovVac!v0J49ez@~uy=t#d( zrE`b`O3@eQ9cgZ9s)kT{^r|g8N;P|^8M2v&Y!uFOCPNVa}Sq>J35*_ts-FQVHrhz`4e#Z{MNIf$Z{!|Shb(wpmuBM8(F3Ok^3~&q>9&2c&Z+D?z zRdQErqI(SA;3sXT@H)`b-n7wG9oV%rC83J%IpKffCD&6-y)m93IvteMF>gOf)2*>> zx@C=CzSJ=2_akN&Chi{RYK!!QlH%$q`k)J-*2u&mDKX*1+s|pFRJGwtR56DpgK1SZ zk^3m^U@qt`WX}nmOq&sd8*(^fZ+Jt6M3qCnivSFSTMlld)>Ii>KuK(qUn+xsJqHP)j_ zuI22|bXY;kCb^?h-GA%K>Sl4^kDRm7F9xmYLuY-AOaz zTm3pWogb}CMLQ`+-O!j60CrVleK1O}b_;*+b+0>2sO3-C$;MB(2>4#kHrtz)hegT8eVOSp?7goY6|81lThnFbh8tHq=nQv#f195@7ytbZvy#lK;oRN02C3ld-%6PTF zSNN_i|FwqR=Ak1)WakClmeL^_cLjfnS~^%fWaKOuo!d_o ze>6OLAD_}s381QY-O00;mumPS|9YXv~y7ytlgR{#JL0001DY-N-3Bp?CF zlM^K+8-OhPd~N#l_|O&!?9R^2&if7+#;MA3$mHJMlT#%)6MK7m`%`!t>KxPp0=W=H zR0F#Alb$700eiFZB|`!oi*kr;k45gUWI!s0_fXC=- z2WKb0o$AxKZ%?nUPk%o>J^k(cn{U0d&uZgj*Zh5Sg|TDYA^raGD7}4}IJLH;B4v;PzB;l5fU0SmPaFCNPLFFZlm+0!v_bIL=AriC*x1{|LM~^cR#y#aP;7}+4RTczAz&dU*d3|9ye~{u%#$ zi5I^3>XZHP>B;HY`1Jl)U!64;M6E98-EYpLvBS?iT90GrU|eGY%lvm_B@it#E!D^I z8CidXg-`Qej>qLyMt zcm0S2|0zpWsb7y&g6=p6)bMc>l22z&XrmhN)2pAKqQHw~Olp)X7EEnq?$rvT#YK^z z?NSsOGay|8;J6@C3d2BxiwmIc8SZeXrdfYV8AIblgCLU{-3Be4%gfwAh{cwo`d(bv zoJJVG;bfUz;L=uA?@!DCbm5s4!Ir_UWL@4rpHQ5DM5qE$A&PUnIWKZ)!l5rF*65VD z8PGPx;eZG2%v|bxEEfy11ZdPVCDu4u0s|M+Hn9g#s)JM-$BCG41P#SqT zdMqMcyJZ6f;{&S8r7dz&R~KDhEtBvHqcmQs8Nks#&R#wI(PCw7y^}}WtDL!N1QmBh z=OXcCWgDjggLbl)6~$BY9Zh_d@e+UAiv*>E>|yY_Fh)J6EVJC@uNyjP6I`Bper_!M zq_W&QTs=Q;Aw_PcWbm}~I>KoK`KCZoh|C_!iZDqM3T6Wp)TSJz97E8>*KDlirHIo= zju?ioiYQ?4Iq4vy`}Qtsz}@TfbNWh1G~n5FhyyjyI4vdb#wdP`-$*9#Yb<{S3T26H z0}^9iqHUJq0FYp`_%T;1s!P_Cb^}SxD6&peg9Dw4Rzfl|IOVXOQwySmLxI*nCzVqR z@W#Q!!IrE}jg4sUoWpXRs0|9|Torj!b||UY=DdlmIjl@Q%!lU9T4dus zR(S7&QDW3#hMpbdYAuPynPDd9RAiSUW78R5b_UEZU4w*zWtd9R!Umi-L+6tYq9|T! znwsxfhiQ?&@PMWdX4`}&`AR0Z;e(bW44a`mxs9}K8tH}lq>C7NnB;$9j`qH54Ewtj z<1j+yIFjVSb_NccByB{r?jQ*T>s2P@uY7ml$sE6Ut*J<9C?aNfKSy4cgPL67h-gMO za&{r20txa&v=LkFHEB{YIwO^m0~3+4^Bt7$!>_Wkc2ZnmfNdE?LXXO}16JkVO z6YH^Z<|2N8n| zL(Br%#9Kt^O3WpucgUp5@$Bw>>E8BJ<@@O_>L{Ov|iPL0i+rw~S92wKc7Lb5uQsYn%G!NE_1C41M!{ z8QV3ieV3`Sylj7&oe5^$s0jndsAl?6@vCW@%*87AcXutn>zQd}E6WN65PXfgP zZ_XR4T;Ma8p0vXZs(!nqra6!kgPprF2=l5!V03A|r9hL5U$}OR|7EIJuBxpaj|nGt ze8K^nl&@Z5kAY^b`U zQdlZuj9Vx$wst*}h)|6NA(Eh#;5c&&GL@#K5iLc?&`jt}QG8M(7bh8~c@XSgi(V^2($c)Za@UP5ffyjl6gei$Mb@GN-9-B#K zclDb>=oPw$5(JX?rjUtm>WadEvF@PGlYMyn zn81IpBsv%daQ+Y)S>a^1Ze{n4UFL!xhv2*{yAi@Omf2GBjYkeqL%>Utqv~269zn1n zi2y3?N7B{`%R#l_FVRe^SeopaE3hP7(`n~mX5}|1!^yWEewfq$G@Ieml>@%?&4C%x z34`^x0&WV?Frc8gCATj6sd}b31be)&ZuL3I;NpTI9a~34b z0yj%{FZtwd%$kPVA4OYpg1u53Q?w!1R-}BQ!}g(PdEBQOL@H?KRMci_V}&YM#AF#r zr8Xi9h%0d_@^BtTVZP;5mlDT|P!$^JFq~?@HHbLZr0F&DLmWA(yA#r3BUDrtDRqCN zsea}73Y_0DRpvdp{8 z$p_A;rM)ZUYGi%ftn~F(_jTsa!YVglarL~PcuGe|U(cJjk93yzMU z&XHZ}IRPzMY$)Fugtl{LwYagB?uCE6!yAWtJ2%iaQH(~%3Jqe(;VnXQbm8*+oykNm zhdQObcd@{P<`VUTR+XW}3!Xi}@H)!}L->~P>>k@B(uqUwPqa%K%BvviWGbYOQFG4IhG zdewM?gWt)UlN;~StK!~EGAOUak}#m?ovw)*BN@}{ehJ-$*ts7Va1MW%(&2l-I!=Ne z+};6T*RQx&H-C-SG4ev3?T`qnq?S9-Ef)LmpP`J5#t56u9XR|GC70AP+=rcie z>lG=L_NgTy{tZMjxygOeYge;w>2;=O*FE~NWnwwHub_7iEvenx1;F#F7>Li9W{FC; zxn~~cF8*;{56$@JB@KV4f_pNi;s=ed5)Qmlt;m5k`M82AGo-E5jxd&DDYL2$GUq~( zDThqDGe-0f+z^cRvn|4o6`$b@Dop2c8JhAbO2~+IHq7s8 z44)&a=LMs3WDB08(YaEM%Q)MuZ(;>aer(_kybb{=sj(mK0giv$4WL}h$x-?7G=MxrgzKQK02-q$rH66-Q zTSC(sNG~tst|EUfd6>g`3}FF1x$76T1W*s#(A(>kj>ZnLal*}a=gi$Q{9b!;yY21U zF`L^U4YAO-pkdS{Wgmd+=)-YMWfrR7Hposs60(yIK=zq3B@x@8PGXMoeK(U-I&aGP zJd#GLq{x6<%rK}%)w zF2$YYQ!yjXdfWEXy-;S{V*(Q`Mdq(~iGHD>Vu3l*`heurPWEgxUOaDR5oR)D(X{=^aWAk1^_pMz8nI`V7#%jE`Rb zs9yZ9RxfUn2qTmqSt6{Y_X+er3MYS*!ikNz1+`N&j*I67Jp$Glb=Pc7t59P4U(9Bd z{Q-2U&h9s)2IgEX&B1*ji7(uhnwZjhy--mV-%au`X|2S>=(2R$*!G?Zj4(WN;i0AQ zUr{=(0ccA`F~GO3`)c5eV^e!l^+Of!X?Mp&V5_MFw6dh>kyyC`}^Pr4N; zgu8aP0{EuD2*f=%U3!QxmJ<^u@}oW?8dK-1HjCTD$?qa={Oc~%z8Dyqb&+MnwSRW7)Pz=cFEVYWz3rua#40n7FHn;;1&^~v zgWWDD`&4E5Ja_ff$;V4%P`Iyqj>~T>W8AcmG10Yb*vN2Sri6kklO-}(Eo>0P5}!te zhR?@iR1P);cib^pd5qcvjrQM7`nq;**Eu|+!vuPS$26bkCzLH342EzIK8I;{qJNH> zSx)_kd1VQ+XH&Y3*85k0kka~g+>or=$7xtzIhd*0!p>t2yyzPK@g6rrHzNfbH?=%Y z^Q5MF8o?~QYuLNbY|1mbvVYz@KxAT8^HUEt;2e)P)dQOrB}@1&)B@Qak&9bVR-DuW z*Ii}&hzCbiwUAaMmgcI~W^K_f>rp1FlKA)r<*-q*3l&XJAiMRWzGIEH*KYZ&2@)r^ zje12hPwqkR5n9ZQd7H^daE&Mzc^MP3^jpV+n|fihFghfUx{K)h^)#fFyYSp@{l4jw zYCLHhl@`9Ll~QVP3YicJ5;00L4=Y4PmNK=yu6^H=?mQuXb%WmbAoHs%t!SC!BMq)t z(tKXe*oiRju95G9(S9i7p^yV>N%6DvWk3(-d<<_b-O-=Bgz1|n%AD@nVHVwKe{QrBq>A}I_SiF~wD3>D5^YT_MM3ch!FJ8TR`|HUM)3X;pz84b#RQ`~Kl1=|Wz>ELK zSCS?}=fiAPd!OfZS!~ztS2OQJUe2%oy(t^%emgH0-e>6%$lMRP_o>X?PpW~zuiS4o z=K0`Yf51zBomTGB)26Aj*`|?7%(ln~%ZC?dXYWqG|8RDK-1u~$mp&Hf$*PviWGIp* zYjT-f3=djP;N#$H%@FU&eQX!1x@^ihNQ|Ar&+p!zy*+;W%HNNEvTB+NCxCwyzFDVP z-jvB;Ky*)wn@nXO0Vs2IItNKqM@LUZQ;M`$e~7G@=bHt{ocQ*ckau%gHR5lg-=wp_ zP&|7o`uP&xV9RIUivGMF9Gt%S<@EjO_peT-$3MMz_u}~M|i#kb!K1{ViB`*-q6-c?M;PG2;u zf3y*4ErGILTy$2`cPB8hT8`%By2^6dPtFtZSVR}_SR@y~JZSvk&FS&mA5M7u_aG3! z8(>x~t2~`ML%I{X&6?FnoUJk?=4l~jQl#x;U>}lFL~1BtDe^`Z&|yq+e# z2DwYc&)a4N-@)qEX)|Ayv)`S?y*v5&f7OfQlh-G2&S>_?_tETL^gk&3elVu}si3j#bPU#^kTpL^l0<)IrsI3$z)xqdUxC=AS8G``3MF-& z=GiP!McIgje^l93f##f+hkqJSF$EJ^Tb96=z%AMn%^i3ZWpM;7 zIzkq4%ezL6?ATh6J~Mm+W-(nHsdOoij$qN`mDuytVgEEg6*z#)^DGXlIB@)?Xbg}$^HpgDd>zp z1H{LhKL%4LK@DnLD(Oeb571PZ3CUcNfb67VMQArUGSjA6K!{ka#ciw^zqD{syrd_B ze1asdqnALsGF`*;tkGE2<>qR2;IRk{gOU=&z8sGQB9ZZvCx-F}f0Y(yyC~;sl$B3p z@gxV$R?QPI@?c6p(ZRrA>q9-e4(+bdF|Q8_oq+C#J{M2~0t6|_O;c@XiFWgjU7LD& zISPrr1{Vwt1zax@xJ|e8*C+1MMhHUQ&G-__>*M$DtsC~0c?_lxY+eCS0#O4fLt>sy zp8+rUjSL%K~2Jk(F~)JIxz#=0r4fmiRgpzoKq3e1QqxNMX2%a1YdT zONxow1$xRve^G4$g*pV33DEO~A3^L>fdat?uMs!dzh8%f`NX&e!SQWjp&X!pRfBo!bZ;g)A1D(BL5CY(oAd@u#T!c84+9s}a8G zM`w}re~4nw@m{Ku^K6;P#ZbWKKoSw$0B#!v=ES__fFrKTdOL{*zTG~9Helemih>04 zmp-y4q@Xx-L%&+fW>do#ZG;AD2+kEP&ZfvPWfg+Yh9kc*6X8&cgPDcXR1+RMlzGq? z-8#(>nw@Pcc~aLUVhKby*x~ZhgkGs0a9i#0fB4V`+c|QC9fmmLKz6_nDU1RqqPv^R z1Xj60--NIp3BvjSY<)svqv@1zlJAJ?5!23k3 zXgSf>Q}wMHL1Wy5z@{V1g^36c7oK)OSA218 z1ntAds8c!=FRCgBS6*x_)=QTSWdUTI?_So0`>+_I{c_=>FAvUkx}ExZM4Q5-{N^yYam( z8D^7)lU+xP@i(R!5qO}cDR~2fL3FtS*rjv=)0nzck4xn2*l7jZR>6`R&M8HP8Hu+* z9*h^F9Yj~@3~?C2g^ck$Cp;m5l|2O*4tHqzq(SVU;6K>aE402@LG&*#Nr0wJe|aq- zYSRJIs7(UlU&JsPL3H`*>{;mPKkMIH8-ZCSLb}YCKB(1@=nZ+@f$;>&(870}akzjE z)dL~t(6I{{!X;w29nRiaEVk-SwG&4pbpn)G+ifpx1m<15@aN>~77QK#rx)yWaTo13 z)Qt!`cl6(thR;cp2BTjsO_AA#e}Hx8tk_rnf>haACXUJ$QZAH+CvIXcwW+z3R3RDI z1B1BJ^FznrX=~uZd=r@h<2V>`IR^>a^y$PQWvam;+@j@Z!zi1eX6kv9hcK5;>J%?xyZ(@7JA3{NKrvABs0`&z#)X8G~8E zr)pElnmuE=bb8qH5AB~EVP^9*!b~RWs7|G2wVXE)@~G>qqKqX_cjy`aMGEv;;$Q*h zDQ6r(h%im(kmAEI-_VP;ZkTf~Y>ORy#<8s6|^z z2)>VX^%Tl>^uCQvxwUwD+Rit@Fmcm{L&cx?-S;1>bVmwIoEawgy2WQ!!Py0y+#E)I zQ!JoMf&Y&CrzjX7e^Q+2wdz1;liaaGQ2Rdp-_3fW{en*2NCS^Rvmz4rIG`Uo?o2&z zGnp^AyabvBnPw$-b-=ckOKVwQfeo~^N1tO8Sh3gGg^r%&eA8s$N{*dcD(uKfXpMbb zyVs60oo$v&+V}H|gD>9%jO9XF-SuM3j6}{8%Ku%6$wVaWe`J$*@Yf+cN~;Rf+IoMZ zeau#d58@kvuS3C%WP|P1e`zK*$*NfxxGnAg}ru&gNA15HKNbdICxRY;xr zu!V=QSF%VOtVi^!@OHhcgG%sNgqS5W($LwKkm(Ts^m3t(fERU1 zxXUT#_)z2-)`SG$YG?x}ey^s@&w}R7*4vd1Kcl2IpoG0&_v~JGQE3B73DHi74x@xxg0AE0$zy6||%4N#PQ&2#2 zp5TR7yE2Sz%RR7z?9*->xs$jbvM{BX19Ru%(vD83HI|yOXek+jCLPZ35p5jBcIR=( z0Z-n!+5j@aN*3XTVzEayg&YSM)zTt$MO!PY^>bc;_fDg^YEtJ zwX|`}>6_c1s0>7P0cJby+f6OX8(G)cVj=Zt6j7K`5(+}Md~`%M&TPs^`~*UK;~pK&VxNl*VS{Z5VTL>uW%j zG3%N>$gHA57=wysWPMf{9e;N5@+v!E54%rQ(q}P{fwBZRoM}OpEf?T~+cZ;UbCR!Hct)Nd+;|p?Hb)Wmq9rm5T3< zNWJ}Z_<_Di**w>ygyz=NTe68-vYaZaLjhlG(%cZ?`jjK1Nbq!C*64`ytrw?Zoh>fN zH-C-=j4(Cx;ySl&pEw=0^ho3j0%L4G;sxUR`mnl4T&x!o+HJc3Vy1+Yx>hz@n$EiV zrCYbwZHi_T^m|7%$t-@A71!Bv`_i62fe6uj#HI#sg%`P$(YIN-DHds+NwtUI?JC17 zcnTBYz-geB&3Vts)(A!Rg#}_&-ctH4i+{(BOz__uS#S9gjIuFlldYvb$EUigG(VcB zSTjU}?4jn^DlB58>tUcVoGqnvV8)kNV5~i4LR*Arvj=kn3&NR;1+Q6c>KeHg)?512 z+T28>=40u{3Let!l41<7FtnVijh&rZg*I{Dr)U(_hHQ_L`*^ltcT(YV1F@gLL4OE( zju zHAr=aB`{bA4(fWI1GeND48&vcjTpxRchF4R_3OA4-4080$EL)M))xae88&+C70<5)`YG z^UIG~2edo5HeB3OT z%SDJj!PtSQ)#%`0_wb$}$bZkQmg%)4JG}F2x?Bq`ED#YFR9&T*%y{tRP|Ur%o`BfG ziuoVvvT{$0$@f_ubkC#PLo0K+8N@W87CWP*I@JXmTz#v51PFyb^}`J^o%B8LwjwB; zH=d4X{Br{uu+nufpgCkv4GPK{!zIU&iA4iiMub?OqvjCTbZ!^`W`8%62bTl*01qXo z7|4WTD?`_2=>0b$*U=Ly8FsRTpUt(f z7s~vrvaHNSPa9h}b_^Ma*>d)Wg>+N{>_OaY4e9Zwz&qi{JbyCOqNHqmy~#1X^FpWk zpa*#DWp)=*3X3^tR4QJ8#*}*YI)s{R;VZ*q(C8c%O5rvcVZQB2x6;GXp@0-K`C7`V zGb-I%!($ykONa>C-t1e@r3k`(b`MM{V+8TcI(h-fb{}$Xe-aYx#spm#__$I zkA3*>{I^4ZzURLUE*}5$;{c(kfd9-dF(HEoaZa{m^*cT&>F?%y*_fse;P_YM8xWrJ zkJ)IHtd9~gJ}gY41cDBQr!KmTY!5MxJVh444Cdvnf2ROYl@Pj?J1h?!^G7UrN85=q zVGAQ4D1R1xsvGvt?gqYagmsuZH>E3K=R23H$K~IK+EW}6oPOIe)OkWIK=Zbj$i?nW zrliV9$+VuYK$3s6BAo0qmgcq3Xr7v6Ls()tv>63x@DMefOf0MTqUr8iuiXl?-3wr8 z>-HGAC8VUWU!^?3HE5h1@gY+!)WMjuDEAQYi+|~EQ$>(tQ)x7-FH2FfIGv$;-a~7h zDZ15#ssm8Q9PZPt4+v5uMtF20wVTGi0-f|>~4I64(B`&Q9M}cn5^*R ziGO-_5Pfir+BtNO;I>uka3ntwPe4oj7ehJPDsx&uxq52nKh6_enX*%kia4Bn7zWsf^% zoWr+YlZ9#TUq*=GtmGY-1NGeYR{8)mqu-8zI0>(#k&&SYE>?HQOVp^3D*BZ<4fQ>i zA-IDBp}D7TI!$-m+b)4+@+m%p^Fm$Rk3V6v`>3VxV;286P4wxI>I9fE7U%eLMt@r} zCfSk;0??w6UF%c!B_NJDnuz~C3s7`8++hzcDIYLx48#I4|+OK z|HP#olyiFLGww~x+(&?ML;W96OS5oR|1b?XWKLUx!Wq0<0RRA9lYECKe}z%YZo)7S zy!$J*p@MRVT|(i2N+nv5K%x&p+iTIi;9!r2qxq+&OE^wY z4JOh$Dg#C%SmHi8*=v;#0+s!evTA8+UQ*0dga}6noIrSO!aFpw?-3T~X>szJfN&DQNUF z=d^8LbcCLQ(-(1>;*1{eSU zENK7$ESHgo0VB6RnE_o3e{>eezf|aY^Nd_o+x4R1tT`T_7Eu2HcMm6Mvz$&W!$K-z z*Nx6?2&VSVy*xP1JP@6d5v_8<>(*5^{6aP@;tayg#pW=xSgilrIbl=7dnd@c;MY`a zK%W!q7P?2n4zr*Cm=OMuo`Hc=Ol_1&?dJ>}*s)wJB}tl6VAn&Ne}gTZb1k7#i}tt$ zF)w5GStJGYShi&8Y88;xaC4GkRvwrjivSigJl5ub9aP-VBn!-T4O!Agh!wm%rBJ_g zO3JCN-XbBZ6}kpcu02$*JmyE;DLk+PoaeSzcRVjZ3 z+H~Gxj>0pm7cXllf5tXlM9hp=d5UFz`V@Z3T3wgT5|lByMdWgS@ug62vr~{ z!i@>0s&`0(*lp)!R(%E5fu%))-)wh*d6AlE!s0g+aMPu3dc^gWw!bp&H0!=LB;sKv zJ1rS7ZdA3Lt|Pmph(rzBqB4M~>bAMfM96#7TW#}HZ@Ufnf5%zr(QA;2&`uncyXE^G zo=_nbu7GH{s?R?3cpQsyJ$&Exk30*}TbY*Nm+CCbm_Tj+$cb!kZ=| zXr_Hz72!sShQhUM)n+X@Z+iGc`N_K_;Q~KK4O?+uwW2Lrj)LFG+Udic{h}E{3MQ?2 zX4`!Wmq{yCf7P~otqn1*FxQfd$-E``h0I&6lak-$Xcwr02qDVg)9?`QFryQJ~ zNRC%Xf8-FsPULtzHdPP(e)VFQt?O_Tu%PNHFkL-oc@8$iSo9aC&k^>*+t%deyXQ8+ zFRo^6_W9N9zn{+jbAEGt+I^iqoVIiy;PFaGf4B@_F3kNHJOyV04*3COoxy+4ssozm z@N5wRbYLO;5A%+{d^?@K^b-~Y_x(x-dw58je~*G!N`Zqj*Sp}Fpt)BBWWZbVWd6j9 z^OY9^#OcI`1mgGe#ryBxUS6Ppnhmm`yf~Sf6dB& zJ8WnXS)jrVNMDd5uxczan2lsIevvLKKjVA_C|cjl>2Xvk7SLx(b`#3i05>+_T{ z1fAwveYP7940fjrtO;xZzm6A}QA4WT8~#)Q!Zj&P%SnJfZaQyWp7Cwdw&w4;-K*&e z8lMwaef2?fh0a%6E|9L|EP>Glf5VlnWS#=k6`h2RE}$#h>68N-Ahef6knmnrXaArF z>7oxWj1QC$)!lVs3VdV-ULccI;AQzlv?OJG2a0UPf%BmX#v+&s=M_0soVYO1iTT@& zn8m8B(QO2Od%Vr5EG$WV6x3m-38jzmE`{Th(vPB_g8{a>i&hAze)Zm*f|M+lmIS(#-F>KWw8US;DVPrZn zS3Y7FcupP73+Q~#L$MO@y4*J{gQr`(d;j*`#rqFGUR+w_*$Dr2@vmRrzW*M{hhA#C zUv0O~ZMu}8bE}5~(=cC`)mX)|**^BTN4Da;W=*4Tud~XADWhlz_S6@GUfBO8C^~re7h7cQ# z>B+T8SV~a^ZD=GJI2GdEa~Xcr7L?l?D%foVq`n2X3{#<80f@xPxGNp+o9b5adHHfR z!ne^)gHmfxi3QU(8C~M0)Caa6odlzcG^(GHT<`I@r>(e8*S3ytR_ir_S&Z#s8Bh-u zh?%q-e8cgVAeqNvs}qTh1Z>wyO0zt~#|$Bg$mA@2*H%Q#8WJaAdBVb?q)1 z64lPMLA`M>7KZ)C#_NfxG6y%UCQ~Z}!QZ3cy$Og=hnD6`f5N`itbe7aS(NdUkz=c$ z*-&^wOlid9F7a1Qvo{WM+sC{_nKZ~lBe5*)PUub0&N-OUHvthL($zJ#dJK7VykmO>`4P-J5;7;6zT9L5 zc=>%+U>*gLo~+!XA-cRm**Id>-pl(k_!rDr@V2}#*?jT21ZH(el1nU3Qa#$JT(VWge{wRq`gnc!^y%#S?whCAcmJ`1 z2ln*(THPFj-F?8)Tm7q>E*0tu|K3cebCfM`Uc|7fVOaM{TN71IaZ7Gn;vHA#eO@&` z8C`=LUPb6jMlLm4?p?t(qcRb1eY5ktewcJRaogi}c!xvqGpf@CUR`ylb@UTtF&YDl zn+^_Ge?x2mgCY2LUdBOmPbKQyN^$#+rp@vPXWU1R+Yz{kaxY`J(F8c)>?q8QN>8vQ zJm@gINDbZLV3OhXA4)j>jE76+<|Ee0*d}N^C7IS;*Z3kD294~YG|KHlth$z!Cc^5t z)qFVyalTeht|##4>eol0^H;x4Z;oGHPam%Ke?c$~z66^#6HXk~3Fx|9>1T&jgmv(U zSHml#ImisoBuJYa|JpEO{^Uyrb?8@)^B_StRB+eI%i+2X>zead<_nVpf>E{J#lLY< z-%zOujoO{IPS{c{6SUTvj`^IBlMeg7IFrE8v`QX`?A{`B^!)U(dNB$f52O%n%v)FL ze+8UnaC0z;X;K$5RK2=!EWspIRXT7IY@0~8CSWc!Pas$wn9w=P@%n|yIC!kiM~~GA z9!h;M#!@wziCF;#gfqZFl=}aD;3`!&P4|_uZl}}3lRbL=SXGSd>Mq6*b37qX%FxtK zC;E8-)#!n_sb^-shA@7FlJh#w@OG|#f0Ed5w;N!e&Az?~j)T$Zi_y_huSzLoNXqLb z0I{&FXuU@pE$$tiDn;Gsl11;MMkg@pu-4+tqD^n3y<@+xm9gFMK7~Kysj=~BoU1$MMyV>>betdPUu6H-bf8+a6 z^)$M_o?Kl=Cm1?jPp415f+pPYSRn z|8;ci#ueRdEVoe{Q?2QU2m(Ale*;&1T#X1`pN;zq0Cle_kAeRobvgS-?+ZF;l>>WPD8amj=dYoE8+<2R`IQ_K!#)XIy^e}>x1<6MQ-xw z3PhaERZZq)WJ0SG<<|&DLK1!(+YA82Y>%Rffy3Q z-d^MH7Q?<-1gli~1k=Fu=>GsvO9KR#p?U%uw|21s$zC3cj$2#sPt!|r0RR9w0ssIf z0001DY-M3%Xe~A_GnX%b0v)${5CVGve~OM_Eso;F1e01^Oqle(r!NmjSE zBhdED+;cBcKqY`O3st3B2*U3E*$>jsF+b-?=1nHPh|JmmlAtX6438}mRk=h)f5sk> ziFZ16Tqku}KkGR0!r(-8+k1`o&P<=Ep|73Mw2{9#X!qK?jea(pIq~8|od-%g$wDR0 zSo>a*wuVlkUG?MDySJ^x3B1(%%?l8&ndA8&0Qf{iwq)dRTr`Y5FEeb>I?q&NJ83!APTnnU~O8e`))Ho;WE` z*Iy*5o}uZ7J`LgO2!qsyCKxBNGn=8qTPK)ggk*I2xJajA@PwxLtH+ZC{^F_qp4z_M z*?oGK&eOYepWfvQ*0T4+E^lU$uR$aZXbVp+zG%Ca$N9MUSlzp;F!Dxtle0jX-0AsS zZx}nVr<2mq?}+Suoisk_f6tj0>!c;mPt=Pu-nmPijAAdsq^*k(w4JuD77_7Vs_)XB zyH=c}mIqs}JfB{?eRJ{heg9?csWAM`^(_&081GEenZNIQ!&ax=X}gdqUN8=KY~LK5 zOL|3ouZP4+p-cEl8icG{&!u-S@6y;gQKKZOwvoW+Z_7w$w0Gt$br?{D5{Y;V8+aP^W@^=`M<+U>Nuy%QySq`ZXaF^cubNwwSF z-d26B>0y%Tlg8lm@kMddWar@c=*8gry3r_xbpqx1v_S2)e`?xZm9)Lj(qy61sgo*V z3@0MN62>Y?iA9nIk=0EW(O9l>QhGGZQk}H(X+}Ir64EfijW=GfI1vM5(Nsulu0gsCD9meCTcLqV&D5s4+afsfZ>8LZSr&>GbpWq3>KZTdL0a6?GFYeNScad zW1vU^0svaGe;;edT{OIa=F$vJyNnahs`W9JSh9Hl_Bak_YC8+kI3qRgZmT5B;t?%Z zy&0=Tn9(uNvA5Q40zzHXLC&q>rI3|;)5g|3bRHH?YRuvfHGu678mlg6AT zCE@MGZc{-5-7JKR#<4SjRwB60X~(vmV6jbWGUL+@&oqJPCT#E#_U;;4Fm!x}%qbT% zHuI8Jf1rVDl{yoU)fKJwR?Jtx{Mt)@%!b#16nL10wCF5qrD2OqV9jI#0Zy`28u;{- znhdiEQPdsq^*?FbK&03@HO>eOHymY!2B!Z8pNM2=;>&Q946X@?lM6z{i7I{`H-Jwr z%cGtYU5vm0RT6+ScLLGSIC%rMrEPRZH&FU(e@HK3^u|eUDVrZ-Fq_Bfw)-9Ni?-@p zv3hEdW{tv_ndpa%lPIfILshs2>ekNd+9>mW4bUZ>$%5Dr6k@h^M3rRLv8;$57P;{Ycq z`Igoig#nFnCM4gopnp3dnGhvsbJH?^K}cvo^k}S<{4v-AkO1f22l^+$E17nq79Lt|`U06~yR z7B3?7WnkzHH6kX2I45I+7D$qZ{u*iT7LpTElDExqU3#B18#%2wE^olxyYUpvClVqh zB{rYWYuIo7)Zeiy*!hOmcwM+yLN1NIdEF?8wIsfZ^^b`Gq2G)?qprVbHFa)5e<@}a z9+Bfc#APT5=%7s|nNOnQqpS+(;^lf{E2N9YC1PbFZx;Z|1A>t{Kp43o&nWh8X`4u1 zj-l`75LvWCNk;2&(5y+%Hd#t3r$KuP5X|-yW?}%!&(KamIoAM4(EqkHBQ}39xcKq> z{p*)~(w$z=z@zQ$8k}T#&`2Pwe>OSB)NJHuF6c+5ymiR=xcK>{=vi#cn;=O^)3Hb? zo0}E6QrfCpA})C3pjvWz-jE(5yJ2DEvnQiLWwEvy3?eTY3{FlOFtpTvQ}i)!WX-C^ zPZ9ZB?gJpORYy)#KyA!eKj<;|$PIb_Xn7eA0$YL!*sAk^f&F4i<_Za3f9iVruvFK< zjwqm=k@RUp=Mo*WwJ{`tM3A^V5}}tw2XQeFVp=ySuP!awdS{XU$7C6-F7_se}}rl!i3q#5?+flaS{LdN1J*8aeUc zwvu9+#vfa?=gq?`$IoWoI^CEH^pbabECq#-H^wvXV)UhMi$sCaN^im093_690VyyixVx%F8v7d)FR{9 zVU}L^AXg!e!ocs_$;gza9nqM9y>EvdQ_Lq|cq6gA(P^)=@gpayY&5jwX{X)ehTWo} ztNIZ+{C75#$9V_Ah9nD|VJHX@d8kaxipe08xvFm}f0VEbO88eN$Pm%#_TaCtNeXMz z!eCHV+k-)~cw*uyBswqfPRI0?)M)-bk3b|-Z`KyMia5eYCr;4##2BkUIiftYWHJNe zFbzlKLJbBqmJ?6d&4!s97v>E6BnWbGbS2Sg!gkXK-z9CTTZ|aC{vNVas`f}D_x?AM za3-Ooe~o7G6hNN+eZ$#ks*MQ$c(cjIKS~Y0!9V|0)t`SdltrU_bu<*z4+dg2v^mD9GYTKMm^g)fbC&%*QJwkl+4#6^WL4et_R zzNNp)q?X)x(RD#@Os(YUhLeEk*v;Sk1ypBkf6~XWpF>O(L$f?cCpGHe-#%kNohd=Z z^FKZ^erh;7tFk(n{QBzrbzl8=_4f_()6;O)(vk?fXPSq9{<%aCOAxI))W3g07oH0C zHiGs6YlIS#{|E;@oeF;Ey?Tggs;t7l*CB!@4UC_4Y2e@0?{ykjJ+O zfsIxx2*oDk90ssJ@BC0AN7Y_Vus}-|GSf6v;* z)+OT*KyKPvLl(XEcRSqclSa;y49#0*D^o_WbxlMEnlCp>lNL2=r*~;ZF_vDBedk6W znHHrT;7oSXwouw&h8K+KF=Gi~X_|6~fA36IG6@OKn+fWZJk0@U4&7e7p^4*6qL_&T zLCEPc1UW(FS-?mp+Hp%Y5+G%^fBOZ-2EuI!wtGn^F>+lL{V<@$h!=~x@Z6}^#T#zW zr{P9ZfHiK3&ygr$v?xqCuH07dXfB25U!o$~g_)*yzag`Qr4kIq(h#uNu|)yxk^#R@ zTBAb-d=}^;fY5!^dVe~Dl0aYvA|rq10HoY+F?-xrS43Ag2+uav_sP_8e@BG)XSRP9 z`&eXR7c84dE0{+qzvRbEu^c2I3>uM;jHX0DEgvjT4HHDwjo~NxS(815hUNYTUG8r@ zJ5EqbD)^M?PHA_N`+B@1#IJ6sg}+jVreq(E`CxA^=bl)PsWIxh45#wk97Ez+ce&+7 z7?V~@{RLp<(iLq|HYWE0e=K03Wo-FC%!H&x`V2$uA8*yRn0&PJD5gQ4w#DmtXT~iv z-cxQ3v#ub8PL9^C1pC6+C2}N=Kz4 zIR1>PjsbcvrJqYx2tW)_IivM$?FMyQ6~vwaF3O&e2zv@mT!&h{2pD7ej-MYhiFk zO;ZbJ%Pr!9_4gwL*o;f4y}ACmDsH^WH&)<@Y2&cb-j9v(eo* zOy5~EK=(>JP?=^&ifFH8z9(&{(R8^fqL^f?1#oNgM_}U4e;%<7Sr$XcKKj)*0zU)> zNrG~v#hCC1;3TP64n*%GB3DMjZV3rCGPMQ{o)V+1$fGPUpJ+V>v|O{FvXmkqW!E3T zUlsdUcVU|aFi1>_)mmdrm(O8$-z4h$i>cPh;+59vvobPz?Vjj)l5d^8wdvt0kUG%v zpm9;qK*+_#DdF%GJd)K;+qhDK}KS!Ub=P;W^#y8DNafm*8 z?IVeBhId$G(-4c)2}s2j;ebq8E{RKMAR}2z^%Y189iyA-ToD=Xe>4v9HLA>3a7!#ff0;CA4wviK zM41MuC4k!=CxGTtA9Quh5oI@vd_;`3ns(HbgcD-U;fTq|(#ZQsw)nsQ`#(|Zj2p_fRV_-FD|v?Z4i&tzBqg3 z_=#Rkf1P4&fd)DU-Oj;r*V5hW;BMR+e?I)&Iy&6zwOPUgkB)mwb~-H&#AXF_oxWE} zH)HS?=;|W=o=3wEo*;Lhz-sphT5Pf4(r^Y#huHDh?*7^FGyO7-Q4WZ8j>uRfUx4-{ z$|~lh`u=qoPJG=u&(d(5{q|eCw!&^{g}Z;we+swNJ8u$$iZ9-PlU_^y;au_$6=22I zYu|&9Iu-~yI3sb#h=2z9ax{=M?dyo-3sPX6BZG+DbrA6tHd{DI8EbL^$ zf8|!=!W5M;kX*=LMnK=0seYhcHw@Z^C}-7mJ=a67qD^%?^McS1CyR2|t7$kR#J(n? zf-zbpj81#s`dWEDdJR1MVH}XYLsTvIvj>Ajr&+|MfK{y6VkZ*K&V-u6EG`!JgARUm zXw~YYMlv`I>dV_x&)+#Qxj)^#Kf1i-f7G5DYBKFT;!T)-Scmvgg|A4uA@f1!N#?UA zbP%sGb)@=^Ng1HhT0O^yvkCvxBg{Piq%Xt%78~~$5>yM90g#+;UdIl*q5jN7NI7y= zvduVAV@v#e4mk0QQUqh_b1K@qjKmKEjHV80tf2EET z!p~(d7t8tiIqm}Xu%?u_{I!a zb7|ddOh^edhkbUXtfp!h+#Bpax^Jk}y*@6~;l1Fad9;WYJ%(0JsInWvf3?jqNvOIn zUY>1L_>*g;y<5@P>>N}}=(xIRubT%8(?t}XDB8A|Y~R)k^OuZgs>EvWU(V< zy!Y<_$EvH5C{kHm-7dlGe`-8)He5U_gw%fPG)%l&!XBX8ns5@ zG$b$WS&hHDIe&Nl3e5^*&Bei_cTPG*JeFv?|MP2Q&L@&6WBK>#f8z4|>RjTauIHk% zSIxMP*PPoaMwY`d74?kFlA2{^$NxvazmEDf`A2c`^1w1pI;9Vs`J@)N69irX6(8LS zST1w?fyf(fT^Vp{&tASQ4+_HkbD_(d{9=qmN+O>;{$SrQ!tlX>a5sx2A;3;#VJ{#p zK;|Q7>{l2C1wLpLe~S@T?$x^b$F#gr>bbgxa<>W_fePQdK{VSLkM)SpJ3X#^J6~7% z!ueiL%dBnau274ea)6@uB-i81nWs!bD|myDRp*XJ2%qU^Y2;RhA11RU4Y0YX-^!t zC6m-CpIm$jjqifSr`}{r{k|HhclLXo{Xd`7OQn{^x9l9R8PoqGHsI16v9w=jPi?ClcD%Nq&|H!9LT4ZIwWIIJP<$4+FdeuaGO0K>8DH&k(z98tV;? zkd7TvK5{Nrf9j@8%5i@=i*hj~6a5E|v@V-Crlxp>0Y}W^-QhxjW6AfG6HJv6FHuF% zpE`42FEC`MsGlh3jH@wy>(+7!f)|j*LeivEk}XPRh81GS<9tZ4fUjqXRh(}HbGD3y zCDKrH=*y@d(cOHe3OqK7!vy;ATXIjole(9^ZefQGe+F+58SAGcPiDW+9Pcy>n5XW0^~lmLj3QfSZp|XpzkjK0|6@ddPweHL zjwgKNE#EMvksA#;#i#Dd=f1IzA|fkvlk7?9v9F$k9ffWlGRz(_pY zt0S>fe<1Pr2{`<7 zQX5q5NY*fcEaLbHmnDSbu{ZMMq`#e4n5%bqxJm>FFJLB^phGS&nmQP)#L3ivY`|EI z!n`_w_vAP~(=r%1!y(#C%oPJhdP$$WdV<+xe|NXOlci%9CZqY6>?FxR+JJxr2jO{4 zf5;I5HVBZgGL^~Dxih{OhJ|my^?b%8(1~7Zzg)N|!gY21{$Rj`4_tB*24o4O*IaY9 z-~zU#$DU5|7cBJZtpl=?u5C3{{beE3`Z^{`5#W|yUV+Q+d1r-TvHk*c>?-+^4FpzD ze>+q}>gDnac?$kEE)7I#HYCpxb&SFhkq#r@oP*9QNoHi-KkOSJ8C3l>v`vD9(;&4&V}+@hTkJ12G>=9KGP zakwQ|mBBGM@v}~PZ2gA4=n4on*t00PweQ71BBWLspJR90I=kN0qxXAa!dQQTGeul!J_!bmK}btt zEOY(lD*v07NV11vJFFDObR~gdYC>$H>Ms(Z51wh`lYc!vXSbHkVX70I+0dJ0VMaSR z!xaWj;F?gGDI*lKY6%H>EO~!ze-zy3ET0zvb0&7SVSoDc#)ieMcq3DlAcV#>!rlc# zidZvE&CM#>U0GKAlMwOJo2JyPfsCy*mk6t=ktRaR!O1C)i$Vq9IqPu@krNR=W{W)W z_O zYz%Am}A}u$xnZ= zg+18#+Xf1=ZXu1BrDtR;jy#CuQ5Y>+MDDG~Nl*gmrI}+YSV%L$C9rj->)*Q8q=O9HR4u6F#S5kW2AEs}cyKfnCcfAitJJ)&d{$ozg6s0IN`42mKW zjw{9TVXm*u)9Y&!T9x`za{&yy-qFqEnrPSD!p84yFGGovl@wd5X)URfJjx}8J?t!# z3}=7c86kmWBDRZ2e<$DZK`99t(Zq=ACBHpmvgocH-;BVcWq~K@!&qhMxOLQ$a{?}w zPeXM0$WDzDS5?ha$`H0VT4ZsX1-2lsbUq#T^N0y%bv>f6rs9M%J%hn_Tob{Y0h4z= z^~{}pQ-_QnF1+VM7#!JV?IEYZfZNU<7mF8*MhO=lq%(z&# zR30o9=y}w9Ldd-!=P_52Wx%94F)1PCFRttQS> zAB*`!J%{^BhM>s`)F;?#mZxBz0zKZ-$$u4YhfBnfCqZbc`2=)vdI#8w zwP){1f7X0ArBgzixhhoh50GMfRi#rL6k<;!^ZK7NSnfisa=0?jf5SYs8-<5}I(VpX3G<|Uppm4NE-pYg zY4H6I&H5>b%Kfn7Wwg~tvub}KaT8XTX&BxVO=-A$`^ynre^5L*&P>7Tb;}2YdF&FR!S60kj)6>>pt$saX{tD?=IXH=h`6@*a6HF|aNd(^ z5^Gy0#gTXk)TKOS(w^w_`6e{jW>al$ZngP{Wdb6n$GH3q&&7V;+^P(NpO~DCI1tUS z^pq#y3lum2h3jKOQ#tWf!GDhFNyy1Ee<1E^3t49+m5T!YS^fEr248hbX9#^QT`!E+@dW{yGSz2@TCgajYU3(e*V+mC#Vg#!eh zjlq~Ha$dBCwY|{!iF{ZVJIM7q_6imfkR^s`wEzzhz)M8e_!HK z<~h0QQBW#jcsDGlsCMNB80H#2K~q_f&aUE2Z&~gwX+Vaf6n`xf=Oe?)1uL60`sP1) zXd5-hTdN58pejkqrci%T;7nUp6p`Rl*=k4Fjnx#^D>N|2wVlXPLITZWKW=9LirlVne{yARv~5Z2 z5fA4k0O7+#N`}^9=BF2?use&)T>~7`uT-?!#<_39r$OG6^T2T`b6^4$AzvD#dP=^5 zF>=C!#HPpxgY&m!u(;`&9b@ZZ08*ls2)c?q(4^ z#eSm4m_!6dBke|JqBm=*I9UWVB-@QiLRe3DT9O3xuQR6caS@-y9HivuVg=^TIe}KW z5RM~Z`Q2Q+WW*t~a3n5yiR~5o1|OxgLOxEVVCXz>V`514js*Saf5v-O096D+`07Tc zM=!VyeXfCu$d3rwn9idug#G-6Z*yHlc`5?sEorCVH`O0aNjz{Up|fJDs`##yi?cW_ z9~eRu!NC%mw1SZ{^mJmP2_{muVq~x}=>+mnV@NK4AqiZpDu8(*SH)Hj!{bFFH5#2> zIo0S$Jc7j{j_m@`e~cQB583i2A4t8CM9yvXK@jrcauqGw7(qP#y*x(Gqs|XzKm!bm*{KE3s3UMfswS`7v-&R7LCpULmykK^WPp`5tvRJ=lYXe6O& z!JgrezcwPj0;n9IAhHz@YbP%N+;OGMs?*++d|+{bjj0cDn1qbpLLe8!2+zQ^IRHMc4tsd38m9%^e^2)s;?h$(7`2)h=&CQK(Uz zHqEJJ&^=q_espzlHO)wvPfVq?;4LQ@$PC#f4}OtZ&dNrYg93S#0cL&YsYSJ zM1h+MP`alf29WqR}M+nEzMmi;Xhsn zfE)@F#;c_-Y>5*pTVWlXuwiJzCTs#)U2Gt1$OZX^WJi+kSXIMchP!kSel4t7h^?ar zm{CM%e{c7+P@|?Dw|fN(e1XQC*r#N3aCyZ&UaC2uXoEh9xzp-n_0IL`DJ+{wWDMkA z^wBOwvrVZ}9k=AEufXTBm|0$PImVPnuS#{}oLQ3Z9T2qvpRkbq1%SA=r#vuUSRV*~ z+Ms=L4lFofmw&ScMeH&uG*Lt@3v7!M8noG0ZMg@nd&` z<+bM~!aal~^3$icX6x%3u?}h1TsPNQXEHmN)xNdUiiJ5KH=~R3#@D&=HBhU%nAlYf zf2xWII$R46W%vp*uA~V`7Pj~6Qw89X?G#LgyONR2)V>oN&Qw7E2LiV2f|%f_;lWlC$oJe0u)Yq)H)` zWXHu(TLGcX4h{xfuUx66He|^l7AH}JTVuy&2$47nQq(9L=jFbse!6m>5OM zjS&g8hiVH{!+|;X6V9P`7k&g1@<1Vg%&?unK)+9&Ggt^&L$Ammfq~!`O+eflX(MEp z?HfWRVy9`)9Rmo`(LxpZssLFws9qf5bDI=uR3vnb$1>aL-u) z5fnG}H<8)OPW32>$VNTeR%~539mJf;InG!yFR9M-M%Y5lhbu)eoJ(N!*b=`i@~$lF zxKE&ce3`#AkCqO~RsFofW*OHf*9(%b?PEMHvZ}+TrxZnPOi-Q8 z^U^HWLb$rfeJUK;>~+P*U7qo~5|RlHnv_lb+y6WaPCOQex78kz{Y$psLVF^W zJNd8*r@@T{!%sf4V+lhSRCE=P3#9tafySC^pPVj49v^0bMQ|x?BJU+UkymVCkFBe_ zA!QU}zBEfPEcWh4SU9_8h%Oni>^frNyEQc07IuPY)D=Soa+uNbTr%hhE zsl6-S>0YQAsiP zi(B2oD0Dn)fz4yN6vMu4S1-g}FV9V-XY}XxUzb06>IH__y*%dAc|XO+^Buc-rjk}!EWhlSW~N>LwjBgWd{m> zZ(7eyl*;TO;r#kJ76v9NVh0{H#+Hl-r0_YqrB*82exAVG`c?_cSBc6m5BL0(Iv8Gj z|F7G+lJc6o#KN22NUg~ic17rG*e%;CxM@4jayrPIvhom;MtLZS|pC6X3*Dbp)OZ;I4J`wCPaAqaoP&rJ?-o&z_g zN9GK|;)YKxokpk%iLpCBqCBUZXGY*^uE03#e79^vh=)&_PE!b>8r)0wI>QRO9AAGE zcur*~I(tCkW3Md+nV7oDBpQBk=A_s5MgAaloMdV4Sd0G6pvvVZRQrz+{I}1Jx2h;# zV7>Vur$^ZMR zRaK^icp>6ql=pJJfDR|mR&>Kay6a{su1>T+uEhAmF?)qiiny^fgo+1@2O)O#xDcqLj=>r?U&lQa)1 z9$cEYd&d9D7far!e9>-swcAATZ4X8xHy}QUZ=9Q{*la##L2<;7;Y7ww*W;Pr?U&g} zY}ly&k{XnhE51=r?eCXXecFL*l&^iErCpKM{cjxK3iHapVVb$-2un&+-%KQb(_cF< z`evB8ukVt;5zgQ?jlH;wvt!+Bfkr6`+}S0l{9`Q@+nFA)m@QK=R^p`Px>x*${*kuk3ow*96$hYg2@il##$Bp*dA@F{Q_QVkWkTOeaLhNy0at9<KNvp><@pJZ5nJpzqBIbF3k^ceD+uVYdmr7MyrF@$u_09Mb8#x?b0Ga z;`HE9Pn|N8P;5mTt05fqD9dhSmXPeHG)FZqGrO8g$9!cogivKPkyVagp0sN{=Nr&J zZu9jK*U}h)SZhA`?qT1dDZ*WqT-CRlTU8>@zELpsu5AUS&2ETC6VTn4ms4w)qcO9A z7$?x$Mf7=B=^+^fxHV7l32w4l?*~p#qIRU$XMfKy{dB5u_OPUea?>i7^ccf|XJsOpo&0o&V-iDb@#LyU%CUj|W5jm_ z&)+MPL(3n!J}`J;{f%YAe|953t!TN5L3;&69jWSWI8n`l*>j?GZo*q!>Nsmj=-&Vr}BYx9VT`nBfijXrbl925^!9oNWeNlVmSC}=n(T5BZ7 zQ<6H$z4n@(S%tS;%9D@&*7MU$+>VxZ8k03gJ~G}w3||_do^eE#Q4RQFxa*OFu_t=9 z%2CYd2~M)qyMFGNiU!Yj3aBUkZM^z?^HCw~iUJ3^FR34a>7(jPQwi(Kh4y?zE0W$@ z&JbpS>?E|Sp+U~sjf7ypyps3Wh>sg-_dQk*+u~QF-QD=C{59{$NBxoWZdXkl*DpvI zo?{u7=4H!rYXC)N z{pViZ7j_k}r_{eq$WjgGma^?vGd6f_5SQn^>woZF ztGl2d-5XO{aQ>!s^}Wv?_1{bGJhA7&y-u=mZe9&8na@FTNE>fu^n$pUhwbsyyak~{ zcQ2{kGA}CN&l@`XFu$`YO%sn z*2JrOVAJ8@-ZHz|Pe-kVU&>)3)l9FnJf1ph-CVV6^Rl$91UzbVtfcKQks)cG>^rr) z_bWl&u>gJ0Cg_3djR#z;Sjlv-&c-`MbFWva#}X0iSf6e0{x<)_yz6qPq49f+%E>1C zxqQ=Fbhgw>?N2&lvUkW~6!s*Bmou{kyVmcs+6jK{TNR{gy2Y$+R5McVCYfM`s&ba} z@9B0hBu5>!q&l{Slm>9zB(~{LCfTcCuU>Z@*^rR9Q{2*yb_t!y=u;`OuvANAe!DpJ z!Rhrr8>8OAmE1ck-SOCS{x{|~4$j-*c(+0Kjhme=nDt2n#V}m#*i*_C2Ad3uV0Qi~ z&fJoR9nQ*M2$vk9?nlp7BA?=t^ZXFFa>1FpPPif|(L4w(vQptJOH_^2Uk4a2TC^{P zyTHL3{?4NeX!`ttX{U|EIGk^B%fszH;cltaJ)g;177~(mi5K%i1bxvOQV|G)sMn=H zaKTIC-I8ISay(v)&NbA_E%YTUs3#BXq25yQT)A7*+{*3U?1x=`imid4$(B|2Gr4W5 zHPz5Hw~QAGKfJZ;jPyx5fQSCa3f>=DMt|4abTVOp!44x~P@2xa4;h^D0uIxYNfDr& zH=qp_xnB8mOit#ChCWKswUT=51D z!O5f~El}MD*emwu(bzw3k^7fFs|5!8(D)1I!8#v68yGPK*L?sz$byq)+Lo0FXzL3| zLnzM@eCZ1ag13DES>Qp`4ln|gqSHvR{Apt`a8Sb!K#2Wu-UgKWB=)l<=sQcA++ptp zWBq6bNwI01`NH4}KL8Dx-;9Tl2q@-HL+-f{k^zbSG-mD79cEfkJp%0gAvr;%=?Vq_ zN|3Jedk6`EE&+fFgyvzy<984RA_VV9kQ^B-;GgpGQ!hqeNP6(g{IrSJ64*{gXk`O={a=^6eS0xKb z9||Z!viCJRGAR%nO6zjuvmfwDD9z<(&woIkFdCVWvIFHoO(MVzMu!0ckb&D{J2EU( zLd=771i%t1tt{`9B*7>G&5HTv4>(MqS;^S`0h5UU!;UFA1~RD=4uB-+q66>(9l!>r z69FYi2pul-OUMk)5dmKL|4P04IZ%b9A|$YLf8uY6cruFrm4f%LhBe3U8j4CFMwrDsz;2pGI@kV=Fz7F#1&6_me$t_DA?eAV8c>2D9|-Nb6+l}O zfPm9B Date: Thu, 18 Jun 2026 17:36:06 +0400 Subject: [PATCH 3/7] fix docker tests workflow Signed-off-by: tdruez --- .github/workflows/run-unit-tests-docker.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run-unit-tests-docker.yml b/.github/workflows/run-unit-tests-docker.yml index 5375cf7f..c17e555e 100644 --- a/.github/workflows/run-unit-tests-docker.yml +++ b/.github/workflows/run-unit-tests-docker.yml @@ -22,5 +22,10 @@ jobs: - name: Generate the .env file and the SECRET_KEY run: make envfile + - name: Build Docker image + run: docker compose -f compose.yml -f compose.build.yml build + - name: Run tests - run: docker compose run web python ./manage.py test --verbosity=2 --noinput --parallel auto + run: | + docker compose -f compose.yml -f compose.build.yml run web \ + python ./manage.py test --verbosity=2 --noinput --parallel auto From af9adde02dbe2436f019bb329912627aa1dff9bd Mon Sep 17 00:00:00 2001 From: tdruez Date: Thu, 18 Jun 2026 17:49:46 +0400 Subject: [PATCH 4/7] set --parallel 4 Signed-off-by: tdruez --- .github/workflows/run-unit-tests-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-unit-tests-docker.yml b/.github/workflows/run-unit-tests-docker.yml index c17e555e..300a058b 100644 --- a/.github/workflows/run-unit-tests-docker.yml +++ b/.github/workflows/run-unit-tests-docker.yml @@ -28,4 +28,4 @@ jobs: - name: Run tests run: | docker compose -f compose.yml -f compose.build.yml run web \ - python ./manage.py test --verbosity=2 --noinput --parallel auto + python ./manage.py test --verbosity=2 --noinput --parallel 4 From d469e6712395a6ec18f6d4d0c609303586f9de8b Mon Sep 17 00:00:00 2001 From: tdruez Date: Thu, 18 Jun 2026 17:55:09 +0400 Subject: [PATCH 5/7] try --parallel 2 Signed-off-by: tdruez --- .github/workflows/run-unit-tests-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-unit-tests-docker.yml b/.github/workflows/run-unit-tests-docker.yml index 300a058b..2d950eba 100644 --- a/.github/workflows/run-unit-tests-docker.yml +++ b/.github/workflows/run-unit-tests-docker.yml @@ -28,4 +28,4 @@ jobs: - name: Run tests run: | docker compose -f compose.yml -f compose.build.yml run web \ - python ./manage.py test --verbosity=2 --noinput --parallel 4 + python ./manage.py test --verbosity=2 --noinput --parallel 2 From 37c8496cdc116fe14961391e577cf9707fe9e36e Mon Sep 17 00:00:00 2001 From: tdruez Date: Fri, 19 Jun 2026 10:07:09 +0400 Subject: [PATCH 6/7] replace assertNumQueries by assertMaxQueries Signed-off-by: tdruez --- .github/workflows/run-unit-tests-docker.yml | 2 +- component_catalog/tests/test_importers.py | 2 +- component_catalog/tests/test_views.py | 15 ++++++++------- license_library/tests/test_views.py | 4 ++-- organization/tests/test_views.py | 7 ++++--- product_portfolio/tests/test_views.py | 6 +++--- reporting/tests/test_views.py | 5 +++-- vulnerabilities/tests/test_views.py | 5 +++-- workflow/tests/test_views.py | 5 +++-- 9 files changed, 28 insertions(+), 23 deletions(-) diff --git a/.github/workflows/run-unit-tests-docker.yml b/.github/workflows/run-unit-tests-docker.yml index 2d950eba..c17e555e 100644 --- a/.github/workflows/run-unit-tests-docker.yml +++ b/.github/workflows/run-unit-tests-docker.yml @@ -28,4 +28,4 @@ jobs: - name: Run tests run: | docker compose -f compose.yml -f compose.build.yml run web \ - python ./manage.py test --verbosity=2 --noinput --parallel 2 + python ./manage.py test --verbosity=2 --noinput --parallel auto diff --git a/component_catalog/tests/test_importers.py b/component_catalog/tests/test_importers.py index eceb65d1..ed34f407 100644 --- a/component_catalog/tests/test_importers.py +++ b/component_catalog/tests/test_importers.py @@ -601,7 +601,7 @@ def test_importers_view_num_queries_view(self): with self.assertMaxQueries(9): self.client.get(reverse("admin:component_catalog_package_import")) - with self.assertNumQueries(4): + with self.assertMaxQueries(4): self.client.get(reverse("admin:organization_owner_import")) with self.assertMaxQueries(10): diff --git a/component_catalog/tests/test_views.py b/component_catalog/tests/test_views.py index 5efafcb1..c776d85d 100644 --- a/component_catalog/tests/test_views.py +++ b/component_catalog/tests/test_views.py @@ -52,6 +52,7 @@ from dje.models import ExternalReference from dje.models import ExternalSource from dje.models import History +from dje.tests import MaxQueryMixin from dje.tests import add_perm from dje.tests import add_perms from dje.tests import create_superuser @@ -77,7 +78,7 @@ User = get_user_model() -class ComponentUserViewsTestCase(TestCase): +class ComponentUserViewsTestCase(MaxQueryMixin, TestCase): def setUp(self): self.nexb_dataspace = Dataspace.objects.create(name="nexB") self.nexb_user = User.objects.create_superuser( @@ -980,7 +981,7 @@ def test_component_catalog_details_view_num_queries(self): History.log_change(self.basic_user, self.component1, "Changed version.") History.log_change(self.nexb_user, self.component1, "Changed notes.") - with self.assertNumQueries(32): + with self.assertMaxQueries(33): self.client.get(url) def test_component_catalog_details_view_package_tab_fields_visibility(self): @@ -1095,7 +1096,7 @@ def test_component_catalog_component_create_ajax_view(self): self.assertContains(response, expected, html=True) -class PackageUserViewsTestCase(TestCase): +class PackageUserViewsTestCase(MaxQueryMixin, TestCase): testfiles_location = join(dirname(__file__), "testfiles") def setUp(self): @@ -1133,7 +1134,7 @@ def setUp(self): def test_package_list_view_num_queries(self): self.client.login(username=self.super_user.username, password="secret") - with self.assertNumQueries(16): + with self.assertMaxQueries(17): self.client.get(reverse("component_catalog:package_list")) def test_package_list_view_pagination(self): @@ -1271,7 +1272,7 @@ def test_package_details_view_num_queries(self): ) self.client.login(username=self.super_user.username, password="secret") - with self.assertNumQueries(30): + with self.assertMaxQueries(31): self.client.get(self.package1.get_absolute_url()) def test_package_details_view_content(self): @@ -3797,7 +3798,7 @@ def test_component_catalog_package_update_view_save_as_with_collect_data( self.assertEqual(1, len(mock_collect_data.mock_calls)) -class ComponentListViewTestCase(TestCase): +class ComponentListViewTestCase(MaxQueryMixin, TestCase): def setUp(self): self.dataspace = Dataspace.objects.create( name="nexB", @@ -3887,7 +3888,7 @@ def setUp(self): def test_component_catalog_list_view_num_queries(self): self.client.login(username="nexb_user", password="t3st") - with self.assertNumQueries(17): + with self.assertMaxQueries(18): self.client.get(reverse("component_catalog:component_list")) def test_component_catalog_list_view_default(self): diff --git a/license_library/tests/test_views.py b/license_library/tests/test_views.py index cb053ef3..fe39564c 100644 --- a/license_library/tests/test_views.py +++ b/license_library/tests/test_views.py @@ -31,7 +31,7 @@ from organization.models import Subowner -class LicenseListViewTestCase(TestCase): +class LicenseListViewTestCase(MaxQueryMixin, TestCase): def setUp(self): self.nexb_dataspace = Dataspace.objects.create( name="nexB", @@ -286,7 +286,7 @@ def test_license_library_list_previous_next_license_link(self): def test_license_library_list_view_num_queries(self): self.client.login(username="nexb_user", password="t3st") - with self.assertNumQueries(16): + with self.assertMaxQueries(17): self.client.get(reverse("license_library:license_list")) def test_license_profile_column_availability_in_license_list_view(self): diff --git a/organization/tests/test_views.py b/organization/tests/test_views.py index 4ee02880..5ca61966 100644 --- a/organization/tests/test_views.py +++ b/organization/tests/test_views.py @@ -13,6 +13,7 @@ from django.urls import reverse from dje.models import Dataspace +from dje.tests import MaxQueryMixin from dje.tests import add_perm from dje.tests import create_superuser from dje.tests import create_user @@ -24,7 +25,7 @@ Component = apps.get_model("component_catalog", "Component") -class OwnerUserViewsTestCase(TestCase): +class OwnerUserViewsTestCase(MaxQueryMixin, TestCase): def setUp(self): self.dataspace = Dataspace.objects.create(name="Dataspace") self.super_user = create_superuser("super_user", self.dataspace) @@ -94,12 +95,12 @@ def test_object_details_view_tab_owner(self): def test_owner_list_view_num_queries(self): self.client.login(username=self.super_user.username, password="secret") - with self.assertNumQueries(13): + with self.assertMaxQueries(14): self.client.get(reverse("organization:owner_list")) def test_owner_details_view_num_queries(self): self.client.login(username=self.super_user.username, password="secret") - with self.assertNumQueries(18): + with self.assertMaxQueries(19): self.client.get(self.owner1.get_absolute_url()) def test_owner_list_view_search_unicode_utf8_name_support(self): diff --git a/product_portfolio/tests/test_views.py b/product_portfolio/tests/test_views.py index c4eb4ba2..d9744f14 100644 --- a/product_portfolio/tests/test_views.py +++ b/product_portfolio/tests/test_views.py @@ -136,7 +136,7 @@ def test_product_portfolio_detail_view_tab_inventory_and_hierarchy_availability( ProductComponent.objects.create( product=self.product1, component=self.component1, dataspace=self.dataspace ) - with self.assertNumQueries(27): + with self.assertMaxQueries(28): response = self.client.get(url) self.assertContains(response, expected1) self.assertContains(response, expected2) @@ -162,7 +162,7 @@ def test_product_portfolio_detail_view_tab_inventory_availability(self): ProductPackage.objects.create( product=self.product1, package=self.package1, dataspace=self.dataspace ) - with self.assertNumQueries(25): + with self.assertMaxQueries(26): response = self.client.get(url) self.assertContains(response, expected) @@ -357,7 +357,7 @@ def test_product_portfolio_tab_vulnerability_view_queries(self): make_vulnerability_analysis(product_package2, vulnerability2) url = product1.get_url("tab_vulnerabilities") - with self.assertNumQueries(11): + with self.assertMaxQueries(12): self.client.get(url) def test_product_portfolio_tab_vulnerability_risk_threshold(self): diff --git a/reporting/tests/test_views.py b/reporting/tests/test_views.py index ae34dcfa..ed6b40bb 100644 --- a/reporting/tests/test_views.py +++ b/reporting/tests/test_views.py @@ -19,6 +19,7 @@ from component_catalog.models import Component from dje.copier import copy_object from dje.models import Dataspace +from dje.tests import MaxQueryMixin from license_library.models import License from license_library.models import LicenseCategory from organization.models import Owner @@ -32,7 +33,7 @@ from reporting.models import Report -class ReportDetailsViewTestCase(TestCase): +class ReportDetailsViewTestCase(MaxQueryMixin, TestCase): def setUp(self): self.dataspace = Dataspace.objects.create(name="nexB") self.owner = Owner.objects.create(dataspace=self.dataspace, name="My Fancy Owner Name") @@ -1166,7 +1167,7 @@ def test_report_list_view_num_queries(self): # Needed to clear the queries from the License batch creation in setUp self.client.get(url) - with self.assertNumQueries(9): + with self.assertMaxQueries(10): self.client.get(url) def test_run_report_view_query_using_related_fields(self): diff --git a/vulnerabilities/tests/test_views.py b/vulnerabilities/tests/test_views.py index fd8fbb80..b0604396 100644 --- a/vulnerabilities/tests/test_views.py +++ b/vulnerabilities/tests/test_views.py @@ -12,12 +12,13 @@ from component_catalog.tests import make_component from component_catalog.tests import make_package from dje.models import Dataspace +from dje.tests import MaxQueryMixin from dje.tests import create_superuser from vulnerabilities.models import Vulnerability from vulnerabilities.tests import make_vulnerability -class VulnerabilityViewsTestCase(TestCase): +class VulnerabilityViewsTestCase(MaxQueryMixin, TestCase): def setUp(self): self.dataspace = Dataspace.objects.create( name="Dataspace", @@ -35,7 +36,7 @@ def setUp(self): def test_vulnerability_list_view_num_queries(self): self.client.login(username=self.super_user.username, password="secret") - with self.assertNumQueries(7): + with self.assertMaxQueries(8): response = self.client.get(reverse("vulnerabilities:vulnerability_list")) vulnerability_count = Vulnerability.objects.count() diff --git a/workflow/tests/test_views.py b/workflow/tests/test_views.py index 9157f829..e822b0f0 100644 --- a/workflow/tests/test_views.py +++ b/workflow/tests/test_views.py @@ -26,6 +26,7 @@ from component_catalog.models import Subcomponent from dje.models import Dataspace from dje.models import History +from dje.tests import MaxQueryMixin from dje.tests import add_perm from dje.tests import create_superuser from dje.tests import create_user @@ -1643,7 +1644,7 @@ def test_workflow_notification_request_comment_slack_payload(self): self.assertEqual(expected, payload) -class RequestInComponentCatalogTestCase(TestCase): +class RequestInComponentCatalogTestCase(MaxQueryMixin, TestCase): def setUp(self): self.nexb_dataspace = Dataspace.objects.create(name="nexB") self.user = create_superuser("nexb_user", self.nexb_dataspace) @@ -1810,7 +1811,7 @@ def test_component_catalog_details_view_with_requests_num_queries(self): self.assertEqual(3, self.component1.get_requests(self.user).count()) - with self.assertNumQueries(28): + with self.assertMaxQueries(29): self.client.get(url) @override_settings(ANONYMOUS_USERS_DATASPACE="nexB") From 76c0f6d8cf18d42b487ed66edd546fe07bdb541c Mon Sep 17 00:00:00 2001 From: tdruez Date: Fri, 19 Jun 2026 10:18:59 +0400 Subject: [PATCH 7/7] adjust queries count Signed-off-by: tdruez --- component_catalog/tests/test_importers.py | 4 ++-- product_portfolio/tests/test_views.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/component_catalog/tests/test_importers.py b/component_catalog/tests/test_importers.py index ed34f407..bb05c372 100644 --- a/component_catalog/tests/test_importers.py +++ b/component_catalog/tests/test_importers.py @@ -601,10 +601,10 @@ def test_importers_view_num_queries_view(self): with self.assertMaxQueries(9): self.client.get(reverse("admin:component_catalog_package_import")) - with self.assertMaxQueries(4): + with self.assertMaxQueries(5): self.client.get(reverse("admin:organization_owner_import")) - with self.assertMaxQueries(10): + with self.assertMaxQueries(11): self.client.get(reverse("admin:component_catalog_component_import")) def test_component_import_keywords(self): diff --git a/product_portfolio/tests/test_views.py b/product_portfolio/tests/test_views.py index d9744f14..d2463648 100644 --- a/product_portfolio/tests/test_views.py +++ b/product_portfolio/tests/test_views.py @@ -267,7 +267,7 @@ def test_product_portfolio_detail_view_tab_dependency_view(self): resolved_to_package=package2, ) - with self.assertMaxQueries(9): + with self.assertMaxQueries(10): response = self.client.get(url) self.assertContains(response, "4 results") @@ -289,7 +289,7 @@ def test_product_portfolio_detail_view_tab_vulnerability_queryset(self): self.assertEqual(4, product1.packages.vulnerable().count()) url = product1.get_url("tab_vulnerabilities") - with self.assertMaxQueries(11): + with self.assertMaxQueries(12): response = self.client.get(url) self.assertContains(response, "4 results")