Skip to content

Conversation

@amotl
Copy link
Member

@amotl amotl commented Jun 13, 2025

It's effectively the same, but provided using a dedicated package now.

PyPI: https://pypi.org/project/tikray/
Documentation: https://tikray.readthedocs.io/

@coderabbitai
Copy link

coderabbitai bot commented Jun 13, 2025

Warning

Rate limit exceeded

@amotl has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 12 minutes and 26 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 1d62c76 and ed31eca.

📒 Files selected for processing (46)
  • .github/workflows/tests.yml (3 hunks)
  • CHANGES.md (1 hunks)
  • README.md (3 hunks)
  • doc/index.md (1 hunks)
  • doc/transform.md (1 hunks)
  • doc/zyp/backlog.md (0 hunks)
  • doc/zyp/examples.md (0 hunks)
  • doc/zyp/index.md (0 hunks)
  • doc/zyp/research.md (0 hunks)
  • pyproject.toml (4 hunks)
  • src/commons_codec/transform/mongodb.py (1 hunks)
  • src/zyp/__init__.py (0 hunks)
  • src/zyp/function.jq (0 hunks)
  • src/zyp/function.py (0 hunks)
  • src/zyp/model/__init__.py (0 hunks)
  • src/zyp/model/base.py (0 hunks)
  • src/zyp/model/bucket.py (0 hunks)
  • src/zyp/model/collection.py (0 hunks)
  • src/zyp/model/fluent.py (0 hunks)
  • src/zyp/model/moksha.py (0 hunks)
  • src/zyp/model/project.py (0 hunks)
  • src/zyp/model/treatment.py (0 hunks)
  • src/zyp/util/data.py (0 hunks)
  • src/zyp/util/dictx.py (0 hunks)
  • src/zyp/util/expression.py (0 hunks)
  • src/zyp/util/locator.py (0 hunks)
  • tests/transform/conftest.py (1 hunks)
  • tests/transform/mongodb/test_mongodb_convert.py (2 hunks)
  • tests/transform/mongodb/test_mongodb_full.py (1 hunks)
  • tests/transform/test_cratedb.py (1 hunks)
  • tests/zyp/conftest.py (0 hunks)
  • tests/zyp/integration/conftest.py (0 hunks)
  • tests/zyp/moksha/test_jq.py (0 hunks)
  • tests/zyp/moksha/test_model.py (0 hunks)
  • tests/zyp/moksha/test_transon.py (0 hunks)
  • tests/zyp/test_bucket.py (0 hunks)
  • tests/zyp/test_collection.py (0 hunks)
  • tests/zyp/test_function.py (0 hunks)
  • tests/zyp/test_locator.py (0 hunks)
  • tests/zyp/test_model.py (0 hunks)
  • tests/zyp/test_project.py (0 hunks)
  • tests/zyp/test_treatment.py (0 hunks)
  • tests/zyp/test_util.py (0 hunks)
  • tests/zyp/transformation-bucket.json (0 hunks)
  • tests/zyp/transformation-collection-treatment.yaml (0 hunks)
  • tests/zyp/transformation-collection.yaml (0 hunks)
## Walkthrough

This change migrates the project from using the "zyp" transformation engine to the "tikray" engine. All code, documentation, configuration, and tests referencing "zyp" are either updated to use "tikray" or removed. The migration includes dependency changes, codebase cleanup, documentation rewrites, and test suite updates or deletions.

## Changes

| File(s) / Path(s)                                         | Change Summary                                                                                 |
|-----------------------------------------------------------|------------------------------------------------------------------------------------------------|
| CHANGES.md, README.md, doc/index.md, doc/transform.md     | Updated documentation and changelog to reference "tikray" instead of "zyp"; added new doc page.|
| doc/zyp/* (backlog.md, examples.md, index.md, research.md)| Deleted all Zyp-specific documentation and research files.                                      |
| pyproject.toml                                             | Replaced "zyp" optional dependency group with "tikray"; updated keywords and dependency lists.  |
| src/commons_codec/transform/mongodb.py                     | Updated comment to reference Tikray types instead of Zyp.                                      |
| src/zyp/* (all files)                                      | Deleted all Zyp source code: transformation logic, models, utils, function definitions.        |
| tests/transform/conftest.py                                | Added "from.generic" to RESET_TABLES for test setup.                                           |
| tests/transform/mongodb/test_mongodb_convert.py            | Updated imports and docstrings from zyp.model to tikray.model.                                 |
| tests/transform/mongodb/test_mongodb_full.py               | Updated imports from zyp.model to tikray.model.                                                |
| tests/transform/test_cratedb.py                            | Updated Treatment import from zyp.model.treatment to tikray.model.treatment.                   |
| tests/zyp/* (all files, including integration and data)    | Deleted all Zyp-specific tests, fixtures, and transformation configuration files.              |
| .github/workflows/tests.yml                                | Removed test-zyp job; updated test-mongodb job to use tikray extras; added timezone setting step.|

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant Project
    participant Tikray
    participant MongoDBConverter

    User->>Project: Requests data transformation
    Project->>Tikray: Delegates transformation logic
    Tikray-->>Project: Returns transformed data
    Project->>MongoDBConverter: Uses Tikray types for decoding
    MongoDBConverter-->>Project: Returns decoded documents
    Project-->>User: Returns final results

Poem

🐇✨

Farewell to Zyp, with a hop and a skip,
Tikray now leads our transformation trip.
Docs are renewed, dependencies light,
Old tests and code have hopped out of sight.
With Tikray in charge, the data flows bright—
A new engine, a new dawn, and code running right!

— Rabbit, with a twitch of delight


<!-- walkthrough_end -->
<!-- internal state start -->


<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKNwSPbABsvkCiQBHbGlcSHFcLzpIACIAERJuMiUMBnhpLgBZeCIqGkgAMwoWSAADAC9ZbhKw/FLxAGsqWRLoyAB3NGQHAWZ1Gno5MNgPbERKdGZ8CPRkbm9ffyCQyAxHAXGARgAGAFZ+LFxhvwT8RHV8FwVWfAxEMCYlBg0YI4ZYTFIUDAl8LylkfzcLxoVIYIhDDxKRIYZIMeQ3CE8EH1NCfcqVaptdSwRHcZGojwlBpNErPACCDCYFFo8DBNURSkQDAo8G44huABo6vBGmhmjwihJ4IzICR8vlROIpF55IcPIg0GwCtgUuyMGgvOp5J1ShUqpABHgUMgMPg2vxxZQojq0JAlDSGNQoniGCjSM93JAAKo2AAy9Ll3N5/Jdbo8CKssisAEljZBYLhcNxEBwAPSp7iVeAaC5EDNFERiVPEvmprmYejqZC0fAMRzsajwBGOrDrAr4FX0ajxxPJtPFnlNDT+NC0OU1hiIDRN1MaIz6YzgKBJC04AjEMjKfpXNgYTgC/jCSWSaQG+QPZSqdRaHQLkxQOCoVCYNeEUjkXJRJisdhcKjmhwnEuQYLyoK9NG0XQwEMRdTAMABhAAJMkADkAHEAFEAGUNGYWgOAMaIiIMCxIDJaMNw/J16EA5hnHhfJGHeMFpDcV5mNILx8CIAByZBoi9DB/EiTo6FaMYxCbLAOmQbBuFoaj6Qnes93QO0EiSMg4UgXockbBFCmKQNQwJXUMXpIlBz5UkXg8U08gYYEWXyNJkEObtA3yFVJJuDUtWOOjaWQMUJUk6VZSOBU2C5Q1QkDKFNJSeRUFNc1eHwIV7UgIVbVte14EdbcTPdSAUNqKZhj4N4PlPAhlVVKS/NweEqpuXAil8fIuPNZwPFpB1qLnIwSMsMkvBoXIpLc2p4tEJz9NuVcSAAD24C5twuTwBE1BhRT3dRXKMMryDnIjonnOCbAwslYgyDDcPwwjiNI8jKK3KJaPo1dqpYxAjDGhYxStFJapmo50sLUJNu/NbyFU3gSCFDtEBlFZFSiaIAC1KlaWlESum67oegp4EidorWOIEQSiLFDhiaArNkDRWkfZBaUc7ARVmpkWTZKTV0DdrMEQfILjotU9qIWkSC5ILcA1YEJblihsB824uVGUz/AlfwQcQLkzl6JyBXwSGumPTl0BhRFOkQWt4EU2BKkoTUMHqZAPKOAQpgIZgBaOFzIg9cHWS+RB5Z8HcK34PmERkyA5IU7dDL9ni9R4+keJLJmM89H1fWQUW+Hi2sVPliXo/8MZnDeJFSGQNoKZ+0h6BTxFoj1cTsAEPE6c7cZv0mW57kUURhxIUdx1rKcmwDSL5ZhDUbg8aJs/HyfhgnGf8FaGtAowZ4yv4OVWr3dh+D4cOVbEbAqF8ZvT0b/wdNHEghvMUbxq3Ka58hObnAWsgfAjEVprQoBtPgcxtoFT2uEQ6BhjpvyeudAwEAwBGAnKmfqK0HoETOiNMiFF3zvRoo4OilxgFMRqn9AwnplK7nLvzbBy0SZk3jonRSdVATAgYB4QM7BLgd0qFgmEK1Wi0xxKvKgtwi7MFxgcI4BAxD+A8JqcOtJwT92LkcWIpcGELXsBbA+LxUAPx0ooeALlapHHVEKIgBir6q1wLfDwgx/CTCFHSQM2tga8PpEI7gIilDLVaNHUcNI6S2h8brPxdUpHC1kfI8OE9aCH3KifKhv1f4KDPqpTajib7P0oZ5UmHgn4eDokod+BCxoTUAdkx4801RAJAatdaURNpQJ2rAg6rEEHL2QRddBBhMFCxkWLXBgyXpEM3J+UhQEGKZPrv9FYJBzT0IbBLQOhJRnSJFhMvC1R3gyBIGQdAtB7TPGjKEJge5tCLVtAIFkYoVhTHlIwrx7xQhJ1tGM/ZFBxY/16upSI9jtx1X4ctCa6pfCaieV9VejMOTiIQLXeAzAgQkAYW5SK6M/DeBIGAAQol6DcFZCQV2HgEZI1GKjdKmUoiDEDLSaFGoai/EgAAKk5XqblwdIR6PPuzLwnNTy2idokCgrt6jZIZsGC0LlUhso2XcrZm1NafBWoqTFHtra6UmgiIg2BhSYF4UNF6X8DWLQhUcRpADmlLTaeAjpkDu7dPYL0mhiDTrEVQXBTBepUzEtdFxIgkz8HTLenM+wZCvqUIfjQuhFKSDJ1KaUANwjg31FDQ9aotz5bSy7OpAtkRSUFklAaZEob2zaJXtjbgrQIaSgNu1JxLjKx7lqMwbw4hMUoDqQ6sJVxMXgs6O7QxasrlQzwJS0lwIMDkHoCqxhCIQrrTZikEVETwSgPnfU4pRwhABHneCcOtA4V8TqPgAA+oISG1QvINUts1RIjBOjiDpFqjFkR9YJwVJ8ShR76pq1/dHDhNBprtwAOpfMAJgEyBoy3GFCQUJ1sNUCrrPotU/LK0hu4l8DmWUJTUBcepaU+BuAMMgEQfAGouiqxxDaC5GjIAACksIAHkULWHwCy8YDhuBgNCEXY46pehgllt+rFHq6SGz7dGAAYtAZTwG1RNVkFyZkE8P3gltPBX0sY+MUHyNTcs1t6XChY5GQ4CJ0OimWtqn9U70BeDtjwedi7h3OCQDcBu2Jj6VXZa5yAmp6geCwtplU5BfDRyUEPK++7GKjgkKaqIowPCOjGBuwjLHxY4lAVXM4vmuT+DrBQM4UhIBhfhL0RARWMBcmq1cNQ6o1RckDhNDRZn6DMXPSxugnxMunjxi+qIVivC0CnJABTt8MnqG/r5sIzhSDbgyPgd27wwh7NkfurAAAhVWYXcCgemyK8+ZIYxfAmiZ3hstvghGyAYyh7GuOQCwm8LFaAuQrVZb4C7sYuLrbkr+pkww6LqRchgA6xWrb0AABoZH9FxUcLGcqQD26OUgxmkA4k2gAaViL6HDNZyATolp9FkZQvwsBHVEeWiBx3Cs5ix7WIICAsk+RUxQBK0ZsEQC6PhtR0RVC5MuhaXI1tgnwLEPbV2SB6TazUIgRAyYqzJgJoTXIgPUHavAWKf9IgSzF4r6OEGdP+0JAQW9R4xAPu8th2yrD5SUCkF2D2w7/DDCQ5Vooo46LcFh0thnIWkDCc2jcGjLHo5eWcc/JQ5HKPnzXeAqcw0amWvqTav+jl7U/0oaA9p9BOlupgR68QfTvWO6UIbsbab462nIfUGsbQsDLpyQWqHdIm1iFw9m/D9kxXWxpPQey6kc/P0wPIAvzqi+uugbtMvrkfUoLQRg2sqZA1fp1eG56o0ZlUW3BTxZCa2IG5TbXsmJQM2BK305w57QbTFu0KW+zjmPD2J8JQeQInAz1q2wksWAxQodGNoC4eoLkCzbdAUNnAqNlZxdnB2YLMDMYN9LLekYYLwAPdLcrBOURcrBeLsa2NAQTVGetS9H5f/cZAFAxR0PENQTUcvKba5AjLdanDFT3MgCrDwW/U8OLXzIWc3WAM0ekOiKHOYRWDwF7FCMAULSEagW0ApWPU8UYFjMg5AazIQrAf7QPAATTJERxyRciNStXsFkDuWWiGk9G2QUCkH8BokRmUF8Caz+R23J14XVBZFOAIlQS5U5QO1dBTRgG20ALVA4G5Wm1LjGCLywElTAFKwuHoBcJCKmgNgYxmFE0VBY3G0mz/RYykJ4yM00xuFsPN2yOyg1GCD8zpg0IMntxSMD0QCEMbg7TmFwFTA7CTCNAoKXjBDOCUGsFkBsywGjj0IMLVz/kh2h1uCGigG5Xgl+EiDViCIAOoNCPCPiHiwEKiEmGfhhkiBYSSNWLzywCYE/xA1XHiOpF/SZygJVDaCoEExY3IGSXoFOMWOaXa1Jk6zpEuJyOJSiP2FWReJJgpXoBSzO1kjODpFYzuiwisGoHy1WkK3qN1kyLpGyN/VuRKJYwoNG1AyIJINkBYzWnDjAHSl4TqxYyZD8nRLZwuEhJYyAwK2kHqyYJuRYBa2dH8DJKKApKhKIBikOxTRkIcK8G6x4FOFwB5NrBZJY0OMBV8xmN8IwkiCowi3eP5mjliCKEeLBDCM5TeyaKiCaPpDGA1PChYNFUgAAApogyVXRogABKC+ezQjDwW06vJ0kEibQuIoP2X4hkukJkpE2UmHUQ1kbwRsOkZ47cfIu9SUGQeQdxDKFjTafwDvKkxIVIRVdARMFkfXVPHw7lQSe44gslSJa2BTRWGgTvIgfUyAaMHwUYLY+gO4h48s8EGM6nM4h1NufNe5cYeMsQXVVuassgJ4kIKINRY7dobEPGAM3IoMgISg/5BU9WWcumWkVo9ovAVo1/KTEchQCgKuWGKA+UgxcYws2YzlI9E9SAeCYYbsLCYYFNesqwQUZDItW5VIFA6JLScMRidLLyXwYMhGSkxbETQeBEencdBwWuHUWgHUjs3M3XAss8JEQ4LkXrV2XTY8vkLoNACUGUcU25GkNTHweQcM8QqMzsycsEio6Qb7EERjSkGnTANIAYZKDAbcjovc/IngwsjCZi/cvtG4qILco0aOXio0fIigqKHVLkGorQy7OzRAMQxIY7cUwIY1cE8+UY/0c8iWcYiHWkKYqbOhQVVSOjWofswtMIVkQuTaAgZXHC0w8w7KNINoQ8v8vWekH7SgGFY4O2W+CkkPMLREW8j4F+VYNlaOJABwPhKgAIigIaDjWwhWLkEpdXF3a0d3GGDg73PhPAC4RAwPHyvxETbAyDLRcOMJAkoEeQP/Qyn+EKY8cKapC1AdH+LPMfJpPPVpITF1Lad1faRgo6ZeYnZNVNNhR/Y3fmRvZvLAaw2LYUV5b5f+IpPgafUISfBQfoxfaQZfIZNfBgDfYRZhHfc6SNYhaNI/b6DiPpJNGvVuOvWalNZ/KIOahEPET4H/I4LGSoZYqgtcxARtctMQUXaQZkPXKPLzHvXE4Io41dMEaWA0Y1caQE/IqwXjM+CgLkGE7CeEzCyAI9TKvZS2LUqDaMDIAUdmVkJzBs0IXdAcxIr5REcqvqKTLDJhDdAYoYxc3TPMw8wqdqX9CRPaJgW+AkKjETNaGUFXKYFALmzZKaSw21Sy6dCIOyprYjJQ+jeC5Ab8pATcOrL4Ey2snSHtUPBIO0eQ44SHaTPcX9BGH8phYYi5ZE6Mui22+WUUVU9gZ234WQBW0IDXdaGtEmgIfG2Eom2AcUpS+zMC1k9rfYmGhg7/dVFAvGFLTw0YAoKgNgUAigcdaOMlRISla43GijS8UmfyNHW0I2lAigyYavQxFkPyMoFQMmOqKQ1MfSiAygHbEGHJPohbRacWtaGs8QNlGwZs44e4+ba4n8GkEEeQQYIu+oHE+AUrCILin220MuilaWfEotWARwTAe4ARGBebSaSrNAPAIQjnXTQTX3N4NWv+M4IgLACSI3KG/M60eMNIKgCgN4WA3wZu0eXwNoSqDwW0P/bvdku5IKS28aemjLBYoxX9CeWucWsYGc4pRGtc/FH9VcHOpsPOvEm0t+MNLkfwo7aAQh8XSANbDbNABhlYtcx0nDZq763klkuMGkBlDtOqBIq0UlY5U8a0hGQUgI3ACAyUsm7TBhR0pi2uMO8BXLK2vtS8oaMkNyijM4c2JYyAqIfSkSkh0mEVBLc3BBwPN4oxc2syg2JoljE0nhrAS8t9VseULMyxDigWiUozLBkM8C9c03QhygD2ZkU4asSxHWc+bgCRwsskZjcisnH+Dmwg8x9/BWL/COkSCgWskrClRSfI8k2UrxfAX4ZAa0oQbgLXKOkmu2binGiaFR2mzaZwHa62KuCeEBnEAfbLLdFjLCDRSgLS5qSYUNc8Owg6OkPHFkZAP/ETLG1pygYnDWgxMS+gaVSDYSRSKuDsEBxisIZYIbE+5UcBQLEcbdVK9KnwTKgONNMYCgV3dIhumnAqrgv9cYI1ZDOxm4XhNkbANlDKF3TyiO3/QG9xyWaWIo2wljKsTwCgEkmWdAfp+bQpNFuzASrSpgRAWQZJP2fNH7Dqz+LqxbHqu1K1FpROwvF0rpUvUa+BSvJ68/F6ma93L6rABas0JatNFakfRW2y4YjAKfJ1CBYamBC8HpRgo6v1YZa/VMXpmuWAS6mpffEhGNBZe66hU/EFdlp3dNdfQNFV/p3NdvFmtSRQ9tO0TZiWH6vhdQF/AGgPGwaQPp+C62d8psPgMkcBZmRmi+exKHKnegDmw8ggap44CQxI2oBGjhgxaOMpvhykukFlMGFRF+PGH+qaLgaAKprwb2ZaRSzwv18BBs0t31siCt6MaMeOstmt0IOt6MHDAt34Yt9JhEacqIMh5GPmzQkPeFZ5Q8vAWuxgiO/IqiyMiua2dx54H1zaf15twPOtrtxaExnZ2kcdOqFaUPYk8GzSod4B1ycU7lmNzhWoUZliPGsibeuQGgLkMkKDLCSAW6LCCXClBefAcU7tVBvtfImFqNpA62YAwusA/WxjZAIQZpsAfnUQLXX4ORppm4cgZD6OGD3yeWBdxt5dhstd7ZkPN2SDcJKYtlBByNwt5AWQxgClMkwYzQ+RpyO4fZoqQ9i5uTSIRGDUDZzDc+ayy1uyhQwIyhDmoj8dcWxkaGvmSrYEdYYLNaFlOU2ofywptlQ5kK08ETLyK58YG5jRHDawl5t5x/MrRSexpY0Tj11Vl+TrOjQPXgatrpmN7j1SHuzjbjBN4GpN62PjBXfmYDgztPTqseyDWacfRLOlmfBlkvBfZlivCaqvKai/MpWa+1+a5wJvPlo1wVtawTrAbaoaxl3aGVg61PfBBVowTMBBjQX2LwPBXfQhKNRSO6+NB6xNdiahAKMFlzQGeJ3ynqijNJhKURJKajIoOSGITuMqhIHhPhMHDcxjVZc0IbxqcBjSUb7SHIDsAPRFYMQNz0arIu+gAJXGAELFMF1uP03EQ9qrEgWQY76j0PGbqmXhTimINeFmI4Vb3ydb6EWEeQbbyb07xblB3tMmYqYbasZLwg8N2b6md720cgc0PbpoVoIHgPEV1MjAVGQMVHvkPQAAXi2A0AACYyeORgASeABmRtfEEqT0aIBWVoH7wKkbgH8bnbuMcDOnWoMSj7xmJJGgUcVcAJQNgGHSD1RbShEHkbZYXuWATEsFqgADXoUIBXi55gSoeQSHkPcOD2Z+ZM13ckVJtb4itSZHngQY5YRvcYaIZkaiAQM785S5UqdJQLR9NWUF0+IwqWiWBNdFipV+MlsiDPB1KljayLwr2fKVuLuBPpKADjWONnjbjnjH7r13LgEoVnjUMAdnrSJfPUaoPGEoarw92rlgLwEoHwpP4b1PrSQHibgPcJOgLPnPrwPP+vlIJfbOYvrAUvyocvur6vxP5P5VLvrbpv0oBWaoHnq74oFoKC4eC8BgAAbSHho1oAEA5D1AAF1ohqg6pF+WB4sR5Hh1+I9FBt/s59++/Sgy/TZJQK/mAq+fDrMbfMvxgW/8JSh7e5kne7+JQVfsBw0CZgzc04KHLemT5Thbe5WXfoAIf6Qxn+r/CrqvgMCIAQGqYJfogGvQr9iwhDVMBvyv6gDZADXK6nvma6H5Y0FCRiCfloTfcce54B6gnHkhOg8qJ/IVAoh2SiBR416ZdIgGqBsAbMReRiIGBKCS4aMMueCJ+CkHFFKAE0PNMCDqw4ZB4CTfwDShRjyBaq4KNmoLGdgNwKYSgB2h2kRAlB601QXXtaWFy4RIGGgf4iQBKDtM4qoQeOA/DjZfABoeQdyHFEUT6DA+5tcSlwNKByoSQSIV0KZCsFrwW6FKOwaJEcH8pn4KUGyswJ6ps4QW98UeCFm4gFRvsx5TaNhS6wul80HUAoN1HNTktQuDSSPg6nzwSsiusXWViywmqDJKu6AzAYGmvTXpTKuAToSQLIEatKBH0agcfna76tq8hrawiUAwGnUOhXQqHD0OvQkCLB6g8hpoLbomd3cLdHnN0MQLwAqc2ibsOikGo0R4ABxRhmqDiIlNtwOeOrFp2u5iC9QNg6vNUG6BbDIgWfOhimnYbec1QJQLkCUHmI9kpI3w1cgtD+GlAFMaQCbO6zEyUBwR4g9bI0TYbnCpI8IkETcBBGuFUR4pEoAADUGK8xe7M6goA2RmCcoArqtB2jOt5A1LOnMMBQJnAWENwtAiNiOAlBOhCsTodUGnJcg6Im9TnH7GMgNDtCB6QkEXzCFhhg4qAPBpN2KEYN6A0DbsPHALwAloGZyYyPT1S5swMUhedrCCHHY0VDE5pTmkJkDywj+c1MaKtLXYAh9aklQiPhFxqEDV6WxeefI0IT6O43hhIaYWdUCSdDuhvQzMJiB1BG86A32TUOJkNFCi3R21Xqrnml6iCA4CxM0CxmZHpADAkAXQKUE+G4BMRyRG4NX0zFQAARGDNWHmKRoYBCxWYkoJCNBIwj0YJIjMdWJYZIjyxa5KscWPREYA2xYIpscWPxFnZCRJROES0LQE+jA0nvbDEen6HXVZkLXYYbq1+hjCYeRrKYe0OESTipIGgI9HmjahWt1GwmOohBU2h/4exzSZzJuwTjiB06qmbql2nYrUU8gslO2jayrhm1px84K9NemcAkguAQ4+Qbqi4p7lk0VGDNlbHRZNAUAjEdQHGFHwagbm8IE6D4SJA3ohyuAa0qz0QCOkSgXAKDA8XdymgMAYANCX7UdqhAwJL4EiSoUiT2BfGViegDrWu6YSrkiY8MMn11DEFi+bkFWLAznZHAQJQqXVKKAxTNQZCPIDwOCWCA2l+SZMVYD4HaYwTQxOKbgv7VUgephITMZCUgG/F4VZAt6fINbjNg4T7ywwV0GzFYlfA9yz4YYrpPaBCEUCLkfAqRNAlCS0JxTWPBbUeSFsJ4B8ZCdXh0lNB9JhkhMsZPiA15lJlko0JYn7RxgXwP4vkKuDQmp5ixvAFUCQACl8ggpSU4ye6zKxcFUYHQLwDu1gATciAOIZlNxUko9MLu/wXrhBPwqJSbcx2OcClJVjkBr0ckqvlwFym3x8p8gQqcVNKnlSjgElbpkumS4exI4JQTqdUEkmHVT8Dko8YtHSyJFnYTEUQO7CKIwgyOsKbIQwHFKlZepJ4B/EVOU4rlZEDLNqZIQ87717AraLFlEypBnkwYHgJqiiIRA6NguFQmllUMdH9UoukrYru6JoRQAMI+0Z+JMPHEbilp24gILuKQYW1PIyYrEOiSWkNwEKMPAiEWPTQvIrc8U5oH2JxmiDUJTUjCdAOwmEyr8LybSfjKylNSBBlMowSCgyl6TgEwU4ch2KJkCg0pLMumUZMZkvJUp7UmaaOLghQzAkm4m4H0KmQUCbq84nVm1z1b0Cz801b0euIlkwygx+XOnKASvHjtv8aMiOknBTTop0GRI+rIZ23rhxbxlsFCXwKdDiA2A4IkEEC23C7VRpgeHXFijZC88ckJRGKXVFtBX4HZpsjQMbMdkODDwSAhshZI9n14vACEtSMHJoARy++tVEGLLFCDplb4nmGCTSB3oyhngHGE+FiDGCZyfm9AZOSQDHZeBQBzgF5nXPKyRy6oeIJuYiFGksSkQ5WLIh9SXRSTA5wQ52BhDyEkiXSJQeEk3IoDDyigJI8uaGhbhqQOghTKPNbBIDYg9OKaHOVEBKCIJqgaZbQACUhSuz+Y9g6IqYJuDXpKAM8iwQAiEHjM7JBUHEJLQmwGhCQ0QbIKaH8AH8x50QKgMbQP7v0J0NwVuEtP+FW4VQpw1OVtOHFZMPZc0+kLaEEinD7KfOeWBihtJdRaMuALhjHPbmVSXBNoBOSkm1ClCsFLpFlOXOzmFMhqWJeQeJW+Tb1JQhc3BRVL3Lxw4J6aEOU7LDgLxbsMUr2SJN9m0KK2MEo/uHNNmz9+SX48RU7M7nCL6sBQXuYHkDDwL44O85eOCJglryMkVCzzOovIB7y+Af8gEkHIHHBBp5FwaoOz2x7nyMAl8keTfILrn4Uq02WkArA0wxTdFdIp1qgu1T50jIbImRZHLQlDQ9sFUG2YtGwpRAr50MUSMgD0i8JgKBU/zLcl95gQyYMSvgAUIrI7NuIC8pebWSAQxF65Pc0mC4kLIfxQ+FLa1C9LjE/TahxwmLjGPi4gy32K4yWRgCz5MyrcQS60nNK4CaAyQYrLkBfMyUDKNAvoG+hqFX6/yD5KGLkO/K/oXAUMu/SAITxiAfzllXpaCGEA0BIKbgq/McGHK4VotEE8As2muJmHQyn0B8IMT4TCkTClpXS3GTeggVQpTZfShiuMqGUeLRlI88ZZMrqReAZlxi+ZRsqWVfzVl6yxZZ/JQzOkdlmgfZRgFX6YLqAXIM5YAPFmpgOlSw0WcMixXRCvAqYf0fMMDGkCZZTXOWVQIVm0DRhysg1qrPWG5VwJOwjuuMD+pijKgTwilDfPCGkBJMQmKkg4TvjnT8xRE1jl+CUFoE24rw7nD+g+FClcx70ysf8NrHQiyADYtEeTW7HKrnZ1sPEQSLkHEiH09wtkYaFkYvDu4XogANylBARGpDEbqv8WCi2RFnX4TGh6ByqSAtq6OAiNYZnjURzq0wZMFYaWrPVtAAlM5nJGJ0qRu9AIazUJAcifAXIvXnFFqDwdsyEUD1owClVioIpQMkURZMh5bT2oCxFjIqPInBQ6hCor3LiE1FxgjhheS2WTBFZRBTQLvHaVkKlj7TRQI8+MBWBwojLT4pazqN1FfmyBgFEILOjqIrbRxYx1LQBLaLD53iGQ1Q/6dHyaUjV4+rSz0F6JFLShSgSarwCmoXVKx++BKyBsSrmHqAyVwY87h4jDEPza41KVYajA3VIyfAKYz9C0qxnVj7VRiANQWMpk5jANlYymWqtoD1i2AjY7GX6tbG6rKZXY0DZzINWDijVCgvFUYAvXV4g0okaWRGlllzjqV5CEYUrLZaMqjBdlMYPc1umvjB8rZa8Z6gjrZLwQQg0cPIQNgfZwclG+YfUWjgvNdhndM9QOyllBtCOo2FzA7GlVpkeBVxAFkCITHHAnp5lNkRkHeo/JFBtsO6csqLxj9fAthBRabjWm0gsRomz0CUHexg40A8QSYmqFnqRBNNptQEL0zPhFpQcn2YhmUn8wH01mfAIzYkBwwWauN1msUDsILE5qtNohAkEWmnKrg4KOITxkOn9zIU24inXGmF30GpFBM60KPMxh+IEpDy+8DMpzhfi6lwQ3sOmIcN40d0fO4bFUBHMAUlBYgjgOgg5oi2m1LxAmmrbO3GldbNQQm+aimiEI5ERMSLboGmLZKWksoQg4bZBmEXkTbgvC0GHaAKhqYR2oPDrJQDOkrQ3StNFLI+xWDzBvsIk35XwBpAKhtoteUEhczqh9a9hguNjDdJGL6F/QrhQMuCHm2RMhg3YMCjlVnxKAXF8xY8tIFPKpipVkvYQZNO6hfgRw5uOWKll9LFApCXIfui6QdBral8juO7QNu7Z7SK59mX7HrIYKuQI6m2p+gCyJETRHKfAfIs9sRx3NHCYpRENYS0jEEHAsbewMFoh3sbfaUW0gFRmjyp1LtbdQTQtFTCMgtt3W/mLQRUDjsSd4tMnSvP+1iN+Au5PAEuuqVhdbUa6xTRutdFbrPUn4h5eCjWl+Q4lpQXKQkTWVvtVtq/K+E+zFbwD/h/6pYusuuSXhIgq/S3dSCd2B4mtq2jjBQEmXWz1lSKr3bJtoBcgXdaoc5SX2w0UpcNYwXFVAGN2SqtN4g9TfIUxDea8yeuPAKeBKAGapIXAWvmt1X4spzlvq0bCXr01272ose89erMIGXr7Byetpc9Xa3IAgtVmmzWFowD2bI54tHXPmXz1d60tE0LgFfGqBV7nYk+9qJiqb2ErE9b8O5SnpXHMjSglmz7L3t43hah9uetCiUEvJcBg9uAVflvrog76piA+yvfquvT+4uAsQW3fbrukUBb99AGbYoC73hJrS2E/4RyKFrXoSSPQgMdel/3wjvxFycA//vCTXo2pEc8Axcvj1ErW9q+9vYaw31NaWtXdQfTntQr57SgbGmveRVX5qb5YPyd/RDtm3SLVt0Br8ZhwwB0G7ZsgRUF4CYMpw+BtBv/aUA4MMH2Dfpa9CwZf6IG49i+lvXhruWoCxZYhnDeaqOz4bGur0KlUMJpVLJHq2ujvdYSOGqS3Z5iCNcbBhZkApYpOFZh5zEnhU5K90vWlyEiDpVjD4IVZkZkDxdjSdQusmM3QfEzstxQbHjR9GFVsoJt3ha8v+OJED6McKBaOCEYmjhGSA9ZMkAIASw957BnerTptB41K6rR9h0VRWM80g45Igq/LS2ppykxat+KfaEqDLI7QFoSpblGYpIBRHKAA+wPHUYaMUB6yA+w8kYdRoiZKjRJOkI6B8A4HsjINJSHbW7AZq/GUQRw+lq5CSczCmRXaIcxFQSwCGHDdlYbLRyNqA2juTxgeI6R6b0WRqbFIHnO1d0DOjuLo6ThhilI6tFjTtGUYjmXDRwGdAFIeUqP+M5QfsMYEsH2juL6QHsn5BrCkW2ga5/kW7R0ADymgRQeMLsjRCsPlKajnKCDVBsaM85o4yJjVdBvaMFbA8lxjwCJlRLiZwQ1WXmujsagjsICvTV5qmWpDrMdjmJr/iQX8YKwMiSoTxjm20r/lskAJ+Qoia7FNHo4SG5VdiZIZzqUaJhzpoSRYwuGaA36NgaMd9rjG6J/jaY1TpwyeNrjL+WU1TAgxXZagMpiJuVlmOoocQ5SCEMMSZO+zBYy2Q1hQShPzSiyfhRVaBriPDpTg82YYwYjxPfbQ6nJ34xRXQCWmXqoJVk4UPgXyKpI4pA04m3D5898F+9ZzIRzY3dFrY7fTnVZscaDpV5bSExfYA0RkxejVBxQD6fsyiB89Caz0w6jxiiMUq+rUNNfU3Sipbj6DDFCUbPVcJ6tpsp47QBePMBf0PZsTDAg6VBVfgY7Cmr5y6p30mThUfmKsZ+ErrYTtG+E1XGeAWKslA68tTqF+2qQRM3s5qMMY3n9cKSKgtqCUMwXmhOCtrdxgYInxBmzaeUULZ5m+PBAM5oPA8UbKQBnH0220zKOkNyMa77RtS09euurWbqmW26z8WDPECG8apoLCyaLE/UoyPtuayNsMG3pFmRt13S5b6Ob2yHFVSw39cWNaNhG4hlM1ozEZQ0tH0NqJhzZTKouU7UT5RkgAPsouGqGLMG6sRidhEUAWL4GqEZBoZMcXOx2q3i7Bv5Odm2Aol6sUKZjOojgNzphDVIfxUyGE9bqrcZmBnGEaD8KhkjYuOWT0rxhFGx8zrPvF4xAjdq0sWqBSaIUWS0+/VdHuBG6rngJYhTRgGsuFY71akQyFTlbx20N9WPLxLrKvhR4D9o+rPq2tHm+rYRNkFyw6p1WyW99j+btPLGF0UEN9tISqHM3BBtwsDGKHA+CP334HdTImZMxxvAlpnwkhWEZQcfc10RxSaZmFskmTBTaD2hKcpmmwFJo1ZGlZyMxKVJLtX+S4pdqEoxtGO4msn+yub0en2UgEguhtSwiGtLaLAseUVbeSZaiprnSYSO84LGVXmwfj09AM9FLlD9SKY25/cI5OtnGRuS7jR5uqK9iKqerCId44EMEbCh0huPFTsJXmx+xWR6DVy+1mRmMos1fVqUjdcDyQ4/jO1ka6pCaurnhKMLVwcAp2moxnrke5RUcAmvHAPJ3i5UAGflLdk4rAFn6Q6L6q67QL+u8C4bp8LusH1rxcHbFaMTuXbLoPYfXnt1MlAIrc+yK/qthFc2F9VywJEvvmu3KCZUAGm5d070WXXLyGlm6FYgyEXCD71TIJnvlgobKrLJLgGHocs3AmbdWdFcvHgGUzaraATW1DgOUX6Qttm3qxispkIxTbUkUg4iPeCgb9b5AQ27BrkOvlvQZt5FSBuVWu2SA7t6scAftsHKWxzt/227zdsobhr1ABhKHeRUMNobyHG25mOjgTWFbJQXo9aTNL5BRc8hR/QHqD2h54Vege8pZcDWiGBbuF1SxXalmSHfUY4lS0Sq6gvnNAGlilUoaI06W40tKsjRoYmFppfDX5em1WTbsy3vBXwTK8nCwvkW4hUow2uDqK1WtbQsWuc6CKMoFaLxH5abUNq/0IKLktE0QH412gwtj9pQIQHzkP61BwkakYysUjWnRBL70gcRN5uowngKRSdXq76p3EH2i0990QY/aPSv3Kt79qQJ/eRKiawldMCa+d2xsVn4dw9bTmdlUjVRTKYIFQeDoE6EdXuJAIQhNnGCwPSghJ9KRiTsuVz5t16OaQIJLMuzZrn1R82ZTRpZzN51ChB4ttSyLcOiehyxH0dPTlxwwfmvLeCB0aO4N9K00wcPpodwpgGLxg0LxkiAosJCxwCNZOi+lVLALq6v6WTcaUU24+VNsWzVLT2m0axKDpVQlcrFIHm72Ksx0sNB6wPM7z9xADnYpR53E6kDjAKXdOzj2ENsGo9C468BuPmSoTLx2PfYDIbKZJD69BiQCduP0joRG3WIDr23sflu/UJ2Y4iewbKH1D2J5DSts3BC7STl/ak8yqz7X96TnxxY+r5KWsN1jkNUiIUPkDKV3d+ZLpcVlLiDL7StNNobIkAMYWYHNZGAVod3nhOPxvxKJxxN1QKC1E8EIcCzZ7H6AwThRXiZTBsYY6CJBplGe1XOZh7QwLNvvBSMphPx3KcO2gAH3couAejNK+Duc0et9oNEs+zzgV38XqdiICTQ0o8c2kn7fOaIAsuAdDqPu2qp0rdfcehksAVYVx9JN1x0hNoSG72RIScFEEsAaZ045dtHKohEzjZrKA3j3vuDNT83DwMZQokPHTZnm9CpqblL8SQmhm1itSDOlItRsiJ057PSYvnPOUlzkl2yYSAuaV0yLpLMOhuNkuArsz77iyGMPqcCUIL0bCC/xeJFDTUc5tJ7JW0XaX8XUDF0G0vEvgSg3HEVE6EEG4vhnQID44onld1QeT2HT0Qa6iVLo4mwMOKKa78EgRTJ/IkV4lTWMUBL0G+uKt8HWyUvYGL9CjO3TyDVx+mLpeUhhc7neInnCFT82i8oWsPPMrCronbW8gPVUkQbUFUWmgBDy+1R1k1+67CBrT2EtwfI02uOecpTnoGi52RD9l0Kqo4OjK1ttKLXdHkokWt8SN5GYBUQsNNe4xES18S15rUVsy/ngOkvJauNVuc1I1c73tiuLkjofc8a7nhKCz0F6E0LevorBTj+ETuJxF/ICx7TcEianNyT2lnP8M04RLAB7m16YoZZR2oweO4s7hJfV8IMMT7XECKNkZ5HFlecvCXkz2pea6+xvpcAoDT9MtGPmLYI15OnVyCwdwcYCuI8ueXkpxuZLJedWUyHOupff3fOjEJQIaHBDzzNzwUdUHG5inzycbeIWQMjiXS8nIAGEMD7NbPcUxuSmb9APkAmhdr7DgC5XiyfrNxcHAdhC+ADutDTmnsjEP9uDzdfzmPpBWyk9XSHdkpFYs5gah49/SjY4OyphfJJKYaVxBAc9FDyxtB5KAS0U5PJUF2GghdibQFnXYtAaUui58Busaj4SguMKM+cF5ncjOJINCJt6NwdxhcR1+xsLgaJffU/eAEXKZzLglNnpgcGuObxRyILE68cRfWXkX8L07bOcSXmLkX+xzF+g9Ohcn+9Qp7gED2n6vHT+sQMV9DwobK3TqnO93A32UISx7Fii86XFoOOmxfjvnPl9PcFPynugMu9V6qftfqx/j3O99kw89er4iXtL5k8zHVi93jB0b6u/qz5ttV0AeF06Cm/+rfHs34sdncW8/JvlYrLx4MrFbVPG70h6u0vpq4d2CNzT7S6097tqGOuKslLvGqTmgb3yj/W3JLcnt86AGwt1cAzbLFOqkpqjHEMhn2j0T0KQc7W25Y9q2XMXbpD/SrdtDi0i9T1udsZowCmbjEnoDfcvbsoValuvbhQK5beMravelwZLblpsu3C5tddxaCJiCAFQZUgOeoHJGeBehYYXwA6FLstjRThbN5qlDO4GBGhAw/uB/MFBO3ly1oj4nGxL7biBhBfqazB1psvFEPA5h9pHmslJ9xXjTj8wM/93oXZJYtYGVgToKD71NlFtQdMs8jvq6+HGgwJFureUFBsyARcN7iWeV+m40LQj2n2gW7TWzR8bYfRQ4JKwHzYaqG8xQ4qgkeVfgg0dR3aMs9aPSbNn50dFz0fAzPx4tt5pgY++Ht+bOFq7+Xy1ni0P13UTz26La+waf9i34W3+IZ+gavH+fr77gBQ0rZ8vLv1Z7D91tYS+v5d6W4pfO/KXLvl62O7gAYSNOBhyhh7zQKe/LjNDQ94y0WhKBJ2477ARzed35y+Y9cZMHo1KbpB9s86dpwAv1tKNCzUykqXbECW3BknfI62zaNOUm0rvNl5OiY1D4xLQL5BqY+Qfcm9I5E6oJ/xbQn6X9E2hSyQTE+pVre/1PZXkagn60WMJ/2+gacfYgVdhycUgv9vzQ92o88gW5zGBVUVWgfcprDCyU0jpC0gGtAhPckBNDfGUD9cUCa81V9TabByxcTPbtXpB2+VGFf9VEUPFpY9iFaFQCZyFUB/RlJSimoAPsItAkFpcWXDo8ayLKDKYvZQpl0ZTeX7nN4sqM2Q7wAGEoFP0OMfIHxEXADRA4x6ZMqDgD7tUeQ31GQD+V9lP5OiH60uA/XkakzYUHhzo+Hf/3XcTmaBgN8UoUQBZIvoSCjYpxAegn8hxaaQSdAZcZzBhhyzVwLulGwdREnAI6bBhxAyiEECKBTaQMFN96qTUGpxzZfmE8Y6oCBXyBZQTLUUUfgN/2hcPtI1QUVNoVFUQZ0faSFrUyyHUiDc34B9yMDrAkwJYtJbVnWTAZ2F60kA3rNlCsC+fDxhxMh9FwNhElXT7T4AcVIwDSpGdEF2sJNXV/TbQBPeoNoxa4OqEcgfJCI2tgBgmwOHQUAxc0sNr4PWmh8D/MoOx9sgKWmF1+3VaVfQ8g2AnJwtiKWAdNKlJP0zwrPbRzT8AZeoWaUILJz3BlCXWC18BRRYIVh0GETf1B4kWIhzCQ5bO4QX5kDfAWTslhFqVo9/g1zyBCLJdRWMD9hdoI30creEPH9J/IMWRDnPGCw8Q3PMQS0CdA+iH0DDA0/xMDwQvEOscCQm0SJDMNNoWrsa5cXV5MbvRQ01ZbqBcXad9LcjVe9W1RIl1kydCJWh5P6TzEqoUCcWizs8yLQEQB0da+3bwShdwPgoYQg3j6hmAmtTOR5tVMnpklIKAI8JMdKwitlDxG5X+FTQIAxZB9taQA6kb0TqRwEbQvc1chwRMnQ6RJKLULslTgOyHRgugeWArYh9LABqoqQd0kc57QlChH0IMdpjAD7JCSQYptQ0oF3kXSK91TVJtLxUrkFMOjEjkOVFAnOY/KMD1YIIQP2EV9bUE0PogcRBhmCA95EuWNocMCSEnUOla0JvRUXUtGidcwj0K+IVdbh1Zs0KWEUrlogdsLEgovJbngUGvHMNcww/LGxzkWMGsS7Ciw3bXi1owtm3o0QQ2sICxKAUuSQQDAaBwSDDZTrR6d5HX4B8ku1GBFu1k0MKApQtBfI0KxaOcBD/9+w0fTtBb4IVXboz/RXFPlASZ8LyAxg6OHDMkbc8UT9l1SlneDU/Wlj117PSm0c819TQyeVSgG0MjC2BR0I6l5gF0JvQ3Q6QGtJqsLkDmkvHb2F+BC/QNE5CfkNvVT0QFG5Sz4bQkcNoBOw6cJwj7uPCIYpsJKxw5DrxLkOw4G7FfAu8cLUiNW0LCHkKacu7e721Y2nPuw6dhQjlhNEdDABnG1wdBr0D0hPWgDK82/XnG3klIsRlUi4cQ/jZoDxYKHFACoNIFUgOMa0g2BnSJrEJNy1bEG4d4iRbSOC/XCnzW0mYINgJ9E3XWXvploWujjRaTATzv9TQ5bQl9VOQKhJMbSbAjAAbsDRGdIzXXGhCj7uGpi0QaA2THZwCQTa2tghQPxAM1APIWFdBseVGFCjJ7d4AGBTkDxgZN03PH3B0Fgo/QZNr0arGfdhtekBIc7uQlkcC/IJOAC5agalHPhUlHaHwYjFTEyeIbgS9y8jkkVSBJNnMZXiKB+icMKci1rPzxtJ2RXAT3EgoLkX/1r0FbG+tVow9WvQ8GTaOvQIDPgSPpZTLaMWib6E6M6F1BSJjoBzoy+QCAuRaKJt8QdCtEDBxrMsg0ROjEt12ILgHelfl3gJGD4A1RLAFCizTEh3Ki2RHnnId7+CjG+t6o/ezNN2NH2S7BaXbdGYV4IZsmKAhQHX288RMUKOcEsUIXyVpMUBhF9kiSEM0hRfsVGCFAzgYXVxiJzfGOKYuoY8ArIkyBkxU0MscHUvMBPW5EMYp6ftDHpBPL/lXkggdTC8xFmBECZQ9kVuXYBcePZEU86QdYFwBG4M5CMxAqDD0J1xo2jz7UDPQjmMV5wvHHu41zTEDqDEwN0MwC2o1k1PBOmGaw6sdIeKhYwNYmYLvgmdJX0qiRfNSEQoKMMAHnJ4eXhBlpNoEoE0i7CVSLHCXeIYWy0K2Xc0MjUgc+EsiBoukHcCIeKk08RwQGsxONKwy4DGBRCcQEnAibN4JT94xT4KgjY+LPx8J4IG5yMcf+AON8i6AbSOIjhEfiLEBBI0W2YYDXUMUrjA4muNW04cceFhFao+7hwjb0CbEawOpNZApkoAMgwai24rPg7iVIruI0BOhEVhwEwDeoDHiW4l9ynjSgGeO0j549aJNljo5eNXiJ44sw3iq45SO3jOhXaP3icIvCMPjW4iuOnjq42eLEBu4zoWrw9onCNvj14++M3jH48+K6EJoToXAMfCI+Lh5abB+LPi54i6OFUoiQBM/jJ47+NPitIyBNujAEiqEoA4E4+IQSt4ueJ55rSTlGWxf0blHqAl5IgCwkR+NePgSwEn+IgTn40AWhjZTa0iUFcAQnhrCSADBNATLucBKQTaEkkyATx4u+KoTEEoOLnjvrZx3YSM+VvmoTuE3AG7imATMD4TSob2g30T47BNoTVEmRP1jCWXEU8pyElCCUTy4wRPUTu4oxPd0+zbRLWQzvHiJH8+IjiO68RbTSzu8tWVrgkihQge0ZUFg0E33NhzdYLi9uCcb0Whvwp6yPtsyD4zKdvnF+z+cAgX5xdJ4kW4BuBogZzGtdCYnLRK0VgxzidBj2bzHXCNOY5kNogIs3jXoSUQEkDAE6GoOeAFMTaHCTQacuW/dIUL+1swpFQMCccFeTJJcBykypP+cYpBGCN8i0IDH55tBMiXtpfEWGjrBw4YoBDdn1BEgjogMDpROQi4FswU9HIuxNB4mk5chkd6IdpL4BYk5pmiSYJLTEUhbQNsXGBEHCqlNVJPZplaT5AGZ0RApYcByW9vDaMAskJNdhUVpl4C3D2dTkGNHDjD8UoOuIs5OZSzcc3GeQ8F7gxyNpAsA1wObVYGVzHvF1QBeRyS/EDXmmTlyYcy2MBAqRTRS4UceGCpck8hRnUtaAQDgNpAI5lCprFGFywBSkyJi3EQIzXV+kIIx1F0doI/R1gjpsJaQkTK4/F0vl/E60mr1X9Mb3qTOlb2wdsX9OFzlMaANJ378BvYGjhE2ImxNJhUwOxNxUandkLlSiVLiEKgLgKf1nFRI5xPn9OnRf0vwsVTkPVTqATVK1lLxTxINkblV5w3prIumDKZfNSbV2cg5RAAhNHQpQDtwblEsyjYZUW0AdTCiNSCDCVsR7S4xzDRMLOwzMGODSZ+nUBU9l4PYFIM9ohQzjZSljN5mMhfNdAHsQ5YREDml3JOcM/RnAVGH3kkAFeVdIGPBEDzcqUDNJeSw8TsHUh/uGxX4Q+1JNNwVRYTsHLl2A7UG2t83KTyWo2UnqlTS21UeFutv6QIh2s1jIVn6Is0PU0RASqcV18A6NLLQKNwQWkDJI5uHh0VQtmItQzSioruSndzQgsxhS3vIOStxx9GVO8S2aT7Tc1Sgl0iDlWMZpmxojMNOSW0Z0u9IfTfNPeSalw/EtJoko/EgENjY/QMGCt44nUHBTzYzpkHlEgADMrTIpAhRNAlrfjBvTP5UoHvSbgR9NxobIX0FM8QMyEjGw0jEgDw9UPf9Efha1ASSdpyYZ+FHw20mEFzjYzfOPqV0/QGQaEyuSC1RDIZJvWNTawU1JSotZQy0fUjeDRAVsZsL1KmE3U+0ykZfNLgFQyMAdDImhmIs7EudhleqD/EFYIY3WVEEEZTsUxlSAEBVHCGZU4Dok2ZX/koVcFVhVtlMuzD1pM2TPvlU7LMWEyliO2TPSKACTKMwE7ZJ3xp30ozAlSdlKzI/S2Qs3EQB8BDhiwEbgNjxCAtUrSycSBQlxPUNbA0IBKAroLCAwhoAa9GgAyQPbF9BsISRTwz+ovBnNwfkZIxJZVIOXjsD44FukmNEeYR0RBgM8EBaAU4DQBuoCob+R6o92dRG/VdcAvWiB6sgc0VAr+b+V9Uusv0hsEpcLfgAUTEQ2mYFQECsAik8GAWBwMcUbsGBRemb5DfCvEZYBlFuAcoQ0dk/cLnpTbPDPyZSS4qACPgA+XdnJtDssvBpFrPAmMqQkEZVICygs4Gmb0RsgQGLAQge/Uv4t+JaMp0IsxxP5DVDOgU9AzcVcTNwPsl7O+ySiOx1SgY1IyLjU0U7ym0pGFCKUshgwXlTDBofKrIH5wBNFPpJN6bgFtJs4J0hshPQeHMB8/bKp3+F6LYcVnkpbOK2Q1qw0EI39+1SrHWB9QtNyDUHhLlUJU0c0yB6oUcocG5yJRAkGeAgdE8iRswQFQPVpJwG9N+tTma2SJB3syh3lJr0COVqoMULiRYFjZdwW1h3iIYFMQHqXkQsR8gxyKk5eYLZGu5ogAcSPdYGSADekLHVoDiQrc42TUgQhBKXnZWgI+DQTJgpaQCN2uF0nKzN0ujMFhlgXj38Fbs2jJXVdsguMgjzs4uJYz+kJCXuyQgQLPlJnszflezQcogS+yklX7JEiosgHLpUgc5YGsIyso3I+MbKfJOUCtBPHLqkAswDLZFe+PQ22ETQRWnh1P8SrKgIsc8LJxzysPHIJzBebCRwxSchr1h8ZbX1SlSN7QNTNM3BDnLZFHhQXN14+cqIUgYeckqE9yMkYHNDzoYTIXjkJoOgAjywI+jKj5Y8oGXjzEEfzOTzHs1cjezw4XAX/5c8vkPllxIvVJJz8U95NX9GcvcHBDXBdnJyt582wWZCv8iyGXzq8Wrk/y2/E3jIoCkmV0yFoc0imRtq8hyjecbeL1XrzLcRmFXy+oFvJ2oUsEo2F1Bga5K7zw4acHxTcc1kH7zgwInPJAm8yIH3UKUK3mBzYBe/mt5w4RvGt0wBcLMbwNAB3n6ABATy2/4RCTLlrzk8s2nF9UCsv1dV/+QQU/5azdPFpSSbaPIZS7POPJaVxqcgAvz9eHC1SVwBISOn8WnMSMe9Acp5kvwHswNG0Lws0vwxlnqBeyNZRQ5JJTwGiTeQDxZaFguExIFcpTDdlgfPm75DqN7A093FcuTRTyPVwpoLeJVsgBIiCzQB7yGcVkFVD4C8ig4C38uZ0+T1kkdiz5mkhEm3dmmJzL1VK5eb2Jz6RE0XXQ9ofjzpEPIEQrJSU4rgRQJUi+XQ7AX5NsBiKIAysAslaix+AphR8NvNLQ0kDtTSZePT4ihRylAF2ByNsyXwFA7nUIHWAJ1AdwLDK8wKnhyts14KDztdD4JjzGUlQt+DWWfiTYzXqe9Uu5xSdtSLjT8lpQozs8JyECF+0eVjQFTC86jPh/OG4BCzsfHQvJVbvPPP+zn8owpe9pI49IYLi89wsoz0YChykLOdauncF4guXMtDJ0cbJJhBi5+Akcg5HgroBCU4zgKhm5R6Nmz3/GBAKy23FKxIZrSVkVMRRIEF0GyWABrNmQmspbEu1nSdYHmTIAUmImxHIlEr8QTkh7WDziCx3DmAUWP0LGKW5GdzUgNgl8GxKGRARziD4bZYHBSuMiWDcQPWRMEciisqGBw9pAD+U4R5sy2VhLuCT6LKK4oEQukQWbfOmkAn5TABSxEyL4B+AXXUwWWzYYs+TEFESr7KZLcDOmCAzlTOnHmzU1DpmLhagekqgI5RWuRpTNHKPIYyvgmPmOLfgwx1ptfi62Rch1S0oFtKBAa0ljKdo8Fl4RWInKxuLAkPzitRHisLOILuI46gMA0y5vVYYb8noSPQH8wYVn9SNSSLcTXvevAhLQiksxWhKAH8l7ZvMftkA5lVJTXJR3tUwV/sT0EFk+A5nDsDKlTBCfJx9IYuDXeB2glQESNzxINjsLxPNBlwJRFEQqwDDRGkEtBdYe1wsdOdDVU8IjnHwmjA4sSegb4ISvJPOCAULUpQBkgcIFlBdrELAnhKsaZxSA03ZEPVIHGOvIRYofe0nNK0jJCkzJj7HMlCjNofqFRL/PENO4wkpT2V0lkpcu22k0makmNhwg3lzchvacDAnJgSVYGg0YEah1j8zrZEOzdX0TLGPcRCq9PKIISU0l+TywaCoBdQfFqzpADPRc3xlhaOYtBYmpdt1ZJkQnqW7lKsDANmcdSn2OtBoK+wITJQeTqTIrKiZEKrIvZRGREL8bEfG9omKmdJklCUWw3oKmK5EKf0VXKIGMo68zmMvLaIx6yGCSGGsDy4NQdjwA8hoISjWCzmfgiOCKAmSjMMaOKgNRtrWDTwvs4ZQyvuSEQNHAnLkRCnM9lbhaLkntAwaSlCBxYMQMRBQESUG0rpAHtG4YSK5XkZRwlLVB7w8Y9JQyw4lLCgHVtiO2Jhc+AMSt/CTmZAhbLc6LvV/tLMFgEgxp2ZR3yI6NQsnXzAsLfO9yblEWKmLJ1OUCbo11SrGBzCw+ODOtRC4wt3CXg0CJqUj8p0SDKwLZlPgRQZVEMYLUChXP14NAf/NYZaud7N/t44NuLuwcsSJEjhgc2ZMztM8tL2vQj0LoSPK3kJKCATYNQ6tYZjqu6LNJJQIAxZ8+4wlkuq5vd7JC80AW6sTL3iR6tdA5hB0GwiKZK6veqjqk6vuqxAPgR1JnqnATQkuUtnFerixa6qREvq8Gp6EPY7gGhr2ZEAzqRLtBGrqAQam6rBqrwtGqhqQKikjxqFqnoQ+qvqpCvSkEK5wDhqxACmqRr3gGmppx89HaIGMGaqZVxqgat6tvzqak6qIqdo0oOZqCa5GqFr30XmRSr0JPmsRrxa1mslrb82mR5r4vOWvxqBa0Grujha2GvVATwMWs1rCa7WqlrYa5LFSxaAA2qpqta20J5laZNmSSlLaj7KNronMcjsV8ZR2sFq7o8Yk4MtKi2opkk8zQqC80vYso+zQC3Qu1T88j4sLzqy74rsKFCY1DyBKECBW1K7AjlVKAIvNrXHzpvJ1WxizksyE2zCVGwVDVQi+KrsDPy413QZgdHvE1NSjXLxWNRBDss8YlnC4oJo4SKZIw5lyAlnMJfC9wCYENpIYWtiRYbwAFdFPBEEoQIUuxMPJ0oSVF7VgU3WPJS3KeWBYRMlV5yJ81nQmnbrrYUsouMtPCWDrzUlbejYBWabsG/cNTb6KYVbyjhlgz96LauGZ6KjcxhdoJb4HNj8bYuEdckyCPy8Q1pFesgLO1OvJExfKmW1XKLfagNBSx6xiCAxrzW+uZxP0LWIfrwQQGOoDnA683+MUgPwN385CX2koZFrBrI0BRcXoKgIFCG9MGAkeNYEHI+AZhFLT8ZPUpqzmonBXcA6AkQoE4D6i8uPqdqAN3SS8gFDz5xiMgmLI903SERhQVAkQr0q2G4STZBxWAVNedW62Ok2cw3bVUMqAQAFNKA6jADJ21y08en8xhIVzjCrvA+uFLr0U7eQ4Lw4B9E6ZAqrM0Wd6PdiRY0SKYgiUJclUhPpBPyqfD7VAQFJLDQ/SnbJWK9sxjO+CHPaaouNZqlAv0NLcZPKWquctL1WrNasOv5ANqiuMhpDcKPF2ri8tGQOqFaz6u9rOUuCj5IPao6sybfEnaLMIl6+xRnljqzr3VrKap2uRr8m4dzpqimtAGWgSmi4Furcmm6u9q66umtVg+SMpsBqY7dJrgMCUS+V3rOmwepaaKmlmoybBmjprmEsAlXMNNWm5GvcYdorppZIxmvpsNrFm5VSaaKAFGq5rnM8Zv6almzJS+r/cBZtZqjmk7SASA647CL9g60HPm8yymfwMK5/T4oZURQ5aPciZoFJutTIWVTWzqqnSW3LDOVAutsEPqwQS9VLZJyTNwwFd7Pm8+BOSCqMaAIlOU1wRcusvLx03tKPIC5GkQRb7g08AXISG04LUhogP9hZ4r/CWBGCJwxiAAAWUngQVwXeM1i1hXa1nzNIQdOI8UoqySBK1Qq+kDbBV7Z7gkLuwfyK+hAQbTCiBaWlBR7rIoHgTnYQgGFtvy4W5DB1EayOEHBEPsAIjEaXwJVuPK3ODsutJrkvHkOAkAMlrHpnSGsFPBR8APOBsAPcsHMbKXT2HDA1dMKtED6RWdLFc3FXwA9lCKdj16NHI+dnRxwlOvPhK7Ww/JYaXVPxKzJtwdYD+jq2YEJhZePA/NGqAy4/PWKQygx0gAc/ckO+aHM+5u1V4Wo10Kh0pAMhEN++Aso+qQ6h5rQNM29ELrLhzSpsVazqlVtkAS2jWpuag6ostzbhYeuwJlrmwLMDRQcz23bsXi3kPLLnmystcSvio1lrL8qPB04JjpEYoTr8TTaEHbPKjpRFjZc4XEwLEfVgksa38W6W880fVsooZTZNXOcKQiQ8n+IYEfTl6JTSHKnSI9q/4qla+EBKtsIcbP9NaNN/PCK21jc9NhnJZdG8R8TKdcSuUIpFQ0C+IvYg4ENNDyYcwGMi2ZEErptq8ECCUu5KRTbgFyvtDe0yqKpilJVK3wHoCg2M3GiU4GmEFcpRtZ+s1BSUR1OO0JGl0hVB6gVKEg73XC5gMrHnBmk9AHAD0wE5COisxKByc3tM/ayKo91TEOSOyhQaJSv4CyJ+LUMxyVgO9iu/sDBSOB1AUGwgpkt+OuIP8TRQXes1JQOHsKfpf66NJEbNSysEbaTy9exx8qiIQiNAE0A2El1Pw7Tt61bOvYVE9PKg+uMI846PGu5ada2DMY3taBqgIDPShGHNlsMuEPIDK0RzW87AgTjRbclFHC8Q7ytuGCi2UfIm2RmK88qPqSzchCRFXKFgD6AGHEzB7RlXHA3RdSE8pI9bzeS9tPsRCsjvTlp6Y93i7ruYVvW0zTbZgMbcM8aRto5EknUoQAPBBR+BVqZK1rrv0fAFkBcqF5joznG1/B7weW8KtdbNoTlu3B1G6AUTatdM4sUL9spjJ+D02kkOfbrZL0VbapwR4QHbFVeGWK1WNLRm7ps2ixuyZ92lCzGK24noqOLmMk4vcQ//AksLhSkK4rggCy0HOFtHm/Qt1TXmvjNjqPmuSMXaBYKru3zXLRRoCZOc/UFSKXI5gl2dFY0y0Y7MW0rC7Ks+eYh1EzgGgFylyUcctP08exIAEFngIwBLFse+bCJ7I5Qjg+YpMM4W3LD6SlB9MCIUGShQkqEBuqiUWt0rbgPmBGXGBGuzSSgBIRS1BirlNdCgEzoyeYFgR1tH325L5QtjQ0ATU91VqoNGeOP8xogFCASTqbMqNMFTqh9Ck6j+YUFJBS46ix46jelwJiiaALHD90yIuaVVCqg18oGM3223oYp9ekM0GBXrKAhglBgbYBJ4yewnuPtieqxQu57Ig5LzMpMYuA7LJ7NVxNjPMRc0QCJEPGFtBsiQBT2qNjb9o4oWe8uyrr2Ggtuc6lfGnHdM8gaOFi0UGmKMoCyrW2G/9QPSNq9DOiTQB8IIsD8Kc6etdSGx18+tkVHynVAgGxUGu9lt0IXtGtHFgYKrDNi7ZneruKAfO0pDeMiWz41QaK++WC/bnIZBqOAq4HtBgq9GQAq3LMW6Pt066+uqQDJimdnTh1kXRgW50KCDEgCh7kMzyLy7AiRyUAOu6GMtin6hft+Qb7Pro/08AUo2Eh/GaCk77G/XVX+E+OyfILFVVfixRMac99uosacrOq28AW7GKcoOyhNsdxdKozu9S7y5+WKi3TKIhs7m+sNkhpsdR9So8xsa7hS7xSFyqpBsW5brpS1u3xuDKnu0MozaK4yW3J6SSSnsD7I5ZlpTM5XbcvidVabXvDLMDAPtSAg+/LhxIxjOdg7K+BxUgEGJbNPpEyfuhnzmaLHJaIp6kW7JpZJwDTiuYH5BnNsVylBpZqf9lmweq0HZBtNMu7+YSpuFtlB3tMTK8BkgFMGwyuQYsGEQKwYMGtm/wCNQnIa9Co9vxGEG/FCSRwaYHwy3QYlg3B1yxsGQBuxS36fB2jDoiKwAIYapTB3tpwtQcnFXDrIs94sMLo6ydusI7C5OtPLIWcULRkwFNsJOVxy8BShx3lJ2Xaw866wQ6VwWkJta7soDPupwc+lDoyMIzcBp9p3kEAJOMTlfgNAwFOmLGQAAup+ohTRpTo1cbP68rTwc0Af6KGgKkvgDtkglcEX3rQsw+svKIU53JqzQugYcgrp88+rEBUYUiqmd9h+mX18yYMDIo7X9d6L91UwrMJTCNFagpMwylZ+GBzRGks0Qbs+LTJHlCeIzLGBv5Pqqr60bLVvI7VqHYZvTHQeEtKAJ5F5gAyQww3waCHYPIB4bhcowCWGvxN5SgVCh4BsyCag1cEhG+h2LHOGHAuqCQUDiE9rQVmra0iqDEXMRuuHVqXYfuGNFWcLYcnhgxWcwuO72kntMKrbV2hJh04rZHPMVNxqgBG5/FIx96510vLGR7AN6G7hlj3Hl65SgAAyffH7Vth5w1MPlC/lGeX+HQVb+RY9TFBigRG37TEt2g0R90H1Yg2iIuMa1InoxDaHkbM3A8sAGxpt6nQGuUbkG5OEZVGY/Xcz7UJNcupnMpZTxrzjk28ase7Nuxzy2LchtNDsKbgXHhcHHRm1yFZ1qcfEEcN07UDFYJqzPzK5Pu4ZG+73spXrNTh24SMfziNbIf7sYxooz56xQr5sjLDZNOtEziCd1LzC2UoFvzqNAD0aLHR5L0UhbLrOVtbadosTN4F7IaJw7B/B0FVRbWhsRsQa/Um6Scy7WC1sVpIcCs0xLolHQwGrMG3KAHdSgHUcsUu5dGHMrzYNNV/59RtYYDgU0uZXdwSgXzKMw6PZ0ZDicXND0+AyaqMQxtcqndB0NGwmVsSIBxyptdTmx+00dCehajLojOAtVulGZx2tXTSnDc1uwKSYHcbIyxpXcd+Hr5OMFmyj+GFS2Vzx/ExTSE3CKTnSPW26VFGWIBURsijQeet0wKRZ0eeB9wwoZhHOONlsp9tQCKW4G1If1NxolsCgA2iaJC91azeY5whmgxXa3qbSE0+Bt+j5h31moGFCwMojH/GhLkTzh/IwALHommIQyG/sp/IrGqyqsbUCV7PMwlyduyErCG0hsx0iGxyr4dAzckLKAhRlgZPrMdPKxntRoDWtkTCc9wGW1xC6h//NALW7JnN7GUBmyvsinEPpw7LnzLk3E7k41hG+IRHCPRNKle/mARgoygJhkaNnaTuysXnL/1V7wQeBUoYRgpzPo5+aaV09kiWv1IABFLyoOAu0I3PkBqHAxpyQkfaHztbPkB1s8rPGJlpB7d244dlBdZcLsURlgMrM/4yJ0BwUxowBHAwgdwTgU8F7W4THsmUG890VoRu8iWVpXNaSfAjaB7MYuzVCswbGwEIypp8m9wMybFUW2ymr7bhEQ6pibLEvMpUmeha7xLG9CnVOiyX8mOtsL2psIF1lbR2tobGnKNkRb970SW0rgrhaJROL2x6wQXzNRPsZTrkOSpoQZjBvkjVbYdDQJ794fOrEhiYfAAYBbBWnaiRnVPOoIuQcbIDhvsQQix0+9fplkoCY16sQXCQrSnzxHorDTVKDZou71PBhbuTAZF02VekDMY1RnwXOScfBQG8AsB23zSA3mJ3z/asZ78dIoIS+VuunD2TsLeGZwsNsvKBFPmEqYXeJOS770Z8ie6YXee8IHkP8omYL8/AZRqNGzsE0dAczR2es2gLRpoLom68s0yaLEgM+UpTu5RbD6YMgg4SwBqeDQAABOFabGqQLVNoYGqbb1A0K2206dhbwCv7vumC8ysbebgemsf5LPmWdsKpDEBUqXKIZ15zEE1/CfyZyPJgJWBbuVWuS37GhyNVshGGsurajOEV4ClVL0f9rBMhJq+oOCXxZczFRkYs6SP8zytJSGMepwybyTX2miHcJWyoZhgaV0iFWE66ejMNlgR52TGdLgzH0kpMIFM2JuHncz/wp1sSQ/yTCKKkAJsNuAgF0a75dfzHADJUNmO1Aj07jtgDWgnHT5c9gvgMQCCCqHB/bZnPwUT6sARAMoQkpOG2srrZRB1q6NAzObBD+At8zcqYWVuUPHImcsDvNRFOM1f7yB8xvRbvuJ1ts4IqupOiqeB6VOwC0AZoc+Hgqu8sOGc+j9yNchqOQDxBbhegGtJTQYiW4B2mSewmM2ULSFHgZ5nIjNNftV5hpha1V/1HnMUFhCAD0bKrW2GMkzDsYWrpAYHCVxjPZrNFvaXDrZi1QjlHPMxihLGyAEwIuCXk0bUWFGSbFUaWIl4FwMYMQJEbh13RYc82fXMSOwoW0NYck4Y2GAUKadNLwMvgDSlVoZBdul44JJISUxQeYE0lzPb6VDHvGtabkmYIgJs9B1JQyfrLjp8Js2zc25O08tNqhlSSa8OxMaOdgahVvALvxHwEdqYh00AowUlxJc4DVBjhZ8HuA69Aq6Ml5Oy6EIVdKV4DGmowYkQdo3xjoxCl9f32mslmJwOaElopZ2D7tbJf2Jcl/XhhnNBppZ6FUlukKpx2llaE6XjsIA1thBy7ADKlalrOf2nKHGrOmWGECHPkERlhZfYAll8BE4Mma3pbmailoWXSlZR+2RoArmpSfzLL8/tveyPR9SbeLNJl5pyGY556bjn46j0yTr5hQocqpGNLxMNkJVMEo06a61vo4n2PLoeMQyRHkYbyb0HIoiUl+3h2E72h6Nskn4ws5CIWASXYf+EGDJzI0BbxjDMGHxSWUdcDIOdIlD9IYvzlAWSi1bOfpp6xoLLToBIUZY9KqEt2+S6cfQS5GT50FcJBOUuxM9SliP6nmdS3aLmWS8SLgCqTDMzpOjhtk+JK2lHJIk0ZmFkwV0grd0+bq5I5PCdk6YtQ/TugKYpBmcnsXwFUBXd+VtaUNHIM/9Jj8Rgs2e4a9GpoNv7DGyuVtHTGraisaJYAzzCQHRi5iCK4eWw0wAwqr1XxWdQEoAyLDgbdzhlUV7Io/Td3bVWN73F7bM8XVu2SZPyA5qMeaEUh/tuVUiUfCwYMHE65fLHbl6OaB6p2x/HyJXOv3n5h0jB5w7KV2no1MIiWdSJO5HhVoGYI1x5H3IM7aSlqpSMfG4LRYFCLnWZacguMwmgEYLmZiBCBd6k4iUMFwNmoBhwqejhBzQo2W0mokpBDNogU6odzagd+VSRWgaywQLAi3UNk7WO5bXm124Qdflhh11oDKJrk20FXhXlKoYjkHcw0yhTFgrFgTU6AxupxMwJZIoyqrekqnSB0zDzWAberMoisiJMQPGynI7FkyDSTZKeYAqYEAFa+0n526TfmQx5YujWU25QrTb41xSasTlJs5dOnk14WzAAt+jQCEN6uTuzLGe7LNe0mQczDcCR3GEeFctcN8OYI3PLIHpsK8hl6dKtfad/2cCCRjYGUVTdfiD1BqNuKwSSg2JgPqnfkcAsMILgkwhNXWWqNI6iUAEpavnOF7gOTmAwHiVvXHOchFJgtBP7XeZxNtzpWNi4dbP8K1UQxb6x+jBnws61ISdwKhIySPuTtk5nTEWKRqlbrqUkNg7I2LA5hNZOXvu7DYZ98N1g3TXiNisr0tYs+5esJnUlzoZ9dNwtYMgIMglkrXT1yAB86QiZzHrW1IAkf80KkFHzuxJp39rGKz1vjeFtWgTjZwwEYaUj5IqSGgADwae9erbq6YYykV0fiGKbskKYMQQV64p8LTKIXkoiQKqh8ValHwVelwX8xUglNHY8eIFCB4gcMFdtzZmwF6f/WRHGT1K1kKOdZfl2Rc3sN7aAXIu3Wn1khgNCStEoCwQNti3pvsGWq3sFieOziLQBUwO3qO2vLZHE0AOSyUjK2KmfhxtoXK0qfKmSzT3rfbjlbDmu2yiH3q2AtgUUtrgkJzcYd8oS1mCi2TCNSwtJwtxyYlNJg3TsKE5t0p0Ir30QoX40BjcQd9oap+DcjyvFmNf9nIxpoROhAm6C3xNdimOdtVDi2NeJ32iuPA2ohqAPI4o8xowAazsQbuFTAN6c8xTywm2QBf4At0doB66VTftNkygN5LyyKtm2kILEAHy3gBRgVMDwZcNsXeXgAAAQkByeLYH4LcZ9wUNaQgMABSwocQY1aAhAQQANg6JZwOiAMIW+GrpUwPbBdhaQY9c2hJlVYBYR07EEA4xX2UVagxVzG3cSAXwLCAIJnAegAZg2AJ3b4AoMfqDNAmCIIVXh9drPKd4SaM3cRBHZhRXFgWQFhHYRzfX2VDERNd2Y0AAADhsMHy1HBbXFoD2c9m9nIcpxAPZjYHJ4LjMiiGMuignSoACYmfOlLXuRyJB4fsKgFB58eWQEE3/F1ELj3SSablN2BAO7via6KldJnJ095BQLWrUGzucQA8Jq1U8Vd0nEl2AN12B0xMqB7AA3o4JgDsMRgIEDiGfZsMb9nkNuNYCbWMQQHZSs+M3DABxREvnZ3DgTne53uoXncWr+dlAXO8YIe8D2gRBV8FHbVBPcD/A0AACAXEQIUeDAg1ACCFvBoIAwH/3B4G9WFAcBFYTWRrogbagg/9pcEgAC9z2YAB2Ag+p4SAT2ZIAAANnyAC92gA2AaDrYGpadgNAC2BqeangL2dgHYA2BiUAQFJ5iUcg/oOC9kgFJ4NgAg+wPED3A/yAdgT2fIOCD8g4uQODgQFoPqealoL3qefIHIO0ATg89naD2gFJ40AT2Z2AGAcg4L3AdrYE9mBAalsYg7wXA4IPSeLYAuR8gangEAtDtQ4L3tD4w4EBqeAw62AC9gg52ByD8g9YPPZ/IE9mGAOw7QASDyvasOIAStGp5PZ0njFBSefIFoAC9x0AcPqW4Q4L2GDhgFJ5aAfIFMOtgAQACOdgHQ6UOJQcUFEP/92g/IPSeBgBkONgHYFUPYj7YEIPaW+o5BBSeHI4UPWDvw+pabD6lsoP8D0Q7EPoj5A5ANJsIlMxjmiS+Wth9AIAA -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings
<details open="true">
<summary>🧪 Generate Unit Tests</summary>

- [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Create PR with Unit Tests
- [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Commit Unit Tests in branch `zyp-to-tikray`
- [ ] <!-- {"checkboxId": "07f1e7d6-8a8e-4e23-9900-8731c2c87f58", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} -->   Post Copyable Unit Tests in Comment

</details>

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=crate/commons-codec&utm_content=105):

> ‼️ **IMPORTANT**
> Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai auto-generate unit tests` to generate unit tests for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
tests/transform/test_cratedb.py (1)

2-2: Same missing dependency problem

from tikray.model.treatment import Treatment fails for the same reason as above.
Fix is identical: ensure tikray is installed in the runtime environment.

🧰 Tools
🪛 GitHub Actions: Tests

[error] 2-2: ModuleNotFoundError: No module named 'tikray' when importing 'tikray.model.treatment.Treatment'. This caused test collection to fail.

🧹 Nitpick comments (2)
doc/transform.md (1)

1-6: Nitpick: expand docs for discoverability

A one-liner points to external docs, but users unfamiliar with Tikray might appreciate a sentence on why the migration happened or an example link to a basic “Hello World” transformation.

Optional improvement:

-Data transformations are delegated to [tikray].
+Data transformations are now delegated to [tikray], an external library that
+implements the same rule-based pipeline formerly shipped as **zyp**.  
+See the Tikray documentation for usage examples and migration tips.
pyproject.toml (1)

36-36: Optional: Alphabetize keywords
Consider sorting the keywords list to maintain readability and consistency.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 23013c9 and 89773e9.

📒 Files selected for processing (45)
  • CHANGES.md (1 hunks)
  • README.md (3 hunks)
  • doc/index.md (1 hunks)
  • doc/transform.md (1 hunks)
  • doc/zyp/backlog.md (0 hunks)
  • doc/zyp/examples.md (0 hunks)
  • doc/zyp/index.md (0 hunks)
  • doc/zyp/research.md (0 hunks)
  • pyproject.toml (3 hunks)
  • src/commons_codec/transform/mongodb.py (1 hunks)
  • src/zyp/__init__.py (0 hunks)
  • src/zyp/function.jq (0 hunks)
  • src/zyp/function.py (0 hunks)
  • src/zyp/model/__init__.py (0 hunks)
  • src/zyp/model/base.py (0 hunks)
  • src/zyp/model/bucket.py (0 hunks)
  • src/zyp/model/collection.py (0 hunks)
  • src/zyp/model/fluent.py (0 hunks)
  • src/zyp/model/moksha.py (0 hunks)
  • src/zyp/model/project.py (0 hunks)
  • src/zyp/model/treatment.py (0 hunks)
  • src/zyp/util/data.py (0 hunks)
  • src/zyp/util/dictx.py (0 hunks)
  • src/zyp/util/expression.py (0 hunks)
  • src/zyp/util/locator.py (0 hunks)
  • tests/transform/conftest.py (1 hunks)
  • tests/transform/mongodb/test_mongodb_convert.py (2 hunks)
  • tests/transform/mongodb/test_mongodb_full.py (1 hunks)
  • tests/transform/test_cratedb.py (1 hunks)
  • tests/zyp/conftest.py (0 hunks)
  • tests/zyp/integration/conftest.py (0 hunks)
  • tests/zyp/moksha/test_jq.py (0 hunks)
  • tests/zyp/moksha/test_model.py (0 hunks)
  • tests/zyp/moksha/test_transon.py (0 hunks)
  • tests/zyp/test_bucket.py (0 hunks)
  • tests/zyp/test_collection.py (0 hunks)
  • tests/zyp/test_function.py (0 hunks)
  • tests/zyp/test_locator.py (0 hunks)
  • tests/zyp/test_model.py (0 hunks)
  • tests/zyp/test_project.py (0 hunks)
  • tests/zyp/test_treatment.py (0 hunks)
  • tests/zyp/test_util.py (0 hunks)
  • tests/zyp/transformation-bucket.json (0 hunks)
  • tests/zyp/transformation-collection-treatment.yaml (0 hunks)
  • tests/zyp/transformation-collection.yaml (0 hunks)
💤 Files with no reviewable changes (35)
  • tests/zyp/transformation-collection-treatment.yaml
  • tests/zyp/conftest.py
  • tests/zyp/test_model.py
  • tests/zyp/transformation-bucket.json
  • tests/zyp/test_util.py
  • src/zyp/init.py
  • tests/zyp/test_locator.py
  • src/zyp/model/project.py
  • src/zyp/model/init.py
  • tests/zyp/integration/conftest.py
  • src/zyp/util/data.py
  • tests/zyp/test_project.py
  • src/zyp/util/expression.py
  • tests/zyp/transformation-collection.yaml
  • tests/zyp/moksha/test_transon.py
  • src/zyp/model/fluent.py
  • doc/zyp/backlog.md
  • tests/zyp/test_bucket.py
  • doc/zyp/research.md
  • tests/zyp/test_function.py
  • src/zyp/model/collection.py
  • doc/zyp/index.md
  • src/zyp/util/locator.py
  • src/zyp/function.jq
  • src/zyp/function.py
  • tests/zyp/test_treatment.py
  • src/zyp/model/bucket.py
  • tests/zyp/test_collection.py
  • src/zyp/model/base.py
  • tests/zyp/moksha/test_jq.py
  • tests/zyp/moksha/test_model.py
  • src/zyp/util/dictx.py
  • src/zyp/model/treatment.py
  • doc/zyp/examples.md
  • src/zyp/model/moksha.py
🧰 Additional context used
🪛 GitHub Actions: Tests
tests/transform/mongodb/test_mongodb_full.py

[error] 5-5: ModuleNotFoundError: No module named 'tikray' when importing 'tikray.model.collection'.

tests/transform/test_cratedb.py

[error] 2-2: ModuleNotFoundError: No module named 'tikray' when importing 'tikray.model.treatment.Treatment'. This caused test collection to fail.

tests/transform/mongodb/test_mongodb_convert.py

[error] 10-10: ModuleNotFoundError: No module named 'tikray' when importing 'tikray.model.bucket'.

🔇 Additional comments (7)
tests/transform/conftest.py (1)

6-10: Constant list updated – looks correct

Adding "from.generic" to RESET_TABLES keeps the fixture consistent with the new tests that write to that table. No functional or stylistic concerns spotted.

CHANGES.md (1)

4-5: Changelog entry good

Entry is concise and matches the actual change set. No issues.

doc/index.md (1)

37-37:

✅ Verification successful

Ensure 'transform' documentation file exists
Confirm that doc/transform.md is present and included in the Sphinx build so this toctree entry resolves correctly.


🏁 Script executed:

#!/bin/bash
# Verify that transform.md exists under doc/
fd -e md transform.md doc/

Length of output: 45


🏁 Script executed:

#!/bin/bash
# Locate the Sphinx configuration file
cfg=$(fd -e py conf.py . | head -n1)
echo "Using config file: $cfg"

# Check source_suffix settings for Markdown support
grep -n "source_suffix" "$cfg" || echo "⚠️ No 'source_suffix' entry found in $cfg"

# Check for Markdown parser extensions
grep -n "extensions" -n "$cfg"
grep -n "recommonmark" "$cfg" || echo "ℹ️ 'recommonmark' not configured"
grep -n "myst_parser" "$cfg" || echo "ℹ️ 'myst_parser' not configured"

Length of output: 546


✅ ‘transform.md’ presence and Markdown support verified

  • Found doc/transform.md in the repository.
  • myst_parser is enabled in doc/conf.py, so Sphinx will recognize and include .md files without an explicit source_suffix.

The transform entry in your toctree will resolve correctly.

src/commons_codec/transform/mongodb.py (1)

56-56: Verify reference to Tikray types in doc comment
Ensure that tikray.model.base actually exports the intended type definitions and adjust the comment if the path differs.

tests/transform/mongodb/test_mongodb_convert.py (1)

283-285: Docstring updated correctly
The test description now references Tikray instead of Zyp.

README.md (1)

31-34: All Tikray references in README are consistent
Renaming has been applied correctly, and the pip extras align with pyproject.toml.

Also applies to: 37-40, 54-55, 81-83

pyproject.toml (1)

116-118: ⚠️ Potential issue

Fix recursive extra dependency in [project.optional-dependencies]
The all extra currently refers back to commons-codec[mongodb,tikray], creating a self-referential loop. Instead, enumerate the actual optional deps:

- optional-dependencies.all = [
-   "commons-codec[mongodb,tikray]",
- ]
+ optional-dependencies.all = [
+   "pymongo<4.13",
+   "tikray<0.3",
+]

Likely an incorrect or invalid review comment.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
.github/workflows/tests.yml (1)

6-6: Specify pull_request branch filters
The workflow triggers on all PR branches by default; consider limiting to main to reduce unnecessary runs.

-pull_request:
+pull_request:
+  branches: [ main ]
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 89773e9 and f59676d.

📒 Files selected for processing (46)
  • .github/workflows/tests.yml (2 hunks)
  • CHANGES.md (1 hunks)
  • README.md (3 hunks)
  • doc/index.md (1 hunks)
  • doc/transform.md (1 hunks)
  • doc/zyp/backlog.md (0 hunks)
  • doc/zyp/examples.md (0 hunks)
  • doc/zyp/index.md (0 hunks)
  • doc/zyp/research.md (0 hunks)
  • pyproject.toml (3 hunks)
  • src/commons_codec/transform/mongodb.py (1 hunks)
  • src/zyp/__init__.py (0 hunks)
  • src/zyp/function.jq (0 hunks)
  • src/zyp/function.py (0 hunks)
  • src/zyp/model/__init__.py (0 hunks)
  • src/zyp/model/base.py (0 hunks)
  • src/zyp/model/bucket.py (0 hunks)
  • src/zyp/model/collection.py (0 hunks)
  • src/zyp/model/fluent.py (0 hunks)
  • src/zyp/model/moksha.py (0 hunks)
  • src/zyp/model/project.py (0 hunks)
  • src/zyp/model/treatment.py (0 hunks)
  • src/zyp/util/data.py (0 hunks)
  • src/zyp/util/dictx.py (0 hunks)
  • src/zyp/util/expression.py (0 hunks)
  • src/zyp/util/locator.py (0 hunks)
  • tests/transform/conftest.py (1 hunks)
  • tests/transform/mongodb/test_mongodb_convert.py (2 hunks)
  • tests/transform/mongodb/test_mongodb_full.py (1 hunks)
  • tests/transform/test_cratedb.py (1 hunks)
  • tests/zyp/conftest.py (0 hunks)
  • tests/zyp/integration/conftest.py (0 hunks)
  • tests/zyp/moksha/test_jq.py (0 hunks)
  • tests/zyp/moksha/test_model.py (0 hunks)
  • tests/zyp/moksha/test_transon.py (0 hunks)
  • tests/zyp/test_bucket.py (0 hunks)
  • tests/zyp/test_collection.py (0 hunks)
  • tests/zyp/test_function.py (0 hunks)
  • tests/zyp/test_locator.py (0 hunks)
  • tests/zyp/test_model.py (0 hunks)
  • tests/zyp/test_project.py (0 hunks)
  • tests/zyp/test_treatment.py (0 hunks)
  • tests/zyp/test_util.py (0 hunks)
  • tests/zyp/transformation-bucket.json (0 hunks)
  • tests/zyp/transformation-collection-treatment.yaml (0 hunks)
  • tests/zyp/transformation-collection.yaml (0 hunks)
💤 Files with no reviewable changes (35)
  • tests/zyp/transformation-bucket.json
  • tests/zyp/integration/conftest.py
  • tests/zyp/transformation-collection-treatment.yaml
  • tests/zyp/test_project.py
  • src/zyp/model/project.py
  • src/zyp/util/data.py
  • src/zyp/model/init.py
  • tests/zyp/conftest.py
  • src/zyp/util/expression.py
  • doc/zyp/research.md
  • src/zyp/function.jq
  • doc/zyp/backlog.md
  • tests/zyp/transformation-collection.yaml
  • tests/zyp/test_function.py
  • tests/zyp/test_util.py
  • tests/zyp/test_locator.py
  • tests/zyp/test_bucket.py
  • src/zyp/init.py
  • src/zyp/util/locator.py
  • src/zyp/model/fluent.py
  • doc/zyp/index.md
  • tests/zyp/moksha/test_transon.py
  • tests/zyp/test_model.py
  • src/zyp/model/treatment.py
  • src/zyp/function.py
  • tests/zyp/test_treatment.py
  • src/zyp/util/dictx.py
  • src/zyp/model/bucket.py
  • src/zyp/model/moksha.py
  • src/zyp/model/collection.py
  • tests/zyp/test_collection.py
  • doc/zyp/examples.md
  • tests/zyp/moksha/test_model.py
  • src/zyp/model/base.py
  • tests/zyp/moksha/test_jq.py
🚧 Files skipped from review as they are similar to previous changes (10)
  • tests/transform/mongodb/test_mongodb_full.py
  • tests/transform/conftest.py
  • tests/transform/test_cratedb.py
  • doc/transform.md
  • doc/index.md
  • CHANGES.md
  • README.md
  • tests/transform/mongodb/test_mongodb_convert.py
  • src/commons_codec/transform/mongodb.py
  • pyproject.toml
🔇 Additional comments (2)
.github/workflows/tests.yml (2)

54-60: Add timezone normalization step
Introducing the szenius/set-timezone action ensures consistent timezone handling across runners, stabilizing date/time-sensitive tests.


171-171:

✅ Verification successful

Verify extras group includes tikray
Ensure the tikray extra is defined in pyproject.toml or setup.cfg to avoid install failures.


🏁 Script executed:

#!/bin/bash
# Check for 'tikray' in extras definition
rg -A 3 "\[tool\." pyproject.toml | rg "tikray"

Length of output: 47


🏁 Script executed:

#!/bin/bash
# Search for any occurrence of 'tikray' across the repo
rg -n "tikray" .

# Check PEP 621 optional-dependencies in pyproject.toml
rg -A5 "\[project\.optional-dependencies\]" pyproject.toml | rg "tikray"

# Check Poetry extras definitions in pyproject.toml
rg -A5 "\[tool\.poetry\.extras\]" pyproject.toml | rg "tikray"

# Check setup.cfg for extras_require containing 'tikray'
rg -A5 "extras_require" setup.cfg | rg "tikray"

# Check setup.py for extras_require definitions
rg -A5 "extras_require" setup.py | rg "tikray"

Length of output: 1659


tikray extra confirmed in pyproject.toml
The tikray optional-dependency is already defined under project.optional-dependencies in pyproject.toml (around line 148), so installing with .[mongodb,tikray,develop,test] will succeed. No further changes needed.

@amotl amotl force-pushed the zyp-to-tikray branch 3 times, most recently from a634fd1 to ba392ef Compare June 13, 2025 18:25
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 720ddf3 and ba392ef.

📒 Files selected for processing (46)
  • .github/workflows/tests.yml (2 hunks)
  • CHANGES.md (1 hunks)
  • README.md (3 hunks)
  • doc/index.md (1 hunks)
  • doc/transform.md (1 hunks)
  • doc/zyp/backlog.md (0 hunks)
  • doc/zyp/examples.md (0 hunks)
  • doc/zyp/index.md (0 hunks)
  • doc/zyp/research.md (0 hunks)
  • pyproject.toml (4 hunks)
  • src/commons_codec/transform/mongodb.py (1 hunks)
  • src/zyp/__init__.py (0 hunks)
  • src/zyp/function.jq (0 hunks)
  • src/zyp/function.py (0 hunks)
  • src/zyp/model/__init__.py (0 hunks)
  • src/zyp/model/base.py (0 hunks)
  • src/zyp/model/bucket.py (0 hunks)
  • src/zyp/model/collection.py (0 hunks)
  • src/zyp/model/fluent.py (0 hunks)
  • src/zyp/model/moksha.py (0 hunks)
  • src/zyp/model/project.py (0 hunks)
  • src/zyp/model/treatment.py (0 hunks)
  • src/zyp/util/data.py (0 hunks)
  • src/zyp/util/dictx.py (0 hunks)
  • src/zyp/util/expression.py (0 hunks)
  • src/zyp/util/locator.py (0 hunks)
  • tests/transform/conftest.py (1 hunks)
  • tests/transform/mongodb/test_mongodb_convert.py (2 hunks)
  • tests/transform/mongodb/test_mongodb_full.py (1 hunks)
  • tests/transform/test_cratedb.py (1 hunks)
  • tests/zyp/conftest.py (0 hunks)
  • tests/zyp/integration/conftest.py (0 hunks)
  • tests/zyp/moksha/test_jq.py (0 hunks)
  • tests/zyp/moksha/test_model.py (0 hunks)
  • tests/zyp/moksha/test_transon.py (0 hunks)
  • tests/zyp/test_bucket.py (0 hunks)
  • tests/zyp/test_collection.py (0 hunks)
  • tests/zyp/test_function.py (0 hunks)
  • tests/zyp/test_locator.py (0 hunks)
  • tests/zyp/test_model.py (0 hunks)
  • tests/zyp/test_project.py (0 hunks)
  • tests/zyp/test_treatment.py (0 hunks)
  • tests/zyp/test_util.py (0 hunks)
  • tests/zyp/transformation-bucket.json (0 hunks)
  • tests/zyp/transformation-collection-treatment.yaml (0 hunks)
  • tests/zyp/transformation-collection.yaml (0 hunks)
💤 Files with no reviewable changes (35)
  • tests/zyp/test_project.py
  • tests/zyp/transformation-collection-treatment.yaml
  • tests/zyp/conftest.py
  • tests/zyp/transformation-bucket.json
  • tests/zyp/integration/conftest.py
  • tests/zyp/test_model.py
  • tests/zyp/test_locator.py
  • tests/zyp/moksha/test_transon.py
  • src/zyp/util/expression.py
  • src/zyp/model/project.py
  • src/zyp/util/data.py
  • src/zyp/model/fluent.py
  • tests/zyp/transformation-collection.yaml
  • tests/zyp/test_bucket.py
  • src/zyp/util/locator.py
  • tests/zyp/test_function.py
  • src/zyp/model/treatment.py
  • doc/zyp/research.md
  • doc/zyp/backlog.md
  • src/zyp/function.jq
  • src/zyp/model/collection.py
  • tests/zyp/test_util.py
  • tests/zyp/test_treatment.py
  • src/zyp/function.py
  • src/zyp/model/init.py
  • tests/zyp/test_collection.py
  • doc/zyp/index.md
  • src/zyp/model/bucket.py
  • tests/zyp/moksha/test_model.py
  • tests/zyp/moksha/test_jq.py
  • src/zyp/util/dictx.py
  • src/zyp/model/moksha.py
  • doc/zyp/examples.md
  • src/zyp/init.py
  • src/zyp/model/base.py
✅ Files skipped from review due to trivial changes (1)
  • tests/transform/mongodb/test_mongodb_full.py
🚧 Files skipped from review as they are similar to previous changes (9)
  • doc/transform.md
  • tests/transform/conftest.py
  • doc/index.md
  • CHANGES.md
  • README.md
  • src/commons_codec/transform/mongodb.py
  • tests/transform/mongodb/test_mongodb_convert.py
  • tests/transform/test_cratedb.py
  • pyproject.toml
🔇 Additional comments (2)
.github/workflows/tests.yml (2)

6-6: Verify pull_request trigger configuration
The push event is scoped to main, but pull_request has no branch filters. If you only want CI to run on PRs targeting main, consider adding branches: [ main ] under pull_request.


171-171:

✅ Verification successful

Confirm presence of tikray extra in project metadata
This job now installs the tikray extra, but please verify that pyproject.toml (or your project’s metadata) defines an optional-dependency group named tikray.


🏁 Script executed:

#!/bin/bash
# Description: Check if `tikray` optional-dependency is declared
rg --fixed-strings "tikray" -n pyproject.toml

Length of output: 164


Confirmed: tikray extra is declared in pyproject.toml
Verified that your project metadata defines an optional-dependencies.tikray group:

  • pyproject.toml, lines 148–149:
    optional-dependencies.tikray = [
    "tikray>=0.2.2,<0.3",
    ]

No further action needed.

@amotl amotl force-pushed the zyp-to-tikray branch 2 times, most recently from 7bc0693 to 1d62c76 Compare June 13, 2025 18:33
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ba392ef and 1d62c76.

📒 Files selected for processing (46)
  • .github/workflows/tests.yml (3 hunks)
  • CHANGES.md (1 hunks)
  • README.md (3 hunks)
  • doc/index.md (1 hunks)
  • doc/transform.md (1 hunks)
  • doc/zyp/backlog.md (0 hunks)
  • doc/zyp/examples.md (0 hunks)
  • doc/zyp/index.md (0 hunks)
  • doc/zyp/research.md (0 hunks)
  • pyproject.toml (4 hunks)
  • src/commons_codec/transform/mongodb.py (1 hunks)
  • src/zyp/__init__.py (0 hunks)
  • src/zyp/function.jq (0 hunks)
  • src/zyp/function.py (0 hunks)
  • src/zyp/model/__init__.py (0 hunks)
  • src/zyp/model/base.py (0 hunks)
  • src/zyp/model/bucket.py (0 hunks)
  • src/zyp/model/collection.py (0 hunks)
  • src/zyp/model/fluent.py (0 hunks)
  • src/zyp/model/moksha.py (0 hunks)
  • src/zyp/model/project.py (0 hunks)
  • src/zyp/model/treatment.py (0 hunks)
  • src/zyp/util/data.py (0 hunks)
  • src/zyp/util/dictx.py (0 hunks)
  • src/zyp/util/expression.py (0 hunks)
  • src/zyp/util/locator.py (0 hunks)
  • tests/transform/conftest.py (1 hunks)
  • tests/transform/mongodb/test_mongodb_convert.py (2 hunks)
  • tests/transform/mongodb/test_mongodb_full.py (1 hunks)
  • tests/transform/test_cratedb.py (1 hunks)
  • tests/zyp/conftest.py (0 hunks)
  • tests/zyp/integration/conftest.py (0 hunks)
  • tests/zyp/moksha/test_jq.py (0 hunks)
  • tests/zyp/moksha/test_model.py (0 hunks)
  • tests/zyp/moksha/test_transon.py (0 hunks)
  • tests/zyp/test_bucket.py (0 hunks)
  • tests/zyp/test_collection.py (0 hunks)
  • tests/zyp/test_function.py (0 hunks)
  • tests/zyp/test_locator.py (0 hunks)
  • tests/zyp/test_model.py (0 hunks)
  • tests/zyp/test_project.py (0 hunks)
  • tests/zyp/test_treatment.py (0 hunks)
  • tests/zyp/test_util.py (0 hunks)
  • tests/zyp/transformation-bucket.json (0 hunks)
  • tests/zyp/transformation-collection-treatment.yaml (0 hunks)
  • tests/zyp/transformation-collection.yaml (0 hunks)
💤 Files with no reviewable changes (35)
  • tests/zyp/transformation-collection-treatment.yaml
  • tests/zyp/conftest.py
  • tests/zyp/transformation-bucket.json
  • tests/zyp/test_model.py
  • tests/zyp/integration/conftest.py
  • tests/zyp/test_util.py
  • src/zyp/init.py
  • tests/zyp/test_project.py
  • tests/zyp/test_locator.py
  • src/zyp/model/init.py
  • src/zyp/model/project.py
  • src/zyp/util/expression.py
  • tests/zyp/test_bucket.py
  • src/zyp/util/locator.py
  • tests/zyp/test_function.py
  • src/zyp/function.jq
  • tests/zyp/transformation-collection.yaml
  • src/zyp/model/collection.py
  • tests/zyp/test_treatment.py
  • src/zyp/model/fluent.py
  • doc/zyp/backlog.md
  • src/zyp/model/treatment.py
  • doc/zyp/research.md
  • doc/zyp/examples.md
  • tests/zyp/moksha/test_transon.py
  • src/zyp/model/base.py
  • tests/zyp/test_collection.py
  • src/zyp/model/bucket.py
  • src/zyp/function.py
  • doc/zyp/index.md
  • tests/zyp/moksha/test_jq.py
  • src/zyp/util/dictx.py
  • src/zyp/model/moksha.py
  • src/zyp/util/data.py
  • tests/zyp/moksha/test_model.py
🚧 Files skipped from review as they are similar to previous changes (10)
  • CHANGES.md
  • doc/transform.md
  • tests/transform/conftest.py
  • tests/transform/mongodb/test_mongodb_convert.py
  • README.md
  • doc/index.md
  • src/commons_codec/transform/mongodb.py
  • tests/transform/mongodb/test_mongodb_full.py
  • pyproject.toml
  • tests/transform/test_cratedb.py
🔇 Additional comments (3)
.github/workflows/tests.yml (3)

6-6: Enable CI on Pull Requests
The addition of the pull_request trigger ensures the workflow runs on PRs, aligning with best CI practices.


171-171:

✅ Verification successful

Validate the tikray extra in project configuration
The install step now references the tikray extra. Confirm that your pyproject.toml or setup.cfg defines an optional-dependencies group named tikray, or the install will fail.

You can run this script to check for the tikray extra:


🏁 Script executed:

#!/bin/bash
# Search for 'tikray' in optional dependencies
rg -A 5 'tikray' pyproject.toml setup.cfg

Length of output: 833


tikray extra verified in pyproject.toml
The optional-dependencies.tikray group is defined in pyproject.toml (includes "tikray>=0.2.2,<0.3"), so the workflow install step will succeed.


143-143:

✅ Verification successful

Confirm dropping Python 3.8 for MongoDB job
The test-mongodb matrix no longer includes Python 3.8, while the other jobs still test it. Ensure this exclusion is intentional (e.g., due to tikray compatibility or other requirements).

Run this script to verify tikray’s supported Python versions on PyPI:


🏁 Script executed:

#!/bin/bash
# Verify supported Python versions of tikray on PyPI
curl -s https://pypi.org/pypi/tikray/json | jq '.info.classifiers[]' | grep 'Programming Language :: Python'

Length of output: 514


🏁 Script executed:

#!/bin/bash
# List all python-version matrices in the workflow
grep -R "python-version" -n .github/workflows/tests.yml || echo "No matches found"

Length of output: 901


Dropping Python 3.8 for the MongoDB job is intentional
tikray’s classifiers on PyPI only list support for Python 3.9 through 3.13 (and “Python 3 Only”), so excluding 3.8 from the test-mongodb matrix aligns with its compatibility requirements. No changes needed.

It's effectively the same, but provided using a dedicated package now.

https://tikray.readthedocs.io/
@amotl amotl marked this pull request as ready for review June 13, 2025 18:43
@amotl amotl merged commit 42cb1e2 into main Jun 13, 2025
17 checks passed
@amotl amotl deleted the zyp-to-tikray branch June 13, 2025 18:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants