From 4dc1407da9246984006368471c3bfb8cccc89b70 Mon Sep 17 00:00:00 2001 From: suguanYang Date: Wed, 18 Mar 2026 18:08:43 +0800 Subject: [PATCH 1/2] fix: accept token lists in parse results --- docs/usage.md | 4 +- src/knowhere/lib/result_parser.py | 74 ++++++++++++++++++++++++++++++- src/knowhere/types/result.py | 6 ++- tests/test_models.py | 7 +++ tests/test_result_parser.py | 50 +++++++++++++++++++++ 5 files changed, 136 insertions(+), 5 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index fadedc5..1238fbc 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -249,7 +249,7 @@ Every chunk shares a base set of fields (`chunk_id`, `type`, `content`, `path`). | `content` | `str` | The text content | | `path` | `str \| None` | Document structure path (e.g. `"Section 1 > Subsection 2"`) | | `length` | `int` | Character count | -| `tokens` | `int \| None` | Token count (if computed) | +| `tokens` | `int \| List[str] \| None` | Legacy token count or the token list returned by newer parser pipelines | | `keywords` | `List[str] \| None` | Extracted keywords (requires `summary_txt: True`) | | `summary` | `str \| None` | AI-generated summary (requires `summary_txt: True`) | | `relationships` | `List \| None` | Relationships to other chunks | @@ -729,4 +729,4 @@ def verify_webhook(payload: bytes, signature: str, secret: str) -> bool: ### Retry behavior -If your webhook endpoint returns a non-2xx status code, the API retries delivery up to 6 times with exponential backoff. \ No newline at end of file +If your webhook endpoint returns a non-2xx status code, the API retries delivery up to 6 times with exponential backoff. diff --git a/src/knowhere/lib/result_parser.py b/src/knowhere/lib/result_parser.py index 2ccba74..8f72a9c 100644 --- a/src/knowhere/lib/result_parser.py +++ b/src/knowhere/lib/result_parser.py @@ -2,6 +2,7 @@ from __future__ import annotations +import ast import hashlib import io import json @@ -18,6 +19,7 @@ ParseResult, TableChunk, TextChunk, + TextChunkTokens, ) _logger = getLogger() @@ -79,6 +81,72 @@ def _extractFilePath(raw: Dict[str, Any]) -> Optional[str]: return fallback +def _normalizeTokenList(raw_tokens: List[Any]) -> List[str]: + """Return a string-only token list with empty values removed.""" + normalized_tokens: List[str] = [] + for raw_token in raw_tokens: + token_text: str = str(raw_token).strip() + if token_text: + normalized_tokens.append(token_text) + return normalized_tokens + + +def _parseTokenString(raw_tokens: str) -> Optional[List[str]]: + """Parse legacy string token formats into a token list when possible.""" + token_text: str = raw_tokens.strip() + if not token_text: + return None + + if token_text.startswith("[") and token_text.endswith("]"): + try: + literal_value: Any = ast.literal_eval(token_text) + except (SyntaxError, ValueError): + literal_value = None + if isinstance(literal_value, list): + return _normalizeTokenList(literal_value) + if isinstance(literal_value, str): + token_text = literal_value.strip() + + if ";" in token_text: + return _normalizeTokenList(token_text.split(";")) + if "->" in token_text: + return _normalizeTokenList(token_text.split("->")) + return None + + +def _parseTextChunkTokens( + raw_tokens: Any, + *, + chunk_id: str, +) -> Optional[TextChunkTokens]: + """Normalize text chunk tokens across old and new backend payloads.""" + if raw_tokens is None: + return None + if isinstance(raw_tokens, bool): + raise KnowhereError( + f"Invalid tokens payload for text chunk '{chunk_id}': expected int or token list, got bool." + ) + if isinstance(raw_tokens, int): + return raw_tokens + if isinstance(raw_tokens, list): + return _normalizeTokenList(raw_tokens) + if isinstance(raw_tokens, str): + stripped_tokens: str = raw_tokens.strip() + if not stripped_tokens: + return None + if stripped_tokens.isdigit(): + return int(stripped_tokens) + parsed_tokens: Optional[List[str]] = _parseTokenString(stripped_tokens) + if parsed_tokens is not None: + return parsed_tokens + + raise KnowhereError( + "Invalid tokens payload for text chunk " + f"'{chunk_id}': expected int, list[str], or delimited string, " + f"got {type(raw_tokens).__name__}." + ) + + def _buildChunks( raw_chunks: List[Dict[str, Any]], zf: zipfile.ZipFile, @@ -127,13 +195,15 @@ def _buildChunks( ) else: metadata = raw.get("metadata", {}) + chunk_id: str = raw.get("chunk_id", "") + raw_tokens: Any = metadata.get("tokens", raw.get("tokens")) chunk = TextChunk( - chunk_id=raw.get("chunk_id", ""), + chunk_id=chunk_id, type="text", content=raw.get("content", ""), path=raw.get("path"), length=metadata.get("length", raw.get("length", 0)), - tokens=metadata.get("tokens", raw.get("tokens")), + tokens=_parseTextChunkTokens(raw_tokens, chunk_id=chunk_id), keywords=metadata.get("keywords", raw.get("keywords")), summary=metadata.get("summary", raw.get("summary")), relationships=metadata.get("relationships", raw.get("relationships")), diff --git a/src/knowhere/types/result.py b/src/knowhere/types/result.py index ea02cb7..fbdaa5b 100644 --- a/src/knowhere/types/result.py +++ b/src/knowhere/types/result.py @@ -8,6 +8,7 @@ from typing import Any, Dict, List, Optional, Union from pydantic import BaseModel, Field +from typing_extensions import TypeAlias from knowhere._exceptions import ValidationError @@ -124,12 +125,15 @@ class BaseChunk(BaseModel): path: Optional[str] = None +TextChunkTokens: TypeAlias = Union[int, List[str]] + + class TextChunk(BaseChunk): """A text chunk extracted from the document.""" type: str = "text" length: int = 0 - tokens: Optional[int] = None + tokens: Optional[TextChunkTokens] = None keywords: Optional[List[str]] = None summary: Optional[str] = None relationships: Optional[List[Union[Dict[str, Any], str]]] = None diff --git a/tests/test_models.py b/tests/test_models.py index 2230c9d..7e38d0b 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -419,6 +419,13 @@ def test_is_instance_of_base_chunk(self) -> None: chunk: TextChunk = TextChunk(chunk_id="text_3") assert isinstance(chunk, BaseChunk) + def test_accepts_tokens_list(self) -> None: + chunk: TextChunk = TextChunk( + chunk_id="text_4", + tokens=["attention", "transformer"], + ) + assert chunk.tokens == ["attention", "transformer"] + # --------------------------------------------------------------------------- # ImageChunk model diff --git a/tests/test_result_parser.py b/tests/test_result_parser.py index 4b49448..49ea3f7 100644 --- a/tests/test_result_parser.py +++ b/tests/test_result_parser.py @@ -52,6 +52,8 @@ }, ] +TEXT_TOKENS_LIST: List[str] = ["Ashish", "Vaswani", "attention", "transformer"] + MARKDOWN: str = "# Test\n\nHello world" IMAGE_BYTES: bytes = b"\xff\xd8\xff\xe0" @@ -147,6 +149,54 @@ def test_loads_text_chunks(self) -> None: assert text_chunks[0].chunk_id == "text_chunk_1" assert text_chunks[0].content == "Hello world" + def test_accepts_text_chunk_tokens_as_list(self) -> None: + manifest: Dict[str, Any] = _make_manifest() + chunks: List[Dict[str, Any]] = [ + { + "chunk_id": "text_chunk_tokens_list", + "type": "text", + "content": "Attention is all you need", + "path": "paper/abstract", + "metadata": { + "length": 25, + "tokens": TEXT_TOKENS_LIST, + "keywords": ["attention", "transformer"], + "summary": "Transformer introduction", + "relationships": [], + }, + } + ] + zip_bytes: bytes = _build_zip(manifest, chunks=chunks) + + result: ParseResult = parseResultZip(zip_bytes, verify_checksum=False) + + assert len(result.text_chunks) == 1 + assert result.text_chunks[0].tokens == TEXT_TOKENS_LIST + + def test_accepts_legacy_text_chunk_tokens_string(self) -> None: + manifest: Dict[str, Any] = _make_manifest() + chunks: List[Dict[str, Any]] = [ + { + "chunk_id": "text_chunk_tokens_string", + "type": "text", + "content": "Attention is all you need", + "path": "paper/abstract", + "metadata": { + "length": 25, + "tokens": "Ashish;Vaswani;attention;transformer", + "keywords": ["attention", "transformer"], + "summary": "Transformer introduction", + "relationships": [], + }, + } + ] + zip_bytes: bytes = _build_zip(manifest, chunks=chunks) + + result: ParseResult = parseResultZip(zip_bytes, verify_checksum=False) + + assert len(result.text_chunks) == 1 + assert result.text_chunks[0].tokens == TEXT_TOKENS_LIST + def test_loads_image_chunks_with_data(self) -> None: manifest: Dict[str, Any] = _make_manifest() zip_bytes: bytes = _build_zip(manifest) From 663491cc6e74bead085587cf0fa0d8fe49ec292c Mon Sep 17 00:00:00 2001 From: suguanYang Date: Wed, 18 Mar 2026 18:15:17 +0800 Subject: [PATCH 2/2] refactor: require list tokens in parse results --- docs/usage.md | 2 +- src/knowhere/lib/result_parser.py | 41 +++--------------------------- src/knowhere/types/result.py | 2 +- tests/conftest.py | 2 +- tests/fixtures/real_result.zip | Bin 463096 -> 463094 bytes tests/test_models.py | 4 +-- tests/test_result_parser.py | 30 ++++++++++++++++++---- 7 files changed, 33 insertions(+), 48 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 1238fbc..cf32420 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -249,7 +249,7 @@ Every chunk shares a base set of fields (`chunk_id`, `type`, `content`, `path`). | `content` | `str` | The text content | | `path` | `str \| None` | Document structure path (e.g. `"Section 1 > Subsection 2"`) | | `length` | `int` | Character count | -| `tokens` | `int \| List[str] \| None` | Legacy token count or the token list returned by newer parser pipelines | +| `tokens` | `List[str] \| None` | Tokenized words returned by the parser pipeline | | `keywords` | `List[str] \| None` | Extracted keywords (requires `summary_txt: True`) | | `summary` | `str \| None` | AI-generated summary (requires `summary_txt: True`) | | `relationships` | `List \| None` | Relationships to other chunks | diff --git a/src/knowhere/lib/result_parser.py b/src/knowhere/lib/result_parser.py index 8f72a9c..8f02013 100644 --- a/src/knowhere/lib/result_parser.py +++ b/src/knowhere/lib/result_parser.py @@ -2,7 +2,6 @@ from __future__ import annotations -import ast import hashlib import io import json @@ -91,58 +90,24 @@ def _normalizeTokenList(raw_tokens: List[Any]) -> List[str]: return normalized_tokens -def _parseTokenString(raw_tokens: str) -> Optional[List[str]]: - """Parse legacy string token formats into a token list when possible.""" - token_text: str = raw_tokens.strip() - if not token_text: - return None - - if token_text.startswith("[") and token_text.endswith("]"): - try: - literal_value: Any = ast.literal_eval(token_text) - except (SyntaxError, ValueError): - literal_value = None - if isinstance(literal_value, list): - return _normalizeTokenList(literal_value) - if isinstance(literal_value, str): - token_text = literal_value.strip() - - if ";" in token_text: - return _normalizeTokenList(token_text.split(";")) - if "->" in token_text: - return _normalizeTokenList(token_text.split("->")) - return None - - def _parseTextChunkTokens( raw_tokens: Any, *, chunk_id: str, ) -> Optional[TextChunkTokens]: - """Normalize text chunk tokens across old and new backend payloads.""" + """Normalize text chunk tokens from the current backend payload.""" if raw_tokens is None: return None if isinstance(raw_tokens, bool): raise KnowhereError( - f"Invalid tokens payload for text chunk '{chunk_id}': expected int or token list, got bool." + f"Invalid tokens payload for text chunk '{chunk_id}': expected list[str], got bool." ) - if isinstance(raw_tokens, int): - return raw_tokens if isinstance(raw_tokens, list): return _normalizeTokenList(raw_tokens) - if isinstance(raw_tokens, str): - stripped_tokens: str = raw_tokens.strip() - if not stripped_tokens: - return None - if stripped_tokens.isdigit(): - return int(stripped_tokens) - parsed_tokens: Optional[List[str]] = _parseTokenString(stripped_tokens) - if parsed_tokens is not None: - return parsed_tokens raise KnowhereError( "Invalid tokens payload for text chunk " - f"'{chunk_id}': expected int, list[str], or delimited string, " + f"'{chunk_id}': expected list[str], " f"got {type(raw_tokens).__name__}." ) diff --git a/src/knowhere/types/result.py b/src/knowhere/types/result.py index fbdaa5b..07ae918 100644 --- a/src/knowhere/types/result.py +++ b/src/knowhere/types/result.py @@ -125,7 +125,7 @@ class BaseChunk(BaseModel): path: Optional[str] = None -TextChunkTokens: TypeAlias = Union[int, List[str]] +TextChunkTokens: TypeAlias = List[str] class TextChunk(BaseChunk): diff --git a/tests/conftest.py b/tests/conftest.py index f925edc..a03325e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -138,7 +138,7 @@ def _factory( "content": "Hello world", "path": "test/section1", "length": 11, - "tokens": 2, + "tokens": ["Hello", "world"], "keywords": ["hello"], "summary": "A greeting", "relationships": [], diff --git a/tests/fixtures/real_result.zip b/tests/fixtures/real_result.zip index 8a846fb76b49ae01e77978c4f11652d99b7c739c..0c5f2964ea6df40f59f2d87174627d205b908e35 100644 GIT binary patch delta 39249 zcmV(sA0)I(o?1lO3OLq+; z%y<4?yA=;&S#0=2`Ru3ke}CG$`Jm47JfCK6lDgyJES+YHS$Z-UFH$!?njDYZJReOK z?{rXcOY5R3%FAS3)h=n5S(zLSdxOCsXw^F7cdfwx z$mXt3>Ss|^mhT~^yBEBV)S7jQE0_E`l7nqIsyCjq{hz~UDfyhx5Le5I(v z%QACB`tWD?yl9e5w!vF=<&sMnG(0A$VC=67cO{R2d9OEB34bGK=q2-P!|%YAps&DF zR#|=N(q^8mT#^?JEYoa@%Q~l9h11d1>Cr=~1xkdbT02;S22M4tMU@ozl6t-@S~qXE zH7s!M;NvoZxtH@|vqC9R!H8)Z{4AJ%cIogQ_ut{RoqcqE@$BsG#jP*PbTIf8x-7$N zFwLjKqx57tJby*0ev+Opj>qZzC?B89j%NcmJASvz(jWDQ$#aoB$(h*%TIGAR4=?T{ z_ssU{4ME|D511s+?Z@ZWP3zW8=STJ&_EgmArou^S_*d_+mv`X`UsiNAaj56p*=I0v z9P+#_Hf>ekUL+1D(_f)o&W>|8KN=5HP1=em$W8}Sm!C}DX_wDd zxK8bI4J-f1-0mxs%(C%tK6}S4A?*Qn&b`MylD(_! z+Fz`my?-sBq~>nrW#1!$EG*Ex;vBs#()!bI|*=3}6&BF1cD(uwLMCz;J27!G!WF zlvE{+{ZlvVCy&7H!#hQW8vHUmEd#wab1*pBsFH2O`4YAfPBCptlYq>t@nYd57h6__ zb`tm$_o`aG!bL_cD7N6D0Ougtz;~RhaerOOj)KM8h_k`>^`6{U)q+iO0AipyOr8%< zUKpb_gVma6a6q!l3MY*=qMtCDVepVS8dE&WuzJgFox^O=F+(E}J_f-ttJJ|JqEMYRMt1J&^-y9ebU10ON>k4hp9XSWnT5WUOEuGARr*Dv%_rZ_6t2XHu zzyB9K|0sO(iY;I;PvPj&@l2NJapi7Nlm$KR;FEiYEIxbuS@sIdc0KzI*cusns-Rj| z*KIME3z==<;DYvqQNSBOWc!)Xp?|sXhBzz>Y#^E1vMf8+xSYt&e%Y1C&;*}vn+69A zKZA*=KahZQ<>MhfH@==m80{yCgS{M?TVk1j3*j*7lnlx6jbHxzDE&VNH%XD?y9 z#9s8S2sLi)t6aW{1}Z;lqaiIb;Yxg`^t;Y1Ffss3Le{RGV!ifRrNB- z_|tU-J88so5Mo;#v7criZuaZ8x6iHWUbsR>1fv7h0KagrQCst@QF~NZu=@V4H<3L5 z;`2X2KXvKoaIA_o9X1`F9Di~g;1ygGxkf!c$YK}BQO&PQc~v#hGV~V?m$M zEda%r@45vzC0;C8TLkG1zTeg$iXxjbcW7yagy8Bm7u1=Ov2qJCVTz4E^(ZY;ty>NKwUx8f* zhL_{p<+4>uauwGXwrhUfy=d=Zo)7!UgU1)op4|KX-HQiL9^XEWG#cCxNaE%D^#-lm zaMZ&Q_U4E^u`o+Huz!0_s|Zx9gfCasjEpbXO1l01ce676U*YdJYG(6D_?jQLv5Vqw z?70u$@}IvayY?hojE=|SaXOt&!LH4RgESkBj?;lVIXxQY$MeBt@J@E^BQo1ew5en5 zpsA-SS&k)lHs{%z=Ej3gm%IDE7l;e+kSGEVBilvf%}{;t8JZB+ZJ>)JzwA@PN|=3cRe0Wj}@s1z*ZpPlMqg zXJCc4-+#<4@QWF$wW?&(jz;@@c>02L8y+RFO>AG1SB)dq!Z;Q9 zq3E`z-R9Q`Exf%8x-!p)!xs`RcKqEQ58_n;|EI#KfziQA8{g&fJ8(l+3;r{o2R;h) zfPz#P2#Cw24&Z=&0iGWj)pj@BYxozXWDddc1Ao0u&w*15+aKOTrb#$_;bmkP!65*T zPJ{k%j?g@B&{$lOy+!+mzko|wd(pNt6dF9e?t@`6rA@{=K`Xy1UOIj=-o6#?L54OB zIFt?FsSi&1Sgi0Sgs;o)hSkXyc(Tz{#1;8$i`Tw%bTayQ^plT9A9aGLyfqc5E1VOk zQh$(5v}YM#mI{)2pi`+=r(S#HT*XYop5Kab)q1z-nB31Q#G-#1A zvfY9i?N;P3?lF;za@UrQtW@$e3OrzFWq+|*=RG2{{!ps!4VEM&`FyMEuDA&RSEzi}sT3<|Kn{LGh{sgaNry&M{m^ba2ppW<5npO~(Jl=RZR|DfgX2&95lF zPqS#EY0&O`go%7kZn}=Uf0=FI4zyR!@vP{6x_#-!9jA9uXE5V!$W?W7qkl57wK{ft zqI&ra2`cts;pEK0j-Y{xY{FYqfV|6Lf2ymN!xUiG%uTQ(q+apR!nyRY;YPrMt9N>}yk_N%vc0kq%5UJ?!Cyx7m;28i-@i!Co<4o};O-fIl03Wr+uwii z?Ea(sk1x(|?*g74-;f@Ci+@j{ZUZXYH_7=oIt}|RYSl<6U^uqHCiaef{q^0&8{I!M z@*6xyqk!JKV|e6_#?$F!m`-Pl5jcj^Svs3dW@$be4IxaepF?cIsrppSm@ zH`*HhfBu^&>*=-}oRe*f(&_skJPv>3L--WGq51V^7Z?6-7uOpSWlvcFKZN@cK4aS) z?uP%<+`ITen8a`dk1PAT?|kMi;fCOAr-Q*4pZ^O6?nJNd zy!qI?SzbKLnquC03rrb&XyYbFTCx0jQrNjOpymTlpJ-?UO z_nqAMzDMZaM(;b?dEe<#{JzPrnHlReH&tcM#b|)^WdbI9SQP0|k%hFWdF%)|dQfaJ>JP`vGR;>^9!CG{X80IQ2DIez|J zpkthp^3cIzlz*iWSCrx;Y|!ZJ`ZtP{U(!M*^5!3jbSby1)ve{%V3dtcv(w{rFgwB! z_uSX96Jl7fcEXfB`AM^=kpS*_?pnQzNo0=rAs|`l~!9U3A4LoX5S8MTF z4$#8?xVS{)ba+V4JjS7V=!T-5h+!8PIQi2@Qv+6nS=BV(4^HD;Y&;qaDi#=#%S!P; za9B02ZGXC~8V2uiEPRb22>1w`6@K3uMbZX#Y4@dQ<%Z?k>wsI|4exjCbK)kKuAsY# z0V(eTmQ^kGAO>|60w|Eg662e}0p*)7i8SN0awMti8xCs=I@ue(E?~wy9vi zxDuD_IQEmf>b+&?;hJxuOu(J;1`3kei>?(o_3X4~8K=Qi187V;x{`ogV2;eu18loZUG?g(509--=8!g{@e zL+v@&;}Vt9>g^?yZHthN~5gdyR10~rPKzZcamRCA6E&Sjc#72q0E1h}O0 z_}#4B;?GBe!AX?tW!MT?pyx2mr9-XA_d+6)k64G@#}7hMD<>-liZ3l4=^0aOATH+BvGybXyq);(iC$GT}d5{c^?`75^u)c>QaokCtw!iF$kx+ zDA_sf#Rm>m@E$Xpa@Y14k9$*FK=phq!p4hPRV*C#mEp=&ihpaQ0%}4f3)v1NNO5Aa z<(&72xja98(enTUToFlg{BE_q*uocQEBIkW=b2`LE)HG^|M;ibOY+R|VIR9$ZSK3- zOMEg4xMqU@#_n(6K% zvbn#E(XwKZq<`6~s>pdiFYcmJtVvi{?+5R}5~rdb6~Szp?F?ZV>uePT=jqB9FZ?bS2|VWMAbac^1aFfeatKh9HpiOX zZCzYm;+4S(*N$-FplTY*{z1C{PZ36UI_u7O7k{xo_|)>vFu=o|EW8(3HRDif zluADHM>U)m7fJ_X$d6xCw$9SS+hZZrG@YXD2~5kZflKG$`kCz1tchC!lpRpIjaC>k06 zg*PAxq<_W0C59nWE?HpDurV}T1$JgWPix;2Tr7GxrCW`@XU&8112p|dj{UEq4cW{Z zlpKKx;c$ROw{rQVn9roX3FQZ808Rjfk1!&^=cpl6NzcUgk^@qYT_@cKXliUBKCF7f~J>4w9HH;lyi z3{Md{7!)!sG{ugRjKWF>&qw1I=>84xe@~__4z*&Y#RG?+L@?#?rl=!DLW6-fSJ^cK z{bF+)n5H9&!914pYsqkkQ*gJQl36;$PH6J-qp`_DtoQ9n7CaKqkW zX9;q`LU3@0))Y>2wXMm{=L!zBx0+4GGiDPA{+~mMq`^8xjO1)`fuC2R{zZob??w%_ z8yfdy7NLz_IUW0N3eC{^I%j+IJo39Efm-Pnz=_sHT^t34v z@#DfH#I-IJ*fOkQvX_j*!*5|h2Y)GX-bg{2tM|#lNDhK_LdMZvam)lA4_eM`3&#_y zP1b_lRXe3^#S%`lrLK`*q3!p^q|iB1YQ~&a@iWgS$yiqYkoc+cdTzd zF#+LVw5u z4k{c4UIgFtXBsR^l=rxX{+lYLgTEYZH-fA%)x#kuRjpn^c|Sc89b_P(?rQ661x`^6 zwGYlc0|1T7tozOBu(sKkRw3NklY!5Nh6ml=%EiW47Vcp zrGaaEl_7ZpOq)=th<|JR?lz3c!_DwvIeMx_YAoBum7GtFWm3%;W(KU@<9rFIBBO6; z=U9M{3Y63XrWq>6Kvt5@qEw6i5JRmx0UZy&6CAXHuNAGO&fc$xMt>UdRAmU&s^tG- zaF|vmR8Y`)!+pYMgYUwotXI&TN5ZYg(5R>=uQbICz4jO?HksfnA0PmOqDZnO9$b&- z7kxphyW{Zb3K54gKyfId4XC!D$myDGC|fJif+C=}umtjV8*p8uI4aLJt%M^AF5&5l zN!YG!8DsP$Nhv23lz*(NF+4%Kw{x!GaVhLoCv^R&K=kYVpxyTAFyc8N2f2o8F+APz=QYhKYZ|m`_Fzix%y3c}&(XzjYYDc&!Mc=uQONge&?|%uI2mBXCt5r{@ExB|R{m%^YfJ7{{}!pLw^ZmhZ184eO+Z(3ow4-@9b5|w?!C6BYMZ|WIT*_^|;IcZ;!2;9?hnU z>^L332-7JjuQWTEo~D!G>1dYCj!p-YccbF4M=lhG8*RzbIh(<`NDer!YfDNg{5U#( zacDefD%%aVdC`V|WgW>`Q&E5x#)c~)Zp*-c24fm(Y=0x;P3xAhLf!)>RMd;qv3YD1 zvDLP1RNZ=Ixu6I($A}o9!)7vxWT~qV=mPqLk!>M)%%4%tcU4swCjmzW?gExLbM9)s z_mX`_J%@B%|oT}VeSsBvS>6j~bK6}W*!#JdOn zu4o*MwOIOx7|A}z7qYL z8AFqPuz|oJ`t-@O?GHxB(j%8No?6*@W1Pq$W3M2~oY}_2`oz2WC>YIhu^_6iN(0271*$1qJZmAbIM^g&72#!R!BmgF)y1$%uSdPb33xHZC#B-Q&vbryYxW#6up1t9e)amnc?Z_ z5uE{8DysdSInb=7i02w!hk+KfHu!e)onABEoylvb;_FlV!jmA)9GKCb9;PEt!Wk>X z04l^}HzBgu1;@a{YBgy=3La$uBPVxaHMl`#Wy6LyLL<*GztWJU$^mMTajUh&q~PAJ z7`f#mjN(sWcx-jeAnsee}~?TkcJ)(LsC$t&&z*YjE`W&CqjG3kQpGYsB#bZ4J9 z+b6(pBfmpouZXf+%I{yCF+(2@_t4hCJboY(+#$?)tKoArxPf!^ZEN|qh3km|5uDf! z8YI#hXmlbth|cRC&CtnSeSNd1JG0oB>717Rw$S_M6FQmh-pKd)cV{_IoTFjRtYMveBK9+`fSK zB%jWYPNpexIj7V4V3uZs<1EeGXf&Hl7t=f+zH?|xeD(M$;SppAjTI$A*d*v3N)s&h zD^yRu<%N^xH%MyLTYr?+8%zWh!nE!wh&jZ;nRjAV2#&ju%CT{`y16{xli(l>ogzmC z3001U&zS(8i^Kwyv>Qs0`Y>zoX2u{>%T3l3GSSI&{?G2-CVYN8)B%sI;luNj9q*Nnv1CG+%`NJc7-J4H{~>27?z zC;e9xq2%MtxCB}hwmPM=` zZO!1rp*BxThvPn;Qu|Y)Q4IhE`;qBCAPXV`HwLtjWq;eg5ahxbamUccOdxzq$9|0# ziuu$onVpCv;;b!|De>B|Eh6Yo@`KQ9hhr2#2;?S<=^WuRQ!NjH>eto25QQx`CJOBbNId^Ss3 zImrr=Z|OnVYXo}Lj8{r7naF-670UZw*WLehMVm_R(U`0g+%?1Ts`4^jf{|{LCLUbf z#db#}TyO{oB1q*FH;f3knv(dmzN)ok5MI=F>3^S0?6|X#L@Qf>EMSUS34Uyej|T_F zv2OkG8cse}?#Lsl+=s>fc9Rp*lop?ylr)g03giu|3Qas6hbpDRB%ZVoIP<)2H*SOe zLc-DJR?-9MG-1sWCYux?sL^)0HJ~?g_1a`IOXAUD$p3%^PyKySxXXyauEw~s?*CF{?moigjvx}BBD#{D!g5<0(qbp{w!{B z*3nq`H+-IQo7sq^h?f|s^59)EO-6Zb#OuPG1SFA`mAlcK3gvmT-cEX6U> zHcK+3%X4QWiRD=1b3)qR(|hG^jRas|i_Zn@CRM<~%GqZ_iGqKO#CfBY1uv^=c#9IF zX+#*j=M`-=rOA7-O&9`?*1{z0{9?7`dbrtjWEI-*O~0dk_DVW7wBD4BDcX1uachR}L;*ssvn9;rg6~b7r}9a(PbHYBlwMr2yAWf)YiBomU~@pZ7>K^w`xRLjRoH7d`hH3it+5v3Q$0 zjM`lh)B!$qkLcINJl*~-eI3-&U^eTe=1xW@lYiM_;!fW= zw8NaUuZ0gaGf^26IN3QXGlm~9&jDPkvH%xA#h^(qp=B0@8)EvEa7@1V{AUq)Kl2P5 zXggX_9c&Nk^it{-*zAr&^qoYDj@_J1ruK`iL9Tb;B)^X$F)M##Ko8cl6Q>n{TXb8r zZAPeDG*02RB!3_$YH^ZvL6*fMg{SM|)z!jpv%@(f5HHqF@#~@(vfqFhl zu2tKllPI@~@c)2mBZosBHZ8Ha38b>uPP{#0#WXyCJAo9r2n<5vcYiTD=F19`&(v~( zl4=2Ak~JV(1t87L;kKZ{@&^fpz=0u-<+PJ_kwB;gVox$$J~>Qr5p_7j4DO@aL0>Z@ zxD?_cASZ>Z7Pwwa3<0lgAAqWLRFs5P8+y{dC=p$DmWa8ubE6^zGtXAd_0}K1hMVVkyQ*mP^xUemTs%UfuyknL7~d!o_}-HAZcwJORe%X$B2hTl}?Vh z!`M(I)bo%l%!J4o)iPNJ$--Sx3kcI2hk=_gTdeL|4duf+Cm%4wcI}c*|;K4*|DM(}y3Fm2xRc#aqx{ zhdn+;Dli*IZvLCj$ZK9a6%$TpP7(Zm1JP(*6m4CHy!&rUf>1O7;U_hXqj1yd~!YMS1 zsHRIN9Vux$=8cuSof4jDt#O(2KWR)#0O=z&oOTgX7h4VLQ%j9rYI#uL$69H^_Eojo zO06K*=KCln_h6L4$0;20@qUa(gCR5VGNtPliW#O@U7Kra%v-c)BpUl5`BFpX6^tiq ztbggw(55~NY!!}zvBHne{92~HGiAhV${KDmE$5Z$dlQLLsn4|op74^VMqTyr83o4RVS_D~*jj8;n-mBJMh++Px0* zp1^3pckobv7z4IH=1;mE72TSeRj!G3r$zNya?t$XqLLFpSxvs!=?3g-e}JIjkAm&q=(a0nDQ!-_o8?j6~ssJ{Tnv&;t zl4;WaAn6}=q*RorxzNgHX&%6^$d{Vz_1RD7v@~OR>jPwjSRn-TaTv{Ui3hl4WizwrQ zz-}cgazxFj>} zlw|I9E&5r;Ug;V=U{CEpnwtm%$vMUtNNkeC#R*GShe$)iu*WYx|5I{lzxe#mqWaOe z7?dmQ=!@Kykx3`1%Qc6kh_dg}X}Z{|aiu~=vqKt6Hs7ZC!5$;dplG+eG6x2F6d5wc zC^-~*2}2XtMPNw`(0^lwxS`)wnLIduN(0kz67*pk?HMC{;0Op$SRq^BaTLiBAi-4|PU7!eiF65!5reiHj{C0cTOQ>`$Y z+QM4RN61sjUlg$LLnbr8{~UGl6P`ZD|HAOMdY(C0X0S4zS$}3}CJv#St}~%qtwUKO zY|%&Xu;OQ}@E!-tR{a>}84tyj5qEIJJ|TmzK;~Xjr^S!m4m8iRQgdIjP&LKc{c=l8 z9bjxWHeH71rVTrFGFpbj{>t%%#v~d_29-tMScLkFAM5gz&I1+goLZpHK6$Y59Lw`mta6uo6UR_Jv1zhE;I5A>q z4twa-+xRB3DIgz-td*v|-pUafh&A_;Xd1r3<+d@>4LJae@JbGtM6|SA)j_l!5@iqxXFaOSD7mNV)fl9NzTx<2 z<22LO+p9wgX_(F-7X=_Udsrl_70~OdNhds)#5A(M_en3b?zDcr5;PNCohgP@Y$?X0 zGKo;y_OpBrLfH8Y5ZBSr7v6Qu z=Cex+D=-<%fH|z!8x^`b2O~?r`&f0|576s*FeOWZ;^fWAbEy?UC*RNA& z_J7$B?|)-@KPI7&_B@SU)exq@97?m~1{t)}H5Peu8t7(Zfs*rZh)W+;NC2PV9TCF@ za^{+*A0C<;0V)N3$=AfT>Rp6F!-J5`^|{1eR|sj`l(Lkxr-xc<5cNfsiWl3X)NHfo z>)clf8)c6a^ zP;)o0XLS)>NCso44TpXBbv=`;Bq3qc?Qwq!|MQJPCsQyDAAIMN^y&R)A3u5a=MsyeJrmLpOg^MiwSt(!-{w3R!Tj|DE;oT}J7~b0{N@g42>Mi^ z0O-AkUM92Y(ctuWo{mS^Je?j*r|HSjbdnw)x%tQ)58Y^zzia44LFeSTAfhbd2tcAH!+U!FG2(bjCS|`tf0e{Y%8FwAZyW~kJId;@{c%_l9#)4J&sP@EA(N}f@ zF`@*#M#4bIO33+14Z?3%)HDJOGIkc~V1p>Xlh4y5`Ij~b0NF?IfYOU38HHdp5T(R; zkQ;cD`TTP?6&(!dlexnjJazzVs(MBg#jMn0CSz(|#kDsS&~M0pWuypkQh&1{kZp=q zz(#xWe9WNDtdAGM!Mnp3vmO<=$%rWSUui33e}t%ZP+>5w_$ zp~Xn4A;c%Ey@z^~on*VMk-DLgk`qR!@oI06@Z@7Hh=VznDKSn^?ZS#V*|M@j_r^{G zLQW_k3{PnlXe8ezc&4(827g8c>+9ad21Lp8;pBzxzqqk8?E5jC^i)x*V@i1+&-9Mj zUbH2Azr}v?T?`Q|Fa*L(9MuXe32i`96G(!f9wm57Sn}|Ea{R)F3`*)1Pdy8oWTZ?e zWO;BWcIxupkp#98yXJ{}<{f{koVf5jVfIIBM7%97h2T~Ut~6K!i+^+B)?}LM$AbV* zXH7u8@)&^?yKyp<4f=5hOvZ~Hc95@uA&S&}le;hQHM`2BtPjoXCBDh9sH4qw$o-7? zVeF#{aZK{P*#;+x%yh~5y^9~D^h9jz+v!b^)WYtd&hrSTHW_fIT(qXhbEb<>yI0vt zpv$t5JV@kWA(oNVDt{Fu6xR5$1fah*u#5-^62hCtVP)F}4lr|Oc^D&^H-d-5h>b79 z)-BET&7gvM=C8V!!UG?DyTHh%FXD3C&jybFnpV;aID1L|o8&3TN^bJ>WCl{390nNA z)+g=}9F9=Mn%U%;gO>a-u}IW4qAPKX&O4pnra<>txb$@wxPMa4>DLMLC?>SHg&?;# z8JFjck_*@z1govpmnzCFQ_7J2C~Z`vW2LZF`$W6F9U+(y6etK;>=DByM|3})53#|@ z1KX)51S&D!&JE;fF__;U)^*&UOlhDLZVr7T2r@)l9E7LT<8nxW+A@VQUmsoie*e6m zJS=8)#>@zJL4WX5J^5TCD_Z)Z!1SC*G2!rnETr)hO+G9Udhq8h5{!Pgni0`8Y~L_> zl+8I-bN}@QshqEo3cg1!J5DWyEtmRE&Bu^Z(9ACPeZ%=PD3GkY*VG3JB*u73ouH!a z50%c-{y6y#E!HAXwu8x`-J$mA2vP-F`piyZR@1po4u7z?5pSdyyoU<1;RuS4K#70K z4y)H?k-j4NgE#~M(Xm{UHV>o#IHE|uhKWuG_+*3;((WJ7*242dcv$=s!Mc;KP~x&} z34+$>T(XBL<$H$)zoa;!cwN{clA1J>^Ow}GxMEf#8950@cIvbYG*jm-nj$fJ?$Zd= z8G}4=PJep%U7SrPYB7?UIwD}(npvs0!qBH)i~XAzaE?C?-Ce2|*~P~jk}FKQQy z34ctpf6<=c!Ro+{DH7sxgCU9=cG6h1nA~vmO8?5tLXoNCsBc#yN(uic%j`?WIqFQ+ z71TS!$J*!w!!fbeueFX;(7th&JEK(tU>@Tt_cWLqiueKj{GQUc(_tNq_z$z_(orl^fp(8Z*Z7dde~)9K!*o!{r5X z3vUdT^n|;Z3A!ohNex3~WT6qS{z6BJbKx5*>`A%};H**NMf}x*TmCj0jHkpP7xV2) zV%Rh@wQlnZ7b0pY^})S8AflIai}#|cV-U=OI^f&KoloedVgCUyA-9coE_uN1n}1M? zz@dSUz_RddULHJ6nYNAcCUf)+BnO@ik?9P%i$>;yhYSr?STyU)j%m^yQroIV zJ5^ve6Yjapg-&<_xPc7f97IyZ^^Ruu1b~2oafVTM=}_y7;FN1zDziDftDS-+LMz?B z_)S^tVMSHvdC;dGQ|SZabGG|JB!8W{K@ngVSs?f*5urCFTSBL=U4kbA-`m*+rD@ev zW$wU{DP~as6)d;@h)Xjm8(C*pxIo;xb7yCJg2bSDfFeL6sh@~YZap84zF|*_ZxE5C zUk{TX;K7z_WBQBTI$k?DKD{Ac`{n=ePrv-@|NhIr{iC1%r$7GrfBe(0{(t;GeD&wQ z{|}%4%fJ6GfAIJJ`EP#yxBt_ZfAfEQ`A7fm%YXalKmWsj_vIh`)mQ)QfBW*^|BqjN z{+Ivn-~RKz`;Y(T%m4dlU;fqK{QY14(|`DjKmO|f{KxX{fBF2&zxeYn|N4LV z>d*eo&;RA`fBAp?uV4Ppe}4)8{PN%ar+@g<&%gTj{{(*c)zALwtAGBF|KWd!hyRB! z|LBkZ?yvt4{`;%H`q|I_+28#95C7or{`Oz}{eS)!|Ig?D-nZg0w`bJ`e*A z*Ifxl*zpRzr@Ih4k{#OJnc=pJqAWt8H{-nmR~CC|2#`_^5d`TGr!D`1tMSNOw5ctL zLkfJ1#-{Nc-`f&{M1MX~psS^5&wlb4wny1wd0yNpYUzwWg^erQ5E$6g_RJ?h=&Rd} zR9DAsU+wcN3I3QD8ASlQsa>oo>f_vxC5Hy0t|Dq}iAc)&_%*=iNg3E&>I^mJLV+Or z=+Jxc8ilSwJ;Wn5J56v6+GDX%DSn4FAsj;T*;_$fq}q1Zlz%OQ9zggXvl+72rOlxT zd%+D%GfcN;w)`?2g#a`_7u{Zb;r#Rbz{K)%#t0KdW@(neobWDW({Ni-5l+jS%Pk%$*LP!3x=4EYx~Rx7QU8Jw5n76Nok0 z`wqBhY?l_32KCZkO(3J)gSff zGz`A2r5)>bsqnQmj1u%yqE-aXcJHE)a(MI1fu`eiU^B<_BhV_y>rozHm^!s}-E(11 zwG{^pohxDLZPRVCTkn@A z*_{!1t+H}R$ZVN5V9z*u#IoE5V-qL0$!emw`m<1yfMlqGpYXUm{fq?C^+uU&z#FvD z-9R%nUt%4O!NAa-*aNtsusg$n!CIHu>qw*=&e2Q<(goet<6Kc7rqXn)+C zcy5qQ)do_RZnar#1I1Ft83e)U%sz7-a3VLU+0q{=mkG`o+~B&p%9}3d=$`vSJ>>)d z6Kp9-Szz6j5P9jLLT}PjA@MTy6d5Y3$_OaRHMG7Kf9LnMSRg(nO>|5`kDoe@w0Dkm zU`gPT+3-5e9(BcJxOkY&?+k&^)PE*(V?;^n{inKz?re|^7>B8JWG0iy~d5>RoodeuTb!+*VC09HV$ zzx5ayd67s88kb1%?EU}xj?JEV#GcEpArgNc&q^fY`){t7kMq;{sYB+?DYhKW)7fc0 zNQdL;Y&sog0(t84#97V`j7B7WhBin=687>AhQBvmoQtV)sg^ zM(WVbCQry9v+t2O2KW5rm=A&iq~d=de5VnZLguw@FiJe?J0n&{!5Y-p8kNyju_ATi z&!sqwxDEqNlwpa|cqwa9AM%o*9kaM{u!X zVH=^FM}Tol5p=fLiqcLaSW-6K(B+;o{Qq2n-+Hn}oo}Gd+tC9ZSB&&y8NPqkm~|k9 z#F4%x_`hbn+`?l!6ZI6^DQ(n`Uj zf3bYq+0lk(Z-n>ZV9iR{d|bD^hJOzuS2|BnZnS>#xH19dJ*^0cGRh#rqU3fb0dH4b zm$Rsezeubbdrs8xf7j&=X&ZmW=w*$vp(=N*v>!;6p-4Ccwe{Gddl|tVz_VA0m(YlZ zVE>-Y2~-*$M^azyo9-3RctK?B^z2^yN0Uh)5MsVjwU94%7INnWWOh4x6Bd&AEv}-+ zbZoV--I*CfC$!8p`4sYk&WX@rm8n_= zV(>Vc=TlK)ymcyeg{mCy9S=)8xs453JdA%^`z*GH$BpmO|3Y;$hR8HQAkH7p!KLdKVfLL4rmT zrj@<#1E!{XU{-thoiO=G9|K@Ajd%9y9keN{cs(s`K^w=biZE8MrW zSo=4;%PXpud(bqpVk`GL7OnEMe)3E~8dP(K2tWi6YDa%|qTrPm3!A>KMUSD6IwLhu zIFKL@Gwl|!Bj4^Bd-yb^WGfZy^UxQRd__{<<6kl$>wSa>uop-2M7Bs8aL_Xz;vw`u zzI{pV`1ox>1MB65%Rsk0a*Ki}?R7PXGGj*KvP*;91DSbcG@dQX{Q98+dpYA6K=)#I zA_Vpty!U^|Kz2Gi9?V8rI>=5J=`B)33N@o)|jK|~AbbK;-Hw;&!Rho^qJ0y2F z;@Oq%b~`KpZ=mSh>CPm$>8eaA&Q3a8qXo?RMDNwoTS`DOPxw_OqNCdg-uV!tKv)^m zjM!L8N@}>&@O&~BmOBl`(E}+4p&xcgMYuW&6o7x{J~P5GA~B@?g&Jd!=LcpLkFbf> zO3sTycAigPJReVAh_A~@Q9qu|mK;|Lxg!#?oeZ-Er~-M`KHe;EGKU4#1{lbw@9Ng> zvVH5V!PNcaoVHc_p=}$E{IlM|nq+2jG9l$tMAQm{dekW@ZU^B9$i z&+va6-+-*(crg4G%G@qa2FJsbg-d7Hx@USaTcju1kxS?E>2!KD9v->D9@fLR^|HRr zQ{UWXYn=Y0f0W23yuFvT{q}q8WgQLTcD<~3M)D3M2*;zNlc7tGC)0U4ogAH{v(fk{ zou3}f$Fsrd%uUAc-0)~`h%Tl_y1D%u-dlg?*(xP1WPZG-;3Cq^w-acR(R)cW*SSmK z-e)%oP;5&i-UnTE1;kKjA!HNxGROuG@S2pyPIQ>eI+Nz&f^||m?7(?aWn7jk+vUMl zUL~O`TL_dGn=(*7?1?0lxo;mJkqBw&cXQOW@Z0D+2jL8TBNAnrM3~up?kK9uOo)Gx zu2l(qQ=`eAro9bm6|s65KRu8Oal4O0uXsWWzV|L0Obfor9mXmI=AoS>4zQ7(%gTm?tkf_7O*D?qiY2TozY$FjBv)47KphH_NS{#O=4Pw5N>QLKye~R-QRsbX7 zc=du=9rlH~1RcNVCC|tFzmHz9oOnJydEteZQv7fe`@IZCQ~>Yws2tS3;dWt$;$0HK z07*5vK4xf74x#}EJoxC4dkbq1adr#^DuiBqvZ-2TX^R)FtT0?hr`dn#aaw;m$0c$2 z%67@p#zL+m7ZD?b&e3*`c)qz4`bT^vN+5|7;wf$^v`FZZLRfz|dmD-2m@+j48n`P1 z@`0?V-GXv1JReV9^a2Y#9CkrsTe5m*`m%S%U&9V(D-U=oeUPqOe0tVkuYoyLN&7mM zEcswOuUMU`=rB@TA_p+k!#hqez$UKv!Ln?w<|k8;v;cp%ccBW&+;?zd=^lKM11T?-`X3WAhZqY|B)BYSwW9D&FnGmd2=o;$M3=bT3{A(yAwjMK1f=6JMAeado z$_7>^VHY$hxW14jhz|HVq!D**`);B!^d#f8reS$5YVN1PITEgZRI*Mw`_`REERA;) z^vm<{5N@ep9ql@7_HAXHJjA=Rbkf);RPOn5Y)^#fJc@sm32>1#fbvOXB6(lMJ2g?4 znZ7NyNiN~gvmYjmDj-})O^X{w`o|a(9fu4S0=J*ItS&B|atfs)w4iW6^993HXlzP$ z2<=hcNXY|dF!(YePZF`Rn2t@kkZUp((t-fpVy<_4gk`t}U~f8%QR3owM^4JX{Sqk% zM=elP@rHl@#DX;Gc9_GEHDsNAzhUl@YSp{}(TXT(G|0%(2_K+%-fpA@3{D?55zyn% z4^P*G3K4D-Ga2&rkwvRv)|X{kDH2dxnoXZb?DhAY@J|VnQekc3;$E@6dmv=!K&CDl1yCz(JMy*)k#iLnazh z(l&prSv@92V4}$7V$98DdV-v*N| z?nPi^)MnP~(%!ka^SGhJr%3tW=>5J8VrN%7Uy~<asfIOR&sF6m()cr)l0n7N z@5LG&%ssZH0D4yVe!bB>IHy$Xt`hN??QF*#$1itk&$^ODmY8fTil2prj!VjD6$7~3 zNZqE}D9oz0&{@rg8AWoT(A_I-LwgOzZIgeA)cHz8)a#`SWtAj(LVFO2o4|>0jtt>U zR#H+Fh@lBd5(P>qX|wO<=#}6KW)q_A z9Ks9V1~;m#-r+2<0SPt>gNjvG4Z~r{tU@#B(++EcG`_E+?Y8!(+3Bl#eO1mq zNlG2-4k(@x5teDa5jQ*LLmB+Lrn`S9h>sMg4HD`S_2;r8YfQj9+_l53b$`$L8#T44 zkgXuh1F=s{ydjkBZJKIcWTsTApWM|@a$r>7BD|3L^m4mzURWxM}4jmW(o1 z`~qWX=x!+F(d=fA$^JNjEGLofL402n)*2X(!<9izMgcaCxzQ;KwYU*D%(Q=lwFlRT zD9_`^+(=r3>-6Xx_LJ{uL!%y@Y5`07X`0-3sENUA)Jwjby~-F$L;;JYy{2BI&auG-nFNx#jv}b=dEK#<_fOYGoW#~W=fO&#UYnU^P#FE!2Su0^Q587vC zA?;~=qeN-B$xUw=a2G|vhBUVr-c71JO7FyKluxzhXLgcT+HFiCkcyhf7@^IqDbiZZ z_G{a2umGj8r&cL;y47RXzHx~1^}(42RUk}o)}#NniVhBYtH){GcIJNz*U9kReDGAB zWkT;!pg{N0#s@xSiU``hIr;dnin`r~CMMzM2NA0bBYyd2sg(kHez^ z15RM{C(rIZ4F>9APk_w}vKLSllg~^~IR6-YN%-yg`6q%uf|;)(K_H^%hFJyH77Q<+ zpFd1~@bq!qb7c?X4v~Ma{n#9!eQfon+3hyvfc{Vnt-_}k_Y6XR6=;qxa zH%hvTpe`+}HujUPoo_`)SrXr3!DwTT%@;`#(J0EcuC6sZv+J>S<+4d@`JsirTr<#> z3(zl2GVBW3B)&AEAe_KqBAyHzCvz>T561arCdYFT;Cr#XhkWU||?4@1c&nPmA5 zeN1=bX3dB%QfTa+ey=z}|FkMT1^@p7b?7(4n;?_c+CKBy@^`3~JQN0U%>vvKHEAF9 zuFwPXirbT5xcOqSm`>8gBp;>I(+r+|>|C19N5|92#Epih@7BeHI|Y!HZBFH0{D<6E zk3`&;ydtxE2Vo=r#i}JLa`6C*cR=tZ+&j;EN)g{*+qi$#LPG?dzVRv|yd&a+_R=Rb z>fIzf@g6OyV$Srr2n@yd;jwqYuq6`lFMj_o3|FVn&CR90OvuGv4r|4P9RB{3pqCGN)b}UW2B`P3ua54 zf1-aG$zB!wB{s=Opk~6uPwDv?<%tPk#0df|hP6qw*fb^4v$vU$;Sq{~d9m+;DZ{Gv z$Qb+KADCQ--{zLYM zG&SHc;f%hdkTD$KQZ z8yG5yoG`*(C;BKYiz{s&OHs?!wZ1jf94cECHTkga6JDfP!Q$gE%){o=q3^KW(_SEC z#KrtObW@8mFF<;3iMEELz5Rq1{S|-s=6OKuc1SMxE`%7?%&GC|KMJpGO_>`M<3HL{}AzG;8fLdH>@ zUGe#|X99awg=9uI^I`4+zJL{DOS~b}yi1^Pk_h3oM@{vbI(ospblas2}!p*=h`SQbUHg|NpJ4It;? z$A(tGBzX%n3Nw?FK{=?^wS<3!eMjTS)rcA`5Va4PNX$mU<*5|mMgk9pw)9L2QD0?> z&~kiFwK0Ycexs=4(@Y_AiC=v2`Ol=R5F1r+7wsDB%4XHp^gIO3LT9>{c*eS2M$?{z zX{EGRX>e@?)Gs0YF)~b0crc=S&2k;L_x9DE)A0>-l<_GE#%S@X@31+M>N|TgBkG$wk^Q>E(bjxogBH*e31@M zhj}{9M|pZW$tP((nk@!Lr}=3<9=%gY;xT3G;PziRE(dL>Ly-Yxg-pv8V(qZYCwbia zDjrR*Q0s&6O_gFKc&vX!pFPJ+r>j8YnGmTSG~>{7?P~*D%VObG&6O5&ny7?3Iy96@gr)MP!%n+iU+H-B+{6&>&XAq=Y|ilv z0`LgtbZSr}rKKGZ+#faXmgzCGe7tU2c_HOb?3-#UY7)~g>W)klh?DU6c7bxwLyH6fHee(GJlJBz~0Q?GQj zBU4XJE)VyTsR+X0U{il>K(J71AHmTI8t)b1Z+F@b8gFDeVCbKrFO?D&K|_=#2dv~= zO7mxuX@08;uK%G_W|?CZp^rm|0gNeUy@V!6AxIkBVCqWJnC!K%bP_ZX3$L)z6KOqd zsZ|i%oH2i)J0LtQXN-dPVpIB~!gDG-PJw6NaH~IYsIt&floG>)XG#tvmLQ+qdwfoR z2j9vaO0W)}Nl5aH(jC;qSSg}gh51^B*ky(u4s0`?uSOUNxZXpK6TMnkhjkH|wnnq^ z;@$1%uh57OvD~PmgpFk_R1djFrD}`)Na=+umRXT>%!Sx`Z+AR+?oWYW%&fJc8c!7NAEtj`e4d~HFAO-97t1^X3Bb_YMz<8r*y6IR z1nH(nL-&XKITa0hk#$bd^ByTw>M=}p8Lxv95Fy|b>yfyV8={3?9K$0$RQj&XzZgT# z)XGoqDDGi50M~KUSUg9475mBKEo>M{`fOKt;Gf_w{#d)J3!&|v^Wxhy^3#!Xp+zVKx3K9%V;~e~nrp8LGMeH2-I$O># ztYD5&Iz_q}aPe!BQ9ymW>Efn2n9hHso}yZ!rAJQ zbl2U-@K0ugwCB)X7>s}Efx2scAaEJ*rIqx=)=qn8rrvU#%f*J83`~)cN z$>wHsw3131L1v*95F?MarQ2yQ5EgBRn+`7_L#CDY!=GhOP)aw1@ezN1@i;rvIGld# zxY4(sYY#eKXEMXRqAEbrkug^BV3a3!5GB5wq62jkIQw zi5h;Z;&JV_p7$m!kr#h!)Z|C|p=Tc4ZlOQvjN7)#oV)wS?a@M+rq&VrzG*ae(Ez){ zrqR^JntNSljPD2sNFE}9xrRLU-+A<~bCemw%hI^+K)ms;7e1 zmz?6gd{)Q(v8X|K11N7@ENxOCYU8rTW|GEZWNQ4zDZ1)XX2O5AZvZA`HhdBFb7DL5 z(O$I?Rf}>+J=FP1c!+AQ8B^nlh~>|I>%?umj{0^feGqF^4+5Y);L6CoV-nm4h%hp% zHo1arWvs-`m|N0C-J~X4I6*lG$!;I{SPgGCsP;>~Rj&$=j%z6?vr>(-DIVBm4;kNF z{CdF_9S)_?Mv;Hq=rw{7>knj{;p1okSuI4Mg#1GFyjikL*ou`Cx>s1dS=9g0m$}n# zgNTjjkg?Vmlmy1@SddZo1!2o4L=;th;VKYnB3%EDIfK~zH$q@(SE=rQ`g8d`ZM?0I;+a zB$HUuTXdDNuuMfpNp%*rba^;yD2?X5^DsJZ28NdsJZ8~x*F`>)S&n|&jvI>>A_+qd z5xjKQbhm%0$1pqi5h_D$ODP8j>rum!e3W4ex+e2Z(yhm!MIwd`QmqSN;7-Ivx!dQ{ zKf1@5eWv6u+Qv5$Kp|C>TbVwXXXrO0H04?lTzfJI9I_xJL+D%6Ak0C-N3A6L2(8+) zbZNcN)>PRoQqLTK#wukfx&4=0QPs2d^%62xw_$&xA{KbBF=VHbM!E^a+)^7NY00R1 z2{eF@^K@774T14rM23+*7_$3$&aZnaue)`=>u7THw&IW|S0s6%&UT9bXk6xCx>U6` z%M6I)UW}pG1FHE3kOwo~PLtogIx_xF=RSSy!j9X=$-Yiu$I3VbDkp#!~#R4ZJ2XTh8_;w*rT5CjrkjNta~}|;#S5z z%hd0Cv0CR$x*LmKAcP0V$cXV%lH{S4ATNL8ouruuXna@^S!^M3lCLN+E>nWjxQ=^(180_>PH6RZ$Nkc-CN{PXerEIufx> zWKG9qRo>FwIiOMgL2V2!$Chzqiu!-A?CEC| z8Wru_+-P~>a>x+Lv&)qD(8n`(`a5ZZF-cn54sd(OR5aY8ORlFYwC^nposO-BT4d61 zBV1k^@Ajepjto5rU$;`z{#4_MCMtw`DEs!|*|{k#Q^zoB6XjR$uxBpLiUR<7xZvS4 z57=c~;hM9VhU?1jjH<1JC~be(p^Cwp5{l<(%io2*)X*Q&NI-L@zH_pFIEfh79`-uo z(yo#qjpaD8=GH(h-Fniw6kx~`@<7ouCg9*2SEsW^WXh*u{VUV#ay_i%!KK zo!Av>6~z2jS>E$o-m`n&X|0vRqH{!4&Q-%PKjmAHU-?#gfn-_Mg+`2Nw@^Y)g%*WS z&FJ^Y*`7N>=W~&D+k`{e;xQ4bClN!+&%@nNNkAx9cZgf@!%;@9ko8JMl%cTmUCwFE zLock(lf2Uxx}#*$kTHMUW}F++6BSFOIw1K&VGgGAM*1kt+Xr--@21}Ep$^B7f>#v$ z2&DC#4Cj&`Tp5{)KPCq%zq}))#Hs|4*?FB3IS^SVkMvM{PA1#H0{A8}H94e=#kSrk z)!+$-5a8<1xmYdKhDsNhyh?~>7U6CZRj{!#Nu*(sf?r-fFKT}s@XMoKt8pdf1`exZ zS}jk+OMA^+G#IG5%u4SbD&^xc<5(Y7UXF$@m`r*!deH&rWtWv0;0Sx8C|bU+(vT*? zt#diz4p(BC)j1Pl23hV6ASR|!o5LsSGnyo^!eVHQ%Bfio@%b0#EBw+OyOU|%odK%Y}+Qx@ct#!+3=iYbDo|{lsxg1xFdvM}Y5F2Wg&e5Ya zx#Mukc(I7fPxX{Is_0p5L+ev~0*_2aqamN02UD5BXd$*r6?!Ji-eC5fp$gjjJZlNr z%Iiy~eJv4*=n1Jps>Ly0bGWn9zDaX@=>#WdD1AEgKf7Uv zh>XJ$U2F#r3HwGETmT6gcaT`Qwez;&PZ|po8W(Nf)T^J{UpTFJuz@5%cMuZ`DfUTnmsur*!A`cudyDQ&bjjU8|7JQE)MYl3zGpiPxZy+ znCg+bpd~^EDlDbMBc)0v6qD{Lpo!~(BtgL4S*2x=*X+bJ!F|A+bUBgQ<|s*b7&u3mT?n-cIml^ zS7fwv9*V!}fnj+tV>wRaN6WiUW!B1KOn4g&v~WbkORrqMOXeM0u`cgC*XJA5!{HTS zzd)FB>EwBhNhgn*jrtG_$_<}!$Ip8lM4*3aX0mW3mTXBEX4^V4H)6NRGjIOn&s%Dy7NE^eu^k&H+;^zY{Iy^nW)fObkAi=Fr&1 z2>lP0**hj#BnOEf7AT`Sy+ghkPt=0l5t>%FM$*O^;?H)XXYaj=axt4tPREO3nh%q0 zXcvFdpo=}Rx~PLt5NuTF{1#?;vSmcJa6Y_Y8SU9?BDWAn@>>qrr2a48SWSZ%3~0_%l_N82_n*e5v}^ag`LAkXPm`X&e6CMeO8 zkdsHKLRn<*LXsFGq)I338z18kwDjgb7yEx~DhAGlUy9zV86p@(>lnKKDS-t@@hcsx zs%cq8qW-+Ycwv7{ZIBaJlZ|1E*)bBXpM2s7_98X86hs8WprH;QB=U{0N2QTnW*z8| zg`*IR355vNoT$U5-gYc_$PyGIfM&UE>Aw#+62r!PFIu$TP4kfE*>uL}Y%w%>vz>pf zz@_`J+0NKZmh%75`&ZgLiw(n$fG*U3gLuJ}lajTY&pP0}Qok(9h41kIo}!nIz7qGk zfA;h){S29O&V@-QG|tj`X68O(24jCYpmcadRA}CgojJpuxrtxa6;k#T*#Xc#Q|Lfk z8nM=FLgU6BlKb0G9rcHY)_?W^oxLO~yX0q5PVuHaYH#f`wzh4Mq+lXMh7KQBN- z&F98wrTsvatkb^C@*pSQbJuE|B7#MDjumVyWXy4~QOKR@KA611B_k{fcAD_M;p@i4#QJ^7w&|#jt z(8x@NkU8pwM1Vt_+e_y#qp2yYd40WUeNGPSxt;PD-?-}h{9%t{!H(&Cw{r!P;!%)3 zZgTgc2sWCDhBYy!%F%y~XcXf~^dgETh6Qe;2L~`~ZnGFKjD|mv8 zD!Ciozi<*6IoS;rDkopqt;Rmot4;gNsLm=#kD?6_cS$8_mP}xfjCryFBnm~|NS_|u zoim0WG8{%@XEx!5=37I$8xG55oc~fnfw#_Vzv+P@ES*s*lQfvHqzagv5DPk#Ykny+ z;(1!{ef^6GY^#5O3zBd$5#F1(?g78OmsrHI2R<3#sKkKzMoTcMm9BR1di)FZcw>R8 zQ9OE*BpoD|OI*T~hof|iG(3Qbp-)pYj2j`=JCEUdmEC~`Sw?e-j-I8=xfclF`ADU3 zBvNY@V6b>zP?Fm}K{cMXSHg4}DVnlMkQi(x1vuorgH>Ic?baq|ehmX-+Q!e;HIO& zWIj)4li_hX9WM}VI~kE*@L4KB4?v^fbkZ9#)qT@9SM#%@Ud}1qId!HHvm% zf6CY)m52_4^D^X)xYYI(I3!sz=~=iE4tD<~rsyj;ghz-L9YjBQR-tyM-hIMbM78x4 z+ZztBE87Ye)Rz2_8II;2VFocX%H=c!fW^T|tXdKA_JM=s;v<4#RhRr2qzgx}L5+=w zNBdHFmne8~?b!f5u7+JHA1E}&mO&A0e~OJ;sZ}RL11tt$Nm>S_qWuuH5n|Aw9R)i@ zS);k{$_HA!pQ;YBc{x*C!0|(pnjS$%7}3;*By!I!2#LJNy8msi%?VuzBKa5M^eP+-|8rvN%yAAx$7n+PQR+~lf1wd# z&eH1bbVKha=ll~+3mZ7b>{>esa2RFRDo_ipD?-$8=WzI_^Rccil^(ThzKQVPcmwDe~H6}?V%E&H!`_b)X1L3MzK-5b@2aaZp=1sgP~kI zY5Fttz93!G`DBTe?x*A7RG~Fc!`Ve;w@(3zW}p zM8uE&Nth>|BbEl<^~L9ZcBn}g^k`sJOG1oZHR3l2FpL(5Z{9+}8?Y9*@t1+$UfJU| zPU~F-M$}K9&`Un)VanDf^3B6yuts!#zMGw@?9O<)|Hf9vpgTdS4?(S`JC z7|Z}^E5zBhX4^JNV%9JO5pMF~ey`bqFg~l0d*RyCEvCv#&8>v<{q>!+cvLrH9{dR7Z-jyQ zvAlOrlTdOYf2ZaFfVMt`B~gbLy2qtjk_TbmDvmH~seua-P@%k_ECxd^F=S2!3|QCC z&X5NFaXjjT!_Vl2H3~JMAI|~b^P~?L3C((pr zr5yd)e=Vyk2l`&3i?uaemKer(`UdL*YQunL?kpL0!N!D%#KKYzl#y}3o~#|OHA&sd z68=;XF5~7h$5$WWKY%n_qLmgO*hA zU!1Zv;|}nmnCV+mWFc4iMqS<0ddX8d<>AS9yI9Hw^sSuMa zTal`OwiK)mnx$+TTMMaMlH{@tW|By9EFgsM;L33HQLv1Lienk8jl*FQDx^ZlCWf6> zewhpN$>F2nzRt!1cun&S64Y_$Ic7F4GB_GTh{V~?m7!B>69X`p7S|zItd^0TkN|r7L%J8??F0w+H?~S9-vCz4M z0<)xBU1<1W`W?(A73BjjXyo`kG4#GXmB61W*KjnitR8B$R`eCp5A9|viW_k)93`V} z*qqdx;jr1Qh0P(@B=u%Jnv5o|r5_F{e?(!-K9?IoXr+AokRu+(Xf`n;z z$X(%z61So6rm}g5uG9oj(Lyz{$)Y&5$+go+esB(Fow?R}+E7zRcxe}k?2gOhFjsG{DuZbd4|EH#-<*v^Ub{&LCe1uxXE zYV$;?MfO-~v3T0v5C4WE;~ZN-8#JH8AAwD>1?DJQVJHT3)p9cSe4B(4sFw}Z#UhT- z^kAs)yvWh9nIpgw1PG4U_*W+JwVr(i)N1{XL-6V~Al-Ziow}$ z*2B&)o?wEu7LTLOq|A8OMXlvRBfMLkX~}HXI!u2KEIBYhljEJ{+y#a9Z9^zH z9}>BhuNHX`edrUR!?ZgFeBLjM_smt=p}3IILDDVKi!tYR&4Xf6?l`o{`P1UYs&} zx5+fa_S3o33#q8%s4fscVTAuEL&6>n9-8)MO8lRrGi-sxeEZ(6KeHKkl^(8TTC719 zDtCOANhWQvLrLW8GwGje#%(K@1RSD%ty5x|Yd;#RaJ@1DBqX)(E%v?(wiN&7B#wn3 zp0itSExNYTy*7@xf3A;ChiVi!pm0kr&RUsZXV5@ZZjng_ig$ltec7D%(U<4 z#X83H0a{SS(A(L26i#Zs5F3I>RtdCf%^!jq0Q7crqF`ho9Ar0o^RsK2D7b z<(Otxa}~tQCP&AI0CN(?KF>l}XW4b?aJU-=tyd9Uo|y6yT`>bN(Pb^79B$!HOo5QN zxSVUwe@mNi1{}YGqnE6NebbmpK28BaJWPzm;Bu<$ViYucV+&%>0cleiuBi_^*D2dz zK*-QFh1D2*lI(@o5KfVn#8Bck@-9NL4RIB11_?k6QEo1y%$Y3PYeq$@y$$nA^$_wZrWMt${GG;VNnEGdYyL!&;e@;{EC|q*v>vXkA3|T$OJf?A}mA$+CD23hd@qKY0E$% zfA}1hb|J-E@yariF(?nll{`-wI;%-|11~hSDst+n=4xmQ#rcDY!)~vH3v=p(m|cP+ zlqM6j;8#p{Ia(%|RdB9{R!5sv7;2kuVy1%!IY!mSYE&zC3&;};3QK!ekATf0i_L0m zIh(Ne?;3U93K=D!Hjv;_YSf}a7(~n^7z+G}wdIAe`Z! zqHYQAF#wY&NZl8fWNtb2zPk{$LnF;$4w@Lp!E%j*g-^*-j$yMmt;R8~hBv`uouH)- zrih>h57Cjm6`psvQDFZmnQBR-f6I1974%q~BD)j#ryV3}y)KzcH+?f2CWGhOJw2 zAR=`l0)AlLl!%I4rO)axWo9(hQ`k95n2n{%V3HXF*fj6ug%wI~k4bfhz$Yn5P#U8l z(3R6h4TN~#Zi8Sb`AlNTqq1qR`ycqFi5kx!3_g?wn2+OV12?Xe#VR1>R~p46>qFf5*W+)wxBK9oYtk z5}vaAcQfy!0;P#^a^HD<_()^(G|;))a?ToNE8%~JDZaN(N0-uSj9}8_0~DJ#7Si1y zqsO3ZvoSYfB?<&??5+K;ZWARHdVhGWgio`TRD5v>{KV~VMWR^AgSnE0h=|dCim8xa zyJnafGTI9~s@Y6Ue^;HT7%Ap}8>N&D(GarUw0GTwWfj*(8Yo~8Rhdr7c7+{U3%w4k zBQnwqZ=_9HZZ#j9(YA_!YeB)$1(lgCrV`9$tA=ShEa5UogoFfvgQ*q(ZEJAg-cKfk zZA+wSDD{(Fxs)X?73?O~1QSFp+UpL55zbl}o4Hnx*+)wTxMnG#&vZ zlKD(e*H_3Xf2Lo?At`Sknx$CNNw-zyr}dU(h^}$Is|B?~uw*CcN;#mM-s;FVK~n7& znE`j{L5axdi)(qp}lpMRwe>i@mfXl9Il_Mc|(bAz>i!R_U!WoR61}RpYEQVANO{GlgGz{qwu)*X74yS+&wxz zd$afGl|v)-ZnyDA0^GOb10vb9i^6Ra3O=yF*;_+~-6Hf+jPWdC@cB4K*dU=H)F|@9 z0vs%-f57OPI*hDPA5ygAbHuS<680!m*Elot|3%L?%rM2M_$c|pL)gi1(jB(O?Qj%# z>tVBlNStnK7`7YLsM@M0jb^v=8A8}z`g5-BHi>3M>T8X>k}niPi@B|06#$B9#EO9p zA?DUEDP#6ZT5@tw+KtV)1O`-MjBy>gH24mzf8doY6OK@s3()`ralXdpo2$ejbhySc zo^&oB!QhphGU*EA1E7rd+GTGp0axqGTyd**BnLZIh!28Pg(T4JF2GgDLhMQ9g{$>A zwNx?_3b}&1eLMP`;-Om(_8<2LXD7W!!CvpQcX%}D2fL>S!J}Ruq{XWPz#GvWEeyYu zf5>Sg8b^)la1z$rjR|)CYlOq3(+=Z$HL7*1ajW{8ur$qhgd=JbZMJq|Tc&d%=?dK6 zEAK>WDgjkiHlN*y4G3~+&9U|2k~_^1-@35j>*LWCk=)>IfPoW~XCMT(%5rSQ0+kvi z5pyc#=Stm`=w*7(!9mu?!dRr4vXnrMe^nq9S{#;|%wjOsz+|}r))*=0mImmj;O4!B zCgeH1WhaQLPrU)lEQq6q%vNdM@s;W4e%>-!oP`WE;YhP zO1i!%;S|1Y=#+Kk8LemS_0 z^Ch2lCpfp8ttG_Hev`NV#u^T1RIPT|=A=hlm`4y7nS{&m0Qe6;0h+F~>Eunx`VQDD zjXP?PzebUHj3#kpfH*cf+_DcVU_cOXH-AdqJ!BV{C(PY)AjSedc0I>tiOHD7GS@z- zt4Jd%x!z-OF5Gy;;wli2tVW&Fnvg%HM)eZ}SOyO=q92AcP^;_XYt7&ghJu0VeYh`( zYv4c$;q`qIGz49kwN8rwt*0K7DjW9CyHZq?K&-O zGpe+ttL?s0u4GUP1~^e&XoVoT570Wmfb3xsunFEB!?f3Zo_HGf3KJ2C)0St7id$!vikN9Tsxh@5})7DCZ?0e2VM zvFRbD@4&^xA=`E$@IerYIW->tK)CR5sY5HgOafje>Y|clZr*I^P0l9DEVcxHf4e>6 zHg(#<(xjYQx<%#IowC}8`HR!}xGzMv@ICjl4j;XkGBzmP&lb}x-wArN^nZ%zGRLHj zX2oi3YJ*K7wX#Cx4c(`189&Pghe6eWKv}K}tcB{c!W57WN(rXSRBFvC#%ty)D!9W% zVJ*ZBv)ueSBhzr9kHK*UpO@1M2DgU38~C#sX?|DBFb*fCl+!H1BOIJ&*QHxCFtVIP zrbE?XPn%TQ$oKl;3e8{Q#7X_<95HyH$qr05VaBLdv;8@Q}x_@zkws~)j&J6hW zupV?QcuY!dgMsuUq28fj#Un^l%0-tM7Mka@bS%?dWFJLKK{k@fV5}){WvF92S{THo zMB6Xk0tOzloOvOw9cco_iEzFfifi2CoR~$>Ip9W!l1K&dm5ePJrp`Im!{SL}xEs`1 z0Y4?pwsZ@|wxux|tbbb2rz#4z%j}GPrNHHkYX|bc^W6S!Y`wuF zaP!5eQEVj2>=-H6*@!W$S8nu5D@3RP&3+0-(EGvDWPc9!>m~SXYVTr%mVQ?tPFaS` zF(|*ZX1qC80b{&Z3);bkwILy8V{x{s6_$24Ph+9wv&&PG@&#`nh-*vPK^e^IMnTkS zv1v(co1P~E!LX4S6HUhRA`Rh2H&_B293AZ2?uD{_Z%5T0T>LlZuJ&T$;7M#7#mx9H{V4PIX&do-@4Ry_ zs6`Fb|8P(#J9HI)0AK0tM?1k@mPrA}EL*#1Kd%Ji37I8qo2LTeL%|^#4>K_;<$>qY zQs2)q3!i(pcqYB3C&C8iraF^ zpryido4DO6!Z%D@oK=yUSjiU$8$#1I9?$C+BIJ%B3Irdx&5I==gzNZ*5hgcGvQ=^$ z>3_JO9LHRhgqSih&`pQk*H?OH+NCi*UuIZqOBL(!FjJg0YK?960C!NJ)Ks9{A)o1C z(~Qt#7~&Zx8SyYX&ObaS0*6YTQ~d5SnfUbnavi=}4gNX^gKq^5`gzlX zjyYhOvgt?6HCQ0*$b5&&SU;g*R$^6l34e7;go&MNcqX}`dR@ydP5~iMTzIw;PY$~4 zM5ZRYwNn385L5*N1kMv{N3)^so;9Bup^8V+4n5e4g8O^hc2**TL5|3YSTE5Rl+5Vk zJ`+4i4^1wp=KCq#Ph{iprH!ZfwdT`}I@z5oKk`C@30Em*zt_k&U?K{%5G<_whkt|f z4I7bX4xrUHj>Y@VrhUM$+!$Q^JYb@!U5eZYqm;)-{ z5IPyph|N6)VTRXHLjOYgt)q}$VSj``I*)Sek%ZFv3hVIOhuJ07)R;&!wzR3k9m5B5 z$^Q{xfFmVtB_cuoZUj%wjJmW6XkuR>-RzF7gOcK07cI#{J86+r|%@TJ6xaV9(wR_@cA;SyGY4IxfzU)&fB zgr72Z90xSVW8qsNcr2#8c^o3c3xpMg$UaK#d)*+i#=P-*ydwO#`9Q(!`0R0=O~DO6ZgW>O!~c|bp}+X9ywy<@C5>)a9alSHvr&)3VY@aAyW?n7 zkE3?G-FnUNj?E$}SDUcIVxXKFtQze_7!T@YZ34L(kQWmGq$Ae92njhiz#f_okqLQ1 zs@~MyB*Dc_R=Vc41dGcD6WUiYP}hDYK>Mn zs(0J*q&`Vnlh*^fyj^=1?1H2KH>VVwluNM32-bX~%rfOTK1pty`)UCCuBIFyrlk}a1wibrKQAdIqHZ5VK^gQ$!Blc0ar zKQ9Gmqkk10ks2S7HobY7B+ua$@Zgj90+CXC_#>YC9Iae9`V_`aSMd_oc~0* zB%-mR1ffY(QkzUoLEUxW57WsCR0s}}T?!iQ%@xvtt*`I`oW}@u#zf<;m6gPz?~s7y z!B+o#cXu1^?ivmc%(2dM?C=~B4-Jn<^AK!Fkbl3IxOjb;+5-DD&G0V=*!VDCFP|qj z3|`p8I^pu2m>LnvspHtK_1>rFz*Fn3t;RN3QXsDC?HZk$29K@_qss}bfmiw*5&nc` zLD!hgqu696jE4ksA^w^%_vs@#)Zlj?{&bptlcRu$Ekc|n;+s(T%lRC_Fw3}$Anjth zLw|hB7t=+B2-Th^m3S4#A-_9}@y#LpB~?)-Zw}$jxGePM(7u*$a;^F-*h^+~cn(aG zw(qt|G*jWWASK@Pqx)y){oss4ptycwfILc2h?IgxW2;UZJmZP++dzWvYa;N*DeN?9 zn`AG($X`+Hp^yD8J?Y(K2wwvU7>Ee0fqy{VpRP;6TW~!d#TgzS_+OGw@lME5`UVz6 z;+=(KM5DqxfZ~PcVs8mthhDE2ya75M-L?#i2BbySE;=RX4|zTRf~`0DyZbQx{vsi4 z&k=RbfPXl(AfG-rMxwWxSK)cv>TJ`oi}={pK%Va(9Xyit_ZDZAj4vb2jk4ZY=cMvD z;K{T{$-MHoU(t*VY!ZecR_OOu=6StQga0<8po#xiZ^M7vRs6XVwJX;sAKoPy{O+h$ z3mctUy;U`mw+5QwAbyS)e;4)=1bIknm!Y=J4L-X{fi!yPaMR#I@|Bmup6w|Kqy zz2cd_OAyxTt7!pF^aL3uf+wg{F?s3R1-qsS4M~wN1J*RbU!XC*qJRqv02MVg&@%@K zVIb(ZT7k`->L_=hgJc1Yi@kF(Zt93gad4F>o-@HO| zR-)ZI1(kUn6X11~%}H~rAziWfwaSLy*!(2m7eXIishJ(IX}cAp6cup5aj4K*Fw@&SMS|OHNWYriQ)_#Pmb7VV7*< z94AxSj2``rm1(Fh2DF3o^kNxLZ+NGULHN(b#Xq6nuTxem`v#mDJb#E4Fg*s*JRfIQ z!2rw}kow+^ayXX2!R&ycoJ7MsA#3mfc$xi0wlbv-{{6e_@DHwG2sa@t;7g1cv^tig zo}6<7mV3}@Hh%ZvKL)KjFbozet zSXTl>pf4Z7_%nXQw;J# zotj_Xi1j+a;1^i|$MKD@{vK0y#Gt__)>@Qrx`21BA4)%KeWYrAAO(P-{<8^TZ!Npg zR(E@+)~I&ET7RR~EwMbZswo0J{BS*$<#?E_(o1lG7VB}!Mix6f^VJ0!X*|!pY>6BQ z_dz^f^C94jOkcpWJ8-XYV?cLl`4Ug#RF&(|91hrO%|>Zo+DNj_8<@iHvYGHX=BPyU zb*doi8^#i?wvFL3%9o?^9BxYaB70t0*ze>O{44w+uYd5jEB$l)A!s&?ITC?}K8~;0 zB0lD*H|VofIKVhI{4`5rE+|3qLi?;;!ReyNc{G86T5BtUWv|0kY<1ZjfZHfaIRd5Z z3SP%6c6E_RLTkJf8c|yVpcFJCd|#sxHo?a^M1kqZ|IV|5oOhJ=ZU6F28^Zf7WH94F z_$Yz74}TGrlZ-|Pk$-c!TvelaEcE(a`OrJcGQRUAQ`bc z?AlyuvYL=}znqNlfArkd`zsy-=<3sp^-aPDgZ!HKa++}*>>RV82ZZCsPzk9AFmtXk zz}s6c34*#@O7YFs`N83~IzKqhbLPJ5!`DVr82`(pHrrdLuoY(~GzED7Vp(>a`#Pw} z(|`UUJY~=i4v$U`0;XcZe5z+-!pX=(WN^Tr*odryI{GUV?$eajC@4MDsE;;AVD7J1 z;QAKK&0rt?s&-Qk-8Up)+DoP1QXv9pd?wFYwpXMM+Tu|>UC%V;lMjuW9=bF*U5ZNfmg28_lUxr^CsSpBYrZn~kUPQh%lp zh@71EvzJ5x%|)2Q;Tz>}2FfsecC@m&Tm}%&{rGu|N!mWm6`N#>U;H4OOpLMK$55H| zkvVcHDg+gl6H@IFv?2El1Ckyb>VF_~rQG_$r9iP8b-H2H?P7>!0XuB%$T|pL&mKNb z^E4S$oK1aIl@xL7ft-qN8`eBCg;r(R^~ZIoUDrr@0)X?eAP2xzK}W*CX{ zDAD@{r~zLk`q3b!vGuiMO3dCAD>c?>A!tqc3h<=CwVbO6C&eZLwE?2PpMR~#6hG** zrU~6dC#H23n(-1#0Q>+j1?sJ^QM1xQERO~VZ6bp*2XnlPFW@l1iCe$_JSV;MZT{P2 zc7q|h%4)Qj#+Z)aCxGZ4z!|zPy&164y)+6YvKnHsuxAd|<%Cg-Jq<+>9*L)rvy%e(%*2yr8J>AUb*R(RV-n z@Oz*9&O4|51)SLpWxRQA58u7fB*I0KKbxJKK|9; z!+$^h-futt%}-za=qI22@WW4j_RHUY_}$MA)ws)(EwE}k2s48?@jr3qgFruHH4gmu z*`Iyu{{c`-0|b}<4F?*72%3iongNFhngWLingfRjngoXkngzEAng+;o36aQnI=`6! z0Cbnx4F^gA=$9l82Q&eTmst)6N&$nHqz(s40Th?-4hKpB#g{q{2TB2GmxT`pn*kn| zArJ>M0U(!E5C=N}0hf^w2S6tW3kLvgVQy(=Wpi{cYIARHP)h{{000003jhlMA_D*b Jz6}Qe007^>*9rgt delta 39064 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 diff --git a/tests/test_models.py b/tests/test_models.py index 7e38d0b..5025a45 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -391,7 +391,7 @@ def test_from_dict(self) -> None: content="Some text content", path="doc/section1", length=17, - tokens=4, + tokens=["Some", "text", "content"], keywords=["text", "content"], summary="A text chunk", relationships=[{"target": "text_2", "type": "follows"}], @@ -400,7 +400,7 @@ def test_from_dict(self) -> None: assert chunk.type == "text" assert chunk.content == "Some text content" assert chunk.length == 17 - assert chunk.tokens == 4 + assert chunk.tokens == ["Some", "text", "content"] assert chunk.keywords == ["text", "content"] assert chunk.summary == "A text chunk" assert chunk.relationships is not None diff --git a/tests/test_result_parser.py b/tests/test_result_parser.py index 49ea3f7..4e23a87 100644 --- a/tests/test_result_parser.py +++ b/tests/test_result_parser.py @@ -35,7 +35,7 @@ "content": "Hello world", "path": "test/section1", "length": 11, - "tokens": 2, + "tokens": ["Hello", "world"], "keywords": ["hello"], "summary": "A greeting", "relationships": [], @@ -173,7 +173,7 @@ def test_accepts_text_chunk_tokens_as_list(self) -> None: assert len(result.text_chunks) == 1 assert result.text_chunks[0].tokens == TEXT_TOKENS_LIST - def test_accepts_legacy_text_chunk_tokens_string(self) -> None: + def test_rejects_legacy_text_chunk_tokens_string(self) -> None: manifest: Dict[str, Any] = _make_manifest() chunks: List[Dict[str, Any]] = [ { @@ -192,10 +192,30 @@ def test_accepts_legacy_text_chunk_tokens_string(self) -> None: ] zip_bytes: bytes = _build_zip(manifest, chunks=chunks) - result: ParseResult = parseResultZip(zip_bytes, verify_checksum=False) + with pytest.raises(KnowhereError, match="expected list\\[str\\]"): + parseResultZip(zip_bytes, verify_checksum=False) - assert len(result.text_chunks) == 1 - assert result.text_chunks[0].tokens == TEXT_TOKENS_LIST + def test_rejects_integer_text_chunk_tokens(self) -> None: + manifest: Dict[str, Any] = _make_manifest() + chunks: List[Dict[str, Any]] = [ + { + "chunk_id": "text_chunk_tokens_int", + "type": "text", + "content": "Attention is all you need", + "path": "paper/abstract", + "metadata": { + "length": 25, + "tokens": 4, + "keywords": ["attention", "transformer"], + "summary": "Transformer introduction", + "relationships": [], + }, + } + ] + zip_bytes: bytes = _build_zip(manifest, chunks=chunks) + + with pytest.raises(KnowhereError, match="expected list\\[str\\]"): + parseResultZip(zip_bytes, verify_checksum=False) def test_loads_image_chunks_with_data(self) -> None: manifest: Dict[str, Any] = _make_manifest()